diff --git a/@ExileServer/addons/exad_dv/$PREFIX$ b/@ExileServer/addons/exad_dv/$PREFIX$
new file mode 100644
index 0000000..31b4497
--- /dev/null
+++ b/@ExileServer/addons/exad_dv/$PREFIX$
@@ -0,0 +1 @@
+exad_dv
\ No newline at end of file
diff --git a/@ExileServer/addons/exad_dv/Functions/fn_despawnDeployableVehicle.sqf b/@ExileServer/addons/exad_dv/Functions/fn_despawnDeployableVehicle.sqf
new file mode 100644
index 0000000..7c57ca7
--- /dev/null
+++ b/@ExileServer/addons/exad_dv/Functions/fn_despawnDeployableVehicle.sqf
@@ -0,0 +1,73 @@
+/*
+ fn_createMarker.sqf
+
+ Copyright 2016 Jan Babor
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+params ["_vehObjNetId"];
+
+_vehObj = objectFromNetId _vehObjNetId;
+_vehClass = typeOf _vehObj;
+_vehPos = getPosATL _vehObj;
+
+moveOut (driver _vehObj);
+_vehObj call ExileServer_system_vehicleSaveQueue_removeVehicle;
+_vehObj call ExileServer_system_simulationMonitor_removeVehicle;
+deleteVehicle _vehObj;
+
+{
+ if(getText(missionConfigFile >> "CfgXM8" >> _x >> "vehicleClass") == _vehClass)exitWith{
+
+ _lootHolder = createVehicle ["LootWeaponHolder", _vehPos, [], 0, "CAN_COLLIDE"];
+ _lootHolder setDir (random 360);
+ _lootHolder setPosATL _vehPos;
+
+ {
+ _amount = if(count _x > 1)then{_x select 1}else{1};
+ if(_amount > 0)then{
+ _itemClassName = _x select 0;
+ _cargoType = _itemClassName call ExileClient_util_cargo_getType;
+ switch (_cargoType) do
+ {
+ case 1:
+ {
+ if (_itemClassName isEqualTo "Exile_Item_MountainDupe") then
+ {
+ _lootHolder addMagazineCargoGlobal [_itemClassName, _amount];
+ }
+ else
+ {
+ _lootHolder addMagazineCargoGlobal [_itemClassName, _amount];
+ };
+ };
+ case 3:
+ {
+ _lootHolder addBackpackCargoGlobal [_itemClassName, _amount];
+ };
+ case 2:
+ {
+ _lootHolder addWeaponCargoGlobal [_itemClassName, _amount];
+ };
+ default
+ {
+ _lootHolder addItemCargoGlobal [_itemClassName, _amount];
+ };
+ };
+ };
+ }forEach getArray(missionConfigFile >> "CfgXM8" >> _x >> "recipe");
+ };
+}forEach ((missionConfigfile >> "CfgXM8") call BIS_fnc_getCfgSubClasses);
+
+true
\ No newline at end of file
diff --git a/@ExileServer/addons/exad_dv/Functions/fn_spawnDeployableVehicle.sqf b/@ExileServer/addons/exad_dv/Functions/fn_spawnDeployableVehicle.sqf
new file mode 100644
index 0000000..564685a
--- /dev/null
+++ b/@ExileServer/addons/exad_dv/Functions/fn_spawnDeployableVehicle.sqf
@@ -0,0 +1,64 @@
+/*
+ fn_createMarker.sqf
+
+ Copyright 2016 Jan Babor
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+params ["_playerNetId","_configClass","_player","_spawnPos","_spawnDir","_usePositionATL","_vehObj"];
+
+_player = objectFromNetId _playerNetId;
+
+_spawnPos = _player modelToWorld [0,2,0];
+_spawnDir = direction _player;
+_usePositionATL = true;
+
+_vehicleClass = getText(missionConfigFile >> "CfgXM8" >> _configClass >> "vehicleClass");
+
+_vehObj = [_vehicleClass, _spawnPos, _spawnDir, _usePositionATL] call ExileServer_object_vehicle_createNonPersistentVehicle;
+
+if( getNumber(missionConfigFile >> "CfgXM8" >> _configClass >> "packable") > 0 ) then {
+ _vehObj setVariable ["ExAd_DV_Packable", true, true];
+};
+
+if( getNumber(missionConfigFile >> "CfgXM8" >> _configClass >> "autoCleanUp") > 0 ) then {
+ [_vehObj] spawn {
+ private ["_wait","_tick", "_vehObj","_driver"];
+ _wait = true;
+ _tick = 0;
+ _vehObj = [_this,0,objNull] call BIS_fnc_param;
+
+ while {_wait} do {
+ UISleep 1;
+ if(isNull _vehObj)exitWith{_wait = false};
+
+ _driver = driver _vehObj;
+ if(isNull _driver)then{
+ _tick = _tick + 1;
+ }else{
+ _tick = 0;
+ };
+
+ if(_tick >= ExAd_DV_DESPAWN_IDLE_TIME)exitWith{_wait = false};
+ };
+
+ moveOut (driver _vehObj);
+ _vehObj call ExileServer_system_vehicleSaveQueue_removeVehicle;
+ _vehObj call ExileServer_system_simulationMonitor_removeVehicle;
+ deleteVehicle _vehObj;
+
+ };
+};
+
+true
\ No newline at end of file
diff --git a/@ExileServer/addons/exad_dv/PboPrefix.txt b/@ExileServer/addons/exad_dv/PboPrefix.txt
new file mode 100644
index 0000000..31b4497
--- /dev/null
+++ b/@ExileServer/addons/exad_dv/PboPrefix.txt
@@ -0,0 +1 @@
+exad_dv
\ No newline at end of file
diff --git a/@ExileServer/addons/exad_dv/config.cpp b/@ExileServer/addons/exad_dv/config.cpp
new file mode 100644
index 0000000..e45f151
--- /dev/null
+++ b/@ExileServer/addons/exad_dv/config.cpp
@@ -0,0 +1,46 @@
+/*
+ config.cpp
+
+ Copyright 2016 Jan Babor
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+class CfgPatches {
+ class ExAd_DV {
+ requiredVersion = 0.1;
+ requiredAddons[] = {"ExAd_Core"};
+ };
+};
+
+class CfgFunctions {
+ class ExAdServer {
+ class DV {
+ file = "exad_dv\Functions";
+ class spawnDeployableVehicle {};
+ class despawnDeployableVehicle {};
+ };
+ };
+};
+
+class CfgNetworkMessages
+{
+ class spawnDeployableVehicle
+ {
+ parameters[] = {"STRING","STRING"};
+ };
+ class despawnDeployableVehicle
+ {
+ parameters[] = {"STRING"};
+ };
+};
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bcb27f6..ea3934d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,13 @@
#
# Changelog:
+## 160726 17:15 . v0.7.10
+### Fixed
+* Apply custom functions to "More" app buttons. (XM8)
+
+### Added
+* New App, deploy vehicles (XM8)
+
## 160720 01:15 . v0.7.9
### Fixed
* Some design flaws in the Apps functions. (XM8)
diff --git a/docs/XM8/changelog.md b/docs/XM8/changelog.md
index 28dca88..dae7805 100644
--- a/docs/XM8/changelog.md
+++ b/docs/XM8/changelog.md
@@ -1,6 +1,13 @@
#VirtualGarage
## Changelog:
+## 160726 17:15 . v0.7.10
+### Fixed
+* Apply custom functions to "More" app buttons.
+
+### Added
+* New App, deploy vehicles
+
## 160720 01:15 . v0.7.9
### Fixed
* Some design flaws in the Apps functions.
diff --git a/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/DeployVehicle/INSTALL.md b/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/DeployVehicle/INSTALL.md
new file mode 100644
index 0000000..1ebe993
--- /dev/null
+++ b/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/DeployVehicle/INSTALL.md
@@ -0,0 +1,84 @@
+#Installation Instructions
+
+* Move "DeployVehicle" into your "mpmissions\Exile.Tanoa\ExAdClient\XM8\Apps\" folder.
+* Navigate and open "mpmissions\Exile.Tanoa\config.cpp" insert the classes "PackDeployedVehicle" into appropriate parent classes.
+```cpp
+class CfgInteractionMenus
+{
+ class Car
+ {
+ targetType = 2;
+ target = "Car";
+
+ class Actions
+ {
+ class PackDeployedVehicle: ExileAbstractAction
+ {
+ title = "Pack Vehicle";
+ condition = "call ExAd_XM8_DV_fnc_canPack";
+ action = "call ExAd_XM8_DV_fnc_pack";
+ };
+ };
+ };
+ class Bikes
+ {
+ targetType = 2;
+ target = "Bicycle";
+
+ class Actions
+ {
+ class PackDeployedVehicle: ExileAbstractAction
+ {
+ title = "Pack Bike";
+ condition = "call ExAd_XM8_DV_fnc_canPack";
+ action = "call ExAd_XM8_DV_fnc_pack";
+ };
+ };
+ };
+};
+```
+
+* Move over and pack exad_dv into "@ExileServer\addons\"
+* Add deploy classes into CfgXM8 in "mpmissions\Exile.Tanoa\config.cpp" and add them to the extraApps array; E.g.
+```cpp
+class CfgXM8
+{
+ extraApps[] = {"ExAd_Bike","ExAd_Quad"};
+
+ class ExAd_Bike
+ {
+ title = "Deploy Bike";
+ config = "ExadClient\XM8\Apps\DeployVehicle\config.sqf";
+ bambiState = 0;
+ vehicleClass = "Exile_Bike_MountainBike";
+ recipe[] = {{"Exile_Item_ExtensionCord",-1}};
+ packable = 1;
+ autoCleanUp = 1;
+ quickFunction = "['ExAd_Bike'] call ExAd_XM8_DV_fnc_spawnVehicle";
+ };
+ class ExAd_Quad
+ {
+ title = "Deploy Quad";
+ bambiState = 0;
+ vehicleClass = "Exile_Bike_QuadBike_Fia";
+ recipe[] = {{"Exile_Item_ExtensionCord",1}};
+ packable = 1;
+ quickFunction = "['ExAd_Quad'] call ExAd_XM8_DV_fnc_spawnVehicle";
+ };
+};
+
+```
+## How to use
+Each class added to the CfgXM8 will represent a vehicle possible to deploy and add commit a "More" button to it.
+One of the deploy classes needs to include the config script so all needed functions will be prepared and read to memory.
+
+### Options
+* title = "Deploy Bike"; -- Button title
+* bambiState = 0; -- Bambistate required || 1 = True / 0 = False
+* vehicleClass = "Exile_Bike_MountainBike"; -- CfgVehicles class name of desired vehicle
+* recipe[] = {
+ {"Exile_Item_ExtensionCord",-1}
+ }; -- items needed to craft vehicle, first class name then amount (-1 means required but will not be taken from inventory)
+* packable = 1; -- Deployed vehicle can be pack again || 1 = True / 0 = False
+* autoCleanUp = 1; -- Server monitize crafted vehicles and despawn if idle to long. || 1 = True / 0 = False
+* quickFunction = "['ExAd_Bike'] call ExAd_XM8_DV_fnc_spawnVehicle"; -- Function that is binded to the button if slide is not neccessary.
diff --git a/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/DeployVehicle/config.sqf b/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/DeployVehicle/config.sqf
new file mode 100644
index 0000000..d7a1f5a
--- /dev/null
+++ b/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/DeployVehicle/config.sqf
@@ -0,0 +1,132 @@
+ExAd_DV_DESPAWN_IDLE_TIME = 600;
+
+ExAd_XM8_DV_fnc_itemsInCargo = {
+ params ["_container","_itemArray","_item","_amount","_response"];
+
+ _item = toLower (_itemArray select 0);
+ _amount = _itemArray select 1;
+
+ _response = false;
+ {
+ if(_item == toLower _x)then{
+ _amount = _amount - 1;
+ };
+ if(_amount <= 0)exitWith{_response = true}
+ }forEach magazines player;
+
+ _response
+};
+
+ExAd_XM8_DV_fnc_itemsMissing = {
+ params["_recipe","_recipeStr"];
+
+ _recipeStr = "";
+ {
+ private["_amount","_configName","_displayName","_text"];
+ _amount = if(count _x > 1)then{_x select 1}else{1};
+ _text = [_x select 0] call ExAd_XM8_DV_fnc_getDisplayName;
+ _recipeStr = _recipeStr + format["%1x : %2
",(if(_amount < 0)then{((-1) * _amount)}else{_amount}), _text];
+ }forEach _recipe;
+
+ _response = format["You need
%1",_recipeStr];
+
+ _response
+};
+
+ExAd_XM8_DV_fnc_getDisplayName = {
+ params["_class","_configName","_displayName"];
+ _configName = _class call ExileClient_util_gear_getConfigNameByClassName;
+ _displayName = getText(configFile >> _configName >> _class >> "displayName");
+ _text = if(count _displayName > 0)then{_displayName}else{_class};
+
+ _text
+};
+
+ExAd_XM8_DV_fnc_canPack = {
+ ( ExileClientInteractionObject getVariable["ExAd_DV_Packable", false] )
+};
+
+ExAd_XM8_DV_fnc_pack = {
+ [ExileClientInteractionObject] spawn {
+ params["_obj"];
+
+ disableUserInput true;
+ player playActionNow "Medic";
+
+ uiSleep 3;
+ ["despawnDeployableVehicle", [netId _obj]] call ExAd_fnc_serverDispatch;
+ uiSleep 1;
+
+ ["SuccessTitleAndText", ["Vehicle Packed"]] call ExileClient_gui_toaster_addTemplateToast;
+ disableUserInput false;
+ };
+};
+
+ExAd_XM8_DV_fnc_spawnVehicle = {
+ params["_slideClass","_bambiState","_delopyRecipe","_vehicleClass"];
+
+ try
+ {
+ _bambiState = if(isNumber(missionConfigFile >> "CfgXM8" >> _slideClass >> "bambiState")) then
+ {
+ if(getNumber(missionConfigFile >> "CfgXM8" >> _slideClass >> "bambiState") > 0)then{true}else{false}
+ } else {true};
+
+ if(_bambiState && !ExileClientPlayerIsBambi) then { throw "You can only spawn vehicles as a bambi!"};
+
+ _delopyRecipe = getArray(missionConfigFile >> "CfgXM8" >> _slideClass >> "recipe");
+ if(count _delopyRecipe > 0) then
+ {
+ {
+ if(count _x > 1) then
+ {
+ _amount = if(_x select 1 == -1)then{1}else{_x select 1};
+ if!([player, [_x select 0, _amount]] call ExAd_XM8_DV_fnc_itemsInCargo) then
+ {
+ throw ([_delopyRecipe] call ExAd_XM8_DV_fnc_itemsMissing);
+ };
+ } else {
+ if!([player, _x select 0] call ExileClient_util_playerEquipment_contains) then
+ {
+ throw ([_delopyRecipe] call ExAd_XM8_DV_fnc_itemsMissing);
+ }
+ }
+ }forEach _delopyRecipe;
+
+ {
+ _count = if(count _x > 1)then{(_x select 1)}else{1};
+ for "_i" from 1 to _count do {
+ [player, _x select 0] call ExileClient_util_playerCargo_remove
+ }
+ }forEach _delopyRecipe;
+ };
+
+ _vehicleClass = getText(missionConfigFile >> "CfgXM8" >> _slideClass >> "vehicleClass");
+ if!(isClass(configFile >> "CfgVehicles" >> _vehicleClass ))then { throw "The vehicle class doesn't exist"};
+
+ [_slideClass] spawn {
+ params["_slideClass"];
+ disableUserInput true;
+ player playActionNow "Medic";
+
+ uiSleep 3;
+ ["spawnDeployableVehicle", [netId player, _slideClass]] call ExAd_fnc_serverDispatch;
+ uiSleep 1;
+ ["SuccessTitleAndText", ["Vehicle deployed"]] call ExileClient_gui_toaster_addTemplateToast;
+ ExileClientXM8CurrentSlide = "extraApps";
+ disableUserInput false;
+ };
+
+ ["extraApps", 1] call ExileClient_gui_xm8_slide;
+ closeDialog 0;
+
+
+ }
+ catch{
+ [_exception] spawn {
+ UISleep 0.5;
+ ["ErrorTitleAndText", ["ExAd - Deploy Vehicle", _this select 0]] call ExileClient_gui_toaster_addTemplateToast;
+ ["extraApps", 1] call ExileClient_gui_xm8_slide;
+ };
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/Info/onOpen.sqf b/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/Info/onOpen.sqf
index 6507030..e037193 100644
--- a/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/Info/onOpen.sqf
+++ b/mpmissions/Exile.Altis/ExAdClient/XM8/Apps/Info/onOpen.sqf
@@ -20,6 +20,7 @@ try
_pos = ctrlPosition _strTxt;
_strTxt ctrlSetPosition [_pos select 0, _pos select 1, _pos select 2, ctrlTextHeight _strTxt];
_strTxt ctrlcommit 0;
+ ([_display,"ExAd_Info","strTxt"] call ExAd_fnc_getAppCtrl) ctrlEnable true;
}
catch
{
diff --git a/mpmissions/Exile.Altis/ExAdClient/XM8/Functions/fn_addApps.sqf b/mpmissions/Exile.Altis/ExAdClient/XM8/Functions/fn_addApps.sqf
index e9ada58..cfe81c6 100644
--- a/mpmissions/Exile.Altis/ExAdClient/XM8/Functions/fn_addApps.sqf
+++ b/mpmissions/Exile.Altis/ExAdClient/XM8/Functions/fn_addApps.sqf
@@ -53,7 +53,10 @@ _pW = 0.025; _pH = 0.04;
[_display,_slide,([_x,format["AppIcon%1",_count2]] call ExAd_fnc_getNextIDC),[(_pos select 0) + 1.5 * _pW, (_pos select 1) + 0.625 * _pH, 3 * _pW, 3 * _pH],_logo,[1,1,1,1],false,true,""] call ExAd_fnc_createPicture;
_ctrl ctrlSetText getText(missionConfigFile >> "CfgXM8" >> _x >> "title");
- _ctrl ctrlSetEventHandler ["ButtonClick", format["['%1', 0] call ExileClient_gui_xm8_slide",_x]];
+ _function = if(isText(missionConfigFile >> "CfgXM8" >> _x >> "quickFunction"))then{
+ getText(missionConfigFile >> "CfgXM8" >> _x >> "quickFunction")
+ } else {format["['%1', 0] call ExileClient_gui_xm8_slide",_x]};
+ _ctrl ctrlSetEventHandler ["ButtonClick", _function];
_count2 = _count2 + 1;
}forEach _apps;
diff --git a/mpmissions/Exile.Altis/config.cpp b/mpmissions/Exile.Altis/config.cpp
index c65e69e..c5c5f95 100644
--- a/mpmissions/Exile.Altis/config.cpp
+++ b/mpmissions/Exile.Altis/config.cpp
@@ -1,6 +1,6 @@
class CfgXM8
{
- extraApps[] = {"ExAd_VG","ExAd_Info","ExAd_CHVD","ExAd_Journal"};
+ extraApps[] = {"ExAd_VG","ExAd_Info","ExAd_CHVD","ExAd_Journal","ExAd_Bike","ExAd_Quad"};
class ExAd_VG
{
@@ -23,13 +23,13 @@ class CfgXM8
class ExAd_CHVD
{
title = "View Distance Settings";
- controlID = 50200; //IDC:50200 -> 50250 || These need to be unique and out of range from each other
+ controlID = 50200; //IDC:50200 -> 50102 || These need to be unique and out of range from each other
config = "ExadClient\XM8\Apps\CHVD\config.sqf";
logo = "ExadClient\XM8\Apps\CHVD\Icon_CHVD.paa";
onLoad = "ExAdClient\XM8\Apps\CHVD\onLoad.sqf";
onOpen = "ExAdClient\XM8\Apps\CHVD\onOpen.sqf";
onClose = "ExAdClient\XM8\Apps\CHVD\onClose.sqf";
- };
+ };
class ExAd_Journal
{
title = "Journal";
@@ -39,7 +39,27 @@ class CfgXM8
onLoad = "ExAdClient\XM8\Apps\Journal\onLoad.sqf";
onOpen = "ExAdClient\XM8\Apps\Journal\onOpen.sqf";
onClose = "ExAdClient\XM8\Apps\Journal\onClose.sqf";
- };
+ };
+ class ExAd_Bike
+ {
+ title = "Deploy Bike";
+ config = "ExadClient\XM8\Apps\DeployVehicle\config.sqf";
+ bambiState = 0;
+ vehicleClass = "Exile_Bike_MountainBike";
+ recipe[] = {{"Exile_Item_ExtensionCord",-1}};
+ packable = 1;
+ autoCleanUp = 1;
+ quickFunction = "['ExAd_Bike'] call ExAd_XM8_DV_fnc_spawnVehicle";
+ };
+ class ExAd_Quad
+ {
+ title = "Deploy Quad";
+ bambiState = 0;
+ vehicleClass = "Exile_Bike_QuadBike_Fia";
+ recipe[] = {{"Exile_Item_ExtensionCord",1}};
+ packable = 1;
+ quickFunction = "['ExAd_Quad'] call ExAd_XM8_DV_fnc_spawnVehicle";
+ };
};
class CfgExileCustomCode
@@ -51,6 +71,36 @@ class CfgExileCustomCode
class CfgInteractionMenus
{
+ class Car
+ {
+ targetType = 2;
+ target = "Car";
+
+ class Actions
+ {
+ class PackDeployedVehicle: ExileAbstractAction
+ {
+ title = "Pack Vehicle";
+ condition = "call ExAd_XM8_DV_fnc_canPack";
+ action = "call ExAd_XM8_DV_fnc_pack";
+ };
+ };
+ };
+ class Bikes
+ {
+ targetType = 2;
+ target = "Bicycle";
+
+ class Actions
+ {
+ class PackDeployedVehicle: ExileAbstractAction
+ {
+ title = "Pack Bike";
+ condition = "call ExAd_XM8_DV_fnc_canPack";
+ action = "call ExAd_XM8_DV_fnc_pack";
+ };
+ };
+ };
class Flag
{
targetType = 2;