Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / C4Script: Don't do this!
- - By Octagon (More than 200 posts.) Date 13.02.2015 15:54 Edited 14.02.2015 18:25 Upvotes 3
Dieser permanente FAQ-Thread dient zur Sammlung von Ideen, die sich als wesentlich schlechter herausgestellt haben als erst einmal ersichtlich - zur Vermeidung von Wiederholungsfehlern und als Register von möglichen Fehlerquellen.
Parent - By Octagon (More than 200 posts.) Date 13.02.2015 15:54 Edited 14.02.2015 15:19 Upvotes 1
Blöde Idee: Mit Find_Func irgendetwas suchen, was tatsächlich irgendetwas tut. Das steht auch in der Doku, aber ich hebe es hier lieber noch einmal hervor. Find_Func ruft die jeweilige Funktion tatsächlich in allen Objekten auf, sodass Hit alle Flints explodieren lässt, usw. Und ich weiß nicht, was mit dem Objektregister schreckliches geschieht, wenn während der Suche neue Objekte erstellt werden.
(Wem es Spaß macht, der kann natürlich die Find_Func-Aufrufe zählen oder so etwas, aber es gibt generell keinen Grund. Wenn jemand es aber mag, Spielregeln anzuzünden und dergleichen: Nur zu :whatever:)
Andererseits eignet es sich dadurch als hackige, evtl. geringfügig performantere (?) Kurzschreibweise zum Massenaufrufen von Befehlen nach Suchkategorie.

Vorsicht mit StringTable-Inhalten in syncrelevanten Dingen. Dazu zählt auch Random: Wird zufällig aus Strings/Arrays aus der String Table was ausgewählt, sollten diese in allen erdenklichen Sprachen vollständig sein und die Variablen sollten die gleiche Länge haben. Sonst entgleist der Zufallsseed und das Netzwerkspiel wird abgebrochen.
StringTbl-Strings per eval auszuführen, kann ebenfalls zu nichts Gutem führen.

Blöde Idee: Unbegrenzte rekursive Aufrufe. Wenn eine Funktion sich irgendwie implizit selbst aufruft (ein Objekt, das mehr Instanzen von sich selbst erstellt o. ä.), gibt es einen Stack Overflow und das ist gar nicht schön.
Wenn die Aufrufer an sich mengenmäßig begrenzt sind (explosive Objekte, die einander gegenseitig sprengen o. ä.), reicht es, den Aufruf per Schedule zu verzögern (am Beispiel vom Ölfass und Eke-Reloaded-Sprengstoffen ersichtlich).
Ansonsten sollte die Funktion einen Zusatzparameter kriegen, der die Rekursionsstufen zählt und bei zu tiefer Rekursion abbricht.

Blöde Idee: Fling überladen. Irgendein Feature davon ist hartgecodet, und wenn man es irgendwie überlädt (und sei es nur mit einem neuen Callback und inherited), werden Clonks ins Nirwana geschossen und ähnlich interessante Dinge.
Parent - By Fulgen (More than 500 posts.) Date 10.05.2016 14:02 Upvotes 2
Vorsicht mit ChangeDef - Aufrufen: Bei sämtlichen daraufhin folgenden Verwendungen des Objektes in Funktionen sollte es immer übergeben werden, z.B. CreateContents(CLNK,this) statt CreateContents(CLNK). Ansonsten kann es unter Linux zum Desync kommen.

(Steht zwar auch in der Wiki, aber ich hebe es lieber noch einmal hervor.)
Parent - - By Fulgen (More than 500 posts.) Date 02.07.2016 06:53
Folgende Situation: Damagein einem Objekt ruft eine Funktion auf, die in einem Inventarobjekt eine Funktion aufruft, die das Inventarobjekt mit Explode vernichtet, und das Objekt dann mit Explode zerstört. Klingt funktionsfähig, kann aber zum Crash führen. Da RemoveObject das Objekt nicht löscht, sondern zum Löschen markiert, kann die Engine failen: Das Inventarobjekt fügt mit Explode dem Container Schaden zu, der Container zerstört sich selbst und das Inventarobjekt wegen zu großem Schaden, das Inventarobjekt fügt dem Container Schaden zu usw.

An dieser Stelle die Warnung: Vorsicht mit Explode-Aufrufen!

(An die Entwickler: Warum kann es so einen Fail überhaupt geben?

Danke an DerTod für seine Hilfe.
Parent - - By Luchs (More than 1000 posts.) Date 02.07.2016 06:59
Gibt es tatsächlich einen Crash? Ist das CR oder OC?
Parent - - By Fulgen (More than 500 posts.) Date 02.07.2016 07:54
Parent - - By Luchs (More than 1000 posts.) Date 02.07.2016 08:40
Sollte mal jemand ausprobieren, ob das mit OC auch noch geht. Crashes sollten nie passieren.
Parent - - By Fulgen (More than 500 posts.) Date 02.07.2016 08:49
Der Witz ist, es passiert nur in einem SGGP-Szenario. Sonst nie.
Parent - - By Marky (More than 200 posts.) Date 02.07.2016 11:45
Du kannst in deinem explodierenden Objekt einen lokale Variable setzen, die entscheidet, dass es nicht mehr explodieren soll, wenn es schonmal explodiert ist.
Parent - By Fulgen (More than 500 posts.) Date 02.07.2016 11:46
Habe ich schon. Ich frage mich nur, warum ein entferntes Objekt Schaden bekommen kann.
Parent - - By Gecko (More than 500 posts.) Date 02.07.2016 12:13 Upvotes 1
Klingt dann aber weniger nach einem Engineproblem. Wer weiß was da alles überladen wird.
Parent - By Fulgen (More than 500 posts.) Date 19.09.2016 16:02
Explode() von Hazard. Sonst nix.
Parent - - By Kanibal (More than 200 posts.) Date 02.07.2016 13:46
Crash oder Freeze? Für mich klingt das eher nach einer Endless-Loop.
Parent - - By Fulgen (More than 500 posts.) Date 02.07.2016 14:20 Edited 05.12.2016 12:47
Alter Post: Crash. Und nein, es ist keine Endlosschleife.
EDIT: Natürlich ein Freeze >.<
Parent - - By Kanibal (More than 200 posts.) Date 02.07.2016 14:29
Najo. Operationen auf gelöschten Objekten sind undefiniertes Verhalten™
Parent - By Fulgen (More than 500 posts.) Date 02.07.2016 14:40
Das schon.
Parent - - By Jan (More than 50 posts.) Date 02.07.2016 15:44
Ist möglicherweise der gleiche Fehler: https://clonkspot.org/forum/topic_show.pl?pid=2612#pid2612
Parent - By Fulgen (More than 500 posts.) Date 02.07.2016 15:53
Naja. Das Inventar wird vor dem Explode() - Aufruf bearbeitet, nicht im Destruction-Callback.
Up Topic Deutsch / Hilfestellung / C4Script: Don't do this!

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill