Sondersignal-Script (EM4)

Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Dienste bereitzustellen und die Zugriffe auf unsere Website zu analysieren. Außerdem werden durch unsere Partner Informationen zu Ihrer Nutzung für soziale Medien, Werbung und Analysen erfasst. Weitere Informationen

  • Beispiel-Script zur Realisierung eines Sondersignals in EMERGENCY 4.

    Sondersignal-Script

    Das Sondersignal-Script dient zur Steuerung des Sondersignals eines Einsatzfahrzeuges. Hierzu wird jedem Einsatzfahrzeug per Script ein Steuerungs-Button und eine Sounddatei zugewiesen.

    Notwendige Anpassungen

    Damit das Script funktioniert, müssen manuell einige Änderungen an den jeweiligen Script-Dateien durchgeführt werden. In den nachfolgenden Zeilen müssen die Prototypen-Pfade der zu testenden Fahrzeuge angegeben werden. Für jedes Fahrzeug wird eine eigene Sounddatei abgespielt.

    Quellcode

    1. // Hier die Pfade von Ihren Fahrzeugen angeben!
    2. const char PROTO_FF_RW[] = "mod:Prototypes/Vehicles/Fire Department/rw.e4p";
    3. const char PROTO_FF_TLF[] = "mod:Prototypes/Vehicles/Fire Department/tlf.e4p";
    4. const char PROTO_FF_DLK[] = "mod:Prototypes/Vehicles/Fire Department/dlk.e4p";


    In den nachfolgenden Zeilen müssen die oben verwendeten Strings („PROTO_XX_XXX“) eingetragen werden. Außerdem werden hier die Pfade zu den jeweiligen Sounddateien definiert.

    Quellcode

    1. // Hier muss die StringID des oben gesetzten Namen stehen. In meinem Fall PROTO_FF_RW!
    2. if (StrCompare(v.GetPrototypeFileName(), PROTO_FF_RW) == 0)
    3. {
    4. // Hier muss ein valider Link zu einem Sirensound stehen, in 'mono' codiert!
    5. soundID = Audio::PlaySample3D("mod:Audio/FX/Sirens/tatuetata_rw_loop.wav", CarPos, true);
    6. }
    7. if (StrCompare(v.GetPrototypeFileName(), PROTO_FF_TLF) == 0)
    8. {
    9. // Hier muss ein valider Link zu einem Sirensound stehen, in 'mono' codiert!
    10. soundID = Audio::PlaySample3D("mod:Audio/FX/Sirens/tatuetata_tlf_loop.wav", CarPos, true);
    11. }
    12. if (StrCompare(v.GetPrototypeFileName(), PROTO_FF_DLK) == 0)
    13. {
    14. // Hier muss ein valider Link zu einem Sirensound stehen, in 'mono' codiert!
    15. soundID = Audio::PlaySample3D("mod:Audio/FX/Sirens/tatuetata_dlk_loop.wav", CarPos, true);
    Alles anzeigen


    Script

    Da Script wird sowohl als Download, als auch als Code direkt auf dieser Seite angeboten. (sosi.rar)

    Includes: - Dauersignalscript - alle nötigen Dummys.

    Features: - Spieler kann Dauersignal per Hand aktivieren und deaktivieren - Dauersignal geht automatisch aus, wenn das Fahrzeug angekommen ist oder anfängt zu löschen / sich installiert (DLK)-

    Fixes in V.2.0: - Dauersignal endet, wenn ein Fahrzeug zur Basis gefahren ist - Dauersignal endet, wenn ein Fahrzeug direkt von Basis zu einem bestimmten Punkt gesendet wurde.

    Erklärungen zu dem Script: Es tut mir leid, aber dadurch, dass sich einige Probleme eingestellt haben bin ich nichtmehr in der Lage, das Script laiengerecht zu erklären - es ist ziemlich kompliziert geworden. Für direkte Fragen stehe ich aber gerne zur Verfügung.

    Quellcode

    1. //**************************************************************************************************
    2. // #Version 2.0# ****
    3. // ****
    4. // Includes: all Sirens ****
    5. // ****
    6. // 1.0| VCmdSiren ****
    7. // 1.1| DUMMYUpdatePos ****
    8. // 1.2| DUMMYDisableSiren ****
    9. // 1.3| DUMMYFindPath ****
    10. // 1.4| DUMMYHasSiren ****
    11. // ****
    12. // childID 1 for disabling bluelights. ****
    13. // ****
    14. // ****
    15. // **************************************************************************************************
    16. // Hier kann man den Namen eines Icons für die Commandleiste angeben.
    17. // Wird automatisch aus den Ordnern UI/Game/Icons/Command/ und UI/Game/Icons/Cursor genommen.
    18. const char IMG[] = "horn";
    19. const char EACTION_FINDPATH[] = "EActionFindPath";
    20. const char DUMMY_HASSIREN[] = "DUMMYHasSiren";
    21. const char DUMMY_UPDATEPOS[] = "DUMMYUpdatePos";
    22. const char DUMMY_FINDPATH[] = "DUMMYFindPath";
    23. const char CMD_MOVETO[] = "MoveTo";
    24. const char NAME_DUMMYOBJECT[] = "HelpingObjekt_Roger";
    25. const char PROTO_BFW_LF[] = "mod:Prototypes/Vehicles/Fire Department/gtf.e4p";
    26. const char PROTO_BFW_TLF[] = "mod:Prototypes/Vehicles/Fire Department/tlf.e4p";
    27. int DummyGroup = 20;
    28. // 01.0
    29. object VCmdSiren : CommandScript
    30. {
    31. VCmdSiren()
    32. {
    33. SetIcon(IMG);
    34. SetCursor(IMG);
    35. SetRestrictions(RESTRICT_SELFEXECUTE);
    36. }
    37. bool CheckPossible(GameObject *Caller)
    38. {
    39. if (!Caller->IsValid())
    40. return false;
    41. if (Caller->GetType() == ACTOR_VEHICLE)
    42. {
    43. return true;
    44. }
    45. return false;
    46. }
    47. bool CheckTarget(GameObject *Caller, Actor *Target, int childID)
    48. {
    49. if (!Target->IsValid() || Target->GetID() != Caller->GetID())
    50. return false;
    51. if (!Caller->HasCommand(CMD_MOVETO) || Caller->GetType() != ACTOR_VEHICLE)
    52. return false;
    53. return true;
    54. }
    55. void PushActions(GameObject *Caller, Actor *Target, int childID)
    56. {
    57. Vehicle v(Caller);
    58. if (!v.HasCommand(DUMMY_HASSIREN) && (childID != 2 && childID != 1))
    59. {
    60. int soundID;
    61. v.EnableBlueLights(true);
    62. Vector CarPos = v.GetPosition();
    63. // Hier die const char Namen von oben eintragen wie in den beiden Beispielen unten.
    64. if (StrCompare(v.GetPrototypeFileName(), PROTO_BFW_LF) == 0)
    65. {
    66. // Hier muss der Pfad der Sounddatei stehen.
    67. soundID = Audio::PlaySample3D("mod:Audio/FX/Sirens/feuerwehr1_loop.wav", CarPos, true);
    68. }
    69. if (StrCompare(v.GetPrototypeFileName(), PROTO_BFW_TLF) == 0)
    70. {
    71. soundID = Audio::PlaySample3D("mod:Audio/FX/Sirens/feuerwehr2_loop.wav", CarPos, true);
    72. }
    73. GameObject mDummy = Game::CreateObject("mod:Prototypes/Objects/Misc/empty.e4p", NAME_DUMMYOBJECT);
    74. mDummy.Hide();
    75. mDummy.SetPosition(CarPos);
    76. mDummy.SetUserData(soundID);
    77. mDummy.PushActionExecuteCommand(ACTION_NEWLIST, DUMMY_UPDATEPOS, &v, soundID, false);
    78. v.SetUserData(soundID);
    79. v.AssignCommand(DUMMY_HASSIREN);
    80. return;
    81. }
    82. if (v.HasCommand(DUMMY_HASSIREN))
    83. {
    84. if (childID == 1)
    85. {
    86. v.EnableBlueLights(false);
    87. }
    88. if (v.HasCommand(DUMMY_HASSIREN))
    89. {
    90. int ref = Caller->GetUserData();
    91. Audio::StopSample(ref);
    92. GameObjectList list = Game::GetGameObjects(NAME_DUMMYOBJECT);
    93. for(int i=0; i<list.GetNumObjects(); i++)
    94. {
    95. GameObject *obj = list.GetObject(i);
    96. if (obj->GetUserData() == ref)
    97. {
    98. int mSirTest = i;
    99. GameObject *obj = list.GetObject(mSirTest);
    100. obj->PushActionDeleteOwner(ACTION_NEWLIST);
    101. v.RemoveCommand(DUMMY_HASSIREN);
    102. }
    103. }
    104. }
    105. return;
    106. }
    107. }
    108. };
    109. // 01.1
    110. object DUMMYUpdatePos : CommandScript
    111. {
    112. DUMMYUpdatePos()
    113. {
    114. SetGroupID(DummyGroup);
    115. }
    116. bool CheckTarget(GameObject *Caller, Actor *Target, int childID)
    117. {
    118. }
    119. void PushActions(GameObject *Caller, Actor *Target, int childID)
    120. {
    121. Vehicle v(Target);
    122. GameObject mDummy(Caller);
    123. Vector CarPos = v.GetPosition();
    124. if (v.IsDestroyed() || !v.IsValid())
    125. {
    126. int ref = mDummy.GetUserData();
    127. Audio::StopSample(ref);
    128. mDummy.PushActionDeleteOwner(ACTION_NEWLIST);
    129. } else
    130. {
    131. mDummy.SetPosition(CarPos);
    132. Audio::UpdatePos(childID, CarPos, true);
    133. if (v.IsCurrentAction(EACTION_FINDPATH))
    134. {
    135. if (!v.HasCommand(DUMMY_FINDPATH))
    136. {
    137. v.AssignCommand(DUMMY_FINDPATH);
    138. }
    139. }
    140. mDummy.PushActionExecuteCommand(ACTION_NEWLIST, DUMMY_UPDATEPOS, Target, childID, false);
    141. }
    142. if (v.HasCommand(DUMMY_FINDPATH))
    143. {
    144. if (!v.IsCurrentAction(EACTION_FINDPATH) && v.GetNumActions() == 0)
    145. {
    146. v.RemoveCommand(DUMMY_HASSIREN);
    147. v.RemoveCommand(DUMMY_FINDPATH);
    148. int ref = Caller->GetUserData();
    149. Audio::StopSample(ref);
    150. GameObjectList list = Game::GetGameObjects(NAME_DUMMYOBJECT);
    151. for(int i = 0; i < list.GetNumObjects(); i++)
    152. {
    153. GameObject *obj = list.GetObject(i);
    154. if (obj->GetUserData() == ref)
    155. {
    156. int mSirTest = i;
    157. GameObject *obj = list.GetObject(mSirTest);
    158. obj->PushActionDeleteOwner(ACTION_NEWLIST);
    159. v.RemoveCommand(DUMMY_HASSIREN);
    160. if (v.HasCommand(DUMMY_FINDPATH))
    161. {
    162. v.RemoveCommand(DUMMY_FINDPATH);
    163. }
    164. }
    165. }
    166. }
    167. }
    168. }
    169. };
    170. // 01.2
    171. object DUMMYDisableSiren : CommandScript
    172. {
    173. DUMMYDisableSiren()
    174. {
    175. SetGroupID(DummyGroup);
    176. }
    177. bool CheckTarget(GameObject *Caller, Actor *Target, int childID)
    178. {
    179. }
    180. void PushActions(GameObject *Caller, Actor *Target, int childID)
    181. {
    182. Vehicle v(Caller);
    183. if (childID == 1)
    184. {
    185. v.EnableBlueLights(false);
    186. }
    187. int ref = Caller->GetUserData();
    188. Audio::StopSample(ref);
    189. GameObjectList list = Game::GetGameObjects(NAME_DUMMYOBJECT);
    190. for(int i = 0; i < list.GetNumObjects(); i++)
    191. {
    192. GameObject *obj = list.GetObject(i);
    193. if (obj->GetUserData() == ref)
    194. {
    195. int mSirTest = i;
    196. GameObject *obj = list.GetObject(mSirTest);
    197. obj->PushActionDeleteOwner(ACTION_NEWLIST);
    198. v.RemoveCommand(DUMMY_HASSIREN);
    199. if (v.HasCommand(DUMMY_FINDPATH))
    200. {
    201. v.RemoveCommand(DUMMY_FINDPATH);
    202. }
    203. }
    204. }
    205. }
    206. };
    207. // 01.3
    208. object DUMMYFindPath : CommandScript
    209. {
    210. DUMMYFindPath()
    211. {
    212. SetGroupID(DummyGroup);
    213. }
    214. bool CheckTarget(GameObject *Caller, Actor *Target, int childID)
    215. {
    216. return false;
    217. }
    218. void PushActions(GameObject *Caller, Actor *Target, int childID)
    219. {
    220. }
    221. };
    222. // 01.4
    223. object DUMMYHasSiren : CommandScript
    224. {
    225. DUMMYHasSiren()
    226. {
    227. SetGroupID(DummyGroup);
    228. }
    229. bool CheckGroupVisibility(GameObject *Caller)
    230. {
    231. return false;
    232. }
    233. bool CheckPossible(GameObject *Caller)
    234. {
    235. return false;
    236. }
    237. bool CheckTarget(GameObject *Caller, Actor *Target, int childID)
    238. {
    239. return false;
    240. }
    241. void PushActions(GameObject *Caller, Actor *Target, int childID)
    242. {
    243. }
    244. };
    Alles anzeigen


    Anpassung an weiteren Scripten

    Um das Sondersignal automatisch zu deaktivieren benötigen wir ein kleines Stückchen Code in jedem Script der folgenden Liste:
    • Cool.script
    • Deinstall.script
    • Emptycar.script
    • Extinguish.script
    • GoHome.script
    • Install.script
    • Move.script
    Um zu funktionieren, muss sich der Code innerhalb der „void PushAction(GameObject *Caller, Actor *Target, int childID)“ befinden - aber möglichst am Ende!

    Der Code muss wie folgt aussehen:

    Quellcode

    1. if (Caller->GetType() == ACTOR_VEHICLE)
    2. {
    3. Vehicle v(Caller);
    4. v.PushActionExecuteCommand(ACTION_APPEND, "VCmdSiren", Caller, 2, false);
    5. }


    Nachfolgend eine Erklärung der einzelnen Funktionen:

    Vehicle v(Caller); - Übergibt den Caller, also den ausführenden Part des Scripts als Vehicle v (v = der „Name“).
    PushActionExecuteCommand - Führt einen Befehl in einer Reihenfolge aus.
    ACTION_APPEND - Die Angabe der Reihenfolge (hier ACTION_APPEND für das Einfügen ans Ende der bestehenden Liste).
    VCmdSiren - Der Name des auszuführenden Commandos.
    Caller - Hier wird das Target für das auszuführende Commando übergeben, in diesem Fall der Caller selbst.
    2 - Ist eine sogenannte childID hier gibt es 2 Möglichkeiten!
    1 → Das Fahrzeug schaltet beim Beenden des Sondersignals die Blaulichter aus.
    2 → Das Fahrzeug lässt die Blaulichter laufen.
    false - Gibt an, ob im auszuführenden Commando getestet werden soll, ob das Commando überhaupt möglich ist (ist uns in dem Fall egal, also false für „nein“).

    Alternativ werden die geänderten Original-Dateien auch als Download angeboten. Zudem befindet sich nachfolgend ein geändertes Beispiel-Script.

    Beispiel-Script: „deinstall.script“

    Quellcode

    1. object Deinstall: CommandScript
    2. {
    3. Deinstall()
    4. {
    5. SetValidTargets(ACTOR_VEHICLE);
    6. SetGroupID(CGROUP_INSTALL);
    7. SetRestrictions(RESTRICT_SELFEXECUTE);
    8. }
    9. bool CheckGroupVisibility(GameObject *Caller)
    10. {
    11. if(!Caller->IsValid() || Caller->GetType() != ACTOR_VEHICLE)
    12. return false;
    13. Vehicle v(Caller);
    14. return v.IsInstalled();
    15. }
    16. bool CheckTarget(GameObject *Caller, Actor *Target, int childID)
    17. {
    18. if(!Caller->IsValid() || !Target->IsValid() || Caller->GetID() != Target->GetID() || Caller->GetType() != ACTOR_VEHICLE)
    19. return false;
    20. Vehicle v(Caller);
    21. if (!v.IsInstalled() || v.IsUplifted() || v.IsUplifting() || !v.IsBasketEmpty())
    22. return false;
    23. return true;
    24. }
    25. void PushActions(GameObject *Caller, Actor *Target, int childID)
    26. {
    27. Caller->PushActionDeinstall(ACTION_NEWLIST);
    28. if (Caller->GetType() == ACTOR_VEHICLE)
    29. {
    30. Vehicle v(Caller);
    31. v.PushActionExecuteCommand(ACTION_APPEND, "VCmdSiren", Caller, 2, false);
    32. }
    33. }
    34. };
    Alles anzeigen


    Problemlösung

    Bei Fehlermeldungen und Problemen kann der Autor des Scripts kontaktiert werden. Hierzu ist eine möglichst detailierte Beschreibung des Fehlers und optimalerweise eine Logfile anzufügen.

    Autor: Bass-ti
    Kontakt: Bass-ti@ddr-mod.de
    Scriptname: SoSi.script
    ScriptVersion: V.2.0 Datum: 24.04.2006
    Bemerkungen: Dieses Script nutzt ein DUMMY-Command, also eines welches man normalerweise nicht sehen sollte als Spieler. Um es auszublenden ist es erforderlich, dass das Warnblinker-Script benutzt wird.

    209 mal gelesen