Individuální bedna s municí v ArmA multiplayeru
Pokud jste hráli Evolution pro ArmA: Armed Assault, tak jste jistě
zaznamenali, že na letišti v bedně měl každý hráč dostupné vybavení
dle své hodnosti. Ukažme si krátký skript, jak tohle řešit dle vlastních
požadavků.
Multiplayer v ArmA hrách má svá specifika, která je vhodné znát
(doporučuji mrknout na BI Wiki).
A proč? Pointa celého řešení je v tom, že každý má svou bednu
vytvořenou jen na svém počítači. Ale nepředbíhejme a začněme pěkně od
začátku.
Než si vytvoříme hlavní skript, tak v editoru zadáme spínač
s podmínkou spuštění:
local player
a do pole s kódem, ještě se spouští po aktivaci zadáme zavolání
hlavního skriptu.
[] execVM "player_init.sqf"
Tento spínač nám zajistí, že se skript spustí každému hráči a
vyhodnocuje u něj na počítači (a na serveru se ignoruje).
Obsahem souboru player_init.sqf bude krátký ukázkový
skript:
if (not (local player)) exitwith {};
_player = player;
deletevehicle ammobox1;
ammobox1 = "WeaponBoxWest" createVehicleLocal getmarkerpos "none";
ammobox1 setpos getmarkerpos "ammobox1";
if (_player isKindOf "SoldierWSniper") then {
clearWeaponCargo ammobox1;
ammobox1 AddWeaponCargo ["M9SD", 10];
ammobox1 AddWeaponCargo ["M107", 10];
ammobox1 AddWeaponCargo ["M24", 10];
};
if (_player isKindOf "SoldierWSaboteurAssault") then {
clearWeaponCargo ammobox1;
ammobox1 AddWeaponCargo ["M9SD", 10];
ammobox1 AddWeaponCargo ["M4A1SD", 10];
ammobox1 AddWeaponCargo ["MP5SD", 10];
};
Skript je psán ještě pro ArmA: Armed Assault, takže pro další verze je
nutné si najít požadované třídy jednotek, zbraní a munice. Princip je ve
své podstatě jednoduchý. Na začátku se provede jednoduché ověření, že
se skript skutečně volá u hráče a ne na serveru. Proměnná player se
váže k danému počítači a jde vždy o postavu, kterou ovládá hráč
u nějž se skript provádí (viz popis z BI Wiki: „Person
controlled by player. In MP this value is different on each computer.“)
Následně se vytvoří bedna příkazem createVehicleLocal,
díky němuž se objekt (nemusí jít nutně o vozidlo) vytvoří jen a pouze
u hráče na jeho počítači (viz odkazovaný první článek o specifikách
MP a popisku příkazu createVehicleLocal: „Vehicle is not transferred through
network in MP games.“)
Výsledkem tedy je, že všichni hráči vidí na pozici ammobox1 bednu,
i když každý jen tu svou lokální.
Ve skriptu následně zkontrolujeme typ postavy, kterou si hráč zvolil při
připojení do hry a podle typu bednu případně naplníme zbraněmi.
Všichni hráči tak mají na bodě ammobox1 bednu se svým specifickým
obsahem na základě zvolené postavy.
Pro doplnění je dobré si uvědomit, že přímo na serveru bedna vlastně
vůbec přítomna není.
Přidáním dalších typů hratelných postav je pak možné vytvářet
rozdílný obsah třeba pro kulometčíky (SoldierWMG), raketometčíky
(SoldierWAT, SoldierWAA), posádky (SoldierWCrew) atd.
V příkladu jsou přidávány jen zbraně. Pro munici se jen použije
příkaz addMagazineCargo a adekvátní typ munice.
Protože jde o multiplayer, tak se pravděpodobně bude hodit po
případném respawnu hráči bednu doplnit. K tomu stačí využít opakovaný
spínač s podmínkou alive player and local player a v našem
případě zavolat skript s obdobným obsahem (např. player execVM
„spawn.sqf“). To je také důvod, proč není bedna označena lokální
proměnnou a proč se na začátku skriptu přes deletevehicle odstraňuje. Ve
své podstatě je pak vhodné celý skript uložit do nějaké vlastní funkce a
tu pak volat.
CELO_CreateLocalAmmoBox1 = {
_player = _this select 0;
// -- zbytek skriptu, až na první dva řádky, může zůstat zachován z původního player_init.sqf
}
V player_init.sqf mít:
if (not (local player)) exitwith {};
_null = [player] call CELO_CreateLocalAmmoBox1;
a ve spawn.sqf
if (not (local player)) exitwith {};
_null = [_this select 0] call CELO_CreateLocalAmmoBox1;
Za úkol na závěr si zkuste zjistit, které skripty se při spuštění hry
zavolají (respektive, které spínače se „sepnou“).
Takto vytvořený základ můžeme následně rozšiřovat a obdobně jako
v Evoluci přidat nějaké hodnotící body za úspěchy v misi na jejichž
základě by se počet zbraní a jejich šíře zvětšovala. O tom třeba
příště.