Jump to content
johnnyboy

[SOLVED] get 3D positionof doors for building

Recommended Posts

I googled the crap out of this and couldn't find an answer.  How do I get the ASL positions of doors for a building?

 

The code below correctly finds all the door selections for the house.  But it does not place a helper object at the physical position of the door.

_house = nearestBuilding getMarkerPos "mrkBldg1";
_doors = [];
{
	if (_x find "door" >= 0 and _x find "handle" < 0) then
	{
		_doors pushback _x;
		_ball = "Sign_Arrow_Cyan_F" createVehicleLocal [0,0,0];
		_ball attachTo [_house,[0,0,0],_x];
	};
} forEach selectionNames _house;
hint str _doors;

Solved.  The code below creates a blue arrow on each house position the AI can move to. And creates a yellow arrow at each Door.

Spoiler

_house = nearestBuilding getMarkerPos "mrkBldg1";
house = _house;
_housePositions = _house buildingPos -1;
_housePosition = selectRandom _housePositions;
hint str selectionNames _house;;
{
	_arrow = "Sign_Arrow_Cyan_F" createVehicleLocal _x;
	_arrow setPosATL _x;
} foreach _housePositions;

_doors = [];
_doorPositions = [];
_worldPos = [];
_inModelPosition = [];
{
	if (_x find "door" >= 0 and _x find "handle" < 0) then
	{
		_doors pushBack _x;
		_inModelPosition = _house selectionPosition _x;
		//_doorPositions pushback _inModelPosition;
		hint str _inModelPosition;
		_arrow = "Sign_Arrow_Yellow_F" createVehicleLocal [0,0,0];
		_arrow setpos (_house modelToWorld _inModelPosition);
		_doorPositions pushback (getposatl _arrow);
	};
} forEach selectionNames _house;

 

 

  • Like 3
  • Thanks 1

Share this post


Link to post
Share on other sites
2 hours ago, froggyluv said:

Yo JDawg -Das Attorney has something on this from a ways back

Thanks much FrogMan, I dug out what I need from there (lots of good stuff in there actually).  I miss  @das attorney.  He was (and I'm sure still is) a cool guy.  Maybe he'll be back for Arma 4.

  • Like 2

Share this post


Link to post
Share on other sites

Wow. Is this the end of me having to manually scope out positions for my door booby traps? Can you get the orientation of each door as well as their position?

Share this post


Link to post
Share on other sites

I used something very similar to find door positions for my explosive breaching. I think the only difference is I adjusted the resulting position to suit my needs. Sorry I couldn't have helped sooner.

 

17 minutes ago, Tankbuster said:

Can you get the orientation of each door as well as their position?

 

Unfortunately this was something I couldn't get.

Share this post


Link to post
Share on other sites
3 minutes ago, beno_83au said:

I used something very similar to find door positions for my explosive breaching. I think the only difference is I adjusted the resulting position to suit my needs. Sorry I couldn't have helped sooner.

 

 

Unfortunately this was something I couldn't get.

Yes, I liked your breaching. It's one of the things I plan to use in my mission. @johnnyboy, were you able to get the direction?

  • Like 1

Share this post


Link to post
Share on other sites

I noticed this topic has been solved but maybe the Automated Doors scripts by Heeeere's Johnny! has some useful code as I believe it contains door positions for all buildings on Altis...

Spoiler

automatedDoors.sqf

 

scriptName "automatedDoors";
/*
    File:            automatedDoors.sqf
    Author:            Heeeere's Johnny!    <<< Please do not edit or remove this line. Thanks. >>>
    Version:        2.5
    Description:    For each player, it creates and removes triggers on nearby buildings which open the door if a player is close to it.
                    Must be executed server side.
                    If locations of type "Name" and with name prefix "doors" exist, door triggers will only be managed in these locations.
                    addActions to enable/disable this script's functionality solely for the player executing the action.
    Execution:        Any
    
    Parameters:
        0 ARRAY        _objects        (optional, default: ["all"]) defines the buildings to be taken into account by this script
                                    e.g. ["altis", "chernarus"] means, all buildings from Altis and Chernarus will be taken into account on every map
        1 BOOLEAN    _doorsStayOpen    (optional, default: false)
                                    if true, doors will never close automatically
                                    if false, they will close automatically if player doesn't disable it for himself
    
    Return:
        nothing
*/
#define DOOR_RADIUS_SMALL    3    //meters, radius of the trigger area for doors
#define DOOR_RADIUS_LARGE    6    //meters, radius of the trigger area for gates
#define SCAN_RADIUS            50    //meters, radius of the area around a player to be scanned for buildings on each loop
#define SCAN_SLEEP            10    //seconds, time between each scan
#define DOOR_TRIGGERS        "doorTriggers"    //used to setVariable on buildings, alter if in conflict with other scripts
#define USES_AUTO_DOORS        "usesAutomatedDoors"        //used to setVariable on player, alter if in conflict with other scripts
#define DOORS_STAY_OPEN        "automatedDoors_stayOpen"    //used to setVariable on player, alter if in conflict with other scripts
#define ID_ACTIONS            "automatedDoors_actions"    //used to setVariable on player, alter if in conflict with other scripts
#define HANDLE_REMOVE_ACTIONS    "automatedDoors_handleRemoveActions"    //used to setVariable on player, alter if in conflict with other scripts
#define LOCATION_SIDE        "automatedDoors_locationSide"    //used to setVariable on buildings, alter if in conflict with other scripts

#define VALID_MAPS            ["altis", "chernarus", "takistan", "zargabad", "utes"]

if !isServer exitWith {diag_log """Automated Doors"" may only run server side or in Singleplayer!";};
if (!isNil "scriptHandle_automatedDoors" && {!isNull scriptHandle_automatedDoors}) exitWith {
    diag_log "automatedDoors: Script invoked even though it's already running. Nothing happens.";
};

params [["_objects", toLower worldName, ["", []]], ["_doorsStayOpen", false, [true]]];

if ("STRING" == typeName _objects) then {
    switch true do {
        case ("all" == _objects): {
            _objects = VALID_MAPS;
        };
        case (toLower _objects in VALID_MAPS): {
            if ("stratis" == toLower _objects) then {
                _objects = ["Altis"];
            } else {
                _objects = [_objects];
            };
        };
        default {
            diag_log format ["automatedDoors: incorrect parameter ""%1""", _objects];
            _objects = VALID_MAPS;
        };
    };
} else {
    if (1 isEqualTo ({if !(toLower _x in VALID_MAPS) exitWith {1};} count _objects)) then {
        diag_log format ["automatedDoors: incorrect value(s) in ""%1""", _objects];
        _objects = VALID_MAPS;
    };
    
    if ([] isEqualTo _objects) then {
        _objects = VALID_MAPS;
    };
};

_fnc_addDoorActions =
{
    // _doorsStayOpen = _this select 0;
    _doorsStayOpen = param [0, player getVariable [DOORS_STAY_OPEN, false], [true]];
    
    _actionIds = [];
    _actionIds pushBack (player addAction ["Enable Automated doors", {player setVariable [USES_AUTO_DOORS, true, true];}, [], 0, false, true, "", format ["!(player getVariable ['%1', true])", USES_AUTO_DOORS]]);
    _actionIds pushBack (player addAction ["Disable Automated doors", {player setVariable [USES_AUTO_DOORS, false, true];}, [], 0, false, true, "", format ["player getVariable ['%1', true]", USES_AUTO_DOORS]]);
    
    if(!_doorsStayOpen) then    //only add these actions if doors are not already server side (globally) kept open
    {
        player setVariable [DOORS_STAY_OPEN, false, true];
        _actionIds pushBack (player addAction ["Keep doors open", {player setVariable [DOORS_STAY_OPEN, true, true];}, [], 0, false, true, "", format ["player getVariable ['%1', true] && {!(player getVariable '%2')}", USES_AUTO_DOORS, DOORS_STAY_OPEN]]);
        _actionIds pushBack (player addAction ["Don't keep doors open", {player setVariable [DOORS_STAY_OPEN, false, true];}, [], 0, false, true, "", format ["player getVariable ['%1', true] && {player getVariable '%2'}", USES_AUTO_DOORS, DOORS_STAY_OPEN]]);
    }
    else
    {
        player setVariable [DOORS_STAY_OPEN, true, true];
    };
    
    _fnc_removeAllActions =
    {
        {
            player removeAction _x;
        } forEach (player getVariable [ID_ACTIONS, []]);
        player setVariable [ID_ACTIONS, nil];
        terminate (player getVariable HANDLE_REMOVE_ACTIONS);
    };
    
    _actionIds pushBack (player addAction ["Perm. remove 'Automated Doors' actions", _fnc_removeAllActions, [], 0, false, true]);
    
    player setVariable [ID_ACTIONS, _actionIds];
    
    player setVariable
    [
        HANDLE_REMOVE_ACTIONS,
        _fnc_removeAllActions spawn
        {
            //avoid action removal before the script even started
            while {isNil "scriptHandle_automatedDoors" || {isNull scriptHandle_automatedDoors}} do {sleep 10;};
            while {!isNull scriptHandle_automatedDoors} do {sleep 10;};
            [] call _this;
        }
    ];
};

[
    [
        [_doorsStayOpen, _fnc_addDoorActions],
        {
            // _doorsStayOpen = _this select 0;
            _fnc_addActions = _this select 1;
            (_this select 0) call _fnc_addActions;
            player addEventHandler ["Respawn", _fnc_addActions];
        }
    ],
    "BIS_fnc_call", true, true, true
] call BIS_fnc_MP;

scriptHandle_automatedDoors = [_objects, _doorsStayOpen] spawn
{
    params [["_objects", [], [[]]], ["_doorsStayOpen", false, [true]]];
    
    _fnc_transformArray =    //Source: https://spideroak.com/browse/share/see/sqf/sqf/fn_transformArray/
    {
        params [["_thisArray", [], [[]]], ["_xLength", 0, [0]], ["_defaultValue", false]];
        
        // _thisArray        = _this select 0;
        if(_thisArray isEqualTo []) exitWith {diag_log "_fnc_transformArray: Passed array has no elements.";};
        // _xLength        = [_this, 1, 0, [0]] call BIS_fnc_param;
        // _defaultValue    = [_this, 2, false] call BIS_fnc_param;

        _transformedArray    = [];

        if(_xLength isEqualTo 0) then    //get size of largest sub array
        {
            {
                _xLengthNew = count _x;
                if(_xLengthNew > _xLength) then {_xLength = _xLengthNew;};
            } count _thisArray;
        };
        
        if(_xLength isEqualTo 0) exitWith {};    //empty sub array(s), nothing to transform here
        _xLength = _xLength - 1;
        
        for "_i" from 0 to _xLength do
        {
            _transformedArray pushBack [];
        };

        {
            _subArrayCount = 0;
            _subArrayCount =
            {
                (_transformedArray select _subArrayCount) pushBack (if(isNil "_x") then {_defaultValue} else {_x});
                _subArrayCount = _subArrayCount + 1;
                true
            } count _x;    //transform sub array as far as possible
            
            for "_i" from _subArrayCount to _xLength do    //fill up with default values if needed
            {
                0 = (_transformedArray select _i) pushBack _defaultValue;
            };
        } count _thisArray;

        _transformedArray
    };
    
    _fnc_findLast = {
        private ["_hayStackCount", "_hayStackTmpIndex", "_indexLast"];
        params [["_hayStack", [], ["", []]], "_needle"];

        _hayStackCount        = count _hayStack;
        _hayStackTmpIndex    = _hayStack find _needle;
        _indexLast            = -1;

        while {_hayStackTmpIndex > -1} do
        {
            _indexLast            = _indexLast + 1 + _hayStackTmpIndex;
            _hayStackTmp        = _hayStack select [_indexLast + 1, _hayStackCount];
            _hayStackTmpIndex    = _hayStackTmp find _needle;
        };

        _indexLast
    };
    
    _prefixLength = 0;
    if !(isMultiplayer && isServer) then {    //don't execute in Multiplayer on the server
        _isAddon = if (__FILE__ == "automatedDoors\automatedDoors.sqf") then {true} else {false};
        if !_isAddon then {    //only do this if script is not an addon
            _prefixLength = count str missionConfigFile - 15;
        };
    };
    
    //relative path to the folder where this file is in
    _path = (__FILE__ select [_prefixLength, ([__FILE__, "\"] call _fnc_findLast) - _prefixLength + 1]);
    
    _allBuildingDoors = [];
    {
        _fileName = format ["%1doors%2.sqf", _path, _x];
        diag_log format ["_fileName = %1", _fileName];
        try {
            _doors = call compile preprocessFileLineNumbers _fileName;
            if (isNil "_doors") then {
                diag_log format ["automatedDoors: File ""%1"" does not exist.", _fileName];
            } else {
                _doors = _doors - _allBuildingDoors;
                _allBuildingDoors append _doors;
            };
        } catch {
            diag_log format ["automatedDoors: Processing file ""%1"" threw an exception: %2.", _fileName, _exception];
        };
    } forEach _objects;
    
    if ([] isEqualTo _allBuildingDoors) exitWith {diag_log "automatedDoors: No buildings with doors found.";};
    
    _allBuildingDoors = [_allBuildingDoors, 3, DOOR_RADIUS_SMALL] call _fnc_transformArray;
    
    _mapRadius = worldSize / 2;
    _mapCenter = [_mapRadius, _mapRadius];
    
    _fnc_createTriggerStatements = {};
    if(_doorsStayOpen) then
    {
        _fnc_createTriggerStatements =
        {
            if(typeName _doorName isEqualTo "ARRAY") then
            {
                _statementActivation = "_building = thisTrigger getVariable 'building';";
                
                if(isNil "_isTwisted") then
                {
                    {
                        _statementActivation = format ["%1_building animate ['%2', 1];", _statementActivation, _x];
                    } count _doorName;
                }
                else
                {
                    {
                        if(_isTwisted select _forEachIndex) then
                        {
                            _statementActivation = format ["%1_building animate ['%2', 0];", _statementActivation, _x];
                        }
                        else
                        {
                            _statementActivation = format ["%1_building animate ['%2', 1];", _statementActivation, _x];
                        };
                    } forEach _doorName;
                };
            }
            else
            {
                if(isNil "_isTwisted") then
                {
                    _statementActivation = format ["(thisTrigger getVariable 'building') animate ['%1', 1];", _doorName];
                }
                else
                {
                    _statementActivation = format ["(thisTrigger getVariable 'building') animate ['%1', 0];", _doorName];
                };
            };
        };
    }
    else
    {
        _fnc_createTriggerStatements =
        {
            _statementDeactivation    = format [
            "
                _nearUnit = nearestObject [thisTrigger, 'Man'];
                _doorsStayOpenCustom = (isPlayer _nearUnit && _nearUnit getVariable ['%1', false]);
                
                if(!_doorsStayOpenCustom) then
                {
                    _building = thisTrigger getVariable 'building';
            ", DOORS_STAY_OPEN];
            
            if(typeName _doorName isEqualTo "ARRAY") then
            {
                _statementActivation    = "_building = thisTrigger getVariable 'building';";
                
                if(isNil "_isTwisted") then
                {
                    {
                        _statementActivation    = format ["%1_building animate ['%2', 1];", _statementActivation, _x];
                        _statementDeactivation    = format ["%1_building animate ['%2', 0];", _statementDeactivation, _x];
                    } count _doorName;
                }
                else
                {
                    {
                        if(_isTwisted select _forEachIndex) then
                        {
                            _statementActivation    = format ["%1_building animate ['%2', 0];", _statementActivation, _x];
                            _statementDeactivation    = format ["%1_building animate ['%2', 1];", _statementDeactivation, _x];
                        }
                        else
                        {
                            _statementActivation    = format ["%1_building animate ['%2', 1];", _statementActivation, _x];
                            _statementDeactivation    = format ["%1_building animate ['%2', 0];", _statementDeactivation, _x];
                        };
                    } forEach _doorName;
                };
            }
            else
            {
                if(isNil "_isTwisted") then
                {
                    _statementActivation    = format ["(thisTrigger getVariable 'building') animate ['%1', 1];", _doorName];
                    _statementDeactivation    = format ["%1_building animate ['%2', 0];", _statementDeactivation, _doorName];
                }
                else
                {
                    _statementActivation    = format ["(thisTrigger getVariable 'building') animate ['%1', 0];", _doorName];
                    _statementDeactivation    = format ["%1_building animate ['%2', 1];", _statementDeactivation, _doorName];
                };
            };
            
            _statementDeactivation = _statementDeactivation + "};";
        };
    };
    
    _fnc_createDoorTriggers =
    {
        private ["_allDoorTriggers"];        
        params ["_building", ["_buildingDoors", [], [[]]], ["_triggerRadius", DOOR_RADIUS_SMALL, [0]]];
        
        
        _allDoorTriggers = [];
        _sideStatement = format ["{side _x isEqualTo (_building getVariable ['%1', side _x])} &&", LOCATION_SIDE];
        
        {
            //_x == door(s)
            _doorName    = _x select 1;
            _isTwisted    = _x select 2;
            
            _states = [1, 0];
            _open = 1;
            _close = 0;
            
            _statementActivation = "";
            _statementDeactivation = "";
            
            [] call _fnc_createTriggerStatements;
            
            _position = _building modelToWorld (_x select 0);
            
            _doorTrigger = createTrigger ["EmptyDetector", _position];
            _doorTrigger setTriggerArea [_triggerRadius, _triggerRadius, 0, false];
            _doorTrigger setTriggerActivation ["ANY", "PRESENT", true];
            _doorTrigger setVariable ["building", _building];
            _doorTrigger setVariable ["position", _position];
            _locationStatement = "";
            
            _doorTrigger setTriggerStatements
            [
                format
                ["
                    isServer &&
                    {
                        if(isNull scriptHandle_automatedDoors) then
                        {
                            deleteVehicle thisTrigger;
                        }
                        else {true}
                    } &&
                    {
                        _building = thisTrigger getVariable 'building';
                        this &&
                        {
                            if(
                                {
                                    comment 'if isPlayer && hasCorrectSide && usesAutoDoors && isOnTriggerHeight';
                                    if
                                    (
                                        isPlayer _x && %3 {_x getVariable ['%1', true]} &&
                                        {
                                            comment 'Height difference between player position and original trigger position is less than 1 meter';
                                            (abs (((getPosATL _x) select 2) - ((thisTrigger getVariable 'position') select 2))) < 1
                                        }
                                    ) exitWith {1}
                                } count thisList isEqualTo 1
                            ) then {true} else {false}
                        }
                    }",
                    USES_AUTO_DOORS, DOOR_SPHERES, _sideStatement
                ],
                _statementActivation,
                _statementDeactivation
            ];
            
            _allDoorTriggers pushBack _doorTrigger;
        } forEach _buildingDoors;
        
        _building setVariable [DOOR_TRIGGERS, _allDoorTriggers];
    };
    
    _fnc_removeDoorTriggers =
    {
        // _building    = _this;
        
        {
            deleteVehicle _x;
        } count (_this getVariable [DOOR_TRIGGERS, []]);
        
        _this setVariable [DOOR_TRIGGERS, nil];
        _this setVariable [LOCATION_SIDE, nil];
    };
    
    _allBuildingClassNames    = _allBuildingDoors select 0;
    _allDoorPositions        = _allBuildingDoors select 1;
    _allRadius                = _allBuildingDoors select 2;
    _allNearestBuildingsOld = [];
    _allNearestBuildingsNew = [];
    
    while {true} do
    {
        _allLocations = [];
        
        {
            if(0 isEqualTo ((name _x) find "doors")) then
            {
                0 = _allLocations pushBack _x;
            };
        } count (nearestLocations [_mapCenter, ["Name"], _mapRadius * 1.2]);
        
        if([] isEqualTo _allLocations) then    //take into account all buildings
        {
            {
                //_x == player
                0 = {
                    _building = _x;
                    _building setVariable [LOCATION_SIDE, nil];    //remove locationSide from building (if exists)
                    if !(_building in _allNearestBuildingsNew) then
                    {
                        0 = _allNearestBuildingsNew pushBack _building;
                    };
                } count (nearestObjects [_x, ["House", "Cargo_base_F", "Wall_F"], SCAN_RADIUS]);
            } count allPlayers;
        }
        else
        {
            {
                //_x == player
                0 = {
                    //_x == building
                    if !(_x in _allNearestBuildingsNew) then
                    {
                        _building = _x;
                        _building setVariable [LOCATION_SIDE, nil];    //remove locationSide from building (if exists)
                        0 = {
                            //_x == location
                            if(getPosATL _building in _x) exitWith    //take into account only buildings which are in respective locations
                            {
                                _locationSide = _x getVariable LOCATION_SIDE;    //get side from location
                                if(!isNil "_locationSide") then
                                {
                                    _building setVariable [LOCATION_SIDE, _locationSide];    //set side on building
                                };
                                
                                0 = _allNearestBuildingsNew pushBack _building;
                            };
                        } count _allLocations;
                    };
                } count (nearestObjects [_x, ["House", "Cargo_base_F", "Wall_F"], SCAN_RADIUS]);
            } count allPlayers;
        };
        
        {
            _x call _fnc_removeDoorTriggers;
        } count (_allNearestBuildingsOld - _allNearestBuildingsNew);
        
        {
            _buildingIndex    = _allBuildingClassNames find typeOf _x;
            if(-1 != _buildingIndex) then
            {
                [_x, _allDoorPositions select _buildingIndex, _allRadius select _buildingIndex] call _fnc_createDoorTriggers;
            };
        } count (_allNearestBuildingsNew - _allNearestBuildingsOld);
        
        _allNearestBuildingsOld = _allNearestBuildingsNew;
        _allNearestBuildingsNew = [];
        
        sleep SCAN_SLEEP;
    };
};
publicVariable "scriptHandle_automatedDoors";
 

Spoiler

doorsAltis.sqf

 

/*
    One array per class name:
    (e.g. "Land_i_House_Big_01_V1_F" and "Land_i_House_Big_01_V2_F" are two different class names!)
    [
        "object_className",
        [
            [doorPosition, "doorName1", isTwisted],    //one door
            OR
            [doorPosition, ["doorName1", "doorName2"], [is1Twisted, is2Twisted]],    //multiple doors, e.g. slider doors
            ...
        ],
        radius    //distance at which the door should open
    ]
*/
#define DOOR_RADIUS_LARGE    6    //meters, radius of the trigger area for gates

[
    [
        "Land_Offices_01_V1_F",
        [
            [[10.4929,-7.65356,-7.05899], ["Door_1_rot", "Door_2_rot"]],
            [[11.2625,0.230713,-7.05899], "Door_3_rot"],
            [[7.92407,6.08911,-7.05899], "Door_4_rot"],
            [[-14.842,8.42163,-7.05899], "Door_5_rot"],
            [[6.05762,-0.0559082,4.66484], "Door_6_rot"],
            [[7.82715,-5.61768,4.66477], "Door_7_rot"]
        ]
    ],
    [
        "Land_Hospital_main_F",
        [
            [[12.1914,19.8083,-8.00933], "Door_1_rot"],
            [[2.77881,15.8291,-8.01416], ["Door_2A_move", "Door_2B_move"]],
            [[2.89697,7.51416,-8.01557], ["Door_3A_move", "Door_3B_move"]],
            [[-4.16626,-7.84277,-8.01557], ["Door_4A_move", "Door_4B_move"]],
            [[-11.3657,-18.49,-8.01557], "Door_5_rot"]
        ]
    ],
    ["Land_Hospital_side1_F",    [[[4.08276,3.30518,-7.89348], "Door_1_rot"]]],
    ["Land_Hospital_side2_F",    [[[-8.84106,-7.20435,-8.10451], "Door_1_rot"]]],
    ["Land_LightHouse_F",        [[[-0.0231934,-0.757324,-11.0989], "Door_1_rot"]]],
    ["Land_i_Addon_02_V1_F",    [[[2.5481,-0.521973,0.112265], "Door_1_rot"]]],
    ["Land_i_Addon_02_b_white_F",    [[[2.5481,-0.521973,0.112265], "Door_1_rot"]]],
    
    #define LAND_I_GARAGE [[[5.37183,1.53638,-0.0974813], "Door_1_rot"]]
    ["Land_i_Garage_V1_F",        LAND_I_GARAGE],
    ["Land_i_Garage_V2_F",        LAND_I_GARAGE],
    
    #define LAND_I_HOUSE_BIG_01 [ \
        [[-1.90527,-6.00586,-2.54993], "Door_1_rot"], \
        [[4.86328,5.58179,-2.56493], "Door_2_rot"], \
        [[-1.31348,2.95703,0.855067], "Door_3_rot"]]
    ["Land_i_House_Big_01_V1_F",        LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_V1_dam_F",    LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_V2_F",        LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_V2_dam_F",    LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_V3_F",        LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_V3_dam_F",    LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_b_blue_F",    LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_b_pink_F",    LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_b_whiteblue_F",    LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_b_white_F",    LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_b_brown_F",    LAND_I_HOUSE_BIG_01],
    ["Land_i_House_Big_01_b_yellow_F",    LAND_I_HOUSE_BIG_01], 
    
    #define LAND_I_HOUSE_BIG_02 [ \
        [[-2.89819,-4.43188,-2.62094], "Door_1_rot"], \
        [[-1.39063,-0.484131,-2.56094], "Door_2_rot"], \
        [[0.14624,5.36157,-2.51594], "Door_3_rot"], \
        [[-2.92188,-4.29346,0.866564], "Door_4_rot"], \
        [[-1.38965,-0.560303,0.866564], "Door_5_rot"], \
        [[-2.85498,5.31714,0.881564], "Door_6_rot"]]
    ["Land_i_House_Big_02_V1_F",        LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_V1_dam_F",    LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_V2_F",        LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_V2_dam_F",    LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_V3_F",        LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_V3_dam_F",    LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_b_blue_F",    LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_b_pink_F",    LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_b_whiteblue_F",    LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_b_white_F",    LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_b_brown_F",    LAND_I_HOUSE_BIG_02],
    ["Land_i_House_Big_02_b_yellow_F",    LAND_I_HOUSE_BIG_02],
    
    #define LAND_I_SHOP_01 [ \
        [[1.24316,-2.60669,-2.73571], "Door_1_rot"], \
        [[3.11353,-2.49414,-2.73571], "Door_2_rot"], \
        [[2.31201,7.25073,-2.71734], "Door_3_rot"], \
        [[-0.627441,5.03613,1.10916], "Door_4_rot"], \
        [[-0.587402,-2.53345,1.14653], "Door_5_rot"]]
    ["Land_i_Shop_01_V1_F",        LAND_I_SHOP_01],
    ["Land_i_Shop_01_V1_dam_F",    LAND_I_SHOP_01],
    ["Land_i_Shop_01_V2_F",        LAND_I_SHOP_01],
    ["Land_i_Shop_01_V2_dam_F",    LAND_I_SHOP_01],
    ["Land_i_Shop_01_V3_F",        LAND_I_SHOP_01],
    ["Land_i_Shop_01_V3_dam_F",    LAND_I_SHOP_01],
    
    #define LAND_I_SHOP_02 [ \
        [[-5.83984,-3.22119,-2.7151], "Door_1_rot"], \
        [[-2.44092,1.23584,-2.66855], "Door_2_rot"], \
        [[3.78369,0.0187988,1.27873], "Door_3_rot"], \
        [[-5.87939,-0.00195313,1.27032], "Door_4_rot"]]
    ["Land_i_Shop_02_V1_F",        LAND_I_SHOP_02],
    ["Land_i_Shop_02_V1_dam_F",    LAND_I_SHOP_02],
    ["Land_i_Shop_02_V2_F",        LAND_I_SHOP_02],
    ["Land_i_Shop_02_V2_dam_F",    LAND_I_SHOP_02],
    ["Land_i_Shop_02_V3_F",        LAND_I_SHOP_02],
    ["Land_i_Shop_02_V3_dam_F",    LAND_I_SHOP_02],
    ["Land_i_Shop_02_b_blue_F", LAND_I_SHOP_02], 
    ["Land_i_Shop_02_b_pink_F", LAND_I_SHOP_02],
    ["Land_i_Shop_02_b_whiteblue_F", LAND_I_SHOP_02],
    ["Land_i_Shop_02_b_white_F", LAND_I_SHOP_02],
    ["Land_i_Shop_02_b_brown_F", LAND_I_SHOP_02],
    ["Land_i_Shop_02_b_yellow_F", LAND_I_SHOP_02],

    
    #define LAND_I_HOUSE_SMALL_01 [ \
        [[3.07397,-4.56152,-1.03963], "Door_1_rot"], \
        [[1.68066,0.251465,-1.04106], "Door_2_rot"], \
        [[1.68311,3.03198,-1.0419], "Door_3_rot"], \
        [[-3.36792,4.9624,-1.03037], "Door_4_rot"]]
    ["Land_i_House_Small_01_V1_F",        LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_V1_dam_F",    LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_V2_F",        LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_V2_dam_F",    LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_V3_F",        LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_V3_dam_F",    LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_b_pink_F",  LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_b_blue_F",  LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_b_yellow_F",  LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_b_brown_F",  LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_b_white_F",  LAND_I_HOUSE_SMALL_01],
    ["Land_i_House_Small_01_b_whiteblue_F",  LAND_I_HOUSE_SMALL_01],
    
    #define LAND_I_HOUSE_SMALL_02 [ \
        [[-3.79077,-2.15088,-0.712922], "Door_1_rot"], \
        [[0.910156,1.71558,-0.702502], "Door_2_rot"]]
    ["Land_i_House_Small_02_V1_F",        LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_V1_dam_F",    LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_V2_F",        LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_V2_dam_F",    LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_V3_F",        LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_V3_dam_F",    LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_c_yellow_F",  LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_c_brown_F",  LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_c_white_F",  LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_c_whiteblue_F",  LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_c_pink_F",  LAND_I_HOUSE_SMALL_02],
    ["Land_i_House_Small_02_c_blue_F",  LAND_I_HOUSE_SMALL_02],
    
    #define LAND_I_HOUSE_SMALL_03 [ \
        [[0.439941,-2.56812,-0.338685], "Door_1_rot"], \
        [[3.85205,5.07227,-0.32163], "Door_2_rot"], \
        [[1.97925,-0.444824,-0.371629], "Door_3_rot"], \
        [[-1.06128,2.43042,-0.371629], "Door_4_rot"]]
    ["Land_i_House_Small_03_V1_F",        LAND_I_HOUSE_SMALL_03],
    ["Land_i_House_Small_03_V1_dam_F",    LAND_I_HOUSE_SMALL_03],
    
    ["Land_Slum_House01_F", [[[1.28857,-1.17969,-0.852837], "Door_1_rot"]]],
    [
        "Land_Slum_House02_F",
        [
            [[-0.00439453,-1.68872,-0.798102], "Door_1_rot"],
            [[-0.727051,2.77686,-0.805723], "Door_2_rot"]
        ]
    ],
    ["Land_Slum_House03_F", [[[2.82397,-0.945557,-0.901089], "Door_1_rot"]]],
    
    #define LAND_I_STONE_SHED [[[2.25366,-0.860107,-0.0762148], "Door_1_rot"]]
    ["Land_i_Stone_Shed_V1_F",    LAND_I_STONE_SHED],
    ["Land_i_Stone_Shed_V2_F",    LAND_I_STONE_SHED],
    ["Land_i_Stone_Shed_V3_F",    LAND_I_STONE_SHED],
    ["Land_i_Stone_Shed_01_c_white_F",  LAND_I_STONE_SHED],
    ["Land_i_Stone_Shed_01_c_raw_F",  LAND_I_STONE_SHED],
    ["Land_i_Stone_Shed_01_c_clay_F",  LAND_I_STONE_SHED],
    ["Land_i_Stone_Shed_01_b_white_F",  LAND_I_STONE_SHED],
    ["Land_i_Stone_Shed_01_b_raw_F",  LAND_I_STONE_SHED],
    ["Land_i_Stone_Shed_01_b_clay_F",  LAND_I_STONE_SHED],
    
    #define LAND_I_STONE_HOUSESMALL [ \
        [[6.87354,-1.26782,-0.595454], "Door_1_rot"], \
        [[-7.8418,-1.24561,-0.601124], "Door_2_rot"], \
        [[0.891113,1.81787,-0.622117], "Door_3_rot"]]
    ["Land_i_Stone_HouseSmall_V1_F",        LAND_I_STONE_HOUSESMALL],
    ["Land_i_Stone_HouseSmall_V1_dam_F",    LAND_I_STONE_HOUSESMALL],
    ["Land_i_Stone_HouseSmall_V2_F",        LAND_I_STONE_HOUSESMALL],
    ["Land_i_Stone_HouseSmall_V2_dam_F",    LAND_I_STONE_HOUSESMALL],
    ["Land_i_Stone_HouseSmall_V3_F",        LAND_I_STONE_HOUSESMALL],
    ["Land_i_Stone_HouseSmall_V3_dam_F",    LAND_I_STONE_HOUSESMALL],
    
    [
        "Land_Airport_left_F",
        [
            [[25.2932,-4.73755,-6.73733], "Door_1_rot"],
            [[14.6909,-4.79712,-6.73733], "Door_2_rot"],
            [[14.7954,11.5122,-6.73733], "Door_3_rot"],
            [[5,-3.72559,-6.73733], "Door_4_rot"],
            [[2.95825,-1.79639,-1.73733], "Door_5_rot"],
            [[-5.98804,-0.515381,-1.73733], "Door_6_rot"],
            [[-0.601807,-15.106,-6.73733], ["Door_7A_move", "Door_7B_move"]],
            [[-0.591797,15.1272,-6.73733], ["Door_8A_move", "Door_8B_move"]]
        ]
    ],
    [
        "Land_Airport_right_F",
        [
            [[-25.2656,-4.8042,-6.73733], "Door_1_rot"],
            [[-14.6499,-4.80078,-6.73733], "Door_2_rot"],
            [[-14.762,11.5735,-6.73733], "Door_3_rot"],
            [[-5.1748,-3.68457,-6.73733], "Door_4_rot"],
            [[-2.96436,-1.81738,-1.73733], "Door_5_rot"],
            [[5.98535,-0.398682,-1.73733], "Door_6_rot"],
            [[0.570068,-15.1599,-6.73733], ["Door_7A_move", "Door_7B_move"]],
            [[0.610596,15.3569,-6.73733], ["Door_8A_move", "Door_8B_move"]]
        ]
    ],
    [
        "Land_Airport_Tower_F",
        [
            [[1.32935,2.26733,-10.4415], "Door_1_rot"],
            [[-0.605469,0.817383,-1.44081], "Door_2_rot"]
        ]
    ],
    ["Land_Airport_Tower_dam_F", [[[2.31616,3.75049,-8.17514], "Door_1_rot"]]],
    
    #define LAND_CARGO20 [[[-2.96436,-0.0351563,-1.17787], ["Door_1_rot", "Door_2_rot"]]]
    ["Land_Cargo20_blue_F",            LAND_CARGO20],
    ["Land_Cargo20_brick_red_F",    LAND_CARGO20],
    ["Land_Cargo20_cyan_F",            LAND_CARGO20],
    ["Land_Cargo20_grey_F",            LAND_CARGO20],
    ["Land_Cargo20_light_blue_F",    LAND_CARGO20],
    ["Land_Cargo20_light_green_F",    LAND_CARGO20],
    ["Land_Cargo20_military_green_F",    LAND_CARGO20],
    ["Land_Cargo20_orange_F",        LAND_CARGO20],
    ["Land_Cargo20_red_F",            LAND_CARGO20],
    ["Land_Cargo20_sand_F",            LAND_CARGO20],
    ["Land_Cargo20_white_F",        LAND_CARGO20],
    ["Land_Cargo20_yellow_F",        LAND_CARGO20],
    
    #define LAND_CARGO40 [[[-6.00146,-0.034668,-1.18187], ["Door_1_rot", "Door_2_rot"]]]
    ["Land_Cargo40_blue_F",            LAND_CARGO40],
    ["Land_Cargo40_brick_red_F",    LAND_CARGO40],
    ["Land_Cargo40_cyan_F",            LAND_CARGO40],
    ["Land_Cargo40_grey_F",            LAND_CARGO40],
    ["Land_Cargo40_light_blue_F",    LAND_CARGO40],
    ["Land_Cargo40_light_green_F",    LAND_CARGO40],
    ["Land_Cargo40_military_green_F",    LAND_CARGO40],
    ["Land_Cargo40_orange_F",        LAND_CARGO40],
    ["Land_Cargo40_red_F",            LAND_CARGO40],
    ["Land_Cargo40_sand_F",            LAND_CARGO40],
    ["Land_Cargo40_white_F",        LAND_CARGO40],
    ["Land_Cargo40_yellow_F",        LAND_CARGO40],
    
    [
        "Land_CarService_F",
        [
            [[1.01733,-1.88135,-1.25606], "Door_1_rot"],
            [[-0.0632324,6.27026,-1.25606], "Door_2_rot"],
            [[3.3811,8.60718,-1.25606], "Door_3_rot"]
        ]
    ],
    [
        "Land_Factory_Main_F",
        [
            [[-10.9998,11.0737,-6.24667], "Door_1_rot"],
            [[-6.22217,8.29834,-6.27167], "Door_2_rot"]
        ]
    ],
    [
        "Land_FuelStation_Build_F",
        [
            [[0.00634766,-1.70264,-1.33598], "Door_1_rot"],
            [[1.52466,1.99561,-1.33611], "Door_2_rot"]
        ]
    ],
    [
        "Land_i_Shed_Ind_F",
        [
            [[-9.09351,5.95923,-1.40978], ["Door_1_rot", "Door_2_rot"]],
            [[-7.83813,-2.00854,-1.40978], "Door_3_rot"],
            [[-8.33643,2.46899,-1.40978], "Door_4_rot"],
            [[13.7107,-2.05518,-1.40978], ["Door_5_rot", "Door_6_rot"]]
        ]
    ],
    
    #define LAND_I_BARRACKS    [ \
        [[-5.51221,-6.75781,0.591874], "Door_1_rot"], \
        [[14.8027,0.0830078,0.605519], "Door_2_rot"], \
        [[9.50024,4.83301,0.589749], "Door_3_rot"], \
        [[-2.53955,4.82568,0.602982], "Door_4_rot"], \
        [[-5.65137,4.85205,3.9395], "Door_5_rot"], \
        [[3.44189,4.83057,3.9395], "Door_6_rot"], \
        [[9.48315,4.83667,3.9395], "Door_7_rot"], \
        [[14.9141,0.171143,3.9395], "Door_8_rot"], \
        [[-11.104,-0.907227,0.60552], "Door_9_rot"], \
        [[-8.74707,1.06201,0.60552], "Door_10_rot"], \
        [[-0.400879,1.05518,0.60552], "Door_11_rot"], \
        [[3.57227,-0.93335,0.60552], "Door_12_rot"], \
        [[6.35474,1.09619,0.60552], "Door_13_rot"], \
        [[10.3669,1.06982,0.60552], "Door_14_rot"], \
        [[13.2195,-0.918701,0.60552], "Door_15_rot"], \
        [[-11.1819,-0.935547,3.9395], "Door_16_rot"], \
        [[-8.76489,1.08472,3.9395], "Door_17_rot"], \
        [[-0.413574,1.04199,3.9395], "Door_18_rot"], \
        [[3.58984,-0.92334,3.9395], "Door_19_rot"], \
        [[6.35059,1.04834,3.9395], "Door_20_rot"], \
        [[10.3633,1.11963,3.9395], "Door_21_rot"], \
        [[13.2368,-0.935303,3.9395], "Door_22_rot"]]
    ["Land_i_Barracks_V1_F",        LAND_I_BARRACKS],
    ["Land_i_Barracks_V2_F",        LAND_I_BARRACKS],
    
    #define LAND_I_BARRACKS_DAM [ \
        [[-7.76221,-5.75781,-1.891874], "Door_1_rot"], \
        [[12.5527,1.1530078,-1.905519], "Door_2_rot"], \
        [[7.25024,5.83301,-1.889749], "Door_3_rot"], \
        [[-4.78955,5.82568,-1.902982], "Door_4_rot"], \
        [[-7.90137,5.85205,1.4395], "Door_5_rot"], \
        [[1.31189,5.83057,1.4395], "Door_6_rot"], \
        [[7.23315,5.83667,1.4395], "Door_7_rot"], \
        [[12.6641,1.171143,1.4395], "Door_8_rot"], \
        [[-13.354,0.107227,-1.90552], "Door_9_rot"], \
        [[-10.99707,2.06201,-1.90552], "Door_10_rot"], \
        [[-2.650879,2.05518,-1.90552], "Door_11_rot"], \
        [[1.32227,0.13335,-1.90552], "Door_12_rot"], \
        [[4.10474,2.09619,-1.90552], "Door_13_rot"], \
        [[8.1169,2.06982,-1.90552], "Door_14_rot"], \
        [[10.9695,0.118701,-1.90552], "Door_15_rot"], \
        [[-13.4319,0.135547,1.4395], "Door_16_rot"], \
        [[-11.01489,2.08472,1.4395], "Door_17_rot"], \
        [[-2.663574,2.04199,1.4395], "Door_18_rot"], \
        [[1.33984,0.12334,1.4395], "Door_19_rot"], \
        [[4.10059,2.04834,1.4395], "Door_20_rot"], \
        [[8.1133,2.11963,1.4395], "Door_21_rot"], \
        [[10.9868,0.135303,1.4395], "Door_22_rot"]]
    ["Land_i_Barracks_V1_dam_F",    LAND_I_BARRACKS_DAM],
    ["Land_i_Barracks_V2_dam_F",    LAND_I_BARRACKS_DAM],
    
    [
        "Land_u_Barracks_V2_F",
        [
            [[-9.01221,-5.75781,-1.891874], "Door_1_rot"],
            [[11.3027,1.1530078,-1.905519], "Door_2_rot"],
            [[6.00024,5.83301,-1.889749], "Door_3_rot"],
            [[-6.03955,5.82568,-1.902982], "Door_4_rot"],
            [[-9.15137,5.85205,1.4395], "Door_5_rot"],
            [[0.06189,5.83057,1.4395], "Door_6_rot"],
            [[5.98315,5.83667,1.4395], "Door_7_rot"],
            [[11.4141,1.171143,1.4395], "Door_8_rot"],
            [[-14.604,0.107227,-1.90552], "Door_9_rot"],
            [[-12.24707,2.06201,-1.90552], "Door_10_rot"],
            [[-3.900879,2.05518,-1.90552], "Door_11_rot"],
            [[0.07227,0.13335,-1.90552], "Door_12_rot"],
            [[2.85474,2.09619,-1.90552], "Door_13_rot"],
            [[6.8669,2.06982,-1.90552], "Door_14_rot"],
            [[9.7195,0.118701,-1.90552], "Door_15_rot"],
            [[-14.6819,0.135547,1.4395], "Door_16_rot"],
            [[-12.26489,2.08472,1.4395], "Door_17_rot"],
            [[-3.913574,2.04199,1.4395], "Door_18_rot"],
            [[0.08984,0.12334,1.4395], "Door_19_rot"],
            [[2.85059,2.04834,1.4395], "Door_20_rot"],
            [[6.8633,2.11963,1.4395], "Door_21_rot"],
            [[9.7368,0.135303,1.4395], "Door_22_rot"]
        ]
    ],
    
    #define LAND_CARGO_HOUSE [[[0.730957,-0.200195,-0.0957494], "Door_1_rot"]]
    ["Land_Cargo_House_V1_F",    LAND_CARGO_HOUSE],
    ["Land_Cargo_House_V2_F",    LAND_CARGO_HOUSE],
    ["Land_Cargo_House_V3_F",    LAND_CARGO_HOUSE],
    
    #define LAND_CARGO_HQ [ \
        [[-4.37964,-2.2937,-3.27229], "Door_1_rot"], \
        [[2.41895,-3.01953,-0.672286], "Door_2_rot"]]
    ["Land_Cargo_HQ_V1_F",    LAND_CARGO_HQ],
    ["Land_Cargo_HQ_V2_F",    LAND_CARGO_HQ],
    ["Land_Cargo_HQ_V3_F",    LAND_CARGO_HQ],
    
    #define LAND_CARGO_TOWER [ \
        [[-0.821289,-1.93799,5.07987], "Door_1_rot"], \
        [[3.87866,0.433105,-0.120125], "Door_2_rot"], \
        [[0.132813,4.23706,-0.120125], "Door_3_rot"]]
    ["Land_Cargo_Tower_V1_F",        LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V1_No1_F",    LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V1_No2_F",    LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V1_No3_F",    LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V1_No4_F",    LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V1_No5_F",    LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V1_No6_F",    LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V1_No7_F",    LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V2_F",        LAND_CARGO_TOWER],
    ["Land_Cargo_Tower_V3_F",        LAND_CARGO_TOWER],
    ["Land_Medevac_house_V1_F",        LAND_CARGO_HOUSE],
    ["Land_Medevac_HQ_V1_F",        LAND_CARGO_HQ],
    
    [
        "Land_MilOffices_V1_F",
        [
            [[-12.0823,11.6567,-2.86676], "Door_1_rot"],
            [[4.13403,-6.05859,-2.86676], "Door_2_rot"],
            [[13.8674,-5.98828,-2.86676], "Door_3_rot"],
            [[7.88184,4.12891,-2.86676], "Door_4_rot"],
            [[-12.8137,-1.5249,-2.86676], "Door_5_rot"],
            [[-10.9253,-2.80322,-2.86676], "Door_6_rot"],
            [[10.5718,-4.19482,-2.86676], "Door_7_rot"],
            [[10.5447,-2,-2.86676], "Door_8_rot"]
        ]
    ],
    [
        "Land_Dome_Big_F",
        [
            [[23.2537,-0.234375,-10.1811], ["Door_1A_move", "Door_1B_move"]],
            [[-0.617188,-24.4429,-10.1811], "Door_2_rot"],
            [[-0.540771,24.0342,-10.1811], "Door_3_rot"]
        ]
    ],
    [
        "Land_Dome_Small_F",
        [
            [[0.00561523,14.1118,-6.93302], ["Door_1A_rot", "Door_1B_rot"]],
            [[-0.0483398,-14.0713,-6.93302], ["Door_2A_rot", "Door_2B_rot"]]
        ]
    ],
    ["Land_Research_house_V1_F",LAND_CARGO_HOUSE],
    ["Land_Research_HQ_F",        LAND_CARGO_HQ],
    ["Land_BarGate_F",            [[[-0.271729,-0.0668945,-4.04884], "Door_1_rot"]], DOOR_RADIUS_LARGE],
    ["Land_City_Gate_F",        [[[-0.0090332,-0.165283,-0.500221], ["Door_1_rot", "Door_2_rot"]]], DOOR_RADIUS_LARGE],
    ["Land_WallCity_01_gate_yellow_F",        [[[-0.0090332,-0.165283,-0.500221], ["Door_1_rot", "Door_2_rot"]]], DOOR_RADIUS_LARGE],
    ["Land_WallCity_01_gate_whiteblue_F",        [[[-0.0090332,-0.165283,-0.500221], ["Door_1_rot", "Door_2_rot"]]], DOOR_RADIUS_LARGE],    
    ["Land_WallCity_01_gate_pink_F",        [[[-0.0090332,-0.165283,-0.500221], ["Door_1_rot", "Door_2_rot"]]], DOOR_RADIUS_LARGE],    
    ["Land_WallCity_01_gate_grey_F",        [[[-0.0090332,-0.165283,-0.500221], ["Door_1_rot", "Door_2_rot"]]], DOOR_RADIUS_LARGE],    
    ["Land_WallCity_01_gate_blue_F",        [[[-0.0090332,-0.165283,-0.500221], ["Door_1_rot", "Door_2_rot"]]], DOOR_RADIUS_LARGE],        
    ["Land_Net_Fence_Gate_F",    [[[0.0195313,0.0183105,-1.03606], ["Door_1_rot", "Door_2_rot"]]], DOOR_RADIUS_LARGE],
    ["Land_Stone_Gate_F",        [[[-0.0373535,0.165771,-0.506733], ["Door_1_rot", "Door_2_rot"]]], DOOR_RADIUS_LARGE],
    ["Land_Kiosk_blueking_F",    [[[-0.0341797,1.87793,-1.76589], "Door_1_rot"]]],
    ["Land_Kiosk_gyros_F",        [[[-0.00195313,1.88965,-1.97606], "Door_1_rot"]]],
    ["Land_Kiosk_papers_F",        [[[-0.00488281,1.88574,-1.97606], "Door_1_rot"]]],
    ["Land_Kiosk_redburger_F",    [[[-0.0217285,1.8623,-2.87051], "Door_1_rot"]]]
]
 

 

 

  • Like 1

Share this post


Link to post
Share on other sites
4 hours ago, Tankbuster said:

were you able to get the direction?

No, sadly I don't have direction.  Also the door position appears to be on the door jamb on handle side of door, so as Beno said, you need to adjust the position if you want someone standing in front of door.

  • Like 1

Share this post


Link to post
Share on other sites
5 hours ago, Tankbuster said:

Wow. Is this the end of me having to manually scope out positions for my door booby traps? Can you get the orientation of each door as well as their position?

I can't promising anything dude.  I'm just scratching the surface on this right now.  But I'll let you know if I discover something

 

4 hours ago, EO said:

I noticed this topic has been solved but maybe the Automated Doors scripts by Heeeere's Johnny! has some useful code as I believe it contains door positions for all buildings on Altis...

Holy crap EO.  He collected and hardcoded all the door positions.  That is a dedicated man.  Much like the brutal grunt work Phronk is doing with furniture I think.  For my little test I also want to collect position at base of stairs, stair landings and top of stairs.  That I hardcoded for my example.  But I'm not excited about doing that for all buildings.  Maybe we can draft some newbie to do that.  Start with ALL vanilla buildings + ALL CUP buildings, and have it done by tomorrow maggot!!!

  • Haha 3

Share this post


Link to post
Share on other sites

I think door orientation might be doable. Given that almost all of the buildings are 4 sided with right angle corners we can probably assume that doors (relative) North of the building centre are east west. Likewise doors that are east or west relative of the building centre are probably north-south orientated

  • Like 1

Share this post


Link to post
Share on other sites
29 minutes ago, johnnyboy said:

  For my little test I also want to collect position at base of stairs, stair landings and top of stairs.  That I hardcoded for my example.  But I'm not excited about doing that for all buildings. 

 

 Am I detecting Swat 4 like behaviour for stairwells..?

Share this post


Link to post
Share on other sites
24 minutes ago, froggyluv said:

 Am I detecting Swat 4 like behaviour for stairwells..?

A girl can dream... 🙂    I'm sure I will fail miserably, but I am toying with "aggressive ai clearing".  I have scripted point to point movement with passing in animation name.  I can force fire while moving.  Working on adding smooth turning to next point.

My hopes are:

  • If in aggressive mode, AI will shoot thru door before opening it.  Or shoot handle if locked.
  • Move quickly inside.  If aggressive, spray while moving.
  • If stacked, 1st guy enters further, 2nd guy follows but stops short of 1st guy position.  Hopefully both sweeping different arcs.  If aggressive, hose arc.
  • On stairs, may side step up if top of stairs open to right or left (cover potential threats instead of blindly moving straight up facing forward only).
  • On stairs, may toss grenade up if looking towards top of stairs (not landing)
  • Before entering doors, may toss grenade in first (and side-step to cover)
  • Call out "clear"

Problems:  

  • While forcing scripted animation move, AI can't acquire and shoot targets using normal AI.  I can force shooting while move, but that is only in direction of move.  But if you pause between scripted moves, their normal AI takes over and they can target and shoot on their own.  If that can be balanced somehow, it might work ok.
  • Incorporate smooth turning with moves.
  • Stop moves at correct points so don't ghost thru walls and objects.

If the above doesn't work the script will still be good for cutscenes, and scripted scenarios (Example:  street fight with lots of stationary cover objects (cars, barricades, dumpsters) - player attacks, and AI tactically retreats as they lose guys (move to next cover, walk backwards while firing, leap frog backward, sidestep strafing between cover, etc.  If properly mixed with normal AI enemy behaviour, and randomized a bit, it could spice things up and player would hopefully not notice the scripting).

  • Like 3

Share this post


Link to post
Share on other sites
1 hour ago, Tankbuster said:

I think door orientation might be doable. Given that almost all of the buildings are 4 sided with right angle corners we can probably assume that doors (relative) North of the building centre are east west. Likewise doors that are east or west relative of the building centre are probably north-south orientated

Good thinking.  I thought you were referring to which way doors open.  For external doors we can assume doors open inward.  For internal doors I don't know.

  • Like 1

Share this post


Link to post
Share on other sites
5 hours ago, johnnyboy said:

Good thinking.  I thought you were referring to which way doors open.  For external doors we can assume doors open inward.  For internal doors I don't know.

Oh I see, no I want to place tripwire mines across the door on the inside as a booby trap. My current solution is to manually work out position and orientation of doors in the most popular buildings, but this would mean I could do it in script.

  • Like 2

Share this post


Link to post
Share on other sites
27 minutes ago, Tankbuster said:

place tripwire mines across the door on the inside as a booby trap.

 

This is a feature of VCOM for the demolition expert infantry , maybe you should ask Genesis.

  • Like 1

Share this post


Link to post
Share on other sites
7 hours ago, johnnyboy said:

A girl can dream... 🙂    I'm sure I will fail miserably, but I am toying with "aggressive ai clearing".  I have scripted point to point movement with passing in animation name.  I can force fire while moving.  Working on adding smooth turning to next point.

My hopes are:

  • If in aggressive mode, AI will shoot thru door before opening it.  Or shoot handle if locked.
  • Move quickly inside.  If aggressive, spray while moving.
  • If stacked, 1st guy enters further, 2nd guy follows but stops short of 1st guy position.  Hopefully both sweeping different arcs.  If aggressive, hose arc.
  • On stairs, may side step up if top of stairs open to right or left (cover potential threats instead of blindly moving straight up facing forward only).
  • On stairs, may toss grenade up if looking towards top of stairs (not landing)
  • Before entering doors, may toss grenade in first (and side-step to cover)
  • Call out "clear"

Problems:  

  • While forcing scripted animation move, AI can't acquire and shoot targets using normal AI.  I can force shooting while move, but that is only in direction of move.  But if you pause between scripted moves, their normal AI takes over and they can target and shoot on their own.  If that can be balanced somehow, it might work ok.
  • Incorporate smooth turning with moves.
  • Stop moves at correct points so don't ghost thru walls and objects.

If the above doesn't work the script will still be good for cutscenes, and scripted scenarios (Example:  street fight with lots of stationary cover objects (cars, barricades, dumpsters) - player attacks, and AI tactically retreats as they lose guys (move to next cover, walk backwards while firing, leap frog backward, sidestep strafing between cover, etc.  If properly mixed with normal AI enemy behaviour, and randomized a bit, it could spice things up and player would hopefully not notice the scripting).

 

 Mother of God man thats the Mother Ship right there!!

 

Honestly feel this is the ONE area Arma's missing that would in a very real sense complete it. AI anticipating entrance/exit routes and working windows as well as gun positioning on stairs would be unreal. Couple that with preventing all the strange animation ghosting thru walls kinda problems (i know this is base engine level stuff) - and Arma is now at another level. Good luck brother grab some nootropics, 5 gallons of coffee, 3 cases of whiskey and bi-weekly asian massages for 'stress management' and you got it!

  • Haha 3

Share this post


Link to post
Share on other sites
8 hours ago, johnnyboy said:

A girl can dream... 🙂    I'm sure I will fail miserably, but I am toying with "aggressive ai clearing".  I have scripted point to point movement with passing in animation name.  I can force fire while moving.  Working on adding smooth turning to next point.

My hopes are:

  • If in aggressive mode, AI will shoot thru door before opening it.  Or shoot handle if locked.
  • Move quickly inside.  If aggressive, spray while moving.
  • If stacked, 1st guy enters further, 2nd guy follows but stops short of 1st guy position.  Hopefully both sweeping different arcs.  If aggressive, hose arc.
  • On stairs, may side step up if top of stairs open to right or left (cover potential threats instead of blindly moving straight up facing forward only).
  • On stairs, may toss grenade up if looking towards top of stairs (not landing)
  • Before entering doors, may toss grenade in first (and side-step to cover)
  • Call out "clear"

Problems:  

  • While forcing scripted animation move, AI can't acquire and shoot targets using normal AI.  I can force shooting while move, but that is only in direction of move.  But if you pause between scripted moves, their normal AI takes over and they can target and shoot on their own.  If that can be balanced somehow, it might work ok.
  • Incorporate smooth turning with moves.
  • Stop moves at correct points so don't ghost thru walls and objects

 

Please include alternate shoulder shooting for shoulder controlled weapons, alternate hands for hand guns, leaning (including from different positions), "pie'ing" a room (i.e. incrementally clearing it from outside the room), grenades into rooms on contact, high/low ready positions for weapons to avoid AI lasing everyone, ummmm, i could think of some more later, and have that by the end of the day, maggot. Gogogogogo

 

Ohhh, and try not to die attempting to get this all working. 

  • Haha 2

Share this post


Link to post
Share on other sites
1 hour ago, froggyluv said:

Honestly feel this is the ONE area Arma's missing that would in a very real sense complete it. AI anticipating entrance/exit routes and working windows as well as gun positioning on stairs would be unreal. Couple that with preventing all the strange animation ghosting thru walls kinda problems (i know this is base engine level stuff) - and Arma is now at another level. Good luck brother grab some nootropics, 5 gallons of coffee, 3 cases of whiskey and bi-weekly asian massages for 'stress management' and you got it!

 

1 hour ago, beno_83au said:

Please include alternate shoulder shooting for shoulder controlled weapons, alternate hands for hand guns, leaning (including from different positions), "pie'ing" a room (i.e. incrementally clearing it from outside the room), grenades into rooms on contact, high/low ready positions for weapons to avoid AI lasing everyone, ummmm, i could think of some more later, and have that by the end of the day, maggot. Gogogogogo

 

Ohhh, and try not to die attempting to get this all working. 

 

You boys are funny!  :rofl:

I never should have made that last post, lol.    Expectations are way too high!!!!  🦄s and 🌈s for all!!!    I'm already scaling back on auto-detecting the paths thru buildings, because doors and building positions are not a complete path.  I need line of sight to each place an AI would need to move in order to go around a corner or go upstairs, and those positions are missing.  Instead, I'm recording a series of positions by walking the building.  Then making a path based on the recorded positions.  If there are multiple entrances I can make multiple paths.  We will see how it goes.  Wish me luck!

  • Like 2

Share this post


Link to post
Share on other sites
33 minutes ago, johnnyboy said:

Wish me luck!

 

Good luck!

Share this post


Link to post
Share on other sites
Just now, froggyluv said:

No backsies Johnny -Let it be written, let it be Done!

No problemo, amigo. [...quits job...files divorce papers...scores some amphetamines..]

  • Haha 2

Share this post


Link to post
Share on other sites

Hey guys

On 4/10/2019 at 6:30 PM, beno_83au said:

Good luck!

 

On 4/10/2019 at 6:32 PM, froggyluv said:

No backsies Johnny

Hey guys, my first cut at this is actually showing some promise (and I still have a job and a wife!).  Check it out here: 

 

 

  • Like 3

Share this post


Link to post
Share on other sites
21 minutes ago, johnnyboy said:

(and I still have a job and a wife!)

 

You actually check?

  • Haha 1

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×