Inhaltsverzeichnis
Das Start-Script
Das Startscript wird zu Beginn des Freeplay, also unmittelbar nach Beendigung des Ladevorgangs ausgeführt. Da wir uns dafür entschieden haben, die Fahrzeuge direkt auf der Map zu platzieren, fällt hier ein automatisches Positionieren der Fahrzeuge weg.In unserem Script wird den Fahrzeugen nur eine Geschwindigkeit zugeordnet und einer Zahl des Codeblocks zugewiesen.Hier erst mal das Script:Quellcode
- void Start()
- {
- //Block//Fahrzeuge////////////////////////////////////////////////////////////////////////////////
- VehicleList vl("Fahrzeug_1"); //Name des Fahrzeugs auf der Map if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(10.0f); //Wert der Geschwindigkeit anpassen
- }
- //Block//Fahrzeuge////////////////////////////////////////////////////////////////////////////////
- //Bei weiteren Fahrzeugen Block kopieren und Werte auf das neue Fahrzeug anpassen
- //Block//Disponenten////////////////////////////////////////////////////////////////////////////////
- PersonList pl("Disponent_1");
- if(pl.GetNumPersons() == 0)
- System::Log("Disponent nicht gefunden: %s", pl.GetPerson(0)->GetName());
- else
- Game::AddToGroup(pl.GetPerson(0), 0); //Letzte Zahl gibt die Zahl im Codeblock an
- //0 entspricht Codeblock 1
- //1 entspricht Codeblock 2
- //2 entspricht Codeblock 3
- //...
- //Block//Disponenten////////////////////////////////////////////////////////////////////////////////
- //Bei weiteren Disponenten Block kopieren und Werte auf den neuen Disponenten anpassen
- };
- bool OnLoad()
- {
- Start();
- Process::Kill();
- return true;
- }
Fahrzeuge im Start-Script
Hauptamtliche WacheQuellcode
- VehicleList vl("ELW_Haupt"); //Name des ELW der hauptamtlichen Wache auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(12.0f); //Wert der Geschwindigkeit des ELW der hauptamtlichen Wache
- }
- VehicleList vl("DLK_Haupt"); //Name der DLK der hauptamtlichen Wache auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(9.0f); //Wert der Geschwindigkeit der DLK der hauptamtlichen Wache
- }
- VehicleList vl("HLF_Haupt"); //Name des HLF der hauptamtlichen Wache auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(10.0f); //Wert der Geschwindigkeit des HLF der hauptamtlichen Wache
- }
Wache der Freiwilligen Feuerwehr
Hier wenden wir das gleiche Vorgehen an, wie bei der Hauptamtlichen Feuerwache.
Quellcode
- VehicleList vl("MTW_FFW"); //Name des MTW der Freiwilligen Feuerwehr auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(12.0f); //Wert der Geschwindigkeit des MTW der Freiwilligen Feuerwehr
- }
- VehicleList vl("LF16_FFW"); //Name des LF der Freiwilligen Feuerwehr auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(8.0f); //Wert der Geschwindigkeit des LF der Freiwilligen Feuerwehr
- }
Auch hier greifen wir auf die gleiche Systematik zurück.
Quellcode
- VehicleList vl("RTW1"); //Name des ersten RTW auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(11.0f); //Wert der Geschwindigkeit des LF der Freiwilligen Feuerwehr
- }
- VehicleList vl("RTW2"); //Name des zweiten RTW auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(11.0f); //Wert der Geschwindigkeit des LF der Freiwilligen Feuerwehr
- }
- VehicleList vl("NEF"); //Name des NEF auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(13.0f); //Wert der Geschwindigkeit des LF der Freiwilligen Feuerwehr
- }
Disponenten im Start-Script
Die Disponenten sind Personen, denen wir später im Editor die Alarmierungscommands (wird zu einem späteren Zeitpunkt noch behandelt) zuweisen werden. Wir werden drei verschiedene Disponenten verwenden. Der erste wird alle Zugalarmierungen beinhalten, der Zweite nur Feuerwehr und der Dritte nur Rettungsdienst.Quellcode
- PersonList pl("Disponent_1"); //Name des ersten Disponenten
- if(pl.GetNumPersons() == 0)
- System::Log("Disponent nicht gefunden: %s", pl.GetPerson(0)->GetName());
- else
- Game::AddToGroup(pl.GetPerson(0), 0); //Disponent auf Codeblock 1
- PersonList pl("Disponent_2"); //Name des zweiten Disponenten
- if(pl.GetNumPersons() == 0)
- System::Log("Disponent nicht gefunden: %s", pl.GetPerson(0)->GetName());
- else
- Game::AddToGroup(pl.GetPerson(0), 1); //Disponent auf Codeblock 2
- PersonList pl("Disponent_3"); //Name des dritten Disponenten
- if(pl.GetNumPersons() == 0)
- System::Log("Disponent nicht gefunden: %s", pl.GetPerson(0)->GetName());
- else
- Game::AddToGroup(pl.GetPerson(0), 2); //Disponent auf Codeblock 3
Die Namen der Fahrzeuge und Personen im Script müssen mit den Namen der Objekte auf der Map übereinstimmen. Ansonsten kann es zu Fehlfunktionen kommen!
Das fertige Start-Script
Quellcode
- void Start()
- {
- VehicleList vl("ELW_Haupt"); //Name des ELW der hauptamtlichen Wache auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(12.0f); //Wert der Geschwindigkeit des ELW der hauptamtlichen Wache
- }
- VehicleList vl("DLK_Haupt"); //Name der DLK der hauptamtlichen Wache auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(9.0f); //Wert der Geschwindigkeit der DLK der hauptamtlichen Wache
- }
- VehicleList vl("HLF_Haupt"); //Name des HLF der hauptamtlichen Wache auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(10.0f); //Wert der Geschwindigkeit des HLF der hauptamtlichen Wache
- }
- VehicleList vl("MTW_FFW"); //Name des MTW der Freiwilligen Feuerwehr auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(12.0f); //Wert der Geschwindigkeit des MTW der Freiwilligen Feuerwehr
- }
- VehicleList vl("LF16_FFW"); //Name des LF der Freiwilligen Feuerwehr auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(8.0f); //Wert der Geschwindigkeit des LF der Freiwilligen Feuerwehr
- }
- VehicleList vl("RTW1"); //Name des ersten RTW auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(11.0f); //Wert der Geschwindigkeit des LF der Freiwilligen Feuerwehr
- }
- VehicleList vl("RTW2"); //Name des zweiten RTW auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(11.0f); //Wert der Geschwindigkeit des LF der Freiwilligen Feuerwehr
- }
- VehicleList vl("NEF"); //Name des NEF auf der Map
- if(vl.GetNumVehicles() == 0)
- System::Log("Fahrzeug nicht gefunden: %s", vl.GetVehicle(0)->GetName());
- else
- {
- Vehicle v(vl.GetVehicle(0));
- v.SetSpeed(13.0f); //Wert der Geschwindigkeit des LF der Freiwilligen Feuerwehr
- }
- PersonList pl("Disponent_1"); //Name des ersten Disponenten
- if(pl.GetNumPersons() == 0)
- System::Log("Disponent nicht gefunden: %s", pl.GetPerson(0)->GetName());
- else
- Game::AddToGroup(pl.GetPerson(0), 0); //Disponent auf Codeblock 1
- PersonList pl("Disponent_2"); //Name des zweiten Disponenten
- if(pl.GetNumPersons() == 0)
- System::Log("Disponent nicht gefunden: %s", pl.GetPerson(0)->GetName());
- else
- Game::AddToGroup(pl.GetPerson(0), 1); //Disponent auf Codeblock 2
- PersonList pl("Disponent_3"); //Name des dritten Disponenten
- if(pl.GetNumPersons() == 0)
- System::Log("Disponent nicht gefunden: %s", pl.GetPerson(0)->GetName());
- else
- Game::AddToGroup(pl.GetPerson(0), 2); //Disponent auf Codeblock 3
- };
- bool OnLoad()
- {
- Start();
- Process::Kill();
- return true;
- }
Sollte es bei Scripts zu einer Fehlermeldung oder sogar zu einem Absturz kommen und eine eigenständige Fehlerbehebung nicht möglich sein, besteht die Möglichkeit ein Thema im Bereich Scripting im EMERGENCY-Forum zu eröffnen. Um schnelle Hilfe zu bekommen, sollte jedoch das komplette Script und die Logfile, die sich im Hauptverzeichnis von EMERGENCY 4 befindet, in dem Thema zur Verfügung stellt werden.
Diese Information betrifft alle Probleme im Bereich Scripting, nicht nur Probleme mit dem Startscript.
Die Alarm-Scripts
Ersten Disponenten erstellen
Wie bereits erwähnt wurde, werden wir drei Disponenten verwenden. Der erste Disponent wird alle Arten von Zügen alarmieren können (Löschzug mit Personenschaden, Löschzug ohne Personenschade, dringende Türöffnung usw.).Über den zweiten Disponent werden alle Feuerwehrfahrzeuge gesondert alarmiert. Jedoch muss hier eine Unterscheidung zwischen hauptamtlichen Kräften und freiwilligen Kräften getroffen werden. Berufsfeuerwehrleute verbringen ihren Tag auf der Wache und müssen somit nicht von zu Hause an das Gerätehaus laufen.Der dritte Disponent wird nur die Alarm-Commands der Rettungsdienstfahrzeuge beinhalten. Da einsatzbereite Fahrzeuge des Rettungsdienst eigentlich immer mit Kräften besetzt sind, die sich vor Ort befinden, wird hier das gleiche System wie bei der hauptamtlichen Wache zum Einsatz kommen. Nachfolgend der Grundaufbau des Scripts - hier werden später noch Änderungen vorgenommen.Quellcode
- const char ICON[] = "";
- const char CURSOR[] = "";
- const char VEHICLE_NAME[] = "";
- const char VIRTUAL_OBJECT[] = "";
- const char SOUND[] = "";
- const char MESSAGE[] = "";
- const char NUM_PERSON[] = "";
- const char PROTO_PERSON[] = "";
- float WAIT_PERSON = 5;
- float WAIT_VEHICLE = 20;
- bool vehiclefull = false;
- object Alarm_ELW : CommandScript
- {
- Alarm_ELW()
- {
- SetIcon(ICON);
- SetCursor(CURSOR);
- SetValidTargets(TARGET_STREET);
- SetValidTargets(TARGET_FLOOR);
- }
- bool CheckTarget(GameObject *Caller, Actor *Target, int childID)
- {
- return true;
- }
- void PushActions(GameObject *Caller, Actor *Target, int childID)
- {
- Vector APos = Game::GetCommandPos();
- VehicleList vl(VEHICLE_NAME);
- if(gol.GetNumObjects()==0)
- {
- System::Log("%s nicht gefunden", VEHICLE_NAME);
- return;
- }
- Vehicle v(vl.GetVehicle(0));
- ActorList al(VIRTUAL_OBJECT);
- if(al.GetNumActors()==0)
- {
- System::Log("%s nicht gefunden", VIRTUAL_OBJECT);
- return;
- }
- Vector SPos = al.GetActor(0)->GetPosition();
- v.SetUserData(1);
- Audio::PlaySample(SOUND);
- Mission::PlayHint(MESSAGE);
- for(int i = 1; i <= NUM_PERSON; i++)
- {
- Person p = Game::CreatePerson(PROTO_PERSON, "Unnamed");
- p.SetRole(ROLE_SQUAD);
- p.SetUpgradeLevel(3);
- Game::FindFreePosition(&p, spawnp, 100.f);
- p.SetPosition(SPos);
- p.PushActionShowHide(ACTION_NEWLIST, true);
- p.PushActionWait(ACTION_APPEND, WAIT_PERSON);
- p.PushActionShowHide(ACTION_APPEND, false);
- p.PushActionMove(ACTION_APPEND, v.GetPosition());
- p.PushActionEnterCar(ACTION_APPEND, &v);
- if(i == NUM_PERSON)
- vehiclefull = true;
- }
- if(vehiclefull)
- {
- v.PushActionWait(ACTION_NEWLIST, WAIT_VEHICLE);
- v.PushActionMove(ACTION_APPEND, Apos);
- }
- }
- };
Eigentlich muss an diesem Script nicht viel verändert werden. Änderungen sind nur im oberen Teil nötig. Das Script ist so aufgebaut, dass alle wichtigen Variablen, wie Ausrückedauer, Prototyp der Person, Fahrzeugname usw. in den ersten 8 Zeilen einfach abgeändert werden können.
Weitere Disponenten erstellen
Der dritte Disponent ist für die Kräfte des Rettungsdienstes zuständig. Wir beginnen also exemplarisch mit einem Rettungswagen.Die Variablen ICON und CURSOR sind die Namen derGrafiken , die in dem Bedienfeld der Personen oder Fahrzeuge auftauchen. Hier muss nur ein Name angegeben werden, da das Spiel die passenden Bilddateien automatisch aus dem Icon- und Cursor-Ordner bezieht.
const char VEHICLE_NAME[] = "RTW1";
Ähnlich wie be beim Script-Script, wird hier der Name des Fahrzeugs auf der Map festgelegt. Somit weiß das Spiel, zu welchem Fahrzeug die Personen bei einer Alarmierung laufen sollen.
const char VIRTUAL_OBJECT[] = "Spawn_RTW1";
Die Variable VIRTUAL_OBJECT ist der Name des virtuellen Objekts, an dem die Personen generiert (gespawnt) werden.
Dieser Prozess des Anpassens muss nun sowohl für den zweiten RTW, das NEF, den ELW, die DLK und das HLF der ständig besetzten Wache durchgeführt werden.
Sollte bei einem späteren Test des Scripts auffallen, dass keine Personen gespawnt werden, ist zuerst die Richtigkeit des Pfades zu prüfen.
160.301 mal gelesen