PDA

View Full Version : Besitzer einer Kolonie



Sargraner
10-10-2011, 09:45
Moin!

Ich versuche immer noch krampfhaft eine Anwendung für die Extensions auf der Schiffsseite zu bauen. Eine automatische Koordinatensammlung habe ich im Auge. Allerdings habe ich Probleme, aus dem Html der Seite die nötigen Infos herauszubekommen. Die entscheidende Zeile im Code hat folgende Struktur:

<td>Namevon<span class="darkgrey"> KolonieID</span>
<font color="Brown">Ferengi</font> (?Linkcode) (NPC)</td>

An den Namen der Kolonie komme ich noch heran mit dem InnerHtml des td-Tags. Der Teil mit der Spieler-ID, in dem Beispiel das (NPC), bleibt mir jedoch verborgen, offensichtlich wegen der Tags dazwischen. Weiß jemand Abhilfe oder könnte man den Code ändern, die Spieler-ID in nen div-Tag wickeln, oder sowas?

Orpheus
10-10-2011, 09:56
Ist zwar nicht ganz sauber, aber man könnte ja in dem falle von npc einfach über den Namensstring die id raussuchen

Sargraner
10-10-2011, 13:36
OK, schlechtes Beispiel, besser:

<td>KolonieNamevon<span class="darkgrey"> KolonieID</span>
<a href=...>Spielername</a> (SpielerID)</td>

So sieht das im Allgemeinen aus. Bisher ist es mir nur gelungen, den Kolonienamen und die KolonieID vom Script auslesen zu lassen. Die SpielerID steht zwar im td-Tag aber hinter dem Link-Tag mit dem Spielernamen. Die InnerHtml-Property des td-Tag weigert sich, das mit auszugeben.

Arakis
12-10-2011, 09:16
- innerHTML geht "nur", weil der erste Teil innerhalb von TD ein "Literal" ist, sprich ein Text ohne Tags. Fängt in TD direkt ein Tag an, wird es nicht mehr funktionieren.
- Zum Namen: Da dieser aus HTML besteht, wirst du diesen nicht einfach extrahieren können. Du müsstest rekursiv alle child-element durchlaufen.
- genrell ist die Vorgehensweise, Informationen zu "extrahieren" nicht der Weg, den wir offiziell unterstützen. Wenn du an Informationen per Scrtipt-Objekte nicht herankommst(z.b. an die LRS-Infos ober ein Schiffsobjekt), dann hat dies seine Gründe.
- Es muss nur eine "kleine" Änderung geben und dein Script würde nicht mehr funktionieren.

Lieben Gruß,
Arakis

Sargraner
12-10-2011, 14:00
Hallo Arakis!

Den Html-Spielernamen brauche ich ja garnicht, den stellt die Scriptengine zur Verfügung, sobald ich die ID kenne.

Die Extensions machen es nunmal möglich, die angezeigte Seite auszuwerten und zu verändern, dass ist ja wohl irgendwie der Sinn der Sache. Wenn einige Leute mit Hilfe irgendwelcher Add-Ons diese Informationen auslesen und verarbeiten können, dann ist es nur gerecht, wenn diese Möglichkeit allen zur Verfügung gestellt wird. Selbstverständlich werde ich mein Script veröffentlichen, womit der Gerechtigkeit genüge getan wäre.

Also, überlege es dir nochmal, bevor Proximo es als allgemeines Feature einbaut. Es ist nur eine kleine Änderung.

Sargraner
18-10-2011, 09:34
Hättest ruhig mal sagen können, dass der Link mitsamt der ID erst beim Rendern der Seite erzeugt wird. Hätte mir einige Stunden an Frust erspart.

Arakis
21-10-2011, 16:14
Hö? Naja, ich muss dir nicht unbedingt erklären, wie und wann was generiert wird, ist nämlich keine simple HTML-Generierung sondern alles Objektorientiert und hat nix mit asp.net zu tun, da ich das Framework größtenteils einfach auf eigne Quelltextbasis reimplementiert habe. Können uns ja mal auf nen Bier treffen, dann führe ich dich in die Tiefen der STNE-Seiten-Generierung ein :)

Hast du es eigentlich lösen können?

Lieben Gruß,
Arakis

Xotor
21-10-2011, 18:14
Ich denke das er meinte das es nicht geht, weil die SpielerID erst nach dem ablauf der Extension in die Seite eingefügt wird (render-phase) und daher von der Extension aus nicht sichtbar ist...

Sargraner
22-10-2011, 18:15
Xotor hat den Nagel auf den Kopf getroffen.

Bei Bier kann ich nicht mehr denken, außerdem bin ich auf ein neues Problem getroffen. Kann es sein, dass Schiffsaktionen bei Extension nicht möglich/nicht erlaubt sind?

Brokkoli
22-10-2011, 18:46
Kann es sein, dass Schiffsaktionen bei Extension nicht möglich/nicht erlaubt sind?

Darüber, dass das nicht geht, hatte (im alten Forum?) schon mal jemand berichtet. Ich denke mal es ist nicht erlaubt, weil es sonst zu inkonsistenten Ergebnissen führt. (Zustandsänderung bei Schiffen, während die Seite gerendert wird)

Navek
22-10-2011, 19:11
Und man könnte sich dann auch Scripte schreiben, die Vollautomatisch den Account verwalten, ohne dass man sie überhaupt anstoßen muss. Man hätte dann bei jedem Seitenaufruf schließlich die Gelegenheit, Dinge zu prüfen und ggf. zu ändern.

Sargraner
23-10-2011, 08:37
Tja, nur leider gehen mir dann so langsam die Ideen für Anwendungen der Extensions aus, wenn man damit nur Sachen anzeigen darf aber nichts damit machen kann.

Elchi
30-01-2012, 16:25
Ich bin vor knapp einer Stunde auf die Idee gestoßen automatisch Koloniedaten in der Schiffsübersicht aufzunehmen, weil mich die Koordinatenverwaltung mit der mühseligen Eingabe und den 25 Zeichen Maximaltext ziemlich abnervt.

@Sargraner: hast du schon irgendwelche Fortschritte auf diesem Gebiet gemacht?

@alle:
gibt es irgendeine alternative Möglichkeit mit den Koords an die CColony zu kommen? Wenn man die SektorID nimmt und daraus eine Kolonie machen will bekommt man bei fremden Kolonien(berechtigterweise) keinen Zugriff:


[Exception: Zugriff verweigert]
bei stne.funcs.CheckUserException(Int32 UserID1, Int32 UserID2) in D:\source\jack\dev1\projects\stne\game\Lib.vb:Zeil e 1771.
bei stne.funcs.CheckUserException(TUser User1, TUser User2) in D:\source\jack\dev1\projects\stne\game\Lib.vb:Zeil e 1775.
bei stne.Scripting.Types.CAccount.CheckPermission(TPla net Planet) in D:\source\jack\dev1\projects\stne\game\Scripting\O bjects.vb:Zeile 557.
bei stne.Scripting.Types.CKolonie..ctor(Int32 KolonieID) in D:\source\jack\dev1\projects\stne\game\Scripting\O bjects.vb:Zeile 1825.

[TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht.]
bei System.RuntimeMethodHandle._InvokeConstructor(IRun timeMethodInfo method, Object[] args, SignatureStruct& signature, RuntimeType declaringType)
bei System.Reflection.RuntimeConstructorInfo.Invoke(Bi ndingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bei System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
bei larne.scripting.TScriptObjectMemberNative.GetValue Internal(TScriptContext Context, Object obj, Object[] Index) in D:\source\jack\dev1\projects\shared\larne.scriptin g\Script.vb:Zeile 2608.
bei larne.scripting.TScriptObjectMemberNative.GetValue (TScriptContext Context, TCodeExpressionObjectMember CallExp, Object obj, Object[] Index) in D:\source\jack\dev1\projects\shared\larne.scriptin g\Script.vb:Zeile 2595.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in D:\source\jack\dev1\projects\shared\larne.scriptin g\ScriptExpressions.vb:Zeile 342.
bei larne.scripting.Commands.TCodeCommandDim.Process(T ScriptContext Context) in D:\source\jack\dev1\projects\shared\larne.scriptin g\ScriptCommands.vb:Zeile 145.
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\jack\dev1\projects\shared\larne.scriptin g\Script.vb:Zeile 1271.

[Exception: Das Script hat einen Laufzeitfehler verursacht. Zeile: 7, Spalte: 7, Token: 'kolo', Script: '[Extension] Planetenscan']
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\jack\dev1\projects\shared\larne.scriptin g\Script.vb:Zeile 1281.
bei larne.scripting.TScriptContext.CallMethod(TScriptO bjectMemberCustom mem, TCodeExpressionObjectMember Caller, Object[] Args, CObject Instance) in D:\source\jack\dev1\projects\shared\larne.scriptin g\Script.vb:Zeile 1097.
bei larne.scripting.TScriptContext.CallMethod(TScriptO bjectMemberCustom Mem, Object[] Args, CObject Instance) in D:\source\jack\dev1\projects\shared\larne.scriptin g\Script.vb:Zeile 1054.
bei larne.scripting.TScriptObjectMemberCustom.GetValue Internal(TScriptContext Context, Object obj, Object[] Index) in D:\source\jack\dev1\projects\shared\larne.scriptin g\Script.vb:Zeile 1879.
bei larne.scripting.Types.CDelegate.Invoke(Object[] args) in D:\source\jack\dev1\projects\shared\larne.scriptin g\ScriptMethods.vb:Zeile 140.
bei stne.TScriptExtensionItem.CallEvent(CGuiEvent e) in D:\source\jack\dev1\projects\stne\game\Scripting\E xtensions.vb:Zeile 182.

[Exception: Es ist ein Fehler in einer Extension aufgetreten.]
bei stne.TScriptExtensionItem.CallEvent(CGuiEvent e) in D:\source\jack\dev1\projects\stne\game\Scripting\E xtensions.vb:Zeile 193.
bei stne.TScriptExtensionManagerUserItem.CallEvent(CGu iEvent e) in D:\source\jack\dev1\projects\stne\game\Scripting\E xtensions.vb:Zeile 121.
bei stne.TUserSession.CallScriptEvent(CGuiEvent e) in D:\source\jack\dev1\projects\stne\game\UserLib.vb: Zeile 6246.
bei stne.TstneGamePage.CallExecuteAction() in D:\source\jack\dev1\projects\stne\game\WebControls .vb:Zeile 892.
bei stne.wf_Ship.Run() in D:\source\jack\dev1\projects\stne\game\ShipPage.vb :Zeile 57.
bei stne.wf_Game.Page_Load(Object sender, EventArgs e) in D:\source\jack\dev1\projects\stne\game\Game.aspx.v b:Zeile 102.
bei System.Web.UI.Control.LoadRecursive()
bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Assembly: stne.dll
Time: 30.01.2012 15:13:50
STNE-Version: 1.0.73.683
Server: DE3
User-ID: 25442

Das macht CColony aber völlig unnütz, da man damit nur auf eigene Kolonien zugreifen kann, für die ja schon CMyColony da ist.
Bei CMyShip sehe ich nämlich auch keine Property, die auf CColony hinweist.
Könnte man deshalb bei CMyship eine Property Colony as CColony einbauen, die falls existierend die Kolonie im Sektor angibt?

lg
Elchi

HerrKoch
31-01-2012, 11:26
Da CColony von CSector erbt hätte ich jetzt gedacht man könnte über Ship.Sector nach CColony casten, aber da meckert die Engine dann leider... Da man den Konstruktor von CColony nicht ausführen kann stimme ich dir zu, dass dies weitgehend unnütz ist...

Elchi
31-01-2012, 16:42
Das einzige, was mir einfiele wäre das "Spieler (ID)"-Objekt zu einem Formular zu adden, das man dann irgendwie mit dem Request-Objekt abrufen kann (der Nutzer muss natürlich noch bestätigen). Beim Rendering werden nämlich auch Kopien des Objekts ausgefüllt. Man KÖNNTE natürlich auch JavaScript benutzen um das Objekt im Browser wieder zurückzuübergeben, aber da kenne ich mich nicht aus.

lg
Elchi