Hallo Leute,
wie ihr dem Titel ja schon entnehmen konntet geht es in diesem Tutorial um den Befehl ChangeDef().
Vorkenntnisse: Grundkenntnisse in Clonk-Script
Schwierigkeit
*****
Was macht ChangeDef() überhaupt?ChangeDef() weißt einem Objekt eine neue Definition zu, sprich ändert die ID eines Objektes. Man darf sich jetzt aber nicht vorstellen man hat auf einmal einen Stein mit der ID "CLNK", wenn man ChangeDef(CLNK) auf einen Stein anwendet, sondern einen Clonk. Heißt das Objekt hat jetzt DefCore, ActMap, Grafik, Beschreibung und Script eines Clonks. An dieser Stelle könnte man Fragen: Warum nicht gleich ein neues Objekt platzieren und das alte löschen? Die Antwort: ChangeDef erhält nämlich auch Teile des ursprünglichen Objekts. Ich will hier nicht auf alles eingehen aber mal die wichtigsten Dinge aufzählen:
-Den Besitzer,
-Die Crewzugehörigkeit (Bei Objekten die CrewMember=1 in der DefCore stehen haben)
-Die .c4i Datei (= Die Datei in der der Clonk gespeichert ist)
-Die Rotation
-Der Construction-Wert (= Wie weit das Gebäude aufgebaut ist)
-Ob eine Flagge aufgesteckt ist
-Den Inhalt
-Lokale Variablen
-Effekte
Wie sieht der Befehl denn aus? - Code:
-
ChangeDef(ID, Obj);
ID = Die neue ID des Objekts.
Obj = Das Objekt selber. Bei lokalen Aufrufen Null.
Was kann man damit z.B. anstellen?Ein Beispiel wäre ein Objekt das einen Stein in einen Goldklumpen verwandelt.
- Code:
-
func Activate()
{
var pObj = FindObject2(Find_Distance(100), Find_ID(ROCK));
if(pObj) pObj -> ChangeDef(GOLD);
}
Der Script sucht im Umkreis von 100 Pixeln nach einem Stein und verwandelt ihn in einen Goldklumpen.
Man kann auch Clonks verwandeln. Hier ein Beispiel:
- Code:
-
public func Activate()
{
if(GetID(Contained()) == HZCK) { Contained()->ChangeDef(CLNK);
Contained()->Initialize(); return 1; }
if(GetID(Contained()) == CLNK) { Contained()->ChangeDef(HZCK);
Contained()->Initialize(); return 1; }
}
Dieses Objekt verwandelt Hazardclonks in Clonks und Clonks in Hazardclonks. Das nach der Definitionsänderung noch Initialize im Clonk aufgerufen wird ist unbedingt notwendig da sich dieser sonst nicht bewegen lässt.
Ich denke das Prinzip ist verstanden worden, je nach Scripttechnischem Können könnt ihr damit natürlich noch viel mehr anstellen, z.B. die .c4i eines Clonks für einen Magus benutzen, Gebäude aufrüsten, Verwandlungszauber etc. aber ich will hier nicht zu sehr ins Detail gehen, sonst wird das Tut nur zu überladen.
Worauf muss ich noch achten?-Bedenke immer, das das Script nach ChangeDef() ein völlig anderes ist, verwandelt das Objekt sich selbst in eine andere Definition, so muss das Script der neuen Definition für potentielle Rückverwandlungen herhalten, der Script der ursprünglichen Definition existiert ja nicht mehr. Hierfür kann man auch einen Effekt verwenden, die ja auch erhalten bleiben.
-Es ist bei fast allen Objekten notwendig Initialize() nach ChangeDef() aufzurufen, abgesehen von einigen wenigen die seine solche Funktion nicht haben.
-Das Clonk-Entwicklerteam rät davon auf eine lokale Variable die aus der ursprünglichen Definition stammt zuzugreifen, selbst wenn sie erhalten wird.
Ich hoffe das ist soweit verständlich.
Gruß, Extremclonk.