PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fahrzeugrespawn nach Fahrzeugbenutzung


Langer
22.03.2010, 11:36
Moin,

ich hab ein Problem mit meinem Fahrzeug-Respawn,

es funktioniert nur solange wie ich nicht in ein Fahrzeug eingestiegen bin..:stupid:

hier die scripte..

init.sqf

arrays = [] execVM "BierAIG\arrays.sqf";
eigFahrzeuge = [] execVM "BierAIG\fahrzeugRespawn\fahrzeuge_init.sqf";arrays.sqf

respawnClasses = ["Truck5tRepair","Truck5tReammo","Truck5tRefuel"];
respawnClasses = respawnClasses + ["HMMWV","HMMWV50","HMMWVTOW","HMMWVMK"];
respawnClasses = respawnClasses + ["UH60MG"];fahrzeuge_init.sqf

if (!isServer) exitWith{};
sleep 2.0;
temp_list2 = vehicles;
_types = [];
{
if (!(_x in respawnClasses)) then
{
temp_list2 = temp_list2 - [_x];
};
_pos = position _x;
_startpos = position _x;
_startdir = getdir _x;
_name = typeOf _x;
_x addEventHandler ["killed",{handle = [(_this select 0),(_this select 1),_startpos,_startdir] execVM "BierAIG\fahrzeugRespawn\eigFahrzeugKill.sqf"}];
switch (_name) do
{
case "Truck5tReammo":
{
_x setAmmoCargo 0;
};
case "Truck5tRefuel":
{
_x setFuelCargo 0;
};
case "Truck5tRepair":
{
_x setRepairCargo 0;
};
}; //switch-close
} foreach temp_list2;eigFahrzeugKill.sqf

if (!isServer) exitWith{};
_toter = _this select 0;
_killer = _this select 1;
_startpos = _this select 2;
_startdir = _this select 3;
_todespos = position _toter;

_toter removealleventhandlers "killed";
sleep 5; //Explosion und rauch abwarten

_typetoter = typeof _toter;
_dirToter = getdir _toter;
deleteVehicle _toter;
sleep 0.5;
_neu = _typetoter createVehicle _todespos;
_neu setpos _todespos;
_neu setDir _dirToter;
_neu addEventHandler ["killed",{handle = [(_this select 0),(_this select 1),_startpos,_startdir] execVM "BierAIG\fahrzeugRespawn\eigFahrzeugKill.sqf"}];
switch (_typetoter) do
{
case "Truck5tReammo":
{
_x setAmmoCargo 0;
};
case "Truck5tRefuel":
{
_x setFuelCargo 0;
};
case "Truck5tRepair":
{
_x setRepairCargo 0;
};
};
der respawn funktioniert, aber nur solang wie ich dieses Fahrzeug nicht benutzt hab. (einsteigen -> aussteigen + in Luft jagen = nix, wird auch nicht gelöscht)

für nen Fingerzeig warum , wieso , weshalb wäre ich dankbar

die .rpt geben nix an Fehlern raus..

Mfg
Langer

P.S. ich teste aufn Dedi server

Langer
20.05.2010, 11:44
keiner mehr da?:naughty:

also das Problem liegt anscheinend daran das per script erstellte Fahrzeuge
Local aufm Server sind , sobald nen Client einsteigt wird des Fahrzeug local auf selbigen, nur wird der Eventhandler nicht "übernommen"...

ne Möglichkeit dies zu umgehen wäre es per getin-Eventhandler ,auf dem Client einen zusätzlichen killed-EH "anzubringen", nur sollte darauf geachtet
werden diese uU. meheren EH's mit

_unit removeAllEventhandlers "killed";

zu entfernen

Mfg
Langer

P.S. falls ich daneben liegen sollte , und hier noch jemand liest,
berichtigt mich bitte:zahn:

P.P.S. die suche funzt nicht mehr

Tajin
27.05.2010, 12:35
Das einfachste aus meiner Sicht wäre, das init-script global auszuführen (so das jeder den eventhandler hat) und dann erst bei Auslösen des Events die Lokalität des Fahrzeugs zu überprüfen anstelle von (!isServer).

Das sollte eigl. vollkommen ausreichen.


Mit dem GetIn würde es nur unnötig komplex und fehleranfällig. Das Einzige was zählt, ist auf welchem Rechner das Fahrzeug lokal ist. Wenn z.B. jemand einsteigt und dann vom Server geht, dann wird mit Sicherheit kein GetOut ausgelöst. Das Fahrzeug wäre dann wieder beim Server lokal und dein Script wüsste nichts davon. Dumm gelaufen ^^

.kju
27.05.2010, 14:19
if (!(_x in respawnClasses)) then
{
temp_list2 = temp_list2 - [_x];
};


Für was ist den das?

Zudem n Array zu modifizieren über welches du gerade iterierst könnte n Problem sein.

Es müsste so heißen:
} forEach vehicle;

Langer
27.05.2010, 15:43
erstmal danke für die antworten :daumen:


@.kju
temp_list2 = temp_list2 - [_x];
löscht Fahrzeuge ausm Array welche nicht respawnen sollen, oder was meinst?

mmh ich dachte bisher das der codeblock innerhalb von den Klammern,
{codeblock;} foreach arraywert;
ausgeführt wird, der arraywert nur vor der "erledigung" eingelesen wird und während der Laufzeit unangetastet bleibt ..:komisch:

hast aber recht, so: {}foreach vehicles; , is besser..:)

@Tajin
irgendwie "hängt" sich mein gedankengang dabei auf...

ich müsste also ,theoretisch, nur das eigentliche spawnen (und löschen) der Fahrzeuge in
if (isServer) then {respawn,löschen};
packen, danach auf allen Clients und dem Server EHs "verteilen".. ??

nur schlägt ja der Server-EH nicht an weils Fahrzeug auf nem Client lokal wird, nachm einsteigen.. heisst Server führt das script net aus.. oder??:omg:

ich kann des leider erst heut abend testen... daher theorie :zahn:

ich geb Meldung wenn ichs "raushab"...
Notfals hau ich dem Server das mit addPublicVariable-EH und publicVariable um die Ohren :schlagen:

Mfg
Langer

Langer
29.05.2010, 11:42
so habs nun so umgebaut das es funzt :)

hier die scripte:

init.sqf
if (isServer) then
{
{
_serverEH = [_x] execVM "BierAIG\eh_killed_dazu.sqf";
NachrichtVomClient = "";
"NachrichtVomClient" addPublicVariableEventHandler
{
_nachricht = [_this] execVM "BierAIG\nachrichtvomclient.sqf";
};//end addPublicVari-EH
} foreach vehicles;
};//end if-then

if (!(isServer)) then
{
Debug = False;
{
_clientEH = [_x] execVM "BierAIG\eh_killed_dazu.sqf";
NachrichtvomServer = "";
"NachrichtvomServer" addPublicVariableEventHandler
{
_nachricht = [_this] execVM "BierAIG\nachrichtvomserver.sqf";
};//end addPublicVari-EH
} foreach vehicles;
};//end if-then

BierAIG\eh_killed_dazu.sqf
_fahrzeug = _this select 0;
_fahrzeug addEventHandler ["killed", {_wert = [_this] execVM "BierAIG\vehicle_killed.sqf";}];

BierAIG\nachrichtvomclient.sqf
_wert = _this select 0;
_array = _wert select 1;
_toter = _array select 0;
_killer = _array select 1;

_neuspawn = [_toter,_killer] execVM "BierAIG\fahrzeugneuspawn.sqf";

BierAIG\nachrichtvomserver.sqf
_wert = _this select 0;
_array = _wert select 1;
_toter = _array select 0;
_killer = _array select 1;
_neuesFahrzeug = _array select 2;

if (!(isNull _neuesFahrzeug)) then
{
_clientEH = [_neuesFahrzeug] execVM "BierAIG\eh_killed_dazu.sqf";
}else{
if (Debug) then
{
hint format ["_wert = %1\n----_array = %2\n----\n_toter = %3\n----\n_killer = %4\n----\n_neuesFahrzeug = %5",_wert,_array,_toter,_killer,_neuesFahrzeug];
[West,"HQ"] sideChat format["Server:_toter = %1 --- _killer = %2",(typeof _toter),(name _killer)];
};//end if-then
};//end if-then-else

BierAIG\vehicle_killed.sqf
_wert = _this select 0;
_toter = _wert select 0;
_killer = _wert select 1;

if (!(isServer)) then
{
if (Debug) then
{
[West,"HQ"] sideChat format["Client:_toter = %1 --- _killer = %2",(typeof _toter),(name _killer)];
};//end if-then
NachrichtVomClient = [_toter,_killer];
publicVariable "NachrichtVomClient";
};//end if-then

if (isServer) then
{
_fahrzeugneuspawn = [_toter,_killer] execVM "BierAIG\fahrzeugneuspawn.sqf";
NachrichtVomServer = [_toter,_killer,objNull];
publicVariable "NachrichtVomServer";
};//end if-then

BierAIG\fahrzeugneuspawn.sqf
_toter = _this select 0;
_killer = _this select 1;

sleep 5.0;//rauch und explosionen abwarten

_typetoter = typeof _toter;
_position = position _toter;
_richtung = getdir _toter;

_toter removealleventhandlers "killed";
deleteVehicle _toter;
_neuesFahrzeug = _typetoter createVehicle _position;
_neuesFahrzeug setpos _position;
_neuesFahrzeug setDir _richtung;
_serverEH = [_neuesFahrzeug] execVM "BierAIG\eh_killed_dazu.sqf";

NachrichtVomServer = [_toter,_killer,_neuesFahrzeug];
publicVariable "NachrichtVomServer";

ein hoch auf den publicVariable-EH
ein buuuuuh auf EH's die nur lokal laufen :p(beste wäre wählbar ob lokal/global wie bei Variablen)

vielen Dank für eure Hilfe:daumen:

Mfg
Langer

P.S. im anhang eine Test.pbo zum anguggn auf nem dedi-server

.kju
29.05.2010, 12:09
NachrichtvomServer = "";
"NachrichtvomServer" addPublicVariableEventHandler
{
_nachricht = [_this] execVM "BierAIG\nachrichtvomserver.sqf";
};//end addPublicVari-EH


Statt im Loop musst du es nur 1x definieren. Insofern:

"NachrichtVomClient" addPublicVariableEventHandler
{
if (isServer) then
{
_nachricht = [_this] execVM "BierAIG\nachrichtVomClient.sqf";
}
else
{
_nachricht = [_this] execVM "BierAIG\nachrichtVomServer.sqf";
};
};

{
_nil = _x addEventHandler ["killed",{_nil = [_this] execVM "BierAIG\vehicle_killed.sqf";}];
} forEach vehicles;

.kju
29.05.2010, 12:14
Zum Vergleich / für Ideen das VehicleRespawn.sqf von AAS:
pastebin - collaborative debugging tool (http://pastebin.jonasscholz.de/793)