Sign in to follow this  
El Rabito

Lootspawn rework

4 posts in this topic

I was using a tweaked ExileServer_system_lootManager_spawnLootInBuilding.sqf for a while on my test-server.
(https://www.exilemod.com/topic/24394-improved-loot-spawner-for-v103/)

There is chance that instead of a ground lootholder a chest with loot spawns. So i had the idea to use all these nice PLP container,
which worked without any problem (i heard about server crashes because of this PLP mod, but i was using it for DMS and no single crash).

I tweaked it that way, that there is a selection of crates for each loottable category (Civil;military etc)

ExileServer_system_lootManager_spawnLootInBuilding.sqf
-> https://pastebin.com/RHyN9fFB

12wA5jq.jpg
fUagX6q.jpg

Now the only annoying thing is, the crates spawn inside objects. Of-course i could change every lootspot position, so there is enough space to properly spawn this crates.  But i want to spawn crates and ground lootholders.

I was trying to tweak the createVehicle command parameters, but they still spawned on the exact same position.
Even my stupid try to include BIS_fnc_findSafePos to change the position of the crates made no difference o.O

_lootHolder = createVehicle [_crate, _lootPosition, [], 3, "NONE"];


Any of you more experienced guys has some tips/hints how i could "easily" do this ?

Edited by El Rabito

Share this post


Link to post
Share on other sites

Try changing "NONE" to "CAN_COLLIDE"
Doesn't make sense but with Arma's reverse logic it might work :D

Share this post


Link to post
Share on other sites
Advertisement

hey @El Rabito :)

What about spawning the crates in the normal loot position:
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
spawn the loot closer to the crate:
                   _lootHolder = createVehicle [_crate, _lootPosition, [], 0.2, "NONE"];
or
have spawn the loot on top of the crate:
                    private["_loot"]  // line 12
                   _loot = objNull;   // line 44
                   if (isNull _lootHolder) || (isNull _loot) then   // line 52
                   _loot = createVehicle ["LootWeaponHolder", _lootPosition, [], 0, "CAN_COLLIDE"]; // line 367
                  _loot attachTo [_lootHolder, [0,0,-0.2]];

Spoiler

/**
 * ExileServer_system_lootManager_spawnLootInBuilding
 *
 * Exile Mod
 * www.exilemod.com
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_loot","_numberOfItemsPerCrate","_percentageChanceToSpawnCrate","_midNumberOfItemsPerLootSpot","_minimumNumberOfItemsPerLootSpot","_crateMIL","_crateCL", "_crateRAD", "_building", "_buildingConfig", "_lootTableName", "_localPositions", "_lootConfig", "_maximumNumberOfLootPositions", "_maximumPositionCoverage", "_maximumNumberOfItemsPerLootSpot", "_numberOfPositionsToUse", "_lootPositions", "_spawnedItemClassNames", "_lootWeaponHolderNetIDs", "_lootPosition", "_lootHolder", "_numberOfItemsToSpawn", "_n", "_itemClassName", "_cargoType", "_magazineClassNames", "_magazineClassName", "_numberOfMagazines"];
_building = _this;
_building setVariable ["ExileLootSpawnedAt", time];
_building setVariable ["ExileHasLoot", true];
_buildingConfig = configFile >> "CfgBuildings" >> typeOf _building;
_lootTableName = getText (_buildingConfig >> "table");
_localPositions = getArray (_buildingConfig >> "positions");
if ((getPosATL _building) call ExileClient_util_world_isInRadiatedZone) then
{
    _lootTableName = "Radiation";
};
_lootConfig = missionConfigFile >> "CfgExileLootSettings";
_maximumNumberOfLootPositions = getNumber (_lootConfig >> "maximumNumberOfLootSpotsPerBuilding");
_maximumPositionCoverage = getNumber (_lootConfig >> "maximumPositionCoverage");
_maximumNumberOfItemsPerLootSpot = getNumber (_lootConfig >> "maximumNumberOfItemsPerLootSpot");
_minimumNumberOfItemsPerLootSpot = getNumber (_lootConfig >> "minimumNumberOfItemsPerLootSpot");
_midNumberOfItemsPerLootSpot = getNumber (_lootConfig >> "midNumberOfItemsPerLootSpot");
_numberOfPositionsToUse = 1 max (((count _localPositions) * _maximumPositionCoverage / 100) min _maximumNumberOfLootPositions);
_localPositions = _localPositions call ExileClient_util_array_shuffle;
_lootPositions = _localPositions select [0, _numberOfPositionsToUse];
_spawnedItemClassNames = [];
_lootWeaponHolderNetIDs = [];
_percentageChanceToSpawnCrate = getNumber (_lootConfig >> "percentageChanceToSpawnCrate");
_numberOfItemsPerCrate = getNumber (_lootConfig >> "numberOfItemsPerCrate");

{
    _lootPosition = ASLToATL (AGLToASL (_building modelToWorld _x));
    if (_lootPosition select 2 < 0.05) then
    {
        _lootPosition set [2, 0.05];
    };
    _lootHolder = objNull;
    _loot = objNull;
    _numberOfItemsToSpawn = round random [_minimumNumberOfItemsPerLootSpot,_midNumberOfItemsPerLootSpot,_maximumNumberOfItemsPerLootSpot]; // [min,mid,max]
    if (random 100 <= _percentageChanceToSpawnCrate) then {_numberOfItemsToSpawn = _numberOfItemsPerCrate}; // occasionally have a big loot cache
    for "_n" from 1 to _numberOfItemsToSpawn do
    {
        _itemClassName = _lootTableName call ExileServer_system_lootManager_dropItem;
        if !(_itemClassName in _spawnedItemClassNames) then
        {
            if (isNull _lootHolder) || (isNull _loot) then
            {
                if (_numberOfItemsToSpawn == _numberOfItemsPerCrate) then  //if you have a big loot cache, put it in a random crate
                {
                
                    if (_lootTableName == "Military") then
                    {
                    _crate = selectRandom [
                        "plp_ct_MilBoxBigBlack",
                        "plp_ct_MilBoxBigOlive",
                        "plp_ct_MilBoxLongBlack",
                        "plp_ct_MilBoxLongOlive",
                        "plp_ct_MilBoxMediumBlack",
                        "plp_ct_MilBoxMediumOlive",
                        "plp_ct_FootlockerGreen",
                        "plp_ct_FootlockerBrown",
                        "plp_ct_WeathCrateBigBrown",
                        "plp_ct_WeathCrateBigGreen",
                        "plp_ct_WeathCrateBigWorn",
                        "plp_ct_WeathCrateMediumBrown",
                        "plp_ct_MultiboxUtilOlive",
                        "plp_ct_WeathCrateMediumGreen",
                        "plp_ct_MultiboxColOlive"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "CivillianLowerClass") then
                    {
                    _crate = selectRandom [
                        "plp_ct_CartonLightMedium",
                        "plp_ct_CartonDarkMedium",
                        "plp_ct_CartonRottenMedium",
                        "plp_ct_CartonLightSmall",
                        "plp_ct_CartonDarkSmall",
                        "plp_ct_CartonRottenSmall",
                        "plp_ct_CartonLightFlat",
                        "plp_ct_CartonDarkFlat",
                        "plp_ct_CartonRottenFlat",
                        "plp_ct_PlasticBoxBlack",
                        "plp_ct_PlasticBoxBlue",
                        "plp_ct_PlasticBoxGrey",
                        "plp_ct_PlasticBoxRed",
                        "plp_ct_SuitcaseFabricBeigeSide",
                        "SuitcaseFabricBlackSide",
                        "SuitcaseFabricBrownSide",
                        "SuitcaseFabricGreenSide",
                        "SuitcaseFabricRedSide",
                        "plp_ct_SuitcaseMetalBlackSide",
                        "plp_ct_SuitcaseMetalSilverSide",
                        "plp_ct_SuitcaseBigRed",
                        "plp_ct_SuitcaseBigGrey",
                        "plp_ct_SuitcaseBigBlue",
                        "plp_ct_SuitcaseBigBlack",
                        "plp_ct_SuitcaseBigGreen"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "FORM"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "CivillianUpperClass") then
                    {
                    _crate = selectRandom [
                        "plp_ct_CartonLightMedium",
                        "plp_ct_CartonDarkMedium",
                        "plp_ct_CartonRottenMedium",
                        "plp_ct_CartonLightSmall",
                        "plp_ct_CartonDarkSmall",
                        "plp_ct_CartonRottenSmall",
                        "plp_ct_CartonLightFlat",
                        "plp_ct_CartonDarkFlat",
                        "plp_ct_CartonRottenFlat",
                        "plp_ct_PlasticBoxBlack",
                        "plp_ct_PlasticBoxBlue",
                        "plp_ct_PlasticBoxGrey",
                        "plp_ct_PlasticBoxRed",
                        "plp_ct_SuitcaseFabricBeigeSide",
                        "SuitcaseFabricBlackSide",
                        "SuitcaseFabricBrownSide",
                        "SuitcaseFabricGreenSide",
                        "SuitcaseFabricRedSide",
                        "plp_ct_SuitcaseMetalBlackSide",
                        "plp_ct_SuitcaseMetalSilverSide",
                        "plp_ct_SuitcaseBigRed",
                        "plp_ct_SuitcaseBigGrey",
                        "plp_ct_SuitcaseBigBlue",
                        "plp_ct_SuitcaseBigBlack",
                        "plp_ct_SuitcaseBigGreen"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "Factories") then
                    {
                    _crate = selectRandom [
                        "plp_ct_CartonLightMedium",
                        "plp_ct_CartonDarkMedium",
                        "plp_ct_CartonRottenMedium",
                        "plp_ct_CartonLightSmall",
                        "plp_ct_CartonDarkSmall",
                        "plp_ct_CartonRottenSmall",
                        "plp_ct_CartonLightFlat",
                        "plp_ct_CartonDarkFlat",
                        "plp_ct_CartonRottenFlat",
                        "Exile_Container_Storagecrate",
                        "plp_ct_WoodBoxLightTiny",
                        "plp_ct_WoodBoxLightSmall",
                        "plp_ct_WoodBoxLightMedium",
                        "Land_MetalCase_01_medium_F",
                        "plp_ct_MultiboxUtilOrange",
                        "plp_ct_MultiboxColOrange",
                        "Land_PlasticCase_01_small_F",
                        "Land_PlasticCase_01_large_F",
                        "Land_MetalCase_01_small_F",
                        "plp_ct_ToolboxRedDirty",
                        "plp_ct_ToolboxBlackDirty"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "Industrial") then
                    {
                    _crate = selectRandom [
                        "plp_ct_CartonLightMedium",
                        "plp_ct_CartonDarkMedium",
                        "plp_ct_CartonRottenMedium",
                        "plp_ct_CartonLightSmall",
                        "plp_ct_CartonDarkSmall",
                        "plp_ct_CartonRottenSmall",
                        "plp_ct_CartonLightFlat",
                        "plp_ct_CartonDarkFlat",
                        "plp_ct_CartonRottenFlat",
                        "Exile_Container_Storagecrate",
                        "plp_ct_WoodBoxLightTiny",
                        "plp_ct_WoodBoxLightSmall",
                        "plp_ct_WoodBoxLightMedium",
                        "Land_MetalCase_01_medium_F",
                        "plp_ct_MultiboxUtilOrange",
                        "plp_ct_MultiboxColOrange",
                        "Land_PlasticCase_01_small_F",
                        "Land_PlasticCase_01_large_F",
                        "Land_MetalCase_01_small_F",
                        "plp_ct_ToolboxRedDirty",
                        "plp_ct_ToolboxBlackDirty"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "Medical") then
                    {
                    _crate = selectRandom [
                        "Land_PlasticCase_01_small_gray_F",
                        "plp_ct_PlasticBoxRed",
                        "plp_ct_MultiboxUtilOrange",
                        "Land_MetalCase_01_small_F",
                        "Land_MetalCase_01_medium_F",
                        "plp_ct_WoodBoxLightTiny",
                        "plp_ct_SuitcaseMetalSilverSide",
                        "plp_ct_CartonRottenFlat",
                        "plp_ct_CartonDarkFlat",
                        "plp_ct_WoodBoxLightSmall"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "Shop") then
                    {
                    _crate = selectRandom [
                        "plp_ct_CartonLightMedium",
                        "plp_ct_CartonDarkMedium",
                        "plp_ct_CartonRottenMedium",
                        "plp_ct_CartonLightSmall",
                        "plp_ct_CartonDarkSmall",
                        "plp_ct_CartonRottenSmall",
                        "plp_ct_CartonLightFlat",
                        "plp_ct_CartonDarkFlat",
                        "plp_ct_CartonRottenFlat",
                        "plp_ct_PlasticBoxBlack",
                        "plp_ct_PlasticBoxBlue",
                        "plp_ct_PlasticBoxGrey",
                        "plp_ct_PlasticBoxRed"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "Tourist") then
                    {
                    _crate = selectRandom [
                        "plp_ct_CartonLightMedium",
                        "plp_ct_CartonDarkMedium",
                        "plp_ct_CartonRottenMedium",
                        "plp_ct_CartonLightSmall",
                        "plp_ct_CartonDarkSmall",
                        "plp_ct_CartonRottenSmall",
                        "plp_ct_CartonLightFlat",
                        "plp_ct_CartonDarkFlat",
                        "plp_ct_CartonRottenFlat",
                        "plp_ct_PlasticBoxBlack",
                        "plp_ct_PlasticBoxBlue",
                        "plp_ct_PlasticBoxGrey",
                        "plp_ct_PlasticBoxRed",
                        "plp_ct_SuitcaseFabricBeigeSide",
                        "SuitcaseFabricBlackSide",
                        "SuitcaseFabricBrownSide",
                        "SuitcaseFabricGreenSide",
                        "SuitcaseFabricRedSide",
                        "plp_ct_SuitcaseMetalBlackSide",
                        "plp_ct_SuitcaseMetalSilverSide",
                        "plp_ct_SuitcaseBigRed",
                        "plp_ct_SuitcaseBigGrey",
                        "plp_ct_SuitcaseBigBlue",
                        "plp_ct_SuitcaseBigBlack",
                        "plp_ct_SuitcaseBigGreen"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "VehicleService") then
                    {
                    _crate = selectRandom [
                        "plp_ct_CartonLightMedium",
                        "plp_ct_CartonDarkMedium",
                        "plp_ct_CartonRottenMedium",
                        "plp_ct_CartonLightSmall",
                        "plp_ct_CartonDarkSmall",
                        "plp_ct_CartonRottenSmall",
                        "plp_ct_CartonLightFlat",
                        "plp_ct_CartonDarkFlat",
                        "plp_ct_CartonRottenFlat",
                        "Exile_Container_Storagecrate",
                        "plp_ct_WoodBoxLightTiny",
                        "plp_ct_WoodBoxLightSmall",
                        "plp_ct_WoodBoxLightMedium",
                        "Land_MetalCase_01_medium_F",
                        "plp_ct_MultiboxUtilOrange",
                        "plp_ct_MultiboxColOrange",
                        "Land_PlasticCase_01_small_F",
                        "Land_PlasticCase_01_large_F",
                        "Land_MetalCase_01_small_F",
                        "plp_ct_ToolboxRedDirty",
                        "plp_ct_ToolboxBlackDirty"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    if (_lootTableName == "Radiation") then
                    {
                    _crate = selectRandom [
                        "plp_ct_FootlockerYellow",
                        "plp_ct_FootlockerRed",
                        "plp_ct_FootlockerGreen",
                        "plp_ct_FootlockerBrown",
                        "plp_ct_MilBoxBigBlack",
                        "plp_ct_WeathCrateBigGreen",
                        "plp_ct_WeathCrateMediumGreen",
                        "plp_ct_MultiboxUtilOlive",
                        "plp_ct_MilBoxMediumBlack",
                        "plp_ct_MilBoxLongBlack"
                    ],
                    
                    _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "NONE"];
                    clearWeaponCargoGlobal _lootHolder; // empty crate
                    clearMagazineCargoGlobal _lootHolder; // empty crate
                    clearItemCargoGlobal _lootHolder; // empty crate
                    clearBackpackCargoGlobal _lootHolder; // empty crate
                    
                    };
                    
                }
                else
                {
                    _loot = createVehicle ["LootWeaponHolder", _lootPosition, [], 0.2, "CAN_COLLIDE"];
                   _loot attachTo [_lootHolder, [0,0,-0.2]];
                };
            _lootHolder setDir (random 360);
            _lootHolder setPosATL _lootPosition;
            _lootHolder setVariable ["ExileSpawnedAt", time];
            _lootWeaponHolderNetIDs pushBack (netId _lootHolder);
            };
            _cargoType = _itemClassName call ExileClient_util_cargo_getType;
            switch (_cargoType) do
            {
                case 1:     
                {
                    if (_itemClassName isEqualTo "Exile_Item_MountainDupe") then
                    {
                        _lootHolder addMagazineCargoGlobal [_itemClassName, 2];
                    }
                    else
                    {
                        _lootHolder addMagazineCargoGlobal [_itemClassName, 1];
                    };
                };
                case 3:     
                {
                    _lootHolder addBackpackCargoGlobal [_itemClassName, 1];
                };
                case 2:     
                {
                    _lootHolder addWeaponCargoGlobal [_itemClassName, 1];
                    if !(_itemClassName isKindOf ["Exile_Melee_Abstract", configFile >> "CfgWeapons"]) then
                    {
                        _magazineClassNames = getArray(configFile >> "CfgWeapons" >> _itemClassName >> "magazines");
                        if (count(_magazineClassNames) > 0) then
                        {
                            _magazineClassName = selectRandom _magazineClassNames;
                            _numberOfMagazines = 2 + floor(random 2);
                            _lootHolder addMagazineCargoGlobal [_magazineClassName, _numberOfMagazines];
                            _spawnedItemClassNames pushBack _magazineClassName;
                        };
                    };
                    _numberOfItemsToSpawn = -1;
                };
                default
                {
                    _lootHolder addItemCargoGlobal [_itemClassName, 1];
                };
            };
            _spawnedItemClassNames pushBack _itemClassName;
        };
    };
}
forEach _lootPositions;
_building setVariable ["ExileLootWeaponHolderNetIDs", _lootWeaponHolderNetIDs];
ExileServerBuildingNetIdsWithLoot pushBack (netId _building);

 

Share this post


Link to post
Share on other sites
Advertisement

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.