Das Urheberrecht dieses Beitrags liegt bei chris579, am 2. Dezember 2014!
Zitat von chris579Alles anzeigen
Hallo Leute,
diese Lösung stammt vom Server, den ich
gescripted habe, der jedoch wegen des Teams leider down geht. Diese
Lösung ist eine Eigenkreation und auch so zu deklarieren. Mit Disclaimer
und Verweis auf mich oder auf diesen Beitrag.
Die Idee ist für
den Cop einen extra Button einzufügen, mit dem man dann das Gear
speichert. Wie das ganze aufgerufen wird, kann man auch variieren. Das
ganze ist getestet und sollte einwandfrei funktionieren (sollte ich es
nicht irgendwo verkackt haben).
Als Erstes fügen wir den neuen Button ins Player Menü ein:
dialog/player_inv.hpp
Codeclass ButtonSaveGear : life_RscButtonMenu { idc = 9900; text = "Save Gear"; onButtonClick = "[] call SOCK_fnc_syncGear;"; x = 0.26 + (6.25 / 19.8) + (1 / 250 / (safezoneW / safezoneH)); y = 0.805; w = (6.25 / 40); h = (1 / 25); };
Dann sorgen wir dafür, dass der Button nur Cops angezeigt wird:
core/pmenu/fn_p_openMenu.sqf
Dieses muss bei jedem Case, außer West, eingefügt werden.
Um
zu verhindern, dass die Variable life_gear dauerhaft überschrieben
wird, wird beim Connect und der Rückgabe der Spielerdaten vom Server
quasi ein "Backup" erstellt, dass nur überschrieben wird, wenn denn auch
wirklich das Gear gespeichert wird.
core/session/fn_requestReceived.sqf
nach
und vor
das einfügen:
also:
Codelife_gear = _playerData select 8; life_persistent_gear = _playerData select 8; [] call life_fnc_loadGear;
Nun benötigen wir die neue Datei "fn_syncGear.sqf"
core/session/fn_syncGear.sqf
Code Alles anzeigen/* Author: H4SHK3KS File: fn_syncGear.sqf Description: calles the function to save the cop gear */ if(isNil "life_copGearSaved") then {life_copGearSaved = false;}; if(life_copGearSaved) exitWith {hint "You can sync your cop gear only every 30 seconds!"}; hint "Cop gear succesfully saved. You'll now spawn every time with this gear as long you don't overwrite your data!"; [7] spawn SOCK_fnc_updatePartial; [] spawn { life_copGearSaved = true; sleep 30; life_copGearSaved = false; };
Diese tragen wir in die Functions.h ein
bei SOCK (ganz oben)
core/session/fn_updatePartial.sqf
das hier am Ende einfügen (Case Nummer eventuell anpassen)
Nun das wichtigste:
core/functions/fn_saveGear.sqf
Zur Verständnis poste ich die gesamte Datei.
Spoiler anzeigen
Code Alles anzeigen/* File: fn_saveGear.sqf Author: Bryan "Tonic" Boardwine Full Gear/Y-Menu Save by Vampire Edited: Itsyuka and H4SHK3KS (persistent cop gear) Description: Saves the players gear for syncing to the database for persistence.. */ private["_return","_uItems","_bItems","_vItems","_pItems","_hItems","_yItems","_uMags","_vMags","_bMags","_pMag","_hMag","_uni","_ves","_bag","_handled","_saveGear"]; _saveGear = [_this,0,false,[false]] call BIS_fnc_param; If(playerSide == west AND !(_saveGear)) then { _return = life_persistent_gear; life_persistent_gear resize 17; } else { _return = []; _return pushBack uniform player; _return pushBack vest player; _return pushBack backpack player; _return pushBack goggles player; _return pushBack headgear player; _return pushBack assignedITems player; if(playerSide == west || playerSide == civilian) then { _return pushBack primaryWeapon player; _return pushBack handgunWeapon player; } else { _return pushBack []; _return pushBack []; }; _uItems = []; _uMags = []; _bItems = []; _bMags = []; _vItems = []; _vMags = []; _pItems = []; _hItems = []; _uni = []; _ves = []; _bag = []; if(uniform player != "") then { { if (_x in (magazines player)) then { _uMags = _uMags + [_x]; } else { _uItems = _uItems + [_x]; }; } forEach (uniformItems player); }; if(backpack player != "") then { { if (_x in (magazines player)) then { _bMags = _bMags + [_x]; } else { _bItems = _bItems + [_x]; }; } forEach (backpackItems player); }; if(vest player != "") then { { if (_x in (magazines player)) then { _vMags = _vMags + [_x]; } else { _vItems = _vItems + [_x]; }; } forEach (vestItems player); }; if(count (primaryWeaponMagazine player) > 0 && alive player) then { _pMag = ((primaryWeaponMagazine player) select 0); if(_pMag != "") then { _uni = player canAddItemToUniform _pMag; _ves = player canAddItemToVest _pMag; _bag = player canAddItemToBackpack _pMag; _handled = false; if(_ves) then { _vMags = _vMags + [_pMag]; _handled = true; }; if(_uni && !_handled) then { _uMags = _uMags + [_pMag]; _handled = true; }; if(_bag && !_handled) then { _bMags = _bMags + [_pMag]; _handled = true; }; }; }; if(count (handgunMagazine player) > 0 && alive player) then { _hMag = ((handgunMagazine player) select 0); if(_hMag != "") then { _uni = player canAddItemToUniform _hMag; _ves = player canAddItemToVest _hMag; _bag = player canAddItemToBackpack _hMag; _handled = false; if(_ves) then { _vMags = _vMags + [_hMag]; _handled = true; }; if(_uni && !_handled) then { _uMags = _uMags + [_hMag]; _handled = true; }; if(_bag && !_handled) then { _bMags = _bMags + [_hMag]; _handled = true; }; }; }; if(count (primaryWeaponItems player) > 0) then { { _pItems = _pItems + [_x]; } forEach (primaryWeaponItems player); }; if(count (handGunItems player) > 0) then { { _hItems = _hItems + [_x]; } forEach (handGunItems player); }; _return pushBack _uItems; _return pushBack _uMags; _return pushBack _bItems; _return pushBack _bMags; _return pushBack _vItems; _return pushBack _vMags; _return pushBack _pItems; _return pushBack _hItems; }; _yItems = []; { _name = (_x select 0); _val = (_x select 1); if (_val > 0) then { for "_i" from 1 to _val do { _yItems = _yItems + [_name]; }; }; } forEach [ ["life_inv_apple", life_inv_apple], ["life_inv_rabbit", life_inv_rabbit], ["life_inv_salema", life_inv_salema], ["life_inv_ornate", life_inv_ornate], ["life_inv_mackerel", life_inv_mackerel], ["life_inv_tuna", life_inv_tuna], ["life_inv_mullet", life_inv_mullet], ["life_inv_catshark", life_inv_catshark], ["life_inv_fishingpoles", life_inv_fishingpoles], ["life_inv_water", life_inv_water], ["life_inv_donuts", life_inv_donuts], ["life_inv_turtlesoup", life_inv_turtlesoup], ["life_inv_coffee", life_inv_coffee], ["life_inv_fuelF", life_inv_fuelF], ["life_inv_fuelE", life_inv_fuelE], ["life_inv_pickaxe", life_inv_pickaxe], ["life_inv_tbacon", life_inv_tbacon], ["life_inv_cone", life_inv_cone], ["life_inv_barrier", life_inv_barrier], ["life_inv_lockpick", life_inv_lockpick], ["life_inv_redgull", life_inv_redgull], ["life_inv_peach", life_inv_peach], ["life_inv_spikeStrip", life_inv_spikeStrip], ["life_inv_defusekit", life_inv_defusekit], ["life_inv_storagesmall", life_inv_storagesmall], ["life_inv_storagebig", life_inv_storagebig] ]; _return pushBack _yItems; life_gear = _return; if (_saveGear) then { life_persistent_gear = _return};
Wer neue Items eingefügt hat oder sonst etwas geändert hat, muss gucken, wie er diese Datei anpasst.
Nun die loadGear
core/functions/fn_loadGear.sqf
Ganz oben muss das:
durch das
Codeif (playerSide == west) then { _itemArray = life_persistent_gear; } else { _itemArray = life_gear; };
ersetzt werden.
Als letzes nun noch eine Datei:
core/medical/fn_respawned.sqf
Das:
Code Alles anzeigenswitch(playerSide) do { case west: { _handle = [] spawn life_fnc_copLoadout; }; case civilian: { _handle = [] spawn life_fnc_civLoadout; }; case independent: { _handle = [] spawn life_fnc_medicLoadout; }; waitUntil {scriptDone _handle}; };
durch das:
Code Alles anzeigenswitch(playerSide) do { case west: { _handle = [] spawn life_fnc_loadGear; }; case civilian: { _handle = [] spawn life_fnc_civLoadout; }; case independent: { _handle = [] spawn life_fnc_medicLoadout; }; waitUntil {scriptDone _handle}; };
ersetzen. Nun sollte alles funktionieren. Das ganze kann auf Medics und auch ADAC erweitert werden.
Grüße
Christian