PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bräuchte Ratschlag zum crashsite Script.


Matze_76
01.05.2016, 13:51
Vorab, sorry dass ich es in den falschen Bereich gepostet habe, das sollte eigentlich in den Arma3 Bereich.
Wenn möglich bitte verschieben.

Hallo,
ich wollte für ein Altis Life Server ein Crashsite Script schreiben welches ein Heliwrack, Loot und Marker spawnt.
Nach einiger Zeit geschieht das gleiche noch einmal nur an anderer Stelle mit einem anderen Wrack.
Lokal und im MP funktioniert das Script einwandfrei, auf dem Server allerdings geschieht das heillose durcheinander.

Die Spieler bekommen unterschiedliche Hint Nachrichten, es spawnt statt einem Wrack mehrere, die Marker werden gelöscht und spawnen kurz darauf wo anders erneut usw.

Könntet ihr mir sagen was genau ich falsch gemacht habe und wie ich es Server tauglich bekomme?
Danke vorab für alle helfenden antworten.

Grüße Matze

Nokman
01.05.2016, 22:25
Frage 1: hast du es selber Geschrieben?
Wenn ja dann Gratualationzum Script ist nicht perfekt aber lauffähig, wenn Nein , Nimm wo anders eins her :D

Zum Problem Was du vor hast st earten. o wie s geschrieben it darf es NUR der Server Starten und das 1x
Da du sagst Es kommen mehere Wracks und so weiter Starte es jeder Klient selber. Das Problem ist das der HINT nicht geht sondern Übertragen werden muss. Schaue dir dazu einfach mal die Broadcast datei als Funkton an die in Altis Life ist. Damit kanst du Hint an Alle oder Bestimmte schicken.

Matze_76
01.05.2016, 23:26
Ja, das ist das erste Script das ich von 0 auf selbst geschrieben habe, für mehr hat aber mein Wissen dazu nicht genügt :lol:

Ich starte das Script über die Init.sqf, würde es ausreichen es wie folgt zu starten?:

if (isServer) then
{
execVM "crashsite.sqf";
};

Schaue dir dazu einfach mal die Broadcast datei als Funkton an die in Altis Life ist.
Danke für den Tipp, das werde ich mir morgen einmal zu Gemüte führen.

Pfandgiraffe
02.05.2016, 08:48
Hallo,

habe dir das Script mal so angepasst, dass es bzgl. der Lokalitäten im MP korrekt ausgeführt wird. Auch die langen Sleep's sind im MP nicht vorteilhaft da die Zeit auf jeder Maschine unterschiedlich schnell vergeht. Daher "warten" die Clients jetzt darauf bis der Server seine Arbeit geleistet hat.

Grundsätzlicher Ablauf:
- alle (Server+Clients) starten das Script
- Server "schläft" und generiert das Wrack+Ausrüstung
- Server sendet publicVariable an Clients und Clients erhalten die Textnachricht

Der Ablauf ist so alles andere als optimiert aber das spielt hier keine Rolle. Zum Verständnis für dich sollte das aber so der beste Weg sein, da die einfachste Lösung.
Den Ablauf für das 2. Wrack musst du alleine implementieren. ;)


// execute from server machine
if (isServer) then {
[] spawn {
// define public variables
crashSiteOneGenerated = false;
publicVariable "crashSiteOneGenerated";
crashSiteOneDeleted = false;
publicVariable "crashSiteOneDeleted";

Sleep 1200+(random 10800);
_spawnpos = [getmarkerpos "crashsitemarker", 100+(random 4000), (random 359)] call BIS_fnc_relPos;
crashsiteheli = "Land_Wreck_Heli_Attack_01_F" createVehicle _spawnpos;
crashsiteheli setPos [getPos crashsiteheli select 0, getPos crashsiteheli select 1,-0.1];

TheObject = "test_EmptyObjectForFireBig" createVehicle position crashsiteheli;
TheObject attachTo[crashsiteheli,[0,1.5,-1]];

gun2 = ["srifle_DMR_04_F","srifle_DMR_01_F","LMG_Mk200_F","arifle_Katiba_GL_F","arifle_MX_GL_F","srifle_DMR_04_F","srifle_GM6_camo_F"] call BIS_fnc_selectRandom;
Waffe1 = createVehicle ["groundweaponHolder",getmarkerpos "crashsiteMark",[], 0, "can_collide"];
Waffe1 addWeaponCargo [gun2,1];
Waffe1 setpos [(getpos Waffe1 select 0)+(random 1)-10,(getpos Waffe1 select 1)+(random 3)-14,0];
munition = ["10Rnd_762x54_Mag","200Rnd_65x39_cased_Box","30Rnd_65x39_caseless_mag","10Rnd_127x54_Mag","5Rnd_127x108_Mag"] call BIS_fnc_selectRandom;
Waffe1 = createVehicle ["groundweaponHolder",getmarkerpos "crashsiteMark",[], 0, "can_collide"];
Waffe1 addmagazinecargo [munition,2];
Waffe1 setpos [(getpos Waffe1 select 0)+(random 1)-10,(getpos Waffe1 select 1)+(random 3)-10,0];
munition2 = ["UGL_FlareRed_F","UGL_FlareGreen_F","UGL_FlareWhite_F","10Rnd_127x54_Mag","5Rnd_127x108_Mag"] call BIS_fnc_selectRandom;
Waffe1 = createVehicle ["groundweaponHolder",getmarkerpos "crashsiteMark",[], 0, "can_collide"];
Waffe1 addmagazinecargo [munition2,3];
Waffe1 setpos [(getpos Waffe1 select 0)+(random 2)-6,(getpos Waffe1 select 1)+(random 3)-6,0];
itemw = ["acc_pointer_IR","acc_flashlight","muzzle_snds_M","muzzle_snds_B","muzzle_snds_H_MG","Rangefinder"] call BIS_fnc_selectRandom;
Waffe1 = createVehicle ["groundweaponHolder",getmarkerpos "crashsiteMark",[], 0, "can_collide"];
Waffe1 additemcargo [itemw,1];
Waffe1 setpos [(getpos Waffe1 select 0)+(random 1)-8,(getpos Waffe1 select 1)+(random 3)-8,0];
itemw2 = ["optic_Arco","optic_Hamr","optic_SOS","optic_DMS","optic_LRPS","optic_AMS_khk","optic_KHS_tan"] call BIS_fnc_selectRandom;
Waffe1 = createVehicle ["groundweaponHolder",getmarkerpos "crashsiteMark",[], 0, "can_collide"];
Waffe1 additemcargo [itemw2,1];
Waffe1 setpos [(getpos Waffe1 select 0)+(random 1)-7,(getpos Waffe1 select 1)+(random 3)-7,0];

crashSiteOneGenerated = true;
publicVariable "crashSiteOneGenerated"; // signal for clients, Wrack generated

Sleep 295;
null = createMarker ["crashsite", crashsiteheli];
null setMarkerShape "RECTANGLE";
null setMarkerSize [800,800];
"Crashsite" setMarkerColor "ColorRed";
null = createMarker ["crashsiteMark", crashsiteheli];
"CrashsiteMark" setMarkerType "mil_warning";
"CrashsiteMark" setMarkerText "Absturzstelle PVP Zone";

Sleep 1800;

deleteVehicle crashsiteheli;
deleteMarker "crashsite";
deleteMarker "crashsiteMark";
{if (typeOf _x == "#particlesource") then {deleteVehicle _x}} forEach (TheObject nearObjects 5);
deleteVehicle TheObject;

crashSiteOneDeleted = true;
publicVariable "crashSiteOneDeleted"; // signal for clients, Wrack deleted
};
};

// execute from client machines
if (local player) then {
sleep 5;
if (crashSiteOneDeleted) exitWith {}; // exit for JIP's if task already completed
waitUntil {crashSiteOneGenerated};
hint"Ein Militärhelikopter sendete einen Notruf";
Sleep 300;
hint "Die Absturzstelle wurde markiert";
waitUntil {crashSiteOneDeleted};
hint "Das Helikopterwrack wurde geborgen";
};


Grüße

Matze_76
02.05.2016, 13:42
Wow, danke für die großartige Hilfe!
Ich versteh das Script soweit aber alleine wäre ich da glaube ich nicht drauf gekommen. Ich musste es noch etwas anpassen da der Loot nicht am Wrack sondern am Marker spawnt aber es klappt so wirklich sehr gut.

Was ich noch nicht ganz verstanden habe ist das [] spawn {...}. Was genau bewirkt das?

Matze_76
02.05.2016, 22:48
Ich habe das Script im Mp getestet und soweit eingestellt, jetzt habe ich aber ein weiteres Problem das ich nicht ganz nachvollziehen kann.

Die Items spawnen im MP direkt auf dem Boden, auf dem Server aber liegen sie im Boden drin.
Ich habe die Höhe angepasst und die Items 0.2 bis hin zu 2 Meter hoch gesetzt.
Waffe1 setpos [(getpos Waffe1 select 0)+(random 1)-12,(getpos Waffe1 select 1)+(random 3)-17,1];
Im MP werden die Items alle richtig gesetzt aber auf dem Server direkt passiert nichts.
Könnt ihr mir bei dem Problem weiter helfen, denn wie schon gesagt.. ich kann es wirklich nicht nachvollziehen.

Pfandgiraffe
03.05.2016, 08:13
Das mit dem spawn {...} ist nur nötig falls du das Script als Host ausführst. Also wenn du zeitgleich Server als auch Client bist. Das Spawn erzeugt einen neuen Thread. Dieser wird dann abgearbeitet wie ein eigenes Script wobei das eigentliche Script weiter abgearbeitet wird.

Du könntest die beiden Teile des Scripts auch in einzelne Dateien schreiben und ausführen. Dann entfällt das Spawn.


Zu der Positionierung: keine Ahnung warum das so is aber versuchs mal mit setPosATL (https://community.bistudio.com/wiki/setPosATL) statt setPos. (ATL = above terrain level)

Auch nützlich zum Verständnis: https://community.bistudio.com/wiki/Position#PositionATL


Grüße

Matze_76
03.05.2016, 23:12
Die Seite hat mir weiter geholfen, leider nur nicht bei dem Script. Ich habe jetzt die Heli durch eine Kiste ersetzt und lass den Loot darin Spawnen.

if (isServer) then {
[] spawn {
crashSiteOneGenerated = false;
publicVariable "crashSiteOneGenerated";
crashSiteOneDeleted = false;
publicVariable "crashSiteOneDeleted";

Sleep 2700+(random 7200); // <----------------- Zeit bis der Spawn beginnt
_spawnpos = [getmarkerpos "crashsitemarker", 10+(random 4000), (random 359)] call BIS_fnc_relPos;
crashsiteheli = "CargoNet_01_box_F" createVehicle _spawnpos;
crashsiteheli setPos [getPos crashsiteheli select 0, getPos crashsiteheli select 1,-0.1];

crashSiteOneGenerated = true;
publicVariable "crashSiteOneGenerated";

Sleep 360; // <----------------- Zusätzliche Zeit bis die Marker und der Loot erstellt werden
null = createMarker ["crashsite", crashsiteheli];
null setMarkerShape "RECTANGLE";
null setMarkerSize [800,800];
"Crashsite" setMarkerColor "ColorRed";
null = createMarker ["crashsiteMark", crashsiteheli];
"CrashsiteMark" setMarkerType "mil_warning";
"CrashsiteMark" setMarkerText "Frachtkiste PVP Zone";
_smoke="SmokeShellGreen" createVehicle getMarkerPos "CrashsiteMark";
_smoke setPos [getPos _smoke select 0,getPos _smoke select 1,240];

// Loottable Anfang
_gun = ["srifle_DMR_04_F","srifle_DMR_01_F","LMG_Mk200_F","arifle_Katiba_GL_F","arifle_MX_GL_F","srifle_DMR_04_F","srifle_GM6_camo_F"] call BIS_fnc_selectRandom;
crashsiteheli addItemCargoGlobal [_gun,1];
_munition = ["10Rnd_762x54_Mag","200Rnd_65x39_cased_Box","30Rnd_65x39_caseless_mag","10Rnd_127x54_Mag","5Rnd_127x108_Mag"] call BIS_fnc_selectRandom;
crashsiteheli addItemCargoGlobal [_munition,2];
_munition2 = ["UGL_FlareRed_F","UGL_FlareGreen_F","UGL_FlareWhite_F","10Rnd_127x54_Mag","5Rnd_127x108_Mag"] call BIS_fnc_selectRandom;
crashsiteheli addItemCargoGlobal [_munition2,3];
_itemw = ["acc_pointer_IR","acc_flashlight","muzzle_snds_M","muzzle_snds_B","muzzle_snds_H_MG","Rangefinder"] call BIS_fnc_selectRandom;
crashsiteheli addItemCargoGlobal [_itemw,1];
_itemw2 = ["optic_Arco","optic_Hamr","optic_SOS","optic_DMS","optic_LRPS","optic_AMS_khk","optic_KHS_tan"] call BIS_fnc_selectRandom;
crashsiteheli addItemCargoGlobal [_itemw2,1];
_itemw3 = ["V_PlateCarrierIA2_dgtl","V_PlateCarrierIA1_dgtl","V_TacVestCamo_khk","V_TacVest_khk","V_PlateCarrier1_rgr","H_HelmetB_light_grass","H_HelmetB_grass"] call BIS_fnc_selectRandom;
crashsiteheli addItemCargoGlobal [_itemw3,1];
// Loottable Ende

Sleep 2700; // <----------------- Zeit Bevor Kiste und Marker gelöscht werden
deleteVehicle crashsiteheli;
deleteMarker "crashsite";
deleteMarker "crashsiteMark";

crashSiteOneDeleted = true;
publicVariable "crashSiteOneDeleted";
};
};

if (local player) then {
sleep 5;
if (crashSiteOneDeleted) exitWith {};
waitUntil {crashSiteOneGenerated};
hint"Ein Militärhelikopter sendete einen Notruf";
Sleep 361; // <-----------------Diese Zeit sollte die selbe sein wie die in Zeile 15
hint "Eine Frachtkiste wurde abgeworfen!";
waitUntil {crashSiteOneDeleted};
hint "Die Frachtkiste wurde geborgen";
};

Hat auf anhieb geklappt :-)
Ich Danke aber noch einmal recht Herzlich für die Hilfe!

Grüße Matze