Page 1 of 2 12 LastLast
Results 1 to 10 of 13

Thread: Zugriff auf Kolonieportal vom Schiff

  1. #1

    Zugriff auf Kolonieportal vom Schiff

    Betrifft: Kolonie-Verkehr-Demo in der ScriptBib

    Leider funktioniert das Script noch nicht so, dass es als Kolonieportal installiert, jedem Schiff erlaubt auf darauf zuzugreifen.

    Habe einfach Var* Ship1* As* CMyShip(); definiert.
    Eine Benutzerkontrolle geklaut: Var* Owner* As* CUser* =* New* CUser(MyShip.UserID);

    Und in einer großen IF-Klausel " If(GuestUser.UserID* =* Owner.UserID)* { " diese abgefragt-

    aber dort erscheint immer und immer wieder:
    Token: 'Owner', Script: 'colonie-verkehr' ---> System.Exception: Ship1.UserID(): Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Und das obwohl ich das natürlich mit einem Schiff teste.

    Kann ich da was besser machen?
    Ich schreibe kompliziert, weil ich 102 Tasten habe.

  2. #2

    Re: Zugriff auf Kolonieportal vom Schiff

    ok, an der eignerüberprüfung liegt es nicht. die habe ich einfach mal rausgelöscht.

    Jetzt bemängelt die engine, dass
    Ship1.Name(): Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Script ist im KoloPortal drin und aktiviert. Schiff betritt Portal: Fehlermeldung.

    Ich schätze mal, ich mache mir die Schiffsdefinition zu einfach.
    Code:
    Var Ship1 As CMyShip = MyShip;
    Aber wie kanns gehen???

    Danke
    Ich schreibe kompliziert, weil ich 102 Tasten habe.

  3. #3

    Re: Zugriff auf Kolonieportal vom Schiff

    Wenn es ein Kolonieportal ist wird er myShip wohl nicht finden
    Du musst dafür natürlich eine Kolonie benutzen.

  4. #4

    Re: Zugriff auf Kolonieportal vom Schiff

    Das Script verwaltet den Flugverkehr zwischen den Kolonien. Es muss also Schiffsaktionen ausführen können, daher CMyShip.

    Die gute hälfte des Script besteht ja aus Flugroutinen:
    Code:
    Function Ko1ko2()
    {
      Ship1.Action.LeaveOrbit();
      Ship1.Action.Fly(1, EShipDirection.right);
      Ship1.Action.Fly(2, EShipDirection.down);
      Ship1.Action.Fly(1, EShipDirection.right);
      Ship1.Action.EnterOrbit();
    }
    Ich schreibe kompliziert, weil ich 102 Tasten habe.

  5. #5
    Senior Member
    Join Date
    Nov 2011
    Posts
    150

    Re: Zugriff auf Kolonieportal vom Schiff

    Er meint, dass du es auf einer Kolonie installiert hast. D. h. du hast zwar die Variable MyColonie (oder MyColony), allerdings nicht MyShip, obwohl der Name meines Wissens nach weiter reserviert ist. Probiers mal hiermit:

    Code:
    If(MyShip is nothing)
    {
    Response.Add("Kein Schiffsportal!");
    }
    Gelb und grau - Proximo ist schlau,
    Proxi ist ein Held, gebt ihm euer Geld,
    Ihr seid alle dumm und meckert doch nur rum,
    seid nicht so unfair, sonst bekommt ihr keine Updates mehr

  6. #6

    Re: Zugriff auf Kolonieportal vom Schiff

    Leider bringt das keinen Erfolg.

    Beim Kompilieren ist auch alles in Ordnung, erst beim Benutzen macht das Macken.
    Ich schreibe kompliziert, weil ich 102 Tasten habe.

  7. #7
    Senior Member
    Join Date
    Aug 2011
    Location
    Erde - Deutschland - Sachsen-Anhalt - Harz
    Posts
    180

    Re: Zugriff auf Kolonieportal vom Schiff

    Du hast zwar dem Ship1 gesagt, dass es vom Typ CMyShip sein soll, aber ihm kein Objekt zugewiesen. Deshalb existiert auch keine UserID darin. Entweder weist du dem Ship1 eines deiner Schiffe zu:

    var Ship1 as new CMyShip(irgendeine SchiffsID)

    aber viel einfacher holt man sich die UserID aus dem MyColonie-Objekt.

    If(GuestUser.UserID* =* MyColonie.UserID)

    P.S. dämliches Denglisch
    Dies ist meine Meinung. Sie kann nicht durch Beleidigung, Drohung oder Schmeicheleien geändert werden.

  8. #8

    Re: Zugriff auf Kolonieportal vom Schiff

    Genau, das ist ja der Plan Sagraner,

    ich will kein Schiff fest definieren und die Eignerkontrolle habe ich entfernt,
    aber mit
    Code:
    If(MyShip is Nothing)
    {
      Response.Add("Kein Schiffsportal!");
    }
    erreiche ich zwar, dass dem beliebigen Schiff, das das Kolonieportal benutzt, keine Fehlermeldung mehr erhält aber eben diese unerfreuliche Ausgabe.
    Und eigentlich macht das Script derzeit ja auch nur Sinn, wenn es in einem Kolonieportal installiert ist.
    In einem Schiffsportal braucht es nur an VP's installiert zu werden.

    Ich glaube weiterhin, dass ich irgendwie das Schiff nicht richtig definiere, oder nicht verstehe, wie ich von einem "nicht-festgelegtem Schiff", das aber das Koloportal benutzt, den Namen herausbekomme.

    Das ganze Script sieht jetzt übrigens so aus(Alles was unnötig ist mal rausgeschnitten):
    Code:
    #UseInterface Web, ColoniePortal, ShipPortal;
    
    
    //Das Schiff, welches das Portal betritt, nutzt es auch
    Var Ship1 As CMyShip = MyShip;
    
    //Hier werden die Kolonien eingetragen
    Var Kolo1 As New CMyColony(68406) = MyColony; 
    Var Kolo2 As New CMyColony(68407); 
    
    // unveränderliche Variablen
    Var ScriptName As String = "Kolonie_Verkehr_Portal";
    Var form As New CHtmlForm(New CScriptUrl()); //erstellt eine Form in die die ganzen Buttons usw. hineinkommen
    Var tab As New CTable(7);
    Var row As CTableRow = tab.AddRow(); //neue Zeile initialisieren
    
    Var S As Integer;
    Var Z As Integer;
    Var SZ As Integer;
    
    //----------------------------------------------------------------------
    
    //Funktionen für die Routen zwischen den Kolonien und POI's
    
    Function Ko1ko2()
    {
      Ship1.Action.LeaveOrbit();
      Ship1.Action.Fly(1, EShipDirection.right);
      Ship1.Action.Fly(2, EShipDirection.down);
      Ship1.Action.Fly(1, EShipDirection.right);
      Ship1.Action.EnterOrbit();
    }
    
    
    //----------------------------------------------------------------------
    //Erstellt eine Form die alle Kolonien enthält, 
    //darunter je Schiff eine Zeile, bo sich das Schiff im Sektor einer Kolonie befindet.
    form.Add(tab);
    
    If(MyShip is Nothing)
    {
      Response.Add("Kein Schiffsportal!");
    }
    Else
    {
      If(Request.Form.ContainsKey('Menü1')) 
      {
        
        //Prüft wo Schiff1 ausgewählt wurde
        Var checkBoxS As String = "nicht ausgewählt";//gibt an ob sie angehackt ist, 1 bei true, nichts bei false
        
        If(Request.Form.ContainsKey('Ship1Box1') and Kolo1.Coordinates.CompareTo(Ship1.MapPosition.Coords) = 0)
        {
          checkBoxS = "startet an"; 
          row.Cells.Item(0).Add(Ship1.Name); 
          row.Cells.Item(1).Add(checkBoxS); 
          row.Cells.Item(2).Add(Kolo1.Name);
          S = 100;
        }
        Else
        {row.Cells.Item(0).Add(Ship1.Name + ' ' + checkBoxS);}
        //weitere Startkolonieen auffüllen
        
        //Prüft welche Kolonie das Ziel ist
        Var checkBoxK As String = "Keine Kolonie ausgewählt";//gibt an ob eine Kolonie angehakt ist.
        If(Request.Form.ContainsKey('ZBox1'))
        {
          checkBoxK = "und fliegt zu"; 
          row.Cells.Item(3).Add(checkBoxK); 
          row.Cells.Item(4).Add(Kolo1.Name);
          Z = 1;
        }
        ElseIf(Request.Form.ContainsKey('ZBox2'))
        {
          checkBoxK = "und fliegt zu"; 
          row.Cells.Item(3).Add(checkBoxK); 
          row.Cells.Item(4).Add(Kolo2.Name);
          Z = 2;
        }
        Else
        {row.Cells.Item(1).Add(checkBoxK);}
        //weitere Ziele auffüllen
        
        SZ = S + Z;
        
        form.Add('Hier muss weitergearbeitet werden.');//fügt einen Text hinzu
        form.Add(New CHtmlBreak());
        form.Add(New CHtmlTextBox(CStr(SZ), CStr(SZ));
        form.Add(New CHtmlBreak());
        form.Add(New CHtmlSubmitButton('OK', 'Menü2');//neuer Button, OK: Aufschrift des Buttons, name: Identifikationsname
      }
      
      ElseIf(Request.Form.ContainsKey('Menü2')) 
      {
        
        
        //Funktionsaufruf für die einzelnen Routen
        
        If(Request.Form.ContainsKey('101'))
        {row.Cells.Item(0).Add('Von ' + Kolo1.Name + ' nach ' + Kolo1.Name + ' geflogen.');}
        ElseIf(Request.Form.ContainsKey('102'))
        {Ko1ko2(); row.Cells.Item(0).Add('Von ' + Kolo1.Name + ' nach ' + Kolo2.Name + ' geflogen.');}
        Else
        {row.Cells.Item(0).Add('Kein Flug möglich.');}
        form.Add(New CHtmlBreak());
        form.Add('Hier ist dann fertig');
      }
      
      Else 
      {
        form.Add('Hier befindet sich das KolonieMenü');//fügt einen Text hinzu
        form.Add(New CHtmlBreak());//fügt einen Zeilenumbruch hinzu
        
        row.Cells.Item(0).Add('Name',);
        row.Cells.Item(1).Add(Kolo1.Name);
        row.Cells.Item(2).Add(Kolo2.Name);
        
        row = tab.AddRow(); //Start und Ziel des ersten Schiffes
        row.Cells.Item(0).Add(Ship1.Name);
        
        If(Kolo1.Coordinates.CompareTo(Ship1.MapPosition.Coords) = 0)
        {
          row.Cells.Item(1).Add(New CHtmlCheckBox(True, 'Ship1Box1', 'Bringe Schiff') //fügt eine Checkbox hinzu, True/False = checked, Ship1Box ist der Key, BringeSchiff der angezeigete Text
        }
        Else
        {
          row.Cells.Item(1).Add(New CHtmlCheckBox(False, 'ZBox1', 'zur Kolonie.');
        }
        
        If(Kolo2.Coordinates.CompareTo(Ship1.MapPosition.Coords) = 0)
        {
          row.Cells.Item(2).Add(New CHtmlCheckBox(False, 'Ship1Box2', 'Bringe Schiff');
        }
        Else
        {
          row.Cells.Item(2).Add(New CHtmlCheckBox(False, 'ZBox2', 'zur Kolonie.');
        }
        form.Add(New CHtmlBreak());
        
        form.Add(New CHtmlSubmitButton('OK', 'Menü1');//neuer Button, OK: Aufschrift des Buttons, name: Identifikationsname
      }
    } 
    Response.Add(form);//fügt form dem Fenster hinzu sodass sie angezeigt wird.
    Ich schreibe kompliziert, weil ich 102 Tasten habe.

  9. #9

    Re: Zugriff auf Kolonieportal vom Schiff

    Als ausführlichere Erklärung:
    MyShip = das Schiff, auf dem das Portal installiert ist
    MyColonie = die Kolonie, auf der das Portal installiert ist

    Wird es auf einer Kolonie verwendet ist MyShip logischerweise nothing, wird es auf einem Schiff verwendet ist MyColonie nothing.

    Wenn du also versuchst, ohne Überprüfungen, ob das Objekt überhaupt existiert, darauf zuzugreifen gibts dann natürlich Fehlermeldungen, da es ja nicht existiert.

    => du darfst MyShip nicht in einem Script verwenden, das auf einer Kolonie läuft. (es sei denn es wird geprüft obs existiert und im anderen fall die Kolonie genommen blablubb)

  10. #10

    Re: Zugriff auf Kolonieportal vom Schiff

    OK, soweit alles klar, ich brauche also zur Zeit, wenn eine Überprüfung ob das Script in einem Kolonieportal installiert ist. Und das ist es

    Aber, wenn ein Schiff darauf zugreift, bekomme ich die Fehlermeldung:
    • System.Exception: Das Script hat einen Laufzeitfehler verursacht. Zeile: 119, Spalte: 5, Token: 'row', Script: 'Kolonie-Verkehr-universal-Demo' ---> System.Exception: Ship1.Name(): Objektverweis wurde nicht auf eine Objektinstanz festgelegt.[/*:m:24rfotl2]


    Offensichtlich definiere ich das Schiff nicht korrekt

    Wie aber besser?? Wie kann ich ein beliebiges Schiff für diese Aktionen und zum Auslesen der Schiffswerte definieren
    Kann ich die ID, des Benutzerschiffes über ein Kolonieportal auslesen und in die Schifsvariable einsetzen

    Mit einem festeingetragenen Schiff, funktioniert das Portal, aber dass soll es nicht sein.


    Nochmal der leicht veränderte Code.
    Code:
    #UseInterface Web, ColoniePortal, ShipPortal;
    
    
    //Das Schiff, welches das Portal betritt, nutzt es auch
    Var Ship1 As CMyShip = MyShip;
    
    //Hier werden die Kolonien eingetragen
    Var Kolo1 As New CMyColony(68406); 
    Var Kolo2 As New CMyColony(68407); 
    
    // unveränderliche Variablen
    Var ScriptName As String = "Kolonie_Verkehr_Portal";
    Var form As New CHtmlForm(New CScriptUrl()); //erstellt eine Form in die die ganzen Buttons usw. hineinkommen
    Var tab As New CTable(7);
    Var row As CTableRow = tab.AddRow(); //neue Zeile initialisieren
    
    Var S As Integer;
    Var Z As Integer;
    Var SZ As Integer;
    
    //----------------------------------------------------------------------
    
    //Funktionen für die Routen zwischen den Kolonien und POI's
    
    Function Ko1ko2()
    {
      Ship1.Action.LeaveOrbit();
      Ship1.Action.Fly(1, EShipDirection.right);
      Ship1.Action.Fly(2, EShipDirection.down);
      Ship1.Action.Fly(1, EShipDirection.right);
      Ship1.Action.EnterOrbit();
    }
    
    
    //----------------------------------------------------------------------
    //Erstellt eine Form die alle Kolonien enthält, 
    //darunter je Schiff eine Zeile, bo sich das Schiff im Sektor einer Kolonie befindet.
    form.Add(tab);
    
    {
      If(Request.Form.ContainsKey('Menü1')) 
      {
        
        //Prüft wo Schiff1 ausgewählt wurde
        Var checkBoxS As String = "nicht ausgewählt";//gibt an ob sie angehackt ist, 1 bei true, nichts bei false
        
        If(Request.Form.ContainsKey('Ship1Box1') and Kolo1.Coordinates.CompareTo(Ship1.MapPosition.Coords) = 0)
        {
          checkBoxS = "startet an"; 
          row.Cells.Item(0).Add(Ship1.Name); 
          row.Cells.Item(1).Add(checkBoxS); 
          row.Cells.Item(2).Add(Kolo1.Name);
          S = 100;
        }
        Else
        {row.Cells.Item(0).Add(Ship1.Name + ' ' + checkBoxS);}
        //weitere Startkolonieen auffüllen
        
        //Prüft welche Kolonie das Ziel ist
        Var checkBoxK As String = "Keine Kolonie ausgewählt";//gibt an ob eine Kolonie angehakt ist.
        If(Request.Form.ContainsKey('ZBox1'))
        {
          checkBoxK = "und fliegt zu"; 
          row.Cells.Item(3).Add(checkBoxK); 
          row.Cells.Item(4).Add(Kolo1.Name);
          Z = 1;
        }
        ElseIf(Request.Form.ContainsKey('ZBox2'))
        {
          checkBoxK = "und fliegt zu"; 
          row.Cells.Item(3).Add(checkBoxK); 
          row.Cells.Item(4).Add(Kolo2.Name);
          Z = 2;
        }
        Else
        {row.Cells.Item(1).Add(checkBoxK);}
        //weitere Ziele auffüllen
        
        SZ = S + Z;
        
        form.Add('Hier muss weitergearbeitet werden.');//fügt einen Text hinzu
        form.Add(New CHtmlBreak());
        form.Add(New CHtmlTextBox(CStr(SZ), CStr(SZ));
        form.Add(New CHtmlBreak());
        form.Add(New CHtmlSubmitButton('OK', 'Menü2');//neuer Button, OK: Aufschrift des Buttons, name: Identifikationsname
      }
      
      ElseIf(Request.Form.ContainsKey('Menü2')) 
      {
        
        
        //Funktionsaufruf für die einzelnen Routen
        
        If(Request.Form.ContainsKey('101'))
        {row.Cells.Item(0).Add('Von ' + Kolo1.Name + ' nach ' + Kolo1.Name + ' geflogen.');}
        ElseIf(Request.Form.ContainsKey('102'))
        {Ko1ko2(); row.Cells.Item(0).Add('Von ' + Kolo1.Name + ' nach ' + Kolo2.Name + ' geflogen.');}
        Else
        {row.Cells.Item(0).Add('Kein Flug möglich.');}
        form.Add(New CHtmlBreak());
        form.Add('Hier ist dann fertig');
      }
      
      Else 
      {
        form.Add('Hier befindet sich das KolonieMenü');//fügt einen Text hinzu
        form.Add(New CHtmlBreak());//fügt einen Zeilenumbruch hinzu
        
        row.Cells.Item(0).Add('Name',);
        row.Cells.Item(1).Add(Kolo1.Name);
        row.Cells.Item(2).Add(Kolo2.Name);
        
        row = tab.AddRow(); //Start und Ziel des ersten Schiffes
        row.Cells.Item(0).Add(Ship1.Name);
        
        If(Kolo1.Coordinates.CompareTo(Ship1.MapPosition.Coords) = 0)
        {
          row.Cells.Item(1).Add(New CHtmlCheckBox(True, 'Ship1Box1', 'Bringe Schiff') //fügt eine Checkbox hinzu, True/False = checked, Ship1Box ist der Key, BringeSchiff der angezeigete Text
        }
        Else
        {
          row.Cells.Item(1).Add(New CHtmlCheckBox(False, 'ZBox1', 'zur Kolonie.');
        }
        
        If(Kolo2.Coordinates.CompareTo(Ship1.MapPosition.Coords) = 0)
        {
          row.Cells.Item(2).Add(New CHtmlCheckBox(False, 'Ship1Box2', 'Bringe Schiff');
        }
        Else
        {
          row.Cells.Item(2).Add(New CHtmlCheckBox(False, 'ZBox2', 'zur Kolonie.');
        }
        form.Add(New CHtmlBreak());
        
        form.Add(New CHtmlSubmitButton('OK', 'Menü1');//neuer Button, OK: Aufschrift des Buttons, name: Identifikationsname
      }
    } 
    Response.Add(form);//fügt form dem Fenster hinzu sodass sie angezeigt wird.
    Ich schreibe kompliziert, weil ich 102 Tasten habe.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •