PDA

View Full Version : Zugriff auf Kolonieportal vom Schiff



quor
31-10-2012, 23:11
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 :mrgreen: 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?

quor
04-11-2012, 00:15
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.

Var Ship1 As CMyShip = MyShip;

Aber wie kanns gehen???

Danke

General Jack O'Neill
04-11-2012, 00:42
Wenn es ein Kolonieportal ist wird er myShip wohl nicht finden ;)
Du musst dafür natürlich eine Kolonie benutzen.

quor
04-11-2012, 16:43
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:

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();
}

Elchi
04-11-2012, 16:55
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:


If(MyShip is nothing)
{
Response.Add("Kein Schiffsportal!");
}

quor
04-11-2012, 17:58
Leider bringt das keinen Erfolg.

Beim Kompilieren ist auch alles in Ordnung, erst beim Benutzen macht das Macken.

Sargraner
05-11-2012, 08:13
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

quor
05-11-2012, 22:11
Genau, das ist ja der Plan Sagraner,

ich will kein Schiff fest definieren und die Eignerkontrolle habe ich entfernt,
aber mit

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):

#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.Coor ds) = 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.C oords) = 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.C oords) = 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.

General Jack O'Neill
05-11-2012, 22:35
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)

quor
06-11-2012, 22:49
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 :?:
:idea: Kann ich die ID, des Benutzerschiffes über ein Kolonieportal auslesen und in die Schifsvariable einsetzen

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


Nochmal der leicht veränderte 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.Coor ds) = 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.C oords) = 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.C oords) = 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.

General Jack O'Neill
06-11-2012, 23:08
Du nutzt da immer noch MyShip:
Var Ship1 As CMyShip = MyShip;
MyShip ist NICHT das besuchende Schiff, das ist das Schiff, auf dem das Script installiert ist.

Wenn du das des Besuchers haben willst musst du GuestShip benutzen, das ist dann aber vom Typ CShip
und kann folglich nicht direkt für Aktionen genutzt werden. (Falls es dir gehört kannst du aber ein CMyShip mit der ID erzeugen)

quor
10-11-2012, 23:57
Vielen Dank für all Eure Hilfe.

Habe das Demo zum fertigen Script jetzt in der ScriptBibliothek.

Vielleicht baue ich noch nen paar Überprüfungen ein, die bluescreens vermeiden, aber meine Zeit ist derzeit mehr als rar.

DarkMo
27-11-2012, 18:27
Du nutzt da immer noch MyShip:
Var Ship1 As CMyShip = MyShip;
MyShip ist NICHT das besuchende Schiff, das ist das Schiff, auf dem das Script installiert ist.

Wenn du das des Besuchers haben willst musst du GuestShip benutzen, das ist dann aber vom Typ CShip
und kann folglich nicht direkt für Aktionen genutzt werden. (Falls es dir gehört kannst du aber ein CMyShip mit der ID erzeugen)
damn, zu schnell ^^ hat aber lange gedauert, bis ihr ihm das GuestShip mal nahelegt ><

Function isValidUser() As Boolean {
Return GuestShip.UserID = MyShip.UserID;
}
für kolonien dann natürlich MyColony ^^

btw ihr admins: hier fehlen code tags oder? ma testen. wenn se da sin, dann fehlt ne hüsche maske fürs texten ><