Tach, da ich beim Scripten noch nicht so erfahren bin und echt nicht weiß wie man für Hazard einen Fahrzeugspawn erstellt, frage ich hier mal nach.
Mein Problem: Ich hätte gern für ein eigenes Hazard Szenario Fahrzeugspawns für die Shuttle und den Maurauder. Ich habs schon mit CreateObject Versucht, aber wenn die Shuttle (oder Panzer)
zerstört wurde, spawnt keine neue nach. Ich dachte, der letzte Wert würde die Respawnzeit wiedergeben?
Naja, ich hoffe mir kann das jemand erklären wie man so etwas Scriptet.
Scriptsprache oder wie man es nennt ist #Strict
Danke im Vorraus.
CreateObject()
ist die Standard-Funktion in Clonk, die einfach nur einmalig ein Objekt erstellt. Hier ist die zugehörige Dokumentation. Der letzte Parameter gibt da den Besitzer des Objekts an.
Hazard hat ein Spawnpunkt unter Hazard.c4d/Arena.c4d/Spawnpoint.c4d. Dort wird eine Funktion PlaceSpawnpoint(id idObj, int iX, int iY, int timer)
definiert, bei der tatsächlich der letzte Parameter ein Timer-Wert ist. Aber ich glaube nicht, dass sich das für Fahrzeuge eignet.
Du könntest in deinem Szenario den Scriptzähler verwenden (siehe das Tutorial), um eine eigene Respawn-Logik zu implementieren. Das könnte in etwa so aussehen:
func Script1() {
// Erstelle das Fahrzeug.
CreateObject(…);
}
// Wird mit etwas Verzögerung aufgerufen.
func Script10() {
// Falls das Fahrzeug nicht mehr existiert…
if (!FindObject2(Find_ID(…))
// Wieder zur Fahrzeugerzeugung springen.
goto(1);
else
// Ansonsten direkt hinter die Fahrzeugerzeugung springen, sodass später wieder überprüft wird.
goto(2);
}
Guck am besten in der Dokumentation nach, was die einzelnen Funktionen machen. Das ist da ziemlich gut beschrieben.
Soweit so gut, der Panzer wird gespawnt, auch an der richtigen Stelle, aber er spawnt nicht nach. Außerdem gibt es jetzt einen Fehler:
ERROR: ',' or ')' expected, but found identifier (in Script10, DM_NAMENLOS.c4s\Script.c:68:8)
ERROR: ',' or ')' expected, but found identifier (in Script10, DM_NAMENLOS.c4s\Script.c:68:8)
Und wenn der Panzer spawnt:
ERROR: syntax error: see previous parser error for details.
by: Script10() (DM_NAMENLOS.c4s\Script.c:0)
So sieht das Script aus, der Script Zähler ist bei Initialize (Das Spawn Script nicht):<br/>/*-- Neues Szenario --*/<br/><br/>#strict<br/><br/>func Initialize() {<br/><br/>   ScriptGo(true);<br/><br/>   SetSkyParallax(0,45,24,0,0,0,0);<br/>   SetSkyAdjust(RGBa(255,255,255,220));<br/>   <br/>   //Umwelt/Effektobjekte<br/>   <br/>   CreateObject(_AMB,165,550,-1); <br/><br/>....(Hier kommen die ganzen Objekte)....<br/><br/>}<br/><br/>//Panzer und Shuttles<br/><br/> <br/>    func Script1() {<br/>    <br/>    // Erstelle das Fahrzeug.<br/>    <br/>    CreateObject(TANK, 1137, 1280, -1);<br/>    return(1);<br/>  }  <br/><br/>   // Wird mit etwas Verzögerung aufgerufen.<br/>   <br/>   func Script10() {<br/>   <br/>   // Falls das Fahrzeug nicht mehr existiert...<br/>   <br/>   if (!FindObject2(Find_ID(TANK))<br/>   <br/>   // Wieder zur Fahrzeugerzeugung springen.<br/>   <br/>   goto(1);<br/>   else<br/>   <br/>   // Ansonsten direkt hinter die Fahrzeugerzeugung springen, sodass später wieder überprüft wird.<br/>   <br/>  <br/>   goto(2);<br/><br/>   return(1);<br/>}<br/>
Aber schon mal Danke für die schnelle Antwort!
(Weiß nicht warum strict so groß geschrieben ist)
Die Fehlermeldung sagt dir doch ziemlich genau, wo der Schuh drückt: In Zeile 68 fehlt eine Klammer zu ). Du solltest natürlich unbedingt einen Editor verwenden, der dir die Zeilennummern auch anzeigt, z.B. den c4scripter.
Wie Luchs schon angemerkt hatte: Klammerfehler in Script10
…
func Script10() {
// Falls das Fahrzeug nicht mehr existiert…
if (!FindObject2(Find_ID(TANK)))
…
Hoffe man kann die dickere Klammer erkennen
Ah ok, jetzt funktionierts.
Vielen Dank!
Ich hab doch noch eine Frage…
Und zwar brauch ich dieses Script 8mal. Das Problem ist aber wenn ich das Script mit den neuen Daten einfüge,
überschneiden die sich irgendwie.
Nämlich das neue Script für die Shuttle spawnt zwar, aber sie spawnt jetzt ständig nach egal ob sie noch am leben ist.
Wie muss ich das Script jetzt verändern das es auch mit mehren funktioniert?
strict 2
func Initialize() {
ScriptGo(true);
SetSkyParallax(0,45,24,0,0,0,0);
SetSkyAdjust(RGBa(255,255,255,220));
//Umwelt/Effektobjekte
CreateObject(_AMB,165,550,-1);
…(Hier kommen die ganzen Objekte)…
}
//Panzer und Shuttles
func Script1() {
// Erstelle die Fahrzeuge.
CreateObject(TANK, 1137, 1280, -1);
CreateObject(HUBS, 1137, 1280, -1); //Hubschrauber?
CreateObject(…
…
return true;
}
// Wird mit etwas Verzögerung aufgerufen.
func Script10() {
// Falls das Fahrzeug nicht mehr existiert…
if (!FindObject2(Find_ID(TANK))) CreateObject(TANK, 1137, 1280, -1);
if (!FindObject2(Find_ID(HUBS))) CreateObject(HUBS, 1137, 1280, -1);
if (!FindObject2(Find_ID(…
…
//Verzögern
goto(2);
return true;
}
Habs zwar nicht getestet, sollte aber trotzdem funktionieren!
Meine Schreibweise im Szen ist Strict, nicht Strict 2, macht das was großes aus?
Nicht für diesen Beispielscript, funktioniert sowohl in strict als auch strict 2
Tja, soweit, so gut…
Aber ich brauch ja Shuttle und Panzer für jede Seite 1mal, also überschneiden sich die Ids der beiden Panzer (oder Shuttles).
FindObject2() kann mehrere Suchkriterien annehmen
Vielleicht helfen dir Find_Owner(), Find_InRect() oder Find_Distance()
Ne das hilft nicht weiter… Es gibt 2 Basen, jede hat ihre eigenen Fahrzeuge und Geschütze. Von daher würden mir Find_Distance und Find_InRect nicht weiterhelfen.
Weil wenn beide mit nem Panzer losfahren würden… der eine wird im Suchbereich des ersten Scripts zerstört während sich der andere im Suchbereich befindet.
Daher würden die mit dem überlebendem Panzer(oder Shuttle) immer wieder einen dazu bekommen.
Dann würde ich ein Array vorschlagen, welches alle Fahrzeuge speichert.
Fehlt ein gespeichertes Objekt, so wird dieses Objekt neu erstellt:
—
#strict
static a_fahrzeuge;
func Initialize() {
a_fahrzeuge = [];
ScriptGo(true);
//Fahrzeuge werden erstellt
goto(10);
return true;
}
// Wird mit etwas Verzögerung aufgerufen.
func Script10() {
// Falls das Fahrzeug nicht mehr existiert…
if (!a_fahrzeuge[0]) a_fahrzeuge[0] = CreateObject(WAGN, 200, 50, -1);
if (!a_fahrzeuge[1]) a_fahrzeuge[1] = CreateObject(LORY, 300, 50, -1);
if (!a_fahrzeuge[2]) a_fahrzeuge[2] = CreateObject(SUB1, 400, 50, -1);
if (!a_fahrzeuge[3]) a_fahrzeuge[3] = CreateObject(SLBT, 500, 50, -1);
…
//Verzögern
goto(1);
return true;
}
Perfekt, das funktioniert. Danke an alle die mir geholfen haben!:happy:
Danke, markdown, fuer die Betonung von strict <3
Ich hab es jetzt mal doch noch gefixt :o