diff --git a/mpmissions/Exile.Altis.pbo b/mpmissions/Exile.Altis.pbo
index 806dbda..dde84cc 100644
Binary files a/mpmissions/Exile.Altis.pbo and b/mpmissions/Exile.Altis.pbo differ
diff --git a/mpmissions/Exile.Altis/CfgExileCustomCode.cpp b/mpmissions/Exile.Altis/CfgExileCustomCode.cpp
index 8de96af..fff6fa3 100644
--- a/mpmissions/Exile.Altis/CfgExileCustomCode.cpp
+++ b/mpmissions/Exile.Altis/CfgExileCustomCode.cpp
@@ -6,16 +6,6 @@ ExileClient_system_lootmanager_thread_spawn = "EBM\exileclient_system_lootmanage
//Persistent Tree
ExileServer_object_tree_network_chopTreeRequest="Custom\persistantTree\ExileServer_object_tree_network_chopTreeRequest.sqf";
-//Vector Building
-ExileClient_object_construction_move = "eXpochVectorBldg\ExileClient_object_construction_move.sqf";
-ExileClient_gui_hud_event_onKeyDown = "eXpochVectorBldg\ExileClient_gui_hud_event_onKeyDown.sqf";
-ExileClient_gui_hud_event_onKeyUp = "eXpochVectorBldg\ExileClient_gui_hud_event_onKeyUp.sqf";
-ExileClient_construction_beginExistingObject = "eXpochVectorBldg\ExileClient_construction_beginExistingObject.sqf";
-ExileClient_construction_beginNewObject = "eXpochVectorBldg\ExileClient_construction_beginNewObject.sqf";
-ExileClient_construction_thread = "eXpochVectorBldg\ExileClient_construction_thread.sqf";
-ExileClient_gui_constructionMode_update = "eXpochVectorBldg\ExileClient_gui_constructionMode_update.sqf";
-ExileClient_util_world_canBuildHere = "eXpochVectorBldg\ExileClient_util_world_canBuildHere.sqf";
-
//Exile Revive
ExileClient_object_player_death_startBleedingOut = "custom\EnigmaRevive\ExileClient_object_player_death_startBleedingOut.sqf"; //Happys Revive
ExileClient_object_player_event_onInventoryOpened = "custom\EnigmaRevive\ExileClient_object_player_event_onInventoryOpened.sqf"; //Happys Revive AntiDupe ---NEW with v0.65
@@ -58,4 +48,14 @@ ExileServer_system_garbageCollector_deleteObject="custom\fixes\ExileServer_syste
ExileServer_system_event_ambientFlyOver_start="custom\fixes\ExileServer_system_event_ambientFlyOver_start.sqf";
//igiload
-ExileClient_object_player_event_onEnterSafezone="custom\fixes\ExileClient_object_player_event_onEnterSafezone.sqf";
\ No newline at end of file
+ExileClient_object_player_event_onEnterSafezone="custom\fixes\ExileClient_object_player_event_onEnterSafezone.sqf";
+
+//Vector Building
+ExileClient_object_construction_move = "eXpochVectorBldg\ExileClient_object_construction_move.sqf";
+ExileClient_gui_hud_event_onKeyDown = "eXpochVectorBldg\ExileClient_gui_hud_event_onKeyDown.sqf";
+ExileClient_gui_hud_event_onKeyUp = "eXpochVectorBldg\ExileClient_gui_hud_event_onKeyUp.sqf";
+ExileClient_construction_beginExistingObject = "eXpochVectorBldg\ExileClient_construction_beginExistingObject.sqf";
+ExileClient_construction_beginNewObject = "eXpochVectorBldg\ExileClient_construction_beginNewObject.sqf";
+ExileClient_construction_thread = "eXpochVectorBldg\ExileClient_construction_thread.sqf";
+ExileClient_gui_constructionMode_update = "eXpochVectorBldg\ExileClient_gui_constructionMode_update.sqf";
+ExileClient_util_world_canBuildHere = "eXpochVectorBldg\ExileClient_util_world_canBuildHere.sqf";
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_beginExistingObject.sqf b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_beginExistingObject.sqf
new file mode 100644
index 0000000..5d2abd4
--- /dev/null
+++ b/mpmissions/Exile.Altis/eXpochVectorBldg/ExileClient_construction_beginExistingObject.sqf
@@ -0,0 +1,49 @@
+/**
+ * ExileClient_construction_beginExistingObject
+ *
+ * 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["_previewObjectClassName"];
+if (ExileClientPlayerIsInCombat) then
+{
+ ["ErrorTitleAndText", ["Construction aborted!", "You cannot build during a combat."]] call ExileClient_gui_toaster_addTemplateToast;
+}
+else
+{
+ ExileClientConstructionObject = _this;
+ ExileClientConstructionCanPlaceObject = false;
+ ExileClientConstructionConfig = ("getText(_x >> '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