diff --git a/Changelogs/0.3.4.0.txt b/Changelogs/0.3.4.0.txt
index 9715c158..e6368f6c 100644
--- a/Changelogs/0.3.4.0.txt
+++ b/Changelogs/0.3.4.0.txt
@@ -1,14 +1,26 @@
Client:
-[Added] New secure storage device: Safe
-[Added] New crafting UI and system by Raymix.
+[Added] New secure storage device: Safe
+[Added] Totally new crafting system and UI.
[Added] Epoch variant of the unarmed Strider vehicle. (I_MRAP_03_EPOCH)
[Added] Melee weapons: a Broad Sword and Fishing Pole.
[Added] Halloween Clown mask.
[Fixed] Reduce client fps lag when first joining the server.
-[Changed] Wolf/Pumpkin masks and Meeps Candy re-added to loot tables for Halloween.
-
+[Fixed] Being unable to removal of solar generator.
+[Changed] Removed debug hint text for 3d rotation of objects.
+[Changed] Re-enable Move button.
+[Changed] Halloween Wolf/Pumpkin masks and Meeps Candy re-added to loot tables.
Server:
+[Added] Example code: Epoch Event provides an example on how to broadcast a message to all players using BE.
+[Added] 'CfgTraderLimits' config can control stock limit per trader per item. Default is 100 per item class per trader.
+[Added] storedVehicleLimit variable in CfgEpochServer can now control the total max allowed vehicles on traders. Default limit is 20.
+[Fixed] Issue with trading vehicles that caused the trader data not to save or to save to the wrong slot.
+[Fixed] Added missing prices for female vests.
[Fixed] Error Generic error in expression in EPOCH_server_repairVehicle.
[Changed] Use new sort command instead of BIS_fncSortBy.
[Changed] Use new worldSize command as default if maps worldSize setting in CfgEpoch does not exist.
+[Info] Removed old .bikey and added new one for 0331.
+[Info] The source code for the a3_epoch_server.pbo is now on the GitHub.
+
+
+MORE TBA
diff --git a/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo b/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo
index 964a36f6..2b77eff3 100644
Binary files a/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo and b/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo differ
diff --git a/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo b/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo
index 50524969..6911a4f5 100644
Binary files a/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo and b/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo differ
diff --git a/Server_Install_Pack/sc/battleye/scripts.txt b/Server_Install_Pack/sc/battleye/scripts.txt
index 1a929bf8..4b10b423 100644
--- a/Server_Install_Pack/sc/battleye/scripts.txt
+++ b/Server_Install_Pack/sc/battleye/scripts.txt
@@ -35,7 +35,7 @@
7 createAgent !="_unit = createAgent[_unitClass, _targetPos, [], 256, \"FORM\"];" !="_unit = createAgent [_unitClass, _targetPos, [], 120, \"FORM\"];" !="_animal = createAgent[_randomAIClass, _animalPos, [], 5, \"NONE\"];" !="_unit = createAgent [\"Epoch_Cloak_F\", _pos, [], 0, \"CAN_COLLIDE\"];" !="_unit = createAgent [\"Epoch_Sapper_F\", _targetPos, [], 180, \"FORM\"];" !="_sapper = createAgent ["Epoch_Sapper_F", getPos _cage2, [], 0, "FORM"];"
7 createTeam
7 createDialog !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog \"TapOut\";" !="if !(createdialog \"Trade\") exitWith {};" !="_ok = createdialog \"Interact\";" !="_ok = createdialog \"TradeNPCMenu\";" !="createDialog \"Epoch_myGroup\";" !="createDialog (if ((Epoch_my_GroupUID == \"\") && (Epoch_my_Group isEqualTo [])) then {\"EPOCH_createGrp\"} else {\"Epoch_myGroup\"});" !="createDialog \"GroupRequests\";" !="_ok = createdialog \"MissionSelect\";" !="createDialog 'Skaronator_AdminMenu';"
-7 createDisplay !="createDisplay \"rmx_dynamenu\";"
+7 createDisplay !="createDisplay \"rmx_dynamenu\";" !="_parent createdisplay _displayClass;"
7 deleteMarker
7 setMarker
7 createMarker
@@ -50,7 +50,7 @@
7 addEventHandler !"displayAddEventHandler" !"ctrlAddEventHandler" !"FiredNear" !"EpeContactStart" !"InventoryClosed" !"GetOut" !"InventoryOpened" !"local" !"Respawn" !"Put" !"Take" !"Fired" !"Killed" !" [\"PostReset\",{BIS_EnginePPReset = true;} ];" !"_logic addeventhandler [\n\"local\""
7 displayAddEventHandler !"[_display] call _fnc_animate;" !"tVersion select 4) == \"Development\") then" !"_display displayaddeventhandler\n[\n\"mousemoving\"," !"(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"true\"];" !"(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"_this call EPOCH_KeyDown\"];" !="_addCase = _display46 displayAddEventHandler ['KeyDown',{_this call EPOCH_KeyDown;}];" !"_display displayaddeventhandler [\"unload\",\"uinamespace setvariable ['BIS_fnc_guiMess" !="findDisplay -1337 displayAddEventHandler ['Unload'" !="_display displayaddeventhandler [\"keydown\",\"with uinamespace do {['keyDown'"
7 ctrlAddEventHandler !"rCfg >> \"refreshDelay\");" !" [\n\"draw\"," !" [\"buttonclick\"," !="(uiNamespace getVariable 'ESP_map') ctrlAddEventHandler['Draw', '_esp_targets = EPOCH_ESPMAP_TARGETS;" !="ctrlAddEventHandler ['MouseButtonDown'" !="(_display displayctrl _idc) ctrlAddEventHandler [\"LBSelChanged\"," !="_ctrl ctrlSetEventHandler [\"mouseEnter\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseExit\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseButtonDown\", (format [\"call %1;\",(_buttonSettings select _e select 2)])];"
-7 removeAllEventHandlers !="ctrlRemoveAllEventHandlers" !="_vehicle removeAllEventHandlers \"GetOut\";" !="_sapper removeAllEventHandlers \"Hit\";\n_sapper removeAllEventHandlers \"FiredNear\";" !="_display46 displayRemoveAllEventHandlers 'KeyDown';"
+7 removeAllEventHandlers !="ctrlRemoveAllEventHandlers" !="_vehicle removeAllEventHandlers \"GetOut\";" !="_sapper removeAllEventHandlers \"Hit\";\n_sapper removeAllEventHandlers \"FiredNear\";" !="_unit removeAllEventHandlers \"Hit\";\n_unit removeAllEventHandlers \"FiredNear\";" !="_display46 displayRemoveAllEventHandlers 'KeyDown';"
7 removeAllMissionEventHandlers
7 ctrlRemoveAllEventHandlers !="(uiNamespace getVariable 'ESP_map') ctrlRemoveAllEventHandlers 'Draw';" !="ctrlAddEventHandler ['MouseButtonDown'"
7 removeEventHandler !="displayRemoveEventHandler" !="player removeEventHandler ['Fired', 0];" !"_currentTarget removeEventHandler[\"EpeContactStart\", _onContactEH]" !" [_adminVar,objnull];\npublicvariable _adminVar;\nplayer removeeventhandler [\"respawn\",_respawn];" !="_plyr removeEventHandler [\"FiredNear\", _smokeEH];" !="player removeEventHandler [_ehKey, 0];"
diff --git a/Sources/epoch_code/System/sapperSwarmMember.fsm b/Sources/epoch_code/System/sapperSwarmMember.fsm
index 9f98883c..66ded764 100644
--- a/Sources/epoch_code/System/sapperSwarmMember.fsm
+++ b/Sources/epoch_code/System/sapperSwarmMember.fsm
@@ -528,12 +528,12 @@ class FSM
"" \n
" };" \n
"" \n
- "deleteMarkerLocal _mkrName4;" \n
- "_mkrName4 = format[""axeD%1"", _unit];" \n
- "_mkr2 = createMarkerLocal [_mkrName4, _nextPos];" \n
- "_mkrName4 setMarkerShapeLocal ""ICON"";" \n
- "_mkrName4 setMarkerTypeLocal ""mil_dot"";" \n
- "_mkrName4 setMarkerColorLocal ""COLORYELLOW"";" \n
+ "//deleteMarkerLocal _mkrName4;" \n
+ "//_mkrName4 = format[""axeD%1"", _unit];" \n
+ "//_mkr2 = createMarkerLocal [_mkrName4, _nextPos];" \n
+ "//_mkrName4 setMarkerShapeLocal ""ICON"";" \n
+ "//_mkrName4 setMarkerTypeLocal ""mil_dot"";" \n
+ "//_mkrName4 setMarkerColorLocal ""COLORYELLOW"";" \n
"};" \n
"" \n
"" \n
diff --git a/Sources/epoch_code/compile/building/EPOCH_fnc_SelectTarget.sqf b/Sources/epoch_code/compile/building/EPOCH_fnc_SelectTarget.sqf
index aeb6206c..8d285900 100644
--- a/Sources/epoch_code/compile/building/EPOCH_fnc_SelectTarget.sqf
+++ b/Sources/epoch_code/compile/building/EPOCH_fnc_SelectTarget.sqf
@@ -1,8 +1,7 @@
-private [];
+private ["_dt","_object","_objType","_dialog","_handled","_config","_upgrade","_remove"];
+
if !(isNil "EPOCH_simulSwap_Lock") exitWith{ false };
-
if !(isNull EPOCH_Target) exitWith{ false };
-
if (EPOCH_playerEnergy <= 0) exitWith{ _dt = ["Need energy", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext; false };
_object = _this;
@@ -12,17 +11,9 @@ if ((player distance _object) > 9) exitWith { false };
_objType = typeOf _object;
-_isFoundation = _object isKindOf "Constructions_foundation_F";
-_isJammer = _object isKindOf "PlotPole_EPOCH";
-_isStorage = _object isKindOf "Buildable_Storage";
-
-if (!(_object isKindOf "ThingX") && !(_object isKindOf "Constructions_static_F") && !_isFoundation && !_isStorage && !_isJammer) exitWith{ false };
-
_dialog = "InteractBaseBuilding";
_handled = createdialog _dialog;
-// disable actions if no upgrade options
-
_config = 'CfgBaseBuilding' call EPOCH_returnConfig;
_upgrade = getArray(_config >> _objType >> "upgradeBuilding");
@@ -33,9 +24,8 @@ _remove = getArray(_config >> _objType >> "removeParts");
if (_remove isEqualTo[]) then{
ctrlEnable[2401, false];
};
-
-// disable Move option if foundation or jammer
-if (_isFoundation || _isJammer || _isStorage) then{
+// disable Move option if not SIM
+if !(_object isKindOf "ThingX") then{
ctrlEnable[2402, false];
};
diff --git a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
index aafce506..d41f34e2 100644
--- a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
+++ b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
@@ -145,8 +145,8 @@ if (vehicle player == player) then {
case EPOCH_keysBuildMovBak: { EPOCH_Y_OFFSET = (EPOCH_Y_OFFSET - 0.1) max 2; _handled = true };
case EPOCH_keysBuildMovL: { EPOCH_X_OFFSET = (EPOCH_X_OFFSET + 0.1) min 5; _handled = true };
case EPOCH_keysBuildMovR: { EPOCH_X_OFFSET = (EPOCH_X_OFFSET - 0.1) max - 5; _handled = true };
- case EPOCH_keysBuildRotL: { EPOCH_buildDirection = (EPOCH_buildDirection + 1) min 360; EPOCH_space = true; hintsilent str(EPOCH_buildDirection); _handled = true };
- case EPOCH_keysBuildRotR: { EPOCH_buildDirection = (EPOCH_buildDirection - 1) max 0; EPOCH_space = true; hintsilent str(EPOCH_buildDirection); _handled = true };
+ case EPOCH_keysBuildRotL: { EPOCH_buildDirection = (EPOCH_buildDirection + 1) min 360; EPOCH_space = true; _handled = true };
+ case EPOCH_keysBuildRotR: { EPOCH_buildDirection = (EPOCH_buildDirection - 1) max 0; EPOCH_space = true; _handled = true };
case EPOCH_keysBuildIt: { cursorTarget call EPOCH_fnc_SelectTarget; _handled = true };
};
};
diff --git a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf
index e2543dba..369c8b8f 100644
--- a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf
+++ b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf
@@ -22,8 +22,8 @@ if !(isNull EPOCH_lastNPCtradeTarget) then {
// find item and get current qty
_qtyIndex = _itemClasses find _uiItem;
if (_qtyIndex != -1) then {
- // TODO allow config here
- if (_itemQtys select _qtyIndex >= 100) then {
+ _limit = ["CfgTraderLimits", _uiItem, 100] call EPOCH_fnc_returnConfigEntryV2;
+ if (_itemQtys select _qtyIndex >= _limit) then{
_stockLimit = true;
_allowAdd = false;
};
diff --git a/Sources/epoch_code/gui/Epoch_GUI_Config.hpp b/Sources/epoch_code/gui/Epoch_GUI_Config.hpp
index 21b1039d..910ab800 100644
--- a/Sources/epoch_code/gui/Epoch_GUI_Config.hpp
+++ b/Sources/epoch_code/gui/Epoch_GUI_Config.hpp
@@ -2249,7 +2249,6 @@ class InteractBaseBuilding
action = "closeDialog 0";
};
- /*
class RscButtonMenu_2402 : RscButtonMenu
{
idc = 2402;
@@ -2260,7 +2259,7 @@ class InteractBaseBuilding
h = 0.08;
action = "closeDialog 0; cursorTarget call EPOCH_fnc_SelectTargetBuild;";
};
- */
+
};
};
/*
diff --git a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_LB_click.sqf b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_LB_click.sqf
index c5c46592..b124ea90 100644
--- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_LB_click.sqf
+++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_LB_click.sqf
@@ -51,9 +51,9 @@ if !(_usedIn isEqualTo []) then {
_ingredientCTRL lbSetColor [_idx,(rmx_var_crafting_colorScheme select 9 select 1)];
{
- if !(typeName _x isEqualTo typeName []) then {_x = [_x,1]};
- _data = ([(_cfg >> (_x select 0))] call EPOCH_crafting_getConfig) select 0;
- _idx = _ingredientCTRL lbAdd format ["%2 x %1",(_data select 1),_x select 1];
+ //if !(typeName _x isEqualTo typeName []) then {_x = [_x,1]};
+ _data = ([(_cfg >> _x)] call EPOCH_crafting_getConfig) select 0;
+ _idx = _ingredientCTRL lbAdd format ["%1",(_data select 1)];
_ingredientCTRL lbSetPictureRight [_idx,(_data select 2)];
_ingredientCTRL lbSetData [_idx, (_data select 1)];
_ingredientCTRL lbSetColor [_idx,(rmx_var_crafting_colorScheme select 14)];
diff --git a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_craft.sqf b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_craft.sqf
index e40194f0..c11553e3 100644
--- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_craft.sqf
+++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_craft.sqf
@@ -31,7 +31,7 @@ if (rmx_var_craftQTYOut isEqualTo 0) exitWith {closeDialog 0;};
_itemCraftTime = _craftItem select 6;
_itemRecipeItems = _craftItem select 7;
_itemType = _craftItem select 13;
-
+
for "_c" from 1 to rmx_var_craftQTYOut do {
false call _fnc_UILock;
_hasNearby = false call EPOCH_crafting_checkResources;
@@ -39,13 +39,15 @@ if (rmx_var_craftQTYOut isEqualTo 0) exitWith {closeDialog 0;};
_canCraft = [format ["Crafting: %1, %2 seconds",_itemName,_itemCraftTime],_itemCraftTime] call EPOCH_crafting_progress;
if !(_canCraft && _hasNearby && rmx_var_craftingLOOPS) exitWith {}; //{hint "Crafting canceled";};
-
+
+ {
+ if !(typeName _x isEqualTo typeName []) then {_x = [_x,1]};
+ for "_r" from 1 to (_x select 1) do {
+ player removeItem (_x select 0); //removes any type of item, but only if not in special slots
+ };
+ } forEach _itemRecipeItems;
+
if (player canAdd _item) then { //Puts in a weaponholder nearby if can't add to inventory
- {
- for "_r" from 1 to (_x select 1) do {
- player removeItem (_x select 0); //removes any type of item, but only if not in special slots
- };
- } forEach _itemRecipeItems;
player addItem _item; //adds any type of item, but does not assign
@@ -64,9 +66,9 @@ if (rmx_var_craftQTYOut isEqualTo 0) exitWith {closeDialog 0;};
};
_wh addItemCargoGlobal [_item,1];
};
- call EPOCH_crafting_LB_defaults;
call EPOCH_crafting_LB_click;
};
+ call EPOCH_crafting_LB_defaults;
true call _fnc_UILock;
rmx_var_craftInProgress = false;
};
diff --git a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_load.sqf b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_load.sqf
index bb0bb279..ec7919e5 100644
--- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_load.sqf
+++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_load.sqf
@@ -94,6 +94,7 @@ rmx_var_crafting_PP_DB = ["dynamicBlur",11] call epoch_postProcessCreate;
_searchTextTEMP = ctrlText _searchCTRL;
call EPOCH_crafting_LB_defaults;
(rmx_var_crafting_ctrl_main select 0) lbSetCurSel 0;
+ ctrlSetFocus _searchCTRL;
};
};
};
diff --git a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_progress.sqf b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_progress.sqf
index cace5b9f..00a02880 100644
--- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_progress.sqf
+++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_progress.sqf
@@ -19,6 +19,11 @@ _layer = str _idc call BIS_fnc_rscLayer;
_layer cutRsc ["rmx_CraftingProgress","PLAIN",0,false];
_display = uiNamespace getVariable "rmx_var_CraftingProgressDisplay";
+_ctrl3 = _display ctrlCreate ["RscText",_idc + 3];
+_ctrl3 ctrlSetPosition [_posX,_posY,_w,_h];
+_ctrl3 ctrlCommit 0;
+_ctrl3 ctrlSetBackgroundColor (rmx_var_crafting_colorScheme select 21);
+
_ctrl = _display ctrlCreate ["RscProgress",_idc + 1];
_ctrl ctrlSetPosition [_posX,_posY,_w,_h];
_ctrl ctrlCommit 0;
@@ -29,11 +34,6 @@ _ctrl2 ctrlSetPosition [_posX + _w / 2 - (count _txt / 2) / 100,_posY + 0.005,_w
_ctrl2 ctrlCommit 0;
_ctrl2 ctrlSetStructuredText parseText format ["%1",_txt,_stColor];
-_ctrl3 = _display ctrlCreate ["RscText",_idc + 3];
-_ctrl3 ctrlSetPosition [_posX,_posY,_w,_h];
-_ctrl3 ctrlCommit 0;
-_ctrl3 ctrlSetBackgroundColor (rmx_var_crafting_colorScheme select 21);
-
_tick = diag_tickTime;
while {((diag_tickTime - _tick) < _time && rmx_var_craftingLOOPS) } do {
diff --git a/Sources/epoch_config/Configs/CfgPricing.hpp b/Sources/epoch_config/Configs/CfgPricing.hpp
index 4dc9df9e..3540c93f 100644
--- a/Sources/epoch_config/Configs/CfgPricing.hpp
+++ b/Sources/epoch_config/Configs/CfgPricing.hpp
@@ -488,6 +488,14 @@ class CfgPricing
class U_C_Driver_1_yellow {price = 5;};
class U_C_Driver_1_orange {price = 5;};
+
+ class V_F0_EPOCH { price = 5; };
+ class V_F1_EPOCH { price = 5; };
+ class V_F2_EPOCH { price = 5; };
+ class V_F3_EPOCH { price = 5; };
+ class V_F4_EPOCH { price = 5; };
+ class V_F5_EPOCH { price = 5; };
+
class V_1_EPOCH {price = 5;};
class V_2_EPOCH {price = 5;};
class V_3_EPOCH {price = 5;};
diff --git a/Sources/epoch_config/Configs/CfgVehicles.hpp b/Sources/epoch_config/Configs/CfgVehicles.hpp
index a46608fb..6735876d 100644
--- a/Sources/epoch_config/Configs/CfgVehicles.hpp
+++ b/Sources/epoch_config/Configs/CfgVehicles.hpp
@@ -2493,7 +2493,7 @@ class CfgVehicles
{
scope = 2;
model = "\x\addons\a3_epoch_assets\models\cGarage_SIM.p3d";
- displayName = "Cinder Block Wall";
+ displayName = "Cinder Block Garage";
simulClass = "CinderWallGarage_SIM_EPOCH";
staticClass = "CinderWallGarage_EPOCH";
GhostPreview = "CinderWallGarage_EPOCH";
@@ -3440,7 +3440,7 @@ class CfgVehicles
ladders[] = {};
};
- class SolarGen_EPOCH : NonStrategic
+ class SolarGen_EPOCH : Constructions_static_F
{
mapSize = 1.27;
author = "Epoch: SteamPunkGears";
@@ -3705,7 +3705,7 @@ class CfgVehicles
{
scope = 2;
model = "\x\addons\a3_epoch_assets\models\cGarage.p3d";
- displayName = "Cinder Block Wall";
+ displayName = "Cinder Block Garage";
simulClass = "CinderWallGarage_SIM_EPOCH";
staticClass = "CinderWallGarage_EPOCH";
GhostPreview = "CinderWallGarage_EPOCH";
@@ -4961,7 +4961,7 @@ class CfgVehicles
class SafeProxy_EPOCH : Secure_Storage_Proxy
{
scope = 2;
- model = "\A3\Weapons_f\dummyweapon.p3d";
+ model = "\x\addons\a3_epoch_assets_1\models\safe_proxy.p3d";
displayName = "Safe WH";
isGround = 0;
showWeaponCargo = 0;
diff --git a/Sources/epoch_config/Configs/CfgWeapons.hpp b/Sources/epoch_config/Configs/CfgWeapons.hpp
index c3014009..ec5d6b2e 100644
--- a/Sources/epoch_config/Configs/CfgWeapons.hpp
+++ b/Sources/epoch_config/Configs/CfgWeapons.hpp
@@ -1116,7 +1116,7 @@ class CfgWeapons
scope = 2;
weaponPoolAvailable = 1;
displayName = "Clown Mask";
- picture = "\x\addons\a3_epoch_assets_3\CfgVehicles\Characters\gear_clownmask_ca.paa";
+ picture = "\x\addons\a3_epoch_assets_3\CfgVehicles\Characters\clown\gear_clownmask_ca.paa";
model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Characters\clown.p3d";
class ItemInfo : HeadgearItem
{
diff --git a/Sources/epoch_config/Configs/cfgCrafting.hpp b/Sources/epoch_config/Configs/cfgCrafting.hpp
index e00daa10..857c5671 100644
--- a/Sources/epoch_config/Configs/cfgCrafting.hpp
+++ b/Sources/epoch_config/Configs/cfgCrafting.hpp
@@ -34,7 +34,7 @@ class CfgCrafting
{"Recipes", {0,0,0,0.8}},
{"Ingredients", {0,0,0,0.8}},
- {"Preview", {1,0.6,0.01,0.8}},
+ {"Preview", {0.76,0.5,0.07,0.8}},
{"Resources", {0,0,0,0.8}},
{"Description", {0,0,0,0.8}},
{" -- Requires -- ", {0.99,0.53,0.03,1}},
@@ -44,18 +44,18 @@ class CfgCrafting
{0,1,0,1}, //Ingredients LB, Has items on player
{1,1,0,1}, //Ingredients LB, Has items nearby
{1,0,0,1}, //Ingredients LB, Missing items
- {0.5,0.5,0.5,1},//Ingredients LB, Items used in...
+ {1,1,1,1}, //Ingredients LB, Items used in...
{0,0,0,0.1}, //Background color
{0,0,0,1}, //Frame color
{0,0,0,0}, //description ST
{0,0,0,0}, //Recipe LB
{0,0,0,0}, //Ingredients LB
- {1,1,1,1}, //progress bar
- {0,0,0,0.3}, //progress background
- "#FC170F", //progress text HTML color
+ {0.76,0.5,0.07,0.8}, //progress bar
+ {0,0,0,0.3}, //progress background
+ "#FFFFFF", //progress text HTML color
- {1,0.6,0.01,1} //QTY color
+ {1,0.6,0.01,1} //QTY color
};
/** --------- Don't edit --------- **/
@@ -600,6 +600,7 @@ class CfgCrafting
previewPosition[] = {0.797837,1,0.288258};
previewScale = 0.2;
previewVector = 1;
+ craftTime = 2;
};
class KitFirePlace : Kit
{
diff --git a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf
index 26639f00..a0ef0934 100644
--- a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf
+++ b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf
@@ -12,6 +12,9 @@ _staticTradersArray = getArray(configFile >> "CfgEpoch" >> worldName >> "staticN
_staticTradersArrCount = count _staticTradersArray;
_aiTables = ["U_OG_leader", "U_C_Poloshirt_stripped", "U_C_Poloshirt_blue", "U_C_Poloshirt_burgundy", "U_C_Poloshirt_tricolour", "U_C_Poloshirt_salmon", "U_C_Poloshirt_redwhite", "U_C_Poor_1", "U_C_WorkerCoveralls", "U_C_Journalist", "U_C_Scientist", "U_OrestesBody"];
+_serverSettingsConfig = configFile >> "CfgEpochServer";
+_storedVehicleLimit = [_serverSettingsConfig, "storedVehicleLimit", 20] call EPOCH_fnc_returnConfigEntry;
+
EPOCH_storedVehicleCount = 0;
for "_i" from 0 to _this do {
@@ -54,12 +57,37 @@ for "_i" from 0 to _this do {
_arr = [[], []];
};
+ _toBeRemoved = [];
// count vehicles
{
+ _limit = ["CfgTraderLimits", _x, 100] call EPOCH_fnc_returnConfigEntryV2;
+ if (_limit == 0) then {
+ // mark for removal since limit is 0
+ _toBeRemoved pushBack _forEachIndex;
+ } else {
+ // lower to limit current qty is over limit
+ _currentStock = (_arr select 1) select _forEachIndex;
+ if (_currentStock > _limit) then {
+ (_arr select 1) set [_forEachIndex,_limit];
+ _currentStock = _limit;
+ };
+ };
if (_x isKindOf "Air" || _x isKindOf "Ship" || _x isKindOf "LandVehicle" || _x isKindOf "Tank") then {
- EPOCH_storedVehicleCount = EPOCH_storedVehicleCount + ((_arr select 1) select _forEachIndex);
+ if (EPOCH_storedVehicleCount <= _storedVehicleLimit) then {
+ EPOCH_storedVehicleCount = EPOCH_storedVehicleCount + _currentStock;
+ } else {
+ _toBeRemoved pushBack _forEachIndex;
+ };
+
};
} forEach (_arr select 0);
+
+ // remove any marked for removal
+ {
+ (_arr select 0) deleteAt _x;
+ (_arr select 1) deleteAt _x
+ } forEach _toBeRemoved;
+
};
if (_arr isEqualTo [[], []]) then{
diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf
index aed926e7..1873641c 100644
--- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf
+++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf
@@ -12,10 +12,10 @@ if (getNumber(configFile >> "CfgVehicles" >> _type >> "isSecureStorage") == 1) t
_parentID = _unit getVariable ["EPOCH_secureStorage", "-1"];
_weaponHolder = missionNamespace getVariable [format ["EPOCH_STORAGE_%1",_parentID], objNull];
- //diag_log format["_parentID %1", _parentID];
+ diag_log format["_parentID %1", _parentID];
if (!isNull _weaponHolder) then {
_owners = _weaponHolder getVariable["STORAGE_OWNERS", []];
- //diag_log format["_owners %1", _owners];
+ diag_log format["_owners %1", _owners];
// allow group members and owner access
_plyrUID = getPlayerUID _plyr;
@@ -29,8 +29,9 @@ if (getNumber(configFile >> "CfgVehicles" >> _type >> "isSecureStorage") == 1) t
_response = ["Group", _plyrGroup] call EPOCH_fnc_server_hiveGETRANGE;
if ((_response select 0) == 1 && typeName(_response select 1) == "ARRAY") then {
_gArray = _response select 1;
+ diag_log format["_gArray %1 _plyrUID %2 _plyrGroup %3", _gArray, _plyrUID, _plyrGroup];
if (
- { (_x select 0) in _owners }count(_gArray select 3) > 0 ||
+ {(_x select 0) in _owners }count(_gArray select 3) > 0 ||
{(_x select 0) in _owners}count(_gArray select 4) > 0 ||
_plyrUID in _owners
) then {
@@ -49,10 +50,10 @@ if (getNumber(configFile >> "CfgVehicles" >> _type >> "isSecureStorage") == 1) t
_parentID = _unit getVariable ["EPOCH_secStorParent", -1];
_parent = missionNamespace getVariable [format ["EPOCH_BUILD_%1", _parentID], objNull];
- //diag_log format["_parentID2 %1", _parentID];
+ diag_log format["_parentID2 %1", _parentID];
if (!isNull _parent) then {
_owners = _unit getVariable["STORAGE_OWNERS", []];
- //diag_log format["_owners %1", _owners];
+ diag_log format["_owners2 %1", _owners];
// allow group members and owner access
_plyrUID = getPlayerUID _plyr;
@@ -61,6 +62,7 @@ if (getNumber(configFile >> "CfgVehicles" >> _type >> "isSecureStorage") == 1) t
_response = ["Group", _plyrGroup] call EPOCH_fnc_server_hiveGETRANGE;
if ((_response select 0) == 1 && typeName (_response select 1) == "ARRAY") then {
_gArray = _response select 1;
+ diag_log format["_gArray2 %1 _plyrUID %2 _plyrGroup %3", _gArray, _plyrUID, _plyrGroup];
if (
{(_x select 0) in _owners}count(_gArray select 3) > 0 ||
{(_x select 0) in _owners}count(_gArray select 4) > 0 ||
diff --git a/Sources/epoch_server/init/server_variables.sqf b/Sources/epoch_server/init/server_variables.sqf
index 0fded8cd..3121ed3c 100644
--- a/Sources/epoch_server/init/server_variables.sqf
+++ b/Sources/epoch_server/init/server_variables.sqf
@@ -26,7 +26,7 @@ _configArray = [
["antagonistChanceTrash", 0.09],
["antagonistChancePDeath", 0.33],
["antagonistChanceLoot", 0.09],
- ["allowedVehiclesList",
+ ["allowedVehiclesList",
[
["C_Offroad_01_EPOCH", 8],
["C_Quadbike_01_EPOCH", 8],
@@ -45,7 +45,7 @@ _configArray = [
["B_Heli_Light_01_EPOCH", 2],
["B_SDV_01_EPOCH", 2],
["B_MRAP_01_EPOCH", 3],
- ["I_MRAP_03_EPOCH", 3],
+ ["I_MRAP_03_EPOCH", 3],
["B_Truck_01_transport_EPOCH", 1],
["B_Truck_01_covered_EPOCH", 2],
["B_Truck_01_mover_EPOCH", 1],
@@ -69,7 +69,7 @@ _configArray = [
["K04", 2],
["ebike_epoch", 7],
["mosquito_epoch", 5],
- ["C_Heli_Light_01_civil_EPOCH",5]
+ ["C_Heli_Light_01_civil_EPOCH",5]
]
],
["taxRate", 0.1],
@@ -122,4 +122,4 @@ if (!isNil "EPOCH_allowedVehiclesList") then {
_vehicleSlotLimit = 0;
{_vehicleSlotLimit = _vehicleSlotLimit + (_x select 1)} forEach EPOCH_allowedVehiclesList;
EPOCH_VehicleSlotsLimit = _vehicleSlotLimit;
-};
\ No newline at end of file
+};