Armed-Assault.de Twitter
 
 
Themen-Optionen Ansicht
Alt 16.02.2015, 14:23   #1 (permalink)
Newbie
 
Registriert seit: 19.09.2014
Beiträge: 8
Standard Fraktionen verfeinden - Eventhandler MPKilled

Hallo Zusammen,

ich sitze gerade an einer Coop+ Mission, also Multiplayer mit 2 Spielerfraktionen und AI. In dieser ist ein Teil der Spieler als Blufor gesetzt.

Der zweite Teil der Spieler soll die Wahl erhalten, eine Fraktion (Blufor / Opfor/ Guerilla) zu unterstützen.

Mein Ansatz dazu ist es, diese zweite Spielerfraktion als Guerilla einzubinden und diese zum Missionsstart mit allen zu befreunden. Im Laufe der Mission sollen sie sich dann entscheiden, welche Fraktion sie unterstützen.

Mit dem Befehl setFriend kann man das Verhalten der Fraktionen zueinander beeinflussen.
Beispiel:
PHP-Code:
Resistance setFriend [East0];
East setFriend [Resistance0]; 

Bisher hab ich das über den Umweg umgesetzt, eine bestimmte Einheit in der Mission erschießen zu lassen, um die Entscheidung herbeizuführen. (CSATHeini1 = tot -> AAF feindlich zu CSAT und andersrum).
Passender wäre es jedoch wenn das bei allen Einheiten funktionieren würde.

Wie schaffe ich es also, die Fraktionen miteinander zu verfeinden, sobald eine KI Einheit ausgeschaltet wurde?

Ich hab das Gefühl, dass das mit einem MPKilled - Eventhandler umgesetzt werden könnte, habe jedoch keine Ahnung wie das genau funktioniert.
  • Wie bringe ich den Eventhandler an allen OPfor Einheiten an?
  • Wie sage ich dem Eventhandler dass er aktiviert werden soll ( und die Fraktionen verfeindet), sobald eine Opfor Einheit von der Guerilla getötet wird?

Die Suchfunktion habe ich benutzt, bei mir scheitert es jedoch leider an den Grundlagen zu Eventhandlern.. erbarmt sich jemand und erklärt mir den Sachverhalt?
Loooci ist offline  
Alt 16.02.2015, 19:37   #2 (permalink)
10 Jahre hx3
5000 Beiträge10.000 Beiträge15.000 Beiträge
 
Benutzerbild von burns
 
Registriert seit: 13.04.2003
Ort: Monerica
Alter: 42
Beiträge: 32.977
Standard

Code:
{
    if (side _x == east) then {
        _x addMPEventHandler ["MPKilled",{East setFriend [Resistance, 0]; }]
    };
} foreach allunits;

Habsch geil zusammengefrankensteint
__________________

burns ist offline  
Alt 16.02.2015, 23:03   #3 (permalink)
Newbie
 
Registriert seit: 19.09.2014
Beiträge: 8
Standard

Zitat von burns Beitrag anzeigen

Code:
{
    if (side _x == east) then {
        _x addMPEventHandler ["MPKilled",{East setFriend [Resistance, 0]; }]
    };
} foreach allunits;

Habsch geil zusammengefrankensteint

Danke Dir Burns!

Läuft das so ab?

wenn die seite "east" entspricht dann pack an alle "east" den Eventhandler MPKilled mit {für das aus wenn dieser EV zündet}; Und das pack an alle Einheiten auf der Map;

Klingt wahrscheinlich ziemlich dämlich, muss das aber mal so nachvollziehen, um es zu verstehen ^^
Loooci ist offline  
Alt 16.02.2015, 23:30   #4 (permalink)
10 Jahre hx3
5000 Beiträge10.000 Beiträge15.000 Beiträge
 
Benutzerbild von burns
 
Registriert seit: 13.04.2003
Ort: Monerica
Alter: 42
Beiträge: 32.977
Standard

Ich versteh das selber nie!

War ein reiner Glückstreffer, daß Teilstücke (Aufruf aus einer meiner Missionen, EH Zeilen Beispiel aus dem Biki, und dein Befehlsschnipsel) genau so zusammen funktioniert haben. Darum "gefrankensteint".

Aber im Grunde ist deine Aufassung so richtig.

Den Eventhandler zu befüttern scheint auch relativ easy, aber bevor ich hier Anfang Mist zu erklären, lass ich lieber jmd. ran der auch versteht wovon er redet (wie z.B. Hoschi, der meint das dieses _x auch wichtig ist).
__________________

burns ist offline  
Alt 17.02.2015, 09:54   #5 (permalink)
50 Beiträge100 Beiträge250 Beiträge
 
Registriert seit: 10.10.2006
Beiträge: 263
Standard

Code:
{
    if (side _x == east) then { //wenn es opfor ist sonst springt er weiter
        _x addMPEventHandler ["MPKilled",{East setFriend [Resistance, 0]; }]//fügt jeder einheit Opfor denn MP eventhändler zu (befehl wird Global übertragen im gegensatz zu killed EH)
    };
} foreach allunits; //wiederholt die Arbeit für alle Einheiten die in den Moment wo der Befehl ausgeführt wird auf der Karte vorhanden sind
Kleine erklärung dazu im Code

Was zu beachten ist wenn du Respawn oder einheiten nach den Mapstart (oder wann der Befehl ausgeführt wird) erzeugst ist der MP Eventhändler nicht mehr auf der Einheit drauf.
Nokman ist offline  
Alt 17.02.2015, 12:17   #6 (permalink)
Newbie
 
Registriert seit: 19.09.2014
Beiträge: 8
Standard

Danke auch Dir Nokman! Ich werd das heute abend in die Mission reinbauen und mich dann nochmal melden.
Loooci ist offline  
Alt 17.02.2015, 19:17   #7 (permalink)
500 Beiträge1000 Beiträge
 
Benutzerbild von Drunken Officer
 
Registriert seit: 15.05.2011
Beiträge: 1.110
Standard

Der obere EH erfüllt nicht zu 100% die Forderung des TE! Der TE will, dass
Zitat:

Wie sage ich dem Eventhandler dass er aktiviert werden soll ( und die Fraktionen verfeindet), sobald eine Opfor Einheit von der Guerilla getötet wird?

In den bisher aufgelisteten Versionen würde es auch zutreffen, wenn z.B. Spieler A den Spieler B aus Unachtsamkeit überfährt und beide OpFor sind.

Es muss die Seite des "Verbrechers" abgefragt werden.
Code:
{
    if (side _x == east) then {
        _x addMPEventHandler ["MPKilled",{ if ( side (_this select 1) == restiance) then {East setFriend [Resistance, 0];} }]
    };
} foreach allunits;
jetzt ist Rot feindlich zu Grün. Grün ist aber deswegen nicht feindlich rot. Das muss wie im ersten Beitrag schon geschrieben ergänzt werden
__________________
Bewegende Momente bei ArmA 3
Drunken Officer ist offline  
Alt 17.02.2015, 23:51   #8 (permalink)
Newbie
 
Registriert seit: 19.09.2014
Beiträge: 8
Standard

Hallo Drunken Officer,
auch an Dich ein Dankeschön für deinen Beitrag!

Leider bin ich heute abend doch nicht dazu gekommen, das auszuprobieren. Wird nachgeholt, anschließend pack ich eine Beispieldatei hier in den Thread.

An den Umstand eines Friendly - Kills hatte ich überhaupt nicht gedacht, da wir meist mit agm mod und 10min zeit bis zum ausbluten spielen. Allerdings ein sehr wichtiges Detail, eine Granate geht daneben und schon geht es rund
Wenn jedoch kein spieler der opfor angehört, tritt das genannte doch nicht auf? (Spieler sind resistance und blufor, es wird nur ai für die Opfor gesetzt + ein paar wenige Zivilisten)

Eine Frage habe ich noch:
Woher wisst ihr, wann ihr lokale variablen oder globale variablen benutzen müsst? Bei_this kann ich das noch halbwegs nachvollziehen. Jedoch nicht bei_x.
Nachtrag:
Zu dem _x hab ich gerade folgendes gefunden (http://killzonekid.com/arma-scriptin...ial-variables/).
Das n link mach ich schön, sobal ich am pc sitze
Gruß
Loooci

Geändert von Loooci (18.02.2015 um 00:23 Uhr).
Loooci ist offline  
Alt 18.02.2015, 02:27   #9 (permalink)
500 Beiträge1000 Beiträge
 
Benutzerbild von Drunken Officer
 
Registriert seit: 15.05.2011
Beiträge: 1.110
Standard

Lokal ist eine Variable, wenn sie nur in diesem Script verwendet wird. Was auch nur die halbe Wahrheit ist, wenn du z.B. in dem Script eine EH hast, kannst du nicht auf diese lokale Variable zugreifen. Diese muss dann ebenfalls Global sein.

Global ist eine Variable, wenn diese für andere Scripte mit genutzt werden soll.
Global ist nicht gleich Public auf allen Rechnern!!

PublicVariable muss via Befehl durch das Netzwerk geboxt werden.

Das _x ist einfach nur eine "magic variable" für die forEach-Schleife. Findest du auch bei dem Befehl count.

Ansonsten bei den Befehlen darauf achten was BIS-Wiki schreibt. AL/AG, EL/EG

Manche Befehle finden nur auf dem Clienten statt (z.B. addaction). Andere Befehle werden sofort über das Netzwerk verteilt (z.B. createVehicle)
Da mußt du bissel aufpassen, dass nur z.B. bei createVehicle wirklich nur der Server oder ein Client den Befelh ausführt sonst hast du mehrere Objekte (Server+Anzahl aktiver Clienten)
__________________
Bewegende Momente bei ArmA 3
Drunken Officer ist offline  
Alt 27.02.2015, 10:41   #10 (permalink)
500 Beiträge1000 Beiträge
 
Benutzerbild von Pfandgiraffe
 
Registriert seit: 16.09.2008
Ort: Berlin
Alter: 38
Beiträge: 1.737
Pfandgiraffe eine Nachricht über ICQ schicken Pfandgiraffe eine Nachricht über Skype™ schicken
Standard

MP is überflüssig, der normale EH reicht auch, kann eh nur vom Server ausgeführt werden.
Sinnloser Traffic vom feinsten.
__________________
Niemand hat die Absicht eine Tüte zu bauen!
​​​​​​​
___<<<A3 Wounding System>>>___

Geändert von Pfandgiraffe (27.02.2015 um 10:43 Uhr).
Pfandgiraffe ist offline  
Alt 27.02.2015, 16:36   #11 (permalink)
10 Jahre hx3
50 Beiträge100 Beiträge250 Beiträge
 
Benutzerbild von Saint
 
Registriert seit: 04.01.2008
Alter: 50
Beiträge: 314
Standard

Zitat von Pfandgiraffe Beitrag anzeigen

MP is überflüssig, der normale EH reicht auch, kann eh nur vom Server ausgeführt werden.
Sinnloser Traffic vom feinsten.

erkläre das doch bitte genauer.
__________________
"Um nirgends eine gähnende Leere zu lassen, wollen wir uns vorstellen, daß aller Orten und zu jeder Zeit etwas Wahrnehmbares vorhanden ist. Um nicht Materie oder Elektrizität zu sagen, will ich für dieses Etwas das Wort Substanz brauchen."

Hermann Minkowski
Saint ist offline  
Alt 27.02.2015, 16:46   #12 (permalink)
Newbie
 
Registriert seit: 19.09.2014
Beiträge: 8
Standard

Hi Zusammen,

lange ist es her..

@Pfandgiraffe
Wenn das in der Form überflüssig ist erklär bitte wie Du es umsetzen würdest. So hätte jeder was davon. Bei einem normalen EH wird das doch nicht an alle clients weiterverteilt ?

In Verbindung mit dem AGM Mod funktioniert es übrigens nicht mit dem MPKilled Eventhandler! Habe dafür den MPHit verwendet.

Eintrag in die init.sqf
Code:
//Eventhandler CSAT
{
    if (side _x == opfor) then 
	{
        _x addMPEventHandler ["MPHit",
		{
		if ( side (_this select 1) == resistance) then 
			{
				opfor setFriend [resistance, 0]; 
				resistance setFriend [opfor, 0];
			};
		}]
    };
} forEach allUnits;
Alternativ dazu hat mir ein netter Mitspieler mal gezeigt wie man selbst Funktionen erstellt, diese ist etwas allgemeiner gefasst:
Code:
//function 
fnc_becomeEnemy = {
    private["_faction1","_faction2","_killer", "_killed"];
    _faction1 = _this select 0;
    _faction2 = _this select 1;
    _killer = _this select 2;
	_killed = _this select 3;
    if (side (_killer) == _faction1) then 
    {
        _faction2 setFriend [_faction1, 0];
        _faction1 setFriend [_faction2, 0];
			
		hint format["%1 wurde von %2 angegriffen", _killed, _killer];	
		/* 
		Oder auch:
		hint format["%1 wurde von %2 erschossen", _this select 3, _this select 2];
		*/
    };
};
{
    if (side _x == opfor) then 
    {
        _x addMPEventHandler ["MPHit", {[resistance, opfor, _this select 1, _this select 0 ] call fnc_becomeEnemy;}];
     };
    if (side _x == blufor) then 
    {
        _x addMPEventHandler ["MPHit", {[resistance, blufor, _this select 1] call fnc_becomeEnemy;}];
    };
} forEach allUnits;

Geändert von Loooci (27.02.2015 um 17:27 Uhr).
Loooci ist offline  
Alt 27.02.2015, 18:56   #13 (permalink)
500 Beiträge1000 Beiträge
 
Benutzerbild von Pfandgiraffe
 
Registriert seit: 16.09.2008
Ort: Berlin
Alter: 38
Beiträge: 1.737
Pfandgiraffe eine Nachricht über ICQ schicken Pfandgiraffe eine Nachricht über Skype™ schicken
Standard

Zitat von Loooci Beitrag anzeigen

@Pfandgiraffe
Wenn das in der Form überflüssig ist erklär bitte wie Du es umsetzen würdest. So hätte jeder was davon. Bei einem normalen EH wird das doch nicht an alle clients weiterverteilt ?
[/code]

Weil es die Clients nicht zu interessieren hat. Führe den Befehl doch mal von einem Client aus in der Serverumgebung aus. Da wird sich rein garnichts verändern.

Entferne einfach das MP an jedem EH und sorge dafür, dass nur der Server den Code ausführt.
Code:
if (isServer) then {...

Grüße
__________________
Niemand hat die Absicht eine Tüte zu bauen!
​​​​​​​
___<<<A3 Wounding System>>>___
Pfandgiraffe ist offline  
Alt 27.02.2015, 19:16   #14 (permalink)
500 Beiträge1000 Beiträge
 
Benutzerbild von Drunken Officer
 
Registriert seit: 15.05.2011
Beiträge: 1.110
Standard

Zitat von Saint Beitrag anzeigen

erkläre das doch bitte genauer.

ganz einfach.

KI ist Server-Side. Warum übers Netzwerk schiessen. Nur der Server muss doch wissen, wer feindlich ist. Der Spieler entscheidet über sein Ziel.
__________________
Bewegende Momente bei ArmA 3
Drunken Officer ist offline  
 


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Eventhandler im MP JoeJoe87577 Editing & Scripting 18 12.03.2013 09:08
Problem mit Eventhandler Moerderhoschi Editing & Scripting 3 04.11.2010 18:46


Kontakt - HX3.de - Archiv - Nach oben

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias



SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119