Netzwerkspiel-Fehler

Fulgen hat mir gerade berichtet, dass in Kamillentee ein Netzwerkfehler drin ist. Target is Zero bei InitializePlayer, ich habe hier mal den Code:

func InitializePlayer(int iPlr){
  if(iPlr == 0){
    var pFlag = CreateObject(FLAG,100,100,iPlr);
    Enter(Object(7),pFlag);
  }
  GetHiRank(iPlr)->SetPosition(55,358);
}

Object(7) ist die Hütte in die die Flagge soll. Ist im Netzwerkcode die Objectnumber Vergabe anders oder so? Ansonsten ist das einzige Target der GetHiRank(iPlr) und der macht bei mir zumindest im nicht Netzwerk keinen Ärger hat jemand ne Idee?

Enter mit Target 0 sollte einfach nur fehlschlagen und keine Fehlermeldung geben. Da bleibt nur GetHiRank. Vielleicht startest du im Netzwerk ohne Objektpakete / mit den falschen Paketen und hast daher gar keinen Clonk? Logge doch mal Log("%v %d", GetHiRank(iPlr), GetCrewCount(iPlr));

Jalo #154 1
Durin #157 1
Wenig überraschend, das Szenario hat auch keine Vorgaben es wird nur Objects.c4d benötigt und das einzige Crewmitglied ist ein Normaler Clonk. Es ist im Netzwerkspiel nicht möglich nicht Objects.c4d zu laden oder? Ansonsten ist der Bug klar, allerdings sollte das Spiel dann auch so oder so nicht Funktionieren.

Passiert im Netzwerk auch bei Xeron Siedelversion.

>Enter(Object(7),pFlag);


Ist btw nicht so übersichtlich, FindObject2(Find_ID(HUT3)) anstelle von Object(7) wäre besser.

>Wenig überraschend, das Szenario hat auch keine Vorgaben es wird nur Objects.c4d benötigt und das einzige Crewmitglied ist ein Normaler Clonk.


Du hast in deiner Scenario.txt - Datei nicht
[Definitions]
Definition1=Objects.c4d

stehen. Dies fällt beim Starten via Frontend nicht auf, weil da die Engine automatisch Objects.c4d ergänzt. Bei der Dedicated-Server-Engine geschieht dies aber nicht.

Okay, das einfügen ist ja kein Aufwand. Aber WTF warum wird das nicht immer einfach geladen? Ist Ja so oder so nötig

Nicht ganz, es gibt Packs / Szenarien, die ohne Objects.c4d auskommen, weil sie sie schon lokal haben…

https://ccan.de/cgi-bin/ccan/ccan-view.pl?a=view&i=1865
^- Dieses benötigt beispielsweise kein Objects.c4d

Object(7) ist aber eindeutig. FindObject2(Find_ID(HUT3)) gibt nicht zwingend das objekt, das man will, wenn mehrere existieren. Wenn davor (was bei einer Objektnummer von 7 nicht wahrscheinlich ist) bereits ein anderes Objekt der Art erstellt wurde, wird das genommen.
Klar, wenn die person die nummer weiß (weil sie aus Objects.txt kommt), weiß er auch direkt die position, dann könnte er die hütte sowieso direkt via script erstellen und die variable dafür weiter verwenden.

CreateObject() zu benutzen und dessen Rückgabewert in einer (globalen) Variable zwischenspeichern ist an sich sinnvoller, da Object() selten eindeutig ist.

Klar, auf Object() kann man nur verlässlich zugreifen, wenn man auch eine Object.txt hat. Ich war selbst nie Fan von Objects.txt, ich hab auch lieber alles via script erstellt.

In OpenClonk gibt es StaticSaveVar. Man kann sich direkt im Editor den Namen einer globalen Variable aussuchen, in der das Objekt gespeichert wird.

Fuer Clonk Rage finde ich Object() jetzt nicht so schlimm. FindObject(ID, x, y) geht auch kaputt, wenn sich das Objekt etwas bewegt. Man kann Object() uebrigens nicht fuer Sections benutzen; da ist nicht garantiert, dass man immer die gleiche Nummer bekommt.