Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Universalschnittstelle?
#1
Ich hatte mir über Ostern wieder einmal meine NPC Experimente vorgenommen und bin wieder, wie schon oft zuvor, krachend an die Grenzen der Scriptsprache gestoßen Sad . Für anspruchsvolle Sachen braucht man ein ausgewachsenes Programmiersystem mit dem man in der Region interagieren kann.
Ich hatte mir dann wg. einer Schnittstelle zunächst dieses HTML Gezumpel angesehen und ganz schnell wieder als viiiiiiel zu umständlich, Leistungsfressend u. Fehleranfällig verworfen. Für irgendwelche Netz-Sachen, ok. Aber für eine lokale Kommunikation? Nicht ernsthaft erwägenswert!!  Big Grin

Mir schwebte eher etwas wie das gute alte Unix-Prinzip vor: Gerät-,Anwendung-,User-1 schreibt in Datei/Gerät und Gerät-,Anwendung-,User-2 liest sie aus. Simpel, einfach, leicht zu merken und funktioniert immer und mit jeder Sprache und jeder angepassten Hardware. Egal ob mit „Datei“ Monitor oder „Datei“ Reaktorkühlungsventil…..

Ich habe ich mir daher zwei kleine OS-Funktionen osFileWrite und osFileRead als Schnittstelle geschrieben. Funktionieren tadellos. Nun kann ich in c oder c++ geschriebene opensource Navi-Algos als Pathfinding verwenden und in Lisp,Basic oder Prolog eine lernfähige KI basteln…..
Da meine Funktionen in der jetzigen Form nur für erste lokale Experimente geeignet sind und auf öffentlichen Systemen absolut verhängnisvoll wären, stelle ich sie nicht näher vor. Aber wäre so eine einfach zu handhabende Universalschnittstelle nicht ganz allgemein von großem Interesse? Es gibt viele denkbare Anwendungen für Opensim, aber die meisten scheitern an den fehlenden Kommunikationsmöglichkeiten mit anderen lokalen Anwendungen.
Wie müsste so eine (unbedenkliche) Schnittstelle aussehen? Nutzbar nur für Leute, die eh vollen Zugriff auf das Dateisystem haben, ist klar. Aber wie kann man das elegant realisieren? Die höchste interne Sicherheitsstufe ist meines Wissens nur der Regions Owner, der nicht zwangsläufig Herr über das Dateisystem ist.
Degolburg:
24h online und ca. 10 % fertig
Taxi: 85.214.150.139:9000:Degolburg
The following 2 users say Thank You to MoniTill for this post:
  • Bogus Curry, Dorena Verne
Zitieren
#2
Hallo Moni ;D

Also ich kann mir einige SAchen vorstellen, wo ich gerne PathFinding einsetzen würden wollen. Zum beispiel das ein NPC einen User den Weg irgendwo zeigt, also so das der User dem NPC folgt oder für RPG´s auch denkbar ;D

Hätte auf jedenfall intresse dran ;D
Tschöö

Bogus | PinguinsReisen.de
The following 2 users say Thank You to Bogus Curry for this post:
  • Dorena Verne, MoniTill
Zitieren
#3
Hallo Moni,

das ist sicherlich ein Feature für "Fortgeschrittene", denn man wird wohl OpenSim selber compilieren müssen, um Deine Modifikationen einzubauen. Oder man vertraut einem Bekannten, der eine modifizierte OpenSim Version (0.8.2, 0.8.3 Linux/Windows, 0.9.x, Arriba, ... ??? ) binär zur Verfügung stellt.

Die Rechte würde ich empfehlen, defaultmäßig nur für den Region Owner freizuschalten, aber auch konfiguriergbar machen über die Ini-Datei, so wie die anderen osXYZ Funktionen auch. Manch einer wird bestimmt NPCs scripten wollen, die das Feature nutzen, die nicht zwingend dem Region Owner gehören.

Sehr wichtig finde ich, die Zugriffsmöglichkeit auf das bin-Verzeichnis von OpenSim und dessen Unterverzeichnisse einzuschränken. Nicht dass jemand sich quer durch den Rechner gräbt damit! Auch würde ich keine Schreiberlaubnis für Binärdateien vorsehen, damit niemand dem OpenSim bösartigen Code unterschieben kann.

Liebe Grüße,
Mareta
Hyperweb.eu => Server-Tutorial für Linux mit OpenSim, OpenSim Arriba compiliert und für Metropolis konfiguriert!
The following 4 users say Thank You to Mareta Dagostino for this post:
  • Bogus Curry, Brigitt Loening, Dorena Verne, MoniTill
Zitieren
#4
Huhu Mareta, genau das könnte ich im Moment machen. Mir per Inworld-Script nicht nur das Bin- sondern das ganze Homeverzeichnis plätten Smile

Ich habe es mal etwas weitergesponnen. Im Grunde reicht es ja wenn man einen String nach „draußen“ bringt bzw von „draußen“ übernehmen kann. Also beispielsweise
osMessageWrite(integer kanal,string message)  und osMessageRead(integer kanal).Gelesen u. Geschrieben wird dann nur in einem vorgegebenen Verzeichnis und die Kanalnummern, deren mögliche Anzahl man auch festlegen kann, werden als Dateinamen behandelt.   Dann ließe sich damit nichts Böses anstellen. Für alle Avas würde ich es aber trotzdem nicht freigeben, weil Griefer dann beispielsweise immer noch das NPC Szenario durcheinander bringen könnten.
Mal gucken ob ich es einbaubar für Jederfrau hinbekomme… Smile
Degolburg:
24h online und ca. 10 % fertig
Taxi: 85.214.150.139:9000:Degolburg
The following 1 user says Thank You to MoniTill for this post:
  • Mareta Dagostino
Zitieren
#5
Es gibt keine Universalschnittstelle ohne Sicherheitsprobleme.

Gruss Freaky
Die ganze Welt ist ein Irrenhaus und wir sind nur die Kandidaten  ;)
Zitieren
#6
Hmm, macht doch ein addon Modul das man sich bei bedarf hinzuladen kann. Man muss dann evtl ein paar kleinere Änderungen in den mainstream OS einbauen, die wären dann aber auch für andere zukünftige Funktionen und addons von nutzen.

Bei den OSSL Funktionen sowie anderen Modulen (z.B. Remote Admin) muss man langfristig glaub eher eine andere Richtung einschlagen. Problem hier ist, das es unendlich viele mögliche Wunschfunktionen gibt, dass man diese nicht alle in den Opensim code fest einbauen kann. Eigentlich müssten diese Module so programmiert sen, dass man die Einzelfunktionen als eigenständige Datei hinzuladen kann, in deinem Fall also z.B. die osFileWrite funktion ohne das man an der OS herumbasteln muss. Ich habe schon mit diesem konzept beim RemoteAdmin Modul rumexperimentiert... ist halt schon fein wenn man nicht bei jedem Update die Änderungen wieder einbauen muss.

Gruß
Michelle
Zitieren
#7
@Michelle
Das wäre natürlich die optimale Lösung ! Big Grin
Aber so weit reicht mein Ehrgeiz heute nicht mehr. - Werde auch zu alt für den Sche.. Undecided
Von der knapp bemessenen Freizeit mal ganz abgesehen müssten die Devs es dann auch übernehmen, sonst wäre es ziemlich sinnlos.


Hier kommt jedenfalls mein Gebastel. Smile
Da ich kein Windows habe, kann ich mich nur auf Linux beziehen. Aber bei Windows sollte es recht ähnlich sein – hoffe ich mal …. Smile
Zunächst braucht man die Quellen von:
http://opensimulator.org/wiki/Main_Page

Die Installation und das Compilieren ist hier beschrieben....
http://opensimulator.org/wiki/Build_Instructions

...und wo und wie man eigene Funktionen einbaut, hier:
http://opensimulator.org/wiki/OSSL

Analog zu dieser Beschreibung muss
Code:
string osMessageRead (int kanal);
int osMessageWrite (int kanal,string message);
in die Datei:
/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs

dann..
Code:
public string osMessageRead(int kanal)
       {
           return m_OSSL_Functions.osMessageRead(kanal);
       }
       
       public int osMessageWrite(int kanal,string message)
       {
        return m_OSSL_Functions.osMessageWrite(kanal,message);
       }
...in die Datei:
/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs

und letztlich..
Code:
       public string osMessageRead (int kanal)
       {
        CheckThreatLevel(ThreatLevel.VeryHigh, "osMessageRead");

        m_host.AddScriptLPS(1);
        string verzeichnis ="./tmpMessage/";    // /bin/tmpMessage
        int maxmessage = 10;            // Maximale Datei-/Kanalnummer    
       
        if (kanal < 0 || kanal > maxmessage)
        {
          return "";
        }
        string theXFiles =verzeichnis+kanal.ToString();
        StreamReader file = File.OpenText(theXFiles);
        string s = file.ReadToEnd();
        file.Close();
       
        StreamWriter writer = new StreamWriter(theXFiles);
        writer.Write("");
        writer.Close();
       
        return s;
       }

       
       
       public int osMessageWrite (int kanal,string message)
       {
        CheckThreatLevel(ThreatLevel.VeryHigh, "osMessageWrite");

        m_host.AddScriptLPS(1);
        string verzeichnis ="./tmpMessage/";    // /bin/tmpMessage
        int maxmessage = 10;            // Maximale Datei-/Kanalnummer
        if (kanal < 0 || kanal > maxmessage)  
        {
          return -1;
        }
     
     
        string theXFiles =verzeichnis+kanal.ToString();
     
        StreamWriter writer = new StreamWriter(theXFiles);
        writer.Write(message);
     
        writer.Close();
        return 0;
       }
       
       
...in die Datei:
/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs

Das ganze ist keine Rundum-Sorglos-Eierlegende Wollmilchsau, sondern eher eine Basis für eigene Experimente.
Geschrieben und gelesen wird nur in einem vorgegebenen Verzeichnis. In diesem Fall /tmpMessage ,was man sich unter /bin anlegen muss. - Man kann aber natürlich auch ein beliebiges anderes Laufwerk/Verzeichnis eintragen.   Als Dateinamen werden die Kanalnummern verwendet, die ich in den Funktionen auf 0- 10 begrenzt  habe. Die muss man sich ggf. so hoch setzen wie man sie braucht.
Es funktioniert Regionsübergreifend, Gridweit, kann also auch zur Kommunikation zwischen einzelnen Regionen genutzt werden. Wenn es jemand auf Regionsweite beschränkt benötigt, muss noch die UUID der Region mit zum Dateinamen genommen werden. (Falls das jemand so braucht, fummel ich es gerne  rein). Und als Sicherheit habe ich (erstmal) die Paranoia Stufe gewählt. Smile

Hier kommt dann noch ein Scriptchen zum testen:
Code:
default
{
   state_entry()
   {
     //***************************************************************
     // Nur einmalig, damit die Dateien zum Auslesen vorhanden sind
     integer a;
     for(;a < 11; ++a) osMessageWrite(a,"");
     //***************************************************************
   
      llListen  (0,"",NULL_KEY,"");
     llSetTimerEvent(0.5);

   }

 listen(integer channel, string name, key id, string message)
 {
  osMessageWrite(0,message);
 }
 
 timer()
 {
 
  string message = osMessageRead(1);
   if (message != "")
   {
    llSay(0, message);
   }
 }
}

Das packt man sich in ein Objekt. Wenn man einen Satz chattet, kann man ihn mit einem Texteditor in der  Datei  /bin/tmpMessage/0 lesen. Wenn man einen Satz als Dateiname 1 im gleichen Verzeichnis speichert, wird dieser Inworld vom Objekt verkündet. - Ich denke einfacher geht’s nimmer...   Smile
Ein Problem, was auftauchte, wenn man eine Datei liest, die noch nicht existiert, läuft das Script auf einen Fehler. Kann man natürlich in der C# Funktion abfangen, aber wenn sie einmal angelegt ist, ist das Überprüfen überflüssig und Ressourcen verschwendend. Ich  lege daher im Script erst mal und einmalig  die Dateien mit Leerstring an. Danach können diese Zeilen gelöscht werden
Degolburg:
24h online und ca. 10 % fertig
Taxi: 85.214.150.139:9000:Degolburg
The following 4 users say Thank You to MoniTill for this post:
  • Bogus Curry, Dorena Verne, Mareta Dagostino, Sheera Khan
Zitieren
#8
Huhu Moni,

vielen Dank für diese tolle Einstiegsdroge in die Entwicklung eigener Erweiterungen. Ich hoffe, Du hast nichts dagegen, dass ich dieses Tutorial unter Nennung von Namen und Original-Posting im Metropolis Forum verlinkt und etwas erweitert habe
https://forum.hypergrid.org/post29556.html#p29555
Ciaoo

Sheera
The following 3 users say Thank You to Sheera Khan for this post:
  • Bogus Curry, Dorena Verne, MoniTill
Zitieren
#9
Vielen dank für deine Arbeit,Moni. Smile
The following 1 user says Thank You to Dorena Verne for this post:
  • MoniTill
Zitieren
#10
Vielen lieben Dank!

@Sheera  ....Und auch noch so ausführlich, umfassend und ordentlich aufbereitet – Wirklich toll!!!! Smile
Degolburg:
24h online und ca. 10 % fertig
Taxi: 85.214.150.139:9000:Degolburg
The following 1 user says Thank You to MoniTill for this post:
  • Sheera Khan
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste