17.08.2014, 14:47 | #1 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Zivilistentode zählen (von definierten Einheiten verursacht)
Hallo zusammen
Ich könnte ein wenig Hilfe bei der im Betreff genannten Abfrage brauchen. Sie sollte in einer gehosteten MP-Mission funktionieren. Da meine Scriptkenntnisse eher bescheiden sind, versuche ich hier in 'Pseudoscriptsprache' aufzuzeigen, was ich mir vorstelle. 1. variable 'toteziv=0' in die Init.sqf 2. Auslöser wie folgt: BED: not alive _x and _x=sidecivilian and _x !=Spion and (_x=Kind of man or _x=Kind of man in a Car) and (Killer ist AL1 or Killer ist AL2) AKT: toteziv=toteziv + 1; publicvariable "toteziv" 3. Auslöser, der bei 'toteziv >= 5' ein 'End1' bewirkt Der Counter darf sich nur erhöhen, wenn: - der getötete Zivilist ein Mensch ist (zu Fuss oder in einem Auto) - der getötete Zivilist nicht 'Spion' heisst - der 'getötete' nicht ein leeres Auto, ein Fass, ein Haus etc. ist - der Killer entweder die Einheit AL1, oder die Einheit AL2 ist Bei Pt. 2 bräuchte ich Hilfe, den Rest krieg ich dann vermutlich schon hin. Jetzt schon vielen Dank für eure Hilfe Nachtrag: Es gibt im Editor gesetzte Zivilisten auf der Karte, aber auch solche, die durch ein Script gespawnt und (bei Entfernung der Spieler) wieder gelöscht werden. Keine Ahnung, wie ich sicherstellen könnte, dass alle Zivils (auch wenn sie erst im Verlauf der Mission gespawnt werden) jederzeit einen allenfalls benötigten eventhandler haben. :-( Geändert von Wolkenbeisser (17.08.2014 um 15:06 Uhr). |
17.08.2014, 18:42 | #2 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.109
|
Mein altes Gehirn hat doch noch Speicherfunktionen. Das sollte dir helfen
Zivilisten Counter
__________________
Bewegende Momente bei ArmA 3 |
17.08.2014, 19:14 | #3 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
|
init.sqf:
Code:
toteziv = 0; killers = ["AL1","AL2"]; agenten = ["Spion"]; GDT_fnc_civCounter = { _opfer = _this select 0; _schuetze = _this select 1; if ( !(vehicleVarName _opfer in agenten) and (_opfer isKindOf "Man" or _opfer isKindOf "Car") and (vehicleVarName _schuetze in killers) ) then { toteziv = toteziv + 1; publicVariable "toteziv";}; hintSilent format["%1",toteziv]; }; { if (side _x == CIVILIAN) then { _x addEventHandler ["KILLED",{_this call GDT_fnc_civCounter}]; } } forEach allUnits; Code:
_unit addEventHandler ["KILLED",{call GDT_fnc_civCounter}]; |
17.08.2014, 20:12 | #4 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Hey Buliwyf, das ging aber schnell. Danke schon mal für die schnelle Hilfe. Werde es ausprobieren, sobald ich dazu komme (hoffe, noch heute).
Kurze Frage noch zu diesem Abschnitt in Deinem Code: Code:
.....or _opfer isKindOf "Car"...... |
17.08.2014, 20:15 | #5 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
|
Da der EventHandler auf den Zivilisten durch allUnits gesetzt ist, interessiert das Auto nicht. allUnits beinhaltet nur künstliche Intelligenz und keine Objekte.
Du musst bei den spawnenden Einheiten natürlich den EventHandler auf die KI und nicht auf das Auto setzen... |
17.08.2014, 23:09 | #7 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Klappt perfekt!
Habe alle möglichen Tests gemacht: - Als 'AL1' vier Zivilisten erledigt, dann Respawn, dann 1 Zivilist - Als 'AL2' Zivilisten überfahren - Als 'AL3' Zivilisten, die in Autos sassen erledigt - Als 'AL4' leere Autos (und andere Objekte) gesprengt - Als 'AL5' andere Einheiten, statt der Zivilisten erledigt - Als 'AL6' Per Script gespawnte Zivilisten erledigt - Als 'AL7' Im Editor gesetzte Zivilisten erledigt - Als 'AL8' gesetzte/gespawnte Zivilisten gemischt erledigt - Als Spion > 10 Zivilisten erledigt - geschaut, was passiert, wenn ein Ziv. von einem anderen Ziv. überfahren wird Der Code von Buliwyf (ergänzt mit den spielbaren Figuren AL3 - AL8) hat in jeder Situation richtig funktioniert. Damit ist mein Problem gelöst. Nochmals: Danke Buliwyf |
05.01.2015, 22:06 | #8 (permalink) |
Registriert seit: 05.01.2015
Beiträge: 3
|
Entschuldigt wenn ich das hier Quasi wieder ausgrabe,aber ich habe vor in einer MP-Mission per script Zivilisten die als erschossen gelten zu zählen und beim überschreiten einer bestimmten Zahl aufständische zu spawnen und als "Framework" sieht das hier ideal aus.
Leider bekomme ich das beim besten willen nicht zum laufen,liegt das an dem verwendetem "addEventHandler" bzw müsste das in meinem Fall nicht "addMPEventhandler" sein? Habe jedes Civilian-Casualties-Script ausprobiert das ich gefunden habe,keines Zählt bzw funktioniert.Muss dazu sagen,dass ich Civilisten per EOS spawne. Ich wäre echt dankbar wenn da jemand licht ins dunkle bringen könnte |
06.01.2015, 03:09 | #9 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.109
|
Kommasetzung, Satzzeichen sowie Groß-&Kleinschreibung ist nicht so dein Fall, oder?
Keine Ahnung was EOS ist, aber du mußt in dem Script diesen o.g. EH einfügen. addeventHandler reicht völlig aus. Jeder KI beim Spawnen den Killed-EH anhängen und pro Aktivierung den Wert hochzählen lassen. Allerdings sollte ganz zum Anfang in der ServerInit totezivs = 0 stehen
__________________
Bewegende Momente bei ArmA 3 |
06.01.2015, 17:18 | #10 (permalink) |
Registriert seit: 05.01.2015
Beiträge: 3
|
Es war Spät [für mich],geb mir Mühe meine Beiträge in Zukunft etwas ordentlicher abzusetzen.Danke auf jeden Fall für die Erklärung. Ich denke das Script läuft soweit aber es zählt nicht sichtbar hoch.Wenn ein Zivilist getroffen wird,erscheint unter der Waffenanzeige eine Box mit einer Null.Diese Zahl verändert sich auch nicht.Sollte sich das nicht ändern? Ist es legitim Code:
killers = [side player == blufor]; |
06.01.2015, 17:40 | #11 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.109
|
Hast du Buli sein Script 1:1 übernommen? Oder was hst du bereits gemacht?
Du willst einen Zähler haben, welcher auslöst, wenn ein Blauer einen Civ umniedet, richtig? init: Code:
if (isServer) then {totezivs = 0; { if (side _x == civilian) then {_x addeventhandler ["killed", {call dof_civcnt}]; } }foreach allunits}; dof_civcnt = { _toter = _this select 0; _schuetze = _this select 1; If (side _schuetze == west) then { if (isServer) then {totezivs = totezivs + 1}; hint format ["%1 \n hat einen Zivilisten getötet. \n \n Anzahl aller getöteten Zivilisten: \n %2", name _schuetze, totezivs ]; } Wie du dann die Reißleine ziehst, wenn viele Zivis tot sind, ist dir überlassen. Willst du die eigene KI von Schuld und Sühne befreien dann schreibe If (isplayer _schuetze) then {....} anstatt If (side _schuetze == west)
__________________
Bewegende Momente bei ArmA 3 Geändert von Drunken Officer (06.01.2015 um 18:21 Uhr). |
29.04.2015, 07:33 | #13 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Hallo zusammen
Sorry, wenn ich meinen alten Fred wieder ausgrabe. Ich wollte nun dieses Script in einer neuen Mission verwenden und bin auf ein Problem gestossen. Alles funzt prima, solange ich als Mörder zu Fuss unterwegs bin, oder mit einem Auto Zivilisten überfahre (siehe meine Tests im Post vom 18.08.2014, 00:09). Aber: Sobald ich als Schütze eines Fahrzeuges (z.B. aus einem Panzer, Hunter oder Heli) morde, funktioniert der Zähler nicht mehr. Ich habe versucht das Problem zu lösen, in dem ich die 'killers' im Script mit dem Zusatz 'vehicle' versah (also z.B. vehicle AL1 statt AL1), aber das hat nicht geholfen. Hat jemand eine Idee, wie man das Script ergänzen müsste, dass auch die Morde eines Fahrzeugschützen zählen? |
29.04.2015, 11:31 | #14 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
|
Naja, wenn Du meine Variante nutzt, die ist ja nun auf die Variablennamen zurechtgeschnitten. Wenn Du nun als "Hans" in den Helikopter "Fuchur" einsteigst und dort Leute abknallst, dann kann ich mir gut vorstellen, dass ArmA die Kills "Fuchur" zuschreibt und nicht "Hans". Das schliesse ich zumindest aus Deinen Ausführungen so...
Momentan, uff Maloche, hab ich da keibe schnelle Idee wie man das ändern könnte. Ich denke aber, dass man das komplett anders machen müsste - ohne vehicleVarName und so... |
29.04.2015, 13:15 | #15 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Aha, aber trotzdem ein interessanter Hinweis, Buliwyf
Da die Spieler in meiner Coop explizit nur genau 6 Fahrzeuge zur Verfügung haben (3 Autos und 3 Hubis), die erst noch alle einen eigenen Variablennamen haben (wegen Fz-Respawn und Abfrage in Triggern), könnte ich doch einfach diese Variablen noch zu der Liste der 'killers' hinzufügen. Das muss ich dringend testen, sobald ich dazu komme... melde mich dann wieder. Vielen Dank inzwischen. ---------- Edith meint: Aber warum werden die Morde dann gezählt, wenn ich als Fahrer die Zivis umniete? Als Fahrer wäre Hans im Auto doch auch Fuchur.... Geändert von Wolkenbeisser (29.04.2015 um 13:22 Uhr). |
01.05.2015, 15:30 | #17 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
@ Nokman: Vielen Dank für den Hinweis. Werde das bei Gelegenheit ausprobieren.
@ Buliwyf: Ich habe die Variablennamen der Fahrzeuge nun auch in dem Script als 'killers' eingetragen. Das funktioniert bestens. Im Moment reicht das für meine Zwecke vollkommen. Vielen Dank euch beiden. Problem gelöst |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
T8 Units - Einheiten Spawn Script | T-800a | Editing & Scripting | 2 | 07.03.2014 20:46 |
Einheiten in Gruppe löschen | Brubaker | Editing | 6 | 26.05.2011 17:44 |
Heal/Repair Script / Einheiten in einem Radius zufällig generieren lassen | Noobfire | Editing & Scripting | 8 | 06.08.2010 15:22 |