From 66fd2d6a0f75d692885b73e8fc94594c30ad48bd Mon Sep 17 00:00:00 2001 From: Zepheris Date: Sat, 3 Mar 2018 12:32:06 -0700 Subject: [PATCH] Added eXpochVectorBldg --- mpmissions/Exile.Altis.pbo | Bin 2826857 -> 2787729 bytes mpmissions/Exile.Altis/CfgExileCustomCode.cpp | 22 +- ...lient_construction_beginExistingObject.sqf | 49 ++ ...xileClient_construction_beginNewObject.sqf | 59 ++ .../ExileClient_construction_thread.sqf | 279 +++++++++ ...xileClient_gui_constructionMode_update.sqf | 40 ++ .../ExileClient_gui_hud_event_onKeyDown.sqf | 311 ++++++++++ .../ExileClient_gui_hud_event_onKeyUp.sqf | 572 ++++++++++++++++++ .../ExileClient_object_construction_move.sqf | 37 ++ .../ExileClient_util_world_canBuildHere.sqf | 113 ++++ mpmissions/Exile.Altis/init.sqf | 19 +- 11 files changed, 1486 insertions(+), 15 deletions(-) create mode 100644 mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_beginExistingObject.sqf create mode 100644 mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_beginNewObject.sqf create mode 100644 mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_thread.sqf create mode 100644 mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_constructionMode_update.sqf create mode 100644 mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_hud_event_onKeyDown.sqf create mode 100644 mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_hud_event_onKeyUp.sqf create mode 100644 mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_object_construction_move.sqf create mode 100644 mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_util_world_canBuildHere.sqf diff --git a/mpmissions/Exile.Altis.pbo b/mpmissions/Exile.Altis.pbo index 806dbdab06510d3959215449cf066a5de59ff6fd..dde84ccf3871ae59882c003e630fdf9108d5fec1 100644 GIT binary patch delta 393 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 'staticObject') == ExileClientConstructionObject" configClasses(configFile >> "CfgConstruction")) select 0; + _previewObjectClassName = getText(ExileClientConstructionConfig >> "previewObject"); + ExileClientConstructionSnapToObjectClassNames = (ExileClientConstructionConfig >> "SnapObjects") call Bis_fnc_getCfgSubClasses; + ExileClientConstructionProcess = 2; + ExileClientConstructionRotation = 0; + ExileClientConstructionObjectDisplayName = getText(configFile >> "CfgVehicles" >> _previewObjectClassName >> "displayName"); + ExileClientConstructionOffset = [0,5,0]; + DPBEAClientObjAttachedTo = player; + BuildVecYaw = 0;BuildVecPitch = 0;BuildVecRoll = 0; + ExileClientConstructionMode = 1; + ExileClientConstructionIsInSelectSnapObjectMode = true; + ExileClientConstructionSupportSnapMode = count(ExileClientConstructionSnapToObjectClassNames) > 0; + ExileClientConstructionCurrentSnapToObject = objNull; + { + player reveal _x; + } + forEach (player nearObjects ["Exile_Construction_Abstract_Static", 20]); + ["buildConstructionRequest", [_previewObjectClassName,ExileClientConstructionPosition]] call ExileClient_system_network_send; +}; +true \ No newline at end of file diff --git a/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_beginNewObject.sqf b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_beginNewObject.sqf new file mode 100644 index 0000000..d6509e4 --- /dev/null +++ b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_beginNewObject.sqf @@ -0,0 +1,59 @@ +/** + * ExileClient_construction_beginNewObject + * + * 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/. + * + eXpochClient_FREE_vectorBuilding + + Made for Anarchy, adapted to eXpoch and ported into Altis Life and Operation BlockHead by DirtySanchez + + and NOW EXILE WILL FEEL THE FREE VECTOR, go get a job sellers of scripts, this is a modding community. + Sharing is caring and douchebaggery is a bannable offense + + http://DonkeyPunch.INFO + */ + +private["_kitClassName","_previewObjectClassName"]; +_kitClassName = _this select 0; +ExileClientConstructionConfig = ("getText(_x >> 'kitMagazine') == _kitClassName" configClasses(configFile >> "CfgConstruction")) select 0; +_previewObjectClassName = getText(ExileClientConstructionConfig >> "previewObject"); +ExileClientConstructionSnapToObjectClassNames = (ExileClientConstructionConfig >> "SnapObjects") call Bis_fnc_getCfgSubClasses; +ExileClientConstructionProcess = 1; +ExileClientConstructionOffset = [0, 5, 0]; +ExileClientConstructionPosition = [0, 0, 0]; +DPBEAClientObjAttachedTo = player; +BuildVecYaw = 0;BuildVecPitch = 0;BuildVecRoll = 0; +ExileClientConstructionRotation = 0; +ExileClientConstructionKitClassName = _kitClassName; +ExileClientConstructionObjectDisplayName = getText(configFile >> "CfgVehicles" >> _previewObjectClassName >> "displayName"); +if (ExileClientPlayerIsInCombat) then +{ + ["ErrorTitleAndText", ["Construction aborted!", "You cannot build during a combat."]] call ExileClient_gui_toaster_addTemplateToast; +} +else +{ + ExileClientConstructionMode = 1; + ExileClientConstructionIsInSelectSnapObjectMode = true; + ExileClientConstructionSupportSnapMode = count(ExileClientConstructionSnapToObjectClassNames) > 0; + ExileClientConstructionCurrentSnapToObject = objNull; + ExileClientConstructionPosition = [getPosATL player, ExileClientConstructionOffset select 1, getDir player] call ExileClient_util_math_getPositionInDirection; + ExileClientConstructionPosition set[2, ExileClientConstructionOffset select 2]; + { + player reveal _x; + } + forEach (player nearObjects ["Exile_Construction_Abstract_Static", 20]); + if((count _this) < 2 )then + { + ["buildConstructionRequest", [_previewObjectClassName,ExileClientConstructionPosition]] call ExileClient_system_network_send; + } + else + { + ["buildTerritoryRequest", [_previewObjectClassName, (ASLtoAGL (ATLtoASL ExileClientConstructionPosition)),_this select 1,_this select 2]] call ExileClient_system_network_send; + }; +}; +true \ No newline at end of file diff --git a/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_thread.sqf b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_thread.sqf new file mode 100644 index 0000000..977f096 --- /dev/null +++ b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_thread.sqf @@ -0,0 +1,279 @@ +/** + * ExileClient_construction_thread + * + * 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/. + * + eXpochClient_FREE_vectorBuilding + + Made for Anarchy, adapted to eXpoch and ported into Altis Life and Operation BlockHead by DirtySanchez + + and NOW EXILE WILL FEEL THE FREE VECTOR, go get a job sellers of scripts, this is a modding community. + Sharing is caring and douchebaggery is a bannable offense + + http://DonkeyPunch.INFO + */ + +private["_boundingBox","_boundingBoxMinimum","_boundingBoxMaximum","_boundingBoxPointsTop","_boundingBoxPointsBottom","_objectColor","_materialColor","_simulatePhysics","_position","_rotation","_vectorDirection","_isFlag","_vectorUp","_potentionalSnapObject","_snapToClassName","_snapToConfig","_snapPosition","_possibleSnapPosition","_contactThreshold","_isBelowTerrain","_worldPosition","_isInAir","_numberOfContactsBottom","_startPosition","_endPosition","_newDirAndUp"]; +scriptName 'Exile Construction Thread'; +("ExileClientConstructionModeLayer" call BIS_fnc_rscLayer) cutRsc ["RscExileConstructionMode", "PLAIN", 1, false]; +ExileClientIsInConstructionMode = true; +ExileClientConstructionResult = 0; +ExileClientConstructionStartPosition = getPosASL player; +_boundingBox = boundingBoxReal ExileClientConstructionObject; +_boundingBoxMinimum = _boundingBox select 0; +_boundingBoxMaximum = _boundingBox select 1; +_boundingBoxPointsTop = +[ + [_boundingBoxMinimum select 0, _boundingBoxMinimum select 1, _boundingBoxMaximum select 2], + [_boundingBoxMinimum select 0, _boundingBoxMaximum select 1, _boundingBoxMaximum select 2], + [_boundingBoxMaximum select 0, _boundingBoxMinimum select 1, _boundingBoxMaximum select 2], + [_boundingBoxMaximum select 0, _boundingBoxMaximum select 1, _boundingBoxMaximum select 2] +]; +_boundingBoxPointsBottom = +[ + [_boundingBoxMinimum select 0, _boundingBoxMinimum select 1, _boundingBoxMinimum select 2], + [_boundingBoxMinimum select 0, _boundingBoxMaximum select 1, _boundingBoxMinimum select 2], + [_boundingBoxMaximum select 0, _boundingBoxMinimum select 1, _boundingBoxMinimum select 2], + [_boundingBoxMaximum select 0, _boundingBoxMaximum select 1, _boundingBoxMinimum select 2], + [0, 0, _boundingBoxMinimum select 2] +]; +ExileClientConstructionBoundingRadius = 1 + 0.5 * ([_boundingBoxMaximum select 0, _boundingBoxMaximum select 1, 0] distance [_boundingBoxMinimum select 0, _boundingBoxMinimum select 1, 0]); +ExileClientConstructionOffset set [1, 5 max ExileClientConstructionBoundingRadius]; +ExileClientConstructionVectorDirAndUp = [[0,0,0],[0,0,1]]; +ExileClientConstructionVectorPosASL = [0,0,0]; +BuildVecYaw = 0;BuildVecPitch = 0;BuildVecRoll = 0; +_objectColor = "#(argb,2,2,1)color(0.7,0.93,0,0.6,ca)"; +_materialColor = _objectColor; +_simulatePhysics = false; +_position = [0, 0, 0]; +_rotation = 0; +_vectorDirection = [0, 0, 0]; +_isFlag = ExileClientConstructionKitClassName isEqualTo "Exile_Item_Flag"; +if (_isFlag) then +{ + ExileClientConstructionModePhysx = false; +}; +[] call ExileClient_gui_constructionMode_update; +while {ExileClientConstructionResult isEqualTo 0} do +{ + if (ExileClientConstructionProcess isEqualTo 1) then + { + if !(ExileClientConstructionKitClassName in (magazines player)) then + { + ExileClientConstructionResult = 2; + }; + }; + if !(ExileClientConstructionLock) then + { + _vectorUp = [0, 0, 1]; + ExileClientConstructionCanPlaceObject = false; + switch (ExileClientConstructionMode) do + { + case 1: + { + if!(_isFlag)then{ + _position = ASLtoATL (AGLtoASL (player modelToWorld ExileClientConstructionOffset)); + _newDirAndUp = [[sin ((BuildVecYaw + (getDir player) + 360) % 360) * cos BuildVecPitch, cos ((BuildVecYaw + (getDir player) + 360) % 360) * cos BuildVecPitch, sin BuildVecPitch],[[ sin BuildVecRoll,-sin BuildVecPitch,cos BuildVecRoll * cos BuildVecPitch],-((BuildVecYaw + (getDir player) + 360) % 360)] call BIS_fnc_rotateVector2D]; + _vectorDirection = _newDirAndUp select 0; + _vectorUp = _newDirAndUp select 1; + }else{ + _position = ASLtoATL (AGLtoASL (player modelToWorld ExileClientConstructionOffset)); + _rotation = (ExileClientConstructionRotation + (getDir player) + 360) % 360; + _vectorDirection = [sin(_rotation), cos(_rotation), 0]; + }; + }; + case 2: + { + _newDirAndUp = [[sin ((BuildVecYaw + (getDir player) + 360) % 360) * cos BuildVecPitch, cos ((BuildVecYaw + (getDir player) + 360) % 360) * cos BuildVecPitch, sin BuildVecPitch],[[ sin BuildVecRoll,-sin BuildVecPitch,cos BuildVecRoll * cos BuildVecPitch],-((BuildVecYaw + (getDir player) + 360) % 360)] call BIS_fnc_rotateVector2D]; + _vectorDirection = _newDirAndUp select 0; + _vectorUp = _newDirAndUp select 1; + _position = ASLtoATL (AGLtoASL (player modelToWorld ExileClientConstructionOffset)); + _position = + [ + (_position select 0) - ((_position select 0) % (ExileClientConstructionGrid select 0)), + (_position select 1) - ((_position select 1) % (ExileClientConstructionGrid select 1)), + (_position select 2) - ((_position select 2) % (ExileClientConstructionGrid select 2)) + ]; + }; + case 3: + { + ExileClientConstructionIsSnapped = false; + if (ExileClientConstructionIsInSelectSnapObjectMode) then + { + ExileClientConstructionPossibleSnapPositions = []; + ExileClientConstructionCurrentSnapToObject = objNull; + _position = getPosATL player; + _position set [2, -500]; + _rotation = (ExileClientConstructionRotation + (getDir player) + 360) % 360; + _vectorDirection = [sin(_rotation), cos(_rotation), 0]; + _potentionalSnapObject = cursorTarget; + if !(isNull _potentionalSnapObject) then + { + if (_potentionalSnapObject distance player < 12) then + { + _snapToClassName = typeOf _potentionalSnapObject; + if (_snapToClassName in ExileClientConstructionSnapToObjectClassNames) then + { + ExileClientConstructionCurrentSnapToObject = _potentionalSnapObject; + _snapToConfig = ("getText(_x >> 'staticObject') == _snapToClassName" configClasses(configFile >> "CfgConstruction")) select 0; + { + _snapPosition = getArray (_snapToConfig >> "SnapPositions" >> _x); + _possibleSnapPosition = ASLtoATL (AGLtoASL (_potentionalSnapObject modelToWorld _snapPosition)); + ExileClientConstructionPossibleSnapPositions pushBack _possibleSnapPosition; + } + forEach getArray (ExileClientConstructionConfig >> "SnapObjects" >> _snapToClassName >> "positions"); + }; + }; + }; + } + else + { + _position = ASLtoATL (AGLtoASL (player modelToWorld ExileClientConstructionOffset)); + _rotation = (ExileClientConstructionRotation + (getDir player) + 360) % 360; + _vectorDirection = [sin(_rotation), cos(_rotation), 0]; + { + if (_x distance _position < 1) exitWith + { + _position = _x; + _rotation = (ExileClientConstructionRotation + (getDir ExileClientConstructionCurrentSnapToObject) + 360) % 360; + _vectorDirection = [sin(_rotation), cos(_rotation), 0]; + _vectorUp = vectorUp ExileClientConstructionCurrentSnapToObject; + ExileClientConstructionIsSnapped = true; + }; + } + forEach ExileClientConstructionPossibleSnapPositions; + }; + }; + case 4: + { + _position = ASLtoATL (AGLtoASL (DPBEAClientObjAttachedTo modelToWorld ExileClientConstructionOffset)); + _newDirAndUp = [[sin BuildVecYaw * cos BuildVecPitch, cos BuildVecYaw * cos BuildVecPitch, sin BuildVecPitch],[[ sin BuildVecRoll,-sin BuildVecPitch,cos BuildVecRoll * cos BuildVecPitch],-BuildVecYaw] call BIS_fnc_rotateVector2D]; + _vectorDirection = _newDirAndUp select 0; + _vectorUp = _newDirAndUp select 1; + }; + }; + ExileClientConstructionObject setVectorDirAndUp [_vectorDirection,_vectorUp]; + ExileClientConstructionObject setPosATL _position; + }; + _contactThreshold = 0.1; + _isBelowTerrain = true; + { + _worldPosition = ASLtoATL (AGLtoASL (ExileClientConstructionObject modelToWorld _x)); + if ((_worldPosition select 2) > _contactThreshold) exitWith {_isBelowTerrain = false}; + } + forEach _boundingBoxPointsTop; + _isInAir = true; + _numberOfContactsBottom = 0; + { + _worldPosition = ASLtoATL (AGLtoASL (ExileClientConstructionObject modelToWorld _x)); + if ((_worldPosition select 2) < _contactThreshold) then + { + _isInAir = false; + }; + _startPosition = ATLtoASL[_worldPosition select 0, _worldPosition select 1, (_worldPosition select 2) + _contactThreshold]; + _endPosition = ATLtoASL [_worldPosition select 0, _worldPosition select 1, (_worldPosition select 2) - _contactThreshold]; + if (count lineIntersectsObjs[_startPosition, _endPosition, ExileClientConstructionObject, objNull, false, 2] > 0) then + { + _numberOfContactsBottom = _numberOfContactsBottom + 1; + }; + } + forEach _boundingBoxPointsBottom; + if (_isBelowTerrain) then + { + ExileClientConstructionCanPlaceObject = false; + _simulatePhysics = false; + _objectColor = "#(argb,2,2,1)color(0.91,0,0,0.6,ca)"; + } + else + { + ExileClientConstructionCanPlaceObject = true; + if !(ExileClientConstructionModePhysx) then + { + _objectColor = "#(argb,2,2,1)color(0.7,0.93,0,0.6,ca)"; + _simulatePhysics = false; + } + else + { + if (_isInAir) then + { + if (_numberOfContactsBottom >= 3) then + { + _objectColor = "#(argb,2,2,1)color(0.7,0.93,0,0.6,ca)"; + _simulatePhysics = false; + } + else + { + _objectColor = "#(argb,2,2,1)color(1,0.79,0.07,0.6,ca)"; + _simulatePhysics = true; + }; + } + else + { + _objectColor = "#(argb,2,2,1)color(0.7,0.93,0,0.6,ca)"; + _simulatePhysics = false; + }; + }; + }; + if (ExileClientConstructionMode isEqualTo 3) then + { + if (!ExileClientConstructionIsSnapped) then + { + ExileClientConstructionCanPlaceObject = false; + _simulatePhysics = false; + _objectColor = "#(argb,2,2,1)color(0.91,0,0,0.6,ca)"; + }; + }; + if !(([configName ExileClientConstructionConfig, ASLtoAGL (getPosASL ExileClientConstructionObject), getPlayerUID player] call ExileClient_util_world_canBuildHere) isEqualTo 0) then + { + ExileClientConstructionCanPlaceObject = false; + _simulatePhysics = false; + _objectColor = "#(argb,2,2,1)color(0.91,0,0,0.6,ca)"; + }; + if (_isFlag) then + { + if (((getPos ExileClientConstructionObject) select 2) > 0.2) then + { + ExileClientConstructionCanPlaceObject = false; + _simulatePhysics = false; + _objectColor = "#(argb,2,2,1)color(0.91,0,0,0.6,ca)"; + }; + }; + if (_objectColor != _materialColor) then + { + ExileClientConstructionObject setObjectTextureGlobal[0, _objectColor]; + ExileClientConstructionObject setObjectTextureGlobal[1, _objectColor]; + ExileClientConstructionObject setObjectTextureGlobal[2, _objectColor]; + ExileClientConstructionObject setObjectTextureGlobal[3, _objectColor]; + _materialColor = _objectColor; + }; + if (ExileClientConstructionStartPosition distance (getPosASL player) > 20) then + { + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionResult = 3; + }; + }; + if (ExileClientPlayerIsInCombat) then + { + ExileClientConstructionModePhysx = true; + ExileClientConstructionResult = 2; + }; + uiSleep 0.001; +}; +if !(ExileClientConstructionModePhysx) then +{ + _simulatePhysics = false; +}; +_simulatePhysics call ExileClient_construction_handleAbort; +ExileClientConstructionObject = objNull; +ExileClientIsInConstructionMode = false; +ExileClientConstructionResult = 0; +ExileClientConstructionProcess = 0; +ExileClientConstructionLock = false; +("ExileClientConstructionModeLayer" call BIS_fnc_rscLayer) cutText ["", "PLAIN"]; +true diff --git a/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_constructionMode_update.sqf b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_constructionMode_update.sqf new file mode 100644 index 0000000..77e1fcd --- /dev/null +++ b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_constructionMode_update.sqf @@ -0,0 +1,40 @@ +/** + * ExileClient_gui_constructionMode_update + * + * 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["_display","_title","_titleControl","_description","_descriptionBackground"]; +disableSerialization; +_display = uiNamespace getVariable "RscExileConstructionMode"; +if (!isNull _display) then +{ + _title = ""; + switch (ExileClientConstructionMode) do + { + case 1: { _title = "FREE VECTOR MODE"; }; + case 2: { _title = "GRID MODE"; }; + case 3: { _title = "SNAP MODE"; }; + case 4: { _title = "OBJECT SNAP MODE"; }; + }; + if (ExileClientConstructionModePhysx) then + { + _title = _title + " + PHYSICS"; + }; + _titleControl = _display displayCtrl 1000; + _titleControl ctrlSetText _title; + _description = _display displayCtrl 1001; + _description ctrlShow ExileClientConstructionShowHint; + _descriptionBackground = _display displayCtrl 1002; + _descriptionBackground ctrlShow ExileClientConstructionShowHint; + _pos = ctrlPosition _descriptionBackground; + _descriptionBackground ctrlSetPosition [_pos select 0,_pos select 1,_pos select 2,450 * pixelH]; + _descriptionBackground ctrlCommit 0; + _description ctrlSetStructuredText parseText Format["Free Vector Mode1
Grid Mode2
Snap Mode3
Toggle Physics4
ORIGINAL
RotationQ/E
ElevationPAGE UP/DOWN
DistanceHOME/END
DP CUSTOM
Tilt and PitchArrow Keys
Rotate/YawNUM7/NUM9
Move Away/BackNUM8/NUM2
Move Left/RightNUM4/NUM6
Reset ObjectNUM5
Object SnappingNUM0
CUSTOM STEPPING
LargerSHIFT
SmallerCONTROL
PrecisionALT
FINISH UP
PlaceSPACE
AbortESCAPE"]; +}; +true \ No newline at end of file diff --git a/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_hud_event_onKeyDown.sqf b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_hud_event_onKeyDown.sqf new file mode 100644 index 0000000..11c2b41 --- /dev/null +++ b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_hud_event_onKeyDown.sqf @@ -0,0 +1,311 @@ +/** + * ExileClient_gui_hud_event_onKeyDown + * + * 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["_stopPropagation","_caller","_keyCode","_shiftState","_controlState","_altState","_grenadeName"]; +_stopPropagation = false; +_caller = _this select 0; +_keyCode = _this select 1; +_shiftState = _this select 2; +_controlState = _this select 3; +_altState = _this select 4; +if ((_keyCode in (actionKeys "nightVision")) && ExileClientGasMaskVisible) exitWith {true}; +if (_keyCode in (actionKeys "TacticalView")) exitWith {true}; +if (!(_controlState) && (_keyCode in (actionKeys "Throw"))) exitWith +{ + _stopPropagation = false; + _grenadeName = (currentThrowable player) select 0; + if (_grenadeName isEqualTo "Exile_Item_ZipTie") then + { + call ExileClient_object_handcuffs_use; + _stopPropagation = true; + }; + _stopPropagation +}; +switch (_keyCode) do +{ + case 0x29: { _stopPropagation = true; }; + case 0x0B: { _stopPropagation = true; }; + case 0x06: { _stopPropagation = true; }; + case 0x07: { _stopPropagation = true; }; + case 0x08: { _stopPropagation = true; }; + case 0x09: { _stopPropagation = true; }; + case 0x0A: { _stopPropagation = true; }; + case 0x3B: { _stopPropagation = true; }; + case 0x3C: { _stopPropagation = true; }; + case 0x3D: { _stopPropagation = true; }; + case 0x3E: { _stopPropagation = true; }; + case 0x3F: { _stopPropagation = true; }; + case 0x40: { _stopPropagation = true; }; + case 0x41: { _stopPropagation = true; }; + case 0x42: { _stopPropagation = true; }; + case 0x43: { _stopPropagation = true; }; + case 0x44: { _stopPropagation = true; }; + case 0x57: { _stopPropagation = true; }; + case 0x58: { _stopPropagation = true; }; + case 0x0E: { _stopPropagation = true; }; + case 0x02: + { + _stopPropagation = true; + }; + case 0x03: + { + _stopPropagation = true; + }; + case 0x04: + { + _stopPropagation = true; + }; + case 0x05: + { + _stopPropagation = true; + }; + case 0xD2: + { + _stopPropagation = true; + }; + case 0x10: + { + if (ExileClientIsInConstructionMode) then + { + if!(ExileClientConstructionMode isEqualTo 3)then + { + _step = 1; + if(_shiftState)then{_step = 3;}; + if(_controlState)then{_step = 0.5;}; + if(_altState)then{ _step = 0.25;}; + BuildVecYaw = (((BuildVecYaw - _step)min 360) max -360); + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + } + else + { + _step = 45; + if (_shiftState) then + { + _step = 90; + } + else + { + if (_controlState) then + { + _step = 22.5; + }; + }; + ExileClientConstructionRotation = (ExileClientConstructionRotation - _step + 360) % 360; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + }; + case 0x12: + { + if (ExileClientIsInConstructionMode) then + { + if!(ExileClientConstructionMode isEqualTo 3)then + { + _step = 1; + if(_shiftState)then{_step = 3;}; + if(_controlState)then{_step = 0.5;}; + if(_altState)then{ _step = 0.25;}; + BuildVecYaw = (((BuildVecYaw + _step)min 360) max -360); + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + } + else + { + _step = 45; + if (_shiftState) then + { + _step = 90; + } + else + { + if (_controlState) then + { + _step = 22.5; + }; + }; + ExileClientConstructionRotation = (ExileClientConstructionRotation + _step + 360) % 360; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + }; + case 0x47: + { + if (ExileClientIsInConstructionMode) then + { + _step = 1; + if(_shiftState)then{_step = 3;}; + if(_controlState)then{_step = 0.5;}; + if(_altState)then{ _step = 0.25;}; + BuildVecYaw = (((BuildVecYaw - _step)min 360) max -360); + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0x49: + { + if (ExileClientIsInConstructionMode) then + { + _step = 1; + if(_shiftState)then{_step = 3;}; + if(_controlState)then{_step = 0.5;}; + if(_altState)then{ _step = 0.25;}; + BuildVecYaw = (((BuildVecYaw + _step)min 360) max -360); + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0xC9: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0xD1: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x39: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0xCF: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x48: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x50: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x4B: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x4D: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x4C: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x52: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0xC7: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0xCB: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + BuildVecRoll = (((BuildVecRoll - _step)min 360) max -360); + _stopPropagation = true; + }; + }; + case 0xCD: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + BuildVecRoll = (((BuildVecRoll + _step)min 360) max -360); + _stopPropagation = true; + }; + }; + case 0xC8: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + BuildVecPitch =(((BuildVecPitch - _step)min 360) max -360); + _stopPropagation = true; + }; + }; + case 0xD0: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + BuildVecPitch = (((BuildVecPitch + _step)min 360) max -360); + _stopPropagation = true; + }; + }; + case 0x01: + { + if (ExileClientIsInConstructionMode) then + { + ExileClientConstructionResult = 2; + _stopPropagation = true; + }; + if (ExileIsPlayingRussianRoulette) then + { + if (ExileRussianRouletteCanEscape) then + { + ["leaveRussianRouletteRequest", []] call ExileClient_system_network_send; + ExileRussianRouletteCanEscape = false; + }; + _stopPropagation = true; + }; + }; +}; +_stopPropagation \ No newline at end of file diff --git a/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_hud_event_onKeyUp.sqf b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_hud_event_onKeyUp.sqf new file mode 100644 index 0000000..c2ac01b --- /dev/null +++ b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_gui_hud_event_onKeyUp.sqf @@ -0,0 +1,572 @@ +/** + * ExileClient_gui_hud_event_onKeyUp + * + * 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["_stopPropagation","_caller","_keyCode","_shiftState","_controlState","_altState","_posObject","_step"]; +_stopPropagation = false; +_caller = _this select 0; +_keyCode = _this select 1; +_shiftState = _this select 2; +_controlState = _this select 3; +_altState = _this select 4; +if (_keyCode in (actionKeys "TacticalView")) exitWith {true}; +if (_keyCode in (actionKeys "User1") && !(_keyCode isEqualTo 0x02)) exitWith +{ + if !(ExileClientIsHandcuffed) then + { + call ExileClient_object_vehicle_interaction_keyLock; + }; + true +}; +if (_keyCode in (actionKeys "User2")) exitWith +{ + if (ExileClientAllowPartyMarkers) then + { + if !(ExileClientPartyID isEqualTo -1) then + { + if !(ExileClientIsHandcuffed) then + { + call ExileClient_system_party_updateMyMarker; + }; + }; + }; + true +}; +switch (_keyCode) do +{ + case 0x29: + { + call ExileClient_gui_hud_toggleStatsBar; + _stopPropagation = true; + }; + case 0x11, + case 0x1E, + case 0x1F, + case 0x20: + { + if (ExileClientIsAutoRunning) then + { + call ExileClient_system_autoRun_stop; + _stopPropagation = true; + }; + }; + case 0x0B: + { + if !(ExileClientIsHandcuffed) then + { + call ExileClient_system_autoRun_toggle; + }; + _stopPropagation = true; + }; + case 0x08: { _stopPropagation = true; }; + case 0x09: { _stopPropagation = true; }; + case 0x0A: { _stopPropagation = true; }; + case 0x3B: { _stopPropagation = true; }; + case 0x3C: { _stopPropagation = true; }; + case 0x3D: { _stopPropagation = true; }; + case 0x3E: { _stopPropagation = true; }; + case 0x41: { _stopPropagation = true; }; + case 0x42: { _stopPropagation = true; }; + case 0x43: { _stopPropagation = true; }; + case 0x44: { _stopPropagation = true; }; + case 0x57: { _stopPropagation = true; }; + case 0x58: { _stopPropagation = true; }; + case 0x0E: { _stopPropagation = true; }; + case 0x02: + { + if !(ExileClientIsHandcuffed || ExileIsPlayingRussianRoulette) then + { + if (ExileClientIsInConstructionMode) then + { + ExileClientConstructionObject setObjectTextureGlobal [0, "#(argb,2,2,1)color(0.7,0.93,0,0.6,ca)"]; + ExileClientConstructionCurrentSnapToObject = objNull; + ExileClientConstructionIsInSelectSnapObjectMode = false; + ExileClientConstructionPossibleSnapPositions = []; + ExileClientConstructionMode = 1; + [] call ExileClient_gui_constructionMode_update; + } + else + { + if (primaryWeapon player != "") then + { + if (primaryWeapon player != currentWeapon player) then + { + player selectWeapon (primaryWeapon player); + }; + }; + }; + }; + _stopPropagation = true; + }; + case 0x03: + { + if !(ExileClientIsHandcuffed || ExileIsPlayingRussianRoulette) then + { + if (ExileClientIsInConstructionMode) then + { + ExileClientConstructionObject setObjectTextureGlobal [0, "#(argb,2,2,1)color(0.7,0.93,0,0.6,ca)"]; + ExileClientConstructionCurrentSnapToObject = objNull; + ExileClientConstructionIsInSelectSnapObjectMode = false; + ExileClientConstructionPossibleSnapPositions = []; + ExileClientConstructionMode = 2; + [] call ExileClient_gui_constructionMode_update; + } + else + { + if (handgunWeapon player != "") then + { + if (handgunWeapon player != currentWeapon player) then + { + player selectWeapon (handgunWeapon player); + }; + }; + }; + }; + _stopPropagation = true; + }; + case 0x04: + { + if !(ExileClientIsHandcuffed || ExileIsPlayingRussianRoulette) then + { + if (ExileClientIsInConstructionMode) then + { + if (ExileClientConstructionSupportSnapMode) then + { + if (ExileClientConstructionMode != 3) then + { + ExileClientConstructionCurrentSnapToObject = objNull; + ExileClientConstructionPossibleSnapPositions = []; + ["InfoTitleAndText", ["Snap Mode", "Look at the object you want to snap to, press SPACE to lock on it and then move your object next to a snap point. Press SPACE again to place the object."]] call ExileClient_gui_toaster_addTemplateToast; + }; + ExileClientConstructionMode = 3; + ExileClientConstructionIsInSelectSnapObjectMode = true; + [] call ExileClient_gui_constructionMode_update; + }; + } + else + { + if (secondaryWeapon player != "") then + { + if (secondaryWeapon player != currentWeapon player) then + { + player selectWeapon (secondaryWeapon player); + }; + }; + }; + }; + _stopPropagation = true; + }; + case 0x05: + { + if !(ExileClientIsHandcuffed || ExileIsPlayingRussianRoulette) then + { + if (ExileClientIsInConstructionMode) then + { + if !(ExileClientConstructionKitClassName isEqualTo "Exile_Item_Flag") then + { + ExileClientConstructionModePhysx = !ExileClientConstructionModePhysx; + [] call ExileClient_gui_constructionMode_update; + }; + } + else + { + if (currentWeapon player != "") then + { + ExileClientPlayerHolsteredWeapon = currentWeapon player; + player action["switchWeapon", player, player, 100]; + } + else + { + if (ExileClientPlayerHolsteredWeapon != "") then + { + player selectWeapon ExileClientPlayerHolsteredWeapon; + }; + }; + }; + }; + _stopPropagation = true; + }; + case 0x06: + { + if (ExileClientIsInConstructionMode) then + { + ExileClientConstructionShowHint = !ExileClientConstructionShowHint; + [] call ExileClient_gui_constructionMode_update; + } + else + { + call ExileClient_system_music_earplugs_toggle; + }; + _stopPropagation = true; + }; + case 0x07: + { + if (ExileClientIsInConstructionMode) then + { + if(ExileClientConstructionLock)then + { + ExileClientConstructionLock = false; + _posObject = position ExileClientConstructionObject; + ExileClientConstructionOffset = player worldToModel _posObject; + ExileClientConstructionRotation = (getDir ExileClientConstructionObject) - (getDir player); + } + else + { + ExileClientConstructionLock = true; + }; + } + else + { + if (!ExileClientXM8IsVisible) then + { + if ("Exile_Item_XM8" in (assignedItems player)) then + { + if (alive player) then + { + [] call ExileClient_gui_xm8_show; + }; + }; + }; + }; + _stopPropagation = true; + }; + case 0x39: + { + if (ExileIsPlayingRussianRoulette) then + { + if (ExileRussianRouletteCanFire) then + { + [] spawn ExileClient_system_russianRoulette_fire; + }; + } + else + { + if (ExileClientIsInConstructionMode) then + { + if (ExileClientConstructionMode == 3) then + { + if (ExileClientConstructionIsInSelectSnapObjectMode) then + { + if !(isNull ExileClientConstructionCurrentSnapToObject) then + { + ExileClientConstructionIsInSelectSnapObjectMode = false; + [] call ExileClient_gui_constructionMode_update; + }; + } + else + { + if (ExileClientConstructionCanPlaceObject) then + { + ExileClientConstructionResult = 1; + }; + }; + } + else + { + if (ExileClientConstructionCanPlaceObject) then + { + ExileClientConstructionResult = 1; + }; + }; + _stopPropagation = true; + }; + }; + }; + case 0x01: + { + if (ExileIsPlayingRussianRoulette) then + { + _stopPropagation = true; + } + else + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + }; + case 0x10: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x12: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x47: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x49: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0x19: + { + if (ExileClientIsInBush) then + { + call ExileClient_object_bush_detach; + _stopPropagation = true; + }; + }; + case 0x31: + { + if!(isNull ExileClientCameraParentObject)then + { + if(ExileClientCameraNVG)then + { + camUseNVG false; + } + else + { + camUseNVG true; + }; + ExileClientCameraNVG = !ExileClientCameraNVG; + _stopPropagation = true; + }; + }; + case 0xC9: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionOffset set [2, ((((ExileClientConstructionOffset select 2) + _step) min 6) max -3) ]; + }else{ + ExileClientConstructionOffset set [2,((ExileClientConstructionOffset select 2) + _step)]; + }; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0xD1: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionOffset set [2, ((((ExileClientConstructionOffset select 2) - _step) min 6) max -3) ]; + }else{ + ExileClientConstructionOffset set [2,((ExileClientConstructionOffset select 2) - _step)]; + }; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0xC7: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionOffset set [1, (((ExileClientConstructionOffset select 1) + _step) min 6) max ExileClientConstructionBoundingRadius ]; + }else{ + ExileClientConstructionOffset set [1,((ExileClientConstructionOffset select 1) + _step)]; + }; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0xCF: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionOffset set [1, (((ExileClientConstructionOffset select 1) - _step) min 6) max ExileClientConstructionBoundingRadius ]; + }else{ + ExileClientConstructionOffset set [1,((ExileClientConstructionOffset select 1) - _step)]; + }; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0x48: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionOffset set [1, (((ExileClientConstructionOffset select 1) + _step) min 6) max ExileClientConstructionBoundingRadius ]; + }else{ + ExileClientConstructionOffset set [1,((ExileClientConstructionOffset select 1) + _step)]; + }; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0x50: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionOffset set [1, (((ExileClientConstructionOffset select 1) - _step) min 6) max ExileClientConstructionBoundingRadius ]; + }else{ + ExileClientConstructionOffset set [1,((ExileClientConstructionOffset select 1) - _step)]; + }; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0x4B: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionOffset set [0,((((ExileClientConstructionOffset select 0) - _step)min 10) max -10)]; + }else{ + ExileClientConstructionOffset set [0,((ExileClientConstructionOffset select 0) - _step)]; + }; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0x4D: + { + if (ExileClientIsInConstructionMode) then + { + _step = 0.5; + if(_shiftState)then{_step = 1.5;}; + if(_controlState)then{_step = 0.1;}; + if(_altState)then{_step = 0.01;}; + if!(ExileClientConstructionMode isEqualTo 4)then + { + ExileClientConstructionOffset set [0,((((ExileClientConstructionOffset select 0) + _step)min 10) max -10)]; + }else{ + ExileClientConstructionOffset set [0,((ExileClientConstructionOffset select 0) + _step)]; + }; + [] call ExileClient_gui_constructionMode_update; + _stopPropagation = true; + }; + }; + case 0x4C: + { + if (ExileClientIsInConstructionMode) then + { + BuildVecYaw = 0;BuildVecPitch = 0;BuildVecRoll = 0; + ExileClientConstructionOffset = [0,5,0]; + _stopPropagation = true; + }; + }; + case 0x52: + { + if (ExileClientIsInConstructionMode) then + { + if(DPBEAClientObjAttachedTo isEqualTo player)then + { + private _isClass = isClass(configFile >> "CfgVehicles" >> (typeOf ExileClientInteractionObject)); + private _returnItem = isText(configFile >> "CfgVehicles" >> (typeOf ExileClientInteractionObject) >> "returnItem"); + private _exileBuildable = (ExileClientInteractionObject isKindOf "Exile_Construction_Abstract_Static"); + if((_returnItem)||(_exileBuildable))then + { + []spawn + { + disableSerialization; + private _result = ["Do you really want to snap to this object?", "Confirm", "Yes", "Nah"] call BIS_fnc_guiMessage; + waitUntil { !isNil "_result" }; + if (_result) then + { + BuildVecYaw = 0;BuildVecPitch = 0;BuildVecRoll = 0; + DPBEAClientObjAttachedTo = ExileClientInteractionObject; + ExileClientConstructionMode = 4; + }; + }; + }; + }else{ + BuildVecYaw = 0;BuildVecPitch = 0;BuildVecRoll = 0; + DPBEAClientObjAttachedTo = player; + ExileClientConstructionMode = 1; + }; + _stopPropagation = true; + }; + }; + case 0xCB: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0xCD: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0xC8: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0xD0: + { + if (ExileClientIsInConstructionMode) then + { + _stopPropagation = true; + }; + }; + case 0xDB: + { + switch (ExilePartyEspMode) do + { + case 0: { ExilePartyEspMode = 1; }; + case 1: { ExilePartyEspMode = 2; }; + case 2: { ExilePartyEspMode = 0; }; + }; + _stopPropagation = true; + }; +}; +_stopPropagation \ No newline at end of file diff --git a/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_object_construction_move.sqf b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_object_construction_move.sqf new file mode 100644 index 0000000..ec0f571 --- /dev/null +++ b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_object_construction_move.sqf @@ -0,0 +1,37 @@ +/** + * ExileClient_object_construction_move + * + * 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["_object","_result"]; +disableSerialization; +_object = _this select 0; +setMousePosition [0.5,0.5]; +_result = ["Do you really want to move this object?", "Move?", "Yes", "Nah"] call BIS_fnc_guiMessage; +waitUntil {uiSleep 0.05; !isNil "_result" }; +if (_result) then +{ + if (ExileClientPlayerIsInCombat) then + { + ["ErrorTitleAndText", ["Construction aborted!", "You cannot build during a combat."]] call ExileClient_gui_toaster_addTemplateToast; + } + else + { + if (_object isKindOf "Exile_Construction_Flag_Static") then + { + ["ErrorTitleAndText", ["Construction aborted!", "You cannot move a Flag."]] call ExileClient_gui_toaster_addTemplateToast; + } + else + { + ExileClientConstructionPosition = getPosATL _object; + ["moveConstructionRequest", [netId _object]] call ExileClient_system_network_send; + }; + }; +}; +true \ No newline at end of file diff --git a/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_util_world_canBuildHere.sqf b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_util_world_canBuildHere.sqf new file mode 100644 index 0000000..6634653 --- /dev/null +++ b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_util_world_canBuildHere.sqf @@ -0,0 +1,113 @@ +/** + * ExileClient_util_world_canBuildHere + * + * 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["_constructionConfigName","_position","_playerUID","_result","_requiresTerritory","_canBePlacedOnRoad","_allowDuplicateSnap","_minimumDistanceToTraderZones","_minimumDistanceToSpawnZones","_minimumDistanceToOtherTerritories","_maximumTerritoryRadius","_positionObject","_nearestFlags","_radius","_buildRights","_territoryLevelConfigs","_territoryLevelConfig","_numberOfConstructionsAllowed","_numberOfObjects"]; +_constructionConfigName = _this select 0; +_position = _this select 1; +_playerUID = _this select 2; +_result = 0; +_requiresTerritory = getNumber (configFile >> "CfgConstruction" >> _constructionConfigName >> "requiresTerritory") isEqualTo 1; +_canBePlacedOnRoad = getNumber (configFile >> "CfgConstruction" >> _constructionConfigName >> "canBePlacedOnRoad") isEqualTo 1; +_allowDuplicateSnap = getNumber (configFile >> "CfgConstruction" >> _constructionConfigName >> "allowDuplicateSnap") isEqualTo 1; +_minimumDistanceToTraderZones = getNumber (missionConfigFile >> "CfgTerritories" >> "minimumDistanceToTraderZones"); +_minimumDistanceToSpawnZones = getNumber (missionConfigFile >> "CfgTerritories" >> "minimumDistanceToSpawnZones"); +_minimumDistanceToOtherTerritories = getNumber (missionConfigFile >> "CfgTerritories" >> "minimumDistanceToOtherTerritories"); +_maximumTerritoryRadius = getNumber (missionConfigFile >> "CfgTerritories" >> "maximumRadius"); +try +{ + if ([_position, _minimumDistanceToTraderZones] call ExileClient_util_world_isTraderZoneInRange) then + { + throw 4; + }; + if ([_position, _minimumDistanceToSpawnZones] call ExileClient_util_world_isSpawnZoneInRange) then + { + throw 5; + }; + if ((AGLtoASL _position) call ExileClient_util_world_isInConcreteMixerZone) then + { + throw 11; + }; + if ((AGLtoASL _position) call ExileClient_util_world_isInNonConstructionZone) then + { + throw 10; + }; + if ((AGLtoASL _position) call ExileClient_util_world_isInRadiatedZone) then + { + throw 8; + }; + if !(_canBePlacedOnRoad) then + { + if (isOnRoad [_position select 0, _position select 1, 0]) then + { + throw 3; + }; + }; + _numberOfObjects = 0; + if !(_allowDuplicateSnap) then + { + { + _positionObject = (ASLtoAGL (getPosASL _x)); + if (_position isEqualTo _positionObject) then + { + _numberOfObjects = _numberOfObjects + 1; + if(_numberOfObjects >= 2)then{throw 7;}; + }; + } + forEach (_position nearObjects ["Exile_Construction_Abstract_Static", 3]); + }; + if (_constructionConfigName isEqualTo "Flag") then + { + if ([_position, _minimumDistanceToOtherTerritories] call ExileClient_util_world_isTerritoryInRange) then + { + throw 2; + }; + } + else + { + _nearestFlags = (nearestObjects [_position, ["Exile_Construction_Flag_Static"], _maximumTerritoryRadius]); + if !(_nearestFlags isEqualTo []) then + { + { + _radius = _x getVariable ["ExileTerritorySize", -1]; + if (((AGLtoASL _position) distance (getPosASL _x)) < _radius) then + { + _buildRights = _x getVariable ["ExileTerritoryBuildRights", []]; + if (_playerUID in _buildRights) then + { + _territoryLevelConfigs = getArray (missionConfigFile >> "CfgTerritories" >> "prices"); + _territoryLevelConfig = _territoryLevelConfigs select ((_x getVariable ["ExileTerritoryLevel", 0]) - 1); + _numberOfConstructionsAllowed = _territoryLevelConfig select 2; + if ((_x getVariable ["ExileFlagStolen", 0]) isEqualTo 1) then + { + throw 9; + }; + if ((_x getVariable ["ExileTerritoryNumberOfConstructions", 0]) >= _numberOfConstructionsAllowed) then + { + throw 6; + }; + throw 0; + }; + }; + throw 2; + } + forEach _nearestFlags; + }; + if (_requiresTerritory) then + { + throw 1; + }; + }; +} +catch +{ + _result = _exception; +}; +_result \ No newline at end of file diff --git a/mpmissions/Exile.Altis/init.sqf b/mpmissions/Exile.Altis/init.sqf index df2899e..a67d1bc 100644 --- a/mpmissions/Exile.Altis/init.sqf +++ b/mpmissions/Exile.Altis/init.sqf @@ -1,9 +1,20 @@ -//A3XAI Client -#include "A3XAI_Client\A3XAI_initclient.sqf"; - +if (hasInterface) then { + //A3XAI Client + #include "A3XAI_Client\A3XAI_initclient.sqf"; +}; + //R3F Logistics [] execVM "R3F_LOG\init.sqf"; //igiload -[] execVM "IgiLoad\IgiLoadInit.sqf"; \ No newline at end of file +[] execVM "IgiLoad\IgiLoadInit.sqf"; + +//ST Map Gestures Server +if (isServer) then { + call compile preProcessFileLineNumbers "Custom\st_map_gestures\serverInit.sqf"; +}; + +if (hasInterface) then { + call compile preprocessFileLineNumbers "Custom\st_map_gestures\clientInit.sqf"; +}; \ No newline at end of file