Problem polega na tym, że:
1. Skryptów jest bardzo dużo i wzywanie garbage collectora do każdego z AIków może być dość problematyczne. Poza tym testowałem to i odpalając teoretycznie prawidłowo GC (tj. przez init jednostki) nic się nie działo, nawet po oddaleniu na odpowiedni dystans.
2. Eventhandler byłby niezłym pomysłem, gdyby nie to, że część ciał powinna zostać. Są także wrogowie/sojusznicy, którzy nie respawnują się w kółko i ich znikanie byłoby także problematyczne.
Oba punkty potraktuję jako rozwiązania awaryjne. Źle zrobiłem nie pokazując całego skryptu. Obszedłem to co prawda samemu, ale jestem co najmniej nieprzekonany do tego rozwiązania, może być na dłuższą metę prawdopodobnie nieco procesożerne, a przynajmniej tak mi się wydaje, dlatego wciąż szukam rozwiązania:
Kod: Zaznacz cały
if (isNil { BIS_fnc_init }) then { waitUntil { !isNil { BIS_fnc_init } } };
private ["_squad","_member1","_member2","_member3","_member4","_member5","_member6","_member7","_soldier1","_soldier2","_soldier3","_soldier4","_soldier5","_soldier6","_soldier7","_banditgroup","_company"];
_squad =
[
"GUE_Soldier_AR",
"GUE_Soldier_CO",
"GUE_Soldier_Crew",
"GUE_Soldier_GL",
"GUE_Soldier_Sniper",
"GUE_Soldier_MG",
"GUE_Soldier_Medic",
"GUE_Soldier_Pilot",
"GUE_Soldier_3",
"GUE_Soldier_2",
"GUE_Soldier_1",
"GUE_Soldier_AT",
"GUE_Soldier_AA",
"GUE_Soldier_Sab",
"GUE_Soldier_Scout",
"GUE_Commander"
];
_member1 = _squad call BIS_fnc_selectRandom;
_member2 = _squad call BIS_fnc_selectRandom;
_member3 = _squad call BIS_fnc_selectRandom;
_member4 = _squad call BIS_fnc_selectRandom;
_member5 = _squad call BIS_fnc_selectRandom;
_member6 = _squad call BIS_fnc_selectRandom;
_member7 = _squad call BIS_fnc_selectRandom;
_banditgroup = creategroup west;
sleep 1;
_soldier1= _member1 createUnit [getMarkerPos "logic_bandit_group1", _banditgroup,"arming = [this] execVM 'random_arm_hn.sqf'; nul=[this,'kurwamac'] execVM 'scripts\upsmon.sqf'; gadka = [this] execVM 'Dialog1start.sqf';", 0.5, "SERGEANT"];
sleep 0.1;
_soldier2 = _member2 createUnit [getMarkerPos "logic_bandit_group1", _banditgroup,"arming = [this] execVM 'random_arm_hn.sqf';", 0.5, "corporal"];
sleep 0.1;
_soldier3 = _member3 createUnit [getMarkerPos "logic_bandit_group1", _banditgroup,"arming = [this] execVM 'random_arm_hn.sqf';", 0.6, "corporal"];
sleep 0.1;
_soldier4 = _member4 createUnit [getMarkerPos "logic_bandit_group1", _banditgroup,"arming = [this] execVM 'random_arm_hn.sqf';", 0.5, "corporal"];
sleep 0.1;
_soldier5 = _member5 createUnit [getMarkerPos "logic_bandit_group1", _banditgroup,"arming = [this] execVM 'random_arm_hn.sqf';", 0.5, "corporal"];
sleep 0.1;
_soldier6 = _member6 createUnit [getMarkerPos "logic_bandit_group1", _banditgroup,"arming = [this] execVM 'random_arm_hn.sqf';", 0.5, "corporal"];
sleep 0.1;
_soldier7 = _member7 createUnit [getMarkerPos "logic_bandit_group1", _banditgroup,"arming = [this] execVM 'random_arm_hn.sqf';", 0.5, "corporal"];
sleep 0.1;
sleep 1;
_company = units _banditgroup;
sleep 5;
_troop1 = (_company select 0);
_troop2 = (_company select 1);
_troop3 = (_company select 2);
_troop4 = (_company select 3);
_troop5 = (_company select 4);
_troop6 = (_company select 5);
_troop7 = (_company select 6);
sleep 2;
if (random 100 > 50) then {deletevehicle _troop3};
if (random 100 > 50) then {deletevehicle _troop4};
if (random 100 > 50) then {deletevehicle _troop5};
if (random 100 > 50) then {deletevehicle _troop6};
if (random 100 > 50) then {deletevehicle _troop7};
sleep 1;
hint str (units _banditgroup);
sleep 3;
waitUntil {sleep 1;{alive _x} count units _banditgroup < 1};
sleep 7;
hint "dead, rspwn";
deletevehicle _troop1;
deletevehicle _troop2;
deletevehicle _troop3;
deletevehicle _troop4;
deletevehicle _troop5;
deletevehicle _troop6;
deletevehicle _troop7;
deletegroup _banditgroup;
hint "clear, srspwn in 10 sec";
sleep 10;
test = player execVM "random_squad.sqf";
Problem jest taki, że grupa może mieć od 3 do 7 osób, a tablica natychmiast wywala błąd i psuje skrypt, gdy wzywany element się w niej nie znajduje. Respawn jednostek _soldier3 do _soldier7 jest więc wątpliwy i nie mogę ich ręcznie dodać do tablicy.
Nie da się usuwać jednostek poprzez foreach units etc., dlatego tylko na czas tego skryptu muszę im przydzielić ich nazwy, na których będę operować, by móc po respawnie zastąpić je klonami. Jednak jeśli np. _soldier5 się nie pojawi, to jednocześnie nie ma elementu odpowiadającego _soldierowi5 w tablicy _company, więc wzywanie tego elementu poprzez select wyrzuca błąd. Muszę znaleźć metodę, która pozwoli więc albo nie okreslać _troop5 albo wkładać w jego miejsce cokolwiek innego, co następnie będzie przez skrypt ignorowane.
Możliwe, że to już nie ta godzina, ale nie widzę na razie zastosowania sensownego count units _banditgroup. Mógłbyś sprecyzować w jaki sposó to wykorzystać?
Myślę, że teraz też wyraziłem się nieco jaśniej, ponieważ pierwszy post może komplikować.