HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   addMPEventHandler nur beim Auslöser auslösen (https://hx3.de/editing-scripting-167/addmpeventhandler-nur-beim-ausloeser-ausloesen-22259/)

Clawhammer 25.02.2013 06:58

addMPEventHandler nur beim Auslöser auslösen
 
Moin zusammen,

hab folgendes Problem, ich möchte gerne in einer Mehrspieler Mission wenn eine Zielperson ausgeschaltet wurde extrapunkte vergeben. Hab mir gedacht ich mache das so:

In die Unit der Zielperson:

Code:

_index = VIP01 addMPEventHandler [""mpkilled"", {Null = _this execVM ""Scripts\VIP\VIP.sqf"";}];
VIP.sqf:

Zitat:

Hint "Test";

Killer = _this select 1;

if (isServer) then {
Killer addScore 100; // for hosted environment
} else {
paddscore = [Killer, 100]; publicVariable "paddscore";
};
blöderweise wird dieses Script allerdings öfter ausgeführt den es gibt
mehr als 100 Punkte. Ich glaube es liegt an der Spielerzahl.

Wie kann ich das unterbinden?

danke!

Vienna 25.02.2013 08:40

Ich gehe davon aus, dass der MPEventhandler auf allen PCs das Skript startet. Wenn im Skript die Variable paddscore mit publicVariable "paddscore"; von jedem Client übers Netz gesendet wird, ist das vermutlich die Ursache der mehrfachen Punktewertung.

Clawhammer 25.02.2013 08:41

Davon gehe ich auch aus, aber wie bekomme ich das besser hin?
thx4help!

Vienna 25.02.2013 09:42

Lass einmal den Befehl publicVariable "paddscore"; weg und schau wie sich das im MP Spiel auswirkt. Die Variable paddscore muss ja irgend einen Zweck erfüllen, der aus deiner Information nicht nicht ersichtlich ist.

Clawhammer 25.02.2013 09:45

Oh ich hatte vergessen das da noch was in der init steht. Das Problem mit addscore im mp ist das dieser Befehl nicht mehr so einfach funktionert.

Hier steht dazu bissl mehr:

Scoring on a dedicated server

Ich trage heut abend nochmal nach was in der Inti bei mir steht, gerade @work.

Xeno 25.02.2013 10:25

*deleted*

Xeno

Clawhammer 25.02.2013 10:35

Im Prinzip ist es mir total egal WIE die Score auf das Punktekonto kommt. Hauptsache es ist simpel zu verstehen und funktioniert vernünftig. Werds heute abend mal testen, Danke euch!

Clawhammer 25.02.2013 19:56

Ok, jetzt verteilt er nicht mehr pro Spieler extra Punkte, allerdings gibt es immernoch 200 statt 100 Punkten.

Hier mal alles was ich habe:

init.sqf:

Code:


// JIP fix
if ((!isServer) && (player != player)) then
{
  waitUntil {player == player};
};

if (isServer) then {
    "paddscore" addPublicVariableEventHandler {
        ((_this select 1) select 0) addScore ((_this select 1) select 1);
    };
};

Init der Unit VIP01:

Code:

_index = VIP01 addMPEventHandler ["mpkilled", {Null = _this execVM "Scripts\VIP\VIP.sqf";}];removeallweapons this;
VIP.sqf:

Code:

Hint "Test";

if (isServer) then {
    _killer = _this select 1;
    if (isPlayer _killer) then {
        _killer addScore 100;
    };
};

Wo versteckt sich der 200 Fehlerteufel Oo

Danke!

Pfandgiraffe 25.02.2013 21:34

Hast du Xeno's Post überhaupt gelesen?

Da stand soviel wie: lösch den ganzen Mist, nehme dir einen normalen EVH killed und kopiere den Code hinein. :faust:

Vienna 26.02.2013 10:44

Vielleicht zum besseren Verständnis für Clawhammer.

Für Punkte von Spielern gibt es im Arma-System eigene Variable welche mit score unitName ausgelesen und mit unitName addScore xx abgeändert werden können. Jede Abänderung beim Server/Host ist automatisch auf allen beteiligten PCs wirksam. Die Variable steht zu Spielbeginn auf 0 und man verwendete sie für ein eigenes Punktesystem.

Edit: Hinweis! Arma2 führt den Befehl addScore nur auf dem Server/Host PC aus (ab Version 1.2).

Es gibt weitere solche Variable, in die aber das "System" automatisch Plus- oder Minuspunkte vergibt. Auszulesen mit: rating unitName. Dieser Wert kann mit addRating wie oben abgeändert werden. Bei einem zu hohen Minus-Punktestand wird ein Spieler für alle Seiten zum "Feind".

Was dieser "JIP fix" in der init.sqf bewirken soll kapiere ich nicht.

Für die Verwaltung von Gesamtpunkten einer Seite/Gruppe sollte diese der "Server" mit eigenen Variablen immer auf dem aktuellen Stand halten, dann müsste das auch stimmen wenn Spieler das Spiel verlassen bzw. neue Spieler hinzukommen.

Xeno 26.02.2013 10:59

*deleted*

Xeno

Vienna 26.02.2013 12:32

Wie ich gerade sehe, habe ich in der Wiki bei dem Befehl das "Kleingedruckte" überlesen. http://community.bistudio.com/wiki/addScore

Clawhammer 27.02.2013 14:45

ah ok ich dachte ich dürfte wählen :D
Jetzt klappt alles 1A danke euch! :daumen:

Clawhammer 01.03.2013 16:59

Ach mist, sry das ich nochmals störe.
Das ganze hat immernoch einen Bug.

Wenn in der KI kein Spieler ist funktioniert das ganze, sobald aber jemand in die KI steigt aktiviert sich der Handler nicht.

Hilfe :(

Danke!

Hier nochmals der Code:

Player Init:
Code:

_EHkilledIdx = Player01 addEventHandler ["killed", {_this exec "Scripts\OtherPlayer\OtherPlayer.sqf"}];
OtherPlayer.sqf:
Code:

if (isServer) then {
    _killer = _this select 1;
    if (isPlayer _killer) then {
        _killer addScore 1001;
    };
};


TeRp 01.03.2013 18:05

MPKilled ...... :rolleyes:

Vienna 02.03.2013 01:34

Liegt vermutlich am Skript. Wenn der Spieler nicht der Host ist, dann wird das nicht funktionieren, weil der Code mit if(isServer)then beginnt.

MPKilled löst das Problem, weil das Skript dann auch beim Server läuft.

Auch funkt ja addScore nicht bei einem Client, da könnte man eigentlich diese Abfrage entfernen und sie dafür in den EventHandler einfügen, damit das Skript nur bei Server gestartet wird oder den Code vom Skript gleich in den Eventhandler schreiben.

Clawhammer 02.03.2013 08:28

mit mpkilled funktioniert es weder für die KI noch für einen echten Spieler.

@vienna hab das mal versucht was du sagtest:

Code:

_EHkilledIdx = Player08 addEventHandler ["mpkilled", {_killer = _this select 1;if (isPlayer _killer) then {_killer addScore 1001;};}];
Ich glaube so meintest du das richtig? Das will auch nicht grrrrr

Vienna 02.03.2013 09:34

Es wird auch der EventHandler ein MP sein müssen:
Code:

_EHkilledIdx = Player08 addMPEventHandler
 [
  "MPkilled",
  {if (isPlayer _this select 1) then {_this select 1 addScore 100}}
 ];


Clawhammer 02.03.2013 09:59

Intressiert Ihn leider kein Stück :-/ Werden weiterhin keine Punkte gezählt :-(

UPDATE: So geht es schon aber ich bekomme 1997 Punkte statt 999 (+1 Kill regulär):

Code:

_EHkilledIdx = Player05 addMPEventHandler  ["mpkilled", {_killer = _this select 1;if (isPlayer _killer) then {_killer addScore 999;};}];
Tippe das der Client UND der Server das Script aufrufen und es deswegen 2x gestartet wird?

Vienna 02.03.2013 11:32

Vielleicht wird der EventHandler doppelt aktiviert?

Versuche einmal bei meinem Vorschlag die beiden _this select 1 in normale Klammern zu setzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr.

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