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 +};