PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bräuchte Hilfe bei Spawnscript


Duke_87
22.01.2016, 16:56
Hallo,

zur Zeit arbeite ich mit der Ryans Zombies and Demons Mod und wollte mir ein einfaches Script schreiben das einige KI Einheiten um den Spieler herum spawnen lässt wenn er einen Trigger auslöst.
Die Mod liefert zwar ein Spawner Modul mit aber das funktioniert leider nur einmal.

Momentan arbeite ich nur mit einem Auslöser und einem Marker. Im Auslöser habe ich folgendes eingetragen:
_Group = [getMarkerPos "spawn1", EAST, ["RyanZombieC_man_polo_4_Fslow","RyanZombieC_man_polo_4_Fslow","RyanZombieC_man_polo_4_Fslow","RyanZombieC_man_1slow","RyanZombieC_Orestesmedium","RyanZombieC_man_w_worker_Fslow"],[],[],[],[],[],180] call BIS_fnc_spawnGroup;

Das ganze funktioniert soweit recht gut doch wie verpacke ich das ganze nun in ein Script sodass die KI z.B.: nach dem aktivieren in einem Radius von 100 Meter um den Spieler herum spawnt?
Ich habe zwar schon einiges versucht aber ich bekomme es absolut nicht hin :(

Grüße Duke

Duke_87
22.01.2016, 22:09
Ich habe nun ein Script mit dem Name zspawn.sqf in dem ich folgendes stehen habe:
GroupOne_X = [getPosATL player, EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowFleeing 0} forEach units GroupOne_X;

Die AI spawnt jetzt endlich und auch direkt am Spieler, jetzt muss ich nur noch hin bekommen dass sie random in einem bestimmten Radius um den Spieler spawnt.

Hat hierzu jemand einen Tipp für mich?

Moerderhoschi
23.01.2016, 09:41
GroupOne_X = [getPosATL player, EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowFleeing 0; _x setPos [ ((((getPos _x) select 0) + random 20) - random 20), ((((getPos _x) select 1) + random 20) - random 20) ]} forEach units GroupOne_X;



gruß
hoschi

Drunken Officer
23.01.2016, 10:54
mit BIS eigener Funktion:

_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
GroupOne_X = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units GroupOne_X;

Duke_87
23.01.2016, 15:49
Danke für eure Mühe! Beide Versionen funktionieren echt super :daumen:
Ich habe noch auf eigene Faust versucht eine zweite Gruppe mit Spawn delay einzufügen und habe folgende Syntax eingebaut:
[waitUntil{ time > 50 }]
Aber irgendwie funktioniert das nicht wirklich. Die KI spawnt ganz kurz direkt am Spieler und verschwindet dann auch sofort wieder.
Ist die Syntax von Grund auf falsch oder kommt es auf die Stelle an wo ich sie einbaue?

Drunken Officer
23.01.2016, 16:21
_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
GroupOne_X = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units GroupOne_X;

sleep 40 + (random 20);

_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
GroupOne_X = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units GroupOne_X;


oder


_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
GroupOne_X = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units GroupOne_X;

waituntil { sleep 1; {alive _x} count units GroupOne_X <= 1};

_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
GroupOne_X = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units GroupOne_X;


oder oder oder

niels001
23.01.2016, 22:49
Das Script ist toll, ich hab mir die Mod auch vor einiger Zeit runter geladen und das funktioniert alles sehr gut. Ich hab da aber trozdem noch 2 Fragen (sorry bin was skripten angeht ein echter voll Noob)....

1.ich weiß wie ich ein Skript über den Trigger starte aber was muss ich eingeben damit es beim verlassen des Triggers sofort beendet wird?

2. Wenn die Einheiten spawnen, dann spawnen sie für den Bruchteil einer Sekunde direkt am Spieler und verteilen sich dann auf den eingestellten Radius.
Liegt das am Skript oder muss ich irgend etwas anderes ändern damit das nicht mehr passiert?

Danke vorab für alle Antworten.
mfg Niels :D

Drunken Officer
23.01.2016, 23:27
1. Das Script wird von allein beendet, da kein Loop verbaut wurde

2. Mit dem Bruchteil einer Sekunde liegt am Script. Ich denke du nutzt Hoschi seines. Da wird die Figur am Spieler stellt und dann verteilt,

niels001
24.01.2016, 10:31
Ja danke, ich hab die beiden Skripte durcheinander geworfen, jetzt sieht der Spawn super ordentlich aus.

Du hast dir schon viel mühe gegeben und ich trau mich ja fast nicht zu fragen :zahn: aber ist es schwierig ein Loop einzubauen, dass nach und nach immer weiter gespawnt wird?

Duke_87
24.01.2016, 13:24
Aaaalso, ich weiß nicht ob das richtig ist was ich gemacht habe aber so funktioniert eine Wiederholung bei mir:
while {true} do
{
Hier her kommt der Code
}
In dem Auslösßer habe ich folgendes bei Aktiviert stehen:
nul = execVM "spawnTest.sqf";

Bei deaktiviert weiß ich nicht genau was ich reinschreiben soll damit das Script beendet wird wenn man den Trigger verlässt. Hab schon einiges versucht aber geholfen hat nichts.

Drunken Officer
24.01.2016, 17:07
Du hast dir schon viel mühe gegeben und ich trau mich ja fast nicht zu fragen :zahn: aber ist es schwierig ein Loop einzubauen, dass nach und nach immer weiter gespawnt wird?
Soll der Loop nur laufen, wenn der Spieler in einem Bereich ist oder immer?

Soll das ganze SP oder MP sein?

Hier ein Code (Singleplayer), der läuft das ganze Spiel über. Es werden, wenn die Zombies bekämpft wurden, neue Zombies spawnen.

private ["_spawnpos", "_grp", "_grp2"];

while {true} do
{
//--- eine TRUE-Schleife läuft immer, da keine Bedingung abgefragt wird
//--- erstes Zombie-Squad

_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
_grp = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units _grp;

//---- wartet mit dem 2. Squad, 40 sekunden + Zufall 0-20
sleep 40 + (random 20);

//--- 2. Zombie-Squad

_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
_grp2 = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units _grp2

//--- wartet bis beide zombie gruppen jeweils nur noch eins oder null sind
//--- man kann auch mit einem sleep arbeiten oder andere Bedingung setze

waituntil { sleep 1; {alive _x} count units _grp <= 1 && {alive _x} count units _grp2 <= 1};
}; //--- Ende WHILE-Schleife


Im MP kann man nicht ohne Weiteres mit Player arbeiten.

niels001
24.01.2016, 17:23
Danke sehr, ich wollte dass es mit dem spawn so ist das es startet wenn man in den Trigger geht und dass es aufhört wenn man ihn wieder verlässt. Solange man in dem Trigger steht sollen immer wieder neue Zombies kommen.

Ich dachte man kann das über den Trigger steuern dass eben das Script angeht und einfach wieder aus, aber so ist das wohl leider nicht^^

Drunken Officer
24.01.2016, 18:56
doch, kann man.
Trigger auf MEHRFACH, Aktivierung durch Blau

bei Aktivierung:

QuarkSahneKuchen= [player, thistrigger] spawn

{
hint "test, Spieler im TriggeR";
while { (_this select 0) in list (_this select 1) } do
{
_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
_grp = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units _grp;
sleep 10;

_spawnpos = [player, 90+(random 30), (random 360)] call BIS_fnc_relPos;
_grp2 = [_spawnpos , EAST, ["RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow","RyanZombieB_Soldier_02_f_1_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units _grp2;

waituntil { sleep 1; count units _grp <= 1 && count units _grp2 <= 1};
hint "neu Runde Zombies";
};
player sideChat "raus aus dem Trigger";
};

niels001
24.01.2016, 20:05
Muss ich irgend etwas bestimmtes beachten wenn ich deinen Code benutze?
Also ich habe ihn als test.sqf abgespeichert und im Trigger bei Aktivierung folgendes eingetragen:

nul = execVM "test.sqf";

Wenn ich im Spiel jetzt durch den Trigger laufe bekomme ich zeitgleich als hint: "test, Spieler im TriggeR" und die Sidechat Nachricht: "raus aus dem Trigger" angezeigt aber es spawnt nichts.

Duke_87
24.01.2016, 21:22
Muss ich irgend etwas bestimmtes beachten wenn ich deinen Code benutze?
Ja ein klein bisschen schon :-)
Der Code kommt direkt in den Trigger rein.

Das funktioniert alles wirklich erstklassig, von mir auch noch einmal ein Danke für die gemachte Mühe und natürlich auch für die Hilfe!

Grüße Duke

niels001
24.01.2016, 23:19
Da hab ich wohl beim lesen gepennt :D
Aber ich habe trozdem noch eine Frage zu der Triggermethode:

Ich habe den Code wie folgt unter aktivieren stehen:
QuarkSahneKuchen= [player, thistrigger] spawn
{
hint "Spawn Anfang";
while { (_this select 0) in list (_this select 1) } do
{

sleep 22;
_spawnpos = [player, 30+(random 30), (random 360)] call BIS_fnc_relPos;
_grp = [_spawnpos , EAST, ["RyanZombieC_man_1slow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units _grp;

sleep 22;
_spawnpos = [player, 30+(random 70), (random 360)] call BIS_fnc_relPos;
_grp1 = [_spawnpos , EAST, ["RyanZombieC_man_polo_1_Fslow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units _grp1;

sleep 22 +(random 15);
_spawnpos = [player, 30+(random 100), (random 360)] call BIS_fnc_relPos;
_grp2 = [_spawnpos , EAST, ["RyanZombieC_man_p_fugitive_Fslow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units _grp2;

sleep 22;
_spawnpos = [player, 40+(random 90), (random 360)] call BIS_fnc_relPos;
_grp3 = [_spawnpos , EAST, ["RyanZombieC_man_p_fugitive_Fslow"]] call BIS_fnc_spawnGroup;
{_x allowfleeing 0} forEach units _grp3;

};
hint "Spawn Ende";
};

Wenn ich in den Trigger laufe funktioniert alles sehr gut und auch wenn ich raus gehe stoppt das ganze so wie es soll. Sobald ich aber in einem Fahrzeug in den Trigger fahre wird das ganze übersprungen und es kommt direkt die Nachricht "Spawn Ende".
Ist das normal so oder ist mir ein Schnitzer im Code passiert?

Drunken Officer
25.01.2016, 06:59
ja, da der player geprüft wird. Damit du es verstehst, mal kurz erklärt.
Die While-Schleife prüft eine Bedingung

while {true} >> ist immer wahr und rennt los
while {alive player} >> läuft so lange, wie der Spieler lebt
while {alive einobjekt} >> läuft so lange, wie das Objekt lebt. z.B. ein gegerischer Panzer oder Offizier. Der Panzer muss im Editor so genannt werden oder beim spawnen mit der Variable versehen werden.
while { (_this select 0) in list (_this select 1) >> prüft ob das 1. Element des Array sich in der Liste des 2. Elementes befindet. Das 2. Element ist der Trigger.
[player, thistrigger] spawn... Vor dem Spawn ist ein Array
while { {alive _x} count units group player > 3} >> läuft so lange, bis die Anzahl der lebenden Einheiten in der Gruppe des Spielers, weniger als 3 sind (da kann man dann z.B. ein Spawn-Script beenden lassen)

Eine Prüfung der Bedingung muss WAHR sein, ansonsten wird die Schleife beendet oder übergangen.
Du kannst sehr viel mehr prüfen. Du kannst die Seite prüfen, die Anzahl der feindlichen Einheiten, die Distanz zwischen Objekten, die Waffe es Spielers, usw...

Zu deinem "Problem" mit dem Fahrzeug:
Aändere mal 2 Sachen ab.

1. Bei der Bedingung des Trigger, da steht original "this" drinn schreibst du rein
this && (vehicle player) in thislist //--- stellt sicher, dass nur der Spieler den Trigger auslöst und keine KI

2. änder den Spawn-Array
QuarkSahneKuchen = [(vehicle player), thistrigger] spawn ....


Player == die Figur
(vehicle player) == Figur ODER das Fahrzeug in welchem die Figur sich befindet.

! Falls das ganze mal im Multiplayer funktionieren soll, kannst du nicht ohne Weiters mit "Player" arbeiten. Der Server kennt keinen Player !
Dann muss der Trigger lokal ausgeführt werden. Das Script mit einer Public-Variable geblockt werden und die Einheiten durch den Clienten erzeugt werden. Blockt man das Script nicht und 3 Spieler sind im Trigger, zieht das Script 3x an. Denn JEDER lädt die Karte und JEDER hat den Trigger mit der Bedingung.

Duke_87
25.01.2016, 09:51
puh... das nenne ich mal ausführlich und komplex aber jetzt verstehe ich das ganze auch besser :lol:
Ich habe aber mal eine etwas andere Frage zu dem ganzen. Im Prinzip wollte ich das mit dem Spawn ja nur wissen, da das Spawnmodul der Mod nur einmal funktioniert. Gäbe es nicht die Möglichkeit das Modul über ein Auslößer oder ein Script neu zu starten?