From 6387f32f8b38fd63727214a9303c9b3c97f530e7 Mon Sep 17 00:00:00 2001 From: vbawol Date: Sat, 16 Sep 2017 12:45:07 -0500 Subject: [PATCH] Dynamic bunker v1 --- .../EpochEvents/DynamicBunker.sqf | 134 ++++++++++++++++++ Sources/epoch_server_bunker_event/build.hpp | 1 + Sources/epoch_server_bunker_event/config.cpp | 37 +++++ Sources/epoch_server_bunker_event/license.txt | 9 ++ .../epoch_server_bunker_event/treeView.txt | Bin 0 -> 466 bytes 5 files changed, 181 insertions(+) create mode 100644 Sources/epoch_server_bunker_event/EpochEvents/DynamicBunker.sqf create mode 100644 Sources/epoch_server_bunker_event/build.hpp create mode 100644 Sources/epoch_server_bunker_event/config.cpp create mode 100644 Sources/epoch_server_bunker_event/license.txt create mode 100644 Sources/epoch_server_bunker_event/treeView.txt diff --git a/Sources/epoch_server_bunker_event/EpochEvents/DynamicBunker.sqf b/Sources/epoch_server_bunker_event/EpochEvents/DynamicBunker.sqf new file mode 100644 index 00000000..15ab018d --- /dev/null +++ b/Sources/epoch_server_bunker_event/EpochEvents/DynamicBunker.sqf @@ -0,0 +1,134 @@ +/* + Author/s: + Aaron Clark - EpochMod.com + + Description: + Spawns Bunker Dynamically on Roadways. + + Improvements and or bugfixes and other contributions are welcome via the github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_bunker_event/EpochEvents/BunkerSpawner.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_allBunkers","_animationStates","_bunkerClasses","_bunkerCounter","_bunkerLocations","_bunkerLocationsKey","_bunkerLocationsTMP","_colCount","_debug","_expiresBunker","_instanceID","_list","_loc1","_location","_maxBunkerLimit","_maxBunkerLimitPerRow","_maxBunkerLimitSlots","_maxColumns","_memoryPoints","_modelInfo","_newBunkerCounter","_object","_originalLocation","_pOffset","_response","_rng","_rngChance","_rowCount","_score","_scriptHiveKey","_seed","_selectedBunker","_size","_veh","_worldSize"]; +//[[[end]]] +if (worldName == "VR") then { + + _debug = false; + _expiresBunker = 604800; + + _memoryPoints = ["one","two","three","four"]; + + _bunkerCounter = 0; + _newBunkerCounter = 0; + _worldSize = worldSize/2; + _instanceID = call EPOCH_fn_InstanceID; + + _maxBunkerLimit = 500; // max total objects to spawn + _rngChance = 0.95; // Lower this to spawn more positions + _scriptHiveKey = "EPOCH:DynamicBunker"; // change this to force a new seed to be generated. + + _bunkerLocationsKey = format ["%1:%2", _instanceID, worldname]; + _response = [_scriptHiveKey, _bunkerLocationsKey] call EPOCH_fnc_server_hiveGETRANGE; + + _response params [["_status",0],["_data",[]] ]; + _bunkerLocations = []; + + + // check for proper return and data type + if (_status == 1 && _data isEqualType [] && !(_data isEqualTo [])) then { + + // spawn cached bunker + { + if (_x isEqualType [] && !(_x isEqualTo [])) then { + _x params ["_selectedBunker", "_posWorld", ["_memoryPointsStatus",[]] ]; + _object = createSimpleObject [_selectedBunker, _posWorld]; + { + _object animate [_x,(_memoryPointsStatus param [_forEachIndex,1]),true]; + } forEach _memoryPoints; + _bunkerCounter = _bunkerCounter + 1; + }; + } forEach _data; + + } else { + + // generate new bunker + _maxBunkerLimitSlots = 100; + _maxBunkerLimitPerRow = 10; + _size = 13.081; + _rngChance = 0.3; + _maxColumns = _maxBunkerLimitSlots / _maxBunkerLimitPerRow; + + _allBunkers = []; + _bunkerLocationsTMP = []; + _newBunkerCounter = 0; + + + // Generate Seed + _seed = random 999999; + diag_log format["Generating bunker with seed: %1",_seed]; + + // starting location corner of map + _location = ATLToASL (getMarkerPos "respawn_west"); + _originalLocation = +_location; + + _bunkerClasses = [ + "bunker_epoch" + ]; + + _rowCount = 0; + _colCount = 0; + + //spawn x number of connected bunkers. + while {true} do { + if (_colCount > _maxColumns) exitWith {}; + _rng = _seed random [_location select 0,_location select 1]; + if (_rng > _rngChance) then { + _selectedBunker = selectRandom _bunkerClasses; + _object = createSimpleObject [_selectedBunker, _location]; + _allBunkers pushBack _object; + //_bunkerLocationsTMP pushBack [_selectedBunker,getPosWorld _object, vectorDir _object, vectorUp _object]; + _newBunkerCounter = _newBunkerCounter + 1; + }; + _location set [0,(_location select 0) + _size]; + _rowCount = _rowCount + 1; + if (_rowCount >= _maxBunkerLimitPerRow) then { + _colCount = _colCount + 1; + _rowCount = 0; + _location set [0,_originalLocation select 0]; + _location set [1,(_location select 1) + _size]; + }; + }; + _score = 0; + { + _veh = _x; + _animationStates = []; + { + _pOffset = _veh selectionPosition _x; + if !(_pOffset isEqualTo [0,0,0]) then { + _loc1 = _veh modelToWorldVisual _pOffset; + _list = nearestObjects[_loc1, [], 1]; + if !(_list isEqualTo []) then { + _veh animate [_x,0,true]; + _score = _score + 1; + _animationStates pushBack 0 + } else { + _animationStates pushBack 1 + }; + }; + } forEach _memoryPoints; + _modelInfo = getModelInfo _veh; + _bunkerLocationsTMP pushBack [_modelInfo select 1, getPosWorld _veh, _animationStates]; + + } forEach _allBunkers; + + // save to DB + [_scriptHiveKey, _bunkerLocationsKey, _expiresBunker, _bunkerLocationsTMP] call EPOCH_fnc_server_hiveSETEX; + }; + + if (_debug) then { + diag_log format["DEBUG: Spawned %1 Existing Bunker",_bunkerCounter]; + if (_newBunkerCounter > 0) then { + diag_log format["DEBUG: Spawned %1 New Bunker.",_newBunkerCounter]; + }; + }; +}; diff --git a/Sources/epoch_server_bunker_event/build.hpp b/Sources/epoch_server_bunker_event/build.hpp new file mode 100644 index 00000000..ebdd6286 --- /dev/null +++ b/Sources/epoch_server_bunker_event/build.hpp @@ -0,0 +1 @@ +build=826; diff --git a/Sources/epoch_server_bunker_event/config.cpp b/Sources/epoch_server_bunker_event/config.cpp new file mode 100644 index 00000000..5291536f --- /dev/null +++ b/Sources/epoch_server_bunker_event/config.cpp @@ -0,0 +1,37 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Epoch Server Event (DynamicBunker) + + Licence: + Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike + + Github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_debris_event/config.cpp +*/ + +#define _ARMA_ + +class CfgPatches { + class A3_server_bunker_event { + requiredVersion = 0.1; + requiredAddons[] = {"A3_server_events"}; + #include "build.hpp" + }; +}; + +// import settings +class CfgEpochServerEvents +{ + class DynamicBunker { + delay = 0; // delay in seconds between executions , + script = "\epoch_server_debris_event\EpochEvents\DynamicBunker.sqf"; // script: name or full path if usePrefix is set to 0 + runOnStart = 1; // runOnStart: 1 = run script at startup, 0 normal delay + usePrefix = 0; // usePrefix: 1 = pre/postfix path (use if file is inside epoch settings pbo EpochEvents folder), 2 = pre/postfix path (use if file inside epoch events pbo EpochEvents folder), 0 = use full file path + runNumTimes = 1; // runNumTimes: -1 = no limit, 0 = disabled, 1+ = number of times to execute before removing event. + input[] = {}; // array input to execVM at time of run and accessed with _this inside of script. + }; +}; diff --git a/Sources/epoch_server_bunker_event/license.txt b/Sources/epoch_server_bunker_event/license.txt new file mode 100644 index 00000000..35440e4b --- /dev/null +++ b/Sources/epoch_server_bunker_event/license.txt @@ -0,0 +1,9 @@ +Epoch Mod for Arma 3 +http://epochmod.com +by Epoch Mod Team +https://github.com/EpochModTeam/Epoch + +The contents of this pbo are under the following license: +http://www.bistudio.com/community/licenses/arma-public-license-share-alike + +Keep this file and file headers with attribution intact for proper use. \ No newline at end of file diff --git a/Sources/epoch_server_bunker_event/treeView.txt b/Sources/epoch_server_bunker_event/treeView.txt new file mode 100644 index 0000000000000000000000000000000000000000..07354a72af82016eebc320f32cbecce587e9206b GIT binary patch literal 466 zcmZvY!AiqW5Jk^g@E`I61{W&mPEECLG^lh{C{2uQA*O0$Rq)%@GpW#uGQ9WZ&D^zZVyXWru&^!HR@)^ApBm+AhD%7K2}iMaMi7 zQ;Tni%HpS6bVxX0mwkHdu*aeOPYITsBZfwEu8i~CXS|yoyQ|QUi7o6E`$|1est(>Ye&t2%8^O>=cK`qY literal 0 HcmV?d00001