Random Fahrzeug-Loot (ALiVE spawnende Fahrzeuge)

  • Multiplayer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Random Fahrzeug-Loot (ALiVE spawnende Fahrzeuge)

    Hallo,

    Ich versuche derzeit den Fahrzeugen, welche im laufendem Spielbetrieb durch ALiVE gespawned werden,
    einen zufälligen Inhalt zu verpassen. Leider bisher mit mäßigem Erfolg...


    Problem:
    Entweder wird kein Inhalt generiert (Wenn ich es über die InitServer.sqf laufen lasse) oder jeder Spieler hat seinen eigenen Inhalt (Init.sqf - auch blöd^^).


    Ich habe dafür folgenden Ansatz verfolgt:

    Quellcode: InitServer.sqf

    1. ["LandVehicle", "init", {["Vehicles", _this select 0] call iV_fnc_addLoot}, true, [], true] call CBA_fnc_addClassEventHandler;


    Die dazugehörige Funktion schaut wie folgt aus:

    Quellcode: fn_addLoot.sqf

    1. // VARIABLES
    2. params ["_type", "_target"];
    3. private ["_foodList", "_toolList", "_medicalList", "_signalList", "_miscList", "_lootValues"];
    4. _foodList = ["herl_dri_milk", "herl_dri_watera", "herl_dri_Spirit", "herl_dri_Franta", "herl_eat_TABA", "herl_eat_GB", "herl_eat_apple", "herl_ma_Canteen"];
    5. _toolList = ["ToolKit", "ACE_wirecutter", "herl_o_saw", "herl_u_Knife", "herl_copener", "ACE_EntrenchingTool", "ACE_DefusalKit"];
    6. _medicalList = ["ACE_epinephrine", "ACE_morphine", "ACE_surgicalKit", "ACE_fieldDressing", "ACE_elasticBandage", "ACE_packingBandage", "ACE_quikClot", "ACE_bodyBag"];
    7. _signalList = ["ACE_Chemlight_HiRed", "ACE_Chemlight_HiWhite", "ACE_Chemlight_IR", "ACE_Flashlight_XL50", "ACE_Flashlight_KSF1", "ACE_Flashlight_MX991", "ACE_IR_Strobe_Item"];
    8. _miscList = ["herl_ma_wire", "herl_mb_waterpur", "herl_matches", "herl_lighter", "herl_u_hpack", "herl_u_vitamins", "ACE_EarPlugs", "ACE_MapTools", "ACE_CableTie", "ACE_key_lockpick"];
    9. // SWITCH CASE
    10. switch _type do {
    11. case "Vehicles": {
    12. // VARIABLES
    13. private _lootList = _foodList + _toolList + _medicalList + _signalList + _miscList;
    14. private _weaponList = ["sgun_HunterShotgun_01_sawedoff_F", "sgun_HunterShotgun_01_F", "hgun_Pistol_01_F", "hgun_P07_F", "srifle_DMR_06_hunter_F"];
    15. // GET CONFIG INFO FOR SIDE
    16. private _className = typeOf _target;
    17. private _cfgInfo = [_className] call iV_fnc_cfgInfo;
    18. private _side = _cfgInfo select 5;
    19. // SWITCH SIDE
    20. switch _side do {
    21. case 0: {_lootValues = [13, false]}; // EAST
    22. case 1: {_lootValues = [13, false]}; // WEST
    23. case 2: {_lootValues = [10, true]}; // GUER
    24. case 3: {_lootValues = [7, true]}; // CIV
    25. };
    26. // GET FROM ARRAY
    27. private _amountLoot = _lootValues select 0;
    28. private _weaponsLoot = false; //_lootValues select 1; <-- TODO: FIND ERROR IN MP/DS
    29. // CLEAR CARGO RANDOM
    30. if ((random 10) > 6) then {clearWeaponCargoGlobal _target};
    31. if ((random 10) > 6) then {clearMagazineCargoGlobal _target};
    32. if ((random 10) > 6) then {clearItemCargoGlobal _target};
    33. // ADD RANDOM LOOT
    34. for "_i" from 1 to random _amountLoot do {
    35. if ((random 10) > 5) then {
    36. private _rndLoot = selectRandom _lootList;
    37. _target addItemCargoGlobal [_rndLoot, selectRandom [1, 1, 1, 2]];
    38. };
    39. };
    40. // ADD WEAPONS IF IS GUER OR CIV
    41. if (_weaponsLoot) then {
    42. // ADD RANDOM WEAPONS & AMMO
    43. for "_i" from 1 to random 3 do {
    44. if ((random 100) > 95) then {
    45. private _weapon = selectRandom _weaponList;
    46. private _ammoList = getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines");
    47. private _ammo = selectRandom _ammoList;
    48. // ADD WEAPONS & AMMO
    49. _target addWeaponCargoGlobal [_weapon, 1];
    50. _target addMagazineCargoGlobal [_ammo, 1 + (random 6)];
    51. };
    52. };
    53. };
    54. };
    55. };
    Alles anzeigen
  • Hi,

    das Skript benutzt Befehle mit globem Effekt, also darf das ganze nur auf dem Server ausgeführt werden (also initServer.sqf verwenden).
    Der Grund warum da scheinbar auf Klienten kein Cargo hinzugefügt wird, wenn das ganze auf dem Server ausgeführt wird, liegt am BI Init-Event. Das Event läuft bevor das Objekt auf den anderen Maschinen erstellt wurde und damit kann kein Inventar mit den Klienten synchronisiert werden.
    Um das zu umgehen einfach bei der addClassEventHandler-Zeile "init" in "InitPost" ändern.