diff --git a/CREDITS.md b/CREDITS.md index 6fd29361..ffba6af6 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,18 +1,13 @@ ## [Epoch Projects](https://github.com/EpochModTeam) by [Epoch Mod Team](https://github.com/orgs/EpochModTeam/people) for [Arma 3](https://arma3.com/) -### [Epoch Survival Gamemode](https://github.com/EpochModTeam/Epoch) -Open source survival gamemode for Arma 3. +* [Epoch Survival Gamemode](https://github.com/EpochModTeam/Epoch) - Open source survival gamemode for Arma 3. +* [Epoch Server Framework](https://github.com/EpochModTeam/EpochServer) - Epoch Server DB extension (DLL / so) +* [Epoch Mod](https://github.com/EpochModTeam/EpochCore) - Epoch Assets Mod Configs - Custom Units, Vehicles, Weapons, Items and more! -### [Epoch Server Framework](https://github.com/EpochModTeam/EpochServer) -Epoch Server DB extension (DLL / so) - -### [Epoch Mod](https://github.com/EpochModTeam/EpochCore) -Epoch Assets Mod Configs - Custom Units, Vehicles, Weapons, Items and more! - -#### Developers +#### Initial Developers * [Aaron Clark ([VB]AWOL)](http://epochmod.com): Concept, Code, Configs, Textures * [Kenneth Bente (Axle)](www.twitch.tv/axles): Tester, Models -* [Paul Tomany (Sequisha)](https://www.twitch.tv/sequisha): Models, Textures +* [Paul Tomany (Sequisha)](https://www.twitch.tv/sequisha): Models, Sounds, Textures * [Damian Clark ([VB]GREEN)](http://epochmod.com): Graphics * [Andrew Gregory (Axeman)](http://thefreezer.co.uk): AI Code * [Raimonds Virtoss (Raymix)](https://www.twitch.tv/raymich): UI Code @@ -22,23 +17,24 @@ Epoch Assets Mod Configs - Custom Units, Vehicles, Weapons, Items and more! * [Denis Erygin (devd)](https://github.com/denisio): Linux Code Support * [Paden Sturtevant (SteamPunkGears)](https://www.twitch.tv/steampunkgears): Models, Textures * [Dan Dalsted (OrangeSherbet)](https://www.twitch.tv/OrangeSherbet): Tester, Videos, Wiki Editor +* [Richie](http://uk-gaming-zone.co.uk): Map Support, Forum Moderator -#### Contributors -* [HeMan](https://github.com/Ignatz-HeMan) +#### Community Developers / Contributors +* [DirtySanchez](https://github.com/ravmustang): Vector Build, Vehicle Upgrades and more. +* [HeMan](https://github.com/Ignatz-HeMan): Loads of fixes and improvements. +* [Helion4](https://github.com/Helion4): Models, Configs and fixes. +* [SMVampire](https://github.com/SMVampire) * [$p4rkY](https://github.com/SPKcoding) * [82ndab-Bravo17](https://github.com/82ndab-Bravo17) - http://www.the82ndab.net * [Robio](https://github.com/RC-Robio) -* Craig Hauer "ComatoseBadger": additional "Keesha" Female skin textures. +* [Craig Hauer (ComatoseBadger)](https://twitter.com/comatosebadger): Additional "Keesha" Female skin textures. * [Poulmba](https://www.youtube.com/user/poulmba): Wiki Editor, Tester -* [Richie](http://uk-gaming-zone.co.uk): Map Support, Forum Moderator -* [Tobias Solem](http://whatthepoch.com/): Tester #### Special Thanks! * [Bohemia Interactive](http://bistudio.com) for an incredible and versatile game engine. -* Top Donors: survivalservers, RC_Robio, gtxgaming, dean4310, KPABATOK +* Top Donors: survivalservers, RC_Robio, gtxgaming, dean4310, KPABATOK, Axle, rhinoCRUNCH, Ghostrider-DbD-, Thug, orangesherbet * [GTXGaming](http://www.gtxgaming.co.uk) - Dedicated Dev Server * [Survival Servers](https://www.survivalservers.com) - Dedicated Dev Server -* [Vilayer](https://www.vilayer.com) - Dedicated Dev Server * [Nitrado](https://server.nitrado.net) - Dedicated Dev Server * Also a thanks goes to all the testers and supporters we missed, you know who you are! diff --git a/Changelogs/0.1.0.1.txt b/Changelogs/0.1.0.1.txt deleted file mode 100644 index 1a89218b..00000000 --- a/Changelogs/0.1.0.1.txt +++ /dev/null @@ -1,24 +0,0 @@ -[Added] Test adding mineral spawns at a 30% chance to earthquakes epicenters. -[Added] Added spawning of semi-secure lockbox storage (shared with your group) (only owner can pack). -[Added] Loot added to Sapper and Cultist (press "T" to loot dead body). -[Fixed] Incorrect path for snake corpse model. -[Fixed] Fixed double chickens. -[Fixed] Frequency jammer (Plot pole) now works for both owner and group members. -[Fixed] Group invite system. -[Fixed] Missing alert sound added to Sapper. -[Fixed] fixed description for .22 ruger. -[Fixed] Check for invalid player data and revert to default (fixes some bugged players issues with joining servers). -[Fixed] fixed AI cleanup on player disconnect. -[Changed] Reduced multi gun ammo count to 10 from 99. -[Changed] Increased crafting requirements on many base items (it was kept low for testing). -[Changed] Lower chances to spawn Dogs and lowered animal spawn limit from 6 to 3. -[Changed] Shipping containers now have more loot and (building mats & backpacks). -[Changed] Removed ammo and weapons from Fridge and stove. -[Changed] Increased cultist and sapper armor levels. -[Changed] Try to find a better place to spawn purchased vehicles. -[Changed] Player must be local (last driver) to sell a vehicle. -[Changed] Increased range for buying and selling vehicles. -[Changed] Lowered volume on Dog and Chicken sounds. -[Changed] Server side tax rate on NPC trader purchases (currently 10%). -[Changed] Manipulating base objects now have varying energy consumption. -[Optimize] Disable simulation on any ThingX props at trader cities. diff --git a/Changelogs/0.1.0.2.txt b/Changelogs/0.1.0.2.txt deleted file mode 100644 index 0bad0903..00000000 --- a/Changelogs/0.1.0.2.txt +++ /dev/null @@ -1,31 +0,0 @@ -[Added] New Dog Brain with many new features. http://epochmod.com/forum/index.php?/topic/17052-dog-brain-0102/ -[Added] More event driven chances to spawn antagonists. -[Added] Great White Shark. -[Added] Speargun found only in boats. -[Added] NVG goggles now require Energy to use (5 Energy every 10 sec). -[Added] Alert sound to drones when they spot you. -[Added] AI Soldiers should now attack you even in a vehicle. -[Updated] Group System - Invite List is alphabetically sorted. -[Fixed] Fixed typo that caused storage devices not to save correctly. -[Fixed] Overhaul of vehicle selling code to prevent issues. -[Fixed] incorrect scope with ItemKiloHemp. -[Fixed] Fixed and improved group system. -[Fixed] Double click action button text had incorrect text for some items like "Vehicle Repair Parts". -[Fixed] Fixed UI icons disappearing due to conflicting resource layer with dynamic text. -[Fixed] Added workaround for players not saving due to specific character in player name. -[Fixed] When first building a base item it will spawn as simulated and start to save. -[Fixed] Only allow owner or members of group to upgrade-in-place base objects if a Frequency jammer is placed. -[Fixed] Players can now trade Krypto using P2P trade menu. -[Fixed] P2P trading now correctly removes weapons from backpacks. -[Fixed] AI soldiers now spawn with the correct radio, vest, and hat. -[Fixed] Random traders can no longer occupy the same building. -[Fixed] Preview of building objects now use proper ghost preview models. -[Fixed] "Mine" trader city teleport point moved so that protection zone covers area. -[Changed] Suppress some group leader options by disabling use of 0-9, f1-f12, backspace, and commandmode. -[Changed] Code lockout added to Take Krypto code to prevent spam. -[Changed] Improved quality of shipwreak and pelican loots. -[Changed] Disabled side chat on all servers, use Quartz radio instead. -[Optimize] Furniture spawning moved client side for better server performance. -[Optimize] Added cleanup on furniture, weaponholders, and Krypto devices every 20min if no players within 45m. -[Known Issue] Unable to loot dead fish with "T" to get Seafood. -[Known Issue] Leftover debug text spam from Sapper brain. \ No newline at end of file diff --git a/Changelogs/0.1.0.3.txt b/Changelogs/0.1.0.3.txt deleted file mode 100644 index ca60b68b..00000000 --- a/Changelogs/0.1.0.3.txt +++ /dev/null @@ -1,20 +0,0 @@ -[New] Whitelisting removed. -[Added] carts DLC content added go-karts, helmets, uniforms. -[Added] Snake bite sound. -[Added] Gender Selection. -[Updated] Dog brain fixes and optimizations. -[Updated] Shark brain fixes and optimizations. -[Fixed] Sniper rifle scope attachment issues. -[Fixed] Further fixes to group invite system. -[Fixed] Removed leftover debug systemchat text spam from Sapper brain. -[Fixed] Incorrect model for jerrycan and locker. -[Fixed] Texture on wardrobe. -[Fixed] NVG did not disable correctly after running out of energy. -[Fixed] Reduced global variable spam from p2p trade system. -[Fixed] Gumby leg bug with jump animation and crtl+w. -[Changed] Cultist and Sapper are now looted with Inventory button instead of T. -[Changed] lowered group invite distance to only 10m. -[Changed] Removed rating and score from debug as they are not currently used. -[Changed] Lower Hunter hit point armor levels a bit in an attempt to balance. -[Changed] Lowered animal spawn rate. -[Info] Many other fixes and security changes. \ No newline at end of file diff --git a/Changelogs/0.2.0.0.txt b/Changelogs/0.2.0.0.txt deleted file mode 100644 index 00fd5a7e..00000000 --- a/Changelogs/0.2.0.0.txt +++ /dev/null @@ -1,58 +0,0 @@ -[Changed] "T" key action moved to Inventory Button. Use your inventory key (Default "I") once to smash trash piles and again to open gear. -[New] Two halloween masks Pumpkin head and Warewolf. -[New] Fireplace model. -[New] Custom Anti Hack Framework by Skaronator. -[New] Replacement First Aid Kit double click on the item and use. Heals other players or your self. -[New] Wooden Ramp/Roof base object can be crafted with 6 lumber packs. -[New] Three new food items: Snooters and Meeps Candy and Walk N' Sons Soda. -[New] Electric Motorcycle has been added. -[New] Car Jack added and has a chance to be found in freshly spawned vehicles. -[New] New lootable furniture "Shoebox" added. -[New] Military variant of the bed now spawns in specific military buildings. -[New] Unisex vest called "side pack". All fresh spawns start with this item. -[New] Group request menu, Group requests can now be accessed via the "Requests" button in the inventory. -[New] Player trading now started with the inventory key (Default "I") and accepted with the "T" key. -[New] Use paint cans to paint corrugated walls and use paint thinner to remove paint. -[New] Wood stairs upgradable for additional landing area. -[New] Circuit Parts found in the world to be used for crafting. -[New] Lockable Cinder And Wood Doors upgrade with Circuit Parts. Ownership is controlled by frequency jammer group owner. -[New] 9 more radios have been added and can be crafted using gems. -[New] Many Inventory items now have proper icons instead of placeholder. -[New] Give player energy if within 75m of a solar tower or wind tower. -[New] Temp Lockable vehicles each time you lock a vehicle it will remain locked to you or your group for 30 minutes. -[New] Base building objects get deleted after 7 days. Moving the object or Painting walls extends this for 7 more days. -[New] Player Character are cleaned up after 30 days inactivity. -[Fixed] Mineral veins now spawn at epicenters. -[Fixed] Geometry changed on cinder wall to prevent phasing though it -[Fixed] Lockbox can no longer be destroyed while open. -[Fixed] Dump items on the ground if packed with items in lockbox. -[Fixed] Overflow items to the ground if player does not have space when trading with another player. -[Fixed] Added prices for Chainsaw so it is now possible to sell/buy to traders. -[Fixed] It wasn't possible to snap the foundation to other foundations. -[Fixed] Group Leader can no longer enter the commander vision. -[Fixed] false PublicVariable Restriction on server start. -[Fixed] Night Vision wasn't disabled when the player run out of energy. -[Fixed] Added prices for Karts so it is now possible to sell/buy to traders. -[Fixed] Shelf and Tipi storage devices are no longer indestructible and have limited storage space. -[Fixed] Trader purchased vehicles should now look for a safer place to spawn vehicle within 120m. -[Fixed] Text output from certain actions now show proper display names instead of classnames. -[Fixed] Vehicles now persist exact position, angle, and direction so it should result in less damage at spawn. -[Fixed] Some false BE kicks for base building. -[Changed] Increased storage of all vests by 50% and reduced armor by half. -[Changed] Building base objects from inventory kits now instantly forces build mode and consumes item. -[Changed] P2p trading now more reliable, however now places traded items at your feet. -[Changed] Reduced Dog and snake spawn chances. -[Changed] Respawn button disabled. -[Changed] Increased Building material spawns on trash piles. -[Changed] Increased chances for Tools to spawn on Tool Rack. -[Changed] Hunger and Thirst loss rates increased. -[Changed] Increased purchase price of Ammo by a total of 100%. -[Changed] Reduced Hunter armor levels by 50%. -[Changed] Trader "Steal" option removed for now. -[Changed] Traders now only wear uniforms that spawn in the world. -[Removed] Hellcat Helicopter and and Nightstalker scope till balance issues are sorted. -[Removed] Uniform storage space and selling of uniforms to traders removed due to dupe issues. -[Info] new bikey for 0.2 added remove any previous ones. -[Info] Improved backend DLL by Fank -[Known Issues] Weapon attachments get wiped when player to player trading. (workaround for now take the items off the weapon first). -[Known Issues] Moving a painted corrugated wall causes it to loose its color. \ No newline at end of file diff --git a/Changelogs/0.2.0.1.txt b/Changelogs/0.2.0.1.txt deleted file mode 100644 index 40ad2e1e..00000000 --- a/Changelogs/0.2.0.1.txt +++ /dev/null @@ -1,17 +0,0 @@ -[New] Added crafting of Salvage Metal from Iron Ore found at mineral veins. -[New] Added proper ghost models for TiPi and shelf. -[Changed] Updated Red Gull Texture and Icon. -[Changed] Increased chance to find Mortar Buckets. -[Changed] Ctrl+T now used for Trade requests to other players. -[Fixed] Traders spawning smoke grenades after selling them. -[Fixed] Just built base objects now use player direction for initial object direction. -[Fixed] Player logs out while dead will now correctly spawn fresh on login. -[Fixed] Global setdamage event on powerlines. -[Fixed] Traders can no longer spawn on top of each other. -[Fixed] Multiple players could double spawn loot in the same building. -[Fixed] Can now build Frequency Jammer properly. -[Fixed] Player rollback after revive and relog. -[Fixed] Many server side fixes. - -[Known Issues] Weapon attachments get wiped when player to player trading. (workaround for now take the items off the weapon first). -[Known Issues] Moving a painted corrugated wall causes it to loose its color. \ No newline at end of file diff --git a/Changelogs/0.2.5.0.txt b/Changelogs/0.2.5.0.txt deleted file mode 100644 index d8ca686d..00000000 --- a/Changelogs/0.2.5.0.txt +++ /dev/null @@ -1,39 +0,0 @@ -[New] Custom single seater "Mosquito" Light helicopter. -[New] Consumables can now give the player multiple attributes on use. -[New] Honey can now be consumed and an empty jar is returned. -[New] Empty Food cooler added. To be used with food crafting. -[New] Metal Scraps added and can be found in many places as well as crafted into Salvage Metal. -[New] 3 new Soda cans some with unique attributes. -[New] Player Krypto account added. Accessed by pressing the Inventory key next to a phonebooth or an ATM. Larger the transaction the longer it takes. -[New] Custom Weapons: AK47, M14, m249, m107, m4a3 ported from Arma 2. -[New] Camo version of female wetsuit. -[New] Female Ghillie Suits Tan, Light Green, Dark Green. -[New] SteamAPI support added for future features and VAC ban check system. -[New] In-game Admin Panel cleanup and features added: Spawn Menu, 3D ESP, Map ESP, Basic Admin levels. - -[Changed] Removed all "Take" and "Rearm" actions to prevent taking items from locked vehicles. A new take option will be added soon to allow item access underwater. -[Changed] Sledge Hammer damage increased 2x. -[Changed] Loot now spawns more readily. -[Changed] Loot table tweaks to increase building materials. -[Changed] setTimeMultiplier 4x enabled by default. Can be changed with timeMultiplier in epochconfig. -[Changed] Shelf, tipi, and Frequency Jammer are now built using the physx build mode. -[Changed] Combat Logging: Players now leave a Doppelganger behind for 60 seconds after disconnect. This can be changed or disabled in epochconfig.hpp server side. -[Changed] Death trigger now spawns shark if player is killed at sea. -[Changed] Added Override vars to epochconfig that control object expiry. vehicle, building, storage (7 days), players (30 days). -[Changed] Vehicle slots limit now based directly on total of per vehicle counts in allowed vehicles list. -[Changed] Reworked backend of NPC trader mechanism to be more accurate and optimized. -[Changed] Land vehicles now spawn in cities near roads instead of anywhere on roads. -[Changed] Many performance and security changes server side. -[Changed] Vehicle save queue system for better performance. -[Changed] Seasonal items like Meeps and Halloween masks removed from loot tables. - -[Fixed] UAV's are no longer static and now move like they are supposed to. -[Fixed] Fully disabled thermal equipment for all vehicles. -[Fixed] Geometry of walls changed to help reduce glitching. -[Fixed] Disallow Holster and GetOver action near base walls, to reduce wall glitching. -[Fixed] Global setdamage event with Communication towers. - -[Info] Reworked server configs. InstanceID is now set in EpochServer.ini and the rest in epochconfig.hpp now found in @EpochHive folder. - -[Known Issues] Weapon attachments get wiped when player to player trading. (workaround for now take the items off the weapon first). -[Known Issues] Moving a painted corrugated wall causes it to loose its color. \ No newline at end of file diff --git a/Changelogs/0.2.5.1.txt b/Changelogs/0.2.5.1.txt deleted file mode 100644 index 054f4e74..00000000 --- a/Changelogs/0.2.5.1.txt +++ /dev/null @@ -1,2 +0,0 @@ -[New] Control sound volume in-game with Ctrl plus - or +. -[Fixed] Issue that caused admin panel to bug out and close all dialogs. \ No newline at end of file diff --git a/Changelogs/0.2.5.2.txt b/Changelogs/0.2.5.2.txt deleted file mode 100644 index 037e8112..00000000 --- a/Changelogs/0.2.5.2.txt +++ /dev/null @@ -1,28 +0,0 @@ -[Added] Started on Basic food crafting: Cooked Meat + Sweet corn + empty cooler equals full hunger; returns empty cooler. -[Added] Crafting of Large Energy packs: 3x small energy pack + Circuit Parts and a nearby fire. -[Added] Basic wild plant spawner: Poppy -[Added] New dynamic event object: Ferris Wheel -[Added] Antagonist chances moved to epochconfig. -[Added] Split server events from weather and added separate timers for each epochconfig. -[Added] Direction labels added to teleport pads. -[Added] Epoch Story: Debug area is now Epoch Cloning facility. -[Added] Started support for all "AiA Terrain Pack" maps, starting with Chernarus. -[Added] Support for Krypto account access from classed ATM and phonebooth objects. -[Added] New loot objects: Tarp covered pallet and freezer chest. -[Added] Tree support for Bornholm. -[Added] Player Krypto accounts now expire after 90 days of inactivity. Can be changed with expiresBank. -[Added] Further enhanced DLL logging. -[Added] Paint stripper & building parts pricing has been added to Traders. -[Updated] Further optimized sound system. -[Fixed] Better way to track dead state of player. -[Fixed] Losing group when logging out while dead. -[Fixed] Revive statistics were not persisting. -[Fixed] Optimize cleanup system for more stable server fps. -[Fixed] Removed doppleganger code for now, as it was not working as intended. -[Fixed] Epoch welcome message encoding issue and fixed Scroll bar. -[Fixed] Parachutes should now be cleaned up. -[Fixed] Increased the amount of thirst gained from Drinks/Sodas. -[Fixed] Increased the amount of hunger gained from Can Food and Cooked Meats. -[Fixed] Bug in sound system with Cultist caused error that broke master loop. -[Fixed] False publicVariable kicks that happen since the ArmA 3 update 1.36. (BattlEye Log shows PLAYER_REJECT_NoResponse) -[Fixed] False script restriction kicks that happen when player destroy electric wire. \ No newline at end of file diff --git a/Changelogs/0.3.0.0.txt b/Changelogs/0.3.0.0.txt deleted file mode 100644 index 4e0527bb..00000000 --- a/Changelogs/0.3.0.0.txt +++ /dev/null @@ -1,86 +0,0 @@ -[Added] Wood and cinder base objects now show damage state when over 50% damaged. -[Added] Car Jack item added to every fresh spawned vehicle. -[Added] Can now loot a dead UAV Drone and in return get Electronic components. -[Added] Ability to specify starter items for freshly spawned traders via epochconfig. -[Added] New custom epoch weapons: SR-25 and L85A2 (Grenade Launcher and Pink Painted) by Kiory. -[Added] Vehicle lock time is now stored in hive and will persist across server restarts. -[Added] 3d interaction visuals to show you when an action is available. -[Added] New loot bias system with nestable tables and overall loot balance. -[Added] LootMultiplier in epochconfig, (0.5 default, 1 = high loot, 0.1 = low loot). -[Added] Goldenseal plant can be consumed to reduce toxicity. -[Added] Pumpkin food item can be harvested from pumpkin patches on Chernarus and found randomly. -[Added] Dynamic Air Supply Drop Event. Use smoke grenades to signal. -[Added] Trader mission accessed with "Talk" on trader: Pikes Peak Express. -[Added] Ability to eat raw foods but at the risk of toxicity. -[Added] New items (Rock, Stick, and Rope) for crafting and added to trash loot. -[Added] New craftable primitive melee weapons: Crude Hatchet, Wood Club, Maul Hammer. -[Added] Keesha default character now has shoes. -[Added] Crafting of Rope from Hemp. -[Added] Harvest Sticks from a bush using a Hatchet. -[Added] Mining of Iron Ore and Rocks with sledgehammer. -[Added] Removal with refund of Base building items. Respects Jammer Owner and group. -[Added] Most base building items now use a hybrid Static/Physx system with ghost preview on first placement. -[Added] Epoch Events 2.0. All server time based events moved to server settings pbo. Scripts are executed with execVM using a simple timer. New events and timers can be changed via epochconfig. -[Added] New "Boss" Sapper variant with a larger bang. -[Added] Both Sapper variants put off toxic gas if killed without blowing up. -[Added] Player can now select gender after each death. -[Added] Frequency Jammer now required by default to build a base. Can be controlled with desc.ext mission variable: buildingRequireJammer. -[Added] Building limit (default: 100) added to Frequency Jammer. Change with desc.ext mission variable: buildingCountLimit. -[Added] Building Jammer Range (default: 75m). Change with desc.ext mission variable: buildingJammerRange. -[Added] Hive weather control system as well as Static override var WeatherStaticForecast via epochconfig. -[Added] Trader purchased vehicle position can now be controlled with a smoke grenade or a chemlight within 50m of trader. -[Added] Wood foundations can be crafted with 8x lumber. -[Added] Bornholm Support: Custom a2 building classes for loot spawns and mission file and config support from http://urogaming.co.uk/ -[Added] Base building objects now persist damage and armor increased substantially. -[Added] Suppress loot spawn within the range of a Frequency Jammer. -[Added] Blocked base building areas for Chernarus. -[Added] Logging of building, storage, and vehicle killed events to hive log. (StorageKilled, VehicleKilled, BuildingKilled) -[Added] Offroad MG Pickup. (Classname: B_G_Offroad_01_armed_EPOCH) -[Added] Server FPS to the debug monitor. (Max: 50, recommend fps are >15 to keep the game stable) -[Added] Chance to spawn Lockbox and Backpacks in lockers or wardrobes. -[Added] Variable when Loadingscreen finish. (EPOCH_loadingScreenDone change from nil to true) -[Added] Base object interact menu (Remove,Move,Upgrade) shown only in build mode after targeting object with Space Bar. -[Changed] Toxicity increase from consuming a toxic food item is now random. -[Changed] Increased default antagonist spawn chances. -[Changed] NPC Trader inventory menu now stacks like items and shows quantity. -[Changed] Players are now sent to the lobby after dead, simply press ok to respawn. -[Changed] Can now sell and buy uniforms from traders. -[Changed] NPC trader data (AI_ITEMS) will now expire in 7 days if no changes are made within that time. Change this with expiresAIdata in epochconfig. -[Changed] Added chance to spawn Lockbox and Backpacks in lockers, wardrobes, shipping containers. -[Changed] Fireplace recipe changed to require 2 Rocks and 1 Stick to make empty fireplace. Then upgrade with 1 Wood Log to start the fire. -[Changed] Player names saved to a separate data set on player connect. -[Changed] Deathlog now logs distance and position. -[Changed] Sapper brain reworked. -[Changed] Display of personal Crypto balance when opening bank interface. -[Changed] Loot Balance: Lowered heavy muzzles count & increased pistol muzzle. -[Changed] Increased loot bias for Ferris Wheel and corrected z height on loot positions. -[Changed] Improve Cleanup System on Server. -[Changed] Behavior changed on UAV troop support. -[Changed] Dog to glitch less, reduced whines and more chance to wander. -[Fixed] Accuracy and fire rates of custom ported A2 weapons fixed (M107, AKM, M4A3, M16, M14, M249). -[Fixed] Sharks not spawning off shipwrecks. -[Fixed] Black icons on admin panel spawn menu. -[Fixed] Soiled and Wet calculation corrected. -[Fixed] Pumpkin patches on Chernarus now payout proper loot. -[Fixed] Traders now only allow one vehicle per trade. -[Fixed] Alpha transparency issue with empty clone vats. -[Fixed] Attempt to prevent vehicle damage during server startup. -[Fixed] Removed fireplace sound for now due to Arma issues with sound cleanup. -[Fixed] Frequency Jammer can not be built or placed within 3x Jammer radius. (default 225m) -[Fixed] GUI scale issues with additional button menu (Group Menu, Requests) on inventory. -[Fixed] Missing sounds on Ruger pistol and removed ability to use silencer. -[Fixed] Dupe fixes for backpacks, vests, uniforms. -[Fixed] Player revive did not work even after respawn. -[Fixed] zasleh1_proxy.p3d error with M4A3. -[Fixed] Prevent loot objects from spawning under the ground. -[Fixed] Group kick and mod options did not work. -[Fixed] Cleanup and removal of unneeded rpt debug logs. -[Fixed] Removed spoiler button in Welcome Screen. -[Fixed] Misspelling in debug monitor (crypto). -[Fixed] Welcome screen will be now displayed only once after a major patch (eg. 0.3/0.4/0.5). -[Info] Requires Arma version 1.40 or higher. - -Admin Tool: -[Added] Different Map Marker for Vehicles, AI, Player, Loot, Base Building and Dead Player. -[Added] Different 3D Tools for: Player, Vehicles and Loot. -[Added] Features: God Mode, Spawn Loot, Teleport Infront. diff --git a/Changelogs/0.3.0.1.txt b/Changelogs/0.3.0.1.txt deleted file mode 100644 index 43ab8262..00000000 --- a/Changelogs/0.3.0.1.txt +++ /dev/null @@ -1,34 +0,0 @@ -[Added] Owner of a Frequency Jammer device can now remove and get full refund of Jammer kit. -[Added] Ability to remove normal storage devices (Shelf and Tipi). Items will be dumped on the ground along with a partial refund of crafting materials. -[Added] Edit or add Trader prices "CfgPricing" via the missionConfigFile. (Documentation link) -[Added] Edit or add Crafting recipes "CfgCrafting" via the missionConfigFile. (Documentation link) -[Added] Antagonists spawn system overhaul with spawn bias system. (Documentation link) -[Changed] Server settings "CfgEpoch" configs are now split based on the map for better clarity. -[Changed] Crypto is now only tracked and stored via the server. -[Changed] Moved loot configs to epoch server settings pbo. (Documentation link) -[Changed] Chance to spawn sapper every 5 minutes (max of 3 within 800m). Chances increase while in a city and if the player is soiled. -[Changed] Chance to spawn drone when player fires weapon (max of 3 within 800m). Chances increase while in a city and are reduced if player uses a silencer. -[Changed] Initial Sapper spawn distance increased. -[Changed] SR-25 and L85a2 use existing ammo now. -[Changed] Increased damage for speargun x2. -[Changed] Updated 3d interact system with new icons (Unknown, Dead Body). -[Fixed] UAV drone now spawns correctly at a distance so that it is longer audible on spawn. -[Fixed] Incorrect text output if trader is at max limit for item. -[Fixed] rvmat texture path issues with Pink L85A2 -[Fixed] Mission document payout now uses unified loot spawn function. -[Fixed] Lower example NPC starter items to 50. -[Fixed] Removed developer debug from AH admin. -[Info] Updated example server.cfg for 1.40. - - -0.3.0.x Server Build 13 -[Changed] Marker colors for loot events changed to orange. -[Changed] lower default NPC starter items. - -0.3.0.x Server Build 12 -[Fixed] Vehicles didn't spawn in Citys on Bornholm. (Thanks to DarthRogue) - -0.3.0.x Server Build 11 -[Added] Damage level of base building objects now based on expiry time. -[Changed] Persistance of damage of Base Building and storage objects removed. -[Changed] Balance loot and increased chances for explosives. diff --git a/Changelogs/0.3.0.2.txt b/Changelogs/0.3.0.2.txt deleted file mode 100644 index 15ba19cd..00000000 --- a/Changelogs/0.3.0.2.txt +++ /dev/null @@ -1,28 +0,0 @@ -Client 0.3.0.2 Rolling Changelog - -[Added] Filter invalid database data input for better security.* -[Fixed] Multiple NPC missions started at the same time caused dupe. -[Fixed] Typo in killed event handler caused false BE kick. -[Fixed] Group names may only contain alphanumeric characters - or _. -[Changed] Uniforms now store items again. - -Server Admins: -[Info] *pcre3.dll must be installed into the Arma 3 root directory. - - -Build 16: -[Added] Server side function "EPOCH_serverCommand" can use the following BE commands: shutdown, lock, unlock, message, kick, ban. -[Added] Battleye integration of loadbans and loadevents so (BEC + watchdog) should no longer be required. -[Added] Scripted server restarts now broadcast a message 5 minutes before restart lock the server and message every 1 minute, then kicks everyone with the message "server restarting" before forcing a restart. -[Added] Linux support added. -[Added] Modified linux start script by BIstudio and Nasdero. -[Added] Major Epoch Anti Hack updates to make more config based. -[Added] Experimental learning mode to EAH whitelist variable check. Disabled by default as it requires some setup to prevent false positives. -[Added] Battleye integration within the DLL now. (requires battleye IP,port,password in epochserver.ini) -[Changed] Disabled MD5 check. -[Changed] Optimized when writing/reading more than 8K chars to database. -[Changed] Traders now move to work and home by default forceStaticTraders = false. -[Fixed] Server side trade FSM updated to fix direction issues. -[Fixed] Marker should now move with trader as they move from work to home. -[Fixed] Removed srifle_DMR_03_spotter_F from loots.h as it is missing textures. -[Fixed] Issue with occasional data corruption when saving more than 8k chars. \ No newline at end of file diff --git a/Changelogs/0.3.0.3.txt b/Changelogs/0.3.0.3.txt deleted file mode 100644 index 5003b98d..00000000 --- a/Changelogs/0.3.0.3.txt +++ /dev/null @@ -1,14 +0,0 @@ -Client 0.3.0.3 Rolling Changelog - -Build 6: -[Fixed] Force save of building to fix issue with data expiring while in play. - -Build 7: -[Added] Use starter items array if existing trader loads without any items. -[Added] Example of extended BE settings, will need tweaked if used. -[Added] propsPos config can now take an array with {vectorDir,vectorUp} instead of azimuth to get precise positioning. -[Added] Passing a 4th param in propsPos (true) will disable simulation (should be used on objects without doors or other animations) -[Added] Latest version of redis-server.exe for Windows v2.8.19.1 from https://github.com/MSOpenTech/redis -[Fixed] Fix possible crash while using Battleye integration under high load (epochserver.dll and epochserver.so updates) -[Changed] setvariableval.txt updated to filter player object names and changed logging back to kick. -[Changed] Forced disable simulation of most props in altis.h. diff --git a/Changelogs/0.3.0.4.txt b/Changelogs/0.3.0.4.txt deleted file mode 100644 index 4835e201..00000000 --- a/Changelogs/0.3.0.4.txt +++ /dev/null @@ -1,35 +0,0 @@ -[Added] Support for Esseker map. -[Added] Support for Takistan and loot positions for more AiA TP buildings. -[Added] Support for Australia Terrain Thanks to the communites of http://uk-gaming-zone.co.uk/, http://thewild.zone, http://www.utomnia.com/ -[Added] More loot positions for AiA TP buildings and updates to existing positions to add pallets and freezers. -[Added] Female characters now have uniform storage once again. -[Added] Server side config for max player Krypto limits. -[Added] Environmental loot checks recoded and now allow for config via description.ext. -[Added] Drone spawn chances reduced. -[Added] Client spawning Sapper and Drone chance can now be controlled via description.ext. -[Added] Server side version check added to CfgEpochClient. -[Changed] Reduce payouts on scrap metal farming. -[Changed] Disabled Vehicle Simulation Handler by default as it does not seem to be needed anymore. re-enable vehicle simulation handler with simulationHandler = true in epochconfig.hpp. -[Changed] lower primary weapon spawn chances. -[Changed] Lower Krypto value for metal salvage and scraps. -[Changed] Disable moving traders by default again (Needs recoding in fsm) -[Changed] Increased weight of Cinder Blocks and Mortar Buckets. -[Changed] Revert workaround for 1.46 crash fix requires 1.46 build 131265 or higher. -[Changed] telepos array now uses modelToWorld offsets instead of world space positions. -[Changed] Increased delay between antagonist spawns to 10 minutes. -[Fixed] Increase range on proximity checks for gear should help with loot target issues. -[Fixed] Krypto device will now only drop if player actually had Krypto. -[Fixed] Added missing backpack B_AssaultPack_blk to loot table and pricing. -[Fixed] Teleport issues on Stratis or any other map with one or less teleport pad. -[Fixed] Added prevention of using tactical view. -[Fixed] Unable to sell new 762x54 150Rnd ammo box. -[Fixed] Energy, krypto stats shown and mouse auto centers once again when opening inventory. -[Fixed] Recoil_default error on first use of hatchet. -[Fixed] Weight added to SR-25 and L85A2 rifles. -[Fixed] Lower base armor on characters to Arma defaults, should fix issues with damage reporting. -[Info] Updated windows command line example to show usage of -serverMod -[Info] Updated description.ext and mission pbo's for new cultist configs. - -WIP: -[Changed] Helicopter air drop event code disabled by default as it needs more work. -[Fixed] Cultist should now spawn correctly and also has a totally reworked code structure. diff --git a/Changelogs/0.3.1.0.txt b/Changelogs/0.3.1.0.txt deleted file mode 100644 index a28b5275..00000000 --- a/Changelogs/0.3.1.0.txt +++ /dev/null @@ -1,29 +0,0 @@ -[Added] Epoch version of the M-900 helicopter with all texture variants. -[Added] Crafting of Energy Packs from electronic components, clean water and near a fire. -[Added] Experimental Sapper Migration Event. -[Added] Increased precision of positions stored in database for Bases, Vehicles, and storage. -[Added] More variations of soldier classes and loadouts (from drone detection). -[Added] CfgBuildingLootPos can be now overridden via missionConfig. -[Added] Weather code migrated into an Epoch Event and code moved to settings pbo. -[Fixed] Typo in esseker.h position only had 2 elements of the needed 3 for setposATL. -[Fixed] Added checks to make sure you can only P2P trade while not in a vehicle. -[Fixed] Re-add missing AiA TP and Bornholm loot positions. -[Fixed] Fixed "no config.bin SmokeShellWhite" error when sapper off gasses. -[Fixed] Environment sounds had been disabled. Removed enableEnvironment false; from client init. -[Fixed] Can't chop down tall trees. Converted to 2d Distance check. -[Fixed] Shipping container doors did not open and threw error. Updated to the 1.48 way of opening doors using functions. -[Fixed] Shoeboxes added to more building on Takistan and any other maps that use the same building classes. -[Fixed] Vehicle storage space has been normalized. Thanks to Uro1! -[Fixed] Missing function compile for helicopter Air Drop. -[Changed] Lower crafting requirement of cinder block wall, from 4 cinder blocks to 2. -[Changed] Removed epoch setWaves sync code as it should no longer be needed after 1.46. -[Changed] Female Ghillies armor, weight, storage now match CSAT male variants. -[Changed] Female Wetsuits armor, weight, storage now match CSAT male variants. -[Changed] Female Camo Clothes armor, weight, storage now match "Guerilla" gear, like "U_OG_Guerilla2_2". -[Changed] Increased loot position bias for all buildings from 15 to 25%. -[Changed] Enabled Air Drops. -[Changed] Added small chance for primary weapons to be found under green military beds. -[Changed] Land_Laptop_device_F can now be used as a Bank terminal. -[Updated] Config.cfg requiredBuild and hostname for A3 1.48 -[Updated] Added bornholm blocked areas to main config and description.ext. Thanks to DarthRogue! -[Info] Server pbo is no longer obfuscated. diff --git a/Changelogs/0.3.2.0.txt b/Changelogs/0.3.2.0.txt deleted file mode 100644 index 45d25d35..00000000 --- a/Changelogs/0.3.2.0.txt +++ /dev/null @@ -1,21 +0,0 @@ -[New] Please welcome our newest team member SteamPunkGears http://www.twitch.tv/steampunkgears -[Added] New food item Tactical Bacon gives 500 hunger. -[Added] Revamped upgraded wood stair model. @SteamPunkGears -[Added] Armor stats for Uniforms, Vests, and Headgear now visible on inventory GUI. -[Added] Consume and Craft buttons added to inventory GUI, allows quicker action and identification of craftable items. -[Added] New custom wood log model. @SteamPunkGears -[Added] New Medicine cabinet loot object that spawns mostly medical loot. @SteamPunkGears -[Added] Custom Epoch Client function compiler. -[Changed] Lowered armor on certain base building objects that had way too much armor. -[Changed] Increased hunger and thirst loss a bit and you can now die from prolonged lack of hunger or thirst. -[Changed] Tweaked stats UI thresholds so that players will now see notifications sooner. Icons are now colorized and flash when at critical level. -[Fixed] Incorrect class for snake prevented killing snakes and looting them. -[Fixed] Use init eventhandler to remove local snakes and rabbits on spawning as maps other than Altis or Stratis spawn them randomly. -[Fixed] Dog brain targeting updates for prey like snakes and chickens. -[Fixed] AirDrops now have there own loot table with better loot payout. -[Fixed] Bornholm environmental loot configs had incorrect p3d names. Thanks to Robio! -[Fixed] Missing price value for M-900 helicopter. -[Fixed] Swap all references of old Rahim 10Rnd 762x51 to 10Rnd 762x54. -[ServerInfo] Removed old .bikey and added new one for 0320. -[ServerInfo] Added //new2 to the top of scripts.txt to enable kicking again. -[Info] version.txt added to client files to aid file mirrors. diff --git a/Changelogs/0.3.3.0.txt b/Changelogs/0.3.3.0.txt deleted file mode 100644 index 10dab501..00000000 --- a/Changelogs/0.3.3.0.txt +++ /dev/null @@ -1,37 +0,0 @@ -[Added] Basic energy capacity system, controls how much power is available based on the type of energy source. -[Added] New upgrade system for Wood Tower, add two lumber packs to add windowed wall. -[Added] 4 new plywood walls as first level base walls. -[Added] Wood Ladder that can be crafted from 4x lumber. -[Added] Wood Tower that can be crafted from a Wood Floor and 4x lumber. -[Added] Solar Generator base item can be crafted from items found in the world. When placed gives passive power within (75m Default). -[Added] New loot/crafting items (Solar Panels, Wire Cables, Battery Box) added to loot tables. -[Added] NightVision now use a static rate of 3 per 10 seconds. This can be changed with 'energyCostNV' variable via CfgEpochClient. -[Added] Max rate of energy gain can be controlled with 'energyRegenMax' variable via CfgEpochClient. -[Added] Max range of energy gain can be controlled with 'energyRange' variable via CfgEpochClient. -[Added] Standard base building upgrade system now supports multiple options and has a basic UI. -[Changed] Moved client gamemode and CfgFunctions init to mission file. -[Changed] Base building upgrade recipes and remove payouts now have dedicated config "CfgBaseBuilding" and code supports over-loading via description.ext. -[Changed] Removed base object "Move" in 3d option in favor of a more refined ghost snap mode. -[Changed] Server side database functions renamed and now use cfgFunctions via a new pbo "epoch_server_core". -[Changed] Increase max payout of Air Drop event loot. -[Changed] Make use of new command getAllHitPointsDamage in A3 1.50 to increase performance of hitpoint data storage. -[Changed] Use new A3 command setHitIndex instead of setHitPointDamage so we can use all hitpoints regardless of name. -[Changed] Change BIS_fnc_distance2D usage over to distance2D command that was added with A3 1.50 for better performance. -[Fixed] Cultist spawning is now fixed. -[Fixed] Can now press '2' to disable building snap mode and 1 to re-enable. -[Fixed] Can now disable base building by pressing Esc or 'gear' menu. -[Fixed] Normalized snap memory points for wood tower and stairs. -[Fixed] Loot code for "CfgBuildingLootPos" now uses EPOCH_returnConfig to allow over-loading via description.ext. -[Fixed] Error in rpt "No geometry and no visual shape" with Poppy and Goldenseal plants models. -[Fixed] JetSki sinking like a rock since Arma 1.44, fix was to add buoyancy=1 property to GEO lod. -[Fixed] Angle of snapping was incorrect when building on angles. -[Fixed] Issue that caused shifting of some base objects after restart. -[Fixed] Pumpkins on Chernarus incorrectly payout trash loot and now have separate configs for extra trash loot items. -[Fixed] Color not persisting when picking up corrugated walls. -[Fixed] Only maintain damaged objects and object health is repaired on maintain. -[Fixed] CfgEpochClient missionConfigFile version check was incorrectly using configFile. -[Fixed] Loot object "Blue Tarp" weaponholder proxy position was in the wrong position. -[Fixed] Reduce base hunger/thirst loss rate by half if players stamina is above 100. Base rate now can be changed with "baseHTLoss" variable in CfgEpochClient. -[Info] Requres Arma 3 1.50 or higher. -[ServerInfo] CfgEpochClient removed from description.ext as it can be simply added again from our configs as needed. -[ServerInfo] Removed old .bikey and added new one for 0330. diff --git a/Changelogs/0.3.3.1.txt b/Changelogs/0.3.3.1.txt deleted file mode 100644 index aeb13b5e..00000000 --- a/Changelogs/0.3.3.1.txt +++ /dev/null @@ -1,12 +0,0 @@ -Client: -[Fixed] Energy was incorrectly allowed to fall below 0. -[Fixed] Typo that prevented small vehicle repair kits from working. -[Fixed] Issue that caused the wrong base building upgrade-in-place option to be selected. -[Fixed] Targeting issues with trash, snakes, and dead sappers. -[Fixed] Three male vests had invisible texture issues. - -Server Side: -[Fixed] Added check for getAllHitPointsDamage returning a blank array when loading buildings. -[Fixed] Error in rpt when spawning vehicles if no class was selected. -[Fixed] EAH was banning revived players incorrectly due to token changed check. -[Info] Removed old .bikey and added new one for 0331. diff --git a/Changelogs/0.3.4.0.txt b/Changelogs/0.3.4.0.txt deleted file mode 100644 index e53939fb..00000000 --- a/Changelogs/0.3.4.0.txt +++ /dev/null @@ -1,44 +0,0 @@ -Client: -[Added] Fishing Pole and ocean fishing, also added crafting recipes to allow cooking fish. -[Added] Workbench storage device added and used as a nearby crafting requirement for most Kit based crafting options. -[Added] New secure storage device: The Epoch Safe. -[Added] Totally new crafting system and UI by Raymix. -[Added] Epoch variant of the unarmed Strider vehicle. (I_MRAP_03_EPOCH) -[Added] Broad Sword Melee weapon that can chop down trees and mine rocks. -[Added] Halloween Clown mask and re-added to loot tables: Wolf/Pumpkin masks as well as Meeps Candy. -[Fixed] Unable to remove lit fireplace. -[Fixed] Group members unable to lock a Lockbox or Safe that was placed by the group leader. -[Fixed] Shadow artifact at top of Jammer. -[Fixed] Reduce client fps lag when first joining the server by preloading objects before exiting loading screen. -[Fixed] Being unable to remove a solar generator. -[Fixed] Angry Pumpkin mask was incorrectly visible in first person. -[Fixed] Issue with Headless clients being treated as players. @dayzai/Face -[Changed] Fixed boats spawning on land and added 3d waypoint to purchased vehicle location. -[Changed] Removed debug hint text for 3d rotation of objects as it was not needed. -[Changed] Re-enable Move button, this system will stay and be refined in the next few patches. -**Improved Dog AI Dog Brain by Axeman** -[FIXED] Dog not taming due to var reset in wrong place / BIS animal update. -[UPDATED] Dog text format updated. -[UPDATED] Dog whine, instead of bark, when alerting of other nearby players (When player crouched). -[UPDATED] Dog prey kills now use animal looting system. i.e. Dog will loot dead animals, and other objects, then will fetch loot. -[UPDATED] Attached weapon (loot) holder is now dropped if dog finds a new one. Needs update. -[ADDED] New Quiet dog bark and whine. -[UPDATED] Make dog sounds global and use quieter sounds to alert player once dog is tamed. Untamed dog or when attacking is still loud. -[UPDATED] Add occasional quiet dog whine when other players in the area. -[UPDATED] General Dog timeout tweaks to compensate for Arma Animals 'doing their own thing' - -Server: -[Added] Example "Epoch Event" Code to provide 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] Logging to the database was not working due to missing function. -[Fixed] Issue when trading vehicles that caused the trader data to save data to the wrong slot. -[Fixed] Added missing prices for female vests. -[Fixed] Error Generic error in expression in EPOCH_server_repairVehicle. -[Changed] Reworked secure data storage system to be more reliable. (NOTE: This may cause issues with existing lockboxes spawn on the ground with incorrect orientation.) -[Changed] Base building maintain option now also maintains storage devices. -[Changed] Moved vehicle spawn config that controls how many vehicles can spawn at different location types to settings pbo. See new vehicleSpawnTypes array in the (WorldName).hpp config. -[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 0340. -[Info] The source code for the a3_epoch_server.pbo is now on the GitHub. diff --git a/Changelogs/0.3.5.0.txt b/Changelogs/0.3.5.0.txt deleted file mode 100644 index 9f125497..00000000 --- a/Changelogs/0.3.5.0.txt +++ /dev/null @@ -1,40 +0,0 @@ -**Client** -[Added] Metal Floors as upgrade in-place option for wood floors. -[Added] Gender selection screen improvements. -[Added] New interaction system. -[Added] Persistent wood and metal spike traps. -[Added] New custom 3x wide hesco type barrier. -[Added] New custom tank trap. -[Added] Updated version of the Fishing Rod. Reel was to small. -[Changed] Made wood ramp shorter by about 30% and slightly reduced height of wood towers and stairs. -[Changed] Refine ghost preview base building snap checks. -[Changed] Players now start with a Quartz radio by default. -[Changed] Overhaul of secure storage system to make it faster. -[Fixed] Selection ring now correctly shows damage/decay level of target when build mode is disabled. -[Fixed] Was unable to use cursorTarget underwater, fixed using new custom made function. -[Fixed] NPC item trades that cannot fit in the players inventory will be placed at the feet of the player. -[Fixed] Not loosing Stamina while swimming. -[Fixed] Removed extra roadway on top of columns. -[Fixed] Error Zero divisor in client side master loop. -[Fixed] .rpt error after gutting animal. - -**Server** -[Added] Documentation on server core framework functions and hive calls. -[Added] muzzle_snds_338_sand to loot and pricing tables. -[Added] Client side master loop is now fully config (CfgMasterLoop) based. -[Added] Ability to fully change default player loadouts via CfgEpochServer configs: -(defaultGoggles, defaultHeadgear, defaultBackpack, defaultVestFemale, defaultVestMale, defaultUniformFemale, defaultUniformMale, itemsInContainers, weaponsInContainers, normalMagazines, weaponsAndItems) -[Changed] Increased reverse token check timeout from 90 to 180 seconds. -[Fixed] Dynamic traders did not correctly track the stored vehicle count and limits. -[Fixed] Force trader data save to save when loading starter items. -[Fixed] Added private array to all Epoch Event scripts due to feedback. -[Fixed] Removed forced weather sync on server startup from server init phase so weather changes are now solely dependent on Epoch Events weather script. -[Fixed] EPOCH_fnc_returnConfigEntry and V2 functions did not use defaults properly. -[Info] Server pack Tools folder now contains InstalEpoch.cmd that is an updated version of the command line download Epoch client files download script for steam workshop. -[Info] Removed old .bikey and added new one for 0350. - -Build 052-055 -[Fixed] Typo in server side AH event handler code and repacked a3_server_settings.pbo. -[Fixed] Storage was incorrectly set to set damage to 99% instead of 1% to temp force maintenance option after restart. -[Fixed] Add player objects to remains collector, this should allow for proper corpse cleanup. -[Changed] Disable simulation of locked storage devices. This also prevents removal of items until device is unlocked/re-simulated. diff --git a/Changelogs/0.3.6.0.txt b/Changelogs/0.3.6.0.txt deleted file mode 100644 index d4f13b7a..00000000 --- a/Changelogs/0.3.6.0.txt +++ /dev/null @@ -1,24 +0,0 @@ -**Client** -[Added] Ability to sell Primary weapon from hands and empty backpacks. Thanks to @He-Man -[Changed] Increased max player load 2x to compensate for the new stamina system in 1.54. -[Changed] Increased backpack storage limits to allow carrying long weapons. -[Fixed] cursorTarget function to only use new Epoch method while underwater. Should help with targeting issues on land. -[Fixed] Canceling build mode did not remove the ghost object as it should have. -[Fixed] Updated Epoch armor stats UI system to support new changes since 1.54. -[Fixed] Changes to default Arma weapon configs to allow long (Lynx,etc) weapons to be stored in backpacks. -[Fixed] Unable to sell after attempting to sell a temporary vehicle. Thanks to @He-Man -[Fixed] Updated Hitpoints for all custom Epoch characters, fixes the hitpoint .rpt errors since 1.54. -[Fixed] Reduce run speed of Sappers since 1.54 update. -[Fixed] Wood tower "add/remove wall" options are now only available when build mode is enabled. - -**Server** -[Fixed] Typo in server side AH event handler code and repacked a3_server_settings.pbo. -[Fixed] Storage was incorrectly set to set damage to 99% instead of 1% to temp force maintenance option after restart. -[Fixed] Add player objects to remains collector, this should allow for proper corpse cleanup. -[Changed] Weapons will now only spawn with a single magazine and a random ammo count. -[Changed] Magazines now spawn with a random ammo count. -[Changed] Disable simulation of locked storage devices. This also prevents removal of items until device is unlocked/re-simulated. -[Info] Removed old .bikey and added new one for 0360. - -**Server Build 025** -[Fixed] New workaround for inventoryOpened and locked storage protection. diff --git a/Changelogs/0.3.7.0.txt b/Changelogs/0.3.7.0.txt deleted file mode 100644 index 3a3650ed..00000000 --- a/Changelogs/0.3.7.0.txt +++ /dev/null @@ -1,72 +0,0 @@ -**Client** -[Added] Drinking a Soda now returns a Empty Soda Can (ItemSodaEmpty). -[Added] Eating a can of food now returns a Empty Tin Can (ItemEmptyTin). -[Added] Repack magazines feature. Simply select a magazine and press the "Repack" button. -[Added] 55 Gallon (210 liters) Fuel Barrel that can be used to refill/siphon vehicles. (Full - ItemBarrelF,Empty - ItemBarrelE). -[Added] Ability to siphon fuel from other fuel sources like gas stations and gas tanks (transportFuel > 0). -[Added] Crafting Burlap (ItemBurlap) from 2x Hemp (ItemKiloHemp) while at a workbench. -[Added] Crafting of Plywood sheets (ItemPlywoodPack) from 3x Wood Log (WoodLog_EPOCH). -[Added] Crafting of Aluminum Bars (ItemAluminumBar) from 6x Empty Soda Cans (ItemSodaEmpty) and one jar of water (water_epoch). Also requires a fire nearby. -[Added] Crafting of Tin Bars (ItemTinBar) from 6x Empty Soda Cans (ItemEmptyTin) and one jar of water (water_epoch). Also requires a fire nearby. -[Added] Copper Bars (ItemCopperBar) that can be crafted from cables (ItemCables) nearby a fire. Cables can also be made from Copper Bars at a workbench. -[Added] Briefcase Full (ItemBriefcaseGold100oz) crafted from ten 10oz Gold bars and a Empty Briefcase (ItemBriefcaseE). -[Added] Crafting of Bars (ItemGoldBar and ItemSilverBar) from Gold (PartOreGold) and Silver (PartOreSilver) Ores. -[ADDED-WIP] Pack/unpack empty backpacks into carryable magazine items. -[ADDED-WIP] Hotwire Kit (ItemHotwire). -[ADDED-WIP] Key Makers Kit (ItemKeyKit). -[ADDED-WIP] Keys in colors: (Black ItemKey,ItemKeyRed,ItemKeyGreen,ItemKeyBlue,ItemKeyYellow). -[ADDED-WIP] Metal Pipes (ItemPipe). -[ADDED-WIP] Documents (Trash,Books,Vehicle Upgrades) (ItemDoc1-8, ItemVehDoc1-4). -[ADDED-WIP] Light Bulb (ItemBulb). -[Changed] Upgrading wood Stud wall and Tower to Plywood covered versions requires Plywood (ItemPlywoodPack). -[Changed] Debug monitor now shows all custom stats dynamically based on 'customVarsDefaults' config. -[Changed] Increased angle that the player is able to aim up. -[Changed] Drinking Alcohol increases the new "Alcohol" stat instead of directly effecting blood pressure. -[Changed] Crafting Hesco barrier now require 3x Burlap. -[Changed] Crafting wood and metal spike traps now also require Sticks and a Hydraulic Jack. -[Changed] Change all publicVariableServer calls to use remoteExec calls for better performance. -[Fixed] Previous patch had incorrectly reduced armor values of the Cultist. -[Fixed] Male(Female) characters lose vest items after equipping opposite sex's vest. -[Fixed] Secure storage locking mechanism improvements should prevent any unwanted intrusions. -[Fixed] Reworked login to prevent getting stuck at "waiting for inventory". -[Fixed] Prevented death just after revive due still having high blood pressure. -[Fixed] Incorrectly being able to sell/buy items from a dead trader. -[Fixed] Snakes now require line of sight to bite player. -[Fixed] Custom epoch swing animations for Hatchet and sledge now work correctly. -[Fixed] Boss Sapper incorrectly cleaned up before detonation. - - -**Server** -[Added] Newly world spawned vehicles now have randomized damage. -[Added] if 5th array element is true 'telePos' config array can now use world position for teleport pads location. -[Added] Setting to control random magazine ammo counts in loot spawner. CfgEpochClient -> randomizeMagazineAmmoCount (default: true) -[Added] Debug box now dynamically spawns with flood lights to help players see inside the box at night. -[Added] CfgEpochClient 'WorldInteractions' config now stores all environmental loot classes and types for all supported maps. -[Added] CUP terrain pack support added: -- Sahrani -- Southern Sahrani -- United Sahrani -- Porto -- Utes -- Chernarus -- Chernarus Summer -- Desert -- Takistan -- Zargabad -- Shapur -- Proving Grounds -- Bukovina -- Bystrica -- Takistan Mountains -[Info] For CUP, use double quotes around mod for spaces in folder Example: -mod="@Epoch;@CUP Terrains - Core;@CUP Terrains - Maps;" -[Changed] Removed support for AIA terrain pack in favor of CUP terrain pack. -[Changed] Empty fuel barrel added to large trash and vehicle loot tables. -[Changed] Earthquakes with mineral veins spawn chances increased with less players. -[Changed] Driver or passengers of a driverless can now control vehicle locks. Also only the owner can control locks from outside of a occupied vehicle. -[Changed] Commented out Halloween masks from loot tables. -[Changed] Player positions in database now use Epoch precision position functions. -[Updated] New Battleye remoteExec.txt for added remoteExec calls. -[Fixed] Admin tools map AI markers not working. -[Fixed] Static propPos campfires not working on Takistan due to disabled simulation. -[Fixed] When killed instead of saving blank array delete (object,trader,vehicle) data from database. -[Info] Removed old .bikey and added new one for 0370. diff --git a/Changelogs/0.3.8.0.txt b/Changelogs/0.3.8.0.txt deleted file mode 100644 index 1110f723..00000000 --- a/Changelogs/0.3.8.0.txt +++ /dev/null @@ -1,78 +0,0 @@ -[Changed] Trash looting is now done by interaction system only. Hold Space Bar and choose Examine. -[New] Split gamemode from main assets, all epoch client gamemode code and configs are now found in the mission file under APL-SA license. https://github.com/EpochModTeam/Epoch -[Added] Support for CUP Vehicles and Weapons. -[Added] Display temperatures in both Fahrenheit and Celsius. -[Added] Fully reworked loot object spawn system. -[Added] Headers added to all gamemode files that include: Author, Description, Github Source link, Usage and Examples. -[Added] All text based feedback now use new EPOCH_dynamicText function. -[Added] Show current build number on debug monitor. -[Added] Player Karma stat is now effected by Arma 3 rating system via Event Handler. More TBA. -[Added] Players can now harvest Hemp from maps that it grows wild. -[Changed] Can now over heat if fatigued and air temperature is greater than 100F or 37C -[Changed] Crafting now supports Water sources from 'CfgWorldInteractions' configs. -[Changed] Moved Cultist and Sapper permanently to enemy side. -[Changed] Disabled remote sensors on server and client as all AI Epoch is locally controlled. https://community.bistudio.com/wiki/disableRemoteSensors -[Changed] Repacked all pbo's to make use of the new 32-bit P3D binarization process. https://dev.arma3.com/post/techrep-00026 -[Changed] Massive code overhaul to make use of many new SQF commands instead of slower SQF logic. -[Changed] Increased the amount of Krypto a player can hold from 25k to 250k. -[Changed] Further improve loot positions in existing maps and add more missing positions for CUP maps. -[Changed] General cleanup and reorganizing of files. -[Fixed] Temporary direction and angle placement issues when base building. -[Fixed] Force player to lobby if the player did not tapout after timer runs out. -[Info] Required Arma 3 version is now 1.56 or higher. - -**Server** -[Added] Support for Napf by Momo and ANixon http://steamcommunity.com/sharedfiles/filedetails/?id=635780806. -[Added] Batch files to rebuild server and mission pbo's can be found in Github Root/Tools/Build folder. -[Added] Updated version redis-server.exe to latest build (2.8.2400) and added full Redis config examples. -[Added] limit to number of plant sites that can spawn. Can be controlled with "plantLimit" inside (CfgEpoch >> worldName). -[Added] Support for Eden editor mission files (version 51) and attributes. -[Added] Battleye filter updates for CUP Weapons and CBA. -[Changed] Moved vehicle spawn limit configs to per map configs found in server settings pbo (CfgEpoch > WorldName > allowedVehiclesList). -[Changed] Use BIS_fnc_addStackedEventHandler for onEachFrame, onPlayerConnected, onPlayerDisconnected to increase compatibility with other mods like CBA. -[Changed] Lower disconnect timeout to 10 seconds with disconnectTimeout set via config.cfg. https://community.bistudio.com/wiki/server.cfg -[Changed] Mission system can now use missionConfigFile configs. -[Changed] publicVariableClient calls changed to use remoteExec. This should provide better performance and reliability as PVC's can be unreliable under heavy use and can also bottleneck the games netcode. -[Changed] CfgClientFunctions is now able to be overridden via description.ext. -[Changed] Fully removed BIS MP init override and added remoteExec BE filter rule for initPlayerServer.sqf usage. (Still must be whitelisted in remoteExec configs to use) -[Fixed] Incorrect scope on some magazine items prevented them from showing in the admin spawn menu. -[Fixed] Reworked player login, fixes issues with players logging in without gear (when one or more players are logging in at the same time, IE. server startup) -[Removed] Old BEC plugin as its not needed anymore. -[Info] RConPort 2303 added to example-beserver.cfg for changes since A3 1.58. -[Info] epochAH.hpp updated "antihack_checkFiles" for new file paths. -[Info] Some AI Scripts Mods may not work with disableRemoteSensors enabled. You can disable with "disableRemoteSensors = false;" in CfgEpochClient. -[Info] Removed old .bikey and added new one for 0380. - -Build: 439 -[Added] FastNights Epoch Event. http://epochmod.com/forum/topic/41949-accelerated-time/?do=findComment&comment=275310 -[Added] Install batch for all CUP mods and CBA. https://github.com/EpochModTeam/Epoch/tree/release/Tools/Install -[Changed] The function EPOCH_fnc_addItemOverflow now supports spawning items and weapons types given a count. -[Changed] Moved the secure storage config variable 'returnOnPack' from cfgvehicles config to CfgBaseBuilding. -[Changed] Make use of new getOutMan EH for vehicle epoch anti wall glitch checks. -[Changed] Change last few uses of hintSilent to Epoch_dynamicText. Now only the debug monitor uses hintSilent. -[Changed] 1.58 Difficulty Overhaul changes to enable 3rd person. Thanks to klinGiii on the forum: http://epochmod.com/forum/index.php?/topic/41922-158-difficulty-overhaul -[Changed] Epoch AH reworked displayAddEventHandler checks to use CfgEpochClient configs. -[Changed] Increased range for vehicle interactions to fix issues with access to larger vehicles. Thanks to Grahame for the report: http://epochmod.com/forum/index.php?/topic/41894-cannot-unlock-large-vehicles/ -[Changed] Preloading sapper by spawning one on the map at server start. -[Changed] Change to github markdown for credits and license. -[Fixed] suppress loot spawning at main traders. Thanks to Ghostrider-DbD- for the report. http://epochmod.com/forum/topic/41954-loot-spawning-at-traders/ -[Fixed] BE kick since 1.58 hotfix. http://epochmod.com/forum/topic/41961-rscdebugconsole_watch-battleye-kick/?do=findComment&comment=275456 -[Fixed] Use object as input for remoteExec instead of owner. http://epochmod.com/forum/topic/41959-be-carefull-with-remoteexec-and-owner/ -[Fixed] Attempt fix issues with temporary angle and rotation issues with base building. -[Fixed] Check for base kit item is in players inventory before spawning ghost. -[Fixed] Prevent empty group menu display. Thanks to He-Man! for the fix. -[Fixed] Group system marked player as "Dead Player" if moderator status was change while player offline. Thanks to He-Man! for the fix. -[Fixed] Group system invite and kick from group options not working. Thanks to He-Man for the fixes: http://epochmod.com/forum/topic/41893-group-menu-broken-kick-invite-for-admin-not-possible/#comment-275429 -[Fixed] Rewrote deleteVehicle.txt BE filter to correct filter syntax to fix false kicks. Thanks to BetterDeadThanZed for the report http://epochmod.com/forum/index.php?/topic/41933-players-kicked-for-moving-safes/#comment-275297 -[Fixed] Fixed Arma install batch script not closing after update. -[Fixed] Mission loot payout not working. Thanks to @He-Man for the fix: http://epochmod.com/forum/index.php?/topic/41892-payout-trader-mission-broken/ -[Fixed] Crafting recipe for Vehicle Repair Kit had wrong part in usedIn array. Thanks to LeBarbare for the report: http://epochmod.com/forum/index.php?/topic/41896-wrong-recipe-place/ -[Fixed] Green Marked traders unable to be accessed. Thanks to @He-Man for the report: http://epochmod.com/forum/index.php?/topic/41887-radom-unexpected-script-failure-with-traders-ai_slot/ -[Fixed] Trailing commas in CfgLootTable. -[Fixed] Disallow building inside of vehicles. -[Fixed] Incorrectly enabled CUP vehicles and weapons support if only Core and Maps where enabled. -[Fixed] remoteExec Battleye kick fixed. -[Fixed] Player getting stuck waiting for inventory to load. -[Fixed] Delete base object if over limit. -[Info] Defined proper settings in full redis-example.conf -[Info] Requires Arma 3 1.58 or higher. diff --git a/Changelogs/0.3.9.0.txt b/Changelogs/0.3.9.0.txt deleted file mode 100644 index 24049051..00000000 --- a/Changelogs/0.3.9.0.txt +++ /dev/null @@ -1,64 +0,0 @@ -[New] Epoch Mod configs and some community pbo's are now released under APL-SA license here: https://github.com/EpochModTeam/EpochCore -[Added] Tanoa map support. -[Added] New Task based Mission System. -[Added] (Optional) Support for Ryan's Zombies and Demons mod: http://steamcommunity.com/sharedfiles/filedetails/?id=501966277 with custom Epoch implementation. -[Added] New custom variable EPOCH_playerNuisance that increases based on the type of weapon fired and decreases at a rate of 1 per 10 seconds. This is used to track how active a shooter the player is. -[Added] Player option to Morph into a random antagonist (from deathMorphClass) after death. The array 'deathMorphClass' found in CfgEpochClient can be used to specify what antagonists to randomly spawn. -[Added] Player option to detonate body after death. Sacrifice yourself by generating a runaway thermal cascade using the nano bots within your body. Nothing left to revive. -[Added] object loot tables for zombies, sharks and Dogs. -[Added] looting Dogs for meat (uses placeholder object "goat leg"). Negative Karma given for eating or gutting dogs. -[Changed] Increased loot bias 10% overall and increased loot density for military and other larger buildings. -[Changed] new function Epoch_message, replaces Epoch_dynamicText. -[Changed] Object Interaction and EPOCH_client_bitePlayer settings in now config CfgObjectInteractions. Lootable objects can now effect player stats. -[Changed] Moved all Base Building variables to gamemode config CfgBaseBuilding. -[Changed] Moved all Item Interaction to new gamemode config CfgItemInteractions. -[Changed] Sapper groan or detonate can be triggered by setting a variable on the target or sapper. -[Changed] Server can be asked by a client / server to trigger an antagonist on another client. Antagonist is then run on target PC, independent from caller of function. -[Changed] Epoch Unit Spawn code. Now can be called specifying the target of the antagonist. Antagonist will run on target client PC. -[Changed] Sapper defaults tweaked to make them more responsive. -[Changed] New Sapper antagonist config options: -reflexSpeed - Set the loop pause. Defaults have been lowered to make sapper more responsive. -nestChance - A percentage chance, at each sapper spawn, that he will create a nest. -hideLevel - (Fear Emotion) Set level at which sapper will go into hiding based on fear of armed players, being shot near etc. -chargeLevel - (Anger Emotion) Set level at which sapper will trigger 'charge the player' mode. -[Changed] New UAV Support Troops antagonist config options: -unitTypes - an array of soldier classes to randomly choose from. Custom weapons to-do, use soldiers with default weapon loadout or handle weapons with custom script. -maxUnitNum - Maximum number of units to spawn per UAV. -minAISkill - Minimum value for any AI skill. -maxAimingAccuracy -> maxGeneral - Set the maximum value for each available AI skill. A random number between minAISkill and the value for each will be set as that skill. -[Fixed] To prevent A3 dupe issues Epoch Militia Solders when taking uniforms, they no longer have uniforms. -[Fixed] To prevent animation glitch with weapon switching on the move and holstering. You now must be standing still to holster your weapon. -[Fixed] Custom Epoch Gestures not working since 1.60. -[Fixed] Issue with animals not returning raw meat. -[Fixed] Getting wet and cold on standing on pier. Thanks to umfufu for the report! http://epochmod.com/forum/topic/41929-getting-10-points-of-wetness/ -[Fixed] Missing texture issues with some base building objects since 0.3.8. -[Info] A big thanks to Isaac, Axeman's chief tester! - -**Server Only** -[Added] Improved plant spawner by Redbeard Actual and [VB]AWOL. -[Added] Allow Epoch Events to accept full file path if 4th variable in the EpochEvents array is set to 0. Default is 1. -[Added] Function to effect a players Crypto server side: EPOCH_server_effectCrypto -[Added] New experimental PBO packing tool found in Epoch/Tools/PowerShell/ -[Added] Server function to allow remote exec of setVariable on client - Allows client to ask another client to set a local variable, via the server. Server can run same function. -[Added] Epoch AH: Added ability to kick, instead of just log or ban. -[Changed] Changed gamemode to Survival, (might show as unknown gamemode pre 1.62) -[Changed] Reworked vehicle load function and made vehicles immune to damage for 120 seconds after startup. -[Changed] cfgpatches check now kicks by default with message a message. -[Changed] Vehicle persistence texture configs are now found in server settings pbo. https://github.com/EpochModTeam/Epoch/blob/experimental/Sources/epoch_server_settings/configs/CfgEpochVehicles.h -[Changed] Use new disableChannels syntax in 1.60 and enable text chat on side chat and not voice. Thanks to @morgoth0 for the heads up! https://github.com/EpochModTeam/Epoch/issues/544 -[Changed] ForceRestart option should now restart as soon as all players disconnect and server is locked. -[Changed] Epoch Events can now self initialize on server startup (if third events[] array element is 1). Fixes issue with weather not changing till first event run. -[Removed] Epoch AH removed whitelisted variable check system. -[Removed] STEAMAPI Vac ban check as it needs reworked in the extension. -[Fixed] Take into account trader stored per class vehicle limits when spawning new vehicles. -[Fixed] Disappearing Mags on login / revive. Thanks to He-Man for the fix: http://epochmod.com/forum/topic/42178-disappearing-mags-on-login-revive-fix/#comment-277194 -[Fixed] CUP mods enabled check logic typo. Thanks to @morgoth0 for the report: https://github.com/EpochModTeam/Epoch/issues/543 -[Fixed] BE kick when player opened stock A3 dialog (Game > Options > Layout). -[Fixed] BE kick with Spawn Loot admin panel option. Thanks to @jostster for the report: https://github.com/EpochModTeam/Epoch/issues/540 -[Updated] Loot position tool: Epoch/Tools/SQF/saveLootPositionsVector.sqf -[Updated] World config tool: Epoch/Tools/SQF/getTreesAndTrash.sqf -[Info] Changed name of a3_epoch_server.pbo to epoch_server.pbo. Also changed path from \x\addons\a3_epoch_server to \epoch_server -[Info] Changed name of a3_epoch_server_settings.pbo to epoch_server_settings.pbo. -[Info] RConPort 2306 added to example-beserver.cfg for changes since A3 1.58. -[Info] Removed old .bikey and added new one for 0390. -[Info] Requires Arma 3 1.60 or higher. diff --git a/Changelogs/0.4.0.0.txt b/Changelogs/0.4.0.0.txt deleted file mode 100644 index c40398ae..00000000 --- a/Changelogs/0.4.0.0.txt +++ /dev/null @@ -1,28 +0,0 @@ -[New] Dynamic and extensible inventory sub menu system for item interaction and crafting options. (Double click item in your inventory) -[Added] Vehicle immunity when a vehicle is left locked inside a player owned base (within jammer range) at server startup. Thanks to @morgoth0 for the feedback! -[Added] Stamina loss when a player jumps. -[Added] Option to pour our gas to get an empty Jerry can and a "Drink" option to poison yourself. -[Added] Option to pour out honey and get an empty jar instead of eating it. -[Changed] Inventory Armor stats feature now dynamic and no longer forced via config. -[Changed] Group menu and group requests options are now found options on the self-action menu. (SPACE BAR) -[Changed] Wardrobe mirror now works in single player. -[Changed] Jetski and Electric Motorcycle motorcycle in-vehicle HUD now functions in singleplayer or editor. -[Changed] Updated Tanoa trade city layout and added ATM's. Thanks to @morgoth0 (aka Grahame on EpochMod.com Forum) -[Changed] Players now start with only 30% Hunger and Thirst instead of 100%. -[Fixed] Increased mass of "Hotwire Kit" (ItemHotwire) magazine item from 2 to 50 to address balance issues. Thanks to PR from @Ignatz-HeMan -[Fixed] Disposal of Snakes and other animals when inside a protection zone. -[Fixed] Shark bite attack and effect can now target all players. -[Fixed] Female ghillie suit transparency issue since Arma update 1.62. -[Fixed] Fireplace position incorrectly shifted down after lighting the fireplace. Thanks for the report by @Ignatz-HeMan #592 -[Fixed] Increased anti-teleport range that should hopefully allow for proper HALO spawning. -[Fixed] Typos in Battleye script.txt that caused the filter not to function properly. -[Fixed] Trailing commas in mission addons array. Thanks to a RP from @SPKcoding (aka $p4rky on EpochMod.com Forum) -[Fixed] No longer possible to unlock Doors / Gates while using a UAV. Thanks to PR from @Ignatz-HeMan - -Server Side Only: -[New] EpochServer.dll/so is now statically linked to pcre3 and hredis. On Windows this means that the pcre3.dll file in the arma 3 root can now be removed. On Linux we no longer depend on libhredis and libpcre to be installed. -[Added] Example mission file epoch_RyanZed.Tanoa that includes "RyanZombies" in the required addons array. -[Fixed] Database logging now trims log entries via the LogLimit setting provided in EpochServer.ini. The default is 1000 log records per list. - -Known Issues: -Jetski and Electric Motorcycle motorcycle in-vehicle HUD will not initialize if player is spawned inside vehicle, as display getin EH did not fire. diff --git a/Changelogs/0.5.0.0.txt b/Changelogs/0.5.0.0.txt deleted file mode 100644 index 3e3717b8..00000000 --- a/Changelogs/0.5.0.0.txt +++ /dev/null @@ -1,60 +0,0 @@ -0.5 b740: -[New] Epoch is leaving alpha and entering beta! All Epoch Asset project sources are now available via our GitHub +LFS and under APL-SA license here: https://github.com/EpochModTeam/EpochCore -[Added] Added Service Point to Rearm, Repair and Refuel. Thanks to @Ignatz-HeMan -[Added] 7 new Keesha camo skins by Craig Hauer aka ComatoseBadger. -[Added] 64-bit database extension support for Windows (EpochServer_x64.dll) and Linux (epochserver_x64.so) servers. Linux support is pending testing. -[Added] Custom event handler and OnEachFrame hooks added. https://github.com/EpochModTeam/Epoch/tree/experimental/Sources/epoch_code/customs Thanks to @Ignatz-HeMan -[Added] Crafting recipe: Mortar (Uses: 12x Rock, 2x dirty water) (Requires: Fire and workbench within 3m). Thanks to @baaljayjay for the suggestion. -[Added] Customizability of units spawned by UAV alert via CfgEpochClient > uavAlertUnitSpawnTemplate. (Default: I_Soldier_EPOCH) -[Added] Toxic Smoke Grenades can now be found in the world. -[Added] Respawn in base feature, each player must interact with Jammer and choose "Make Spawnpoint" to enable. -[Added] Selling to traders with bank debt greater than -50000(default), pays the bank debt back to below the limit instead of the player. Thanks to @Ignatz-HeMan -[Changed] Epoch Message function now supports custom colors. Thanks to @SPKcoding -[Changed] Epoch Event: ChangeWeather has been updated to allow for better random control of weather and defaults to bad weather. -[Changed] Optimized database SET and SETEX calls in both SQF and C++. -[Changed] Optimized database GETRANGE call. -[Changed] Optimized NPC Trading and fixed issue if trade failed. Thanks to @Ignatz-HeMan -[Changed] Great White Sharks will now spawn if the player is deep enough in the ocean. -[Changed] Objects or Players that have been given "Crypto" variable can be accessed via the dynamic menu (Space Bar) for a "Take Crypto" action. -[Changed] Air Drops are now triggered via Epoch Events server side every 45m at random, instead of randomly triggered client side. -[Changed] To prevent issues with ownership only Group Leader can place a Jammer. jammerGLOnly = 0 in CfgEpochClient to disable. Thanks to @Ignatz-HeMan and @82ndab-Bravo17 -[Fixed] Crash bug when opening base building upgrade menu since Arma 3 1.68. -[Fixed] Wrong variable name in EPOCH_clientRevive.sqf. Thanks to @Ignatz-HeMan -[Fixed] Sometimes getting stuck only walking. Thanks to @Ignatz-HeMan -[Fixed] Repack of Energy Pack is now possible. -[Removed] EpochServer extension calls 100 and 101 as they are no longer needed. -[Info] Re-add missing comments in some config files. -[Info] Numerous other fixes and optimizations. -[Info] Requires Arma 3 1.68 or higher. - -0.5 b749: -[Added] 200 player support to all mission files, thanks to increased group limits in Arma 1.68! -[Added] Experimental support for Mad ArmA Mod: https://forums.bistudio.com/forums/topic/200295-mad-arma-mad-max-inspired-mod/ -[Changed] Spawn in base now use player position instead of jammers (reset spawn point to use). @Ignatz-HeMan -[Changed] Force "Take Crypto" option on dead bodies. @Ignatz-HeMan -[Changed ] Added optional Classnames for Service Point Pos. @Ignatz-HeMan -[Changed ] Some Cleanups and Script optimization to the service point scripts. @Ignatz-HeMan -[Fixed] Toxic Smoke Grenade not making you Toxic thanks to @Ignatz-HeMan -[Info] Install script for Mad Arma mod via Steam workshop in the tools/install folder. - -0.5 b757: -[Added] "MeleeRod" (Fishing Rod) to Crafting Menu (1x Rope,1x Stick,1x Metal Scraps) @Ignatz-HeMan -[Added] Vehicle and Loot tables can be set via epochconfig settings (forcedVehicleSpawnTable, forcedLootSpawnTable) to force specific vehicle or loot tables. -[Changed] Removed "Alpha" text from debug monitor. -[Changed] Add flag to enable database unit test. enableUnitTestOnStart = 1 in epochconfig.hpp to enable -[Changed] Delete rest of unused clientside Airdrop Event code. @Ignatz-HeMan -[Changed] further optimized db call for weather script. -[Updated] redis-server.exe to latest version: 3.2.100 from: https://github.com/MSOpenTech/redis/releases -[Fixed] some missing semicolons in CfgPricing. @SPKcoding -[Fixed] Joining and leaving a group and optimize with added usage of params. @Ignatz-HeMan -[Fixed] Group invites from the same Group where not possible until relog. @Ignatz-HeMan -[Fixed] Heal not working when using SafeZones with VehicleGodmode and only HitPoint is damaged. @Ignatz-HeMan -[Fixed] fix deleteVehicle BE kick with sharks -[Fixed] CBA related Battleye kicks with current CBA version. -[Fixed] Static weather settings not working. @82ndab-Bravo17 -[Fixed] Battleye kicks for CUP weapon and attachment BE kicks. -[Fixed] Battleye kicks for towing tractor from CUP. -[Fixed] Fixed / updated and added Trader Missions and ported to run it on Events instead fsm. @Ignatz-HeMan -[Fixed] Several minor fixes, cleanup, and private array updates. -[Fixed] Fix for Weaponholder disappearing while adding loot. @Ignatz-HeMan -[Info] SQF parser analyzer: https://www.reddit.com/r/armadev/comments/681236/released_static_analyzer_for_sqf_and_integration/ Thanks to @LordGolias \ No newline at end of file diff --git a/Server_Install_Pack/@epochhive/EpochServer.dll b/Server_Install_Pack/@epochhive/EpochServer.dll index 0f0742a0..c6761ec6 100644 Binary files a/Server_Install_Pack/@epochhive/EpochServer.dll and b/Server_Install_Pack/@epochhive/EpochServer.dll differ diff --git a/Server_Install_Pack/@epochhive/EpochServer_x64.dll b/Server_Install_Pack/@epochhive/EpochServer_x64.dll index d08d46a4..00a91674 100644 Binary files a/Server_Install_Pack/@epochhive/EpochServer_x64.dll and b/Server_Install_Pack/@epochhive/EpochServer_x64.dll differ diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server.pbo index b905ba9e..b3da7d75 100644 Binary files a/Server_Install_Pack/@epochhive/addons/epoch_server.pbo and b/Server_Install_Pack/@epochhive/addons/epoch_server.pbo differ diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo index 73e9696c..075ac880 100644 Binary files a/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo and b/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo differ diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server_debris_event.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server_debris_event.pbo new file mode 100644 index 00000000..a76f9051 Binary files /dev/null and b/Server_Install_Pack/@epochhive/addons/epoch_server_debris_event.pbo differ diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server_events.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server_events.pbo new file mode 100644 index 00000000..f0159e4b Binary files /dev/null and b/Server_Install_Pack/@epochhive/addons/epoch_server_events.pbo differ diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server_settings.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server_settings.pbo index b155185e..1c8c6c8a 100644 Binary files a/Server_Install_Pack/@epochhive/addons/epoch_server_settings.pbo and b/Server_Install_Pack/@epochhive/addons/epoch_server_settings.pbo differ diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server_vip_event.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server_vip_event.pbo new file mode 100644 index 00000000..f812da9f Binary files /dev/null and b/Server_Install_Pack/@epochhive/addons/epoch_server_vip_event.pbo differ diff --git a/Server_Install_Pack/@epochhive/epochah.hpp b/Server_Install_Pack/@epochhive/epochah.hpp index 6b21571d..65fcc465 100644 --- a/Server_Install_Pack/@epochhive/epochah.hpp +++ b/Server_Install_Pack/@epochhive/epochah.hpp @@ -16,15 +16,14 @@ antihack_banDuration = 5; // Default 5 minute ban. -1 = permanent ban. antihack_kickReasons[] = { "Mod mismatch, check that the mods you have enabled match server." }; -antihack_checkFiles[] = { //script check, leave it blank to disable it +antihack_checkFilesNew[] = { //script check, leave it blank to disable it {"epoch_code\compile\setup\EPOCH_clientInit.sqf", "EPOCH_clientInit"}, {"epoch_code\compile\EPOCH_onEachFrame.sqf", "EPOCH_onEachFrame"}, - {"epoch_code\compile\setup\EPOCH_masterLoop.sqf", "EPOCH_masterLoop"}, {"epoch_code\compile\setup\EPOCH_client_rejectPlayer.sqf", "EPOCH_client_rejectPlayer"}, - {"epoch_code\compile\setup\EPOCH_clientRespawn.sqf", "EPOCH_clientRespawn"}, - {"epoch_code\compile\interface_event_handlers\EPOCH_KeyDown.sqf", "EPOCH_KeyDown"} + {"epoch_code\compile\setup\EPOCH_clientRespawn.sqf", "EPOCH_clientRespawn"} }; antihack_addActionCheck = "true"; // false to disable addAction checks +antihack_antiTeleportCheck = "true"; // false to disable antiTeleport checks adminMenu_Owner[] = {}; adminMenu_OwnerSetting[] = { "ESP-PLAYER", @@ -37,10 +36,12 @@ adminMenu_OwnerSetting[] = { "INFRONT-TELEPORT", "MAP-PLAYER", "MAP-CORPSE", - // "MAP-LOOT", + "MAP-LOOT", + "MAP-ANIMALS", "MAP-VEHICLE", "MAP-AI", - // "MAP-BASEBUILDING", + "MAP-TRADER", + "MAP-BASEBUILDING", "TARGET-HEAL", "TARGET-AMMO", "TARGET-KILL", diff --git a/Server_Install_Pack/@epochhive/epochconfig.hpp b/Server_Install_Pack/@epochhive/epochconfig.hpp index dc62ce98..c328e2cf 100644 --- a/Server_Install_Pack/@epochhive/epochconfig.hpp +++ b/Server_Install_Pack/@epochhive/epochconfig.hpp @@ -12,26 +12,51 @@ lootMultiplier = 0.5; // 1 = max loot bias. This controls how much loot can payo // Events WeatherStaticForecast[] = {}; // Default: {75.5,0,{0,0,0},0,{1,1}}; // Clear day; {19,1,{1,1,40},1,{5,5}}; // Cold Foggy Rainy Overcast Windy; Format: {temp ,rain ,fog ,overcast ,wind } events[] = { - { 3600, "CarnivalSpawner", 0 , 1}, // SECOND , EVENT , INIT 1 = run script at startup, 0 normal delay, PREPOSTFIX 1 = use pre/postfix path (inside epoch settings pbo) 0 = use full file path + { 3600, "CarnivalSpawner", 0 , 1, -1, {} ,{"VR"}}, // SECOND , EVENT , INIT 1 = run script at startup or 0 normal delay, PREPOSTFIX 1 = use pre/postfix path (inside epoch settings pbo) 0 = use full file path, RUNNUMTIMES -1 infinite, execVM payload , disallowed worlds // { 1800, "PaydayEvent", 0, 1}, // { 1200, "MessageServer", 0, 1}, - { 2700, "AirDrop", 0 , 1}, - { 2400, "EarthQuake", 0 , 1}, - { 900, "ChangeWeather", 1 , 1}, - { 1200, "ContainerSpawner", 0 , 1}, - { 300, "PlantSpawner", 0 , 1} //No comma on last Entry + { 2700, "AirDrop", 0 , 1, -1, {} ,{"VR"}}, + { 2400, "EarthQuake", 0 , 1, -1, {} ,{"VR"}}, + { 2700, "Satellite", 0 , 1, -1, {} ,{"VR"}}, + { 900, "ChangeWeather", 1 , 1, -1, {} ,{"VR"}}, + { 1200, "ContainerSpawner", 0 , 1, -1, {} ,{"VR"}}, + { 1440, "GardenManager", 0 , 1, -1, {} ,{"VR"}}, + { 300, "PlantSpawner", 0 , 1 , -1, {} ,{"VR"}} //No comma on last Entry }; // Antagonists -antagonistChanceTrash = 0.09; //9% chance when player loot a trash object antagonistChancePDeath = 0.33; //33% chance when player was killed from a other player (selfkill doesn't count) -antagonistChanceLoot = 0.09; //9% chance when player click "SEARCH" on a loot object // Player Related cloneCost = 100; // debt incurred on player death MaxBankDebitforTrade = -50000; // If Player has less money on Bank, Crypto from Trade goes directly to Bank instead to Player +// Default Loadout +defaultUniformFemale = "U_Test_uniform"; +defaultVestFemale = "V_F41_EPOCH"; +defaultUniformMale = "U_Test1_uniform"; +defaultVestMale = "V_41_EPOCH"; +defaultGoggles = ""; +defaultHeadgear = ""; +defaultBackpack = ""; +defaultprimaryWeapon[] = {}; // {"arifle_MX_pointer_F","","acc_pointer_IR","",{"30Rnd_65x39_caseless_mag",29},{},""}; +defaultsecondaryWeapon[] = {}; // {"launch_NLAW_F","","","",{"NLAW_F",1},{},""}; +defaulthandgunWeapon[] = {}; // {"hgun_P07_F","","","",{"16Rnd_9x21_Mag",16},{},""}; +defaultuniformItems[] = {}; // {{"FAK",1},{"30Rnd_65x39_caseless_mag",2,30},{"Chemlight_green",1,1}}; +defaultvestItems[] = {}; // {{"30Rnd_65x39_caseless_mag",3,30},{"16Rnd_9x21_Mag",2,16},{"SmokeShell",1,1},{"SmokeShellGreen",1,1},{"SmokeShellBlue",1,1},{"SmokeShellOrange",1,1},{"Chemlight_green",1,1}}; +defaultbackpackItems[] = {}; // {{"Medikit",1},{"FAK",10},{{"hgun_P07_F","","","",{"16Rnd_9x21_Mag",16},{},""},1}}; +defaultassignedItems[] = {}; // {"Rangefinder","","","",{},{},""} +defaultlinkedItems[] = { + "ItemMap", // "ItemMap" + "", // "ItemGPS" or "ItemGeigerCounter_EPOCH", + "EpochRadio0", // "EpochRadio0" through "EpochRadio9" + "", // "ItemCompass" + "", // "ItemWatch" + "" // "NVG_EPOCH" or "radiation_mask_epoch" +}; + // vehicles - Max vehicle slots is calculated from per vehicle limits below. Warning! Higher the number lower the performance. +disableAutoRefuel = "true"; // Removes auto refuel from all buildings at server startup. simulationHandlerOld = "false"; // When enabled this feature disables simulation on vehicles that are not nea players. Can help improve client fps at the cost of server fps. vehicleLockTime = 1800; // Controls how many seconds it takes to allow another person/group to unlock vehicle. removevehweapons[] = { // remove these Weapons from spawned Vehicles @@ -43,6 +68,7 @@ removevehmagazinesturret[] = { // Remove these Magazines from the given Turret f {"24Rnd_missiles",{-1}}, {"200Rnd_40mm_G_belt",{0}} }; +disableVehicleTIE = "true"; // BaseBuilding UseIndestructible = "false"; // Enable / Disable Indestructible BaseObjects @@ -71,6 +97,7 @@ forcedLootSpawnTable = ""; // leave blank for default. Options: "CfgLootTable"," // Markers showEarthQuakes = "true"; // show mineral viens caused by earthquakes +showSatellites = "true"; // show crashed Satellites showShippingContainers = "true"; // Show location of events based loots (plants, shipping container, Carnival) SHOW_TRADERS = "true"; // Show locations of traders SHOW_JAMMERS = "false"; // Shows location of base jammers @@ -83,6 +110,7 @@ expiresPlayer = "2592000"; // expiration date in seconds for players expiresBank = "7776000"; // expiration date in seconds for players bank expiresVehicle = "604800"; // expiration date in seconds for vehicles expiresAIdata = "604800"; // expiration date in seconds for NPC Trader inventory +expiresCommunityStats = "7776000"; // expiration date in seconds for players community stats // Admin Features hiveAdminCmdExec = "false"; // true = enables extra (To Be Released) feature to allow execution of code via hive. diff --git a/Server_Install_Pack/@epochhive/epochserver.so b/Server_Install_Pack/@epochhive/epochserver.so index f583d7e0..c58dd421 100644 Binary files a/Server_Install_Pack/@epochhive/epochserver.so and b/Server_Install_Pack/@epochhive/epochserver.so differ diff --git a/Server_Install_Pack/@epochhive/epochserver_x64.so b/Server_Install_Pack/@epochhive/epochserver_x64.so index e278ec69..8184dbeb 100644 Binary files a/Server_Install_Pack/@epochhive/epochserver_x64.so and b/Server_Install_Pack/@epochhive/epochserver_x64.so differ diff --git a/Server_Install_Pack/@epochhive/legacy/epochserver.so b/Server_Install_Pack/@epochhive/legacy/epochserver.so deleted file mode 100644 index 50095c82..00000000 Binary files a/Server_Install_Pack/@epochhive/legacy/epochserver.so and /dev/null differ diff --git a/Server_Install_Pack/@epochhive/legacy/libhiredis.so.0.10 b/Server_Install_Pack/@epochhive/legacy/libhiredis.so.0.10 deleted file mode 100644 index a9b153ea..00000000 Binary files a/Server_Install_Pack/@epochhive/legacy/libhiredis.so.0.10 and /dev/null differ diff --git a/Server_Install_Pack/@epochhive/legacy/libpcre.so.3 b/Server_Install_Pack/@epochhive/legacy/libpcre.so.3 deleted file mode 100644 index 1ec7125a..00000000 Binary files a/Server_Install_Pack/@epochhive/legacy/libpcre.so.3 and /dev/null differ diff --git a/Server_Install_Pack/keys/epoch0500.bikey b/Server_Install_Pack/keys/epoch0500.bikey deleted file mode 100644 index 351684d2..00000000 Binary files a/Server_Install_Pack/keys/epoch0500.bikey and /dev/null differ diff --git a/Server_Install_Pack/mpmissions/epoch.Altis.pbo b/Server_Install_Pack/mpmissions/epoch.Altis.pbo index 4ca790ca..04c78e99 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Altis.pbo and b/Server_Install_Pack/mpmissions/epoch.Altis.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Australia.pbo b/Server_Install_Pack/mpmissions/epoch.Australia.pbo index dcd5b1d5..63ee25fa 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Australia.pbo and b/Server_Install_Pack/mpmissions/epoch.Australia.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo index 8d5790b8..4a72d98f 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo b/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo index 89bc404a..b0fddb09 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo and b/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo b/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo index 37bce379..fd707bc0 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo and b/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.ChernarusRedux.pbo b/Server_Install_Pack/mpmissions/epoch.ChernarusRedux.pbo new file mode 100644 index 00000000..be78fa43 Binary files /dev/null and b/Server_Install_Pack/mpmissions/epoch.ChernarusRedux.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo b/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo index 44aef0e0..3ff57651 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo and b/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo b/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo index 52558810..edd69bb3 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo and b/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Esseker.pbo b/Server_Install_Pack/mpmissions/epoch.Esseker.pbo index c92fd47f..cbc92b20 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Esseker.pbo and b/Server_Install_Pack/mpmissions/epoch.Esseker.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Malden.pbo b/Server_Install_Pack/mpmissions/epoch.Malden.pbo new file mode 100644 index 00000000..9fbfd7da Binary files /dev/null and b/Server_Install_Pack/mpmissions/epoch.Malden.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo index a4e7be85..420b2b8b 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Napf.pbo b/Server_Install_Pack/mpmissions/epoch.Napf.pbo index 5ec913e5..5600c3c5 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Napf.pbo and b/Server_Install_Pack/mpmissions/epoch.Napf.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Porto.pbo b/Server_Install_Pack/mpmissions/epoch.Porto.pbo index eb08ac05..0afbfa17 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Porto.pbo and b/Server_Install_Pack/mpmissions/epoch.Porto.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo b/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo index 402d82b5..273e562f 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo and b/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Sara.pbo b/Server_Install_Pack/mpmissions/epoch.Sara.pbo index 24a4ad1e..49c3dee6 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Sara.pbo and b/Server_Install_Pack/mpmissions/epoch.Sara.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo b/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo index 57e6d827..4da862e0 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo and b/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo b/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo index f4ad050c..1cdecfb7 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo and b/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo b/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo index 26c9260b..71ae7fe1 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo and b/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Stratis.pbo b/Server_Install_Pack/mpmissions/epoch.Stratis.pbo index 36505041..f1222364 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Stratis.pbo and b/Server_Install_Pack/mpmissions/epoch.Stratis.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Takistan.pbo b/Server_Install_Pack/mpmissions/epoch.Takistan.pbo index caeda8a0..49cdf2a2 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Takistan.pbo and b/Server_Install_Pack/mpmissions/epoch.Takistan.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Tanoa.pbo b/Server_Install_Pack/mpmissions/epoch.Tanoa.pbo index 1dfde0c7..30398732 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Tanoa.pbo and b/Server_Install_Pack/mpmissions/epoch.Tanoa.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.VR.pbo b/Server_Install_Pack/mpmissions/epoch.VR.pbo index 59373741..ce1db46c 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.VR.pbo and b/Server_Install_Pack/mpmissions/epoch.VR.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo index 58655c7f..62462539 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo b/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo index 5d34f2e4..9ee92f7c 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo and b/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.utes.pbo b/Server_Install_Pack/mpmissions/epoch.utes.pbo index 37aff91b..2daa5351 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.utes.pbo and b/Server_Install_Pack/mpmissions/epoch.utes.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch_RyanZed.Tanoa.pbo b/Server_Install_Pack/mpmissions/epoch_RyanZed.Tanoa.pbo index 2d2f1457..be2c1a90 100644 Binary files a/Server_Install_Pack/mpmissions/epoch_RyanZed.Tanoa.pbo and b/Server_Install_Pack/mpmissions/epoch_RyanZed.Tanoa.pbo differ diff --git a/Server_Install_Pack/sc/battleye/addweaponcargo.txt b/Server_Install_Pack/sc/battleye/addweaponcargo.txt index c1c259a4..d1da558d 100644 --- a/Server_Install_Pack/sc/battleye/addweaponcargo.txt +++ b/Server_Install_Pack/sc/battleye/addweaponcargo.txt @@ -1 +1 @@ -5 "" !="H_MM_(Buzzard_Gasmask|Helmet)_01" !="V_MM_Vest_01" !="(V|H)_(F|)[0-9]{1,3}_EPOCH" !="(clown|pkin|wolf)_mask_epoch" !="Item(Map|GPS|Compass|Watch)" !="EpochRadio[0-9]" !="B_UavTerminal" !="(U|G|bipod|acc|muzzle|optic)_[0-9A-Z_]{1,100}" !="(NVG|Defib|Heal|Repair|Elcan(_reflex|))_EPOCH" !="(Binocular|Rangefinder|Hatchet|CrudeHatchet|WoodClub|Melee(Sledge|Maul|Rod|Sword)|ChainSaw|MultiGun|Rollins_F|Plunger)" !="(ruger_pistol|speargun|1911_pistol|akm|m14|M14Grn|m16|m16Red|m107|m107Tan|m249|m249Tan|m4a3|sr25|l85a2|l85a2_(pink|ugl))_epoch" !="SMG_(01|02)_F" !="hgun_(PDW2000|ACPC2|Rook40|P07|Pistol_heavy_0[1-2]|Pistol_Signal)_F" !="LMG_(Mk200|Zafir)_F" !="srifle_(EBR|GM6|LRR|DMR_01)_(camo_|)F" !="arifle_(Katiba|Katiba_C|Katiba_GL|SDAR|TRG21|TRG20|TRG21_GL|Mk20|Mk20C|Mk20C_plain|Mk20_GL|Mk20_plain|Mk20_GL_plain)_F" !="arifle_(MXC|MX|MX_GL|MXM|MXM_Black|MX_GL_Black|MX_Black|MXC_Black|MX_SW|MX_SW_Black)_F" !="srifle_DMR_0[2-6](_(camo|sniper|khaki|tan|multicam|woodland|spotter|blk|hex|olive)_|_)F" !="MMG_0[1-2]_(hex|tan|camo|black|sand)_F" !"CUP_((h|s)gun|(s|a)rifle|(l|s)mg)_" !"CUP_(optic|muzzle|acc|bipod)_" !"CUP_(Mxx|SVD)_camo" +5 "" !="H_MM_(Buzzard_Gasmask|Helmet)_01" !="V_MM_Vest_01" !="(V|H)_(F|)[0-9]{1,3}_EPOCH" !="(clown|pkin|wolf|radiation|hockey|plague|ghostface|skull|witch)_mask_epoch" !="Item(Map|GPS|Compass|Watch|GeigerCounter_EPOCH)" !="EpochRadio[0-9]" !="B_UavTerminal" !="(U|G|bipod|acc|muzzle|optic)_[0-9A-Z_]{1,100}" !="(NVG|Defib|Heal|Repair|Elcan(_reflex|))_EPOCH" !="(Binocular|Rangefinder|Hatchet|CrudeHatchet|WoodClub|Melee(Sledge|Maul|Rod|Sword)|ChainSaw|MultiGun|Rollins_F|Plunger)" !="(ruger_pistol|speargun|1911_pistol|akm|m14|M14Grn|m16|m16Red|m107|m107Tan|m249|m249Tan|m4a3|sr25|l85a2|l85a2_(pink|ugl))_epoch" !="SMG_(01|02|05)_F" !="hgun_(PDW2000|ACPC2|Rook40|P07|Pistol_heavy_0[1-2]|Pistol_Signal)_F" !="LMG_(Mk200|Zafir)_F" !="srifle_(EBR|GM6|LRR|DMR_01)_(camo_|)F" !="arifle_(Katiba|Katiba_C|Katiba_GL|SDAR|TRG21|TRG20|TRG21_GL|Mk20|Mk20C|Mk20C_plain|Mk20_GL|Mk20_plain|Mk20_GL_plain)_F" !="arifle_(MXC|MX|MX_GL|MXM|MXM_Black|MX_GL_Black|MX_Black|MXC_Black|MX_SW|MX_SW_Black)_F" !="srifle_DMR_0[2-7](_(camo|sniper|khaki|tan|multicam|woodland|spotter|blk|hex|olive)_|_)F" !="MMG_0[1-2]_(hex|tan|camo|black|sand)_F" !"CUP_((h|s)gun|(s|a)rifle|(l|s)mg)_" !"CUP_(optic|muzzle|acc|bipod)_" !"CUP_(Mxx|SVD)_camo" diff --git a/Server_Install_Pack/sc/battleye/attachto.txt b/Server_Install_Pack/sc/battleye/attachto.txt index 2a5b85cd..d03c340e 100644 --- a/Server_Install_Pack/sc/battleye/attachto.txt +++ b/Server_Install_Pack/sc/battleye/attachto.txt @@ -1 +1 @@ -5 "" !WeaponHolderSimulated !Shot !"(Safe|LockBox|FirePlace|PlotPole|Jack|SolarGen)_EPOCH" !"Jack_SIM_EPOCH" !"LockBox_Ghost_EPOCH" !"CinderWallHalf_Ghost_EPOCH" !"(Tipi|Workbench|StorageShelf|Wood(Floor|LargeWall|Stairs|Ramp|Ladder|Tower)_Ghost_EPOCH" !"(Hesco3|Metal|Foundation)_Ghost_EPOCH" !"Land_Cages_F" !"Epoch_Sapper_F" !"[A-Z]_(G_)?(Offroad|Quadbike|Hatchback|SUV|Rubberboat|Van|Boat_Civil|SDV|MRAP|Truck)_([0-9]+_)?((box|transport|covered|mover|police|rescue|armed)_)?EPOCH" !"([A-Z]_)?[A-Z]+_(Boat|Scooter|Offroad|LSV)_((Transport)_)?[0-9]+_((unarmed|light)_)?F" !"K0(1|2|3|4)" !"CUP_" +5 "" !"Jack_SIM_EPOCH" !"Land_Cages_F" !"Epoch_Sapper_F" !"[A-Z]_(G_)?(Offroad|Quadbike|Hatchback|SUV|Rubberboat|Van|Boat_Civil|SDV|MRAP|Truck)_([0-9]+_)?((box|transport|covered|mover|police|rescue|armed)_)?EPOCH" !"([A-Z]_)?[A-Z]+_(Boat|Scooter|Offroad|LSV)_((Transport)_)?[0-9]+_((unarmed|light)_)?F" !"K0(1|2|3|4)" !"CUP_" !"_Ghost_EPOCH" !"Shot" !"WeaponHolderSimulated" diff --git a/Server_Install_Pack/sc/battleye/createvehicle.txt b/Server_Install_Pack/sc/battleye/createvehicle.txt index 3ca74033..d377c173 100644 --- a/Server_Install_Pack/sc/battleye/createvehicle.txt +++ b/Server_Install_Pack/sc/battleye/createvehicle.txt @@ -1,3 +1,3 @@ -5 "" !="Construct_f" !="I_UAV_01_F" !="(I|B|O)_UAV_AI" !"_EPOCH" !="B_65x39_Minigun_Caseless_Red_splash" !="B_762x51_Minigun_Tracer_Yellow_splash" !="B_(Swing|Stick)" !"^SmokeShell" !"^G_40mm_" !"^F_40mm_" !"Sub_F_" !"^F_Signal_" !="mini_Grenade" !="GrenadeHand" !="LaserTarget(C|W|E)" !"^Chemlight_" !="(ClaymoreDirectionalMine|DemoCharge|SatchelCharge)_Remote_Ammo" !="SLAMDirectionalMine_Wire_Ammo" !="(CMflare_Chaff|Sapper_Charge|SapperB_Charge|ATMine_Range)_Ammo" !="APERS(TripMine_Wire|BoundingMine_Range|Mine_Range)_Ammo" !="Epoch_(Sapper|Sapper(B|G)|Cloak)_F" !="EPOCH_RyanZombie_[1-5](|_(C|Sp|B|W|M|P))" !="GreatWhite_F" !="groundWeaponHolder" !="WeaponHolderSimulated" !="Epoch_(Male|Female)_F" !"Supply[0-9]" !"Steerable_Parachute_F" !="Epoch_Female_CamoRed_F" !="Land_Cages_F" !="(O|I|B)_UAV_01_backpack_F" !="I_(helipilot|helicrew)_F" !="#smokesource" !="SmokeLauncherAmmo" -5 "_EPOCH" !="(SapperHead|Jack|SolarGen)_SIM_EPOCH" !="Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower)_EPOCH" !="(Tipi|Workbench|StorageShelf|CinderWallHalf|Foundation|Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower))_Ghost_EPOCH" !="(Tipi|StorageShelf|Safe|LockBox|FirePlace|FirePlaceOn|PlotPole|SolarGen|Jack|Freezer|Tarp|CinderWallHalf|Bobber)_EPOCH" !="I_(Soldier[1-3]|Soldier)_EPOCH" !="(Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Shoebox|Bunk|Rabbit|Cabinet)_EPOCH" !="(Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH" !="(Safe|Workbench|LockBox|CinderWall|CinderWallGarage|CinderWallHalf|PlotPole|Tipi|StorageShelf|Fireplace|TankTrap)_SIM_EPOCH" !="Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorL|LargeWallDoorway|Stairs|Stairs2|Ramp|Ladder|Tower)_SIM_EPOCH" !="(Hesco3|Metal)(_Ghost|_SIM|)_EPOCH" !="(Spike|Metal)_TRAP_SIM_EPOCH" !="(WoodFoundation|Foundation)_EPOCH" !="WoodWall[1-4](_SIM|_Ghost|)_EPOCH" +5 "" !="Construct_f" !="I_UAV_01_F" !="(I|B|O)_UAV_AI" !"_EPOCH" !="B_65x39_Minigun_Caseless_Red_splash" !="B_762x51_Minigun_Tracer_Yellow_splash" !="B_(Swing|Stick)" !"^SmokeShell" !"^G_40mm_" !"^F_40mm_" !"Sub_F_" !"^F_Signal_" !="mini_Grenade" !="GrenadeHand" !="LaserTarget(C|W|E)" !"^Chemlight_" !="APERS(TripMine_Wire|BoundingMine_Range|Mine_Range)_Ammo" !="(SatchelCharge|DemoCharge|ClaymoreDirectionalMine)_Remote_Ammo" !="Epoch_(Sapper|Sapper(B|G)|Cloak)_F" !="EPOCH_RyanZombie_[1-5](|_(C|Sp|B|W|M|P))" !="GreatWhite_F" !="groundWeaponHolder" !="WeaponHolderSimulated" !="Epoch_(Male|Female)_F" !"Supply[0-9]" !"Steerable_Parachute_F" !="Epoch_Female_CamoRed_F" !="Land_Cages_F" !="(O|I|B)_UAV_01_backpack_F" !="I_(helipilot|helicrew)_F" !="#smokesource" !="SmokeLauncherAmmo" !"B_Bergen_(mcamo|dgtl|hex|tna)" !"B_AssaultPack_(khk|dgtl|rgr|sgg|cbr|mcamo|ocamo|tna)" !"B_Kitbag_(rgr|mcamo|sgg|cbr)" !"B_TacticalPack_(rgr|mcamo|ocamo|blk|oli)" !"B_FieldPack_(khk|ocamo|oucamo|cbr|blk|oli|ghex)" !"B_Carryall_(ocamo|oucamo|mcamo|khk|cbr|oli|ghex)" !"B_Viper(Light|)Harness_(oli|blk|ghex|hex|khk|oli)" !="B_Parachute" !="SLAMDirectionalMine_Wire_Ammo" !="(CMflare_Chaff|Sapper_Charge|SapperB_Charge|ATMine_Range)_Ammo" +5 "_EPOCH" !="BarrelBomb_EPOCH_Remote_Ammo" !="I_(Soldier[1-3]|Soldier)_EPOCH" !="(Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf)_EPOCH" !="(ToolRack|Shoebox|Bunk|Rabbit|Cabinet|toilet|KitchenSink)_EPOCH" !="(Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH" !=".+_(SIM|Ghost)_EPOCH" !="smallbackpack_(red|green|teal|pink)_epoch" !="(FirePlace|FirePlaceOn|Jack|Freezer|Tarp|Bobber)_EPOCH" 5 SeaGull diff --git a/Server_Install_Pack/sc/battleye/deleteVehicle.txt b/Server_Install_Pack/sc/battleye/deleteVehicle.txt index 1e68c34e..477a2772 100644 --- a/Server_Install_Pack/sc/battleye/deleteVehicle.txt +++ b/Server_Install_Pack/sc/battleye/deleteVehicle.txt @@ -1 +1 @@ -5 "" !="[0-9]{1,2}:[0-9]{1,4}" !" GroundWeaponHolder$" !" WeaponHolderSimulated$" !" Epoch_(Sapper|Sapper(B|G)|Cloak|Female_CamoRed)_F$" !" EPOCH_RyanZombie_[1-5](|_(C|Sp|B|W|M|P))$" !" (Land_MPS|Bobber|Rabbit)_EPOCH$" !" (Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH$" !" (Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Shoebox|Bunk|Cabinet|Freezer|Tarp)_EPOCH$" !" (SapperHead|Jack|SolarGen)_SIM_EPOCH$" !" (Tipi|Workbench|StorageShelf|CinderWallHalf|Foundation|Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower))_Ghost_EPOCH$" !" Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorL|LargeWallDoorway|Stairs|Stairs2|Ramp|Ladder|Tower)_SIM_EPOCH$" !" (Safe|Workbench|LockBox|CinderWall|CinderWallGarage|CinderWallHalf|PlotPole|Tipi|StorageShelf|Fireplace|TankTrap)_SIM_EPOCH$" !" (Hesco3|Metal|WoodWall[1-4])_(Ghost|SIM)_EPOCH$" !" (Spike|Metal)_TRAP_SIM_EPOCH$" !" (WoodFoundation|Foundation)_Ghost_EPOCH$" !" I_(Soldier[1-3]|Soldier)_EPOCH$" !" I_(helipilot|helicrew)_F$" !" I_UAV_01_F$" !" (I|B|O)_UAV_AI$" !" I_Boat_Armed_01_minigun_F" !" (B_Heli_Transport_01|GreatWhite)_F" !" Land_Cages_F$" +5 "" !" GroundWeaponHolder$" !" WeaponHolderSimulated$" !" Epoch_(Sapper|Sapper(B|G)|Cloak|Female_CamoRed)_F$" !" EPOCH_RyanZombie_[1-5](|_(C|Sp|B|W|M|P))$" !" (Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH$" !" (Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf)_EPOCH$" !" (ToolRack|Shoebox|Bunk|Cabinet|Freezer|Tarp|toilet|KitchenSink)_EPOCH$" !" I_(Soldier[1-3]|Soldier)_EPOCH$" !" I_(helipilot|helicrew)_F$" !" I_UAV_01_F$" !" (I|B|O)_UAV_AI$" !" I_Boat_Armed_01_minigun_F" !" Land_Cages_F$" !"(Bobber|Rabbit)_EPOCH$" !"_(SIM|Ghost)_EPOCH$" !"(B_Heli_Transport_01|GreatWhite)_F" diff --git a/Server_Install_Pack/sc/battleye/remoteexec.txt b/Server_Install_Pack/sc/battleye/remoteexec.txt index f50126f2..50fdb4c7 100644 --- a/Server_Install_Pack/sc/battleye/remoteexec.txt +++ b/Server_Install_Pack/sc/battleye/remoteexec.txt @@ -1 +1 @@ -5 "" !="bis_fnc_execvm \[\[.+\],\"initPlayerServer.sqf\"]" !="bis_fnc_effectkilled(airdestruction|secondaries) \[.+\]" !="epoch_server_checkplayer \[[A-Z]{1} [A-Za-z]{4,10} [0-9]{1,3}-[0-9]{1,3}:[0-9]{1,3}( \(.+\)|) REMOTE\]" !="epoch_server_(save(_vehicles|building)|(lock|pack)Storage|(upgrade|remove|paint|maint)build) \[.+\]" !="epoch_server_((load|respawn|dead|invite|revive|teleport)Player|(upgrade|updateplayer|create|delete)Group) \[.+\]" !="epoch_server_(deadplayerdetonate|triggerantagonist|playersetvariable|missioncomms|make(marker|SP)|removemarker) \[.+\]" !="epoch_server_(knockDownTree|mineRocks|lootAnimal|handle_(say3d|switchmove|sapperObjs)) \[.+\]" !="epoch_server_((repair|fill|lock)Vehicle|(loot|fill)Container|(store|take)Crypto|make(NPC|)Trade) \[.+\]" !="epoch_server_(paycrypto|tradeRequest|equippeditem|packJack|create(object|AirDrop)|airDropCrate|destroytrash|unpackBackpack) \[.+\]" !="epoch_(localcleanup|fnc_saveplayer|client_bitePlayer|serverlootobject) \[.+\]" !="cup_fnc_handletow \[.+\]" !="bis_fnc_reviveinitaddplayer \[.+\]" +5 "" !="bis_fnc_execvm \[\[.+\],\"initPlayerServer.sqf\"]" !="bis_fnc_effectkilled(airdestruction|secondaries) \[.+\]" !="epoch_server_(checkplayer|save(_vehicles|building)|(lock|pack)Storage|(upgrade|remove|paint|maint)build) \[.+\]" !="epoch_server_((load|respawn|dead|invite|revive|teleport)Player) \[.+\]" !="epoch_server_((upgrade|updateplayer|inviteplayer|create|delete)(Temp|)Group) \[.+\]" !="epoch_server_(deadplayerdetonate|triggerantagonist|playersetvariable|missioncomms|make(marker|SP)|removemarker) \[.+\]" !="epoch_server_(upgrade_vehicle|knockDownTree|mineRocks|lootAnimal|handle_(say3d|switchmove|sapperObjs)) \[.+\]" !="epoch_server_((repair|fill|lock)Vehicle|(loot|fill)Container|(store|take)Crypto|make(NPC|)Trade) \[.+\]" !="epoch_server_(paycrypto|tradeRequest|equippeditem|packJack|create(object|AirDrop)|airDropCrate|destroytrash|unpackBackpack) \[.+\]" !="epoch_(localcleanup|fnc_saveplayer|client_bitePlayer|serverlootobject|fnc_updateplayerstats) \[.+\]" !="cup_fnc_handletow \[.+\]" !="bis_fnc_reviveinitaddplayer \[.+\]" diff --git a/Server_Install_Pack/sc/battleye/scripts.txt b/Server_Install_Pack/sc/battleye/scripts.txt index e1baef22..de2bfb1c 100644 --- a/Server_Install_Pack/sc/battleye/scripts.txt +++ b/Server_Install_Pack/sc/battleye/scripts.txt @@ -1,75 +1,73 @@ //new2 -7 "BIS_fnc_dynamictext" !="\"BIS_fnc_dynamictext\"" !="'BIS_fnc_dynamictext'" -7 forceRespawn !="ForceRespawnDuration" !="reviveHandleForceRespawnAction" !="forcerespawn player;" -7 setFriend -7 setAmmo -7 enableFatigue -7 setUnitRecoilCoefficient -7 setWeaponReloadingTime !="_unit setWeaponReloadingTime [_unit,_weapon,1];" -7 allMissionObjects !="_alljammer = allmissionobjects 'PlotPole_EPOCH';" -7 callExtension -7 showCommandingMenu !="showCommandingMenu '';" !="showCommandingMenu '#USER:" -7 moveIn !="fnc_moveInCargo" !="\"BIS_fnc_moveIn\"" !="\"A3\functions_f\Misc\fn_moveIn.sqf\"" !="\"A3\functions_f\arrays\fn_removeIndex.sqf\"" !="player moveInAny _vehicle;\nEPOCH_antiWallCount = EPOCH_antiWallCount + 1;" !="[\"I_UAV_AI\", position _unit, [], 0, \"CAN_COLLIDE\"];\n_driver moveInAny _unit;" !="_driver moveInAny Epoch_mission_uav;" !="axeVIP moveInDriver vehicle axeVIP;" !="axeVIP moveInCargo vehicle axeVIP;" !="_driver moveInDriver _axeCopter;" !="_unit moveInGunner _axeCopter;" !="axeVIP moveInDriver vehicle axeVIP;" !="axeVIP moveInCargo vehicle axeVIP;" !="_driver moveInAny axeUAV" -7 enableCollisionWith -7 hideObject !="_dogHolder hideobject true;" !="_dogHolder hideobject false;" !="player hideobject true;" !="_ship hideobject true;\n_ship hideobjectglobal true;" -7 setvelocity !="setVelocityTarget" !="_bolt setPosATL _pos;\n_bolt setVelocity [0, 0, -10];" !="EPOCH_target setvelocitytransformation" !="_currentTarget setVelocity [0,0,-0.01];" !="_head setVelocity [\n(sin _dir * _speed), \n(cos _dir * _speed)" !="_vel = velocity this; _dir = getDir player; this setVelocity[(_vel select 0)+(sin _dir * 2),(_vel select 1)+(cos _dir * 2),(_vel select 2)];" !="_head setVelocity [random 2,random 2,10];" !="_bobber setVelocity [0,-1,-10];" !="_x setvelocity [0,0,0.1];" !="_veh setVelocity [0,0,0];" !="_this select 0 setvelocity (_this select 1)" !="_zombie setVelocityTransformation [_aslPos,_aslPos,_unitV,_unitV,_unitvDir,_vDir,_unitvUp,_unitvUp,2];" -7 assignAs !"assignAsCargo" !="_unit assignAsGunner _axeCopter;" !="_driver assignAsDriver _axeCopter;" !="axeVIP assignAsDriver vehicle axeVIP;" -7 assignAsCargo !="_x assignAsCargo axeGeneralsBoat;" !="axeVIP assignAsCargo vehicle player;" !="axeVIP assignAsCargo vehicle axeVIP;" -7 allowDamage !="_unit allowDamage false;" !="_unit allowDamage true;" !="player allowDamage true;" !="vehicle player allowDamage true;" !="player allowDamage false;" !="_target allowDamage true;" !="_cargo allowDamage false;" -7 addWeaponCargo !="_acceptHolder addWeaponCargo [_wWeapon, 1] ;" !="CBA_fnc_addWeaponCargo" !="\\fnc_addWeaponCargo" !="\"addWeaponCargo" !="cba_fAddWeaponCargo" -7 onMapSingleClick !="onMapSingleClick '';" !="\"onmapsingleclick\"" -7 addMagazine !"addMagazineCargo" !="player addMagazine [_item, _magazineSizeMax];" !="player addMagazine [_item, floor (_magazineSize % _magazineSizeMax)];" !="player addMagazine[_x select 0, _x select 1];" !="player addMagazine \"sledge_swing\";" !="player addMagazine \"Hatchet_swing\";" !="player addMagazine \"stick_swing\";" !="_wh addMagazineAmmoCargo[_item, 1, _count];" !="CBA_fnc_addMagazine" !="\\fnc_addMagazine" !="\"addMagazine" -7 addMagazineCargo !="_dogHolder addMagazineCargo [\"RabbitCarcass_EPOCH\", 1]" !="_dogHolder addMagazineCargo [\"Pelt_EPOCH\", 1]" !="_dogHolder addMagazineCargo [\"Venom_EPOCH\", 1]" !="_dogHolder addMagazineCargo [\"SnakeCarcass_EPOCH\", 1]" !="_dogHolder addMagazineCargo [\"ChickenCarcass_EPOCH\", 1]" !="_acceptHolder addMagazineCargo [_wAmmo, 1] ;" !="CBA_fnc_addMagazineCargo" !="\\fnc_addMagazineCargo" !="\"addMagazineCargo" !="cba_fAddMagazineCargo" -7 addItem !="{player addItemToVest _x} forEach _vestItems;" !="player addItem _item;" !="_plyr addItemToVest _missionItem;" !="axeVIP addItemToVest _item;" !="_plyr addItemToVest _missionItem;" !="EPOCH_fnc_addItemOverflow" !="CBA_fnc_addItem" !="\\fnc_addItem" !="\"addItem" !="fnc_addItemCargo" -7 addBackPack !="fnc_addBackpackCargo" -7 addMissionEventHandler !="CBA_clientID = [0, 2] select isMultiplayer;\naddMissionEventHandler [\"PlayerConnected\", {\nparams [\"_id\", \"_uid\", \"_name\"" !="addMissionEventHandler [\"EachFrame\", {call cba_common_fnc_onFrame}];" !="addMissionEventHandler [\"HandleDisconnect\"," !="addMissionEventHandler [\"Loaded\"," !="addMissionEventHandler ['Draw3D',_var + \"call Epoch_gui3DCooldownEH;\"];" !="addMissionEventHandler ['Draw3D',_var + \"call epoch_gui3dModelPosEH;\"];" !="addMissionEventHandler ['Draw3D',_var + \"call epoch_gui3dWorldPosEH;\"];" !="addMissionEventHandler [\n\"ended\",\n{\n\nBIS_fnc_missionHandlers_end = _this;" -7 removeMissionEventHandler !="removeMissionEventHandler [\"Draw3D\", _id];" -7 removeAllWeapons !="removeAllWeapons axeGeneral;" -7 removeAllItems -7 removeAllActions -7 setViewDistance !="setViewDistance 1600" -7 createGroup !="EPOCH_server_createGroup" !="_grp = createGroup [RESISTANCE, true];" !="if (isserver) then {\n_group = creategroup sidelogic;" !="grpVIPGeneral = createGroup [RESISTANCE, true];" !="_grp = createGroup side _plyr;" !="_grp = createGroup [_side, true];" !="_grp = createGroup [(side _plyr), true];" !="createcenter sidelogic;\n_grpLogic = creategroup sidelogic;\nbis_functions_mainscope" !="_group = createGroup [west, true];" -7 createVehicleCrew !="createvehiclecrew _x;" -7 createVehicleLocal !="\"#particlesource\" createVehicleLocal" !="\"#lightpoint\" createVehicleLocal" !="\"BloodSplat\" createVehicleLocal" !="[\"lightning1_F\", \"lightning2_F\"] call BIS_fnc_selectRandom;\n_lighting = _class createVehicleLocal" !="SLX_XEH_DUMMY createVehicleLocal [0, 0, 0];" !="CBA_eventHandlers = \"Logic\" createVehicleLocal [0, 0];" -7 createUnit !="_driver = _grp createUnit[\"I_UAV_AI\", position _unit, [], 0, \"CAN_COLLIDE\"];" !="axeGeneral = grpVIPGeneral createUnit [\"I_officer_F\", axeGeneralPos, [], 1, \"CAN_COLLIDE\"];" !="bis_functions_mainscope = _grpLogic createunit [\"Logic\",[9,9,9],[],0,\"none\"];" !="_unit = _grp createUnit[selectRandom _arrUnits, _pos, [], 0, \"FORM\"];" !="_driver = (group player) createUnit[\"I_UAV_AI\", position axeUAV, [], 0, \"CAN_COLLIDE\"];" -7 createAgent !="bis_revive_ratioLethal = createAgent [\"Logic\", [10,10,0], [], 0, \"CAN_COLLIDE\"];" !="_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\"];" !="_unit = createAgent[_unitClass, position player, [], _zRange, \"FORM\"];" !="_animal = createAgent[_randomAIClass, _animalPos, [], 0, \"CAN_COLLIDE\"];" !="_axeSapper = createAgent [\"Epoch_Sapper_F\", _pos, [], 12, \"FORM\"];" !="_nestMate = createAgent [\"Epoch_Sapper_F\", _garrPos, [], 0, \"FORM\"];" -7 createTeam -7 createDialog !="createDialog \"rmx_dynamenu\";" !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog _tapDiag;" !="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\";" !="createDisplay \"rmx_moveDynamicHUD\";" !="_parent createdisplay _displayClass;" !="finddisplay 151 createdisplay 'RscDisplayOptionsLayout'" -7 deleteMarker !="deleteMarkerLocal _mName;" -7 setMarker !="CBA_fnc_setMarkerPersistent\"" !="\\fnc_setMarkerPersistent" !="\"setMarkerPersistent" !="_mName setMarkerShapeLocal _mShape;" !="_mName setMarkerTypeLocal _mType;" !="(_x select 0) setMarkerPosLocal (position player);" -7 createMarker !="CBA_fnc_createMarker\"" !="\\fnc_createMarker" !="\"createMarker" !="cba_fCreateMarker" !="createMarkerLocal [_mName, _mPos];" -7 assignItem !="axeVIP assignItem _item;" !="unassignItem" -7 forceAddUniform -7 removeAllMPEventHandlers -7 setDammage -7 displaySetEventHandler -7 ctrlSetEventHandler !="_ctrlButtonOK ctrlseteventhandler [\"buttonclick\"," !="ctrlSetEventHandler ['LBDblClick', '_this call" !="_buttonRespawn ctrlseteventhandler [\"buttonclick\",\"with uinamespace do {['buttonRespawn'," !="_ctrl ctrlSetEventHandler [\"mouseEnter\"" !="_ctrlBtn ctrlSetEventHandler [\"MouseButtonDblClick\", _verAct];" !="_button_gen ctrlSetEventHandler [\"ButtonClick\",_btn_code + \"(uiNamespace getVariable [\"" -7 addMPEventHandler -7 addEventHandler !"displayAddEventHandler" !"ctrlAddEventHandler" !="player addeventhandler [\"PostReset\",{BIS_EnginePPReset = true;} ];" !="player addEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="\"CBA_fnc_addEventHandler\"" !="\\fnc_addEventHandler" !="\"addEventHandler" !="_eventFunc = _eventFunc + \"(_this select 0) addEventHandler ['Respawn', \" + str _eventFunc + \"];\";" !="_unit addEventHandler [\"hitpart\"," !="CBA_fnc_addEventHandler" !="_unit addEventHandler [_x, format ['call cba_xeh_fnc_%1', _x]];" !="_ship addEventHandler [\"AttributesChanged3DEN\"" !="addEventHandler [\"HandleDamage\",bis_fnc_reviveOnPlayerHandleDamage];" !="_unit addEventHandler [\"FiredNear\"" !="_smokeEH = _plyr addEventHandler [\"FiredNear\", \"airDropHandle setFSMVariable" !="_onContactEH = _currentTarget addEventHandler[\"EpeContactStart"" !="_object addeventhandler [\"local\",{[[_this select 0],\"bis_fnc_objectVar\"" -7 displayAddEventHandler !="(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"true\"];" !="displayAddEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="_display displayaddeventhandler\n[\n\"mousemoving\"," !="_display displayaddeventhandler [\"unload\",\"uinamespace setvariable ['BIS_fnc_guiMess" !="findDisplay -1337 displayAddEventHandler ['Unload'" !="_display displayaddeventhandler [\"keydown\",\"with uinamespace do {['keyDown'" !="_display displayaddeventhandler [_x,_fnc_animate];" !="Development\") then\n{\n_display displayaddeventhandler [\n\"keydown\"" !="CBA_fnc_addDisplayHandler" !="_display displayAddEventHandler [\"MouseMoving" !="private _handler = _display displayAddEventHandler [_key, _code];" !="_display displayAddEventHandler [\"KeyDown\", \"_this call cba_keybinding_fnc_onKeyDown\"" -7 ctrlAddEventHandler !="_control = _display displayctrl 37305; \n_control ctrladdeventhandler" !="_ctrlMap = _display displayctrl 101;\n_ctrlMap ctrladdeventhandler" !="_display displayctrl 21995;\n_assetsButton ctrladdeventhandler [\"buttonclick\"," !="_display displayctrl 2406; \n_control ctrladdeventhandler [\"buttonclick\"," !="_display displayctrl 2400;\n_control ctrladdeventhandler [\"buttonclick\"," !="_ctrlTags ctrladdeventhandler [\"lbselchanged\"," !="_ButtonGeneral ctrladdeventhandler [\"buttonclick\"," !="_ctrlExecuteLocal ctrladdeventhandler [\"buttonclick\"," !="_bg ctrlAddEventHandler [\"MouseEnter\"," !="_container ctrlAddEventHandler [\"LBDblClick\",\"_this call EPOCH_itemInteractClick\"];" !="(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)])];" !="_prevButton ctrlAddEventHandler [\"MouseButtonUp\", {_this call cba_diagnostic_fnc_debug" !="BIS_RscRespawnControlsMap_ctrlHeaderRespawnButton ctrlAddEventhandler [\"ButtonDown\"" !="_control = _display displayctrl 105;\n_control ctrladdeventhandler [\"MouseButtonUp\"" !="_ctrlAddonList ctrlAddEventHandler [\"LBSelChanged\", cba_settings_fnc_gui_addonChanged];" -7 removeAllEventHandlers !"ctrlRemoveAllEventHandlers" !"displayRemoveAllEventHandlers" !="_vehicle removeAllEventHandlers \"GetOut\";" !="_sapper removeAllEventHandlers \"Hit\";\n_sapper removeAllEventHandlers \"FiredNear\";" !="_unit removeAllEventHandlers \"Hit\";\n_unit removeAllEventHandlers \"FiredNear\";" !="{_ship removeAllEventHandlers _x;} forEach [\"AttributesChanged3DEN\"" !="_zombie removeAllEventHandlers \"Hit\";" !="_zombie removeAllEventHandlers \"FiredNear\";" -7 displayRemoveAllEventHandlers !="_display displayRemoveAllEventHandlers _x;" !="if !(isMultiplayer) then { { (findDisplay 46) displayRemoveAllEventHandlers _x } forEach [\"KeyUp\", \"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];" !="player removeEventHandler [_x, 0];" !="\"CBA_fnc_removeEventHandler\"" !="\\fnc_removeEventHandler" !="\"removeEventHandler" -7 switchCamera !="vehicle player switchCamera" !="_antagonist switchCamera \"Internal\";" -7 remoteControl !="fn_moduleRemoteControl.sqf" !="\"BIS_fnc_moduleRemoteControl\"" -7 drawIcon3D !="EPOCH_drawIcon3dStability" !="EPOCH_drawIcon3d" !="drawIcon3D[\"\x\addons\a3_epoch_code\Data\Member.paa\",_color,_pos,1,1,0,_text,1,0.025,\"PuristaMedium\"];\n}forEach EPOCH_ESP_TARGETS;" !="drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_stability],_color,(getPosATL EPOCH_stabilityTarget),5,5,0,\"\",1,0.05,\"PuristaMedium\"];" !="drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_num],_color,_pos,4,4,0,\"\",1,0.05,\"PuristaMedium\"];" !="if (_condition) then {\ndrawIcon3D [_icon, _color, _position, _sizeX, _sizeY, _angle, _text," !="drawIcon3D [\"\A3\UI_F_MP_Mark\Data\Tasks\Misc\background.paa\"" !="drawIcon3D\n[\n(_x getVariable [\"bis_fnc_reviveGet3dIcons_textures" !="drawIcon3D[\"x\addons\a3_epoch_code\Data\UI\snap_ca.paa\"" -7 drawLine3D !="{\nfor [{_i = 1}, {_i < count _x}, {_i = _i + 1}] do {\ndrawLine3D [_x select (_i - 1), _x select _i, ((BIS_tracedShooter getVari" -7 ctrlCreate !="_parent ctrlcreate [\"RscMessageBox\",2351];" !="_c = _dsp ctrlCreate [\"rmx_drag_RscActivePicture\", call epoch_getIDC];" !="_c = _dsp ctrlCreate [\"rmx_t1\", call epoch_getIDC];" !="ctrlCreate [\"RscProgress\",_idc + 1];" !="ctrlCreate [\"rmx_rscControlsGroup\"" !="_ListGroup = _display ctrlCreate [\"RscControlsGroupNoHScrollbars\"" !="ctrlCreate [_x,call _getIDC];" !="_mainGrp = _display ctrlCreate [\"Epoch_main_config_group\",_value];" !="ctrlCreate !="_prevButton = _display ctrlCreate [\"RscButtonMenu\", 90110, _dbg];" [\"RscControlsGroupNoScrollbars\",call epoch_getIDC];" !="ctrlCreate [\"rmx_rscPicture\",(66600 + _e)];" !="ctrlCreate [\"RscStructuredText\",call epoch_getIDC];" !="_bar = _display ctrlCreate [\"RscCustomProgress\"" !="_group = _dsp ctrlCreate [\"rmx_rscControlsGroup\", call Epoch_getIDC]" !="_control = _display ctrlCreate [\"RscControlsGroupNoScrollbars\", 5678910];" -7 ctrlClassName -7 ctrlModel -7 ctrlModelDirection -7 ctrlModelSide -7 ctrlModelUp -7 ctrlSetDirection -7 deleteVehicleCrew !="fn_deleteVehicleCrew.sqf" !="\"BIS_fnc_deleteVehicleCrew\"" -7 loadFile -7 selectPlayer !="selectPlayer _playerObject;" -7 setGroupIconsVisible -7 setGroupIconsVisible -7 setGroupIconsSelectable -7 setGroupIconParams -7 addGroupIcon +5 "BIS_fnc_dynamictext" !="\"BIS_fnc_dynamictext\"" !="'BIS_fnc_dynamictext'" +5 loadFile +5 forceRespawn !="ForceRespawnDuration" !="reviveHandleForceRespawnAction" !="forcerespawn player;" +5 setFriend +5 setAmmo +5 enableFatigue +5 setUnitRecoilCoefficient +5 setWeaponReloadingTime !="_unit setWeaponReloadingTime [_unit,_weapon,1];" !="_unit setWeaponReloadingTime [_unit,_weapon,1];" !="player fire [_muzzle, _muzzle, _item];\nplayer setWeaponReloadingTime [player, _muzzle, 0];" +5 allMissionObjects !="_alljammer = allmissionobjects 'PlotPole_EPOCH';" +5 callExtension +5 showCommandingMenu !="showCommandingMenu '';" !="showCommandingMenu '#USER:" +5 enableCollisionWith +5 setvelocity !="setVelocityTarget" !="_bolt setPosATL _pos;\n_bolt setVelocity [0, 0, -10];" !="EPOCH_target setvelocitytransformation" !="_currentTarget setVelocity [0,0,-0.01];" !="_head setVelocity [\n(sin _dir * _speed), \n(cos _dir * _speed)" !="_vel = velocity this; _dir = getDir player; this setVelocity[(_vel select 0)+(sin _dir * 2),(_vel select 1)+(cos _dir * 2),(_vel select 2)];" !="_head setVelocity [random 2,random 2,10];" !="_bobber setVelocity [0,-1,-10];" !="_x setvelocity [0,0,0.1];" !="_veh setVelocity [0,0,0];" !="_this select 0 setvelocity (_this select 1)" !="_zombie setVelocityTransformation [_aslPos,_aslPos,_unitV,_unitV,_unitvDir,_vDir,_unitvUp,_unitvUp,2];" +5 assignAs !"assignAsCargo" !="_unit assignAsGunner _axeCopter;" !="_driver assignAsDriver _axeCopter;" !="axeVIP assignAsDriver vehicle axeVIP;" +5 assignAsCargo !="_x assignAsCargo axeGeneralsBoat;" !="axeVIP assignAsCargo vehicle player;" !="axeVIP assignAsCargo vehicle axeVIP;" +5 allowDamage !="_unit allowDamage false;" !="_unit allowDamage true;" !="player allowDamage true;" !="vehicle player allowDamage true;" !="player allowDamage false;" !="_target allowDamage true;" !="_cargo allowDamage false;" +5 addWeaponCargo !="_acceptHolder addWeaponCargo [_wWeapon, 1] ;" !="CBA_fnc_addWeaponCargo" !="\\fnc_addWeaponCargo" !="\"addWeaponCargo" !="cba_fAddWeaponCargo" +5 onMapSingleClick !="onMapSingleClick '';" !="\"onmapsingleclick\"" +5 addMagazine !"addMagazineCargo" !="player addMagazine [_item, _magazineSizeMax];" !="player addMagazine [_item, floor (_magazineSize % _magazineSizeMax)];" !="player addMagazine[_x select 0, _x select 1];" !="player addMagazine \"sledge_swing\";" !="player addMagazine \"Hatchet_swing\";" !="player addMagazine \"stick_swing\";" !="_wh addMagazineAmmoCargo[_item, 1, _count];" !="CBA_fnc_addMagazine" !="\\fnc_addMagazine" !="\"addMagazine" !="vehicle player addMagazineTurret" !="player addMagazine [_magsTurret,_magAmmo]" !="vehicle player addMagazineTurret" !="player addMagazine [_magsTurret,_magAmmo]" !="EPOCH_fnc_addMagazineOverflow" +5 addMagazineCargo !="_dogHolder addMagazineCargo [\"RabbitCarcass_EPOCH\", 1]" !="_dogHolder addMagazineCargo [\"Pelt_EPOCH\", 1]" !="_dogHolder addMagazineCargo [\"Venom_EPOCH\", 1]" !="_dogHolder addMagazineCargo [\"SnakeCarcass_EPOCH\", 1]" !="_dogHolder addMagazineCargo [\"ChickenCarcass_EPOCH\", 1]" !="_acceptHolder addMagazineCargo [_wAmmo, 1] ;" !="CBA_fnc_addMagazineCargo" !="\\fnc_addMagazineCargo" !="\"addMagazineCargo" !="cba_fAddMagazineCargo" +5 addItem !="{player addItemToVest _x} forEach _vestItems;" !="player addItem _item;" !="_plyr addItemToVest _missionItem;" !="axeVIP addItemToVest _item;" !="_plyr addItemToVest _missionItem;" !="EPOCH_fnc_addItemOverflow" !="CBA_fnc_addItem" !="\\fnc_addItem" !="\"addItem" !="fnc_addItemCargo" !="wH = _nearByHolder select 0;\n};\nif !(isNull _wh) then {\n_wh addItemCargoGlobal [_item,1];\n};\n};\n};\n\n_fnc_findItemInContainers = " +5 addBackPack !="fnc_addBackpackCargo" +5 addMissionEventHandler !="CBA_clientID = [0, 2] select isMultiplayer;\naddMissionEventHandler [\"PlayerConnected\", {\nparams [\"_id\", \"_uid\", \"_name\"" !="addMissionEventHandler [\"EachFrame\", {call cba_common_fnc_onFrame}];" !="addMissionEventHandler [\"HandleDisconnect\"," !="addMissionEventHandler [\"Loaded\"," !="addMissionEventHandler ['Draw3D',_var + \"call Epoch_gui3DCooldownEH;\"];" !="addMissionEventHandler ['Draw3D',_var + \"call epoch_gui3dModelPosEH;\"];" !="addMissionEventHandler ['Draw3D',_var + \"call epoch_gui3dWorldPosEH;\"];" !="addMissionEventHandler [\n\"ended\",\n{\n\nBIS_fnc_missionHandlers_end = _this;" !="private _ehId = addMissionEventHandler [_event select [2], _code];" !="addMissionEventHandler [\"PlayerViewChanged\", {if (cameraView isEqualTo \"GROUP\") then {vehicle player switchCamera \"Internal\";};}];" +5 removeMissionEventHandler !="removeMissionEventHandler [\"Draw3D\", _id];" !="removeMissionEventHandler [_event select [2], _x select 1];" +5 removeAllWeapons !="removeAllWeapons axeGeneral;" +5 removeAllItems +5 removeAllActions +5 setViewDistance !="setViewDistance 1600" +5 createGroup !="EPOCH_server_createGroup" !="_grp = createGroup [RESISTANCE, true];" !="if (isserver) then {\n_group = creategroup sidelogic;" !="grpVIPGeneral = createGroup [RESISTANCE, true];" !="_grp = createGroup side _plyr;" !="_grp = createGroup [_side, true];" !="_grp = createGroup [(side _plyr), true];" !="createcenter sidelogic;\n_grpLogic = creategroup sidelogic;\nbis_functions_mainscope" !="_group = createGroup [west, true];" +5 createVehicleCrew !="createvehiclecrew _x;" +5 createVehicleLocal !="\"Sign_Arrow_Direction_Yellow_F\" createVehicleLocal" !="\"#particlesource\" createVehicleLocal" !="\"#lightpoint\" createVehicleLocal" !="\"BloodSplat\" createVehicleLocal" !="[\"lightning1_F\", \"lightning2_F\"] call BIS_fnc_selectRandom;\n_lighting = _class createVehicleLocal" !="SLX_XEH_DUMMY createVehicleLocal [0, 0, 0];" !="CBA_eventHandlers = \"Logic\" createVehicleLocal [0, 0];" +5 createUnit !="_driver = _grp createUnit[\"I_UAV_AI\", position _unit, [], 0, \"CAN_COLLIDE\"];" !="axeGeneral = grpVIPGeneral createUnit [\"I_officer_F\", axeGeneralPos, [], 1, \"CAN_COLLIDE\"];" !="bis_functions_mainscope = _grpLogic createunit [\"Logic\",[9,9,9],[],0,\"none\"];" !="_unit = _grp createUnit[selectRandom _arrUnits, _pos, [], 0, \"FORM\"];" !="_driver = (group player) createUnit[\"I_UAV_AI\", position axeUAV, [], 0, \"CAN_COLLIDE\"];" +5 createAgent !="bis_revive_ratioLethal = createAgent [\"Logic\", [10,10,0], [], 0, \"CAN_COLLIDE\"];" !="_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\"];" !="_unit = createAgent[_unitClass, position player, [], _zRange, \"FORM\"];" !="_animal = createAgent[_randomAIClass, _animalPos, [], 0, \"CAN_COLLIDE\"];" !="_axeSapper = createAgent [\"Epoch_Sapper_F\", _pos, [], 12, \"FORM\"];" !="_nestMate = createAgent [\"Epoch_Sapper_F\", _garrPos, [], 0, \"FORM\"];" +5 createTeam +5 createDialog !="createDialog \"rmx_dynamenu\";" !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog _tapDiag;" !="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';" !="createDialog \"Epoch_myTempGroup\";" !="createDialog (if ((Epoch_my_tempGroupUID == \"\") && (Epoch_my_tempGroup isEqualTo [])) then {\"EPOCH_createTempGrp\"} else {\"Epoch_myTempGroup\"});" !="createDialog \"tempGroupRequests\";" +5 createDisplay !="createDisplay \"rmx_dynamenu\";" !="createDisplay \"rmx_moveDynamicHUD\";" !="_parent createdisplay _displayClass;" !="finddisplay 151 createdisplay 'RscDisplayOptionsLayout'" !="_display createdisplay \"RscDisplayDLCPreview\";" +5 deleteMarker !="deleteMarkerLocal _mName;" +5 setMarker !="CBA_fnc_setMarkerPersistent\"" !="\\fnc_setMarkerPersistent" !="\"setMarkerPersistent" !="_mName setMarkerShapeLocal _mShape;" !="_mName setMarkerTypeLocal _mType;" !="(_x select 0) setMarkerPosLocal (position player);" !="_zoomMarker setMarkerSizeLocal" +5 createMarker !="CBA_fnc_createMarker\"" !="\\fnc_createMarker" !="\"createMarker" !="cba_fCreateMarker" !="createMarkerLocal [_mName, _mPos];" +5 assignItem !="axeVIP assignItem _item;" !="unassignItem" +5 forceAddUniform +5 removeAllMPEventHandlers +5 setDammage +5 displaySetEventHandler +5 ctrlSetEventHandler !="_ctrlButtonOK ctrlseteventhandler [\"buttonclick\"," !="ctrlSetEventHandler ['LBDblClick', '_this call" !="_buttonRespawn ctrlseteventhandler [\"buttonclick\",\"with uinamespace do {['buttonRespawn'," !="_ctrl ctrlSetEventHandler [\"mouseEnter\"" !="_ctrlBtn ctrlSetEventHandler [\"MouseButtonDblClick\", _verAct];" !="_button_gen ctrlSetEventHandler [\"ButtonClick\",_btn_code + \"(uiNamespace getVariable [\"" !="t \"#(rgb,8,8,3)color(1,1,1,0.1)\";\n_c ctrlCommit 0;\n_c ctrlSetEventHandler [\"MouseButtonUp\",format[\"['remove',%1,(_this select 1)" +5 addMPEventHandler +5 addEventHandler !"displayAddEventHandler" !"ctrlAddEventHandler" !="player addeventhandler [\"PostReset\",{BIS_EnginePPReset = true;} ];" !="player addEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="\"CBA_fnc_addEventHandler\"" !="\\fnc_addEventHandler" !="\"addEventHandler" !="_eventFunc = _eventFunc + \"(_this select 0) addEventHandler ['Respawn', \" + str _eventFunc + \"];\";" !="_unit addEventHandler [\"hitpart\"," !="CBA_fnc_addEventHandler" !="_unit addEventHandler [_x, format ['call cba_xeh_fnc_%1', _x]];" !="_ship addEventHandler [\"AttributesChanged3DEN\"" !="addEventHandler [\"HandleDamage\",bis_fnc_reviveOnPlayerHandleDamage];" !="_unit addEventHandler [\"FiredNear\"" !="_smokeEH = _plyr addEventHandler [\"FiredNear\", \"airDropHandle setFSMVariable" !="_onContactEH = _currentTarget addEventHandler[\"EpeContactStart"" !="_object addeventhandler [\"local\",{[[_this select 0],\"bis_fnc_objectVar\"" +5 displayAddEventHandler !="(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"true\"];" !="displayAddEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="displayaddeventhandler [\"mousemoving\"," !="_display displayaddeventhandler [\"unload\",\"uinamespace setvariable ['BIS_fnc_guiMess" !="findDisplay -1337 displayAddEventHandler ['Unload'" !="_display displayaddeventhandler [\"keydown\",\"with uinamespace do {['keyDown'" !="_display displayaddeventhandler [_x,_fnc_animate];" !="Development\") then\n{\n_display displayaddeventhandler [\n\"keydown\"" !="CBA_fnc_addDisplayHandler" !="_display displayAddEventHandler [\"MouseMoving" !="private _handler = _display displayAddEventHandler [_key, _code];" !="_display displayAddEventHandler [\"KeyDown\", \"_this call cba_keybinding_fnc_onKeyDown\"" !="isplay 602};\n\n_display = (findDisplay 602);\n_display displayAddEventHandler [\"MouseButtonUp\",\"[] spawn {rmx_var_fav_selected = f" !="displayaddeventhandler\n[\n\"mousemoving\"" +5 ctrlAddEventHandler !="_control = _display displayctrl 37305; \n_control ctrladdeventhandler" !="_ctrlMap = _display displayctrl 101;\n_ctrlMap ctrladdeventhandler" !="_display displayctrl 21995;\n_assetsButton ctrladdeventhandler [\"buttonclick\"," !="_display displayctrl 2406; \n_control ctrladdeventhandler [\"buttonclick\"," !="_display displayctrl 2400;\n_control ctrladdeventhandler [\"buttonclick\"," !="ctrladdeventhandler [\"lbselchanged\"," !="ctrladdeventhandler [\n\"lbselchanged\"," !="_ButtonGeneral ctrladdeventhandler [\"buttonclick\"," !="_ctrlExecuteLocal ctrladdeventhandler [\"buttonclick\"," !="_bg ctrlAddEventHandler [\"MouseEnter\"," !="_container ctrlAddEventHandler [\"LBDblClick\",\"_this call EPOCH_itemInteractClick\"];" !="(uiNamespace getVariable 'ESP_map') ctrlAddEventHandler['Draw', '_esp_targets = EPOCH_ESPMAP_TARGETS;" !="ctrlAddEventHandler ['MouseButtonDown'" !="_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)])];" !="_prevButton ctrlAddEventHandler [\"MouseButtonUp\", {_this call cba_diagnostic_fnc_debug" !="BIS_RscRespawnControlsMap_ctrlHeaderRespawnButton ctrlAddEventhandler [\"ButtonDown\"" !="_control = _display displayctrl 105;\n_control ctrladdeventhandler [\"MouseButtonUp\"" !="ctrlHeaderRespawnButton\", controlNull]) ctrlAddEventhandler [\"ButtonDown\"" !="_selected = false;\n{\n_c = _display displayCtrl _x;\n_c ctrlAddEventHandler [\"LBDrag\",\"rmx_var_favBar_Item = (_this call epoch_fav" !="_ctrlMouseArea ctrladdeventhandler [\"setfocus\",{with uinamespace do {[\"dlcClear\",[ctrlpar" !="13484 ctrlAddEventHandler [\"ButtonClick\", {[\"executeButton\"," +5 removeAllEventHandlers !"ctrlRemoveAllEventHandlers" !"displayRemoveAllEventHandlers" !="_vehicle removeAllEventHandlers \"GetOut\";" !="_sapper removeAllEventHandlers \"Hit\";\n_sapper removeAllEventHandlers \"FiredNear\";" !="_unit removeAllEventHandlers \"Hit\";\n_unit removeAllEventHandlers \"FiredNear\";" !="{_ship removeAllEventHandlers _x;} forEach [\"AttributesChanged3DEN\"" !="_zombie removeAllEventHandlers \"Hit\";" !="_zombie removeAllEventHandlers \"FiredNear\";" +5 displayRemoveAllEventHandlers !="_display displayRemoveAllEventHandlers _x;" !="if !(isMultiplayer) then { { (findDisplay 46) displayRemoveAllEventHandlers _x } forEach [\"KeyUp\", \"KeyDown\"] };" +5 removeAllMissionEventHandlers +5 ctrlRemoveAllEventHandlers !="(uiNamespace getVariable 'ESP_map') ctrlRemoveAllEventHandlers 'Draw';" !="ctrlAddEventHandler ['MouseButtonDown'" +5 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];" !="player removeEventHandler [_x, 0];" !="\"CBA_fnc_removeEventHandler\"" !="\\fnc_removeEventHandler" !="\"removeEventHandler" +5 switchCamera !="vehicle player switchCamera" !="_antagonist switchCamera \"Internal\";" +5 remoteControl !="fn_moduleRemoteControl.sqf" !="\"BIS_fnc_moduleRemoteControl\"" +5 drawIcon3D !="EPOCH_drawIcon3dStability" !="EPOCH_drawIcon3d" !="drawIcon3D[\"\x\addons\a3_epoch_code\Data\Member.paa\",_color,_pos,1,1,0,_text,1,0.025,\"PuristaMedium\"];\n}forEach EPOCH_ESP_TARGETS;" !="drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_stability],_color,(getPosATL EPOCH_stabilityTarget),5,5,0,\"\",1,0.05,\"PuristaMedium\"];" !="drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_num],_color,_pos,4,4,0,\"\",1,0.05,\"PuristaMedium\"];" !="if (_condition) then {\ndrawIcon3D [_icon, _color, _position, _sizeX, _sizeY, _angle, _text," !="drawIcon3D [\"\A3\UI_F_MP_Mark\Data\Tasks\Misc\background.paa\"" !="drawIcon3D\n[\n(_x getVariable [\"bis_fnc_reviveGet3dIcons_textures" !="drawIcon3D[\"x\addons\a3_epoch_code\Data\UI\snap_ca.paa\"" +5 drawLine3D !="{\nfor [{_i = 1}, {_i < count _x}, {_i = _i + 1}] do {\ndrawLine3D [_x select (_i - 1), _x select _i, ((BIS_tracedShooter getVari" +5 ctrlCreate !="_parent ctrlcreate [\"RscMessageBox\",2351];" !="_c = _dsp ctrlCreate [\"rmx_drag_RscActivePicture\", call epoch_getIDC];" !="_c = _dsp ctrlCreate [\"rmx_t1\", call epoch_getIDC];" !="ctrlCreate [\"RscProgress\",_idc + 1];" !="ctrlCreate [\"rmx_rscControlsGroup\"" !="_ListGroup = _display ctrlCreate [\"RscControlsGroupNoHScrollbars\"" !="ctrlCreate [_x,call _getIDC];" !="_mainGrp = _display ctrlCreate [\"Epoch_main_config_group\",_value];" !="ctrlCreate !="_prevButton = _display ctrlCreate [\"RscButtonMenu\", 90110, _dbg];" [\"RscControlsGroupNoScrollbars\",call epoch_getIDC];" !="ctrlCreate [\"rmx_rscPicture\",(66600 + _e)];" !="ctrlCreate [\"RscStructuredText\",call epoch_getIDC];" !="_bar = _display ctrlCreate [\"RscCustomProgress\"" !="_group = _dsp ctrlCreate [\"rmx_rscControlsGroup\", call Epoch_getIDC]" !="_control = _display ctrlCreate [\"RscControlsGroupNoScrollbars\", 5678910];" +5 ctrlClassName +5 ctrlModel +5 ctrlModelDirection +5 ctrlModelSide +5 ctrlModelUp +5 ctrlSetDirection +5 deleteVehicleCrew !="fn_deleteVehicleCrew.sqf" !="\"BIS_fnc_deleteVehicleCrew\"" +5 selectPlayer !="selectPlayer _playerObject;" +5 setGroupIconsVisible +5 setGroupIconsVisible +5 setGroupIconsSelectable +5 setGroupIconParams +5 addGroupIcon diff --git a/Server_Install_Pack/sc/battleye/setpos.txt b/Server_Install_Pack/sc/battleye/setpos.txt index 916a4694..16175819 100644 --- a/Server_Install_Pack/sc/battleye/setpos.txt +++ b/Server_Install_Pack/sc/battleye/setpos.txt @@ -1 +1 @@ -5 "" !="Epoch_(Male|Female)_F" !="SapperHead_SIM_EPOCH" !="(Tipi|Workbench|StorageShelf|Safe|LockBox|FirePlace|FirePlaceOn|PlotPole|SolarGen)_EPOCH" !="(Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Rabbit|Cabinet)_EPOCH" !="(Sheep|Goat|Snake|Hen|Cock|Fin|Alsatian)_random_EPOCH" !="(Safe|LockBox|CinderWallHalf|CinderWall|Fireplace|SolarGen|TankTrap)_SIM_EPOCH" !="Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorway|Stairs|Stairs2|Ramp)_SIM_EPOCH" !="(Foundation|Wood(Foundation|Ladder|Tower))_Ghost_EPOCH" !="Foundation_EPOCH" !="WoodFoundation_EPOCH" !="(Hesco3|Metal)(_Ghost|_SIM|)_EPOCH" !="WoodWall[1-4](_SIM|_Ghost|)_EPOCH" +5 "" !="Epoch_(Male|Female)_F" !="(Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf)_EPOCH" !="(ToolRack|Rabbit|Cabinet|toilet|KitchenSink)_EPOCH" !="(Sheep|Goat|Snake|Hen|Cock|Fin|Alsatian)_random_EPOCH" !="Foundation_EPOCH" !="WoodFoundation_EPOCH" !=".+_(SIM|Ghost)_EPOCH" !="(FirePlace|FirePlaceOn)_EPOCH" diff --git a/Server_Install_Pack/sc/battleye/setvariable.txt b/Server_Install_Pack/sc/battleye/setvariable.txt index dee38842..40668cb1 100644 --- a/Server_Install_Pack/sc/battleye/setvariable.txt +++ b/Server_Install_Pack/sc/battleye/setvariable.txt @@ -1 +1 @@ -5 "" !=(traderName|Offer|Accept|BUILD_SLOT|TRADE_ACTIVE|last_targeter|epoch_(antagobj|antagBomb|gm_enabled)) !="bis_fnc_objectvar_var" !="bis_fnc_selectrespawntemplate_respawned" !="#(rev_enabled|var)" !="cup_tow_towedveh" +5 "" !=(traderName|Offer|Accept|BUILD_SLOT|TRADE_ACTIVE|last_targeter|epoch_(antagobj|antagBomb)) !="bis_fnc_objectvar_var" !="bis_fnc_selectrespawntemplate_respawned" !="#(rev_enabled|var)" !="cup_tow_towedveh" diff --git a/Sources/epoch_code/System/EPOCH_zombie_brain.fsm b/Sources/epoch_code/System/EPOCH_zombie_brain.fsm index 8ae184e4..3bf5a9ce 100644 --- a/Sources/epoch_code/System/EPOCH_zombie_brain.fsm +++ b/Sources/epoch_code/System/EPOCH_zombie_brain.fsm @@ -1,11 +1,11 @@ /*%FSM*/ /*%FSM*/ /* -item0[] = {"brainz",0,4346,-25.000000,75.000000,75.000000,125.000000,0.000000,"brainz"}; +item0[] = {"brainz",0,250,-25.000000,75.000000,75.000000,125.000000,0.000000,"brainz"}; item1[] = {"_",8,218,125.000000,-175.000000,225.000000,-125.000000,0.000000,""}; item2[] = {"instinct",2,250,125.000000,-250.000000,225.000000,-200.000000,0.000000,"instinct"}; item3[] = {"check",4,218,275.000000,-250.000000,375.000000,-200.000000,5.000000,"check"}; -item4[] = {"pre_dispose",2,250,-75.000000,-100.000000,25.000000,-50.000000,0.000000,"pre dispose"}; +item4[] = {"pre_dispose",2,4346,-75.000000,-100.000000,25.000000,-50.000000,0.000000,"pre dispose"}; item5[] = {"dispose_1",4,218,-75.000000,-275.000000,25.000000,-225.000000,100.000000,"dispose"}; item6[] = {"wait_dispose",4,218,-100.000000,-25.000000,0.000000,25.000000,0.000000,"wait" \n "dispose"}; item7[] = {"reset_vars",2,250,125.000000,-100.000000,225.000000,-50.000000,0.000000,"reset vars"}; @@ -28,7 +28,7 @@ item23[] = {"hearing___target",4,218,600.000000,-225.000000,700.000000,-175.0000 item24[] = {"spin",2,250,-50.000000,-425.000000,50.000000,-375.000000,0.000000,"spin"}; item25[] = {"wait",4,218,75.000000,-425.000000,175.000000,-375.000000,0.000000,"wait"}; item26[] = {"scream",4,218,200.000000,-425.000000,300.000000,-375.000000,80.000000,"scream"}; -item27[] = {"____FAKE____",9,0,0.000000,0.000000,0.000000,0.000000,0.000000,"____FAKE____"}; +item27[] = {"____FAKE____",9,0,0.000000,0.000000,5135053892148252000000000000000000.000000,0.000000,0.000000,"____FAKE____"}; link0[] = {0,17}; link1[] = {1,2}; link2[] = {2,3}; @@ -70,8 +70,8 @@ link37[] = {24,25}; link38[] = {25,2}; link39[] = {26,2}; link40[] = {27,10}; -globals[] = {0.000000,0,0,0,0,640,480,1,267,6316128,1,-268.969421,732.515686,320.848328,-611.003845,978,854,1}; -window[] = {2,-1,-1,-32000,-32000,551,26,1051,26,3,996}; +globals[] = {0.000000,0,0,0,0,640,480,1,267,6316128,1,-268.969421,732.515686,320.848328,-611.003845,978,884,1}; +window[] = {2,-1,-1,-1,-1,733,208,1233,208,3,996}; *//*%FSM*/ class FSM { @@ -93,8 +93,8 @@ class FSM "_fsmPath = ""epoch_code\system"";" \n "_zombie setBehaviour ""CARELESS"";" \n "_zombie setUnitPos ""UP""; " \n - "_trgtArr = [""Epoch_Man_Base_F"",""Epoch_Female_base_F""];" \n - "_vehArray = [""Car""];" \n + "_trgtArr = [""Epoch_Male_F"",""Epoch_Female_F"",""LandVehicle"",""Ship"",""Air"",""Tank""];" \n + "" \n "_trgt = player;" \n "_t = diag_tickTime;" \n "_zedPos = getPosATL _zombie;" \n @@ -406,7 +406,7 @@ class FSM { name = "pre_dispose"; itemno = 4; - init = /*%FSM*/"_nrTrgts = _zedPos nearEntities [_trgtArr, 480];" \n + init = /*%FSM*/"_nrTrgts = (_zedPos nearEntities [_trgtArr, 480]) select {isPlayer _x};" \n "_canSee = [];" \n "{" \n " if !(lineIntersects [eyePos _trgt, eyePos _zombie, _zombie, _trgt]) then{" \n @@ -622,8 +622,7 @@ class FSM precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 90 && !_moving && _smellCoeff > 0 && !_inSafe"/*%FSM*/; action=/*%FSM*/"_nrstTrgt = objNull;" \n - "//_nrTrgts = _zedPos nearEntities [_trgtArr, _smellDist];" \n - "_nrTrgts = nearestObjects [_zedPos, _trgtArr, _smellDist];" \n + "_nrTrgts = (_zedPos nearEntities [_trgtArr, _sightDist]) select {isPlayer _x};" \n "_avPos = [0,0,0];" \n "_upwindPos = [0,0,0];" \n "_smellTrgtPos = [];" \n @@ -658,8 +657,7 @@ class FSM to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 85 && _sightCoeff > 0 && !_inSafe"/*%FSM*/; - action=/*%FSM*/"//_nrTrgts = _zedPos nearEntities [_trgtArr, _sightDist];" \n - "_nrTrgts = nearestObjects [_zedPos, _trgtArr, _sightDist];" \n + action=/*%FSM*/"_nrTrgts = (_zedPos nearEntities [_trgtArr, _sightDist]) select {isPlayer _x};" \n "_sightPos = [0,0,0];" \n "_avPos = [0,0,0];" \n "" \n @@ -671,7 +669,7 @@ class FSM "" \n "" \n " {" \n - " _sight = [_zombie, ""VIEW""] checkVisibility [eyePos _zombie,aimPos _x];" \n + " _sight = [_zombie, ""VIEW""] checkVisibility [eyePos _zombie,aimPos (driver _x)];" \n " if(alive _x)then{" \n " if(_sight >= 0.62)then{" \n " _thisPos = getPosATL _x;" \n @@ -878,4 +876,4 @@ class FSM "end", }; }; -/*%FSM*/ \ No newline at end of file +/*%FSM*/ diff --git a/Sources/epoch_code/System/EPOCH_zombie_walking.fsm b/Sources/epoch_code/System/EPOCH_zombie_walking.fsm index f2d253ad..8bfbaacf 100644 --- a/Sources/epoch_code/System/EPOCH_zombie_walking.fsm +++ b/Sources/epoch_code/System/EPOCH_zombie_walking.fsm @@ -135,7 +135,7 @@ class FSM condition=/*%FSM*/"!(_moveTo isEqualTo _nextPos)"/*%FSM*/; action=/*%FSM*/"_doMove = true;" \n "_decisionMade = true;" \n - "_moveTo = [] + _nextPos;" \n + "_moveTo = +_nextPos;" \n ""/*%FSM*/; }; /*%FSM*/ diff --git a/Sources/epoch_code/System/SPVEH.fsm b/Sources/epoch_code/System/SPVEH.fsm deleted file mode 100644 index 59140bc4..00000000 --- a/Sources/epoch_code/System/SPVEH.fsm +++ /dev/null @@ -1,69 +0,0 @@ -/*%FSM*/ -/*%FSM*/ -/* -item0[] = {"Init",0,4346,-300.000000,-225.000000,-200.000000,-175.000000,0.000000,"Init"}; -item1[] = {"_",8,218,-300.000000,-150.000000,-200.000000,-100.000000,0.000000,""}; -item2[] = {"Process",2,250,-300.000000,-75.000000,-200.000000,-25.000000,0.000000,"Process"}; -item3[] = {"Camera_View_Chec",4,218,-300.000000,50.000000,-200.000000,100.000000,0.000000,"Camera View" \n "Checks"}; -link0[] = {0,1}; -link1[] = {1,2}; -link2[] = {2,3}; -link3[] = {3,2}; -globals[] = {25.000000,1,0,0,16777215,640,480,1,125,6316128,1,-408.109894,77.792206,142.419571,-234.573410,812,854,1}; -window[] = {2,-1,-1,-1,-1,763,1706,2731,26,3,830}; -*//*%FSM*/ -class FSM -{ - fsmName = "SPVEH"; - class States - { - /*%FSM*/ - class Init - { - name = "Init"; - init = /*%FSM*/"diag_log ""Loaded Camera View Checks"";" \n - "// TODO: this is just temporary till proper workaround is made."/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class _ - { - priority = 0.000000; - to="Process"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"true"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class Process - { - name = "Process"; - init = /*%FSM*/""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class Camera_View_Chec - { - priority = 0.000000; - to="Process"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"cameraView == ""GROUP"""/*%FSM*/; - action=/*%FSM*/"vehicle player switchCamera ""Internal"";"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - }; - initState="Init"; - finalStates[] = - { - }; -}; -/*%FSM*/ \ No newline at end of file diff --git a/Sources/epoch_code/System/player_login.fsm b/Sources/epoch_code/System/player_login.fsm index 3fa6d148..ab8b8db5 100644 --- a/Sources/epoch_code/System/player_login.fsm +++ b/Sources/epoch_code/System/player_login.fsm @@ -17,7 +17,7 @@ item12[] = {"Empty_PlayerUID",4,218,125.000000,125.000000,225.000000,175.000000, item13[] = {"ERROR_PlayerUID",2,250,275.000000,125.000000,375.000000,175.000000,0.000000,"ERROR" \n "PlayerUID Empty"}; item14[] = {"",7,210,471.000061,145.999908,478.999939,154.000092,0.000000,""}; item15[] = {"Timeout_No_Respo",4,218,125.000000,875.000000,225.000000,925.000000,0.000000,"Timeout" \n "No Response"}; -item16[] = {"Response",4,218,-150.000000,825.000000,-50.000000,875.000000,0.000000,"Response"}; +item16[] = {"Response",4,4314,-150.000000,825.000000,-50.000000,875.000000,0.000000,"Response"}; item17[] = {"Setup_Player_Var",2,250,-25.000000,1075.000000,75.000000,1125.000000,0.000000,"Setup Player" \n "Variables"}; item18[] = {"Request_Hive",2,250,-25.000000,575.000000,75.000000,625.000000,0.000000,"Request Hive"}; item19[] = {"Timeout_No_Respo",4,218,125.000000,575.000000,225.000000,625.000000,0.000000,"Timeout" \n "No Response"}; @@ -25,7 +25,7 @@ item20[] = {"ERROR_Server_not",2,250,275.000000,875.000000,375.000000,925.000000 item21[] = {"",7,210,471.000000,895.999939,479.000000,904.000061,0.000000,""}; item22[] = {"Timeout_No_Respo",4,218,125.000000,775.000000,225.000000,825.000000,0.000000,"Timeout" \n "No Response"}; item23[] = {"Wrong_Server_Ver",4,218,125.000000,475.000000,225.000000,525.000000,10.000000,"Wrong" \n "Server Version"}; -item24[] = {"Player_In_Game",8,4314,-150.000000,1125.000000,-50.000000,1175.000000,0.000000,"Player" \n "In Game"}; +item24[] = {"Player_In_Game",8,218,-150.000000,1125.000000,-50.000000,1175.000000,0.000000,"Player" \n "In Game"}; item25[] = {"ERROR_Wrong_Server",2,250,275.000000,475.000000,375.000000,525.000000,0.000000,"ERROR" \n "Wrong" \n "Server Version"}; item26[] = {"Display_Message",4,218,600.000000,1150.000000,700.000000,1200.000000,0.000000,"" \n "Display Message" \n "Wait..."}; item27[] = {"Setup_Player_Obj",2,250,-25.000000,975.000000,75.000000,1025.000000,0.000000,"Setup Player" \n "Object"}; @@ -183,8 +183,8 @@ link93[] = {82,76}; link94[] = {83,16}; link95[] = {83,22}; link96[] = {84,31}; -globals[] = {0.000000,0,0,0,0,640,480,1,247,6316128,1,-320.898621,993.773193,1636.447266,764.085449,1287,854,1}; -window[] = {2,-1,-1,-1,-1,871,104,1088,104,3,1305}; +globals[] = {0.000000,0,0,0,0,640,480,1,247,6316128,1,-279.414825,540.037537,1629.530029,374.077881,577,884,1}; +window[] = {2,-1,-1,-1,-1,819,52,1036,52,3,595}; *//*%FSM*/ class FSM { @@ -198,22 +198,17 @@ class FSM itemno = 0; init = /*%FSM*/"titleCut ["""", ""BLACK FADED"", 1337];" \n "0 fadeSound 0;" \n - "//player enableSimulation false;" \n "" \n - "_debug = true;" \n + "// use config to control extra debug" \n + "_debug = [""CfgEpochClient"", ""debug"", false] call EPOCH_fnc_returnConfigEntryV2;" \n + "" \n "_myTime = diag_tickTime;" \n "if (_debug) then {" \n " diag_log ""EPOCH-LOGIN: Init"";" \n "};" \n "" \n - "_finalPlayerObjectCheck = {" \n - " (_mass isEqualTo (loadAbs _playerObject))" \n - "};" \n - "" \n - "EPOCH_loginFSM = _thisFSM;" \n - "EPOCH_playerLoginInit = {" \n - " EPOCH_loginFSM setFSMVariable [_this select 0, _this select 1];" \n - "};"/*%FSM*/; + "// init vars " \n + "_hitpoints = [];"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { @@ -237,9 +232,6 @@ class FSM name = "FINISH"; itemno = 1; init = /*%FSM*/"[] spawn EPOCH_masterLoop;" \n - "" \n - "EPOCH_loginFSM = nil;" \n - "EPOCH_playerLoginInit = nil;" \n "" \n "// fade in sound and screen" \n "3 fadeSound 1;" \n @@ -466,10 +458,13 @@ class FSM "{" \n " missionNamespace setVariable[(format[""EPOCH_player%1"", EPOCH_customVars select _forEachIndex]), _x];" \n "} forEach _playerVariables;" \n - """Loading Player Variables... Please wait!"" call Epoch_updateLoadingScreen;" \n + "{" \n + " missionNamespace setVariable[(format[""EPOCH_total%1"", EPOCH_communityStats select _forEachIndex]), _x];" \n + "} forEach _communityStats;" \n + """Loading Player Variables and Community Stats... Please wait!"" call Epoch_updateLoadingScreen;" \n "progressLoadingScreen 0.7;" \n "if (_debug) then {" \n - " diag_log ""EPOCH-LOGIN: Setup Player Variables"";" \n + " diag_log ""EPOCH-LOGIN: Setup Player Variables and Community Stats"";" \n "};"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links @@ -495,7 +490,7 @@ class FSM itemno = 18; init = /*%FSM*/"_myTime = diag_tickTime;" \n "" \n - "[player] remoteExec [""EPOCH_server_checkPlayer"",2];" \n + "[player,_thisFSM] remoteExec [""EPOCH_server_checkPlayer"",2];" \n "" \n """Loading Player Data... Please wait!"" call Epoch_updateLoadingScreen;" \n "progressLoadingScreen 0.5;" \n @@ -564,7 +559,7 @@ class FSM { name = "ERROR_Wrong_Server"; itemno = 25; - init = /*%FSM*/"_msg = format[""Server and Client running with different Version! (You: %1 // Server: %2)"",getText(configFile >> ""CfgMods"" >> ""Epoch"" >> ""version""),_serverVersion];" \n + init = /*%FSM*/"_msg = format[""Server and Client running with different Version! (You: %1 // Server: %2)"",getText(configFile >> ""CfgMods"" >> ""Epoch"" >> ""version""),Epoch_ServerVersion];" \n "_msg call Epoch_updateLoadingScreen;" \n "diag_log _msg;" \n "" \n @@ -631,7 +626,7 @@ class FSM priority = 0.000000; to="Setup_Player_Var"; precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"_playerObject == player"/*%FSM*/; + condition=/*%FSM*/"_playerObject == player && local _playerObject"/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ @@ -894,13 +889,12 @@ class FSM " player addEventHandler [_x,([""CfgEpochClient"", _x, """"] call EPOCH_fnc_returnConfigEntryV2)];" \n "} forEach ([""CfgEpochClient"", ""addEventHandler"", []] call EPOCH_fnc_returnConfigEntryV2);" \n "" \n - "if (count EPOCH_playerHitPoints isEqualTo count ((getAllHitPointsDamage player) param [0,[]])) then {" \n - " {" \n - " player setHitIndex [_forEachIndex, _x];" \n - " }forEach EPOCH_playerHitPoints;" \n - "};" \n + "// set inital hitpoints" \n + "{" \n + " player setHitIndex [_forEachIndex, _x];" \n + "}forEach _hitpoints;" \n + "" \n "" \n - "true call EPOCH_fnc_Weather;" \n "[5,100] spawn EPOCH_niteLight;" \n "" \n "if (_debug) then {" \n @@ -1055,7 +1049,6 @@ class FSM "" \n "_playerPos = getpos _playerObject;" \n "" \n - "" \n """Loading Player Inventory... Please wait!"" call Epoch_updateLoadingScreen;" \n "progressLoadingScreen 0.6;" \n ""/*%FSM*/; @@ -1069,7 +1062,32 @@ class FSM priority = 0.000000; to="Setup_Player_Obj"; precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"!(isNull _playerObject) && {_playerObject getVariable [""SETUP"",false]} && {_playerPos nearObjectsReady 10} && {call _finalPlayerObjectCheck}"/*%FSM*/; + condition=/*%FSM*/"" \n + "_state = false;" \n + "_playerCheck = !(isNull _playerObject);" \n + "_playerCheckSetup = false;" \n + "_playerCheckObjectsReady = false;" \n + "_playerCheckFinal = false;" \n + "if (_playerCheck) then {" \n + " _playerCheckSetup = _playerObject getVariable [""SETUP"",false];" \n + " if (_playerCheckSetup) then {" \n + " _playerCheckObjectsReady = _playerPos nearObjectsReady 10;" \n + " if (_playerCheckObjectsReady) then {" \n + " _playerCheckFinal = (_mass isEqualTo (loadAbs _playerObject));" \n + " if (_playerCheckFinal) then {" \n + " _state = true;" \n + " };" \n + " };" \n + " };" \n + "};" \n + "if (_debug) then {" \n + " diag_log format[""DEBUG: Checking Player Object: %1"", [""FAILED"",""OK""] select _playerCheck];" \n + " diag_log format[""DEBUG: Checking Player is setup: %1"", [""FAILED"",""OK""] select _playerCheckSetup];" \n + " diag_log format[""DEBUG: Checking world preloaded: %1"", [""FAILED"",""OK""] select _playerCheckObjectsReady];" \n + " diag_log format[""DEBUG: Final Player mass check: %1 (%2 != %3)"", [""FAILED"",""OK""] select _playerCheckFinal, _mass, (loadAbs _playerObject)];" \n + " diag_log format[""DEBUG: Pos check: %1 == %2"", getpos _playerObject, getpos player];" \n + "};" \n + "_state"/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ @@ -1320,7 +1338,7 @@ class FSM init = /*%FSM*/"startLoadingScreen ["""",""EpochLoadingScreen""];" \n """Gender Selected... Please wait!"" call Epoch_updateLoadingScreen;" \n "" \n - "[player,EPOCH_PlayerIsMale] remoteExec [""EPOCH_server_loadPlayer"",2];" \n + "[player,EPOCH_PlayerIsMale,_thisFSM] remoteExec [""EPOCH_server_loadPlayer"",2];" \n "EPOCH_PlayerIsMale = nil;"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links @@ -1373,9 +1391,12 @@ class FSM "_mass = _C_SET deleteAt 0;" \n "" \n "Epoch_my_GroupUID = _C_SET deleteAt 0;" \n + "Epoch_my_tempGroupUID = """";" \n "Epoch_canBeRevived = _C_SET deleteAt 0;" \n "Epoch_personalToken = _C_SET deleteAt 0;" \n "Epoch_my_Group = _C_SET deleteAt 0;" \n + "_communityStats = _C_SET deleteAt 0;" \n + "_hitpoints = _C_SET deleteAt 0;" \n "" \n "_extraPayload = _C_SET deleteAt 0;" \n "" \n @@ -1423,4 +1444,4 @@ class FSM "Reject_without_B", }; }; -/*%FSM*/ +/*%FSM*/ \ No newline at end of file diff --git a/Sources/epoch_code/compile/EPOCH_QuickTakeAll.sqf b/Sources/epoch_code/compile/EPOCH_QuickTakeAll.sqf index c942ca60..9b0e8ae5 100644 --- a/Sources/epoch_code/compile/EPOCH_QuickTakeAll.sqf +++ b/Sources/epoch_code/compile/EPOCH_QuickTakeAll.sqf @@ -17,23 +17,27 @@ private ["_items","_magazines","_weapons"]; //[[[end]]] closeDialog 0; { + if ((_x getvariable ["EPOCH_Loot",false]) || _x iskindof "container_epoch") then { + _nearplayers = (player nearEntities ["Man", 12]) select {alive _x && isplayer _x && !(_x == player)}; + if (count _nearplayers > 0) exitwith { + ["Take all not allowed near other Players",5] call Epoch_message; + }; + _magazines = magazinesAmmoCargo _x; + clearMagazineCargoGlobal _x; + { + [_x select 0,1] call EPOCH_fnc_addItemOverflow; + } foreach _magazines; - _magazines = magazinesAmmoCargo _x; - clearMagazineCargoGlobal _x; - { - [_x select 0,_x select 1] call EPOCH_fnc_addItemOverflow; - } foreach _magazines; + _items = itemCargo _x; + clearItemCargoGlobal _x; + { + _x call EPOCH_fnc_addItemOverflow; + } foreach _items; - _items = itemCargo _x; - clearItemCargoGlobal _x; - { - _x call EPOCH_fnc_addItemOverflow; - } foreach _items; - - _weapons = weaponCargo _x; - clearWeaponCargoGlobal _x; - { - _x call EPOCH_fnc_addItemOverflow; - } foreach _weapons; - -} foreach nearestObjects[player, ["container_epoch"], 5]; + _weapons = weaponCargo _x; + clearWeaponCargoGlobal _x; + { + _x call EPOCH_fnc_addItemOverflow; + } foreach _weapons; + }; +} foreach nearestObjects[player, ["container_epoch","weaponholdersimulated","GroundWeaponHolder"], 5]; diff --git a/Sources/epoch_code/compile/EPOCH_QuickTakeLoad.sqf b/Sources/epoch_code/compile/EPOCH_QuickTakeLoad.sqf index cc1bf3fd..3b7a579d 100644 --- a/Sources/epoch_code/compile/EPOCH_QuickTakeLoad.sqf +++ b/Sources/epoch_code/compile/EPOCH_QuickTakeLoad.sqf @@ -13,15 +13,30 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_QuickTakeLoad.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_index","_magazines"]; +private ["_index"]; //[[[end]]] createDialog "QuickTake"; { - _magazines = magazinesAmmoCargo _x; - { - _index = lbAdd[1500, getText(configfile >> "CfgMagazines" >> (_x select 0) >> "DisplayName")]; - lbSetData[1500, _index, _x select 0]; - lbSetValue[1500, _index, _x select 1]; - lbSetPicture[1500, _index, _x select 0 call EPOCH_itemPicture]; - } foreach _magazines; -} foreach nearestObjects[player, ["container_epoch"], 5]; + if ((_x getvariable ["EPOCH_Loot",false]) || _x iskindof "container_epoch") then { + { + _index = lbAdd[1500, getText(configfile >> "CfgMagazines" >> (_x select 0) >> "DisplayName")]; + lbSetData[1500, _index, _x select 0]; + lbSetValue[1500, _index, _x select 1]; + lbSetPicture[1500, _index, _x select 0 call EPOCH_itemPicture]; + } foreach (magazinesAmmoCargo _x); + + { + _index = lbAdd[1500, getText(configfile >> "CfgWeapons" >> _x >> "DisplayName")]; + lbSetData[1500, _index, _x]; + lbSetValue[1500, _index, _x]; + lbSetPicture[1500, _index, _x call EPOCH_itemPicture]; + } foreach (itemcargo _x); + + { + _index = lbAdd[1500, getText(configfile >> "CfgWeapons" >> _x >> "DisplayName")]; + lbSetData[1500, _index, _x]; + lbSetValue[1500, _index, _x]; + lbSetPicture[1500, _index, _x call EPOCH_itemPicture]; + } foreach (weaponCargo _x); + }; +} foreach (nearestObjects[player, ["container_epoch","weaponholdersimulated","GroundWeaponHolder"], 5]); \ No newline at end of file diff --git a/Sources/epoch_code/compile/EPOCH_SpawnTraderMiltia.sqf b/Sources/epoch_code/compile/EPOCH_SpawnTraderMiltia.sqf index 8fafd4b6..f94faddd 100644 --- a/Sources/epoch_code/compile/EPOCH_SpawnTraderMiltia.sqf +++ b/Sources/epoch_code/compile/EPOCH_SpawnTraderMiltia.sqf @@ -13,10 +13,10 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_SpawnTraderMiltia.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_allpositions","_grp","_nrBuilds","_rndHouse","_startPos","_trgt","_unit"]; +private ["_allpositions","_grp","_nrBuilds","_rndHouse","_startPos","_unit"]; //[[[end]]] -_trgt = player; -_nrBuilds = nearestObjects [getPosATL _trgt,["house"],50]; + +_nrBuilds = nearestObjects [player,["house"],50]; _grp = createGroup [RESISTANCE, true]; for "_i" from 1 to 3 step 1 do diff --git a/Sources/epoch_code/compile/EPOCH_chopWood.sqf b/Sources/epoch_code/compile/EPOCH_chopWood.sqf index 3ad01fd9..9ded8293 100644 --- a/Sources/epoch_code/compile/EPOCH_chopWood.sqf +++ b/Sources/epoch_code/compile/EPOCH_chopWood.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_chopWood.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_config","_currentPos","_getWorldTypes","_object","_objects","_sel_object","_str","_type","_worldTypes"]; +private ["_currentPos","_getWorldTypes","_object","_objects","_sel_object","_type","_worldTypes"]; //[[[end]]] _currentPos = player modelToWorld[0, 5, 0]; @@ -24,13 +24,11 @@ if !(surfaceIsWater _currentPos) then { _objects = lineIntersectsObjs[eyePos player, _currentPos, player, objNull, true, 2]; _object = objNull; _type = 0; -_config = 'CfgEpochClient' call EPOCH_returnConfig; { - _str = str _x; - _sel_object = _x; + _sel_object = _x; _worldTypes = ["tree","bush"]; - _getWorldTypes = [_str, _worldTypes] call EPOCH_worldObjectType; + _getWorldTypes = [_x, _worldTypes] call EPOCH_worldObjectType; { if (_getWorldTypes param [_worldTypes find _x, false]) exitWith { _type = _forEachIndex; diff --git a/Sources/epoch_code/compile/EPOCH_consumeItem.sqf b/Sources/epoch_code/compile/EPOCH_consumeItem.sqf index b9861600..abfe3205 100644 --- a/Sources/epoch_code/compile/EPOCH_consumeItem.sqf +++ b/Sources/epoch_code/compile/EPOCH_consumeItem.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_consumeItem.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_buildClass","_buildingCountLimit","_buildingJammerRange","_canCapacity","_cfgBaseBuilding","_cfgItemInteractions","_color","_currentDMG","_currentFuel","_currentHIT","_fuelCapacity","_highestDMG","_inputCount","_interactAttributes","_interactOption","_interactReturnOnUse","_isOk","_isStorage","_magazineSize","_magazineSizeMax","_magazinesAmmoFull","_newDMG","_newFuel","_object","_otherObjects","_output","_paintCanColor","_paintCanIndex","_partCheck","_pos","_removeItem","_transportFuel","_unifiedInteract","_vehicle","_vehicles"]; +private ["_buildClass","_buildingCountLimit","_buildingJammerRange","_canCapacity","_cfgBaseBuilding","_cfgItemInteractions","_color","_currentDMG","_currentFuel","_currentHIT","_fuelCapacity","_ghostClass","_highestDMG","_inputCount","_interactAttributes","_interactOption","_interactReturnOnUse","_isOk","_isStorage","_magazineSize","_magazineSizeMax","_magazinesAmmoFull","_msg","_newDMG","_newFuel","_object","_otherObjects","_output","_paintCanColor","_paintCanIndex","_partCheck","_pos","_removeItem","_transportFuel","_unifiedInteract","_vehicle","_vehicles"]; //[[[end]]] EPOCH_InteractedItem params ["_text","_item","_pic"]; @@ -42,17 +42,19 @@ if (_inputCount >= 3) then { _removeItem = {([player,_this] call BIS_fnc_invRemove) == 1}; _unifiedInteract = { - if (_item call _removeItem) then { + private _removed = _item call _removeItem; + if (_removed) then { if (_interactReturnOnUse != "") then { _interactReturnOnUse call EPOCH_fnc_addItemOverflow; }; { _output = _x call EPOCH_giveAttributes; if (_output != "") then { - [_output, 5] call Epoch_message; + [_output, 5] call Epoch_message_stack; }; } foreach _interactAttributes; }; + _removed }; switch _interactOption do { @@ -60,30 +62,33 @@ switch _interactOption do { _magazineSizeMax = getNumber (configfile >> "CfgMagazines" >> _item >> "count"); // allow repack for all magazines with greater than 1 bullet if (_magazineSizeMax > 1) then { - - _magazineSize = 0; - _magazinesAmmoFull = magazinesAmmoFull player; - { - if (_item isEqualTo (_x select 0)) then { - if (!(_x select 2)) then { - _magazineSize = _magazineSize + (_x select 1); - }; + [_item,_magazineSizeMax] spawn { + params ["_item","_magazineSizeMax"]; + if (player == vehicle player) then { + closeDialog 0; + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + uisleep 5; }; - } forEach _magazinesAmmoFull; - - // remove all - player removeMagazines _item; - - // Add full magazines back to player - for "_i" from 1 to floor (_magazineSize / _magazineSizeMax) do - { - player addMagazine [_item, _magazineSizeMax]; + _magazineSize = 0; + _magazinesAmmoFull = magazinesAmmoFull player; + { + if (_item isEqualTo (_x select 0)) then { + if (!(_x select 2)) then { + _magazineSize = _magazineSize + (_x select 1); + }; + }; + } forEach _magazinesAmmoFull; + player removeMagazines _item; + for "_i" from 1 to floor (_magazineSize / _magazineSizeMax) do + { + player addMagazine [_item, _magazineSizeMax]; + }; + if ((_magazineSize % _magazineSizeMax) > 0) then { + player addMagazine [_item, floor (_magazineSize % _magazineSizeMax)]; + }; + ["Ammo Repacked", 5] call Epoch_message; }; - // Add last non full magazine - if ((_magazineSize % _magazineSizeMax) > 0) then { - player addMagazine [_item, floor (_magazineSize % _magazineSizeMax)]; - }; - ["Ammo Repacked", 5] call Epoch_message; }; }; case 1: _unifiedInteract; // Eat 1 @@ -131,6 +136,11 @@ switch _interactOption do { }; } else { + // use ghost GhostPreview if set + _ghostClass = getText(_cfgBaseBuilding >> _buildClass >> "GhostPreview"); + if !(_ghostClass isEqualTo "") then { + _buildClass = _ghostClass; + }; _object=createVehicle[_buildClass,_pos,[],0,"CAN_COLLIDE"]; _object setDir ((getDir player) - 180); [format["Press '%1' to drop object.", "1"], 5] call Epoch_message; @@ -149,6 +159,9 @@ switch _interactOption do { }; }; case 4: { // Refuel 4 + if !(player == vehicle player) exitwith { + ["Fill from outside!", 5] call Epoch_message; + }; _vehicles = player nearEntities [["LandVehicle","Ship","Air","Tank"], 30]; if (cursorTarget in _vehicles) then { _vehicle = cursorTarget; @@ -160,15 +173,23 @@ switch _interactOption do { _newFuel = _newFuel / _fuelCapacity; if (_item call _removeItem) then { - _interactReturnOnUse call EPOCH_fnc_addItemOverflow; - // send - [_vehicle,_newFuel,player,Epoch_personalToken] remoteExec ["EPOCH_server_fillVehicle",2]; - - ["Fuel Added", 5] call Epoch_message; + [_interactReturnOnUse,_vehicle,_newFuel] spawn { + params ["_interactReturnOnUse","_vehicle","_newFuel"]; + closeDialog 0; + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + uisleep 5; + _interactReturnOnUse call EPOCH_fnc_addItemOverflow; + [_vehicle,_newFuel,player,Epoch_personalToken] remoteExec ["EPOCH_server_fillVehicle",2]; + ["Fuel Added", 5] call Epoch_message; + }; }; }; }; case 5: { + if !(player == vehicle player) exitwith { + ["Siphon from outside!", 5] call Epoch_message; + }; _vehicles = player nearEntities [["LandVehicle","Ship","Air","Tank"], 30]; _canCapacity = _interactAttributes param [0,10]; if (cursorTarget in _vehicles) then { @@ -177,9 +198,16 @@ switch _interactOption do { _newFuel = (((fuel _vehicle) * _fuelCapacity) - _canCapacity) / _fuelCapacity; if (_newFuel > 0) then { if (_item call _removeItem) then { - _interactReturnOnUse call EPOCH_fnc_addItemOverflow; - [_vehicle,_newFuel,player,Epoch_personalToken] remoteExec ["EPOCH_server_fillVehicle",2]; - ["Fuel Siphoned", 5] call Epoch_message; + [_interactReturnOnUse,_vehicle,_newFuel] spawn { + params ["_interactReturnOnUse","_vehicle","_newFuel"]; + closeDialog 0; + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + uisleep 5; + _interactReturnOnUse call EPOCH_fnc_addItemOverflow; + [_vehicle,_newFuel,player,Epoch_personalToken] remoteExec ["EPOCH_server_fillVehicle",2]; + ["Fuel Siphoned", 5] call Epoch_message; + }; }; } else { ["Not Enough Fuel", 5] call Epoch_message; @@ -194,8 +222,15 @@ switch _interactOption do { if (_transportFuel > _canCapacity) then { if (_item call _removeItem) then { - _interactReturnOnUse call EPOCH_fnc_addItemOverflow; - ["Fuel Siphoned", 5] call Epoch_message; + [_interactReturnOnUse] spawn { + params ["_interactReturnOnUse"]; + closeDialog 0; + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + uisleep 5; + _interactReturnOnUse call EPOCH_fnc_addItemOverflow; + ["Fuel Siphoned", 5] call Epoch_message; + }; }; } else { ["Not Enough Fuel", 5] call Epoch_message; @@ -207,49 +242,66 @@ switch _interactOption do { case 8: _unifiedInteract; //Cold -1 case 9: _unifiedInteract; //Energy 100 case 10: { // Repair 10 - Lite + if !(player == vehicle player) exitwith { + ["Repair from outside!", 5] call Epoch_message; + }; _vehicles = player nearEntities [["LandVehicle","Ship","Air","Tank"], 30]; _vehicle = cursorTarget; if (_vehicle in _vehicles) then { if (_item call _removeItem) then { - - _highestDMG = 0; - _currentHIT = -1; - _currentDMG = 0; - { - _currentDMG = _x; - if (_currentDMG > _highestDMG) then { - _highestDMG = _currentDMG; - _currentHIT = _forEachIndex; - }; - }forEach ((getAllHitPointsDamage _vehicle) param [2,[]]); - - if (_highestDMG > 0) then { - - _newDMG = ((_highestDMG - 0.5) max 0); - - if (local _vehicle) then { - [_vehicle, [_currentHIT, _newDMG]] call EPOCH_client_repairVehicle; + [_vehicle] spawn { + params ["_vehicle"]; + closeDialog 0; + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + _vehicle say3d 'vehicle_repair'; + uisleep 5; + _highestDMG = 0; + _currentHIT = -1; + _currentDMG = 0; + { + _currentDMG = _x; + if (_currentDMG > _highestDMG) then { + _highestDMG = _currentDMG; + _currentHIT = _forEachIndex; + }; + }forEach ((getAllHitPointsDamage _vehicle) param [2,[]]); + if (_highestDMG > 0) then { + _newDMG = ((_highestDMG - 0.5) max 0); + if (local _vehicle) then { + [_vehicle, [[_currentHIT, _newDMG]] ] call EPOCH_client_repairVehicle; + } else { + [_vehicle,[[_currentHIT,_newDMG]],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + }; } else { - [_vehicle,[_currentHIT,_newDMG],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; - }; - - } else { - if ((damage _vehicle) > 0) then { - [_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + if ((damage _vehicle) > 0) then { + [_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + }; }; + ["Vehicle Partially Repaired", 5] call Epoch_message; }; - ["Vehicle Partially Repaired", 5] call Epoch_message; }; }; }; case 11: { // Repair 11 - Heavy + if !(player == vehicle player) exitwith { + ["Repair from outside!", 5] call Epoch_message; + }; _vehicles = player nearEntities [["LandVehicle","Ship","Air","Tank"], 30]; _vehicle = cursorTarget; if (_vehicle in _vehicles) then { if (_item call _removeItem) then { - [_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; - ["Vehicle Fully Repaired", 5] call Epoch_message; + [_vehicle] spawn { + params ["_vehicle"]; + closeDialog 0; + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + uisleep 5; + _vehicle say3d 'vehicle_repair'; + [_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + ["Vehicle Fully Repaired", 5] call Epoch_message; + }; }; }; }; @@ -285,18 +337,25 @@ switch _interactOption do { case 13: { //Heal Player _vehicles = player nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 6]; _vehicle = cursorTarget; - if (_vehicle in _vehicles) then { - if (damage _vehicle != 0 || {_x > 0} count ((getallhitpointsdamage _vehicle) select 2) > 0) then { - if (_item call _removeItem) then { + if !(_vehicle in _vehicles) then { + _vehicle = player; + }; + if (damage _vehicle != 0 || {_x > 0} count ((getallhitpointsdamage _vehicle) select 2) > 0) then { + if (_item call _removeItem) then { + [_vehicle] spawn { + params ["_vehicle"]; + if (player == vehicle player) then { + closeDialog 0; + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + uisleep 5; + }; [_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; - ["Healed other player", 5] call Epoch_message; - }; - }; - } else { - if (damage player != 0 || {_x > 0} count ((getallhitpointsdamage player) select 2) > 0) then { - if (_item call _removeItem) then { - [player,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; - ["Healed yourself", 5] call Epoch_message; + if (_vehicle isEqualTo player) then { + ["Healed yourself", 5] call Epoch_message; + } else { + ["Healed other player", 5] call Epoch_message; + }; }; }; }; @@ -309,6 +368,51 @@ switch _interactOption do { }; }; + case 15: { // Read + _msg = getArray(missionConfigFile >> "CfgReadingDocuments" >> _item >> "displayMessage"); + if!(_msg isEqualTo [])then{ + { + [_x,5] call Epoch_message_stack; + }forEach _msg; + }else{ + ["This document can't be read yet. Blame DirtySanchez!",5] call Epoch_message; + }; + }; + + case 16: { // Morphine + _vehicle = player; + if (damage _vehicle != 0 || {_x > 0} count ((getallhitpointsdamage _vehicle) select 2) > 0) then { + if (call _unifiedInteract) then { + [_vehicle,_item] spawn { + params ["_vehicle","_item"]; + if (player == vehicle player) then { + closeDialog 0; + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + uisleep 5; + }; + private _out = []; + { + if (_x > 0) then { + _out pushback [_foreachindex,((_x - 0.2) min 0.45) max 0]; + }; + }forEach ((getAllHitPointsDamage _vehicle) param [2,0]); + if (_out isequalto []) then { + if ((damage _vehicle) > 0) then { + _out = ["ALL",0]; + }; + }; + if !(_out isequalto []) then { + [_vehicle,_out,player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + }; + [format["Used %1 on yourself",_item call EPOCH_itemDisplayName], 5] call Epoch_message; + }; + }; + } else { + [format["%1 is not needed at this time",_item call EPOCH_itemDisplayName], 5] call Epoch_message; + }; + }; + default { ["Found nothing", 5] call Epoch_message; }; diff --git a/Sources/epoch_code/compile/EPOCH_debugMonitor.sqf b/Sources/epoch_code/compile/EPOCH_debugMonitor.sqf deleted file mode 100644 index 3d2e72cb..00000000 --- a/Sources/epoch_code/compile/EPOCH_debugMonitor.sqf +++ /dev/null @@ -1,72 +0,0 @@ -/* - Author: Aaron Clark - EpochMod.com - - Contributors: - - Description: - Epoch debug monitor - - 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_code/compile/EPOCH_debugMonitor.sqf -*/ -//[[[cog import generate_private_arrays ]]] -private ["_customVars","_hours","_val"]; -//[[[end]]] -_hours = floor(servertime/60/60); - -_customVars = ""; -{ - _val = missionNamespace getVariable [format ["EPOCH_player%1",_x],EPOCH_defaultVars select _forEachIndex]; - if !(_x in ["AliveTime","SpawnArray","HitPoints","MissionArray"]) then { - if (_x == "Temp") then { - _customVars = _customVars + format["%1: %2°F | %3°C
", _x,_val,_val call EPOCH_convertTemp]; - } else { - _customVars = _customVars + format["%1: %2
", _x,_val]; - }; - } -}forEach EPOCH_customVars; - -hintSilent parseText format [" - Welcome to Epoch!
- Current Version: %1
- Build: %2
- - " + _customVars + " -
- - Fatigue: %3
- Damage: %4
- Bleeding: %5
- Bleed Time: %6
- Oxygen: %7
-
- Air Temp: %8
- Water Temp: %9
- Rain: %10
- Overcast: %11
-
- Hours Alive: %12
- FPS: %13
- Server uptime: %14h %15m
- Server FPS: %16
", - getText(configFile >> "CfgMods" >> "Epoch" >> "version"), - getNumber(missionConfigFile >> "CfgEpochBuild" >> "build"), - (getFatigue player), - (damage player), - (isBleeding player), - (getBleedingRemaining player), - (getOxygenRemaining player), - format ["%1°F | %2°C",EPOCH_CURRENT_WEATHER,EPOCH_CURRENT_WEATHER call EPOCH_convertTemp], - format ["%1°F | %2°C",(EPOCH_CURRENT_WEATHER/2),(EPOCH_CURRENT_WEATHER/2) call EPOCH_convertTemp], - rain, - overcast, - - round(EPOCH_playerAliveTime/360)/10, - round diag_fps, - _hours, - round((serverTime/60)-(_hours*60)), - if (EPOCH_diag_fps isEqualType 0) then [{EPOCH_diag_fps},{"MANIPULATED"}] -]; diff --git a/Sources/epoch_code/compile/EPOCH_fish.sqf b/Sources/epoch_code/compile/EPOCH_fish.sqf index 85c64a9d..df3b177e 100644 --- a/Sources/epoch_code/compile/EPOCH_fish.sqf +++ b/Sources/epoch_code/compile/EPOCH_fish.sqf @@ -61,10 +61,10 @@ if (surfaceIsWater _currentPos) then { _fish = selectRandom _fishes; if (_fish != "") then { _fish call EPOCH_fnc_addItemOverflow; - ["Fish Caught", 5] call Epoch_message; + ["Fish Caught", 5,[[0,0,0,0.5],[0,1,0,1]]] call Epoch_message; }; } else { - ["Fish Got Away", 5] call Epoch_message; + ["Fish Got Away", 5,[[0,0,0,0.5],[1,0,0,1]]] call Epoch_message; }; }; }; diff --git a/Sources/epoch_code/compile/EPOCH_lootTrash.sqf b/Sources/epoch_code/compile/EPOCH_lootTrash.sqf index 10161c28..c718b09e 100644 --- a/Sources/epoch_code/compile/EPOCH_lootTrash.sqf +++ b/Sources/epoch_code/compile/EPOCH_lootTrash.sqf @@ -13,19 +13,19 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_lootTrash.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_animal","_animalPos","_animals","_bankTerminal","_blood","_bloodPos","_cfgItemInteractions","_cfgObjectInteractions","_config","_configWorldInteractions","_configWorldName","_destroyTrashObj","_found","_foundLootObject","_foundObjConfig","_foundObjType","_foundTerminal","_foundWorldConfig","_getWorldTypes","_id","_index","_inputWorldTypes","_interactAttributes","_lootAnimalObj","_objects","_output","_randomAIClass","_return","_trashType"]; +private ["_animal","_animalPos","_animals","_bankTerminal","_blood","_bloodPos","_cfgItemInteractions","_cfgObjectInteractions","_config","_destroyTrashObj","_found","_foundLootObject","_foundObjConfig","_foundObjType","_foundTerminal","_getWorldTypes","_id","_index","_inputWorldTypes","_interactAttributes","_lootAnimalObj","_objects","_output","_randomAIClass","_return","_trashClasses","_trashType"]; //[[[end]]] _return = false; if (diag_tickTime - EPOCH_lastTrash > 2) then { EPOCH_lastTrash = diag_tickTime; _config = 'CfgEpochClient' call EPOCH_returnConfig; - _configWorldInteractions = (_config >> "CfgWorldInteractions"); - _configWorldName = (_config >> worldname); - _interactAttributes = []; + + _interactAttributes = []; _cfgObjectInteractions = 'CfgObjectInteractions' call EPOCH_returnConfig; _inputWorldTypes = ["bankTerminal"]; - _inputWorldTypes append getArray(_configWorldName >> "TrashClasses"); + _trashClasses = getArray(_config >> worldname >> "TrashClasses"); + _inputWorldTypes append _trashClasses; _destroyTrashObj = objNull; _lootAnimalObj = objNull; @@ -36,30 +36,22 @@ if (diag_tickTime - EPOCH_lastTrash > 2) then { _found = false; _foundTerminal = false; _foundLootObject = false; - if !(_x isKindOf "All") then { - if (alive _x) then { - _getWorldTypes = [str(_x), _inputWorldTypes] call EPOCH_worldObjectType; - { - _found = _getWorldTypes param [_inputWorldTypes find _x, false]; - if (_found) exitWith{ _trashType = _forEachIndex }; - } forEach getArray(_configWorldName >> "TrashClasses"); - _foundTerminal = _getWorldTypes param [_inputWorldTypes find "bankTerminal", false]; - }; - } else { - _foundObjType = typeOf _x; - _foundObjConfig = (_cfgObjectInteractions >> _foundObjType); - _foundWorldConfig = (_configWorldInteractions >> _foundObjType); - if (alive _x) then { - { - _found = (getNumber(_foundWorldConfig >> _x) == 1); - if (_found) exitWith{ _trashType = _forEachIndex }; - } forEach getArray(_configWorldName >> "TrashClasses"); - _foundTerminal = (getNumber(_foundWorldConfig >> "bankTerminal") == 1); - _foundLootObject = ((getNumber(_foundObjConfig >> "interactMode") == 3) && (getNumber (_foundObjConfig >> "aliveState") == 0)); - } else { - _foundLootObject = (getNumber(_cfgObjectInteractions >> _foundObjType >> "interactMode") == 3); - }; - }; + + _foundObjType = typeOf _x; + _foundObjConfig = (_cfgObjectInteractions >> _foundObjType); + + if (alive _x) then { + _getWorldTypes = [_x, _inputWorldTypes] call EPOCH_worldObjectType; + { + _found = _getWorldTypes param [_inputWorldTypes find _x, false]; + if (_found) exitWith{ _trashType = _forEachIndex }; + } forEach _trashClasses; + _foundTerminal = _getWorldTypes param [_inputWorldTypes find "bankTerminal", false]; + _foundLootObject = ((getNumber(_foundObjConfig >> "interactMode") == 3) && (getNumber (_foundObjConfig >> "aliveState") == 0)); + } else { + _foundLootObject = (getNumber(_foundObjConfig >> "interactMode") == 3); + }; + if (_found) exitWith{ _destroyTrashObj = _x }; if (_foundLootObject) exitWith{ _lootAnimalObj = _x }; if (_foundTerminal) exitWith{ _bankTerminal = _x }; diff --git a/Sources/epoch_code/compile/EPOCH_mineRocks.sqf b/Sources/epoch_code/compile/EPOCH_mineRocks.sqf index 9089b966..0839fe38 100644 --- a/Sources/epoch_code/compile/EPOCH_mineRocks.sqf +++ b/Sources/epoch_code/compile/EPOCH_mineRocks.sqf @@ -13,11 +13,11 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_mineRocks.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_config","_currentPos","_found","_foundIndex","_getWorldTypes","_object","_objects","_str","_worldTypes"]; +private ["_currentPos","_found","_foundIndex","_getWorldTypes","_object","_objects","_worldTypes"]; //[[[end]]] if ((diag_tickTime - EPOCH_lastMineRocks) >= 2) then { EPOCH_lastMineRocks = diag_tickTime; - if (random 1 < 0.16) then { + if (random 1 < 0.33) then { _currentPos = player modelToWorld[0, 5, 0]; if !(surfaceIsWater _currentPos) then { @@ -27,29 +27,22 @@ if ((diag_tickTime - EPOCH_lastMineRocks) >= 2) then { _objects = lineIntersectsWith[eyePos player, _currentPos, player, objNull, true]; _object = objNull; - _config = 'CfgEpochClient' call EPOCH_returnConfig; - _found = false; _foundIndex = -1; { - if !(_x isKindOf "All") then { - _str = str(_x); - _worldTypes = ["rock","cinder","wreck"]; - _getWorldTypes = [_str, _worldTypes] call EPOCH_worldObjectType; - { - if (_getWorldTypes param [_worldTypes find _x, false]) exitWith { - _found = true; - _foundIndex = _forEachIndex - 1; - }; - } forEach _worldTypes; - }; + _worldTypes = ["rock","cinder","wreck","ore"]; + _getWorldTypes = [_x, _worldTypes] call EPOCH_worldObjectType; + { + if (_getWorldTypes param [_worldTypes find _x, false]) exitWith { + _found = true; + _foundIndex = _forEachIndex; + }; + } forEach _worldTypes; if (_found)exitWith{_object = _x}; }foreach _objects; - if (!isNull _object) then { - if (alive _object) then { - [_object, _foundIndex, player, Epoch_personalToken] remoteExec ["EPOCH_server_mineRocks",2]; - }; + if (!isNull _object && {alive _object}) then { + [_object, _foundIndex, player, Epoch_personalToken] remoteExec ["EPOCH_server_mineRocks",2]; }; }; }; diff --git a/Sources/epoch_code/compile/EPOCH_niteLight.sqf b/Sources/epoch_code/compile/EPOCH_niteLight.sqf index 62b2ab07..aa0d3385 100644 --- a/Sources/epoch_code/compile/EPOCH_niteLight.sqf +++ b/Sources/epoch_code/compile/EPOCH_niteLight.sqf @@ -27,7 +27,7 @@ if (_nlEnabled isEqualTo 1) then { EP_light = "#lightpoint" createvehiclelocal _pos; EP_light setposATL _pos; EP_light attachTo [player,[0,8.11,_nlZ]]; //offset infront of player so that the darkness is 'following' them. - EP_light setLightDayLight true; //TODO: Test if this can be turned off (Dawn / Dusk) + EP_light setLightDayLight false; //Sets light so it can only be used at night. EP_light setLightBrightness _nlBright; EP_light setLightAmbient [0.435, 0.439, 0.439];//Using new Colours. EP_light setlightcolor [0.435, 0.439, 0.439]; diff --git a/Sources/epoch_code/compile/EPOCH_onEachFrame.sqf b/Sources/epoch_code/compile/EPOCH_onEachFrame.sqf index 1a7da556..d5ac7189 100644 --- a/Sources/epoch_code/compile/EPOCH_onEachFrame.sqf +++ b/Sources/epoch_code/compile/EPOCH_onEachFrame.sqf @@ -24,9 +24,18 @@ if (EPOCH_velTransform) then { EPOCH_target setvelocitytransformation[_pos1, (EP_velocityTransformation select 0), _vel1, (EP_velocityTransformation select 1), _dir1, (EP_velocityTransformation select 2), _up1, (EP_velocityTransformation select 3), _interval]; } else { _pos2 = player modelToWorld[EPOCH_X_OFFSET, EPOCH_Y_OFFSET, EPOCH_Z_OFFSET]; + if !(EPOCH_maxBuildingHeight == 0) then { + if (_pos2 select 2 > EPOCH_maxBuildingHeight) then { + _pos2 set[2, EPOCH_maxBuildingHeight]; + }; + }; if ((_pos2 select 2) < 0) then { _pos2 set[2, 0] }; if ((_pos1 distance _pos2) > 0) then { - EPOCH_target setvelocitytransformation[_pos1, AGLtoASL _pos2, _vel1, _vel1, _dir1, _dir1, _up1, _up1, _interval]; + _newpos = AGLtoASL _pos2; + if (surfaceiswater _pos2) then { + _newpos = _pos2; + }; + EPOCH_target setvelocitytransformation[_pos1, _newpos, _vel1, _vel1, _dir1, _dir1, _up1, _up1, _interval]; }; }; } else { @@ -50,7 +59,7 @@ if (!isNull EPOCH_currentTarget && vehicle player == player) then { _icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa"; _color = [100,0,_stability,1] call EPOCH_colorRange; }; - case 1: { + case 1: { // _text = if (EPOCH_buildMode > 0) then[{_text}, { format ["Hold (%1)",EPOCH_keysBuildMode1 call BIS_fnc_keyCode] }]; _stability = if (EPOCH_buildMode > 0) then[{_currentTarget getVariable["stability", 100]}, {100 - round(damage _currentTarget * 100)}]; _icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa"; diff --git a/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf b/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf index 65880930..c27c19ff 100644 --- a/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf +++ b/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_aiskill","_arrSkills","_arrUnits","_arrVals","_bomb","_config","_currentLimit","_disableAI","_driver","_grp","_index","_jammerRange","_jammers","_loop","_minAISkill","_nonJammer","_nonTrader","_nonTraderAIRange","_pos","_restricted","_sapperHndl","_sapperNum","_spawnLimit","_targetPos","_unit","_units"]; +private ["_aiskill","_arrSkills","_arrUnits","_arrVals","_bomb","_config","_currentLimit","_disableAI","_driver","_grp","_index","_jammerRange","_jammers","_loop","_minAISkill","_missionConfig","_nonJammer","_nonTrader","_nonTraderAIRange","_playerSpawnArray","_playerSpawnArrayKeyFinal","_pos","_restricted","_sapperHndl","_sapperNum","_spawnLimit","_targetPos","_unit","_units"]; //[[[end]]] params ["_unitClass",["_trgt",player],["_doVariable",false],["_unitCount",1],["_extraData",[]] ]; @@ -22,7 +22,10 @@ _bomb = objNull; _index = EPOCH_spawnIndex find _unitClass; _spawnLimit = 0; if (_index != -1) then { - _spawnLimit = EPOCH_playerSpawnArray select _index; + _playerSpawnArrayKeyFinal = "EPOCH_playerSpawnArray"; + if !(isNil "_playerSpawnArrayKey") then {_playerSpawnArrayKeyFinal = _playerSpawnArrayKey}; + _playerSpawnArray = missionNamespace getVariable [_playerSpawnArrayKeyFinal,[]]; + _spawnLimit = _playerSpawnArray select _index; }; _currentLimit = count(_trgt nearEntities[_unitClass, 800]); if (!_doVariable && (_currentLimit >= _spawnLimit)) exitWith { @@ -57,6 +60,7 @@ switch _unitClass do { _units pushBack _unit; _unit call _disableAI; [_unit,_trgt] execFSM "\x\addons\a3_epoch_code\System\cloak.fsm"; + _unit addEventHandler ["Killed", {[_this, "AntagonistKills", 1, true] call Epoch_unit_onKilledEH;}]; }; }; case "GreatWhite_F": { @@ -67,6 +71,7 @@ switch _unitClass do { _units pushBack _unit; _unit call _disableAI; [_unit] execFSM "\x\addons\a3_epoch_code\System\Shark_Brain.fsm"; + _unit addEventHandler ["Killed", {[_this, "AntagonistKills", 1, true] call Epoch_unit_onKilledEH;}]; }; }; }; @@ -90,6 +95,7 @@ switch _unitClass do { _unit setVariable ["sapperHndl",_sapperHndl]; _unit addEventHandler ["FiredNear", format ["%1 setFSMVariable [""_sFiredNear"",[_this select 1, _this select 2]];",_sapperHndl]]; _unit addEventHandler ["Hit", format ["%1 setFSMVariable [""_sHit"",[_this select 1, _this select 2]];",_sapperHndl]]; + _unit addEventHandler ["Killed", {[_this, "AntagonistKills", 1, true] call Epoch_unit_onKilledEH;}]; }; }; }; @@ -99,11 +105,15 @@ switch _unitClass do { _units pushBack _unit; _bomb = createVehicle ["SmokeShellToxicSapper", _targetPos, [], 0, "CAN_COLLIDE"]; _bomb attachTo [_unit, [0,0,0],"Pelvis"]; + [_bomb, player, Epoch_personalToken,_unit,false] remoteExec ["EPOCH_server_handle_sapperObjs",2]; + _bomb = createVehicle ["Sapper_Charge_Ammo", _targetPos, [], 0, "CAN_COLLIDE"]; + _bomb attachTo [_unit, [0,0,0],"Pelvis"]; _unit call _disableAI; _sapperHndl = [_unit, _bomb, _trgt] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain2.fsm"; _unit setVariable ["sapperHndl",_sapperHndl]; _unit addEventHandler ["FiredNear", format ["%1 setFSMVariable [""_sFiredNear"",[_this select 1, _this select 2]];",_sapperHndl]]; _unit addEventHandler ["Hit", format ["%1 setFSMVariable [""_sHit"",[_this select 1, _this select 2]];",_sapperHndl]]; + _unit addEventHandler ["Killed", {[_this, "AntagonistKills", 1, true] call Epoch_unit_onKilledEH;}]; }; }; case "Epoch_SapperB_F": { @@ -117,6 +127,7 @@ switch _unitClass do { _unit setVariable ["sapperHndl",_sapperHndl]; _unit addEventHandler ["FiredNear", format ["%1 setFSMVariable [""_sFiredNear"",[_this select 1, _this select 2]];",_sapperHndl]]; _unit addEventHandler ["Hit", format ["%1 setFSMVariable [""_sHit"",[_this select 1, _this select 2]];",_sapperHndl]]; + _unit addEventHandler ["Killed", {[_this, "AntagonistKills", 1, true] call Epoch_unit_onKilledEH;}]; }; }; case "I_UAV_01_F": { @@ -132,6 +143,7 @@ switch _unitClass do { _driver = _grp createUnit["I_UAV_AI", position _unit, [], 0, "CAN_COLLIDE"]; _driver moveInAny _unit; [_unit, _trgt] execFSM "\x\addons\a3_epoch_code\System\Copter_brain.fsm"; + _unit addEventHandler ["Killed", {[_this, "AIKills", 1, true] call Epoch_unit_onKilledEH;}]; }; }; case "PHANTOM": { @@ -156,20 +168,21 @@ switch _unitClass do { _grp = createGroup [RESISTANCE, true]; _grp setBehaviour "COMBAT"; _grp setCombatMode "RED"; - _minAISkill = getNumber (getMissionConfig "CfgEpochSoldier" >> "minAISkill"); - _arrUnits = getArray (getMissionConfig "CfgEpochSoldier" >> "unitTypes"); + _missionConfig = getMissionConfig "CfgEpochSoldier"; + _minAISkill = getNumber (_missionConfig >> "minAISkill"); + _arrUnits = getArray (_missionConfig >> "unitTypes"); _arrSkills = ["aimingAccuracy","aimingShake","aimingSpeed","endurance","spotDistance","spotTime","courage","reloadSpeed","commanding","general"]; _arrVals = [ - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxAimingAccuracy"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxAimingShake"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxAimingSpeed"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxEndurance"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxSpotDistance"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxSpotTime"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxCourage"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxReloadSpeed"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxCommanding"), - getNumber (getMissionConfig "CfgEpochSoldier" >> "maxGeneral") + getNumber (_missionConfig >> "maxAimingAccuracy"), + getNumber (_missionConfig >> "maxAimingShake"), + getNumber (_missionConfig >> "maxAimingSpeed"), + getNumber (_missionConfig >> "maxEndurance"), + getNumber (_missionConfig >> "maxSpotDistance"), + getNumber (_missionConfig >> "maxSpotTime"), + getNumber (_missionConfig >> "maxCourage"), + getNumber (_missionConfig >> "maxReloadSpeed"), + getNumber (_missionConfig >> "maxCommanding"), + getNumber (_missionConfig >> "maxGeneral") ]; for "_i" from 0 to (_unitCount - 1) do { _unit = _grp createUnit[selectRandom _arrUnits, _pos, [], 0, "FORM"]; @@ -180,6 +193,7 @@ switch _unitClass do { _unit enableAI "MOVE"; _unit enableAI "ANIM"; _unit disableAI "FSM"; + _unit addEventHandler ["Killed", {[_this, "AIKills", 1, true] call Epoch_unit_onKilledEH;}]; // randomize skill for "_i" from 0 to ((count _arrSkills)-1) do { _aiskill = floor random (_arrVals select _i); diff --git a/Sources/epoch_code/compile/EPOCH_unitSpawnDecrease.sqf b/Sources/epoch_code/compile/EPOCH_unitSpawnDecrease.sqf index 1badd25b..a05426c0 100644 --- a/Sources/epoch_code/compile/EPOCH_unitSpawnDecrease.sqf +++ b/Sources/epoch_code/compile/EPOCH_unitSpawnDecrease.sqf @@ -13,10 +13,13 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_unitSpawnDecrease.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_index"]; +private ["_index","_playerSpawnArray","_playerSpawnArrayKeyFinal"]; //[[[end]]] params ["_spawnName", ["_decrease",1]]; _index = EPOCH_spawnIndex find _spawnName; if (_index != -1) then{ - EPOCH_playerSpawnArray set[_index, ((EPOCH_playerSpawnArray select _index) - _decrease) max 0]; + _playerSpawnArrayKeyFinal = "EPOCH_playerSpawnArray"; + if !(isNil "_playerSpawnArrayKey") then {_playerSpawnArrayKeyFinal = _playerSpawnArrayKey}; + _playerSpawnArray = missionNamespace getVariable [_playerSpawnArrayKeyFinal,[]]; + _playerSpawnArray set[_index, ((_playerSpawnArray select _index) - _decrease) max 0]; }; diff --git a/Sources/epoch_code/compile/EPOCH_unitSpawnIncrease.sqf b/Sources/epoch_code/compile/EPOCH_unitSpawnIncrease.sqf index 980c294c..0a10858b 100644 --- a/Sources/epoch_code/compile/EPOCH_unitSpawnIncrease.sqf +++ b/Sources/epoch_code/compile/EPOCH_unitSpawnIncrease.sqf @@ -13,10 +13,13 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_unitSpawnIncrease.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_index"]; +private ["_index","_playerSpawnArray","_playerSpawnArrayKeyFinal"]; //[[[end]]] params ["_spawnName", ["_increase",1]]; _index = EPOCH_spawnIndex find _spawnName; if (_index != -1) then{ - EPOCH_playerSpawnArray set[_index, ((EPOCH_playerSpawnArray select _index) + _increase) min (EPOCH_spawnLimits select _index)]; + _playerSpawnArrayKeyFinal = "EPOCH_playerSpawnArray"; + if !(isNil "_playerSpawnArrayKey") then {_playerSpawnArrayKeyFinal = _playerSpawnArrayKey}; + _playerSpawnArray = missionNamespace getVariable [_playerSpawnArrayKeyFinal,[]]; + _playerSpawnArray set[_index, ((_playerSpawnArray select _index) + _increase) min (EPOCH_spawnLimits select _index)]; }; diff --git a/Sources/epoch_code/compile/EPOCH_unit_onKilledEH.sqf b/Sources/epoch_code/compile/EPOCH_unit_onKilledEH.sqf new file mode 100644 index 00000000..5a7df725 --- /dev/null +++ b/Sources/epoch_code/compile/EPOCH_unit_onKilledEH.sqf @@ -0,0 +1,25 @@ +/* + Author: DirtySanchez - EpochMod.com + + Contributors: + + Description: + Antagonist killed event handler + + 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_code/compile/EPOCH_unit_onKilledEH.sqf +*/ +params [ ["_killedEH",[]], ["_statType","AIKills"], ["_adjust", 0], ["_toClient", false] ]; +if(_killedEH isEqualTo [])exitWith{diag_log "EPOCHDebug: unit_onKilledEH -1- EH sent empty array";}; +if(_statType isEqualTo "")exitWith{diag_log "EPOCHDebug: unit_onKilledEH -2- stat Type is empty string";}; +if(_adjust isEqualTo 0)exitWith{diag_log "EPOCHDebug: unit_onKilledEH -3- stat adjustment is 0";}; + +_unit = _killedEH select 0; +_killer = _killedEH select 1; +if(_unit isEqualTo _killer)exitWith{ + //diag_log "EPOCHDebug: unit_onKilledEH -4- unit is killer"; +}; +[player, _killer, _statType, _adjust, _toClient, Epoch_personalToken] remoteExec ["EPOCH_fnc_updatePlayerStats",2]; \ No newline at end of file diff --git a/Sources/epoch_code/compile/EPOCH_zombieSpawn.sqf b/Sources/epoch_code/compile/EPOCH_zombieSpawn.sqf index 39321280..2dbac50d 100644 --- a/Sources/epoch_code/compile/EPOCH_zombieSpawn.sqf +++ b/Sources/epoch_code/compile/EPOCH_zombieSpawn.sqf @@ -47,5 +47,8 @@ removegoggles _unit; _zedHandle = [_unit,true] execFSM "epoch_code\system\EPOCH_zombie_brain.fsm"; _unit addEventHandler ["FiredNear", "(_this select 0) setVariable [""zFiredNear"",[_this select 1, _this select 2]];"]; _unit addEventHandler ["Hit", "(_this select 0) setVariable [""zHit"",[_this select 1, _this select 2]];"]; +_unit addEventHandler ["Killed", { + [player, _this select 1, "ZombieKills", 1, true, Epoch_personalToken] remoteExec ["EPOCH_fnc_updatePlayerStats",2]; +}]; _unit diff --git a/Sources/epoch_code/compile/both/EPOCH_compiler.sqf b/Sources/epoch_code/compile/both/EPOCH_compiler.sqf index 857273bd..3b10939c 100644 --- a/Sources/epoch_code/compile/both/EPOCH_compiler.sqf +++ b/Sources/epoch_code/compile/both/EPOCH_compiler.sqf @@ -24,7 +24,7 @@ BOOL */ //[[[cog import generate_private_arrays ]]] -private ["_config","_config_name","_file","_file_raw","_file_tag","_fnc_path","_missionConfig","_tag","_var_name","_version"]; +private ["_code","_config","_config_name","_customVarNames","_customVarsInit","_file","_file_raw","_file_tag","_fnc_path","_header","_missionConfig","_randomValues","_rng","_tag","_var_name","_version"]; //[[[end]]] params [["_configName","",[""] ] ]; @@ -33,6 +33,22 @@ _missionConfig = (getMissionConfig _configName); if (isClass _missionConfig) then{ _config = _missionConfig; }; + +// custom header for interscript communications +_customVarsInit = getArray(getMissionConfig "CfgEpochClient" >> "customVarsDefaults"); +_customVarNames = _customVarsInit apply {_x param [0,""]}; +_randomValues = []; +_header = ""; +{ + while {true} do { + _rng = round(diag_tickTime + random 99999); + if !(_rng in _randomValues) exitWith { + _randomValues pushBack _rng; + _header = _header + format["_player%1Key = 'EPOCH_%2';",_x, _rng]; + }; + }; +} forEach _customVarNames; + _version = getNumber(_config >> "version"); if (_version >= 1) then { { @@ -63,7 +79,14 @@ if (_version >= 1) then { if (_file_raw != "") then { _fnc_path = _file_raw; }; - missionNamespace setvariable [_var_name,compileFinal preprocessFileLineNumbers _fnc_path]; + _code = ""; + if (getNumber(_x >> "customHeader") == 1) then { + _code = _header + (preprocessFileLineNumbers _fnc_path); + } else { + _code = (preprocessFileLineNumbers _fnc_path); + }; + + missionNamespace setvariable [_var_name,compileFinal _code]; if (getNumber(_x >> "preInit") == 1) then { call (missionNamespace getvariable _var_name); }; diff --git a/Sources/epoch_code/compile/both/EPOCH_weightedArray.sqf b/Sources/epoch_code/compile/both/EPOCH_weightedArray.sqf new file mode 100644 index 00000000..8c921e5f --- /dev/null +++ b/Sources/epoch_code/compile/both/EPOCH_weightedArray.sqf @@ -0,0 +1,101 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Generates loot tables from configs + + 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_code/compile/both/EPOCH_weightedArray.sqf + + Usage: + _lootTable = ["CfgMainTable", _type, "tables"] call EPOCH_fnc_weightedArray; + _loot = selectRandomWeighted _lootTable; +*/ +//[[[cog import generate_private_arrays ]]] +private ["_allow","_itemType","_lootTableArray","_lootTableName","_return","_totalChances","_value","_weightedArray"]; +//[[[end]]] +params ["_configName","_keyName","_arrayName"]; + +_debug = ["CfgEpochClient", "debug", false] call EPOCH_fnc_returnConfigEntryV2; +_lootTableName = format["EPOCH_LT_%1_%2_%3",_configName,_keyName,_arrayName]; +_return = missionNamespace getVariable[_lootTableName,[]]; + +// check for compiled loot table +if(_return isEqualTo[]) then { + // Since no cached version is found, make one. + _lootTableArray = []; + _weightedArray = []; + { + if(_x isEqualType []) then { + _x params ["_tname","_tqty",["_extraLogicRaw", [] ]]; + _tname params ["_item",["_itemType","NA"]]; + _allow = true; + if !(_extraLogicRaw isEqualTo[]) then { + _extraLogicRaw params [["_extraLogicType",""],["_extraLogicName",""],["_extraLogicCond",""],["_extraLogicData",""]]; + // check extra logic + _value = switch _extraLogicType do { + case "getDate": { + date select _extraLogicName + }; + case "getSunorMoon": { + sunOrMoon + }; + case "getMissionNamespaceVariable": { + missionNamespace getVariable [_extraLogicName, _extraLogicData] + }; + // not really needed + default { + _extraLogicName + }; + }; + _allow = [_value,_extraLogicCond,_extraLogicData] call EPOCH_fnc_arrayToLogic; + }; + // Check if config item actually exists + if (_allow) then { + switch _itemType do { + case "magazine": { + _allow = isClass (configFile >> "CfgMagazines" >> _item); + }; + case "backpack": { + _allow = isClass (configFile >> "CfgVehicles" >> _item); + }; + case "item"; + case "weapon": { + _allow = isClass (configFile >> "CfgWeapons" >> _item); + }; + }; + }; + // add to loot table + if (_allow) then { + _lootTableArray pushBack _tname; + _weightedArray pushBack _tqty; + }; + } else { + _lootTableArray pushBack _x; + _weightedArray pushBack 1; + }; + }forEach getArray((_configName call EPOCH_returnConfig) >> _keyName >> _arrayName); + + // compile to selectRandomWeighted format. + private _totalChances = 0; + {_totalChances = _totalChances + _x} count _weightedArray; + _return = []; + { + _return append [_lootTableArray select _forEachIndex,linearConversion [0,_totalChances,_x,0,1]]; + } forEach _weightedArray; + + // cache loot final loot table + missionNamespace setVariable[_lootTableName,_return]; + + // debug + if (_debug) then { + diag_log format["DEBUG: LootTable: %1 DATA: %2",_lootTableName,_return]; + }; +}; + +_return diff --git a/Sources/epoch_code/compile/building/EPOCH_countdown.sqf b/Sources/epoch_code/compile/building/EPOCH_countdown.sqf index 7c2d925d..f0dbd74f 100644 --- a/Sources/epoch_code/compile/building/EPOCH_countdown.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_countdown.sqf @@ -72,9 +72,8 @@ if (!isNull _this) then { _class = getText(_cfgBaseBuilding >> _objClass >> "staticClass"); if (_class != "") then { _newObj = createVehicle[_class, (_worldspace select 0), [], 0, "CAN_COLLIDE"]; - _newObj setVectorDirAndUp[_worldspace select 1, _worldspace select 2]; _newObj setposATL(_worldspace select 0); - + _newObj setVectorDirAndUp[_worldspace select 1, _worldspace select 2]; }; } else { if (_saveCheck) then { diff --git a/Sources/epoch_code/compile/building/EPOCH_isBuildAllowed.sqf b/Sources/epoch_code/compile/building/EPOCH_isBuildAllowed.sqf index f828094d..a1df58cb 100644 --- a/Sources/epoch_code/compile/building/EPOCH_isBuildAllowed.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_isBuildAllowed.sqf @@ -110,7 +110,7 @@ if !(_jammer isEqualTo []) then { _buildingCountLimit = _buildingCountLeader + (_buildingCountPerMember * _membercount); }; if (_useSplitCountLimits) then { - if(_objType in ["WorkBench_EPOCH","StorageShelf_EPOCH","Tipi_EPOCH","LockBox_EPOCH","Safe_EPOCH","StorageShelf_SIM_EPOCH","LockBox_SIM_EPOCH","Safe_SIM_EPOCH","Workbench_SIM_EPOCH","Tipi_SIM_EPOCH"]) then { + if(_objType in ["WorkBench_EPOCH","StorageShelf_EPOCH","Tipi_EPOCH","TentA_EPOCH","TentDome_EPOCH","LockBox_EPOCH","Safe_EPOCH","StorageShelf_SIM_EPOCH","LockBox_SIM_EPOCH","Safe_SIM_EPOCH","Workbench_SIM_EPOCH","Tipi_SIM_EPOCH"]) then { if ((count (nearestObjects[_nearestJammer,["Buildable_Storage","Constructions_lockedstatic_F","LockBox_SIM_EPOCH","Safe_SIM_EPOCH","StorageShelf_SIM_EPOCH","WorkBench_SIM_EPOCH"],_buildingJammerRange]-[_obj])) >= _storageCountLimit) exitwith { _buildingAllowed = false; [format["Building Disallowed: Max. %1 Storage Objects",_storageCountLimit],5] call Epoch_message diff --git a/Sources/epoch_code/compile/building/EPOCH_simulSwap.sqf b/Sources/epoch_code/compile/building/EPOCH_simulSwap.sqf index 3dc7b58a..31210ff1 100644 --- a/Sources/epoch_code/compile/building/EPOCH_simulSwap.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_simulSwap.sqf @@ -22,7 +22,7 @@ NOTHING */ //[[[cog import generate_private_arrays ]]] -private ["_allowedSnapObjects","_allowedSnapPoints","_cfgBaseBuilding","_class","_create","_currentTarget","_dir2","_direction","_disallowed","_distance","_distanceMod","_distanceNear","_energyCost","_isSnap","_lastCheckTime","_nearestObject","_nearestObjectRaw","_newObj","_objSlot","_objType","_object","_oemType","_offset","_onContactEH","_pOffset","_playerdistance","_pos2","_prevSnapDistance","_previousDistanceNear","_rejectMove","_removeParts","_return","_simulClassConfig","_snapArrayPara","_snapArrayPerp","_snapDistance","_snapObjects","_snapPointsPara","_snapPointsPerp","_snapPos","_snapPosition","_snapType","_textureSlot","_up2","_vel2","_velocityTransformation","_worldspace"]; +private ["_allowedSnapObjects","_allowedSnapPoints","_cfgBaseBuilding","_class","_create","_currentTarget","_dir2","_direction","_disallowed","_distance","_distanceMod","_distanceNear","_energyCost","_isSnap","_lastCheckTime","_maxHeight","_nearestObject","_nearestObjectRaw","_newObj","_objSlot","_objType","_object","_oemType","_offset","_onContactEH","_pOffset","_playerEnergy","_playerEnergyKeyFinal","_playerdistance","_pos2","_prevSnapDistance","_previousDistanceNear","_rejectMove","_return","_simulClassConfig","_snapArrayPara","_snapArrayPerp","_snapConfig","_snapDistance","_snapObjects","_snapPointsPara","_snapPointsPerp","_snapPos","_snapPosition","_snapType","_textureSlot","_up2","_vel2","_velocityTransformation","_worldspace"]; //[[[end]]] if !(isNil "EPOCH_simulSwap_Lock") exitWith{}; @@ -34,7 +34,11 @@ _objType = typeOf _object; _isSnap = false; -if (EPOCH_playerEnergy <= 0) exitWith { +_playerEnergyKeyFinal = "EPOCH_playerEnergy"; +if !(isNil "_playerEnergyKey") then {_playerEnergyKeyFinal = _playerEnergyKey}; +_playerEnergy = missionNamespace getVariable [_playerEnergyKeyFinal,[]]; + +if (_playerEnergy <= 0) exitWith { ["Need Energy", 5] call Epoch_message; }; if !(_object call EPOCH_isBuildAllowed) exitWith{}; @@ -56,9 +60,16 @@ if (isText(_simulClassConfig)) then { _allowedSnapObjects = ["Constructions_static_F"]; _snapObjects = _cfgBaseBuilding >> _class >> "allowedSnapObjects"; _energyCost = getNumber(_cfgBaseBuilding >> _class >> "energyCost"); + _maxHeight = getNumber(_cfgBaseBuilding >> _class >> "maxHeight"); if (_energyCost == 0) then { _energyCost = 0.1; }; + if (_maxHeight == 0) then { + _maxHeight = 500; + }; + if !(EPOCH_maxBuildingHeight == 0) then { + _maxHeight = _maxHeight min EPOCH_maxBuildingHeight; + }; if (isArray(_snapObjects)) then { _allowedSnapObjects = getArray(_snapObjects); }; @@ -73,8 +84,9 @@ if (isText(_simulClassConfig)) then { if (_objSlot != -1) then { _newObj setVariable ["BUILD_SLOT",_objSlot,true]; }; - _newObj setVectorDirAndUp [_worldspace select 1,_worldspace select 2]; + _newObj setposATL (_worldspace select 0); + _newObj setVectorDirAndUp [_worldspace select 1,_worldspace select 2]; if (_textureSlot != 0) then { [_newObj, _textureSlot, player, Epoch_personalToken] remoteExec ["EPOCH_server_paintBUILD",2]; @@ -90,12 +102,16 @@ if (isText(_simulClassConfig)) then { EP_snap = objNull; _previousDistanceNear = 0; _offset = player worldToModel (getposATL _currentTarget); + if (surfaceiswater (getpos _currentTarget)) then { + _offset = player worldToModel (getposASL _currentTarget); + }; EPOCH_X_OFFSET = _offset select 0; EPOCH_Y_OFFSET = _offset select 1; EPOCH_Z_OFFSET = _offset select 2; _lastCheckTime = diag_tickTime; while {EPOCH_target == _currentTarget} do { - if (EPOCH_playerEnergy <= 0) exitWith { EPOCH_target = objNull; }; + _playerEnergy = missionNamespace getVariable [_playerEnergyKeyFinal,[]]; + if (_playerEnergy <= 0) exitWith { EPOCH_target = objNull; }; _rejectMove = false; if ((diag_tickTime - _lastCheckTime) > 10) then { _lastCheckTime = diag_tickTime; @@ -115,6 +131,9 @@ if (isText(_simulClassConfig)) then { }; _pos2 = player modelToWorld[EPOCH_X_OFFSET, EPOCH_Y_OFFSET, EPOCH_Z_OFFSET]; + if (_pos2 select 2 > _maxHeight) then { + _pos2 set[2, _maxHeight]; + }; _distance = _pos2 distance EPOCH_target; if (EPOCH_buildMode == 1) then { if (isNull _nearestObject) then { @@ -128,12 +147,13 @@ if (isText(_simulClassConfig)) then { } forEach _allowedSnapObjects; }; if (!isNull _nearestObject) then { - _snapPointsPara = getArray(_cfgBaseBuilding >> (typeOf _nearestObject) >> "snapPointsPara"); - _snapPointsPerp = getArray(_cfgBaseBuilding >> (typeOf _nearestObject) >> "snapPointsPerp"); + _snapConfig = _cfgBaseBuilding >> (typeOf _nearestObject); + _snapPointsPara = getArray(_snapConfig >> "snapPointsPara"); + _snapPointsPerp = getArray(_snapConfig >> "snapPointsPerp"); _snapArrayPara = []; { if (_x in _allowedSnapPoints) then { - _pOffset = _nearestObject selectionPosition _x; + _pOffset = getArray (_snapConfig >> _x); _snapPos = _nearestObject modelToWorld _pOffset; if ((_pos2 distance _snapPos) < 3) then { _snapArrayPara pushBackUnique _snapPos; @@ -143,7 +163,7 @@ if (isText(_simulClassConfig)) then { _snapArrayPerp = []; { if (_x in _allowedSnapPoints) then { - _pOffset = _nearestObject selectionPosition _x; + _pOffset = getArray (_snapConfig >> _x); _snapPos = _nearestObject modelToWorld _pOffset; if ((_pos2 distance _snapPos) < 3) then { _snapArrayPerp pushBackUnique _snapPos; @@ -212,12 +232,12 @@ if (isText(_simulClassConfig)) then { }; }; }; - EPOCH_playerEnergy = (EPOCH_playerEnergy - _energyCost) max 0; + [_playerEnergyKeyFinal, -_energyCost, 2500 , 0] call EPOCH_fnc_setVariableLimited; uiSleep 0.1; }; _currentTarget removeEventHandler["EpeContactStart", _onContactEH]; EPOCH_velTransform = false; - _disallowed = ["Tarp_SIM_EPOCH", "Freezer_SIM_EPOCH", "Fridge_SIM_EPOCH", "Shelf_SIM_EPOCH", "Pelican_SIM_EPOCH", "Wardrobe_SIM_EPOCH", "Bed_SIM_EPOCH", "Couch_SIM_EPOCH", "Cooker_SIM_EPOCH", "Chair_SIM_EPOCH", "Filing_SIM_EPOCH", "Table_SIM_EPOCH", "Locker_SIM_EPOCH", "ToolRack_SIM_EPOCH", "Shoebox_SIM_EPOCH", "Bunk_SIM_EPOCH", "Jack_SIM_EPOCH"]; + _disallowed = ["Tarp_SIM_EPOCH", "Freezer_SIM_EPOCH", "Fridge_SIM_EPOCH", "Shelf_SIM_EPOCH", "Pelican_SIM_EPOCH", "Wardrobe_SIM_EPOCH", "Bed_SIM_EPOCH", "Couch_SIM_EPOCH", "Cooker_SIM_EPOCH", "Chair_SIM_EPOCH", "Filing_SIM_EPOCH", "Table_SIM_EPOCH", "Locker_SIM_EPOCH", "ToolRack_SIM_EPOCH", "Shoebox_SIM_EPOCH", "Bunk_SIM_EPOCH", "Jack_SIM_EPOCH", "toilet_SIM_EPOCH", "KitchenSink_SIM_EPOCH"]; if !(_class in _disallowed) then { _currentTarget spawn EPOCH_countdown; }; diff --git a/Sources/epoch_code/compile/building/EPOCH_staticMove.sqf b/Sources/epoch_code/compile/building/EPOCH_staticMove.sqf index df40071e..70e5a7cb 100644 --- a/Sources/epoch_code/compile/building/EPOCH_staticMove.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_staticMove.sqf @@ -23,7 +23,7 @@ NOTHING */ //[[[cog import generate_private_arrays ]]] -private ["_EPOCH_1","_EPOCH_2","_allowedSnapObjects","_allowedSnapPoints","_arr_snapPoints","_baselineSnapPos","_cfgBaseBuilding","_class","_currentOffSet","_currentPos","_currentTarget","_dir2","_direction","_distance","_energyCost","_ins","_isSnap","_lastCheckTime","_maxHeight","_maxSnapDistance","_nearestObject","_nearestObjects","_numberOfContacts","_objSlot","_objType","_offSet","_offsetZPos","_pOffset","_pos1","_pos1_snap","_pos2","_pos2ATL","_pos2_snap","_pos_snapObj","_rejectMove","_simulClass","_snapChecks","_snapConfig","_snapDistance","_snapPointsPara","_snapPointsPerp","_snapPos","_snapPos1","_snapPosition","_snapType","_stabilityCheck","_up2","_worldspace"]; +private ["_AnchorPos","_EPOCH_1","_EPOCH_2","_MoveObject","_Snapdirection","_allowedSnapObjects","_allowedSnapPoints","_arr_snapPoints","_baselineSnapPos","_cfgBaseBuilding","_class","_currentOffSet","_currentPos","_currentTarget","_currentTargetAttachedTo","_dir2","_direction","_distance","_energyCost","_helper","_ins","_isSnap","_lastCheckTime","_maxHeight","_maxSnapDistance","_nearestObject","_nearestObjects","_newDir","_newDirAndUp","_numberOfContacts","_objSlot","_objType","_offSet","_offsetZPos","_pOffset","_playerEnergy","_playerEnergyKeyFinal","_pos1_snap","_pos2","_pos2ATL","_pos2_snap","_pos_snapObj","_rejectMove","_simulClass","_snapChecks","_snapConfig","_snapDistance","_snapMemoryPoint","_snapPointsPara","_snapPointsPerp","_snapPos","_snapPos1","_snapPosition","_snapType","_snapped","_stabilityCheck","_staticClass","_tempClass","_tiltFB","_tiltLR","_vectorDir","_vectorUp","_worldspace"]; //[[[end]]] if !(isNil "EPOCH_simulSwap_Lock") exitWith{}; @@ -37,49 +37,61 @@ if (isNull _object) exitWith{ EPOCH_target = objNull; }; // exit if item is not given if (_item == "") exitWith{ EPOCH_target = objNull; }; -if (EPOCH_playerEnergy <= 0) exitWith{ +_playerEnergyKeyFinal = "EPOCH_playerEnergy"; +if !(isNil "_playerEnergyKey") then {_playerEnergyKeyFinal = _playerEnergyKey}; +_playerEnergy = missionNamespace getVariable [_playerEnergyKeyFinal,[]]; + +if (_playerEnergy <= 0) exitWith{ ["Need Energy", 5] call Epoch_message; }; // Remove object if not allowed if !(_object call EPOCH_isBuildAllowed) exitWith{ deleteVehicle _object }; + EPOCH_simulSwap_Lock = true; - _objType = typeOf _object; - _cfgBaseBuilding = 'CfgBaseBuilding' call EPOCH_returnConfig; - -_energyCost = getNumber(_cfgBaseBuilding >> _objType >> "energyCost"); -if (_energyCost == 0) then { - _energyCost = 0.1; -}; - _class = getText(_cfgBaseBuilding >> _objType >> "GhostPreview"); -_maxHeight = getNumber(_cfgBaseBuilding >> _objType >> "maxHeight"); -_simulClass = getText(_cfgBaseBuilding >> _objType >> "simulClass"); -_snapChecks = getArray(("CfgSnapChecks" call EPOCH_returnConfig) >> _objType >> "nails"); - -_maxSnapDistance = 1; -_lastCheckTime = diag_tickTime; -_stabilityCheck = false; - -// force sim check if object has sim class and default max height to 9m if not already specified -if (_simulClass != "") then { - _stabilityCheck = true; - if (_maxHeight == 0) then { - _maxHeight = 500; - }; -}; if (_class != "") then { + _energyCost = getNumber(_cfgBaseBuilding >> _objType >> "energyCost"); + _maxHeight = getNumber(_cfgBaseBuilding >> _objType >> "maxHeight"); + _simulClass = getText(_cfgBaseBuilding >> _objType >> "simulClass"); + _staticClass = getText(_cfgBaseBuilding >> _objType >> "staticClass"); + _snapChecks = getArray(("CfgSnapChecks" call EPOCH_returnConfig) >> _staticClass >> "nails"); + _allowedSnapPoints = getArray(_cfgBaseBuilding >> _class >> "allowedSnapPoints"); + _allowedSnapObjects = getArray(_cfgBaseBuilding >> _class >> "allowedSnapObjects"); + + if (_energyCost == 0) then {_energyCost = 0.1;}; + + _maxSnapDistance = 1; + _lastCheckTime = diag_tickTime; + _stabilityCheck = false; + + // force sim check if object has sim class and default max height to 9m if not already specified + if (_simulClass != "") then { + _stabilityCheck = true; + if (_maxHeight == 0) then { + _maxHeight = 500; + }; + }; + + if !(EPOCH_maxBuildingHeight == 0) then { + _maxHeight = _maxHeight min EPOCH_maxBuildingHeight; + }; _objSlot = _object getVariable["BUILD_SLOT", -1]; - deleteVehicle _object; - _pos2 = player modelToWorldVisual[EPOCH_X_OFFSET, EPOCH_Y_OFFSET, EPOCH_Z_OFFSET]; - EPOCH_target = createVehicle[_class, _pos2, [], 0, "CAN_COLLIDE"]; + // object already ghost + if (_objType isEqualTo _class) then { + EPOCH_target = _object; + } else { + deleteVehicle _object; + EPOCH_target = createVehicle[_class, _pos2, [], 0, "CAN_COLLIDE"]; + }; + // send to server [EPOCH_target] remoteExec ["EPOCH_localCleanup",2]; @@ -100,225 +112,279 @@ if (_class != "") then { _currentTarget setVariable["BUILD_SLOT", _objSlot, true]; }; - _allowedSnapPoints = getArray(_cfgBaseBuilding >> _class >> "allowedSnapPoints"); - _allowedSnapObjects = getArray(_cfgBaseBuilding >> _class >> "allowedSnapObjects"); - - _currentOffSet = []; + EPOCH_X_OFFSET = 0; + EPOCH_Y_OFFSET = 5; + EPOCH_Z_OFFSET = 0; + EPOCH_buildDirection = 0; + EPOCH_buildDirectionPitch = 0; + EPOCH_buildDirectionRoll = 0; + EPOCH_target_attachedTo = player; EP_snap = objNull; + EPOCH_tempTarget = objNull; EP_snapPos = [0, 0, 0]; _isSnap = false; - + _currentOffSet = []; _EPOCH_1 = diag_tickTime; _EPOCH_2 = diag_tickTime; _nearestObjects = []; + _Snapdirection = EPOCH_snapDirection; + _snapped = false; + _currentTargetAttachedTo = player; + _AnchorPos = []; + _helper = objnull; - while {EPOCH_target == _currentTarget} do { + if (typeof EPOCH_target in ["CinderWallHalf_Ghost_EPOCH","WoodLargeWall_Ghost_EPOCH"]) then { + _helper = "Sign_Arrow_Direction_Yellow_F" createVehicleLocal (getpos EPOCH_target); + _helper attachto [EPOCH_target, [0, -0.5, 1]]; + _helper setdir 180; + }; - _rejectMove = false; - if ((diag_tickTime - _lastCheckTime) > 10) then { - _lastCheckTime = diag_tickTime; - _rejectMove = !(_object call EPOCH_isBuildAllowed); - }; - if (_rejectMove) exitWith{ - deleteVehicle EPOCH_target; - }; - - _offSet = [EPOCH_X_OFFSET, EPOCH_Y_OFFSET, EPOCH_Z_OFFSET]; - _pos2 = player modelToWorldVisual _offSet; - - if (surfaceIsWater _pos2) then { - _pos2 set[2, ((getPosASL player) select 2) + EPOCH_Z_OFFSET]; - }; - - if !(_currentOffSet isEqualTo _offSet) then { + _MoveObject = { + if (!(_currentOffSet isEqualTo _offSet) || EPOCH_doRotate || !isnull EP_snap && _currentTargetAttachedTo isequalto EPOCH_target_attachedTo) then { _currentOffSet = _offSet; - { - detach _x; - } forEach attachedObjects player; - - if (_pos2 select 2 > _maxHeight) then { - _pos2 set[2, _maxHeight]; - }; + EPOCH_doRotate = false; + EPOCH_arr_snapPoints = []; + EP_snap = objnull; _pos2ATL = _pos2; if (surfaceIsWater _pos2ATL) then { _pos2ATL = ASLtoATL _pos2ATL; }; - EPOCH_target setposATL _pos2ATL; - EPOCH_target attachTo[player]; - }; - - if (EPOCH_doRotate) then { - _dir2 = [vectorDir player, EPOCH_buildDirection] call BIS_fnc_returnVector; - _up2 = (vectorUp player); - EPOCH_doRotate = false; - EPOCH_target setVectorDirAndUp [_dir2,_up2]; - }; - - { - _nearestObject = _x; - if !(isNull EP_snap) then { - if ((_pos2 distance EP_snapPos) < _maxSnapDistance) then { - _nearestObject = EP_snap; - }; + if (_currentTargetAttachedTo isequalto player) then { + EPOCH_target attachTo [player]; + } + else { + { + detach _x; + } forEach attachedObjects player; }; + _newDirAndUp = [[sin EPOCH_buildDirection * cos EPOCH_buildDirectionPitch, cos EPOCH_buildDirection * cos EPOCH_buildDirectionPitch, sin EPOCH_buildDirectionPitch],[[ sin EPOCH_buildDirectionRoll,-sin EPOCH_buildDirectionPitch,cos EPOCH_buildDirectionRoll * cos EPOCH_buildDirectionPitch],-EPOCH_buildDirection] call BIS_fnc_rotateVector2D]; + EPOCH_target setVectorDirAndUp _newDirAndUp; + }; + }; - if (!isNull _nearestObject && _nearestObject isEqualTo _x) then { - - _isSnap = false; - _snapPosition = [0, 0, 0]; - _snapConfig = _cfgBaseBuilding >> (typeOf _nearestObject); - _snapPointsPara = getArray(_snapConfig >> "snapPointsPara"); - _snapPointsPerp = getArray(_snapConfig >> "snapPointsPerp"); - - // base line for z height offset - _baselineSnapPos = _nearestObject modelToWorldVisual [0,0,0]; - - if (EPOCH_buildMode == 1) then { - { - _x params ["_snapPoints","_type"]; - { - if (_x in _allowedSnapPoints) then { - _pOffset = _nearestObject selectionPosition _x; - _snapPos = _nearestObject modelToWorldVisual _pOffset; - if (surfaceIsWater _snapPos) then { - _snapPos set[2, ((getPosASL _nearestObject) select 2) + (_pOffset select 2)]; - }; - _snapDistance = _pos2 distance _snapPos; - if (_snapDistance < _maxSnapDistance) exitWith{ - _isSnap = true; - _snapPosition = _snapPos; - _snapType = _type; - }; - }; - } forEach _snapPoints; - } forEach [[_snapPointsPara,"para"],[_snapPointsPerp,"perp"]]; - }; - - _distance = _pos2 distance _currentTarget; - - if (_isSnap && _distance < 5) then { - - EP_snap = _nearestObject; - EP_snapPos = _snapPosition; - - _direction = getDir _nearestObject; - if (_snapType == "perp") then { - _snapPos1 = [_snapPosition select 0, _snapPosition select 1, 0]; - _pos_snapObj = getposATL _nearestObject; - _pos_snapObj set[2, 0]; - _direction = _direction - (_snapPos1 getDir _pos_snapObj); - } else { - _direction = 0; - }; - if (EPOCH_snapDirection > 0) then { - if (EPOCH_snapDirection == 1) then { - _direction = _direction + 90; - }; - if (EPOCH_snapDirection == 2) then { - _direction = _direction + 180; - }; - if (EPOCH_snapDirection == 3) then { - _direction = _direction + 270; - }; - }; - if (_direction > 360) then { - _direction = _direction - 360; - }; - if (_direction < 0) then { - _direction = 360 + _direction; - }; - - if !(attachedObjects player isEqualTo[]) then { - { - detach _x; - } forEach attachedObjects player; - if (EPOCH_snapDirection > 0) then { - if (EPOCH_snapDirection == 1) then { - _direction = _direction + 90; - }; - if (EPOCH_snapDirection == 2) then { - _direction = _direction + 180; - }; - if (EPOCH_snapDirection == 3) then { - _direction = _direction + 270; - }; - }; - if (_direction > 360) then { - _direction = _direction - 360; - }; - if (_direction < 0) then { - _direction = 360 + _direction; - }; - - _dir2 = [vectorDir _nearestObject, _direction] call BIS_fnc_returnVector; - - if (_pos2 select 2 > _maxHeight) then { - _pos2 set[2, _maxHeight]; - }; - if (surfaceIsWater _snapPosition) then { - _snapPosition = ASLtoATL _snapPosition; - }; - - _currentTarget setVectorDirAndUp[_dir2, (vectorUp _nearestObject)]; - _currentTarget setposATL _snapPosition; - - - if ((diag_tickTime - _EPOCH_2) > 2) then { - _EPOCH_2 = diag_tickTime; - _arr_snapPoints = []; - EPOCH_arr_snapPoints = []; - { - _pos1_snap = _currentTarget modelToWorldVisual (_x select 0); - _pos2_snap = _currentTarget modelToWorldVisual (_x select 1); - _ins = lineIntersectsSurfaces [AGLToASL _pos1_snap, AGLToASL _pos2_snap,player,_currentTarget,true,1,"VIEW","FIRE"]; - if (count _ins > 0) then { - if (surfaceIsWater _snapPosition) then { - _arr_snapPoints pushBackUnique (_ins select 0 select 0); - } else { - _arr_snapPoints pushBackUnique ASLToATL(_ins select 0 select 0); - }; - }; - if (count _arr_snapPoints >= 2) exitWith { EPOCH_arr_snapPoints = _arr_snapPoints; } - } forEach _snapChecks; - }; - - }; - - } else { - - EPOCH_arr_snapPoints = []; - if !(attachedObjects player isEqualTo[]) then { - _offSet = [EPOCH_X_OFFSET, EPOCH_Y_OFFSET, EPOCH_Z_OFFSET]; - _pos1 = player modelToWorldVisual _offSet; - if (surfaceIsWater _pos1) then { - _pos1 set[2, ((getPosASL player) select 2) + EPOCH_Z_OFFSET]; - _pos1 = ASLtoATL _pos1; - }; - EPOCH_target setposATL _pos1; - EPOCH_target attachTo[player]; - }; - }; - }; - - } forEach _nearestObjects; - + while {EPOCH_target == _currentTarget} do { + _rejectMove = false; + if ((diag_tickTime - _lastCheckTime) > 10) then { + _lastCheckTime = diag_tickTime; + _rejectMove = !(EPOCH_target call EPOCH_isBuildAllowed); + }; + if (_rejectMove) exitWith{ + deleteVehicle EPOCH_target; + _currentTarget = objnull; + }; + if (player distance _currentTarget > 15) exitWith{ + deleteVehicle EPOCH_target; + _currentTarget = objnull; + ["Building Abort: Distance to high", 5] call Epoch_message; + }; if ((diag_tickTime - _EPOCH_1) > 1) then { _EPOCH_1 = diag_tickTime; if !(isNull EPOCH_target) then { _nearestObjects = nearestObjects[EPOCH_target, _allowedSnapObjects, 12]; - EPOCH_playerEnergy = (EPOCH_playerEnergy - _energyCost) max 0; + [_playerEnergyKeyFinal, -_energyCost, 2500 , 0] call EPOCH_fnc_setVariableLimited; }; }; + if !(_currentTargetAttachedTo isequalto EPOCH_target_attachedTo) then { + _currentTargetAttachedTo = EPOCH_target_attachedTo; + EPOCH_X_OFFSET = 0; + EPOCH_Z_OFFSET = 0; + EPOCH_doRotate = true; + if !(_currentTargetAttachedTo isequalto player) then { + EPOCH_buildDirection = getdir EPOCH_target; + EPOCH_Y_OFFSET = 0; + _AnchorPos = getposasl EPOCH_target; + } + else { + EPOCH_buildDirection = 0; + EPOCH_Y_OFFSET = 5; + }; + }; + _offSet = [EPOCH_X_OFFSET, EPOCH_Y_OFFSET, EPOCH_Z_OFFSET]; + if (_currentTargetAttachedTo isequalto player) then { + _pos2 = _currentTargetAttachedTo modelToWorldVisual _offSet; + if (surfaceIsWater _pos2) then { + _pos2 set[2, ((getPosASL _currentTargetAttachedTo) select 2) + EPOCH_Z_OFFSET]; + }; + } + else { + _pos2 = [(_AnchorPos select 0) + EPOCH_X_OFFSET,(_AnchorPos select 1) + EPOCH_Y_OFFSET,(_AnchorPos select 2) + EPOCH_Z_OFFSET]; + if !(surfaceIsWater _pos2) then { + _pos2 = asltoatl _pos2; + }; + }; + if (_pos2 select 2 > _maxHeight) then { + _pos2 set[2, _maxHeight]; + EPOCH_doRotate = true; + }; + if (_currentTargetAttachedTo isequalto player) then { + if (!(_nearestobjects isequalto []) && EPOCH_buildMode == 1) then { + if ((_pos2 distance EP_snapPos) > _maxSnapDistance || EPOCH_snapDirection != _Snapdirection) then { + _Snapdirection = EPOCH_snapDirection; + EP_snapPos = [0,0,0]; + _snapped = false; + _dirlock = false; + { + _nearestObject = _x; + _isSnap = false; + // Vector + Snapping + _snapMemoryPoint = ""; + if( ((typeOf _nearestObject) isEqualTo _staticClass) || ((_nearestObject isKindOf "Const_floors_static_F") && (_staticClass isKindOf "Const_floors_static_F")) || ((_nearestObject isKindOf "Const_Cinder_static_F") && (_staticClass isKindOf "Const_Cinder_static_F")) || ((_nearestObject isKindOf "Const_WoodWalls_static_F") && (_staticClass isKindOf "Const_WoodWalls_static_F")) )then{ + _dirLock = true; + }; + + _snapPosition = [0, 0, 0]; + if (!isNull _nearestObject) then { + _snapConfig = _cfgBaseBuilding >> (typeOf _nearestObject); + _snapPointsPara = getArray(_snapConfig >> "snapPointsPara"); + _snapPointsPerp = getArray(_snapConfig >> "snapPointsPerp"); + + // base line for z height offset + _baselineSnapPos = _nearestObject modelToWorldVisual [0,0,0]; + { + _x params ["_snapPoints","_type"]; + { + if (_x in _allowedSnapPoints) then { + _pOffset = getArray (_snapConfig >> _x); + _snapPos = _nearestObject modelToWorldVisual _pOffset; + if (surfaceIsWater _snapPos) then { + _snapPos set[2, ((getPosASL _nearestObject) select 2) + (_pOffset select 2)]; + }; + _snapDistance = _pos2 distance _snapPos; + if (_snapDistance < _maxSnapDistance) exitWith{ + _isSnap = true; + _snapPosition = _snapPos; + _snapType = _type; + + // Vector + Snapping + _snapMemoryPoint = _x; + }; + }; + } forEach _snapPoints; + } forEach [[_snapPointsPara,"para"],[_snapPointsPerp,"perp"]]; + _distance = _pos2 distance _currentTarget; + if (_isSnap && _distance < 5) exitwith { + EP_snap = _nearestObject; + EP_snapPos = _snapPosition; + _direction = getDir _nearestObject; + if (_snapType == "perp") then { + _snapPos1 = [_snapPosition select 0, _snapPosition select 1, 0]; + _pos_snapObj = getposATL _nearestObject; + _pos_snapObj set[2, 0]; + _direction = _direction - (_snapPos1 getDir _pos_snapObj); + } + else { + _direction = 0; + }; +/* + if(_dirLock)then{ + ["Snap Direction LOCKED to 0 and 180", 5] call Epoch_message; + if(EPOCH_snapDirection isEqualTo 3)then{EPOCH_snapDirection = 0;}; + if(EPOCH_snapDirection isEqualTo 1)then{EPOCH_snapDirection = 2;}; + }; +*/ + if (EPOCH_snapDirection > 0) then { + _direction = _direction + (EPOCH_snapDirection * 90); + }; + if (_direction > 360) then { + _direction = _direction - ((floor (_direction/360))*360); + }; + if (_direction < 0) then { + _direction = _direction + ((floor (-_direction/360))*360); + }; + { + detach _x; + } forEach attachedObjects player; + + // Vector + Snapping + _vectorDir = vectorDir _nearestObject; + _vectorUp = vectorup _nearestObject; + + _dir2 = [_vectorDir, _direction] call BIS_fnc_returnVector; + if (_pos2 select 2 > _maxHeight) then { + _pos2 set[2, _maxHeight]; + }; + if (surfaceIsWater _snapPosition) then { + _snapPosition = ASLtoATL _snapPosition; + }; + _currentTarget setVectorDirAndUp[_dir2, (vectorUp _nearestObject)]; + _currentTarget setposATL _snapPosition; + + // Vector + Snapping + if(!(_vectorUp select 0 == 0) || !(_vectorUp select 1 == 0) || !(_vectorUp select 2 == 1)) then{ + _tempClass = getText(_cfgBaseBuilding >> (typeOf _nearestObject) >> "GhostPreview"); + if!(_tempClass isEqualTo "")then{ + EPOCH_tempTarget = _tempClass createVehicleLocal [0,0,0]; + EPOCH_tempTarget setPosATL (getPosATL _nearestObject); + EPOCH_tempTarget setVectorDirAndUp [_vectorDir, _vectorUp]; + EPOCH_tempTarget setDir ((getDir _nearestObject) + (EPOCH_snapDirection * 90)); + + // hideObject EPOCH_tempTarget; + + if(_snapType in ["para","perp"])then{ + EPOCH_tempTarget setVectorUp _vectorUp; + }; + _newDir = vectorDir EPOCH_tempTarget; + _vectorDir = _newDir; + + deleteVehicle EPOCH_tempTarget; + EPOCH_tempTarget = objNull; + + _currentTarget setposATL _snapPosition; + _currentTarget setDir ((getDir _currentTarget) + (EPOCH_snapDirection * 90)); + _currentTarget setVectorDirAndUp [_vectorDir,_vectorUP]; + }; + }; + + if(_dirLock)then{ + _currentTarget setVectorDirAndUp [_dir2,_vectorUP]; + _currentTarget setposATL _snapPosition; + }; + + _snapped = true; + _arr_snapPoints = []; + EPOCH_arr_snapPoints = []; + { + _pos1_snap = _currentTarget modelToWorldVisual (_x select 0); + _pos2_snap = _currentTarget modelToWorldVisual (_x select 1); + _ins = lineIntersectsSurfaces [AGLToASL _pos1_snap, AGLToASL _pos2_snap,player,_currentTarget,true,1,"VIEW","FIRE"]; + if (count _ins > 0) then { + if (surfaceIsWater _snapPosition) then { + _arr_snapPoints pushBackUnique (_ins select 0 select 0); + } else { + _arr_snapPoints pushBackUnique ASLToATL(_ins select 0 select 0); + }; + }; + if (count _arr_snapPoints >= 2) exitWith { EPOCH_arr_snapPoints = _arr_snapPoints; } + } forEach _snapChecks; + }; + }; + if (_snapped) exitwith {}; + } forEach _nearestObjects; + }; + if (!_snapped) then { + [] call _MoveObject; + }; + } + else { + [] call _MoveObject; + }; + } + else { + [] call _MoveObject; + }; }; EPOCH_arr_snapPoints = []; { detach _x; - } forEach attachedObjects player; + } forEach attachedObjects _currentTargetAttachedTo; + if (!isnull _helper) then { + deletevehicle _helper; + }; if !(isNull _currentTarget) then { @@ -357,8 +423,8 @@ if (_class != "") then { deleteVehicle _currentTarget; _currentTarget = createVehicle[_simulClass, (_worldspace select 0), [], 0, "CAN_COLLIDE"]; - _currentTarget setVectorDirAndUp[_worldspace select 1, _worldspace select 2]; _currentTarget setposATL(_worldspace select 0); + _currentTarget setVectorDirAndUp[_worldspace select 1, _worldspace select 2]; }; }; diff --git a/Sources/epoch_code/compile/building/EPOCH_upgradeBUILD.sqf b/Sources/epoch_code/compile/building/EPOCH_upgradeBUILD.sqf index 3a6e24c8..571df140 100644 --- a/Sources/epoch_code/compile/building/EPOCH_upgradeBUILD.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_upgradeBUILD.sqf @@ -116,7 +116,7 @@ if (_object isKindOf "Constructions_static_F") then { _canUpgradePartCount = _canUpgradePartCount + _req; } forEach _upgradeParts; - _doors = ["WoodLargeWallDoorL_EPOCH","WoodWall4_EPOCH"]; + _doors = ["WoodLargeWallDoorL_EPOCH","WoodWall4_EPOCH","CinderWallDoorwHatch_EPOCH"]; _gates = ["CinderWallGarage_EPOCH"]; if (_canUpgrade) then { _upgradeto = _upgrade select 0; diff --git a/Sources/epoch_code/compile/environment/EPOCH_client_bitePlayer.sqf b/Sources/epoch_code/compile/environment/EPOCH_client_bitePlayer.sqf index d979a939..d1561b9d 100644 --- a/Sources/epoch_code/compile/environment/EPOCH_client_bitePlayer.sqf +++ b/Sources/epoch_code/compile/environment/EPOCH_client_bitePlayer.sqf @@ -22,14 +22,44 @@ NOTHING */ //[[[cog import generate_private_arrays ]]] -private ["_animConfigArray","_animationEffect","_animationEffectGlobal","_bleedAmount","_bleedChance","_bloodpAmount","_bloodpChance","_canSee","_cfgObjectInteraction","_distance","_fatigueChance","_handle","_handles","_ppEffect","_say3dsoundsConfig","_selectedMove","_selectedSound","_soundConfigArray","_soundEffect","_soundEffectGlobal","_switchMovehandlerConfig","_toxicChance"]; +private ["_animConfigArray","_animationEffect","_animationEffectGlobal","_bleedAmount","_bleedChance","_bloodpAmount","_bloodpChance","_canSee","_cfgObjectInteraction","_distance","_doAttack","_fatigueChance","_playerBloodPKeyFinal","_playerImmunityKeyFinal","_playerToxicityKeyFinal","_ppEffect","_say3dsoundsConfig","_selectedMove","_selectedSound","_soundConfigArray","_soundEffect","_soundEffectGlobal","_switchMovehandlerConfig","_target","_toxicAmount","_toxicChance"]; //[[[end]]] params [["_unit",objNull],["_target",player]]; if (isNull _unit && isNull _target) exitWith {}; -if !(_target isEqualTo player) then { - // re to other player - [_unit,_target] remoteExec ["EPOCH_client_bitePlayer", _target]; +_doAttack = false; + +// check if target is on foot +if (isNull objectParent _target) then { + if (_target isEqualTo player) then { + // handle attack for local player + _doAttack = true; + } else { + // send attack to other player + if (isPlayer _target) then { + [_unit] remoteExec ["EPOCH_client_bitePlayer", _target]; + }; + }; } else { + // target is inside a vehicle, target entire vehicle crew + private _targets = []; + { + if (_x isEqualTo player) then { + // handle attack for local player if inside vehicle + _target = _x; + _doAttack = true; + } else { + // send attack to other players + if (isPlayer _x) then { + _targets pushBack _x; + }; + }; + } forEach (crew _target); + if !(_targets isEqualTo []) then { + [_unit] remoteExec ["EPOCH_client_bitePlayer", _targets]; + }; +}; + +if (_doAttack) then { if !(isNull _unit && alive _unit) then { @@ -43,6 +73,7 @@ if !(_target isEqualTo player) then { _fatigueChance = getNumber (_cfgObjectInteraction >> "fatigueChance"); _bleedAmount = getNumber (_cfgObjectInteraction >> "bleedAmount"); _bloodpAmount = getNumber (_cfgObjectInteraction >> "bloodpAmount"); + _toxicAmount = getNumber (_cfgObjectInteraction >> "toxicAmount"); _soundConfigArray = getArray (_cfgObjectInteraction >> "soundEffect"); _soundEffect = ""; @@ -86,13 +117,19 @@ if !(_target isEqualTo player) then { }; if (random 1 < _toxicChance) then { - EPOCH_playerToxicity = (EPOCH_playerToxicity + (random(100 - EPOCH_playerImmunity))) min 100; + _playerToxicityKeyFinal = "EPOCH_playerToxicity"; + _playerImmunityKeyFinal = "EPOCH_playerImmunity"; + if !(isNil "_playerToxicityKey") then {_playerToxicityKeyFinal = _playerToxicityKey}; + if !(isNil "_playerImmunityKey") then {_playerImmunityKeyFinal = _playerImmunityKey}; + [_playerToxicityKeyFinal,random(_toxicAmount - (missionNamespace getVariable [_playerImmunityKeyFinal, 0])),100,0] call EPOCH_fnc_setVariableLimited; }; if (random 1 < _bleedChance) then { player setBleedingRemaining((getBleedingRemaining player) + _bleedAmount); }; if (random 1 < _bloodpChance) then { - EPOCH_playerBloodP = (EPOCH_playerBloodP + (_bloodpAmount + (EPOCH_playerBloodP - 100))) min 190; + _playerBloodPKeyFinal = "EPOCH_playerBloodP"; + if !(isNil "_playerBloodPKey") then {_playerBloodPKeyFinal = _playerBloodPKey}; + [_playerBloodPKeyFinal,_bloodpAmount,190,0] call EPOCH_fnc_setVariableLimited; if !(_ppEffect isEqualTo []) then { [_ppEffect] spawn EPOCH_fnc_spawnEffects; }; diff --git a/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryClosed.sqf b/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryClosed.sqf index 3ef616af..6d4818b2 100644 --- a/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryClosed.sqf +++ b/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryClosed.sqf @@ -1,19 +1,19 @@ -/* - Author: Aaron Clark - EpochMod.com - - Contributors: [Ignatz] He-Man - - Description: - A3 Epoch InventoryClosed Eventhandler - - 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_code/compile/event_handlers/EPOCH_InventoryClosed.sqf -*/ -params ["_unit","_container"]; -if !(EPOCH_arr_interactedObjs isEqualTo[]) then { - [EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; - EPOCH_arr_interactedObjs = []; +/* + Author: Aaron Clark - EpochMod.com + + Contributors: [Ignatz] He-Man + + Description: + A3 Epoch InventoryClosed Eventhandler + + 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_code/compile/event_handlers/EPOCH_InventoryClosed.sqf +*/ +params ["_unit","_container"]; +if !(EPOCH_arr_interactedObjs isEqualTo[]) then { + [EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; + EPOCH_arr_interactedObjs = []; }; \ No newline at end of file diff --git a/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryOpened.sqf b/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryOpened.sqf index d0b1eb04..be56ec0b 100644 --- a/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryOpened.sqf +++ b/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryOpened.sqf @@ -1,41 +1,68 @@ -/* - Author: Aaron Clark - EpochMod.com - - Contributors: [Ignatz] He-Man - - Description: - A3 Epoch InventoryOpened Eventhandler - - 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_code/compile/event_handlers/EPOCH_InventoryOpened.sqf -*/ -//[[[cog import generate_private_arrays ]]] -private ["_blocked","_containerlocked","_seclocked"]; -//[[[end]]] -params ["_unit","_container","_sec"]; -setMousePosition[0.5, 0.5]; -call EPOCH_showStats; -_this spawn EPOCH_initUI; -_containerlocked = (locked _container in [2, 3] || _container getVariable['EPOCH_Locked', false]); -_seclocked = false; -if !(isNull _sec) then { - _seclocked = (locked _sec in [2, 3] || _sec getVariable['EPOCH_Locked', false]); -}; -_blocked = (_containerlocked && _seclocked); -if (!_blocked && _containerlocked || _seclocked) then { - [] spawn { - - disableSerialization; - waitUntil {!isNull findDisplay 602}; - private _d = findDisplay 602; - private _cargo = _d displayCtrl 6401; - private _ground = _d displayCtrl 6321; - _cargo ctrlEnable false; - ctrlSetFocus _ground; - ctrlActivate _ground; - }; -}; -_blocked +/* + Author: Aaron Clark - EpochMod.com + + Contributors: [Ignatz] He-Man + + Description: + A3 Epoch InventoryOpened Eventhandler + + 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_code/compile/event_handlers/EPOCH_InventoryOpened.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_stored","_savecontainer","_blocked","_containerlocked","_seclocked"]; +//[[[end]]] +params ["_unit","_container","_sec"]; +setMousePosition[0.5, 0.5]; +call EPOCH_showStats; +_this spawn EPOCH_initUI; +_containerlocked = (locked _container in [2, 3] || _container getVariable['EPOCH_Locked', false]); +_seclocked = false; +if !(isNull _sec) then { + _seclocked = (locked _sec in [2, 3] || _sec getVariable['EPOCH_Locked', false]); +}; +_blocked = (_containerlocked && _seclocked); +if (!_blocked && _containerlocked || _seclocked) then { + [] spawn { + + disableSerialization; + waitUntil {!isNull findDisplay 602}; + private _d = findDisplay 602; + private _cargo = _d displayCtrl 6401; + private _ground = _d displayCtrl 6321; + _cargo ctrlEnable false; + ctrlSetFocus _ground; + ctrlActivate _ground; + }; +}; + +_savecontainer = objnull; +_vehSlot1 = _container getVariable["VEHICLE_SLOT", "ABORT"]; +_storageSlot1 = _container getVariable["STORAGE_SLOT", "ABORT"]; +_vehSlot2 = _sec getVariable["VEHICLE_SLOT", "ABORT"]; +_storageSlot2 = _sec getVariable["STORAGE_SLOT", "ABORT"]; +if (_vehSlot1 != "ABORT" || _storageSlot1 != "ABORT") then{ + _savecontainer = _container; +} +else { + if (_vehSlot2 != "ABORT" || _storageSlot2 != "ABORT") then{ + _savecontainer = _sec; + }; +}; +if (!isnull _savecontainer && !_blocked) then { + _savecontainer spawn { + waituntil {!isnull (findDisplay 602)}; + while {!isnull (findDisplay 602)} do { + _stored = [itemcargo _this, magazinecargo _this, backpackcargo _this]; + waituntil {uisleep 0.5; !(_stored isequalto [itemcargo _this, magazinecargo _this, backpackcargo _this]) || isnull (findDisplay 602)}; + if !(_stored isequalto [itemcargo _this, magazinecargo _this, backpackcargo _this]) then { + _this call EPOCH_interact; + }; + }; + }; +}; + +_blocked diff --git a/Sources/epoch_code/compile/functions/EPOCH_client_updatePlayerStat.sqf b/Sources/epoch_code/compile/functions/EPOCH_client_updatePlayerStat.sqf new file mode 100644 index 00000000..2c96b4a4 --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_client_updatePlayerStat.sqf @@ -0,0 +1,45 @@ +/* + + Author: DirtySanchez - EpochMod.com + + Contributors: + + Description: + Update player community stat + Can function as inbound stat adjustment from server side change + Can also function as client side adjustment and send to server for saving + + 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_code/compile/functions/EPOCH_client_updatePlayerStat.sqf + + usage: + // This will add +15 to the "ZedKills" index and will also update the server variable + ["ZedKills",15,true] call EPOCH_client_updatePlayerStat; + + _statType - STRING: the name of the variable as set in the EpochClientConfig defineCommunityStats[] = {}; + + _adjust - NUMBER: set the positive or negative adjustment, a value of 0 will exit the script + + _toServer - BOOLEAN: (OPTIONAL): false by default + +*/ +params [ ["_statType",""], ["_adjust",0], ["_toServer",false] ]; + +if(_statType isEqualTo "")exitWith{ + diag_log "EPOCHDebug: updatePlayerStats -2- stat type not defined"; +}; +if(_adjust isEqualTo 0)exitWith{ + diag_log "EPOCHDebug: updatePlayerStats -3- stat adjustment is 0"; +}; + +private _statVarName = format["EPOCH_total%1",_statType]; +private _currentStat = missionNameSpace getVariable[_statVarName,0]; +private _newStat = _currentStat + _adjust; +missionNameSpace setVariable[_statVarName,_newStat]; + +if(_toServer)then{ + [player, _statType, _adjust, false, Epoch_personalToken] remoteExec ["EPOCH_fnc_updatePlayerStats",2]; +}; \ No newline at end of file diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_Weather.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_Weather.sqf deleted file mode 100644 index 9e37fe61..00000000 --- a/Sources/epoch_code/compile/functions/EPOCH_fnc_Weather.sqf +++ /dev/null @@ -1,98 +0,0 @@ -/* - Author: Aaron Clark - EpochMod.com - - Contributors: - - Description: - Calculates weather related player stats - - 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_code/compile/functions/EPOCH_fnc_Weather.sqf - - Example: - call EPOCH_fnc_Weather; - - Parameter(s): - NONE - - Returns: - NOTHING -*/ -//[[[cog import generate_private_arrays ]]] -private ["_airTemp","_increaseWet","_isNearFire","_maxTemp","_playerPosATL","_warming","_waterTemp","_wet","_wetsuit"]; -//[[[end]]] - -if (isNil "EPOCH_CURRENT_WEATHER") then { - EPOCH_CURRENT_WEATHER = 75; -}; - -_airTemp = EPOCH_CURRENT_WEATHER; -_waterTemp = EPOCH_CURRENT_WEATHER/2; -_warming = true; -_wet = false; -_maxTemp = 98.6; -_increaseWet = 0; -_wetsuit = (getText(configfile >> "cfgweapons" >> uniform player >> "itemInfo" >> "uniformType") == "Neopren"); - -if (vehicle player == player) then { - _playerPosATL = getPosATL player; - if (EPOCH_playerIsSwimming) then { - // do nothing if player is wearing a wetsuit - if (!_wetsuit) then { - if (_waterTemp <= 50) then { - _warming = false; - }; - _wet = true; - _increaseWet = 10; - }; - } else { - if (EPOCH_playerWet > 50 && _airTemp <= 32) then { - _isNearFire = {inflamed _x} count (nearestObjects [_playerPosATL, ["ALL"], 3]); - if (!(call EPOCH_fnc_isInsideBuilding) && _isNearFire == 0) then { - _warming = false; - }; - }; - if (rain >= 0.25) then { - if (!_wetsuit) then { - _isNearFire = { inflamed _x } count(nearestObjects[_playerPosATL, ["ALL"], 3]); - if (!(call EPOCH_fnc_isInsideBuilding) && _isNearFire == 0) then { - _wet = true; - _increaseWet = rain * 10; - }; - }; - }; - }; -}; - -if ((getFatigue player) == 1 && _airTemp > 100) then { - _maxTemp = _airTemp; -}; - -if (EPOCH_playerToxicity > 0) then { - EPOCH_playerImmunity = (EPOCH_playerImmunity + 0.1) min 100; - EPOCH_playerToxicity = (EPOCH_playerToxicity - 0.1) max 0; - _maxTemp = 106.7 + 10; -}; - -if (_warming) then { - EPOCH_playerTemp = (EPOCH_playerTemp + 0.01) min _maxTemp; -} else { - EPOCH_playerTemp = (EPOCH_playerTemp - 0.01) max (95.0 - 10); -}; - -if (_wet) then { - EPOCH_playerWet = (EPOCH_playerWet + _increaseWet) min 100; - if (EPOCH_playerWet > 50) then { - EPOCH_playerSoiled = (EPOCH_playerSoiled - 1) max 0; - }; -} else { - if (_warming) then { - EPOCH_playerWet = (EPOCH_playerWet - 1) max 0; - }; -}; - - -true diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_addItemOverflow.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_addItemOverflow.sqf index fe828837..6b63d12a 100644 --- a/Sources/epoch_code/compile/functions/EPOCH_fnc_addItemOverflow.sqf +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_addItemOverflow.sqf @@ -1,7 +1,7 @@ /* Author: Aaron Clark - EpochMod.com - Contributors: + Contributors: Raimonds Virtoss Description: Epoch add item with overflow @@ -20,12 +20,14 @@ _this select 1: NUMBER - (Optional) Ammo count Returns: - BOOL + BOOL True: item was dropped nearby + False: item was added to inventory */ //[[[cog import generate_private_arrays ]]] -private ["_nearByHolder","_wH","_wHPos"]; +private ["_dropped","_nearByHolder","_wH","_wHPos"]; //[[[end]]] params [["_item","",[""]],["_count",1]]; +_dropped = false; for "_i" from 1 to _count do { if (player canAdd _item) then { @@ -33,7 +35,7 @@ for "_i" from 1 to _count do } else { _wH = objNull; if (isNil "_nearByHolder") then { - _nearByHolder = nearestObjects [position player,["groundWeaponHolder"],3]; + _nearByHolder = nearestObjects [player,["groundWeaponHolder"],3]; }; if (_nearByHolder isEqualTo []) then { _wHPos = player modelToWorld [0,1,0]; @@ -47,6 +49,7 @@ for "_i" from 1 to _count do if !(isNull _wh) then { _wh addItemCargoGlobal [_item,1]; }; + _dropped = true; }; }; -true +_dropped diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_addMagazineOverflow.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_addMagazineOverflow.sqf new file mode 100644 index 00000000..09bbd273 --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_addMagazineOverflow.sqf @@ -0,0 +1,66 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: DirtySanchez + + Description: + Epoch add magazine with overflow toggle + + 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_code/compile/functions/EPOCH_fnc_addMagazineOverflow.sqf + + Example: + [_mag,_magAmmo,true] call EPOCH_fnc_addMagazineOverflow; + + Parameter(s): + _this select 0: STRING - Magazine Class + _this select 1: NUMBER - (Optional) Ammo count + _this select 2: BOOLEAN - (Optional) drop to groundWeaponHolder + + Returns: + NUMBER 1: magazine was added to inventory + 2: not enough room in inventory + 3: magazine was dropped nearby + 0: failed +*/ +//[[[cog import generate_private_arrays ]]] +private ["_return","_nearByHolder","_wH","_wHPos"]; +//[[[end]]] +params [["_item","",[""]],["_count",1],["_canDrop",true]]; +_return = 0; +if (player canAdd _item) then { + player addMagazine [_item,_count]; + _return = 1; +} else { + _return = 3; + if(_canDrop)then{ + _wH = objNull; + if (player != vehicle player && vehicle player canAdd _item) then { + _return = 4; + _wh = vehicle player; + } + else { + _return = 2; + if (isNil "_nearByHolder") then { + _nearByHolder = nearestObjects [player,["groundWeaponHolder"],3]; + }; + if (_nearByHolder isEqualTo []) then { + _wHPos = player modelToWorld [0,1,0]; + if (surfaceIsWater _wHPos) then { + _wHPos = ASLToATL _wHPos; + }; + _wH = createVehicle ["groundWeaponHolder",_wHPos, [], 0, "CAN_COLLIDE"]; + } else { + _wH = _nearByHolder select 0; + }; + }; + if !(isNull _wh) then { + //_wh addItemCargoGlobal [_item,1]; + _wh addMagazineAmmoCargo [_item, 1, _count]; + }; + }; +}; +_return diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_arrayToLogic.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_arrayToLogic.sqf new file mode 100644 index 00000000..1cff0403 --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_arrayToLogic.sqf @@ -0,0 +1,34 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Converts array to boolean logic checks + + 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_code/compile/functions/EPOCH_fnc_arrayToLogic.sqf + + Example: + [1,">=",0] call EPOCH_fnc_arrayToLogic; // returns: true + + Parameter(s): + _this select 0: NUMBER - First value + _this select 1: STRING - compare operator + _this select 2: NUMBER - Second value + + Returns: + BOOL +*/ +params [["_v",""],["_t",""],["_d",""]]; +switch (_t) do { + case ">=": {_v >= _d}; + case "<=": {_v <= _d}; + case "<": {_v < _d}; + case ">": {_v > _d}; + case "!=": {!(_v isEqualTo _d)}; + default {_v isEqualTo _d}; +} diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_createLocalMarkerSet.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_createLocalMarkerSet.sqf new file mode 100644 index 00000000..0aefb5b3 --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_createLocalMarkerSet.sqf @@ -0,0 +1,104 @@ +/* + + Author: DirtySanchez + + Contributors: + + Description: + Utilize new Epoch Active Markers, Backgrounds and Icons courtesy of DrokZ. + + 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_code/compile/functions/EPOCH_fnc_createLocalMarkerSet.sqf + + usage: + [_markerClass, _position] call EPOCH_fnc_createLocalMarkerSet; + + _markerClass(_mClass) - use one of the class markers in the epoch_configs/Configs/CfgMarkerSets.hpp or create new + + _position(_mPos) - position you would like to place the marker set on the map + + Example: + 1. ['DeathMarker',_pos] call EPOCH_fnc_createLocalMarkerSet; + + 2. ['PlayerMarker',_pos] call EPOCH_fnc_createLocalMarkerSet; + +*/ +private["_config", "_markerArray", "_markerName", "_ccText"]; + +params [ ["_mClass",""], ["_mPos",[0,0,0]], ["_OverrideTxt",""] ]; +if(_mClass isEqualTo "") exitWith { + diag_log "EPOCHDebug: createLocalMarkerSet -1- empty markerClass, nothing to create"; +}; + +// get config for custom marker sets +_config = 'CfgMarkerSets' call EPOCH_returnConfig; +if !(isclass (_config >> _mClass)) exitwith { + diag_log "EPOCHDebug: createLocalMarkerSet -2- not a class markerClass, nothing to create"; +}; + +// get array for custom marker set +_markerArray = getArray(_config >> _mClass >> "markerArray"); +if(_markerArray isEqualTo []) exitWith { + diag_log "EPOCHDebug: createLocalMarkerSet -3- empty markerArray, nothing to create"; +}; + +// get a markerName and check for it on map +_markerName = (_markerArray select 0) select 0; +if(_markerName in allMapMarkers) exitWith { + diag_log "EPOCHDebug: createLocalMarkerSet -4- marker already exists on map"; +}; + +// check for defined Marker counter +if(isNil {Epoch_markerCounter})then{Epoch_markerCounter = 0}; + +// run forEach loop on array +{ + // double check all, use these defaults if not defined + _x params [ + ["_mName",format["EPOCH_marker_%1", Epoch_markerCounter]], + ["_mShape","ICON"], + ["_mType","hd_dot"], + ["_mColor","ColorRed"], + ["_mAlpha",1], + ["_mSize",[0.8,0.8]], + ["_mDir",0], + ["_mText",""] + ]; + + _marker = createMarkerLocal [_mName, _mPos]; + + _mName setMarkerShapeLocal _mShape; + + if!(_mShape isEqualTo "ICON")then{ + if!(_mType in (getArray(_config >> "brushes")))exitWith{ + diag_log "EPOCHDebug: createLocalMarkerSet -5- Shape is Ellipse or Rectangle and needs a Brush Type"; + }; + }; + _mName setMarkerTypeLocal _mType; + + _mName setMarkerAlphaLocal _mAlpha; + _mName setMarkerSizeLocal _mSize; + _mName setMarkerDirLocal _mDir; + + if (!(_OverrideTxt isequalto "") && _OverrideTxt isequaltype "") then { + _mName setMarkerTextlocal _OverrideTxt; + } + else { + if!(_mText isEqualTo "")then{ + _ccText = call compile _mText; + _mName setMarkerTextlocal _ccText; + }; + }; + + if!(_mColor isEqualTo "")then{ + _mName setMarkerColorLocal _mColor + }; + + missionNameSpace setVariable[_mName, _mSize]; + if(_mName isEqualTo (format["EPOCH_marker_%1", Epoch_markerCounter]))then{ + Epoch_markerCounter = Epoch_markerCounter + 1; + }; +}forEach _markerArray; diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_cursorTarget.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_cursorTarget.sqf index ffc35397..2cf63a91 100644 --- a/Sources/epoch_code/compile/functions/EPOCH_fnc_cursorTarget.sqf +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_cursorTarget.sqf @@ -28,7 +28,7 @@ private ["_ins","_target"]; //[[[end]]] params [["_distance",10], ["_lod1", "VIEW"], ["_lod2","FIRE"], ["_sort",true]]; -if (EPOCH_playerIsSwimming) then { +if (underwater player) then { _ins = lineIntersectsSurfaces [AGLToASL positionCameraToWorld [0,0,0],AGLToASL positionCameraToWorld [0,0,_distance],player,objNull,_sort,1,_lod1,_lod2]; if (_ins isEqualTo []) exitWith { objNull }; (_ins select 0 param [3,objNull]) diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_deleteLocalMarkerSet.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_deleteLocalMarkerSet.sqf new file mode 100644 index 00000000..2ed1ea5f --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_deleteLocalMarkerSet.sqf @@ -0,0 +1,47 @@ +/* + Author: DirtySanchez - EpochMod.com + + Contributors: + + Description: + Delete Marker Set + + License: + 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_code/compile/functions/EPOCH_fnc_deleteLocalMarkerSet.sqf + + usage: + [_mClass] call EPOCH_fnc_deleteLocalMarkerSet; + + _mClass - name of marker you used from: epoch_configs/Configs/CfgMarkerSets.hpp +*/ +private["_config","_markerArray"]; + +params [ ["_mClass",""], ["_data",[]] ]; + +if(_mClass isEqualTo "") exitWith { + diag_log "EPOCHDebug: deleteLocalMarkerSet -1- empty markerClass, nothing to delete"; +}; + +// get config for custom marker sets +_config = 'CfgMarkerSets' call EPOCH_returnConfig; +if !(isclass (_config >> _mClass)) exitwith { + diag_log "EPOCHDebug: deleteLocalMarkerSet -2- not a class markerClass, nothing to delete"; +}; +// get array for custom marker set +_markerArray = getArray(_config >> _mClass >> "markerArray"); +if(_markerArray isEqualTo []) exitWith { + diag_log "EPOCHDebug: deleteLocalMarkerSet -3- empty markerArray, nothing to delete"; +}; +// get a markerName and check for it on map +_markerName = (_markerArray select 0) select 0; +if!(_markerName in allMapMarkers) exitWith { + diag_log "EPOCHDebug: deleteLocalMarkerSet -4- marker does not exist on map"; +}; + +{ + _mName = _x select 0; + deleteMarkerLocal _mName; +}forEach _markerArray; diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_getHitPointsDamageAverage.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_getHitPointsDamageAverage.sqf new file mode 100644 index 00000000..d0828d4c --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_getHitPointsDamageAverage.sqf @@ -0,0 +1,37 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Function to check HitPointDamageAverage. + + 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_code/compile/functions/EPOCH_fnc_getHitPointsDamageAverage.sqf + + Example: + _average = [cursorObject, "steering", 1] call EPOCH_fnc_getHitPointsDamageAverage;; + + Parameter(s): + _this select 0: OBJECT - Object to check Hitpoints + _this select 1: STRING - String to find in Hitpointname (e.g. "wheel"); + _this select 2: SCALAR - Sub-Array in getAllHitPointsDamage to search for String (default = 0) + _this select 3: SCALAR - Sub-Array for Hitpoint-Values in getAllHitPointsDamage (default = 2) + + Returns: + SCALAR +*/ +params [ "_object", "_match", ["_indexIn", 0], ["_indexOut", 2] ]; +_dmg = 0; +_parts = 0; +_allHitPoints = getAllHitPointsDamage _object; +{ + if ((toLower(_x) find _match) != -1) then { + _dmg = _dmg + ((_allHitPoints select _indexOut) select _forEachIndex); + _parts = _parts + 1; + }; +} forEach (_allHitPoints select _indexIn); +(_dmg / _parts) diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf index 7b65cfd6..abb9de17 100644 --- a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf @@ -23,7 +23,7 @@ BOOL */ //[[[cog import generate_private_arrays ]]] -private ["_config","_doRevenge","_playerDeathScreen","_playerKilledScreen","_playerRevengeMinAliveTime","_tapDiag"]; +private ["_config","_doRevenge","_playerAliveTime","_playerAliveTimeKeyFinal","_playerDeathScreen","_playerKilledScreen","_playerRevengeMinAliveTime","_tapDiag"]; //[[[end]]] params [["_unit",objNull,[objNull]],["_killer",objNull,[objNull]] ]; _config = 'CfgEpochClient' call EPOCH_returnConfig; @@ -31,14 +31,25 @@ _playerDeathScreen = getText(_config >> "playerDeathScreen"); _playerRevengeMinAliveTime = getNumber(_config >> "playerRevengeMinAliveTime"); if (_playerDeathScreen isEqualTo "") then {_playerDeathScreen = "TapOut"}; _tapDiag = _playerDeathScreen; -// diag_log format ["DEBUG: EPOCH_playerAliveTime %1",EPOCH_playerAliveTime]; -_doRevenge = ((getNumber(_config >> "playerDisableRevenge") isEqualTo 0) && EPOCH_playerAliveTime >= _playerRevengeMinAliveTime); + +_playerAliveTimeKeyFinal = "EPOCH_playerAliveTime"; +if !(isNil "_playerAliveTimeKey") then {_playerAliveTimeKeyFinal = _playerAliveTimeKey}; +_playerAliveTime = missionNamespace getVariable [_playerAliveTimeKeyFinal,[]]; + +_doRevenge = ((getNumber(_config >> "playerDisableRevenge") isEqualTo 0) && _playerAliveTime >= _playerRevengeMinAliveTime); // test ejecting unit from vehicle if dead client side if (vehicle _unit != _unit) then { _unit action["Eject", vehicle _unit]; }; +// save death position +profileNameSpace setVariable["EPOCHLastKnownDeath",[]]; +_deathMarkerON = (getNumber(_config >> "playerDeathMarkerGPSOnly") isEqualTo 1); +if(_deathMarkerON && ('ItemGPS' in (assignedItems _unit)))then{ + profileNameSpace setVariable["EPOCHLastKnownDeath",getPos _unit]; +}; + [player,_killer,toArray profileName,Epoch_personalToken] remoteExec ["EPOCH_server_deadPlayer",2]; // disable build mode @@ -56,7 +67,7 @@ if (Epoch_canBeRevived) then { createDialog _tapDiag; } else { setPlayerRespawnTime 15; - ["You can be just revived once per life!", 5] call Epoch_message; + ["You can be just revived once per life!", 5,[[0,0,0,0.5],[1,0,0,1]]] call Epoch_message; }; [_killer, _tapDiag] spawn{ diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerFired.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerFired.sqf index 0285320a..6ffcd511 100644 --- a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerFired.sqf +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerFired.sqf @@ -28,7 +28,7 @@ NOTHING */ //[[[cog import generate_private_arrays ]]] -private ["_ammoConfig","_attachments","_currentDMG","_currentHIT","_cursorTarget","_gesture","_heal","_highestDMG","_newDMG","_nuisanceLevel","_repaired"]; +private ["_ammoConfig","_attachments","_currentDMG","_currentHIT","_cursorTarget","_gesture","_heal","_highestDMG","_newDMG","_nuisanceLevel","_playerNuisanceKeyFinal","_repaired"]; //[[[end]]] params ["_unit","_weapon","_muzzle","_mode","_ammo","_magazine","_projectile"]; EPOCH_lastFiredLocation = getPosATL player; @@ -60,6 +60,13 @@ switch true do { _currentDMG = 0; { _currentDMG = _x; + if (EPOCH_AdvancedVehicleRepair_Enabled) then { + if (_cursorTarget iskindof "Landvehicle" || _cursorTarget iskindof "SHIP" || _cursorTarget iskindof "AIR" || _cursorTarget iskindof "TANK") then { + if (_currentDMG > 0.9) then { + _currentDMG = 0; + }; + }; + }; if (_currentDMG > _highestDMG) then{ _highestDMG = _currentDMG; _currentHIT = _forEachIndex; @@ -68,9 +75,9 @@ switch true do { if (_highestDMG > 0) then { _newDMG = ((_highestDMG - 0.5) max 0); if (local _cursorTarget) then { - [_cursorTarget,[_currentHIT,_newDMG]] call EPOCH_client_repairVehicle; + [_cursorTarget,[[_currentHIT,_newDMG]]] call EPOCH_client_repairVehicle; } else { - [_cursorTarget,[_currentHIT,_newDMG],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + [_cursorTarget,[[_currentHIT,_newDMG]],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; }; } else { if ((damage _cursorTarget) > 0) then { @@ -111,7 +118,9 @@ switch true do { _nuisanceLevel = _nuisanceLevel / 2; }; // Nuisance System 0.1 - (EPOCH_customVarLimits select (EPOCH_customVars find "Nuisance")) params [["_playerLimitMax",100],["_playerLimitMin",0]]; - EPOCH_playerNuisance = ((EPOCH_playerNuisance + _nuisanceLevel) min _playerLimitMax) max _playerLimitMin; + (EPOCH_customVarLimits select (EPOCH_customVars find "Nuisance")) params [["_playerLimitMax",100],["_playerLimitMin",0]]; + _playerNuisanceKeyFinal = "EPOCH_playerNuisance"; + if !(isNil "_playerNuisanceKey") then {_playerNuisanceKeyFinal = _playerNuisanceKey}; + [_playerNuisanceKeyFinal,_nuisanceLevel,_playerLimitMax,_playerLimitMin] call EPOCH_fnc_setVariableLimited; }; }; diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_returnHudVar.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_returnHudVar.sqf new file mode 100644 index 00000000..90c1bba4 --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_returnHudVar.sqf @@ -0,0 +1,50 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Returns specific values based on an index or falls back to defaults. + + 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_code/compile/functions/EPOCH_fnc_returnHudVar.sqf + + Example: + // HUD and Logic functions - todo move to client function. + [_selVarName,_varIndex,_selVarType,_selVarSubData] call EPOCH_fnc_returnHudVar + + Parameter(s): + _this select 0: STRING - variable name + _this select 1: NUMBER - default variable index + _this select 2: STRING - variable type + _this select 3: STRING - extra data + + Returns: + MIXED +*/ +//[[[cog import generate_private_arrays ]]] +private ["_customVarLimits","_customVarNames","_customVarsInit","_defaultVarValues","_varName","_varNameTmp"]; +//[[[end]]] + +params [["_selVarName",""],["_varIndex",0],["_selVarType",""],["_selVarSubData",""]]; +switch (_selVarType) do { + case "getMissionNamespaceVariable": {missionNamespace getVariable[_selVarName,_selVarSubData]}; + case "getPlayerHitPointDamage": {player getHitPointDamage _selVarSubData}; + case "getPlayerOxygenRemaining": {getOxygenRemaining player}; + case "getPlayerDamage": {damage player}; + default { + _customVarsInit = getArray(getMissionConfig "CfgEpochClient" >> "customVarsDefaults"); + _customVarNames = _customVarsInit apply {_x param [0,""]}; + _defaultVarValues = _customVarsInit apply {_x param [1,0]}; + _customVarLimits = _customVarsInit apply {_x param [2,[]]}; + _varName = format["EPOCH_player%1",_selVarName]; + if (_selVarName in _customVarNames) then { + _varNameTmp = call compile format["_player%1Key",_selVarName]; + if !(isNil "_varNameTmp") then {_varName = _varNameTmp}; + }; + missionNamespace getVariable[_varName,_defaultVarValues select _varIndex] + }; +} diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_setVariableLimited.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_setVariableLimited.sqf new file mode 100644 index 00000000..6afac4c9 --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_setVariableLimited.sqf @@ -0,0 +1,29 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Sets GVAR value within min/max limits. + + 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_code/compile/functions/EPOCH_setVariableLimited.sqf + + Example: + ["TEST",-30,100,0] call EPOCH_fnc_setVariableLimited; // removes 30 and keeps number within 0-100 range. + + Parameter(s): + _this select 0: STRING - GVar variable key + _this select 1: NUMBER - Change variable + _this select 2: NUMBER - max Value + _this select 3: NUMBER - min Value + Returns: + NUMBER +*/ +params [["_key","",[""]],["_change",0],["_max",100],["_min",0]]; +private _result = (((missionNamespace getVariable [_key, 0]) + _change) min _max) max _min; +missionNamespace setVariable [_key, _result]; +_result diff --git a/Sources/epoch_code/compile/functions/EPOCH_giveAttributes.sqf b/Sources/epoch_code/compile/functions/EPOCH_giveAttributes.sqf index 4cc591f2..0783f5bd 100644 --- a/Sources/epoch_code/compile/functions/EPOCH_giveAttributes.sqf +++ b/Sources/epoch_code/compile/functions/EPOCH_giveAttributes.sqf @@ -1,14 +1,50 @@ -// EPOCH_giveAttributes +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Controls attributes given custom vars system and returns text based on these changes. + + 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_code/epoch_code/compile/functions/EPOCH_giveAttributes.sqf + + Example: + _text = _x call EPOCH_giveAttributes + + Parameter(s): + _this select 0: STRING - Player Stat Name + _this select 1: NUMBER - Input + _this select 2: NUMBER - 1 = randomize input, 0 = normal + Returns: + STRING +*/ + //[[[cog import generate_private_arrays ]]] -private ["_addPlus","_celcuis","_celcuisNew","_currentVal","_customVarIndex","_data","_limits","_max","_min","_newValue","_return","_varName"]; +private ["_addPlus","_celcuis","_celcuisNew","_color","_currentVal","_customVarIndex","_customVarLimits","_customVarNames","_customVarsInit","_data","_defaultVarValues","_limits","_max","_min","_newValue","_return","_varName","_varNameTmp"]; //[[[end]]] params ["_selectedVarName",["_data",0],["_randomizeData",0]]; _addPlus = if (_data > 0) then {"+"} else {""}; _return = ""; -_customVarIndex = EPOCH_customVars find _selectedVarName; + +_customVarsInit = getArray(getMissionConfig "CfgEpochClient" >> "customVarsDefaults"); +_customVarNames = _customVarsInit apply {_x param [0,""]}; +_defaultVarValues = _customVarsInit apply {_x param [1,0]}; +_customVarLimits = _customVarsInit apply {_x param [2,[]]}; + +_customVarIndex = _customVarNames find _selectedVarName; if (_customVarIndex != -1) then { - _varName = format["EPOCH_player%1",_selectedVarName]; - _limits = EPOCH_customVarLimits select _customVarIndex; + + _varName = format["EPOCH_player%1",_selectedVarName]; + if (_selectedVarName in _customVarNames) then { + _varNameTmp = call compile format["_player%1Key",_selectedVarName]; + if !(isNil "_varNameTmp") then {_varName = _varNameTmp}; + }; + + _limits = _customVarLimits select _customVarIndex; _limits params [["_max",100],["_min",0]]; if (_max isEqualType "") then { _max = missionNamespace getVariable [_max, 0]; @@ -16,21 +52,21 @@ if (_customVarIndex != -1) then { if (_min isEqualType "") then { _min = missionNamespace getVariable [_min, 0]; }; - _currentVal = missionNamespace getVariable [_varName, EPOCH_defaultVars select _customVarIndex]; + _currentVal = missionNamespace getVariable [_varName, _defaultVarValues select _customVarIndex]; if (_randomizeData isEqualTo 1) then { _data = round(random _data); }; - if (_data != 0) then { - _newValue = ((_currentVal + _data) min _max) max _min; - missionNamespace setVariable [_varName, _newValue]; - if (_selectedVarName == "Temp") then { - _celcuis = _data call EPOCH_convertTemp; - _celcuisNew = _newValue call EPOCH_convertTemp; - _return = format["%1: %2%3 (%4 °F) %2%5 (%6 °C)",(localize format["str_epoch_pvar_%1",_selectedVarName]),_addPlus,_data,_newValue,_celcuis,_celcuisNew]; - } else { - _return = format["%1: %2%3 (%4/%5)", (localize format["str_epoch_pvar_%1",_selectedVarName]), _addPlus, _data, _newValue, _max]; - }; - }; + if (_data != 0) then { + _newValue = ((_currentVal + _data) min _max) max _min; + missionNamespace setVariable [_varName, _newValue]; + if (_selectedVarName == "Temp") then { + _celcuis = _data call EPOCH_convertTemp; + _celcuisNew = _newValue call EPOCH_convertTemp; + _return = format["%1: %2%3 (%4 °F) %2%5 (%6 °C)",(localize format["str_epoch_pvar_%1",_selectedVarName]),_addPlus,_data,_newValue,_celcuis,_celcuisNew]; + } else { + _return = format["%1: %2%3 (%4/%5)", (localize format["str_epoch_pvar_%1",_selectedVarName]), _addPlus, _data, _newValue, _max]; + }; + }; }; _return diff --git a/Sources/epoch_code/compile/functions/EPOCH_itemDisplayName.sqf b/Sources/epoch_code/compile/functions/EPOCH_itemDisplayName.sqf index 7f36be01..7782e183 100644 --- a/Sources/epoch_code/compile/functions/EPOCH_itemDisplayName.sqf +++ b/Sources/epoch_code/compile/functions/EPOCH_itemDisplayName.sqf @@ -37,4 +37,7 @@ if ([_item, "CfgVehicles"] call EPOCH_fnc_isAny) then { }; }; }; +if (_return isequalto "") then { + _return = _item; +}; _return; diff --git a/Sources/epoch_code/compile/functions/EPOCH_pushCustomVar.sqf b/Sources/epoch_code/compile/functions/EPOCH_pushCustomVar.sqf deleted file mode 100644 index 23f73cbf..00000000 --- a/Sources/epoch_code/compile/functions/EPOCH_pushCustomVar.sqf +++ /dev/null @@ -1,37 +0,0 @@ -/* - Author: Aaron Clark - EpochMod.com - - Contributors: - - Description: - Sends message server to save custom variables from player - - 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_code/compile/functions/EPOCH_pushCustomVar.sqf - - Example: - true call EPOCH_pushCustomVar; - - Parameter(s): - _this: BOOL - true = fast save, false = slow save window - - Returns: - NOTHING -*/ -//[[[cog import generate_private_arrays ]]] -private ["_customVars","_lastSave","_time"]; -//[[[end]]] -_time = if (_this) then [{15},{80}]; -_lastSave = missionNamespace getVariable["EPOCH_lastSave", diag_tickTime]; -if ((diag_tickTime - _lastSave) >= _time) then { - EPOCH_playerHitPoints = ((getAllHitPointsDamage player) param [2,[]]); - _customVars = []; - { - _customVars pushBack (missionNamespace getVariable format["EPOCH_player%1",_x]); - } forEach (missionNamespace getVariable["EPOCH_customVars", []]); - [player,_customVars,missionNamespace getVariable "Epoch_personalToken"] remoteExec ["EPOCH_fnc_savePlayer",2]; - missionNamespace setVariable["EPOCH_lastSave", diag_tickTime]; -}; diff --git a/Sources/epoch_code/compile/functions/EPOCH_worldObjectType.sqf b/Sources/epoch_code/compile/functions/EPOCH_worldObjectType.sqf index e5b99793..57b5f6cf 100644 --- a/Sources/epoch_code/compile/functions/EPOCH_worldObjectType.sqf +++ b/Sources/epoch_code/compile/functions/EPOCH_worldObjectType.sqf @@ -13,41 +13,54 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/functions/EPOCH_worldObjectType.sqf Example: - _isTree = [_objectString, "tree"] call EPOCH_worldObjectType; + _isTree = [_object, "tree"] call EPOCH_worldObjectType; Parameter(s): - _this select 0: STRING - string name of world object + _this select 0: STRING or OBJECT - string name or world object _this select 1: STRING or ARRAY - type names ("tree","bush") Returns: BOOL or ARRAY of BOOLs */ //[[[cog import generate_private_arrays ]]] -private ["_config","_end","_finalConfig","_findStart","_isTree","_p3dName","_return","_start"]; +private ["_config","_end","_finalConfig","_findStart","_isTree","_modelInfo","_p3dName","_return","_selectedConfig","_start"]; //[[[end]]] -params ["_str","_checkType"]; +params ["_object","_checkType"]; _return = false; -_config = 'CfgEpochClient' call EPOCH_returnConfig; -// find start of p3d name -_findStart = _str find ": "; -if (_findStart != -1) then{ - _start = _findStart + 2; - _end = (_str find ".") - _start; - _p3dName = _str select[_start, _end]; +_config = ('CfgEpochClient' call EPOCH_returnConfig) >> "CfgWorldInteractions"; - // replace spaces with underscores - if (_p3dName find " " != -1) then { - (_p3dName splitString " ") joinString "_"; - }; - _finalConfig = (_config >> "CfgWorldInteractions" >> (_p3dName + "_p3d")); - - if (_checkType isEqualType []) then { - _return = []; - { - _return pushBack (getNumber(_finalConfig >> _x) == 1); - } forEach _checkType; +_selectedConfig = ""; +if (_object isEqualType objNull && !(isNull _object)) then { + if !(_object isKindOf "All") then { + (getModelInfo _object) params [["_modelName",""]]; + if (!isnil "_modelName") then { + // replace spaces and periods with underscores + _selectedConfig = (_modelName splitString " .") joinString "_"; + }; } else { - _return = (getNumber(_finalConfig >> _checkType) == 1); + _selectedConfig = typeOf _object; + }; +} else { + // find start of p3d name - OLD UNUSED TBR + if (_object isEqualType "") then { + _findStart = _object find ": "; + if (_findStart != -1) then{ + _start = _findStart + 2; + // replace spaces and periods with underscores + _selectedConfig = ((_object select [_start]) splitString " .") joinString "_"; + }; }; }; + +// Do checks +_finalConfig = (_config >> _selectedConfig); +if (_checkType isEqualType []) then { + _return = []; + { + _return pushBack (getNumber(_finalConfig >> _x) == 1); + } forEach _checkType; +} else { + _return = (getNumber(_finalConfig >> _checkType) == 1); +}; + _return 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 d3a0c574..295c0f7c 100644 --- a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf +++ b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf @@ -1,21 +1,21 @@ /* Author: Aaron Clark - EpochMod.com - @vbawol - Contributors: @Skaronator @raymix @Fank + Contributors: @Skaronator @raymix @Fank Description: Key Down EH functions - Licence: - Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike + 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_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf + Github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf - Example: - _this call EPOCH_KeyDown; + Example: + _this call EPOCH_KeyDown; - Parameter(s): + Parameter(s): _this select 0: CONTROL - _display _this select 1: NUMBER - _dikcode _this select 2: BOOL - Shift State @@ -26,10 +26,15 @@ BOOL */ //[[[cog import generate_private_arrays ]]] -private ["_currentPos","_handled"]; +private ["_adj","_currentPos","_handled","_playerEnergy","_playerEnergyKeyFinal","_playerStaminaKeyFinal","_step"]; //[[[end]]] params ["_display","_dikCode","_shift","_ctrl","_alt"]; +_playerStaminaKeyFinal = "EPOCH_playerStamina"; +_playerEnergyKeyFinal = "EPOCH_playerEnergy"; +if !(isNil "_playerStaminaKey") then {_playerStaminaKeyFinal = _playerStaminaKey}; +if !(isNil "_playerEnergyKey") then {_playerEnergyKeyFinal = _playerEnergyKey}; + _handled = false; _this call Epoch_custom_EH_KeyDown; @@ -39,17 +44,31 @@ if !(alive player) exitWith{ false }; EPOCH_doRotate = false; +if !(EPOCH_modKeys isequalto [_shift,_ctrl,_alt]) then { + EPOCH_modKeys = [_shift,_ctrl,_alt]; + call epoch_favBar_modifier; +}; + +//Favorites bar +if (_dikCode in [EPOCH_keysfav1,EPOCH_keysfav2,EPOCH_keysfav3,EPOCH_keysfav4,EPOCH_keysfav5]) then { + if (isnull EPOCH_Target) then { + _handled = _this call epoch_favBar_action; + } else { + "Can't use while in building mode!" call epoch_message; + }; +}; + // increase vol if (_ctrl && _dikCode == EPOCH_keysVolumeUp) then { EPOCH_soundLevel = (EPOCH_soundLevel + 0.1) min 1; 5 fadeSound EPOCH_soundLevel; - [format["Internal sound level: %1%2", EPOCH_soundLevel * 100, "%"], 5] call Epoch_message; + [format["Internal sound level: %1%2", EPOCH_soundLevel * 100, "%"], 5,[[0,0,0,0.5],[0,1,1,1]]] call Epoch_message; }; // lower vol if (_ctrl && _dikCode == EPOCH_keysVolumeDown) then { EPOCH_soundLevel = (EPOCH_soundLevel - 0.1) max 0.1; 5 fadeSound EPOCH_soundLevel; - [format["Internal sound level: %1%2", EPOCH_soundLevel * 100,"%"], 5] call Epoch_message; + [format["Internal sound level: %1%2", EPOCH_soundLevel * 100,"%"], 5,[[0,0,0,0.5],[0,1,1,1]]] call Epoch_message; }; // ESC default to cancel @@ -72,9 +91,9 @@ if (_dikCode == 0x01) then { if (_dikCode == EPOCH_keysDebugMon) then { EPOCH_debugMode = !EPOCH_debugMode; if (EPOCH_debugMode) then { - ["Debug Mode Enabled", 5] call Epoch_message; + ["Debug Mode Enabled", 5,[[0,0,0,0.5],[1,1,0,1]]] call Epoch_message; } else { - ["Debug Mode Disabled", 5] call Epoch_message; + ["Debug Mode Disabled", 5,[[0,0,0,0.5],[1,1,0,1]]] call Epoch_message; hintSilent ""; }; _handled = true; @@ -100,15 +119,11 @@ if (_dikCode == EPOCH_keysAction) then { // Player only code if (vehicle player == player) then { - if (_dikCode == EPOCH_keysBuildMode1 && EPOCH_buildMode > 0) then { - EPOCH_buildMode = 0; - EPOCH_snapDirection = 0; + if ((_dikCode == EPOCH_keysBuildMode1 && !EPOCH_favBar_itemConsumed) && EPOCH_buildMode > 0) then { + EPOCH_buildMode = 0; ["Build Mode: Disabled", 5] call Epoch_message; EPOCH_Target = objNull; - EPOCH_Z_OFFSET = 0; - EPOCH_X_OFFSET = 0; - EPOCH_Y_OFFSET = 5; - _handled = true; + _handled = true; }; // H - holster unholster @@ -127,17 +142,31 @@ if (vehicle player == player) then { }; if (EPOCH_buildMode > 0) then { - if (!_ctrl) then { - switch (_dikCode) do { - case EPOCH_keysBuildMovUp: { EPOCH_Z_OFFSET = (EPOCH_Z_OFFSET + 0.1) min 6; _handled = true }; - case EPOCH_keysBuildMovDn: { EPOCH_Z_OFFSET = (EPOCH_Z_OFFSET - 0.1) max - 3; _handled = true }; - case EPOCH_keysBuildMovFwd: { EPOCH_Y_OFFSET = (EPOCH_Y_OFFSET + 0.1) min 5; _handled = true }; - 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_doRotate = true; _handled = true }; - case EPOCH_keysBuildRotR: { EPOCH_buildDirection = (EPOCH_buildDirection - 1) max 0; EPOCH_doRotate = true; _handled = true }; - //case EPOCH_keysBuildIt: { cursorTarget call EPOCH_fnc_SelectTarget; _handled = true }; + if (!isnull EPOCH_Target) then { + if (!_ctrl) then { + _step = 0.5; + if(_shift)then{_step = 1.5;}; + if(_alt)then{_step = 0.01;}; + switch (_dikCode) do { + case EPOCH_keysBuildMovUp: { _adj = 0.1;if(_shift)then{_adj = 0.5};if(_alt)then{_adj = 0.01};EPOCH_Z_OFFSET = (EPOCH_Z_OFFSET + _adj) min 6; _handled = true }; + case EPOCH_keysBuildMovDn: { _adj = 0.1;if(_shift)then{_adj = 0.5};if(_alt)then{_adj = 0.01};EPOCH_Z_OFFSET = (EPOCH_Z_OFFSET - _adj) max - 3; _handled = true }; + case EPOCH_keysBuildMovFwd: { _adj = 0.1;if(_shift)then{_adj = 0.5};if(_alt)then{_adj = 0.01};EPOCH_Y_OFFSET = (EPOCH_Y_OFFSET + _adj) min 5; _handled = true }; + case EPOCH_keysBuildMovBak: { _adj = 0.1;if(_shift)then{_adj = 0.5};if(_alt)then{_adj = 0.01};EPOCH_Y_OFFSET = (EPOCH_Y_OFFSET - _adj) max -5; _handled = true }; + case EPOCH_keysBuildMovL: { _adj = 0.1;if(_shift)then{_adj = 0.5};if(_alt)then{_adj = 0.01};EPOCH_X_OFFSET = (EPOCH_X_OFFSET + _adj) min 5; _handled = true }; + case EPOCH_keysBuildMovR: { _adj = 0.1;if(_shift)then{_adj = 0.5};if(_alt)then{_adj = 0.01};EPOCH_X_OFFSET = (EPOCH_X_OFFSET - _adj) max -5; _handled = true }; + case EPOCH_keysBuildRotL: { _adj = 1;if(_shift)then{_adj = 2.5};if(_alt)then{_adj = 0.5};EPOCH_buildDirection = (EPOCH_buildDirection + _adj) min 180; EPOCH_doRotate = true; _handled = true }; + case EPOCH_keysBuildRotR: { _adj = 1;if(_shift)then{_adj = 2.5};if(_alt)then{_adj = 0.5};EPOCH_buildDirection = (EPOCH_buildDirection - _adj) max -180; EPOCH_doRotate = true; _handled = true }; + /*case EPOCH_keysBuildIt: { cursorTarget call EPOCH_fnc_SelectTarget; _handled = true };*/ + case eXpoch_keysVectorResetObject: { EPOCH_X_OFFSET = 0;EPOCH_Y_OFFSET = 5;EPOCH_Z_OFFSET = 0;EPOCH_buildDirection = 0;EPOCH_buildDirectionPitch = 0;EPOCH_buildDirectionRoll = 0;EPOCH_doRotate = true;_handled = true }; + }; + if (Epoch_target iskindof 'Const_Ghost_EPOCH') then { + switch (_dikCode) do { + case eXpoch_keysVectorTiltL: {_adj = 1;if(_shift)then{_adj = 2.5};if(_alt)then{_adj = 0.5};EPOCH_buildDirectionRoll = (EPOCH_buildDirectionRoll - _adj) max -180; EPOCH_doRotate = true; _handled = true }; + case eXpoch_keysVectorTiltR: {_adj = 1;if(_shift)then{_adj = 2.5};if(_alt)then{_adj = 0.5};EPOCH_buildDirectionRoll = (EPOCH_buildDirectionRoll + _adj) min 180; EPOCH_doRotate = true; _handled = true }; + case eXpoch_keysVectorTiltAwy: {_adj = 1;if(_shift)then{_adj = 2.5};if(_alt)then{_adj = 0.5};EPOCH_buildDirectionPitch = (EPOCH_buildDirectionPitch - _adj) max -180; EPOCH_doRotate = true; _handled = true }; + case eXpoch_keysVectorTiltTwd: {_adj = 1;if(_shift)then{_adj = 2.5};if(_alt)then{_adj = 0.5};EPOCH_buildDirectionPitch = (EPOCH_buildDirectionPitch + _adj) min 180; EPOCH_doRotate = true; _handled = true }; + }; + }; }; }; }; @@ -180,13 +209,13 @@ if (vehicle player == player) then { if ((primaryWeapon player != "") && (currentWeapon player == primaryWeapon player)) then { player switchMove "AovrPercMrunSrasWrflDf"; [player, "AovrPercMrunSrasWrflDf", Epoch_personalToken] remoteExec ["EPOCH_server_handle_switchMove",2]; - EPOCH_playerStamina = (EPOCH_playerStamina - 30) max 0; + [_playerStaminaKeyFinal, -30, 1000 , 0] call EPOCH_fnc_setVariableLimited; _handled = true; } else { if (currentWeapon player == "") then { player switchMove "epoch_unarmed_jump"; [player, "epoch_unarmed_jump", Epoch_personalToken] remoteExec ["EPOCH_server_handle_switchMove",2]; - EPOCH_playerStamina = (EPOCH_playerStamina - 30) max 0; + [_playerStaminaKeyFinal, -30, 1000 , 0] call EPOCH_fnc_setVariableLimited; _handled = true; }; }; @@ -216,6 +245,8 @@ if (vehicle player == player) then { }; // end player only code +EPOCH_favBar_itemConsumed = false; + if (_dikCode in (actionKeys "Salute")) then { if (_ctrl) then { player playactionNow "GestureFinger"; @@ -226,7 +257,8 @@ if (_dikCode in (actionKeys "TacticalView")) then { _handled = true; }; if (_dikCode in (actionKeys "NightVision")) then { - if (EPOCH_playerEnergy == 0) then { + _playerEnergy = missionNamespace getVariable [_playerEnergyKeyFinal,[]]; + if (_playerEnergy == 0) then { ["Night Vision Goggles: Need Energy", 5] call Epoch_message; _handled = true; }; diff --git a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyUp.sqf b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyUp.sqf index 56606952..51960002 100644 --- a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyUp.sqf +++ b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyUp.sqf @@ -1,7 +1,7 @@ /* Author: Aaron Clark - EpochMod.com - Contributors: + Contributors: Raymix Description: Key Up EH functions @@ -34,6 +34,11 @@ _handled = false; _this call Epoch_custom_EH_KeyUp; if (_handled) exitWith{ true }; +if !(EPOCH_modKeys isequalto [_shift,_ctrl,_alt]) then { + EPOCH_modKeys = [_shift,_ctrl,_alt]; + call epoch_favBar_modifier; +}; + //Main actions if (_dikCode == EPOCH_keysAction) then { EPOCH_keysActionPressed = false; @@ -42,4 +47,5 @@ if (_dikCode == EPOCH_keysAction) then { if (_dikCode in(actionKeys "Gear")) then { EPOCH_gearKeyPressed = false; }; + _handled diff --git a/Sources/epoch_code/compile/inventory/EPOCH_equip.sqf b/Sources/epoch_code/compile/inventory/EPOCH_equip.sqf new file mode 100644 index 00000000..e7bb981f --- /dev/null +++ b/Sources/epoch_code/compile/inventory/EPOCH_equip.sqf @@ -0,0 +1,487 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: Equips or un-equips item (if equipped) instantly. Item has to exist in the inventory. + to switch weapons slowly use below in your code: + player playAction "reloadMagazine"; + + _item - className + _drop - drop on ground if inventory full, weapons will be stripped off attachments + weapons stripped because attachments can only be added while weapon is equipped. + _forceEquip - disables un-equip and forces new item to be equipped at all times + + 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_code/compile/inventory/EPOCH_equip.sqf + + Usage: + [_item, false] call epoch_equip; //don't drop item if inventory full. Does not equip requested item if another item already equipped, instead un-equips existing one. + [_item, true,true] call epoch_equip; //drops item if not enough space. Removes existing weapon and equips new one. + + RETURNS: + 0 - fail, item not provided + 1 - success + 2 - success, but item dropped on ground. + 3 - item not found + 4 - not enough space + 5 - accessory not compatible +*/ +private ["_item","_drop","_forceEquip","_return","_loadout","_slot","_uniform","_vest","_bpack","_uniformItems","_vestItems","_bPackItems","_itemInInventory", +"_fnc_dropItem","_fnc_findItemInContainers","_fnc_moveWeaponFromContainer","_fnc_MoveWeaponToContainer","_fnc_canMoveToContainer","_fnc_dropEquipWeapon","_fnc_dropAssign", +"_fnc_MoveShellToContainer","_fnc_moveShellFromContainer","_fnc_dropEquipShells","_fnc_findAccessorySlot","_fnc_dropEquipAccessories"]; +params [["_item","",[""]],["_drop",false,[false]],["_forceEquip",false,[false]]]; + +_return = 0; +if (_item == "") exitWith {_return}; +_slot = _item call epoch_itemTypeSlot; +_loadout = getUnitLoadout player; +_uniform = _loadout param [3,[]]; +_vest = _loadout param [4,[]]; +_bpack = _loadout param [5,[]]; +_uniformItems = _uniform param [1,[]]; +_vestItems = _vest param [1,[]]; +_bPackItems = _bPack param [1,[]]; + +_itemInInventory = _item in ((magazines player) + (items player)); + +_fnc_dropItem = { + private ["_item","_nearByHolder","_wH","_wHPos"]; + params [["_item","",[""]],["_count",1]]; + for "_i" from 1 to _count do + { + _wH = objNull; + if (isNil "_nearByHolder") then { + _nearByHolder = nearestObjects [player,["groundWeaponHolder"],3]; + }; + if (_nearByHolder isEqualTo []) then { + _wHPos = player modelToWorld [0,1,0]; + if (surfaceIsWater _wHPos) then { + _wHPos = ASLToATL _wHPos; + }; + _wH = createVehicle ["groundWeaponHolder",_wHPos, [], 0, "CAN_COLLIDE"]; + } else { + _wH = _nearByHolder select 0; + }; + if !(isNull _wh) then { + _wh addItemCargoGlobal [_item,1]; + }; + }; +}; + +_fnc_findItemInContainers = { + private ["_item","_container","_index","_found","_currItem"]; + params ["_item"]; + + _container = 0; + _index = 0; + _found = false; + { + _container = _forEachIndex; + if (!isnil "_x") then { + { + _index = _forEachIndex; + _currItem = _x select 0; + if (_currItem isEqualType "") then { //if item + if (_currItem isEqualTo _item) exitWith {_found = true}; + } else { //if weapon + if ((_currItem select 0) isEqualTo _item) exitWith {_found = true}; + }; + if _found exitWith {}; + } forEach _x; + }; + if _found exitWith {}; + } forEach [_uniformItems,_vestItems,_bPackItems]; + + [_container,_index,_found] +}; + +_fnc_moveWeaponFromContainer = { + private ["_idx","_container","_sIdx","_dIdx"]; //_dIdx can only be 0, 1 and 2 + params ["_idx","_dIdx"]; + _idx params ["_container","_sIdx"]; + + //copy old entry + _temp = ((_loadout select (_container + 3)) select 1) select _sIdx select 0; + //delete old entry + ((_loadout select (_container + 3)) select 1) deleteAt _sIdx; + //add new entry + _loadout set [_dIdx,_temp]; + //save changes + player setUnitLoadout _loadout; +}; + +_fnc_MoveWeaponToContainer = { + private ["_container","_sIdx"]; //_sIdx can only be 0, 1 and 2 + params ["_container","_sIdx"]; + + /* + //Delete this block if no issues. + //Commented out because increasing index alone is not enough due to unique attachement placements or ammo size + _exists = _item call _fnc_findItemInContainers; + _exists params ["_container","_idx","_found"]; + + if _found then { + _cnt = ((_loadout select (_container + 3)) select 1) select _idx select 1; + ((_loadout select (_container + 3)) select 1) select _idx set [1,_cnt + 1]; + } else { + ((_loadout select (_container + 3)) select 1) append [[_loadout select _sIdx,1]]; + }; + */ + + ((_loadout select (_container + 3)) select 1) append [[_loadout select _sIdx,1]]; //cut out from above comment, looks like appending alone works great + _loadout set [_sIdx,[]]; + + player setUnitLoadout _loadout; +}; + +_fnc_canMoveToContainer = { + private "_item"; + params ["_item"]; + if (player canAddItemToUniform _item) exitWith {0}; + if (player canAddItemToVest _item) exitWith {1}; + if (player canAddItemToBackpack _item) exitWith {2}; + 4 +}; + +_fnc_dropEquipWeapon = { + private ["_equipped","_slot"]; + params ["_equipped","_slot"]; + + if (!_itemInInventory && (_item != _equipped)) exitWith {_return = 3}; //Item not found + + if (_equipped != "") then { //something equipped already + if (player canAdd _equipped) then { //can we move it? + _container = _equipped call _fnc_canMoveToContainer; + + if (_container != 4) then { + [_container,_slot] call _fnc_MoveWeaponToContainer; + _return = 1; + } else { + _return = 4; + }; + } else { //drop it and strip from attachments? + if !(_drop) exitWith {_return = 4;}; //drop not allowed + /* //Delete this block if no issues with dropping on ground + {//Drop equipped items first + _x call _fnc_dropItem; + player removePrimaryWeaponItem _x; + }forEach primaryWeaponItems player; + { + _x call _fnc_dropItem; + }forEach primaryWeaponMagazine player; + */ + _equipped call _fnc_dropItem; + player removeWeaponGlobal _equipped; + _return = 2; //success, but dropped + }; + if (_forceEquip && _return != 4) then {//Equip new weapon after old one removed + _idx = _item call _fnc_findItemInContainers; + [_idx,_slot] call _fnc_moveWeaponFromContainer; + }; + } else { + //Equip weapon + _idx = _item call _fnc_findItemInContainers; + [_idx,_slot] call _fnc_moveWeaponFromContainer; + _return = 1; //success + }; +}; + +_fnc_dropAssign= { + private ["_equipped"]; + params ["_equipped"]; + + if (!_itemInInventory && (_item != _equipped)) exitWith {_return = 3}; + + if (_equipped != "") then { + if (player canAdd _equipped) then { + _container = _equipped call _fnc_canMoveToContainer; + + if (_container != 4) then { + player unassignItem _equipped; + _return = 1; + } else { + _return = 4; + }; + } else { + if !(_drop) exitWith {_return = 4;}; + _equipped call _fnc_dropItem; + player removeItem _equipped; + _return = 2; + }; + if (_forceEquip && _return != 4) then { + player assignItem _item; + }; + } else { + player assignItem _item; + _return = 1; + }; +}; +_fnc_MoveShellToContainer = { + private ["_container"]; + params ["_container"]; + + _temp = _loadout select 0 select 5; + _temp2 = [(_temp select 0), 1, (_temp select 1)]; + if ((_temp select 1) > 0) then { //only move if ammo not empty, delete otherwise + ((_loadout select (_container + 3)) select 1) append [_temp2]; //cut out from above comment, looks like appending alone works great + }; + (_loadout select 0) set [5,[]]; + player setUnitLoadout _loadout; +}; + +_fnc_moveShellFromContainer = { + private ["_idx","_container","_sIdx"]; //_dIdx can only be 0, 1 and 2 + params ["_idx"]; + _idx params ["_container","_sIdx","_found"]; + + if (_found) then { + _temp = ((_loadout select (_container + 3)) select 1) select _sIdx; + + if ((_temp select 1) > 1) then { + _cnt = (((_loadout select (_container + 3)) select 1) select _sIdx) select 1; + (((_loadout select (_container + 3)) select 1) select _sIdx) set [1,_cnt - 1]; + } else { + ((_loadout select (_container + 3)) select 1) deleteAt _sIdx; + }; + (_loadout select 0) set [5,[_temp select 0,_temp select 2]]; + player setUnitLoadout _loadout; + }; +}; + +_fnc_dropEquipShells = { + private ["_equipped"]; + params ["_equipped"]; + + if (!_itemInInventory && (_item != _equipped)) exitWith {_return = 3}; + + if (_equipped != "") then { + if (player canAdd _equipped) then { + _container = _equipped call _fnc_canMoveToContainer; + + if (_container != 4) then { + [_container] call _fnc_MoveShellToContainer; + _return = 1; + } else { + _return = 4; + }; + } else { + if !(_drop) exitWith {_return = 4;}; + _equipped call _fnc_dropItem; + (_loadout select 0) set [5,[]]; + player setUnitLoadout _loadout; + _return = 2; + }; + if (_forceEquip && _return != 4) then { + _idx = _item call _fnc_findItemInContainers; + [_idx,_slot] call _fnc_moveShellFromContainer; + player playAction "reloadMagazine"; + }; + } else { + _idx = _item call _fnc_findItemInContainers; + [_idx,_slot] call _fnc_moveShellFromContainer; + player playAction "reloadMagazine"; + _return = 1; + }; + _muzzle = (getArray (configFile >> "CfgWeapons" >> (primaryWeapon player) >> "muzzles")); + player selectWeapon (_muzzle select 1); +}; +_fnc_findAccessorySlot = { + _item = toLower _item; + + private ["_found","_slot","_accessory","_compatibleMuzzles","_compatibleCows","_compatiblePointers","_compatibleBipods"]; + _slot = 0; + _accessory = 0; + _found = false; + { + _slot = _foreachIndex; + _compatibleMuzzles = getArray(configFile >> "CfgWeapons" >> _x >> "WeaponSlotsInfo" >> "MuzzleSlot" >> "compatibleItems"); + _compatibleCows= getArray(configFile >> "CfgWeapons" >> _x >> "WeaponSlotsInfo" >> "CowsSlot" >> "compatibleItems"); + _compatiblePointers = getArray(configFile >> "CfgWeapons" >> _x >> "WeaponSlotsInfo" >> "PointerSlot" >> "compatibleItems"); + _compatibleBipods = getArray(configFile >> "CfgWeapons" >> _x >> "WeaponSlotsInfo" >> "UnderBarrelSlot" >> "compatibleItems"); + + for "_i" from 0 to (count _compatibleMuzzles) do { + _compatibleMuzzles set [_i,toLower (_compatibleMuzzles select _i)]; + }; + for "_i" from 0 to (count _compatibleCows) do { + _compatibleCows set [_i,toLower (_compatibleCows select _i)]; + }; + for "_i" from 0 to (count _compatiblePointers) do { + _compatiblePointers set [_i,toLower (_compatiblePointers select _i)]; + }; + for "_i" from 0 to (count _compatibleBipods) do { + _compatibleBipods set [_i,toLower (_compatibleBipods select _i)]; + }; + + if (_item in _compatibleMuzzles) exitWith {_found = true; _accessory = 1}; + if (_item in _compatibleCows) exitWith {_found = true; _accessory = 3}; + if (_item in _compatiblePointers) exitWith {_found = true; _accessory = 2}; + if (_item in _compatibleBipods) exitWith {_found = true; _accessory = 6}; + } forEach [(primaryWeapon player),(secondaryWeapon player),(handgunWeapon player)]; + + [_found,_slot,_accessory] +}; + +_fnc_dropEquipAccessories = { + + _properties = call _fnc_findAccessorySlot; + _properties params ["_found","_slot","_accessory"]; + + if !_found exitWith {_return = 5}; + + _itemsPlayer = (primaryWeaponItems player + secondaryWeaponItems player + handgunItems player); + for "_i" from 0 to (count _itemsPlayer) do { + _itemsPlayer set [_i,toLower (_itemsPlayer select _i)]; + }; + _item = toLower _item; + _itemEquipped = _item in _itemsPlayer; + _equipped = (_loadout select _slot) select _accessory; + + if (!_itemInInventory && !_itemEquipped) exitWith {_return = 3}; + if (_equipped != "") then { + _equipped = (_loadout select _slot) select _accessory; + if (player canAdd _equipped) then { + (_loadout select _slot) set [_accessory,""]; + player setUnitLoadout _loadout; + player addItem _equipped; + _return = 1; + } else { + if !(_drop) exitWith {_return = 4;}; + _equipped call _fnc_dropItem; + (_loadout select _slot) set [_accessory,""]; + player setUnitLoadout _loadout; + _return = 1; + }; + if (((toLower _equipped) != (toLower _item)) || _forceEquip && _return != 4) then { + (_loadout select _slot) set [_accessory,_item]; + player setUnitLoadout _loadout; + player addItem _equipped; + player removeItem _item; + }; + } else { + (_loadout select _slot) set [_accessory,_item]; + player setUnitLoadout _loadout; + player removeItem _item; + _return = 1; + }; + + player selectWeapon ((_loadout select _slot) select 0); + if !(["CfgEpochClient", "Fav_FastWeaponSwitching", false] call EPOCH_fnc_returnConfigEntryV2) then { + player playAction "reloadMagazine"; + }; + _return + /* + _slot = primary 0, second 1, hand 2 + _accessory = silencer 1, laser 2, optics 3 + */ +}; +/* + + +*/ +//Main +switch _slot do { + case 3: + { + [(primaryWeapon player),0] call _fnc_dropEquipWeapon; + }; + case 4: + { + [(secondaryWeapon player),1] call _fnc_dropEquipWeapon; + }; + case 5: + { + [(handgunWeapon player),2] call _fnc_dropEquipWeapon; + }; + case 6: //accesories + { + _item call _fnc_dropEquipAccessories; + }; + case 7: //toolbelt + { + if (_item in (assignedItems player)) then { + switch _item do { + case "ItemGPS": + { + //can't find a way to display it in A3 + "Use [Right Ctrl] + M to toggle GPS" call epoch_message; + }; + case "ItemMap": + { + openMap true; + }; + case "ItemCompass": + { + //can't find a way to display it in A3 + "Use [K] to toggle Compass" call epoch_message; + }; + case "ItemWatch": + { + //can't find a way to display it in A3 + "Use [O] to toggle watch" call epoch_message; + }; + case "ItemGeigerCounter_EPOCH": + { + call epoch_geiger_show_hide; + }; + case default + { + //do stuff with radios here + if (_item in ["EpochRadio0","EpochRadio1","EpochRadio2","EpochRadio3","EpochRadio4","EpochRadio5","EpochRadio6","EpochRadio7","EpochRadio8","EpochRadio9"]) then {_item call EPOCH_custom_radioActions}; + }; + + }; + } else { + _item call _fnc_dropAssign; + }; + }; + case 8: //headgear + { + (headgear player) call _fnc_dropAssign; + }; + case 9: //hmd + { + (hmd player) call _fnc_dropAssign; + }; + case 10: //bino + { + [(binocular player),8] call _fnc_dropEquipWeapon; + }; + case 11: //goggles + { + (hmd player) call _fnc_dropAssign; + }; + case 12: //mines + { + private ["_allMuzzles","_muzzle","_found","_mags"]; + if (_itemInInventory) then { + _allMuzzles = getArray (configFile >> "CfgWeapons" >> "Put" >> "Muzzles"); + + _muzzle = ""; + _found = false; + { + _mags = getArray (configFile >> "CfgWeapons" >> "Put" >> _x >> "magazines"); + _muzzle = _x; + { + if (_x isEqualTo _item) exitWith {_found = true}; + } forEach _mags; + if (_found) exitWith {}; + } forEach _allMuzzles; + + player playActionNow "PutDown"; + player selectWeapon _muzzle; + player fire [_muzzle, _muzzle, _item]; + player setWeaponReloadingTime [player, _muzzle, 0]; + }; + }; + case 16: //Grenade launcher shells. + { + _equipped = (primaryWeaponMagazine player) param [1,""]; + _equipped call _fnc_dropEquipShells; + }; +}; + +_return diff --git a/Sources/epoch_code/compile/inventory/EPOCH_initUI.sqf b/Sources/epoch_code/compile/inventory/EPOCH_initUI.sqf index 288d56de..96793d19 100644 --- a/Sources/epoch_code/compile/inventory/EPOCH_initUI.sqf +++ b/Sources/epoch_code/compile/inventory/EPOCH_initUI.sqf @@ -28,6 +28,8 @@ private ["_bar","_bar_compare","_color","_colorCompare","_container","_display", //[[[end]]] disableSerialization; +[] spawn epoch_favBar_inventory; + EPOCH_InteractedItem = []; params ["_unit","_targetContainer","_secondaryContainer"]; EPOCH_targetContainer = _targetContainer; diff --git a/Sources/epoch_code/compile/inventory/EPOCH_itemInteractClick.sqf b/Sources/epoch_code/compile/inventory/EPOCH_itemInteractClick.sqf index db26c8d0..74af2224 100644 --- a/Sources/epoch_code/compile/inventory/EPOCH_itemInteractClick.sqf +++ b/Sources/epoch_code/compile/inventory/EPOCH_itemInteractClick.sqf @@ -3,7 +3,7 @@ By Aaron Clark - Epoch Mod */ //[[[cog import generate_private_arrays ]]] -private ["_activeControl","_bg","_btn_arr","_buffer","_buttonTXT","_button_gen","_button_texts","_cfgItemInteractions","_config","_control","_data","_display","_interactActions","_interactOption","_magCount","_pos","_start_idc","_type","_y2d"]; +private ["_CfgEpochClient","_Suppressed","_activeControl","_bg","_btn_arr","_buffer","_buttonTXT","_button_gen","_button_texts","_cfgItemInteractions","_config","_control","_data","_display","_interactActions","_interactOption","_magCount","_pos","_start_idc","_type","_y2d"]; //[[[end]]] _button_texts = []; @@ -21,6 +21,8 @@ _buttonTXT = ""; _magCount = 1; _interactActions = []; _config = (configfile >> "CfgWeapons" >> _data); +_CfgEpochClient = 'CfgEpochClient' call EPOCH_returnConfig; +_Suppressed = getarray (_CfgEpochClient >> "SuppressedCraftingItems"); // _cfgItemInteractions = (('CfgItemInteractions' call EPOCH_returnConfig) >> _data); _cfgItemInteractions = ["CfgItemInteractions", _data] call EPOCH_returnConfigV2; if (isClass (_config)) then { @@ -29,6 +31,7 @@ if (isClass (_config)) then { _buttonTXT = getText(_cfgItemInteractions >> "interactText"); _interactActions = getArray(_cfgItemInteractions >> "interactActions"); } else { + if (EPOCH_AdvancedVehicleRepair_Enabled && _data in ["VehicleRepair","VehicleRepairLg"]) exitwith {}; _config = (configfile >> "CfgMagazines" >> _data); _type = getNumber (_config >> "type"); _interactOption = getNumber (_cfgItemInteractions >> "interactAction"); @@ -53,13 +56,33 @@ if (_magCount > 1) then { }; _config = 'CfgCrafting' call EPOCH_returnConfig; -if (isClass (_config >> _data)) then { - EPOCH_CraftingItem = EPOCH_InteractedItem select 0; - _button_texts pushBack ["CRAFT","EPOCH_CraftingItem call EPOCH_crafting_load;"]; -} else { - EPOCH_CraftingItem = ""; +if (isClass (_config >> _data) && !(_data in _Suppressed)) then { + EPOCH_CraftingItem = EPOCH_InteractedItem select 0; + _button_texts pushBack ["CRAFT","EPOCH_CraftingItem call EPOCH_crafting_load;"]; +} +else { + EPOCH_CraftingItem = ""; }; +/* Moved to DynaMenu +_config = 'CfgVehicleUpgrades' call EPOCH_returnConfig; +if (isClass (_config >> _data)) then { + { + if (isclass (_config >> _data >> (typeof _x))) exitwith { + EPOCH_UpgradeVehicle = [_data,_x]; + _reqMaterials = getArray (_config >> _data >> (typeof _x) >> "ReqMaterials"); + _itemtxt = "required: "; + { + _itemtxt = _itemtxt + str (_x select 0) + ((_x select 1) call EPOCH_itemDisplayName) + ", "; + } foreach _reqMaterials; + _txt1 = format ["Upgrade %1", (typeof _x) call EPOCH_itemDisplayName]; + _txt2 = "EPOCH_UpgradeVehicle call EPOCH_Client_UpgradeVehicle;"; + _button_texts pushBack [_txt1,_txt2]; + }; + } foreach (nearestobjects [player,["Landvehicle","SHIP","AIR","TANK"],10]); +}; +*/ + if !(_button_texts isEqualTo []) then { _display = ctrlParent (_this select 0); _pos = getMousePosition; diff --git a/Sources/epoch_code/compile/inventory/EPOCH_itemTypeSlot.sqf b/Sources/epoch_code/compile/inventory/EPOCH_itemTypeSlot.sqf new file mode 100644 index 00000000..22d2317b --- /dev/null +++ b/Sources/epoch_code/compile/inventory/EPOCH_itemTypeSlot.sqf @@ -0,0 +1,64 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: Determines which gear slot item goes into + + 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_code/compile/inventory/EPOCH_itemTypeSlot.sqf + + Usage: _item call epoch_itemTypeSlot; + + Returns: [INT] + 0 - unknown + 1 - Epoch items + 2 - Magazines/Ammo + 3 - Primary slot + 4 - Secondary slot + 5 - Handgun slot + 6 - Weapon attachments + 7 - assigned Items (use assignItem) + 8 - Headgear (assignItem works) + 9 - NVGoggles (assignItem works) + 10 - Binocular (assignItem doesn't work) + 11 - goggles (assignItem works) + 12 - Mines + 13 - Vests + 14 - Uniforms + 15 - Backpack + 16 - smoke shells + 17 - Grenades + 17 - Unsure about these, modify script as required, but don't change existing structure +*/ +private ["_item","_cat","_type"]; +params [["_item","",[""]]]; +if (_item == "") exitWith {false}; + +(_item call BIS_fnc_itemType) params ["_cat","_type"]; //For missing types go to https://community.bistudio.com/wiki/BIS_fnc_itemType + +if (_type == "UnknownMagazine") exitWith {1}; +if (_type in ["Bullet","ShotgunShell","Flare"]) exitWith {2}; //Ammo +if (_type in ["MachineGun","AssaultRifle","SniperRifle","Rifle","SubmachineGun"]) exitWith {3}; //Primary Epoch +if (_type == "Throw") exitWith {4}; //secondary epoch +if (_type == "Handgun") exitWith {5}; //handgun epoch +if (_type in ["AccessoryMuzzle","AccessoryPointer","AccessorySights","AccessoryBipod"]) exitWith {6}; //accessories +if (_type in ["Compass","GPS","Map","Radio","Watch"]) exitWith {7}; //assignItem works +if (_type == "Headgear") exitWith {8}; //assignItem works +if (_type == "NVGoggles") exitWith {9}; //assignItem works +if (_type == "Binocular") exitWith {10}; //assignItem doesn't work +if (_type == "Glasses") exitWith {11}; //assignItem doesn't work +if (_cat == "Mine") exitWith {12}; +if (_type == "Vest") exitWith {13}; +if (_type == "Uniform") exitWith {14}; +if (_type == "Backpack") exitWith {15}; +if (_type in ["Shell","SmokeShell"]) exitWith {16}; //Smoke shells for GL +if (_type == "Grenade") exitWith {17}; + +//unsure +if (_type in ["Magazine","Shotgun","FirstAidKit","LaserDesignator","Medikit","MineDetector","Toolkit","VehicleWeapon","Unknown","UnknownEquipment","UnknownWeapon"]) exitWith {18}; + +0 \ No newline at end of file diff --git a/Sources/epoch_code/compile/inventory/EPOCH_selectInventoryItem.sqf b/Sources/epoch_code/compile/inventory/EPOCH_selectInventoryItem.sqf index e8950ce2..e7c63db3 100644 --- a/Sources/epoch_code/compile/inventory/EPOCH_selectInventoryItem.sqf +++ b/Sources/epoch_code/compile/inventory/EPOCH_selectInventoryItem.sqf @@ -46,8 +46,8 @@ if (_data == "") then { _container = switch (_idc) do { case 633: { uniformContainer player }; case 638: { vestContainer player }; - case 632: { EPOCH_targetContainer }; - case 640: { EPOCH_secondaryContainer }; + case 632: { if (isnull EPOCH_secondaryContainer) then {EPOCH_targetContainer} else {EPOCH_secondaryContainer} }; + case 640: { EPOCH_targetContainer }; default { backpackContainer player }; }; _weaponsAndItems = ((getWeaponCargo _container) select 0); diff --git a/Sources/epoch_code/compile/looting/EPOCH_spawnLoot.sqf b/Sources/epoch_code/compile/looting/EPOCH_spawnLoot.sqf index a0871780..c196115b 100644 --- a/Sources/epoch_code/compile/looting/EPOCH_spawnLoot.sqf +++ b/Sources/epoch_code/compile/looting/EPOCH_spawnLoot.sqf @@ -24,12 +24,23 @@ BOOL */ //[[[cog import generate_private_arrays ]]] -private ["_cfgBaseBuilding","_class","_color","_colors","_config","_delete","_dir","_item","_lootBias","_lootLimit","_lootType","_loots","_masterConfig","_pos","_posName","_positions","_possibleCount","_possibleLoots","_randomIndex","_return","_selectedLoot"]; +private ["_cfgBaseBuilding","_class","_color","_colors","_config","_delete","_dir","_item","_lootBias","_lootLimit","_lootType","_loots","_masterConfig","_pos","_posName","_positions","_possibleCount","_possibleLoots","_randomIndex","_return","_selectedConfig","_selectedLoot"]; //[[[end]]] params [["_building",objNull,[objNull]], ["_lootCheckBufferLimit",333], ["_lootObjectLimit",33]]; +_selectedConfig = typeOf _building; +if (_selectedConfig isEqualTo "") then { + (getModelInfo _building) params [["_modelName",""]]; + if (!isnil "_modelName") then { + // replace spaces and periods with underscores + _selectedConfig = (_modelName splitString " .") joinString "_"; + }; +}; + +//diag_log format["DEBUG: _selectedConfig %1",_selectedConfig]; + _masterConfig = 'CfgBuildingLootPos' call EPOCH_returnConfig; -_config = _masterConfig >> (typeOf _building); +_config = _masterConfig >> _selectedConfig; _cfgBaseBuilding = 'CfgBaseBuilding' call EPOCH_returnConfig; // exit with false if building is not lootable diff --git a/Sources/epoch_code/compile/missions/EPOCH_mission_accept.sqf b/Sources/epoch_code/compile/missions/EPOCH_mission_accept.sqf index 4a8d5892..14d84b04 100644 --- a/Sources/epoch_code/compile/missions/EPOCH_mission_accept.sqf +++ b/Sources/epoch_code/compile/missions/EPOCH_mission_accept.sqf @@ -49,7 +49,7 @@ if !(isNull _trader) then { if !(EPOCH_ActiveTraderMission isequalto []) exitwith { EPOCH_ActiveTraderMission params ['','',['_missionname','ERROR']]; _msg = format ['You are already running %1. Finish or cancel it first',_missionname]; - [_msg, 5] call Epoch_message; + [_msg, 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; }; if (_simpleTask > 0) then { //Simple Task @@ -72,11 +72,12 @@ if !(isNull _trader) then { EPOCH_mission_startTime = diag_ticktime; EPOCH_ActiveTraderMission = [_inGameTasksconfig,_taskname,_missionname]; }; + ["TraderMissions",1,true] call EPOCH_client_updatePlayerStat; } else { - [format["Mission Not Allowed !",_menuCondition], 5] call Epoch_message; //Not formatting, is this intended? + [format["Mission Not Allowed !",_menuCondition], 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; //Not formatting, is this intended? }; } else { - ["Trader Lost. Goodbye.", 5] call Epoch_message; + ["Trader Lost. Goodbye.", 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; }; diff --git a/Sources/epoch_code/compile/missions/tasks/traderDebug_resetMissions.sqf b/Sources/epoch_code/compile/missions/tasks/traderDebug_resetMissions.sqf index 2b07e40f..7111a527 100644 --- a/Sources/epoch_code/compile/missions/tasks/traderDebug_resetMissions.sqf +++ b/Sources/epoch_code/compile/missions/tasks/traderDebug_resetMissions.sqf @@ -1,2 +1,2 @@ missionNamespace setVariable ["EPOCH_playerMissionArray",[]]; -["Missions Reset - Re-open Trader Menu.", 5] call Epoch_message; +["Missions Reset - Re-open Trader Menu.", 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; diff --git a/Sources/epoch_code/compile/missions/tasks/traderDiag_name.sqf b/Sources/epoch_code/compile/missions/tasks/traderDiag_name.sqf index 9cc0cf17..8a4fe7cb 100644 --- a/Sources/epoch_code/compile/missions/tasks/traderDiag_name.sqf +++ b/Sources/epoch_code/compile/missions/tasks/traderDiag_name.sqf @@ -15,4 +15,4 @@ _trader setVariable ["traderName",_newName, true]; }; _responseArr = ["I don't know. You can only be regenerated so many times before the memory starts to go..","You again..! Go bother someone else.",format["There was a time when names mattered, call me %1.",name _trader],"My name..? What does it matter.","Hey buddy you rock up here unannounced and suddenly we're friends ? On your bike if you aren't buying or selling.",format["My name.. I am known as %1",name _trader], format["When names mattered I was called %1",name _trader],"I forget.. At least, I try to forget."]; -[selectRandom _responseArr, 5] call Epoch_message; +[selectRandom _responseArr, 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; diff --git a/Sources/epoch_code/compile/missions/tasks/traderDiag_nearPlayers.sqf b/Sources/epoch_code/compile/missions/tasks/traderDiag_nearPlayers.sqf index f1032f66..7752888f 100644 --- a/Sources/epoch_code/compile/missions/tasks/traderDiag_nearPlayers.sqf +++ b/Sources/epoch_code/compile/missions/tasks/traderDiag_nearPlayers.sqf @@ -11,4 +11,4 @@ if (count _plyrs < 2) then { _plyr = selectRandom _plyrs; _trdrMsg = format["%2 %1.",name _plyr, selectRandom ["The last person picked up by the UAV was","I did spot someone earlier, their name was","I heard there was somebody new in the area, "]]; }; -[_trdrMsg, 5] call Epoch_message; +[_trdrMsg, 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; diff --git a/Sources/epoch_code/compile/missions/tasks/traderDiag_nearVehicles.sqf b/Sources/epoch_code/compile/missions/tasks/traderDiag_nearVehicles.sqf index e9ae7971..fdb3d138 100644 --- a/Sources/epoch_code/compile/missions/tasks/traderDiag_nearVehicles.sqf +++ b/Sources/epoch_code/compile/missions/tasks/traderDiag_nearVehicles.sqf @@ -12,4 +12,4 @@ if (count _vehs < 1) then { _dist = _veh distance _plyr; _trdrMsg = format["I know of at least one vehicle within %1m of my current location. It looks like a %2.",_dist, typeof _veh]; }; -[_trdrMsg, 5] call Epoch_message; +[_trdrMsg, 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; diff --git a/Sources/epoch_code/compile/missions/tasks/traderDiag_news.sqf b/Sources/epoch_code/compile/missions/tasks/traderDiag_news.sqf index 12e7162e..fb766bba 100644 --- a/Sources/epoch_code/compile/missions/tasks/traderDiag_news.sqf +++ b/Sources/epoch_code/compile/missions/tasks/traderDiag_news.sqf @@ -1,3 +1,3 @@ private _newsArr = ["My dog was shot. That made me sad.","Business has been quiet since word got out that sappers are in the area.","Looters are expecting too much crypto for all the junk they bring in.","What do I look like ? A newspaper vendor. Go Away.","The sun came up again this morning.. That's good news I suppose.","Keep your dog fed with raw or cooked carcasses.","Sappers are known to be good for their pelts. Just don't get too close to one","Some very strange rumours that a Construct was seen in the mountains. Those things are just bedtime stories to scare kids with.","UAVs are a good source of components.","Some say the nearby town is haunted by malevolent spirits.","I hear the military are helping survivors with air drops. Your loot is always welcome here if you find one.","Dogs can help you find pelts and animal carcasses","I heard that a new vehicle has been seen, some kind of board that you stand on. I personally don't believe the rumours."]; -[selectRandom _newsArr, 5] call Epoch_message; +[selectRandom _newsArr, 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; diff --git a/Sources/epoch_code/compile/missions/tasks/traderDiag_timePlease.sqf b/Sources/epoch_code/compile/missions/tasks/traderDiag_timePlease.sqf index 07d16b32..85a5a010 100644 --- a/Sources/epoch_code/compile/missions/tasks/traderDiag_timePlease.sqf +++ b/Sources/epoch_code/compile/missions/tasks/traderDiag_timePlease.sqf @@ -12,4 +12,4 @@ if(count _min < 2)then{ _min = "0" + _min; }; -[format ["The time is %1:%2.",_hour, _min], 5] call Epoch_message; +[format ["The time is %1:%2.",_hour, _min], 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; diff --git a/Sources/epoch_code/compile/missions/tasks/traderDiag_triggerAirDrop.sqf b/Sources/epoch_code/compile/missions/tasks/traderDiag_triggerAirDrop.sqf index a2e3989c..9b622e85 100644 --- a/Sources/epoch_code/compile/missions/tasks/traderDiag_triggerAirDrop.sqf +++ b/Sources/epoch_code/compile/missions/tasks/traderDiag_triggerAirDrop.sqf @@ -1,6 +1,6 @@ if((random 100) < 6)then{ [] execFSM "\x\addons\a3_epoch_code\System\Event_Air_Drop.fsm"; -["Air Drop Incoming !", 5] call Epoch_message; +["Air Drop Incoming !", 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; }else{ -["Sorry, None Available!", 5] call Epoch_message; +["Sorry, None Available!", 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; }; \ No newline at end of file diff --git a/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Check.sqf b/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Check.sqf index e34f8886..6ea651a2 100644 --- a/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Check.sqf +++ b/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Check.sqf @@ -19,7 +19,7 @@ private ["_ServicePointClasses","_config","_inSP","_nearClasses","_servicepointD _vehicle = vehicle player; if (_vehicle == player) exitwith {false}; -if !(local _vehicle) exitwith {false}; +// if !(local _vehicle) exitwith {false}; if (speed _vehicle > 2 || speed _vehicle < -2) exitwith {false}; if (((getpos _vehicle) select 2) > 1) exitwith {false}; if (!(_vehicle iskindof 'ship') && (((getposasl _vehicle) select 2) < 1)) exitwith {false}; @@ -32,9 +32,23 @@ _ServicePointClasses = ["CfgServicePoint", "ServicePointClasses", []] call EPO if (_servicepoints isequalto [] && _ServicePointClasses isequalto []) exitwith {false}; _inSP = false; -if (({player distance _x < _servicepointDist} count _servicepoints > 0)) then { - _inSP = true; -}; +{ + if (count _x > 3) then { + _x params ["_pos","_dist","_vehtypes"]; + { + if (_vehicle iskindof _x && _vehicle distance _pos < _dist) exitwith { + _inSP = true; + }; + } foreach _vehtypes; + } + else { + if (_vehicle distance _x < _servicepointDist) then { + _inSP = true; + }; + }; + if (_inSP) exitwith {}; +} foreach _servicepoints; + if (!_inSP) then { if !(_ServicePointClasses isequalto []) then { _nearClasses = nearestobjects [_vehicle,_ServicePointClasses,_servicepointDist]; diff --git a/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Repair.sqf b/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Repair.sqf index e5bb788b..3cad657e 100644 --- a/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Repair.sqf +++ b/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Repair.sqf @@ -14,7 +14,7 @@ */ //[[[cog import generate_private_arrays ]]] -private ["_allHitPointsDamage","_allRepaired","_line","_partName","_pos","_repaired","_vehName","_vehtype"]; +private ["_PreventRepairs","_allHitPointsDamage","_allRepaired","_line","_partName","_pos","_repaired","_vehName","_vehtype"]; //[[[end]]] params [['_vehicle',objnull],['_args',[]] ]; _args params [['_costs',0],['_updateInterval',1.2]]; @@ -36,22 +36,31 @@ _vehicle engineOn false; _repaired = []; _allRepaired = true; _allHitPointsDamage = getAllHitPointsDamage _vehicle; +_PreventRepairs = ["CfgServicePoint", "PreventRepairs", []] call EPOCH_fnc_returnConfigEntryV2; { if ((vehicle player != _vehicle) || (!local _vehicle) || speed _vehicle < -2 || speed _vehicle > 2) exitWith { _allRepaired = false; _line = format ['Repairing of %1 stopped', _vehName]; [_line,5] call Epoch_message; }; - if (!(_x in _repaired) && !(_x isequalto "") && (_allHitPointsDamage select 2 select _foreachindex) > 0) then { + _HitPointName = _x; + if (!(_HitPointName in _repaired) && !(_HitPointName isequalto "") && (_allHitPointsDamage select 2 select _foreachindex) > 0) then { _partName = toarray _x; _partName set [0,20]; _partName set [1,45]; _partName set [2,20]; _partName = toString _partName; - _vehicle setHitPointDamage [_x,0]; - _line = format ['Repairing%1 ...', _partName]; - [_line,5] call Epoch_message; - _repaired pushback _x; + if (({_HitPointName == (_x select 0) && (_vehicle getHitPointDamage _HitPointName) >= (_x select 1)} count _PreventRepairs) > 0) then { + _line = format ['Can not Repair full damaged %1', _partName]; + [_line,5] call Epoch_message; + _allRepaired = false; + } + else { + _vehicle setHitPointDamage [_HitPointName,0]; + _line = format ['Repairing%1 ...', _partName]; + [_line,5] call Epoch_message; + }; + _repaired pushback _HitPointName; uisleep _updateInterval; }; } foreach (_allHitPointsDamage select 0); @@ -64,4 +73,8 @@ if (_allRepaired) then { _vehicle setposatl _pos; _line = format ['%1 full Repaired', _vehName]; [_line,5] call Epoch_message; +} +else { + _line = format ['%1 not full Repaired', _vehName]; + [_line,5] call Epoch_message; }; diff --git a/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Start.sqf b/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Start.sqf index 4ac0871c..9c088467 100644 --- a/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Start.sqf +++ b/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Start.sqf @@ -16,7 +16,6 @@ //[[[cog import generate_private_arrays ]]] private ["_Ignatz_SP_Array","_VehiclesAndAmmo","_actionName","_actionTitle","_ammocount","_ammotype","_cost","_costs","_costsFree","_costsText","_fnc_actionTitle","_fnc_getCosts","_magname","_maxammototal","_maxmags","_missingammo","_ownedcompletemags","_refuel_amount","_refuel_costs","_refuel_updateInterval","_reloagmags","_repairTime","_repair_costs","_totalammocount","_turret","_typeName","_vehicle"]; //[[[end]]] - Ignatz_Refuel = nil; Ignatz_Repair = nil; Ignatz_Rearm0 = nil; @@ -24,6 +23,8 @@ Ignatz_Rearm1 = nil; Ignatz_Rearm2 = nil; Ignatz_Rearm3 = nil; +params ["_myturret"]; + _vehicle = vehicle player; _repair_costs = ["CfgServicePoint", "repair_costs", []] call EPOCH_fnc_returnConfigEntryV2; _refuel_costs = ["CfgServicePoint", "refuel_costs", []] call EPOCH_fnc_returnConfigEntryV2; @@ -64,45 +65,45 @@ _fnc_actionTitle = { { if ((typeof _vehicle) == _x select 0) exitwith { { - _ammotype = _x select 0; - _turret = _x select 1; - _maxmags = _x select 2; - _costs = _x select 3; - _ammocount = getNumber (configfile >> "CfgMagazines" >> (_x select 0) >> "count"); - _maxammototal = _maxmags*_ammocount; - _totalammocount = 0; - { - if (_ammotype isequalto (_x select 0) && _turret isequalto (_x select 1)) then { - _totalammocount = _totalammocount + (_x select 2); - }; - } foreach (magazinesAllTurrets _vehicle); - if (_totalammocount < _maxammototal) then { - for '_i' from 1 to 10 do { - if (_totalammocount < _i*_ammocount) exitwith { - _ownedcompletemags = _i-1; - _missingammo = _ammocount*_i - _totalammocount; - _costs = round (_costs/_ammocount*_missingammo); + _x params ["_ammotype","_turret","_maxmags","_costs",["_ammocount",getNumber (configfile >> "CfgMagazines" >> (_x select 0) >> "count")]]; + if (_myturret isequalto _turret) then { + _maxammototal = _maxmags*_ammocount; + _totalammocount = 0; + { + if (_ammotype isequalto (_x select 0) && _turret isequalto (_x select 1)) then { + _totalammocount = _totalammocount + (_x select 2); }; + } foreach (magazinesAllTurrets _vehicle); + if (_totalammocount < _maxammototal) then { + for '_i' from 1 to 10 do { + if (_totalammocount < _i*_ammocount) exitwith { + _ownedcompletemags = _i-1; + _missingammo = _ammocount*_i - _totalammocount; + _costs = round (_costs/_ammocount*_missingammo); + }; + }; + _magname = getText (configFile >> 'CfgMagazines' >> _ammotype >> 'displayName'); + if (_magname isequalto '') then { + _magname = _ammotype; + }; + _reloagmags = _ownedcompletemags+1; + _actionTitle = format['Rearm %1 with %2 round %3 (%4 Crypto)',getText (configFile >> 'Cfgvehicles' >> typeOf _vehicle >> 'displayName'),_missingammo,_magname, _costs]; + _Ignatz_SP_Array pushback [_actionTitle,[_vehicle,_ammotype,_turret,_reloagmags,_ammocount,_costs]]; }; - _magname = getText (configFile >> 'CfgMagazines' >> _ammotype >> 'displayName'); - if (_magname isequalto '') then { - _magname = _ammotype; - }; - _reloagmags = _ownedcompletemags+1; - _actionTitle = format['Rearm %1 with %2 round %3 (%4 Crypto)',getText (configFile >> 'Cfgvehicles' >> typeOf _vehicle >> 'displayName'),_missingammo,_magname, _costs]; - _Ignatz_SP_Array pushback [_actionTitle,[_vehicle,_ammotype,_turret,_reloagmags,_ammocount,_costs]]; }; } foreach (_x select 1); }; } foreach _VehiclesAndAmmo; -_costs = [_vehicle, _refuel_costs] call _fnc_getCosts; -_actionTitle = [format['Refuel %1',getText (configFile >> 'Cfgvehicles' >> typeOf _vehicle >> 'displayName')], _costs] call _fnc_actionTitle; -Ignatz_Refuel = [_actionTitle,[_vehicle,[_costs, _refuel_updateInterval,_refuel_amount]] ]; +if (player == driver _vehicle) then { + _costs = [_vehicle, _refuel_costs] call _fnc_getCosts; + _actionTitle = [format['Refuel %1',getText (configFile >> 'Cfgvehicles' >> typeOf _vehicle >> 'displayName')], _costs] call _fnc_actionTitle; + Ignatz_Refuel = [_actionTitle,[_vehicle,[_costs, _refuel_updateInterval,_refuel_amount]]]; -_costs = [_vehicle, _repair_costs] call _fnc_getCosts; -_actionTitle = [format['Repair %1',getText (configFile >> 'Cfgvehicles' >> typeOf _vehicle >> 'displayName')], _costs] call _fnc_actionTitle; -Ignatz_Repair = [_actionTitle,[_vehicle,[_costs, _repairTime]] ]; + _costs = [_vehicle, _repair_costs] call _fnc_getCosts; + _actionTitle = [format['Repair %1',getText (configFile >> 'Cfgvehicles' >> typeOf _vehicle >> 'displayName')], _costs] call _fnc_actionTitle; + Ignatz_Repair = [_actionTitle,[_vehicle,[_costs, _repairTime]]]; +}; if (count _Ignatz_SP_Array > 0) then {Ignatz_Rearm0 = _Ignatz_SP_Array select 0;}; if (count _Ignatz_SP_Array > 1) then {Ignatz_Rearm1 = _Ignatz_SP_Array select 1;}; if (count _Ignatz_SP_Array > 2) then {Ignatz_Rearm2 = _Ignatz_SP_Array select 2;}; diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientInit.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientInit.sqf index 1f822284..b07ee0af 100644 --- a/Sources/epoch_code/compile/setup/EPOCH_clientInit.sqf +++ b/Sources/epoch_code/compile/setup/EPOCH_clientInit.sqf @@ -23,14 +23,15 @@ */ EPOCH_buildMode = 0; EPOCH_buildDirection = 0; +EPOCH_buildDirectionPitch = 0; +EPOCH_buildDirectionRoll = 0; +EPOCH_target_attachedTo = player; EPOCH_debugMode = false; EPOCH_snapDirection = 0; EPOCH_stabilityTarget = objNull; EPOCH_equippedItem_PVS = []; -EPOCH_nearPower = false; EPOCH_pendingP2ptradeTarget = objNull; EPOCH_lastNPCtradeTarget = objNull; -EPOCH_clientAliveTimer = diag_tickTime; EPOCH_lastJumptime = diag_tickTime; EPOCH_lastAGTime = diag_tickTime; EPOCH_lastMineRocks = diag_tickTime; @@ -42,7 +43,6 @@ EPOCH_arr_snapPoints = []; EPOCH_prevTarget = objNull; EPOCH_interactOption = 0; EPOCH_playerStaminaMax = 100; -EPOCH_playerEnergyMax = 2500; { missionNamespace setVariable [format ["EPOCH_player%1",_x],EPOCH_defaultVars select _forEachIndex]; diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf index 91097b52..98040de3 100644 --- a/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf +++ b/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf @@ -35,6 +35,11 @@ _keyMap = ["Volume + (ctrl)","EPOCH_keysVolumeUp",0x0D], ["Volume - (ctrl)","EPOCH_keysVolumeDown",0x0C], + ["Favorite Bar 1", "EPOCH_keysfav1", 0x02], + ["Favorite Bar 2", "EPOCH_keysfav2", 0x03], + ["Favorite Bar 3", "EPOCH_keysfav3", 0x04], + ["Favorite Bar 4", "EPOCH_keysfav4", 0x05], + ["Favorite Bar 5", "EPOCH_keysfav5", 0x06], ["Build: Mode 1", "EPOCH_keysBuildMode1", 2], // ["Build: Mode 2", "EPOCH_keysBuildMode2", 3], // ["Build: Direction", "EPOCH_keysBuildDir", 4], @@ -46,9 +51,16 @@ _keyMap = ["Build: Move LEFT", "EPOCH_keysBuildMovL", 0xD2], ["Build: Move RIGHT", "EPOCH_keysBuildMovR", 0xD3], ["Build: Rotate LEFT", "EPOCH_keysBuildRotL", 0x12], - ["Build: Rotate RIGHT", "EPOCH_keysBuildRotR", 0x10] + ["Build: Rotate RIGHT", "EPOCH_keysBuildRotR", 0x10], + ["Build: Vector LEFT", "eXpoch_keysVectorTiltL", 0xCB], + ["Build: Vector RIGHT", "eXpoch_keysVectorTiltR", 0xCD], + ["Build: Vector AWAY", "eXpoch_keysVectorTiltAwy", 0xC8], + ["Build: Vector TOWARD", "eXpoch_keysVectorTiltTwd", 0xD0], + ["Build: Reset Object", "eXpoch_keysVectorResetObject", 0x4C] ]; +_keyMap call EPOCH_custom_KeyMap; + switch (_args) do { case 0: //load variables { diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf index 31b31648..275d195e 100644 --- a/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf +++ b/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf @@ -24,7 +24,7 @@ NOTHING */ //[[[cog import generate_private_arrays ]]] -private ["_prevPlayerObject"]; +private ["_playerBloodPKeyFinal","_prevPlayerObject"]; //[[[end]]] params [ ["_playerObject",objNull,[objNull]], @@ -57,6 +57,14 @@ if !(alive player && alive _playerObject && !isPlayer _playerObject) then { Epoch_canBeRevived = false; Epoch_personalToken = _personalToken; + // reset blood Pressure to warning level + _playerBloodPKeyFinal = "EPOCH_playerBloodP"; + if !(isNil "_playerBloodPKey") then {_playerBloodPKeyFinal = _playerBloodPKey}; + missionNamespace setVariable [_playerBloodPKeyFinal, 120]; + + // Wait until _playerObject is local before adding Rating and EH's + waituntil {local _playerObject}; + // restart masterloop [] spawn EPOCH_masterLoop; [5, 100] call EPOCH_niteLight; @@ -68,12 +76,9 @@ if !(alive player && alive _playerObject && !isPlayer _playerObject) then { player removeEventHandler [_x, 0]; player addEventHandler [_x,(["CfgEpochClient", _x, ""] call EPOCH_fnc_returnConfigEntryV2)]; } forEach (["CfgEpochClient", "addEventHandler", []] call EPOCH_fnc_returnConfigEntryV2); - - // reset blood Pressure to warning level - EPOCH_playerBloodP = 120; }; } else { deleteVehicle _playerObject; }; -true call EPOCH_pushCustomVar; +EPOCH_forceUpdateNow = true; diff --git a/Sources/epoch_code/compile/setup/EPOCH_client_rejectPlayer.sqf b/Sources/epoch_code/compile/setup/EPOCH_client_rejectPlayer.sqf index 7e005660..56bd0485 100644 --- a/Sources/epoch_code/compile/setup/EPOCH_client_rejectPlayer.sqf +++ b/Sources/epoch_code/compile/setup/EPOCH_client_rejectPlayer.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/setup/EPOCH_client_rejectPlayer.sqf Example: - call EPOCH_clientInit; + true remoteExec ['EPOCH_client_rejectPlayer',_player]; Parameter(s): _this: BOOL - true = set bad publicVariable to server forces kick diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf index e1afb736..54580632 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf @@ -1,10 +1,11 @@ // init -_forceUpdate = false; _forceBloodRise = false; +_forceBloodDrop = false; _forceFatigue = false; _allowBloodDrop = false; _forceStaminaDrop = false; -_warnbloodPressure = EPOCH_playerBloodP > 120; +_playerBloodP = missionNamespace getVariable [_playerBloodPKey, _playerBloodPDefault]; +_warnbloodPressure = _playerBloodP > 120; _increaseStamina = true; _val = 0; @@ -18,9 +19,9 @@ if (!isNull _cursorTarget && {!(EPOCH_target isEqualTo _cursorTarget)}) then { if (isClass(_interaction)) then { _currentTargetMode = getNumber (_interaction >> "interactMode"); _allowTarget = switch (getNumber (_interaction >> "aliveState")) do { - case 1: {!(alive _cursorTarget)}; + case 1: {!(alive _cursorTarget)}; case 2: {(alive _cursorTarget)}; - default {true}; + default {true}; }; if (_allowTarget) then { _currentTarget = _cursorTarget; @@ -44,15 +45,15 @@ EPOCH_currentTargetMode = _currentTargetMode; // dynamic HUD start { _x params [["_selectedVar",[]],["_HUDclass","topRight"],["_ctrlText",""],["_criticalAttributes",[]]]; - _selectedVar params [["_selVarName",""],["_selVarType",""],["_selVarSubData",""],["_extraLogicRaw",[]],["_customVarLimits",[]]]; + _selectedVar params [["_selVarName",""],["_selVarType",""],["_selVarSubData",""],["_extraLogicRaw",[]],["_selVarLimits",[]]]; - _varIndex = EPOCH_customVars find _selVarName; - if (_varIndex != -1 || !(_customVarLimits isEqualTo [])) then { - if (_customVarLimits isEqualTo []) then { - _customVarLimits = EPOCH_customVarLimits select _varIndex; + _varIndex = _customVarNames find _selVarName; + if (_varIndex != -1 || !(_selVarLimits isEqualTo [])) then { + if (_selVarLimits isEqualTo []) then { + _selVarLimits = _customVarLimits select _varIndex; }; - _currentVarVal = [_selVarName,_varIndex,_selVarType,_selVarSubData] call _fnc_returnHudVar; - _customVarLimits params [["_playerLimitMax",100],["_playerLimitMin",0],["_playerWarnLimit",101],["_playerCriticalLimit",101],["_playerWarnLow",0],["_playerCriticalLow",0]]; + _currentVarVal = [_selVarName,_varIndex,_selVarType,_selVarSubData] call EPOCH_fnc_returnHudVar; + _selVarLimits params [["_playerLimitMax",100],["_playerLimitMin",0],["_playerWarnLimit",101],["_playerCriticalLimit",101],["_playerWarnLow",0],["_playerCriticalLow",0]]; _extraLogic = false; if !(_extraLogicRaw isEqualTo []) then { @@ -62,8 +63,8 @@ EPOCH_currentTargetMode = _currentTargetMode; if (_extraLogicType isEqualType []) then { _extraLogicType params [["_extraLogicVarName",""],["_extraLogicType",""],["_extraLogicDefaultValue",""]]; }; - _extraVarIndex = EPOCH_customVars find _extraLogicVarName; - _extraLogic = [([_extraLogicVarName,_extraVarIndex,_extraLogicType,_extraLogicDefaultValue] call _fnc_returnHudVar),_extraLogicCond,_extraLogicData] call _fnc_arrayToLogic; + _extraVarIndex = _customVarNames find _extraLogicVarName; + _extraLogic = [([_extraLogicVarName,_extraVarIndex,_extraLogicType,_extraLogicDefaultValue] call EPOCH_fnc_returnHudVar),_extraLogicCond,_extraLogicData] call EPOCH_fnc_arrayToLogic; }; if (_playerLimitMax isEqualType "") then { @@ -88,10 +89,14 @@ EPOCH_currentTargetMode = _currentTargetMode; _curCtrl ctrlSetText _ctrlText; _critical = (_criticalHigh || _criticalLow); if (_critical) then { + if ((_criticalAttributes param [0,""]) isEqualType []) then { + _criticalAttributes = _criticalAttributes select _criticalLow; + }; _forceUpdate = "forceUpdate" in _criticalAttributes; _forceFatigue = "forceFatigue" in _criticalAttributes; _forceBloodRise = "forceBloodRise" in _criticalAttributes; - [_curCtrl,0.55] call epoch_2DCtrlHeartbeat; + _forceBloodDrop = "forceBloodDrop" in _criticalAttributes; + [_curCtrl,0.55] call epoch_2DCtrlHeartbeat; }; // todo make this reversable or even limited to a color range. _color = [_playerLimitMin,_playerLimitMax,_currentVarVal,1] call EPOCH_colorRange; @@ -105,7 +110,8 @@ EPOCH_currentTargetMode = _currentTargetMode; if (_forceBloodRise || _forceFatigue) then { _increaseStamina = false; } else { - if (EPOCH_playerStamina > 0 && !_panic) then { + _playerStamina = missionNamespace getVariable [_playerStaminaKey, _playerStaminaDefault]; + if (_playerStamina > 0 && !_panic) then { _allowBloodDrop = true; }; }; @@ -121,19 +127,20 @@ if (_forceFatigue) then { // force Blood Pressure Rise if (_forceBloodRise) then { - EPOCH_playerBloodP = (EPOCH_playerBloodP + 0.05) min 190; + _playerBloodP = [_playerBloodPKey, 0.05, _playerBloodPMax , _playerBloodPMin] call EPOCH_fnc_setVariableLimited; } else { - if (_allowBloodDrop) then { - // allow player to bleed out - _lowerBPlimit = [100,0] select (isBleeding player); - EPOCH_playerBloodP = EPOCH_playerBloodP - 1 max _lowerBPlimit; + if (_allowBloodDrop || _forceBloodDrop) then { + // allow player to bleed out or die from hypothermia + _lowerBPlimit = [100,0] select (isBleeding player || _forceBloodDrop); + _playerBloodP = [_playerBloodPKey, -1, _playerBloodPMax , _lowerBPlimit] call EPOCH_fnc_setVariableLimited; }; }; // check if player On Foot -if (isNull objectParent player) then { +_isOnFoot = isNull objectParent player; +if (_isOnFoot) then { _val = log(abs(speed player)); - _staminaThreshold = [0.7,0.3] select EPOCH_playerIsSwimming; + _staminaThreshold = [0.7,0.3] select (underwater player); if (_val > _staminaThreshold) then { _forceStaminaDrop = true; }; @@ -141,22 +148,76 @@ if (isNull objectParent player) then { // Decrease Stamina if (_forceStaminaDrop) then { - EPOCH_playerStamina = (EPOCH_playerStamina - (_val/4)) max 0; + _playerStamina = [_playerStaminaKey, -(_val/4), EPOCH_playerStaminaMax , 0] call EPOCH_fnc_setVariableLimited; } else { // Increase Stamina if player is not Fatigued if (_increaseStamina && (getFatigue player) == 0) then { - EPOCH_playerStamina = (EPOCH_playerStamina + 0.5) min EPOCH_playerStaminaMax; + // EPOCH_playerStamina = (EPOCH_playerStamina + 0.5) min EPOCH_playerStaminaMax; + _playerStamina = [_playerStaminaKey, 0.5, EPOCH_playerStaminaMax , 0] call EPOCH_fnc_setVariableLimited; }; }; -// force update -if (_forceUpdate) then { - true call EPOCH_pushCustomVar; -}; + // ~ debug if (EPOCH_debugMode) then { - call EPOCH_debugMonitor; + private _hours = floor(servertime/60/60); + private _customVars = ""; + { + if !(_x in ["AliveTime","SpawnArray","HitPoints","MissionArray","NotUsed"]) then { + private _varName = format["EPOCH_player%1",_x]; + private _varNameTmp = call compile format["_player%1Key",_x]; + if !(isNil "_varNameTmp") then {_varName = _varNameTmp}; + private _val = missionNamespace getVariable [_varName,_defaultVarValues select _forEachIndex]; + if (_x == "Temp") then { + _customVars = _customVars + format["%1: %2°F | %3°C
", _x,_val,_val call EPOCH_convertTemp]; + } else { + _customVars = _customVars + format["%1: %2
", _x,_val]; + }; + } + }forEach _customVarNames; + hintSilent parseText format [" + Welcome to Epoch!
+ Current Version: %1
+ Build: %2
+ " + _customVars + " + Karma: %17
+
+ + Fatigue: %3
+ Damage: %4
+ Bleeding: %5
+ Bleed Time: %6
+ Oxygen: %7
+
+ Air Temp: %8
+ Water Temp: %9
+ Rain: %10
+ Overcast: %11
+
+ Hours Alive: %12
+ FPS: %13
+ Server uptime: %14h %15m
+ Server FPS: %16
", + getText(configFile >> "CfgMods" >> "Epoch" >> "version"), + getNumber(missionConfigFile >> "CfgEpochBuild" >> "build"), + (getFatigue player), + (damage player), + (isBleeding player), + (getBleedingRemaining player), + (getOxygenRemaining player), + format ["%1°F | %2°C",EPOCH_CURRENT_WEATHER,EPOCH_CURRENT_WEATHER call EPOCH_convertTemp], + format ["%1°F | %2°C",(EPOCH_CURRENT_WEATHER/2),(EPOCH_CURRENT_WEATHER/2) call EPOCH_convertTemp], + rain, + overcast, + + round(_playerAliveTime/360)/10, + round diag_fps, + _hours, + round((serverTime/60)-(_hours*60)), + if (EPOCH_diag_fps isEqualType 0) then [{EPOCH_diag_fps},{"MANIPULATED"}], + missionNamespace getVariable ["EPOCH_totalKarma",0] + ]; }; // player to player trade loop @@ -185,7 +246,7 @@ if (!isnil "EPOCH_ResetTraderMission") then { EPOCH_ActiveTraderMission = []; _EPOCH_TraderMissionArray = []; _LastMissionTrigger = 0; - ["Mission sucessfully resettet", 5] call Epoch_message; + ["Mission sucessfully resettet", 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; EPOCH_ResetTraderMission = nil; }; @@ -203,7 +264,7 @@ if !(EPOCH_ActiveTraderMission isequalto []) then { if (diag_ticktime > _taskFailTime || call _taskFailedCond) exitwith { if (count _taskFailedDiags > 0) then { _diag = selectRandom _taskFailedDiags; - [format ["%1",_diag], 5] call Epoch_message; + [format ["%1",_diag], 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; }; if !(_taskFailedSQF isequalto '') then { call compile format ["[_taskName,_plyr,_unit,_taskItem] execVM ""%1""",_taskFailedSQF]; @@ -224,7 +285,7 @@ if !(EPOCH_ActiveTraderMission isequalto []) then { if (call _taskCompleteCond) exitwith { if (count _taskCompleteDiags > 0) then { _diag = selectrandom _taskCompleteDiags; - [format ["%1",_diag], 5] call Epoch_message; + [format ["%1",_diag], 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; }; if(count _taskReward > 0) then { [player,Epoch_personalToken,_taskReward,[],objNull,false] remoteExec ["EPOCH_Server_createObject",2]; @@ -266,9 +327,92 @@ if !(EPOCH_ActiveTraderMission isequalto []) then { if (call _taskDiagCond) exitwith { _diag = selectRandom _taskDiag; if !(_diag isequalto "") then { - [format ["%1",_diag], 5] call Epoch_message; + [format ["%1",_diag], 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message; }; _taskDialogues deleteat _foreachindex; }; } foreach _taskDialogues; }; + +// AH use only +if !(isNil "EPOCH_GMODE") then { + { + _varDefault = _gModeVarValues select _foreachindex; + _varName = format["EPOCH_player%1",_x]; + _varNameTmp = call compile format["_player%1Key",_x]; + if !(isNil "_varNameTmp") then {_varName = _varNameTmp}; + missionNamespace setVariable [_varName, _varDefault]; + } forEach _gModeVarNames; +}; + +// Update read only vars +if !(_playerTempKey isEqualTo "EPOCH_playerTemp") then { + EPOCH_playerTemp = missionNamespace getVariable [_playerTempKey, _playerTempDefault]; + EPOCH_playerHunger = missionNamespace getVariable [_playerHungerKey, _playerHungerDefault]; + EPOCH_playerThirst = missionNamespace getVariable [_playerThirstKey, _playerThirstDefault]; + EPOCH_playerAliveTime = missionNamespace getVariable [_playerAliveTimeKey, _playerAliveTimeDefault]; + EPOCH_playerEnergy = missionNamespace getVariable [_playerEnergyKey, _playerEnergyDefault]; + EPOCH_playerWet = missionNamespace getVariable [_playerWetKey, _playerWetDefault]; + EPOCH_playerSoiled = missionNamespace getVariable [_playerSoiledKey, _playerSoiledDefault]; + EPOCH_playerImmunity = missionNamespace getVariable [_playerImmunityKey, _playerImmunityDefault]; + EPOCH_playerToxicity = missionNamespace getVariable [_playerToxicityKey, _playerToxicityDefault]; + EPOCH_playerStamina = missionNamespace getVariable [_playerStaminaKey, _playerStaminaDefault]; + EPOCH_playerBloodP = missionNamespace getVariable [_playerBloodPKey, _playerBloodPDefault]; + EPOCH_playerAlcohol = missionNamespace getVariable [_playerAlcoholKey, _playerAlcoholDefault]; + EPOCH_playerRadiation = missionNamespace getVariable [_playerRadiationKey, _playerRadiationDefault]; + EPOCH_playerNuisance = missionNamespace getVariable [_playerNuisanceKey, _playerNuisanceDefault]; +}; + +// Check for PlayerMarker and Update or Remove it +_config = 'CfgMarkerSets' call EPOCH_returnConfig; +_markerArray = getArray(_config >> 'PlayerMarker' >> 'markerArray'); +_markerName = (_markerArray select 0) select 0; + +if(_markerName in allMapMarkers)then{ + if!('ItemGPS' in (assignedItems player))then{ + ['PlayerMarker'] call EPOCH_fnc_deleteLocalMarkerSet; + if(((getArray(_config >> 'DeathMarker' >> 'markerArray') select 0) select 0) in allMapMarkers)then{ + ['DeathMarker'] call EPOCH_fnc_deleteLocalMarkerSet; + }; + }else{ + { + (_x select 0) setMarkerPosLocal (position player); + if(count(_x) >= 8)then{(_x select 0) setMarkerTextLocal (call compile (_x select 7))}; + }forEach _markerArray; + }; +}; +if(getNumber(('CfgEpochClient' call EPOCH_returnConfig) >> 'mapOnZoomSetMarkerSize') isEqualTo 1)then{ + if(visibleMap)then{ + _mapScale = ctrlMapScale ((findDisplay 12) displayCtrl 51); + _mapMarkers = allMapMarkers; + + if(isNil {EPOCH_lastMapScale})then{EPOCH_lastMapScale = 0}; + + if(_mapScale != EPOCH_lastMapScale)then{ + EPOCH_lastMapScale = _mapScale; + for "_i" from 0 to ((count _mapMarkers) - 1) do { + if(_mapScale != EPOCH_lastMapScale)exitWith{}; + _zoomMarker = _mapMarkers select _i; + private "_markerString"; + _markerString = toArray _zoomMarker; + _markerString resize 6; + if (toString _markerString == "EPOCH_") then { + _mSize = missionNamespace getVariable[_zoomMarker,[0.666,0.666]]; + _adj = 1.666; + _mapScaler = getArray(_config >> "mapScalerPresets"); + { + if(_mapScale <= (_x select 0))then{_adj = (_x select 1)}; + }forEach _mapScaler; + _min = (0.666/_mapScale) min 2.666; + _zoomMarker setMarkerSizeLocal [(((_mSize select 0) / (_mapScale * _adj)) min _min) max 0.666, (((_mSize select 1) / (_mapScale * _adj)) min _min) max 0.666]; + }; + }; + }; + }; +}; + +// force update +if (EPOCH_forceUpdateNow) then { + EPOCH_forceUpdateNow = false; + call _fnc_forceUpdate; +}; diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event2.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event2.sqf index b0b5cfda..b3d078fd 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/Event2.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/Event2.sqf @@ -5,7 +5,7 @@ if !(EPOCH_arr_interactedObjs isEqualTo[]) then { if (damage player != _damagePlayer) then { if (alive player) then { - true call EPOCH_pushCustomVar; + _forceUpdate = true; _damagePlayer = damage player; }; }; @@ -17,40 +17,58 @@ if (damage player != _damagePlayer) then { // 1. number of players // 2. Other sources of drain (Lights) -_energyValue = EPOCH_chargeRate min _energyRegenMax; +_energyValue = _chargeRate min _energyRegenMax; _vehicle = vehicle player; if (_vehicle != player && isEngineOn _vehicle) then { - _energyValue = _energyValue + 5; + if !(_vehicle iskindof "Bicycle") then { + _energyValue = _energyValue + 5; + }; }; - if (currentVisionMode player == 1) then { //NV enabled _energyValue = _energyValue - _energyCostNV; - if (EPOCH_playerEnergy == 0) then { + _playerEnergy = missionNamespace getVariable [_playerEnergyKey, _playerEnergyDefault]; + if (_playerEnergy == 0) then { player action["nvGogglesOff", player]; ["Night Vision Goggles: Need Energy", 5] call Epoch_message; }; }; // Sets visual effect -if (EPOCH_playerAlcohol > 20) then { - _drunkVal = linearConversion [0,100,EPOCH_playerAlcohol,0.1,1,true]; - [(round(_drunkVal * 10)/10), 2] call epoch_setDrunk; +_playerAlcohol = missionNamespace getVariable [_playerAlcoholKey, _playerAlcoholDefault]; +if (_playerAlcohol > 20) then { + _drunkVal = linearConversion [0,100,_playerAlcohol,0.1,1,true]; + [_drunkVal, 2] call epoch_setDrunk; } else { [0, 2] call epoch_setDrunk; }; -EPOCH_playerEnergy = ((EPOCH_playerEnergy + _energyValue) min EPOCH_playerEnergyMax) max 0; - -if !(EPOCH_playerEnergy isEqualTo _prevEnergy) then { - 9993 cutRsc["EpochGameUI3", "PLAIN", 0, false]; - _display3 = uiNamespace getVariable "EPOCH_EpochGameUI3"; - _energyDiff = round(EPOCH_playerEnergy - _prevEnergy); - _diffText = if (_energyDiff > 0) then {format["+%1",_energyDiff]} else {format["%1",_energyDiff]}; - (_display3 displayCtrl 21210) ctrlSetText format["%1/%2 %3", round(EPOCH_playerEnergy), EPOCH_playerEnergyMax, _diffText]; - _prevEnergy = EPOCH_playerEnergy; +// Sets visual effect +_playerRadiation = missionNamespace getVariable [_playerRadiationKey, _playerRadiationDefault]; +if (_playerRadiation > 1) then { + _radiationVal = linearConversion [0,100,_playerRadiation,1,10,true]; + [(ceil _radiationVal)/10, 2] call epoch_setRadiation; +} else { + [0, 2] call epoch_setRadiation; }; -if (EPOCH_playerEnergy == 0) then { +// Geiger Deplete Energy +if (EPOCH_geiger_shown) then { + _energyValue = _energyValue - (["CfgEpochClient", "outOfBoundsRadiation", 10] call EPOCH_fnc_returnConfigEntryV2); +}; + +// Energy Handler +_playerEnergy = [_playerEnergyKey,_energyValue,_playerEnergyMax,_playerEnergyMin] call EPOCH_fnc_setVariableLimited; + +if !(_playerEnergy isEqualTo _prevEnergy) then { + 9993 cutRsc["EpochGameUI3", "PLAIN", 0, false]; + _display3 = uiNamespace getVariable "EPOCH_EpochGameUI3"; + _energyDiff = round(_playerEnergy - _prevEnergy); + _diffText = if (_energyDiff > 0) then {format["+%1",_energyDiff]} else {format["%1",_energyDiff]}; + (_display3 displayCtrl 21210) ctrlSetText format["%1/%2 %3", round(_playerEnergy), _playerEnergyMax, _diffText]; + _prevEnergy = _playerEnergy; +}; + +if (_playerEnergy == 0) then { if (EPOCH_buildMode > 0) then { EPOCH_buildMode = 0; EPOCH_snapDirection = 0; @@ -67,7 +85,7 @@ if !(_attackers isEqualTo[]) then { (_attackers select 0) call EPOCH_client_bitePlayer; _panic = true; } else { - _toxicObjs = player nearobjects["SmokeShellCustom", 6]; + _toxicObjs = player nearobjects["SmokeShellCustom", 12]; if!(_toxicObjs IsEqualTo[]) then { (_toxicObjs select 0) call EPOCH_client_bitePlayer; _panic = true; @@ -76,25 +94,112 @@ if !(_attackers isEqualTo[]) then { }; }; -call EPOCH_fnc_Weather; +// weather stats +_airTemp = EPOCH_CURRENT_WEATHER; +_waterTemp = EPOCH_CURRENT_WEATHER/2; +_warming = true; +_wet = false; +_maxTemp = 98.6; // normal body temp +_increaseWet = 0; +_wetsuit = (getText(configfile >> "cfgweapons" >> uniform player >> "itemInfo" >> "uniformType") == "Neopren"); -// Hunger / Thirst -_HTlossRate = _baseHTLoss; -if (EPOCH_playerStamina < 100) then { - if ((getFatigue player) > 0) then { - _HTlossRate = _HTlossRate + (_HTlossRate*(getFatigue player)); +if (_isOnFoot) then { + if (underwater player) then { + // do nothing if player is wearing a wetsuit + if (!_wetsuit) then { + if (_waterTemp <= 50) then { + _warming = false; + }; + _wet = true; + _increaseWet = 10; + }; + } else { + _playerWet = missionNamespace getVariable [_playerWetKey, _playerWetDefault]; + if (_playerWet > 50 && _airTemp <= 32) then { + _isNearFire = {inflamed _x} count (nearestObjects [player, ["ALL"], 3]); + if (!(call EPOCH_fnc_isInsideBuilding) && _isNearFire == 0) then { + _warming = false; + }; + }; + if (rain >= 0.25) then { + if (!_wetsuit) then { + _isNearFire = { inflamed _x } count(nearestObjects[player, ["ALL"], 3]); + if (!(call EPOCH_fnc_isInsideBuilding) && _isNearFire == 0) then { + _wet = true; + _increaseWet = rain * 10; + }; + }; + }; }; -} else { - _HTlossRate = (_HTlossRate / 2); }; -EPOCH_playerHunger = (EPOCH_playerHunger - _HTlossRate) max 0; -EPOCH_playerThirst = (EPOCH_playerThirst - _HTlossRate) max 0; +// allow player to over heat if air temp is high and player is Fatigued +if ((getFatigue player) >= 0.7 && _airTemp > 100) then { + _maxTemp = _airTemp; +}; +// toxic fever and immunity increase +_playerToxicity = missionNamespace getVariable [_playerToxicityKey, _playerToxicityDefault]; +// _playerImmunity = missionNamespace getVariable [_playerImmunityKey, _playerImmunityDefault]; +if (_playerToxicity > 0) then { + _playerImmunity = [_playerImmunityKey,0.1,_playerImmunityMax,_playerImmunityMin] call EPOCH_fnc_setVariableLimited; + _playerToxicity = [_playerToxicityKey,-0.1,_playerToxicityMax,_playerToxicityMin] call EPOCH_fnc_setVariableLimited; + // allow player to overheat + _maxTemp = _playerTempMax + 10; +}; + +// Body Temp handler +if (_warming) then { + _playerTemp = [_playerTempKey,0.01,_maxTemp,_playerTempMin] call EPOCH_fnc_setVariableLimited; +} else { + _playerTemp = [_playerTempKey,-0.01,_maxTemp,(_playerTempMin - 10)] call EPOCH_fnc_setVariableLimited; +}; + +// wet/dry +if (_wet) then { + _playerWet = [_playerWetKey,_increaseWet,_playerWetMax,_playerWetMin] call EPOCH_fnc_setVariableLimited; + if (_playerWet > 50) then { + _soiledLossRate = 1; + _playerSoiled = [_playerSoiledKey,-_soiledLossRate,_playerSoiledMax,_playerSoiledMin] call EPOCH_fnc_setVariableLimited; + }; +} else { + if (_warming) then { + _wetLossRate = 1; + _playerWet = [_playerWetKey,-_wetLossRate,_playerWetMax,_playerWetMin] call EPOCH_fnc_setVariableLimited; + }; +}; + +// Hunger / Thirst +_hungerlossRate = _baseHungerLoss * _lossMultiplier; +_thirstlossRate = _baseThirstLoss * _lossMultiplier; +_alcoholLossRate = _baseAlcoholLoss * _lossMultiplier; + +// Increase hunger if player is Fatigued +_playerStamina = missionNamespace getVariable [_playerStaminaKey, _playerStaminaDefault]; +if (_playerStamina < 100) then { + if ((getFatigue player) > 0) then { + _hungerlossRate = _hungerlossRate + (_hungerlossRate*(getFatigue player)); + }; +} else { + // reduce hunger loss if player stamina is greater than 100 + _hungerlossRate = (_hungerlossRate / 2); +}; + +// Alcohol Handler +_playerAlcohol = [_playerAlcoholKey,-_alcoholLossRate,_playerAlcoholMax,_playerAlcoholMin] call EPOCH_fnc_setVariableLimited; + +// Hunger Handler +_playerHunger = [_playerHungerKey,-_hungerlossRate,_playerHungerMax,_playerHungerMin] call EPOCH_fnc_setVariableLimited; + +// Thirst Handler +_playerThirst = [_playerThirstKey,-_thirstlossRate,_playerThirstMax,_playerThirstMin] call EPOCH_fnc_setVariableLimited; + +// Nuisance Handler +_playerNuisance = [_playerNuisanceKey,-1,_playerNuisanceMax,_playerNuisanceMin] call EPOCH_fnc_setVariableLimited; + + +// calculate max stamina +EPOCH_playerStaminaMax = (100 * (round(_playerAliveTime/360)/10)) min 2500; + +// process loot call _lootBubble; - -EPOCH_playerStaminaMax = (100 * (round(EPOCH_playerAliveTime/360)/10)) min 2500; - -// downtick Nuisance -(EPOCH_customVarLimits select (EPOCH_customVars find "Nuisance")) params [["_playerLimitMax",100],["_playerLimitMin",0]]; -EPOCH_playerNuisance = ((EPOCH_playerNuisance - 1) min _playerLimitMax) max _playerLimitMin; diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event3.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event3.sqf index f9eb85c9..9d8eefb4 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/Event3.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/Event3.sqf @@ -1,5 +1,11 @@ +// runs every 15 seconds if !(_prevEquippedItem isEqualTo EPOCH_equippedItem_PVS) then { - _EPOCH_15 = _tickTime; _prevEquippedItem = EPOCH_equippedItem_PVS; EPOCH_equippedItem_PVS remoteExec ["EPOCH_server_equippedItem",2]; }; +// force update +if (_forceUpdate || EPOCH_forceUpdate) then { + _forceUpdate = false; + EPOCH_forceUpdate = false; + call _fnc_forceUpdate; +}; diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event5.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event5.sqf index ad85e6c6..956b4b02 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/Event5.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/Event5.sqf @@ -1,20 +1,95 @@ _position = getPosATL player; -EPOCH_nearestLocations = nearestLocations[player, ["NameCityCapital", "NameCity", "Airport"], 300]; +_nearestLocations = nearestLocations[player, _radioactiveLocations, 300]; +EPOCH_nearestLocations = _nearestLocations; +_powerSources = nearestObjects[player, ["Land_spp_Tower_F","Land_wpp_Turbine_V2_F","Land_wpp_Turbine_V1_F","SolarGen_EPOCH","Land_Wreck_Satellite_EPOCH"], _energyRange]; -EPOCH_playerIsSwimming = false; +// TODO: add more sources and config based check instead of global var +// _nearestLocations removed as they don't support getVariable +// All sources used as a temp solution +_allSources = nearestObjects[player, ["All"], _radiatedObjMaxRange]; +_nearbyRadioactiveObjects = _allSources select {(_x getVariable ["EPOCH_Rads", []]) select 0 > 0}; + +// check if player is out of map bounds. +_radsLevel = 0; +_worldSize = worldSize/2; +_outOfBounds = !(player inArea [[_worldSize,_worldSize,0], _worldSize, _worldSize, 0, true ]); + +{ + _location = []; + _LocName = (_x select 0) joinString " "; + { + if( (str _x) == _LocName ) exitwith { _location = _x; }; + } foreach _nearestLocations; + if !(_location isEqualTo []) then { + _x select 1 params ["_str","_intensity"]; + _dist = player distance getPos _location; + _radIntensity = if (_dist <= _intensity) then { + _str / _dist + } else { + 0 + }; + _radsLevel = _radsLevel + _radIntensity; + }; +}foreach EPOCH_radioactiveLocations; + +if (_outOfBounds) then { + // player is out of map bounds, give ten times background rads + ["You are out of the play area!", 5] call Epoch_message; + _radsLevel = _outOfBoundsRadiation; +} else { + // radiated objects or locations nearby + if !(_nearbyRadioactiveObjects isEqualTo []) then { + { + _x getVariable "EPOCH_Rads" params ["_str","_intensity"]; + _dist = player distance _x; + _radIntensity = if (_dist <= _intensity) then { + _str / _dist + } else { + 0 + }; + _radsLevel = _radsLevel + _radIntensity; + }forEach _nearbyRadioactiveObjects; + }; +}; + +//Reduce radiation by 90% +if ("radiation_mask_epoch" in assignedItems player) then { + _radsLevel = _radsLevel - (90 / 100 * _radsLevel); +}; + +//Reduce radiation by 50% for respirators (easy to find loot in construction sites?) +if ("respirator_placeholder" in assignedItems player) then { + _radsLevel = _radsLevel / 2; +}; + +//Reduce % radiation from max armor value possible +_maxArmor = (missionNamespace getVariable ["EPOCH_MAX_ARMOR",[0,0,0,2300]]) select 3; +_currentArmor = ((uniform player) call EPOCH_uniformArmorCalc) + ((vest player) call EPOCH_gearArmorCalc) + ((headgear player) call EPOCH_gearArmorCalc); +_currentArmorPercent = 100 - (_currentArmor / _maxArmor * 100); +_radsLevel = _currentArmorPercent / 100 * _radsLevel; + +//Reduce radiation by 100% TODO: move this to top, no point in doing all this calc if hazmat is on. +if (uniform player == "hazmat_placeholder") then { + _radsLevel = 0; +}; + +// Radiation Handler +if (_radsLevel > 0) then { + // increase rads based on radiation levels + _playerRadiation = [_playerRadiationKey,_radsLevel,_playerRadiationMax,_playerRadiationMin] call EPOCH_fnc_setVariableLimited; +}; if !(surfaceIsWater _position) then { - if (EPOCH_nearestLocations isEqualTo []) then{ - if (count(_position nearEntities["Animal_Base_F", 800]) < 2) then { + if (_nearestLocations isEqualTo []) then{ + if (count(player nearEntities["Animal_Base_F", 800]) < 2) then { call EPOCH_client_loadAnimalBrain; }; }; } else { // spawn shark if player is deep water and not in vehicle - if (vehicle player == player) then{ + if !(_isOnFoot) then{ _offsetZ = ((_position vectorDiff getPosASL player) select 2); - EPOCH_playerIsSwimming = (_offsetZ > 1.7); if (_offsetZ > 50) then { ["GreatWhite_F", player, true] call EPOCH_unitSpawn; }; @@ -22,11 +97,9 @@ if !(surfaceIsWater _position) then { }; // default power state -EPOCH_nearPower = false; -EPOCH_chargeRate = 0; +_chargeRate = 0; // energy Charge from nearby power plants -_powerSources = nearestObjects[player, ["Land_spp_Tower_F","Land_wpp_Turbine_V2_F","Land_wpp_Turbine_V1_F","SolarGen_EPOCH"], _energyRange]; if !(_powerSources isEqualTo[]) then { _totalCapacity = 0; { @@ -46,15 +119,17 @@ if !(_powerSources isEqualTo[]) then { if (_totalCapacity > 0) then { _players = player nearEntities[["Epoch_Male_F", "Epoch_Female_F"], _energyRange]; if (_players isEqualTo []) then { - EPOCH_chargeRate = ceil _totalCapacity; + _chargeRate = ceil _totalCapacity; } else { - EPOCH_chargeRate = ceil (_totalCapacity / (count _players)); + _chargeRate = ceil (_totalCapacity / (count _players)); }; - EPOCH_nearPower = true; }; }; -// downtick Alcohol -EPOCH_playerAlcohol = ((EPOCH_playerAlcohol - 1) min 100) max 0; -EPOCH_playerAliveTime = round(EPOCH_playerAliveTime + (_tickTime - EPOCH_clientAliveTimer)); -EPOCH_clientAliveTimer = _tickTime; +// alive time handler +_playerAliveTime = round(_playerAliveTime + (_tickTime - _clientAliveTimer)); +missionNamespace setVariable [_playerAliveTimeKey, _playerAliveTime]; +_clientAliveTimer = _tickTime; + +// force update after 60 seconds +_forceUpdate = true; diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event6.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event6.sqf index 7d922a60..b84f4ad5 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/Event6.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/Event6.sqf @@ -1 +1,23 @@ -false call EPOCH_pushCustomVar; +_playerNuisance = missionNamespace getVariable [_playerNuisanceKey, _playerNuisanceDefault]; +_playerSoiled = missionNamespace getVariable [_playerSoiledKey, _playerSoiledDefault]; +_spawnChance = ((_playerNuisance + _playerSoiled)/2) max 1; +// add more antagonist spawn chances +if (random _antagonistRndChance < _spawnChance) then { + // selectRandomWeighted arma 1.76 or higher + (selectRandomWeighted _antagonistChances) call EPOCH_unitSpawnIncrease; +}; + + +_spawnUnits = []; +{ + if (_x > 0) then{ + _spawnUnits pushBack(EPOCH_spawnIndex select _forEachIndex); + }; +} forEach (missionNamespace getVariable [_playerSpawnArrayKey, _playerSpawnArrayDefault]); + +diag_log format["DEBUG: _spawnUnits %1",_spawnUnits]; + +// test spawning one antagonist every 10 minutes select one unit at random to spawn +if !(_spawnUnits isEqualTo[]) then{ + (selectRandom _spawnUnits) call EPOCH_unitSpawn; +}; diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event7.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event7.sqf index 6475d6e0..a84e3a9e 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/Event7.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/Event7.sqf @@ -1,25 +1 @@ -_spawnChance = ((EPOCH_playerNuisance + EPOCH_playerSoiled)/2) max 1; -if (random EPOCH_droneRndChance < _spawnChance) then { - "I_UAV_01_F" call EPOCH_unitSpawnIncrease; -}; -if (EPOCH_mod_Ryanzombies_Enabled) then { - if (random EPOCH_zombieRngChance < _spawnChance) then { - ["EPOCH_RyanZombie_1",12] call EPOCH_unitSpawnIncrease; - }; -}; -if (random EPOCH_sapperRndChance < _spawnChance) then { - "Epoch_Sapper_F" call EPOCH_unitSpawnIncrease; -}; -// diag_log format["DEBUG: _spawnChance %1",_spawnChance]; - -_spawnUnits = []; -{ - if (_x > 0) then{ - _spawnUnits pushBack(EPOCH_spawnIndex select _forEachIndex); - }; -} forEach EPOCH_playerSpawnArray; - -// test spawning one antagonist every 10 minutes select one unit at random to spawn -if !(_spawnUnits isEqualTo[]) then{ - (selectRandom _spawnUnits) call EPOCH_unitSpawn; -}; +// runs every 10 minutes diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event8.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event8.sqf new file mode 100644 index 00000000..81003f4f --- /dev/null +++ b/Sources/epoch_code/compile/setup/masterLoop/Event8.sqf @@ -0,0 +1,2 @@ +//Updates favorites bar +call epoch_favBar_refresh; diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event9.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event9.sqf new file mode 100644 index 00000000..d0e77941 --- /dev/null +++ b/Sources/epoch_code/compile/setup/masterLoop/Event9.sqf @@ -0,0 +1,9 @@ +if ('ItemGeigerCounter_EPOCH' in assignedItems player) then { + if (!EPOCH_geiger_mute_counter || !EPOCH_geiger_mute_warning || EPOCH_geiger_shown) then { //only run if geiger activated + _radiatedObjMaxRange call epoch_geiger_simulate; + }; +} else { + if (EPOCH_geiger_shown) then { + call epoch_geiger_show_hide; + }; +}; \ No newline at end of file diff --git a/Sources/epoch_code/compile/setup/masterLoop/init.sqf b/Sources/epoch_code/compile/setup/masterLoop/init.sqf index 744bc874..a78a8759 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/init.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/init.sqf @@ -1,70 +1,183 @@ // make sure we wait for Display #46 -waitUntil {!(isNull (findDisplay 46))}; +waitUntil {!isNull (findDisplay 46) && (!isNil "EPOCH_loadingScreenDone")}; + +// load favBar +'load' spawn epoch_favBar_draw; + +// force update within 15 seconds +EPOCH_forceUpdate = false; +_forceUpdate = false; +// force update within 1 second +EPOCH_forceUpdateNow = false; + +// start alive timer +_clientAliveTimer = diag_tickTime; + +// init player stat vars +_gmVarsInit = ["CfgEpochClient", "gmVars", [["Temp",98.6],["Hunger",500],["Thirst",500],["Toxicity",0],["Stamina",10],["BloodP",100],["Alcohol",0],["Radiation",0]]] call EPOCH_fnc_returnConfigEntryV2; +_gModeVarNames = _gmVarsInit apply {_x param [0,""]}; +_gModeVarValues = _gmVarsInit apply {_x param [1,0]}; + +_customVarsInit = ["CfgEpochClient", "customVarsDefaults", EPOCH_customVarsDefaults] call EPOCH_fnc_returnConfigEntryV2; +_customVarNames = _customVarsInit apply {_x param [0,""]}; +_defaultVarValues = _customVarsInit apply {_x param [1,0]}; +_customVarLimits = _customVarsInit apply {_x param [2,[]]}; + +(_customVarLimits select (_customVarNames find "Temp")) params [["_playerTempMax",100],["_playerTempMin",0]]; +(_defaultVarValues select (_customVarNames find "Temp")) params [["_playerTempDefault",0]]; +(_customVarLimits select (_customVarNames find "Hunger")) params [["_playerHungerMax",100],["_playerHungerMin",0]]; +(_defaultVarValues select (_customVarNames find "Hunger")) params [["_playerHungerDefault",0]]; +(_customVarLimits select (_customVarNames find "Thirst")) params [["_playerThirstMax",100],["_playerThirstMin",0]]; +(_defaultVarValues select (_customVarNames find "Thirst")) params [["_playerThirstDefault",0]]; +(_customVarLimits select (_customVarNames find "Energy")) params [["_playerEnergyMax",100],["_playerEnergyMin",0]]; +(_defaultVarValues select (_customVarNames find "Energy")) params [["_playerEnergyDefault",0]]; +(_customVarLimits select (_customVarNames find "Wet")) params [["_playerWetMax",100],["_playerWetMin",0]]; +(_defaultVarValues select (_customVarNames find "Wet")) params [["_playerWetDefault",0]]; +(_customVarLimits select (_customVarNames find "Soiled")) params [["_playerSoiledMax",100],["_playerSoiledMin",0]]; +(_defaultVarValues select (_customVarNames find "Soiled")) params [["_playerSoiledDefault",0]]; +(_customVarLimits select (_customVarNames find "Immunity")) params [["_playerImmunityMax",100],["_playerImmunityMin",0]]; +(_defaultVarValues select (_customVarNames find "Immunity")) params [["_playerImmunityDefault",0]]; +(_customVarLimits select (_customVarNames find "Toxicity")) params [["_playerToxicityMax",100],["_playerToxicityMin",0]]; +(_defaultVarValues select (_customVarNames find "Toxicity")) params [["_playerToxicityDefault",0]]; +(_customVarLimits select (_customVarNames find "Stamina")) params [["_playerStaminaMax",100],["_playerStaminaMin",0]]; +(_defaultVarValues select (_customVarNames find "Stamina")) params [["_playerStaminaDefault",0]]; +(_customVarLimits select (_customVarNames find "BloodP")) params [["_playerBloodPMax",100],["_playerBloodPMin",0]]; +(_defaultVarValues select (_customVarNames find "BloodP")) params [["_playerBloodPDefault",0]]; +(_customVarLimits select (_customVarNames find "Alcohol")) params [["_playerAlcoholMax",100],["_playerAlcoholMin",0]]; +(_defaultVarValues select (_customVarNames find "Alcohol")) params [["_playerAlcoholDefault",0]]; +(_customVarLimits select (_customVarNames find "Radiation")) params [["_playerRadiationMax",100],["_playerRadiationMin",0]]; +(_defaultVarValues select (_customVarNames find "Radiation")) params [["_playerRadiationDefault",0]]; +(_customVarLimits select (_customVarNames find "Nuisance")) params [["_playerNuisanceMax",100],["_playerNuisanceMin",0]]; +(_defaultVarValues select (_customVarNames find "Nuisance")) params [["_playerNuisanceDefault",0]]; + +(_defaultVarValues select (_customVarNames find "AliveTime")) params [["_playerAliveTimeDefault",0]]; +(_defaultVarValues select (_customVarNames find "HitPoints")) params [["_playerHitPointsDefault",0]]; +(_defaultVarValues select (_customVarNames find "SpawnArray")) params [["_playerSpawnArrayDefault",0]]; +(_defaultVarValues select (_customVarNames find "MissionArray")) params [["_playerMissionArrayDefault",0]]; + +// push inital vars to new gvars +{ + _varDefault = _defaultVarValues select _foreachindex; + _varName = format["EPOCH_player%1",_x]; + _varNameTmp = call compile format["_player%1Key",_x]; + if !(isNil "_varNameTmp") then {_varName = _varNameTmp}; + missionNamespace setVariable [_varName, missionNamespace getVariable [format["EPOCH_player%1",_x], _varDefault]]; +} forEach _customVarNames; + +// only changed within this loop +_playerAliveTime = missionNamespace getVariable [_playerAliveTimeKey, _playerAliveTimeDefault]; + +// init Energy Max +EPOCH_playerEnergyMax = _playerEnergyMax; + +// inline function to sync player stats to server +_fnc_forceUpdate = { + private _customVars = []; + { + private _varName = format["EPOCH_player%1",_x]; + private _varNameTmp = call compile format["_player%1Key",_x]; + if !(isNil "_varNameTmp") then {_varName = _varNameTmp}; + _customVars pushBack (missionNamespace getVariable [_varName,_defaultVarValues select _foreachindex]); + } forEach _customVarNames; + [player,_customVars,Epoch_personalToken] remoteExec ["EPOCH_fnc_savePlayer",2]; +}; + +// disable fuel sources client side. +{_x setFuelCargo 0;} foreach (missionNamespace getVariable ["EPOCH_staticFuelSources", []]); // setup display EH's if (isNil "EPOCH_display_setup_complete") then { - EPOCH_display_setup_complete = true; - { - (findDisplay 46) displayAddEventHandler [_x,(["CfgEpochClient", _x, ""] call EPOCH_fnc_returnConfigEntryV2)]; - } forEach (["CfgEpochClient", "displayAddEventHandler", []] call EPOCH_fnc_returnConfigEntryV2); - // reset anim state - player switchMove ""; - // setup Epoch Hud - call epoch_dynamicHUD_start; + EPOCH_display_setup_complete = true; + { + (findDisplay 46) displayAddEventHandler [_x,(["CfgEpochClient", _x, ""] call EPOCH_fnc_returnConfigEntryV2)]; + } forEach (["CfgEpochClient", "displayAddEventHandler", []] call EPOCH_fnc_returnConfigEntryV2); + // reset anim state + player switchMove ""; + // setup Epoch Hud + call epoch_dynamicHUD_start; }; + + +// Background radiation +_outOfBoundsRadiation = ["CfgEpochClient", "outOfBoundsRadiation", 10] call EPOCH_fnc_returnConfigEntryV2; +_radsLevel = 0; + _prevEquippedItem = []; _damagePlayer = damage player; +_isOnFoot = isNull objectParent player; _panic = false; -_prevEnergy = EPOCH_playerEnergy; +_prevEnergy = missionNamespace getVariable [_playerEnergyKey, _playerEnergyDefault]; + // init config data -EPOCH_sapperRndChance = ["CfgEpochClient", "sapperRngChance", 100] call EPOCH_fnc_returnConfigEntryV2; -EPOCH_zombieRngChance = ["CfgEpochClient", "zombieRngChance", 50] call EPOCH_fnc_returnConfigEntryV2; -EPOCH_droneRndChance = ["CfgEpochClient", "droneRngChance", 100] call EPOCH_fnc_returnConfigEntryV2; -_baseHTLoss = ["CfgEpochClient", "baseHTLoss", 8] call EPOCH_fnc_returnConfigEntryV2; +_antagonistRndChance = ["CfgEpochClient", "antagonistRngChance", 100] call EPOCH_fnc_returnConfigEntryV2; + +_baseHungerLoss = ["CfgEpochClient", "baseHungerLoss", 2] call EPOCH_fnc_returnConfigEntryV2; +_baseThirstLoss = ["CfgEpochClient", "baseThirstLoss", 2] call EPOCH_fnc_returnConfigEntryV2; +_baseAlcoholLoss = ["CfgEpochClient", "baseAlcoholLoss", 0.17] call EPOCH_fnc_returnConfigEntryV2; +_lossMultiplier = if (["CfgEpochClient", "accelerateHTALoss", true] call EPOCH_fnc_returnConfigEntryV2) then {timeMultiplier} else {1}; _energyCostNV = ["CfgEpochClient", "energyCostNV", 3] call EPOCH_fnc_returnConfigEntryV2; _energyRegenMax = ["CfgEpochClient", "energyRegenMax", 5] call EPOCH_fnc_returnConfigEntryV2; _energyRange = ["CfgEpochClient", "energyRange", 75] call EPOCH_fnc_returnConfigEntryV2; _hudConfigs = ["CfgEpochClient", "hudConfigs", []] call EPOCH_fnc_returnConfigEntryV2; +_radioactiveLocations = ["CfgEpochClient", "radioactiveLocations", ["NameCityCapital", "NameCity", "Airport"]] call EPOCH_fnc_returnConfigEntryV2; +_radiatedObjMaxRange = ["CfgEpochClient", "radiatedObjMaxFalloutDist", 75] call EPOCH_fnc_returnConfigEntryV2; -EPOCH_chargeRate = 0; -EPOCH_playerIsSwimming = false; +_chargeRate = 0; + +_antagonistChanceDefaults = [ + "Epoch_Cloak_F",0.07, + "Epoch_Sapper_F",0.25, + "Epoch_SapperG_F",0.12, + "Epoch_SapperB_F",0.06, + "I_UAV_01_F",0.2, + "PHANTOM",0.01, + "EPOCH_RyanZombie_1",0.25 +]; +_antagonistChances = ["CfgEpochClient", "antagonistChances", _antagonistChanceDefaults] call EPOCH_fnc_returnConfigEntryV2; + + +// Init antagonist spawn limits +_spawnIndex = []; +_spawnLimits = []; +_antagonistSpawnDefaults = [ + ["Epoch_Cloak_F", 1], + ["GreatWhite_F", 2], + ["Epoch_Sapper_F",2], + ["Epoch_SapperG_F",1], + ["Epoch_SapperB_F",1], + ["I_UAV_01_F",2], + ["PHANTOM",1], + ["B_Heli_Transport_01_F",1], + ["EPOCH_RyanZombie_1",12] +]; +_antagonistSpawnLimits = ["CfgEpochClient", "antagonistSpawnIndex", _antagonistSpawnDefaults] call EPOCH_fnc_returnConfigEntryV2; + +_mod_Ryanzombies_Enabled = missionNamespace getVariable ["EPOCH_mod_Ryanzombies_Enabled",false]; +{ + _x params ["_spawnName","_spawnLimit"]; + if (_spawnName isEqualTo "EPOCH_RyanZombie_1") then { + if (_mod_Ryanzombies_Enabled) then { + _spawnIndex pushBack _spawnName; + _spawnLimits pushBack _spawnLimit; + }; + } else { + _spawnIndex pushBack _spawnName; + _spawnLimits pushBack _spawnLimit; + }; +} forEach _antagonistSpawnLimits; + +EPOCH_spawnIndex = _spawnIndex; +EPOCH_spawnLimits = _spawnLimits; // default data if mismatch -if (count EPOCH_playerSpawnArray != count EPOCH_spawnIndex) then{ - EPOCH_playerSpawnArray = []; - { EPOCH_playerSpawnArray pushBack 0 } forEach EPOCH_spawnIndex; -}; - -// HUD and Logic functions - todo move to client function. -/* -[_selVarName,_varIndex,_selVarType,_selVarSubData] call _fnc_returnHudVar -*/ -_fnc_returnHudVar = { - params [["_selVarName",""],["_varIndex",0],["_selVarType",""],["_selVarSubData",""]]; - switch (_selVarType) do { - case "getMissionNamespaceVariable": {missionNamespace getVariable[_selVarName,_selVarSubData]}; - case "getPlayerHitPointDamage": {player getHitPointDamage _selVarSubData}; - case "getPlayerOxygenRemaining": {getOxygenRemaining player}; - case "getPlayerDamage": {damage player}; - default {missionNamespace getVariable[format['EPOCH_player%1', _selVarName],EPOCH_defaultVars select _varIndex]}; - } -}; -/* -[1,">=",0] call _fnc_arrayToLogic; // returns: true -*/ -_fnc_arrayToLogic = { - params [["_v",""],["_t",""],["_d",""]]; - switch (_t) do { - case ">=": {_v >= _d}; - case "<=": {_v <= _d}; - case "<": {_v < _d}; - case ">": {_v > _d}; - case "!=": {!(_v isEqualTo _d)}; - default {_v isEqualTo _d}; - } +_playerSpawnArray = missionNamespace getVariable [_playerSpawnArrayKey, _playerSpawnArrayDefault]; +if !(_playerSpawnArray isEqualTypeParams _spawnIndex) then{ + _playerSpawnArray = []; + { _playerSpawnArray pushBack 0 } forEach _spawnIndex; }; +missionNamespace setVariable [_playerSpawnArrayKey, _playerSpawnArray]; // find radio { @@ -79,16 +192,27 @@ _masterConfig = 'CfgBuildingLootPos' call EPOCH_returnConfig; _lootClasses = []; _lootClassesIgnore = ['Default']; -'_cN = configName _x;if !(_cN in _lootClassesIgnore)then{_lootClasses pushBackUnique _cN};' configClasses _masterConfig; +'_cN = configName _x;if !(_cN in _lootClassesIgnore)then{_lootClasses pushBackUnique (toLower _cN)}; true' configClasses _masterConfig; +_lastPlayerPos = getPosATL player; _lootBubble = { private["_jammer", "_others", "_objects", "_nearObjects", "_building", "_lootDist", "_lootLoc", "_playerPos", "_distanceTraveled"]; _playerPos = getPosATL vehicle player; - _distanceTraveled = EPOCH_lastPlayerPos distance _playerPos; + _distanceTraveled = _lastPlayerPos distance _playerPos; if (_distanceTraveled > 10 && _distanceTraveled < 200) then { _lootDist = 30 + _distanceTraveled; _lootLoc = player getRelPos [_lootDist, (random [-180,0,180])]; - _objects = nearestObjects[_lootLoc, _lootClasses, 30]; + _objects = (_lootLoc nearObjects 30) select { + private _selectedConfig = typeOf _x; + if (_selectedConfig isEqualTo "") then { + (getModelInfo _x) params [["_modelName",""]]; + if (!isnil "_modelName") then { + _selectedConfig = (_modelName splitString " .") joinString "_"; + }; + }; + ((toLower _selectedConfig) in _lootClasses) + }; + // diag_log format["DEBUG: loot objects %1",_objects]; _jammer = nearestObjects [_lootLoc, ["PlotPole_EPOCH","ProtectionZone_Invisible_F"], _buildingJammerRange]; if (!(_objects isEqualTo[]) && (_jammer isEqualTo[])) then { _building = selectRandom _objects; @@ -104,28 +228,12 @@ _lootBubble = { }; }; }; - EPOCH_lastPlayerPos = _playerPos; + _lastPlayerPos = _playerPos; }; -// [control,bool] call _fadeUI; -_fadeUI = { - params ["_ctrl","_bool"]; - if (_bool) then { - if (ctrlFade _ctrl == 0) then { - _ctrl ctrlSetFade 1; - _ctrl ctrlCommit 0.5; - }; - if (ctrlFade _ctrl == 1) then { - _ctrl ctrlSetFade 0; - _ctrl ctrlCommit 0.5; - }; - } else { - if (ctrlFade _ctrl != 1) then { - _ctrl ctrlSetFade 0; - _ctrl ctrlCommit 0; - }; - }; - _bool +// init weather temperature var if not already set +if (isNil "EPOCH_CURRENT_WEATHER") then { + EPOCH_CURRENT_WEATHER = 75; }; _cursorTarget = objNull; @@ -140,13 +248,13 @@ _EPOCH_BuildTraderMisson = { _taskTitle = getText ( _inGameTasksconfig >> _taskName >> "title"); _taskSQF = getText ( _inGameTasksconfig >> _taskName >> "initsqf"); if !(_taskSQF isequalto '') then { - call compile format ["[_taskName,player,_unit,_taskItem] execVM ""%1""",_taskSQF]; + call compile format ["[_taskName,player,_unit,_taskItem] execVM ""%1""",_taskSQF]; }; _taskCall = getText ( _inGameTasksconfig >> _taskName >> "initcall"); if !(_taskCall isequalto '') then { call compile _taskCall; }; - + _taskDelay = diag_ticktime + (getNumber ( _inGameTasksconfig >> _taskName >> "triggerDelay")); _triggerintervall = getNumber ( _inGameTasksconfig >> _taskName >> "triggerintervall"); _taskItems = getArray ( _inGameTasksconfig >> _taskName >> "items"); @@ -179,7 +287,7 @@ _EPOCH_BuildTraderMisson = { if(_taskMarkerType == 2)then{ _markerPos set [0, (_markerPos select 0) + (floor (random _taskMarkerRad) - (_taskMarkerRad / 2))]; _markerPos set [1, (_markerPos select 1) + (floor (random _taskMarkerRad) - (_taskMarkerRad / 2))]; - }; + }; [[_taskMarkerVis,player],_markerPos,"ELLIPSE","mil_dot",_taskMarkerText,"ColorYellow",[_taskMarkerRad,_taskMarkerRad], "SolidBorder", 42, 0.6,_mkrName] remoteExec ["EPOCH_server_makeMarker",2]; }; _taskDialogues = []; @@ -203,13 +311,13 @@ _EPOCH_BuildTraderMisson = { _taskFailedSQF = getText ( _inGameTasksconfig >> _taskName >> "failedSQF"); _taskFailedCall = compile getText ( _inGameTasksconfig >> _taskName >> "failedCall"); _nextTask = getArray ( _inGameTasksconfig >> _taskName >> "failedTask"); - + _taskCompleteCond = compile getText ( _inGameTasksconfig >> _taskName >> "completeCondition"); _taskReward = getArray ( _inGameTasksconfig >> _taskName >> "reward"); _taskCompleteDiags = getArray ( _inGameTasksconfig >> _taskName >> "completedialogues"); _taskCompleteCall = compile getText ( _inGameTasksconfig >> _taskName >> "completedCALL"); _taskNextTrigger = getArray ( _inGameTasksconfig >> _taskName >> "nextTask"); - + _missionCleanUpCall = compile getText ( _inGameTasksconfig >> _taskName >> "cleanUpCall"); _taskCleanup = getNumber ( _inGameTasksconfig >> _taskName >> "cleanUp"); _return = [ diff --git a/Sources/epoch_code/compile/traders/EPOCH_buildingInteract.sqf b/Sources/epoch_code/compile/traders/EPOCH_buildingInteract.sqf deleted file mode 100644 index 3d40c5c7..00000000 --- a/Sources/epoch_code/compile/traders/EPOCH_buildingInteract.sqf +++ /dev/null @@ -1,39 +0,0 @@ -//[[[cog import generate_private_arrays ]]] -private ["_action","_class","_condition","_disabledDoor","_displayname","_doorIndex","_index","_position","_statement","_uniqueActions","_unlock","_useractions"]; -//[[[end]]] -lbClear 1550; -_class = configFile >> "CfgVehicles" >> (typeOf EPCH); -if (isclass _class) then { - _useractions = _class >> "UserActions"; - if (isclass _useractions) then { - _uniqueActions = []; - for "_u" from 0 to (count _useractions - 1) do { - _action = _useractions select _u; - _displayname = gettext (_action >> "displayname"); - _position = gettext (_action >> "position"); - _uniqueActions pushBackUnique _position; - _condition = gettext (_action >> "condition"); - _statement = gettext (_action >> "statement"); - _condition = [_condition,"this","EPCH"] call EPOCH_replaceWord; - _statement = [_statement,"this","EPCH"] call EPOCH_replaceWord; - if (call compile _condition) then { - _index = lbAdd[1550,_displayname]; - lbSetData [1550, _index,_statement]; - }; - }; - { - _doorIndex = _forEachIndex + 1; - _disabledDoor = EPCH getVariable [format["bis_disabled_Door_%1",_doorIndex],0]; - - if (_disabledDoor == 0) then { - _index = lbAdd[1550,"Lock Door"]; - _unlock = format["EPCH setVariable ['bis_disabled_Door_%1',1,true];",_doorIndex]; - lbSetData [1550, _index,_unlock]; - } else { - _index = lbAdd[1550,"Unlock Door"]; - _unlock = format["EPCH setVariable ['bis_disabled_Door_%1',0,true];",_doorIndex]; - lbSetData [1550, _index,_unlock]; - }; - } foreach _uniqueActions; - }; -}; diff --git a/Sources/epoch_code/compile/traders/EPOCH_calcDamageCost.sqf b/Sources/epoch_code/compile/traders/EPOCH_calcDamageCost.sqf new file mode 100644 index 00000000..ae866def --- /dev/null +++ b/Sources/epoch_code/compile/traders/EPOCH_calcDamageCost.sqf @@ -0,0 +1,35 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: Takes in total cost of vehicle and returns new price with damage % taken into account + + 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_code/gui/scripts/favBar/epoch_favBar_refresh.sqf + + Usage: [_vehOBJ,_costINT] call EPOCH_calcDamageCost; +*/ + +private ["_dmg","_hitPoints"]; +params [["_obj",objNull, [objNull]],["_cost",0, [0]]]; + +if (_obj isEqualTo objNull) exitWith {-1}; + +_hitPoints = getAllHitPointsDamage _obj; +_totalHPoints = count (_hitPoints select 1); +_totalDamagedPoints = 0; +{ + _dmg = _hitPoints select 2 select _forEachIndex; + if (_dmg > 0) then { + _totalDamagedPoints = _totalDamagedPoints +1; + }; +} forEach (_hitPoints select 1); + +_math = round (_totalDamagedPoints / _totalHPoints * 100); +_newCost = _cost - _math; + +_newCost \ No newline at end of file diff --git a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf index fd938ff7..19386532 100644 --- a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf +++ b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf @@ -1,5 +1,5 @@ //[[[cog import generate_private_arrays ]]] -private ["_aiItems","_allowAdd","_array","_config","_cryptoCount","_index","_item","_itemClasses","_itemQtys","_itemTax","_itemWorth","_limit","_qtyIndex","_sizeOut","_slot","_stockLimit","_tax","_uiItem","_worth"]; +private ["_errormsg","_aiItems","_allowAdd","_array","_config","_cryptoCount","_index","_item","_itemClasses","_itemQtys","_itemTax","_itemWorth","_limit","_qtyIndex","_sizeOut","_slot","_stockLimit","_tax","_uiItem","_worth"]; //[[[end]]] params ["_control","_selected"]; @@ -8,6 +8,7 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { _allowAdd = true; _stockLimit = false; _uiItem = (_selected select 0) lbData (_selected select 1); + _errormsg = "Limit one per trade"; _config = 'CfgPricing' call EPOCH_returnConfig; if (isClass(_config >> _uiItem)) then{ @@ -33,6 +34,23 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { }; if (_uiItem isKindOf "Air" || _uiItem isKindOf "Ship" || _uiItem isKindOf "LandVehicle" || _uiItem isKindOf "Tank") then { + if (["CfgEpochClient", "DisallowSellOnDamage", false] call EPOCH_fnc_returnConfigEntryV2) then { + { + _vehicle = _x; + if (local _vehicle && (typeof _vehicle) isequalto _uiItem) then { + { + if ((["wheel",tolower _x] call bis_fnc_instring) || _x isequalto "HitEngine") then { + if (((getAllHitPointsDamage _vehicle) select 2 select _foreachindex) >= 1) then { + _allowAdd = false; + _errormsg = "Cannot be sold - too much damage"; + }; + }; + if (!_allowAdd) exitwith {}; + } foreach ((getAllHitPointsDamage _vehicle) select 0); + }; + if (!_allowAdd) exitwith {}; + } foreach (EPOCH_lastNPCtradeTarget nearEntities[[_uiItem], 30]); + }; // check if a vehicle is already on the list _sizeOut = lbSize 41501; @@ -94,7 +112,7 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { if (_stockLimit) then{ ["Trader has the maximum amount of this item", 5] call Epoch_message; } else { - ["Limit one per trade", 5] call Epoch_message; + [_errormsg, 5] call Epoch_message; }; }; }; diff --git a/Sources/epoch_code/compile/traders/EPOCH_startInteract.sqf b/Sources/epoch_code/compile/traders/EPOCH_startInteract.sqf index 55e41f66..1efd0490 100644 --- a/Sources/epoch_code/compile/traders/EPOCH_startInteract.sqf +++ b/Sources/epoch_code/compile/traders/EPOCH_startInteract.sqf @@ -18,7 +18,7 @@ if (!isNull cursorTarget) then { }; }; if (isNull _target) then { - _targets = nearestObjects [getPosATL player, ["WeaponHolder", "WeaponHolderSimulated"], 3]; + _targets = nearestObjects [player, ["WeaponHolder", "WeaponHolderSimulated"], 3]; if !(_targets isEqualTo []) then { _target = _targets select 0; _forceGear = true; diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_client_VehicleMaintananceCheck.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_client_VehicleMaintananceCheck.sqf new file mode 100644 index 00000000..3b40ec4a --- /dev/null +++ b/Sources/epoch_code/compile/vehicles/EPOCH_client_VehicleMaintananceCheck.sqf @@ -0,0 +1,79 @@ +/* + Author: He-Man - Ignatz-Gaming + + Contributors: + + Description: + Check for repairable / replaceable and removeable Vehicle-parts + + 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_code/compile/vehicles/EPOCH_client_VehicleMaintananceCheck.sqf +*/ +private ["_veh","_VehicleRepairs","_EnableRemoveParts","_repairs","_removes","_replaces","_wheels","_wheelcounter","_HitPointName","_Hit","_wheel","_repairarrays"]; +_veh = _this; +_VehicleRepairs = ["CfgEpochClient", "VehicleRepairs", []] call EPOCH_fnc_returnConfigEntryV2; +_EnableRemoveParts = ["CfgEpochClient", "EnableRemoveParts", true] call EPOCH_fnc_returnConfigEntryV2; +_repairs = []; +_removes = []; +_replaces = []; +_wheels = getnumber (configfile >> "cfgvehicles" >> (typeof _veh) >> "numberPhysicalWheels"); +if (_veh iskindof "ebike_epoch") then { + _wheels = 2; +}; +_wheelcounter = 0; +{ + _HitPointName = _x; + _Hit = (getAllHitPointsDamage _veh) select 2 select _foreachindex; + { + _x params ["_searchedhit","_limit1","_limit2"]; + if (_searchedhit isequalto _HitPointName) then { + _wheel = ["wheel",tolower _searchedhit] call bis_fnc_instring; + if (_wheel) then { + _wheelcounter = _wheelcounter + 1; + }; + if (_wheel && _wheelcounter > _wheels) exitwith {}; + if (_Hit >= _limit2) exitwith { + _replaces pushback _searchedhit; + }; + if (_Hit >= _limit1) exitwith { + _repairs pushback _searchedhit; + }; + if (!((_veh getvariable ["vehicle_slot","-1"]) isequalto "-1") && _EnableRemoveParts) then { + if (_searchedhit in ["HitLFWheel","HitLF2Wheel","HitLMWheel","HitLBWheel","HitRFWheel","HitRF2Wheel","HitRMWheel","HitRBWheel","HitEngine"]) then { + _removes pushback _searchedhit; + }; + }; + } + else { + if (_searchedhit isequalto "glass") then { + if ("glass" in _repairs) exitwith {}; + _glass = ["glass",tolower _HitPointName] call bis_fnc_instring; + if (_glass) then { + if (_Hit >= _limit1) exitwith { + _repairs pushback _searchedhit; + }; + }; + }; + }; + } foreach _VehicleRepairs; +} foreach ((getAllHitPointsDamage _veh) select 0); + +_repairarrays = []; +{ + if (!(_x in _repairs || _x in _replaces || (["glass",tolower _x] call Bis_fnc_instring)) || _x isequalto "") then { + _repairarrays pushback [_foreachindex, 0]; + }; +} foreach ((getAllHitPointsDamage _veh) select 0); + +if !(_repairarrays isequalto []) then { + if (local _veh) then { + [_veh, _repairarrays] call EPOCH_client_repairVehicle; + } else { + [_veh,_repairarrays,player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + }; +}; + +EPOCH_VehicleRepairs = [_repairs,_removes,_replaces]; diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_client_VehicleMaintananceDo.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_client_VehicleMaintananceDo.sqf new file mode 100644 index 00000000..ad796c51 --- /dev/null +++ b/Sources/epoch_code/compile/vehicles/EPOCH_client_VehicleMaintananceDo.sqf @@ -0,0 +1,133 @@ +/* + Author: He-Man - Ignatz-Gaming + + Contributors: + + Description: + Repair / replac and remove Vehicle-parts + + 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_code/compile/vehicles/EPOCH_client_VehicleMaintananceDo.sqf +*/ +private ["_secondlocalcheck","_repairarrays","_config","_VehicleRepairs","_reqiredMat","_searchname","_line","_returnmat"]; +params ["_veh","_do","_hitpointname"]; +_secondlocalcheck = false; +_returnmat = ""; +_repairarrays = []; +_config = 'CfgEpochClient' call EPOCH_returnConfig; +_VehicleRepairs = getArray (_config >> "VehicleRepairs"); +if (isnull _veh) exitwith { + ['Error - No Vehicle found',5] call Epoch_message; +}; +if !(alive _veh) exitwith { + ['Error - Vehicle already dead',5] call Epoch_message; +}; + +if (EPOCH_Vehicle_MaintainLock) exitwith {}; +EPOCH_Vehicle_MaintainLock = true; + +switch _do do { + case 'repair': { + _reqiredMat = ""; + _searchname = _hitpointname; + if (["glass",tolower _hitpointname] call Bis_fnc_instring) then { + _searchname = "glass"; + }; + { + _x params ["_name","","","_repairmat"]; + if (_searchname isequalto _name) exitwith { + _reqiredMat = _repairmat; + }; + } foreach _VehicleRepairs; + if (_reqiredMat isequalto "") exitwith { + ['Error - Can not find required Material',5] call Epoch_message; + }; + if !(_reqiredMat in (magazines player)) exitwith { + _line = format ['You need %1 to repair',_reqiredMat call EPOCH_itemDisplayName]; + [_line,5] call Epoch_message; + }; + player removemagazine _reqiredMat; + if (_hitpointname isequalto "glass") then { + { + if (["glass",tolower _x] call Bis_fnc_instring) then { + _repairarrays pushback [_x,0]; + }; + } foreach ((getAllHitPointsDamage _veh) select 0); + } + else { + _repairarrays pushback [_hitpointname,0]; + }; + }; + case 'replace': { + _reqiredMat = ""; + _searchname = _hitpointname; + if (["glass",tolower _hitpointname] call Bis_fnc_instring) then { + _searchname = "glass"; + }; + { + _x params ["_name","","","","_replacemat"]; + if (_searchname isequalto _name) exitwith { + _reqiredMat = _replacemat; + }; + } foreach _VehicleRepairs; + if (_reqiredMat isequalto "") exitwith { + ['Error - Can not find required Material',5] call Epoch_message; + }; + if !(_reqiredMat in (magazines player)) exitwith { + _line = format ['You need %1 to repair',_reqiredMat call EPOCH_itemDisplayName]; + [_line,5] call Epoch_message; + }; + player removemagazine _reqiredMat; + if (_hitpointname isequalto "glass") then { + { + if (["glass",tolower _x] call Bis_fnc_instring) then { + _repairarrays pushback [_x,0]; + }; + } foreach ((getAllHitPointsDamage _veh) select 0); + } + else { + _repairarrays pushback [_hitpointname,0]; + }; + }; + case 'remove': { + if !(local _veh) exitwith { + _line = 'Error - You must get into drivers seat first!'; + ['Error - You must get into drivers seat first!',5] call Epoch_message; + }; + _searchname = _hitpointname; + { + _x params ["_name","","","","_replacemat"]; + if (_searchname isequalto _name) exitwith { + _returnmat = _replacemat; + }; + } foreach _VehicleRepairs; + if (_returnmat isequalto "") exitwith { + ['Error - Could not find Return Material!',5] call Epoch_message; + }; + _repairarrays pushback [_hitpointname,1]; + _secondlocalcheck = true; + }; +}; + +if !(_repairarrays isequalto []) then { + player playMove 'AinvPknlMstpSnonWrflDnon_medic0'; + player playMove 'AinvPknlMstpSnonWrflDnon_medicEnd'; + _veh say3d 'vehicle_repair'; + uisleep 5; + if (_secondlocalcheck && !local _veh) exitwith { + ['Vehicle owner Changed - Go in as driver and try again!',5] call Epoch_message; + }; + if !(_returnmat isequalto "") then { + _returnmat call EPOCH_fnc_addItemOverflow; + }; + if (local _veh) then { + [_veh, _repairarrays] call EPOCH_client_repairVehicle; + } else { + [_veh,_repairarrays,player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + }; +}; + +EPOCH_Vehicle_MaintainLock = false; diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf index 38961c07..63f669f1 100644 --- a/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf +++ b/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf @@ -17,6 +17,22 @@ private ["_currentDMG"]; //[[[end]]] params ["_vehicle","_value"]; if (local _vehicle) then { - _currentDMG = _vehicle getHitIndex (_value select 0); - _vehicle setHitIndex[_value select 0, (_currentDMG - 0.5) max 0]; + { + if ((_x select 0) isequaltype 0) then { + _vehicle setHitIndex [_x select 0, _x select 1]; + } + else { + _vehicle setHitPointDamage [_x select 0, _x select 1]; + }; + } foreach _value; + + if !({_x > 0} count ((getAllHitPointsDamage _vehicle) select 2) > 0) then { + [_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; + }; + + _vehicle call EPOCH_interact; + if !(EPOCH_arr_interactedObjs isEqualTo[]) then { + [EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; + EPOCH_arr_interactedObjs = []; + }; }; diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_client_upgradeVehicle.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_client_upgradeVehicle.sqf new file mode 100644 index 00000000..66d0e03c --- /dev/null +++ b/Sources/epoch_code/compile/vehicles/EPOCH_client_upgradeVehicle.sqf @@ -0,0 +1,83 @@ +/* + Author: He-Man / DirtySanchez + + Contributors: + + Description: + Upgrade Vehicle + + 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_code/compile/vehicles/EPOCH_client_upgradeVehicle.sqf +*/ + +private ["_vehType","_config","_reqMaterials","_crypto","_hasall","_missing","_has","_msg"]; +params [["_veh",objnull],["_classUpgrade",""],["_displayname",""],["_mattxt",""]]; + +Ignatz_VehicleUpgradeArray = []; +if (isnull _veh) exitwith { + ["Upgrade failed - Vehicle not found",5] call Epoch_message; +}; + +_vehType = typeOf _veh; +_config = 'CfgVehicleUpgrades' call EPOCH_returnConfig; +if !(isclass (_config >> _vehType)) exitwith { + ["Vehicle not upgradeable",5] call Epoch_message; +}; +_reqMaterials = getArray (_config >> _vehType >> _classUpgrade >> "ReqMaterials"); + +_crypto = 0; +if(_reqMaterials isEqualTo [])exitWith{ + ["Required Materials list not found, report this error to an admin",5] call Epoch_message; +}; +_hasall = true; +_missing = []; +{ + _x params ["_count","_item"]; + _has = 0; + if (_item isequalto "Crypto") then { + _has = Epoch_Playercrypto; + } + else { + _has = {_x == _item} count ((magazines player)+(items player)); + }; + if (_has < _count) then { + _missing pushback [_count-_has,_item]; + _hasall = false + }; +}forEach _reqMaterials; +if (!_hasall) exitwith { + _msg = 'Missing:'; + { + _msg = _msg + format [' %1 %2,', _x select 0, (_x select 1) call EPOCH_itemDisplayName]; + } foreach _missing; + [_msg,5] call Epoch_message; +}; +if !(local _veh) exitwith { + ["Upgrade failed - Go in as Driver first",5] call Epoch_message; +}; +if !(crew _veh isequalto []) exitwith { + ["Upgrade failed - All passengers must leave the Vehicle",5] call Epoch_message; +}; +if (player distance _veh > 15) exitwith { + ["Upgrade failed - Vehicle to far away",5] call Epoch_message; +}; +if (player distance _veh < 4.5) exitwith { + ["Upgrade failed - Take a bit distance and try again",5] call Epoch_message; +}; + +{ + _x params ["_count","_item"]; + if (_item isequalto "Crypto") then { + _crypto = _crypto + _count; + } + else { + for "_i" from 1 to _count do{ + player removeItem _item; + }; + }; +} forEach _reqMaterials; + +[[_veh,_classUpgrade,_crypto],player,Epoch_personalToken] remoteExec ["EPOCH_server_upgrade_vehicle",2]; diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_client_upgradeVehicleCheck.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_client_upgradeVehicleCheck.sqf new file mode 100644 index 00000000..18483b3c --- /dev/null +++ b/Sources/epoch_code/compile/vehicles/EPOCH_client_upgradeVehicleCheck.sqf @@ -0,0 +1,54 @@ +/* + Author: He-Man + + Contributors: DirtySanchez + + Description: + Upgrade Vehicle Check + + 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_code/compile/vehicles/EPOCH_client_upgradeVehicleCheck.sqf +*/ + +private ["_veh","_vehType","_config","_classUpgrade","_reqMaterials","_mattxt","_displayname"]; +_veh = _this; + +Ignatz_VehicleUpgradeArray = []; +if (isnull _veh) exitwith { + ["Upgrade failed - Vehicle not found",5] call Epoch_message; +}; +if (player distance _veh > 12) exitwith { + ["Upgrade failed - Vehicle to far away",5] call Epoch_message; +}; + +_vehType = typeOf _veh; +_config = 'CfgVehicleUpgrades' call EPOCH_returnConfig; +if !(isclass (_config >> _vehType)) exitwith { + ["Vehicle not upgradeable",5] call Epoch_message; +}; +_classUpgrade = getarray (_config >> _vehType >> "upgradeToVehicle"); +if (_classUpgrade isequalto []) exitwith { + ["Vehicle not upgradeable",5] call Epoch_message; +}; +if ((_veh getvariable ["Vehicle_Slot","-1"]) isequalto "-1") exitwith { + ["Vehicle not upgradeable",5] call Epoch_message; +}; + +{ + _classUpgrade = _x; + if (_x isequaltype []) then { + _classUpgrade = selectrandom _x; + }; + if (isclass (_config >> _vehType >> _classUpgrade)) then { + _reqMaterials = getArray (_config >> _vehType >> _classUpgrade >> "ReqMaterials"); + _mattxt = "Needed:"; + { + _mattxt = _mattxt + format [' %1 %2,', _x select 0, (_x select 1) call EPOCH_itemDisplayName]; + } forEach _reqMaterials; + _displayname = _classUpgrade call EPOCH_itemDisplayName; + Ignatz_VehicleUpgradeArray pushback [_veh,_classUpgrade,_displayname,_mattxt]; + }; +} foreach _classUpgrade; \ No newline at end of file diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_checkTurretAmmo.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_checkTurretAmmo.sqf new file mode 100644 index 00000000..ca16ce0b --- /dev/null +++ b/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_checkTurretAmmo.sqf @@ -0,0 +1,61 @@ +/* + Author: DirtySanchez - ported from DonkeyPunch eXpoch http://DonkeyPunch.INFO + + Contributors: He-Man + + 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_code/compile/vehicles/EPOCH_vehicle_checkTurretAmmo.sqf +*/ +private ["_ammoTurret","_availAmmo","_ammo","_magazinesAmmoFull","_readd","_selectedmag","_magAmmoCount","_return","_AllFlares","_removeveh","_readdveh"]; +params["_vehicle","_weaponTurret", "_turretPath"]; + +// Fix for not reloadable Flares +if ((["flare", tolower _weaponTurret] call BIS_fnc_inString) || (["smoke", tolower _weaponTurret] call BIS_fnc_inString)) then { + _AllFlares = ((magazinesAllTurrets _vehicle) select {_x param [1] isequalto _turretPath}) select {(["flare", tolower (_x param [0])] call BIS_fnc_inString) || (["smoke", tolower (_x param [0])] call BIS_fnc_inString)}; + _removeveh = []; + _readdveh = []; + { + _removeveh pushbackunique (_x select 0); + if !((_x select 2) isequalto 0) then { + _readdveh pushback _x; + }; + } foreach _AllFlares; + { + _vehicle removeMagazinesTurret [_x,_turretPath]; + } foreach _removeveh; + { + _vehicle addMagazineTurret [_x select 0, _turretPath, _x select 2]; + } foreach _readdveh; +}; + +_ammoTurret = getArray(configFile >> "CfgWeapons" >> _weaponTurret >> "magazines"); +_availAmmo = (magazines player) arrayIntersect _ammoTurret; +if (count _availAmmo == 0) then { + [format["You need a can of %1 or any of its variants",getText (configFile >> 'CfgMagazines' >> (_ammoTurret select 0) >> 'displayName')],5] call Epoch_message; +} +else { + _ammo = _availAmmo select 0; + _magazinesAmmoFull = magazinesAmmoFull player; + _readd = []; + { + if((_x select 0) isEqualTo _ammo) then { + _readd pushback _x; + }; + } forEach _magazinesAmmoFull; + _selectedmag = _readd deleteat 0; + _magAmmoCount = _selectedmag select 1; + _vehicle addMagazineTurret [_ammo,_turretPath,_magAmmoCount]; + player removeMagazines _ammo; + { + _return = _x call EPOCH_fnc_addMagazineOverflow; + } foreach _readd; + _vehicle call EPOCH_interact; + if !(EPOCH_arr_interactedObjs isEqualTo[]) then { + [EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; + EPOCH_arr_interactedObjs = []; + }; + [format["Added 1 can %1 with %2 rounds to %3",getText (configFile >> 'CfgMagazines' >> _ammo >> 'displayName'),_magAmmoCount,getText (configFile >> 'CfgWeapons' >> _weaponTurret >> 'displayName')],5] call Epoch_message; +}; diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_removeTurretAmmo.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_removeTurretAmmo.sqf new file mode 100644 index 00000000..37b1c937 --- /dev/null +++ b/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_removeTurretAmmo.sqf @@ -0,0 +1,44 @@ +/* + + Author: DirtySanchez - ported from DonkeyPunch eXpoch http://DonkeyPunch.INFO + + Contributors: He-Man + + 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_code/compile/vehicles/EPOCH_vehicle_removeTurretAmmo.sqf +*/ +private ["_AllMagsDetailTurret","_selectedmag","_magAmmoCount","_return","_magtxt","_weapontxt","_msg"]; +params["_vehicle","_weaponTurret","_ammo", "_turretPath"]; + +_AllMagsDetailTurret = ((magazinesAllTurrets _vehicle) select {_x param [1] isequalto _turretPath}) select {_x param [0] isequalto _ammo}; +if (_AllMagsDetailTurret isequalto []) exitwith { + ["Error - No ammo found",5] call Epoch_message; +}; +_selectedmag = _AllMagsDetailTurret deleteat 0; +_magAmmoCount = _selectedmag select 2; +_vehicle removeMagazinesTurret [_ammo,_turretPath]; +{ + _vehicle addMagazineTurret [_x select 0, _turretPath, _x select 2]; +} foreach _AllMagsDetailTurret; +reload _vehicle; +_return = [_ammo,_magAmmoCount] call EPOCH_fnc_addMagazineOverflow; + +_vehicle call EPOCH_interact; +if !(EPOCH_arr_interactedObjs isEqualTo[]) then { + [EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; + EPOCH_arr_interactedObjs = []; +}; + +_magtxt = getText (configFile >> 'CfgMagazines' >> _ammo >> 'displayName'); +_weapontxt = getText (configFile >> 'CfgWeapons' >> _weaponTurret >> 'displayName'); +_msg = switch _return do { + case 0: {"Error - return epoch_equip failed"}; + case 1: {format ["Removed 1 can %1 with %2 rounds from %3",_magtxt,_magAmmoCount, _weapontxt]}; + case 2: {format ["Dropped 1 can of %1 with %2 rounds on the ground!",_magtxt,_magAmmoCount, _weapontxt]}; + case 3: {format ["You dont have enough space for %1!",_magtxt]}; + case 4: {format ["Put 1 can of %1 with %2 rounds into Vehicle!",_magtxt,_magAmmoCount, _weapontxt]}; +}; +[_msg,5] call Epoch_message; diff --git a/Sources/epoch_code/customs/EPOCH_custom_KeyMap.sqf b/Sources/epoch_code/customs/EPOCH_custom_KeyMap.sqf new file mode 100644 index 00000000..bf03b6ff --- /dev/null +++ b/Sources/epoch_code/customs/EPOCH_custom_KeyMap.sqf @@ -0,0 +1,31 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: [Ignatz] He-Man + + Description: + Custom A3 Epoch KeyMap + + 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_code/custom/EPOCH_custom_KeyMap.sqf + + Description: + Add your own customable KeyMaps to the Epoch Configuration Menu (ESC-Menu) + + usage: + ["Text in ESC-Menu","VariableNameForKey",keycode] for full keycode list see: https://community.bistudio.com/wiki/DIK_KeyCodes +*/ + +_keyMap = _keyMap + [ +/* Example from eXpoch Vector building: + ["Build: Vector LEFT", "eXpoch_keysVectorTiltL", 0xCB], + ["Build: Vector RIGHT", "eXpoch_keysVectorTiltR", 0xCD], + ["Build: Vector AWAY", "eXpoch_keysVectorTiltAwy", 0xC8], + ["Build: Vector TOWARD", "eXpoch_keysVectorTiltTwd", 0xD0], + ["Build: Object SnapTo", "eXpoch_keysVectorSnapToObject", 0x52], + ["Build: Reset Object", "eXpoch_keysVectorResetObject", 0x4C] +*/ +]; \ No newline at end of file diff --git a/Sources/epoch_code/customs/EPOCH_custom_radioActions.sqf b/Sources/epoch_code/customs/EPOCH_custom_radioActions.sqf new file mode 100644 index 00000000..5ecb978a --- /dev/null +++ b/Sources/epoch_code/customs/EPOCH_custom_radioActions.sqf @@ -0,0 +1,31 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: Activates code block within switch when certain radio is used from Favorites bar + + 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_code/gui/scripts/Epoch_3DctrlSpin.sqf + + Usage: None by default, create your own actions here if you want +*/ + +switch _this do { + case "EpochRadio0":{}; + case "EpochRadio1":{}; + case "EpochRadio2":{}; + case "EpochRadio3":{}; + case "EpochRadio4":{}; + case "EpochRadio5":{}; + case "EpochRadio6":{}; + case "EpochRadio7":{}; + case "EpochRadio8":{}; + case "EpochRadio9":{}; + default {}; +}; + +true \ No newline at end of file diff --git a/Sources/epoch_code/gui/scripts/Epoch_onPause.sqf b/Sources/epoch_code/gui/scripts/Epoch_onPause.sqf index da202ea2..e7c19fdd 100644 --- a/Sources/epoch_code/gui/scripts/Epoch_onPause.sqf +++ b/Sources/epoch_code/gui/scripts/Epoch_onPause.sqf @@ -68,18 +68,14 @@ _respawnButton ctrlEnable false; [_display] spawn { disableSerialization; params ["_display"]; - with missionNamespace do { - false call EPOCH_pushCustomVar; - }; + EPOCH_forceUpdate = true; _startTime = diag_tickTime+5; waitUntil { uiSleep 0.2; (isNull _display) || ((_startTime - diag_tickTime) <= 0) }; if (!isNull _display) then { - with missionNamespace do { - true call EPOCH_pushCustomVar; - }; + EPOCH_forceUpdate = true; }; }; diff --git a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkGear.sqf b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkGear.sqf index 2083441d..564d93f1 100644 --- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkGear.sqf +++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkGear.sqf @@ -17,7 +17,7 @@ private ["_cN","_cP","_near","_nearObjects","_out","_player","_recipe"]; //[[[end]]] params ["_recipes"]; -_nearObjects = nearestObjects [position player,["WeaponHolder","LandVehicle","Air"],10]; +_nearObjects = nearestObjects [player,["WeaponHolder","LandVehicle","Air"],10]; _near = []; _out = []; { diff --git a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkNearby.sqf b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkNearby.sqf index b13babfa..6c56a530 100644 --- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkNearby.sqf +++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkNearby.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_checkNearby.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_check","_config","_configWorldInteractions","_countAlive","_countOnFire","_find","_nearObjects","_result","_test1","_test2","_tmpResult"]; +private ["_check","_countAlive","_countOnFire","_find","_nearObjects","_result","_test1","_test2","_tmpResult"]; //[[[end]]] params ["","","",["_arr",[2,""]],["_dist",0],["_cnt",1],["_inflamed",0],["_alive",0]]; _arr params ["_type","_check"]; @@ -39,18 +39,12 @@ switch (_type) do { }; case 2: { - _config = 'CfgEpochClient' call EPOCH_returnConfig; - _configWorldInteractions = (_config >> "CfgWorldInteractions"); _nearObjects = nearestObjects [player, [], _dist]; _check = _check select 0; _tmpResult = false; { if (alive _x) then { - if !(_x isKindOf "All") then { - _tmpResult = [str(_x), _check] call EPOCH_worldObjectType; - } else { - _tmpResult = (getNumber(_configWorldInteractions >> (typeOf _x) >> _check) == 1); - }; + _tmpResult = [_x, _check] call EPOCH_worldObjectType; }; if (_tmpResult) exitWith {_result = _tmpResult}; } forEach _nearObjects; 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 e2ef50f3..1f96dc72 100644 --- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_craft.sqf +++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_craft.sqf @@ -28,7 +28,7 @@ if !(false call EPOCH_crafting_checkResources) exitWith {}; //craft button [] spawn { - private ["_fnc_UILock","_itemCraftTime","_selection","_craftItem","_item","_itemName","_itemCraftTime","_itemRecipeItems","_itemType","_nearbyReq","_hasNearby","_canCraft","_wH","_nearByHolder","_wHPos"]; + private ["_craftReturn","_needBench","_craftCount","_fnc_UILock","_itemCraftTime","_selection","_craftItem","_item","_itemName","_itemCraftTime","_itemRecipeItems","_itemType","_nearbyReq","_hasNearby","_canCraft","_wH","_nearByHolder","_wHPos"]; disableSerialization; _fnc_UILock = { @@ -50,7 +50,9 @@ if !(false call EPOCH_crafting_checkResources) exitWith {}; _itemRecipeItems = _craftItem select 7; _itemType = _craftItem select 13; _nearbyReq = _craftItem select 8; - _needBench = {"WorkBench_EPOCH" in (_x select 3 select 1)} count (_craftItem select 8); + _needBench = {"WorkBench_EPOCH" in (_x select 3 select 1)} count _nearbyReq; + _craftCount = _craftItem param [15,1]; + _craftReturn = _craftItem param [16,[]]; for "_c" from 1 to rmx_var_craftQTYOut do { false call _fnc_UILock; @@ -69,14 +71,19 @@ if !(false call EPOCH_crafting_checkResources) exitWith {}; }; } forEach _itemRecipeItems; - _nearByBench = nearestObjects [position player,["WorkBench_EPOCH"],3]; + _nearByBench = nearestObjects [player,["WorkBench_EPOCH"],3]; if (!(_nearByBench isEqualTo []) && (_needBench > 0)) then { //adds item on top of bench if bench was required - (_nearByBench select 0) addItemCargoGlobal [_item,1]; + (_nearByBench select 0) addItemCargoGlobal [_item,_craftCount]; } else { - _item call EPOCH_fnc_addItemOverflow; + [_item,_craftCount] call EPOCH_fnc_addItemOverflow; }; + // return items + { + _x call EPOCH_fnc_addItemOverflow; + } forEach _craftReturn; + call EPOCH_crafting_LB_click; }; call EPOCH_crafting_LB_defaults; diff --git a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_getConfig.sqf b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_getConfig.sqf index 9f191e62..fd3c9cd7 100644 --- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_getConfig.sqf +++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_getConfig.sqf @@ -14,10 +14,13 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_getConfig.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_arr","_arrIn","_cCTime","_cDescFull","_cDescShort","_cDisplayName","_cModel","_cName","_cNearbyArr","_cPicture","_cPreviewArr","_cPreviewScale","_cPreviewVector","_cPriority","_cRecipeArr","_cType","_cUsedInArr","_out","_type0","_type1","_type2","_type3"]; +private ["_Suppressed","_arr","_arrIn","_cCTime","_cDescFull","_cDescShort","_cDisplayName","_cModel","_cName","_cNearbyArr","_cPicture","_cPreviewArr","_cPreviewScale","_cPreviewVector","_cPriority","_cRecipeArr","_cRecipeReturn","_cType","_cUsedInArr","_cfg","_craftCount","_out","_type0","_type1","_type2","_type3"]; //[[[end]]] -_arrIn = param [0,[0]]; +_arrIn = _this; +_cfg = 'CfgEpochClient' call EPOCH_returnConfig; +_Suppressed = getarray (_cfg >> "SuppressedCraftingItems"); + if !(typeName (_arrIn select 0) isEqualTo "CONFIG") exitWith {[]}; _type0 = []; _type1 = []; _type2 = []; _type3 = []; _out = []; @@ -43,12 +46,29 @@ _type0 = []; _type1 = []; _type2 = []; _type3 = []; _out = []; _cPreviewVector = getNumber (_x >> "previewVector"); _cDescFull = getText (_x >> "descriptionFull"); _cType = getNumber (_x >> "type"); + _craftCount = getNumber (_x >> "craftCount"); + _cRecipeReturn = getArray (_x >> "recipeReturn"); + + if !(_Suppressed isequalto []) then { + if (_cName in _Suppressed) then { + _cRecipeArr = []; + }; + { + if (_x in _cUsedInArr) then { + _cUsedInArr = _cUsedInArr - [_x]; + }; + } foreach _Suppressed; + if (_cRecipeArr isequalto [] && _cUsedInArr isequalto []) then { + _cPriority = -1; + }; + }; + switch (_cPriority) do { - case 0: {_type0 pushBack [_cName,_cDisplayName,_cPicture,_cDescShort,_cModel,_cPriority,_cCTime,_cRecipeArr,_cNearbyArr,_cUsedInArr,_cPreviewArr,_cPreviewScale,_cPreviewVector,_cType,_cDescFull]}; - case 1: {_type1 pushBack [_cName,_cDisplayName,_cPicture,_cDescShort,_cModel,_cPriority,_cCTime,_cRecipeArr,_cNearbyArr,_cUsedInArr,_cPreviewArr,_cPreviewScale,_cPreviewVector,_cType,_cDescFull]}; - case 2: {_type2 pushBack [_cName,_cDisplayName,_cPicture,_cDescShort,_cModel,_cPriority,_cCTime,_cRecipeArr,_cNearbyArr,_cUsedInArr,_cPreviewArr,_cPreviewScale,_cPreviewVector,_cType,_cDescFull]}; - case 3: {_type3 pushBack [_cName,_cDisplayName,_cPicture,_cDescShort,_cModel,_cPriority,_cCTime,_cRecipeArr,_cNearbyArr,_cUsedInArr,_cPreviewArr,_cPreviewScale,_cPreviewVector,_cType,_cDescFull]}; + case 0: {_type0 pushBack [_cName,_cDisplayName,_cPicture,_cDescShort,_cModel,_cPriority,_cCTime,_cRecipeArr,_cNearbyArr,_cUsedInArr,_cPreviewArr,_cPreviewScale,_cPreviewVector,_cType,_cDescFull,_craftCount,_cRecipeReturn]}; + case 1: {_type1 pushBack [_cName,_cDisplayName,_cPicture,_cDescShort,_cModel,_cPriority,_cCTime,_cRecipeArr,_cNearbyArr,_cUsedInArr,_cPreviewArr,_cPreviewScale,_cPreviewVector,_cType,_cDescFull,_craftCount,_cRecipeReturn]}; + case 2: {_type2 pushBack [_cName,_cDisplayName,_cPicture,_cDescShort,_cModel,_cPriority,_cCTime,_cRecipeArr,_cNearbyArr,_cUsedInArr,_cPreviewArr,_cPreviewScale,_cPreviewVector,_cType,_cDescFull,_craftCount,_cRecipeReturn]}; + case 3: {_type3 pushBack [_cName,_cDisplayName,_cPicture,_cDescShort,_cModel,_cPriority,_cCTime,_cRecipeArr,_cNearbyArr,_cUsedInArr,_cPreviewArr,_cPreviewScale,_cPreviewVector,_cType,_cDescFull,_craftCount,_cRecipeReturn]}; }; } forEach _this; diff --git a/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenu.sqf b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenu.sqf index 9052fa36..3cbf87ee 100644 --- a/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenu.sqf +++ b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenu.sqf @@ -1,7 +1,7 @@ /* Author: Raimonds Virtoss - EpochMod.com - Contributors: + Contributors: He-Man Description: DESC-TBA @@ -14,7 +14,7 @@ */ disableSerialization; //[[[cog import generate_private_arrays ]]] -private ["_action","_arr","_buttonSettings","_c","_cfg","_checkConfigs","_config","_configs","_dName","_display","_entries","_hasTarget","_icon","_in","_selfOrTarget","_subclasses","_tTip","_tooltip","_tooltipcode","_x"]; +private ["_iconcode","_action","_arr","_buttonSettings","_c","_cfg","_checkConfigs","_config","_configs","_dName","_display","_entries","_hasTarget","_icon","_in","_selfOrTarget","_subclasses","_tTip","_tooltip","_tooltipcode","_x"]; //[[[end]]] _in = [_this, 0, "",[""]] call BIS_fnc_param; @@ -33,14 +33,18 @@ _hasTarget = !(dyna_cursorTarget isEqualTo objNull); if (isNull _display && dialog) exitWith {false call Epoch_dynamicMenuCleanup; false}; if (isNull _display) then { - if (_hasTarget) then { - createDialog "rmx_dynamenu"; + if!(visibleMap)then{ + if (_hasTarget) then { + createDialog "rmx_dynamenu"; + } else { + findDisplay 46 createDisplay "rmx_dynamenu"; + } } else { - findDisplay 46 createDisplay "rmx_dynamenu"; + findDisplay 12 createDisplay "rmx_dynamenu"; }; }; -_selfOrTarget = if !(_hasTarget) then {"self"} else {"target"}; +_selfOrTarget = if!(visibleMap)then{ if !(_hasTarget) then {"self"} else {"target"} } else {"map"}; _checkConfigs = { _config = switch (_in) do { @@ -100,7 +104,7 @@ _checkConfigs = { { if (call compile (getText(_x >> "condition"))) then { - if (_selfOrTarget isEqualTo "self" || dyna_distance) then { + if (_selfOrTarget in ["self","map"] || dyna_distance) then { _subclasses = configProperties [_x, "isClass _x",true]; @@ -118,9 +122,21 @@ _checkConfigs = { else { _tooltip = getText(_x >> "tooltip"); }; + + _icon = ""; + _iconcode = getText(_x >> "iconcode"); + if (_iconcode != "") then { + _icon = [] call compile _iconcode; + } + else { + _icon = getText(_x >> "icon"); + }; + if (!(_icon isequaltype "") || _icon isequalto "") then { + _icon = "x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa"; + }; _buttonSettings pushBack [ - getText(_x >> "icon"), + _icon, _tooltip, _action ]; @@ -133,7 +149,7 @@ _checkConfigs = { }; call _checkConfigs; -if (_buttonSettings isEqualTo []) then {_selfOrTarget = "self"; call _checkConfigs;}; +if (_buttonSettings isEqualTo []) then {_selfOrTarget = if!(visibleMap)then{"self"}else{"map"}; call _checkConfigs;}; _entries = count _buttonSettings; if !(_entries <= 0) then { diff --git a/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuPopulate.sqf b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuPopulate.sqf index a518bb6d..a18b6cfc 100644 --- a/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuPopulate.sqf +++ b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuPopulate.sqf @@ -46,10 +46,10 @@ _defaultScaleY = _scale * GUI_GRID_H; _distance = 0.6 + _entries / 100; //edit scaling here (divisor only, larger values produce smaller image) -_scaleLargeX = _defaultScaleX / (1.5 + _entries / 10); //anim -_scaleLargeY = _defaultScaleY / (1.5 + _entries / 10); -_scaleSmallX = _defaultScaleX / (3 + _entries / 10); //icons -_scaleSmallY = _defaultScaleY / (3 + _entries / 10); +_scaleLargeX = _defaultScaleX / (1 + _entries / 10); //anim +_scaleLargeY = _defaultScaleY / (1 + _entries / 10); +_scaleSmallX = _defaultScaleX / (2 + _entries / 10); //icons +_scaleSmallY = _defaultScaleY / (2 + _entries / 10); _points = 360 / _entries; @@ -73,22 +73,27 @@ for "_e" from 0 to (_entries - 1) do { _ctrl ctrlSetPosition (_positions select _e); _ctrl ctrlSetFade 1; _ctrl ctrlCommit 0; + [_ctrl,0.55,0.2] call BIS_fnc_ctrlSetScale; _ctrl ctrlSetTooltip (_buttonSettings select _e select 1); _ctrl ctrlSetTooltipColorBox [0, 0, 0, 0]; _ctrl ctrlSetTooltipColorShade [0, 0, 0, 0]; - _ctrl ctrlSetEventHandler ["mouseEnter", "_c = _this select 0; _c ctrlSetFade 0; [_c,0.85,0.1] call BIS_fnc_ctrlSetScale"]; - _ctrl ctrlSetEventHandler ["mouseExit", "_c = _this select 0; _c ctrlSetFade 1; [_c,1,0.1] call BIS_fnc_ctrlSetScale"]; + _ctrl ctrlSetEventHandler ["mouseEnter", "_c = _this select 0; _c ctrlSetFade 0; [_c,0.8,0.2] call BIS_fnc_ctrlSetScale"]; + _ctrl ctrlSetEventHandler ["mouseExit", "_c = _this select 0; _c ctrlSetFade 1; [_c,0.55,0.2] call BIS_fnc_ctrlSetScale"]; _ctrl ctrlSetEventHandler ["mouseButtonDown", (_buttonSettings select _e select 2)]; _ctrl ctrlEnable true; - _ctrl2 = _display ctrlCreate ["rmx_rscPicture",-(66600 + _e)]; + _ctrl2 = _display ctrlCreate ["RscPictureKeepAspect",-(66600 + _e)]; _ctrl2 ctrlSetTooltip (_buttonSettings select _e select 1); _ctrl2 ctrlSetTooltipColorBox [0, 0, 0, 0]; _ctrl2 ctrlSetTooltipColorShade [0, 0, 0, 0]; _ctrl2 ctrlSetText (_buttonSettings select _e select 0); + + _ctrl2 ctrlSetPosition [0.5,0.5,0,0]; + _ctrl2 ctrlCommit 0; + _ctrl2 ctrlSetPosition (_positions2 select _e); - _ctrl2 ctrlCommit 0.1; + _ctrl2 ctrlCommit 0.2; _arr = missionNamespace getVariable ["rmx_var_dynaControls",[]]; _arr append [_ctrl,_ctrl2]; diff --git a/Sources/epoch_code/gui/scripts/dynamicHUD/epoch_getHUDCtrl.sqf b/Sources/epoch_code/gui/scripts/dynamicHUD/epoch_getHUDCtrl.sqf index 719d540e..a2cc9f56 100644 --- a/Sources/epoch_code/gui/scripts/dynamicHUD/epoch_getHUDCtrl.sqf +++ b/Sources/epoch_code/gui/scripts/dynamicHUD/epoch_getHUDCtrl.sqf @@ -26,4 +26,5 @@ _gIdx = -1; if ((_x select 0) isEqualTo _gName) exitWith {_gIdx = _forEachIndex}; } forEach rmx_var_dynamicHUD_groupCTRL; if (_gIdx == -1) exitWith {controlNull}; -(rmx_var_dynamicHUD_groupCTRL select _gIdx) select _cIdx + +((rmx_var_dynamicHUD_groupCTRL select _gIdx) param [_cIdx,controlNull]) diff --git a/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_action.sqf b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_action.sqf new file mode 100644 index 00000000..867f9f23 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_action.sqf @@ -0,0 +1,63 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: manages actions when user presses favorites key + + 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_code/gui/scripts/favBar/epoch_favBar_action.sqf + + Usage: none +*/ +private ["_throw","_item","_slot","_dsp","_kee","_tileIdx","_itemHasInteraction","_force","_errorCode","_curSlot","_Fav_DropIfOverflow","_Fav_FastWeaponSwitching"]; +params ["_dsp","_kee"]; + +_tileIdx = switch (_kee) do { + case EPOCH_keysfav1:{0}; + case EPOCH_keysfav2:{1}; + case EPOCH_keysfav3:{2}; + case EPOCH_keysfav4:{3}; + case EPOCH_keysfav5:{4}; +}; + +_item = rmx_var_favBar_current select _tileIdx; +if (_item isequalto "") exitwith {false}; +_throw = ""; + { + if (_item in (getarray (_x >> "Magazines"))) exitwith { + _throw = configname _x; + }; + } foreach ("true" configClasses (configfile >> "CfgWeapons" >> "Throw")); +if !(_throw isequalto "") then { + player forceWeaponFire [_throw,_throw]; +} +else { + _itemHasInteraction = str(missionConfigFile >> "CfgItemInteractions" >> _item) != ""; + if (_itemHasInteraction) then { + EPOCH_InteractedItem = ["",_item,""]; + [] call EPOCH_consumeItem; + EPOCH_favBar_itemConsumed = true; + } else { + _Fav_DropIfOverflow = ["CfgEpochClient", "Fav_DropIfOverflow", false] call EPOCH_fnc_returnConfigEntryV2; + _slot = _item call epoch_itemTypeSlot; + _force = if (_slot in [3,4,5,7,8,10,11,16]) then {true} else {false}; //see how it works with other items, definitely keep true for weapons + _errorCode = [_item,_Fav_DropIfOverflow,_force] call epoch_equip; + player selectWeapon _item; + + if (_slot in [3,4,5]) then { + _curSlot = _item call epoch_itemTypeSlot; + _Fav_FastWeaponSwitching = ["CfgEpochClient", "Fav_FastWeaponSwitching", false] call EPOCH_fnc_returnConfigEntryV2; + if (_curSlot == _slot && !_Fav_FastWeaponSwitching && _errorCode in [1,2]) then {player playAction "reloadMagazine";}; + }; + + if (_errorCode isEqualTo 2) then {"Not enough space, item dropped on the ground!" call epoch_message;}; + if (_errorCode isEqualTo 4 && _item != (currentWeapon player)) then {"Not enough space!" call epoch_message;}; + if (_errorCode isEqualTo 3) then {"Item not found!" call epoch_message;}; + if (_errorCode isEqualTo 5) then {"No compatible weapon found!" call epoch_message;}; + }; +}; +true diff --git a/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_draw.sqf b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_draw.sqf new file mode 100644 index 00000000..67243a78 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_draw.sqf @@ -0,0 +1,122 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: manages drawing of favbar changes + + 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_code/gui/scripts/favBar/epoch_favBar_draw.sqf + + Usage: none +*/ +disableSerialization; +private ["_action","_idx","_bidx","_mod","_baritems","_Fav_BannedItems"]; +params ["_action","_idx","_bidx","_mod"]; +_Fav_BannedItems = ["CfgEpochClient", "Fav_BannedItems", []] call EPOCH_fnc_returnConfigEntryV2; + +switch _action do { + case "load": + { + private ["_tmp","_c","_p"]; + rmx_var_favBar_MNone = profileNamespace getVariable ["rmx_var_favBar_MNone",["","","","",""]]; + rmx_var_favBar_MCtrl = profileNamespace getVariable ["rmx_var_favBar_MCtrl",["","","","",""]]; + rmx_var_favBar_MShift = profileNamespace getVariable ["rmx_var_favBar_MShift",["","","","",""]]; + rmx_var_favBar_MAlt = profileNamespace getVariable ["rmx_var_favBar_MAlt",["","","","",""]]; + { + _baritems = _x; + { + if (_x in _Fav_BannedItems) then { + _baritems set [_foreachindex,""]; + }; + } foreach _x; + } foreach [rmx_var_favBar_MNone,rmx_var_favBar_MCtrl,rmx_var_favBar_MShift,rmx_var_favBar_MAlt]; + + rmx_var_favBar_current = rmx_var_favBar_MNone; + + waitUntil {uiSleep 0.1; ctrlShown (["fav_equipped", 1] call epoch_getHUDCtrl)}; + + _tmp = ctrlPosition (["fav_pic_bg", 1] call epoch_getHUDCtrl); + + for "_i" from 1 to 5 do { + _c = (["fav_equipped", _i] call epoch_getHUDCtrl); + _c ctrlSetText "#(rgb,8,8,3)color(1,1,1,0.7)"; + _p = ctrlPosition _c; + _p set [2, (_tmp select 2)/10]; + _p set [3, (_tmp select 3)/10]; + _c ctrlSetPosition _p; + _c ctrlCommit 0; + }; + + call epoch_favBar_drawCurrent; + call epoch_favBar_refresh; + }; + case "add": + { + private ["_type","_isBanned","_isAmmo","_itemIsWeapon","_itemHasInteraction","_c"]; + if (rmx_var_favBar_Item in _Fav_BannedItems) exitWith {"Item is not allowed in favorites!" call epoch_message; false}; + if (rmx_var_favBar_Item in rmx_var_favBar_current) exitWith {"Item already exists in favorites!" call epoch_message; false}; //if duplicate + + _type = (rmx_var_favBar_Item call BIS_fnc_itemType) select 1; + _isBanned = _type in ["BombLauncher", "Cannon", "GrenadeLauncher", "Launcher", "MissileLauncher", "RocketLauncher", "Magazine", "Mortar", "Shotgun","Rocket", "BarrelBomb2_EPOCH_Remote_Mag","BarrelBomb_EPOCH_Remote_Mag"]; + _isAmmo = _type == "Bullet" && !(rmx_var_favBar_Item in ["EnergyPack","EnergyPackLg"]); + + //if (_type in ["AccessoryMuzzle","AccessoryPointer","AccessorySights","AccessoryBipod"]) exitWith {"Attachments are not supported at the moment!" call epoch_message; false}; + if (_isBanned || _isAmmo) exitWith {"Item cannot be added to favorites!" call epoch_message; false}; //Don't allow certain types + + _itemIsWeapon = [rmx_var_favBar_Item, "CfgWeapons"] call EPOCH_fnc_isAny; + _itemHasInteraction = str(missionConfigFile >> "CfgItemInteractions" >> rmx_var_favBar_Item) != ""; + + if (!_itemIsWeapon && !_itemHasInteraction && rmx_var_favBar_Item == "") exitWith {"Please equip item first and try again!" call epoch_message; false}; //Workaround + + rmx_var_favBar_current set [_idx,rmx_var_favBar_Item]; + + switch EPOCH_modKeys do { + case [true,false,false]: //shift + { + rmx_var_favBar_MShift set [_idx,rmx_var_favBar_Item]; + profileNamespace setVariable ["rmx_var_favBar_MShift",rmx_var_favBar_MShift]; + rmx_var_favBar_current = rmx_var_favBar_MShift; + }; + case [false,true,false]: //Ctrl + { + rmx_var_favBar_MCtrl set [_idx,rmx_var_favBar_Item]; + profileNamespace setVariable ["rmx_var_favBar_MCtrl",rmx_var_favBar_MCtrl]; + rmx_var_favBar_current = rmx_var_favBar_MCtrl; + }; + case [false,false,true]: //Alt + { + rmx_var_favBar_MAlt set [_idx,rmx_var_favBar_Item]; + profileNamespace setVariable ["rmx_var_favBar_MAlt",rmx_var_favBar_MAlt]; + rmx_var_favBar_current = rmx_var_favBar_MAlt; + }; + default { //Any other combo or no modifier + rmx_var_favBar_MNone set [_idx,rmx_var_favBar_Item]; + profileNamespace setVariable ["rmx_var_favBar_MNone",rmx_var_favBar_MNone]; + rmx_var_favBar_current = rmx_var_favBar_MNone; + }; + }; + //draw current here + if !(rmx_var_favBar_Item isEqualTo "") then { + _c = (["fav_pic", _idx+1] call epoch_getHUDCtrl); + _c ctrlSetText (rmx_var_favBar_Item call EPOCH_itemPicture); + }; + }; + case "remove": + { + if (_bidx == 1) then { //if right mouse click + rmx_var_favBar_current set [_idx,""]; + _c = (["fav_pic", _idx+1] call epoch_getHUDCtrl); + _c ctrlSetText ""; + }; + }; + default {systemChat "fail"}; +}; + +for "_i" from 1 to 5 do { + (["fav_pic_bg", _i] call epoch_getHUDCtrl) ctrlSetText "x\addons\a3_epoch_code\Data\UI\favbar\fav_bg.paa"; +}; +true diff --git a/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_drawCurrent.sqf b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_drawCurrent.sqf new file mode 100644 index 00000000..1c8f7912 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_drawCurrent.sqf @@ -0,0 +1,5 @@ +for "_i" from 0 to 4 do { + _c = (["fav_pic", _i+1] call epoch_getHUDCtrl); + _c ctrlSetText ((rmx_var_favBar_current select _i) call EPOCH_itemPicture); +}; +true \ No newline at end of file diff --git a/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_getGearItem.sqf b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_getGearItem.sqf new file mode 100644 index 00000000..ee54c943 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_getGearItem.sqf @@ -0,0 +1,33 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: no use outside favbar probably. Weapons return display names only, so this hack allows getting their className + + 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_code/gui/scripts/favBar/epoch_favBar_getGearItem.sqf + + Usage: none + + RETURNS: classname for item in inventory +*/ +private ["_return","_dispName","_idx","_className"]; +(_this select 1 select 0) params ["_dispName","_idx","_className"]; +_return = ""; + +if (_className isEqualTo "") then { //do itemsWithMagazines instead + +{ + _txt = getText (configFile >> "CfgWeapons" >> _x >> "displayName"); + if (_txt isEqualTo _dispName) exitWith {_return = _x}; +} forEach (items player); + +} else { + _return = _className; +}; + +_return \ No newline at end of file diff --git a/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_getItemByIDC.sqf b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_getItemByIDC.sqf new file mode 100644 index 00000000..803bb16b --- /dev/null +++ b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_getItemByIDC.sqf @@ -0,0 +1,136 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: Returns className of an item or weapon from inventory IDC + This function has no practical use outside of Favorite Bar menu due to IDC used as a case + + 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_code/gui/scripts/favBar/epoch_favBar_getItemByIDC.sqf + + Usage: none +*/ +private ["_item","_ammo","_cnt"]; +//switch + +_item = switch (_this) do { + case 610: //Primary + { + primaryWeapon player + }; + case 620: //Primary silencer + { + (primaryWeaponItems player) select 0 + }; + case 621: //Primary Optic (TWS) + { + (primaryWeaponItems player) select 2 + }; + case 622: //Primary Flashlight/Laser + { + (primaryWeaponItems player) select 1 + }; + case 641: //Primary bipod + { + (primaryWeaponItems player) select 3 + }; + case 644: //Primary Grenade shell + { + _ammo = primaryWeaponMagazine player; + _cnt = count _ammo; + if (_cnt > 0) then { + if (_cnt > 1) then { + _ammo select 1 + } else { + _ammo select 0 + }; + } else {""}; + }; + case 623: //Primary Magazine + { + _ammo = primaryWeaponMagazine player; + _cnt = count _ammo; + if (_cnt > 0) then { + _ammo select 0 + } else {""}; + }; + case 611: //Secondary + { + secondaryWeapon player + }; + case 624: //Secondary silencer + { + (secondaryWeaponItems player) select 0 + }; + case 625: //Secondary Optic (TWS) + { + (secondaryWeaponItems player) select 2 + }; + case 626: //Secondary Flashlight/Laser + { + (secondaryWeaponItems player) select 1 + }; + case 642: //Secondary bipod + { + (secondaryWeaponItems player) select 3 + }; + case 627: //Secondary Magazine + { + _ammo = secondaryWeaponMagazine player; + _cnt = count _ammo; + if (_cnt > 0) then { + _ammo select 0 + } else {""}; + }; + case 612: //Handgun + { + handgunWeapon player + }; + case 628: //Handgun silencer + { + (handgunItems player) select 0 + }; + case 629: //Handgun Optic (TWS) + { + (handgunItems player) select 2 + }; + case 630: //Handgun Flashlight/Laser + { + (handgunItems player) select 1 + }; + case 643: //Handgun bipod + { + (handgunItems player) select 3 + }; + case 631: //Handgun Magazine + { + _ammo = handgunMagazine player; + _cnt = count _ammo; + if (_cnt > 0) then { + _ammo select 0 + } else {""}; + }; + case 6240: //headgear + { + headgear player; + }; + case 6216: //goggles + { + goggles player; + }; + case 6217: //hmd + { + hmd player; + }; + case 6238: //goggles + { + binocular player; + }; + default {""}; +}; + +_item diff --git a/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_inventory.sqf b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_inventory.sqf new file mode 100644 index 00000000..bfa115e5 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_inventory.sqf @@ -0,0 +1,90 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: loaded every time Gear menu is opened + + + Developer's FYI: + To increase amount of favorite bars you need to edit: + CfgDynamicHUD.hpp - increase array sizes for fav_*, maybe even width/height + EPOCH_clientKeyMap.sqf - add keys to keymap array + EPOCH_keyDown.sqf - add new keys to dikCode check array + epoch_favBar_action.sqf - add tile indexes for new keymaps + epoch_favBar_draw.sqf - increase FOR loop accordingly + epoch_favBar_refresh.sqf - increase FOR loop accordingly + THIS script - increase FOR loop accordingly + + 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_code/gui/scripts/favBar/epoch_favBar_inventory.sqf + + Usage: none +*/ +private ["_display","_c","_gIdx","_g"]; + +if !(["CfgEpochClient", "Fav_enableFavoriteBar", true] call EPOCH_fnc_returnConfigEntryV2) exitWith {false}; +disableSerialization; +waitUntil {!isNull findDisplay 602}; + +_display = (findDisplay 602); +_display displayAddEventHandler ["MouseButtonUp","[] spawn {rmx_var_fav_selected = false}"]; +rmx_var_fav_selected = false; +{ + _c = _display displayCtrl _x; + _c ctrlAddEventHandler ["LBDrag","rmx_var_favBar_Item = (_this call epoch_favBar_getGearItem); rmx_var_fav_selected = true"]; +} forEach [619,638,633]; +// call epoch_getGearItem; +//(_this select 1 select 0 select 2) +{ + _c = _display displayCtrl _x; + _c ctrlAddEventHandler ["MouseButtonDown",(format ["call epoch_favBar_modifier; rmx_var_favBar_Item = %1 call epoch_favBar_getItemByIDC; rmx_var_fav_selected = true",_x])]; +} forEach [610,620,641,622,621,644,623,611,624,642,626,625,627,612,628,643,630,629,631,6240,6216,6217,6238]; + +_gIdx = 0; + +{ + if ((_x select 0) isEqualTo "fav_pic") exitWith {_gIdx = _forEachIndex}; +} forEach rmx_var_dynamicHUD_groupCTRL; + +_g = _display ctrlCreate ["rmx_rscControlsGroup",125342]; +_g ctrlSetPosition (ctrlPosition (rmx_var_dynamicHUD_groups select _gIdx)); +_g ctrlCommit 0; +for "_i" from 0 to 4 do { + + _c = _display ctrlCreate ["RscPictureKeepAspect",125342+_i,_g]; + _c ctrlSetPosition (ctrlPosition (["fav_pic", _i + 1] call epoch_getHUDCtrl)); + _c ctrlSetText "#(rgb,8,8,3)color(1,1,1,0.1)"; + _c ctrlCommit 0; + _c ctrlSetEventHandler ["MouseButtonUp",format["['remove',%1,(_this select 1)] call epoch_favBar_draw;",_i]]; + _c ctrlSetEventHandler ["MouseEnter",format ["if (rmx_var_fav_selected) then {['add',%1] call epoch_favBar_draw; rmx_var_fav_dragging = false}",_i]]; + _c ctrlEnable true; + + _c = _display ctrlCreate ["RscPictureKeepAspect",125342+_i,_g]; + _c ctrlSetPosition (ctrlPosition (["fav_pic_bg", _i + 1] call epoch_getHUDCtrl)); + _c ctrlSetText "x\addons\a3_epoch_code\Data\UI\favbar\fav_bg2.paa"; + _c ctrlSetTextColor [0,0,0,0.5]; + _c ctrlCommit 0; +}; + +for "_i" from 1 to 5 do { + (["fav_keymap", _i] call epoch_getHUDCtrl) ctrlShow true; + (["fav_pic_bg", _i] call epoch_getHUDCtrl) ctrlShow true; +}; + +true +/* +{ +_crl = _display displayCtrl _x; +_c = _display ctrlCreate ["RscText",1253422+_forEachIndex]; +_c ctrlSetPosition (ctrlPosition _crl); +_c ctrlSetText (format ["%2",ctrlClassName _crl, _x]); +_c ctrlCommit 0; +}foreach [610,620,641,622,621,644,623,611,624,642,626,625,627,612,628,643,630,629,631,6240,6216,6217,6238]; +*/ +//Listboxes? +//6325,1241 +//619,638,633 \ No newline at end of file diff --git a/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_modifier.sqf b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_modifier.sqf new file mode 100644 index 00000000..0f9b479d --- /dev/null +++ b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_modifier.sqf @@ -0,0 +1,9 @@ +switch EPOCH_modKeys do { +case [true,false,false]:{rmx_var_favBar_current = rmx_var_favBar_MShift;}; +case [false,true,false]:{rmx_var_favBar_current = rmx_var_favBar_MCtrl;}; +case [false,false,true]:{rmx_var_favBar_current = rmx_var_favBar_MAlt;}; +default {rmx_var_favBar_current = rmx_var_favBar_MNone;}; +}; +call epoch_favBar_drawCurrent; +call epoch_favBar_refresh; +true \ No newline at end of file diff --git a/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_refresh.sqf b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_refresh.sqf new file mode 100644 index 00000000..006e7faa --- /dev/null +++ b/Sources/epoch_code/gui/scripts/favBar/epoch_favBar_refresh.sqf @@ -0,0 +1,63 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: + + Description: This is called by event1.sqf every 1 second as well as every time mod key is pressed. + + 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_code/gui/scripts/favBar/epoch_favBar_refresh.sqf + + Usage: none +*/ + +if !(["CfgEpochClient", "Fav_enableFavoriteBar", true] call EPOCH_fnc_returnConfigEntryV2) exitWith {false}; +private ["_playerItems","_equipped","_mod","_txt"]; + +_playerItems = itemsWithMagazines player; +_equipped = [primaryWeapon player, secondaryWeapon player, handgunWeapon player, headgear player, goggles player, hmd player, binocular player]; +_equipped append (primaryWeaponItems player + primaryWeaponMagazine player + secondaryWeaponItems player + secondaryWeaponMagazine player + handgunItems player + handgunMagazine player); +_equipped append (assignedItems player); + +_mod = switch EPOCH_modKeys do { + case [true,false,false]: {"Shift + "}; + case [false,true,false]: {"Ctrl + "}; + case [false,false,true]: {"Alt + "}; + default {""}; +}; + +for "_i" from 1 to 5 do { + _txt = missionNamespace getVariable [format["EPOCH_keysfav%1",_i],"N/A"]; + (["fav_keymap", _i] call epoch_getHUDCtrl) ctrlSetText (_mod + (_txt call BIS_fnc_keyCode)); +}; + +{ + if (_x != "") then { + (["fav_pic_bg", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlShow true; + (["fav_keymap", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlShow true; + + if (_x in _playerItems) then { + (["fav_pic", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlSetTextColor [1,1,1,1]; + } else { + (["fav_pic", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlSetTextColor [1,0,0,1]; + }; + + if (_x in _equipped) then { + (["fav_pic", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlSetTextColor [1,1,1,1]; + (["fav_equipped", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlShow true; + } else { + (["fav_equipped", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlShow false; + }; + } else { + (["fav_equipped", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlShow false; + + if (isNull findDisplay 602) then { + (["fav_pic_bg", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlShow false; + (["fav_keymap", _forEachIndex + 1] call epoch_getHUDCtrl) ctrlShow false; + }; + }; +}forEach rmx_var_favBar_current; +true \ No newline at end of file diff --git a/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_animate.sqf b/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_animate.sqf new file mode 100644 index 00000000..3c8b168e --- /dev/null +++ b/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_animate.sqf @@ -0,0 +1,57 @@ +disableSerialization; +_rads = param [0,0,[0]]; +_lcd = uiNamespace getVariable ["EPOCH_geiger_LCD",controlNull]; +_led = uiNamespace getVariable ["EPOCH_geiger_LED",controlNull]; + +if (_rads >= 10) then { + if (!EPOCH_geiger_mute_warning) then { + if (EPOCH_playerEnergy > 0) then { + if (EPOCH_playerEnergy < 5) then { + playSound "geiger_epoch_alarm_low"; + } else { + playSound "geiger_epoch_alarm"; + }; + }; + }; + [] spawn { + disableSerialization; + _lcd = uiNamespace getVariable ["EPOCH_geiger_LCD",controlNull]; + _lcd ctrlSetFade 1; + _lcd ctrlCommit 1; + uiSleep 1; + if (EPOCH_playerEnergy <= 100) then { + _lcd ctrlSetFade 1-(EPOCH_playerEnergy / 100); + } else { + _lcd ctrlSetFade 0; + }; + _lcd ctrlCommit 1; + }; +}; + +for "_i" from 1 to (ceil _rads) do { + if (!EPOCH_geiger_mute_counter) then { + if (EPOCH_playerEnergy > 0) then { + + if (EPOCH_playerEnergy < 5) then { + playSound "geiger_epoch_tick_low"; + } else { + playSound "geiger_epoch_tick"; + }; + }; + }; + _led ctrlSetText "x\addons\a3_epoch_assets_1\pictures\geiger\geiger_4on"; + uiSleep (random 0.5); + _led ctrlSetText ""; +}; + +if (EPOCH_playerEnergy <= 100) then { + _lcd ctrlSetFade 1-(EPOCH_playerEnergy / 100); + _lcd ctrlCommit 1; + _led ctrlSetFade 1-(EPOCH_playerEnergy / 100); + _led ctrlCommit 1; +} else { + _lcd ctrlSetFade 0; + _lcd ctrlCommit 1; + _led ctrlSetFade 0; + _led ctrlCommit 1; +}; \ No newline at end of file diff --git a/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_show_hide.sqf b/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_show_hide.sqf new file mode 100644 index 00000000..0b8e228c --- /dev/null +++ b/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_show_hide.sqf @@ -0,0 +1,44 @@ +_removeControls = { + EPOCH_geiger_shown = false; + for "_i" from 1 to 8 do{ + (["geigerCounter", _i] call epoch_getHUDCtrl) ctrlSetText ""; + }; + ctrlDelete (uiNamespace getVariable ["EPOCH_geiger_LCD",controlNull]); + ctrlDelete (uiNamespace getVariable ["EPOCH_geiger_LED",controlNull]); +}; + +if !('ItemGeigerCounter_EPOCH' in assignedItems player) exitWith {call _removeControls; false}; + +if (ctrlText(["geigerCounter", 1] call epoch_getHUDCtrl) isEqualTo "") then { + EPOCH_geiger_shown = true; + + for "_i" from 1 to 8 do{ + (["geigerCounter", _i] call epoch_getHUDCtrl) ctrlSetText format ["x\addons\a3_epoch_assets_1\pictures\geiger\geiger_%1",_i]; + }; + _ledBG = (["geigerCounter", 4] call epoch_getHUDCtrl); + _lcdBG = (["geigerCounter", 5] call epoch_getHUDCtrl); + _lcdPos = ctrlPosition _lcdBG; + _ledPos = ctrlPosition _ledBG; + _parent = ctrlParentControlsGroup _lcdBG; + + _lcdPos set [0,(_lcdPos select 2) / 3.35]; + _lcdPos set [2,(_lcdPos select 2) * 43 / 100]; + + _lcd = (findDisplay 46) ctrlCreate ["rmx_geigerTXT",65765,_parent]; + _lcd ctrlSetPosition _lcdPos; + _lcd ctrlCommit 0; + _lcd ctrlSetText ""; //(random 1000 toFixed 1); + + _led = (findDisplay 46) ctrlCreate ["RscPicture",65766,_parent]; + _led ctrlSetPosition _ledPos; + _led ctrlCommit 0; + _led ctrlSetText ""; //"x\addons\a3_epoch_assets_1\pictures\geiger\geiger_4on"; + + uiNamespace setVariable ["EPOCH_geiger_LCD",_lcd]; + uiNamespace setVariable ["EPOCH_geiger_LED",_led]; + if (EPOCH_playerEnergy <= 20) then {"Low Energy!" call epoch_message;}; +} else { + call _removeControls; +}; + +true \ No newline at end of file diff --git a/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_simulate.sqf b/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_simulate.sqf new file mode 100644 index 00000000..c4a2cd52 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/geiger/epoch_geiger_simulate.sqf @@ -0,0 +1,51 @@ +disableSerialization; +_energyRange = _this; +_lcd = uiNamespace getVariable ["EPOCH_geiger_LCD",controlNull]; +_led = uiNamespace getVariable ["EPOCH_geiger_LED",controlNull]; + +_src = nearestObjects[player,["All"],_energyRange]; +_radObjects = _src select {(_x getVariable ["EPOCH_Rads", []]) select 0 > 0}; +_rads = 0; +{ + _reldir = player getRelDir _x; + + if (_reldir > 315 || _reldir < 45) then { //only capture 90 degrees in front of player + _reldir = if (_reldir > 315) then { 360 - _reldir} else {_reldir}; //convert into 0-45 degrees + _prc = 100 - (_reldir / 45 * 100); //current direction percent, 45 = 100% + + _x getVariable "EPOCH_Rads" params ["_str","_intensity"]; + _dist = player distance _x; + _radIntensity = if (_dist <= _intensity) then { //only capture rads when within distance + _rds = (_str / _dist); + _rdsPrc = (_prc / 100 * _rds); + _rdsPrc + } else { + 0 + }; + _rads = _rads + _radIntensity + }; +} forEach _radObjects; //sum up radiation of all objects in vicinity and in FOV + +{ + _location = []; + _LocName = (_x select 0) joinString " "; + { + if( (str _x) == _LocName ) exitwith { _location = _x; }; + } foreach EPOCH_nearestLocations; + if !(_location isEqualTo []) then { + _x select 1 params ["_str","_intensity"]; + _dist = player distance getPos _location; + _radIntensity = if (_dist <= _intensity) then { + _str / _dist + } else { + 0 + }; + _rads = _rads + _radIntensity; + }; +}foreach EPOCH_radioactiveLocations; //sum up radiation of all radiactive locations in vicinity + +_rads = _rads + EPOCH_ambientRadiation; +_lcd ctrlSetText format ["%1r",_rads toFixed 1]; +_rads spawn epoch_geiger_animate; + +true diff --git a/Sources/epoch_code/gui/scripts/group/EPOCH_Group_BtnLeave.sqf b/Sources/epoch_code/gui/scripts/group/EPOCH_Group_BtnLeave.sqf index b9f3724f..83c4f768 100644 --- a/Sources/epoch_code/gui/scripts/group/EPOCH_Group_BtnLeave.sqf +++ b/Sources/epoch_code/gui/scripts/group/EPOCH_Group_BtnLeave.sqf @@ -16,7 +16,6 @@ private ["_BtnLeave","_ret","_txt"]; //[[[end]]] disableSerialization; -_BtnLeave = (findDisplay -1300) displayCtrl 31; Epoch_my_Group params [ ["_groupName",""], ["_leaderName",""], @@ -25,7 +24,6 @@ Epoch_my_Group params [ ["_memberArray",[]] ]; if (getPlayerUID player == Epoch_my_GroupUID) then { - _BtnLeave ctrlSetText "Delete Group"; _txt = format["Do you want to delete your Group called %1?",_groupName]; _txt spawn { _ret = [_this,"Epoch Group Menu",true,true] call BIS_fnc_GUImessage; diff --git a/Sources/epoch_code/gui/scripts/group/EPOCH_Group_onLoad.sqf b/Sources/epoch_code/gui/scripts/group/EPOCH_Group_onLoad.sqf index 8334b4c7..da3906ab 100644 --- a/Sources/epoch_code/gui/scripts/group/EPOCH_Group_onLoad.sqf +++ b/Sources/epoch_code/gui/scripts/group/EPOCH_Group_onLoad.sqf @@ -82,6 +82,10 @@ if (_currentMaxMember < _groupSize) then { }; }; +if (_playerIsLeader) then { + (findDisplay -1300) displayCtrl 31 ctrlSetText "Delete Group"; +}; + { _picture = EPOCH_group_level_img select _forEachIndex; //0 = lead / 1 = mod / 2 = member diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_cTempGroup_BtnCreate.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_cTempGroup_BtnCreate.sqf new file mode 100644 index 00000000..244871e9 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_cTempGroup_BtnCreate.sqf @@ -0,0 +1,47 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_cTempGroup_BtnCreate.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_array","_groupName","_ret","_timeout","_txt","_txtCtrl","_upgradePrice"]; +//[[[end]]] +disableSerialization; +_txtCtrl = (findDisplay -1200) displayCtrl 21; +_array = toArray(ctrlText _txtCtrl); + +if (count _array > 24) then { + _array resize 24; +}; + +if (count (_array-[32]) == 0) then { //32 = SPACE + ["Your group need a name!","Epoch Temp Group Menu",true,false] spawn BIS_fnc_GUImessage; +} else { + _groupName = toString(_array); + _txtCtrl ctrlSetText _groupName; + + _groupName spawn { + _txt = format["Do you want to create your temp group called %1? You can disband/leave this group to create a new one!",_this]; + _ret = [_txt,"Epoch Temp Group Menu",true,true] call BIS_fnc_GUImessage; + if (_ret) then { + [player,_this,Epoch_personalToken] remoteExec ["EPOCH_server_createTempGroup",2]; + _timeout = diag_tickTime+10; + waitUntil { + ((Epoch_my_tempGroupUID != "") && !(Epoch_my_tempGroup isEqualTo [])) || ((_timeout - diag_tickTime) <= 0) + }; + (findDisplay -1200) closeDisplay 0; + if ((Epoch_my_tempGroupUID != "") && !(Epoch_my_tempGroup isEqualTo [])) then { + createDialog "Epoch_myTempGroup"; + }; + }; + }; +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_cTempGroup_onLoad.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_cTempGroup_onLoad.sqf new file mode 100644 index 00000000..7c938060 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_cTempGroup_onLoad.sqf @@ -0,0 +1,21 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_cTempGroup_onLoad.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_textCtrl"]; +//[[[end]]] +if!(Epoch_my_tempGroup isEqualTo [])exitWith {(findDisplay -1200) closeDisplay 0}; +disableSerialization; +_textCtrl = (findDisplay -1200) displayCtrl 22; +_textCtrl CtrlSetText format ["%1, Temp Groups are free forever",name player]; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_acceptInvite.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_acceptInvite.sqf new file mode 100644 index 00000000..3b83e46e --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_acceptInvite.sqf @@ -0,0 +1,18 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_itempGroup_acceptInvite.sqf +*/ +if (Epoch_invited_tempGroupUID != "") then { + [Epoch_invited_tempGroupUID,getPlayerUID player,true,false,player,Epoch_personalToken] remoteExec ["EPOCH_server_updatePlayerTempGroup",2]; +}; +(findDisplay -1500) closeDisplay 0; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_onLoad.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_onLoad.sqf new file mode 100644 index 00000000..91160404 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_onLoad.sqf @@ -0,0 +1,22 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_iTempGroup_onLoad.sqf +*/ +disableSerialization; +//[[[cog import generate_private_arrays ]]] +private ["_display","_text"]; +//[[[end]]] +_display = findDisplay -1400; +if (Epoch_invited_tempGroupUID == "" || Epoch_invited_tempGroupName == "") exitWith { _display closeDisplay 0}; +_text = _display displayCtrl 21; +_text ctrlSetText format ["Join the temp group called %1?",Epoch_invited_tempGroupName]; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_refresh.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_refresh.sqf new file mode 100644 index 00000000..743016f0 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_iTempGroup_refresh.sqf @@ -0,0 +1,25 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_iTempGroup_refresh.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_index"]; +//[[[end]]] +if !(Epoch_invited_tempGroupUIDs isEqualTo []) then { + Epoch_invited_tempGroupUIDsPrev = Epoch_invited_tempGroupUIDs; + lbClear 1500; + { + _index = lbAdd[1500, _x select 1]; + lbSetData[1500, _index, _x select 0]; + } forEach Epoch_invited_tempGroupUIDs; +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnInvite.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnInvite.sqf new file mode 100644 index 00000000..9ac7c09e --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnInvite.sqf @@ -0,0 +1,58 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_tempGroup_BtnInvite.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_BtnInvite","_InvitePlayerCombo","_groupSize","_currentMember","_found","_playerName","_playerUID","_ret","_txt","_upgradePrice","_upgradeSlots"]; +//[[[end]]] +disableSerialization; +_BtnInvite = (findDisplay -1300) displayCtrl 30; +_playerUID = getPlayerUID player; + +Epoch_my_tempGroup params [ + ["_groupName",""], + ["_leaderName",""], + ["_groupSize",0], + ["_modArray",[]], + ["_memberArray",[]] +]; + +Epoch_my_Group params [ + ["_groupName2",""], + ["_leaderName2",""], + ["_groupSize2",0], + ["_modArray2",[]], + ["_memberArray2",[]] +]; + +if (_playerUID == Epoch_my_tempGroupUID || {_x select 0 == _playerUID}count (_modArray) > 0) then { + _currentMember = count(_modArray) + count(_memberArray) + 1; + if (_currentMember < _groupSize) then { + _InvitePlayerCombo = (findDisplay -1300) displayCtrl 41; + _playerUID = _InvitePlayerCombo lbData (lbCurSel _InvitePlayerCombo); + _playerName = _InvitePlayerCombo lbText (lbCurSel _InvitePlayerCombo); + if (_playerUID != "" && _playerName != "" && ({_playerUID in _x} count (_modArray) == 0) && ({_playerUID in _x} count (_memberArray) == 0) && ({_playerUID in _x} count (_modArray2) == 0) && ({_playerUID in _x} count (_memberArray2) == 0) && !(_playerUID == Epoch_my_tempGroupUID)) then { + _txt = format["Do you want to add %1 to your Temp Group?",_playerName]; + [_playerUID,_txt,_groupName] spawn { + params ["_playerUID","_txt","_groupName"]; + _ret = [_txt,"Epoch Temp Group Menu",true,true] call BIS_fnc_GUImessage; + if (_ret) then { + [_playerUID,Epoch_my_tempGroupUID,_groupName,player,Epoch_personalToken] remoteExec ["EPOCH_server_invitePlayerTempGroup",2]; + }; + }; + }; + }; + true +} else { + false +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnKick.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnKick.sqf new file mode 100644 index 00000000..d951af2f --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnKick.sqf @@ -0,0 +1,48 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_tempGroup_BtnKick.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_BtnKick","_group","_playerName","_playerUID","_ret","_selected","_txt"]; +//[[[end]]] +disableSerialization; +_BtnKick = (findDisplay -1300) displayCtrl 33; + +_playerUID = getPlayerUID player; + +Epoch_my_tempGroup params [ + ["_groupName",""], + ["_leaderName",""], + ["_groupSize",0], + ["_modArray",[]], + ["_memberArray",[]] +]; + +if (_playerUID == Epoch_my_tempGroupUID || {_x select 0 == _playerUID}count (_modArray) > 0) then { + _group = (findDisplay -1300) displayCtrl 40; + _selected = lbCurSel _group; + if (_selected >= 0) then { + _playerUID = _group lbData _selected; + _playerName = _group lbText _selected; + if (_playerUID != "" && _playerName != "") then { + _txt = format["Do you want to kick %1 from your Temp Group?",_playerName]; + [_playerUID,_txt] spawn { + params ["_playerUID","_txt"]; + _ret = [_txt,"Epoch Temp Group Menu",true,true] call BIS_fnc_GUImessage; + if (_ret) then { + [Epoch_my_tempGroupUID,_playerUID,false,false,player,Epoch_personalToken] remoteExec ["EPOCH_server_updatePlayerTempGroup",2]; + }; + }; + }; + }; +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnLeave.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnLeave.sqf new file mode 100644 index 00000000..16ecedd5 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnLeave.sqf @@ -0,0 +1,42 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_tempGroup_BtnLeave.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_BtnLeave","_ret","_txt"]; +//[[[end]]] +disableSerialization; +Epoch_my_tempGroup params [ + ["_groupName",""], + ["_leaderName",""], + ["_groupSize",0], + ["_modArray",[]], + ["_memberArray",[]] +]; +if (getPlayerUID player == Epoch_my_tempGroupUID) then { + _txt = format["Do you want to delete your Temp Group called %1?",_groupName]; + _txt spawn { + _ret = [_this,"Epoch Temp Group Menu",true,true] call BIS_fnc_GUImessage; + if (_ret) then { + [player,Epoch_personalToken] remoteExec ["EPOCH_server_deleteTempGroup",2]; + }; + }; +} else { + _txt = format["Do you want to leave the %1 Temp Group?",_groupName]; + _txt spawn { + _ret = [_this,"Epoch Temp Group Menu",true,true] call BIS_fnc_GUImessage; + if (_ret) then { + [Epoch_my_tempGroupUID,getPlayerUID player,false,false,player,Epoch_personalToken] remoteExec ["EPOCH_server_updatePlayerTempGroup",2]; + }; + }; +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnMod.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnMod.sqf new file mode 100644 index 00000000..d60cbb51 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_BtnMod.sqf @@ -0,0 +1,46 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/group/EPOCH_Group_BtnMod.sqf +*/ +disableSerialization; +//[[[cog import generate_private_arrays ]]] +private ["_group","_isMember","_playerUID","_ret","_selected","_txt"]; +//[[[end]]] +if (getPlayerUID player == Epoch_my_tempGroupUID) then { + _group = (findDisplay -1300) displayCtrl 40; + _selected = lbCurSel _group; + if (_selected >= 0) then { + _playerUID = _group lbData _selected; + if (_playerUID != "") then { + _isMember = (_group lbPicture _selected) == (EPOCH_group_level_img select 2); + _txt = if (_isMember) then { + format["Do you want to give %1 moderator permissions?",_group lbText _selected]; + } else { + format["Do you want to remove %1 moderator permissions?",_group lbText _selected]; + }; + + [_playerUID,_isMember,_txt] spawn { + params ["_playerUID","_isMember","_txt"]; + _ret = [_txt,"Epoch Temp Group Menu",true,true] call BIS_fnc_GUImessage; + if (_ret) then { + [Epoch_my_tempGroupUID,_playerUID,true,_isMember,player,Epoch_personalToken] remoteExec ["EPOCH_server_updatePlayerTempGroup",2]; + }; + }; + }; + } else { + ["You need to select a player!", 5] call Epoch_message; + }; + true +} else { + false +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_Combo.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_Combo.sqf new file mode 100644 index 00000000..057443da --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_Combo.sqf @@ -0,0 +1,43 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/group/EPOCH_Group_Combo.sqf +*/ +disableSerialization; +//[[[cog import generate_private_arrays ]]] +private ["_BtnInvite","_ctrl","_currentMember","_playerUID","_selected"]; +//[[[end]]] + +Epoch_my_tempGroup params [ + ["_groupName",""], + ["_leaderName",""], + ["_groupSize",0], + ["_modArray",[]], + ["_memberArray",[]] +]; + +_ctrl = _this select 0; +_selected = _this select 1; +_playerUID = getPlayerUID player; +if (_playerUID == Epoch_my_tempGroupUID || {_x select 0 == _playerUID}count (_modArray) > 0) then { + _BtnInvite = (findDisplay -1300) displayCtrl 30; + _currentMember = count(_modArray) + count(_memberArray) + 1; + if (_currentMember < _groupSize) then { + _BtnInvite ctrlSetText format ["Invite %1",_ctrl lbtext _selected]; + }; + true +} else { + if (_selected != -1) then { + _ctrl lbSetCurSel -1; + }; + false +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_List.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_List.sqf new file mode 100644 index 00000000..2c51b38b --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_List.sqf @@ -0,0 +1,39 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_tempGroup_List.sqf +*/ +disableSerialization; +//[[[cog import generate_private_arrays ]]] +private ["_BtnKick","_BtnSetMod","_img"]; +//[[[end]]] +params ["_ctrl","_selected"]; + +if (getPlayerUID player == Epoch_my_tempGroupUID) then { + _img = _ctrl lbPicture _selected; + + _BtnSetMod = (findDisplay -1300) displayCtrl 32; + _BtnKick = (findDisplay -1300) displayCtrl 33; + + switch _img do { + case {getPlayerUID player == _ctrl lbData _selected}:{_BtnSetMod ctrlEnable false;_BtnKick ctrlEnable false}; + case(EPOCH_group_level_img select 0) : {_BtnSetMod ctrlEnable false; _BtnKick ctrlEnable false}; + case(EPOCH_group_level_img select 1) : {_BtnSetMod ctrlEnable true; _BtnKick ctrlEnable true; _BtnSetMod ctrlSetText "Remove Mod"}; + case(EPOCH_group_level_img select 2) : {_BtnSetMod ctrlEnable true; _BtnKick ctrlEnable true; _BtnSetMod ctrlSetText "Set Mod"}; + }; + true +} else { + if (_selected != -1) then { + _ctrl lbSetCurSel -1; + }; + false +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_invitePlayer.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_invitePlayer.sqf new file mode 100644 index 00000000..7370452f --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_invitePlayer.sqf @@ -0,0 +1,18 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/group/EPOCH_Group_invitePlayer.sqf +*/ +if !(_this in Epoch_invited_tempGroupUIDs) then { + Epoch_invited_tempGroupUIDs pushBack _this; + ["Temp Group request received", 5] call Epoch_message; +}; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_onLoad.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_onLoad.sqf new file mode 100644 index 00000000..72a3ec1f --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_onLoad.sqf @@ -0,0 +1,94 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_tempGroup_onLoad.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_BtnInvite","_GroupMemberList","_InvitePlayerCombo","_currentMaxMember","_display","_found","_index","_myPlayerUID","_onlinePUID","_picture","_playerIsLeader","_playerIsMod","_playerUID","_players"]; +//[[[end]]] +disableSerialization; +_display = findDisplay -1300; +_BtnInvite = _display displayCtrl 30; + +_GroupMemberList = _display displayCtrl 40; +_InvitePlayerCombo = _display displayCtrl 41; + +Epoch_my_tempGroup params [ + ["_groupName",""], + ["_leaderName",""], + ["_groupSize",0], + ["_modArray",[]], + ["_memberArray",[]] +]; + +_currentMaxMember = count(_modArray) + count(_memberArray) + 1; + +(_display displayCtrl 21) ctrlSetText format["Temp Name: %1 (%2/%3 Slots)",_groupName,_currentMaxMember,_groupSize]; + +_myPlayerUID = getPlayerUID player; +_playerIsLeader = _myPlayerUID == Epoch_my_tempGroupUID; +_playerIsMod = {_x select 0 == _myPlayerUID}count (_modArray) > 0; +(_display displayCtrl 32) ctrlEnable false; +(_display displayCtrl 33) ctrlEnable false; + +_onlinePUID = []; +{ + _onlinePUID pushBack (getPlayerUID _x); +}forEach (units group player); + +if (_currentMaxMember < _groupSize) then { + _players = player nearEntities [["Epoch_Male_F","Epoch_Female_F","LandVehicle","Ship","Air","Tank"], 10]; + + if (_playerIsLeader || _playerIsMod) then { + { + if (!isNull _x) then { + if (isPlayer _x && alive _x) then { + _index = _InvitePlayerCombo lbAdd format["%1",name _x]; + _InvitePlayerCombo lbSetData [_index,getPlayerUID _x]; + }; + }; + }forEach (_players-(units group player)); + }; + + if ((lbSize _InvitePlayerCombo) == 0) then { + _InvitePlayerCombo ctrlEnable false; + _BtnInvite ctrlEnable false; + _BtnInvite ctrlSetText (if (_playerIsLeader || _playerIsMod) then {"No one nearby to invite."} else {"Must be an Owner or a Mod to invite!"}); + } else { + _InvitePlayerCombo lbSetCurSel 0; + lbsort _InvitePlayerCombo; + }; +}; + +if (getPlayerUID player == Epoch_my_tempGroupUID) then { + (findDisplay -1300) displayCtrl 31 ctrlSetText "Delete TempGrp"; +}; + +{ + _picture = EPOCH_group_level_img select _forEachIndex; //0 = lead / 1 = mod / 2 = member + { + _playerUID = _x select 0; + + _index = _GroupMemberList lbAdd format["%1",_x select 1]; + _GroupMemberList lbSetColor [_index,if (_playerUID in _onlinePUID) then {[1,1,1,1]}else{[1,1,1,0.45]}]; + _GroupMemberList lbSetPicture [_index, _picture]; + + if (_playerIsLeader || _playerIsMod) then { + _GroupMemberList lbSetData [_index,_playerUID]; + }; + }forEach _x; +}forEach +[ + [[Epoch_my_tempGroupUID,_leaderName]], + _modArray, + _memberArray +]; diff --git a/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_update.sqf b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_update.sqf new file mode 100644 index 00000000..da19de8e --- /dev/null +++ b/Sources/epoch_code/gui/scripts/groupTemp/EPOCH_tempGroup_update.sqf @@ -0,0 +1,19 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/groupTemp/EPOCH_tempGroup_update.sqf +*/ +if (!isNull (findDisplay -1300)) then { + (findDisplay -1300) closeDisplay 0; + uisleep 0.2; + createDialog "Epoch_myTempGroup"; +}; diff --git a/Sources/epoch_code/gui/scripts/inventory/EPOCH_Inventory_itempGroup.sqf b/Sources/epoch_code/gui/scripts/inventory/EPOCH_Inventory_itempGroup.sqf new file mode 100644 index 00000000..d873f74e --- /dev/null +++ b/Sources/epoch_code/gui/scripts/inventory/EPOCH_Inventory_itempGroup.sqf @@ -0,0 +1,20 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/inventory/EPOCH_Inventory_itempGroup.sqf +*/ +disableSerialization; +(findDisplay 602) closeDisplay 0; +if !(Epoch_invited_tempGroupUIDs isEqualTo[]) exitWith { + createDialog "tempGroupRequests"; +}; +["No pending requests", 5] call Epoch_message; diff --git a/Sources/epoch_code/gui/scripts/inventory/EPOCH_Inventory_tempGroup.sqf b/Sources/epoch_code/gui/scripts/inventory/EPOCH_Inventory_tempGroup.sqf new file mode 100644 index 00000000..3199aacc --- /dev/null +++ b/Sources/epoch_code/gui/scripts/inventory/EPOCH_Inventory_tempGroup.sqf @@ -0,0 +1,17 @@ +/* + Author: Niklas Wagner - EpochMod.com + + Contributors: Aaron Clark + + Description: + TODO: DESC-TBA + + 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_code/gui/inventory/EPOCH_Inventory_tempGroup.sqf +*/ +disableSerialization; +(findDisplay 602) closeDisplay 0; +createDialog (if ((Epoch_my_tempGroupUID == "") && (Epoch_my_tempGroup isEqualTo [])) then {"EPOCH_createTempGrp"} else {"Epoch_myTempGroup"}); diff --git a/Sources/epoch_code/gui/scripts/messaging/Epoch_message.sqf b/Sources/epoch_code/gui/scripts/messaging/Epoch_message.sqf index 956543e6..ff743f1b 100644 --- a/Sources/epoch_code/gui/scripts/messaging/Epoch_message.sqf +++ b/Sources/epoch_code/gui/scripts/messaging/Epoch_message.sqf @@ -32,7 +32,9 @@ if(_customCol isEqualTo [])then{ _txtCol = if((_customCol select 1)isEqualTypeAll 0) then [{_customCol select 1},{_txtCol = [1,1,1,0.95]}]; }; -_msg = str (parseText str _msg); //Parses and converts text back to small string +if !(typeName _msg isEqualTo "STRING") then { //Needed to remove quotations from strings + _msg = str (parseText str _msg); //Parses and converts text back to small string +}; if !(isNil "rmx_var_msgQueue") exitWith {rmx_var_msgQueue pushBack [_msg, _time, [_bgCol,_txtCol]]}; diff --git a/Sources/epoch_code/gui/scripts/messaging/Epoch_message_stack.sqf b/Sources/epoch_code/gui/scripts/messaging/Epoch_message_stack.sqf new file mode 100644 index 00000000..646e4602 --- /dev/null +++ b/Sources/epoch_code/gui/scripts/messaging/Epoch_message_stack.sqf @@ -0,0 +1,106 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Description: + Displays custom text message to player + + 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/blob/release/Sources/epoch_code/gui/scripts/messaging/Epoch_message_stack.sqf + + Usage: + "TEST" call Epoch_message_stack + + ["===================================",5,[[0,0,0,0.2],[1,0.5,0,1]]] call Epoch_message_stack; + ["World!",5,[[0,0,0,0.2],[1,1,1,1]]] call Epoch_message_stack; + ["Hello",5,[[0,0,0,0.2],[1,1,1,1]]] call Epoch_message_stack; + ["===================================",5,[[0,0,0,0.2],[1,0.5,0,1]]] call Epoch_message_stack; +*/ + +#include "\A3\ui_f\hpp\defineCommonGrids.inc" +_msg = param [0, "No input"]; +_time = param [1, 2]; +_customCol = param[2,[]]; +private["_bgCol","_txtCol"]; +if(_customCol isEqualTo [])then{ + _config = 'CfgEpochClient' call EPOCH_returnConfig; + _bgCol = getArray(_config >> "epochMessageBackgroundCol"); + _txtCol = getArray(_config >> "epochMessageTextCol"); + if !(_bgCol isEqualTypeAll 0)then{_bgCol = [0,0,0,0.2]}; + if !(_txtCol isEqualTypeAll 0)then{_txtCol = [1,1,1,0.95]}; +}else{ + _bgCol = if((_customCol select 0)isEqualTypeAll 0) then [{_customCol select 0},{_bgCol = [0,0,0,0.2]}]; + _txtCol = if((_customCol select 1)isEqualTypeAll 0) then [{_customCol select 1},{_txtCol = [1,1,1,0.95]}]; +}; +if !(typeName _msg isEqualTo "STRING") then { //Needed to remove quotations from strings + _msg = str (parseText str _msg); //Parses and converts text back to small string +}; + + +if !(isNil "rmx_var_msgStackQueue") exitWith {rmx_var_msgStackQueue pushBack [_msg, _time, [_bgCol,_txtCol]]}; + +rmx_var_msgStackQueue = [[_msg, _time, [_bgCol,_txtCol]] ]; + +[] spawn { + private ["_dsp"]; + + disableSerialization; + _dsp = findDisplay 46; + _yPos = 15; + _ySize = 2; + _cStartPos = [safeZoneX,((_yPos - _ySize) * GUI_GRID_H + GUI_GRID_Y),safeZoneW, _ySize * GUI_GRID_H]; + + _ctrlArr = [1]; + + _fnc_reorganizeCtrls = { + if !(_ctrlArr isEqualTo []) then { + { + _newPos = [safeZoneX,(((_yPos - 3) - (_ySize * _forEachIndex)) * GUI_GRID_H + GUI_GRID_Y),safeZoneW, _ySize * GUI_GRID_H]; + _c = _x select 0; + _c ctrlSetPosition _newPos; + _c ctrlCommit 0; + } forEach _ctrlArr; + }; + }; + + while {(count _ctrlArr) > 0} do { + if ((_ctrlArr select 0) isEqualTo 1) then {_ctrlArr = [];}; + if !(rmx_var_msgStackQueue isEqualTo []) then { + _msg = (rmx_var_msgStackQueue select 0 select 0); + _time = diag_tickTime + (rmx_var_msgStackQueue select 0 select 1); + _col = (rmx_var_msgStackQueue select 0)select 2; + rmx_var_msgStackQueue deleteAt 0; + + _c = _dsp ctrlCreate ["rmx_t1", call epoch_getIDC]; + _c ctrlSetBackgroundColor (_col select 0); + _c ctrlSetText _msg; + _c ctrlSetTextColor (_col select 1); + + _c ctrlSetPosition _cStartPos; + _c ctrlSetFade 1; + _c ctrlCommit 0; + + _c ctrlSetFade 0; + _c ctrlCommit 0.5; + + _ctrlArr pushBack [_c,_time]; + call _fnc_reorganizeCtrls; + }; + + { + _time = _x select 1; + _c = _x select 0; + if (_time <= diag_tickTime) then { + ctrlDelete _c; + [_c] call epoch_getIDC; + _ctrlArr deleteAt _forEachIndex; + call _fnc_reorganizeCtrls; + }; + } forEach _ctrlArr; + }; + rmx_var_msgStackQueue = nil; +}; + +true diff --git a/Sources/epoch_code/init/both_init.sqf b/Sources/epoch_code/init/both_init.sqf index afb0968d..50094a96 100644 --- a/Sources/epoch_code/init/both_init.sqf +++ b/Sources/epoch_code/init/both_init.sqf @@ -13,30 +13,17 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/init/both_init.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_antagonistSpawnDefaults","_customVarsInit","_say3dsounds","_say3dsoundsConfig","_spawnLimits"]; +private ["_cfgDynamicSimulation","_communityStatsInit","_customVarsInit","_dynSimToggle"]; //[[[end]]] -// detect if Ryan's Zombies and Deamons mod is present -if (["CfgEpochClient", "ryanZombiesEnabled", true] call EPOCH_fnc_returnConfigEntryV2) then { - EPOCH_mod_Ryanzombies_Enabled = (parseNumber (getText (configFile >> "CfgPatches" >> "Ryanzombies" >> "version")) >= 4.5); - if (EPOCH_mod_Ryanzombies_Enabled) then { - diag_log "Epoch: Ryanzombies detected"; - }; +// Check if Advanced Vehicle Repair is enabled +if (["CfgEpochClient", "UseAdvancedVehicleRepair", true] call EPOCH_fnc_returnConfigEntryV2) then { + EPOCH_AdvancedVehicleRepair_Enabled = true; + diag_log "Epoch: Advanced Vehicle Repair Enabled"; } else { - EPOCH_mod_Ryanzombies_Enabled = false; + EPOCH_AdvancedVehicleRepair_Enabled = false; }; -// detect if Mad Arma is present -if (["CfgEpochClient", "madArmaEnabled", true] call EPOCH_fnc_returnConfigEntryV2) then { - EPOCH_mod_madArma_Enabled = (parseNumber (getText (configFile >> "CfgPatches" >> "bv_wheels" >> "version")) >= 2016); - if (EPOCH_mod_madArma_Enabled) then { - diag_log "Epoch: Mad Arma detected"; - }; -} else { - EPOCH_mod_madArma_Enabled = false; -}; - - // Init Custom vars EPOCH_customVars = []; EPOCH_defaultVars = []; @@ -56,58 +43,44 @@ EPOCH_customVarsDefaults = [ ["HitPoints",[0,0,0,0],[1,1,1,1]], ["BloodP",100,[190,0]], ["SpawnArray",[],[]], - ["Karma",0,[50000,-50000]], + ["NotUsed",0,[50000,-50000]], ["Alcohol",0,[100,0]], ["Radiation",0,[100,0]], ["Nuisance",0,[100,0]], ["MissionArray",[],[]] ]; _customVarsInit = ["CfgEpochClient", "customVarsDefaults", EPOCH_customVarsDefaults] call EPOCH_fnc_returnConfigEntryV2; -{ - EPOCH_customVars pushBack (_x select 0); - EPOCH_defaultVars pushBack (_x select 1); - EPOCH_customVarLimits pushBack (_x param [2,[]]); -} forEach _customVarsInit; +EPOCH_customVars = _customVarsInit apply {_x param [0,""]}; +EPOCH_defaultVars = _customVarsInit apply {_x param [1,0]}; +EPOCH_customVarLimits = _customVarsInit apply {_x param [2,[]]}; EPOCH_customVarCount = count EPOCH_customVars; -// Init antagonist spawn limits -EPOCH_spawnIndex = []; -EPOCH_spawnLimits = []; -_antagonistSpawnDefaults = [ - ["Epoch_Cloak_F", 1], - ["GreatWhite_F", 2], - ["Epoch_Sapper_F",2], - ["Epoch_SapperG_F",1], - ["Epoch_SapperB_F",1], - ["I_UAV_01_F",2], - ["PHANTOM",1], - ["B_Heli_Transport_01_F",1], - ["EPOCH_RyanZombie_1",12] -]; -_spawnLimits = ["CfgEpochClient", "antagonistSpawnIndex", _antagonistSpawnDefaults] call EPOCH_fnc_returnConfigEntryV2; -{ - _x params ["_spawnName","_spawnLimit"]; - if (_spawnName isEqualTo "EPOCH_RyanZombie_1") then { - if (EPOCH_mod_Ryanzombies_Enabled) then { - EPOCH_spawnIndex pushBack _spawnName; - EPOCH_spawnLimits pushBack _spawnLimit; - }; - } else { - EPOCH_spawnIndex pushBack _spawnName; - EPOCH_spawnLimits pushBack _spawnLimit; - }; -} forEach _spawnLimits; +// Init Community Stats +EPOCH_communityStats = []; +EPOCH_defaultStatVars = []; +EPOCH_communityStatsLimits = []; +_communityStatsInit = ["CfgEpochClient", "defineCommunityStats", []] call EPOCH_fnc_returnConfigEntryV2; +EPOCH_communityStats = _communityStatsInit apply {_x param [0,""]}; +EPOCH_defaultStatVars = _communityStatsInit apply {_x param [1,0]}; +EPOCH_communityStatsLimits = _communityStatsInit apply {_x param [2,[]]}; +EPOCH_communityStatsCount = count EPOCH_communityStats; //GroupSize (number) // Price (String) EPOCH_group_upgrade_lvl = ["CfgEpochClient", "group_upgrade_lvl", [4,"100",6,"300",8,"500",10,"1000",12,"1500",13,"1750",14,"2000",15,"3000",16,"5000"]] call EPOCH_fnc_returnConfigEntryV2; -// Init 3d sound handler -EPOCH_sounds = []; -_say3dsoundsConfig = 'CfgSay3Dhandler' call EPOCH_returnConfig; -_say3dsounds = "isClass _x" configClasses (_say3dsoundsConfig); -{ - EPOCH_sounds pushBack (configName _x); -} forEach _say3dsounds; - // disable remote sensors on server and client as all Epoch AI is local to the side controlling it. disableRemoteSensors (["CfgEpochClient", "disableRemoteSensors", true] call EPOCH_fnc_returnConfigEntryV2); + +// Enable Dynamic simulation on both server and clients (maybe only needed server side) +// DynSim is handled locally and yes server and clients will need these configurations +_dynSimToggle = ["CfgDynamicSimulation", "enableDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntryV2; +enableDynamicSimulationSystem _dynSimToggle; +if(_dynSimToggle)then +{ + _cfgDynamicSimulation = 'CfgDynamicSimulation' call EPOCH_returnConfig; + "IsMoving" setDynamicSimulationDistanceCoef getNumber(_cfgDynamicSimulation >> "isMovingCoefValue"); + "Group" setDynamicSimulationDistance getNumber(_cfgDynamicSimulation >> "groupDynSimDistance"); + "Vehicle" setDynamicSimulationDistance getNumber(_cfgDynamicSimulation >> "vehicleDynSimDistance"); + "EmptyVehicle" setDynamicSimulationDistance getNumber(_cfgDynamicSimulation >> "emptyVehicleDynSimDistance"); + "Prop" setDynamicSimulationDistance getNumber(_cfgDynamicSimulation >> "propDynSimDistance"); +}; diff --git a/Sources/epoch_code/init/client_init.sqf b/Sources/epoch_code/init/client_init.sqf index e4b10a48..da0712e4 100644 --- a/Sources/epoch_code/init/client_init.sqf +++ b/Sources/epoch_code/init/client_init.sqf @@ -12,6 +12,7 @@ Github: https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/init/client_init.sqf */ +EPOCH_Vehicle_MaintainLock = false; EPOCH_CraftingItem = ""; EPOCH_ESP_TARGETS = []; EPOCH_ESPMAP_TARGETS = []; @@ -24,24 +25,25 @@ EPOCH_group_level_img = ["x\addons\a3_epoch_code\data\owner.paa", "x\addons\a3_e if (isNil 'EPOCH_diag_fps') then { EPOCH_diag_fps = 0; }; -EPOCH_playerIsSwimming = false; EPOCH_lastTrash = diag_tickTime; EPOCH_tradeDone = false; EPOCH_bankBalance = 0; EPOCH_antiWallCount = 0; EPOCH_lastTargetTime = diag_tickTime; -EPOCH_lastSave = diag_tickTime; EPOCH_arr_countdown = []; EP_light = objNull; EPOCH_p2ptradeTarget = objNull; -EPOCH_lastPlayerPos = getPosATL player; EPOCH_Holstered = ""; Epoch_invited_GroupUID = ""; Epoch_invited_GroupName = ""; Epoch_invited_GroupUIDs = []; Epoch_invited_GroupUIDsPrev = []; Epoch_my_Group = []; -EPOCH_lastPlayerPos = [0,0,0]; +Epoch_invited_tempGroupUID = ""; +Epoch_invited_tempGroupName = ""; +Epoch_invited_tempGroupUIDs = []; +Epoch_invited_tempGroupUIDsPrev = []; +Epoch_my_tempGroup = []; EPOCH_prevOffer = []; EPOCH_drawIcon3d = false; EPOCH_velTransform = false; @@ -56,24 +58,37 @@ EPOCH_buildOption = 0; EPOCH_nearestLocations = []; EPOCH_lastFiredLocation = []; +//Radiation +EPOCH_geiger_shown = false; +EPOCH_geiger_mute_counter = true; +EPOCH_geiger_mute_warning = true; +EPOCH_ambientRadiation = 0; //TODO: needs to go server side. Adds constant incremental radiation to all players. Use in special events. + rmx_var_drag_MouseDown = false; rmx_var_dynamicHUD_groups = []; rmx_var_dynamicHUD_groupCTRL = []; -["EPOCH_onEachFrame", "onEachFrame", EPOCH_onEachFrame] call BIS_fnc_addStackedEventHandler; +//Favorites bar +EPOCH_favBar_itemConsumed = false; +rmx_var_favBar_Item = ""; +EPOCH_modKeys = [false,false,false]; -EPOCH_droneRndChance = 100; -EPOCH_sapperRndChance = 100; -EPOCH_zombieRngChance = 50; +["EPOCH_onEachFrame", "onEachFrame", EPOCH_onEachFrame] call BIS_fnc_addStackedEventHandler; // Custom Keys EPOCH_keysActionPressed = false; //prevents EH spam 0 call EPOCH_clientKeyMap; +// load some frequently used configs to variables +private _CfgEpochClient = 'CfgEpochClient' call EPOCH_returnConfig; +EPOCH_maxBuildingHeight = getNumber(_CfgEpochClient >> "maxBuildingHeight"); + //ON INIT and RESPAWN call EPOCH_clientInit; -[] execFSM "epoch_code\system\SPVEH.fsm"; +// prevents use of group view, and maybe useful for other checks. +addMissionEventHandler ["PlayerViewChanged", {if (cameraView isEqualTo "GROUP") then {vehicle player switchCamera "Internal";};}]; + [] execFSM "epoch_code\system\player_login.fsm"; true diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp index fbba0a09..71ef76a1 100644 --- a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp +++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp @@ -21,7 +21,9 @@ class CfgActionMenu dyna_cursorTargetType = "typeOf ([10] call EPOCH_fnc_cursorTarget)"; dyna_inVehicle = "vehicle player != player"; dyna_itemsPlayer = "items player"; - dyna_sizeOf = "((sizeOf dyna_cursorTargetType/2) max 5) min 30"; + dyna_magazinesPlayer = "magazines player"; + dyna_assigneditems = "assignedItems player"; + dyna_sizeOf = "((sizeOf dyna_cursorTargetType/2) max 6) min 30"; dyna_distance = "(player distance dyna_cursorTarget) <= dyna_sizeOf"; dyna_buildMode = "([10] call EPOCH_fnc_cursorTarget) call EPOCH_checkBuild;"; @@ -32,6 +34,19 @@ class CfgActionMenu dyna_canAcceptTrade = "if (!(isNull EPOCH_pendingP2ptradeTarget) && alive EPOCH_pendingP2ptradeTarget) then {((EPOCH_pendingP2ptradeTarget isKindOf 'Man') && (dyna_cursorTarget isEqualTo EPOCH_pendingP2ptradeTarget))} else {false}"; dyna_locked = "locked dyna_cursorTarget in [2,3]"; dyna_lockedInVehicle = "locked vehicle player in [2,3]"; + + dyna_blockWeapons = "[]"; + dyna_Turret = "if (!dyna_inVehicle) then {[]} else {if ((assignedVehicleRole player) isequalto ['driver']) then {[-1]} else {if (count (assignedVehicleRole player) == 2) then {(assignedVehicleRole player) select 1}else {[]}}}"; + dyna_weaponsTurret = "if (!dyna_inVehicle) then {[]}else {((vehicle player) weaponsTurret dyna_Turret) select {!((getArray(configFile >> 'CfgWeapons' >> _x >> 'magazines')) select {!((getText (configFile >> 'CfgMagazines' >> _x >> 'picture')) isequalto '')} isequalto [])}}"; + dyna_WeapsMagsTurret = "call {_out = [];if (dyna_inVehicle) then {_added = [];{_weapon = _x;_WeaponMags = ((vehicle player) magazinesTurret dyna_Turret) select {(_x in (getArray (configFile >> 'CfgWeapons' >> _weapon >> 'magazines'))) && !((getText (configFile >> 'CfgMagazines' >> _x >> 'picture')) isequalto '')};if !(_WeaponMags isequalto []) then {{if !(_x in _added) then {_out pushback [_weapon,_x];_added pushback _x;};} foreach _WeaponMags;};} foreach dyna_weaponsTurret;};_out}"; + + dyna_mapPlayerMarkerON = "(getNumber(('CfgEpochClient' call EPOCH_returnConfig) >> 'playerLocationMarkerGPSOnly') isEqualTo 1)"; + dyna_mapPlayerMarker = "(((getArray(('CfgMarkerSets' call EPOCH_returnConfig) >> 'PlayerMarker' >> 'markerArray') select 0) select 0) in allMapMarkers)"; + + dyna_deathMarkerON = "(getNumber(('CfgEpochClient' call EPOCH_returnConfig) >> 'playerDeathMarkerGPSOnly') isEqualTo 1)"; + dyna_deathMarker = "profileNameSpace getVariable['EPOCHLastKnownDeath',[]]"; + dyna_deathMarkerAvail = "!(dyna_deathMarker isEqualTo [])"; + dyna_mapDeathMarker = "(((getArray(('CfgMarkerSets' call EPOCH_returnConfig) >> 'DeathMarker' >> 'markerArray') select 0) select 0) in allMapMarkers)"; }; class self @@ -43,4 +58,9 @@ class CfgActionMenu { #include "CfgActionMenu_target.hpp" }; + + class map + { + #include "CfgActionMenu_map.hpp" + }; }; diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_map.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_map.hpp new file mode 100644 index 00000000..b42416e2 --- /dev/null +++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_map.hpp @@ -0,0 +1,43 @@ +/* + Author: Raimonds Virtoss - EpochMod.com + + Contributors: DirtySanchez + + Description: + Action Menu Map Config + + 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_config/Configs/CfgActionMenu/CfgActionMenu_map.hpp +*/ + +class playerMarker_on +{ + condition = "dyna_mapPlayerMarkerON && 'ItemGPS' in dyna_assignedItems && !dyna_mapPlayerMarker"; + action = "['PlayerMarker',position player] call EPOCH_fnc_createLocalMarkerSet"; + icon = "x\addons\a3_epoch_community\buttons\gps.paa"; + tooltip = "Toggle ON player marker"; +}; +class playerMarker_off +{ + condition = "dyna_mapPlayerMarkerON && dyna_mapPlayerMarker"; + action = "['PlayerMarker'] call EPOCH_fnc_deleteLocalMarkerSet"; + icon = "x\addons\a3_epoch_community\buttons\gps.paa"; + tooltip = "Toggle OFF player marker"; +}; +class deathMarker_on +{ + condition = "dyna_deathMarkerON && dyna_deathMarkerAvail && !dyna_mapDeathMarker"; + action = "['DeathMarker',dyna_deathMarker] call EPOCH_fnc_createLocalMarkerSet"; + icon = "x\addons\a3_epoch_community\icons\skull.paa"; + tooltip = "Toggle ON death marker"; +}; +class deathMarker_off +{ + condition = "dyna_deathMarkerON && dyna_mapDeathMarker"; + action = "['DeathMarker'] call EPOCH_fnc_deleteLocalMarkerSet"; + icon = "x\addons\a3_epoch_community\icons\skull.paa"; + tooltip = "Toggle OFF death marker"; +}; diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp index b6c04d95..f8a4d85f 100644 --- a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp +++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp @@ -15,7 +15,7 @@ class veh_lock { - condition = "dyna_inVehicle && !dyna_lockedInVehicle"; + condition = "if (vehicle player iskindof 'Bicycle') exitwith {false};dyna_inVehicle && !dyna_lockedInVehicle"; action = "[vehicle player, true, player, Epoch_personalToken] remoteExec ['EPOCH_server_lockVehicle',2];"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_cannot_lock.paa"; tooltip = "Lock"; @@ -30,16 +30,30 @@ class veh_unLock class player_inspect { condition = "!dyna_inVehicle"; - action = "call EPOCH_lootTrash;"; + action = "if !(underwater player) then {call EPOCH_lootTrash}else {if !(((nearestobjects [player,['container_epoch','weaponholdersimulated','GroundWeaponHolder'],5]) select {(_x getvariable ['EPOCH_Loot',false]) || (_x iskindof 'container_epoch' && _x animationPhase 'open_lid' > 0.5)}) isequalto []) then {call EPOCH_QuickTakeLoad} else {call EPOCH_lootTrash}};"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa"; tooltip = "Examine"; }; -class player_group_menu +class Groups { condition = "true"; - action = "call EPOCH_Inventory_Group;"; + action = ""; icon = "x\addons\a3_epoch_code\Data\UI\buttons\group_menu_ca.paa"; - tooltip = "Group Menu"; + tooltip = "Groups Menu"; + class Group + { + condition = "true"; + action = "call EPOCH_Inventory_Group;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\perm_group_menu_ca.paa"; + tooltip = "Perm Group Menu"; + }; + class TempGroup + { + condition = "true"; + action = "call EPOCH_Inventory_TempGroup;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\temp_group_menu_ca.paa"; + tooltip = "Temp Group Menu"; + }; }; class player_group_requests { @@ -48,6 +62,13 @@ class player_group_requests icon = "x\addons\a3_epoch_code\Data\UI\buttons\group_requests_ca.paa"; tooltip = "Group Requests"; }; +class player_tempGroup_requests +{ + condition = "!(Epoch_invited_tempGroupUIDs isEqualTo[])"; + action = "call EPOCH_Inventory_itempGroup;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\group_requests_ca.paa"; + tooltip = "Temp Group Requests"; +}; class base_mode_enable { @@ -70,52 +91,52 @@ class base_mode_disable icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_remove.paa"; tooltip = "Build Mode: Disable"; }; - -class base_mode_snap_direction_0 +class base_mode_snap_direction { - condition = "EPOCH_buildMode == 1 && EPOCH_snapDirection != 0"; - action = "EPOCH_snapDirection = 0;[format['SNAP DIRECTION MODE: %1', EPOCH_snapDirection], 5] call Epoch_message;"; + condition = "EPOCH_buildMode == 1"; + action = "EPOCH_snapDirection = EPOCH_snapDirection + 1; if (EPOCH_snapDirection > 3) then {EPOCH_snapDirection = 0};[format['SNAP DIRECTION: %1°', EPOCH_snapDirection*90], 5] call Epoch_message;"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_move.paa"; - tooltip = "Build Mode: Snap Direction 0°"; + tooltip = "Build Mode: Rotate 90°"; + tooltipcode = "format ['Build Mode: Switch Snap Direction to %1° (current %2°)',if (EPOCH_snapDirection < 3) then {(EPOCH_snapDirection+1)*90} else {0},EPOCH_snapDirection*90]"; }; -class base_mode_snap_direction_1 +class base_mode_detach { - condition = "EPOCH_buildMode == 1 && EPOCH_snapDirection != 1"; - action = "EPOCH_snapDirection = 1;[format['SNAP DIRECTION MODE: %1', EPOCH_snapDirection], 5] call Epoch_message;"; + condition = "EPOCH_buildMode > 0 && !isnull EPOCH_target && EPOCH_target_attachedTo isequalto player && Epoch_target iskindof 'Const_Ghost_EPOCH'"; + action = "EPOCH_target_attachedTo = objnull; ['Object Detached', 5] call Epoch_message;"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_move.paa"; - tooltip = "Build Mode: Snap Direction 90°"; + tooltip = "Build Mode: Detach Object"; }; -class base_mode_snap_direction_2 +class base_mode_attach { - condition = "EPOCH_buildMode == 1 && EPOCH_snapDirection != 2"; - action = "EPOCH_snapDirection = 2;[format['SNAP DIRECTION MODE: %1', EPOCH_snapDirection], 5] call Epoch_message;"; + condition = "EPOCH_buildMode > 0 && !isnull EPOCH_target && !(EPOCH_target_attachedTo isequalto player) && Epoch_target iskindof 'Const_Ghost_EPOCH'"; + action = "EPOCH_target_attachedTo = player; ['Object Attached', 5] call Epoch_message;"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_move.paa"; - tooltip = "Build Mode: Snap Direction 180°"; + tooltip = "Build Mode: Attach Object"; }; -class base_mode_snap_direction_3 +class Drink { - condition = "EPOCH_buildMode == 1 && EPOCH_snapDirection != 3"; - action = "EPOCH_snapDirection = 3;[format['SNAP DIRECTION MODE: %1', EPOCH_snapDirection], 5] call Epoch_message;"; - icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_move.paa"; - tooltip = "Build Mode: Snap Direction 270°"; + condition = "_nearObjects = nearestObjects [player, [], 2];_check = 'water';_ok = false;{if (alive _x) then {_ok = [_x, _check] call EPOCH_worldObjectType;};if (_ok) exitWith {};} forEach _nearObjects;_ok"; + action = "if (currentweapon player == '') then {player playmove 'AinvPknlMstpSnonWnonDnon_Putdown_AmovPknlMstpSnonWnonDnon';}else {if (currentweapon player == handgunweapon player) then {player playmove 'AinvPknlMstpSrasWpstDnon_Putdown_AmovPknlMstpSrasWpstDnon';}else { player playmove 'AinvPknlMstpSrasWrflDnon_Putdown_AmovPknlMstpSrasWrflDnon';};};{_output = _x call EPOCH_giveAttributes;if (_output != '') then {[_output, 5] call Epoch_message;};} foreach [['Toxicity',4,1],['Stamina',10],['Thirst',100]];"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Drink.paa"; + tooltip = "Drink"; }; class ServicePoint { condition = "call EPOCH_SP_Check"; - action = "call EPOCH_SP_Start;"; + action = "[dyna_Turret] call EPOCH_SP_Start;"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_man.paa"; tooltip = "Service Point"; class Refuel { - condition = "true"; + condition = "!isnil 'Ignatz_Refuel'"; action = "(Ignatz_Refuel select 1) spawn EPOCH_SP_Refuel"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\vehicle_refuel.paa"; tooltipcode = "Ignatz_Refuel select 0"; }; class Repair { - condition = "true"; + condition = "!isnil 'Ignatz_Repair'"; action = "(Ignatz_Repair select 1) spawn EPOCH_SP_Repair"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\repair.paa"; tooltipcode = "Ignatz_Repair select 0"; @@ -142,3 +163,102 @@ class ServicePoint tooltipcode = "Ignatz_Rearm2 select 0"; }; }; +class veh_Rearm1 +{ + condition = "if (count dyna_weaponsTurret > 0) then {!((dyna_weaponsTurret select 0) in dyna_blockWeapons)}else{false}"; + action = "[vehicle player, dyna_weaponsTurret select 0, dyna_Turret] call EPOCH_vehicle_checkTurretAmmo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; + tooltipcode = "format['Add Mag to %1',getText(configFile >> 'CfgWeapons' >> dyna_weaponsTurret select 0 >> 'displayName')]"; +}; +class veh_Rearm2 +{ + condition = "if (count dyna_weaponsTurret > 1) then {!((dyna_weaponsTurret select 1) in dyna_blockWeapons)}else{false}"; + action = "[vehicle player,dyna_weaponsTurret select 1, dyna_Turret] call EPOCH_vehicle_checkTurretAmmo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; + tooltipcode = "format['Add Mag to %1',getText(configFile >> 'CfgWeapons' >> dyna_weaponsTurret select 1 >> 'displayName')]"; +}; +class veh_Rearm3 +{ + condition = "if (count dyna_weaponsTurret > 2) then {!((dyna_weaponsTurret select 2) in dyna_blockWeapons)}else{false}"; + action = "[vehicle player,dyna_weaponsTurret select 2, dyna_Turret] call EPOCH_vehicle_checkTurretAmmo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; + tooltipcode = "format['Add Mag to %1',getText(configFile >> 'CfgWeapons' >> dyna_weaponsTurret select 2 >> 'displayName')]"; +}; +class veh_Rearm4 +{ + condition = "if (count dyna_weaponsTurret > 3) then {!((dyna_weaponsTurret select 3) in dyna_blockWeapons)}else{false}"; + action = "[vehicle player,dyna_weaponsTurret select 3, dyna_Turret] call EPOCH_vehicle_checkTurretAmmo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; + tooltipcode = "format['Add Mag to %1',getText(configFile >> 'CfgWeapons' >> dyna_weaponsTurret select 3 >> 'displayName')]"; +}; +class veh_RemoveAmmo1 +{ + condition = "if (count dyna_WeapsMagsTurret > 0) then {!((dyna_WeapsMagsTurret select 0 select 0) in dyna_blockWeapons)}else{false}"; + action = "[vehicle player,dyna_WeapsMagsTurret select 0 select 0,dyna_WeapsMagsTurret select 0 select 1, dyna_Turret] call EPOCH_vehicle_removeTurretAmmo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\RemoveMag.paa"; + tooltipcode = "format['Remove %1 from %2',getText(configFile >> 'CfgMagazines' >> (dyna_WeapsMagsTurret select 0 select 1) >> 'displayName'),getText(configFile >> 'CfgWeapons' >> (dyna_WeapsMagsTurret select 0 select 0) >> 'displayName')]"; +}; +class veh_RemoveAmmo2 +{ + condition = "if (count dyna_WeapsMagsTurret > 1) then {!((dyna_WeapsMagsTurret select 1 select 0) in dyna_blockWeapons)}else{false}"; + action = "[vehicle player,dyna_WeapsMagsTurret select 1 select 0,dyna_WeapsMagsTurret select 1 select 1, dyna_Turret] call EPOCH_vehicle_removeTurretAmmo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\RemoveMag.paa"; + tooltipcode = "format['Remove %1 from %2',getText(configFile >> 'CfgMagazines' >> (dyna_WeapsMagsTurret select 1 select 1) >> 'displayName'),getText(configFile >> 'CfgWeapons' >> (dyna_WeapsMagsTurret select 1 select 0) >> 'displayName')]"; +}; +class veh_RemoveAmmo3 +{ + condition = "if (count dyna_WeapsMagsTurret > 2) then {!((dyna_WeapsMagsTurret select 2 select 0) in dyna_blockWeapons)}else{false}"; + action = "[vehicle player,dyna_WeapsMagsTurret select 2 select 0,dyna_WeapsMagsTurret select 2 select 1, dyna_Turret] call EPOCH_vehicle_removeTurretAmmo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\RemoveMag.paa"; + tooltipcode = "format['Remove %1 from %2',getText(configFile >> 'CfgMagazines' >> (dyna_WeapsMagsTurret select 2 select 1) >> 'displayName'),getText(configFile >> 'CfgWeapons' >> (dyna_WeapsMagsTurret select 2 select 0) >> 'displayName')]"; +}; +class veh_RemoveAmmo4 +{ + condition = "if (count dyna_WeapsMagsTurret > 3) then {!((dyna_WeapsMagsTurret select 3 select 0) in dyna_blockWeapons)}else{false}"; + action = "[vehicle player,dyna_WeapsMagsTurret select 3 select 0,dyna_WeapsMagsTurret select 3 select 1, dyna_Turret] call EPOCH_vehicle_removeTurretAmmo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\RemoveMag.paa"; + tooltipcode = "format['Remove %1 from %2',getText(configFile >> 'CfgMagazines' >> (dyna_WeapsMagsTurret select 3 select 1) >> 'displayName'),getText(configFile >> 'CfgWeapons' >> (dyna_WeapsMagsTurret select 3 select 0) >> 'displayName')]"; +}; + +class geiger_menu +{ + condition = "'ItemGeigerCounter_EPOCH' in dyna_assigneditems"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\geiger_radiation.paa"; + tooltip = "Geiger counter settings"; + + class geiger_toggle + { + condition = "true"; + action = "call epoch_geiger_show_hide"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\geiger_toggle.paa"; + tooltip = "Toggle HUD"; + }; + class geiger_counter_mute + { + condition = "!EPOCH_geiger_mute_counter"; + action = "EPOCH_geiger_mute_counter = !EPOCH_geiger_mute_counter"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\geiger_volumeoff.paa"; + tooltip = "Mute counter"; + }; + class geiger_counter_unmute + { + condition = "EPOCH_geiger_mute_counter"; + action = "EPOCH_geiger_mute_counter = !EPOCH_geiger_mute_counter"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\geiger_volumeon.paa"; + tooltip = "Unmute counter"; + }; + class geiger_warning_mute + { + condition = "!EPOCH_geiger_mute_warning"; + action = "EPOCH_geiger_mute_warning = !EPOCH_geiger_mute_warning"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\geiger_alarmoff.paa"; + tooltip = "Mute warnings"; + }; + class geiger_warning_unmute + { + condition = "EPOCH_geiger_mute_warning"; + action = "EPOCH_geiger_mute_warning = !EPOCH_geiger_mute_warning"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\geiger_alarmon.paa"; + tooltip = "Unmute warnings"; + }; +}; diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp index e1b6c827..a1a37584 100644 --- a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp +++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp @@ -48,7 +48,7 @@ class veh_gear }; class veh_lock { - condition = "dyna_isVehicle && !dyna_locked"; + condition = "if (dyna_cursorTarget iskindof 'Bicycle') exitwith {false};dyna_isVehicle && !dyna_locked"; action = "[dyna_cursorTarget, true, player, Epoch_personalToken] remoteExec ['EPOCH_server_lockVehicle',2];"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_cannot_lock.paa"; tooltip = "Lock"; @@ -160,3 +160,394 @@ class pack_safe icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_pack.paa"; tooltip = "Pack Safe"; }; + +class VehMaintanance +{ + condition = "dyna_isVehicle && !EPOCH_Vehicle_MaintainLock && EPOCH_AdvancedVehicleRepair_Enabled"; + action = "dyna_cursorTarget call EPOCH_client_VehicleMaintananceCheck;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_man.paa"; + tooltip = "Vehicle Maintanance"; + class Repair + { + condition = "!((EPOCH_VehicleRepairs select 0) isequalto []) || !((EPOCH_VehicleRepairs select 2) isequalto [])"; + action = ""; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair Vehicle"; + class RepairHull + { + condition = "'HitHull' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitHull'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_HullBody.paa"; + tooltip = "Repair Hull"; + }; + class ReplaceHull + { + condition = "'HitHull' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitHull'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_HullBody.paa"; + tooltip = "Repair Hull"; + }; + class RepairEngine + { + condition = "'HitEngine' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitEngine'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Engine.paa"; + tooltip = "Repair Engine"; + }; + class ReplaceEngine + { + condition = "'HitEngine' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitEngine'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Engine.paa"; + tooltip = "Replace Engine"; + }; + class ReplaceGlass + { + condition = "'glass' in (EPOCH_VehicleRepairs select 0) || 'glass' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','glass'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Glass.paa"; + tooltip = "Replace Glass"; + }; + class RepairBody + { + condition = "'HitBody' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitBody'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_HullBody.paa"; + tooltip = "Repair Body"; + }; + class ReplaceBody + { + condition = "'HitBody' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitBody'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_HullBody.paa"; + tooltip = "Repair Body"; + }; + class RepairFuel + { + condition = "'HitFuel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitFuel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Fuel.paa"; + tooltip = "Repair Fuel Hose"; + }; + class RepairMainRotor + { + condition = "'HitHRotor' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitHRotor'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_MainRotor.paa"; + tooltip = "Repair Main Rotor"; + }; + class ReplaceFuel + { + condition = "'HitFuel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitFuel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Fuel.paa"; + tooltip = "Replace Fuel Hose"; + }; + class ReplaceMainRotor + { + condition = "'HitHRotor' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitHRotor'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_MainRotor.paa"; + tooltip = "Replace Main Rotor"; + }; + class RepairTailRotor + { + condition = "'HitVRotor' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitVRotor'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_TailRotor.paa"; + tooltip = "Repair Tail Rotor"; + }; + class ReplaceTailRotor + { + condition = "'HitVRotor' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitVRotor'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_TailRotor.paa"; + tooltip = "Replace Tail Rotor"; + }; + class ReplaceWinch + { + condition = "'HitWinch' in (EPOCH_VehicleRepairs select 0) || 'HitWinch' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitWinch'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_SLG.paa"; + tooltip = "Replace Winch"; + }; + class RepairTire1 + { + condition = "'HitLFWheel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitLFWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair 1st Left Wheel"; + }; + class RepairTire2 + { + condition = "'HitLF2Wheel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitLF2Wheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair 2nd Left Wheel"; + }; + class RepairTire3 + { + condition = "'HitLMWheel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitLMWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair 3rd Left Wheel"; + }; + class RepairTire4 + { + condition = "'HitLBWheel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitLBWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair 4th Left Wheel"; + }; + class RepairTire5 + { + condition = "'HitRFWheel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitRFWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair 1st Right Wheel"; + }; + class RepairTire6 + { + condition = "'HitRF2Wheel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitRF2Wheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair 2nd Right Wheel"; + }; + class RepairTire7 + { + condition = "'HitRMWheel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitRMWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair 3rd Right Wheel"; + }; + class RepairTire8 + { + condition = "'HitRBWheel' in (EPOCH_VehicleRepairs select 0)"; + action = "[dyna_cursorTarget,'repair','HitRBWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Wheel.paa"; + tooltip = "Repair 4th Right Wheel"; + }; + class ReplaceTire1 + { + condition = "'HitLFWheel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitLFWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Wheel.paa"; + tooltip = "Replace 1st Left Wheel"; + }; + class ReplaceTire2 + { + condition = "'HitLF2Wheel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitLF2Wheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Wheel.paa"; + tooltip = "Replace 2nd Left Wheel"; + }; + class ReplaceTire3 + { + condition = "'HitLMWheel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitLMWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Wheel.paa"; + tooltip = "Replace 3rd Left Wheel"; + }; + class ReplaceTire4 + { + condition = "'HitLBWheel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitLBWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Wheel.paa"; + tooltip = "Replace 4th Left Wheel"; + }; + class ReplaceTire5 + { + condition = "'HitRFWheel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitRFWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Wheel.paa"; + tooltip = "Replace 1st Right Wheel"; + }; + class ReplaceTire6 + { + condition = "'HitRF2Wheel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitRF2Wheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Wheel.paa"; + tooltip = "Replace 2nd Right Wheel"; + }; + class ReplaceTire7 + { + condition = "'HitRMWheel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitRMWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Wheel.paa"; + tooltip = "Replace 3rd Right Wheel"; + }; + class ReplaceTire8 + { + condition = "'HitRBWheel' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitRBWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Replace_Wheel.paa"; + tooltip = "Replace 4th Right Wheel"; + }; + class RepairAvionics + { + condition = "'HitAvionics' in (EPOCH_VehicleRepairs select 0) || 'HitAvionics' in (EPOCH_VehicleRepairs select 2)"; + action = "[dyna_cursorTarget,'replace','HitAvionics'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Repair_Avionics.paa"; + tooltip = "Repair Avionics"; + }; + }; + class Remove + { + condition = "!((EPOCH_VehicleRepairs select 1) isequalto [])"; + action = ""; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove Parts"; + class RemoveEngine + { + condition = "'HitEngine' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitEngine'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Engine.paa"; + tooltip = "Remove Engine"; + }; + class RemoveTire1 + { + condition = "'HitLFWheel' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitLFWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove 1st Left Wheel"; + }; + class RemoveTire2 + { + condition = "'HitLF2Wheel' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitLF2Wheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove 2nd Left Wheel"; + }; + class RemoveTire3 + { + condition = "'HitLMWheel' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitLMWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove 3rd Left Wheel"; + }; + class RemoveTire4 + { + condition = "'HitLBWheel' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitLBWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove 4th Left Wheel"; + }; + class RemoveTire5 + { + condition = "'HitRFWheel' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitRFWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove 1st Right Wheel"; + }; + class RemoveTire6 + { + condition = "'HitRF2Wheel' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitRF2Wheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove 2nd Right Wheel"; + }; + class RemoveTire7 + { + condition = "'HitRMWheel' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitRMWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove 3rd Right Wheel"; + }; + class RemoveTire8 + { + condition = "'HitRBWheel' in (EPOCH_VehicleRepairs select 1)"; + action = "[dyna_cursorTarget,'remove','HitRBWheel'] spawn EPOCH_client_VehicleMaintananceDo"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Remove_Wheel.paa"; + tooltip = "Remove 4th Right Wheel"; + }; + }; + class UpgradeVehicle + { + condition = "dyna_isVehicle"; + action = "dyna_cursorTarget call EPOCH_client_upgradeVehicleCheck;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_upgrade.paa"; + tooltip = "Upgrade Vehicle"; + class Upgrade0 + { + condition = "(count Ignatz_VehicleUpgradeArray) > 0"; + action = "(Ignatz_VehicleUpgradeArray select 0) call EPOCH_client_upgradeVehicle"; + iconcode = "gettext (configfile >> 'CfgVehicles' >> (Ignatz_VehicleUpgradeArray select 0 select 1) >> 'picture')"; + tooltipcode = "format ['Upgrade to %1 - %2',(Ignatz_VehicleUpgradeArray select 0 select 2),(Ignatz_VehicleUpgradeArray select 0 select 3)]"; + }; + class Upgrade1 + { + condition = "(count Ignatz_VehicleUpgradeArray) > 1"; + action = "(Ignatz_VehicleUpgradeArray select 1) call EPOCH_client_upgradeVehicle"; + iconcode = "gettext (configfile >> 'CfgVehicles' >> (Ignatz_VehicleUpgradeArray select 1 select 1) >> 'picture')"; + tooltipcode = "format ['Upgrade to %1 - %2',(Ignatz_VehicleUpgradeArray select 1 select 2),(Ignatz_VehicleUpgradeArray select 1 select 3)]"; + }; + class Upgrade2 + { + condition = "(count Ignatz_VehicleUpgradeArray) > 2"; + action = "(Ignatz_VehicleUpgradeArray select 2) call EPOCH_client_upgradeVehicle"; + iconcode = "gettext (configfile >> 'CfgVehicles' >> (Ignatz_VehicleUpgradeArray select 2 select 1) >> 'picture')"; + tooltipcode = "format ['Upgrade to %1 - %2',(Ignatz_VehicleUpgradeArray select 2 select 2),(Ignatz_VehicleUpgradeArray select 2 select 3)]"; + }; + class Upgrade3 + { + condition = "(count Ignatz_VehicleUpgradeArray) > 3"; + action = "(Ignatz_VehicleUpgradeArray select 3) call EPOCH_client_upgradeVehicle"; + iconcode = "gettext (configfile >> 'CfgVehicles' >> (Ignatz_VehicleUpgradeArray select 3 select 1) >> 'picture')"; + tooltipcode = "format ['Upgrade to %1 - %2',(Ignatz_VehicleUpgradeArray select 3 select 2),(Ignatz_VehicleUpgradeArray select 3 select 3)]"; + }; + class Upgrade4 + { + condition = "(count Ignatz_VehicleUpgradeArray) > 4"; + action = "(Ignatz_VehicleUpgradeArray select 4) call EPOCH_client_upgradeVehicle"; + iconcode = "gettext (configfile >> 'CfgVehicles' >> (Ignatz_VehicleUpgradeArray select 4 select 1) >> 'picture')"; + tooltipcode = "format ['Upgrade to %1 - %2',(Ignatz_VehicleUpgradeArray select 4 select 2),(Ignatz_VehicleUpgradeArray select 4 select 3)]"; + }; + }; +}; + +//Groups +class Groups +{ + condition = "dyna_isPlayer"; + action = ""; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\group_menu_ca.paa"; + tooltip = "Groups Menu"; + class Group + { + condition = "dyna_isPlayer"; + action = "call EPOCH_Inventory_Group;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\perm_group_menu_ca.paa"; + tooltip = "Perm Group Menu"; + }; + class TempGroup + { + condition = "dyna_isPlayer"; + action = "call EPOCH_Inventory_TempGroup;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\temp_group_menu_ca.paa"; + tooltip = "Temp Group Menu"; + }; +}; +class player_group_requests +{ + condition = "dyna_isPlayer && !(Epoch_invited_GroupUIDs isEqualTo[])"; + action = "call EPOCH_Inventory_iGroup;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\group_requests_ca.paa"; + tooltip = "Group Requests"; +}; +class player_tempGroup_requests +{ + condition = "dyna_isPlayer && !(Epoch_invited_tempGroupUIDs isEqualTo[])"; + action = "call EPOCH_Inventory_itempGroup;"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\group_requests_ca.paa"; + tooltip = "Temp Group Requests"; +}; + +// Working defibrillator + +class player_revive +{ + condition = "dyna_isDeadPlayer && ('ItemDefibrillator' in dyna_magazinesPlayer)"; + action = "[dyna_cursorTarget, player, Epoch_personalToken] remoteExec ['EPOCH_server_revivePlayer',2];"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\group_requests_ca.paa"; + tooltip = "Revive Player"; +}; diff --git a/Sources/epoch_config/Configs/CfgBaseBuilding.hpp b/Sources/epoch_config/Configs/CfgBaseBuilding.hpp index a35bc31f..33b3ec75 100644 --- a/Sources/epoch_config/Configs/CfgBaseBuilding.hpp +++ b/Sources/epoch_config/Configs/CfgBaseBuilding.hpp @@ -41,6 +41,20 @@ class CfgBaseBuilding snapPointsPara[] = {"N","S","E","W","C"}; snapPointsPerp[] = {}; maxHeight = 2.5; + // snap points for Foundation_EPOCH + C[] = {0,0,0.806411}; + N[] = {0,10.463,0}; + E[] = {10.463,0,0}; + S[] = {0,-10.463,0}; + W[] = {-10.463,0,0}; + NE[] = {2.47112,2.46379,0.269223}; + NW[] = {-2.4783,2.46379,0.269223}; + SE[] = {2.47112,-2.46097,0.269223}; + SW[] = {-2.4783,-2.46097,0.269223}; + NF[] = {0,5.23361,0.806411}; + SF[] = {0,-5.25013,0.806411}; + EF[] = {5.24796,0,0.806219}; + WF[] = {-5.21655,0,0.806219}; }; class Foundation_Ghost_EPOCH : Foundation_EPOCH { @@ -57,6 +71,20 @@ class CfgBaseBuilding allowedSnapPoints[] = {"N","S","E","W"}; allowedSnapObjects[] = {"Constructions_foundation_F"}; maxHeight = 2.5; + // snap points for Foundation_EPOCH + C[] = {0,0,0.806411}; + N[] = {0,10.463,0}; + E[] = {10.463,0,0}; + S[] = {0,-10.463,0}; + W[] = {-10.463,0,0}; + NE[] = {2.47112,2.46379,0.269223}; + NW[] = {-2.4783,2.46379,0.269223}; + SE[] = {2.47112,-2.46097,0.269223}; + SW[] = {-2.4783,-2.46097,0.269223}; + NF[] = {0,5.23361,0.806411}; + SF[] = {0,-5.25013,0.806411}; + EF[] = {5.24796,0,0.806219}; + WF[] = {-5.21655,0,0.806219}; }; class WoodFoundation_Ghost_EPOCH : WoodFoundation_EPOCH { @@ -74,6 +102,10 @@ class CfgBaseBuilding energyCost = 0.4; limitNearby = 4; bypassJammer = 1; + // snap points for Hesco3_EPOCH + C[] = {0,0,1.2}; + E[] = {3.375,0,0}; + W[] = {-3.375,0,0}; }; class Hesco3_SIM_EPOCH : Hesco3_EPOCH { @@ -162,14 +194,45 @@ class CfgBaseBuilding class WoodRamp_Ghost_EPOCH : WoodRamp_SIM_EPOCH {}; class WoodFloor_EPOCH : Default { - upgradeBuilding[] = {{"MetalFloor_EPOCH",{{"ItemCorrugatedLg",2}}}}; - removeParts[] = {{"PartPlankPack",2}}; + upgradeBuilding[] = {{"MetalFloor_EPOCH",{{"ItemCorrugatedLg",3}}}}; + removeParts[] = {{"PartPlankPack",4}}; simulClass = "WoodFloor_SIM_EPOCH"; staticClass = "WoodFloor_EPOCH"; GhostPreview = "WoodFloor_Ghost_EPOCH"; - snapPointsPara[] = {"NF","SF","EF","WF","C","CB"}; + snapPointsPara[] = {"NF","SF","EF","WF","C","CB","NHF","SHF","EHF","WHF","NQ1","NQ2","SQ1","SQ2","EQ1","EQ2","WQ1","WQ2"}; snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; energyCost = 0.2; + // snap points for WoodFloor_EPOCH + C[] = {0,0,3.31243}; + CB[] = {0,0,0.268722}; + CinN[] = {0,2.87136,-0.000576986}; + CinE[] = {2.87868,0,-0.000576986}; + CinS[] = {0,-2.86826,-0.000576986}; + CinW[] = {-2.88969,0,-0.000576986}; + N[] = {0,2.46379,0.269223}; + E[] = {2.47112,0,0.269223}; + S[] = {0,-2.46097,0.269223}; + W[] = {-2.4783,0,0.269223}; + NE[] = {2.47112,2.46379,0.269223}; + NW[] = {-2.4783,2.46379,0.269223}; + SE[] = {2.47112,-2.46097,0.269223}; + SW[] = {-2.4783,-2.46097,0.269223}; + NF[] = {0,5.237,0}; + SF[] = {0,-5.237,0}; + EF[] = {5.237,0,0}; + WF[] = {-5.237,0,0}; + NHF[] = {0,3.92775,0}; + SHF[] = {0,-3.92775,0}; + EHF[] = {3.92775,0,0}; + WHF[] = {-3.92775,0,0}; + NQ1[] = {1.30925,3.92775,0}; + NQ2[] = {-1.30925,3.92775,0}; + SQ1[] = {1.30925,-3.92775,0}; + SQ2[] = {-1.30925,-3.92775,0}; + EQ1[] = {3.92775,1.30925,0}; + EQ2[] = {3.92775,-1.30925,0}; + WQ1[] = {-3.92775,1.30925,0}; + WQ2[] = {-3.92775,-1.30925,0}; }; class WoodFloor_SIM_EPOCH : WoodFloor_EPOCH { @@ -179,23 +242,203 @@ class CfgBaseBuilding removeParts[] = {}; }; class WoodFloor_Ghost_EPOCH : WoodFloor_SIM_EPOCH {}; - class MetalFloor_EPOCH : Default + class WoodHalfFloor_EPOCH : Default { - removeParts[] = {{"ItemCorrugatedLg",2}}; + upgradeBuilding[] = {{"MetalHalfFloor_EPOCH",{{"ItemCorrugatedLg",2}}}}; + removeParts[] = {{"PartPlankPack",2}}; + simulClass = "WoodHalfFloor_SIM_EPOCH"; + staticClass = "WoodHalfFloor_EPOCH"; + GhostPreview = "WoodHalfFloor_Ghost_EPOCH"; + snapPointsPara[] = {"NF","SF","EF","WF","C","CB","NHF","SHF","EHF","WHF","NQ1","NQ2","SQ1","SQ2","EQ1","EQ2","WQ1","WQ2"}; + snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; + energyCost = 0.2; + // snap points for WoodHalfFloor_EPOCH + C[] = {0,0,3.31243}; + CB[] = {0,0,0.268722}; + CinN[] = {0,2.87136,-0.000576986}; + CinE[] = {1.444845,0,-0.000576986}; + CinS[] = {0,-2.86826,-0.000576986}; + CinW[] = {-1.444845,0,-0.000576986}; + N[] = {0,2.46379,0.269223}; + E[] = {1.15,0,0.269223}; + S[] = {0,-2.46097,0.269223}; + W[] = {-1.15,0,0.269223}; + NE[] = {1.23556,2.46379,0.269223}; + NW[] = {-1.23915,2.46379,0.269223}; + SE[] = {1.23556,-2.46097,0.269223}; + SW[] = {-1.23915,-2.46097,0.269223}; + NF[] = {0,5.237,0}; + SF[] = {0,-5.237,0}; + EF[] = {3.92775,0,0}; + WF[] = {-3.92775,0,0}; + NHF[] = {0,3.92775,0}; + SHF[] = {0,-3.92775,0}; + EHF[] = {2.6185,0,0}; + WHF[] = {-2.6185,0,0}; + NQ1[] = {1.30925,3.92775,0}; + NQ2[] = {-1.30925,3.92775,0}; + SQ1[] = {1.30925,-3.92775,0}; + SQ2[] = {-1.30925,-3.92775,0}; + EQ1[] = {3.92775,1.30925,0}; + EQ2[] = {3.92775,-1.30925,0}; + WQ1[] = {-3.92775,1.30925,0}; + WQ2[] = {-3.92775,-1.30925,0}; + }; + class WoodHalfFloor_SIM_EPOCH : WoodHalfFloor_EPOCH + { + allowedSnapPoints[] = {"NF","SF","EF","WF","NHF","SHF","EHF","WHF"}; + allowedSnapObjects[] = {"Const_floors_static_F"}; + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class WoodHalfFloor_Ghost_EPOCH : WoodHalfFloor_SIM_EPOCH {}; + class WoodQuarterFloor_EPOCH : Default + { + upgradeBuilding[] = {{"MetalQuarterFloor_EPOCH",{{"ItemCorrugatedLg",1}}}}; + removeParts[] = {{"PartPlankPack",1}}; + simulClass = "WoodQuarterFloor_SIM_EPOCH"; + staticClass = "WoodQuarterFloor_EPOCH"; + GhostPreview = "WoodQuarterFloor_Ghost_EPOCH"; + snapPointsPara[] = {"NF","SF","EF","WF","C","CB","NHF","SHF","EHF","WHF","NQ1","NQ2","SQ1","SQ2","EQ1","EQ2","WQ1","WQ2"}; + snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; + energyCost = 0.1; + // snap points for WoodQuarterFloor_EPOCH + C[] = {0,0,3.31243}; + CB[] = {0,0,0.268722}; + CinN[] = {0,1.43568,-0.000576986}; + CinE[] = {1.444845,0,-0.000576986}; + CinS[] = {0,-1.43412,-0.000576986}; + CinW[] = {-1.444845,0,-0.000576986}; + N[] = {0,1.15,0.269223}; + E[] = {1.15,0,0.269223}; + S[] = {0,-1.15,0.269223}; + W[] = {-1.15,0,0.269223}; + NE[] = {1.23556,1.231895,0.269223}; + NW[] = {-1.23915,1.231895,0.269223}; + SE[] = {1.23556,-1.230485,0.269223}; + SW[] = {-1.23915,-1.230485,0.269223}; + NF[] = {0,3.92775,0}; + SF[] = {0,-3.92775,0}; + EF[] = {3.92775,0,0}; + WF[] = {-3.92775,0,0}; + NHF[] = {0,3.92775,0}; + SHF[] = {0,-3.92775,0}; + EHF[] = {2.6185,0,0}; + WHF[] = {-2.6185,0,0}; + NQ1[] = {1.30925,3.92775,0}; + NQ2[] = {-1.30925,3.92775,0}; + SQ1[] = {1.30925,-3.92775,0}; + SQ2[] = {-1.30925,-3.92775,0}; + EQ1[] = {3.92775,1.30925,0}; + EQ2[] = {3.92775,-1.30925,0}; + WQ1[] = {-3.92775,1.30925,0}; + WQ2[] = {-3.92775,-1.30925,0}; + }; + class WoodQuarterFloor_SIM_EPOCH : WoodQuarterFloor_EPOCH + { + allowedSnapPoints[] = {"NHF","SHF","EHF","WHF","NQ1","NQ2","SQ1","SQ2","EQ1","EQ2","WQ1","WQ2"}; + allowedSnapObjects[] = {"Const_floors_static_F"}; + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class WoodQuarterFloor_Ghost_EPOCH : WoodQuarterFloor_SIM_EPOCH {}; + class MetalFloor_EPOCH : WoodFloor_EPOCH + { + upgradeBuilding[] = {{"CinderFloor_EPOCH",{{"CinderBlocks",3},{"MortarBucket",3}}}}; + removeParts[] = {{"ItemCorrugatedLg",1},{"ItemCorrugated",1}}; simulClass = "MetalFloor_SIM_EPOCH"; staticClass = "MetalFloor_EPOCH"; GhostPreview = "MetalFloor_Ghost_EPOCH"; - snapPointsPara[] = {"NF","SF","EF","WF","C","CB"}; - snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; energyCost = 0.5; }; - class MetalFloor_SIM_EPOCH : Default - { - allowedSnapPoints[] = {"NF","SF","EF","WF","C"}; + class MetalFloor_SIM_EPOCH : WoodFloor_SIM_EPOCH + { + allowedSnapPoints[] = {"NF","SF","EF","WF","C"}; allowedSnapObjects[] = {"Const_floors_static_F","Constructions_foundation_F"}; + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class MetalFloor_Ghost_EPOCH : MetalFloor_SIM_EPOCH {}; + class MetalHalfFloor_EPOCH : WoodHalfFloor_EPOCH + { + upgradeBuilding[] = {{"CinderHalfFloor_EPOCH",{{"CinderBlocks",2},{"MortarBucket",2}}}}; + removeParts[] = {{"ItemCorrugatedLg",1}}; + simulClass = "MetalHalfFloor_SIM_EPOCH"; + staticClass = "MetalHalfFloor_EPOCH"; + GhostPreview = "MetalHalfFloor_Ghost_EPOCH"; + energyCost = 0.2; + }; + class MetalHalfFloor_SIM_EPOCH : MetalHalfFloor_EPOCH + { + allowedSnapPoints[] = {"NF","SF","EF","WF","NHF","SHF","EHF","WHF"}; + allowedSnapObjects[] = {"Const_floors_static_F"}; + upgradeBuilding[] = {}; removeParts[] = {}; }; - class MetalFloor_Ghost_EPOCH : MetalFloor_SIM_EPOCH {}; + class MetalHalfFloor_Ghost_EPOCH : MetalHalfFloor_SIM_EPOCH {}; + class MetalQuarterFloor_EPOCH : WoodQuarterFloor_EPOCH + { + upgradeBuilding[] = {{"CinderQuarterFloor_EPOCH",{{"CinderBlocks",1},{"MortarBucket",1}}}}; + removeParts[] = {{"ItemCorrugated",1}}; + simulClass = "MetalQuarterFloor_SIM_EPOCH"; + staticClass = "MetalQuarterFloor_EPOCH"; + GhostPreview = "MetalQuarterFloor_Ghost_EPOCH"; + energyCost = 0.1; + }; + class MetalQuarterFloor_SIM_EPOCH : MetalQuarterFloor_EPOCH + { + allowedSnapPoints[] = {"NHF","SHF","EHF","WHF","NQ1","NQ2","SQ1","SQ2","EQ1","EQ2","WQ1","WQ2"}; + allowedSnapObjects[] = {"Const_floors_static_F"}; + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class MetalQuarterFloor_Ghost_EPOCH : MetalQuarterFloor_SIM_EPOCH {}; + + class MetalTower_EPOCH : Default + { + removeParts[] = {{"ItemCorrugatedLg",2}}; + upgradeBuilding[] = {{"CinderTower_EPOCH",{{"CinderBlocks",4},{"MortarBucket",4}}}}; + upgradeBuildingPart[] = {{"ItemCorrugatedLg",2}}; + removeBuildingPart[] = {{"ItemCorrugatedLg",1}}; + simulClass = "MetalTower_SIM_EPOCH"; + staticClass = "MetalTower_EPOCH"; + GhostPreview = "MetalTower_Ghost_EPOCH"; + snapPointsPara[] = {"NF2","SF2","EF2","WF2","NF","SF","EF","WF","C","CB"}; + snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; + persistAnimations[] = {"NWall","EWall","SWall","WWall"}; + energyCost = 0.5; + // snap points for MetalTower_EPOCH + NF2[] = {0,5.237,0}; + SF2[] = {0,-5.237,0}; + EF2[] = {5.237,0,0}; + WF2[] = {-5.237,-0.003,0}; + C[] = {-0.000251044,-0.00293543,6.36635}; + CB[] = {-0.000299305,-0.000390954,3.32569}; + CinN[] = {0.0214193,2.87136,3.05666}; + CinE[] = {2.87868,-0.000390954,3.05666}; + CinS[] = {0.0214193,-2.86826,3.05666}; + CinW[] = {-2.88969,-0.000390954,3.05666}; + N[] = {0.0195083,2.46379,3.32619}; + E[] = {2.47112,-0.000253316,3.32619}; + S[] = {0.0195083,-2.46097,3.32619}; + W[] = {-2.4783,-0.000253316,3.32619}; + NE[] = {2.47112,2.46379,3.32619}; + NW[] = {-2.4783,2.46379,3.32619}; + SE[] = {2.47112,-2.46097,3.32619}; + SW[] = {-2.4783,-2.46097,3.32619}; + NF[] = {0,5.237,3.05694}; + SF[] = {0,-5.237,3.05694}; + EF[] = {5.237,0,3.05694}; + WF[] = {-5.237,0,3.05694}; + }; + class MetalTower_SIM_EPOCH : MetalTower_EPOCH + { + allowedSnapPoints[] = {"NF2","SF2","EF2","WF2","CB"}; + allowedSnapObjects[] = {"MetalTower_EPOCH","Const_floors_static_F","Constructions_foundation_F"}; + }; + class MetalTower_Ghost_EPOCH : MetalTower_SIM_EPOCH {}; + + class CinderWallGarage_EPOCH : Default { removeParts[] = {{"CinderBlocks",4},{"ItemCorrugatedLg",1},{"CircuitParts",1}}; @@ -206,7 +449,126 @@ class CfgBaseBuilding snapPointsPara[] = {"N","E","W"}; allowedSnapPoints[] = {"N","S","E","W"}; energyCost = 0.5; + // snap points for CinderWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.18644,0,0}; + W[] = {-5.19304,0,0}; }; + class CinderWall_window_EPOCH : Default + { + removeParts[] = {{"CinderBlocks",4},{"ItemCorrugatedLg",2},{"ItemGlass",1}}; + staticClass = "CinderWall_window_EPOCH"; + snapType = "snapPointsPara"; + snapPointsPara[] = {"N","E","W"}; + allowedSnapPoints[] = {"N","S","E","W"}; + energyCost = 0.5; + // snap points for CinderWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.18644,0,0}; + W[] = {-5.19304,0,0}; + }; + // Kit_Garden + class Garden_EPOCH : Default + { + removeParts[] = {{"Kit_Garden",1}}; + simulClass = "Garden_SIM_EPOCH"; + staticClass = "Garden_EPOCH"; + GhostPreview = "Garden_Ghost_EPOCH"; + snapPointsPara[] = {"NF","SF","EF","WF","C","CB"}; + snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; + energyCost = 0.5; + // snap points for Garden_EPOCH + C[] = {-0.000379709,0.000134847,2.6837}; + CB[] = {-0.000379709,0.000134847,0.279171}; + CinN[] = {-0.000379709,2.26851,0.0664249}; + CinE[] = {2.27378,0.000134847,0.0664249}; + CinS[] = {-0.000379709,-2.26579,0.0664249}; + CinW[] = {-2.28323,0.000134847,0.0664249}; + N[] = {-0.000379709,1.94653,0.279567}; + E[] = {1.95181,0.000134847,0.279567}; + S[] = {-0.000379709,-1.94403,0.279567}; + W[] = {-1.95824,0.000134847,0.279567}; + NE[] = {1.95181,1.94653,0.279567}; + NW[] = {-1.95824,1.94653,0.279567}; + SE[] = {1.95181,-1.94403,0.279567}; + SW[] = {-1.95824,-1.94403,0.279567}; + NF[] = {-0.000379709,4.13736,0.0668807}; + SF[] = {-0.000379709,-4.1371,0.0668807}; + EF[] = {4.13685,0.000134847,0.0668807}; + WF[] = {-4.13761,0.000134847,0.0668807}; + }; + class Garden_SIM_EPOCH : Garden_EPOCH + { + allowedSnapPoints[] = {"NF","SF","EF","WF","C"}; + allowedSnapObjects[] = {"Const_floors_static_F","Constructions_foundation_F"}; + removeParts[] = {}; + }; + class Garden_Ghost_EPOCH : Garden_SIM_EPOCH {}; + class BarbedWire_EPOCH : Default + { + removeParts[] = {{"ItemScraps",10},{"ItemRope",2}}; + simulClass = "BarbedWire_SIM_EPOCH"; + staticClass = "BarbedWire_EPOCH"; + GhostPreview = "BarbedWire_Ghost_EPOCH"; + energyCost = 0.5; + }; + class BarbedWire_SIM_EPOCH : BarbedWire_EPOCH + { + allowedSnapObjects[] = {"BarbedWire_SIM_EPOCH"}; + removeParts[] = {}; + }; + class BarbedWire_Ghost_EPOCH : BarbedWire_SIM_EPOCH {}; + class CinderFloor_EPOCH : WoodFloor_EPOCH + { + removeParts[] = {{"CinderBlocks",2},{"MortarBucket",1}}; + simulClass = "CinderFloor_SIM_EPOCH"; + staticClass = "CinderFloor_EPOCH"; + GhostPreview = "CinderFloor_Ghost_EPOCH"; + energyCost = 1; + }; + class CinderFloor_SIM_EPOCH : WoodFloor_SIM_EPOCH + { + allowedSnapPoints[] = {"NF","SF","EF","WF","C"}; + allowedSnapObjects[] = {"Const_floors_static_F","Constructions_foundation_F"}; + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class CinderFloor_Ghost_EPOCH : CinderFloor_SIM_EPOCH {}; + class CinderHalfFloor_EPOCH : WoodHalfFloor_EPOCH + { + upgradeBuilding[] = {}; + removeParts[] = {{"CinderBlocks",1},{"MortarBucket",1}}; + simulClass = "CinderHalfFloor_SIM_EPOCH"; + staticClass = "CinderHalfFloor_EPOCH"; + GhostPreview = "CinderHalfFloor_Ghost_EPOCH"; + energyCost = 0.5; + }; + class CinderHalfFloor_SIM_EPOCH : CinderHalfFloor_EPOCH + { + allowedSnapPoints[] = {"NF","SF","EF","WF","NHF","SHF","EHF","WHF"}; + allowedSnapObjects[] = {"Const_floors_static_F"}; + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class CinderHalfFloor_Ghost_EPOCH : CinderHalfFloor_SIM_EPOCH {}; + class CinderQuarterFloor_EPOCH : WoodQuarterFloor_EPOCH + { + upgradeBuilding[] = {}; + removeParts[] = {{"CinderBlocks",1}}; + simulClass = "CinderQuarterFloor_SIM_EPOCH"; + staticClass = "CinderQuarterFloor_EPOCH"; + GhostPreview = "CinderQuarterFloor_Ghost_EPOCH"; + energyCost = 0.25; + }; + class CinderQuarterFloor_SIM_EPOCH : CinderQuarterFloor_EPOCH + { + allowedSnapPoints[] = {"NHF","SHF","EHF","WHF","NQ1","NQ2","SQ1","SQ2","EQ1","EQ2","WQ1","WQ2"}; + allowedSnapObjects[] = {"Const_floors_static_F"}; + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class CinderQuarterFloor_Ghost_EPOCH : CinderQuarterFloor_SIM_EPOCH {}; + class CinderWallGarage_SIM_EPOCH : CinderWallGarage_EPOCH { allowedSnapObjects[] = {"Const_Cinder_static_F","Const_floors_static_F"}; @@ -223,6 +585,11 @@ class CfgBaseBuilding snapType = "snapPointsPara"; snapPointsPara[] = {"N","E","W"}; allowedSnapPoints[] = {"N","S","E","W"}; + // snap points for CinderWallHalf_EPOCH + N[] = {0,0,1.57378}; + E[] = {5.18644,0,0}; + W[] = {-5.19304,0,0}; + }; class CinderWallHalf_SIM_EPOCH : CinderWallHalf_EPOCH { @@ -233,7 +600,7 @@ class CfgBaseBuilding class CinderWallHalf_Ghost_EPOCH : CinderWallHalf_SIM_EPOCH {}; class CinderWall_EPOCH : Default { - upgradeBuilding[] = {{"CinderWallGarage_EPOCH",{{"ItemCorrugatedLg",1},{"CircuitParts",1}}}}; + upgradeBuilding[] = {{"CinderWallGarage_EPOCH",{{"ItemCorrugatedLg",1},{"CircuitParts",1}}},{"CinderWallDoorwHatch_EPOCH",{{"ItemCorrugatedLg",1},{"CircuitParts",1}}},{"CinderWall_window_EPOCH",{{"ItemCorrugatedLg",2},{"ItemGlass",1}}}}; removeParts[] = {{"CinderBlocks",4},{"ItemRock",2}}; simulClass = "CinderWall_SIM_EPOCH"; staticClass = "CinderWall_EPOCH"; @@ -242,6 +609,11 @@ class CfgBaseBuilding snapPointsPara[] = {"N","E","W"}; allowedSnapPoints[] = {"N","S","E","W"}; energyCost = 0.4; + // snap points for CinderWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.18644,0,0}; + W[] = {-5.19304,0,0}; + }; class CinderWall_SIM_EPOCH : CinderWall_EPOCH { @@ -249,7 +621,63 @@ class CfgBaseBuilding upgradeBuilding[] = {}; removeParts[] = {}; }; - class WoodLargeWall_EPOCH : Default + class CinderWallDoorwHatch_EPOCH : Default + { + removeParts[] = {{"CinderBlocks",4},{"ItemCorrugatedLg",1},{"CircuitParts",1}}; + staticClass = "CinderWallDoorwHatch_EPOCH"; + snapType = "snapPointsPara"; + snapPointsPara[] = {"N","E","W"}; + allowedSnapPoints[] = {"N","S","E","W"}; + // snap points for CinderWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.18644,0,0}; + W[] = {-5.19304,0,0}; + }; + + class CinderTower_EPOCH : Default + { + removeParts[] = {{"CinderBlocks",2},{"MortarBucket",2}}; + upgradeBuildingPart[] = {{"CinderBlocks",2},{"MortarBucket",2}}; + removeBuildingPart[] = {{"CinderBlocks",2}}; + simulClass = "CinderTower_SIM_EPOCH"; + staticClass = "CinderTower_EPOCH"; + GhostPreview = "CinderTower_Ghost_EPOCH"; + snapPointsPara[] = {"NF2","SF2","EF2","WF2","NF","SF","EF","WF","C","CB"}; + snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; + persistAnimations[] = {"NWall","EWall","SWall","WWall"}; + energyCost = 0.4; + // snap points for CinderTower_EPOCH + NF2[] = {0,5.237,0}; + SF2[] = {0,-5.237,0}; + EF2[] = {5.237,0,0}; + WF2[] = {-5.237,-0.003,0}; + C[] = {-0.000251044,-0.00293543,6.36635}; + CB[] = {-0.000299305,-0.000390954,3.32569}; + CinN[] = {0.0214193,2.87136,3.05666}; + CinE[] = {2.87868,-0.000390954,3.05666}; + CinS[] = {0.0214193,-2.86826,3.05666}; + CinW[] = {-2.88969,-0.000390954,3.05666}; + N[] = {0.0195083,2.46379,3.32619}; + E[] = {2.47112,-0.000253316,3.32619}; + S[] = {0.0195083,-2.46097,3.32619}; + W[] = {-2.4783,-0.000253316,3.32619}; + NE[] = {2.47112,2.46379,3.32619}; + NW[] = {-2.4783,2.46379,3.32619}; + SE[] = {2.47112,-2.46097,3.32619}; + SW[] = {-2.4783,-2.46097,3.32619}; + NF[] = {0,5.237,3.05694}; + SF[] = {0,-5.237,3.05694}; + EF[] = {5.237,0,3.05694}; + WF[] = {-5.237,0,3.05694}; + }; + class CinderTower_SIM_EPOCH : CinderTower_EPOCH + { + allowedSnapPoints[] = {"NF2","SF2","EF2","WF2","CB"}; + allowedSnapObjects[] = {"CinderTower_EPOCH","Const_floors_static_F","Constructions_foundation_F"}; + }; + class CinderTower_Ghost_EPOCH : CinderTower_SIM_EPOCH {}; + + class WoodLargeWall_EPOCH : Default { upgradeBuilding[] = {{"WoodWall1_EPOCH",{{"ItemPlywoodPack",1}}},{"WoodLargeWallCor_EPOCH",{{"ItemCorrugated",1}}}}; removeParts[] = {{"PartPlankPack",2}}; @@ -259,6 +687,10 @@ class CfgBaseBuilding snapType = "snapPointsPara"; snapPointsPara[] = {"N","E","W"}; allowedSnapPoints[] = {"N","S","E","W"}; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodLargeWall_SIM_EPOCH : WoodLargeWall_EPOCH { @@ -269,7 +701,7 @@ class CfgBaseBuilding class WoodLargeWall_Ghost_EPOCH : WoodLargeWall_SIM_EPOCH {}; class WoodWall1_EPOCH : Default { - upgradeBuilding[] = {{"WoodWall2_EPOCH",{{"PartPlankPack",1}}},{"WoodLargeWallCor_EPOCH",{{"ItemCorrugated",1}}}}; + upgradeBuilding[] = {{"WoodWall2_EPOCH",{{"PartPlankPack",1}}},{"WoodLargeWallCor_EPOCH",{{"ItemCorrugated",1}}},{"WoodWallWindow_EPOCH",{{"ItemGlass",2}}}}; removeParts[] = {{"PartPlankPack",2}}; simulClass = "WoodWall1_SIM_EPOCH"; staticClass = "WoodWall1_EPOCH"; @@ -278,6 +710,10 @@ class CfgBaseBuilding snapPointsPara[] = {"N","E","W"}; allowedSnapPoints[] = {"N","S","E","W"}; energyCost = 0.2; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodWall1_SIM_EPOCH : WoodWall1_EPOCH { @@ -286,6 +722,19 @@ class CfgBaseBuilding upgradeBuilding[] = {}; removeParts[] = {}; }; + class WoodWallWindow_EPOCH : Default + { + removeParts[] = {{"ItemGlass",2},{"PartPlankPack",2}}; + staticClass = "WoodWallWindow_EPOCH"; + snapType = "snapPointsPara"; + snapPointsPara[] = {"N","E","W"}; + allowedSnapPoints[] = {"N","S","E","W"}; + energyCost = 0.5; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; + }; class WoodLargeWallCor_EPOCH : Default { upgradeBuilding[] = {{"WoodLargeWallDoorway_EPOCH",{{"PartPlankPack",1}}}}; @@ -298,6 +747,10 @@ class CfgBaseBuilding allowedSnapPoints[] = {"N","S","E","W"}; energyCost = 0.2; availableTextures[] = {"\x\addons\a3_epoch_assets\textures\cor\corrugated_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_black_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_blue_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_brown_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_green_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_orange_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_purple_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_red_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_teal_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_yellow_co.paa"}; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodLargeWallCor_SIM_EPOCH : WoodLargeWallCor_EPOCH { @@ -315,6 +768,10 @@ class CfgBaseBuilding snapPointsPara[] = {"N","E","W"}; allowedSnapPoints[] = {"N","S","E","W"}; energyCost = 0.2; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodWall2_SIM_EPOCH : WoodWall2_EPOCH { @@ -333,6 +790,10 @@ class CfgBaseBuilding allowedSnapPoints[] = {"N","S","E","W"}; energyCost = 0.2; availableTextures[] = {"\x\addons\a3_epoch_assets\textures\cor\corrugated_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_black_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_blue_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_brown_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_green_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_orange_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_purple_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_red_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_teal_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_yellow_co.paa"}; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodLargeWallDoorway_SIM_EPOCH : WoodLargeWallDoorway_EPOCH { @@ -350,6 +811,10 @@ class CfgBaseBuilding snapPointsPara[] = {"N","E","W"}; allowedSnapPoints[] = {"N","S","E","W"}; energyCost = 0.2; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodWall3_SIM_EPOCH : WoodWall3_EPOCH { @@ -368,6 +833,10 @@ class CfgBaseBuilding allowedSnapPoints[] = {"N","S","E","W"}; availableTextures[] = {"\x\addons\a3_epoch_assets\textures\cor\corrugated_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_black_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_blue_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_brown_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_green_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_orange_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_purple_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_red_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_teal_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_yellow_co.paa"}; energyCost = 0.2; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodLargeWallDoor_SIM_EPOCH : WoodLargeWallDoor_EPOCH { @@ -384,6 +853,10 @@ class CfgBaseBuilding snapPointsPara[] = {"N","E","W"}; allowedSnapPoints[] = {"N","S","E","W"}; energyCost = 0.2; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodWall4_SIM_EPOCH : WoodWall4_EPOCH { @@ -401,6 +874,10 @@ class CfgBaseBuilding allowedSnapPoints[] = {"N","S","E","W"}; availableTextures[] = {"\x\addons\a3_epoch_assets\textures\cor\corrugated_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_black_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_blue_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_brown_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_green_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_orange_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_purple_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_red_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_teal_co.paa","\x\addons\a3_epoch_assets\textures\cor\corrugated_yellow_co.paa"}; energyCost = 0.2; + // snap points for WoodLargeWall_EPOCH + N[] = {0,0,3.06034}; + E[] = {5.23785,0,0}; + W[] = {-5.26294,0,0}; }; class WoodLargeWallDoorL_SIM_EPOCH : WoodLargeWallDoorL_EPOCH { @@ -418,6 +895,33 @@ class CfgBaseBuilding snapPointsPara[] = {}; snapPointsPerp[] = {}; energyCost = 0.2; + // snap points for WoodStairs_EPOCH + NF2[] = {0,5.237,0}; + SF2[] = {0,-5.237,0}; + EF2[] = {5.237,0,0}; + WF2[] = {-5.237,-0.003,0}; + C[] = {-0.000251044,-0.00293543,6.37273}; + CB[] = {-0.000299305,-0.000390954,3.32902}; + CinN[] = {0.0214193,2.87136,3.05972}; + CinE[] = {2.87868,-0.000390954,3.05972}; + CinS[] = {0.0214193,-2.86826,3.05972}; + CinW[] = {-2.88969,-0.000390954,3.05972}; + N[] = {0.0195083,2.46379,3.32952}; + E[] = {2.47112,-0.000253316,3.32952}; + S[] = {0.0195083,-2.46097,3.32952}; + W[] = {-2.4783,-0.000253316,3.32952}; + NE[] = {2.47112,2.46379,3.32952}; + NW[] = {-2.4783,2.46379,3.32952}; + SE[] = {2.47112,-2.46097,3.32952}; + SW[] = {-2.4783,-2.46097,3.32952}; + NF[] = {0,5.237,3.06}; + SF[] = {0,-5.237,3.06}; + EF[] = {5.237,0,3.06}; + WF[] = {-5.237,0,3.06}; + NQF[] = {0,3.92775,3.06}; + SQF[] = {0,-3.92775,3.06}; + EQF[] = {3.92775,0,3.06}; + WQF[] = {-3.92775,0,3.06}; }; class WoodStairs_SIM_EPOCH : WoodStairs_EPOCH { @@ -433,9 +937,36 @@ class CfgBaseBuilding simulClass = "WoodStairs2_SIM_EPOCH"; staticClass = "WoodStairs2_EPOCH"; GhostPreview = "WoodStairs2_EPOCH"; - snapPointsPara[] = {"NF2","SF2","EF2","WF2","NF","SF","EF","WF","C","CB"}; + snapPointsPara[] = {"NF2","SF2","EF2","WF2","NF","SF","EF","WF","C","CB","NQF","SQF","EQF","WQF"}; snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; energyCost = 0.3; + // snap points for WoodStairs_EPOCH + NF2[] = {0,5.237,0}; + SF2[] = {0,-5.237,0}; + EF2[] = {5.237,0,0}; + WF2[] = {-5.237,-0.003,0}; + C[] = {-0.000251044,-0.00293543,6.37273}; + CB[] = {-0.000299305,-0.000390954,3.32902}; + CinN[] = {0.0214193,2.87136,3.05972}; + CinE[] = {2.87868,-0.000390954,3.05972}; + CinS[] = {0.0214193,-2.86826,3.05972}; + CinW[] = {-2.88969,-0.000390954,3.05972}; + N[] = {0.0195083,2.46379,3.32952}; + E[] = {2.47112,-0.000253316,3.32952}; + S[] = {0.0195083,-2.46097,3.32952}; + W[] = {-2.4783,-0.000253316,3.32952}; + NE[] = {2.47112,2.46379,3.32952}; + NW[] = {-2.4783,2.46379,3.32952}; + SE[] = {2.47112,-2.46097,3.32952}; + SW[] = {-2.4783,-2.46097,3.32952}; + NF[] = {0,5.237,3.06}; + SF[] = {0,-5.237,3.06}; + EF[] = {5.237,0,3.06}; + WF[] = {-5.237,0,3.06}; + NQF[] = {0,3.92775,3.06}; + SQF[] = {0,-3.92775,3.06}; + EQF[] = {3.92775,0,3.06}; + WQF[] = {-3.92775,0,3.06}; }; class WoodStairs2_SIM_EPOCH : WoodStairs2_EPOCH { @@ -446,6 +977,7 @@ class CfgBaseBuilding class WoodTower_EPOCH : Default { removeParts[] = {{"PartPlankPack",4}}; + upgradeBuilding[] = {{"MetalTower_EPOCH",{{"ItemCorrugatedLg",4}}}}; upgradeBuildingPart[] = {{"ItemPlywoodPack",1},{"PartPlankPack",2}}; removeBuildingPart[] = {{"ItemPlywoodPack",1},{"PartPlankPack",2}}; simulClass = "WoodTower_SIM_EPOCH"; @@ -455,6 +987,29 @@ class CfgBaseBuilding snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"}; persistAnimations[] = {"NWall","EWall","SWall","WWall"}; energyCost = 0.3; + // snap points for WoodTower_EPOCH + NF2[] = {0,5.237,0}; + SF2[] = {0,-5.237,0}; + EF2[] = {5.237,0,0}; + WF2[] = {-5.237,-0.003,0}; + C[] = {-0.000251044,-0.00293543,6.36635}; + CB[] = {-0.000299305,-0.000390954,3.32569}; + CinN[] = {0.0214193,2.87136,3.05666}; + CinE[] = {2.87868,-0.000390954,3.05666}; + CinS[] = {0.0214193,-2.86826,3.05666}; + CinW[] = {-2.88969,-0.000390954,3.05666}; + N[] = {0.0195083,2.46379,3.32619}; + E[] = {2.47112,-0.000253316,3.32619}; + S[] = {0.0195083,-2.46097,3.32619}; + W[] = {-2.4783,-0.000253316,3.32619}; + NE[] = {2.47112,2.46379,3.32619}; + NW[] = {-2.4783,2.46379,3.32619}; + SE[] = {2.47112,-2.46097,3.32619}; + SW[] = {-2.4783,-2.46097,3.32619}; + NF[] = {0,5.237,3.05694}; + SF[] = {0,-5.237,3.05694}; + EF[] = {5.237,0,3.05694}; + WF[] = {-5.237,0,3.05694}; }; class WoodTower_SIM_EPOCH : WoodTower_EPOCH { @@ -494,6 +1049,42 @@ class CfgBaseBuilding removeParts[] = {}; }; class Tipi_Ghost_EPOCH : Tipi_SIM_EPOCH {}; + class TentA_EPOCH : Default + { + removeParts[] = {{"KitTentA",1}}; + GhostPreview = "TentA_Ghost_EPOCH"; + staticClass = "TentA_EPOCH"; + simulClass = "TentA_SIM_EPOCH"; + limitNearby = 2; + bypassJammer = 1; + }; + class TentA_SIM_EPOCH : TentA_EPOCH + { + simulClass = "TentA_SIM_EPOCH"; + staticClass = "TentA_EPOCH"; + limitNearby = 2; + bypassJammer = 1; + removeParts[] = {}; + }; + class TentA_Ghost_EPOCH : TentA_SIM_EPOCH {}; + class TentDome_EPOCH : Default + { + removeParts[] = {{"KitTentDome",1}}; + GhostPreview = "TentDome_Ghost_EPOCH"; + staticClass = "TentDome_EPOCH"; + simulClass = "TentDome_SIM_EPOCH"; + limitNearby = 2; + bypassJammer = 1; + }; + class TentDome_SIM_EPOCH : TentA_EPOCH + { + simulClass = "TentDome_SIM_EPOCH"; + staticClass = "TentDome_EPOCH"; + limitNearby = 2; + bypassJammer = 1; + removeParts[] = {}; + }; + class TentDome_Ghost_EPOCH : TentDome_SIM_EPOCH {}; class StorageShelf_EPOCH : Default { removeParts[] = {{"ItemCorrugated",2}}; @@ -562,6 +1153,246 @@ class CfgBaseBuilding energyCost = 0.1; }; class Jack_SIM_EPOCH : Jack_EPOCH {}; + class BurnBarrel_EPOCH : Default + { + removeParts[] = {{"KitBurnBarrel",1}}; + GhostPreview = "BurnBarrel_Ghost_EPOCH"; + staticClass = "BurnBarrel_EPOCH"; + simulClass = "BurnBarrel_SIM_EPOCH"; + }; + class BurnBarrel_SIM_EPOCH : BurnBarrel_EPOCH + { + removeParts[] = {}; + }; + class BurnBarrel_Ghost_EPOCH : BurnBarrel_SIM_EPOCH {}; + class LightPole_EPOCH : Default + { + removeParts[] = {{"KitLightPole",1}}; + GhostPreview = "LightPole_Ghost_EPOCH"; + staticClass = "LightPole_EPOCH"; + simulClass = "LightPole_SIM_EPOCH"; + }; + class LightPole_SIM_EPOCH : LightPole_EPOCH + { + removeParts[] = {}; + }; + class LightPole_Ghost_EPOCH : LightPole_SIM_EPOCH {}; + class SmallForestCamoNet_EPOCH : Default + { + removeParts[] = {{"KitSmallForestCamoNet",1}}; + GhostPreview = "SmallForestCamoNet_Ghost_EPOCH"; + staticClass = "SmallForestCamoNet_EPOCH"; + simulClass = "SmallForestCamoNet_SIM_EPOCH"; + }; + class SmallForestCamoNet_SIM_EPOCH : SmallForestCamoNet_EPOCH + { + removeParts[] = {}; + }; + class SmallForestCamoNet_Ghost_EPOCH : SmallForestCamoNet_SIM_EPOCH {}; + class SmallDesertCamoNet_EPOCH : Default + { + removeParts[] = {{"KitSmallDesertCamoNet",1}}; + GhostPreview = "SmallDesertCamoNet_Ghost_EPOCH"; + staticClass = "SmallDesertCamoNet_EPOCH"; + simulClass = "SmallDesertCamoNet_SIM_EPOCH"; + }; + class SmallDesertCamoNet_SIM_EPOCH : SmallDesertCamoNet_EPOCH + { + removeParts[] = {}; + }; + class SmallDesertCamoNet_Ghost_EPOCH : SmallDesertCamoNet_SIM_EPOCH {}; + class LargeForestCamoNet_EPOCH : Default + { + removeParts[] = {{"KitLargeForestCamoNet",1}}; + GhostPreview = "LargeForestCamoNet_Ghost_EPOCH"; + staticClass = "LargeForestCamoNet_EPOCH"; + simulClass = "LargeForestCamoNet_SIM_EPOCH"; + }; + class LargeForestCamoNet_SIM_EPOCH : LargeForestCamoNet_EPOCH + { + removeParts[] = {}; + }; + class LargeForestCamoNet_Ghost_EPOCH : LargeForestCamoNet_SIM_EPOCH {}; + class LargeDesertCamoNet_EPOCH : Default + { + removeParts[] = {{"KitLargeDesertCamoNet",1}}; + GhostPreview = "LargeDesertCamoNet_Ghost_EPOCH"; + staticClass = "LargeDesertCamoNet_EPOCH"; + simulClass = "LargeDesertCamoNet_SIM_EPOCH"; + }; + class LargeDesertCamoNet_SIM_EPOCH : LargeDesertCamoNet_EPOCH + { + removeParts[] = {}; + }; + class LargeDesertCamoNet_Ghost_EPOCH : LargeDesertCamoNet_SIM_EPOCH {}; + class FirePlace_02_EPOCH : Default + { + removeParts[] = {{"KitFirePlace_02",1}}; + GhostPreview = "FirePlace_02_Ghost_EPOCH"; + staticClass = "FirePlace_02_EPOCH"; + simulClass = "FirePlace_02_SIM_EPOCH"; + }; + class FirePlace_02_SIM_EPOCH : FirePlace_02_EPOCH + { + removeParts[] = {}; + }; + class FirePlace_02_Ghost_EPOCH : FirePlace_02_SIM_EPOCH {}; + class FieldToilet_EPOCH : Default + { + removeParts[] = {{"KitFieldToilet",1}}; + GhostPreview = "FieldToilet_Ghost_EPOCH"; + staticClass = "FieldToilet_EPOCH"; + simulClass = "FieldToilet_SIM_EPOCH"; + }; + class FieldToilet_SIM_EPOCH : FieldToilet_EPOCH + { + removeParts[] = {}; + }; + class FieldToilet_Ghost_EPOCH : FieldToilet_SIM_EPOCH {}; + class Scaffolding_EPOCH : Default + { + removeParts[] = {{"KitScaffolding",1}}; + GhostPreview = "Scaffolding_Ghost_EPOCH"; + staticClass = "Scaffolding_EPOCH"; + simulClass = "Scaffolding_SIM_EPOCH"; + }; + class Scaffolding_SIM_EPOCH : Scaffolding_EPOCH + { + removeParts[] = {}; + }; + class Scaffolding_Ghost_EPOCH : Scaffolding_SIM_EPOCH {}; + class Sink_EPOCH : Default + { + removeParts[] = {{"KitSink",1}}; + GhostPreview = "Sink_Ghost_EPOCH"; + staticClass = "Sink_EPOCH"; + simulClass = "Sink_SIM_EPOCH"; + }; + class Sink_SIM_EPOCH : Sink_EPOCH + { + removeParts[] = {}; + }; + class Sink_Ghost_EPOCH : Sink_SIM_EPOCH {}; + class PortableLight_Single_EPOCH : Default + { + removeParts[] = {{"KitPortableLight_Single",1}}; + GhostPreview = "PortableLight_Single_Ghost_EPOCH"; + staticClass = "PortableLight_Single_EPOCH"; + simulClass = "PortableLight_Single_SIM_EPOCH"; + }; + class PortableLight_Single_SIM_EPOCH : PortableLight_Single_EPOCH + { + removeParts[] = {}; + }; + class PortableLight_Single_Ghost_EPOCH : PortableLight_Single_SIM_EPOCH {}; + class PortableLight_Double_EPOCH : Default + { + removeParts[] = {{"KitPortableLight_Double",1}}; + GhostPreview = "PortableLight_Double_Ghost_EPOCH"; + staticClass = "PortableLight_Double_EPOCH"; + simulClass = "PortableLight_Double_SIM_EPOCH"; + }; + class PortableLight_Double_SIM_EPOCH : PortableLight_Double_EPOCH + { + removeParts[] = {}; + }; + class PortableLight_Double_Ghost_EPOCH : PortableLight_Double_SIM_EPOCH {}; + class WatchTower_EPOCH : Default + { + removeParts[] = {{"KitWatchTower",1}}; + GhostPreview = "WatchTower_Ghost_EPOCH"; + staticClass = "WatchTower_EPOCH"; + simulClass = "WatchTower_SIM_EPOCH"; + }; + class WatchTower_SIM_EPOCH : WatchTower_EPOCH + { + removeParts[] = {}; + }; + class WatchTower_Ghost_EPOCH : WatchTower_SIM_EPOCH {}; + class SunShade_EPOCH : Default + { + removeParts[] = {{"KitSunShade",1}}; + GhostPreview = "SunShade_Ghost_EPOCH"; + staticClass = "SunShade_EPOCH"; + simulClass = "SunShade_SIM_EPOCH"; + }; + class SunShade_SIM_EPOCH : SunShade_EPOCH + { + removeParts[] = {}; + }; + class SunShade_Ghost_EPOCH : SunShade_SIM_EPOCH {}; + class FuelPump_EPOCH : Default + { + removeParts[] = {{"KitFuelPump",1}}; + GhostPreview = "FuelPump_Ghost_EPOCH"; + staticClass = "FuelPump_EPOCH"; + simulClass = "FuelPump_SIM_EPOCH"; + }; + class FuelPump_SIM_EPOCH : FuelPump_EPOCH + { + removeParts[] = {}; + }; + class FuelPump_Ghost_EPOCH : FuelPump_SIM_EPOCH {}; + class BagBunker_EPOCH : Default + { + removeParts[] = {{"KitBagBunker",1}}; + GhostPreview = "BagBunker_Ghost_EPOCH"; + staticClass = "BagBunker_EPOCH"; + simulClass = "BagBunker_SIM_EPOCH"; + }; + class BagBunker_SIM_EPOCH : BagBunker_EPOCH + { + removeParts[] = {}; + }; + class BagBunker_Ghost_EPOCH : BagBunker_SIM_EPOCH {}; + class SandbagWall_EPOCH : Default + { + removeParts[] = {{"KitSandbagWall",1}}; + GhostPreview = "SandbagWall_Ghost_EPOCH"; + staticClass = "SandbagWall_EPOCH"; + simulClass = "SandbagWall_SIM_EPOCH"; + }; + class SandbagWall_SIM_EPOCH : SandbagWall_EPOCH + { + removeParts[] = {}; + }; + class SandbagWall_Ghost_EPOCH : SandbagWall_SIM_EPOCH {}; + class SandbagWallLong_EPOCH : Default + { + removeParts[] = {{"KitSandbagWallLong",1}}; + GhostPreview = "SandbagWallLong_Ghost_EPOCH"; + staticClass = "SandbagWallLong_EPOCH"; + simulClass = "SandbagWallLong_SIM_EPOCH"; + }; + class SandbagWallLong_SIM_EPOCH : SandbagWallLong_EPOCH + { + removeParts[] = {}; + }; + class SandbagWallLong_Ghost_EPOCH : SandbagWallLong_SIM_EPOCH {}; + class BarGate_EPOCH : Default + { + removeParts[] = {{"KitBarGate",1}}; + GhostPreview = "BarGate_Ghost_EPOCH"; + staticClass = "BarGate_EPOCH"; + simulClass = "BarGate_SIM_EPOCH"; + }; + class BarGate_SIM_EPOCH : BarGate_EPOCH + { + removeParts[] = {}; + }; + class BarGate_Ghost_EPOCH : BarGate_SIM_EPOCH {}; + class WaterPump_EPOCH : Default + { + removeParts[] = {{"KitWaterPump",1}}; + GhostPreview = "WaterPump_Ghost_EPOCH"; + staticClass = "WaterPump_EPOCH"; + simulClass = "WaterPump_SIM_EPOCH"; + }; + class WaterPump_SIM_EPOCH : WaterPump_EPOCH + { + removeParts[] = {}; + }; + class WaterPump_Ghost_EPOCH : WaterPump_SIM_EPOCH {}; }; /*[[[end]]]*/ diff --git a/Sources/epoch_config/Configs/CfgBuildingLootPos.hpp b/Sources/epoch_config/Configs/CfgBuildingLootPos.hpp index 02106fc0..3befffe6 100644 --- a/Sources/epoch_config/Configs/CfgBuildingLootPos.hpp +++ b/Sources/epoch_config/Configs/CfgBuildingLootPos.hpp @@ -14,11 +14,13 @@ class CfgBuildingLootPos lockerPos[] = {}; toolRackPos[] = {}; shoeboxPos[] = {}; + toiletPos[] = {}; + kitchenSinkPos[] = {}; lootBias = 40; limit = 3; lootType = "normal"; - normal[] = {{"shelfPos","Shelf_EPOCH",true},{"fridgePos","Fridge_EPOCH",true},{"bedPos","Bed_EPOCH",false},{"couchPos","Couch_EPOCH",false},{"wardrobePos","wardrobe_epoch",false},{"cookerPos","cooker_epoch",false},{"chairPos",{"Chair_EPOCH","ChairRed_EPOCH"},true},{"filingPos","Filing_epoch",true},{"pelicanPos","Pelican_EPOCH",false},{"tablePos","Table_EPOCH",false},{"lockerPos","Locker_EPOCH",false},{"toolRackPos","ToolRack_EPOCH",false},{"shoeboxPos","Shoebox_EPOCH",false},{"palletPos","Tarp_EPOCH",false},{"freezerPos","Freezer_EPOCH",false},{"cabinetPos","Cabinet_EPOCH",false}}; - mil[] = {{"shelfPos","Shelf_EPOCH",true},{"fridgePos","Fridge_EPOCH",true},{"bedPos","Bunk_EPOCH",false},{"couchPos","Couch_EPOCH",false},{"wardrobePos","wardrobe_epoch",false},{"cookerPos","cooker_epoch",false},{"chairPos",{"Chair_EPOCH","ChairRed_EPOCH"},true},{"filingPos","Filing_epoch",true},{"pelicanPos","Pelican_EPOCH",false},{"tablePos","Table_EPOCH",false},{"lockerPos","Locker_EPOCH",false},{"toolRackPos","ToolRack_EPOCH",false},{"shoeboxPos","Shoebox_EPOCH",false},{"palletPos","Tarp_EPOCH",false},{"freezerPos","Freezer_EPOCH",false},{"cabinetPos","Cabinet_EPOCH",false}}; + normal[] = {{"shelfPos","Shelf_EPOCH",true},{"fridgePos","Fridge_EPOCH",true},{"bedPos","Bed_EPOCH",false},{"couchPos","Couch_EPOCH",false},{"wardrobePos","wardrobe_epoch",false},{"cookerPos","cooker_epoch",false},{"chairPos",{"Chair_EPOCH","ChairRed_EPOCH"},true},{"filingPos","Filing_epoch",true},{"pelicanPos","Pelican_EPOCH",false},{"tablePos","Table_EPOCH",false},{"lockerPos","Locker_EPOCH",false},{"toolRackPos","ToolRack_EPOCH",false},{"shoeboxPos","Shoebox_EPOCH",false},{"palletPos","Tarp_EPOCH",false},{"freezerPos","Freezer_EPOCH",false},{"cabinetPos","Cabinet_EPOCH",false},{"toiletPos","toilet_epoch",false},{"kitchenSinkPos","KitchenSink_epoch",false}}; + mil[] = {{"shelfPos","Shelf_EPOCH",true},{"fridgePos","Fridge_EPOCH",true},{"bedPos","Bunk_EPOCH",false},{"couchPos","Couch_EPOCH",false},{"wardrobePos","wardrobe_epoch",false},{"cookerPos","cooker_epoch",false},{"chairPos",{"Chair_EPOCH","ChairRed_EPOCH"},true},{"filingPos","Filing_epoch",true},{"pelicanPos","Pelican_EPOCH",false},{"tablePos","Table_EPOCH",false},{"lockerPos","Locker_EPOCH",false},{"toolRackPos","ToolRack_EPOCH",false},{"shoeboxPos","Shoebox_EPOCH",false},{"palletPos","Tarp_EPOCH",false},{"freezerPos","Freezer_EPOCH",false},{"cabinetPos","Cabinet_EPOCH",false},{"toiletPos","toilet_epoch",false},{"kitchenSinkPos","KitchenSink_epoch",false}}; }; class Land_Kiosk_redburger_F : Default { @@ -68,6 +70,7 @@ class CfgBuildingLootPos palletPos[] = {{{0.328125,-3.94141,-0.740771},174},{{2.7959,-6.25977,-10},260}}; freezerPos[] = {{{2.64355,5.34766,-3.14077},271}}; cabinetPos[] = {{{-4.21973,-1.09131,-1.87077},0},{{2.64795,-5.21143,-1.87077},270}}; + toiletPos[] = {{{8.27148,-1.80664,-3.12631},89.1022}}; }; class Land_Research_house_V1_F : Default { @@ -79,6 +82,7 @@ class CfgBuildingLootPos lockerPos[] = {{{2.18555,3.36523,0.00385499},88.1972}}; palletPos[] = {{{-1.45508,-1.11914,-10},174}}; cabinetPos[] = {{{-0.443359,-0.0527344,1.29856},270}}; + toiletPos[] = {{{-1.11523,3.81445,0.0326004},2.30161}}; }; class Land_spp_Tower_F : Default { @@ -97,6 +101,7 @@ class CfgBuildingLootPos palletPos[] = {{{1.52539,0.0351563,23.8031},272},{{3.38477,0.015625,23.8031},179}}; freezerPos[] = {{{3.29102,-1.50195,10.1633},179}}; cabinetPos[] = {{{-3.93164,0.230469,-22.7967},0}}; + toiletPos[] = {{{-5.34961,-1.48633,23.7807},-92.9635}}; }; class Land_MilOffices_V1_F : Default { @@ -117,6 +122,7 @@ class CfgBuildingLootPos palletPos[] = {{{-15.3184,-3.625,-2.85274},272}}; freezerPos[] = {{{-12.2461,-4.50391,-2.85274},272}}; cabinetPos[] = {{{5.3125,4.95215,-1.47264},180},{{5.27734,-5.80957,-1.47264},270},{{-12.1123,-2.60938,-1.47264},270}}; + toiletPos[] = {{{-13.3125,-2.79297,-2.7875},92.6481}}; }; class Land_Airport_Tower_F : Default { @@ -128,6 +134,7 @@ class CfgBuildingLootPos lockerPos[] = {{{-3.26172,-0.542969,-1.4672},314.971}}; palletPos[] = {{{-4.09766,1.40625,-10.6461},272}}; cabinetPos[] = {{{2.48779,-0.672852,2.53949},135},{{-2.37842,1.64404,-9.16051},0},{{-3.85498,-0.772461,2.53949},45}}; + toiletPos[] = {{{0.578125,6.6416,-10.4447},-314.586}}; }; class Land_Slum_House01_F : Default { @@ -136,6 +143,7 @@ class CfgBuildingLootPos pelicanPos[] = {{{1.4668,2.32031,1.60821},184.525}}; toolRackPos[] = {{{-1.56641,0.789063,-1.08133},270.436}}; palletPos[] = {{{0.169922,0.214844,-1.08145},272}}; + toiletPos[] = {{{1.66797,0.121094,-1.11079},92.4621}}; }; class Land_Slum_House02_F : Default { @@ -143,6 +151,7 @@ class CfgBuildingLootPos couchPos[] = {{{2.14844,0.236328,-0.824545},0.0984116}}; chairPos[] = {{{1.15234,3.20508,-0.824523},352.052}}; tablePos[] = {{{-0.15625,0.738281,-0.824542},268.176}}; + toiletPos[] = {{{3.01953,2.18164,-0.955211},-271.898}}; }; class Land_Slum_House03_F : Default { @@ -151,6 +160,7 @@ class CfgBuildingLootPos filingPos[] = {{{3.98633,-0.507813,-1.07675},95}}; toolRackPos[] = {{{0.773438,2.98633,-1.07675},0}}; palletPos[] = {{{3.60938,2.14453,-1.07675},272}}; + toiletPos[] = {{{-0.810547,2.59668,-1.04755},-0.816681}}; }; class Land_cargo_house_slum_F : Default { @@ -178,6 +188,7 @@ class CfgBuildingLootPos pelicanPos[] = {{{2.81738,-9.37305,2.3419},2.64822}}; toolRackPos[] = {{{-3.79004,9.14063,-6.35813},0.489624},{{-6.61133,12.8359,-6.32813},89.3704}}; palletPos[] = {{{-3.94238,-16.6523,-10},94},{{4.20313,16.6426,-6.35465},95}}; + toiletPos[] = {{{-8.86426,14.8223,-6.3993},-0.588776}}; }; class Land_Airport_right_F : Default { @@ -199,6 +210,7 @@ class CfgBuildingLootPos palletPos[] = {{{3.84741,-3.8418,-6.74531},350},{{-6.58008,0.285217,-1.86532},278},{{-6.44922,-1.64844,-1.86532},264},{{-23.873,-11.5293,-6.74531},350},{{-23.8867,-13.6483,-6.74531},86}}; freezerPos[] = {{{-1.31055,3.54303,-1.74532},360}}; cabinetPos[] = {{{-4.80347,-2.53943,-5.34531},0}}; + toiletPos[] = {{{-26.4805,14.6035,-6.78733},-42.5349}}; }; class Land_Airport_center_F : Default { @@ -210,6 +222,7 @@ class CfgBuildingLootPos pelicanPos[] = {{{-1.08398,-10.5664,1.59369},341.766},{{-12.0918,-15.8086,-2.74628},213.62}}; tablePos[] = {{{12.5625,-14.0469,-2.74631},92.4684}}; lockerPos[] = {{{12.6758,-6.87891,-2.7463},90.0581},{{-12.5391,-7.84961,-2.7463},270.451},{{-12.541,-9.83398,-2.7463},268.378},{{-12.4824,-11.8047,-2.7463},269.442}}; + toiletPos[] = {{{0.107422,-16.249,-2.71987},-180.036}}; }; class Land_Airport_left_F : Default { @@ -230,6 +243,7 @@ class CfgBuildingLootPos palletPos[] = {{{23.9648,-7.17188,-6.77531},357},{{23.6523,-13.7891,-6.77531},90}}; freezerPos[] = {{{0.832031,-1.19531,-1.75531},182},{{24.3145,-10.5938,-6.77531},90}}; cabinetPos[] = {{{4.80945,-2.55103,-5.34531},180}}; + toiletPos[] = {{{26.5547,14.6719,-6.73733},-315.035}}; }; class Land_Hangar_F : Default { @@ -287,6 +301,7 @@ class CfgBuildingLootPos class Land_Cargo_Tower_V1_No7_F : Land_Cargo_Tower_V1_F {}; class Land_Cargo_Tower_V2_F : Land_Cargo_Tower_V1_F {}; class Land_Cargo_Tower_V3_F : Land_Cargo_Tower_V1_F {}; + class Land_Cargo_Tower_V4_F : Land_Cargo_Tower_V1_F { }; class Land_Cargo_Patrol_V1_F : Default { lootType = "mil"; @@ -297,6 +312,7 @@ class CfgBuildingLootPos }; class Land_Cargo_Patrol_V2_F : Land_Cargo_Patrol_V1_F {}; class Land_Cargo_Patrol_V3_F : Land_Cargo_Patrol_V1_F {}; + class Land_Cargo_Patrol_V4_F : Land_Cargo_Patrol_V1_F { }; class Land_Medevac_house_V1_F : Default { lootType = "mil"; @@ -343,6 +359,7 @@ class CfgBuildingLootPos }; class Land_Cargo_HQ_V2_F : Land_Cargo_HQ_V1_F {}; class Land_Cargo_HQ_V3_F : Land_Cargo_HQ_V1_F {}; + class Land_Cargo_HQ_V4_F : Land_Cargo_HQ_V1_F { }; class Land_Cargo_House_V1_F : Default { lootType = "mil"; @@ -357,6 +374,7 @@ class CfgBuildingLootPos }; class Land_Cargo_House_V2_F : Land_Cargo_House_V1_F {}; class Land_Cargo_House_V3_F : Land_Cargo_House_V1_F {}; + class Land_Cargo_House_V4_F : Land_Cargo_House_V1_F {}; class Land_dp_smallFactory_F : Default { shelfPos[] = {{{-1.50586,4.79297,-1.87129},180.159}}; @@ -392,6 +410,7 @@ class CfgBuildingLootPos lockerPos[] = {{{0.539063,2.65234,1.40864},180.316},{{6.29492,-0.507813,-1.92434},359.612},{{-6.15625,2.65625,1.40874},178.513},{{-7.85352,2.64844,-1.92434},178.304}}; freezerPos[] = {{{-5.82227,-4.86328,1.49066},185},{{-6.21875,5.08398,1.49066},1.99997},{{-16.0039,-0.580078,1.49066},1.99997}}; cabinetPos[] = {{{-7.6416,-5.42383,-0.409235},270},{{-17.0132,1.60693,2.89076},0}}; + toiletPos[] = {{{-5.88086,-2.2627,-1.87523},1.9996}}; }; class Land_i_Barracks_V2_F : Default { @@ -410,13 +429,15 @@ class CfgBuildingLootPos toolRackPos[] = {{{-2.93359,1.23438,0.579066},180.737}}; freezerPos[] = {{{-8.96094,-1.70605,0.508462},360},{{-9.27344,-1.7334,3.85846},360}}; cabinetPos[] = {{{-6.55322,-2.76904,5.30856},0}}; - }; + toiletPos[] = {{{7.95508,-4.15625,3.93497},89.2524},{{-7.26758,-1.44727,0.537991},47.6757}}; + }; class Land_i_Garage_V2_dam_F : Default { toolRackPos[] = {{{5.12695,-2.06641,-0.159975},90}}; shoeboxPos[] = {{{-0.900391,1.64063,-0.159975},220}}; palletPos[] = {{{1.32031,0.759766,-0.159975},170}}; freezerPos[] = {{{-3.42969,-2.76563,-0.159975},190}}; + toiletPos[] = {{{4.83496,-0.404297,-0.0576477},89.4635}}; }; class Land_i_Stone_HouseBig_V1_dam_F : Default { @@ -478,6 +499,7 @@ class CfgBuildingLootPos shoeboxPos[] = {{{-6.76953,2.15039,-1.43621},356.704}}; palletPos[] = {{{-3.32031,-0.679688,-1.50884},0},{{2.86133,7.82031,-1.50884},0},{{4.82617,7.72266,-1.50884},91}}; freezerPos[] = {{{-5.0293,0.304688,-1.47884},91}}; + toiletPos[] = {{{-4.93555,1.31592,-1.52141},-269.849}}; }; class Land_BagBunker_Large_F : Default { @@ -489,6 +511,7 @@ class CfgBuildingLootPos tablePos[] = {{{-0.646484,0.492188,-0.766783},90.0316}}; palletPos[] = {{{3.13672,-1.19922,-0.69166},0},{{-3.17773,-3.54102,-0.69166},0}}; }; + class Land_BagBunker_01_large_green_F : Land_BagBunker_Large_F {}; class Land_BagBunker_Tower_F : Default { lootType = "mil"; @@ -496,6 +519,7 @@ class CfgBuildingLootPos shoeboxPos[] = {{{2.37891,-1.93555,-0.873341},0}}; palletPos[] = {{{-0.732422,2.07617,-2.17334},348},{{-0.771484,-2.21094,-2.17334},0}}; }; + class Land_HBarrier_01_tower_green_F : Land_BagBunker_Tower_F {}; class Land_Offices_01_V1_F : Default { limit = 6; @@ -513,11 +537,13 @@ class CfgBuildingLootPos palletPos[] = {{{-5.23438,1.21875,9.83307},348},{{6.88477,-4.91602,9.83307},348},{{-7.91797,-7.52734,9.83307},348},{{10.6992,-4.91602,4.62271},0},{{11.6484,6.89063,9.83307},348}}; freezerPos[] = {{{12.332,1.18555,-7.08542},90}}; cabinetPos[] = {{{4.25293,0.552734,5.96314},270},{{10.2202,0.577637,-5.76687},270}}; + toiletPos[] = {{{8.41846,4.78711,-7.06345},270.097}}; }; class Land_d_Stone_Shed_V1_F : Default { bedPos[] = {{{2.83203,1.8418,-0.0155029},269.824}}; palletPos[] = {{{1.93164,-3.32227,-10},348}}; + toiletPos[] = {{{0.308594,2.5625,0.0315695},2.64121}}; }; class Land_i_House_Small_01_V1_F : Default { @@ -529,9 +555,16 @@ class CfgBuildingLootPos cookerPos[] = {{{3.91992,4.31055,-1.06914},359.993}}; chairPos[] = {{{0.800781,-1.12109,-1.06701},74.3133},{{-3.79492,2.57031,-1.06882},227.565},{{-3.71875,-3.625,-1.05222},229.261}}; tablePos[] = {{{-1.875,2.26172,-1.06836},180.248}}; + toiletPos[] = {{{1.16309,-3.91016,-1.10812},142.738}}; }; class Land_i_House_Small_01_V2_F : Land_i_House_Small_01_V1_F {}; class Land_i_House_Small_01_V3_F : Land_i_House_Small_01_V1_F {}; + class Land_i_House_Small_01_b_blue_F : Land_i_House_Small_01_V1_F {}; + class Land_i_House_Small_01_b_pink_F : Land_i_House_Small_01_V1_F {}; + class Land_i_House_Small_01_b_whiteblue_F : Land_i_House_Small_01_V1_F {}; + class Land_i_House_Small_01_b_white_F : Land_i_House_Small_01_V1_F {}; + class Land_i_House_Small_01_b_brown_F : Land_i_House_Small_01_V1_F {}; + class Land_i_House_Small_01_b_yellow_F : Land_i_House_Small_01_V1_F {}; class Land_u_House_Big_01_V1_F : Default { shelfPos[] = {{{1.56055,0.982422,-2.59135},359.087},{{3.06836,-2.5918,0.82871},183.405},{{1.39258,-6.70508,-2.59135},182.249},{{3.20703,6.94922,-2.59135},3.01586}}; @@ -544,6 +577,7 @@ class CfgBuildingLootPos tablePos[] = {{{1.75977,0.580078,0.828625},359.479},{{0.232422,-6.57813,0.828625},180.157},{{4.20898,-5.11133,-2.59138},90.4264}}; toolRackPos[] = {{{-2.86523,1.09375,-2.5914},179.843}}; freezerPos[] = {{{1.55859,3.71289,-2.61788},177}}; + toiletPos[] = {{{-3.9834,1.85645,-2.61971},-90.0787}}; }; class Land_i_House_Big_01_V1_F : Default { @@ -557,9 +591,16 @@ class CfgBuildingLootPos tablePos[] = {{{-1.17188,-1.95703,-2.59138},270.249},{{0.105469,6.84375,0.828627},0.00192261}}; toolRackPos[] = {{{-2.8125,1.09375,-2.59139},180.224}}; freezerPos[] = {{{0.59375,6.80273,-2.61788},3}}; + toiletPos[] = {{{4.27539,-6.80957,0.778091},178.637}}; }; class Land_i_House_Big_01_V2_F : Land_i_House_Big_01_V1_F {}; class Land_i_House_Big_01_V3_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_01_b_blue_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_01_b_pink_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_01_b_whiteblue_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_01_b_white_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_01_b_brown_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_01_b_yellow_F : Land_i_House_Big_01_V1_F {}; class Land_Hospital_side1_F : Default { limit = 5; @@ -577,6 +618,7 @@ class CfgBuildingLootPos palletPos[] = {{{5.7207,5.69727,7.451},90},{{-2.02539,10.0586,-7.89901},90},{{8.43945,-6.91016,7.451},90}}; freezerPos[] = {{{9.43945,-8.53906,-7.90901},90}}; cabinetPos[] = {{{-6.39502,-5.93945,-6.56894},0},{{9.81006,-4.22998,-6.56894},180}}; + toiletPos[] = {{{-6.16284,-2.45801,-7.89736},-89.1454}}; }; class Land_Hospital_side2_F : Default { @@ -592,6 +634,7 @@ class CfgBuildingLootPos palletPos[] = {{{1.34766,-0.410156,-8.14045},90},{{-5.58203,-0.400391,-8.14045},90},{{6.58008,3.79297,-8.14045},90}}; freezerPos[] = {{{-4.11914,-10.6406,-8.14045},180}}; cabinetPos[] = {{{0.117188,-1.76221,-6.77038},90},{{1.33496,-11.0347,-6.77038},270},{{14.6304,-11.0347,-6.77038},270}}; + toiletPos[] = {{{6.49194,3.99512,11.133},-321.646}}; }; class Land_Hospital_main_F : Default { @@ -605,6 +648,7 @@ class CfgBuildingLootPos shoeboxPos[] = {{{-1.01367,-4.61133,-1.04287},188.531},{{12.9023,-7.36914,7.32734},210.758}}; palletPos[] = {{{-10.0547,-6.80469,-8.05151},180},{{1.62305,18.627,-8.05151},180}}; cabinetPos[] = {{{14.5366,-0.879883,-6.88591},180},{{14.5056,-9.5127,-6.88591},180}}; + toiletPos[] = {{{14.2844,20.4639,-8.05601},-268.689}}; }; class Land_d_Shop_02_V1_F : Default { @@ -614,6 +658,7 @@ class CfgBuildingLootPos chairPos[] = {{{4.9707,-3.16992,1.09518},180.623},{{-4.48633,4.00586,-2.79765},325.405},{{-4.54883,4.10352,1.08889},330.581}}; pelicanPos[] = {{{0.566406,1.81445,4.50349},353.316}}; palletPos[] = {{{-4.0918,-2.88086,-2.45702},238},{{4.7832,4.58984,-2.52702},238}}; + toiletPos[] = {{{-2.51367,0.0615234,-2.84089},90.7273}}; }; class Land_d_House_Small_01_V1_F : Default { @@ -623,6 +668,7 @@ class CfgBuildingLootPos chairPos[] = {{{3.43359,4.36914,-0.860575},180.154},{{8.06641,5.74316,-0.861},27.7226}}; pelicanPos[] = {{{1.42969,-1.45898,2.73048},98.759}}; palletPos[] = {{{0.865234,-1.24414,-0.196001},238}}; + toiletPos[] = {{{8.92676,7.51758,-1.31014},-177.006}}; }; class Land_Church_01_V1_F : Default { @@ -632,6 +678,7 @@ class CfgBuildingLootPos shoeboxPos[] = {{{-5.70313,-4.57422,-5.49586},271.096}}; palletPos[] = {{{-4.17969,-5.43848,-5.50872},238}}; }; + class Land_Church_01_V2_F : Land_Church_01_V1_F {}; class Land_Castle_01_tower_F : Default { shelfPos[] = {{{2.58398,2.0791,-9.50637},85.6591}}; @@ -654,9 +701,49 @@ class CfgBuildingLootPos cookerPos[] = {{{-3.22266,2.26367,-0.727057},270.633}}; chairPos[] = {{{1.82813,-0.0859375,-0.732331},294.633},{{3.58398,-2.61719,-0.730065},188.429}}; tablePos[] = {{{4.15039,2.44727,-0.726453},0.13829}}; + toiletPos[] = {{{7.26953,-1.05078,-0.756542},-268.959}}; }; class Land_i_House_Small_02_V2_F : Land_i_House_Small_02_V1_F {}; class Land_i_House_Small_02_V3_F : Land_i_House_Small_02_V1_F {}; + class Land_i_House_Small_02_b_whiteblue_F : Default { + fridgePos[] = { + { {-5.15283,-0.370117,-0.533894}, 270 } + }; + bedPos[] = { + { {4.48145,0.750977,-0.610384}, 360 } + }; + couchPos[] = { + { {-2.45703,-1.98438,-0.634064}, 4.99997 }, + { {6.25391,0.797852,-0.726635}, 2.0285 } + }; + wardrobePos[] = { + { {-0.522461,-2.36426,-0.622379}, 270.9 } + }; + cookerPos[] = { + { {-5.14209,1.80957,-0.625494}, 271 } + }; + chairPos[] = { + { {-0.303223,-0.370117,-0.631815}, 271 }, + { {1.70459,-3.11914,-0.66921}, 189.8 } + }; + tablePos[] = { + { {2.26221,2.12109,-0.627096}, 360 } + }; + toiletPos[] = { + { {-5.104,-3.36426,-0.615711}, 266 } + }; + }; + class Land_i_House_Small_02_b_blue_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_b_pink_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_b_white_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_b_brown_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_b_yellow_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_c_blue_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_c_pink_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_c_whiteblue_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_c_white_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_c_brown_F : Land_i_House_Small_02_b_whiteblue_F {}; + class Land_i_House_Small_02_c_yellow_F : Land_i_House_Small_02_b_whiteblue_F {}; class Land_Chapel_V1_F : Default { wardrobePos[] = {{{6.00195,-3.92969,-2.83485},179.372},{{6.51758,3.87891,-2.83486},0.951279}}; @@ -665,6 +752,7 @@ class CfgBuildingLootPos tablePos[] = {{{-4.00977,-1.36523,-2.83493},269.847}}; shoeboxPos[] = {{{1.01758,-1.21484,-2.83492},277.811},{{3.37695,3.05078,-2.83492},276.733},{{-1.56445,-4.63281,-1.51178},1.34718}}; palletPos[] = {{{-6.60352,-0.580078,-2.83143},107}}; + toiletPos[] = {{{-3.92188,-4.00781,-2.90831},-179.383}}; }; class Land_Chapel_V2_F : Land_Chapel_V1_F {}; class Land_Chapel_Small_V1_F : Default @@ -691,6 +779,7 @@ class CfgBuildingLootPos toolRackPos[] = {{{1.55176,-1.90625,0.949803},90}}; shoeboxPos[] = {{{-2.40234,3.50586,-2.29579},316.814}}; palletPos[] = {{{3.5625,-2.18359,-2.38678},107},{{-4.375,3.11133,-2.43678},107},{{-7.12988,-2.27539,-2.38678},107}}; + toiletPos[] = {{{-7.84375,-3.03906,1.00254},268.293}}; }; class Land_Unfinished_Building_01_F : Default { @@ -699,6 +788,7 @@ class CfgBuildingLootPos toolRackPos[] = {{{-5.13184,4.25,1.1717},270.006}}; shoeboxPos[] = {{{-0.368164,5.74023,-2.31357},26.9766}}; palletPos[] = {{{-2.25879,-1.67578,1.17496},107},{{-3.6416,-1.50586,-2.30504},107}}; + toiletPos[] = {{{0.53125,2.09277,1.13927},-183.159}}; }; class Land_i_Garage_V1_F : Default { @@ -735,6 +825,7 @@ class CfgBuildingLootPos pelicanPos[] = {{{-2.71094,6.19141,0.964416},326.125}}; toolRackPos[] = {{{2.03125,1.91406,-2.90729},90}}; palletPos[] = {{{0.800781,-1.02539,0.953138},91.1},{{0.273438,8.36328,-3.16686},91.1}}; + toiletPos[] = {{{3.63281,6.50781,-2.93114},90.3663}}; }; class Land_u_Shop_02_V1_F : Default { @@ -748,6 +839,7 @@ class CfgBuildingLootPos lockerPos[] = {{{-5.19336,1.49219,-2.69484},269.367}}; toolRackPos[] = {{{-2.47852,-1.13086,-2.69459},89.5903}}; palletPos[] = {{{2.65234,-3.43359,-2.68103},91.1}}; + toiletPos[] = {{{-5.30762,3.08594,-2.71798},269.971}}; }; class Land_i_Shop_02_V1_F : Default { @@ -763,9 +855,16 @@ class CfgBuildingLootPos lockerPos[] = {{{-2.96484,-3.17773,-2.6967},86.8359}}; toolRackPos[] = {{{-2.52344,-0.677734,-2.69483},89.3848}}; freezerPos[] = {{{0.943359,-4.0625,-2.69103},179.201}}; + toiletPos[] = {{{-3.66406,-4.22266,1.24819},-180.395}}; }; class Land_i_Shop_02_V2_F : Land_i_Shop_02_V1_F {}; class Land_i_Shop_02_V3_F : Land_i_Shop_02_V1_F {}; + class Land_i_Shop_02_b_blue_F : Land_i_Shop_02_V1_F {}; + class Land_i_Shop_02_b_pink_F : Land_i_Shop_02_V1_F {}; + class Land_i_Shop_02_b_whiteblue_F : Land_i_Shop_02_V1_F {}; + class Land_i_Shop_02_b_white_F : Land_i_Shop_02_V1_F {}; + class Land_i_Shop_02_b_brown_F : Land_i_Shop_02_V1_F {}; + class Land_i_Shop_02_b_yellow_F : Land_i_Shop_02_V1_F {}; class Land_d_Shop_01_V1_F : Default { shelfPos[] = {{{0.605469,-1.54102,-2.90717},299.385},{{4.18555,0.601563,-2.90725},61.8762}}; @@ -778,6 +877,7 @@ class CfgBuildingLootPos lockerPos[] = {{{4.16016,3.7207,-2.90727},177.719}}; toolRackPos[] = {{{4.625,-1.60938,-2.90729},90.0519}}; palletPos[] = {{{-0.251953,-5.05664,-10},179.201}}; + toiletPos[] = {{{5.9873,2.71289,-2.91811},92.9479}}; }; class Land_i_Addon_02_V1_F : Default { @@ -787,13 +887,38 @@ class CfgBuildingLootPos chairPos[] = {{{0.693359,0.376953,0.0858068},160.478}}; tablePos[] = {{{-2.86133,1.26953,0.0858245},269.367}}; palletPos[] = {{{0.418823,-1.67969,-10},180}}; + toiletPos[] = {{{-1.56445,0.117188,0.047205},180.667}}; }; class Land_u_Addon_02_V1_F : Land_i_Addon_02_V1_F {}; + class Land_i_Addon_02_b_white_F : Default { + fridgePos[] = { + { {4.36523,3.05859,0.0886669}, 0 } + }; + bedPos[] = { + { {0.267578,2.0752,0.0914993}, 180 } + }; + wardrobePos[] = { + { {2.27539,3.04395,0.0924225}, 0.999984 } + }; + chairPos[] = { + { {1.26514,-0.660156,0.0912437}, 180 } + }; + tablePos[] = { + { {3.0249,-0.619141,0.0996017}, 180 } + }; + palletPos[] = { + { {0.418945,-1.67969,-10}, 180 } + }; + toiletPos[] = { + { {5.76465,2.99609,0.0392551}, 0 } + }; + }; class Land_d_Addon_02_V1_F : Default { couchPos[] = {{{-0.962891,2.74805,0.41301},261.447}}; pelicanPos[] = {{{1.94531,2.58301,0.439629},350.421}}; palletPos[] = {{{-2.35156,0.995117,0.423958},187.201},{{3.19336,1.2168,0.413958},187.201}}; + toiletPos[] = {{{1.60059,0.0820313,0.167738},181.005}}; }; class Land_d_Stone_HouseSmall_V1_F : Default { @@ -803,6 +928,7 @@ class CfgBuildingLootPos couchPos[] = {{{-0.128906,-0.958008,-0.578321},80.7286}}; tablePos[] = {{{1.56055,2.4541,-0.599906},3.8147},{{7.77539,-0.0078125,-0.597849},341.959}}; palletPos[] = {{{-6.20508,1.12988,-0.453797},187.201}}; + toiletPos[] = {{{3.59961,1.16016,-0.614626},-89.6958}}; }; class Land_i_Stone_HouseSmall_V3_F : Default { @@ -827,6 +953,7 @@ class CfgBuildingLootPos chairPos[] = {{{8.50977,0.861328,-0.614511},139.91},{{8.43945,3.40625,-0.614825},57.7087}}; pelicanPos[] = {{{-8.76563,4.50488,-0.630112},339.768}}; tablePos[] = {{{-5.22852,2.18652,-0.655036},2.32285}}; + toiletPos[] = {{{-9.28613,3.25781,-0.63064},-89.3545}}; }; class Land_i_Stone_HouseSmall_V1_F : Land_i_Stone_HouseSmall_V2_F {}; class Land_i_Stone_Shed_V3_F : Default @@ -835,6 +962,7 @@ class CfgBuildingLootPos wardrobePos[] = {{{0.425781,4.04688,-0.139276},1.30153}}; cookerPos[] = {{{-1.9375,-0.209961,-0.127349},176.707}}; tablePos[] = {{{2.2207,2.56445,-0.126943},75.8372}}; + toiletPos[] = {{{-0.0234375,-0.324219,-0.132989},-178.641}}; }; class Land_i_Stone_Shed_V2_F : Default { @@ -842,6 +970,7 @@ class CfgBuildingLootPos bedPos[] = {{{-2.76758,2.82813,-0.126943},180.094}}; couchPos[] = {{{-1.91602,0.928711,0.00655437},98.2006}}; tablePos[] = {{{0.671875,1.21875,-0.126942},176.837}}; + toiletPos[] = {{{0.681641,4.08203,-0.101513},2.11829}}; }; class Land_i_Stone_Shed_V1_F : Default { @@ -850,7 +979,34 @@ class CfgBuildingLootPos chairPos[] = {{{-3.11133,3.29883,-0.126935},304.61}}; tablePos[] = {{{0.279297,-0.111328,-0.126944},178.227}}; toolRackPos[] = {{{3.20313,3.35938,-0.126961},88.6889}}; + toiletPos[] = {{{1.87305,4.05859,-0.134884},0.344559}}; }; + class Land_i_Stone_Shed_01_b_clay_F : Default { + bedPos[] = { + { {2.52246,0.351074,-0.128504}, 90 } + }; + couchPos[] = { + { {0.87207,3.16895,-0.026947}, 270 } + }; + chairPos[] = { + { {-0.571289,1.96582,-0.128511}, 280 } + }; + tablePos[] = { + { {0.279297,-0.111328,-0.126944}, 178.227 } + }; + toolRackPos[] = { + { {6.00293,3.41748,-0.126961}, 90 } + }; + toiletPos[] = { + { {5.24414,3.92529,-0.134884}, 360 } + }; + }; + class Land_i_Stone_Shed_01_b_raw_F : Land_i_Stone_Shed_01_b_clay_F {}; + class Land_i_Stone_Shed_01_b_white_F : Land_i_Stone_Shed_01_b_clay_F {}; + class Land_i_Stone_Shed_01_c_clay_F : Land_i_Stone_Shed_01_b_clay_F {}; + class Land_i_Stone_Shed_01_c_raw_F : Land_i_Stone_Shed_01_b_clay_F {}; + class Land_i_Stone_Shed_01_c_white_F : Land_i_Stone_Shed_01_b_clay_F {}; + class Land_d_Stone_HouseBig_V1_F : Default { shelfPos[] = {{{-1.88477,1.23047,-1.6673},89.1051}}; @@ -863,6 +1019,7 @@ class CfgBuildingLootPos tablePos[] = {{{-2.75977,-0.654297,1.19248},274.611}}; shoeboxPos[] = {{{-0.728516,0.9375,-0.647514},33.2239}}; palletPos[] = {{{1.16309,-2.74805,1.18598},98.2006}}; + toiletPos[] = {{{-0.0566406,1.36133,1.30844},-0.226265}}; }; class Land_i_Stone_HouseBig_V3_F : Default { @@ -874,9 +1031,11 @@ class CfgBuildingLootPos chairPos[] = {{{-1.52539,1.28516,1.1925},266.593}}; tablePos[] = {{{0.642578,-0.855469,-1.67561},187.85},{{2.20898,-0.970703,1.19249},176.776}}; shoeboxPos[] = {{{0.287109,3.42773,-0.594017},98.2006}}; + toiletPos[] = {{{4.76855,-1.29297,-1.6743},143.27}}; }; class Land_i_Stone_HouseBig_V2_F : Land_i_Stone_HouseBig_V3_F {}; class Land_i_Stone_HouseBig_V1_F : Land_i_Stone_HouseBig_V3_F {}; + class Land_i_Stone_House_Big_01_b_clay_F : Land_i_Stone_HouseBig_V3_F {}; class Land_d_House_Big_02_V1_F : Default { shelfPos[] = {{{0.669922,-1.39453,-3.06634},90},{{2.7373,4.13477,0.463613},90},{{-5.60547,4.73633,-3.0663},338.985}}; @@ -889,6 +1048,7 @@ class CfgBuildingLootPos pelicanPos[] = {{{1.33398,6.15625,0.40361},34.738}}; tablePos[] = {{{-1.68457,4.60742,0.463591},357.124}}; palletPos[] = {{{1.80078,-5.45703,-2.37291},98.2006}}; + toiletPos[] = {{{-5.80664,4.81836,0.466156},-49.0076}}; }; class Land_u_House_Big_02_V1_F : Default { @@ -901,6 +1061,7 @@ class CfgBuildingLootPos chairPos[] = {{{-3.16992,0.291016,0.939465},245.407},{{-3.71875,-3.23047,-2.40712},215.201},{{3.91016,4.31836,-2.40712},49.2006}}; pelicanPos[] = {{{3.94434,4.5,0.939445},20.8601}}; tablePos[] = {{{-1.43262,2.4707,0.939383},85.2193},{{-3.81055,3.12305,-2.40712},272.201}}; + toiletPos[] = {{{3.83008,5.875,0.905819},-181.466}}; }; class Land_i_House_Big_02_V1_F : Default { @@ -914,9 +1075,16 @@ class CfgBuildingLootPos pelicanPos[] = {{{3.12305,6.2168,0.697647},31.1078}}; tablePos[] = {{{-4.03906,2.14258,-2.64971},268.404}}; freezerPos[] = {{{-3.42383,-1.25195,-2.63541},360}}; + toiletPos[] = {{{-4.15918,4.86914,0.729055},-51.5343}}; }; class Land_i_House_Big_02_V2_F : Land_i_House_Big_02_V1_F {}; class Land_i_House_Big_02_V3_F : Land_i_House_Big_02_V1_F {}; + class Land_i_House_Big_02_b_blue_F : Land_i_House_Big_02_V1_F {}; + class Land_i_House_Big_02_b_pink_F : Land_i_House_Big_02_V1_F {}; + class Land_i_House_Big_02_b_whiteblue_F : Land_i_House_Big_02_V1_F {}; + class Land_i_House_Big_02_b_white_F : Land_i_House_Big_02_V1_F {}; + class Land_i_House_Big_02_b_brown_F : Land_i_House_Big_02_V1_F {}; + class Land_i_House_Big_02_b_yellow_F : Land_i_House_Big_02_V1_F {}; class Land_i_House_Small_03_V1_F : Default { shelfPos[] = {{{-0.678711,4.01953,-0.0356882},270},{{5.26367,4.1875,-0.0356882},89}}; @@ -928,6 +1096,7 @@ class CfgBuildingLootPos chairPos[] = {{{-1.80762,4.16406,-0.0356882},40},{{2.73828,-5.79297,-0.0356882},219},{{4.80957,-5.86719,-0.0356882},149}}; tablePos[] = {{{4.98535,-2.73438,-0.0356882},89}}; palletPos[] = {{{-2.04004,-5.83203,-10},0}}; + toiletPos[] = {{{0.685547,4.5332,-0.0660839},-0.0353432}}; }; class Land_u_House_Small_02_V1_F : Default { @@ -938,6 +1107,7 @@ class CfgBuildingLootPos wardrobePos[] = {{{1.43945,-2.625,-0.74296},270.844}}; cookerPos[] = {{{-3.2168,0.0839844,-0.745483},269.137}}; tablePos[] = {{{4.68359,2.11523,-0.736894},356.553}}; + toiletPos[] = {{{7.21875,-2.99609,-0.796741},136.361}}; }; class Land_d_House_Small_02_V1_F : Default { @@ -945,6 +1115,7 @@ class CfgBuildingLootPos bedPos[] = {{{2.45508,-0.201172,-0.981503},187.343},{{6.89844,1.89258,-1.00027},4.89485}}; chairPos[] = {{{4.09766,-2.04297,-0.9844},210.762},{{7.12305,-2.12109,-0.994862},135.992}}; palletPos[] = {{{-0.767578,-0.916016,-10},276}}; + toiletPos[] = {{{4.01367,2.97266,-1.01966},1.17993}}; }; class Land_Lighthouse_small_F : Default { @@ -969,7 +1140,8 @@ class CfgBuildingLootPos toolRackPos[] = {{{1.60059,-5.43945,0.405369},180.797},{{2.0918,5.63867,0.351912},357.597},{{-2.88086,-12.0996,-0.00143886},360},{{14.0498,-5.80859,4.29928},359.535},{{-10.501,-15.4023,8.312},179.968}}; shoeboxPos[] = {{{9.66016,6.35352,4.31021},190.576},{{-3.89844,-11.2754,0.345911},173.847},{{28.7275,-2.26172,0.302157},142.217}}; palletPos[] = {{{-2.81641,3.73828,12.2086},15},{{-3.99902,-3.44336,12.2086},15},{{0.981445,-6.29688,8.33855},15},{{3.71094,6.82617,4.32855},182},{{-3.94727,-10.5742,8.33855},15},{{-5.66602,-9.97656,4.32855},345.6},{{-8.00586,10.6641,4.32855},182},{{-13.8838,-1.19727,0.338561},360},{{-15.0645,1.19141,8.33855},15},{{12.4063,10.8125,0.368561},265.5},{{-17.6748,-1.5,0.368561},265.5},{{-17.7871,-4.42773,4.32855},182},{{-15.6992,-10.6797,0.338561},360},{{23.7109,-1.23633,8.23855},289.5}}; - }; + toiletPos[] = {{{-9.89453,-3.21875,0.236324},-88.9633},{{6.09961,6.27734,0.334097},-131.969},{{-9.86182,-9.21289,0.336166},-92.0463},{{-9.80469,-7.61133,0.294374},-89.5382}}; + }; class Land_i_Addon_03mid_V1_F : Default { couchPos[] = {{{-3.33203,0.30957,-0.0338135},176.588}}; @@ -1018,8 +1190,9 @@ class CfgBuildingLootPos lockerPos[] = {{{-4.8125,-5.11523,-1.06906},15.9695}}; palletPos[] = {{{8.36523,7.57813,-1.0171},37.2845},{{-4.83398,11.3008,-1.0171},357},{{-10.7734,12.9609,-1.0171},96}}; freezerPos[] = {{{-6.79492,-6.25781,-1.0171},283}}; + toiletPos[] = {{{8.44238,2.38672,-5.49587},103.6},{{1.58789,4.55469,-5.51172},105.21},{{-6.60938,6.31445,-5.51272},-75.2479},{{-13.3604,8.60938,-5.51854},13.4562},{{-7.93652,1.42578,-1.07989},-75.518},{{-14.2695,4.14648,-1.07117},14.211},{{0.579102,0.431641,-1.05479},104.955},{{6.63086,-1.30859,-1.06013},15.9641},{{-14.624,-2.85742,3.40155},-166.609},{{6.29492,-6.08203,3.38538},103.955},{{-0.609375,-4.24023,3.39694},104.464},{{-8.83594,-2.01172,3.39369},13.6471}}; }; - class Land_GH_MainBuilding_middle_F : Default + class Land_GH_MainBuilding_middle_F : Default { shelfPos[] = {{{2.69238,3.21484,-8.37759},179.858},{{-5.88867,0.726563,-3.91598},105.411},{{5.24609,11.0605,-3.91652},270.656},{{-15.541,-6.12305,0.521439},14.5104},{{14.248,-9.52734,0.521439},256.088}}; fridgePos[] = {{{-15.1309,-2.81836,0.521437},13.9473}}; @@ -1048,6 +1221,7 @@ class CfgBuildingLootPos tablePos[] = {{{0.234375,1.52344,-1.06908},163.886},{{1.57422,-2.80469,3.37644},166.456},{{-3.63672,-1.45117,3.37644},75.2335},{{4.10352,2.30273,3.37644},254.907},{{6.85156,3.26758,-1.06908},163.381},{{5.79492,7.67578,-5.50922},167.512},{{-8.66992,4.4082,-5.50922},256.113},{{-4.61719,-11.2539,-1.06898},257.112},{{12.7383,11.5723,-5.50922},74.4651},{{-4.82617,-19.6475,3.83704},168.125}}; lockerPos[] = {{{7.10742,-5.75781,-1.06905},75.8703}}; palletPos[] = {{{-1.95898,8.42969,-1.0371},77},{{-8.23242,7.49414,-1.0371},321},{{5.07422,10.7188,-1.0371},54}}; + toiletPos[] = {{{14.7822,4.14258,-1.16306},75.5108},{{7.86035,2.48633,-1.04245},75.5179},{{-0.402344,0.275391,-1.04771},-15.6965},{{-7.29492,-1.39844,-1.14091},-103.622},{{15.8828,-0.271484,3.36453},32.9454},{{7.72168,-4.71094,3.40063},-194.399},{{3.16504,-5.91211,3.34099},-195.347},{{-6.03613,-6.28516,3.38759},-104.621},{{13.6055,8.25,-5.48314},73.9992},{{6.70215,6.86719,-5.51726},74.3024},{{-1.23926,4.81836,-5.53954},-13.6965},{{-8.45117,2.93555,-5.49403},-15.121}}; }; class Land_GH_House_2_F : Default { @@ -1086,6 +1260,7 @@ class CfgBuildingLootPos filingPos[] = {{{-0.632813,1.39258,3.35342},1.10306},{{-1.58594,1.4082,3.35342},1.39755}}; pelicanPos[] = {{{-2.21484,2.33984,7.08003},44.2351}}; toolRackPos[] = {{{1.81055,-1.7666,3.35528},89.8722}}; + toiletPos[] = {{{1.31348,-2.68652,3.35164},176.24}}; }; class Land_HouseB_Tenement : Default { @@ -2245,6 +2420,7 @@ class CfgBuildingLootPos couchPos[] = {{{2.90234,-1.70313,-0.929456},179.44}}; cookerPos[] = {{{-1.41602,2.18359,-0.931049},180.625}}; chairPos[] = {{{2.46484,1.8125,-0.930511},270.894},{{-4.09766,-0.542969,-0.925941},270.019},{{2.42383,3.95703,-0.931158},329.895}}; + toiletPos[] = {{{1.06445,2.18457,-0.93071},131.635}}; }; class Land_TTowerBig_1_F : Default { @@ -2254,6 +2430,7 @@ class CfgBuildingLootPos { shoeboxPos[] = {{{5.52515,0.521484,-0.014668},270}}; palletPos[] = {{{-0.227783,0.866699,-0.0246677},270}}; + toiletPos[] = {{{5.40527,3.62695,-0.0114021},45.604}}; }; class Land_SlideCastle_F : Default { @@ -2274,6 +2451,7 @@ class CfgBuildingLootPos pelicanPos[] = {{{-1.41553,1.15063,-1.81942},130}}; shoeboxPos[] = {{{-3.8374,1.81421,-1.81942},320}}; palletPos[] = {{{0.737793,-3.30981,-1.80942},250}}; + toiletPos[] = {{{-0.339844,1.56738,-10.1091},165.64}}; }; class Land_i_Stone_Shed_V2_dam_F : Default { @@ -2287,9 +2465,11 @@ class CfgBuildingLootPos pelicanPos[] = {{{-4.96582,-4.61182,1.13217},250}}; lockerPos[] = {{{-5.49561,-3.40796,-1.28783},270}}; }; + class Land_Cargo_HQ_V3_derelict_F : Land_Cargo_HQ_V1_ruins_F {}; class Land_cmp_Tower_F : Default { palletPos[] = {{{0.0551758,1.01294,-7.64906},250}}; + toiletPos[] = {{{-2.81934,1.84961,-8.20222},89.4642}}; }; class Land_Crane_F : Default { @@ -2348,16 +2528,19 @@ class CfgBuildingLootPos { pelicanPos[] = {{{3.30298,3.41357,-1.80046},329}}; }; + class Land_Cargo_Tower_V3_derelict_F : Land_Cargo_Tower_V1_ruins_F {}; class Land_dp_mainFactory_F : Default { shelfPos[] = {{{12.6934,-1.76367,-4.24943},359.454},{{13.9473,5.0918,-4.24943},88.7339},{{19.9414,1.03125,-7.43432},269.954},{{19.9355,-2.62891,-7.43443},271.718}}; pelicanPos[] = {{{-2.5332,1.13477,1.24025},333.827},{{-11.8926,-2.99023,-4.39045},104.689},{{7.52734,-16.5059,-0.257848},243.576}}; toolRackPos[] = {{{14.1328,0.527344,-4.33314},90.5367}}; + toiletPos[] = {{{12.2051,-5.15283,-4.2206},-179.019},{{12.2148,2.43311,-4.28336},-145.55}}; }; class Land_i_Windmill01_F : Default { pelicanPos[] = {{{-0.910156,1.28125,-3.54742},289.979}}; tablePos[] = {{{0.111328,-1.23047,-3.50127},181.768}}; + toiletPos[] = {{{1.53125,2.11719,-3.56387},-305.513}}; }; class Land_d_House_Big_01_V1_F : Default { @@ -2370,6 +2553,7 @@ class CfgBuildingLootPos cookerPos[] = {{{-1.58008,6.79102,-2.19759},3.80292}}; chairPos[] = {{{-0.201172,0.566406,1.23667},21.1155},{{-5.29688,8.16406,-2.19722},259.465},{{2.27734,11.0098,1.22278},48.7725},{{-5.27539,10.9121,1.22279},288.988}}; tablePos[] = {{{-0.554688,11.1719,-2.19723},0.0478998},{{-1.80469,11.25,1.22271},358.754}}; + toiletPos[] = {{{2.82813,0.109375,1.18097},87.8771}}; }; class Land_Sara_hasic_zbroj : Default { @@ -4733,6 +4917,566 @@ class CfgBuildingLootPos freezerPos[] = {{{-5.04785,1.56201,-1.60012},90}}; cabinetPos[] = {{{-8.79102,-1.59473,-0.300119},0}}; }; + class Land_i_House_Small_03_V1_dam_F : Default + { + tablePos[] = {{{3.97192,-5.14429,-0.399977},184.648}}; + shoeboxPos[] = {{{1.03833,1.97803,-0.399977},359.648}}; + KitchenSinkPos[] = {{{-4.81128,2.74316,-0.399977},269.648}}; + toiletPos[] = {{{1.43848,5.02466,-0.399977},359.648}}; + }; + class Land_u_House_Small_02_V1_dam_F : Default + { + chairPos[] = {{{2.06104,-0.303467,-1.07093},273.648}}; + tablePos[] = {{{6.60864,-2.21667,-1.07093},179.648}}; + }; + class Land_i_House_Small_02_V3_dam_F : Default + { + couchPos[] = {{{6.16943,-1.03198,-0.925534},4.99999}}; + }; + class Land_i_House_Small_02_V2_dam_F : Default + { + bedPos[] = {{{6.95679,-0.921143,-0.999897},358}}; + toolRackPos[] = {{{0.935547,0.244019,-1.04277},88}}; + }; + class Land_i_House_Small_02_V1_dam_F : Default + { + shoeboxPos[] = {{{2.6355,-2.07544,-0.927456},88}}; + freezerPos[] = {{{7.27197,-1.90771,-0.927456},88}}; + KitchenSinkPos[] = {{{7.29883,1.40063,-0.927456},90}}; + }; + class Land_i_Barracks_V1_dam_F : Default + { + shelfPos[] = {{{-13.2607,1.86938,3.88759},264}}; + chairPos[] = {{{7.35889,-3.00977,0.487596},88},{{-7.59131,3.71997,0.487596},88}}; + filingPos[] = {{{-7.45801,-2.66504,0.487596},88},{{-6.35718,-5.19971,3.85143},264},{{-13.4155,-3.57056,3.85143},264}}; + pelicanPos[] = {{{-5.95459,2.20557,3.88759},264}}; + lockerPos[] = {{{13.9585,2.92456,0.487596},88}}; + shoeboxPos[] = {{{9.35645,-3.33105,0.487596},88}}; + }; + class Land_i_Barracks_V2_dam_F : Land_i_Barracks_V1_dam_F{}; + + class Land_TentHangar_V1_F : Default + { + couchPos[] = { {{8.67236,-3.95703,-4.10237},356}}; + lockerPos[] = { {{-9.604,1.47412,-4.10237},264}}; + palletPos[] = {{{-7.19678,-5.23047,-4.10237},356},{{8.93481,6.54126,-4.0674},356}}; + }; + class Land_TentHangar_V1_dam_F : Land_TentHangar_V1_F {}; + + class Land_Dome_Big_F : Default + { + chairPos[] = {{{16.2844,15.4109,-10.1997},356},{{-13.9492,-19.0752,-10.1997},216}}; + pelicanPos[] = {{{21.5835,-2.73999,-10.1997},356}}; + palletPos[] = {{{-5.73926,-1.4939,-10.1997},356},{{3.42236,10.5425,-10.1997},356},{{-8.70752,20.2468,-10.1997},356}}; + }; + class Land_Dome_Small_F : Default + { + chairPos[] = {{{2.98877,12.7253,-6.98321},329},{{-4.11328,-12.5012,-6.98321},216}}; + palletPos[] = {{{-1.65088,1.33276,-6.98321},329},{{10.731,-0.450806,-6.94824},329}}; + }; + class Land_GH_MainBuilding_entry_F : Default + { + palletPos[] = {{{-2.0636,-18.1663,-0.128474},329}}; + }; + + class Land_i_House_Big_01_V1_dam_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_01_V2_dam_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_01_V3_dam_F : Land_i_House_Big_01_V1_F {}; + class Land_u_House_Big_01_V1_dam_F : Land_i_House_Big_01_V1_F {}; + class Land_i_House_Big_02_V2_dam_F : Land_i_House_Big_02_V1_F {}; + class Land_i_Shop_01_V1_dam_F : Land_i_Shop_01_V1_F {}; + class Land_i_Shop_01_V2_dam_F : Land_i_Shop_01_V1_F {}; + class Land_i_Shop_01_V3_dam_F : Land_i_Shop_01_V1_F {}; + class Land_u_Shop_01_V1_dam_F : Land_i_Shop_01_V1_F {}; + class Land_i_Shop_02_V1_dam_F : Land_i_Shop_02_V1_F {}; + class Land_i_Shop_02_V2_dam_F : Land_i_Shop_02_V1_F {}; + class Land_i_Shop_02_V3_dam_F : Land_i_Shop_02_V1_F {}; + class Land_u_Shop_02_V1_dam_F : Land_i_Shop_02_V1_F {}; + class Land_i_House_Small_01_V1_dam_F : Land_i_House_Small_01_V1_F {}; + class Land_i_House_Small_01_V2_dam_F : Land_i_House_Small_01_V1_F {}; + class Land_i_House_Small_01_V3_dam_F : Land_i_House_Small_01_V1_F {}; + class Land_u_House_Small_01_V1_dam_F : Land_i_House_Small_01_V1_F {}; + + class Land_spp_Transformer_F : Default { + palletPos[] = { + { {-2.33301,-1.54736,-10}, 126.752 } + }; + }; + + class Land_Pier_addon : Default { + shoeboxPos[] = { + { {-3.15479,-1.13086,-0.577168}, 303.465 } + }; + palletPos[] = { + { {5.02979,-0.545898,-0.582138}, 175.465 } + }; + }; + class Land_Barn_01_grey_F : Default { + shelfPos[] = { + { {-8.36279,2.08594,-0.802982}, 270 }, + { {8.39307,2.12988,-0.796082}, 89 }, + { {8.38916,-2.67285,-0.794535}, 91.752 } + }; + couchPos[] = { + { {-2.93018,-2.88867,-0.802755}, 94.752 } + }; + tablePos[] = { + { {-8.08936,-2.2793,-0.802982}, 269.752 } + }; + toolRackPos[] = { + { {-5.1792,2.32813,-0.802982}, 271 } + }; + shoeboxPos[] = { + { {-7.04297,-3.72949,0.0970173}, 341.552 } + }; + palletPos[] = { + { {1.13916,2.80273,-0.801611}, 274 }, + { {4.77686,-3.38477,-0.796951}, 273 } + }; + }; + class Land_Barn_01_brown_F : Land_Barn_01_grey_F {}; + + class Land_Metal_Shed_F : Default { + toolRackPos[] = { + { {-2.18555,-3.85742,-1.23042}, 179 } + }; + shoeboxPos[] = { + { {-4.51074,0.143066,-10}, 110 } + }; + palletPos[] = { + { {-0.787109,-0.699707,-10}, 193 }, + { {1.30273,-0.723145,-10}, 153 } + }; + }; + class Land_Shed_08_brown_F : Default { + bedPos[] = { + { {-2.29199,-1.36182,-1.00694}, 9.99997 } + }; + wardrobePos[] = { + { {-4.81738,-1.14258,-0.94993}, 268 } + }; + chairPos[] = { + { {-1.73926,2.5293,-0.988781}, 20 } + }; + tablePos[] = { + { {0.0458984,-1.74316,-1.00677}, 270 } + }; + shoeboxPos[] = { + { {-3.67969,3.28027,-0.187668}, 180 } + }; + palletPos[] = { + { {4.63672,1.23193,-0.994326}, 250 } + }; + }; + class Land_Shed_08_grey_F : Land_Shed_08_brown_F {}; + + class Land_Stone_Shed_V1_ruins_F : Default { + shoeboxPos[] = { + { {3.69434,2.58398,1.25675}, 190 } + }; + palletPos[] = { + { {0.112305,0.968262,1.08651}, 239 } + }; + }; + class Land_Grave_rocks_F : Default { + shoeboxPos[] = { + { {0.675781,-0.0419922,0.158855}, 182.9 } + }; + }; + class Land_TBox_F : Default { + shoeboxPos[] = { + { {-0.991211,1.70605,-10}, 0.999985 } + }; + palletPos[] = { + { {-0.726563,-1.90234,-10}, 13 } + }; + }; + class Land_Supermarket_01_malden_F : Default { + shelfPos[] = { + { {-2.60059,10.2754,-1.50662}, 89.154 }, + { {7.64258,11.6714,-1.50955}, 89.154 } + }; + fridgePos[] = { + { {7.49316,9.19189,-1.48759}, 89.5859 } + }; + cookerPos[] = { + { {-5.12695,2.104,-1.50335}, 282.154 } + }; + filingPos[] = { + { {-5.38574,7.01904,-1.50443}, 179.154 } + }; + lockerPos[] = { + { {-5.2334,10.0562,-1.47596}, 270.996 } + }; + shoeboxPos[] = { + { {5.75977,2.52051,-1.50255}, 290 }, + { {-0.841797,-7.60205,-0.514952}, 310 }, + { {2.91797,-7.49902,-0.51544}, 330 } + }; + palletPos[] = { + { {1.44336,-2.16846,-1.49765}, 350.154 }, + { {1.14258,-8.13672,-1.47687}, 263.154 } + }; + freezerPos[] = { + { {-5.20117,-2.84277,-1.50252}, 268.154 }, + { {7.40625,7.4043,-1.47617}, 92 } + }; + cabinetPos[] = { + { {6.16016,6.85205,-0.205524}, 268.154 } + }; + toiletPos[] = { + { {-5.33301,11.7261,-1.50726}, 350.154 } + }; + }; + class Land_fs_roof_F : Default { + shoeboxPos[] = { + { {-2.50488,0.224609,-2.1651}, 313 } + }; + }; + class Land_Bunker_01_big_F : Default { + lootType = "mil"; + shelfPos[] = { + { {-0.57666,2.49512,-0.0691071}, 0.451775 } + }; + bedPos[] = { + { {-3.55566,1.28809,-0.0723591}, 95 } + }; + pelicanPos[] = { + { {0.932129,-3.37988,-0.0662937}, 233.452 }, + { {-1.23535,-5.16211,-0.057478}, 0.451786 } + }; + lockerPos[] = { + { {-0.548828,-2.99414,-0.0700665}, 90.4518 } + }; + shoeboxPos[] = { + { {-4.65869,-0.330078,0.008358}, 110.452 } + }; + cabinetPos[] = { + { {-2.31494,-4.04199,1.11855}, 270.452 } + }; + }; + class Land_Bunker_01_small_F : Default { + lootType = "mil"; + pelicanPos[] = { + { {0.750977,1.12305,0.148882}, 9.99997 } + }; + shoeboxPos[] = { + { {-1.03125,1.42383,0.293089}, 153 } + }; + cabinetPos[] = { + { {-0.260742,1.55176,1.10681}, 90.9999 } + }; + }; + class Land_i_Garage_V1_dam_F : Default { + shelfPos[] = { + { {-3.66797,-3.03369,-0.145458}, 192 } + }; + toolRackPos[] = { + { {2.46387,-3.35156,-0.160837}, 182 } + }; + palletPos[] = { + { {1.53613,0.891113,-0.160868}, 182 } + }; + freezerPos[] = { + { {4.55469,-2.6377,-0.166363}, 99.4322 } + }; + }; + class Land_Stone_HouseBig_V1_ruins_F : Default { + shoeboxPos[] = { + { {2.78027,1.70898,0.916737}, 210 } + }; + palletPos[] = { + { {-0.262695,1.80664,1.84048}, 356 } + }; + }; + class Land_Stone_HouseSmall_V1_ruins_F : Default { + shelfPos[] = { + { {0.160156,-1.12891,0.57814}, 90 } + }; + palletPos[] = { + { {-4.82813,2.50977,0.975464}, 210 }, + { {6.55859,1.61523,0.799408}, 261.9 } + }; + }; + class Land_Bunker_01_HQ_F : Default { + lootType = "mil"; + shelfPos[] = { + { {-0.306641,-0.130371,-0.993013}, 92.7387 } + }; + pelicanPos[] = { + { {0.732422,0.122559,-1.05364}, 266.739 }, + { {4.08887,2.13428,-1.02561}, 7 } + }; + shoeboxPos[] = { + { {-2.08887,2.6709,-0.989424}, 106.739 } + }; + cabinetPos[] = { + { {-2.75488,0.821289,0.109707}, 359.739 } + }; + }; + class Land_Carousel_01_F : Default { + shoeboxPos[] = { + { {0.105469,0.0498047,0.479246}, 93.2 } + }; + }; + class Land_Bunker_01_tall_F : Default { + lootType = "mil"; + shelfPos[] = { + { {-2.83789,1.38379,-3.42283}, 267.864 } + }; + pelicanPos[] = { + { {-1.03516,0.21875,1.37418}, 20 }, + { {-1.99414,-0.817383,-3.49438}, 237.358 } + }; + shoeboxPos[] = { + { {0.681641,0.616211,1.49148}, 213.2 }, + { {2.7002,1.9541,1.48981}, 143.2 } + }; + }; + class Land_ReservoirTank_01_military_F : Default { + lootType = "mil"; + shelfPos[] = { + { {2.38135,-0.182617,-12.8069}, 269 } + }; + }; + class Land_Cargo_House_V3_derelict_F : Default { + lootType = "mil"; + shelfPos[] = { + { {-2.58203,-0.36377,-0.0428944}, 269 } + }; + filingPos[] = { + { {2.09277,-0.495605,-0.0437584}, 120 } + }; + pelicanPos[] = { + { {1.90625,0.526367,-0.0736256}, 69.1639 } + }; + }; + class Land_Cargo_Patrol_V2_ruins_F : Default { + lootType = "mil"; + pelicanPos[] = { + { {1.94385,1.6875,-0.575218}, 70.5285 } + }; + shoeboxPos[] = { + { {2.26416,0.265625,-0.515388}, 107.5 } + }; + }; + class Land_cmp_Shed_F : Default { + palletPos[] = { + { {-5.33643,-0.695313,-10}, 107.5 }, + { {-4.94482,2.17676,-10}, 67.5 } + }; + }; + class Land_ReservoirTank_V1_F : Default { + shelfPos[] = { + { {2.39355,-0.24707,-12.7961}, 259.5 } + }; + }; + class Land_Unfinished_Building_01_noLadder_F : Default { + shelfPos[] = { + { {-4.89355,5.66748,1.16652}, 271 }, + { {-4.18066,6.06885,-2.34162}, 359.5 } + }; + toolRackPos[] = { + { {-5.11914,3.43164,1.25501}, 270 } + }; + shoeboxPos[] = { + { {1.06934,0.99707,1.16328}, 280 } + }; + palletPos[] = { + { {-1.85254,-1.68066,1.17049}, 280 }, + { {0.128906,2.68799,1.17328}, 260 }, + { {-2.81738,-1.42041,-2.33168}, 253 }, + { {-1.02344,5.35107,-2.32672}, 360 } + }; + }; + + + + + + + + + + + + + + + + + class bunker_epoch : Default { + lootBias = 75; + shelfPos[] = { + { {-6.09766,-2.83032,0.188561}, 269 } + }; + fridgePos[] = { + { {-2.79932,5.92554,0.188561}, 351.345 } + }; + cookerPos[] = { + { {-4.37891,5.896,0.188561}, 0.345061 } + }; + chairPos[] = { + { {3.87744,-5.82983,0.198561}, 180.345 } + }; + filingPos[] = { + { {4.23975,6.01489,0.188561}, 3.34506 }, + { {-6.06055,-5.35571,0.188561}, 273.345 }, + { {-6.01172,-6.05786,0.188561}, 263 } + }; + pelicanPos[] = { + { {5.80322,4.59717,0.118561}, 89.6452 } + }; + tablePos[] = { + { {2.11572,-5.91846,0.218561}, 358 } + }; + lockerPos[] = { + { {2.0498,5.92432,0.188561}, 2.34507 }, + { {5.54297,-5.95679,0.188561}, 179.772 } + }; + shoeboxPos[] = { + { {6.08057,6.03345,0.188561}, 209 } + }; + freezerPos[] = { + { {-5.7334,5.8186,0.188561}, 355.754 } + }; + }; + class bunker_epoch_01 : Default + { + lootBias = 75; + bedPos[] = {{{-5.6062,-4.66162,0.198561},0}}; + wardrobePos[] = {{{-4.96973,-1.5188,0.198561},0}}; + cookerPos[] = {{{-2.53882,3.17383,0.198561},0.999984}}; + chairPos[] = {{{5.60205,5.53516,0.198561},57}}; + filingPos[] = {{{1.39258,-4.93213,0.198561},270}}; + pelicanPos[] = {{{3.43359,-0.368652,0.198561},179}}; + lockerPos[] = {{{-2.90576,-5.85986,0.198561},180}}; + toolRackPos[] = {{{-0.807129,0.849365,0.198561},0.999984}}; + }; + class bunker_epoch_02 : Default + { + lootBias = 75; + filingPos[] = {{{-4.68335,6.02905,0.198561}, 0 }}; + pelicanPos[] = {{{3.39038,4.75586,0.998561},106},{{3.44043,-5.27368,1.09856},187}}; + tablePos[] = {{{-5.69214,-5.26318,0.198561},270}}; + shoeboxPos[] = {{{-0.34082,-0.652588,0.198561},0}}; + }; + class bunker_epoch_03 : Default + { + lootBias = 75; + palletPos[] = {{{5.12939,-4.6543,0.198561},280},{{-5.00098,4.79419,0.198561},280},{{-4.95093,-4.89502,0.198561},280},{{4.92627,5.02051,0.198561},280}}; + freezerPos[] = {{{0.429932,-0.184326,0.198561},280}}; + }; + class bunker_epoch_04 : Default + { + lootBias = 75; + shelfPos[] = {{{5.03784,6.09985,0.198561},358}}; + couchPos[] = {{{5.24194,-4.54272,0.198561},358}}; + toolRackPos[] = {{{-6.33521,-2.39136,0.198561},269}}; + palletPos[] = {{{-4.91284,5.15063,0.198561},358}}; + }; + class bunker_epoch_05 : Default + { + lootBias = 75; + toolRackPos[] = {{{-6.34375,-4.08228,0.198561},269 },{{4.22607,6.44775,0.198561},358}}; + }; + class bunker_epoch_06 : Default + { + lootBias = 75; + bedPos[] = {{{0.781494,-0.343262,0.398561},357}}; + couchPos[] = {{{4.94385,-4.66699,0.398561},0.999985}}; + chairPos[] = {{{5.50708,5.47949,0.198561},40}}; + palletPos[] = {{{-4.90674,-4.79785,0.398561},0.999985}}; + freezerPos[] = {{{-4.82007,5.51099,0.398561},0.999985}}; + }; + class bunker_epoch_07 : Default + { + lootBias = 75; + fridgePos[] = {{{-5.98901,5.21826,0.198561},271}}; + couchPos[] = {{{4.22314,4.99194,0.198561},271}}; + pelicanPos[] = {{{-1.77954,-0.48291,0.0985613},71}}; + tablePos[] = {{{5.75464,-2.42407,0.198561},91}}; + lockerPos[] = {{{3.51074,-5.99731,-0.00143862},181}}; + }; + class bunker_epoch_08 : Default + { + lootBias = 75; + pelicanPos[] = {{{5.34814,-5.12524,0.0985613},157}}; + tablePos[] = {{{5.72852,4.86255,0.0985613},90}}; + palletPos[] = {{{-1.03052,-1.6283,0.0985613},90},{{-5.45703,5.45093,0.0985613},90}}; + }; + class bunker_epoch_09 : Default + { + lootBias = 75; + filingPos[] = {{{-0.427002,-3.22974,0.198561},270}}; + lockerPos[] = {{{3.94238,3.28931,0.198561},0}}; + toolRackPos[] = {{{-4.68579,2.68604,0.198561},90}}; + cabinetPos[] = {{{-2.53271,-5.63306,1.59856},0}}; + }; + class bunker_epoch_10 : Default + { + lootBias = 75; + filingPos[] = {{{5.95313,-5.95898,0.198561},93}}; + pelicanPos[] = {{{1.65479,0.0246582,0.198561},93}}; + shoeboxPos[] = {{{-3.18604,-5.94482,0.198561},360}}; + palletPos[] = {{{1.10596,2.43481,0.198561},360}}; + freezerPos[] = {{{2.24316,-2.00635,0.198561},90}}; + }; + class bunker_epoch_11 : Default + { + lootBias = 75; + palletPos[] = {{{-0.422363,-0.419922,0.198561},90},{{1.23438,-3.04443,0.198561},90},{{2.97192,1.48828,0.198561},90},{{-1.42578,3.52393,0.198561},90},{{-4.94702,-1.37012,0.198561},90}}; + }; + class bunker_epoch_12 : Default + { + lootBias = 75; + cookerPos[] = {{{-0.17749,3.62891,0.198561},0}}; + chairPos[] = {{{-2.82349,3.24341,0.198561},319}}; + tablePos[] = {{{-3.12524,-0.625488,0.198561},270}}; + lockerPos[] = {{{3.52197,0.408203,0.198561},90}}; + palletPos[] = {{{2.68945,-2.72729,0.198561},90}}; + }; + class bunker_epoch_13 : Default + { + lootBias = 75; + wardrobePos[] = {{{-5.40405,3.79126,0.0153623},180}}; + cookerPos[] = {{{3.54663,4.09839,0.215362},180}}; + chairPos[] = {{{0.483887,-1.7981,0.215362},276}}; + filingPos[] = {{{-1.15649,3.83398,0.0153623},89}}; + pelicanPos[] = {{{-3.9458,-3.77197,0.115362},53}}; + }; + class bunker_epoch_14 : Default + { + lootBias = 75; + fridgePos[] = {{{3.50195,-3.10852,0.232163},93}}; + cookerPos[] = {{{5.59717,5.83398,0.232163},359}}; + filingPos[] = {{{-5.47656,2.58411,0.232163},359}}; + tablePos[] = {{{-3.96191,-3.97363,0.232163},90}}; + }; + class bunker_epoch_15 : Default + { + lootBias = 75; + fridgePos[] = {{{5.34229,-1.59033,0.198561},180}}; + chairPos[] = {{{2.95605,2.72632,0.198561},313}}; + filingPos[] = {{{-4.2688,3.32031,0.198561},313}}; + lockerPos[] = {{{1.14282,-1.66333,0.198561},1.99997}}; + }; + class 4_way_bunker_p3d : bunker_epoch {}; + class bunker_epoch_01_p3d : bunker_epoch_01 {}; + class bunker_epoch_02_p3d : bunker_epoch_02 {}; + class bunker_epoch_03_p3d : bunker_epoch_03 {}; + class bunker_epoch_04_p3d : bunker_epoch_04 {}; + class bunker_epoch_05_p3d : bunker_epoch_05 {}; + class bunker_epoch_06_p3d : bunker_epoch_06 {}; + class bunker_epoch_07_p3d : bunker_epoch_07 {}; + class bunker_epoch_08_p3d : bunker_epoch_08 {}; + class bunker_epoch_09_p3d : bunker_epoch_09 {}; + class bunker_epoch_10_p3d : bunker_epoch_10 {}; + class bunker_epoch_11_p3d : bunker_epoch_11 {}; + class bunker_epoch_12_p3d : bunker_epoch_12 {}; + class bunker_epoch_13_p3d : bunker_epoch_13 {}; + class bunker_epoch_14_p3d : bunker_epoch_14 {}; + class bunker_epoch_15_p3d : bunker_epoch_15 {}; }; /*[[[end]]]*/ diff --git a/Sources/epoch_config/Configs/CfgClientFunctions.hpp b/Sources/epoch_config/Configs/CfgClientFunctions.hpp index a63456b6..58937b61 100644 --- a/Sources/epoch_config/Configs/CfgClientFunctions.hpp +++ b/Sources/epoch_config/Configs/CfgClientFunctions.hpp @@ -1,320 +1,400 @@ /*[[[cog from arma_config_tools import *; json_to_arma()]]]*/ /* - @author = "Aaron Clark - https://EpochMod.com"; - @contributors[] = {"Raimonds Virtoss","Andrew Gregory"}; - @description = "Custom Epoch Client Only functions"; - @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_config/Configs/CfgClientFunctions.hpp"; + @author = "Aaron Clark - https://EpochMod.com"; + @contributors[] = {"Raimonds Virtoss","Andrew Gregory"}; + @description = "Custom Epoch Client Only functions"; + @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_config/Configs/CfgClientFunctions.hpp"; */ class CfgClientFunctions { - version = 1; - class A3E - { - tag = "EPOCH"; - file = "epoch_code\compile"; - class generic - { - file = "epoch_code\compile"; - class localCleanup {}; - class unitSpawnIncrease {}; - class unitSpawnDecrease {}; - class QuickTakeAll {}; - class QuickTakeLoad {}; - class effectCrypto {}; - class handleServerMessage {}; - class updateLoadingScreen {}; - class EnterBuilding {}; - class lootTrash {}; - class debugMonitor {}; - class interact {}; - class chopWood {}; - class fish {}; - class mineRocks {}; - class UnisexCheck {}; - class PutHandler {}; - class niteLight {}; - class LootIT {}; - class supportCopter {}; - class consumeItem {}; - class unitSpawn {}; - class onEachFrame {}; - class callSapperMigration {}; - class zombieSpawn {}; - class makeMarker {}; - class removeMarker {}; - }; - class building - { - class maintainIT {}; - class lockCheck {}; - class countdown {}; - class fnc_SelectTargetBuild {}; - class isBuildAllowed {}; - class simulSwap {}; - class staticMove {}; - class upgradeBUILD {}; - class removeBUILD {}; - class changeWallState {}; - class checkBuild {}; - }; - class traders - { - class NpcTrade_return {}; - class startInteract {}; - class startInteractNPC {}; - class npcTraderAdd {}; - class npcTraderAdd2 {}; - class npcTraderAdd3 {}; - class startNPCTraderMenu {}; - class NPCTraderMenuFilter {}; - class startNpcTrade {}; - class tradeFilter {}; - class takeCrypto {}; - class startBankTransfer {}; - }; - class interface_event_handlers - { - class KeyDown {}; - class KeyUp {}; - class onChar {}; - }; - class event_handlers - { - class getInMan {}; - class getOutMan {}; - class InventoryClosed {}; - class InventoryOpened {}; - }; - class setup - { - class masterLoop {}; - class clientInit {}; - class clientRespawn {}; - class clientRevive {}; - class client_rejectPlayer {}; - class clientKeyMap {}; - }; - class p2p_trading - { - class startTRADEREQ {}; - class startTrade {}; - class tradeRequest {}; - class TradeLoop {}; - class makep2pTrade {}; - }; - class functions - { - class worldObjectType {}; - class returnConfig {}; - class returnConfigV2 {}; - class colorRange {}; - class convertTemp {}; - class fnc_playerDeath {}; - class fnc_playerFired {}; - class fnc_isInsideBuilding {}; - class fnc_Weather {}; - class fnc_findSafePos {}; - class fnc_addItemOverflow {}; - class pushCustomVar {}; - class itemData {}; - class itemPicture {}; - class itemDisplayName {}; - class SortArrayByDistance {}; - class fnc_findRandomPosBehind {}; - class fnc_stringLeft {}; - class fnc_findSapperStalkLocation {}; - class fnc_dirToFuzzy {}; - class fnc_cursorTarget {}; - class fnc_triggerAntagonist {}; - class fnc_playerDeathDetonate {}; - class fnc_playerDeathMorph {}; - class fnc_playerSetVariable {}; - class fnc_playerAttachToAntagonist {}; - class fnc_dynamicFSM {}; - class fnc_vectorDivide {}; - class giveAttributes {}; - class fnc_spawnEffects {}; - class fnc_arrayStringToBool {}; - }; - class environment - { - class client_earthQuake {}; - class client_loadAnimalBrain {}; - class client_bitePlayer {}; - }; - class vehicles - { - class client_repairVehicle {}; - class client_lockVehicle {}; - class client_fillVehicle {}; - class client_gearVehicle {}; - }; - class missions - { - class mission_accept {}; - class mission_cage_sapper {}; - class mission_returnObj {}; - }; - class inventory - { - class selectInventoryItem {}; - class itemInteractClick {}; - class itemInteractDblClick {}; - class uniformArmorCalc {}; - class gearArmorCalc {}; - class factorArmor {}; - class maxArmorInit {}; - class initUI {}; - class refeshUI {}; - }; - class servicepoint - { - class SP_Check {}; - class SP_Rearm {}; - class SP_Refuel {}; - class SP_Repair {}; - class SP_Start {}; - }; - class customs - { - file = "epoch_code\customs"; - class custom_EH_FiredMan {}; - class custom_EH_GetInMan {}; - class custom_EH_GetOutMan {}; - class custom_EH_InventoryClosed {}; - class custom_EH_InventoryOpened {}; - class custom_EH_KeyDown {}; - class custom_EH_KeyUp {}; - class custom_EH_Killed {}; - class custom_EH_Put {}; - class custom_EH_Take {}; - class custom_OnEachFrame {}; - }; - class messaging - { - file = "epoch_code\gui\scripts\messaging"; - class message {}; - class message_old1 {}; - class message_old2 {}; - }; - class looting - { - class spawnLoot {}; - }; - class gui - { - file = "epoch_code\gui\scripts"; - class onPause {}; - class showStats {}; - class 3DctrlPitchYaw {}; - class 3DctrlSpin {}; - class 3DctrlYaw {}; - class InterruptConfig {}; - class InterruptConfigActions {}; - class getIDC {}; - class guiObjHP {}; - class secureStorageHandler {}; - class genderSelection {}; - class getColorScheme {}; - class dragControl {}; - }; - class animations - { - file = "epoch_code\gui\scripts\animations"; - class 2DCtrlShake {}; + version = 1; + class A3E + { + tag = "EPOCH"; + file = "epoch_code\compile"; + class generic + { + file = "epoch_code\compile"; + class localCleanup {}; + class unitSpawnIncrease { + customHeader = 1; + }; + class unitSpawnDecrease { + customHeader = 1; + }; + class QuickTakeAll {}; + class QuickTakeLoad {}; + class effectCrypto {}; + class handleServerMessage {}; + class updateLoadingScreen {}; + class EnterBuilding {}; + class lootTrash {}; + class interact {}; + class chopWood {}; + class fish {}; + class mineRocks {}; + class UnisexCheck {}; + class PutHandler {}; + class niteLight {}; + class LootIT {}; + class supportCopter {}; + class consumeItem {}; + class unitSpawn { + customHeader = 1; + }; + class onEachFrame {}; + class callSapperMigration {}; + class zombieSpawn {}; + class makeMarker {}; + class removeMarker {}; + class unit_onKilledEH {}; + }; + class building + { + class maintainIT {}; + class lockCheck {}; + class countdown {}; + class fnc_SelectTargetBuild {}; + class isBuildAllowed {}; + class simulSwap { + customHeader = 1; + }; + class staticMove { + customHeader = 1; + }; + class upgradeBUILD {}; + class removeBUILD {}; + class changeWallState {}; + class checkBuild {}; + }; + class traders + { + class NpcTrade_return {}; + class startInteract {}; + class startInteractNPC {}; + class npcTraderAdd {}; + class npcTraderAdd2 {}; + class npcTraderAdd3 {}; + class startNPCTraderMenu {}; + class NPCTraderMenuFilter {}; + class startNpcTrade {}; + class tradeFilter {}; + class takeCrypto {}; + class startBankTransfer {}; + class calcDamageCost {}; + }; + class interface_event_handlers + { + class KeyDown { + customHeader = 1; + }; + class KeyUp {}; + class onChar {}; + }; + class event_handlers + { + class getInMan {}; + class getOutMan {}; + class InventoryClosed {}; + class InventoryOpened {}; + }; + class setup + { + class masterLoop { + customHeader = 1; + }; + class clientInit {}; + class clientRespawn {}; + class clientRevive { + customHeader = 1; + }; + class client_rejectPlayer {}; + class clientKeyMap {}; + }; + class p2p_trading + { + class startTRADEREQ {}; + class startTrade {}; + class tradeRequest {}; + class TradeLoop {}; + class makep2pTrade {}; + }; + class functions + { + class worldObjectType {}; + class returnConfig {}; + class returnConfigV2 {}; + class colorRange {}; + class convertTemp {}; + class fnc_playerDeath { + customHeader = 1; + }; + class fnc_playerFired { + customHeader = 1; + }; + class fnc_isInsideBuilding {}; + class fnc_findSafePos {}; + class fnc_addItemOverflow {}; + class fnc_addMagazineOverflow {}; + class itemData {}; + class itemPicture {}; + class itemDisplayName {}; + class SortArrayByDistance {}; + class fnc_findRandomPosBehind {}; + class fnc_stringLeft {}; + class fnc_findSapperStalkLocation {}; + class fnc_dirToFuzzy {}; + class fnc_cursorTarget {}; + class fnc_returnHudVar { + customHeader = 1; + }; + class fnc_triggerAntagonist {}; + class fnc_playerDeathDetonate {}; + class fnc_playerDeathMorph {}; + class fnc_playerSetVariable {}; + class fnc_playerAttachToAntagonist {}; + class fnc_dynamicFSM {}; + class fnc_vectorDivide {}; + class giveAttributes { + customHeader = 1; + }; + class fnc_spawnEffects {}; + class fnc_arrayStringToBool {}; + class client_updatePlayerStat {}; + class fnc_getHitPointsDamageAverage {}; + class fnc_setVariableLimited {}; + class fnc_createLocalMarkerSet {}; + class fnc_deleteLocalMarkerSet {}; + }; + class environment + { + class client_earthQuake {}; + class client_loadAnimalBrain {}; + class client_bitePlayer { + customHeader = 1; + }; + }; + class vehicles + { + class client_repairVehicle {}; + class client_lockVehicle {}; + class client_fillVehicle {}; + class client_gearVehicle {}; + class client_upgradeVehicle {}; + class client_upgradeVehicleCheck {}; + class client_VehicleMaintananceCheck {}; + class client_VehicleMaintananceDo {}; + class vehicle_checkTurretAmmo {}; + class vehicle_removeTurretAmmo {}; + }; + class missions + { + class mission_accept {}; + class mission_cage_sapper {}; + class mission_returnObj {}; + }; + class inventory + { + class selectInventoryItem {}; + class itemInteractClick {}; + class itemInteractDblClick {}; + class uniformArmorCalc {}; + class gearArmorCalc {}; + class factorArmor {}; + class maxArmorInit {}; + class initUI {}; + class refeshUI {}; + class equip {}; + class itemTypeSlot {}; + }; + class servicepoint + { + class SP_Check {}; + class SP_Rearm {}; + class SP_Refuel {}; + class SP_Repair {}; + class SP_Start {}; + }; + class customs + { + file = "epoch_code\customs"; + class custom_EH_FiredMan {}; + class custom_EH_GetInMan {}; + class custom_EH_GetOutMan {}; + class custom_EH_InventoryClosed {}; + class custom_EH_InventoryOpened {}; + class custom_EH_KeyDown {}; + class custom_EH_KeyUp {}; + class custom_EH_Killed {}; + class custom_EH_Put {}; + class custom_EH_Take {}; + class custom_KeyMap {}; + class custom_OnEachFrame {}; + class custom_radioActions {}; + }; + class messaging + { + file = "epoch_code\gui\scripts\messaging"; + class message {}; + class message_stack {}; + class message_old1 {}; + class message_old2 {}; + }; + class looting + { + class spawnLoot {}; + }; + class gui + { + file = "epoch_code\gui\scripts"; + class onPause {}; + class showStats {}; + class 3DctrlPitchYaw {}; + class 3DctrlSpin {}; + class 3DctrlYaw {}; + class InterruptConfig {}; + class InterruptConfigActions {}; + class getIDC {}; + class guiObjHP {}; + class secureStorageHandler {}; + class genderSelection {}; + class getColorScheme {}; + class dragControl {}; + }; + class animations + { + file = "epoch_code\gui\scripts\animations"; + class 2DCtrlShake {}; class 2DCtrlHeartbeat {}; - }; - class config + }; + class config + { + file = "epoch_code\gui\scripts\config"; + class config_keymap {}; + }; + class dynamenu + { + file = "epoch_code\gui\scripts\dynamenu"; + class dynamicMenu {}; + class dynamicMenuPopulate {}; + class dynamicMenuCleanup {}; + }; + class dynamicHUD + { + file = "epoch_code\gui\scripts\dynamicHUD"; + class dynamicHUD_adjust {}; + class dynamicHUD_loadSave {}; + class dynamicHUD_start {}; + class getHUDCtrl {}; + }; + class gui_craft + { + file = "epoch_code\gui\scripts\craftingv2"; + class crafting_animate {}; + class crafting_ctrl_collector {}; + class crafting_dev_toggle {}; + class crafting_getConfig {}; + class crafting_checkGear {}; + class crafting_checkNearby {}; + class crafting_checkResources {}; + class crafting_craft {}; + class crafting_progress {}; + class crafting_load {}; + class crafting_unload {}; + class crafting_LB_click {}; + class crafting_LB_defaults {}; + class crafting_LB_doubleClick {}; + class crafting_colorScheme {}; + }; + class group + { + file = "epoch_code\gui\scripts\group"; + class Group_invitePlayer {}; + class Group_BtnMod {}; + class Group_BtnInvite {}; + class Group_onLoad {}; + class Group_List {}; + class Group_Combo {}; + class Group_BtnLeave {}; + class Group_BtnKick {}; + class cGroup_groupText {}; + class cGroup_onLoad {}; + class cGroup_BtnCreate {}; + class iGroup_acceptInvite {}; + class iGroup_onLoad {}; + class iGroup_refresh {}; + class Group_update {}; + }; + class groupTemp { - file = "epoch_code\gui\scripts\config"; - class config_keymap {}; - }; - class dynamenu - { - file = "epoch_code\gui\scripts\dynamenu"; - class dynamicMenu {}; - class dynamicMenuPopulate {}; - class dynamicMenuCleanup {}; - }; - class dynamicHUD - { - file = "epoch_code\gui\scripts\dynamicHUD"; - class dynamicHUD_adjust {}; - class dynamicHUD_loadSave {}; - class dynamicHUD_start {}; - class getHUDCtrl {}; - }; - class gui_craft - { - file = "epoch_code\gui\scripts\craftingv2"; - class crafting_animate {}; - class crafting_ctrl_collector {}; - class crafting_dev_toggle {}; - class crafting_getConfig {}; - class crafting_checkGear {}; - class crafting_checkNearby {}; - class crafting_checkResources {}; - class crafting_craft {}; - class crafting_progress {}; - class crafting_load {}; - class crafting_unload {}; - class crafting_LB_click {}; - class crafting_LB_defaults {}; - class crafting_LB_doubleClick {}; - class crafting_colorScheme {}; - }; - class group - { - file = "epoch_code\gui\scripts\group"; - class Group_invitePlayer {}; - class Group_BtnMod {}; - class Group_BtnInvite {}; - class Group_onLoad {}; - class Group_List {}; - class Group_Combo {}; - class Group_BtnLeave {}; - class Group_BtnKick {}; - class cGroup_groupText {}; - class cGroup_onLoad {}; - class cGroup_BtnCreate {}; - class iGroup_acceptInvite {}; - class iGroup_onLoad {}; - class iGroup_refresh {}; - class Group_update {}; - }; - class gui_inventory - { - file = "epoch_code\gui\scripts\inventory"; - class Inventory_Group {}; - class Inventory_iGroup {}; - }; - class gui_missions - { - file = "epoch_code\gui\scripts\missions"; - class mission_refresh {}; - class mission_description {}; - }; - class gui_postProcessing - { - file = "epoch_code\gui\scripts\post_process"; - class postprocessCreate {}; - class postprocessAdjust {}; - class postprocessDestroy {}; - class setDrunk {}; - class setRadiation {}; - }; - class worldToScreen - { - file = "epoch_code\gui\scripts\worldToScreen"; - class gui3DCooldown {}; - class gui3DCooldownEH {}; - class gui3DWorldPos {}; - class gui3DWorldPosEH {}; - class gui3DModelPos {}; - class gui3DModelPosEH {}; - }; - }; + file = "epoch_code\gui\scripts\groupTemp"; + class tempGroup_invitePlayer {}; + class tempGroup_BtnMod {}; + class tempGroup_BtnInvite {}; + class tempGroup_onLoad {}; + class tempGroup_List {}; + class tempGroup_Combo {}; + class tempGroup_BtnLeave {}; + class tempGroup_BtnKick {}; + class cTempGroup_onLoad {}; + class cTempGroup_BtnCreate {}; + class iTempGroup_acceptInvite {}; + class iTempGroup_onLoad {}; + class iTempGroup_refresh {}; + class tempGroup_update {}; + }; + class gui_inventory + { + file = "epoch_code\gui\scripts\inventory"; + class Inventory_Group {}; + class Inventory_iGroup {}; + class Inventory_tempGroup {}; + class Inventory_itempGroup {}; + }; + class gui_missions + { + file = "epoch_code\gui\scripts\missions"; + class mission_refresh {}; + class mission_description {}; + }; + class gui_postProcessing + { + file = "epoch_code\gui\scripts\post_process"; + class postprocessCreate {}; + class postprocessAdjust {}; + class postprocessDestroy {}; + class setDrunk {}; + class setRadiation {}; + }; + class worldToScreen + { + file = "epoch_code\gui\scripts\worldToScreen"; + class gui3DCooldown {}; + class gui3DCooldownEH {}; + class gui3DWorldPos {}; + class gui3DWorldPosEH {}; + class gui3DModelPos {}; + class gui3DModelPosEH {}; + }; + class favBar { + file = "epoch_code\gui\scripts\favBar"; + class favBar_draw {}; + class favBar_drawCurrent {}; + class favBar_refresh {}; + class favBar_action{}; + class favBar_getItemByIDC {}; + class favBar_inventory {}; + class favBar_getGearItem {}; + class favBar_modifier {}; + }; + class geiger { + file = "epoch_code\gui\scripts\geiger"; + class geiger_animate {}; + class geiger_show_hide {}; + class geiger_simulate {}; + }; + }; }; /*[[[end]]]*/ diff --git a/Sources/epoch_config/Configs/cfgCrafting.hpp b/Sources/epoch_config/Configs/CfgCrafting.hpp similarity index 55% rename from Sources/epoch_config/Configs/cfgCrafting.hpp rename to Sources/epoch_config/Configs/CfgCrafting.hpp index 30286d99..54005af5 100644 --- a/Sources/epoch_config/Configs/cfgCrafting.hpp +++ b/Sources/epoch_config/Configs/CfgCrafting.hpp @@ -22,6 +22,8 @@ {{"Water source", "", "water", {2,{"water"}}, 3, 1, 0, 0}} }; + + WARNING: DO NOT inherit from existing items, create each item as unique entry, only inherit defaults such as part or kit! */ /*[[[cog from arma_config_tools import *; json_to_arma()]]]*/ /* @@ -39,10 +41,11 @@ class CfgCrafting class Default //className, any object or item { craftTime = 1; //time it takes to craft - + craftCount = 1; // number of crafted items recipe[] = {}; //nested arrays, {{"item", 1}}; nearby[] = {}; //nearby requirements - fire, water source, object usedIn[] = {}; //item is an ingredient + recipeReturn[] = {}; // items to return after crafting is completed previewPosition[] = {0.8125,1,0.285}; //XzY previewScale = 1; @@ -145,7 +148,7 @@ class CfgCrafting }; class CircuitParts : Part { - usedIn[] = {"EnergyPack","EnergyPackLg","KitPlotPole"}; + usedIn[] = {"EnergyPack","EnergyPackLg","KitPlotPole","ItemBattery","KitSolarGen","KitVehicleUpgradeI_200_EPOCH","KitVehicleUpgradeIV_200_EPOCH","BarrelBomb_EPOCH_Remote_Mag","BarrelBomb2_EPOCH_Remote_Mag","KitPortableLight_Single","KitPortableLight_Double"}; previewPosition[] = {0.791044,1,0.256956}; previewScale = 2; previewVector = 2.3; @@ -161,6 +164,7 @@ class CfgCrafting }; class EnergyPackLg : Item { + usedIn[] = {"ItemBattery"}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; recipe[] = {{"EnergyPack",3},{"ItemGoldBar",1},{"CircuitParts",1}}; previewPosition[] = {0.8,1,0.29}; @@ -176,12 +180,21 @@ class CfgCrafting }; class ItemAluminumBar : Item { - usedIn[] = {}; + usedIn[] = {"ItemAluminumBar10oz"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; recipe[] = {{"ItemSodaEmpty",6},{"water_epoch",1}}; previewPosition[] = {0.797144,1,0.27}; previewScale = 1.3; previewVector = 2.5; + }; + class ItemAluminumBar10oz : Item + { + usedIn[] = {"KitVehicleUpgradeII_200_EPOCH"}; + nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; + recipe[] = {{"ItemAluminumBar",10},{"water_epoch",1}}; + previewPosition[] = {0.797144,1,0.26}; + previewScale = 0.7; + previewVector = 2.5; }; class ItemEmptyTin : Part { @@ -192,12 +205,21 @@ class CfgCrafting }; class ItemTinBar : Item { - usedIn[] = {}; + usedIn[] = {"ItemTinBar10oz"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; recipe[] = {{"ItemEmptyTin",6},{"water_epoch",1}}; previewPosition[] = {0.797144,1,0.27}; previewScale = 1.3; previewVector = 2.5; + }; + class ItemTinBar10oz : Item + { + usedIn[] = {}; + nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; + recipe[] = {{"ItemTinBar",10},{"water_epoch",1}}; + previewPosition[] = {0.797144,1,0.26}; + previewScale = 0.7; + previewVector = 2.5; }; class PartOre : Part { @@ -229,13 +251,13 @@ class CfgCrafting }; class ItemRock : Part { - usedIn[] = {"KitFirePlace","MeleeMaul","CrudeHatchet","MortarBucket"}; + usedIn[] = {"KitFirePlace","MeleeMaul","CrudeHatchet","MortarBucket","Kit_Garden"}; previewPosition[] = {0.796998,1,0.35}; previewScale = 1.3; }; class ItemStick : Item { - usedIn[] = {"WoodClub","MeleeMaul","CrudeHatchet","KitFirePlace","KitSpikeTrap","KitMetalTrap","MeleeRod"}; + usedIn[] = {"WoodClub","MeleeMaul","CrudeHatchet","KitFirePlace","KitSpikeTrap","KitMetalTrap","MeleeRod","KitSunShade"}; recipe[] = {{"WoodLog_EPOCH",1}}; previewPosition[] = {0.8,1,0.25}; previewScale = 0.4; @@ -248,16 +270,100 @@ class CfgCrafting previewScale = 0.5; previewVector = 0; }; - class ItemKiloHemp : Part + class ItemSeedBag : Part + { + usedIn[] = {"SeedPacket_Hemp","SeedPacket_GoldenSeal","SeedPacket_Poppy","SeedPacket_Pumpkin","SeedPacket_Sunflower"}; + recipe[] = {{"ItemCanvas",1}}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 0.6; + previewVector = 0; + }; + class Hemp : Part + { + usedIn[] = {"ItemKiloHemp","SeedPacket_Hemp"}; + previewPosition[] = {0.8,1,0.24}; + previewScale = 0.11; + previewVector = 0; + }; + class GoldenSeal : Part + { + usedIn[] = {"SeedPacket_GoldenSeal"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1.1; + previewVector = 0; + }; + class Poppy : Part + { + usedIn[] = {"SeedPacket_Poppy"}; + previewPosition[] = {0.8,1,0.27}; + previewScale = 0.4; + previewVector = 0; + }; + class Pumpkin : Part + { + usedIn[] = {"SeedPacket_Pumpkin"}; + previewPosition[] = {0.8,1,0.35}; + previewScale = 0.8; + previewVector = 0; + }; + class Sunflower : Part + { + usedIn[] = {"SeedPacket_Sunflower"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 0.15; + previewVector = 0; + }; + class SeedPacket_Hemp : Item { - usedIn[] = {"ItemRope","ItemBurlap"}; + recipe[] = {{"Hemp",1},{"ItemSeedBag",1}}; + craftCount = 2; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1.4; + previewVector = 0; + }; + class SeedPacket_GoldenSeal : Item + { + recipe[] = {{"GoldenSeal",1},{"ItemSeedBag",1}}; + craftCount = 2; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1.4; + previewVector = 0; + }; + class SeedPacket_Poppy : Item + { + recipe[] = {{"Poppy",1},{"ItemSeedBag",1}}; + craftCount = 2; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1.4; + previewVector = 0; + }; + class SeedPacket_Pumpkin : Item + { + recipe[] = {{"Pumpkin",1},{"ItemSeedBag",1}}; + craftCount = 2; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1.4; + previewVector = 0; + }; + class SeedPacket_Sunflower : Item + { + recipe[] = {{"Sunflower",1},{"ItemSeedBag",1}}; + craftCount = 2; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1.4; + previewVector = 0; + }; + class ItemKiloHemp : Item + { + usedIn[] = {"ItemRope","ItemBurlap","ItemCanvas"}; + recipe[] = {{"Hemp",2}}; previewPosition[] = {0.796267,1,0.322762}; previewScale = 0.9; previewVector = 1.4; }; class ItemRope : Item { - usedIn[] = {"WoodClub","MeleeMaul","CrudeHatchet","MeleeRod"}; + usedIn[] = {"WoodClub","MeleeMaul","CrudeHatchet","MeleeRod","KitSunShade","KitScaffolding","KitBarbedWire"}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; recipe[] = {{"ItemKiloHemp",1}}; previewPosition[] = {0.8,1,0.35}; @@ -265,7 +371,7 @@ class CfgCrafting }; class ItemBurlap : Item { - usedIn[] = {"KitHesco3"}; + usedIn[] = {"KitHesco3","KitVehicleUpgradeIII_200_EPOCH","KitSandbagWall","KitSandbagWallLong","KitBagBunker"}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; recipe[] = {{"ItemKiloHemp",2}}; previewPosition[] = {0.8,1,0.38}; @@ -294,13 +400,13 @@ class CfgCrafting }; class WoodLog_EPOCH : Part { - usedIn[] = {"PartPlankPack","ItemStick","ItemPlywoodPack"}; + usedIn[] = {"PartPlankPack","ItemStick","ItemPlywoodPack","KitBurnBarrel"}; previewPosition[] = {0.800064,1,0.25}; previewScale = 0.3; }; class MortarBucket : Item { - usedIn[] = {"KitFoundation","KitCinderWall","KitHesco3"}; + usedIn[] = {"KitFoundation","KitCinderWall","KitHesco3","KitCinderFloor","KitCinderHalfFloor","KitCinderQuarterFloor","KitCinderTower","KitSandbagWall","KitSandbagWallLong","KitBagBunker","KitWaterPump"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0},{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; recipe[] = {{"ItemRock",12},{"water_epoch",2}}; previewPosition[] = {0.799442,1,0.426761}; @@ -309,7 +415,7 @@ class CfgCrafting }; class ItemScraps : Item { - usedIn[] = {"ItemCorrugated","KitMetalTrap"}; + usedIn[] = {"ItemCorrugated","KitMetalTrap","MeleeRod","KitVehicleUpgradeIV_200_EPOCH","KitBarbedWire"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; recipe[] = {{"PartOre",2}}; previewPosition[] = {0.797144,1,0.309158}; @@ -318,7 +424,7 @@ class CfgCrafting }; class ItemCorrugated : Item { - usedIn[] = {"KitShelf","ItemCorrugatedLg","VehicleRepairLg"}; + usedIn[] = {"KitShelf","ItemCorrugatedLg","VehicleRepairLg","EngineParts","KitSink","KitFieldToilet","KitWaterPump","KitLightPole"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; recipe[] = {{"ItemScraps",2}}; previewPosition[] = {0.791088,1,0.300004}; @@ -327,7 +433,7 @@ class CfgCrafting }; class CinderBlocks : Part { - usedIn[] = {"KitCinderWall"}; + usedIn[] = {"KitCinderWall","KitCinderFloor","KitCinderHalfFloor","KitCinderQuarterFloor","KitCinderTower","KitBarGate","KitWaterPump"}; previewPosition[] = {0.801866,1,0.35}; previewScale = 0.2; }; @@ -339,14 +445,14 @@ class CfgCrafting }; class jerrycan_epoch : Part { - usedIn[] = {"CSGAS"}; + usedIn[] = {"CSGAS","KitVehicleUpgradeIV_200_EPOCH","BarrelBomb_EPOCH_Remote_Mag","BarrelBomb2_EPOCH_Remote_Mag","KitBurnBarrel"}; previewPosition[] = {0.802443,1,0.254301}; previewScale = 0.6; previewVector = 4.9; }; class VehicleRepair : Part { - usedIn[] = {"VehicleRepairLg"}; + usedIn[] = {"VehicleRepairLg","EngineParts","SpareTire","KitVehicleUpgradeI_200_EPOCH"}; previewPosition[] = {0.787659,1,0.30098}; previewScale = 0.45; previewVector = 1.5; @@ -358,6 +464,35 @@ class CfgCrafting previewScale = 0.25; previewVector = 0.7; }; + class ItemDuctTape : Part + { + usedIn[] = {"SpareTire","EngineParts","ItemRotor"}; + previewPosition[] = {0.807346,1,0.27}; + previewScale = 1.8; + previewVector = -3.9; + }; + class EngineParts : Item + { + usedIn[] = {"EngineBlock"}; + recipe[] = {{"VehicleRepair",2},{"ItemCorrugated",1},{"ItemDuctTape",1} }; + previewPosition[] = {0.807346,1,0.29}; + previewScale = 0.38; + previewVector = 0.9; + }; + class EngineBlock : Item + { + recipe[] = {{"EngineParts",1},{"ItemCorrugatedLg",1} }; + previewPosition[] = {0.807346,1,0.29}; + previewScale = 0.38; + previewVector = 0.5; + }; + class ItemRotor : Item + { + recipe[] = {{"ItemCorrugatedLg",1},{"ItemDuctTape",1} }; + previewPosition[] = {0.807346,1,0.29}; + previewScale = 0.2; + previewVector = 0.5; + }; class EpochRadio0 : Part { usedIn[] = {"EpochRadio1"}; @@ -652,7 +787,7 @@ class CfgCrafting }; class water_epoch : Item { - usedIn[] = {"clean_water_epoch", "MortarBucket"}; + usedIn[] = {"clean_water_epoch", "MortarBucket","ItemCopperBar","ItemCopperBar10oz","ItemGoldBar","ItemSilverBar","ItemGoldBar10oz","ItemSilverBar10oz","ItemAluminumBar","ItemAluminumBar10oz","ItemTinBar","ItemTinBar10oz","Kit_Garden"}; nearby[] = {{"Water source","","water",{2,{"water"}},3,1,0,0}}; recipe[] = {"emptyjar_epoch"}; previewPosition[] = {0.807346,1,0.43035}; @@ -677,7 +812,7 @@ class CfgCrafting }; class ItemCorrugatedLg : Item { - usedIn[] = {"KitPlotPole","KitTankTrap","KitHesco3"}; + usedIn[] = {"KitPlotPole","KitTankTrap","KitHesco3","KitSolarGen","ItemRotor","EngineBlock","KitMetalFloor","KitMetalHalfFloor","KitMetalQuarterFloor","KitMetalTower","KitFieldToilet","KitSink","KitPortableLight_Single","KitPortableLight_Double","KitBarbedWire"}; recipe[] = {{"ItemCorrugated",3}}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; previewPosition[] = {0.797491,1,0.32899}; @@ -686,7 +821,7 @@ class CfgCrafting }; class PartPlankPack : Item { - usedIn[] = {"KitStudWall","KitWoodFloor","KitWoodFoundation","KitWoodStairs","KitWoodRamp","KitWoodLadder","KitWoodTower","KitTiPi","KitWorkbench","KitSpikeTrap","KitMetalTrap"}; + usedIn[] = {"KitStudWall","KitWoodFloor","KitWoodFoundation","KitWoodStairs","KitWoodRamp","KitWoodLadder","KitWoodTower","KitTiPi","KitWorkbench","KitSpikeTrap","KitMetalTrap","KitWoodQuarterFloor","KitWoodHalfFloor","KitBarGate","KitBagBunker","KitWatchTower","KitLightPole","KitScaffolding"}; recipe[] = {{"WoodLog_EPOCH",2}}; previewPosition[] = {0.797837,1,0.288258}; previewScale = 0.2; @@ -739,13 +874,31 @@ class CfgCrafting }; class KitWoodFloor : Kit { - usedIn[] = {"KitWoodTower"}; - recipe[] = {{"PartPlankPack",4}}; + usedIn[] = {"KitWoodTower","KitBagBunker"}; + recipe[] = {{"PartPlankPack",8}}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; model = "\x\addons\a3_epoch_assets\models\Wooden_Floor.p3d"; previewPosition[] = {0.800198,1,0.262418}; previewScale = 0.055; previewVector = 3.6; + }; + class KitWoodHalfFloor : Kit + { + recipe[] = {{"PartPlankPack",4}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_assets_1\models\Half_Floor.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; + }; + class KitWoodQuarterFloor : Kit + { + recipe[] = {{"PartPlankPack",2}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_assets_1\models\Quarter_Floor.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; }; class KitWoodLadder : Kit { @@ -767,6 +920,7 @@ class CfgCrafting }; class KitTankTrap : Kit { + usedIn[] = {"KitVehicleUpgradeII_200_EPOCH"}; recipe[] = {{"ItemCorrugatedLg",1}}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\tank_trap.p3d"; @@ -800,6 +954,80 @@ class CfgCrafting previewPosition[] = {0.800653,1,0.378749}; previewScale = 0.05; previewVector = 0; + }; + class KitMetalFloor : Kit + { + usedIn[] = {"KitMetalTower"}; + recipe[] = {{"ItemCorrugatedLg",4}}; + nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0},{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_assets_1\models\metal_floor.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; + }; + class KitMetalHalfFloor : Kit + { + recipe[] = {{"ItemCorrugatedLg",2}}; + nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0},{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_community\models\metal_floor_half.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; + }; + class KitMetalQuarterFloor : Kit + { + recipe[] = {{"ItemCorrugatedLg",1}}; + nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0},{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_community\models\metal_floor_quarter.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; + }; + class KitMetalTower : Kit + { + recipe[] = {{"KitMetalFloor",1},{"ItemCorrugatedLg",2}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_community\Metal_Base_Tower\Metal_floor_tower.p3d"; + previewPosition[] = {0.800653,1,0.378749}; + previewScale = 0.05; + previewVector = 0; + }; + class KitCinderFloor : Kit + { + usedIn[] = {"KitCinderTower"}; + recipe[] = {{"CinderBlocks",4},{"MortarBucket",4}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_community\models\cinderfloor.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; + }; + class KitCinderHalfFloor : Kit + { + recipe[] = {{"CinderBlocks",2},{"MortarBucket",2}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_community\models\cinderfloor_half.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; + }; + class KitCinderQuarterFloor : Kit + { + recipe[] = {{"CinderBlocks",1},{"MortarBucket",1}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_community\models\cinderfloor_quarter.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; + }; + class KitCinderTower : Kit + { + recipe[] = {{"KitCinderFloor",1},{"CinderBlocks",2},{"MortarBucket",2}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_community\Cinder_Base_Tower\cinder_tower_upgrade.p3d"; + previewPosition[] = {0.800653,1,0.378749}; + previewScale = 0.05; + previewVector = 0; }; class KitTiPi : Kit { @@ -812,6 +1040,7 @@ class CfgCrafting }; class KitShelf : Kit { + usedIn[] = {"KitVehicleUpgradeIII_200_EPOCH"}; recipe[] = {{"ItemCorrugated",3}}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; model = "\x\addons\a3_epoch_assets\models\shelf.p3d"; @@ -853,6 +1082,24 @@ class CfgCrafting previewPosition[] = {0.797638,1,0.341915}; previewScale = 0.07; previewVector = 0; + }; + class Kit_Garden : Kit + { + recipe[] = {{"ItemRock",4},{"water_epoch",4},{"PartPlankPack",4}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\x\addons\a3_epoch_community\models\Farming\epoch_Garden.p3d"; + previewPosition[] = {0.800198,1,0.262418}; + previewScale = 0.055; + previewVector = 3.6; + }; + class KitBarbedWire : Kit + { + recipe[] = {{"ItemCorrugatedLg",2},{"ItemScraps",10},{"ItemRope",4}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "x\addons\a3_epoch_community\models\barbed_wire.p3d"; + previewPosition[] = {0.8,1,0.3}; + previewScale = 0.038; + previewVector = 0; }; class KitPlotPole : Kit { @@ -870,9 +1117,16 @@ class CfgCrafting previewScale = 0.19; previewVector = 3.3; }; + class SmeltingTools_EPOCH : Part + { + usedIn[] = {"ItemCopperBar","ItemCopperBar10oz","ItemGoldBar","ItemSilverBar","ItemGoldBar10oz","ItemSilverBar10oz"}; + previewPosition[] = {0.802374,1,0.26}; + previewScale = 0.19; + previewVector = 3.3; + }; class ItemCables : Item { - usedIn[] = {"KitSolarGen","KitPlotPole","ItemCopperBar"}; + usedIn[] = {"KitSolarGen","KitPlotPole","ItemCopperBar","KitVehicleUpgradeI_200_EPOCH"}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; recipe[] = {{"ItemCopperBar",1}}; previewPosition[] = {0.802374,1,0.26}; @@ -881,27 +1135,40 @@ class CfgCrafting }; class ItemCopperBar : Item { - usedIn[] = {"ItemCables"}; + usedIn[] = {"ItemCables","ItemCopperBar10oz","EnergyPack"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; - recipe[] = {{"ItemCables",1},{"water_epoch",1}}; + recipe[] = {{"ItemCables",1},{"water_epoch",1},{"SmeltingTools_EPOCH",1}}; + recipeReturn[] = {"SmeltingTools_EPOCH"}; previewPosition[] = {0.797144,1,0.27}; previewScale = 1.3; previewVector = 2.5; + }; + class ItemCopperBar10oz : Item + { + usedIn[] = {}; + nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; + recipe[] = {{"ItemCopperBar",10},{"water_epoch",1},{"SmeltingTools_EPOCH",1}}; + recipeReturn[] = {"SmeltingTools_EPOCH"}; + previewPosition[] = {0.797144,1,0.26}; + previewScale = 0.7; + previewVector = 2.5; }; class ItemGoldBar : Item { - usedIn[] = {"ItemGoldBar10oz"}; + usedIn[] = {"ItemGoldBar10oz","EnergyPackLg"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; - recipe[] = {{"PartOreGold",2},{"water_epoch",1}}; + recipe[] = {{"PartOreGold",2},{"water_epoch",1},{"SmeltingTools_EPOCH",1}}; + recipeReturn[] = {"SmeltingTools_EPOCH"}; previewPosition[] = {0.8,1,0.26}; previewScale = 2.5; previewVector = 2.5; }; class ItemSilverBar : Item { - usedIn[] = {}; + usedIn[] = {"ItemSilverBar10oz"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; - recipe[] = {{"PartOreSilver",2},{"water_epoch",1}}; + recipe[] = {{"PartOreSilver",2},{"water_epoch",1},{"SmeltingTools_EPOCH",1}}; + recipeReturn[] = {"SmeltingTools_EPOCH"}; previewPosition[] = {0.8,1,0.26}; previewScale = 2.5; previewVector = 2.5; @@ -910,7 +1177,18 @@ class CfgCrafting { usedIn[] = {"ItemBriefcaseGold100oz"}; nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; - recipe[] = {{"ItemGoldBar",10},{"water_epoch",1}}; + recipe[] = {{"ItemGoldBar",10},{"water_epoch",1},{"SmeltingTools_EPOCH",1}}; + recipeReturn[] = {"SmeltingTools_EPOCH"}; + previewPosition[] = {0.801715,1,0.331674}; + previewScale = 1.5; + previewVector = 0.3; + }; + class ItemSilverBar10oz : Item + { + usedIn[] = {"ItemBriefcaseSilver100oz"}; + nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; + recipe[] = {{"ItemSilverBar",10},{"water_epoch",1},{"SmeltingTools_EPOCH",1}}; + recipeReturn[] = {"SmeltingTools_EPOCH"}; previewPosition[] = {0.801715,1,0.331674}; previewScale = 1.5; previewVector = 0.3; @@ -923,17 +1201,26 @@ class CfgCrafting previewPosition[] = {0.8,1,0.42}; previewScale = 0.5; previewVector = 0; + }; + class ItemBriefcaseSilver100oz : Item + { + usedIn[] = {}; + nearby[] = {}; + recipe[] = {{"ItemSilverBar10oz",10},{"ItemBriefcaseE",1}}; + previewPosition[] = {0.8,1,0.42}; + previewScale = 0.5; + previewVector = 0; }; class ItemBriefcaseE : Part { - usedIn[] = {"ItemBriefcaseGold100oz"}; + usedIn[] = {"ItemBriefcaseGold100oz","ItemBriefcaseSilver100oz"}; previewPosition[] = {0.8,1,0.42}; previewScale = 0.5; previewVector = 0; }; class ItemBattery : Item { - usedIn[] = {"KitSolarGen","KitPlotPole"}; + usedIn[] = {"KitSolarGen","KitPlotPole","BarrelBomb_EPOCH_Remote_Mag","BarrelBomb2_EPOCH_Remote_Mag"}; nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; recipe[] = {{"EnergyPackLg",3},{"CircuitParts",1}}; previewPosition[] = {0.802374,1,0.276733}; @@ -956,6 +1243,381 @@ class CfgCrafting previewScale = 0.2; previewVector = -1.8; }; +/* + class KitVehicleUpgradeI_100_EPOCH : Kit //doc1 + { + recipe[] = { {"ItemVehDoc1",1}, {"CircuitParts",1}, {"ItemCables",1}, {"VehicleRepair",3} }; //update rest of items + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +*/ + class KitVehicleUpgradeI_200_EPOCH : Kit + { + recipe[] = { {"ItemVehDoc1",1}, {"CircuitParts",1}, {"ItemCables",1}, {"VehicleRepair",3} }; //update rest of items + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +/* + class KitVehicleUpgradeI_300_EPOCH : Kit + { + recipe[] = { {"ItemVehDoc1",1}, {"CircuitParts",1}, {"ItemCables",1}, {"VehicleRepair",3} }; //update rest of items + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +*/ +/* + class KitVehicleUpgradeII_100_EPOCH : Kit //doc2, tire + { + recipe[] = { {"ItemVehDoc2",1}, {"SpareTire",1}, {"KitTankTrap",2}, {"ItemAluminumBar10oz",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +*/ + class KitVehicleUpgradeII_200_EPOCH : Kit + { + recipe[] = { {"ItemVehDoc2",1}, {"SpareTire",1}, {"KitTankTrap",2}, {"ItemAluminumBar10oz",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +/* + class KitVehicleUpgradeII_300_EPOCH : Kit + { + recipe[] = { {"ItemVehDoc2",1}, {"SpareTire",1}, {"KitTankTrap",2}, {"ItemAluminumBar10oz",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +*/ +/* + class KitVehicleUpgradeIII_100_EPOCH : Kit //doc3, pipes + { + recipe[] = { {"ItemVehDoc3",1}, {"ItemPipe",2}, {"KitShelf",2}, {"ItemBurlap",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +*/ + class KitVehicleUpgradeIII_200_EPOCH : Kit + { + recipe[] = { {"ItemVehDoc3",1}, {"ItemPipe",2}, {"KitShelf",2}, {"ItemBurlap",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +/* + class KitVehicleUpgradeIII_300_EPOCH : Kit + { + recipe[] = { {"ItemVehDoc3",1}, {"ItemPipe",2}, {"KitShelf",2}, {"ItemBurlap",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +*/ +/* + class KitVehicleUpgradeIV_100_EPOCH : Kit //doc4 + { + recipe[] = { {"ItemVehDoc4",1}, {"CircuitParts",1}, {"ItemScraps",2}, {"jerrycan_epoch",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +*/ + class KitVehicleUpgradeIV_200_EPOCH : Kit + { + recipe[] = { {"ItemVehDoc4",1}, {"CircuitParts",1}, {"ItemScraps",2}, {"jerrycan_epoch",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +/* + class KitVehicleUpgradeIV_300_EPOCH : Kit + { + recipe[] = { {"ItemVehDoc4",1}, {"CircuitParts",1}, {"ItemScraps",2}, {"jerrycan_epoch",2} }; + previewPosition[] = {0.798208,1,0.227936}; + previewScale = 0.28; + previewVector = -0.5; + }; +*/ + class ItemVehDoc1 : Part + { + usedIn[] = {"KitVehicleUpgradeI_200_EPOCH"}; + previewPosition[] = {0.802374,1,0.26}; + previewScale = 1.2; + previewVector = 3.3; + }; + class ItemVehDoc2 : Part + { + usedIn[] = {"KitVehicleUpgradeII_200_EPOCH"}; + previewPosition[] = {0.802374,1,0.26}; + previewScale = 1.2; + previewVector = 3.3; + }; + class ItemVehDoc3 : Part + { + usedIn[] = {"KitVehicleUpgradeIII_200_EPOCH"}; + previewPosition[] = {0.802374,1,0.26}; + previewScale = 1.2; + previewVector = 3.3; + }; + class ItemVehDoc4 : Part + { + usedIn[] = {"KitVehicleUpgradeIV_200_EPOCH"}; + previewPosition[] = {0.802374,1,0.26}; + previewScale = 1.2; + previewVector = 3.3; + }; + class SpareTire : Part + { + recipe[] = {{"VehicleRepair",2},{"ItemDuctTape",1} }; + usedIn[] = {"KitVehicleUpgradeII_200_EPOCH"}; + previewPosition[] = {0.802374,1,0.26}; + previewScale = 0.45; + previewVector = 3.3; + }; + class ItemPipe : Part + { + usedIn[] = {"KitVehicleUpgradeIII_200_EPOCH","KitTentA","KitTentDome","KitScaffolding","KitSink","KitSunShade","KitWaterPump"}; + previewPosition[] = {0.802374,1,0.26}; + previewScale = 0.2; + previewVector = 0.5; + }; + class ItemCanvas : Item + { + usedIn[] = {"KitTentA","KitTentDome","KitSunShade","KitWatchTower","KitScaffolding"}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + recipe[] = {{"ItemKiloHemp",1}}; + previewPosition[] = {0.802443,1,0.254301}; + previewScale = 0.8; + previewVector = 4.9; + }; + class ItemBulb : Part + { + usedIn[] = {"KitLightPole","KitPortableLight_Single","KitPortableLight_Double"}; + previewPosition[] = {0.802443,1,0.254301}; + previewScale = 0.95; + previewVector = 4.9; + }; + class BarrelBomb_EPOCH_Remote_Mag : Kit + { + nearby[] = {{"Fire","","fire",{1,{"ALL"}},3,1,1,0}}; + recipe[] = {{"ItemBarrelE",1},{"jerrycan_epoch",3},{"ItemBattery",1},{"CircuitParts",1}}; + previewPosition[] = {0.79545,1,0.42}; + previewScale = 0.3; + previewVector = 0.3; + }; + class BarrelBomb2_EPOCH_Remote_Mag : BarrelBomb_EPOCH_Remote_Mag + { + previewPosition[] = {0.79545,1,0.234395}; + previewScale = 0.2; + previewVector = 0.1; + }; + class ItemBarrelE : Part + { + usedIn[] = {"BarrelBomb_EPOCH_Remote_Mag","BarrelBomb2_EPOCH_Remote_Mag","KitBurnBarrel"}; + previewPosition[] = {0.79545,1,0.234395}; + previewScale = 0.2; + previewVector = 0.1; + }; + class KitTentA : Kit + { + recipe[] = {{"ItemCanvas",2},{"ItemPipe",3}}; + model = "\x\addons\a3_epoch_community\models\tent_camo.p3d"; + previewPosition[] = {0.8,1,0.3}; + previewScale = 0.5; + previewVector = 0.3; + }; + class KitTentDome : Kit + { + recipe[] = {{"ItemCanvas",3},{"ItemPipe",4}}; + model = "\x\addons\a3_epoch_community\models\tent_dome.p3d"; + previewPosition[] = {0.8,1,0.3}; + previewScale = 0.5; + previewVector = 0.3; + }; + class ItemWaterPurificationTablets : Part + { + usedIn[] = {"ItemBottlePlastic_Clean","ItemCanteen_Clean"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1; + previewVector = 1; + }; + class ItemBottlePlastic_Empty : Part + { + usedIn[] = {"ItemBottlePlastic_Dirty"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1; + previewVector = 1; + }; + class ItemBottlePlastic_Dirty: Item + { + usedIn[] = {"ItemBottlePlastic_Clean"}; + nearby[] = {{"Water source","","water",{2,{"water"}},3,1,0,0}}; + recipe[] = {"ItemBottlePlastic_Empty"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1; + previewVector = 1; + }; + class ItemBottlePlastic_Clean : Item + { + recipe[] = {"ItemBottlePlastic_Dirty","ItemWaterPurificationTablets"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1; + previewVector = 1; + }; + class ItemCanteen_Empty : Part + { + usedIn[] = {"ItemCanteen_Dirty"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1; + previewVector = 1; + }; + class ItemCanteen_Dirty : Item + { + usedIn[] = {"ItemCanteen_Clean"}; + nearby[] = {{"Water source","","water",{2,{"water"}},3,1,0,0}}; + recipe[] = {"ItemCanteen_Empty"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1; + previewVector = 1; + }; + class ItemCanteen_Clean : Item + { + usedIn[] = {}; + recipe[] = {"ItemCanteen_Dirty","ItemWaterPurificationTablets"}; + previewPosition[] = {0.8,1,0.26}; + previewScale = 1; + previewVector = 1; + }; + class lighter_epoch : Part + { + usedIn[] = {"KitBurnBarrel"}; + previewPosition[] = {0.79545,1,0.234395}; + previewScale = 2.5; + previewVector = -90; + }; + class KitBurnBarrel : Kit + { + recipe[] = {{"ItemBarrelE",1},{"jerrycan_epoch",1},{"WoodLog_EPOCH",3},{"lighter_epoch",1}}; + model = "\A3\Structures_F\Items\Vessels\MetalBarrel_empty_F.p3d"; + previewPosition[] = {0.8,1,0.26}; + previewScale = 0.30; + }; + class KitLightPole : Kit + { + recipe[] = {{"ItemBulb",1},{"ItemCables",1},{"ItemBattery",1},{"ItemCorrugated",1},{"PartPlankPack",4}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\A3\Structures_F\Civ\Lamps\LampShabby_F.p3d"; + previewPosition[] = {0.796787,1,0.27}; + previewScale = 0.040; + previewVector = 0; + }; + class KitFieldToilet : Kit + { + recipe[] = {{"ItemCorrugatedLg",2},{"ItemCorrugated",2}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\A3\Structures_F\Civ\Camping\FieldToilet_F.p3d"; + previewPosition[] = {0.796787,1,0.27}; + previewScale = 0.1; + previewVector = 0; + }; + class KitScaffolding : Kit + { + recipe[] = {{"ItemPipe",16},{"PartPlankPack",2},{"ItemRope",12},{"ItemCanvas",4}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\A3\Structures_F\Civ\Constructions\Scaffolding_F.p3d"; + previewPosition[] = {0.8,1,0.27}; + previewScale = 0.02; + previewVector = 0; + }; + class KitSink : Kit + { + recipe[] = {{"ItemCorrugatedLg",2},{"ItemPipe",1},{"ItemCorrugated",2}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\A3\Structures_F\Civ\Accessories\Sink_F.p3d"; + previewPosition[] = {0.8,1,0.27}; + previewScale = 0.15; + previewVector = 0; + }; + class KitPortableLight_Single : Kit + { + recipe[] = {{"ItemBulb",1},{"ItemCables",1},{"ItemBattery",1},{"ItemCorrugatedLg",1},{"CircuitParts",1}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\A3\Structures_F_EPA\Civ\Constructions\PortableLight_single_F.p3d"; + previewPosition[] = {0.796787,1,0.27}; + previewScale = 0.1; + previewVector = 0; + }; + class KitPortableLight_Double : Kit + { + recipe[] = {{"ItemBulb",2},{"ItemCables",2},{"ItemBattery",1},{"ItemCorrugatedLg",1},{"CircuitParts",2}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\A3\Structures_F_EPA\Civ\Constructions\PortableLight_double_F.p3d"; + previewPosition[] = {0.796787,1,0.27}; + previewScale = 0.1; + previewVector = 0; + }; + class KitWatchTower : Kit + { + recipe[] = {{"PartPlankPack",8},{"ItemRope",4},{"ItemCanvas",2}}; + model = "\A3\Structures_F_EPC\Civ\Accessories\LifeguardTower_01_F.p3d"; + previewPosition[] = {0.796787,1,0.27}; + previewScale = 0.040; + previewVector = 0; + }; + class KitSunShade : Kit + { + recipe[] = {{"ItemCanvas",1},{"ItemPipe",1},{"ItemRope",1},{"ItemStick",4}}; + nearby[] = {{"Workbench","","workbench",{1,{"WorkBench_EPOCH"}},3,1,0,1}}; + model = "\A3\Structures_F_EPC\Civ\Camping\Sunshade_03_F.p3d"; + previewPosition[] = {0.796787,1,0.27}; + previewScale = 0.09; + previewVector = 0; + }; + class KitSandbagWall : Kit + { + recipe[] = {{"ItemBurlap",2},{"MortarBucket",2}}; + model = "A3\Structures_F\Mil\BagFence\BagFence_Short_F.p3d"; + previewPosition[] = {0.8,1,0.27}; + previewScale = 0.17; + previewVector = 0; + }; + class KitSandbagWallLong : Kit + { + recipe[] = {{"ItemBurlap",4},{"MortarBucket",4}}; + model = "A3\Structures_F\Mil\BagFence\BagFence_Long_F.p3d"; + previewPosition[] = {0.8,1,0.27}; + previewScale = 0.12; + previewVector = 0; + }; + class KitBagBunker : Kit + { + recipe[] = {{"ItemBurlap",8},{"MortarBucket",8},{"KitWoodFloor",1},{"PartPlankPack",2}}; + model = "\A3\Structures_F\Mil\BagBunker\BagBunker_Small_F.p3d"; + previewPosition[] = {0.8,1,0.27}; + previewScale = 0.055; + previewVector = 0; + }; + class KitBarGate : Kit + { + recipe[] = {{"PartPlankPack",6},{"CinderBlocks",1}}; + model = "\A3\Structures_F\Walls\BarGate_F.p3d"; + previewPosition[] = {0.8,1,0.26}; + previewScale = 0.035; + previewVector = 0; + }; + class KitWaterPump : Kit + { + recipe[] = {{"CinderBlocks",4},{"MortarBucket",4},{"ItemPipe",2},{"ItemCorrugated",2}}; + model = "\A3\Structures_F\Civ\Accessories\Water_source_F.p3d"; + previewPosition[] = {0.8,1,0.27}; + previewScale = 0.09; + previewVector = 0; + }; }; /*[[[end]]]*/ diff --git a/Sources/epoch_config/Configs/CfgDynamicHUD.hpp b/Sources/epoch_config/Configs/CfgDynamicHUD.hpp index a36ae37a..0a5f38c5 100644 --- a/Sources/epoch_config/Configs/CfgDynamicHUD.hpp +++ b/Sources/epoch_config/Configs/CfgDynamicHUD.hpp @@ -15,8 +15,8 @@ defaultPopulate: 1 - left 2 - down 3 - up - 4 - horizontal grow - 5 - vertical grow + 4 - horizontal grow (starts from center, evens on left, odds on right) + 5 - vertical grow (same as above) offSetX: Positive = right, Negative = left offSetY: Positive = down, Negative = up @@ -45,7 +45,7 @@ class rmx_dynamicHUD { class topRight { - classname = "RscPicture"; + classname = "RscPictureKeepAspect"; defaultPos = 2; defaultPopulate = 1; arraySize = 10; @@ -56,14 +56,52 @@ class rmx_dynamicHUD angle[] = {-5,0.5,0.5,0.5}; scale[] = {1,0.05}; }; - class botcenter + class fav_pic_bg + { + classname = "RscPictureKeepAspect"; + defaultPos = 7; + defaultPopulate = 0; + arraySize = 5; + width = 4; + height = 4; + }; + class fav_pic + { + classname = "RscPictureKeepAspect"; + defaultPos = 7; + defaultPopulate = 0; + arraySize = 5; + width = 4; + height = 4; + }; + class fav_equipped { classname = "RscPicture"; defaultPos = 7; - defaultPopulate = 4; - arraySize = 9; - width = 5; - height = 5; + defaultPopulate = 0; + arraySize = 5; + width = 4; + height = 4; + }; + class fav_keymap + { + classname = "fav_keymap"; + defaultPos = 7; + defaultPopulate = 0; + arraySize = 5; + width = 4; + height = 1; + }; + class geigerCounter + { + classname = "RscPicture"; + defaultPos = 8; + defaultPopulate = 3; + arraySize = 8; + width = 10; + height = 2.5; + offSetX = -0.25; + offSetY = -1; }; }; diff --git a/Sources/epoch_config/Configs/CfgDynamicSimulation.hpp b/Sources/epoch_config/Configs/CfgDynamicSimulation.hpp new file mode 100644 index 00000000..2f716b87 --- /dev/null +++ b/Sources/epoch_config/Configs/CfgDynamicSimulation.hpp @@ -0,0 +1,16 @@ +class CfgDynamicSimulation +{ + //If this is false none of the below settings matter + enableDynamicSimulationSystem = true; + + //Individual toggles for testing + vehicleDynamicSimulationSystem = true; // type car, air, boat + playerDynamicSimulationSystem = true; // clients + baseDynamicSimulationSystem = true; // plot pole and base pieces + + // Distances and Coef + groupDynSimDistance = 1600; + vehicleDynSimDistance = 1600; + emptyVehicleDynSimDistance = 1600; + propDynSimDistance = 1600; +}; \ No newline at end of file diff --git a/Sources/epoch_config/Configs/CfgEpochClient.hpp b/Sources/epoch_config/Configs/CfgEpochClient.hpp index 848b2dc9..0c7996f6 100644 --- a/Sources/epoch_config/Configs/CfgEpochClient.hpp +++ b/Sources/epoch_config/Configs/CfgEpochClient.hpp @@ -14,11 +14,19 @@ /*[[[cog from arma_config_tools import *; json_to_arma()]]]*/ class CfgEpochClient { - epochVersion = "0.5.0.0"; - ArmAVersion = 168; - sapperRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100 - droneRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100 - zombieRngChance = 50; // increase number to reduce chances and reduce to increase. Default 50 + epochVersion = "1.0.0"; + ArmAVersion = 176; + debug = "true"; // true = enable extra rpt debug lines, false to disable + + antagonistRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100 + outOfBoundsRadiation = 10; // how much rads per tick (10sec), when outside play area. + radioactiveLocations[] = {"NameCityCapital", "NameCity", "Airport"}; // used for random radioactive locations and to suppress animal spawns within cities. + radiatedObjMaxFalloutDist = 125; // max distance radiated object can affect player (number in meters) + geigerCounterEnergyUsage = 10; // default loss of 10 energy every 10sec of use + + baseHungerLoss = 2; // increase number to speed up rate of Hunger loss + baseThirstLoss = 2; // increase number to speed up rate of Thirst loss + accelerateHTALoss = "true"; // use server's time acceleration to increase the rate of Hunger, Thirst and Alcohol loss buildingNearbyMilitary = 0; //1 to allow building nearby buildingNearbyMilitaryRange = 300; //Define radius of blocked area @@ -30,16 +38,16 @@ class CfgEpochClient jammerPerGroup = 1; // allowed number of jammers per group. jammerGLOnly = 1; // allow only group leader to place Jammer minJammerDistance = 650; // min distance to next Jammer - maxBuildingHeight = 33; // Max Height, building is allowed. + maxBuildingHeight = 100; // Max Height, building is allowed. buildingCountLimit = 200; //overall building limit in range of jammer (overridden if "useGroupCountLimits=1") storageCountLimit = 100; //overall storage limit in range of jammer (triggers only if "splitCountLimits=1" & "useGroupCountLimits=0") splitCountLimits = 0; //1 = distinguish buildingCountLimit from storageCountLimit (ex.: buildingCountLimit=100, storageCountLimit=100 >> you can build 100 baseparts AND additional 100 storage objects like safes, lockboxes...) useGroupCountLimits = 1; //1 = enable leader and member counts (doesn´t affect "splitCountLimits") - buildingCountLeader = 125; //ignore if "useGroupCountLimits=0" + buildingCountLeader = 250; //ignore if "useGroupCountLimits=0" buildingCountPerMember = 5; //ignore if "useGroupCountLimits=0" storageCountLeader = 10; //ignore if "splitCountLimits=0" & "useGroupCountLimits=0" storageCountPerMember = 5; //ignore if "splitCountLimits=0" & "useGroupCountLimits=0" - maxdoors = 8; // Max allowed doors per Group + maxdoors = 10; // Max allowed doors per Group maxgates = 5; // Max allowed Gates per Group disableRemoteSensors = "true"; // disableRemoteSensors true/false @@ -50,17 +58,100 @@ class CfgEpochClient EPOCH_news[] = {"Word is that Sappers have a new boss.","Dogs will often lure them monsters away.","My dog was blown up. I miss him.."}; deathMorphClass[] = {"Epoch_Sapper_F","Epoch_SapperG_F","Epoch_SapperB_F","I_UAV_01_F","Epoch_Cloak_F"}; //Random selection of these classes when player morphs after death. Currently available: Epoch_Cloak_F, Epoch_SapperB_F, Epoch_Sapper_F, I_UAV_01_F - niteLight[] = {1,1.88,22}; //Set ambient lighting at night: {Brightness of light,Height of light}. Default (Low Ambient): {1.88,22} | Twilight: {7.2,88} | Distant: {12.8,142} + niteLight[] = {0,1.88,22}; // 0 = disabled or 1 = enabled, Set ambient lighting at night: {Brightness of light,Height of light}. Default (Low Ambient): {1.88,22} | Twilight: {7.2,88} | Distant: {12.8,142} ryanZombiesEnabled = "true"; - antagonistSpawnIndex[] = {{"Epoch_Cloak_F",1},{"GreatWhite_F",2},{"Epoch_Sapper_F",2},{"Epoch_SapperG_F",1},{"Epoch_SapperB_F",1},{"I_UAV_01_F",2},{"PHANTOM",1},{"B_Heli_Transport_01_F",1},{"EPOCH_RyanZombie_1",12},{"I_Soldier_EPOCH",1}}; // {"type", limit} - customVarsDefaults[] = {{"Temp",98.6,{106.7,95,102,105,96,95}},{"Hunger",1500,{5000,0,5001,5001,1250,0}},{"Thirst",750,{2500,0,2501,2501,625,0}},{"AliveTime",0,{-2,0}},{"Energy",0,{2500,0}},{"Wet",0,{100,0,35,55,-1,-1}},{"Soiled",0,{100,0,35,55,-1,-1}},{"Immunity",0,{100,0}},{"Toxicity",0,{100,0,35,55,-1,-1}},{"Stamina",100,{"EPOCH_playerStaminaMax",0}},{"Crypto",0,{250000,0}},{"HitPoints",{0,0,0,0},{1,0,0.5,1,-1,-1}},{"BloodP",100,{190,0,120,140,70,50}},{"SpawnArray",{},{}},{"Karma",0,{50000,-50000}},{"Alcohol",0,{100,0,35,55,-1,-1}},{"Radiation",0,{100,0,35,55,-1,-1}},{"Nuisance",0,{100,0}},{"MissionArray",{},{}}}; // EPOCH_player + varName, default value, {max,min,high-warn,high-critical,low-warn,low-critical} - hudConfigs[] = {{{"BloodP","","",{"getPlayerDamage",">=",0.7}},"topRight","x\addons\a3_epoch_code\Data\UI\bleeding_ca.paa",{"forceUpdate"}},{{"Oxygen","getPlayerOxygenRemaining","",{},{1,0,2,2,1,0.55}},"topRight","x\addons\a3_epoch_code\Data\UI\oxygen_ca.paa"},{"Hunger","topRight","x\addons\a3_epoch_code\Data\UI\hunger_ca.paa",{"forceBloodRise"}},{"Thirst","topRight","x\addons\a3_epoch_code\Data\UI\thirst_ca.paa",{"forceBloodRise"}},{"Temp","topRight",{"x\addons\a3_epoch_code\Data\UI\hot_ca.paa","x\addons\a3_epoch_code\Data\UI\cold_ca.paa"},{"forceFatigue"}},{"Toxicity","topRight","x\addons\a3_epoch_code\Data\UI\hazzard_ca.paa"},{"Alcohol","topRight","x\addons\a3_epoch_code\Data\UI\drunk_ca.paa"},{"Soiled","topRight","x\addons\a3_epoch_code\Data\UI\soiled_ca.paa"},{"Radiation","topRight","x\addons\a3_epoch_code\Data\UI\rads_ca.paa"},{{"HitPoints","getPlayerHitPointDamage","HitLegs"},"topRight","x\addons\a3_epoch_code\Data\UI\broken_ca.paa"}}; + + antagonistChances[] = { + // {"type", chance} + "Epoch_Cloak_F",0.06, + "GreatWhite_F",0, + "Epoch_Sapper_F",0.12, + "Epoch_SapperG_F",0.06, + "Epoch_SapperB_F",0.03, + "I_UAV_01_F",0.12, + "PHANTOM",0.03, + "B_Heli_Transport_01_F",0, + "EPOCH_RyanZombie_1",0.12, + "I_Soldier_EPOCH",0 + }; + + antagonistSpawnIndex[] = { + // {"type", limit} + {"Epoch_Cloak_F",1}, + {"GreatWhite_F",2}, + {"Epoch_Sapper_F",2}, + {"Epoch_SapperG_F",1}, + {"Epoch_SapperB_F",1}, + {"I_UAV_01_F",2}, + {"PHANTOM",1}, + {"B_Heli_Transport_01_F",1}, + {"EPOCH_RyanZombie_1",12}, + {"I_Soldier_EPOCH",1} + }; + customVarsDefaults[] = { + // EPOCH_player + varName, default value, {max,min,high-warn,high-critical,low-warn,low-critical} + {"Temp",98.6,{106.7,95,102,105,96,95}}, + {"Hunger",1500,{5000,0,5001,5001,1250,0}}, + {"Thirst",750,{2500,0,2501,2501,625,0}}, + {"AliveTime",0,{-2,0}}, // local + {"Energy",0,{2500,0}}, + {"Wet",0,{100,0,35,55,-1,-1}}, + {"Soiled",0,{100,0,35,55,-1,-1}}, + {"Immunity",0,{100,0}}, + {"Toxicity",0,{100,0,35,55,-1,-1}}, + {"Stamina",100,{"EPOCH_playerStaminaMax",0}}, + {"Crypto",0,{250000,0}}, + {"HitPoints",{0,0,0,0},{1,0,0.5,1,-1,-1}}, // limits here only used for HUD. + {"BloodP",100,{190,0,120,140,70,50}}, + {"SpawnArray",{},{}}, + {"NotUsed",0,{50000,-50000}}, // TODO remove or replace + {"Alcohol",0,{100,0,35,55,-1,-1}}, + {"Radiation",0,{100,0,35,55,-1,-1}}, // local + {"Nuisance",0,{100,0}}, + {"MissionArray",{},{}} + }; + // Vars and the value that gets set if godmode is enabled + gmVars[] = { + {"Temp",98.6}, + {"Hunger",2500}, + {"Thirst",1500}, + {"Energy",2500}, + {"Toxicity",0}, + {"Stamina",100}, + {"BloodP",100}, + {"Alcohol",0}, + {"Radiation",0} + }; + hudConfigs[] = { + {{"BloodP","","",{"getPlayerDamage",">=",0.7}},"topRight","x\addons\a3_epoch_code\Data\UI\bleeding_ca.paa",{"forceUpdate"}}, + {{"Oxygen","getPlayerOxygenRemaining","",{},{1,0,2,2,1,0.55}},"topRight","x\addons\a3_epoch_code\Data\UI\oxygen_ca.paa"}, + {"Hunger","topRight","x\addons\a3_epoch_code\Data\UI\hunger_ca.paa",{"forceBloodRise"}}, + {"Thirst","topRight","x\addons\a3_epoch_code\Data\UI\thirst_ca.paa",{"forceBloodRise"}}, + {"Temp","topRight",{"x\addons\a3_epoch_code\Data\UI\hot_ca.paa","x\addons\a3_epoch_code\Data\UI\cold_ca.paa"},{{"forceFatigue","forceBloodRise"},{"forceFatigue","forceBloodDrop"}}}, + {"Toxicity","topRight","x\addons\a3_epoch_code\Data\UI\hazzard_ca.paa",{"forceBloodRise"}}, + {"Alcohol","topRight","x\addons\a3_epoch_code\Data\UI\drunk_ca.paa"}, + {"Soiled","topRight","x\addons\a3_epoch_code\Data\UI\soiled_ca.paa"}, + {"Radiation","topRight","x\addons\a3_epoch_code\Data\UI\rads_ca.paa",{"forceBloodRise"}}, + {{"HitPoints","getPlayerHitPointDamage","HitLegs"},"topRight","x\addons\a3_epoch_code\Data\UI\broken_ca.paa"} + }; + defineCommunityStats[] = { + // EPOCH_total + varName, starting value, {min,max or custom values} + {"Karma",1500,{-50000,50000,{-5000,-15000,-30000},{5000,15000,30000}}}, // min, max, {Work In Progress levels} + {"Murders",0,{}}, + {"Deaths",0,{}}, + {"Suicides",0,{0,99999,500}}, // min, max, "Suicide King" status + {"Revives",0,{0,99999,500}}, // min, max, "Medic" status + {"TraderMissions",0,{}}, + {"AIKills",0,{}}, + {"AntagonistKills",0,{}}, + {"ZombieKills",0,{}} + }; group_upgrade_lvl[] = {4,"1000",6,"1500",8,"2000",10,"2500",12,"3000",14,"3500",16,"4000",32,"8000",64,"16000"}; // controls max group limit and cost // Event handler code displayAddEventHandler[] = {"keyDown","keyUp"}; keyDown = "(_this call EPOCH_KeyDown)"; keyUp = "(_this call EPOCH_KeyUp)"; - addEventHandler[] = {"Respawn","Put","Take","InventoryClosed","InventoryOpened","FiredMan","Killed","HandleRating","GetInMan","GetOutMan"}; + addEventHandler[] = {"Respawn","Put","Take","InventoryClosed","InventoryOpened","FiredMan","Killed","HandleRating","HandleScore","GetInMan","GetOutMan"}; Respawn = "(_this select 0) call EPOCH_clientRespawn"; Put = "(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler;_this call Epoch_custom_EH_Put"; Take = "(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck;_this call Epoch_custom_EH_Take"; @@ -68,7 +159,8 @@ class CfgEpochClient InventoryClosed = "_this call EPOCH_InventoryClosed;_this call EPOCH_custom_EH_InventoryClosed"; InventoryOpened = "_this call EPOCH_InventoryOpened||_this call EPOCH_custom_EH_InventoryOpened"; // the || here allows either function to block opening of inventory by returning true. Killed = "_this call EPOCH_fnc_playerDeath;_this call Epoch_custom_EH_Killed"; - HandleRating = "EPOCH_playerKarma = EPOCH_playerKarma + (_this select 1);0"; + HandleRating = "0"; + HandleScore = ""; HandleDamage = ""; HandleHeal = ""; Dammaged = ""; @@ -86,13 +178,59 @@ class CfgEpochClient playerKilledScreen = "TapOut2"; playerDisableRevenge = 0; playerRevengeMinAliveTime = 900; + playerLocationMarkerGPSOnly = 1; // Map marker toggle in map dyna menu with assigned GPS only + playerDeathMarkerGPSOnly = 1; // Map marker toggle in map dyna menu on death with assigned GPS only + mapOnZoomSetMarkerSize = 1; // When in map markers will change to larger size as player zooms in bankTransferTime[] = {0.0006,1.2,0.06}; + + // Favorite Bar + Fav_enableFavoriteBar = "true"; // If disabled, players will not be able to use favorite bar + Fav_DropIfOverflow = "false"; // If enabled and inventory full, equipped weapon will be dropped on ground in favor for the new selected weapon, otherwise action will fail with message and weapon will not be equipped + Fav_FastWeaponSwitching = "false"; // If enabled, same slot weapons from favorites bar are equipped instantly, otherwise reload action is played (recommended for immersion) + Fav_BannedItems[] = {"FAK"}; // Items that users are not allowed to pin + + // Advanced Vehicle Repair + UseAdvancedVehicleRepair = "true"; // Switch On / Off Advanced Vehicle Repair (Does not effect SuppressedCraftingItems !) + EnableRemoveParts = "true"; // Enable removing Tires / Engines from Vehicles + DisallowSellOnDamage = "false"; // Prevent from selling Vehicles with one or more fully damaged wheel or engine + SuppressedCraftingItems[] = { // These Items can not be crafted (but can be used in recipe) + "VehicleRepairLg", // Supressed for Advanced Vehicle Repair (no longer needed) + "KitMetalQuarterFloor", // Item is Upgradeable, but you can remove it here to make it also Craftable + "KitMetalHalfFloor", // Item is Upgradeable, but you can remove it here to make it also Craftable + "KitMetalFloor", // Item is Upgradeable, but you can remove it here to make it also Craftable + "KitMetalTower", // Item is Upgradeable, but you can remove it here to make it also Craftable + "KitCinderQuarterFloor", // Item is Upgradeable, but you can remove it here to make it also Craftable + "KitCinderHalfFloor", // Item is Upgradeable, but you can remove it here to make it also Craftable + "KitCinderFloor", // Item is Upgradeable, but you can remove it here to make it also Craftable + "KitCinderTower" // Item is Upgradeable, but you can remove it here to make it also Craftable + }; + VehicleRepairs[] = { // {Hitpoint, dmg to repair, dmg to replace, mat to repair, mat to replace} + {"HitHull",0.33,0.66,"ItemScraps","ItemCorrugated"}, + {"HitBody",0.33,1,"ItemScraps","ItemCorrugated"}, + {"HitLFWheel",0.33,1,"VehicleRepair","SpareTire"}, + {"HitLF2Wheel",0.33,1,"VehicleRepair","SpareTire"}, + {"HitLMWheel",0.33,1,"VehicleRepair","SpareTire"}, + {"HitLBWheel",0.33,1,"VehicleRepair","SpareTire"}, + {"HitRFWheel",0.33,1,"VehicleRepair","SpareTire"}, + {"HitRF2Wheel",0.33,1,"VehicleRepair","SpareTire"}, + {"HitRMWheel",0.33,1,"VehicleRepair","SpareTire"}, + {"HitRBWheel",0.33,1,"VehicleRepair","SpareTire"}, + {"HitEngine",0.33,0.91,"EngineParts","EngineBlock"}, + {"glass",0.33,1,"ItemGlass","ItemGlass"}, + {"HitFuel",0.1,0.66,"ItemDuctTape","FuelTank"}, + {"HitHRotor",0.33,1,"ItemCorrugated","ItemRotor"}, + {"HitVRotor",0.33,1,"ItemCorrugated","ItemRotor"}, + {"HitWinch",0.33,0.91,"ItemCables","ItemCables"}, + {"HitAvionics",0.33,0.91,"CircuitParts","CircuitParts"} + }; + // include configs #include "CfgEpochClient\Altis.hpp" #include "CfgEpochClient\australia.hpp" #include "CfgEpochClient\Bornholm.hpp" #include "CfgEpochClient\Chernarus_Summer.hpp" #include "CfgEpochClient\Chernarus.hpp" + #include "CfgEpochClient\ChernarusRedux.hpp" #include "CfgEpochClient\Esseker.hpp" #include "CfgEpochClient\ProvingGrounds_PMC.hpp" #include "CfgEpochClient\Sara_dbe1.hpp" @@ -104,6 +242,7 @@ class CfgEpochClient #include "CfgEpochClient\vr.hpp" #include "CfgEpochClient\Zargabad.hpp" #include "CfgEpochClient\Tanoa.hpp" + #include "CfgEpochClient\Malden.hpp" #include "CfgEpochClient\WorldInteractions.hpp" }; class CfgEpochSoldier diff --git a/Sources/epoch_config/Configs/CfgEpochClient/ChernarusRedux.hpp b/Sources/epoch_config/Configs/CfgEpochClient/ChernarusRedux.hpp new file mode 100644 index 00000000..88264821 --- /dev/null +++ b/Sources/epoch_config/Configs/CfgEpochClient/ChernarusRedux.hpp @@ -0,0 +1,33 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Epoch gamemode config for Chernarus Redux + + 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_config/Configs/CfgEpochClient/ChernarusRedux.hpp +*/ +class ChernarusRedux { + blockedArea[] = { + { { 10203, 1886, 0 }, 430 }, //South Electro + { { 6822, 2498, 0 }, 600 }, //Cherno + { { 4612, 9670, 0 }, 140 }, //NWAF south barack + { { 4907, 10117, 0 }, 250 }, //NWAF NE hangas + { { 4707, 10384, 0 }, 200 }, //NWAF north barack + { { 4069, 10778, 0 }, 75 }, //NWAF west hangas + { { 4553, 10722, 0 }, 150 }, //NWAF NW hangas + { { 12279, 9505, 0 }, 350 }, //Berenzino Mid + { { 12816, 9816, 0 }, 400 }, //Berenzino SE + { { 12991, 10147, 0 }, 375 }, //Berenzino Docs + { { 2693, 5138, 0 }, 200 }, //Zeleno + { { 11467, 7508, 0 }, 150 }, //Polana Factory + { { 13092, 7096, 0 }, 140 } //Solnichniy Factory + }; + // main config + TrashClasses[] = { "Trash", "TrashSmall", "TrashVehicle", "PumpkinPatch", "TrashFood", "HempFiber" }; +}; diff --git a/Sources/epoch_code/compile/EPOCH_replaceWord.sqf b/Sources/epoch_config/Configs/CfgEpochClient/Malden.hpp similarity index 54% rename from Sources/epoch_code/compile/EPOCH_replaceWord.sqf rename to Sources/epoch_config/Configs/CfgEpochClient/Malden.hpp index 40fed42e..1d612458 100644 --- a/Sources/epoch_code/compile/EPOCH_replaceWord.sqf +++ b/Sources/epoch_config/Configs/CfgEpochClient/Malden.hpp @@ -4,13 +4,16 @@ Contributors: Description: - Code to replace string in word + Epoch gamemode config for Malden 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_code/compile/EPOCH_replaceWord.sqf + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_config/Configs/CfgEpochClient/Malden.hpp */ -params ["_STRING","_needle","_replace"]; -_STRING splitString _needle joinString _replace +class Malden { + blockedArea[] = {}; + // main config + TrashClasses[] = { "Trash", "TrashSmall", "TrashVehicle", "PumpkinPatch", "TrashFood", "HempFiber" }; +}; diff --git a/Sources/epoch_config/Configs/CfgEpochClient/WorldInteractions.hpp b/Sources/epoch_config/Configs/CfgEpochClient/WorldInteractions.hpp index 9003c6b4..d5799be7 100644 --- a/Sources/epoch_config/Configs/CfgEpochClient/WorldInteractions.hpp +++ b/Sources/epoch_config/Configs/CfgEpochClient/WorldInteractions.hpp @@ -1,4 +1,7 @@ class CfgWorldInteractions { + class Ore { + ore = 1; + }; class Water { water = 1; }; @@ -56,6 +59,8 @@ class CfgWorldInteractions { class watertank_02_f_p3d : Water {}; class watertank_04_f_p3d : Water {}; class watertank_03_f_p3d : Water {}; + class Sink_EPOCH : Water {}; + class WaterPump_EPOCH : Water {}; class atm_01_f_p3d : bankTerminal {}; class phonebooth_01_f_p3d : bankTerminal {}; class atm_02_f_p3d : bankTerminal {}; @@ -70,6 +75,14 @@ class CfgWorldInteractions { class Land_Atm_01_F : bankTerminal {}; class Land_Atm_02_F : bankTerminal {}; class Land_Laptop_device_F : bankTerminal {}; + class Land_ATM_01_malden_F : bankTerminal {}; + class Land_ATM_02_malden_F : bankTerminal {}; + class Land_PhoneBooth_01_malden_F : bankTerminal {}; + class Land_PhoneBooth_02_malden_F : bankTerminal {}; + class atm_01_malden_f_p3d : bankTerminal {}; + class atm_02_malden_f_p3d : bankTerminal {}; + class phonebooth_01_malden_f_p3d : bankTerminal {}; + class phonebooth_02_malden_f_p3d : bankTerminal {}; class sharpstone_03_lc_p3d : Rocks {}; class sharpstone_02_lc_p3d : Rocks {}; class sharpstone_01_lc_p3d : Rocks {}; @@ -167,6 +180,16 @@ class CfgWorldInteractions { class lavastone_big_f_p3d : Rocks {}; class lavastone_small_f_p3d : Rocks {}; class cliff_surfacemine_f_p3d : Rocks {}; + class limestone_01_01_f_p3d : Rocks {}; + class limestone_01_02_f_p3d : Rocks {}; + class limestone_01_03_f_p3d : Rocks {}; + class limestone_01_01_lc_f_p3d : Rocks {}; + class limestone_01_02_lc_f_p3d : Rocks {}; + class limestone_01_03_lc_f_p3d : Rocks {}; + class limestone_01_apart_f_p3d : Rocks {}; + class limestone_01_erosion_f_p3d : Rocks {}; + class limestone_01_monolith_f_p3d : Rocks {}; + class limestone_01_spike_f_p3d : Rocks {}; class p_fiberplant_ep1_p3d : HempFiber {}; class p_pumpkin_summer_p3d : PumpkinPatch {}; class pumpkin_p3d : PumpkinPatch {}; @@ -266,6 +289,7 @@ class CfgWorldInteractions { class boat_01_abandoned_red_f_p3d : Trash {}; class grave_01_f_p3d : Trash {}; class grave_03_f_p3d : Trash {}; + class Land_GarbageBarrel_01_english_F : Trash {}; class misc_postbox_p3d : TrashSmall {}; class garbagebin_02_f_p3d : TrashSmall {}; class t_ficusb1s_f_p3d : Trees {}; @@ -460,6 +484,39 @@ class CfgWorldInteractions { class t_rhizophora_f_p3d : Trees {}; class t_cacao_ripe_f_p3d : Trees {}; class d_treestump_cut_large_f_p3d : Trees {}; + class t_cupressus_stricta_2s_f_p3d : Trees {}; + class t_cupressus_stricta_3s_f_p3d : Trees {}; + class t_ficus_3d_f_p3d : Trees {}; + class t_phoenixrupicola1s_f_p3d : Trees {}; + class t_phoenixrupicola3s_f_p3d : Trees {}; + class Land_t_acer2s : Trees {}; + class Land_t_alnus2s : Trees {}; + class Land_t_betula1f : Trees {}; + class Land_t_betula2f : Trees {}; + class Land_t_betula2s : Trees {}; + class Land_t_betula2w : Trees {}; + class Land_t_carpinus2s : Trees {}; + class Land_t_fagus2f : Trees {}; + class Land_t_fagus2s : Trees {}; + class Land_t_fagus2W : Trees {}; + class Land_t_fraxinus2s : Trees {}; + class Land_t_fraxinus2W : Trees {}; + class Land_t_larix3f : Trees {}; + class Land_t_larix3s : Trees {}; + class Land_t_malus1s : Trees {}; + class Land_t_picea1s : Trees {}; + class Land_t_picea2s : Trees {}; + class Land_t_picea3f : Trees {}; + class Land_t_pinusN1s : Trees {}; + class Land_t_pinusN2s : Trees {}; + class Land_t_pinusS2f : Trees {}; + class Land_t_populus3s : Trees {}; + class Land_t_pyrus2s : Trees {}; + class Land_t_quercus2f : Trees {}; + class Land_t_quercus3s : Trees {}; + class Land_t_salix2s : Trees {}; + class Land_t_sorbus2s : Trees {}; + class Land_t_stub_picea : Trees {}; class b_ficusc2d_f_p3d : Bushes {}; class b_ficusc1s_f_p3d : Bushes {}; class b_neriumo2d_f_p3d : Bushes {}; @@ -531,6 +588,19 @@ class CfgWorldInteractions { class t_banana_wild_f_p3d : Bushes {}; class b_rhizophora_f_p3d : Bushes {}; class b_neriumo2d_tanoa_f_p3d : Bushes {}; + class b_opuntiaficusindica3s_f_p3d : Bushes {}; + class b_vitus_vinifera_f_p3d : Bushes {}; + class Land_b_betulaHumilis : Bushes {}; + class Land_b_canina2s : Bushes {}; + class Land_b_corylus : Bushes {}; + class Land_b_corylus2s : Bushes {}; + class Land_b_craet1 : Bushes {}; + class Land_b_craet2 : Bushes {}; + class Land_b_hrusen2 : Bushes {}; + class Land_b_pmugo : Bushes {}; + class Land_b_prunus : Bushes {}; + class Land_b_salix2s : Bushes {}; + class Land_b_sambucus : Bushes {}; class cinderblocks_f_p3d : Cinder {}; class cinderblocks_01_f_p3d : Cinder {}; class wall_tin_4_2_p3d : Wrecks {}; @@ -638,8 +708,102 @@ class CfgWorldInteractions { class locomotive_01_v2_f_p3d : Wrecks {}; class excavator_01_abandoned_f_p3d : Wrecks {}; + class Land_Wreck_Skodovka_F : Wrecks {}; + class Land_Wreck_CarDismantled_F : Wrecks {}; + class Land_Wreck_Truck_F : Wrecks {}; + class Land_Wreck_Car2_F : Wrecks {}; + class Land_Wreck_Car_F : Wrecks {}; + class Land_Wreck_Car3_F : Wrecks {}; + class Land_Wreck_Hunter_F : Wrecks {}; + class Land_Wreck_Van_F : Wrecks {}; + class Land_Wreck_Offroad_F : Wrecks {}; + class Land_Wreck_UAZ_F : Wrecks {}; + class Land_Wreck_Ural_F : Wrecks {}; + class Land_Wreck_Truck_dropside_F : Wrecks {}; + class Land_Wreck_HMMWV_F : Wrecks {}; + class Land_GarbageWashingMachine_F : Trash {}; + class Land_GarbageHeap_01_F : Trash {}; + class Land_GarbageHeap_02_F : Trash {}; + class Land_GarbageHeap_03_F : Trash {}; + class Land_GarbageHeap_04_F : Trash {}; - - - + class Mi8Wreck : Wrecks {}; + class BlackhawkWreck : Wrecks {}; + class C130J_Wreck_EP1 : Wrecks {}; + class Land_Wreck_C130J_EP1_ruins : Wrecks {}; + class T72Wreck : Wrecks {}; + class T72WreckTurret : Wrecks {}; + class HMMWVWreck : Wrecks {}; + class JeepWreck1 : Wrecks {}; + class JeepWreck2 : Wrecks {}; + class JeepWreck3 : Wrecks {}; + class SKODAWreck : Wrecks {}; + class UAZWreck : Wrecks {}; + class UralWreck : Wrecks {}; + class datsun01Wreck : Wrecks {}; + class datsun02Wreck : Wrecks {}; + class LADAWreck : Wrecks {}; + class hiluxWreck : Wrecks {}; + class BMP2Wreck : Wrecks {}; + class BRDMWreck : Wrecks {}; + class M113Wreck : Wrecks {}; + class Land_chz_avtobus : Wrecks {}; + class Land_chz_avtobus2 : Wrecks {}; + class Land_chz_avtobus2a : Wrecks {}; + class Land_chz_benozovoz_gaz : Wrecks {}; + class Land_chz_benozovoz_zil : Wrecks {}; + class Land_chz_bochka_pricep : Wrecks {}; + class Land_chz_buldozer : Wrecks {}; + class Land_chz_ekskavator : Wrecks {}; + class Land_chz_gaz : Wrecks {}; + class Land_chz_gaz66_02 : Wrecks {}; + class Land_chz_gazon : Wrecks {}; + class Land_chz_kamaz_fura : Wrecks {}; + class Land_chz_kamaz_korpus : Wrecks {}; + class Land_chz_kamaz_korpus_02 : Wrecks {}; + class Land_chz_kamaz_korpus_03 : Wrecks {}; + class Land_chz_kamaz_korpus_04 : Wrecks {}; + class Land_chz_kamaz_pricep : Wrecks {}; + class Land_chz_katok_1 : Wrecks {}; + class Land_chz_katok_1_br : Wrecks {}; + class Land_chz_molokovoz_01 : Wrecks {}; + class Land_chz_moskvich : Wrecks {}; + class Land_chz_moskvich_2 : Wrecks {}; + class Land_chz_niva_01 : Wrecks {}; + class Land_chz_niva_02 : Wrecks {}; + class Land_chz_niva_03 : Wrecks {}; + class Land_chz_rls_chp75b : Wrecks {}; + class Land_chz_train_vagon_01_open_br1 : Wrecks {}; + class Land_chz_train_vagon_02_open_br1 : Wrecks {}; + class Land_chz_train_vagon_04 : Wrecks {}; + class Land_chz_train_vagon_platforma : Wrecks {}; + class Land_chz_train_vagon_suburban_01 : Wrecks {}; + class Land_chz_train_vagon_suburban_02 : Wrecks {}; + class Land_chz_traktor_1 : Wrecks {}; + class Land_chz_traktor_2 : Wrecks {}; + class Land_chz_traktor_3 : Wrecks {}; + class Land_chz_traktor_4 : Wrecks {}; + class Land_chz_uaz_1 : Wrecks {}; + class Land_chz_uazik_01 : Wrecks {}; + class Land_chz_uazik_02 : Wrecks {}; + class Land_chz_veh_diesel_br : Wrecks {}; + class Land_chz_zaz968_1 : Wrecks {}; + class Land_chz_zaz968_2 : Wrecks {}; + class Land_chz_zil_130_4 : Wrecks {}; + class Land_chz_zil_fire_1 : Wrecks {}; + class Land_chz_zibk_2 : Wrecks {}; + class Land_chz_zibk_3 : Wrecks {}; + class Land_chz_zibk_4 : Wrecks {}; + class Land_fishing_boat : Wrecks {}; + class Land_Wreck_Satellite_EPOCH : Wrecks {}; + class satellite_p3d : Wrecks {}; + class Land_Pipes_large_F : Wrecks {}; + class Land_Pipes_small_F : Wrecks {}; + class garbagebarrel_01_english_f_p3d : Trash {}; + class uwreck_fishingboat_f_p3d : Wrecks {}; + // ore classes + class MineralDepositCopper_EPOCH : Ore {}; + class MineralDepositGold_EPOCH : Ore {}; + class MineralDepositSilver_EPOCH : Ore {}; + class mineral_p3d : Ore {}; }; diff --git a/Sources/epoch_config/Configs/CfgEpochConfiguration.hpp b/Sources/epoch_config/Configs/CfgEpochConfiguration.hpp index cce145e0..0420159d 100644 --- a/Sources/epoch_config/Configs/CfgEpochConfiguration.hpp +++ b/Sources/epoch_config/Configs/CfgEpochConfiguration.hpp @@ -15,6 +15,7 @@ class CfgEpochConfiguration icon = "\x\addons\a3_epoch_code\Data\owner.paa"; controlGroup = "EpochConfigKeyMap"; }; + /* class HUD { name = "Customize HUD (WIP)"; @@ -22,6 +23,7 @@ class CfgEpochConfiguration icon = "\x\addons\a3_epoch_code\Data\owner.paa"; controlGroup = "Epoch_main_config_dynamicHUD"; }; + */ class html { name = "Changelog"; diff --git a/Sources/epoch_config/Configs/CfgFunctions.hpp b/Sources/epoch_config/Configs/CfgFunctions.hpp index 232ee981..d53589ea 100644 --- a/Sources/epoch_config/Configs/CfgFunctions.hpp +++ b/Sources/epoch_config/Configs/CfgFunctions.hpp @@ -24,6 +24,10 @@ class cfgFunctions tag = "EPOCH"; class functions { + class arrayToLogic + { + file = "epoch_code\compile\functions\EPOCH_fnc_arrayToLogic.sqf"; + }; class returnConfigEntryV2 { file = "epoch_code\compile\functions\EPOCH_fn_returnConfigEntryV2.sqf"; @@ -31,6 +35,10 @@ class cfgFunctions class isAny { file = "epoch_code\compile\both\EPOCH_isAny.sqf"; + }; + class weightedArray + { + file = "epoch_code\compile\both\EPOCH_weightedArray.sqf"; }; class compiler { diff --git a/Sources/epoch_config/Configs/CfgFunctions.json b/Sources/epoch_config/Configs/CfgFunctions.json deleted file mode 100644 index a0a8569e..00000000 --- a/Sources/epoch_config/Configs/CfgFunctions.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "_header": { - "@author": "Aaron Clark - https://EpochMod.com", - "@contributors": [], - "@description": "Epoch cfgfunctions", - "@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/{filename}" - }, - "cfgFunctions": { - "A3": { - "tag": "BIS", - "functions": { - "returnVector": { - "file": "epoch_code\\compile\\bis_functions\\returnVector.sqf" - } - } - }, - "EPOCH": { - "tag": "EPOCH", - "functions": { - "returnConfigEntryV2": { - "file": "epoch_code\\compile\\functions\\EPOCH_fn_returnConfigEntryV2.sqf" - }, - "isAny": { - "file": "epoch_code\\compile\\both\\EPOCH_isAny.sqf" - }, - "compiler": { - "file": "epoch_code\\compile\\both\\EPOCH_compiler.sqf" - } - }, - "Client": { - "init": { - "file": "epoch_code\\init\\fn_init.sqf", - "preInit": 1 - }, - "postinit": { - "file": "epoch_code\\init\\fn_postinit.sqf", - "postInit": 1 - } - } - } - } -} diff --git a/Sources/epoch_config/Configs/CfgItemInteractions.hpp b/Sources/epoch_config/Configs/CfgItemInteractions.hpp index 9ca9f52a..fa6422cd 100644 --- a/Sources/epoch_config/Configs/CfgItemInteractions.hpp +++ b/Sources/epoch_config/Configs/CfgItemInteractions.hpp @@ -1,6 +1,21 @@ /* Legend: -interactAction: 0 = examine, 1 = eat, 2 = drink, 3 = build +interactAction: 0 = examine, + 1 = eat, + 2 = drink, + 3 = build, + 4 = refuel, + 5 = siphon, + 6 = Soiled-25, + 7 = Warm+1, + 8 = Cold-1, + 9 = Energy 100, + 10 = Repair Light, + 11 = Repair Heavy, + 12 = base painting, + 13 = Heal Player, + 14 = Unpack Backpack, + 15 = Read interactAttributes[] = { {"Temp",0}, {"Hunger",0}, @@ -12,7 +27,7 @@ interactAttributes[] = { {"Stamina",0}, {"Wet",0}, {"BloodP",0}, - {"Karma",0}, + {"NotUsed",0}, {"Alcohol",0}, {"Radiation",0} }; @@ -76,40 +91,40 @@ class CfgItemInteractions class honey_epoch : Food_Jar_base { interactText = "EAT"; - interactAttributes[] = {{"Immunity",1},{"Stamina",30},{"BloodP",10}}; + interactAttributes[] = {{"Immunity",1},{"Stamina",30}}; interactActions[] = {{"EMPTY","[1,[],'emptyjar_epoch'] call EPOCH_consumeItem;"}}; }; class sardines_epoch : Food_TinCan_base { - interactAttributes[] = {{"Hunger",1000},{"Toxicity",7}}; + interactAttributes[] = {{"Hunger",1000},{"Toxicity",7,1},{"Radiation",2,1}}; }; class meatballs_epoch : Food_TinCan_base { - interactAttributes[] = {{"Hunger",1200}}; + interactAttributes[] = {{"Hunger",1200},{"Radiation",2,1}}; }; class scam_epoch : Food_TinCan_base { - interactAttributes[] = {{"Hunger",1000}}; + interactAttributes[] = {{"Hunger",1000},{"Radiation",2,1}}; }; class sweetcorn_epoch : Food_TinCan_base { - interactAttributes[] = {{"Hunger",600}}; + interactAttributes[] = {{"Hunger",600},{"Radiation",2,1}}; }; class FoodBioMeat : Food_TinCan_base { - interactAttributes[] = {{"Hunger",1000},{"Toxicity",7}}; + interactAttributes[] = {{"Hunger",1000},{"Toxicity",7},{"Radiation",2,1}}; }; class TacticalBacon : Food_TinCan_base { - interactAttributes[] = {{"Hunger",500}}; + interactAttributes[] = {{"Hunger",500},{"Radiation",2,1}}; }; class ItemTrout : Food_base { - interactAttributes[] = {{"Hunger",300},{"Toxicity",5}}; + interactAttributes[] = {{"Hunger",300},{"Toxicity",5,1}}; }; class ItemSeaBass : Food_base { - interactAttributes[] = {{"Hunger",500},{"Toxicity",10}}; + interactAttributes[] = {{"Hunger",500},{"Toxicity",10,1}}; }; class ItemTuna : Food_base { @@ -157,7 +172,7 @@ class CfgItemInteractions }; class WhiskeyNoodle : Drink_base { - interactAttributes[] = {{"Thirst",800},{"Toxicity",-1},{"Stamina",50},{"Alcohol",10}}; + interactAttributes[] = {{"Thirst",400},{"Toxicity",-1},{"Radiation",-1},{"Stamina",50},{"Alcohol",10},{"BloodP",1}}; }; class water_epoch : Drink_Jar_base { @@ -166,6 +181,10 @@ class CfgItemInteractions class clean_water_epoch : Drink_Jar_base { interactAttributes[] = {{"Thirst",500},{"Stamina",50}}; + }; + class HotAxeSauce_epoch : Drink_Jar_base + { + interactAttributes[] = {{"Thirst",-500},{"Immunity",1},{"Stamina",5}}; }; class ItemSodaRbull : Soda_base { @@ -301,13 +320,13 @@ class CfgItemInteractions { interactAction = 1; interactText = "EAT"; - interactAttributes[] = {{"Hunger",500},{"Soiled",1},{"Toxicity",15,1},{"Karma",-10}}; + interactAttributes[] = {{"Hunger",500},{"Soiled",1},{"Toxicity",15,1}}; }; class CookedDog_EPOCH : Default { interactAction = 1; interactText = "EAT"; - interactAttributes[] = {{"Hunger",3000},{"Karma",-10}}; + interactAttributes[] = {{"Hunger",3000}}; }; class CookedGoat_EPOCH : Default { @@ -326,6 +345,23 @@ class CfgItemInteractions interactAction = 1; interactText = "EAT"; interactAttributes[] = {{"Hunger",3000}}; + }; + class ItemPowderMilk : Food_base + { + interactAttributes[] = {{"Thirst",-350},{"Hunger",300}}; + }; + class ItemRicebox : Food_base + { + interactAttributes[] = {{"Thirst",-1000},{"Hunger",1200}}; + }; + class ItemCereals : Food_base + { + interactAttributes[] = {{"Thirst",-1000},{"Hunger",1200}}; + }; + class ItemVitamins : Food_base + { + interactText = "Take Pills"; + interactAttributes[] = {{"Immunity",20},{"Stamina",50},{"Toxicity",-5},{"Thirst",-150}}; }; class KitSpikeTrap : Item_Build_base { @@ -343,13 +379,53 @@ class CfgItemInteractions { buildClass = "WoodFloor_EPOCH"; }; - class KitWoodStairs : Item_Build_base + class KitWoodHalfFloor : Item_Build_base + { + buildClass = "WoodHalfFloor_EPOCH"; + }; + class KitWoodQuarterFloor : Item_Build_base + { + buildClass = "WoodQuarterFloor_EPOCH"; + }; + class KitWoodStairs : Item_Build_base { buildClass = "WoodStairs_EPOCH"; }; class KitWoodTower : Item_Build_base { buildClass = "WoodTower_EPOCH"; + }; + class KitMetalTower : Item_Build_base + { + buildClass = "MetalTower_EPOCH"; + }; + class KitMetalFloor : Item_Build_base + { + buildClass = "MetalFloor_EPOCH"; + }; + class KitMetalHalfFloor : Item_Build_base + { + buildClass = "MetalHalfFloor_EPOCH"; + }; + class KitMetalQuarterFloor : Item_Build_base + { + buildClass = "MetalQuarterFloor_EPOCH"; + }; + class KitCinderTower : Item_Build_base + { + buildClass = "CinderTower_EPOCH"; + }; + class KitCinderFloor : Item_Build_base + { + buildClass = "CinderFloor_EPOCH"; + }; + class KitCinderHalfFloor : Item_Build_base + { + buildClass = "CinderHalfFloor_EPOCH"; + }; + class KitCinderQuarterFloor : Item_Build_base + { + buildClass = "CinderQuarterFloor_EPOCH"; }; class KitWoodRamp : Item_Build_base { @@ -385,6 +461,16 @@ class CfgItemInteractions { buildClass = "Workbench_SIM_EPOCH"; isStorage = 1; + }; + class KitTentA : Item_Build_base + { + buildClass = "TentA_SIM_EPOCH"; + isStorage = 1; + }; + class KitTentDome : Item_Build_base + { + buildClass = "TentDome_SIM_EPOCH"; + isStorage = 1; }; class KitFoundation : Item_Build_base { @@ -405,6 +491,95 @@ class CfgItemInteractions class KitCinderWall : Item_Build_base { buildClass = "CinderWallHalf_EPOCH"; + }; + class Kit_Garden : Item_Build_base + { + buildClass = "Garden_EPOCH"; + isStorage = 1; + }; + class KitBurnBarrel : Item_Build_base + { + buildClass = "BurnBarrel_EPOCH"; + }; + class KitLightPole : Item_Build_base + { + buildClass = "LightPole_EPOCH"; + }; + class KitSmallForestCamoNet : Item_Build_base + { + buildClass = "SmallForestCamoNet_EPOCH"; + }; + class KitSmallDesertCamoNet : Item_Build_base + { + buildClass = "SmallDesertCamoNet_EPOCH"; + }; + class KitLargeForestCamoNet : Item_Build_base + { + buildClass = "LargeForestCamoNet_EPOCH"; + }; + class KitLargeDesertCamoNet : Item_Build_base + { + buildClass = "LargeDesertCamoNet_EPOCH"; + }; + class KitFirePlace_02 : Item_Build_base + { + buildClass = "FirePlace_02_EPOCH"; + }; + class KitFieldToilet : Item_Build_base + { + buildClass = "FieldToilet_EPOCH"; + }; + class KitScaffolding : Item_Build_base + { + buildClass = "Scaffolding_EPOCH"; + }; + class KitSink : Item_Build_base + { + buildClass = "Sink_EPOCH"; + }; + class KitPortableLight_Single : Item_Build_base + { + buildClass = "PortableLight_Single_EPOCH"; + }; + class KitPortableLight_Double : Item_Build_base + { + buildClass = "PortableLight_Double_EPOCH"; + }; + class KitWatchTower : Item_Build_base + { + buildClass = "WatchTower_EPOCH"; + }; + class KitSunShade : Item_Build_base + { + buildClass = "SunShade_EPOCH"; + }; + class KitFuelPump : Item_Build_base + { + buildClass = "FuelPump_EPOCH"; + }; + class KitBagBunker : Item_Build_base + { + buildClass = "BagBunker_EPOCH"; + }; + class KitSandBagWall : Item_Build_base + { + buildClass = "SandBagWall_EPOCH"; + }; + class KitSandBagWallLong : Item_Build_base + { + buildClass = "SandBagWallLong_EPOCH"; + }; + class KitBarGate : Item_Build_base + { + buildClass = "BarGate_EPOCH"; + }; + class KitWaterPump : Item_Build_base + { + buildClass = "WaterPump_EPOCH"; + }; + class KitBarbedWire : Item_Build_base + { + buildClass = "BarbedWire_EPOCH"; }; class PaintCanBase : Default { @@ -465,13 +640,13 @@ class CfgItemInteractions { interactAction = 6; interactText = "USE"; - interactAttributes[] = {{"Immunity",10},{"Stamina",-100},{"BloodP",-10}}; + interactAttributes[] = {{"Immunity",10},{"Stamina",-100}}; }; class Goldenseal : Default { interactAction = 6; interactText = "USE"; - interactAttributes[] = {{"Toxicity",-50}}; + interactAttributes[] = {{"Toxicity",-5}}; }; class Pumpkin : Default { @@ -532,7 +707,7 @@ class CfgItemInteractions class ItemKeyYellow : ItemKey {}; class ItemDoc1 : Default { - interactAction = -1; + interactAction = 15; interactText = "READ"; }; class ItemDoc2 : ItemDoc1 {}; @@ -546,13 +721,29 @@ class CfgItemInteractions class ItemVehDoc2 : ItemDoc1 {}; class ItemVehDoc3 : ItemDoc1 {}; class ItemVehDoc4 : ItemDoc1 {}; + class KitVehicleUpgradeI_100_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeI_200_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeI_300_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeII_100_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeII_200_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeII_300_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeIII_100_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeIII_200_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeIII_300_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeIV_100_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeIV_200_EPOCH : ItemDoc1 {}; + class KitVehicleUpgradeIV_300_EPOCH : ItemDoc1 {}; class ItemBulb : Default {}; class ItemBurlap : Default {}; class ItemBriefcaseE : Default {}; class ItemBriefcaseGold100oz : Default {}; + class ItemBriefcaseSilver100oz : Default {}; class ItemAluminumBar : Default {}; + class ItemAluminumBar10oz : Default {}; class ItemCopperBar : Default {}; + class ItemCopperBar10oz : Default {}; class ItemTinBar : Default {}; + class ItemTinBar10oz : Default {}; class ItemPlywoodPack : Default {}; class ItemComboLock : Default {}; class CircuitParts : Default {}; @@ -579,6 +770,7 @@ class CfgItemInteractions class ItemDocument : Default {}; class ItemDocumentMission : Default {}; class ItemSilverBar : Default {}; + class ItemSilverBar10oz : Default {}; class ItemGoldBar : Default {}; class ItemGoldBar10oz : Default {}; class ItemRock : Default {}; @@ -734,6 +926,118 @@ class CfgItemInteractions { interactReturnOnUse = "smallbackpack_pink_epoch"; }; -}; + class ItemCanvas : Default {}; + class ItemSeedBag : Default {}; + class SeedPacket_GoldenSeal : Food_base { + interactAttributes[] = {{"Toxicity",-1}}; + interactReturnOnUse = "ItemSeedBag"; + }; + class SeedPacket_Hemp : Food_base { + interactAttributes[] = {{"Immunity",1},{"Stamina",30},{"Hunger",100}}; + interactReturnOnUse = "ItemSeedBag"; + }; + class SeedPacket_Poppy : Food_base { + interactAttributes[] = {{"Immunity",1},{"Stamina",30},{"Hunger",50}}; + interactReturnOnUse = "ItemSeedBag"; + }; + class SeedPacket_Pumpkin : Food_base { + interactAttributes[] = {{"Immunity",1},{"Stamina",30},{"Hunger",100}}; + interactReturnOnUse = "ItemSeedBag"; + }; + class SeedPacket_Sunflower : Food_base { + interactAttributes[] = {{"Immunity",1},{"Toxicity",-2},{"Stamina",30},{"Hunger",100}}; + interactReturnOnUse = "ItemSeedBag"; + }; + class ItemBakedBeans : Food_TinCan_base + { + interactAttributes[] = {{"Hunger",800},{"Radiation",2,1}}; + }; + class gyro_wrap_epoch : Food_base + { + interactAttributes[] = {{"Hunger",600}}; + }; + class icecream_epoch : Food_base + { + interactAttributes[] = {{"Hunger",200},{"Stamina",20}}; + }; + class redburger_epoch : Food_base + { + interactAttributes[] = {{"Hunger",600}}; + }; + class bluburger_epoch : Food_base + { + interactAttributes[] = {{"Hunger",600}}; + }; + class krypto_candy_epoch : Food_base + { + interactAttributes[] = {{"Hunger",500},{"Stamina",50}}; + }; + class ItemBottlePlastic_Clean : Drink_base + { + interactAttributes[] = {{"Thirst",500},{"Stamina",50}}; + interactReturnOnUse = "ItemBottlePlastic_Empty"; + }; + class ItemCanteen_Clean : Drink_base + { + interactAttributes[] = {{"Thirst",1000},{"Stamina",50}}; + interactReturnOnUse = "ItemCanteen_Empty"; + }; + class ItemBottlePlastic_Dirty: Drink_base + { + interactAttributes[] = {{"Thirst",500},{"Toxicity",5,1},{"Stamina",50},{"Radiation",2,1}}; + interactReturnOnUse = "ItemBottlePlastic_Empty"; + }; + class ItemCanteen_Dirty : Drink_base + { + interactAttributes[] = {{"Thirst",1000},{"Toxicity",5,1},{"Stamina",50},{"Radiation",2,1}}; + interactReturnOnUse = "ItemCanteen_Empty"; + }; + class adrenaline_epoch : Drink_base + { + interactText = "USE"; // todo digest system to give attributes over time + interactAttributes[] = {{"Thirst",-50},{"Stamina",120},{"BloodP",20},{"Toxicity",5}}; + }; + class atropine_epoch : Drink_base + { + interactText = "USE"; // todo digest system to give attributes over time + interactAttributes[] = {{"Thirst",-50},{"Stamina",-20},{"Toxicity",-5},{"Immunity",-1}}; + }; + class morphine_epoch : Default + { + interactAction = 16; // currently heals most damaged hitpoint first on self and gives attributes + interactText = "USE"; + interactAttributes[] = {{"Thirst",-20},{"Stamina",-50},{"Toxicity",5},{"BloodP",5}}; + }; + class caffeinepills_epoch : Food_base + { + // todo digest system to give attributes over time (some type of boost system is needed as well as new action to feed it) + interactAttributes[] = {{"Thirst",-20},{"Stamina",50},{"Toxicity",1}}; + }; + class orlistat_epoch : Food_base + { + // todo should reduce hunger downtick for a duration, if too much is taken causes bowel issues? + interactAttributes[] = {{"Thirst",-20},{"Hunger",25},{"BloodP",-1}}; + }; + class nanite_cream_epoch : Food_base + { + interactText = "USE"; + interactAttributes[] = {{"Radiation",-25},{"Soiled",20},{"Toxicity",5},{"Immunity",5}}; + }; + class nanite_gun_epoch : Food_base + { + interactText = "USE"; + interactAttributes[] = {{"Radiation",-100},{"Toxicity",5},{"Immunity",5}}; + }; + class nanite_pills_epoch : Food_base + { + interactText = "USE"; + interactAttributes[] = {{"Radiation",-10},{"Thirst",-50},{"Toxicity",5},{"Immunity",5}}; + }; + class iodide_pills_epoch : Food_base + { + interactText = "USE"; + interactAttributes[] = {{"Radiation",-15},{"Thirst",-50},{"Immunity",5}}; + }; +}; /*[[[end]]]*/ diff --git a/Sources/epoch_config/Configs/CfgItemSort.hpp b/Sources/epoch_config/Configs/CfgItemSort.hpp index 399a7121..f6b61132 100644 --- a/Sources/epoch_config/Configs/CfgItemSort.hpp +++ b/Sources/epoch_config/Configs/CfgItemSort.hpp @@ -2,7 +2,6 @@ class CfgItemSort { - class MainCategories { classes[] = { @@ -265,7 +264,7 @@ class CfgItemSort // Backpacks Apex "B_Bergen_tna_F", - "B_AssaultPack_tna", + "B_AssaultPack_tna_F", "B_ViperHarness_ghex_F", "B_ViperHarness_blk_F", "B_ViperHarness_hex_F", @@ -393,7 +392,8 @@ class CfgItemSort "ghostface_mask_epoch", "skull_mask_epoch", "witch_mask_epoch", - + "radiation_mask_epoch", + // Headgear Apex "H_HelmetLeaderO_ghex_F", "H_HelmetCrew_O_ghex_F", @@ -413,6 +413,7 @@ class CfgItemSort "Laserdesignator", "ItemCompass", "ItemGPS", + "ItemGeigerCounter_EPOCH", "ItemWatch", "NVG_EPOCH", "Binocular", @@ -594,6 +595,9 @@ class CfgItemSort "9rnd_45X88_magazine", "6Rnd_GreenSignal_F", "6Rnd_RedSignal_F", + "6Rnd_BlueSignal_F", + "6Rnd_PurpleSignal_F", + "6Rnd_OrangeSignal_F", // light Mags "30Rnd_65x39_caseless_green", @@ -688,7 +692,79 @@ class CfgItemSort "3Rnd_SmokeYellow_Grenade_shell", "3Rnd_SmokePurple_Grenade_shell", "3Rnd_SmokeBlue_Grenade_shell", - "3Rnd_SmokeOrange_Grenade_shell" + "3Rnd_SmokeOrange_Grenade_shell", + + // Vehicle Mags + "500Rnd_127x99_mag", + "500Rnd_127x99_mag_Tracer_Red", + "500Rnd_127x99_mag_Tracer_Green", + "500Rnd_127x99_mag_Tracer_Yellow", + "200Rnd_127x99_mag", + "200Rnd_127x99_mag_Tracer_Red", + "200Rnd_127x99_mag_Tracer_Green", + "200Rnd_127x99_mag_Tracer_Yellow", + "100Rnd_127x99_mag", + "100Rnd_127x99_mag_Tracer_Red", + "100Rnd_127x99_mag_Tracer_Green", + "100Rnd_127x99_mag_Tracer_Yellow", + "2000Rnd_762x51_Belt", + "200Rnd_40mm_G_belt", + "32Rnd_40mm_G_belt", + "64Rnd_40mm_G_belt", + "96Rnd_40mm_G_belt", + "200Rnd_20mm_G_belt", + "40Rnd_20mm_G_belt", + "60Rnd_CMFlare_Chaff_Magazine", + "120Rnd_CMFlare_Chaff_Magazine", + "240Rnd_CMFlare_Chaff_Magazine", + "192Rnd_CMFlare_Chaff_Magazine", + "168Rnd_CMFlare_Chaff_Magazine", + "300Rnd_CMFlare_Chaff_Magazine", + "SmokeLauncherMag", + "SmokeLauncherMag_boat", + "200Rnd_65x39_Belt", + "200Rnd_65x39_Belt_Tracer_Red", + "200Rnd_65x39_Belt_Tracer_Green", + "200Rnd_65x39_Belt_Tracer_Yellow", + "1000Rnd_65x39_Belt", + "1000Rnd_65x39_Belt_Tracer_Red", + "1000Rnd_65x39_Belt_Green", + "1000Rnd_65x39_Belt_Tracer_Green", + "1000Rnd_65x39_Belt_Yellow", + "1000Rnd_65x39_Belt_Tracer_Yellow", + "2000Rnd_65x39_Belt", + "2000Rnd_65x39_Belt_Tracer_Red", + "2000Rnd_65x39_Belt_Green", + "2000Rnd_65x39_Belt_Tracer_Green", + "2000Rnd_65x39_Belt_Tracer_Green_Splash", + "2000Rnd_65x39_Belt_Yellow", + "2000Rnd_65x39_Belt_Tracer_Yellow", + "2000Rnd_65x39_Belt_Tracer_Yellow_Splash", + "8Rnd_82mm_Mo_shells", + "8Rnd_82mm_Mo_Flare_white", + "8Rnd_82mm_Mo_Smoke_white", + "8Rnd_82mm_Mo_guided", + "8Rnd_82mm_Mo_LG", + "24Rnd_PG_missiles", + "12Rnd_PG_missiles", + "24Rnd_missiles", + "12Rnd_missiles", + "60Rnd_40mm_GPR_shells", + "60Rnd_40mm_GPR_Tracer_Red_shells", + "60Rnd_40mm_GPR_Tracer_Green_shells", + "60Rnd_40mm_GPR_Tracer_Yellow_shells", + "40Rnd_40mm_APFSDS_shells", + "40Rnd_40mm_APFSDS_Tracer_Red_shells", + "40Rnd_40mm_APFSDS_Tracer_Green_shells", + "40Rnd_40mm_APFSDS_Tracer_Yellow_shells", + "140Rnd_30mm_MP_shells", + "140Rnd_30mm_MP_shells_Tracer_Red", + "140Rnd_30mm_MP_shells_Tracer_Green", + "140Rnd_30mm_MP_shells_Tracer_Yellow", + "60Rnd_30mm_APFSDS_shells", + "60Rnd_30mm_APFSDS_shells_Tracer_Red", + "60Rnd_30mm_APFSDS_shells_Tracer_Green", + "60Rnd_30mm_APFSDS_shells_Tracer_Yellow" }; Attachments[] = { @@ -800,7 +876,9 @@ class CfgItemSort "APERSMine_Range_Mag", "APERSBoundingMine_Range_Mag", "SLAMDirectionalMine_Wire_Mag", - "APERSTripMine_Wire_Mag" + "APERSTripMine_Wire_Mag", + "BarrelBomb_EPOCH_Remote_Mag", + "BarrelBomb2_EPOCH_Remote_Mag" }; Hand[] = { "SmokeShell", @@ -821,10 +899,23 @@ class CfgItemSort "FAK", "Towelette", "HeatPack", - "ColdPack" + "ColdPack", + "ItemVitamins", + "adrenaline_epoch", + "atropine_epoch", + "morphine_epoch", + "caffeinepills_epoch", + "orlistat_epoch", + "nanite_cream_epoch", + "nanite_gun_epoch", + "nanite_pills_epoch", + "iodide_pills_epoch" }; Food[] = { + "ItemPowderMilk", + "ItemRicebox", + "ItemCereals", "Pumpkin", "FoodBioMeat", "FoodMeeps", @@ -847,7 +938,14 @@ class CfgItemSort "GoatCarcass_EPOCH", "RabbitCarcass_EPOCH", "SheepCarcass_EPOCH", - "SnakeCarcass_EPOCH" + "SnakeCarcass_EPOCH", + "krypto_candy_epoch", + "bluburger_epoch", + "redburger_epoch", + "gyro_wrap_epoch", + "icecream_epoch", + "Hemp", + "Sunflower" }; Drink[] = { @@ -858,9 +956,13 @@ class CfgItemSort "ItemSodaMocha", "ItemSodaBurst", "ItemSodaRbull", - "ItemSodaAlpinedude" + "ItemSodaAlpineDude" }; Basebuilding[] = { + "KitBarbedWire", + "Kit_Garden", + "KitTentA", + "KitTentDome", "CircuitParts", "PartPlankPack", "CinderBlocks", @@ -870,6 +972,8 @@ class CfgItemSort "ItemCorrugatedLg", "KitStudWall", "KitWoodFloor", + "KitWoodHalfFloor", + "KitWoodQuarterFloor", "KitWoodStairs", "KitWoodRamp", "KitFirePlace", @@ -883,19 +987,36 @@ class CfgItemSort "KitWorkbench", "KitWoodLadder", "KitWoodTower", + "KitMetalFloor", + "KitMetalHalfFloor", + "KitMetalQuarterFloor", + "KitMetalTower", + "KitCinderFloor", + "KitCinderHalfFloor", + "KitCinderQuarterFloor", + "KitCinderTower", "ItemLockbox", "Pelt_EPOCH", "ItemSafe", "ItemSolar", "ItemCables", "ItemBattery", - "ItemPlywoodPack" - //"ItemComboLock", - //"ItemPipe", - //"ItemBulb" + "ItemPlywoodPack", + "ItemComboLock", + "ItemPipe", + "ItemBulb", + "SmeltingTools_EPOCH" }; Items[] = { + "ItemCanvas", + "ItemSeedBag", + "SpareTire", + "EngineParts", + "EngineBlock", + "ItemGlass", + "ItemDuctTape", + "ItemRotor", "VehicleRepair", "VehicleRepairLg", "ItemDocument", @@ -915,28 +1036,34 @@ class CfgItemSort "EnergyPackLg", "ItemBarrelF", "ItemBarrelE", - //"ItemBurlap", - //"ItemKey", - //"ItemKeyBlue", - //"ItemKeyGreen", - //"ItemKeyRed", - //"ItemKeyYellow", - //"ItemHotwire", - //"ItemKeyKit", - //"ItemDoc1", - //"ItemDoc2", - //"ItemDoc3", - //"ItemDoc4", - //"ItemDoc5", - //"ItemDoc6", - //"ItemDoc7", - //"ItemDoc8", - //"ItemVehDoc1", - //"ItemVehDoc2", - //"ItemVehDoc3", - //"ItemVehDoc4", + "ItemBurlap", + "ItemKey", + "ItemKeyBlue", + "ItemKeyGreen", + "ItemKeyRed", + "ItemKeyYellow", + "ItemHotwire", + "ItemKeyKit", + "ItemDoc1", + "ItemDoc2", + "ItemDoc3", + "ItemDoc4", + "ItemDoc5", + "ItemDoc6", + "ItemDoc7", + "ItemDoc8", + "ItemVehDoc1", + "ItemVehDoc2", + "ItemVehDoc3", + "ItemVehDoc4", // KryptoItems + "ItemTinBar10oz", + "ItemAluminumBar10oz", + "ItemCopperBar10oz", + "ItemSilverBar10oz", + "ItemBriefcaseSilver100oz", + "PartOreGold", "PartOreSilver", "PartOre", @@ -959,8 +1086,8 @@ class CfgItemSort "ItemTinBar", "ItemEmptyTin", "ItemSodaEmpty", - //"ItemBriefcaseE", - //"ItemBriefcaseGold100oz", + "ItemBriefcaseE", + "ItemBriefcaseGold100oz", "PaintCanClear", "PaintCanBlk", @@ -971,7 +1098,12 @@ class CfgItemSort "PaintCanPur", "PaintCanRed", "PaintCanTeal", - "PaintCanYel" + "PaintCanYel", + "SeedPacket_GoldenSeal", + "SeedPacket_Hemp", + "SeedPacket_Poppy", + "SeedPacket_Pumpkin", + "SeedPacket_Sunflower" }; Vehicles_Land[] = { "ebike_epoch", // Motorrad diff --git a/Sources/epoch_config/Configs/CfgMarkerSets.hpp b/Sources/epoch_config/Configs/CfgMarkerSets.hpp new file mode 100644 index 00000000..1a6f2b93 --- /dev/null +++ b/Sources/epoch_config/Configs/CfgMarkerSets.hpp @@ -0,0 +1,206 @@ +/* + DirtySanchez + + Local Markers are single instance and can only be seen by the player + Use ['Name',position] call EPOCH_fnc_createLocalMarkerSet; + + Global Markers are mostly for server use + Use ['Name',position] call EPOCH_server_createGlobalMarkerSet; + + + Config setup and small explanation: + + {_markerName, _markerShape, _markerTypeOrBrush, _markerColor, _markerAlpha, _markerSize, _markerDir, _markerTextorCode}, + + _markerName - setting this as "" will assume marker name as a counter starting with marker_0 + + _markerShape - Selects the shape of the marker. Shape can be "ICON", "RECTANGLE" or "ELLIPSE". + - if Shape is not ICON it will look for a Brush in the next variable + + _markerTypeOrBrush - (type) this can be any marker from CfgMarkers. ie "KIA" from arma 3 or "EpochSkull" in epoch community assets + - (brush) https://community.bistudio.com/wiki/setMarkerBrushLocal for more info + + _markerColor(optional) - follows arma 3 colors. ie "ColorBlue", "ColorPink" + + _markerAlpha(optional) - alpha channel 0-1 value + + _markerSize(optional) - [x,y] https://community.bistudio.com/wiki/setMarkerSize + + _markerDir(optional) - degrees + + _markerTextOrCode(optional) - Text - place any text in here as: "'Service Point #1'" + - Code - place any code in here such as: "str(player name)" + - for GPS coords use this: "format['%1/%2',(format[mapGridPosition player]) select [0,3],(format[mapGridPosition player]) select [3,3]]" + + Marker sets: + + Active Marker sets include 1 Active shape, 1 Background(BG) shape and 1 Epoch marker or your marker of choice + for example the PlayerMarker below is 1 EpochActive_Hex, 1 EpochBG_Hex and the EpochGPS marker +*/ +class CfgMarkerSets +{ + brushes[] = {"Solid","SolidFull","Horizontal","Vertical","Grid","FDiagonal","BDiagonal","DiagGrid","Cross","Border","SolidBorder"}; + mapScalerPresets[] = { + {1.00,2}, + {0.80,2.25}, + {0.60,2.5}, + {0.30,2.75}, + {0.21,3.25}, + {0.12,3.5}, + {0.08,3.75} + }; + class PlayerMarker { + markerArray[] = { + {"EPOCH_PlayerMarker1","ICON","EpochActive_Hex","ColorBlue",1,{0.6,0.6}}, + {"EPOCH_PlayerMarker2","ICON","EpochBG_Hex","ColorWhite",0.3,{0.6,0.6}}, + {"EPOCH_PlayerMarker3","ICON","EpochGPS","ColorBlue",1,{0.5,0.5},0,"format['%1/%2',(format[mapGridPosition player]) select [0,3],(format[mapGridPosition player]) select [3,3]]"} + }; + }; + class DeathMarker { + markerArray[] = { + + {"EPOCH_DeathMarker1","ICON","EpochActive_Circle","ColorRed",1,{0.6,0.6}}, + {"EPOCH_DeathMarker2","ICON","EpochBG_Circle","ColorPink",0.3,{0.6,0.6}}, + {"EPOCH_DeathMarker3","ICON","EpochSkull","ColorRed",1,{0.5,0.5},0,"str(name player)"} + }; + }; + class EpochDebugBox { + markerArray[] = { + {"","ICON","EpochActive_Square","ColorGreen",1,{1,1}}, + {"","ICON","EpochBG_Square","ColorBlack",0.2,{1,1}}, + {"","ICON","EpochRespawn","ColorGreen",0.75,{1,1}} + }; + }; + class PlantSpawn { + markerArray[] = { + {"","ICON","EpochActive_Diamond","ColorGreen",1,{0.8,0.8}}, + {"","ICON","EpochBG_Diamond","ColorBlack",0.2,{0.8,0.8}}, + {"","ICON","EpochPlant","ColorGreen",0.9,{0.9,0.9}} + }; + }; + class AirDrop { + markerArray[] = { + {"","ICON","EpochActive_Diamond","ColorGreen",1,{1.1,1.1}}, + {"","ICON","EpochBG_Diamond","ColorBlack",0.2,{1.1,1.1}}, + {"","ICON","EpochAirdrop","ColorGreen",0.75,{1.2,1.2}} + }; + }; + class Carnival { + markerArray[] = { + {"","ICON","EpochActive_Diamond","ColorOrange",1,{1,1}}, + {"","ICON","EpochBG_Diamond","ColorBlack",0.2,{1,1}}, + {"","ICON","EpochCarnival","ColorOrange",0.75,{1.1,1.1}} + }; + }; + class Container { + markerArray[] = { + {"","ICON","EpochActive_Diamond","ColorOrange",1,{1,1}}, + {"","ICON","EpochBG_Diamond","ColorBlack",0.2,{1,1}}, + {"","ICON","EpochContainer","ColorOrange",0.75,{1.1,1.1}} + }; + }; + class EarthQuake { + markerArray[] = { + {"","ICON","EpochActive_Circle","ColorGrey",1,{0.8,0.8}}, + {"","ICON","EpochBG_Circle","ColorBlack",0.2,{0.8,0.8}}, + {"","ICON","EpochGem","ColorRed",1,{0.9,0.9}} + }; + }; + class ServicePoint { + markerArray[] = { + {"","ICON","EpochBG_Circle","ColorGrey",0.25,{0.85,0.85}}, + {"","ICON","EpochActive_Circle","ColorBlack",1,{0.85,0.85}}, + {"","ICON","EpochService","ColorWhite",1,{0.9,0.9},0,"'Service Point'"} + }; + }; + class Radiation { + markerArray[] = { + {"","ICON","EpochBG_Triangle","ColorBlack",0.3,{0.7,0.7}}, + {"","ICON","EpochActive_Triangle","ColorYellow",1,{0.7,0.7}}, + {"","ICON","EpochRadiation","ColorYellow",1,{0.9,0.9}} + }; + }; + class Satellite { + markerArray[] = { + {"","ICON","EpochBG_Triangle","ColorBlack",0.15,{0.7,0.7},58}, + {"","ICON","EpochActive_Triangle","ColorYellow",0.5,{0.7,0.7},58}, + {"","ICON","EpochSatellite","ColorYellow",1,{0.9,0.9},58} + }; + }; + class MissionNoob { + markerArray[] = { + {"","ICON","EpochBG_Square","ColorBlack",0.15,{1,1}}, + {"","ICON","EpochActive_Square","ColorGreen",0.5,{1,1}}, + {"","ICON","EpochMissionNoob1","ColorYellow",1,{0.9,0.9}} + }; + }; + class MissionNoobPlus { + markerArray[] = { + {"","ICON","EpochBG_Square","ColorBlack",0.15,{1,1}}, + {"","ICON","EpochActive_Square","ColorGreen",0.75,{1,1}}, + {"","ICON","EpochMissionNoob2","ColorYellow",1,{0.9,0.9}} + }; + }; + class MissionSurvivor { + markerArray[] = { + {"","ICON","EpochBG_Square","ColorBlack",0.15,{1,1}}, + {"","ICON","EpochActive_Square","ColorBlue",0.5,{1,1}}, + {"","ICON","EpochMissionMedium1","ColorGreen",1,{0.9,0.9}} + }; + }; + class MissionSurvivorPlus { + markerArray[] = { + {"","ICON","EpochBG_Square","ColorBlack",0.15,{1,1}}, + {"","ICON","EpochActive_Square","ColorBlue",0.75,{1,1}}, + {"","ICON","EpochMissionMedium2","ColorGreen",1,{0.9,0.9}} + }; + }; + class MissionSlaughter { + markerArray[] = { + {"","ICON","EpochBG_Square","ColorBlack",0.15,{1,1}}, + {"","ICON","EpochActive_Square","ColorRed",0.5,{1,1}}, + {"","ICON","EpochMissionVeteran1","ColorBlue",1,{0.9,0.9}} + }; + }; + class MissionSlaughterPlus { + markerArray[] = { + {"","ICON","EpochBG_Square","ColorBlack",0.15,{1,1}}, + {"","ICON","EpochActive_Square","ColorRed",0.75,{1,1}}, + {"","ICON","EpochMissionVeteran2","ColorBlue",1,{0.9,0.9}} + }; + }; + class IGSafeZones { + markerArray[] = { + {"","ICON","mil_warning","ColorRed",1,{1,1},0,"format['SafeZone%1',IGSZCounter];IGSZCounter = IGSZCounter+1"}, + {"","ELLIPSE","Grid","ColorGreen",1,{250,250}} + }; + }; + class StaticTrader { + markerArray[] = { + {"","ICON","EpochBG_Circle","ColorWhite",0.15,{0.6,0.6}}, + {"","ICON","EpochActive_Circle","ColorRed",0.75,{0.6,0.6}}, + {"","ICON","EpochStaticTrader","ColorBlack",1,{0.5,0.5}} + }; + }; + class DynamicTrader { + markerArray[] = { + {"","ICON","EpochBG_Circle","ColorWhite",0.15,{0.6,0.6}}, + {"","ICON","EpochActive_Circle","ColorGreen",0.75,{0.6,0.6}}, + {"","ICON","EpochDynamicTrader","ColorBrown",1,{0.5,0.5}} + }; + }; + class NewDynamicTrader { + markerArray[] = { + {"","ICON","EpochBG_Circle","ColorWhite",0.15,{0.6,0.6}}, + {"","ICON","EpochActive_Circle","ColorKhaki",0.75,{0.6,0.6}}, + {"","ICON","EpochStaticTrader","ColorKhaki",1,{0.5,0.5}} + }; + }; + class Shipwreck { + markerArray[] = { + {"","ICON","EpochBG_Circle","ColorWhite",0.15,{0.6,0.6}}, + {"","ICON","EpochActive_Circle","ColorOrange",1,{0.6,0.6}}, + {"","ICON","EpochShipwreck","ColorOrange",1,{0.5,0.5}} + }; + }; +}; diff --git a/Sources/epoch_config/Configs/CfgMasterLoop.hpp b/Sources/epoch_config/Configs/CfgMasterLoop.hpp index 8c612f86..5d5ca975 100644 --- a/Sources/epoch_config/Configs/CfgMasterLoop.hpp +++ b/Sources/epoch_config/Configs/CfgMasterLoop.hpp @@ -44,6 +44,14 @@ class CfgMasterLoop { delay = 600; }; + class Event8 + { + delay = 5; //used for FavBar, adjust as required + }; + class Event9 + { + delay = 2; //used for geiger counter UI + }; }; }; diff --git a/Sources/epoch_config/Configs/CfgMissions/CfgmissionDelivery.hpp b/Sources/epoch_config/Configs/CfgMissions/CfgmissionDelivery.hpp index 5921faa4..0b88da51 100644 --- a/Sources/epoch_config/Configs/CfgMissions/CfgmissionDelivery.hpp +++ b/Sources/epoch_config/Configs/CfgMissions/CfgmissionDelivery.hpp @@ -28,7 +28,7 @@ class prepForDelivery { faileddialogues[] = {"I guess you have better things to do.","Try again later.","You didn't pick up the document. Misison Failed !"}; completeCondition = "('ItemDocumentMission' in magazines player)"; completedialogues[] = {"That's great, let's get out of here.","Good, you have the document, let's move on.","Ok, well done. We can start now."}; - completedCALL = "uiNameSpace setVariable ['axeStartTraders',(player nearentities [[""C_Man_1""],500]) apply {_x getVariable [""AI_SLOT"",-1]}]"; + completedCALL = "uiNameSpace setVariable ['axeStartTraders',(player nearentities [['C_Man_1'],500]) apply {_x getVariable ['AI_SLOT',-1]} select {!(_x == -1)}]"; reward[] = {}; cleanUp = 0; nextTask[] = {"doDelivery"}; @@ -63,21 +63,21 @@ class doDelivery { {"Don't leave that document anywhere.","If you lose that document you will fail the mission."} }, { - "(count (player nearentities [[""C_Man_1""],42]) > 0) && (count (((player nearentities [[""C_Man_1""],42]) apply {_x getVariable [""AI_SLOT"",-1]}) select {_x in (uiNameSpace getVariable [""axeStartTraders"",[]])}) < 1)", + "(count (((player nearentities [['C_Man_1'],42]) apply {_x getvariable ['AI_SLOT',-1]}) select {!(_x == -1)}) > 0) && (count (((player nearentities [['C_Man_1'],42]) apply {_x getVariable ['AI_SLOT',-1]}) select {_x in (uiNameSpace getVariable ['axeStartTraders',[]])}) < 1)", {"Well done, you have a trader nearby, go see him","Looks like you found another trader, well done, deliver the message.","UAV has spotted another trader nearby, go deliver the message."} } }; callevents[] = { // {{ARRAY1},{ARRAY2},... } { // {"condition",{"Message1","Message2", ...},{"NextTask1","NextTask2", ...}} - "(EPOCH_task_startTime + 480 < diag_tickTime) && ((player nearentities [[""C_Man_1""],500]) apply {_x getVariable [""AI_SLOT"",-1]} isEqualTo (uiNameSpace getVariable [""axeStartTraders"",[]]))", - "[""Hey, what are you doing here ? Get on with your task !"", 5] call Epoch_message", + "(EPOCH_task_startTime + 480 < diag_tickTime) && (count (((player nearentities [['C_Man_1'],500]) apply {_x getVariable ['AI_SLOT',-1]}) select {_x in (uiNameSpace getVariable ['axeStartTraders',[]])}) > 0)", + "[""Hey, what are you doing here ? Get on with your task !"", 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message", {} } }; abandonTime = 1800; failedCondition = "false"; faileddialogues[] = {"Looks like you took too long buddy, Mission Over.","You need to be quicker next time, Mission Over !","Misison Failed - You took too long, better luck next time."}; - completeCondition = "(count (player nearentities [[""C_Man_1""],6]) > 0) && (count (((player nearentities [[""C_Man_1""],6]) apply {_x getVariable [""AI_SLOT"",-1]}) select {_x in (uiNameSpace getVariable [""axeStartTraders"",[]])}) < 1)"; + completeCondition = "(count (((player nearentities [['C_Man_1'],6]) apply {_x getvariable ['AI_SLOT',-1]}) select {!(_x == -1)}) > 0) && (count (((player nearentities [['C_Man_1'],6]) apply {_x getVariable ['AI_SLOT',-1]}) select {_x in (uiNameSpace getVariable ['axeStartTraders',[]])}) < 1)"; completedialogues[] = {"Hey there pal, it looks like you have something for me ?","Great Job there. Step into my office traveller.","You made it, time to take a look at that message."}; completedCALL = ""; reward[] = {}; @@ -155,4 +155,4 @@ class deliveryMissionBadNews { reward[] = {}; cleanUp = 1; nextTask[] = {}; -}; \ No newline at end of file +}; diff --git a/Sources/epoch_config/Configs/CfgMissions/CfgmissionMilitary.hpp b/Sources/epoch_config/Configs/CfgMissions/CfgmissionMilitary.hpp index 3e1240e7..b8ca5c4d 100644 --- a/Sources/epoch_config/Configs/CfgMissions/CfgmissionMilitary.hpp +++ b/Sources/epoch_config/Configs/CfgMissions/CfgmissionMilitary.hpp @@ -197,7 +197,7 @@ class milFindCrashSite{ callEventCondition1 = "count (units group player select {_x distance milCrashPos < 800}) > 0"; callEventCondition2 = "count (units group player select {_x distance milCrashPos < 480}) > 0 && random 100 < 12"; callEventCondition3 = ""; - callEventCALL1 = "_diag = format [""Great work the UAV has spotted %1 nearly on-site."",name ((units group player select {_x distance milCrashPos < 800}) select 0)];[_diag, 5] call Epoch_message;"; + callEventCALL1 = "_diag = format [""Great work the UAV has spotted %1 nearly on-site."",name ((units group player select {_x distance milCrashPos < 800}) select 0)];[_diag, 5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_message;"; callEventFSM1 = ""; callEventSQF1 = ""; callEventTask1 = ""; diff --git a/Sources/epoch_config/Configs/CfgMissions/CfgmissionUav.hpp b/Sources/epoch_config/Configs/CfgMissions/CfgmissionUav.hpp index cad412f6..11ad086d 100644 --- a/Sources/epoch_config/Configs/CfgMissions/CfgmissionUav.hpp +++ b/Sources/epoch_config/Configs/CfgMissions/CfgmissionUav.hpp @@ -56,7 +56,7 @@ class uavMissionStart{ callevents[] = { { "missionNameSpace getVariable [""InSafeZone"",false]", - "['Mission not allowed in Safe Zone',5] call Epoch_Message", + "['Mission not allowed in Safe Zone',5,[[0,0,0,0.5],[1,0.5,0,1]]] call Epoch_Message", {} } diff --git a/Sources/epoch_config/Configs/CfgObjectInteractions.hpp b/Sources/epoch_config/Configs/CfgObjectInteractions.hpp index e97b3d96..2864ec87 100644 --- a/Sources/epoch_config/Configs/CfgObjectInteractions.hpp +++ b/Sources/epoch_config/Configs/CfgObjectInteractions.hpp @@ -18,6 +18,7 @@ class CfgObjectInteractions fatigueChance = 0; bleedAmount = 0; bloodpAmount = 0; + toxicAmount = 0; soundEffect[] = {}; soundEffectGlobal = 0; animationEffect[] = {}; @@ -41,6 +42,22 @@ class CfgObjectInteractions { interactMode = 1; }; + class TentA_EPOCH : Default + { + interactMode = 4; + }; + class TentA_SIM_EPOCH : Default + { + interactMode = 1; + }; + class TentDome_EPOCH : Default + { + interactMode = 4; + }; + class TentDome_SIM_EPOCH : Default + { + interactMode = 1; + }; class StorageShelf_EPOCH : Default { interactMode = 4; @@ -49,6 +66,10 @@ class CfgObjectInteractions { interactMode = 4; }; + class Garden_EPOCH : Default + { + interactMode = 4; + }; class Foundation_EPOCH : Default { interactMode = 1; @@ -150,6 +171,7 @@ class CfgObjectInteractions interactMode = 3; distance = 3; toxicChance = 0.2; + toxicAmount = 10; bloodpChance = 1; fatigueChance = 0.5; bleedAmount = 30; @@ -165,6 +187,7 @@ class CfgObjectInteractions interactMode = 3; distance = 3; toxicChance = 0.1; + toxicAmount = 10; bloodpChance = 1; fatigueChance = 0.5; bleedAmount = 30; @@ -194,6 +217,7 @@ class CfgObjectInteractions { distance = 6; toxicChance = 1; + toxicAmount = 100; bleedChance = 0; bloodpChance = 1; fatigueChance = 1; @@ -222,6 +246,7 @@ class CfgObjectInteractions { distance = 3; toxicChance = 0.1; + toxicAmount = 10; bloodpChance = 0.9; fatigueChance = 0.4; bleedAmount = 30; diff --git a/Sources/epoch_config/Configs/CfgPricing.hpp b/Sources/epoch_config/Configs/CfgPricing.hpp index 4d965197..29dff6f3 100644 --- a/Sources/epoch_config/Configs/CfgPricing.hpp +++ b/Sources/epoch_config/Configs/CfgPricing.hpp @@ -108,6 +108,10 @@ class CfgPricing { price = 10; }; + class ItemVehDocRara + { + price = 25; + }; class ItemBulb { price = 10; @@ -116,6 +120,10 @@ class CfgPricing { price = 10; }; + class SmeltingTools_EPOCH + { + price = 75; + }; class ItemBriefcaseE { price = 10; @@ -123,22 +131,38 @@ class CfgPricing class ItemBriefcaseGold100oz { price = 10000; + }; + class ItemBriefcaseSilver100oz + { + price = 1000; }; class ItemAluminumBar { price = 10; + }; + class ItemAluminumBar10oz + { + price = 100; }; class ItemCopperBar { price = 100; + }; + class ItemCopperBar10oz + { + price = 1000; }; class ItemTinBar { price = 1; + }; + class ItemTinBar10oz + { + price = 10; }; class ItemPlywoodPack { - price = 100; + price = 10; }; class ItemComboLock { @@ -310,6 +334,10 @@ class CfgPricing { price = 20; }; + class ItemGeigerCounter_EPOCH + { + price = 500; + }; class EpochRadio0 { price = 2; @@ -358,6 +386,30 @@ class CfgPricing { price = 50; }; + class SpareTire + { + price = 50; + }; + class EngineParts + { + price = 40; + }; + class EngineBlock + { + price = 60; + }; + class ItemGlass + { + price = 35; + }; + class ItemDuctTape + { + price = 25; + }; + class ItemRotor + { + price = 40; + }; class WhiskeyNoodle { price = 80; @@ -377,6 +429,10 @@ class CfgPricing class acc_flashlight { price = 5; + }; + class acc_flashlight_pistol + { + price = 5; }; class acc_pointer_IR { @@ -1657,11 +1713,11 @@ class CfgPricing }; class CUP_bipod_Harris_1A2_L { - price = 15; + price = 0; }; class CUP_bipod_VLTOR_Modpod { - price = 15; + price = 0; }; class CUP_Mxx_camo { @@ -1766,7 +1822,7 @@ class CfgPricing }; class WoodLog_EPOCH { - price = 1; + price = 2; }; class ItemRope { @@ -1796,6 +1852,50 @@ class CfgPricing { price = 5; }; + class Kit_Garden + { + price = 40; + }; + class Poppy + { + price = 50; + }; + class Goldenseal + { + price = 25; + }; + class Pumpkin + { + price = 5; + }; + class Hemp + { + price = 25; + }; + class Sunflower + { + price = 20; + }; + class SeedPacket_GoldenSeal + { + price = 5; + }; + class SeedPacket_Hemp + { + price = 5; + }; + class SeedPacket_Poppy + { + price = 5; + }; + class SeedPacket_Pumpkin + { + price = 5; + }; + class SeedPacket_Sunflower + { + price = 5; + }; class sardines_epoch { price = 2; @@ -1815,6 +1915,30 @@ class CfgPricing class sweetcorn_epoch { price = 2; + }; + class ChickenCarcass_EPOCH + { + price = 1; + }; + class SnakeCarcass_EPOCH + { + price = 1; + }; + class RabbitCarcass_EPOCH + { + price = 1; + }; + class GoatCarcass_EPOCH + { + price = 1; + }; + class DogCarcass_EPOCH + { + price = 1; + }; + class SheepCarcass_EPOCH + { + price = 1; }; class CookedSheep_EPOCH { @@ -1838,19 +1962,19 @@ class CfgPricing }; class ItemTrout { - price = 2; + price = 5; }; class ItemTroutCooked { - price = 20; + price = 10; }; class ItemSeaBass { - price = 5; + price = 6; }; class ItemSeaBassCooked { - price = 50; + price = 12; }; class ItemTuna { @@ -1858,12 +1982,48 @@ class CfgPricing }; class ItemTunaCooked { - price = 100; + price = 20; }; class FoodWalkNSons { price = 5; }; + class ItemPowderMilk + { + price = 2; + }; + class ItemRicebox + { + price = 3; + }; + class ItemCereals + { + price = 3; + }; + class ItemVitamins + { + price = 25; + }; + class krypto_candy_epoch + { + price = 3; + }; + class bluburger_epoch + { + price = 3; + }; + class redburger_epoch + { + price = 3; + }; + class gyro_wrap_epoch + { + price = 3; + }; + class icecream_epoch + { + price = 2; + }; class ItemSodaOrangeSherbet { price = 4; @@ -1907,6 +2067,42 @@ class CfgPricing class ColdPack { price = 2; + }; + class adrenaline_epoch + { + price = 10; + }; + class atropine_epoch + { + price = 10; + }; + class morphine_epoch + { + price = 10; + }; + class caffeinepills_epoch + { + price = 10; + }; + class orlistat_epoch + { + price = 10; + }; + class nanite_cream_epoch + { + price = 25; + }; + class nanite_gun_epoch + { + price = 100; + }; + class nanite_pills_epoch + { + price = 10; + }; + class iodide_pills_epoch + { + price = 20; }; class sr25_epoch { @@ -2503,6 +2699,18 @@ class CfgPricing class 6Rnd_RedSignal_F { price = 2; + }; + class 6Rnd_BlueSignal_F + { + price = 2; + }; + class 6Rnd_PurpleSignal_F + { + price = 2; + }; + class 6Rnd_OrangeSignal_F + { + price = 2; }; class EnergyPack { @@ -2616,35 +2824,35 @@ class CfgPricing }; class bipod_01_F_snd { - price = 15; + price = 0; }; class bipod_01_F_blk { - price = 15; + price = 0; }; class bipod_01_F_mtp { - price = 15; + price = 0; }; class bipod_02_F_blk { - price = 15; + price = 0; }; class bipod_02_F_tan { - price = 15; + price = 0; }; class bipod_02_F_hex { - price = 15; + price = 0; }; class bipod_03_F_blk { - price = 15; + price = 0; }; class bipod_03_F_oli { - price = 15; + price = 0; }; class Elcan_epoch { @@ -2737,6 +2945,10 @@ class CfgPricing class ItemGoldBar10oz { price = 1000; + }; + class ItemSilverBar10oz + { + price = 100; }; class ItemTopaz { @@ -2778,13 +2990,21 @@ class CfgPricing { price = 25; }; + class ItemCanvas + { + price = 10; + }; + class ItemSeedBag + { + price = 5; + }; class ItemKiloHemp { price = 100; }; class PartPlankPack { - price = 2; + price = 4; }; class CinderBlocks { @@ -2808,31 +3028,71 @@ class CfgPricing }; class KitStudWall { - price = 10; + price = 16; }; + class KitWoodQuarterFloor + { + price = 8; // price of 2 planks + }; + class KitWoodHalfFloor + { + price = 16; // price of 4 planks + }; class KitWoodFloor { - price = 10; + price = 32; // price of 8 planks + }; + class KitMetalQuarterFloor + { + price = 25; // price of 1 ItemCorrugatedLg + }; + class KitMetalHalfFloor + { + price = 50; // price of 2 ItemCorrugatedLg + }; + class KitMetalFloor + { + price = 100; // price of 4 ItemCorrugatedLg + }; + class KitCinderQuarterFloor + { + price = 40; //price of 1 CinderBlocks and 1 MortarBucket + }; + class KitCinderHalfFloor + { + price = 80; //price of 2 CinderBlocks and 2 MortarBucket + }; + class KitCinderFloor + { + price = 160; //price of 4 CinderBlocks and 4 MortarBucket }; class KitWoodStairs { - price = 10; + price = 16; // price of 4 planks }; class KitWoodTower { - price = 10; + price = 48; // price of 12 plank packs + }; + class KitMetalTower + { + price = 150; // price of 6 ItemCorrugatedLg + }; + class KitCinderTower + { + price = 200; //price of 5 CinderBlocks and 5 MortarBucket }; class KitWoodRamp { - price = 14; + price = 24; // price of 6 planks }; class KitSpikeTrap { - price = 25; + price = 42; }; class KitMetalTrap { - price = 25; + price = 46; }; class KitTankTrap { @@ -2840,11 +3100,11 @@ class CfgPricing }; class KitHesco3 { - price = 25; + price = 120; }; class KitWoodLadder { - price = 10; + price = 16; }; class KitFirePlace { @@ -2852,35 +3112,47 @@ class CfgPricing }; class KitTiPi { - price = 10; + price = 12; }; class KitShelf { - price = 90; + price = 24; }; + class KitTentA + { + price = 50; + }; + class KitTentDome + { + price = 70; + }; class KitWorkbench { - price = 10; + price = 8; + }; + class KitBarbedWire + { + price = 90; }; class KitWoodFoundation { - price = 20; + price = 32; }; class KitFoundation { - price = 90; + price = 80; }; class KitPlotPole { - price = 300; + price = 250; }; class KitSolarGen { - price = 200; + price = 325; }; class KitCinderWall { - price = 140; + price = 80; }; class ItemSolar { @@ -2994,6 +3266,14 @@ class CfgPricing { price = 30; }; + class BarrelBomb_EPOCH_Remote_Mag + { + price = 80; + }; + class BarrelBomb2_EPOCH_Remote_Mag + { + price = 80; + }; class B_AssaultPack_cbr { price = 10; @@ -3974,6 +4254,11 @@ class CfgPricing { price = 750; }; + class C_Offroad_01_EPOCH1: C_Offroad_01_EPOCH{}; + class C_Offroad_01_EPOCH2: C_Offroad_01_EPOCH{}; + class C_Offroad_01_EPOCH3: C_Offroad_01_EPOCH{}; + class C_Offroad_01_EPOCH4: C_Offroad_01_EPOCH{}; + class C_Offroad_01_EPOCH5: C_Offroad_01_EPOCH{}; class C_Quadbike_01_EPOCH { price = 500; @@ -3982,14 +4267,26 @@ class CfgPricing { price = 750; }; + class C_Hatchback_01_EPOCH1: C_Hatchback_01_EPOCH{}; + class C_Hatchback_01_EPOCH2: C_Hatchback_01_EPOCH{}; + class C_Hatchback_01_EPOCH3: C_Hatchback_01_EPOCH{}; + class C_Hatchback_01_EPOCH4: C_Hatchback_01_EPOCH{}; class C_Hatchback_02_EPOCH { price = 1000; }; + class C_Hatchback_02_EPOCH1: C_Hatchback_02_EPOCH{}; + class C_Hatchback_02_EPOCH2: C_Hatchback_02_EPOCH{}; + class C_Hatchback_02_EPOCH3: C_Hatchback_02_EPOCH{}; + class C_Hatchback_02_EPOCH4: C_Hatchback_02_EPOCH{}; class C_SUV_01_EPOCH { price = 750; }; + class C_SUV_01_EPOCH1: C_SUV_01_EPOCH{}; + class C_SUV_01_EPOCH2: C_SUV_01_EPOCH{}; + class C_SUV_01_EPOCH3: C_SUV_01_EPOCH{}; + class C_SUV_01_EPOCH4: C_SUV_01_EPOCH{}; class C_Rubberboat_EPOCH { price = 500; @@ -4046,6 +4343,10 @@ class CfgPricing { price = 2500; }; + class B_G_Offroad_01_armed_EPOCH1: B_G_Offroad_01_armed_EPOCH{}; + class B_G_Offroad_01_armed_EPOCH2: B_G_Offroad_01_armed_EPOCH{}; + class B_G_Offroad_01_armed_EPOCH3: B_G_Offroad_01_armed_EPOCH{}; + class B_G_Offroad_01_armed_EPOCH4: B_G_Offroad_01_armed_EPOCH{}; class B_Truck_01_transport_EPOCH { price = 1000; @@ -4398,7 +4699,947 @@ class CfgPricing { price = 10; }; + class 500Rnd_127x99_mag + { + price = 500; + }; + class 500Rnd_127x99_mag_Tracer_Red + { + price = 500; + }; + class 500Rnd_127x99_mag_Tracer_Green + { + price = 500; + }; + class 500Rnd_127x99_mag_Tracer_Yellow + { + price = 500; + }; + class 200Rnd_127x99_mag + { + price = 200; + }; + class 200Rnd_127x99_mag_Tracer_Red + { + price = 200; + }; + class 200Rnd_127x99_mag_Tracer_Green + { + price = 200; + }; + class 200Rnd_127x99_mag_Tracer_Yellow + { + price = 200; + }; + class 100Rnd_127x99_mag + { + price = 100; + }; + class 100Rnd_127x99_mag_Tracer_Red + { + price = 100; + }; + class 100Rnd_127x99_mag_Tracer_Green + { + price = 100; + }; + class 100Rnd_127x99_mag_Tracer_Yellow + { + price = 100; + }; + class 2000Rnd_762x51_Belt + { + price = 1250; + }; + class 200Rnd_40mm_G_belt + { + price = 650; + }; + class 32Rnd_40mm_G_belt + { + price = 350; + }; + class 64Rnd_40mm_G_belt + { + price = 400; + }; + class 96Rnd_40mm_G_belt + { + price = 500; + }; + class 200Rnd_20mm_G_belt + { + price = 550; + }; + class 40Rnd_20mm_G_belt + { + price = 350; + }; + class 60Rnd_CMFlare_Chaff_Magazine + { + price = 30; + }; + class 120Rnd_CMFlare_Chaff_Magazine + { + price = 60; + }; + class 240Rnd_CMFlare_Chaff_Magazine + { + price = 120; + }; + class 192Rnd_CMFlare_Chaff_Magazine + { + price = 96; + }; + class 168Rnd_CMFlare_Chaff_Magazine + { + price = 84; + }; + class 300Rnd_CMFlare_Chaff_Magazine + { + price = 150; + }; + class SmokeLauncherMag + { + price = 50; + }; + class SmokeLauncherMag_boat + { + price = 50; + }; + class 200Rnd_65x39_Belt + { + price = 350; + }; + class 200Rnd_65x39_Belt_Tracer_Red + { + price = 350; + }; + class 200Rnd_65x39_Belt_Tracer_Green + { + price = 350; + }; + class 200Rnd_65x39_Belt_Tracer_Yellow + { + price = 350; + }; + class 1000Rnd_65x39_Belt + { + price = 650; + }; + class 1000Rnd_65x39_Belt_Tracer_Red + { + price = 650; + }; + class 1000Rnd_65x39_Belt_Green + { + price = 650; + }; + class 1000Rnd_65x39_Belt_Tracer_Green + { + price = 650; + }; + class 1000Rnd_65x39_Belt_Yellow + { + price = 650; + }; + class 1000Rnd_65x39_Belt_Tracer_Yellow + { + price = 650; + }; + class 2000Rnd_65x39_Belt + { + price = 1000; + }; + class 2000Rnd_65x39_Belt_Tracer_Red + { + price = 1000; + }; + class 2000Rnd_65x39_Belt_Green + { + price = 1000; + }; + class 2000Rnd_65x39_Belt_Tracer_Green + { + price = 1000; + }; + class 2000Rnd_65x39_Belt_Tracer_Green_Splash + { + price = 1000; + }; + class 2000Rnd_65x39_Belt_Yellow + { + price = 1000; + }; + class 2000Rnd_65x39_Belt_Tracer_Yellow + { + price = 1000; + }; + class 2000Rnd_65x39_Belt_Tracer_Yellow_Splash + { + price = 1000; + }; + class 8Rnd_82mm_Mo_shells + { + price = 350; + }; + class 8Rnd_82mm_Mo_Flare_white + { + price = 350; + }; + class 8Rnd_82mm_Mo_Smoke_white + { + price = 350; + }; + class 8Rnd_82mm_Mo_guided + { + price = 350; + }; + class 8Rnd_82mm_Mo_LG + { + price = 350; + }; + class 24Rnd_PG_missiles + { + price = 4000; + }; + class 12Rnd_PG_missiles + { + price = 2000; + }; + class 24Rnd_missiles + { + price = 3500; + }; + class 12Rnd_missiles + { + price = 1750; + }; + class 60Rnd_40mm_GPR_shells + { + price = 500; + }; + class 60Rnd_40mm_GPR_Tracer_Red_shells + { + price = 500; + }; + class 60Rnd_40mm_GPR_Tracer_Green_shells + { + price = 500; + }; + class 60Rnd_40mm_GPR_Tracer_Yellow_shells + { + price = 500; + }; + class 40Rnd_40mm_APFSDS_shells + { + price = 350; + }; + class 40Rnd_40mm_APFSDS_Tracer_Red_shells + { + price = 350; + }; + class 40Rnd_40mm_APFSDS_Tracer_Green_shells + { + price = 350; + }; + class 40Rnd_40mm_APFSDS_Tracer_Yellow_shells + { + price = 350; + }; + class 140Rnd_30mm_MP_shells + { + price = 750; + }; + class 140Rnd_30mm_MP_shells_Tracer_Red + { + price = 750; + }; + class 140Rnd_30mm_MP_shells_Tracer_Green + { + price = 750; + }; + class 140Rnd_30mm_MP_shells_Tracer_Yellow + { + price = 750; + }; + class 60Rnd_30mm_APFSDS_shells + { + price = 450; + }; + class 60Rnd_30mm_APFSDS_shells_Tracer_Red + { + price = 450; + }; + class 60Rnd_30mm_APFSDS_shells_Tracer_Green + { + price = 450; + }; + class 60Rnd_30mm_APFSDS_shells_Tracer_Yellow + { + price = 450; + }; + // new male start + class U_C_Commoner1_1 + { + price = 7; + }; + class U_C_Poor_2 + { + price = 7; + }; + class U_C_HunterBody_grn + { + price = 7; + }; + class U_C_Poor_shorts_1 + { + price = 7; + }; + class U_C_Commoner_shorts + { + price = 7; + }; + class U_C_ShirtSurfer_shorts + { + price = 7; + }; + class U_C_TeeSurfer_shorts_1 + { + price = 7; + }; + class U_C_TeeSurfer_shorts_2 + { + price = 7; + }; + class U_NikosBody + { + price = 7; + }; + class U_NikosAgedBody + { + price = 7; + }; + class U_IG_Guerilla1_1 + { + price = 7; + }; + class U_IG_leader + { + price = 7; + }; + class U_IG_Guerilla2_1 + { + price = 7; + }; + class U_IG_Guerilla2_3 + { + price = 7; + }; + class U_IG_Guerilla2_2 + { + price = 7; + }; + class U_IG_Guerilla3_1 + { + price = 7; + }; + class U_IG_Guerrilla_6_1 + { + price = 7; + }; + class U_OG_Guerrilla_6_1 + { + price = 7; + }; + class U_I_CombatUniform + { + price = 7; + }; + class U_I_CombatUniform_shortsleeve + { + price = 7; + }; + class U_I_HeliPilotCoveralls + { + price = 7; + }; + class U_I_pilotCoveralls + { + price = 7; + }; + class U_I_OfficerUniform + { + price = 7; + }; + class U_I_Wetsuit + { + price = 7; + }; + class U_I_GhillieSuit + { + price = 7; + }; + class U_I_CombatUniform_tshirt + { + price = 7; + }; + class U_O_OfficerUniform_ocamo + { + price = 7; + }; + class U_O_SpecopsUniform_ocamo + { + price = 7; + }; + class U_O_CombatUniform_oucamo + { + price = 7; + }; + class U_Marshal + { + price = 7; + }; + class U_B_Protagonist_VR + { + price = 7; + }; + class U_O_Protagonist_VR + { + price = 7; + }; + class U_I_Protagonist_VR + { + price = 7; + }; + class U_I_FullGhillie_lsh + { + price = 7; + }; + class U_I_FullGhillie_sard + { + price = 7; + }; + class U_I_FullGhillie_ard + { + price = 7; + }; + class U_I_C_Soldier_Para_1_F + { + price = 7; + }; + class U_I_C_Soldier_Para_2_F + { + price = 7; + }; + class U_I_C_Soldier_Para_3_F + { + price = 7; + }; + class U_I_C_Soldier_Para_4_F + { + price = 7; + }; + class U_I_C_Soldier_Para_5_F + { + price = 7; + }; + class U_I_C_Soldier_Bandit_1_F + { + price = 7; + }; + class U_I_C_Soldier_Bandit_2_F + { + price = 7; + }; + class U_I_C_Soldier_Bandit_3_F + { + price = 7; + }; + class U_I_C_Soldier_Bandit_4_F + { + price = 7; + }; + class U_I_C_Soldier_Bandit_5_F + { + price = 7; + }; + class U_I_C_Soldier_Camo_F + { + price = 7; + }; + class U_O_T_Soldier_F + { + price = 7; + }; + class U_O_T_Officer_F + { + price = 7; + }; + class U_O_T_Sniper_F + { + price = 7; + }; + class U_O_T_FullGhillie_tna_F + { + price = 7; + }; + class U_O_V_Soldier_Viper_F + { + price = 7; + }; + class U_O_V_Soldier_Viper_hex_F + { + price = 7; + }; + class U_C_man_sport_1_F + { + price = 7; + }; + class U_C_man_sport_2_F + { + price = 7; + }; + class U_C_man_sport_3_F + { + price = 7; + }; + class U_C_Man_casual_1_F + { + price = 7; + }; + class U_C_Man_casual_2_F + { + price = 7; + }; + class U_C_Man_casual_3_F + { + price = 7; + }; + class U_C_Man_casual_4_F + { + price = 7; + }; + class U_C_Man_casual_5_F + { + price = 7; + }; + class U_C_Man_casual_6_F + { + price = 7; + }; + class U_C_IDAP_Man_cargo_F + { + price = 7; + }; + class U_C_IDAP_Man_jeans_F + { + price = 7; + }; + class U_C_IDAP_Man_TeeShorts_F + { + price = 7; + }; + class U_C_IDAP_Man_Tee_F + { + price = 7; + }; + class U_C_IDAP_Man_casual_F + { + price = 7; + }; + class U_C_IDAP_Man_shorts_F + { + price = 7; + }; + class U_C_ConstructionCoverall_Red_F + { + price = 7; + }; + class U_C_ConstructionCoverall_vrana_F + { + price = 7; + }; + class U_C_ConstructionCoverall_Black_F + { + price = 7; + }; + class U_C_ConstructionCoverall_Blue_F + { + price = 7; + }; + class U_C_Paramedic_01_F + { + price = 7; + }; + class U_C_Mechanic_01_F + { + price = 7; + }; + + // new male stop + + class U_JeansPatched1_uniform + { + price = 5; + }; + class U_JeansPatched2_uniform + { + price = 5; + }; + class U_JeansPatched3_uniform + { + price = 5; + }; + class U_JeansPatched4_uniform + { + price = 5; + }; + class U_JeansPatched5_uniform + { + price = 5; + }; + class U_JeansPatched6_uniform + { + price = 5; + }; + class U_JeansPatched7_uniform + { + price = 5; + }; + class U_JeansPatched8_uniform + { + price = 5; + }; + class U_JeansPatched9_uniform + { + price = 5; + }; + class U_JeansPatched10_uniform + { + price = 5; + }; + class U_JeansPatched11_uniform + { + price = 5; + }; + class U_JeansPatched12_uniform + { + price = 5; + }; + class U_JeansPatched13_uniform + { + price = 5; + }; + class U_JeansPatched14_uniform + { + price = 5; + }; + class U_JeansPatched15_uniform + { + price = 5; + }; + class U_JeansPatched16_uniform + { + price = 5; + }; + class U_JeansPatched17_uniform + { + price = 5; + }; + class U_JeansPatched18_uniform + { + price = 5; + }; + class U_JeansPatched19_uniform + { + price = 5; + }; + class U_JeansPatched20_uniform + { + price = 5; + }; + class U_JeansPatched21_uniform + { + price = 5; + }; + class U_JeansBlkBrn1_uniform + { + price = 5; + }; + class U_JeansBlkBrn2_uniform + { + price = 5; + }; + class U_JeansBlkBrn3_uniform + { + price = 5; + }; + class U_JeansBlkBrn4_uniform + { + price = 5; + }; + class U_JeansBlkBrn5_uniform + { + price = 5; + }; + class U_JeansBlkBrn6_uniform + { + price = 5; + }; + class U_JeansBlkBrn7_uniform + { + price = 5; + }; + class U_JeansBlkBrn8_uniform + { + price = 5; + }; + class U_JeansBlkBrn9_uniform + { + price = 5; + }; + class U_JeansBlkBrn10_uniform + { + price = 5; + }; + class U_JeansBlkBrn11_uniform + { + price = 5; + }; + class U_JeansBlkBrn12_uniform + { + price = 5; + }; + class U_JeansBlkBrn13_uniform + { + price = 5; + }; + class U_JeansBlkBrn14_uniform + { + price = 5; + }; + class U_JeansBlkBrn15_uniform + { + price = 5; + }; + class U_JeansBlkBrn16_uniform + { + price = 5; + }; + class U_JeansBlkBrn17_uniform + { + price = 5; + }; + class U_JeansBlkBrn18_uniform + { + price = 5; + }; + class U_JeansBlkBrn19_uniform + { + price = 5; + }; + class U_JeansBlkBrn20_uniform + { + price = 5; + }; + class U_JeansBlkBrn21_uniform + { + price = 5; + }; + class U_JeansArBrn1_uniform + { + price = 5; + }; + class U_JeansArBrn2_uniform + { + price = 5; + }; + class U_JeansArBrn3_uniform + { + price = 5; + }; + class U_JeansArBrn4_uniform + { + price = 5; + }; + class U_JeansArBrn5_uniform + { + price = 5; + }; + class U_JeansArBrn6_uniform + { + price = 5; + }; + class U_JeansArBrn7_uniform + { + price = 5; + }; + class U_JeansArBrn8_uniform + { + price = 5; + }; + class U_JeansArBrn9_uniform + { + price = 5; + }; + class U_JeansArBrn10_uniform + { + price = 5; + }; + class U_JeansArBrn11_uniform + { + price = 5; + }; + class U_JeansArBrn12_uniform + { + price = 5; + }; + class U_JeansArBrn13_uniform + { + price = 5; + }; + class U_JeansArBrn14_uniform + { + price = 5; + }; + class U_JeansArBrn15_uniform + { + price = 5; + }; + class U_JeansArBrn16_uniform + { + price = 5; + }; + class U_JeansArBrn17_uniform + { + price = 5; + }; + class U_JeansArBrn18_uniform + { + price = 5; + }; + class U_JeansArBrn19_uniform + { + price = 5; + }; + class U_JeansArBrn20_uniform + { + price = 5; + }; + class U_JeansArBrn21_uniform + { + price = 5; + }; + class U_JeansBlack1_uniform + { + price = 5; + }; + class U_JeansBlack2_uniform + { + price = 5; + }; + class U_JeansBlack3_uniform + { + price = 5; + }; + class U_JeansBlack4_uniform + { + price = 5; + }; + class U_JeansBlack5_uniform + { + price = 5; + }; + class U_JeansBlack6_uniform + { + price = 5; + }; + class U_JeansBlack7_uniform + { + price = 5; + }; + class U_JeansBlack8_uniform + { + price = 5; + }; + class U_JeansBlack9_uniform + { + price = 5; + }; + class U_JeansBlack10_uniform + { + price = 5; + }; + class U_JeansBlack11_uniform + { + price = 5; + }; + class U_JeansBlack12_uniform + { + price = 5; + }; + class U_JeansBlack13_uniform + { + price = 5; + }; + class U_JeansBlack14_uniform + { + price = 5; + }; + class U_JeansBlack15_uniform + { + price = 5; + }; + class U_JeansBlack16_uniform + { + price = 5; + }; + class U_JeansBlack17_uniform + { + price = 5; + }; + class U_JeansBlack18_uniform + { + price = 5; + }; + class U_JeansBlack19_uniform + { + price = 5; + }; + class U_JeansBlack20_uniform + { + price = 5; + }; + class U_JeansBlack21_uniform + { + price = 5; + }; + class hockey_mask_epoch + { + price = 30; + }; + class plague_mask_epoch + { + price = 30; + }; + class ghostface_mask_epoch + { + price = 30; + }; + class skull_mask_epoch + { + price = 30; + }; + class witch_mask_epoch + { + price = 30; + }; + class radiation_mask_epoch + { + price = 75; + }; /////////////////////////////////////////////////////////////////////////////// // Apex Items & Weapons /////////////////////////////////////////////////////////////////////////////// @@ -4468,7 +5709,7 @@ class CfgPricing class optic_Holosight_blk_F { price = 5; }; class optic_Holosight_khk_F { price = 5; }; class optic_Holosight_smg_blk_F { price = 5; }; - class bipod_01_F_khk { price = 2; }; + class bipod_01_F_khk { price = 0; }; class 30Rnd_9x21_Mag_SMG_02 { price = 3;}; class 30Rnd_9x21_Mag_SMG_02_Tracer_Red { price = 2; }; class 30Rnd_9x21_Mag_SMG_02_Tracer_Yellow { price = 2; }; diff --git a/Sources/epoch_config/Configs/CfgReadingDocuments.hpp b/Sources/epoch_config/Configs/CfgReadingDocuments.hpp new file mode 100644 index 00000000..1900c5ca --- /dev/null +++ b/Sources/epoch_config/Configs/CfgReadingDocuments.hpp @@ -0,0 +1,70 @@ +/* + @author = "Aaron Clark - https://EpochMod.com"; + @contributors[] = {"DirtySanchez"}; + @description = "Readable Document Message Configs"; + @licence = "Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike"; + @github = ""; +*/ +class CfgReadingDocuments +{ + class ItemVehDoc1 + { + displayMessage[] = {"Max Speed, Terrain Coef, Gears and more were edited","Upgrade your vehicle's Speed and Offroad Performance"}; + }; + class KitVehicleUpgradeI_100_EPOCH: ItemVehDoc1{}; + class KitVehicleUpgradeI_200_EPOCH: ItemVehDoc1{}; + class KitVehicleUpgradeI_300_EPOCH: ItemVehDoc1{}; + class ItemVehDoc2 + { + displayMessage[] = {"Upgrade your vehicle's body, wheels and windows with armor strength"}; + }; + class KitVehicleUpgradeII_100_EPOCH: ItemVehDoc2{}; + class KitVehicleUpgradeII_200_EPOCH: ItemVehDoc2{}; + class KitVehicleUpgradeII_300_EPOCH: ItemVehDoc2{}; + class ItemVehDoc3 + { + displayMessage[] = {"Increase your vehicle's inventory capacity for items, magazines, weapons and more"}; + }; + class KitVehicleUpgradeIII_100_EPOCH: ItemVehDoc3{}; + class KitVehicleUpgradeIII_200_EPOCH: ItemVehDoc3{}; + class KitVehicleUpgradeIII_300_EPOCH: ItemVehDoc3{}; + class ItemVehDoc4 + { + displayMessage[] = {"Increase your fuel capacity for those long hauls across your favorite ISLANDS"}; + }; + class KitVehicleUpgradeIV_100_EPOCH: ItemVehDoc1{}; + class KitVehicleUpgradeIV_200_EPOCH: ItemVehDoc1{}; + class KitVehicleUpgradeIV_300_EPOCH: ItemVehDoc1{}; + class ItemDoc1 + { + displayMessage[] = {"It was a beautiful day on Johnny's block","While Johnny was watching his father take all he could","Daddy's Roommate by Will Michoite"}; + }; + class ItemDoc2 + { + displayMessage[] = {"An elaborate story on a small town kid with big town mommies, I mean tittied.","Heather has TWO Mommies by Leslea Newman and Diana Solza"}; + }; + class ItemDoc3 + { + displayMessage[] = {"Look its todays edition and OH crap you die today, nvm thats O'Tool whom died","Trade City Obituaries by Your Fellow Community Members and AI"}; + }; + class ItemDoc4 + { + displayMessage[] = {"As you open the manilla folder you see pictures of your mom..."}; + }; + class ItemDoc5 + { + displayMessage[] = {"First you have no liquor and then you get slapped by a woman. This is not your day..."}; + }; + class ItemDoc6 + { + displayMessage[] = {"Wooden Ramp for DUMMIES volume 3"}; + }; + class ItemDoc7 + { + displayMessage[] = {"Swap the Deck, a seductive tale so bad the author couldnt put his name on it!"}; + }; + class ItemDoc8 + { + displayMessage[] = {"'He Touch Me, He Touch Me NOT is Back' raves Cherno Shmerno!","#1 Bestseller throughout Arma 2 DayZ Epoch"}; + }; +}; \ No newline at end of file diff --git a/Sources/epoch_config/Configs/CfgRemoteExec.hpp b/Sources/epoch_config/Configs/CfgRemoteExec.hpp index 99bbfa24..f3b66253 100644 --- a/Sources/epoch_config/Configs/CfgRemoteExec.hpp +++ b/Sources/epoch_config/Configs/CfgRemoteExec.hpp @@ -300,6 +300,46 @@ class CfgRemoteExec { allowedTargets = 2; jip = 0; + }; + class EPOCH_server_upgrade_vehicle + { + allowedTargets = 2; + jip = 0; + }; + class EPOCH_fnc_updatePlayerStats + { + allowedTargets = 2; + jip = 0; + }; + class EPOCH_client_updatePlayerStat + { + allowedTargets = 1; + jip = 0; + }; + class EPOCH_server_createTempGroup + { + allowedTargets = 2; + jip = 0; + }; + class EPOCH_server_invitePlayerTempGroup + { + allowedTargets = 2; + jip = 0; + }; + class EPOCH_server_updatePlayerTempGroup + { + allowedTargets = 2; + jip = 0; + }; + class EPOCH_server_deleteTempGroup + { + allowedTargets = 2; + jip = 0; + }; + class EPOCH_server_upgradeTempGroup + { + allowedTargets = 2; + jip = 0; }; }; class Commands diff --git a/Sources/epoch_config/Configs/CfgServicePoint.hpp b/Sources/epoch_config/Configs/CfgServicePoint.hpp index 9c1af975..ca27af21 100644 --- a/Sources/epoch_config/Configs/CfgServicePoint.hpp +++ b/Sources/epoch_config/Configs/CfgServicePoint.hpp @@ -1,7 +1,29 @@ class CfgServicePoint { class Altis { ServicePoints[] = { // Array of coords for ServicePoints - {13325,14477,0} +/* + {pos1}, + {pos2} + OR + { + pos1, + dist1, + {VehType_1,VehType_1,...}, + "MarkerText1" + }, + { + pos2, + dist2, + {VehType,VehType,...}, + "MarkerText2" + } +*/ + { // Central + {13325,14477,0}, // Pos + 40, // max distance + {"Landvehicle","Ship","Tank","AIR"}, // Vehicle Types for SP + "Service Point Land / Ship / Air" // Marker Text (Leave it Blank to disable Marker) + } }; }; class Tanoa { @@ -24,12 +46,23 @@ class CfgServicePoint { }; }; - ServicePointClasses[] = { // Array of Classnames, where also are ServicePoints + ServicePointClasses[] = { // Array of Classnames where also are ServicePoints (not separat configurable for Vehicle types / distance) // "Land_Pillar_Pier_F", // "Land_CarService_F", // "Land_fs_feed_F", // "Land_fs_roof_F" }; + PreventRepairs[] = { // These Hitpints will not be repaired, if damage >= value (Prevent from Duping Tires / Engines) + {"HitLFWheel",1}, // {"HitPoint",value} + {"HitLF2Wheel",1}, + {"HitLMWheel",1}, + {"HitLBWheel",1}, + {"HitRFWheel",1}, + {"HitRF2Wheel",1}, + {"HitRMWheel",1}, + {"HitRBWheel",1}, + {"HitEngine",1} + }; ServicePointDist = 40; refuel_updateInterval = 1; refuel_amount = 0.1; @@ -249,6 +282,12 @@ class CfgServicePoint { {"SmokeLauncherMag_boat",{-1},1,100}, {"200Rnd_127x99_mag_Tracer_Green",{1},3,300} } - } + }, + { + "mosquito_epoch_armedG", + { + {"3Rnd_MosquitoGrenade",{-1},1,60} + } + } }; }; diff --git a/Sources/epoch_config/Configs/CfgSnapChecks.hpp b/Sources/epoch_config/Configs/CfgSnapChecks.hpp index a6208a5b..97ceafb6 100644 --- a/Sources/epoch_config/Configs/CfgSnapChecks.hpp +++ b/Sources/epoch_config/Configs/CfgSnapChecks.hpp @@ -25,19 +25,31 @@ class CfgSnapChecks class WoodLargeWallDoor_EPOCH : WoodLargeWall_EPOCH {}; class WoodLargeWallDoorL_EPOCH : WoodLargeWall_EPOCH {}; class CinderWallGarage_EPOCH : WoodLargeWall_EPOCH {}; + class CinderWallDoorwHatch_EPOCH : WoodLargeWall_EPOCH {}; class CinderWall_EPOCH : WoodLargeWall_EPOCH {}; class CinderWallHalf_EPOCH : WoodLargeWall_EPOCH {}; class WoodFloor_Epoch { nails[] = {{{0,0,0.15},{2.8555,0,0.15}},{{0,0,0.15},{0,2.8555,0.15}},{{0,0,0.15},{-2.8555,0,0.15}},{{0,0,0.15},{0,-2.8555,0.15}},{{2.5555,0,0.15},{2.5555,0,-0.15}},{{-2.5555,0,0.15},{-2.5555,0,-0.15}},{{0,-2.5555,0.15},{0,-2.5555,-0.15}},{{0,2.5555,0.15},{0,2.5555,-0.15}}}; }; + class WoodHalfFloor_EPOCH + { + nails[] = {{{0,0,0.15},{1.42775,0,0.15}},{{0,0,0.15},{0,2.8555,0.15}},{{0,0,0.15},{-1.42775,0,0.15}},{{0,0,0.15},{0,-2.8555,0.15}},{{1.12775,0,0.15},{1.12775,0,-0.15}},{{-1.12775,0,0.15},{-1.12775,0,-0.15}},{{0,-2.5555,0.15},{0,-2.5555,-0.15}},{{0,2.5555,0.15},{0,2.5555,-0.15}}}; + }; + class WoodQuarterFloor_EPOCH + { + nails[] = {{{0,0,0.15},{1.42775,0,0.15}},{{0,0,0.15},{0,1.42775,0.15}},{{0,0,0.15},{-1.42775,0,0.15}},{{0,0,0.15},{0,-1.42775,0.15}},{{1.12775,0,0.15},{1.12775,0,-0.15}},{{-1.12775,0,0.15},{-1.12775,0,-0.15}},{{0,-1.12775,0.15},{0,-1.12775,-0.15}},{{0,1.12775,0.15},{0,1.12775,-0.15}}}; + }; class MetalFloor_EPOCH : WoodFloor_Epoch {}; + class CinderFloor_EPOCH : WoodFloor_Epoch {}; class WoodStairs_EPOCH { nails[] = {{{0.1,0,0.05},{0.1,0,-0.2}},{{-0.1,0,0.05},{-0.1,0,-0.2}}}; }; class WoodStairs2_EPOCH : WoodStairs_EPOCH {}; class WoodTower_EPOCH : WoodStairs_EPOCH {}; + class MetalTower_EPOCH : WoodStairs_EPOCH {}; + class CinderTower_EPOCH : WoodStairs_EPOCH {}; class WoodRamp_EPOCH : WoodStairs_EPOCH {}; }; diff --git a/Sources/epoch_config/Configs/CfgVehicleUpgrades.hpp b/Sources/epoch_config/Configs/CfgVehicleUpgrades.hpp new file mode 100644 index 00000000..3c076568 --- /dev/null +++ b/Sources/epoch_config/Configs/CfgVehicleUpgrades.hpp @@ -0,0 +1,114 @@ +/* + @author = "Aaron Clark - https://EpochMod.com"; + @contributors[] = {"DirtySanchez","He-Man"}; + @description = "Vehicle Upgrade configs"; + @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_config/Configs/CfgItemInteractions.hpp"; +*/ +class CfgVehicleUpgrades +{ + class C_Hatchback_01_EPOCH + { + upgradeToVehicle[] = {"C_Hatchback_01_EPOCH1"}; + class C_Hatchback_01_EPOCH1 + { + ReqMaterials[] = {{1,"KitVehicleUpgradeI_200_EPOCH"}}; + }; + class C_Hatchback_02_EPOCH1: C_Hatchback_01_EPOCH1 {}; + class C_Offroad_01_EPOCH1: C_Hatchback_01_EPOCH1 {}; + class C_SUV_01_EPOCH1: C_Hatchback_01_EPOCH1 {}; + class B_MRAP_01_EPOCH1: C_Hatchback_01_EPOCH1 {}; + class O_MRAP_02_EPOCH1: C_Hatchback_01_EPOCH1 {}; + class I_MRAP_03_EPOCH1: C_Hatchback_01_EPOCH1 {}; + }; + class C_Hatchback_02_EPOCH: C_Hatchback_01_EPOCH { upgradeToVehicle[] = {"C_Hatchback_02_EPOCH1"}; }; + class C_Offroad_01_EPOCH: C_Hatchback_01_EPOCH { upgradeToVehicle[] = {"C_Offroad_01_EPOCH1"}; }; + class C_SUV_01_EPOCH: C_Hatchback_01_EPOCH { upgradeToVehicle[] = {"C_SUV_01_EPOCH1"}; }; + class B_MRAP_01_EPOCH: C_Hatchback_01_EPOCH { upgradeToVehicle[] = {"B_MRAP_01_EPOCH1"}; }; + class O_MRAP_02_EPOCH: C_Hatchback_01_EPOCH { upgradeToVehicle[] = {"O_MRAP_02_EPOCH1"}; }; + class I_MRAP_03_EPOCH: C_Hatchback_01_EPOCH { upgradeToVehicle[] = {"I_MRAP_03_EPOCH1"}; }; + + class C_Hatchback_01_EPOCH1 + { + upgradeToVehicle[] = {"C_Hatchback_01_EPOCH2"}; + class C_Hatchback_01_EPOCH2 + { + ReqMaterials[] = {{1,"KitVehicleUpgradeII_200_EPOCH"}}; + }; + class C_Hatchback_02_EPOCH2: C_Hatchback_01_EPOCH2 {}; + class C_Offroad_01_EPOCH2: C_Hatchback_01_EPOCH2 {}; + class C_SUV_01_EPOCH2: C_Hatchback_01_EPOCH2 {}; + class B_MRAP_01_EPOCH2: C_Hatchback_01_EPOCH2 {}; + class O_MRAP_02_EPOCH2: C_Hatchback_01_EPOCH2 {}; + class I_MRAP_03_EPOCH2: C_Hatchback_01_EPOCH2 {}; + }; + class C_Hatchback_02_EPOCH1: C_Hatchback_01_EPOCH1 { upgradeToVehicle[] = {"C_Hatchback_02_EPOCH2"}; }; + class C_Offroad_01_EPOCH1: C_Hatchback_01_EPOCH1 { upgradeToVehicle[] = {"C_Offroad_01_EPOCH2"}; }; + class C_SUV_01_EPOCH1: C_Hatchback_01_EPOCH1 { upgradeToVehicle[] = {"C_SUV_01_EPOCH2"}; }; + class B_MRAP_01_EPOCH1: C_Hatchback_01_EPOCH1 { upgradeToVehicle[] = {"B_MRAP_01_EPOCH2"}; }; + class O_MRAP_02_EPOCH1: C_Hatchback_01_EPOCH1 { upgradeToVehicle[] = {"O_MRAP_02_EPOCH2"}; }; + class I_MRAP_03_EPOCH1: C_Hatchback_01_EPOCH1 { upgradeToVehicle[] = {"I_MRAP_03_EPOCH2"}; }; + + class C_Hatchback_01_EPOCH2 + { + upgradeToVehicle[] = {"C_Hatchback_01_EPOCH3"}; + class C_Hatchback_01_EPOCH3 + { + ReqMaterials[] = {{1,"KitVehicleUpgradeIII_200_EPOCH"}}; + }; + class C_Hatchback_02_EPOCH3: C_Hatchback_01_EPOCH3 {}; + class C_Offroad_01_EPOCH3: C_Hatchback_01_EPOCH3 {}; + class C_SUV_01_EPOCH3: C_Hatchback_01_EPOCH3 {}; + class B_MRAP_01_EPOCH3: C_Hatchback_01_EPOCH3 {}; + class O_MRAP_02_EPOCH3: C_Hatchback_01_EPOCH3 {}; + class I_MRAP_03_EPOCH3: C_Hatchback_01_EPOCH3 {}; + }; + class C_Hatchback_02_EPOCH2: C_Hatchback_01_EPOCH2 { upgradeToVehicle[] = {"C_Hatchback_02_EPOCH3"}; }; + class C_Offroad_01_EPOCH2: C_Hatchback_01_EPOCH2 { upgradeToVehicle[] = {"C_Offroad_01_EPOCH3"}; }; + class C_SUV_01_EPOCH2: C_Hatchback_01_EPOCH2 { upgradeToVehicle[] = {"C_SUV_01_EPOCH3"}; }; + class B_MRAP_01_EPOCH2: C_Hatchback_01_EPOCH2 { upgradeToVehicle[] = {"B_MRAP_01_EPOCH3"}; }; + class O_MRAP_02_EPOCH2: C_Hatchback_01_EPOCH2 { upgradeToVehicle[] = {"O_MRAP_02_EPOCH3"}; }; + class I_MRAP_03_EPOCH2: C_Hatchback_01_EPOCH2 { upgradeToVehicle[] = {"I_MRAP_03_EPOCH3"}; }; + + class C_Hatchback_01_EPOCH3 + { + upgradeToVehicle[] = {"C_Hatchback_01_EPOCH4"}; + class C_Hatchback_01_EPOCH4 + { + ReqMaterials[] = {{1,"KitVehicleUpgradeIV_200_EPOCH"}}; + }; + class C_Hatchback_02_EPOCH4: C_Hatchback_01_EPOCH4 {}; + class C_Offroad_01_EPOCH4: C_Hatchback_01_EPOCH4 {}; + class C_SUV_01_EPOCH4: C_Hatchback_01_EPOCH4 {}; + class B_MRAP_01_EPOCH4: C_Hatchback_01_EPOCH4 {}; + class O_MRAP_02_EPOCH4: C_Hatchback_01_EPOCH4 {}; + class I_MRAP_03_EPOCH4: C_Hatchback_01_EPOCH4 {}; + }; + class C_Hatchback_02_EPOCH3: C_Hatchback_01_EPOCH3 { upgradeToVehicle[] = {"C_Hatchback_02_EPOCH4"}; }; + class C_Offroad_01_EPOCH3: C_Hatchback_01_EPOCH3 { upgradeToVehicle[] = {"C_Offroad_01_EPOCH4"}; }; + class C_SUV_01_EPOCH3: C_Hatchback_01_EPOCH3 { upgradeToVehicle[] = {"C_SUV_01_EPOCH4"}; }; + class B_MRAP_01_EPOCH3: C_Hatchback_01_EPOCH3 { upgradeToVehicle[] = {"B_MRAP_01_EPOCH4"}; }; + class O_MRAP_02_EPOCH3: C_Hatchback_01_EPOCH3 { upgradeToVehicle[] = {"O_MRAP_02_EPOCH4"}; }; + class I_MRAP_03_EPOCH3: C_Hatchback_01_EPOCH3 { upgradeToVehicle[] = {"I_MRAP_03_EPOCH4"}; }; + + class K01 + { + upgradeToVehicle[] = {"mosquito_epoch"}; + class mosquito_epoch + { + ReqMaterials[] = {{1,"ItemVehDocRara"},{2,"PaintCanOra"},{4,"ItemPipe"},{2,"jerrycan_epoch"}}; + }; + }; + class K02: K01 {}; + class K03: K01 {}; + class K04: K01 {}; + + class C_Offroad_01_EPOCH4 + { + upgradeToVehicle[] = {"C_Offroad_01_EPOCH5"}; + class C_Offroad_01_EPOCH5 + { + ReqMaterials[] = {{1,"ItemVehDocRara"},{1,"PaintCanBlu"},{1,"PaintCanRed"},{1,"CircuitParts"},{1,"ItemBattery"}}; + }; + }; +}; \ No newline at end of file diff --git a/Sources/epoch_config/build.hpp b/Sources/epoch_config/build.hpp index 62344aa7..ebdd6286 100644 --- a/Sources/epoch_config/build.hpp +++ b/Sources/epoch_config/build.hpp @@ -1 +1 @@ -build=757; +build=826; diff --git a/Sources/epoch_config/sandbox_config.hpp b/Sources/epoch_config/sandbox_config.hpp index 89db301d..d9da3aa9 100644 --- a/Sources/epoch_config/sandbox_config.hpp +++ b/Sources/epoch_config/sandbox_config.hpp @@ -9,7 +9,6 @@ Github: https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_config/config.hpp */ - author = "Epoch Mod Team"; class Header { @@ -52,6 +51,19 @@ wreckRemovalMaxTime = 360; disableRandomization[] = {"All"}; +showHUD[] = +{ + true, // Scripted HUD (same as showHUD command) + true, // Vehicle + soldier info + true, // Vehicle radar + true, // Vehicle compass + true, // Tank direction indicator + false, // Commanding menu + false, // Group Bar + true, // HUD Weapon Cursors + true // Vehicle display panels +}; + #include "Configs\CfgServicePoint.hpp" #include "Configs\CfgItemSort.hpp" #include "Configs\CfgTraderMissions.hpp" @@ -74,6 +86,10 @@ disableRandomization[] = {"All"}; #include "Configs\CfgItemInteractions.hpp" #include "Configs\CfgSay3Dhandler.hpp" #include "Configs\CfgSwitchMovehandler.hpp" +#include "Configs\CfgVehicleUpgrades.hpp" +#include "Configs\CfgReadingDocuments.hpp" +#include "Configs\CfgDynamicSimulation.hpp" +#include "Configs\CfgMarkerSets.hpp" // A3 specific configs #include "Configs\CfgFunctions.hpp" diff --git a/Sources/epoch_server/build.hpp b/Sources/epoch_server/build.hpp index 62344aa7..ebdd6286 100644 --- a/Sources/epoch_server/build.hpp +++ b/Sources/epoch_server/build.hpp @@ -1 +1 @@ -build=757; +build=826; diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf index 038f6b2a..729994ee 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf @@ -89,9 +89,16 @@ for "_i" from 0 to _this do { } foreach _IndestructibleBaseObjects; }; }; - _baseObj setVectorDirAndUp _worldspace; _baseObj setposATL _location; + _baseObj setVectorDirAndUp _worldspace; + // new Dynamicsimulation + if(["CfgDynamicSimulation", "baseDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntryV2)then + { + _baseObj enableSimulationGlobal false; // turn off sim on server start, let dynSim activate it to true + _baseObj enableDynamicSimulation true; + _baseObj triggerDynamicSimulation false; // this object doesnt need to turn anything on in the server + }; // spawn additional object for trap _ammoClass = (_cfgBaseBuilding >> _class >> "ammoClass"); @@ -101,6 +108,7 @@ for "_i" from 0 to _this do { _ammoObj setVectorDirAndUp _worldspace; _ammoObj setposATL _location; _baseObj setVariable ["EPOCH_TRAP_OBJ",_ammoObj]; + _baseObj addEventHandler ["Explosion", {(_this select 0) setDamage 1}]; }; // set persistent Animations diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_removeBUILD.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_removeBUILD.sqf index db990bbd..8b12c72f 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_removeBUILD.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_removeBUILD.sqf @@ -20,6 +20,8 @@ params ["_building","_player",["_token","",[""]] ]; if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; if (isNull _building) exitWith{}; if (_player distance _building > 20) exitWith{}; +if (_building getvariable ['Build_LockedForRemoving',false]) exitwith {}; +_building setvariable ['Build_LockedForRemoving',true]; // TODO add group check here since this should only be removed by group or owner of pole _objType = typeOf _building; diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf index 522c878e..fa7237ee 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf @@ -46,6 +46,11 @@ if (isText _staticClassConfig) then { _storageObj = [_staticClass,_vehicle] call EPOCH_swapBuilding; + // add new gardens to manager + if (_staticClass isEqualTo "Garden_EPOCH") then { + EPOCH_activeGardens pushBackUnique _storageObj; + }; + if (_UseIndestructible) then { if ({_storageObj iskindof _x} count _ExceptedBaseObjects == 0) then { { diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_simulSwap.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_simulSwap.sqf index b35e5374..91988f24 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_simulSwap.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_simulSwap.sqf @@ -56,10 +56,9 @@ if (_objSlot != -1) then { if (isText _ammoClass) then { _ammoClass = getText _ammoClass; _ammoObj = createVehicle [_ammoClass, [0,0,0], [], 0, "CAN_COLLIDE"]; - //_ammoObj setVectorDirAndUp [(_worldspace select 1),(_worldspace select 2)]; - //_ammoObj setposATL (_worldspace select 0); _ammoObj attachTo [_newObj,[0,0,0]]; _newObj setVariable ["EPOCH_TRAP_OBJ",_ammoObj]; + _newObj addEventHandler ["Explosion", {(_this select 0) setDamage 1}]; }; _newObj setDamage _damage; diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_swapBuilding.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_swapBuilding.sqf index 12b2c0a4..dbcfb0b2 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_swapBuilding.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_swapBuilding.sqf @@ -10,22 +10,35 @@ if (!isNull _object && !(_class isEqualTo "")) then { if (!isNull _newObj) then { _object hideObjectGlobal true; + // new Dynamicsimulation + if(["CfgDynamicSimulation", "baseDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntryV2)then + { + _newObj enableDynamicSimulation true; + _newObj triggerDynamicSimulation false; // this object doesnt need to turn anything on in the server + }; + switch (_method) do { case 0: { - _newObj setVectorDirAndUp [vectordir _object, vectorup _object]; - _newObj setPosWorld _objectPos; + _newObj setposATL (getPosATL _object); + _newObj setDir (getDir _object); + _newObj setVectorDirAndUp [vectorDir _object, vectorUP _object]; }; case 1: { _newObj attachTo [_object,[0,0,0]]; }; + /* + case 2: { + _newObj setPosWorld _objectPos; + _newObj setDir (getDir _object); + _newObj setVectorUp (vectorup _object); + }; + */ }; deleteVehicle _object; // force nearby players to reveal new object faster _playersNear = _newObj nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 300]; - { - [_x, _newObj] remoteExec ['reveal',_x]; - }forEach _playersNear; + [_newObj, {player reveal _this}] remoteExec ["call", _playersNear]; }; }; diff --git a/Sources/epoch_server/compile/epoch_group/EPOCH_server_createGroup.sqf b/Sources/epoch_server/compile/epoch_group/EPOCH_server_createGroup.sqf index f43dd931..eb19d397 100644 --- a/Sources/epoch_server/compile/epoch_group/EPOCH_server_createGroup.sqf +++ b/Sources/epoch_server/compile/epoch_group/EPOCH_server_createGroup.sqf @@ -60,8 +60,8 @@ if (_current_crypto >= _upgradePrice) then { _contentArray = [_groupName, _leaderName, EPOCH_group_upgrade_lvl_SEPXVar select 0, [], []]; - [["groupUpdate", _contentArray], (owner _leader)] call EPOCH_sendRemoteExecClient; - [["groupUidUpdate", _groupID], (owner _leader)] call EPOCH_sendRemoteExecClient; + [["groupUpdate", _contentArray], _leader] call EPOCH_sendRemoteExecClient; + [["groupUidUpdate", _groupID], _leader] call EPOCH_sendRemoteExecClient; _leader setVariable ["GROUP", _groupID]; diff --git a/Sources/epoch_server/compile/epoch_group/EPOCH_server_deleteGroup.sqf b/Sources/epoch_server/compile/epoch_group/EPOCH_server_deleteGroup.sqf index 9ffe4666..ba1406c1 100644 --- a/Sources/epoch_server/compile/epoch_group/EPOCH_server_deleteGroup.sqf +++ b/Sources/epoch_server/compile/epoch_group/EPOCH_server_deleteGroup.sqf @@ -30,5 +30,6 @@ if (_groupID != "") then { } forEach (allPlayers select {(_x getVariable["GROUP", ""]) == _groupID}); _return = ["Group", _groupID] call EPOCH_fnc_server_hiveDEL; + [["groupUpdate", []], _player] call EPOCH_sendRemoteExecClient; }; _return diff --git a/Sources/epoch_server/compile/epoch_group/EPOCH_server_invitePlayer.sqf b/Sources/epoch_server/compile/epoch_group/EPOCH_server_invitePlayer.sqf index 562e44a9..6720031e 100644 --- a/Sources/epoch_server/compile/epoch_group/EPOCH_server_invitePlayer.sqf +++ b/Sources/epoch_server/compile/epoch_group/EPOCH_server_invitePlayer.sqf @@ -14,7 +14,7 @@ */ params ["_playerUID","_var1","_var2","_player",["_token","",[""]]]; if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; - -{ - [_var1, _var2] remoteExec ['EPOCH_Group_invitePlayer',_x]; -} forEach (allPlayers select {getPlayerUID _x == _playerUID}); +private _targets = allPlayers select {getPlayerUID _x == _playerUID}; +if !(_targets isEqualTo []) then { + [_var1, _var2] remoteExec ['EPOCH_Group_invitePlayer',_targets]; +}; diff --git a/Sources/epoch_server/compile/epoch_group/EPOCH_server_updatePlayerGroup.sqf b/Sources/epoch_server/compile/epoch_group/EPOCH_server_updatePlayerGroup.sqf index 78fa5322..04d434b6 100644 --- a/Sources/epoch_server/compile/epoch_group/EPOCH_server_updatePlayerGroup.sqf +++ b/Sources/epoch_server/compile/epoch_group/EPOCH_server_updatePlayerGroup.sqf @@ -87,6 +87,7 @@ if ((_response select 0) == 1 && (_response select 1) isEqualType []) then { _x setVariable ["GROUP", nil]; [_x] joinSilent (createGroup [west, true]); [["resetGroup", true], _x] call EPOCH_sendRemoteExecClient; + [["groupUpdate", []], _x] call EPOCH_sendRemoteExecClient; } forEach (_allPlayers select {getPlayerUID _x == _selectedPlayerUID}); { if (_x select 0 == _selectedPlayerUID) exitWith { diff --git a/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_createTempGroup.sqf b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_createTempGroup.sqf new file mode 100644 index 00000000..5384a847 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_createTempGroup.sqf @@ -0,0 +1,54 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Add HiveFunction: Create Group / Set Data + + 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/compile/epoch_grouptemp/EPOCH_server_createTempGroup.sqf + + Return: + + true = group has been created and / or successfully saved! + false = group exist already and hasn't been saved! +*/ +//[[[cog import generate_private_arrays ]]] +private ["_cIndex","_contentArray","_current_crypto","_groupID","_groupName","_leaderName","_playerCryptoLimit","_return","_textArr","_upgradePrice","_vars"]; +//[[[end]]] +params ["_leader", "_groupName", ["_token","",[""]] ]; +if !([_leader, _token] call EPOCH_server_getPToken) exitWith{}; + +_return = false; +_textArr = toArray(_groupName); + +if (count _textArr > 24) exitWith{}; +// remove any disallowed chars in group name "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 -_" +{ + if !(_x in [97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,49,50,51,52,53,54,55,56,57,48,32,45,95]) then { + _textArr = _textArr - [_x]; + }; +} forEach _textArr; +_groupName = toString _textArr; + +if (_groupName != "") then { + + _groupID = getPlayerUID _leader; + + _leaderName = if (alive _leader) then {name _leader} else {"Dead Player"}; + + _contentArray = [_groupName, _leaderName, EPOCH_group_upgrade_lvl_SEPXVar select 0, [], []]; + + [["tempGroupUpdate", _contentArray], _leader] call EPOCH_sendRemoteExecClient; + [["tempGroupUidUpdate", _groupID], _leader] call EPOCH_sendRemoteExecClient; + + _leader setVariable ["TEMPGROUP", _groupID]; + _leader setVariable ["TEMPGROUPARRAY",_contentArray]; + + _return = true; +}; +_return diff --git a/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_deleteTempGroup.sqf b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_deleteTempGroup.sqf new file mode 100644 index 00000000..39a7a6a3 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_deleteTempGroup.sqf @@ -0,0 +1,49 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Delete Group + + 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/compile/epoch_grouptemp/EPOCH_server_deleteTempGroup.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_groupID","_return"]; +//[[[end]]] +params ["_player",["_token","",[""]] ]; + +if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; + +_return = false; +_groupID = getPlayerUID _player; +if (_groupID != "") then { + _allPlayers = allPlayers select {alive _x}; + { + _group = grpNull; + _permGroup = _x getVariable["GROUP",""]; + if !(_permGroup isEqualTo "")then + { + { + if ((_x getVariable["GROUP",""]) == _groupID) exitWith { + _group = group _x; + }; + } forEach _allPlayers; + }; + + _x setVariable ["TEMPGROUP", nil]; + [["resetTempGroup", true], _x] call EPOCH_sendRemoteExecClient; + if (isNull _group) then { + _group = createGroup [west, true]; + }; + [_x] joinSilent _group; + } forEach (allPlayers select {(_x getVariable["TEMPGROUP", ""]) == _groupID}); + + [["tempGroupUpdate", []], _player] call EPOCH_sendRemoteExecClient; + _return = true; +}; +_return diff --git a/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_invitePlayerTempGroup.sqf b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_invitePlayerTempGroup.sqf new file mode 100644 index 00000000..f36fb595 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_invitePlayerTempGroup.sqf @@ -0,0 +1,20 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Invite Player + + 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/compile/epoch_grouptemp/EPOCH_server_invitePlayerTempGroup.sqf +*/ +params ["_playerUID","_var1","_var2","_player",["_token","",[""]]]; +if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; +private _targets = allPlayers select {getPlayerUID _x == _playerUID}; +if !(_targets isEqualTo []) then { + [_var1, _var2] remoteExec ['EPOCH_tempGroup_invitePlayer',_targets]; +}; diff --git a/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_updatePlayerTempGroup.sqf b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_updatePlayerTempGroup.sqf new file mode 100644 index 00000000..debd247b --- /dev/null +++ b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_updatePlayerTempGroup.sqf @@ -0,0 +1,134 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Add or remove members from a group + + 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/compile/epoch_grouptemp/EPOCH_server_updatePlayerTempGroup.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_allPlayers","_contentArray","_found","_group","_memberrange","_modOrMember","_modOrMemberArray","_modOrMemberRevert","_removePlayerArray","_response","_selectedPlayerName","_playerObj"]; +//[[[end]]] +params [["_groupID",""],["_selectedPlayerUID",""],["_addOrRemove",false],["_modOrMemberVar",true],["_player",objnull],["_token",""]]; + +if !([_player, _token] call EPOCH_server_getPToken) exitWith {}; + +if (_groupID == "") exitWith{ diag_log format["Epoch: GROUP: No Temp Group Selected %1", _this]; }; + +diag_log format["Epoch: Temp GROUP: Update %1", _this]; + +_modOrMember = if (_modOrMemberVar) then [{3},{4}]; +_modOrMemberRevert = if (_modOrMemberVar) then [{4},{3}]; +_contentArray = []; +{ + _contentArray = _x getVariable ["TEMPGROUPARRAY",[]]; +} forEach (allPlayers select {getPlayerUID _x == _groupID}); + +if !(_contentArray isEqualTo []) then { + + _contentArray params ["_groupName","_leaderName","_groupSize","_modArray","_memberArray"]; + _allPlayers = allPlayers select {alive _x}; + + if (_addOrRemove) then { //Add + _selectedPlayerName = "Dead Player"; + + { + _selectedPlayerName = if (alive _x) then {name _x}; + if ((_x getVariable ["TEMPGROUP",""]) != _groupID) then { + _group = grpNull; + { + _group = group _x; + } forEach (_allPlayers select {(_x getVariable["TEMPGROUP", ""]) == _groupID}); + + if (isNull _group) then { + _group = createGroup [west, true]; + }; + _x setVariable ["TEMPGROUP", _groupID]; + [["tempGroupUidUpdate", _groupID], _x] call EPOCH_sendRemoteExecClient; + [_x] joinSilent _group; + }; + } forEach (_allPlayers select {getPlayerUID _x == _selectedPlayerUID}); + + + // find player name from DB + if (_selectedPlayerName == "Dead Player") then { + _memberrange = ["PlayerData", _selectedPlayerUID] call EPOCH_fnc_server_hiveGETRANGE; + if (count (_memberrange select 1) > 0) then { + if (typename (_memberrange select 1 select 0) == "STRING") then { + _selectedPlayerName = _memberrange select 1 select 0; + }; + }; + }; + + _removePlayerArray = _contentArray select _modOrMemberRevert; + + { + if (_x select 0 == _selectedPlayerUID) exitWith { + _removePlayerArray deleteAt _forEachIndex; + _contentArray set [_modOrMemberRevert, _removePlayerArray]; + }; + } forEach _removePlayerArray; + + _modOrMemberArray = _contentArray select _modOrMember; + _modOrMemberArray pushBack [_selectedPlayerUID, _selectedPlayerName]; + + _contentArray set [_modOrMember, _modOrMemberArray]; + + } else { + + //Remove + _found = false; + _group = grpNull; + _permGroup = ""; + { + _permGroup = _x getVariable["GROUP",""]; + _playerObj = _x; + } forEach (_allPlayers select {getPlayerUID _x == _selectedPlayerUID}); + if !(_permGroup isEqualTo "")then + { + { + _group = group _x; + } forEach (_allPlayers select {(_x getVariable["GROUP", ""]) == _permGroup}); + }; + _playerObj setVariable ["TEMPGROUP", nil]; + if (isNull _group) then { + _group = createGroup [west, true]; + }; + [_playerObj] joinSilent _group; + [["resetTempGroup", true], _playerObj] call EPOCH_sendRemoteExecClient; + [["tempGroupUpdate", []], _playerObj] call EPOCH_sendRemoteExecClient; + { + if (_x select 0 == _selectedPlayerUID) exitWith { + _memberArray deleteAt _forEachIndex; + _found = true; + }; + } forEach _memberArray; + + if (_found) then { + _contentArray set [4, _memberArray]; + } else { + { + if (_x select 0 == _selectedPlayerUID) exitWith { + _modArray deleteAt _forEachIndex; + _found = true; + }; + } forEach _modArray; + _contentArray set [3, _modArray]; + }; + + if (!_found) then { + diag_log format ["Epoch: %1 cannot remove Player! (%1)", __FILE__, _this] + }; + }; + + { + [["tempGroupUpdate", _contentArray], _x] call EPOCH_sendRemoteExecClient; + } forEach (_allPlayers select {(_x getVariable["TEMPGROUP", ""]) == _groupID}); + +}; diff --git a/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_upgradeTempGroup.sqf b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_upgradeTempGroup.sqf new file mode 100644 index 00000000..34f57830 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_grouptemp/EPOCH_server_upgradeTempGroup.sqf @@ -0,0 +1,49 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Upgrade group size + + 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/compile/epoch_grouptemp/EPOCH_server_upgradeTempGroup.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_cIndex","_contentArray","_current_crypto","_found","_groupMemberPUID","_newGroupSize","_playerCryptoLimit","_response","_return","_upgradePrice","_vars"]; +//[[[end]]] +params ["_groupID","_player",["_token","",[""]] ]; +if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; + +_return = false; + +// [_groupName, _leaderName, _groupSize, _modArray, _memberArray] +if ((_response select 0) == 1 && (_response select 1) isEqualType []) then { + _contentArray = (_response select 1); + _found = EPOCH_group_upgrade_lvl_SEPXVar find (_contentArray select 2); + + if ((_found != -1) && count EPOCH_group_upgrade_lvl_SEPXVar >= (_found + 3)) then { + _newGroupSize = EPOCH_group_upgrade_lvl_SEPXVar select (_found + 2); + + _upgradePrice = parseNumber (EPOCH_group_upgrade_lvl_SEPXVar select (_found+3)); + + _contentArray set [2, _newGroupSize]; + + _groupMemberPUID = [_groupID]; + { + { + _groupMemberPUID pushback(_x select 0); + } forEach _x; + } forEach [_contentArray select 3, _contentArray select 4]; + + { + [["tempGroupUpdate", _contentArray], _x] call EPOCH_sendRemoteExecClient; + } forEach (allPlayers select {getPlayerUID _x in _groupMemberPUID}); + + _return = true; + }; +}; +_return diff --git a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_destroyTrash.sqf b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_destroyTrash.sqf index a29e3cbb..98ca7278 100644 --- a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_destroyTrash.sqf +++ b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_destroyTrash.sqf @@ -20,44 +20,31 @@ params [["_object",objNull,[objNull]],["_type",0,[0]],["_player",objNull,[objNul if (isNull _object) exitWith{}; if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; -if (!(_object isKindOf "All")) then { +if (alive _object) then { - if (alive _object) then { + _config = 'CfgEpochClient' call EPOCH_returnConfig; + _payout = getArray(_config >> worldname >> "TrashClasses") param [_type, "Trash"]; - _config = 'CfgEpochClient' call EPOCH_returnConfig; - _payout = getArray(_config >> worldname >> "TrashClasses") param [_type, "Trash"]; + _posWH = getPosATL _player; - _posWH = getPosATL _player; - _object setdamage 1; + if (isSimpleObject _object) then { + // just remove for now, object will respawn on restart. + deleteVehicle _object; + } else { + _object setdamage 1; + }; - _item = createVehicle["groundWeaponHolder", _posWH, [], 0.0, "CAN_COLLIDE"]; - _item setPosATL _posWH; + _item = createVehicle["groundWeaponHolder", _posWH, [], 0.0, "CAN_COLLIDE"]; + _item setPosATL _posWH; - _config = (configFile >> "CfgMainTable" >> _payout); - if (isClass _config) then { - if (random 1 < getNumber(_config >> "chance")) then { - [_item, _payout] call EPOCH_serverLootObject; - _errorMsg = "You found something!"; - [_errorMsg, 5] remoteExec ['Epoch_message',_player]; - }; - }; - - if ((random 1) <= EPOCH_antagonistChanceTrash) then { - _nearPlayers = _posWH nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 50]; - - if (!(_nearPlayers isEqualTo[])) then { - _target = selectRandom _nearPlayers; - - _antagTable = ["Trash", "CfgMainTable", "antagonists"] call EPOCH_weightedArray; - - _antagTableArray = _antagTable select 0; - if !(_antagTableArray isEqualTo[]) then{ - _weightedArray = _antagTable select 1; - _triggerType = _antagTableArray select(selectRandom _weightedArray); - [_target, _triggerType] call EPOCH_server_triggerEvent; - }; - }; + _config = (configFile >> "CfgMainTable" >> _payout); + if (isClass _config) then { + if (random 1 < getNumber(_config >> "chance")) then { + [_item, _payout] call EPOCH_serverLootObject; + _errorMsg = "You found something!"; + [_errorMsg, 5] remoteExec ['Epoch_message',_player]; }; }; + }; true diff --git a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_knockDownTree.sqf b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_knockDownTree.sqf index 4b38ce37..15f56386 100644 --- a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_knockDownTree.sqf +++ b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_knockDownTree.sqf @@ -13,37 +13,47 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_looting/EPOCH_server_knockDownTree.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_item","_lootType","_nearbyWH","_posWH"]; +private ["_doPayout","_item","_lootType","_nearbyWH","_posWH"]; //[[[end]]] params ["_object","_type","_player",["_token","",[""]] ]; if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; if (isNull _object) exitWith{}; if (_player distance2D (getposATL _object) > 6) exitWith{}; +_doPayout = false; +if (alive _object) then { + _posWH = getPosATL _object; + _posWH set[2, 0]; -if !(_object isKindOf "All") then { - if (alive _object) then { - _posWH = getPosATL _object; - _posWH set[2, 0]; + if (isSimpleObject _object) then { + // just remove for now, object will respawn on restart. + deleteVehicle _object; + _doPayout = true; + } else { if (damage _object > 0.7) then { _object setdamage 1; + _doPayout = true; - _lootType = "Tree"; - if (_type == 1) then { - _lootType = "Bush"; - }; - - _nearbyWH = nearestObjects[_posWH, ["groundWeaponHolder"], 2]; - if !(_nearbyWH isEqualTo[]) then { - [(_nearbyWH select 0), _lootType] call EPOCH_serverLootObject; - } else { - _item = createVehicle["groundWeaponHolder", _posWH, [], 0, "CAN_COLLIDE"]; - _item setPosATL _posWH; - [_item, _lootType] call EPOCH_serverLootObject; - }; } else { _object setdamage((damage _object) + 0.25) min 1; }; }; + + if (_doPayout) then { + _lootType = "Tree"; + if (_type == 1) then { + _lootType = "Bush"; + }; + + _nearbyWH = nearestObjects[_posWH, ["groundWeaponHolder"], 2]; + if !(_nearbyWH isEqualTo[]) then { + [(_nearbyWH select 0), _lootType] call EPOCH_serverLootObject; + } else { + _item = createVehicle["groundWeaponHolder", _posWH, [], 0, "CAN_COLLIDE"]; + _item setPosATL _posWH; + [_item, _lootType] call EPOCH_serverLootObject; + }; + }; }; + true diff --git a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_lootAnimal.sqf b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_lootAnimal.sqf index 096d1e39..bc2c345e 100644 --- a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_lootAnimal.sqf +++ b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_lootAnimal.sqf @@ -27,6 +27,9 @@ if !(isNull _object) then { }; deleteVehicle _object; _item = createVehicle["groundWeaponHolder", [0,0,0], [], 0.0, "CAN_COLLIDE"]; + if (_objectClass isequalto "GreatWhite_F") then { + _item setvariable ["EPOCH_Loot",true,true]; + }; _item setPosATL _pos; _class = "SeaFood"; _config = configFile >> "CfgMainTable" >> _objectClass; diff --git a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_lootContainer.sqf b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_lootContainer.sqf index 76832fb1..0b032da3 100644 --- a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_lootContainer.sqf +++ b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_lootContainer.sqf @@ -55,13 +55,4 @@ if !(_object in EPOCH_cleanupQueue) then { [_errorMsg, 5] remoteExec ['Epoch_message',_player]; }; - if ((random 1) <= EPOCH_antagonistChanceLoot) then{ - _antagTable = [_type, "CfgMainTable", "antagonists"] call EPOCH_weightedArray; - _antagTableArray = _antagTable select 0; - if !(_antagTableArray isEqualTo[]) then{ - _weightedArray = _antagTable select 1; - _triggerType = _antagTableArray select(selectRandom _weightedArray); - [_player, _triggerType] call EPOCH_server_triggerEvent; - }; - }; }; diff --git a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_mineRocks.sqf b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_mineRocks.sqf index 698043bb..103abcb9 100644 --- a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_mineRocks.sqf +++ b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_mineRocks.sqf @@ -13,44 +13,47 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_looting/EPOCH_server_mineRocks.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_item","_lootables","_nearbyWH","_payout","_payoutQty","_posWH","_selectedPayout"]; +private ["_config","_posWH","_selectedConfig"]; //[[[end]]] params ["_object","_index","_player",["_token","",[""]] ]; if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; -if !(_object isKindOf "All") then { - if (alive _object) then { +// make sure object still exists and is proper object type and alive. +if (_object isEqualType objNull && {!(isNull _object)} && {alive _object}) then { - _posWH = getPosATL _player; - _posWH set[2, 0]; + _posWH = getPosATL _player; + _posWH set[2, 0]; - // defaults - _selectedPayout = ["ItemRock", 4]; - // Not Rock - if (_index >= 0) then { - _selectedPayout = ["ItemScraps", 2]; - if (_index == 0) then { - _selectedPayout = ["CinderBlocks", 1]; - }; - } else { - _lootables = [["PartOre", 2], ["ItemRock", 4]]; - _selectedPayout = selectRandom _lootables; - }; - - _payout = _selectedPayout select 0; - _payoutQty = _selectedPayout select 1; - - _object setdamage ((damage _object) + (1/_payoutQty)) min 1; - - _nearbyWH = nearestObjects[_posWH, ["groundWeaponHolder"], 2]; - if !(_nearbyWH isEqualTo[]) then { - _posWH = getPosATL(_nearbyWH select 0); - (_nearbyWH select 0) addMagazineCargoGlobal[_payout, _payoutQty]; - } else { - _item = createVehicle["groundWeaponHolder", _posWH, [], 0, "CAN_COLLIDE"]; - _item setPosATL _posWH; - _item addMagazineCargoGlobal[_payout, _payoutQty]; + // define loot table class + _selectedConfig = typeOf _object; + if (_selectedConfig isEqualTo "") then { + // handle simple/terrain objects + (getModelInfo _object) params [["_modelName",""]]; + if (!isnil "_modelName") then { + // replace spaces and periods with underscores + _selectedConfig = (_modelName splitString " .") joinString "_"; }; }; + + _config = configFile >> "CfgMainTable" >> _selectedConfig; + if !(isClass(_config)) then { + // allow override with generic loot classes if object class is not in CfgMainTable + switch (_index) do { + case 0: { _selectedConfig = "Rock" }; + case 1: { _selectedConfig = "Cinder" }; + case 2: { _selectedConfig = "Wreck" }; + case 3: { _selectedConfig = "Ore" }; + }; + }; + + if (isSimpleObject _object) then { + // just remove for now, object will respawn on restart. + deleteVehicle _object; + } else { + _object setdamage 1; + }; + + // output loot + [objNull, _selectedConfig, false, _posWH] call EPOCH_serverLootObject; }; true diff --git a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_spawnBoatLoot.sqf b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_spawnBoatLoot.sqf index 42612fee..9c09808d 100644 --- a/Sources/epoch_server/compile/epoch_looting/EPOCH_server_spawnBoatLoot.sqf +++ b/Sources/epoch_server/compile/epoch_looting/EPOCH_server_spawnBoatLoot.sqf @@ -13,20 +13,21 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_looting/EPOCH_server_spawnBoatLoot.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_item","_marker"]; +private ["_shipwrecks","_item","_markers"]; //[[[end]]] -{ - // 20 percent chance for loot to spawn - if ((random 1) <= 0.4) then { - _item = createVehicle["container_epoch", _x, [], 0, "NONE"]; +_cfgEpoch = configFile >> "CfgEpoch" >> worldname; +if (getNumber(_cfgEpoch >> "shipwreckLootEnabled") isEqualTo 1) then { + _worldSize = worldSize/2; + _shipwrecks = nearestTerrainObjects [ [_worldSize, _worldSize], ["SHIPWRECK"], _worldSize]; + _total = getNumber(_cfgEpoch >> "maxSpawnedShipwrecks"); + for "_i" from 1 to _total do { + if (_shipwrecks isEqualTo []) exitWith {}; + _wreck = selectRandom _shipwrecks; + _shipwrecks = _shipwrecks - [_wreck]; + _item = createVehicle["container_epoch", _wreck, [], 0, "NONE"]; _item setMass 220; - if (EPOCH_SHOW_BOATLOOT) then { - _marker = createMarker[str(_x), _x]; - _marker setMarkerShape "ICON"; - _marker setMarkerType "mil_dot"; - // _marker setMarkerText "Shipwreak"; - _marker setMarkerColor "ColorOrange"; + _markers = ["Shipwreck",_wreck] call EPOCH_server_createGlobalMarkerSet; }; }; -} foreach (getArray (configFile >> "CfgEpoch" >> worldname >> "containerPos")); +}; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_addItemToX.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_addItemToX.sqf index 727a87b7..d5a2bec5 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_addItemToX.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_addItemToX.sqf @@ -10,7 +10,7 @@ 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_code/compile/both/EPOCH_isAny.sqf + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_addItemToX.sqf Example: [_player, _itemsInContainers] call EPOCH_fnc_addItemToX; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_savePlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_savePlayer.sqf index 4c092ee4..18ff043e 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_savePlayer.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_savePlayer.sqf @@ -14,5 +14,5 @@ */ params ["_player","",["_token","",[""]]]; if([_player,_token] call EPOCH_server_getPToken)then{ - _this call EPOCH_server_savePlayer -} + _this call EPOCH_server_savePlayer; +}; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_updatePlayerStats.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_updatePlayerStats.sqf new file mode 100644 index 00000000..44e56b92 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_fnc_updatePlayerStats.sqf @@ -0,0 +1,26 @@ +/* + Author: DirtySanchez - EpochMod.com + + Contributors: + + Description: + Save player with token check for use with RemoteExec + + 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/compile/epoch_player/EPOCH_fnc_updatePlayerStats.sqf +*/ +params ["_player","_killer","_statType","_adjust","_toClient",["_token","",[""]]]; + +if(isNull _player)exitWith{ + diag_log "EPOCHDebug: fnc_updatePlayerStats -1a- player is Null"; +}; +if(isNull _killer)exitWith{ + diag_log "EPOCHDebug: fnc_updatePlayerStats -1b- non local killer is Null"; +}; + +if([_player,_token] call EPOCH_server_getPToken)then{ + [_killer, _statType, _adjust, _toClient] call EPOCH_server_updatePlayerStats; +}; \ No newline at end of file diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_SetUnitLoadout.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_SetUnitLoadout.sqf new file mode 100644 index 00000000..6c281c01 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_SetUnitLoadout.sqf @@ -0,0 +1,88 @@ +/* + Author: He-Man - EpochMod.com + + Contributors: + + Description: + Player Login + + 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/compile/epoch_player/EPOCH_server_SetUnitLoadout.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_type"]; +//[[[end]]] + +params ["_newPlyr","_loadout"]; + +// _loadout params ["_primaryarr","_secondaryarr","_handgunarr","_uniformarr","_vestarr","_bpackarr","_HeadGear","_Glasses","_Rangefinderarr","_LinedItemsarr"]; +_loadout params ["","","","_uniformarr","_vestarr","_bpackarr","","","",""]; +_loadout set [3,[]]; +_loadout set [4,[]]; +_loadout set [5,[]]; +_newPlyr setunitloadout _loadout; +_uniformarr params [["_uniform",""],["_uniformitems",[]]]; +_vestarr params [["_vest",""],["_vestitems",[]]]; +_bpackarr params [["_bpack",""],["_bpackitems",[]]]; +if !(_uniform isequalto "") then { + _newPlyr forceadduniform _uniform; +}; +if !(_vest isequalto "") then { + _newPlyr addVest _vest; +}; +if !(_bpack isequalto "") then { + _newPlyr addBackpack _bpack; +}; +{ + _x params ["_container","_items"]; + if !(isnull _container) then { + clearitemcargoglobal _container; + clearbackpackcargoglobal _container; + clearmagazinecargoglobal _container; + clearweaponcargoglobal _container; + { + if (count _x > 2) then { + _container addMagazineAmmoCargo _x; + } + else { + if ((_x select 0) isequaltype []) then { + _x params ["_arr","_cnt"]; + _type = _arr deleteat 0; + _container addWeaponcargoglobal [_type,_cnt]; + { + if !(_x isequalto "" || _x isequalto []) then { + if (_x isequaltype []) then { + _container addMagazineAmmoCargo [_x select 0,1,_x select 1]; + } + else { + _container addItemCargoGlobal [_x,1]; + }; + }; + } foreach _arr; + } + else { + _x params [["_type",""],["_cnt",1]]; + if !(_cnt isequaltype 1) then { + _cnt = 1; + }; + if (_type iskindof "Bag_Base") then { + _container addBackpackCargoGlobal [_type,_cnt]; + } + else { + _container addItemCargoGlobal [_type,_cnt]; + }; + }; + }; + } foreach _items; + }; +} foreach [ + [Uniformcontainer _newPlyr, _uniformitems], + [Vestcontainer _newPlyr, _vestitems], + [BackpackContainer _newPlyr, _bpackitems] +]; + + +true diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_checkPlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_checkPlayer.sqf index 83d2bf36..c609dcdc 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_checkPlayer.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_checkPlayer.sqf @@ -13,9 +13,9 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_player/EPOCH_server_checkPlayer.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_apperance","_arr","_class","_dead","_deadPlayer","_hitpoints","_isMale","_medical","_playerUID","_response","_vars"]; +private ["_apperance","_arr","_class","_communityStatsArray","_dead","_deadPlayer","_defaultData","_instanceID","_isMale","_medical","_playerUID","_response","_return","_vars"]; //[[[end]]] -params [["_playerObj",objNull]]; +params [["_playerObj",objNull],["_fsmHandle",0]]; if (_playerObj isEqualType objNull) then { if (!isNull _playerObj) then { _playerUID = getPlayerUID _playerObj; @@ -25,37 +25,43 @@ if (_playerObj isEqualType objNull) then { _dead = false; _isMale = true; + _instanceID = call EPOCH_fn_InstanceID; _arr = []; if ((_response select 0) == 1 && (_response select 1) isEqualType []) then { _arr = (_response select 1); }; - if (count _arr < 11) then { + // empty default data format, if "Player" data format is changed update this array! + _defaultData = [[], [], [], [], [], [], [], [], [], [], "", true]; + + // If data does not validate against default or is too short, assume player is new or already dead. + if !(_arr isEqualTypeParams _defaultData) then { _dead = true; } else { - _medical = _arr select 1; - _apperance = _arr select 2; - _class = _apperance select 5; - if (_class == "Epoch_Female_F") then { - _isMale = false; - }; - - _vars = _arr select 4; - _hitpoints = _vars select 11; - + _arr params ["","_medical","_apperance","","_vars"]; + _class = _apperance param [5, "Epoch_Female_F"]; + _isMale = (_class == "Epoch_Male_F"); + _medical params ["","","","_damage",["_hitpoints",[0,0,0,0,0,0,0,0,0,0,0]] ]; _deadPlayer = ["PlayerStats", _playerUID, 0] call EPOCH_fnc_server_hiveGETBIT; - - if (_deadPlayer || (_medical select 3 == 1) || (_hitpoints select 2 == 1) || (_hitpoints select 3 == 1) || (_vars select 12 >= 180)) then { + // check if player is already dead or was critically hit HitHead = 2 or HitBody = 7 and if blood pressure too high. + if (_deadPlayer || (_damage == 1) || (_hitpoints select 2 == 1) || (_hitpoints select 7 == 1) || (_vars select 12 >= 180)) then { _dead = true; }; }; + + // check status of community stats to prevent load / save issues + _communityStatsArray = ["CommunityStats", _playerUID] call EPOCH_fnc_server_hiveGETRANGE; + if((_communityStatsArray select 1) isEqualTo []) then{ + _return = ["CommunityStats", _playerUID, EPOCH_expiresCommunityStats, [EPOCH_defaultStatVars]] call EPOCH_fnc_server_hiveSETEX; + }; + /* true => New Char false => load old Char */ - ['_checkPlayer_PVC', _dead] remoteExec ['EPOCH_playerLoginInit',_playerObj]; + [_fsmHandle,['_checkPlayer_PVC', _dead]] remoteExecCall ['setFSMVariable', _playerObj]; if (!_dead) then { //Load old Char - [_playerObj, _isMale] call EPOCH_server_loadPlayer; + [_playerObj, _isMale, _fsmHandle] call EPOCH_server_loadPlayer; }; }; }; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayer.sqf index 83015509..f567d6c4 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayer.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayer.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayer.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_bankBalance","_bankData","_cIndex","_current_crypto","_defaultVars","_playerName","_playerUID","_pos","_response","_triggerType","_vars"]; +private ["_bankBalance","_bankData","_cIndex","_current_crypto","_defaultVars","_playerName","_playerUID","_pos","_response","_triggerType","_vars","_killerUID","_deathType","_killerCommunityStats","_mIndex","_current_murders","_communityStats","_sIndex","_current_suicides","_dIndex","_current_deaths","_playerKarmaAdj","_killerKarmaAdj","_kIndex","_playerCStats","_playerKarma","_playerIsNeutral","_playerIsBandit","_playerIsHero","_killerCStats","_killerKarma","_karmaLimitsArray","_lowKarmaLevel1","_highKarmaLevel1"]; //[[[end]]] params ["_playerObj","_killer","_playerName",["_token","",[""]] ]; @@ -21,9 +21,29 @@ params ["_playerObj","_killer","_playerName",["_token","",[""]] ]; if !([_playerObj, _token] call EPOCH_server_getPToken) exitWith{}; _playerUID = getPlayerUID _playerObj; +_killerUID = getPlayerUID _killer; _pos = getposATL _playerObj; +// find player's Karma status +_kIndex = EPOCH_communityStats find "Karma"; +_playerCStats = _playerObj getVariable["COMMUNITY_STATS", EPOCH_defaultStatVars]; +_playerKarma = _playerCStats select _kIndex; + +// set config karma levels +_karmaLimitsArray = EPOCH_communityStatsLimits select _kIndex; +_lowKarmaLevel1 = ((_karmaLimitsArray select 2) select 0); +_highKarmaLevel1 = ((_karmaLimitsArray select 3) select 0); + +_playerIsNeutral = (_playerKarma < _highKarmaLevel1 && _playerKarma > _lowKarmaLevel1); +_playerIsBandit = (_playerKarma <= _lowKarmaLevel1); +_playerIsHero = (_playerKarma >= _highKarmaLevel1); + +// default deathType is suicide +_deathType = 666; +_playerKarmaAdj = -2; + if (_playerObj != _killer) then { + _playerKarmaAdj = -5; if (random 1 <= EPOCH_antagonistChancePDeath) then { _triggerType = 2; if (surfaceIsWater _pos) then { @@ -37,9 +57,52 @@ if (_playerObj != _killer) then { _playerName = toString (_playerName); }; - ['deathlog', format['%1 (%2) Killed By %3 (%4) with weapon %5 from %6m at %7', _playerName, _playerUID, name _killer, getPlayerUID _killer, currentWeapon _killer, _playerObj distance _killer, _pos]] call EPOCH_fnc_server_hiveLog; + ['deathlog', format['%1 (%2) Killed By %3 (%4) with weapon %5 from %6m at %7', _playerName, _playerUID, name _killer, _killerUID, currentWeapon _killer, _playerObj distance _killer, _pos]] call EPOCH_fnc_server_hiveLog; + + // player karma changes + if(_playerIsNeutral)then{_playerKarmaAdj = abs((-_playerKarma) * 0.03)}; + if(_playerIsBandit)then{_playerKarmaAdj = abs((-_playerKarma) * 0.055)}; + if(_playerIsHero)then{_playerKarmaAdj = abs((-_playerKarma) * 0.025)}; + + if!(_killerUID isEqualTo "")then{ + [_killer, "Murders", 1, true] call EPOCH_server_updatePlayerStats; + + // find killer's Karma status + _killerCStats = _killer getVariable["COMMUNITY_STATS", EPOCH_defaultStatVars]; + _killerKarma = _killerCStats select _kIndex; + + // killer karma changes + _killerKarmaAdj = -5; + if(_killerKarma < _highKarmaLevel1 && _killerKarma > _lowKarmaLevel1)then{ + if(_playerIsNeutral)then{_killerKarmaAdj = abs((-_killerKarma) * 0.03) + _playerKarmaAdj}; + if(_playerIsBandit)then{_killerKarmaAdj = abs((_killerKarma) * 0.05) + _playerKarmaAdj}; + if(_playerIsHero)then{_killerKarmaAdj = abs((-_killerKarma) * 0.025) + _playerKarmaAdj}; + }; + if(_killerKarma <= _lowKarmaLevel1)then{ + if(_playerIsNeutral)then{_killerKarmaAdj = abs((_killerKarma) * 0.05) + _playerKarmaAdj}; + if(_playerIsBandit)then{_killerKarmaAdj = abs((-_killerKarma) * 0.15) + _playerKarmaAdj}; + if(_playerIsHero)then{_killerKarmaAdj = abs((_killerKarma) * 0.15) + _playerKarmaAdj}; + }; + if(_killerKarma >= _highKarmaLevel1)then{ + if(_playerIsNeutral)then{_killerKarmaAdj = abs((-_killerKarma) * 0.10) + _playerKarmaAdj}; + if(_playerIsBandit)then{_killerKarmaAdj = abs((_killerKarma) * 0.15) + _playerKarmaAdj}; + if(_playerIsHero)then{_killerKarmaAdj = abs((-_killerKarma) * 0.25) + _playerKarmaAdj}; + }; + [_killer, "Karma", _killerKarmaAdj, true] call EPOCH_server_updatePlayerStats; + }; + _deathType = 1; }; +switch(_deathType)do{ + case 666: { + [_playerObj, "Suicides", 1] call EPOCH_server_updatePlayerStats; + [_playerObj, "Karma", _playerKarmaAdj] call EPOCH_server_updatePlayerStats; + }; + case 1: { + [_playerObj, "Deaths", 1] call EPOCH_server_updatePlayerStats; + [_playerObj, "Karma", _playerKarmaAdj] call EPOCH_server_updatePlayerStats; + }; +}; _defaultVars = call EPOCH_defaultVars_SEPXVar; // get vars array and current Crypto value _cIndex = EPOCH_customVars find "Crypto"; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf index 26f9e4e2..9271cf47 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf @@ -1,44 +1,44 @@ /* Author: Aaron Clark - EpochMod.com - Contributors: He-Man + Contributors: He-Man Description: Player Login - Licence: - Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike + 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/compile/epoch_player/EPOCH_server_loadPlayer.sqf + Github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_allGroupMembers","_alreadyDead","_attachments","_backpack","_canBeRevived","_class","_currWeap","_deadPlayer","_defaultData","_dir","_equipped","_found","_goggles","_group","_headgear","_hitpoints","_instanceID","_itemsInContainers","_jammer","_jammers","_linkedItems","_location","_newLocation","_newPlyr","_normalMagazines","_playerData","_playerGroup","_playerGroupArray","_playerNetID","_playerUID","_reject","_serverSettingsConfig","_type","_uniform","_vars","_vest","_wMags","_wMagsArray","_weapon","_weaponsAndItems","_weaponsInContainers"]; +private ["_Primary","_CheckLocation","_allGroupMembers","_alreadyDead","_assignedItems","_attachments","_backpack","_backpackItems","_canBeRevived","_class","_communityStats","_communityStatsArray","_currentWeapon","_deadPlayer","_defaultData","_dir","_equipped","_found","_goggles","_group","_handgunWeapon","_headgear","_instanceID","_jammer","_jammers","_linkedItems","_loadout","_location","_newLocation","_newPlyr","_playerData","_playerGroup","_playerGroupArray","_playerNetID","_playerUID","_primaryWeapon","_reject","_secondaryWeapon","_serverSettingsConfig","_type","_uniform","_uniformItems","_vars","_vest","_vestItems","_wMags","_wMagsArray","_weapon"]; //[[[end]]] _reject = true; -params [["_player",objNull,[objNull]],["_isMale",true]]; +params [["_player",objNull,[objNull]],["_isMale",true],["_fsmHandle",0]]; if (!isNull _player) then { - // load server settings - _serverSettingsConfig = configFile >> "CfgEpochServer"; - _instanceID = call EPOCH_fn_InstanceID; + // load server settings + _serverSettingsConfig = configFile >> "CfgEpochServer"; + _instanceID = call EPOCH_fn_InstanceID; - _playerNetID = owner _player; + _playerNetID = owner _player; _playerUID = getPlayerUID _player; if (_playerUID != "") then { // Make Hive call _playerData = []; - (["Player", _playerUID] call EPOCH_fnc_server_hiveGETRANGE) params [ - ["_status", 0 ], - ["_playerDataTmp", [] ] - ]; - if (_status == 1 && _playerDataTmp isEqualType []) then { - _playerData = _playerDataTmp; - }; + (["Player", _playerUID] call EPOCH_fnc_server_hiveGETRANGE) params [ + ["_status", 0 ], + ["_playerDataTmp", [] ] + ]; + if (_status == 1 && _playerDataTmp isEqualType []) then { + _playerData = _playerDataTmp; + }; // Apperance defaults _uniform = [_serverSettingsConfig, "defaultUniformFemale", "U_Test_uniform"] call EPOCH_fnc_returnConfigEntry; @@ -54,83 +54,108 @@ if (!isNull _player) then { _backpack = [_serverSettingsConfig, "defaultBackpack", ""] call EPOCH_fnc_returnConfigEntry; // Inventory defaults - _linkedItems = [_serverSettingsConfig, "linkedItems", ["ItemMap","EpochRadio0"]] call EPOCH_fnc_returnConfigEntry; - _itemsInContainers = [_serverSettingsConfig, "itemsInContainers", []] call EPOCH_fnc_returnConfigEntry; - _weaponsInContainers = [_serverSettingsConfig, "weaponsInContainers", []] call EPOCH_fnc_returnConfigEntry; - _normalMagazines = [_serverSettingsConfig, "normalMagazines", []] call EPOCH_fnc_returnConfigEntry; - _weaponsAndItems = [_serverSettingsConfig, "weaponsAndItems", ["", []] ] call EPOCH_fnc_returnConfigEntry; + _primaryWeapon = [_serverSettingsConfig, "defaultprimaryWeapon", []] call EPOCH_fnc_returnConfigEntry; // ["arifle_MX_pointer_F","","acc_pointer_IR","",["30Rnd_65x39_caseless_mag",29],[],""]; + _secondaryWeapon = [_serverSettingsConfig, "defaultsecondaryWeapon", []] call EPOCH_fnc_returnConfigEntry; // ["launch_NLAW_F","","","",["NLAW_F",1],[],""]; + _handgunWeapon = [_serverSettingsConfig, "defaulthandgunWeapon", []] call EPOCH_fnc_returnConfigEntry; // ["hgun_P07_F","","","",["16Rnd_9x21_Mag",16],[],""]; + _uniformItems = [_serverSettingsConfig, "defaultuniformItems", []] call EPOCH_fnc_returnConfigEntry; // [["FAK",1],["30Rnd_65x39_caseless_mag",2,30],["Chemlight_green",1,1]]; + _vestItems = [_serverSettingsConfig, "defaultvestItems", []] call EPOCH_fnc_returnConfigEntry; // [["30Rnd_65x39_caseless_mag",3,30],["16Rnd_9x21_Mag",2,16],["SmokeShell",1,1],["SmokeShellGreen",1,1],["SmokeShellBlue",1,1],["SmokeShellOrange",1,1],["Chemlight_green",1,1]]; + _backpackItems = [_serverSettingsConfig, "defaultbackpackItems", []] call EPOCH_fnc_returnConfigEntry; // [["Medikit",1],["FAK",10],[["hgun_P07_F","","","",["16Rnd_9x21_Mag",16],[],""],1]]; + _assignedItems = [_serverSettingsConfig, "defaultassignedItems", ["","","","",[],[],""]] call EPOCH_fnc_returnConfigEntry; // ["Rangefinder","","","",[],[],""] + _linkedItems = [_serverSettingsConfig, "defaultlinkedItems", ["ItemMap","","EpochRadio0","","",""]] call EPOCH_fnc_returnConfigEntry; // ["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch","NVGoggles"] + _currentWeapon = [_serverSettingsConfig, "defaultSelectedWeapon", ""] call EPOCH_fnc_returnConfigEntry; // class of selected weapon - // default data - _defaultData = [[0, [], _instanceID], [0, 0, 1, 0, []], [_goggles, _headgear, _vest, _backpack, _uniform, _class], [], call EPOCH_defaultVars_SEPXVar, _weaponsAndItems, _linkedItems, _normalMagazines, _itemsInContainers, _weaponsInContainers, "", true]; + _loadout = [ + _primaryWeapon, + _secondaryWeapon, + _handgunWeapon, + [_uniform,_uniformItems], + [_vest,_vestItems], + [_backpack,_backpackItems], + _headgear, + _goggles, + _assignedItems, + _linkedItems + ]; - // todo make dynamic - if (count _playerData < 11) then { // invaild format attempt to override + // default data, if "Player" data format is changed update this array! + _defaultData = [[0, [], _instanceID, 1.0], [0, 0, 1, 0, [0,0,0,0,0,0,0,0,0,0,0]], ["", "", "", "", _currentWeapon, _class], [], call EPOCH_defaultVars_SEPXVar, _loadout, [], [], [], [], "", true]; + + // If data does not validate against default or is too short, override with default data. + if !(_playerData isEqualTypeParams _defaultData) then { + diag_log format["DEBUG: Invaild player data %1, defaults used instead.", _playerData]; _playerData = _defaultData; }; - _playerData params ["_worldspace","_medical","","_server_vars","_vars","","","","","","_playerGroup","_canBeRevived"]; + _playerData params ["_worldspace","_medical","","_server_vars","_vars","","","","","","_playerGroup","_canBeRevived"]; // Load world space and previous instance id - _worldspace params ["_dir","_location","_prevInstance"]; + _worldspace params ["_dir","_location","_prevInstance",["_schemaVersion",0.5]]; if (count _location == 2) then{ _location = (_location select 0) vectorAdd (_location select 1); }; - // Get player group - _playerGroupArray = []; - // check players group - if (_playerGroup != "") then { - _found = false; - (["Group", _playerGroup] call EPOCH_fnc_server_hiveGETRANGE) params [ - ["_status", 0 ], - ["_playerGroupArrayTmp", [] ] - ]; - if (_status == 1 && !(_playerGroupArrayTmp isEqualTo[])) then { - _playerGroupArrayTmp params ["","","","_modArray","_memberArray"]; - _found = _playerGroup == _playerUID; - if (!_found) then { - _allGroupMembers = (_modArray + _memberArray) apply {_x select 0}; - _found = _playerUID in _allGroupMembers; - }; - if (_found) then { - _playerGroupArray = _playerGroupArrayTmp; - }; - }; - if (!_found) then { - _playerGroup = ""; - }; - // diag_log format["DEBUG (Load Player) Set Group: %1", _playerGroup]; - }; + // Get player group + _playerGroupArray = []; + // check players group + if (_playerGroup != "") then { + _found = false; + (["Group", _playerGroup] call EPOCH_fnc_server_hiveGETRANGE) params [ + ["_status", 0 ], + ["_playerGroupArrayTmp", [] ] + ]; + if (_status == 1 && !(_playerGroupArrayTmp isEqualTo[])) then { + _playerGroupArrayTmp params ["","","","_modArray","_memberArray"]; + _found = _playerGroup == _playerUID; + if (!_found) then { + _allGroupMembers = (_modArray + _memberArray) apply {_x select 0}; + _found = _playerUID in _allGroupMembers; + }; + if (_found) then { + _playerGroupArray = _playerGroupArrayTmp; + }; + }; + if (!_found) then { + _playerGroup = ""; + }; + // diag_log format["DEBUG (Load Player) Set Group: %1", _playerGroup]; + }; - _hitpoints = _vars select 11; + _medical params ["_bleedingRemaining","_fatigue","_oxygenRemaining","_damage",["_hitpoints",[0,0,0,0,0,0,0,0,0,0,0]] ]; _deadPlayer = ["PlayerStats", _playerUID, 0] call EPOCH_fnc_server_hiveGETBIT; - _alreadyDead = (_deadPlayer || (_medical select 3 == 1) || (_hitpoints select 2 == 1) || (_hitpoints select 3 == 1) || (_vars select 12 >= 180)); + // check if player is already dead or was critically hit HitHead = 2 or HitBody = 7 and if blood pressure too high. + _alreadyDead = (_deadPlayer || (_damage == 1) || (_hitpoints select 2 == 1) || (_hitpoints select 7 == 1) || (_vars select 12 >= 180)); if (_alreadyDead || _prevInstance != _instanceID || (count _location) < 3 || !(_location isEqualType [])) then { + // reset hitpoints + _hitpoints = [0,0,0,0,0,0,0,0,0,0,0]; _dir = random 360; - // try to find respawn point by position - _newLocation = _server_vars param [0,[]]; // 0 = RESPAWN POS - // normal respawn location - _location = getMarkerPos "respawn_west"; - _location set[2, 0]; - if (_newLocation isEqualType [] && {(count _newLocation) == 3}) then { - _jammers = nearestObjects[_newLocation, ["PlotPole_EPOCH"], 6]; - if !(_jammers isEqualTo[]) then { - // get nearby object - _jammer = _jammers param [0,objNull]; - // check if object is not null and is alive. - if (!isNull _jammer && {alive _jammer}) then { - // check if player is still a member of object group. - if ((_jammer getVariable["BUILD_OWNER", "-1"]) in [_playerUID, _playerGroup]) then { - // Override location with that of object - _location = _newLocation; - }; - }; - }; - }; + // try to find respawn point by position + _newLocation = _server_vars param [0,[]]; // 0 = RESPAWN POS + // normal respawn location + _location = getMarkerPos "respawn_west"; + _location set[2, 0]; + if (_newLocation isEqualType [] && {(count _newLocation) == 3}) then { + _CheckLocation = _newLocation; + if (surfaceiswater _newLocation) then { + _CheckLocation = ATLToASL _newLocation; + }; + _jammers = nearestObjects[_CheckLocation, ["PlotPole_EPOCH"], 6]; + if !(_jammers isEqualTo[]) then { + // get nearby object + _jammer = _jammers param [0,objNull]; + // check if object is not null and is alive. + if (!isNull _jammer && {alive _jammer}) then { + // check if player is still a member of object group. + if ((_jammer getVariable["BUILD_OWNER", "-1"]) in [_playerUID, _playerGroup]) then { + // Override location with that of object + _location = _newLocation; + }; + }; + }; + }; if (_alreadyDead) then { _vars = call EPOCH_defaultVars_SEPXVar; _canBeRevived = true; @@ -139,13 +164,6 @@ if (!isNull _player) then { _group = grpNull; - // Delete any left over units with same PUID - { - if ((_x getVariable["PUID", "0"]) == _playerUID) then { - deleteVehicle _x; - }; - } forEach allUnits; - // find existing group if (_playerGroup != "") then { { @@ -163,137 +181,159 @@ if (!isNull _player) then { _newPlyr = _group createUnit[_class, _location, [], 0, "CAN_COLLIDE"]; if !(isNull _newPlyr) then { - addToRemainsCollector[_newPlyr]; - { - _newPlyr disableAI _x; - } forEach["FSM", "MOVE", "AUTOTARGET", "TARGET"]; - _newPlyr setDir _dir; - _newPlyr setPosATL _location; + // disable AI on temp unit + _newPlyr disableAI "ALL"; if (!_alreadyDead) then { // Medical - _medical params ["_bleedingRemaining","_fatigue","_oxygenRemaining","_damage"]; _newPlyr setBleedingRemaining _bleedingRemaining; // _newPlyr setFatigue _fatigue; _newPlyr setOxygenRemaining _oxygenRemaining; _newPlyr setDamage _damage; } else { - // player dead use default Data for appearance and loadout data - _playerData = _defaultData; - }; + // player dead use default Data for appearance and loadout data + _playerData = _defaultData; + }; - // Apperance + Weapons - _playerData params ["","","_apperance","","","_weaponsAndItems","_linkedItems","_normalMagazines","_itemsInContainers","_weaponsInContainers"]; - // load Apperance - _apperance params ["_goggles","_headgear","_vest","_backpack","_uniform"]; + // disable further damage server side + _newPlyr allowDamage false; - // Load Apperance START - if (_uniform != "") then { - _newPlyr addUniform _uniform; - }; - if (_backpack != "") then { - _newPlyr addBackpack _backpack; - }; - if (_goggles != "") then { - _newPlyr addGoggles _goggles; - }; - if (_headgear != "") then { - _newPlyr addHeadgear _headgear; - }; - if (_vest != "") then { - _newPlyr addVest _vest; - }; - // Load Apperance END + _newPlyr setDir _dir; + _newPlyr setPosATL _location; - _currWeap = ""; - // Load inventory + defaults START - if (count _weaponsAndItems >= 3) then { - _weaponsAndItems params ["_currWeapTmp","_weaponsAndItemsArray","_equipped"]; - _currWeap = _currWeapTmp; - { - _weapon = _x deleteAt 0; - _type = getNumber(configfile >> "cfgweapons" >> _weapon >> "type"); - _attachments = []; - _wMags = false; - _wMagsArray = []; - // suppressor, laser, optics, magazines(array), bipods - { - // magazines - if (_x isEqualType []) then{ - _wMags = true; - _wMagsArray pushback _x; - } else { - // attachments - if (_x != "") then{ - _attachments pushBack _x; - }; - }; - } forEach _x; - if (_wMags) then { - { - _newPlyr addMagazine _x; - } foreach _wMagsArray; - }; - // add weapon if equiped - if (_weapon in _equipped) then { - _equipped = _equipped - [_weapon]; - if (_weapon != "") then { - _newPlyr addWeapon _weapon; - }; - switch (_type) do { - case 1: { // primary - removeAllPrimaryWeaponItems _newPlyr; - { _newPlyr addPrimaryWeaponItem _x } forEach _attachments; - }; - case 2: { // handgun - removeAllHandgunItems _newPlyr; - { _newPlyr addHandgunItem _x } forEach _attachments; - }; - case 4: { // secondary - // removeAllSecondaryWeaponItems player; does not exist ? - { - _newPlyr removeSecondaryWeaponItem _x; - } forEach (secondaryWeaponItems _newPlyr); - { _newPlyr addSecondaryWeaponItem _x } forEach _attachments; - }; - }; - }else{ - { - _newPlyr addItem _x; - } forEach _attachments; - }; - } forEach _weaponsAndItemsArray; - }; - // Linked items - { - if (_x in["Binocular", "Rangefinder","Laserdesignator","Laserdesignator_02","Laserdesignator_03","Laserdesignator_01_khk_F","Laserdesignator_02_ghex_F"]) then { - _newPlyr addWeapon _x; - } else { - _newPlyr linkItem _x; + // set player loadout + if (_schemaVersion >= 1.0) then { + _playerData params ["","","_appearance","","","_loadout"]; + // get current weapon to send to param for selectWeapon + _currentWeapon = _appearance param [4,""]; +// _newPlyr setUnitLoadout [_loadout, false]; + + // Workaround for Client / Server synchronizing issue in SetUnitLoadout + [_newPlyr,_loadout] call Epoch_server_SetUnitLoadout; + + diag_log format["DEBUG: loaded player %1 with new schema Version %2", _newPlyr, _schemaVersion]; + + } else { + // Legacy code start + // Apperance + Weapons + _playerData params ["","","_appearance","","","_weaponsAndItems","_linkedItems","_normalMagazines","_itemsInContainers","_weaponsInContainers"]; + // load Apperance + _appearance params ["_goggles","_headgear","_vest","_backpack","_uniform"]; + + // old data format for 0.5 and prior. + // Load Apperance START + if (_uniform != "") then { + _newPlyr addUniform _uniform; }; - } forEach _linkedItems; + if (_backpack != "") then { + _newPlyr addBackpack _backpack; + }; + if (_goggles != "") then { + _newPlyr addGoggles _goggles; + }; + if (_headgear != "") then { + _newPlyr addHeadgear _headgear; + }; + if (_vest != "") then { + _newPlyr addVest _vest; + }; + // Load Apperance END - // add items to containers - [_newPlyr, _itemsInContainers] call EPOCH_fnc_addItemToX; + // Load inventory + defaults START + if (count _weaponsAndItems >= 3) then { + _weaponsAndItems params ["_currentWeaponTmp","_weaponsAndItemsArray","_equipped"]; + _currentWeapon = _currentWeaponTmp; + { + _weapon = _x deleteAt 0; + _type = getNumber(configfile >> "cfgweapons" >> _weapon >> "type"); + _attachments = []; + _wMags = false; + _wMagsArray = []; + // suppressor, laser, optics, magazines(array), bipods + { + // magazines + if (_x isEqualType []) then{ + _wMags = true; + _wMagsArray pushback _x; + } else { + // attachments + if (_x != "") then{ + _attachments pushBack _x; + }; + }; + } forEach _x; + if (_wMags) then { + { + _newPlyr addMagazine _x; + } foreach _wMagsArray; + }; + // add weapon if equiped + if (_weapon in _equipped) then { + _equipped = _equipped - [_weapon]; + if (_weapon != "") then { + _newPlyr addWeapon _weapon; + }; + switch (_type) do { + case 1: { // primary + removeAllPrimaryWeaponItems _newPlyr; + { _newPlyr addPrimaryWeaponItem _x } forEach _attachments; + }; + case 2: { // handgun + removeAllHandgunItems _newPlyr; + { _newPlyr addHandgunItem _x } forEach _attachments; + }; + case 4: { // secondary + // removeAllSecondaryWeaponItems player; does not exist ? + { + _newPlyr removeSecondaryWeaponItem _x; + } forEach (secondaryWeaponItems _newPlyr); + { _newPlyr addSecondaryWeaponItem _x } forEach _attachments; + }; + }; + }else{ + { + _newPlyr addItem _x; + } forEach _attachments; + }; + } forEach _weaponsAndItemsArray; + }; - // add weapons to containers - [_newPlyr, _weaponsInContainers] call EPOCH_fnc_addItemToX; + // Linked items + { + if (_x in["Binocular", "Rangefinder","Laserdesignator","Laserdesignator_02","Laserdesignator_03","Laserdesignator_01_khk_F","Laserdesignator_02_ghex_F"]) then { + _newPlyr addWeapon _x; + } else { + _newPlyr linkItem _x; + }; + } forEach _linkedItems; - // Add magazines - {_newPlyr addMagazine _x} forEach _normalMagazines; - // Load inventory + defaults END + // add items to containers + [_newPlyr, _itemsInContainers] call EPOCH_fnc_addItemToX; + + // add weapons to containers + [_newPlyr, _weaponsInContainers] call EPOCH_fnc_addItemToX; + + // Add magazines + {_newPlyr addMagazine _x} forEach _normalMagazines; + // Load inventory + defaults END + // Legacy code stop + }; // Final Push if (isNull _player) then { deleteVehicle _newPlyr; diag_log "Epoch: DEBUG: _player object was null reject connection"; } else { - _reject = false; - if (_playerGroup != "") then { - _newPlyr setVariable["GROUP", _playerGroup]; - }; + // add to cleanup + addToRemainsCollector[_newPlyr]; + + _reject = false; + + if (_playerGroup != "") then { + _newPlyr setVariable["GROUP", _playerGroup]; + }; _newPlyr setVariable["PUID", _playerUID]; @@ -306,19 +346,34 @@ if (!isNull _player) then { }; if (!_canBeRevived) then { - _newPlyr setVariable["REVIVE", _canBeRevived] + _newPlyr setVariable["REVIVE", _canBeRevived]; }; - [_playerNetID, _playerUID, [_newPlyr, _vars, _currWeap, loadAbs _newPlyr, _playerGroup, _canBeRevived, _newPlyr call EPOCH_server_setPToken,_playerGroupArray]] call EPOCH_server_pushPlayer; - //diag_log format["DEBUG (Load Player) Sent Group: %1 %2", _playerGroup, _playerGroupArray]; + // load community stats + _communityStatsArray = ["CommunityStats", _playerUID] call EPOCH_fnc_server_hiveGETRANGE; + _communityStats = ((_communityStatsArray select 1) select 0); + _newPlyr setVariable["COMMUNITY_STATS", _communityStats]; + // re enable damage server side + _newPlyr allowDamage true; + + // Flag new body as ready for use. _newPlyr setVariable["SETUP", true, true]; - // revive - _newPlyr setVariable ['#rev_enabled', true, true]; + // Send message to player so they can take over the new body. + [_playerNetID, _playerUID, [_newPlyr, _vars, _currentWeapon, loadAbs _newPlyr, _playerGroup, _canBeRevived, _newPlyr call EPOCH_server_setPToken,_playerGroupArray, _communityStats, _hitpoints], _fsmHandle, _player] call EPOCH_server_pushPlayer; + // diag_log str([_playerNetID, _playerUID, _player, [_newPlyr, (_player isEqualTo _newPlyr), _vars, _currentWeapon, loadAbs _newPlyr, _playerGroup, _canBeRevived, [],_playerGroupArray, _communityStats, _hitpoints], _fsmHandle]); - // [] remoteExec ["bis_fnc_reviveInit",_player]; + // revive test + _newPlyr setVariable ['#rev_enabled', true, true]; + // [] remoteExec ["bis_fnc_reviveInit",_player]; + // new Dynamicsimulation + if(["CfgDynamicSimulation", "playerDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntryV2)then + { + _newPlyr enableDynamicSimulation true; + _newPlyr triggerDynamicSimulation true; + }; }; } else { diag_log format["LOGIN FAILED UNIT NULL: %1 [%2|%3]", _player, _group, count allgroups]; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_makeSP.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_makeSP.sqf index 7fca6eac..a6abc731 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_makeSP.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_makeSP.sqf @@ -36,6 +36,7 @@ if (alive _jammer) then { // set position of spawnpoint to players SERVER_VARS _server_vars set [0, getposATL _player]; // 0 = RESPAWN POS _player setVariable ["SERVER_VARS", _server_vars]; + [_player, _player getVariable["VARS", []]] call EPOCH_server_savePlayer; ["Spawnpoint set", 5] remoteExec ['Epoch_message',_player]; } else @@ -43,6 +44,7 @@ if (alive _jammer) then { // remove position of spawnpoint from players SERVER_VARS _server_vars set [0, []]; // 0 = RESPAWN POS _player setVariable ["SERVER_VARS", _server_vars]; + [_player, _player getVariable["VARS", []]] call EPOCH_server_savePlayer; ["Spawnpoint removed", 5] remoteExec ['Epoch_message',_player]; }; } diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_onPlayerDisconnect.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_onPlayerDisconnect.sqf index 5caedad3..b84303f6 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_onPlayerDisconnect.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_onPlayerDisconnect.sqf @@ -28,6 +28,10 @@ if (!isNull _player) then { deleteVehicle _player; }; }; +// Delete any left over units with same PUID +{ + deleteVehicle _x; +} forEach (allUnits select {_x getVariable["PUID", "0"] == _uid}); _uid call EPOCH_server_disconnect; ['Disconnected', [_uid, _name]] call EPOCH_fnc_server_hiveLog; _return diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_respawnPlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_respawnPlayer.sqf index 2d7c6a24..bc06d898 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_respawnPlayer.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_respawnPlayer.sqf @@ -33,9 +33,7 @@ _location = getMarkerPos "respawn_west"; _location set[2, 0]; _player = (group _player) createUnit [_class, _location, [], 0, "CAN_COLLIDE"]; -{ - _player disableAI _x; -} forEach["FSM", "MOVE", "AUTOTARGET", "TARGET"]; +_player disableAI "ALL"; _player setDir _dir; _player setPosATL _location; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_revivePlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_revivePlayer.sqf index c9eb7e93..b6f657e6 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_revivePlayer.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_revivePlayer.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_player/EPOCH_server_revivePlayer.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_CorpseCrypto","_PlayerCrypto","_attachments","_backpack","_cIndex","_class","_currWeap","_currwh","_deleteprimary","_deletesecondary","_dir","_droppedPrimary","_droppedSecondary","_droppedWeapons","_equipped","_goggles","_group","_headgear","_items","_itemsplayer","_location","_magazinesAmmo","_newPlyr","_playerGroup","_playerUID","_primaryWeapon","_secondaryWeapon","_token","_type","_uniform","_vars","_vest","_wMags","_wMagsArray","_weapon","_weapons","_weaponsplayer","_wh"]; +private ["_loadout","_CorpseCrypto","_PlayerCrypto","_attachments","_cIndex","_class","_currwh","_deleteprimary","_deletesecondary","_dir","_droppedPrimary","_droppedSecondary","_droppedWeapons","_equipped","_group","_location","_newPlyr","_playerGroup","_playerUID","_token","_type","_vars","_wMags","_wMagsArray","_weapon","_wh","_kIndex","_reviver","_reviverCStats","_reviverKarma","_reviverKarmaAdj"]; //[[[end]]] params ["_player","_reviver",["_token","",[""]] ]; @@ -46,23 +46,12 @@ if (!local _player) then { _dir = getDir _player; _playerGroup = _player getVariable["GROUP", ""]; - _goggles = goggles _player; - _headgear = headgear _player; - _vest = vest _player; - _backpack = backpack _player; - _uniform = uniform _player; - - _items = assignedItems _player; - _magazinesAmmo = magazinesAmmo _player; - - _primaryWeapon = ""; - _secondaryWeapon = ""; + // Load Inventory + _loadout = getUnitLoadout _player; _wh = nearestObjects[_player, ["WeaponHolderSimulated"], 12]; - _droppedPrimary = []; _droppedSecondary = []; - _droppedWeapons = []; _deleteprimary = []; _deletesecondary = []; reverse _wh; @@ -71,22 +60,23 @@ if (!local _player) then { { _type = getNumber(configfile >> "cfgweapons" >> (_x select 0) >> "type"); switch _type do { - case 1: {_droppedPrimary = _x; _primaryWeapon = _x select 0; _deleteprimary = [_currwh]}; - case 4: {_droppedSecondary = _x; _secondaryWeapon = _x select 0;_deletesecondary = [_currwh]}; + case 1: {_droppedPrimary = _x; _deleteprimary = [_currwh]}; + case 4: {_droppedSecondary = _x; _deletesecondary = [_currwh]}; }; } forEach (weaponsItemsCargo _x); } foreach _wh; { if (!isnull _x) then {deletevehicle _x}; } foreach (_deleteprimary+_deletesecondary); - - if !(_droppedPrimary isequalto []) then {_droppedWeapons pushback _droppedPrimary}; - if !(_droppedSecondary isequalto []) then {_droppedWeapons pushback _droppedSecondary}; - // diag_log ["DEBUG: _droppedWeapons %1", _droppedWeapons]; - - _itemsplayer = [getItemCargo(uniformContainer _player), getItemCargo(vestContainer _player), getItemCargo(backpackContainer _player)]; - _weaponsplayer = [getWeaponCargo(uniformContainer _player), getWeaponCargo(vestContainer _player), getWeaponCargo(backpackContainer _player)]; - _weapons = [currentWeapon _player, ((weaponsItems _player) + _droppedWeapons), [_primaryWeapon, _secondaryWeapon, handgunWeapon _player]]; + if (count _droppedPrimary == 6) then { + _droppedPrimary set [6,_droppedPrimary select 5]; + _droppedPrimary set [5,[]]; + + }; + if (count _droppedSecondary == 6) then { + _droppedSecondary set [6,_droppedSecondary select 5]; + _droppedSecondary set [5,[]]; + }; hideObjectGlobal _player; @@ -111,11 +101,16 @@ if (!local _player) then { _newPlyr = _group createUnit[_class, _location, [], 0, "CAN_COLLIDE"]; + // new Dynamicsimulation + if(["CfgDynamicSimulation", "playerDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntryV2)then + { + _newPlyr enableDynamicSimulation true; + _newPlyr triggerDynamicSimulation true; + }; + addToRemainsCollector[_newPlyr]; - { - _newPlyr disableAI _x; - }forEach["FSM", "MOVE", "AUTOTARGET", "TARGET"]; + _newPlyr disableAI "ALL"; _newPlyr setVariable ["SETUP", true]; _newPlyr setVariable ["PUID", _playerUID]; @@ -131,99 +126,13 @@ if (!local _player) then { _newPlyr setFatigue 1; _newPlyr setDamage 0.25; - // Apperance - if (_uniform != "") then { - _newPlyr addUniform _uniform; - }; - if (_backpack != "") then { - _newPlyr addBackpack _backpack; - }; - if (_goggles != "") then { - _newPlyr addGoggles _goggles; - }; - if (_headgear != "") then { - _newPlyr addHeadgear _headgear; - }; - if (_vest != "") then { - _newPlyr addVest _vest; - }; + // Add inventory + _loadout set [0,_droppedPrimary]; + _loadout set [1,_droppedSecondary]; +// _newPlyr setUnitLoadout [_loadout, false]; - // Weapons - if (count _weapons >= 3) then { - _equipped = _weapons select 2; - { - _weapon = _x deleteAt 0; - _type = getNumber(configfile >> "cfgweapons" >> _weapon >> "type"); - _attachments = []; - _wMags = false; - _wMagsArray = []; - // suppressor, laser, optics - { - // magazines - if (_x isEqualType []) then{ - _wMags = true; - _wMagsArray pushback _x; - } else { - // attachments - if (_x != "") then{ - _attachments pushBack _x; - }; - }; - } forEach _x; - if (_wMags) then { - { - _newPlyr addMagazine _x; - } foreach _wMagsArray; - }; - // add weapon if equiped - if (_weapon in _equipped) then { - _equipped = _equipped - [_weapon]; - if (_weapon != "") then { - _newPlyr addWeapon _weapon; - }; - switch _type do { - case 1: { // primary - removeAllPrimaryWeaponItems _newPlyr; - { _newPlyr addPrimaryWeaponItem _x }forEach _attachments; - }; - case 2: { // handgun - removeAllHandgunItems _newPlyr; - { _newPlyr addHandgunItem _x }forEach _attachments; - }; - case 4: { // secondary - // removeAllSecondaryWeaponItems player; does not exist ? - { - _newPlyr removeSecondaryWeaponItem _x; - } forEach(secondaryWeaponItems _newPlyr); - { _newPlyr addSecondaryWeaponItem _x }forEach _attachments; - }; - }; - }else{ - { - _newPlyr addItem _x; - }forEach _attachments; - }; - } forEach (_weapons select 1); -// _currWeap = (_weapons select 0); - }; - // Linked items - { - if (_x in ["Binocular","Rangefinder"]) then { - _newPlyr addWeapon _x; - } else { - _newPlyr linkItem _x; - }; - }forEach _items; - - // add items to containers - [_newPlyr, _itemsplayer] call EPOCH_fnc_addItemToX; - - // add weapons to containers - [_newPlyr, _weaponsplayer] call EPOCH_fnc_addItemToX; - - // Add magazines - {_newPlyr addMagazine _x;}forEach _magazinesAmmo; - // Load inventory + defaults END + // Workaround for Client / Server synchronizing issue in SetUnitLoadout + [_newPlyr,_loadout] call Epoch_server_SetUnitLoadout; // Final Push _token = _newPlyr call EPOCH_server_setPToken; @@ -240,6 +149,17 @@ if (!local _player) then { // send to player [_newPlyr, _token, loadAbs _newPlyr] remoteExec ['EPOCH_clientRevive',_player]; + + // send stat to reviver + [_reviver, "Revives", 1, true] call EPOCH_server_updatePlayerStats; + + // send karma stat to reviver + _kIndex = EPOCH_communityStats find "Karma"; + _reviverCStats = _reviver getVariable["COMMUNITY_STATS", EPOCH_defaultStatVars]; + _reviverKarma = _reviverCStats select _kIndex; + _reviverKarmaAdj = 5; + if(_reviverKarma < 0)then{_reviverKarmaAdj = -5}; + [_reviver, "Karma", _reviverKarmaAdj, true] call EPOCH_server_updatePlayerStats; }; }; }; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_savePlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_savePlayer.sqf index 33623bd3..165db39a 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_savePlayer.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_savePlayer.sqf @@ -12,8 +12,10 @@ Github: https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_player/EPOCH_server_savePlayer.sqf */ -private["_return", "_pos", "_medical", "_playerUID", "_weapons", "_itemsplayer", "_weaponsplayer", "_appearance", "_dmg", "_allowSave", "_cIndex", "_Svars", "_current_crypto", "_group", "_revive", "_vehiclePlyr","_server_vars"]; -params [["_player",objNull], ["_vars",[]]]; +//[[[cog import generate_private_arrays ]]] +private ["_Svars","_allowSave","_appearance","_bloodPIndex","_bloodPressure","_group","_hitpoints","_loadout","_medical","_playerUID","_pos","_return","_return2","_revive","_schemaVersion","_server_vars","_stats","_vehiclePlyr"]; +//[[[end]]] +params [["_player",objNull], ["_vars",[]] ]; if (isNull _player) exitWith { diag_log "DEBUG SAVE ABORT null player object"; @@ -46,7 +48,7 @@ if (_allowSave) then{ private _serverOnly = ["Crypto"]; _Svars = _player getVariable["VARS", call EPOCH_defaultVars_SEPXVar]; { - _cIndex = EPOCH_customVars find _x; + private _cIndex = EPOCH_customVars find _x; if (_cIndex != -1) then{ _vars set[_cIndex, (_Svars select _cIndex)]; }; @@ -78,19 +80,34 @@ if (_allowSave) then{ }; }; - _dmg = damage _player; - _medical = [getBleedingRemaining _player, 0, getOxygenRemaining _player, _dmg]; - _appearance = [goggles _player, headgear _player, vest _player, backpack _player, uniform _player, typeOf _player]; - _itemsplayer = [getItemCargo(uniformContainer _player), getItemCargo(vestContainer _player), getItemCargo(backpackContainer _player)]; - _weaponsplayer = [getWeaponCargo(uniformContainer _player), getWeaponCargo(vestContainer _player), getWeaponCargo(backpackContainer _player)]; - _weapons = [currentWeapon _player, weaponsItems _player, [primaryWeapon _player, secondaryWeapon _player, handgunWeapon _player]]; + // get players hitpoint damage + _hitpoints = (getAllHitPointsDamage _player) param [2,[]]; + + // build medical array + _medical = [getBleedingRemaining _player, 0, getOxygenRemaining _player, damage _player, _hitpoints]; + + // appearance now handled with getUnitLoadout, typeof is still needed to determine players class. + _appearance = ["", "", "", "", currentWeapon _player, typeOf _player]; + + // new save format + _loadout = getUnitLoadout _player; + + // change this if needed + _schemaVersion = 1.0; // save player - _return = ["Player", _playerUID, EPOCH_expiresPlayer, [[getDir _player, _pos, (call EPOCH_fn_InstanceID)], _medical, _appearance, _server_vars, _vars, _weapons, assignedItems _player, magazinesAmmo _player, _itemsplayer, _weaponsplayer, _group, _revive]] call EPOCH_fnc_server_hiveSETEX; + _return = ["Player", _playerUID, EPOCH_expiresPlayer, [[getDir _player, _pos, (call EPOCH_fn_InstanceID), _schemaVersion], _medical, _appearance, _server_vars, _vars, _loadout, [], [], [], [], _group, _revive]] call EPOCH_fnc_server_hiveSETEX; - // kill player if blood pressure >= 180 - if (_vars select 12 >= 180) then { + // save community stats + _stats = _player getVariable["COMMUNITY_STATS", EPOCH_defaultStatVars]; + _return2 = ["CommunityStats", _playerUID, EPOCH_expiresCommunityStats, [_stats]] call EPOCH_fnc_server_hiveSETEX; + + // blood pressure must stay within 11-179 range + _bloodPIndex = EPOCH_customVars find "BloodP"; + _bloodPressure = _vars param [_bloodPIndex,100]; + if (_bloodPressure >= 180 || _bloodPressure <= 10) then { _player setDamage 1; + ["PlayerStats", _playerUID, 0, 1] call EPOCH_fnc_server_hiveSETBIT; } else { // set player alive bit ["PlayerStats", _playerUID, 0, 0] call EPOCH_fnc_server_hiveSETBIT; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_unpackBackpack.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_unpackBackpack.sqf index 9b0307a7..4d6322e3 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_unpackBackpack.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_unpackBackpack.sqf @@ -20,7 +20,7 @@ params ["_item","_player",["_token","",[""]] ]; if !([_player,_token] call EPOCH_server_getPToken) exitWith {}; if (_item isKindOf "Bag_Base") then { _wH = objNull; - _nearByHolder = nearestObjects [position _player,["groundWeaponHolder"],3]; + _nearByHolder = nearestObjects [_player,["groundWeaponHolder"],3]; if (_nearByHolder isEqualTo []) then { _wHPos = _player modelToWorld [0,1,0]; if (surfaceIsWater _wHPos) then { diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_updatePlayerStats.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_updatePlayerStats.sqf new file mode 100644 index 00000000..000211ca --- /dev/null +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_updatePlayerStats.sqf @@ -0,0 +1,67 @@ +/* + + Author: DirtySanchez - EpochMod.com + + Contributors: + + Description: + Save player community stats - default server only update, _this select 3 = true will send stat update to client + + 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/compile/epoch_player/EPOCH_server_updatePlayerStats.sqf + + usage: + + example 1: + [_playerObj, "AIKills", 1] call Epoch_server_updatePlayerStats; + + usage example + [_playerObj, _statType, _adjust, true] call Epoch_server_updatePlayerStats; + + _playerObj - OBJECT: the player object to receive the stat adjust and send to database/player + + _statType - STRING: the name of the variable as set in the EpochClientConfig defineCommunityStats[] = {}; + + _adjust - NUMBER: set the positive or negative adjustment, a value of 0 will exit the script + + _toClient - BOOLEAN: (OPTIONAL) by default this script is server side variables/hive changes only. + by setting this true the client will receive the stat update. + Use true when the stat change originates from the server and not the client. +*/ +params [ ["_playerObj",objNull], ["_statType",""], ["_adjust",0], ["_toClient",false] ]; + +if(isNull _playerObj)exitWith{ + diag_log "EPOCHDebug: playerUpdateStats -1- player is null object"; +}; +if(_statType isEqualTo "")exitWith{ + diag_log "EPOCHDebug: playerUpdateStats -2- stat type not defined"; +}; +if(_adjust isEqualTo 0)exitWith{ + diag_log "EPOCHDebug: playerUpdateStats -3- stat adjustment is 0"; +}; +_playerUID = getplayerUID _playerObj; +if(_playerUID isEqualTo "")exitWith{ + diag_log "EPOCHDebug: playerUpdateStats -4- player UID is empty"; +}; + +//get this playerObj stats +_playerStats = _playerObj getVariable["COMMUNITY_STATS", EPOCH_defaultStatVars]; +//get this stats index # +_sIndex = EPOCH_communityStats find _statType; +//get this stat value +_currentStat = _playerStats select _sIndex; +//set the new stat value +_playerStats set[_sIndex, _currentStat + _adjust]; +//set the new stats array back onto this playerObj +_playerObj setVariable["COMMUNITY_STATS", _playerStats]; + +//send to hive +["CommunityStats", _playerUID, EPOCH_expiresCommunityStats, [_playerStats]] call EPOCH_fnc_server_hiveSETEX; + +//send to player +if(_toClient)then{ + [_statType,_adjust] remoteExecCall ["EPOCH_client_updatePlayerStat",(owner _playerObj)]; +}; \ No newline at end of file diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_serverLootObject.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_serverLootObject.sqf index df712c37..e1f9cd4d 100644 --- a/Sources/epoch_server/compile/epoch_server/EPOCH_serverLootObject.sqf +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_serverLootObject.sqf @@ -27,25 +27,23 @@ if !(EPOCH_forcedLootSpawnTable isEqualTo "") then { _randomizeMagazineAmmoCount = ["CfgEpochClient", "randomizeMagazineAmmoCount", true] call EPOCH_fnc_returnConfigEntryV2; if (isnull _object && !(_pos isequalto [])) then { _object = createVehicle ["groundWeaponHolder",_pos,[],0,"CAN_COLLIDE"]; + _object setPosATL _pos; }; if !(isNull _object) then{ - _lootTable = [_type, "CfgMainTable", "tables"] call EPOCH_weightedArray; - _lootTable params ["_lootTableArray","_weightedArray"]; - if !(_lootTableArray isEqualTo []) then { + _lootTable = ["CfgMainTable", _type, "tables"] call EPOCH_fnc_weightedArray; + if !(_lootTable isEqualTo []) then { _loots = []; _config = configFile >> "CfgMainTable" >> _type; _minLoot = getNumber(_config >> "lootMin"); _maxLoot = getNumber(_config >> "lootMax"); _maxPayout = ((random(_maxLoot) * EPOCH_lootMultiplier) min _maxLoot) max _minLoot; for "_k" from 1 to _maxPayout do { - _loots pushBack (_lootTableArray select(selectRandom _weightedArray)); + _loots pushBack (selectRandomWeighted _lootTable); }; { - _lootItemWeightedArray = [_x, _lootTableClass, "items"] call EPOCH_weightedArray; - _lootItemArray = _lootItemWeightedArray select 0; - if !(_lootItemArray isEqualTo[]) then { - _weightedItemArray = _lootItemWeightedArray select 1; - _randomItemArray = _lootItemArray select (selectRandom _weightedItemArray); + _lootItemWeightedArray = [_lootTableClass, _x, "items"] call EPOCH_fnc_weightedArray; + if !(_lootItemWeightedArray isEqualTo[]) then { + _randomItemArray = selectRandomWeighted _lootItemWeightedArray; _randomItem = _randomItemArray select 0; _type = _randomItemArray select 1; _quan = 1; @@ -106,11 +104,9 @@ if !(isNull _object) then{ }; case "CfgLootTable": { // go down the rabit hole - _lootItemWeightedArray = [_randomItem, _lootTableClass, "items"] call EPOCH_weightedArray; - _lootItemArray = _lootItemWeightedArray select 0; - if !(_lootItemArray isEqualTo[]) then { - _weightedItemArray = _lootItemWeightedArray select 1; - _randomItemArray = _lootItemArray select(selectRandom _weightedItemArray); + _lootItemWeightedArray = [_lootTableClass, _randomItem, "items"] call EPOCH_fnc_weightedArray; + if !(_lootItemWeightedArray isEqualTo[]) then { + _randomItemArray = selectRandomWeighted _lootItemWeightedArray; _randomItem = _randomItemArray select 0; _type = _randomItemArray select 1; } else { diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_createGlobalMarkerSet.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_createGlobalMarkerSet.sqf new file mode 100644 index 00000000..f0e79d33 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_createGlobalMarkerSet.sqf @@ -0,0 +1,97 @@ +/* + + Author: DirtySanchez + + Contributors: + + Description: + Utilize new Epoch Active Markers, Backgrounds and Icons courtesy of DrokZ. + + 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/compile/epoch_server/EPOCH_server_createGlobalMarkerSet.sqf + + usage: + [_markerClass, _position] call EPOCH_server_createGlobalMarkerSet; + + _markerClass(_mClass) - use one of the class markers in the epoch_configs/Configs/CfgMarkerSets.hpp or create new + + _position(_mPos) - position you would like to place the marker set on the map + + Example: + 1. ['DeathMarker',_pos] call EPOCH_server_createGlobalMarkerSet; + + 2. ['PlayerMarker',_pos] call EPOCH_server_createGlobalMarkerSet; + +*/ +private["_config", "_markerArray", "_ccText"]; + +params [ ["_mClass",""], ["_mPos",[0,0,0]], ["_OverrideTxt",""] ]; +if(_mClass isEqualTo "") exitWith { + diag_log "EPOCHDebug: createGlobalMarkerSet -1- empty markerClass, nothing to create"; +}; + +// get config for custom marker sets +_config = 'CfgMarkerSets' call EPOCH_returnConfig; +if !(isclass (_config >> _mClass)) exitwith { + diag_log "EPOCHDebug: createGlobalMarkerSet -2- not a class markerClass, nothing to create"; +}; + +// get array for custom marker set +_markerArray = getArray(_config >> _mClass >> "markerArray"); +if(_markerArray isEqualTo []) exitWith { + diag_log "EPOCHDebug: createGlobalMarkerSet -3- empty markerArray, nothing to create"; +}; + +// check for defined Marker counter +if(isNil {Epoch_markerCounterGlobal})then{Epoch_markerCounterGlobal = 0}; + +_return = []; +// run forEach loop on array +{ + // double check all, use these defaults if not defined + _x params [ + ["_mName",format["EPOCH_globalMarker_%1", Epoch_markerCounterGlobal]], + ["_mShape","ICON"], + ["_mType","hd_dot"], + ["_mColor","ColorBlack"], + ["_mAlpha",1], + ["_mSize",[0.8,0.8]], + ["_mDir",0], + ["_mText",""] + ]; + _mName = format["EPOCH_globalMarker_%1", Epoch_markerCounterGlobal]; + _marker = createMarker [_mName, _mPos]; + _return pushBack _mName; + _mName setMarkerShape _mShape; + if!(_mShape isEqualTo "ICON")then{ + if!(_mType in (getArray(_config >> "brushes")))exitWith{ + diag_log "EPOCHDebug: createGlobalMarkerSet -5- Shape is Ellipse or Rectangle and needs a Brush Type"; + }; + }; + _mName setMarkerType _mType; + _mName setMarkerAlpha _mAlpha; + _mName setMarkerSize _mSize; + _mName setMarkerDir _mDir; + + if (!(_OverrideTxt isequalto "") && _OverrideTxt isequaltype "") then { + _mName setMarkerText _OverrideTxt; + } + else { + if!(_mText isEqualTo "")then{ + _ccText = call compile _mText; + _mName setMarkerText _ccText; + }; + }; + + if!(_mColor isEqualTo "")then{ + _mName setMarkerColor _mColor + }; + + missionNameSpace setVariable[_mName, _mSize, true]; + Epoch_markerCounterGlobal = Epoch_markerCounterGlobal + 1; +}forEach _markerArray; + +_return diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_createTeleport.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_createTeleport.sqf index 01481498..078fc706 100644 --- a/Sources/epoch_server/compile/epoch_server/EPOCH_server_createTeleport.sqf +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_createTeleport.sqf @@ -13,11 +13,11 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_server/EPOCH_server_createTeleport.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_array","_center","_class","_cloneClasses","_config","_deSimulate","_debug","_debug1","_debugLocation","_dir","_enterClass","_ep","_exitClass","_light","_lightLocation","_loadBaseTemplateConfig","_markerName","_part","_partPos","_pos","_pos1","_pro1","_pro2","_protection","_useWorldPos","_veh1","_veh2"]; +private ["_array","_center","_class","_cloneClasses","_config","_configWorld","_deSimulate","_debug","_debug1","_debugBox","_debugLocation","_dir","_dir1","_dir2","_enterClass","_ep","_exitClass","_light","_lightLocation","_loadBaseTemplateConfig","_markerName","_part","_partPos","_pos","_pos1","_pro1","_pro2","_protection","_useWorldPos","_veh1","_veh2"]; //[[[end]]] _loadBaseTemplateConfig = { private ["_partPos","_part","_array","_center","_deSimulate"]; - params ["_templateClass","_selectedTemplate","_pos"]; + params ["_templateClass","_selectedTemplate","_pos","_class"]; _array = getArray(configfile >> "CfgPropTemplate" >> _selectedTemplate); _pos set [2,0]; _center = createVehicle [_templateClass, _pos, [], 0, "CAN_COLLIDE"]; @@ -44,35 +44,40 @@ _loadBaseTemplateConfig = { } forEach _array; }; -_debugLocation = getMarkerPos "respawn_west"; -_debugLocation set[2, 0]; -_debug = createVehicle["Debug_static_F", _debugLocation, [], 0, "CAN_COLLIDE"]; -_debug setposATL _debugLocation; -_protection = createVehicle["ProtectionZone_Invisible_F", _debugLocation, [], 0, "CAN_COLLIDE"]; -_protection setposATL _debugLocation; -_cloneClasses = ["clone_empty_static_F", "clone_male_static_F", "clone_female_static_F"]; - -for "_i" from 1 to 4 do { - _class = selectRandom _cloneClasses; - _debug1 = createVehicle[_class, (_debug modelToWorld(_debug selectionPosition(str _i))), [], 0, "CAN_COLLIDE"]; - _debug1 setDir-90; - -}; -for "_i" from 5 to 8 do { - _class = selectRandom _cloneClasses; - _debug1 = createVehicle[_class, (_debug modelToWorld(_debug selectionPosition(str _i))), [], 0, "CAN_COLLIDE"]; - _debug1 setDir 90; -}; - -// spawn lights -{ - _lightLocation = _debug modelToWorld _x; - _light = createVehicle["Land_PortableLight_double_F", _lightLocation, [], 0, "CAN_COLLIDE"]; - _light setDir (_debugLocation getDir _lightLocation); - _light setpos _lightLocation; -} forEach [[-16.623,-8.50195,-10.5417],[15.0352,-9.08594,-10.5417]]; - +// load map config _config = configFile >> "CfgEpoch"; +_configWorld = _config >> worldname; + +_debugBox = getText(_configWorld >> "debugBoxClass"); // debugBoxClass = "" to disable +if !(_debugBox isEqualTo "") then { + _debugLocation = getMarkerPos "respawn_west"; + _debugLocation set[2, 0]; + _debug = createVehicle[_debugBox, _debugLocation, [], 0, "CAN_COLLIDE"]; + _debug setposATL _debugLocation; + _protection = createVehicle["ProtectionZone_Invisible_F", _debugLocation, [], 0, "CAN_COLLIDE"]; + _protection setposATL _debugLocation; + _cloneClasses = getArray(_configWorld >> "cloneClasses"); + if !(_cloneClasses isEqualTo []) then { + for "_i" from 1 to 4 do { + _class = selectRandom _cloneClasses; + _debug1 = createVehicle[_class, (_debug modelToWorld(_debug selectionPosition(str _i))), [], 0, "CAN_COLLIDE"]; + _debug1 setDir-90; + + }; + for "_i" from 5 to 8 do { + _class = selectRandom _cloneClasses; + _debug1 = createVehicle[_class, (_debug modelToWorld(_debug selectionPosition(str _i))), [], 0, "CAN_COLLIDE"]; + _debug1 setDir 90; + }; + }; + // spawn lights + { + _lightLocation = _debug modelToWorld _x; + _light = createVehicle["Land_PortableLight_double_F", _lightLocation, [], 0, "CAN_COLLIDE"]; + _light setDir (_debugLocation getDir _lightLocation); + _light setpos _lightLocation; + } forEach (getArray(_configWorld >> "lightPos")); +}; // spawn area props { @@ -89,18 +94,18 @@ _config = configFile >> "CfgEpoch"; _ep allowDamage false; if (_dir isEqualType []) then{ + _ep setposATL _pos; _ep setVectorDirAndUp _dir; - _ep setposATL _pos; } else { - _ep setDir _dir; _ep setposATL _pos; + _ep setDir _dir; }; if (_deSimulate) then{ _ep enableSimulationGlobal false; }; -} forEach(getArray(_config >> worldname >> "propsPos")); +} forEach(getArray(_configWorld >> "propsPos")); { _enterClass = _x select 0; @@ -110,38 +115,60 @@ _config = configFile >> "CfgEpoch"; _useWorldPos = (_x select 4) isEqualTo "true"; }; _pos1 = _x select 1; + + // allow forth position element to set direction if set + _dir1 = 0; + _dir2 = 0; + if (count _pos1 >= 4) then { + _dir1 = _pos1 deleteAt 3; + }; + if !(_useWorldPos) then { - _pos1 = _debug modelToWorld (_x select 1); + _pos1 = asltoatl (_debug modeltoworldworld _pos1); }; _exitClass = _x select 2; _pos = _x select 3; + // allow forth position element to set direction if set + if (_pos isEqualType [] && {count _pos >= 4}) then { + _dir2 = _pos deleteAt 3; + }; // load template props for marker location if (_pos isEqualType "") then { _markerName = _pos; _pos = getMarkerPos _markerName; - ["ProtectionZone_Invisible_F",_markerName,_pos] call _loadBaseTemplateConfig; + ["ProtectionZone_Invisible_F",_markerName,_pos,_class] call _loadBaseTemplateConfig; } else { _pro2 = createVehicle ["ProtectionZone_Invisible_F", _pos, [], 0, "CAN_COLLIDE"]; }; + + _pro1 = createVehicle ["ProtectionZone_Invisible_F", _pos1, [], 0, "CAN_COLLIDE"]; _veh1 = createVehicle[_enterClass, _pos1, [], 0, "CAN_COLLIDE"]; + // force addaction on any other objects that are not setup properly + if !(_veh1 isKindOf "Transport_EPOCH") then { + [_veh1, [(localize "STR_EPOCH_Teleport"), {(_this select 0) call EPOCH_EnterBuilding}, [], 1, true, true, "Action", "alive _target", 3, false, ""]] remoteExec ["addAction", -2, _veh1, true]; + }; _veh1 enableSimulationGlobal false; _veh1 allowDamage false; _veh1 setVariable["ParentBuilding", _pos]; - _veh1 setDir 0; + _veh1 setDir _dir1; _veh1 setposATL _pos1; if (_exitClass != "") then { _veh2 = createVehicle[_exitClass, _pos, [], 0, "CAN_COLLIDE"]; + // force addaction on any other objects that are not setup properly + if !(_veh2 isKindOf "Transport_EPOCH") then { + [_veh2, [(localize "STR_EPOCH_Teleport"), {(_this select 0) call EPOCH_EnterBuilding}, [], 1, true, true, "Action", "alive _target", 3, false, ""]] remoteExec ["addAction", -2, _veh1, true]; + }; _veh2 enableSimulationGlobal false; _veh2 allowDamage false; _veh2 setVariable["ParentBuilding", _pos1]; - _veh2 setDir 0; + _veh2 setDir _dir2; _veh2 setposATL _pos; }; EPOCH_staticTraderLocations pushBack _pos; -} foreach (getArray(_config >> worldname >> "telePos")); +} foreach (getArray(_configWorld >> "telePos")); diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_deleteGlobalMarkerSet.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_deleteGlobalMarkerSet.sqf new file mode 100644 index 00000000..01d6b747 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_deleteGlobalMarkerSet.sqf @@ -0,0 +1,31 @@ +/* + Author: DirtySanchez - EpochMod.com + + Contributors: + + Description: + Delete Marker Set + + License: + 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/compile/epoch_server/EPOCH_server_deleteGlobalMarkerSet.sqf + + usage: + [_markerArray] call EPOCH_server_deleteGlobalMarkerSet; + + _markerArray - 1 or more in game marker names +*/ +private["_mName"]; + +params [ ["_markerArray",[]], ["_data",[]] ]; + +if(_markerArray isEqualTo []) exitWith { + diag_log "EPOCHDebug: deleteGlobalMarkerSet -1- empty markerArray, nothing to delete"; +}; + +{ + _mName = _x; + deleteMarker _mName; +}forEach _markerArray; diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_getRealTime.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_getRealTime.sqf new file mode 100644 index 00000000..5edee145 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_getRealTime.sqf @@ -0,0 +1,21 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Returns Real Time in HH:MM string format + + 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/compile/epoch_server/EPOCH_server_getRealTime.sqf +*/ +// make call to get real time +(parseSimpleArray ('epochserver' callExtension '510')) params ["","","",["_hour",0],["_min",0]]; +// fix 0 prefix if lower than 10 +if (_min < 10) then {_min = '0'+str _min}; +if (_hour < 10) then {_hour = '0'+str _hour}; +// output HH:MM format +format ['%1:%2',_hour,_min] diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_makeMarker.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_makeMarker.sqf index 4620194c..66731f14 100644 --- a/Sources/epoch_server/compile/epoch_server/EPOCH_server_makeMarker.sqf +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_makeMarker.sqf @@ -37,9 +37,10 @@ switch _trgtType do { case 1: { if!(isNull _trgtObj)then{ - { - [_x,_mPos,_mShape,_mType,_mColor,_mSize,_mBrush,_mDir,_mText,_mAlpha,_mrkrName] remoteExec ['EPOCH_makeMarker',_x]; - }foreach (units group _trgtObj); + private _targets = (units group _trgtObj); + if !(_targets isEqualTo []) then { + [nil,_mPos,_mShape,_mType,_mColor,_mSize,_mBrush,_mDir,_mText,_mAlpha,_mrkrName] remoteExec ['EPOCH_makeMarker',_targets]; + }; }; }; @@ -57,10 +58,8 @@ switch _trgtType do { }; case 3: { - if(isArray _trgtObj && count _trgtObj > 0)then{ - { - [_x,_mPos,_mShape,_mType,_mColor,_mSize,_mBrush,_mDir,_mText,_mAlpha,_mrkrName] remoteExec ['EPOCH_makeMarker',_x]; - }foreach _trgtObj; + if(_trgtObj isEqualType [] && {!(_trgtObj isEqualTo [])})then{ + [nil,_mPos,_mShape,_mType,_mColor,_mSize,_mBrush,_mDir,_mText,_mAlpha,_mrkrName] remoteExec ['EPOCH_makeMarker',_trgtObj]; }; }; diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_removeMarker.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_removeMarker.sqf index 59302e34..5ee6739b 100644 --- a/Sources/epoch_server/compile/epoch_server/EPOCH_server_removeMarker.sqf +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_removeMarker.sqf @@ -31,9 +31,10 @@ switch _trgtType do { case 1: { if!(isNull _trgtObj)then{ - { - [_mrkrName] remoteExec ['EPOCH_removeMarker',_x]; - }foreach (units group _trgtObj); + private _targets = (units group _trgtObj); + if !(_targets isEqualTo []) then { + [_mrkrName] remoteExec ['EPOCH_removeMarker',_targets]; + }; }; }; @@ -42,10 +43,10 @@ switch _trgtType do { }; case 3: { - if(isArray _trgtObj && count _trgtObj > 0)then{ - { - [_mrkrName] remoteExec ['EPOCH_removeMarker',_x]; - }foreach _trgtObj; + if(_trgtObj isEqualType [] && {!(_trgtObj isEqualTo [])})then{ + if !(_trgtObj isEqualTo []) then { + [_mrkrName] remoteExec ['EPOCH_removeMarker',_trgtObj]; + }; }; }; diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_traderKilled.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_traderKilled.sqf index 361a7d56..56feb2f8 100644 --- a/Sources/epoch_server/compile/epoch_server/EPOCH_server_traderKilled.sqf +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_traderKilled.sqf @@ -13,13 +13,15 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_server/EPOCH_server_traderKilled.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_marker","_objHiveKey","_slot"]; +private ["_markers","_objHiveKey","_slot","_playerCStats","_playerKarma","_playerKarmaAdj","_kIndex"]; //[[[end]]] params ["_trader","_player"]; if (!isNull _trader) then { - _marker = _trader getVariable["MARKER_REF",""]; - if (_marker != "") then { - _marker setMarkerColor "ColorRed"; + _markers = _trader getVariable["MARKER_REF",[]]; + if !(_markers isequalto []) then { + { + _x setMarkerColor "ColorRed"; + }forEach _markers; }; _slot = _trader getVariable["AI_SLOT", -1]; if (_slot != -1) then { @@ -28,4 +30,11 @@ if (!isNull _trader) then { _objHiveKey = format ["%1:%2", (call EPOCH_fn_InstanceID), _slot]; ["AI", _objHiveKey] call EPOCH_fnc_server_hiveDEL; }; + // send karma stat to seller + _kIndex = EPOCH_communityStats find "Karma"; + _playerCStats = _player getVariable["COMMUNITY_STATS", EPOCH_defaultStatVars]; + _playerKarma = _playerCStats select _kIndex; + _playerKarmaAdj = -5; + if(_playerKarma < 0)then{_playerKarmaAdj = 5}; + [_player, "Karma", _playerKarmaAdj, true] call EPOCH_server_updatePlayerStats; }; diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_weightedArray.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_weightedArray.sqf deleted file mode 100644 index 73f32f6e..00000000 --- a/Sources/epoch_server/compile/epoch_server/EPOCH_weightedArray.sqf +++ /dev/null @@ -1,46 +0,0 @@ -/* - Author: Aaron Clark - EpochMod.com - - Contributors: - - Description: - Uses Epoch server extension to perform various functions like: kick, ban, shutdown, message, unlock/lock - - 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/compile/epoch_server/EPOCH_weightedArray.sqf -*/ -//[[[cog import generate_private_arrays ]]] -private ["_lootIndex","_lootTableArray","_return","_weightedArray"]; -//[[[end]]] -params ["_keyName","_configName","_arrayName"]; -_return = missionNamespace getVariable[format["EPOCH_LT_%1_%2_%3",_configName,_keyName,_arrayName],[]]; -if(_return isEqualTo[]) then { - _lootTableArray = []; - _weightedArray = []; - _lootIndex = 0; - { - if(_x isEqualType []) then { - _x params ["_tname","_tqty"]; - if (!(_tname isEqualTo "Zombie") || (_tname isEqualTo "Zombie") && EPOCH_mod_Ryanzombies_Enabled) then { - _lootTableArray pushBack _tname; - for "_i" from 1 to _tqty do { - _weightedArray pushBack _lootIndex; - }; - _lootIndex = _lootIndex + 1; - }; - } else { - if (!(_x isEqualTo "Zombie") || (_x isEqualTo "Zombie") && EPOCH_mod_Ryanzombies_Enabled) then { - _lootTableArray pushBack _x; - _weightedArray pushBack _lootIndex; - _lootIndex = _lootIndex + 1; - }; - }; - }forEach getArray(configFile >> _configName >> _keyName >> _arrayName); - _return = [_lootTableArray,_weightedArray]; - missionNamespace setVariable[format["EPOCH_LT_%1_%2_%3",_configName,_keyName,_arrayName],_return]; - // diag_log format["EPOCH_LT_%1_%2_%3 = %4",_configName,_keyName,_arrayName,_return]; -}; -_return 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 a9822ecf..e18ea506 100644 --- a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf +++ b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf @@ -13,11 +13,11 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_agent","_aiTables","_arr","_class","_currentStock","_existingStock","_home","_indexStock","_limit","_marker","_objHiveKey","_pos","_randomAIUniform","_response","_schedule","_serverSettingsConfig","_staticTrader","_staticTradersArrCount","_staticTradersArray","_storedVehicleLimit","_toBeRemoved","_traderSlotIndex","_work"]; +private ["_agent","_aiTables","_arr","_class","_currentStock","_existingStock","_home","_indexStock","_limit","_markers","_objHiveKey","_pos","_randomAIUniform","_response","_schedule","_serverSettingsConfig","_staticTrader","_staticTradersArrCount","_staticTradersArray","_storedVehicleLimit","_toBeRemoved","_traderSlotIndex","_work"]; //[[[end]]] params [["_maxTraderLimit",0]]; -_staticTradersArray = [] + EPOCH_staticNPCTraderPos; +_staticTradersArray = +EPOCH_staticNPCTraderPos; EPOCH_staticNPCTraderPos = nil; _staticTradersArray append getArray(configFile >> "CfgEpoch" >> worldName >> "staticNpcPos"); _staticTradersArrCount = count _staticTradersArray; @@ -29,7 +29,7 @@ _storedVehicleLimit = [_serverSettingsConfig, "storedVehicleLimit", 20] call EPO EPOCH_storedVehicleCount = 0; -for "_i" from 0 to _maxTraderLimit do { +for "_i" from 0 to (_maxTraderLimit-1) do { _traderSlotIndex = EPOCH_TraderSlots pushBack _i; // Spawn static traders first @@ -110,12 +110,8 @@ for "_i" from 0 to _maxTraderLimit do { EPOCH_TraderSlots deleteAt _traderSlotIndex; if (EPOCH_SHOW_TRADERS) then { - _marker = createMarker [str(_agent), (_pos)]; - _marker setMarkerShape "ICON"; - _marker setMarkerType "mil_dot"; - _marker setMarkerColor "ColorBlack"; - - _agent setVariable["MARKER_REF", _marker]; + _markers = ["StaticTrader",_pos] call EPOCH_server_createGlobalMarkerSet; + _agent setVariable["MARKER_REF", _markers]; }; } else { // Spawn dynamic traders @@ -227,11 +223,8 @@ for "_i" from 0 to _maxTraderLimit do { EPOCH_TraderSlots deleteAt _traderSlotIndex; if (EPOCH_SHOW_TRADERS) then { - _marker = createMarker [str(_agent), (_pos)]; - _marker setMarkerShape "ICON"; - _marker setMarkerType "mil_dot"; - _marker setMarkerColor "ColorBrown"; - _agent setVariable["MARKER_REF", _marker]; + _markers = ["DynamicTrader",_pos] call EPOCH_server_createGlobalMarkerSet; + _agent setVariable["MARKER_REF", _markers]; }; }; }; diff --git a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf index 7b70f9f3..e3394c07 100644 --- a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf +++ b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_acceptableBlds","_agent","_aiClass","_aiTables","_buildingHome","_buildingWork","_buildings","_checkBuilding","_config","_endTime","_home","_homes","_marker","_objHiveKey","_pos","_position","_randomAIUniform","_return","_schedule","_slot","_spawnCount","_startTime","_traderHomes","_usedBuildings","_work"]; +private ["_acceptableBlds","_agent","_aiClass","_aiTables","_buildingHome","_buildingWork","_buildings","_checkBuilding","_config","_endTime","_home","_homes","_markers","_objHiveKey","_pos","_position","_randomAIUniform","_return","_schedule","_slot","_spawnCount","_startTime","_traderHomes","_usedBuildings","_work"]; //[[[end]]] _spawnCount = count EPOCH_TraderSlots; _config = (configFile >> "CfgEpoch" >> worldName); @@ -67,11 +67,8 @@ for "_i" from 1 to _spawnCount do { }; ["AI", _objHiveKey, [_aiClass, _home, [_work, _schedule]] ] call EPOCH_fnc_server_hiveSET; if (EPOCH_SHOW_TRADERS) then { - _marker = createMarker[str(_agent), (_pos)]; - _marker setMarkerShape "ICON"; - _marker setMarkerType "mil_dot"; - _marker setMarkerColor "ColorKhaki"; - _agent setVariable["MARKER_REF", _marker]; + _markers = ["NewDynamicTrader",_pos] call EPOCH_server_createGlobalMarkerSet; + _agent setVariable["MARKER_REF", _markers]; }; }; }; diff --git a/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf b/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf index 4b3af1d9..7edb7f10 100644 --- a/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf +++ b/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_MaxBankDebit","_SkipOut","_VAL","_aiItems","_bankBalance","_bankData","_cIndex","_config","_currQty","_current_crypto","_current_cryptoRaw","_errorMsg","_final_location","_foundSmoke","_group","_helipad","_helipads","_item","_itemClasses","_itemQty","_itemQtys","_itemTax","_itemWorth","_itemsIn","_itemsOut","_lockOwner","_makeTradeIn","_message","_nearByHolder","_objHiveKey","_objOwner","_playerCryptoLimit","_playerGroup","_playerNetID","_playerUID","_position","_qtyIndex","_response","_return","_returnIn","_returnOut","_road","_serverSettingsConfig","_slot","_smoke","_tax","_tmpposition","_tradeIn","_tradeOut","_tradeQtyTotal","_tradeTotal","_vars","_vehHiveKey","_vehObj","_vehSlot","_vehicle","_vehicleBought","_vehicleSold","_vehicles","_vehslot","_wH","_wHPos","_wp"]; +private ["_MaxBankDebit","_SkipOut","_VAL","_aiItems","_bankBalance","_bankData","_cIndex","_config","_currQty","_current_crypto","_current_cryptoRaw","_errorMsg","_final_location","_foundSmoke","_group","_helipad","_helipads","_item","_itemClasses","_itemQty","_itemQtys","_itemTax","_itemWorth","_itemsIn","_itemsOut","_lockOwner","_makeTradeIn","_message","_nearByHolder","_objHiveKey","_objOwner","_playerCryptoLimit","_playerGroup","_playerNetID","_playerUID","_position","_qtyIndex","_response","_return","_returnIn","_returnOut","_road","_serverSettingsConfig","_slot","_smoke","_tax","_tmpposition","_tradeIn","_tradeOut","_tradeQtyTotal","_tradeTotal","_vars","_vehHiveKey","_vehObj","_vehSlot","_vehicle","_vehicleBought","_vehicleSold","_vehicles","_vehslot","_wH","_wHPos","_wp","_kIndex","_playerCStats","_playerKarma","_playerKarmaAdj"]; //[[[end]]] params ["_trader","_itemsIn","_itemsOut","_player",["_token","",[""]] ]; @@ -73,9 +73,13 @@ if (_slot != -1) then { if (_playerNetID == (owner _vehicle)) then { _vehSlot = _vehicle getVariable["VEHICLE_SLOT", "ABORT"]; - if (!_vehicleSold && _vehSlot != "ABORT") then { - - removeFromRemainsCollector[_vehicle]; + if (!_vehicleSold && _vehSlot != "ABORT") then { + _BaseClass = _vehicle getvariable ["VEHICLE_BaseClass",""]; + if !(_BaseClass isequalto "") then { + _item = _BaseClass; + _itemsIn set [_foreachindex,_item]; + }; + removeFromRemainsCollector[_vehicle]; deleteVehicle _vehicle; _vehicleSold = true; @@ -114,6 +118,13 @@ if (_slot != -1) then { _current_crypto = _current_crypto + _itemWorth; _tradeQtyTotal = _tradeQtyTotal + _itemQty; }; + // send karma stat to seller + _kIndex = EPOCH_communityStats find "Karma"; + _playerCStats = _player getVariable["COMMUNITY_STATS", EPOCH_defaultStatVars]; + _playerKarma = _playerCStats select _kIndex; + _playerKarmaAdj = 1; + if(_playerKarma < 0)then{_playerKarmaAdj = -1}; + [_player, "Karma", _playerKarmaAdj, true] call EPOCH_server_updatePlayerStats; }; }; } forEach _itemsIn; @@ -168,9 +179,9 @@ if (_slot != -1) then { if !(EPOCH_VehicleSlots isEqualTo[]) then { _position = getPosATL _player; - _helipad = nearestObjects[_position, ["Land_HelipadEmpty_F", "Land_HelipadCircle_F"], 100]; + _helipad = nearestObjects[_player, ["Land_HelipadEmpty_F", "Land_HelipadCircle_F"], 100]; _helipads = []; - _smoke = nearestObject[_position, "SmokeShell"]; + _smoke = nearestObject[_player, "SmokeShell"]; if (!isNull _smoke) then { _helipad pushBack _smoke; }; @@ -272,7 +283,7 @@ if (_slot != -1) then { if (_item isKindOf "Bag_Base") then { _wH = objNull; - _nearByHolder = nearestObjects [position _player,["groundWeaponHolder"],3]; + _nearByHolder = nearestObjects [_player,["groundWeaponHolder"],3]; if (_nearByHolder isEqualTo []) then { _wHPos = _player modelToWorld [0,1,0]; if (surfaceIsWater _wHPos) then { @@ -290,6 +301,13 @@ if (_slot != -1) then { _current_crypto = _current_crypto - _itemWorth; _tradeQtyTotal = _tradeQtyTotal + _itemQty; }; + // send karma stat to buyer + _kIndex = EPOCH_communityStats find "Karma"; + _playerCStats = _player getVariable["COMMUNITY_STATS", EPOCH_defaultStatVars]; + _playerKarma = _playerCStats select _kIndex; + _playerKarmaAdj = 1; + if(_playerKarma < 0)then{_playerKarmaAdj = -1}; + [_player, "Karma", _playerKarmaAdj, true] call EPOCH_server_updatePlayerStats; }; }; }; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf index dc3f37cb..c33a81df 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf @@ -24,6 +24,7 @@ _ExceptedBaseObjects = [_serverSettingsConfig, "ExceptedBaseObjects", []] call E _diag = diag_tickTime; EPOCH_StorageSlots = []; +EPOCH_activeGardens = []; for "_i" from 1 to _maxStorageLimit do { _storageSlotIndex = EPOCH_StorageSlots pushBack str(_i); _vehHiveKey = format ["%1:%2", (call EPOCH_fn_InstanceID), _i]; @@ -38,9 +39,9 @@ for "_i" from 1 to _maxStorageLimit do { // legacy change class _class = switch (_class_raw) do { - case "LockBoxProxy_EPOCH": { "LockBox_EPOCH" }; - case "SafeProxy_EPOCH": { "Safe_EPOCH" }; - default { _class_raw }; + case "LockBoxProxy_EPOCH": { "LockBox_EPOCH" }; + case "SafeProxy_EPOCH": { "Safe_EPOCH" }; + default { _class_raw }; }; if !(_inventory isEqualType []) then { _inventory = []; }; @@ -74,6 +75,11 @@ for "_i" from 1 to _maxStorageLimit do { _vehicle = createVehicle[_class, [0,0,0], [], 0, "CAN_COLLIDE"]; + // find gardens + if (_class isEqualTo "Garden_EPOCH") then { + EPOCH_activeGardens pushBack _vehicle; + }; + if (_UseIndestructible) then { if ({_vehicle iskindof _x} count _ExceptedBaseObjects == 0) then { { @@ -85,11 +91,11 @@ for "_i" from 1 to _maxStorageLimit do { }; if (_dir isEqualType []) then { + _vehicle setposATL _location; _vehicle setVectorDirAndUp _dir; - _vehicle setposATL _location; } else { - _vehicle setDir _dir; _vehicle setposATL _location; + _vehicle setDir _dir; }; // temp set damage to mark for maint @@ -138,93 +144,7 @@ for "_i" from 1 to _maxStorageLimit do { clearItemCargoGlobal _vehicle; if !(_inventory isEqualTo []) then { - { - _objType = _forEachIndex; - - _objTypes = _x; - _objQty = []; - - if (_objType in [1, 2, 3]) then { - _objTypes = _x select 0; - _objQty = _x select 1; - }; - - { - switch _objType do { - // Weapon cargo - case 0: { - if (_x isEqualType []) then { - if ((count _x) >= 4) then { - _vehicle addWeaponCargoGlobal[_x deleteAt 0, 1]; - - _attachments = []; - _wMags = false; - _wMagsArray = []; - // suppressor, laser, optics, magazines(array), bipods - { - // magazines - if (_x isEqualType []) then{ - _wMags = true; - _wMagsArray = _x; - } - else { - // attachments - if (_x != "") then{ - _attachments pushBack _x; - }; - }; - } forEach _x; - - // add all attachments to vehicle - // TODO replace with adding attachments directly to gun (Arma feature dependant) - { - _vehicle addItemCargoGlobal[_x, 1]; - } forEach _attachments; - - if (_wMags) then{ - if (_wMagsArray isEqualType [] && (count _wMagsArray) >= 2) then{ - _vehicle addMagazineAmmoCargo[_wMagsArray select 0, 1, _wMagsArray select 1]; - }; - }; - - }; - }; - }; - // Magazine cargo - case 1: { - _magazineName = _x; - _magazineSize = _objQty select _forEachIndex; - - if ((_magazineName isEqualType "STRING") && (_magazineSize isEqualType 0)) then { - _magazineSizeMax = getNumber (configFile >> "CfgMagazines" >> _magazineName >> "count"); - if (_magazineSizeMax >= 1) then { - // Add full magazines cargo - _vehicle addMagazineAmmoCargo [_magazineName, floor (_magazineSize / _magazineSizeMax), _magazineSizeMax]; - - // Add last non full magazine - if ((_magazineSize % _magazineSizeMax) > 0) then { - _vehicle addMagazineAmmoCargo [_magazineName, 1, floor (_magazineSize % _magazineSizeMax)]; - }; - }; - }; - }; - // Backpack cargo - case 2: { - if (_x isEqualType "STRING") then { - _qty = _objQty select _forEachIndex; - _vehicle addBackpackCargoGlobal [_x, _qty]; - }; - }; - // Item cargo - case 3: { - if (_x isEqualType "STRING") then { - _qty = _objQty select _forEachIndex; - _vehicle addItemCargoGlobal [_x, _qty]; - }; - }; - }; - }forEach _objTypes; - }forEach _inventory; + [_vehicle,_inventory] call EPOCH_server_CargoFill; }; if (EPOCH_DEBUG_VEH) then { diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf index 182fd4b1..ae9185de 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf @@ -1,37 +1,38 @@ /* Author: Aaron Clark - EpochMod.com - Contributors: + Contributors: Description: - Load Vehicles + Load Vehicles - Licence: - Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike + 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/compile/epoch_vehicle/EPOCH_load_vehicles.sqf + Github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_actualHitpoints","_allHitpoints","_allVehicles","_allowDamage","_arr","_arrNum","_attachments","_availableColorsConfig","_cfgEpochVehicles","_class","_color","_colors","_config","_count","_damage","_dataFormat","_dataFormatCount","_diag","_dmg","_found","_hitpoints","_immuneIfStartInBase","_jammerOwner","_jammerRange","_jammers","_location","_lockedOwner","_magazineName","_magazineSize","_magazineSizeMax","_mags","_marker","_nearestJammer","_objQty","_objType","_objTypes","_qty","_removemagazinesturret","_removeweapons","_response","_selections","_serverSettingsConfig","_simulationHandler","_textureSelectionIndex","_textures","_vehHiveKey","_vehLockHiveKey","_vehicle","_vehicleDamages","_vehicleSlotIndex","_wMags","_wMagsArray","_worldspace"]; +private ["_actualHitpoints","_allHitpoints","_allVehicles","_allowDamage","_arr","_arrNum","_availableColorsConfig","_cfgEpochVehicles","_check","_class","_colors","_config","_count","_dataFormat","_dataFormatCount","_diag","_dmg","_found","_immuneIfStartInBase","_jammerOwner","_jammerRange","_jammers","_location","_lockedOwner","_marker","_nearestJammer","_removemagazinesturret","_removeweapons","_response","_selections","_serverSettingsConfig","_textureSelectionIndex","_textures","_vehHiveKey","_vehLockHiveKey","_vehicle","_vehicleSlotIndex"]; //[[[end]]] params [["_maxVehicleLimit",0]]; _diag = diag_tickTime; -_dataFormat = ["", [], 0, [], 0, [], [], 0]; +_dataFormat = ["", [], 0, [], 0, [], [], 0, ""]; _dataFormatCount = count _dataFormat; EPOCH_VehicleSlots = []; _allVehicles = []; -_vehicleDamages = []; + _config = 'CfgEpochClient' call EPOCH_returnConfig; _jammerRange = getNumber(_config >> "buildingJammerRange"); _serverSettingsConfig = configFile >> "CfgEpochServer"; _immuneIfStartInBase = [_serverSettingsConfig, "immuneIfStartInBase", true] call EPOCH_fnc_returnConfigEntry; -_simulationHandler = [_serverSettingsConfig, "simulationHandlerOld", false] call EPOCH_fnc_returnConfigEntry; + _removeweapons = [_serverSettingsConfig, "removevehweapons", []] call EPOCH_fnc_returnConfigEntry; _removemagazinesturret = [_serverSettingsConfig, "removevehmagazinesturret", []] call EPOCH_fnc_returnConfigEntry; +_disableVehicleTIE = [_serverSettingsConfig, "disableVehicleTIE", true] call EPOCH_fnc_returnConfigEntry; for "_i" from 1 to _maxVehicleLimit do { _vehicleSlotIndex = EPOCH_VehicleSlots pushBack str(_i); @@ -43,6 +44,18 @@ for "_i" from 1 to _maxVehicleLimit do { _arr = _response select 1; _arrNum = count _arr; + // New Upgrade System adds to DB array, check and correct older saved vehicles + if (_arrNum < _dataFormatCount) then { + { + _check = _arr select _foreachindex; + if (isnil '_check') then { + _arr pushback (_dataFormat select _foreachindex); + }; + } foreach _dataFormat; + // recount array + _arrNum = count _arr; + }; + if (_arrNum == _dataFormatCount) then { // Validate and replace invaild data @@ -50,11 +63,10 @@ for "_i" from 1 to _maxVehicleLimit do { if !((_arr select _forEachIndex) isEqualType _x) then {_arr set[_forEachIndex, _x]}; } forEach _dataFormat; - _class = _arr select 0; - _worldspace = _arr select 1; - _damage = _arr select 2; + _arr params ["_class","_worldspace","_damage","_hitpoints","_fuel","_inventory","_ammo","_color","_baseClass"]; if (_class != "" && _damage < 1) then { + // remove location from worldspace and set to new var _location = _worldspace deleteAt 0; if !(_location isEqualTo []) then { @@ -72,163 +84,13 @@ for "_i" from 1 to _maxVehicleLimit do { // spawn vehicle at temp location. _vehicle = createVehicle [_class, _location, [], 0, "CAN_COLLIDE"]; + // turn off BIS randomization + _vehicle setVariable ["BIS_enableRandomization", false]; if !(isNull _vehicle) then { - // make vehicle immune from damage. - _vehicle allowDamage false; - // store spawned vehicles in array to make one call to remains handler - _allVehicles pushBack _vehicle; - // remove selected slot from array and set on vehicle - EPOCH_VehicleSlots deleteAt _vehicleSlotIndex; - _vehicle setVariable ["VEHICLE_SLOT", str(_i), true]; - // set server side token and init vehicle event handlers. - _vehicle call EPOCH_server_setVToken; - _vehicle call EPOCH_server_vehicleInit; - // set final direction and postion of vehicle - _vehicle setVectorDirAndUp _worldspace; - _vehicle setposATL _location; - // push damage to temp array to apply damage after some delay - _vehicleDamages pushBack [_vehicle,_damage,(_arr select 3)]; - // set fuel level - _vehicle setFuel (_arr select 4); - // apply persistent textures - _cfgEpochVehicles = 'CfgEpochVehicles' call EPOCH_returnConfig; - _availableColorsConfig = (_cfgEpochVehicles >> _class >> "availableColors"); - if (isArray(_availableColorsConfig)) then { - _color = _arr select 7; - _colors = getArray(_availableColorsConfig); - _textureSelectionIndex = (_cfgEpochVehicles >> _class >> "textureSelectionIndex"); - _selections = if (isArray(_textureSelectionIndex)) then { getArray(_textureSelectionIndex) } else { [0] }; - _count = (count _colors) - 1; - { - _textures = _colors select 0; - if (_count >= _forEachIndex) then { - _textures = _colors select _forEachIndex; - }; - _vehicle setObjectTextureGlobal [_x, _textures select _color]; - } forEach _selections; - _vehicle setVariable ["VEHICLE_TEXTURE", _color]; - }; - // disable thermal imaging equipment - _vehicle disableTIEquipment true; - // lock all vehicles - _vehicle lock true; - // load vehicle inventory - clearWeaponCargoGlobal _vehicle; - clearMagazineCargoGlobal _vehicle; - clearBackpackCargoGlobal _vehicle; - clearItemCargoGlobal _vehicle; - - if !(_removeweapons isequalto []) then { - { - _vehicle removeWeaponGlobal _x; - } foreach _removeweapons; - }; - if !(_removemagazinesturret isequalto []) then { - { - _vehicle removeMagazinesTurret _x; - } foreach _removemagazinesturret; - }; - - { - _objType = _forEachIndex; - _objTypes = _x; - _objQty = []; - if (_objType in [1, 2, 3]) then { - _objTypes = _x select 0; - _objQty = _x select 1; - }; - { - switch _objType do { - // Weapon cargo - case 0: { - if (_x isEqualType []) then { - if ((count _x) >= 4) then { - _vehicle addWeaponCargoGlobal[_x deleteAt 0, 1]; - _attachments = []; - _wMags = false; - _wMagsArray = []; - // suppressor, laser, optics, magazines(array), bipods - { - // magazines - if (_x isEqualType []) then{ - _wMags = true; - _wMagsArray = _x; - } else { - // attachments - if (_x != "") then{ - _attachments pushBack _x; - }; - }; - } forEach _x; - // add all attachments to vehicle - // TODO replace with adding attachments directly to gun (Arma feature dependant) - { - _vehicle addItemCargoGlobal[_x, 1]; - } forEach _attachments; - if (_wMags) then{ - if (_wMagsArray isEqualType [] && (count _wMagsArray) >= 2) then{ - _vehicle addMagazineAmmoCargo[_wMagsArray select 0, 1, _wMagsArray select 1]; - }; - }; - }; - }; - }; - // Magazine cargo - case 1: { - _magazineName = _x; - _magazineSize = _objQty select _forEachIndex; - if ((_magazineName isEqualType "STRING") && (_magazineSize isEqualType 0)) then { - _magazineSizeMax = getNumber (configFile >> "CfgMagazines" >> _magazineName >> "count"); - if (_magazineSizeMax >= 1) then { - // Add full magazines cargo - _vehicle addMagazineAmmoCargo [_magazineName, floor (_magazineSize / _magazineSizeMax), _magazineSizeMax]; - // Add last non full magazine - if ((_magazineSize % _magazineSizeMax) > 0) then { - _vehicle addMagazineAmmoCargo [_magazineName, 1, floor (_magazineSize % _magazineSizeMax)]; - }; - }; - }; - }; - // Backpack cargo - case 2: { - if (_x isEqualType "STRING") then { - _qty = _objQty select _forEachIndex; - _vehicle addBackpackCargoGlobal [_x, _qty]; - }; - }; - // Item cargo - case 3: { - if (_x isEqualType "STRING") then { - _qty = _objQty select _forEachIndex; - _vehicle addItemCargoGlobal [_x, _qty]; - }; - }; - }; - } forEach _objTypes; - } forEach (_arr select 5); - - // remove and add back magazines - if !((_arr select 6) isequalto []) then { - if ((_arr select 6 select 0) isequaltype true) then { - { - _vehicle removeMagazinesTurret [_x select 0, _x select 1]; - } foreach magazinesAllTurrets _vehicle; - { - if ((_x select 2) > 0) then { - _vehicle addMagazineTurret [_x select 0,_x select 1,_x select 2]; - }; - } foreach (_arr select 6 select 1); - } - else { - {_vehicle removeMagazineGlobal _x}count (magazines _vehicle); - {_vehicle addMagazine _x}count (_arr select 6); - }; - }; // set damage and hitpoints _vehicle setDamage _damage; _allHitpoints = getAllHitPointsDamage _vehicle; - _hitpoints = _arr select 3; if !(_allHitpoints isEqualTo []) then{ _actualHitpoints = _allHitpoints select 0; if ((count _actualHitpoints) == (count _hitpoints)) then{ @@ -242,48 +104,121 @@ for "_i" from 1 to _maxVehicleLimit do { }; }; - // allow damage - _allowDamage = true; - if (_immuneIfStartInBase) then { - _jammers = nearestObjects[_vehicle, ["PlotPole_EPOCH"], _jammerRange]; - if!(_jammers isEqualTo [])then { - // get jammer owner - _nearestJammer = _jammers select 0; - _jammerOwner = _nearestJammer getVariable["BUILD_OWNER", "-2"]; - // get vehicle lock owner - _lockedOwner = "-1"; - _vehLockHiveKey = format["%1:%2", (call EPOCH_fn_InstanceID), str(_i)]; - (["VehicleLock", _vehLockHiveKey] call EPOCH_fnc_server_hiveGETRANGE) params [["_status", 0 ],["_payload", [] ]]; - if (_status isEqualTo 1) then { - _lockedOwner = _payload param [0,"-1"]; - }; - // if match keep vehicle immune till first unlock - if (_jammerOwner isEqualTo _lockedOwner) then { - _vehicle setVariable ["EPOCH_disallowedDamage", true]; - _allowDamage = false; - }; - }; - }; + // make vehicle immune from further damage. + _vehicle allowDamage false; - if (_allowDamage) then { - _vehicle allowDamage true; - }; + // store spawned vehicles in array to make one call to remains handler + _allVehicles pushBack _vehicle; + // remove selected slot from array and set on vehicle + EPOCH_VehicleSlots deleteAt _vehicleSlotIndex; + _vehicle setVariable ["VEHICLE_SLOT", str(_i), true]; + // set server side token and init vehicle event handlers. + _vehicle call EPOCH_server_setVToken; + _vehicle call EPOCH_server_vehicleInit; + // set final direction and postion of vehicle + _vehicle setposATL _location; + _vehicle setVectorDirAndUp _worldspace; - // vehicle simulation handler - if (_simulationHandler) then{ - _vehicle enableSimulationGlobal false; + // set fuel level + _vehicle setFuel _fuel; + // apply persistent textures + _cfgEpochVehicles = 'CfgEpochVehicles' call EPOCH_returnConfig; + _availableColorsConfig = (_cfgEpochVehicles >> _class >> "availableColors"); + if (isArray(_availableColorsConfig)) then { + _colors = getArray(_availableColorsConfig); + _textureSelectionIndex = (_cfgEpochVehicles >> _class >> "textureSelectionIndex"); + _selections = if (isArray(_textureSelectionIndex)) then { getArray(_textureSelectionIndex) } else { [0] }; + _count = (count _colors) - 1; + { + _textures = _colors select 0; + if (_count >= _forEachIndex) then { + _textures = _colors select _forEachIndex; + }; + _vehicle setObjectTextureGlobal [_x, _textures select _color]; + } forEach _selections; + _vehicle setVariable ["VEHICLE_TEXTURE", _color]; }; - // turrets - /* - _mags = _vehicle magazinesTurret [0]; + if !(_baseClass isequalto "") then { + _vehicle setvariable ["VEHICLE_BASECLASS",_baseClass]; + }; + // disable thermal imaging equipment + if (_disableVehicleTIE) then { + _vehicle disableTIEquipment true; + }; + // lock all vehicles + _vehicle lock true; + // load vehicle inventory + clearWeaponCargoGlobal _vehicle; + clearMagazineCargoGlobal _vehicle; + clearBackpackCargoGlobal _vehicle; + clearItemCargoGlobal _vehicle; + + if !(_removeweapons isequalto []) then { + { + _vehicle removeWeaponGlobal _x; + } foreach _removeweapons; + }; + if !(_removemagazinesturret isequalto []) then { + { + _vehicle removeMagazinesTurret _x; + } foreach _removemagazinesturret; + }; + + // utilize He-Man's new Cargo functions + [_vehicle,_inventory] call EPOCH_server_CargoFill; + + // remove and add back magazines + if !(_ammo isequalto []) then { + if ((_ammo select 0) isequaltype true) then { + { + _vehicle removeMagazinesTurret [_x select 0, _x select 1]; + } foreach magazinesAllTurrets _vehicle; + { + if ((_x select 2) > 0) then { + _vehicle addMagazineTurret [_x select 0,_x select 1,_x select 2]; + }; + } foreach (_ammo select 1); + } + else { + {_vehicle removeMagazineGlobal _x}count (magazines _vehicle); + {_vehicle addMagazine _x}count _ammo; + }; + }; + + // allow damage + _allowDamage = true; + if (_immuneIfStartInBase) then { + _jammers = nearestObjects[_vehicle, ["PlotPole_EPOCH"], _jammerRange]; + if!(_jammers isEqualTo [])then { + // get jammer owner + _nearestJammer = _jammers select 0; + _jammerOwner = _nearestJammer getVariable["BUILD_OWNER", "-2"]; + // get vehicle lock owner + _lockedOwner = "-1"; + _vehLockHiveKey = format["%1:%2", (call EPOCH_fn_InstanceID), str(_i)]; + (["VehicleLock", _vehLockHiveKey] call EPOCH_fnc_server_hiveGETRANGE) params [["_status", 0 ],["_payload", [] ]]; + if (_status isEqualTo 1) then { + _lockedOwner = _payload param [0,"-1"]; + }; + // if match keep vehicle immune till first unlock + if (_jammerOwner isEqualTo _lockedOwner) then { + _vehicle setVariable ["EPOCH_disallowedDamage", true]; + _allowDamage = false; + }; + }; + }; + + if (_allowDamage) then { + _vehicle allowDamage true; + }; + + // new Dynamicsimulation + if(["CfgDynamicSimulation", "vehicleDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntryV2)then { - _object removeMagazinesTurret [_x, [0]]; - } forEach _mags; - _mags = _vehicle magazinesTurret [-1]; - { - _object removeMagazinesTurret [_x, [-1]]; - } forEach _mags; - */ + _vehicle enableSimulationGlobal false; // turn it off until activated by dynamicSim + _vehicle enableDynamicSimulation true; + }; + if (EPOCH_DEBUG_VEH) then { _marker = createMarker [str(_location) , _location]; _marker setMarkerShape "ICON"; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles_old.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles_old.sqf index a57682ca..513d877f 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles_old.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles_old.sqf @@ -28,6 +28,7 @@ _simulationHandler = [_serverSettingsConfig, "simulationHandlerOld", false] call _immuneVehicleSpawn = [_serverSettingsConfig, "immuneVehicleSpawn", false] call EPOCH_fnc_returnConfigEntry; _removeweapons = [_serverSettingsConfig, "removevehweapons", []] call EPOCH_fnc_returnConfigEntry; _removemagazinesturret = [_serverSettingsConfig, "removevehmagazinesturret", []] call EPOCH_fnc_returnConfigEntry; +_disableVehicleTIE = [_serverSettingsConfig, "disableVehicleTIE", true] call EPOCH_fnc_returnConfigEntry; for "_i" from 1 to _maxVehicleLimit do { _vehicleSlotIndex = EPOCH_VehicleSlots pushBack str(_i); @@ -71,8 +72,8 @@ for "_i" from 1 to _maxVehicleLimit do { _vehicle = createVehicle [_class, _location, [], 0, "CAN_COLLIDE"]; _allVehicles pushBack _vehicle; _vehicle call EPOCH_server_setVToken; - _vehicle setVectorDirAndUp _worldspace; _vehicle setposATL _location; + _vehicle setVectorDirAndUp _worldspace; _vehicle setDamage _damage; _allHitpoints = getAllHitPointsDamage _vehicle; @@ -131,7 +132,9 @@ for "_i" from 1 to _maxVehicleLimit do { } foreach _removemagazinesturret; }; - _vehicle disableTIEquipment true; + if (_disableVehicleTIE) then { + _vehicle disableTIEquipment true; + }; _vehicle lock true; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_CargoFill.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_CargoFill.sqf new file mode 100644 index 00000000..981b4bd0 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_CargoFill.sqf @@ -0,0 +1,78 @@ +params [["_vehicle",objnull],["_items",[]]]; +{ + _objType = _forEachIndex; + _objTypes = _x; + _objQty = []; + if (_objType in [1, 2, 3]) then { + _objTypes = _x select 0; + _objQty = _x select 1; + }; + { + switch _objType do { + // Weapon cargo + case 0: { + if (_x isEqualType []) then { + if ((count _x) >= 4) then { + _vehicle addWeaponCargoGlobal[_x deleteAt 0, 1]; + _attachments = []; + _wMags = false; + _wMagsArray = []; + // suppressor, laser, optics, magazines(array), bipods + { + // magazines + if (_x isEqualType []) then{ + _wMags = true; + _wMagsArray = _x; + } else { + // attachments + if (_x != "") then{ + _attachments pushBack _x; + }; + }; + } forEach _x; + // add all attachments to vehicle + // TODO replace with adding attachments directly to gun (Arma feature dependant) + { + _vehicle addItemCargoGlobal[_x, 1]; + } forEach _attachments; + if (_wMags) then{ + if (_wMagsArray isEqualType [] && (count _wMagsArray) >= 2) then{ + _vehicle addMagazineAmmoCargo[_wMagsArray select 0, 1, _wMagsArray select 1]; + }; + }; + }; + }; + }; + // Magazine cargo + case 1: { + _magazineName = _x; + _magazineSize = _objQty select _forEachIndex; + if ((_magazineName isEqualType "STRING") && (_magazineSize isEqualType 0)) then { + _magazineSizeMax = getNumber (configFile >> "CfgMagazines" >> _magazineName >> "count"); + if (_magazineSizeMax >= 1) then { + // Add full magazines cargo + _vehicle addMagazineAmmoCargo [_magazineName, floor (_magazineSize / _magazineSizeMax), _magazineSizeMax]; + // Add last non full magazine + if ((_magazineSize % _magazineSizeMax) > 0) then { + _vehicle addMagazineAmmoCargo [_magazineName, 1, floor (_magazineSize % _magazineSizeMax)]; + }; + }; + }; + }; + // Backpack cargo + case 2: { + if (_x isEqualType "STRING") then { + _qty = _objQty select _forEachIndex; + _vehicle addBackpackCargoGlobal [_x, _qty]; + }; + }; + // Item cargo + case 3: { + if (_x isEqualType "STRING") then { + _qty = _objQty select _forEachIndex; + _vehicle addItemCargoGlobal [_x, _qty]; + }; + }; + }; + } forEach _objTypes; +} forEach _items; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_CargoSave.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_CargoSave.sqf new file mode 100644 index 00000000..eddce2ff --- /dev/null +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_CargoSave.sqf @@ -0,0 +1,66 @@ +params [["_vehicle",objnull]]; +// may not be needed but should prevent in DB. +_wepsItemsCargo = weaponsItemsCargo _vehicle; +if (isNil "_wepsItemsCargo") then { + _wepsItemsCargo = []; +}; +_magsAmmoCargo = magazinesAmmoCargo _vehicle; +if (isNil "_magsAmmoCargo") then { + _magsAmmoCargo = []; +}; + +{ + _cargo = _x select 1; + _magsAmmoCargox = magazinesAmmoCargo _cargo; + { + _magsAmmoCargo pushback _x; + } foreach _magsAmmoCargox; + _wepsItemsCargox = weaponsItemsCargo _cargo; + { + _wepsItemsCargo pushback _x; + } foreach _wepsItemsCargox; +} foreach everycontainer _vehicle; + +// minimize magazine ammo cargo +_magsAmmoCargoMinimized = [[],[]]; +{ + // find cargo in temp var + _cargoIndex = _magsAmmoCargoMinimized find (_x select 0); + if (_cargoIndex >= 0) then { + (_magsAmmoCargoMinimized select 1) set [_cargoIndex, ((_magsAmmoCargoMinimized select 1) select _cargoIndex) + (_x select 1)]; // get count & add current + } + else { + (_magsAmmoCargoMinimized select 0) pushBack (_x select 0); // classname + (_magsAmmoCargoMinimized select 1) pushBack (_x select 1); // count + }; +} forEach _magsAmmoCargo; + +// convert and normalize +_wepsItemsCargoNormalized = []; +{ + _selectedWeaponComponents = _x; + _selectedWeapon = _selectedWeaponComponents deleteAt 0; + // find actual weapon components - todo this BIS call maybe slow + _weaponComponents = _selectedWeapon call BIS_fnc_weaponComponents; + // base weapon (without attachments) + _weapon = _weaponComponents deleteAt 0; + _newComponents = []; + { + // remove attachments that are already linked via config + if (_x isEqualType "" && {(tolower _x) in _weaponComponents}) then { + _newComponents pushBack ""; + //diag_log format ["DEBUG: suppressed saving of %1 for weapon %2 config %3", _x, [_selectedWeapon,_selectedWeaponComponents],[_weapon,_weaponComponents]]; + } else { + _newComponents pushBack _x; + }; + } forEach _selectedWeaponComponents; + _wepsItemsCargoNormalized pushBack ([_selectedWeapon] + _newComponents); +} forEach _wepsItemsCargo; + +_inventory = [ + _wepsItemsCargoNormalized, + _magsAmmoCargoMinimized, + getBackpackCargo _vehicle, + getItemCargo _vehicle +]; +_inventory diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_repairVehicle.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_repairVehicle.sqf index 92333f80..20162e3e 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_repairVehicle.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_repairVehicle.sqf @@ -12,6 +12,7 @@ Github: https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_repairVehicle.sqf */ +private ["_god"]; params ["_vehicle","_value","_player",["_token","",[""]]]; if (isNull _vehicle) exitWith{}; if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; @@ -19,11 +20,31 @@ if (_player distance _vehicle > 20) exitWith{}; if ((_value select 0) isEqualTo "ALL") then { _vehicle setDamage (_value select 1); -} else { +} +else { if (local _vehicle) then { - _vehicle setHitIndex _value; + _god = !(isDamageAllowed _vehicle); + if (_god) then { + _vehicle allowdamage true; + }; + { + if ((_x select 0) isequaltype 0) then { + _vehicle setHitIndex _x; + } + else { + _vehicle setHitPointDamage _x; + }; + } foreach _value; + if (_god) then { + _vehicle allowdamage false; + }; } else { [_vehicle, _value] remoteExec ['EPOCH_client_repairVehicle',_vehicle]; }; }; + +if !({_x > 0} count ((getAllHitPointsDamage _vehicle) select 2) > 0) then { + _vehicle setdamage 0; +}; + _vehicle call EPOCH_server_save_vehicle; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_storage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_storage.sqf index ee3ec7b3..e26df1ca 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_storage.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_storage.sqf @@ -28,72 +28,8 @@ if (!isNull _vehicle) then { _vehicle setDamage 0; _vehiclePos = getposATL _vehicle; - // may not be needed but should prevent in DB. - _wepsItemsCargo = weaponsItemsCargo _vehicle; - if (isNil "_wepsItemsCargo") then { - _wepsItemsCargo = []; - }; - _magsAmmoCargo = magazinesAmmoCargo _vehicle; - if (isNil "_magsAmmoCargo") then { - _magsAmmoCargo = []; - }; - - { - _cargo = _x select 1; - _magsAmmoCargox = magazinesAmmoCargo _cargo; - { - _magsAmmoCargo pushback _x; - } foreach _magsAmmoCargox; - - _wepsItemsCargox = weaponsItemsCargo _cargo; - { - _wepsItemsCargo pushback _x; - } foreach _wepsItemsCargox; - } foreach everycontainer _vehicle; - - // minimize magazine ammo cargo - _magsAmmoCargoMinimized = [[],[]]; - { - // find cargo in temp var - _cargoIndex = _magsAmmoCargoMinimized find (_x select 0); - if (_cargoIndex >= 0) then { - (_magsAmmoCargoMinimized select 1) set [_cargoIndex, ((_magsAmmoCargoMinimized select 1) select _cargoIndex) + (_x select 1)]; // get count & add current - } - else { - (_magsAmmoCargoMinimized select 0) pushBack (_x select 0); // classname - (_magsAmmoCargoMinimized select 1) pushBack (_x select 1); // count - }; - } forEach _magsAmmoCargo; - - // convert and normalize - _wepsItemsCargoNormalized = []; - { - _selectedWeaponComponents = _x; - _selectedWeapon = _selectedWeaponComponents deleteAt 0; - // find actual weapon components - todo this BIS call maybe slow - _weaponComponents = _selectedWeapon call BIS_fnc_weaponComponents; - // base weapon (without attachments) - _weapon = _weaponComponents deleteAt 0; - _newComponents = []; - { - // remove attachments that are already linked via config - if (_x isEqualType "" && {(tolower _x) in _weaponComponents}) then { - _newComponents pushBack ""; - //diag_log format ["DEBUG: suppressed saving of %1 for weapon %2 config %3", _x, [_selectedWeapon,_selectedWeaponComponents],[_weapon,_weaponComponents]]; - } else { - _newComponents pushBack _x; - }; - } forEach _selectedWeaponComponents; - _wepsItemsCargoNormalized pushBack ([_selectedWeapon] + _newComponents); - } forEach _wepsItemsCargo; - - _inventory = [ - _wepsItemsCargoNormalized, - _magsAmmoCargoMinimized, - getBackpackCargo _vehicle, - getItemCargo _vehicle - ]; - + _inventory = _vehicle call EPOCH_server_CargoSave; + _colorSlot = _vehicle getVariable ["STORAGE_TEXTURE",0]; _storageOwners = _vehicle getVariable["STORAGE_OWNERS",[]]; _locked = if (_vehicle getVariable["EPOCH_Locked", true]) then {1} else {-1}; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_vehicle.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_vehicle.sqf index 5f695dfb..9f00da39 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_vehicle.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_vehicle.sqf @@ -27,77 +27,11 @@ if (!isNull _vehicle) then { _hitpoints = (getAllHitPointsDamage _vehicle) param [2,[]]; - // may not be needed but should prevent in DB. - _wepsItemsCargo = weaponsItemsCargo _vehicle; - if (isNil "_wepsItemsCargo") then { - _wepsItemsCargo = []; - }; - _magsAmmoCargo = magazinesAmmoCargo _vehicle; - if (isNil "_magsAmmoCargo") then { - _magsAmmoCargo = []; - }; - - { - _cargo = _x select 1; - _magsAmmoCargox = magazinesAmmoCargo _cargo; - { - _magsAmmoCargo pushback _x; - } foreach _magsAmmoCargox; - _wepsItemsCargox = weaponsItemsCargo _cargo; - { - _wepsItemsCargo pushback _x; - } foreach _wepsItemsCargox; - } foreach everycontainer _vehicle; - - // minimize magazine ammo cargo - _magsAmmoCargoMinimized = [[],[]]; - { - // find cargo in temp var - _cargoIndex = _magsAmmoCargoMinimized find (_x select 0); - if (_cargoIndex >= 0) then { - (_magsAmmoCargoMinimized select 1) set [_cargoIndex, ((_magsAmmoCargoMinimized select 1) select _cargoIndex) + (_x select 1)]; // get count & add current - } - else { - (_magsAmmoCargoMinimized select 0) pushBack (_x select 0); // classname - (_magsAmmoCargoMinimized select 1) pushBack (_x select 1); // count - }; - } forEach _magsAmmoCargo; - - // convert and normalize - _startTime = diag_tickTime; - //diag_log format ["DEBUG: BIS_fnc_weaponComponents start %1", _startTime]; - _wepsItemsCargoNormalized = []; - { - _selectedWeaponComponents = _x; - _selectedWeapon = _selectedWeaponComponents deleteAt 0; - // find actual weapon components - todo this BIS call maybe slow - _weaponComponents = _selectedWeapon call BIS_fnc_weaponComponents; - //diag_log format ["DEBUG: BIS_fnc_weaponComponents end %1", diag_tickTime - _startTime]; - // base weapon (without attachments) - _weapon = _weaponComponents deleteAt 0; - _newComponents = []; - { - // remove attachments that are already linked via config - if (_x isEqualType "" && {(tolower _x) in _weaponComponents}) then { - _newComponents pushBack ""; - //diag_log format ["DEBUG: suppressed saving of %1 for weapon %2 config %3", _x, [_selectedWeapon,_selectedWeaponComponents],[_weapon,_weaponComponents]]; - } else { - _newComponents pushBack _x; - }; - } forEach _selectedWeaponComponents; - _wepsItemsCargoNormalized pushBack ([_selectedWeapon] + _newComponents); - } forEach _wepsItemsCargo; - // diag_log format ["DEBUG: convert and normalize end %1", diag_tickTime - _startTime]; - - _inventory = [ - _wepsItemsCargoNormalized, - _magsAmmoCargoMinimized, - getBackpackCargo _vehicle, - getItemCargo _vehicle - ]; + _inventory = _vehicle call EPOCH_server_CargoSave; + _colorSlot = _vehicle getVariable ["VEHICLE_TEXTURE",0]; - - _VAL = [typeOf _vehicle,[(getposATL _vehicle call EPOCH_precisionPos),vectordir _vehicle,vectorup _vehicle],damage _vehicle,_hitpoints,fuel _vehicle,_inventory,[true,magazinesAllTurrets _vehicle],_colorSlot]; + _baseType = _vehicle getVariable ["VEHICLE_BASECLASS",""]; + _VAL = [typeOf _vehicle,[(getposATL _vehicle call EPOCH_precisionPos),vectordir _vehicle,vectorup _vehicle],damage _vehicle,_hitpoints,fuel _vehicle,_inventory,[true,magazinesAllTurrets _vehicle],_colorSlot,_baseType]; ["Vehicle", _vehHiveKey, EPOCH_expiresVehicle, _VAL] call EPOCH_fnc_server_hiveSETEX; }; }; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_upgrade_vehicle.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_upgrade_vehicle.sqf new file mode 100644 index 00000000..95c86838 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_upgrade_vehicle.sqf @@ -0,0 +1,135 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: He-Man and DirtySanchez + + Description: + Upgrade vehicle + + Licence: + Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike +*/ + +private ["_slot","_pos","_dir","_cargo","_damage","_OldHitPoints","_typeVeh","_baseVeh","_color","_fuel","_newVeh","_checkclass","_cfgEpochVehicles","_availableColorsConfig","_colors","_textureSelectionIndex","_selections","_textures","_count","_newHitpoints","_idx","_dmg"]; +params [["_array",[]],["_player",objnull],["_token","",[""]]]; +if (_array isequalto []) exitwith { + diag_log "Array is empty"; +}; +if !([_player, _token] call EPOCH_server_getPToken) exitWith{ + diag_log "Tokencheck failed"; +}; +_array params [["_veh",objnull],["_UpgradeVeh",""],["_removeCrypto",[]]]; +if (isnull _veh) exitwith { + diag_log "Vehicle is null"; +}; +if (_UpgradeVeh isequalto "") exitwith { + diag_log "No Upgrade Vehicle Class"; +}; +if (!(_removeCrypto isequalto []) && !(_removeCrypto isEqualTo 0)) then { + [_player,-_removeCrypto] call EPOCH_server_effectCrypto; +}; +_slot = _veh getvariable ["vehicle_slot","-1"]; +if (_slot isequalto "-1") exitwith { + diag_log "Vehicle has no Slot"; +}; + +_pos = getposasl _veh; +_dir = getdir _veh; +_cargo = _veh call EPOCH_server_CargoSave; +_damage = damage _veh; +_OldHitPoints = getAllHitPointsDamage _veh; +_typeVeh = typeOf _veh; +_baseVeh = _veh getVariable ["VEHICLE_BASECLASS",_typeVeh]; +_color = _veh getVariable ["VEHICLE_TEXTURE",""]; +_fuel = fuel _veh; +deletevehicle _veh; +waituntil {isnull _veh}; +_pos set [2,(_pos select 2)+0.5]; +_newVeh = createVehicle [_UpgradeVeh, [random 500, random 500,500], [], 0, "CAN_COLLIDE"]; +_newVeh setVariable ["VEHICLE_SLOT", _slot, true]; +_newVeh setVariable ["VEHICLE_BASECLASS", _baseVeh]; +_newVeh call EPOCH_server_setVToken; +_newVeh call EPOCH_server_vehicleInit; +_newVeh setdir _dir; +_newVeh setposasl _pos; + +// set fuel level +_newVeh setFuel _fuel; + +// apply persistent textures +_checkclass = _typeVeh; +if !(_newVeh iskindof _typeVeh) then { + _checkclass = _UpgradeVeh; +}; +_cfgEpochVehicles = 'CfgEpochVehicles' call EPOCH_returnConfig; +_availableColorsConfig = (_cfgEpochVehicles >> _checkclass >> "availableColors"); +if (isArray(_availableColorsConfig)) then{ + _colors = getArray (_availableColorsConfig); + _textureSelectionIndex = (_cfgEpochVehicles >> _checkclass >> "textureSelectionIndex"); + _selections = if (isArray(_textureSelectionIndex)) then{ getArray(_textureSelectionIndex) } else { [0] }; + _textures = _colors select 0; + if (!(_newVeh iskindof _typeVeh) || _color isequalto "") then { + _color = floor(random(count _textures)); + }; + _count = (count _colors) - 1; + { + if (_count >= _forEachIndex) then{ + _textures = _colors select _forEachIndex; + }; + _newVeh setObjectTextureGlobal[_x, (_textures select _color)]; + } forEach _selections; + _newVeh setVariable["VEHICLE_TEXTURE", _color]; +}; + +// disable thermal imaging equipment +_newVeh disableTIEquipment true; + +// set damage and hitpoints +_newVeh setDamage _damage; +_newHitpoints = getAllHitPointsDamage _newVeh; +{ + _idx = (_newHitpoints select 0) find _x; + if (_idx > -1) then { + _dmg = _OldHitPoints select 2 select _foreachindex; + if (_x in ["HitFuel", "HitEngine"]) then { + _dmg = _dmg min 0.9; + }; + _newVeh setHitPointDamage [_x, _dmg]; + }; +} foreach (_OldHitPoints select 0); + +// new Dynamicsimulation +if(["CfgDynamicSimulation", "vehicleDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntryV2)then +{ + _newveh enableSimulationGlobal false; // turn it off until activated by dynamicSim + _newveh enableDynamicSimulation true; +}; + +// add back old inventory +clearWeaponCargoGlobal _newveh; +clearMagazineCargoGlobal _newveh; +clearBackpackCargoGlobal _newveh; +clearItemCargoGlobal _newveh; +[_newveh,_cargo] call EPOCH_server_CargoFill; + +// Remove forbidden Weapons and Ammo +_serverSettingsConfig = configFile >> "CfgEpochServer"; +_removeweapons = [_serverSettingsConfig, "removevehweapons", []] call EPOCH_fnc_returnConfigEntry; +_removemagazinesturret = [_serverSettingsConfig, "removevehmagazinesturret", []] call EPOCH_fnc_returnConfigEntry; +_disableVehicleTIE = [_serverSettingsConfig, "disableVehicleTIE", true] call EPOCH_fnc_returnConfigEntry; +if (_disableVehicleTIE) then { + _newVeh disableTIEquipment true; +}; +if !(_removeweapons isequalto []) then { + { + _newVeh removeWeaponGlobal _x; + } foreach _removeweapons; +}; +if !(_removemagazinesturret isequalto []) then { + { + _newVeh removeMagazinesTurret _x; + } foreach _removemagazinesturret; +}; + +// save new vehicle to db +_newveh call EPOCH_Server_Save_Vehicle; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicle.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicle.sqf index b2df6039..b28e4f43 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicle.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicle.sqf @@ -20,16 +20,30 @@ if !(isClass (configFile >> "CfgVehicles" >> _vehClass)) exitWith {objNull}; _serverSettingsConfig = configFile >> "CfgEpochServer"; _removeweapons = [_serverSettingsConfig, "removevehweapons", []] call EPOCH_fnc_returnConfigEntry; _removemagazinesturret = [_serverSettingsConfig, "removevehmagazinesturret", []] call EPOCH_fnc_returnConfigEntry; +_disableVehicleTIE = [_serverSettingsConfig, "disableVehicleTIE", true] call EPOCH_fnc_returnConfigEntry; _vehObj = createVehicle[_vehClass, _position, [], 0, _can_collide]; +// turn off BIS randomization +_vehObj setVariable ["BIS_enableRandomization", false]; if !(isNull _vehObj) then{ _vehObj call EPOCH_server_setVToken; + + // add random damage to vehicle (avoid setting engine or fuel to 100% damage to prevent instant destruction) + if (_spawnDamaged) then { + { + _maxDamage = if (_x in ["HitEngine","HitFuel","HitHull"]) then {0.8} else {1}; + _vehObj setHitIndex [_forEachIndex,((random 1 max 0.1) min _maxDamage)]; + } forEach ((getAllHitPointsDamage _vehObj) param [0,[]]); + }; + // make vehicle immune from further damage. + _vehObj allowDamage false; + // Set Direction and position if (_direction isEqualType []) then{ + _vehObj setposATL _position; _vehObj setVectorDirAndUp _direction; - _vehObj setposATL _position; } else { - _vehObj setdir _direction; _vehObj setposATL _position; + _vehObj setdir _direction; }; // Normalize vehicle inventory clearWeaponCargoGlobal _vehObj; @@ -49,7 +63,9 @@ if !(isNull _vehObj) then{ }; // Disable Termal Equipment - _vehObj disableTIEquipment true; + if (_disableVehicleTIE) then { + _vehObj disableTIEquipment true; + }; // Vehicle Lock _vehObj lock _locked; @@ -57,14 +73,6 @@ if !(isNull _vehObj) then{ // randomize fuel TODO push min max to config _vehObj setFuel ((random 1 max 0.1) min 0.9); - // add random damage to vehicles (avoid setting engine or fuel to 100% damage to prevent instant destruction) - if (_spawnDamaged) then { - { - _maxDamage = if (_x in ["HitEngine","HitFuel"]) then {0.9} else {1}; - _vehObj setHitIndex [_forEachIndex,random(_maxDamage)]; - } forEach ((getAllHitPointsDamage _vehObj) param [0,[]]); - }; - // get colors from config _cfgEpochVehicles = 'CfgEpochVehicles' call EPOCH_returnConfig; _availableColorsConfig = (_cfgEpochVehicles >> _vehClass >> "availableColors"); @@ -106,6 +114,14 @@ if !(isNull _vehObj) then{ ["VehicleLock", _vehLockHiveKey] call EPOCH_fnc_server_hiveDEL; }; + // new Dynamicsimulation + if(["CfgDynamicSimulation", "vehicleDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntryV2)then + { + _vehObj enableSimulationGlobal false; // turn it off until activated by dynamicSim + _vehObj enableDynamicSimulation true; + }; + + // SAVE VEHICLE _vehObj call EPOCH_server_save_vehicle; @@ -123,6 +139,9 @@ if !(isNull _vehObj) then{ // Add to A3 remains collector addToRemainsCollector[_vehObj]; + // make vehicle mortal again + _vehObj allowDamage true; + } else { diag_log format["DEBUG: Failed to create vehicle: %1", _this]; }; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicles.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicles.sqf index d16b7472..012206d9 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicles.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicles.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_vehicle/EPOCH_spawn_vehicles.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_allCitys","_allCitysDync","_allowedTypes","_cityPos","_collide","_direction","_find","_getRandomPos","_isShip","_limit","_marker","_nearBy","_newPosition","_position","_preferedPos","_range","_road","_roads","_selectedCity","_serverMapConfig","_slot","_spawnCount","_spawnPositionSize","_spawnPositionSizeDefaults","_vehClass","_vehCount","_vehObj"]; +private ["_tmppos","_check","_allCitys","_allCitysDync","_allowedTypes","_cityPos","_collide","_direction","_find","_getRandomPos","_isShip","_limit","_marker","_nearBy","_newPosition","_position","_preferedPos","_range","_road","_roads","_selectedCity","_serverMapConfig","_slot","_spawnCount","_spawnPositionSize","_spawnPositionSizeDefaults","_vehClass","_vehCount","_vehObj"]; //[[[end]]] params [["_allowedVehiclesList",[]] ]; @@ -91,10 +91,23 @@ for "_i" from 1 to _spawnCount do { _isShip = _vehClass isKindOf "Ship"; if (_isShip || (_vehClass isKindOf "Air")) then{ if (_isShip) then{ - _position = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 4000, 1] call BIS_fnc_findSafePos; - _position = [_position, 0, 100, 10, 2, 4000, 0] call BIS_fnc_findSafePos; + _position = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 0, 0, 4000, 1] call BIS_fnc_findSafePos; + _position = [_position, 0, 100, 10, 2, 4000, 0] call BIS_fnc_findSafePos; } else { - _position = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 1000, 0] call BIS_fnc_findSafePos; + _position = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 5000, 0] call BIS_fnc_findSafePos; + _tmppos = _position; + _check = []; + for "_i" from 1 to 10 do { // Check max 10 times for a Flat and Empty Position in Area + _check = _tmppos isFlatEmpty [5, -1, .4, 7, 0, false]; + if !((_check) isequalto []) exitwith { + _position = _tmppos; + }; + _tmppos = [_position, 0, 150, 10, 0, .3, 0] call BIS_fnc_findSafePos; + }; + if (_check isequalto []) then { // Suppress Vehicle Spawn on this position and try again next Restart + diag_log format ["Vehicle Spawn at %1 supressed - No good spot found",_position]; + _position = []; + }; }; } else { diff --git a/Sources/epoch_server/config.cpp b/Sources/epoch_server/config.cpp index 2c17b445..423b610e 100644 --- a/Sources/epoch_server/config.cpp +++ b/Sources/epoch_server/config.cpp @@ -9,7 +9,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = 0.1; - requiredAddons[] = {"A3_epoch_server_core","A3_epoch_config","A3_server_settings"}; + requiredAddons[] = {"A3_epoch_server_core","A3_epoch_config","A3_server_settings","A3_server_events"}; #include "build.hpp" }; }; @@ -27,6 +27,13 @@ class CfgServerFunctions class server_deleteGroup {}; class server_invitePlayer {}; }; + class epoch_grouptemp { + class server_upgradeTempGroup {}; + class server_updatePlayerTempGroup {}; + class server_createTempGroup {}; + class server_deleteTempGroup {}; + class server_invitePlayerTempGroup {}; + }; class epoch_bases { class swapBuilding {}; class saveBuilding {}; @@ -58,12 +65,15 @@ class CfgServerFunctions class server_onPlayerDisconnect {}; class server_deadPlayer {}; class server_revivePlayer {}; + class server_SetUnitLoadout {}; class server_storeCrypto {}; class server_equippedItem {}; class server_unpackBackpack {}; class server_deadPlayerDetonate{}; class server_playerSetVariable{}; class server_PayCrypto{}; + class fnc_updatePlayerStats{}; + class server_updatePlayerStats{}; }; class epoch_traders { class server_loadTraders {}; @@ -94,9 +104,11 @@ class CfgServerFunctions class server_packStorage {}; class server_packJack {}; class spawn_vehicle {}; + class server_upgrade_vehicle {}; + class server_CargoSave {}; + class server_CargoFill {}; }; class epoch_server { - class weightedArray {}; class precisionPos {}; class serverLootObject {}; class server_vehicleInit {}; @@ -105,11 +117,14 @@ class CfgServerFunctions class server_traderKilled {}; class localCleanup {}; class server_createTeleport {}; + class server_getRealTime {}; class server_teleportPlayer {}; class returnConfig {}; class serverCommand {}; class server_makeMarker {}; class server_removeMarker {}; + class server_createGlobalMarkerSet {}; + class server_deleteGlobalMarkerSet {}; }; class epoch_missions { class Server_createObject {}; @@ -129,7 +144,7 @@ class CfgServerFunctions }; class CfgServerVersion { - client = "0.5.0.0"; - config = "0.5.0.0"; - hive = "0.5.1.8"; + client = "1.0.0"; + config = "1.0.0"; + hive = "0.6.0.0"; }; diff --git a/Sources/epoch_server/init/server_init.sqf b/Sources/epoch_server/init/server_init.sqf index a51b1adf..060eeb0b 100644 --- a/Sources/epoch_server/init/server_init.sqf +++ b/Sources/epoch_server/init/server_init.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/init/server_init.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_ReservedSlots","_SideHQ1","_SideHQ2","_SideHQ3","_abortAndError","_allowedVehicleIndex","_allowedVehicleListName","_allowedVehiclesList","_allowedVehiclesListArray","_cfgServerVersion","_channelColor","_channelNumber","_channelTXT","_clientVersion","_config","_configSize","_configVersion","_date","_dateChanged","_epochConfig","_epochWorldPath","_existingStock","_hiveVersion","_index","_indexStock","_instanceID","_marker","_radio","_response","_sapper","_serverConfig","_serverSettingsConfig","_servicepoints","_startTime","_staticDateTime","_timeDifference","_vehicleCount","_vehicleSlotLimit","_worldSize"]; +private ["_ReservedSlots","_SideHQ1","_SideHQ2","_SideHQ3","_abortAndError","_allBunkers","_allowedVehicleIndex","_allowedVehicleListName","_allowedVehiclesList","_allowedVehiclesListArray","_animationStates","_blacklist","_bunkerCounter","_bunkerLocations","_bunkerLocationsKey","_cfgServerVersion","_channelColor","_channelNumber","_channelTXT","_clientVersion","_colCount","_config","_configSize","_configVersion","_customRadioactiveLocations","_date","_dateChanged","_debug","_debugLocation","_distance","_epochConfig","_epochWorldPath","_existingStock","_firstBunker","_hiveVersion","_index","_indexStock","_instanceID","_list","_loc1","_locName","_locPOS","_locSize","_location","_locations","_markers","_markertxt","_maxColumns","_maxRows","_memoryPoints","_modelInfo","_nearBLObj","_newBunkerCounter","_object","_originalLocation","_pOffset","_pos","_radio","_radioactiveLocations","_radioactiveLocationsTmp","_radius","_response","_rng","_rngChance","_rowCount","_sapper","_score","_scriptHiveKey","_seed","_selectedBunker","_serverConfig","_serverSettingsConfig","_servicepoints","_size","_startTime","_staticDateTime","_staticFuelSources","_timeDifference","_valuesAndWeights","_veh","_vehicleCount","_vehicleSlotLimit","_worldSize"]; //[[[end]]] _startTime = diag_tickTime; missionNamespace setVariable ['Epoch_ServerVersion', getText(configFile >> "CfgMods" >> "Epoch" >> "version"), true]; @@ -65,6 +65,28 @@ if (EPOCH_modCUPVehiclesEnabled) then { diag_log "Epoch: CUP Vehicles detected"; }; +// detect if Ryan's Zombies and Deamons mod is present +if (["CfgEpochClient", "ryanZombiesEnabled", true] call EPOCH_fnc_returnConfigEntryV2) then { + EPOCH_mod_Ryanzombies_Enabled = (parseNumber (getText (configFile >> "CfgPatches" >> "Ryanzombies" >> "version")) >= 4.5); + if (EPOCH_mod_Ryanzombies_Enabled) then { + diag_log "Epoch: Ryanzombies detected"; + missionNamespace setVariable ["EPOCH_mod_Ryanzombies_Enabled", true, true]; + }; +} else { + EPOCH_mod_Ryanzombies_Enabled = false; +}; + +// detect if Mad Arma is present +if (["CfgEpochClient", "madArmaEnabled", true] call EPOCH_fnc_returnConfigEntryV2) then { + EPOCH_mod_madArma_Enabled = (parseNumber (getText (configFile >> "CfgPatches" >> "bv_wheels" >> "version")) >= 2016); + if (EPOCH_mod_madArma_Enabled) then { + diag_log "Epoch: Mad Arma detected"; + missionNamespace setVariable ["EPOCH_mod_madArma_Enabled", true, true]; + }; +} else { + EPOCH_mod_madArma_Enabled = false; +}; + diag_log "Epoch: Init Variables"; call compile preprocessFileLineNumbers "\epoch_server\init\server_variables.sqf"; call compile preprocessFileLineNumbers "\epoch_server\init\server_securityfunctions.sqf"; @@ -163,7 +185,7 @@ diag_log "Epoch: Spawning vehicles"; _allowedVehiclesListArray = []; { _x params ["_vehClass","_velimit"]; - _vehicleCount = {typeOf _x == _vehClass} count vehicles; + _vehicleCount = {(_x getvariable ["VEHICLE_BaseClass",typeOf _x]) == _vehClass} count vehicles; // Load how many of this vehicle are in stock at any trader. _indexStock = EPOCH_traderStoredVehicles find _vehClass; @@ -197,7 +219,7 @@ if (_staticDateTime isEqualto []) then { _response = "epochserver" callExtension "510"; if (_response != "") then { diag_log format ["Epoch: Set Real Time: %1", _response]; - _date = call compile _response; + _date = parseSimpleArray _response; _date resize 5; _date set[0, (_date select 0) + 21]; _date set[3, (_date select 3) + _timeDifference]; @@ -224,15 +246,32 @@ if (_dateChanged) then { _config = 'CfgServicePoint' call EPOCH_returnConfig; _servicepoints = getArray (_config >> worldname >> 'ServicePoints'); { - _marker = createMarker [('ServicePointMarker'+(str _forEachIndex)), _x]; - _marker setmarkertype "mil_dot"; - _marker setmarkercolor 'ColorBlack'; - _marker setMarkerText ("Service Point"); - if !(surfaceiswater _x) then { - "Land_HelipadCircle_F" createvehicle _x; + _pos = _x; + _markertxt = "Service Point"; + if (count _x > 3) then { + _pos = _x select 0; + if ((_x select 3) isequaltype "") then { + _markertxt = _x select 3; + }; }; -} forEach _servicepoints; + if !(_markertxt isequalto "") then { + _markers = ["ServicePoint", _pos,_markertxt] call EPOCH_server_createGlobalMarkerSet; + if !(surfaceiswater _pos) then { + "Land_HelipadCircle_F" createvehicle _pos; + }; + }; +} forEach _ServicePoints; +// Remove Auto-Refuel from all maps + +if ([_serverSettingsConfig, "disableAutoRefuel", true] call EPOCH_fnc_returnConfigEntry) then { + // get all fuel source objects on the map (Note: this maybe slow consider refactor with another command) + _staticFuelSources = ((epoch_centerMarkerPosition nearObjects ['Building',EPOCH_dynamicVehicleArea]) select {getFuelCargo _x > 0}); + // globalize all fuel sources + missionNamespace setVariable ["EPOCH_staticFuelSources", _staticFuelSources, true]; + // disable fuel sources server side. (Note: might not be needed since we also need to do this client side) + {_x setFuelCargo 0;} foreach _staticFuelSources; +}; // set time multiplier setTimeMultiplier ([_serverSettingsConfig, "timeMultiplier", 1] call EPOCH_fnc_returnConfigEntry); @@ -240,6 +279,184 @@ setTimeMultiplier ([_serverSettingsConfig, "timeMultiplier", 1] call EPOCH_fnc_r // globalize tax rate missionNamespace setVariable ["EPOCH_taxRate", [_serverSettingsConfig, "taxRate", 0.1] call EPOCH_fnc_returnConfigEntry, true]; +// pick random radioactive locations +_radioactiveLocations = getArray(_epochConfig >> worldName >> "radioactiveLocations"); +_blacklist = getArray(_epochConfig >> worldName >> "radioactiveLocBLObjects"); +_distance = getNumber(_epochConfig >> worldName >> "radioactiveLocBLDistance"); +_radioactiveLocationsTmp = []; +if !(_radioactiveLocations isEqualTo []) then { + private _locations = nearestLocations[epoch_centerMarkerPosition, _radioactiveLocations, EPOCH_dynamicVehicleArea]; + if !(_locations isEqualTo []) then { + { + _locPOS = locationPosition _x; + _nearBLObj = nearestObjects [_locPOS, _blacklist, _distance]; + if!(_nearBLObj isEqualTo [])then{_locations = _locations - [_x]}; + }forEach _locations; + for "_i" from 0 to ((getNumber(_epochConfig >> worldName >> "radioactiveLocationsCount"))-1) do + { + if (_locations isEqualTo []) exitWith {}; + private _selectedLoc = selectRandom _locations; + _locations = _locations - [_selectedLoc]; + _locSize = size _selectedLoc; + _radius = sqrt((_locSize select 0)^2 + (_locSize select 1)^2); + _locName = (str(_selectedLoc)) splitString " "; + _radioactiveLocationsTmp pushBack [_locName,[random 666,_radius]]; + private _position = locationPosition _selectedLoc; + _markers = ["Radiation", _position] call EPOCH_server_createGlobalMarkerSet; + }; + }; + _customRadioactiveLocations = getArray(_epochConfig >> worldName >> "customRadioactiveLocations"); + if !(_customRadioactiveLocations isEqualTo []) then { + { + _x params [["_position",[0,0,0]],["_radius",0],["_className",""] ]; + if ((!(_position isEqualTo [0,0,0]) && !(_radius isEqualTo 0) && !(_className isEqualTo "")) && ((nearestObjects [_position, _blacklist, _distance]) isEqualTo [])) then{ + _object = (_x select 2) createVehicle _position; + _object setVariable ["EPOCH_Rads",[random 666,(_x select 1)],true]; + _markers = ["Radiation", _position] call EPOCH_server_createGlobalMarkerSet; + _object setVariable ["EPOCH_MarkerSet",_markers,true]; + }else{ + diag_log "EPOCHDebug:Check your custom radioactive locations for errors or blacklisted locations"; + }; + }forEach _customRadioactiveLocations; + }; +}; +missionNamespace setVariable ["EPOCH_radioactiveLocations", _radioactiveLocationsTmp, true]; + +// spawn bunkers, just in VR for now. +if (worldName == "VR") then { + _debug = true; + _debugLocation = getMarkerPos "respawn_west"; + _memoryPoints = ["one","two","three","four"]; + _bunkerCounter = 0; + _newBunkerCounter = 0; + + // size + _maxRows = 30; + _maxColumns = 30; + + _rngChance = 0; // Lower this to spawn more positions + _scriptHiveKey = "EPOCH:DynamicBunker"; // do not change + + _bunkerLocationsKey = format ["%1:%2", _instanceID, worldname]; // change instance id to force a new map to be generated. + _response = [_scriptHiveKey, _bunkerLocationsKey] call EPOCH_fnc_server_hiveGETRANGE; + _response params [["_status",0],["_data",[]] ]; + + _firstBunker = objNull; + _bunkerLocations = []; + + // check for proper return and data type + if (_status == 1 && _data isEqualType [] && !(_data isEqualTo [])) then { + _bunkerLocations = _data; + + // spawn cached bunkers + { + if (_x isEqualType [] && !(_x isEqualTo [])) then { + _x params ["_selectedBunker", "_posWorld", ["_memoryPointsStatus",[]] ]; + _object = createSimpleObject [_selectedBunker, _posWorld]; + if (isNull _firstBunker) then {_firstBunker = _object;}; + { + _object animate [_x,(_memoryPointsStatus param [_forEachIndex,1]),true]; + } forEach _memoryPoints; + _bunkerCounter = _bunkerCounter + 1; + }; + } forEach _bunkerLocations; + + } else { + + // generate new bunker + _size = 13.08; + + _allBunkers = []; + _newBunkerCounter = 0; + // Generate Seed + _seed = random 999999; + diag_log format["Generating bunker with seed: %1",_seed]; + _location = _debugLocation; + _originalLocation = +_location; + _valuesAndWeights = [ + "bunker_epoch", 0.2, // empty bunker + "bunker_epoch_01", 0.1, // tall concrete maze 1 + "bunker_epoch_02", 0.05, // Epoch Corp storage + // "bunker_epoch_03", 0.01, // save for xmas + "bunker_epoch_04", 0.05, // generator room + // "bunker_epoch_05", 0.01, // invisible walls + "bunker_epoch_06", 0.05, // jail + "bunker_epoch_07", 0.05, // clone chamber + "bunker_epoch_08", 0.01, // epoch celebration room + "bunker_epoch_09", 0.05, // tallest concrete walls + "bunker_epoch_10", 0.05, // knee high concrete walls + "bunker_epoch_11", 0.1, // sewer + "bunker_epoch_12", 0.05, // concrete mid wall + "bunker_epoch_13", 0.05, // tall concrete maze 2 + "bunker_epoch_14", 0.08, // odd concrete walls + "bunker_epoch_15", 0.05 // concrete mid wall maze + ]; + _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 = selectRandomWeighted _valuesAndWeights; + _object = createVehicle [_selectedBunker, _location, [], 0, "CAN_COLLIDE"]; + if (isNull _firstBunker) then {_firstBunker = _object;}; + _allBunkers pushBack _object; + _newBunkerCounter = _newBunkerCounter + 1; + }; + _location set [0,(_location select 0) + _size]; + _rowCount = _rowCount + 1; + if (_rowCount >= _maxRows) then { + _rngChance = 0.3; + _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 = _loc1 nearObjects ["bunker_epoch", 1]; + if !(_list isEqualTo []) then { + _score = _score + 1; + _animationStates pushBack 0; + _veh animate [_x,0]; + } else { + _animationStates pushBack 1; + _veh animate [_x,1]; + }; + }; + } forEach _memoryPoints; + _modelInfo = getModelInfo _veh; + _bunkerLocations pushBack [_modelInfo select 1, getPosWorld _veh, _animationStates, _score]; + } forEach _allBunkers; + + // save to DB + [_scriptHiveKey, _bunkerLocationsKey, _bunkerLocations] call EPOCH_fnc_server_hiveSET; + }; + + // move respawn point into first bunker. + if (!(isNull _firstBunker) && {_firstBunker distance _debugLocation > 1}) then { + deleteMarker "respawn_west"; + createMarker ["respawn_west", getposATL _firstBunker]; + }; + + 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]; + }; + }; +}; + + + // start accepting logins missionNamespace setVariable ["EPOCH_SERVER_READY", true, true]; diff --git a/Sources/epoch_server/init/server_securityfunctions.sqf b/Sources/epoch_server/init/server_securityfunctions.sqf index 1bb3f193..9f5e02da 100644 --- a/Sources/epoch_server/init/server_securityfunctions.sqf +++ b/Sources/epoch_server/init/server_securityfunctions.sqf @@ -12,7 +12,7 @@ Github: https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/init/server_securityfunctions.sqf */ -private ["_code","_functionName","_remoteExecClientStr","_onLoad","_onUnload","_skn_blockedSpawnMenuUID","_temp","_skn_adminMenuOwner","_case","_skn_adminMenuHigh","_skn_adminMenuLow","_config","_debugClass","_cfg_systemDebug","_skn_systemDebug1","_skn_systemDebug2","_skn_systemDebug3","_skn_systemDebug4","_skn_systemDebug5","_cfg_remoteExecClient","_remoteExecClient_NAMES","_cfg_limits","_skn_playerCryptoLimit","_cfg_learning","_skn_trustedUsers","_str_learningModeCheck","_cfg_quality","_skn_perfMode","_skn_viewDistance","_skn_viewDistanceObects","_skn_terrainGrid","_cfg_blacklistConfig","_skn_badDisplaysArray","_skn_badAnimations","_cfg_variablesConfig","_skn_badVarCheckArray","_skn_nilVarCheckArray","_skn_commandMenuArray","_skn_addEHConfig","_skn_displayAddEHChecks","_skn_addEHArray","_serverSettingsConfig","_skn_enableAntihack","_skn_check_addons","_checkFiles","_skn_check_files","_whitelistPatches","_skn_whitelist_cfgPatches","_skn_adminsOwner","_skn_adminsHigh","_skn_adminsLow","_banReasons","_skn_banReason","_antihack_banDuration","_epoch_banReasons","_kickReasons","_epoch_kickReason","_epoch_kickReasons","_ownerSettings","_skn_adminMenuOwnerSetting","_adminSettings","_skn_adminMenuHighSetting","_lowSettings","_skn_adminMenuLowSetting","_skn_adminMenuMenuKey","_skn_adminMenuInfrontTeleport","_skn_adminMenuBanReasons","_skn_adminMenuCryproCfg","_skn_cfgPatchesCfg","_skn_PVSPrefix","_rndVAR_Count","_skn_rndVA","_skn_PVC_INDEX","_skn_AH_rndVarVehicle","_skn_AH_rndVarPlayer","_skn_AH_rndVarAHInitCheck","_skn_AH_Init","_skn_AH_Code","_skn_AH_Code_CA","_skn_AH_Code_CB","_skn_AH_Ban","_skn_AH_rndVar","_skn_doKickBan","_skn_server_getRealTime","_skn_pv_hackerLog","_skn_pv_adminLog","_skn_server_adminLog","_skn_doAdminRequest","_skn_doAdminLog","_skn_doTokenAuth","_skn_antiTeleportPVC","_skn_Admin_Code","_skn_Admin_Init","_skn_adminRequest_PVC","_skn_adminLog_PVC","_skn_adminLog","_skn_AdminKeyDown","_skn_AdminMenu_Init","_skn_getCtrl","_skn_fnc_Spec","_skn_Update_AdminButtons","_skn_mainMenuCfg","_skn_FillMainMenu","_skn_FillPlayerMenu","_skn_switchMainMenu","_skn_dbClickMainMenu","_skn_spawnMenu","_skn_spawnSpawnMenu","_skn_removespawnMenu","_skn_fillSpawnMenu","_skn_hackerLog","_skn_switchTable","_skn_customBanreason","_skn_flipVehicle","_skn_freeCam","_skn_delete","_skn_deleteMenu","_skn_deleteNow","_skn_doBan","_skn_mapTeleport","_skn_old_esp","_skn_hideAdmin","_skn_old_espMap","_skn_infrontTP","_skn_esp","_skn_godMode","_skn_repairVehicle","_skn_spawnLoot","_skn_mapLootArray","_skn_tg_Spec","_skn_tg_sortOrder","_skn_tg_toggle","_skn_tg_BanPlayer","_skn_tg_delete","_skn_tg_mapTeleport","_skn_tg_spawnTyp","_skn_tg_limitSpawn","_skn_tg_old_espMap","_skn_tg_old_esp","_skn_tg_hideAdmin","_skn_tg_infrontTP","_skn_tg_godMode","_skn_tg_map_player","_skn_tg_map_corpse","_skn_tg_map_loot","_skn_tg_map_vehicle","_skn_tg_map_ai","_skn_tg_map_basebuilding","_skn_t1","_skn_t2","_skn_t3","_skn_t4","_skn_t5","_skn_AH_rndVarAHInitCheckToken","_stringInArray","_displaysArray","_displays","_cfg_displayArray","_skn_adminUIDArray","_skn_adminNAMEArray","_skn_tempuid","_skn_spawnPointCenter","_centerDistance","_sknBanANDSleep","_sknBanANDSleepQuick","_sknPatches","_skn_addonCheckCode","_skn_fileCheckCode","_sknAddActionCheck","_skn_code_ban","_skn_code_init","_skn_code_antihack","_skn_admincode","_skn_admininit"]; +private ["_code","_functionName","_remoteExecClientStr","_onLoad","_onUnload","_skn_blockedSpawnMenuUID","_temp","_skn_adminMenuOwner","_case","_skn_adminMenuHigh","_skn_adminMenuLow","_config","_debugClass","_cfg_systemDebug","_skn_systemDebug1","_skn_systemDebug2","_skn_systemDebug3","_skn_systemDebug4","_skn_systemDebug5","_cfg_remoteExecClient","_remoteExecClient_NAMES","_cfg_limits","_skn_playerCryptoLimit","_cfg_learning","_skn_trustedUsers","_str_learningModeCheck","_cfg_quality","_skn_perfMode","_skn_viewDistance","_skn_viewDistanceObects","_skn_terrainGrid","_cfg_blacklistConfig","_skn_badDisplaysArray","_skn_badAnimations","_cfg_variablesConfig","_skn_badVarCheckArray","_skn_nilVarCheckArray","_skn_commandMenuArray","_skn_addEHConfig","_skn_displayAddEHChecks","_skn_addEHArray","_serverSettingsConfig","_skn_enableAntihack","_skn_check_addons","_checkFiles","_skn_check_files","_skn_whitelist_cfgPatches","_skn_adminsOwner","_skn_adminsHigh","_skn_adminsLow","_banReasons","_skn_banReason","_antihack_banDuration","_epoch_banReasons","_kickReasons","_epoch_kickReason","_epoch_kickReasons","_ownerSettings","_skn_adminMenuOwnerSetting","_adminSettings","_skn_adminMenuHighSetting","_lowSettings","_skn_adminMenuLowSetting","_skn_adminMenuMenuKey","_skn_adminMenuInfrontTeleport","_skn_adminMenuBanReasons","_skn_adminMenuCryproCfg","_skn_cfgPatchesCfg","_skn_PVSPrefix","_rndVAR_Count","_skn_rndVA","_skn_PVC_INDEX","_skn_AH_rndVarVehicle","_skn_AH_rndVarPlayer","_skn_AH_rndVarAHInitCheck","_skn_AH_Init","_skn_AH_Code","_skn_AH_Code_CA","_skn_AH_Code_CB","_skn_AH_Ban","_skn_AH_rndVar","_skn_doKickBan","_skn_pv_hackerLog","_skn_pv_adminLog","_skn_server_adminLog","_skn_doAdminRequest","_skn_doAdminLog","_skn_doTokenAuth","_skn_antiTeleportPVC","_skn_Admin_Code","_skn_Admin_Init","_skn_adminRequest_PVC","_skn_adminLog_PVC","_skn_adminLog","_skn_AdminKeyDown","_skn_AdminMenu_Init","_skn_getCtrl","_skn_fnc_Spec","_skn_Update_AdminButtons","_skn_mainMenuCfg","_skn_FillMainMenu","_skn_FillPlayerMenu","_skn_switchMainMenu","_skn_dbClickMainMenu","_skn_spawnMenu","_skn_spawnSpawnMenu","_skn_removespawnMenu","_skn_fillSpawnMenu","_skn_hackerLog","_skn_switchTable","_skn_customBanreason","_skn_flipVehicle","_skn_freeCam","_skn_delete","_skn_deleteMenu","_skn_deleteNow","_skn_doBan","_skn_mapTeleport","_skn_old_esp","_skn_hideAdmin","_skn_old_espMap","_skn_infrontTP","_skn_esp","_skn_godMode","_skn_repairVehicle","_skn_spawnLoot","_skn_mapLootArray","_skn_mapAnimalArray","_skn_mapAIArray","_skn_mapBasesArray","_skn_tg_Spec","_skn_tg_sortOrder","_skn_tg_toggle","_skn_tg_BanPlayer","_skn_tg_delete","_skn_tg_mapTeleport","_skn_tg_spawnTyp","_skn_tg_limitSpawn","_skn_tg_old_espMap","_skn_tg_old_esp","_skn_tg_hideAdmin","_skn_tg_infrontTP","_skn_tg_godMode","_skn_tg_map_player","_skn_tg_map_corpse","_skn_tg_map_loot","_skn_tg_map_animals","_skn_tg_map_vehicle","_skn_tg_map_ai","_skn_tg_map_trader","_skn_tg_map_basebuilding","_skn_t1","_skn_t2","_skn_t3","_skn_t4","_skn_t5","_skn_AH_rndVarAHInitCheckToken","_stringInArray","_displaysArray","_displays","_cfg_displayArray","_skn_adminUIDArray","_skn_adminNAMEArray","_skn_tempuid","_skn_spawnPointCenter","_centerDistance","_sknBanANDSleep","_sknBanANDSleepQuick","_sknPatches","_skn_addonCheckCode","_skn_fileCheckCode","_sknAddActionCheck","_skn_code_ban","_skn_code_init","_skn_code_antihack","_skn_admincode","_skn_admininit","_configs"]; _config = (configFile >> "CfgSecConf"); if (isClass _config) then {diag_log "Loading config..."}; @@ -47,7 +47,7 @@ _skn_badDisplaysArray = [_cfg_blacklistConfig, "badDisplays", [-1337,17,19,30,32 _skn_badAnimations = [_cfg_blacklistConfig, "animations", ['AmovPercMstpSnonWnonDnon_exerciseKata','AmovPercMstpSnonWnonDnon_exercisePushup','GestureSpasm1','GestureSpasm4','GestureNod']] call EPOCH_fnc_returnConfigEntry; _cfg_variablesConfig = (_config >> "variables"); -_skn_badVarCheckArray = [_cfg_variablesConfig, "badVars", ['ESP_map','ESP_mainMap','ESP_adminMap','AntiAntiAntiAntiHax','fnc_usec_damageHandler','fnc_usec_unconscious','VAGINA_secret','yolo','VERSION','life_fnc_handleDamage','EPOCH_spawnVehicle_PVS','CLASS911_Menu','nuke_vars','JJMMEE_INIT_MENU','PLAYERON','PLAYERNEXT2','ALTISLIFEON','LY_Menu','PLAY','LY_SwaggerLikeUs','BIS_fnc_dbg_reminder_value','BIS_fnc_dbg_reminder']] call EPOCH_fnc_returnConfigEntry; +_skn_badVarCheckArray = [_cfg_variablesConfig, "badVars", ['EPOCH_GMODE','ESP_map','ESP_mainMap','ESP_adminMap','AntiAntiAntiAntiHax','fnc_usec_damageHandler','fnc_usec_unconscious','VAGINA_secret','yolo','VERSION','life_fnc_handleDamage','EPOCH_spawnVehicle_PVS','CLASS911_Menu','nuke_vars','JJMMEE_INIT_MENU','PLAYERON','PLAYERNEXT2','ALTISLIFEON','LY_Menu','PLAY','LY_SwaggerLikeUs','BIS_fnc_dbg_reminder_value','BIS_fnc_dbg_reminder']] call EPOCH_fnc_returnConfigEntry; _skn_nilVarCheckArray = [_cfg_variablesConfig, "nilVars", ['EPOCH_antiWallCount','EPOCH_playerEnergy','EPOCH_playerHunger','EPOCH_playerStamina','EPOCH_playerCrypto','EPOCH_target','EPOCH_ESP_TARGETS','EPOCH_ESPMAP_TARGETS','EPOCH_taxRate','EPOCH_ESP_VEHICLEPLAYER','EPOCH_ESP_PLAYER','EPOCH_ESP_VEHICLES']] call EPOCH_fnc_returnConfigEntry; _skn_commandMenuArray = [(_config >> "commandMenu"), "menus",['','RscSelectTeam','RscTeam','RscMoveHigh','#GETIN','#RscStatus','#WATCH0','RscCombatMode','RscMenuReply','RscCallSupport','#CUSTOM_RADIO','#User:BIS_fnc_addCommMenuItem_menu','RscRadio','RscReply','#ACTION','RscMenuFormations','#WATCH','RscGroupRootMenu','RscMainMenu','RscMenuMove','RscWatchDir','RscWatchMoveDir','#User:BIS_Menu_GroupCommunication','RscMenuStatus','RscFormations']] call EPOCH_fnc_returnConfigEntry; @@ -66,14 +66,12 @@ _skn_check_addons = [_serverSettingsConfig, "antihack_cfgPatchesCheck", true] ca _checkFiles = [ ["epoch_code\compile\setup\EPOCH_clientInit.sqf", "EPOCH_clientInit"], ["epoch_code\compile\EPOCH_onEachFrame.sqf", "EPOCH_onEachFrame"], - ["epoch_code\compile\setup\EPOCH_masterLoop.sqf", "EPOCH_masterLoop"], ["epoch_code\compile\setup\EPOCH_client_rejectPlayer.sqf", "EPOCH_client_rejectPlayer"], - ["epoch_code\compile\setup\EPOCH_clientRespawn.sqf", "EPOCH_clientRespawn"], - ["epoch_code\compile\interface_event_handlers\EPOCH_KeyDown.sqf", "EPOCH_KeyDown"] + ["epoch_code\compile\setup\EPOCH_clientRespawn.sqf", "EPOCH_clientRespawn"] ]; -_skn_check_files = [_serverSettingsConfig, "antihack_checkFiles", _checkFiles] call EPOCH_fnc_returnConfigEntry; -_whitelistPatches = ["A3Data","A3_BaseConfig_F","A3_Dubbing_Radio_F","A3_Functions_F","A3_Functions_F_EPA","A3_Functions_F_EPC","A3_Language_F_MP_Mark","A3_LanguageMissions_F_MP_Mark","Map_VR","A3_Map_VR_Scenes","CUP_A10_Data","CUP_Afghan_Data","CUP_Air2_Data","CUP_Air3_Data","CUP_Air_Data","CUP_Air_d_baf_Data","CUP_Air_e_Data","CUP_Air_pmc_Data","CUP_CA_animals2","CA_animals2","CUP_Animations_Data","CUP_Animations_Config","CUP_Bohemia_Data","CUP_Bootcamp_acr_Data","CUP_Buildings2_Data","CUP_Buildings2_Ind_Cementworks_Data","CUP_Buildings_Data","CUP_Ca_acr_Data","CUP_CA_Config","CAData","CUP_Ca_e_Data","CUP_Ca_pmc_Data","CUP_Characters2_Data","CUP_Chernarus_Data","CUP_Chernarus_Summer_Data","CUP_Cti_buildings_Data","CUP_CA_Data","CUP_CAData_ParticleEffects","CAData_ParticleEffects","CUP_Data_baf_Data","CUP_dbe1_data","CUP_Desert2_Data","CUP_Desert2_Objects","Desert2_Objects","CUP_Desert_Data","CUP_Desert_e_Data","CUP_Hotfix_Data","CUP_L39_Data","CUP_CALanguage","CALanguage","CUP_CALanguage_ACR","CALanguage_ACR","CUP_CALanguage_missions","CALanguage_missions","CUP_CALanguage_missions_e","CALanguage_missions_e","CUP_Misc3_Data","CUP_CAMisc","CUP_Misc_Data","CAMisc","CUP_Misc_acr_Data","CUP_Misc_e_Data","CUP_CA_MPA","CA_MPA","CUP_CA_Plants2_Clutter","CA_Plants2_Clutter","CUP_CAPlants","CAPlants","CUP_CA_Plants_E_Clutter","CA_Plants_E_Clutter","CUP_Provinggrounds_pmc_Data","CUP_CARoads2","CARoads2","CUP_CARoads2Dam","CARoads2Dam","CUP_CARoads","CARoads","CUP_CARoads_E","CARoads_E","CUP_CARoads_PMC","CARoads_PMC","CUP_CARocks2","CARocks2","CUP_CARocks","CARocks","CUP_CARocks_E","CARocks_E","CUP_Sara_Data","CUP_Saralite_Data","CUP_Shapur_baf_Data","CUP_CASigns","CASigns","CUP_CASigns_E","CASigns_E","CUP_Sounds_Data","CUP_Sounds_Config","CASounds","CUP_Sounds_e_Data","CUP_Structures_Data","CUP_pond_test","pond_test","CUP_Structures_e_Data","CUP_Structures_pmc_Data","CUP_Takistan_Data","CUP_Tracked2_Data","CUP_Tracked_Data","CUP_Tracked_e_Data","CUP_CAFonts","CAFonts","CUP_Utes_Data","CUP_Water2_Data","CUP_Water_Data","CUP_Weapons2_Data","CUP_Weapons_Data","CUP_Weapons_e_Data","CUP_Weapons_pmc_Data","CUP_Wheeled2_Data","CUP_Wheeled_Data","CUP_Wheeled_e_Data","CUP_Zargabad_Data","CUP_A1AlwaysDummy","CAVideo2_PMC","CA_AnimsHotfix","CA_CutSceneAnims","CAIntroAnims","CAUSMCD","CAVoice","CAweapons3_aks74pso","CAWeapons3_ammocrates","CAweapons3_ksvk","CAweapons3_m107","CAweapons3_m16a4_acg_gl","CAweapons3_m16a4_acg","CAweapons3_m16a4_gl","CAweapons3_m16a4","CAWeapons3","CTI_buildingsBmp2_hq","CTI_buildingsM113_hq","DSHkM_Mini","M2HD_Mini","MK19_Tripod","Warfare","WarfareBuildings_Stinger_Twice_static","WarfareBuildings_T72_RACS","WarfareBuildings_TOW_Tripod","CUP_AiA_compat","AiA_A1AlwaysDummy","AiA_Afghan_Config","AiA_Afghan_Data","AiA_BaseConfig_F","AiA_Bohemia_Config","AiA_Bohemia_Data","AiA_Bootcamp_acr_Config","AiA_Bootcamp_acr_Data","AiA_Buildings_Config","AiA_Buildings_Data","AiA_Buildings2_Config","AiA_Buildings2_Data","AiA_Buildings2_Ind_Cementworks_Config","AiA_Buildings2_Ind_Cementworks_Data","AiA_Ca_acr_Config","AiA_Ca_acr_Data","AiA_CA_Config","AiA_CA_Config_Data_ParticleEffects","AiA_CA_Data","AiA_Ca_e_Config","AiA_Ca_e_Data","AiA_Ca_pmc_Config","AiA_Ca_pmc_Data","AiA_CBA_A2_xeh_Dummy","AiA_CBA_OA_xeh_Dummy","AiA_cba_xeh_a2_Dummy","AiA_cba_xeh_oa_Dummy","AiA_Chernarus_Config","AiA_Chernarus_Data","AiA_Chernarus_Summer_Config","AiA_Chernarus_Summer_Data","AiA_Core","AiA_Cti_buildings_Config","AiA_Cti_buildings_Data","AiA_Data_baf_Config","AiA_Data_baf_Data","AiA_Desert_Config","AiA_Desert_Data","AiA_Desert_e_Config","AiA_Desert_e_Data","AiA_Desert2_Config","AiA_Desert2_Data","AiA_Hotfix_Config","AiA_Hotfix_Data","AiA_Language_acr_Config","AiA_Language_acr_Data","AiA_Language_baf_Config","AiA_Language_baf_Data","AiA_Language_e_Config","AiA_Language_e_Data","AiA_Language_pmc_Config","AiA_Language_pmc_Data","AiA_Languagemissions_acr_Config","AiA_Languagemissions_acr_Data","AiA_Languagemissions_baf_Config","AiA_Languagemissions_baf_Data","AiA_Languagemissions_pmc_Config","AiA_Languagemissions_pmc_Data","AiA_Misc_acr_Config","AiA_Misc_acr_Data","AiA_Misc_Config","AiA_Misc_Data","AiA_Misc_e_Config","AiA_Misc_e_Data","AiA_Misc2_Config","AiA_Misc2_Data","AiA_Misc3_Config","AiA_Misc3_Data","AiA_Models_DBE1_Config","AiA_Models_DBE1_Data","AiA_Plants_Config","AiA_Plants_Data","AiA_Plants_e_Config","AiA_Plants_e_Data","AiA_Plants_e2_Config","AiA_Plants_e2_Data","AiA_Plants_pmc_Config","AiA_Plants_pmc_Data","AiA_Plants2_Bush_Config","AiA_Plants2_Bush_Data","AiA_Plants2_Clutter_Config","AiA_Plants2_Clutter_Data","AiA_Plants2_Misc_Config","AiA_Plants2_Misc_Data","AiA_Plants2_Plant_Config","AiA_Plants2_Plant_Data","AiA_Plants2_Tree_Config","AiA_Plants2_Tree_Data","AiA_Provinggrounds_pmc_Config","AiA_Provinggrounds_pmc_Data","AiA_Roads_Config","AiA_Roads_Data","AiA_Roads_e_Config","AiA_Roads_e_Data","AiA_Roads_pmc_Config","AiA_Roads_pmc_Data","AiA_Roads2_Config","AiA_Roads2_Data","AiA_Rocks_Config","AiA_Rocks_Data","AiA_Rocks_e_Config","AiA_Rocks_e_Data","AiA_Rocks2_Config","AiA_Rocks2_Data","AiA_Sara_Config","AiA_Sara_Data","AiA_Sara_dbe1_Config","AiA_Sara_dbe1_Data","AiA_Saralite_Config","AiA_Saralite_Data","AiA_Shapur_baf_Config","AiA_Shapur_baf_Data","AiA_Signs_Config","AiA_Signs_Data","AiA_Signs_e_Config","AiA_Signs_e_Data","AiA_Signs2_Config","AiA_Signs2_Data","AiA_Sounds_Config","AiA_Sounds_Data","AiA_StandaloneTerrainPack_Core","AiA_StandaloneTerrains_Core","AiA_Structures_Config","AiA_Structures_Data","AiA_Structures_e_Config","AiA_Structures_e_Data","AiA_Structures_pmc_Config","AiA_Structures_pmc_Data","AiA_Takistan_Config","AiA_Takistan_Data","AiA_Ui_Config","AiA_Ui_Data","AiA_Utes_Config","AiA_Utes_Data","AiA_Water_Config","AiA_Water_Data","AiA_Water2_Config","AiA_Water2_Data","AiA_Weapons_Config","AiA_Weapons_Data","AiA_Weapons_e_Config","AiA_Weapons_e_Data","AiA_Weapons_pmc_Config","AiA_Weapons_pmc_Data","AiA_Weapons2_Config","AiA_Weapons2_Data","AiA_Wheeled_Config","AiA_Wheeled_Data","AiA_Wheeled_e_Config","AiA_Wheeled_e_Data","AiA_Wheeled2_Config","AiA_Wheeled2_Data","AiA_Worlds","AiA_Worlds_Ambient","AiA_Worlds_Author","AiA_Worlds_Clutter","AiA_Worlds_ClutterDist","AiA_Worlds_Delete","AiA_Worlds_DisableInfiniteTerrain","AiA_Worlds_DustEffects","AiA_Worlds_EnvSounds","AiA_Worlds_FullDetailDist","AiA_Worlds_Grid","AiA_Worlds_Intros","AiA_Worlds_Lighting","AiA_Worlds_Lighting_Chernarus","AiA_Worlds_Lighting_Desert","AiA_Worlds_MapSize","AiA_Worlds_MidDetailTexture","AiA_Worlds_NoDetailDist","AiA_Worlds_Seabed","AiA_Worlds_SkyTexture","AiA_Worlds_StreetLamp","AiA_Worlds_Surfaces","AiA_Worlds_Water","AiA_Zargabad_Config","AiA_Zargabad_Data","CUP_StandaloneTerrains_Dummy","CA_ACR","CA_Animals2_Anim_Config","CA_Anims_Char","CA_Anims_E_Wmn","CA_E","CA_PMC","CAAir","CACharacters","CATracked","CAWater","CAWater2","CAWater2_seafox","CAWeapons","CAWeapons_Warfare_weapons","CAWheeled","CAWheeled_E","CAWheeled2","6G30_DBE1","Arma2_Ka52","BI_SRRS","CA_AH64D","CA_AIR_E_MQ9PredatorB","CA_AIR_E_Su25","CA_AIR2_Su25","CA_Animals_E","CA_Animals2_Chicken","CA_Animals2_Cow","CA_Animals2_Dogs","CA_Animals2_Dogs_Fin","CA_Animals2_Dogs_Pastor","CA_Animals2_Goat","CA_Animals2_Rabbit","CA_Animals2_Sheep","CA_Animals2_WildBoar","CA_Anims","CA_Anims_E","CA_Anims_E_Sdr","CA_Anims_Sdr","CA_Anims_Wmn","CA_CommunityConfigurationProject_E","CA_CruiseMissile","CA_Dubbing","CA_Dubbing_Baf","CA_Dubbing_Counterattack","CA_Dubbing_E","CA_Dubbing_PMC","CA_DubbingRadio_E","CA_DubbingRadio_PMC","CA_E_ParticleEffects","CA_Editor","CA_HC_Sounds","CA_Heads","CA_HighCommand","CA_L39","CA_Missions","CA_Missions_AlternativeInjurySimulation","CA_Missions_AmbientCombat","CA_Missions_Armory1","CA_Missions_Armory2","CA_Missions_BAF","CA_Missions_BAF_2","CA_Missions_BAF_Templates_SecOps","CA_Missions_BattlefieldClearance","CA_Missions_E","CA_Missions_E_Armory2","CA_Missions_E_SecOps","CA_Missions_E_Templates_SecOps","CA_Missions_FirstAidSystem","CA_Missions_GarbageCollector","CA_Missions_PMC","CA_Missions_SecOps","CA_Missions_Templates_SecOps","CA_Missions2_PMC","CA_Modules","CA_Modules_Alice","CA_Modules_Animals","CA_Modules_ARTY","CA_Modules_clouds","CA_Modules_Coin","CA_Modules_DynO","CA_Modules_E","CA_Modules_E_DynO","CA_Modules_E_Jukebox","CA_Modules_E_OO","CA_Modules_E_UAV","CA_Modules_E_UAV_Heli","CA_Modules_E_Weather","CA_Modules_Functions","CA_Modules_Marta","CA_Modules_PMC","CA_Modules_PMC_SimpleFIrstAid","CA_Modules_Silvie","CA_Modules_StratLayer","CA_Modules_UAV","CA_Modules_ZoRA","CA_MPA_Challenges","CA_MPA_Core","CA_MPA_MP","CA_MPA_Scenarios","CA_Sounds_Baf","CA_SoundsMissions_E","CA_Support","CAA10","CAAir_BAF","CAAir_BAF_CH_47F","CAAir_E","CAAir_E_A10","CAAir_E_AH64D","CAAir_E_AH6J","CAAir_E_An2","CAAir_E_C130J","CAAir_E_CH_47F","CAAir_E_Halo","CAAir_E_Mi24","CAAir_E_MI8","CAAir_E_UH1H_EP1","CAAir_E_UH60M","CAAir_PMC","CAAir_PMC_KA137","CAAir_PMC_KA60","CAAir2","CAAir2_C130J","CAAir2_ChukarTarget","CAAir2_F35B","CAAir2_MQ9PredatorB","CAAir2_MV22","CAAir2_Pchela1T","CAAir2_UH1Y","CAAir3","CAAir3_Su34","CAAnimals","CACharacters_BAF","CACharacters_BAF_Head","CACharacters_E","CACharacters_E_Head","CACharacters_PMC","CACharacters_PMC_Head","CACharacters_W_BAF","CACharacters2","CAMisc_fix","CAMisc_fix_A2FREE","CAMisc_fix_air","CAMisc_fix_Ch2","CAMisc_fix_Str","CAMisc_fix_Weap","CAMusic","CAMusic_E","CAMusic_PMC","CASounds_E","CASounds_Missions","CATracked_BAF","CATracked_E","CATracked_E_BMP2","CATracked_E_M1_Abrams","CATracked_E_M113","CATracked_E_M2A2_Bradley","CATracked_E_T34","CATracked_E_T55","CATracked_E_T72","CATracked_E_us_m270mlrs","CATracked_E_ZSU","CATracked_W_BAF","CATracked2","CATracked2_2S6M_Tunguska","CATracked2_AAV","CATracked2_BMP3","CATracked2_T34","CATracked2_T90","CATracked2_us_m270mlrs","CAWater2_Destroyer","CAWater2_fishing_boat","CAWater2_Fregata","CAWater2_smallboat_1","CAWeapons_2b14_82mm_Mortar","CAWeapons_AK","CAWeapons_AmmoBoxes","CAWeapons_BAF","CAWeapons_bizon","CAWeapons_Colt1911","CAWeapons_DMR","CAWeapons_E","CAWeapons_E_AGS","CAWeapons_E_AK","CAWeapons_E_AmmoBoxes","CAWeapons_E_Colt1911","CAWeapons_E_D30","CAWeapons_E_DSHKM","CAWeapons_E_FIM92_static","CAWeapons_E_fnfal","CAWeapons_E_G36","CAWeapons_E_GrenadeLauncher","CAWeapons_E_Igla","CAWeapons_E_Javelin","CAWeapons_E_KORD","CAWeapons_E_ksvk","CAWeapons_E_LeeEnfield","CAweapons_E_m107","CAWeapons_E_M110","CAWeapons_E_M119_Howitzer","CAWeapons_E_M136","CAWeapons_E_M14","CAWeapons_E_M16","CAWeapons_E_M240","CAWeapons_E_M252_81mm_Mortar","CAWeapons_E_M2StaticMG","CAWeapons_E_M47","CAWeapons_E_M9","CAWeapons_E_MAAWS","CAWeapons_E_Makarov","CAWeapons_E_Metis","CAWeapons_E_Mk19_MiniTriPod","CAWeapons_E_PK","CAWeapons_E_Podnos_2b14_82mm","CAWeapons_E_RPG18","CAWeapons_E_RPG7","CAWeapons_E_scar","CAWeapons_E_Searchlight","CAWeapons_E_SPG9","CAWeapons_E_STATIC","CAWeapons_E_Stinger","CAWeapons_E_Strela","CAWeapons_E_TOW","CAWeapons_E_ZU23","CAWeapons_Kord","CAweapons_ksvk","CAWeapons_M1014","CAweapons_m107","CAWeapons_M252_81mm_Mortar","CAWeapons_Metis_AT_13","CAWeapons_PMC","CAWeapons_PMC_AA_12","CAWeapons_PMC_AS50","CAWeapons_PMC_XM8","CAWeapons_Saiga12K","CAWeapons_SPG9","CAWeapons_VSS_vintorez","CAWeapons_ZU23","CAWeapons2","CAWeapons2_HuntingRifle","CAWeapons2_RPG18","CAWeapons2_SMAW","CAWheeled_D_BAF","CAWheeled_E_ATV","CAWheeled_E_BRDM2","CAWheeled_E_BTR40","CAWheeled_E_BTR60","CAWheeled_E_HMMWV","CAWheeled_E_Ikarus","CAWheeled_E_LADA","CAWheeled_E_LandRover","CAWheeled_E_M1030","CAWheeled_E_MTVR","CAWheeled_E_Offroad","CAWheeled_E_Old_bike","CAWheeled_E_Old_moto","CAWheeled_E_Pickup","CAWheeled_E_s1203","CAWheeled_E_SCUD","CAWheeled_E_stryker","CAWheeled_E_SUV","CAWheeled_E_TT650","CAWheeled_E_UAZ","CAWheeled_E_Ural","CAWheeled_E_V3S","CAWheeled_E_Volha","CAWheeled_Offroad","CAWheeled_Pickup","CAWheeled_PMC","CAWheeled_PMC_ArmoredSUV","CAWheeled_W_BAF","CAWheeled2_BTR90","CAWheeled2_GAZ39371","CAWheeled2_HMMWV_Ambulance","CAWheeled2_HMMWV_BASE","CAWheeled2_Ikarus","CAWheeled2_Kamaz","CAWheeled2_LADA","CAWheeled2_LAV25","CAWheeled2_M1114_Armored","CAWheeled2_M998A2_Avenger","CAWheeled2_MMT","CAWheeled2_MTVR","CAWheeled2_TowingTractor","CAWheeled2_V3S","CAWheeled2_VWGolf","CAWheeled3","CAWheeled3_M1030","CAWheeled3_TT650","Datsun_armed_DBE1","DBE1","DBE1_UI","DC3_DBE1","HALO_Test","Hilux_armed_DBE1","Warfare2","Warfare2_E","Warfare2Vehicles","CUP_Models_DBE1_Data","CUP_Anims_DBE1","Anims_DBE1","CUP_HMMWV_DBE1","HMMWV_DBE1","CUP_Mercenary_DBE1","Mercenary_DBE1","CUP_Misc_DBE1","Misc_DBE1","CUP_Music_DBE1","Music_DBE1","CUP_NPCs_DBE1","NPCs_DBE1","CUP_ploty_DBE1","ploty_DBE1","CUP_Prisoners_DBE1","Prisoners_DBE1","CUP_Roads_DBE1","Roads_DBE1","CUP_UH60Desert","UH60Desert","CUP_Sara_dbe1_Data","CUP_TKOH_Dummy","HSim_Data_H","HSim_Data_H_data_ParticleEffects","HSim_Data_H_data_ParticleEffects_rotor_blades","HSim_Dubbing_H","HSim_DubbingRadio_H","HSim_Editor_H","Intro_Island_H","HSim_Missions_H","HSim_ModulesCore_H","HSim_ModulesCore_H_AmbientCombat","HSim_ModulesCore_H_DynO","HSim_ModulesCore_H_Functions","HSim_ModulesCore_H_GarbageCollector","HSim_ModulesCore_H_Functions_E","HSim_ModulesCore_H_OO","HSim_ModulesCore_H_Functions_PMC","HSim_Music_H","HSim_Sounds_H","South_Asia_H","HSim_UIFonts_H","United_States_H","HSim_Animals_H","HSim_Animals_H_Anim_Config","HSim_Animals_H_Dog","HSim_Characters_H_Faces","HSim_Characters_H_Heads","HSim_Modules_H","HSim_UI_H","HSim_Weapons_H","HSim_Weapons_H_AK47","HSim_Weapons_H_DShKM","HSim_Weapons_H_Glock","HSim_Weapons_H_HandItems","HSim_Weapons_H_M16","HSim_Weapons_US_H","HSim_Characters_H","HSim_Characters_US_H","HSim_Missions_H_FreeFlight","HSim_Functions_Base_H","HSim_Water_H","HSim_Water_H_Civ_FishingBoat_Large","HSim_Water_H_Civ_Jetboat","HSim_Water_H_Civ_Yacht","HSim_Water_H_Container_Ship","HSim_Water_H_Cruise_Ship","HSim_Water_H_Destroyer","HSim_Water_H_Fishing_Boat","HSim_Water_H_Fregata","HSim_Water_H_LHD","HSim_Water_H_Oil_tanker","HSim_Water_H_Rubber_Boat","HSim_Water_H_Whales","HSim_Water_H_Whales_GreyWhale","HSim_Water_H_Whales_Whale1","HSim_Weapons_H_IGLA","HSim_Weapons_US_H_M2","HSim_Wheeled_H","HSim_Wheeled_H_Ambulance","HSim_Wheeled_H_FireTruck","HSim_Wheeled_H_Hatchback","HSim_Wheeled_H_Military_Offroad_LR","HSim_Wheeled_H_Military_Pickup_DSHKM","HSim_Wheeled_H_Offroad","HSim_Wheeled_H_Police_Car","HSim_Wheeled_H_TowingTractor","HSim_Wheeled_H_Tractor","HSim_Wheeled_H_Trailers","HSim_Wheeled_H_Truck_Light_Transport","HSim_Wheeled_H_Ural","HSim_Wheeled_H_Van_Passenger","HSim_Wheeled_US_H","HSim_Wheeled_US_H_Military_Offroad","HSim_Wheeled_US_H_Military_Truck","HSim_Wheeled_US_H_Pickup_01","HSim_Wheeled_US_H_Pickup_02","HSim_Wheeled_US_H_SUV","HSim_Wheeled_US_H_Truck_US_Type","HSim_Air_H","HSim_Air_H_Aircraft_A","HSim_Air_H_Aircraft_C","HSim_Air_H_Aircraft_D","HSim_Air_H_Aircraft_E_H","HSim_Air_H_Airliner_A","HSim_Air_H_Airliner_B","HSim_Air_H_Parachute","HSim_Air_US_H","HSim_Air_US_H_Helicopters_Heavy","HSim_Air_US_H_Helicopters_Light","HSim_Air_US_H_Helicopters_Medium","HSim_Misc_H","HSim_Misc_H_Antena","HSim_Misc_H_Barels","HSim_Misc_H_Bleacher","HSim_Misc_H_BoardsPack","HSim_Misc_H_CncBlock","HSim_Misc_H_Doghouse","HSim_Misc_H_Engine_Crane","HSim_Misc_H_Fence","HSim_Misc_H_Fire_Extinguisher","HSim_Misc_H_Fire_Suppression","HSim_Misc_H_First_Aid","HSim_Misc_H_Flagpole","HSim_Misc_H_Folding_Ladder","HSim_Misc_H_FuelCan","HSim_Misc_H_Heliport_Furniture","HSim_Misc_H_Helicopter_Parts","HSim_Misc_H_Helipads","HSim_Misc_H_Heliport_Objects","HSim_Misc_H_Helpers","HSim_Misc_H_Info_Board","HSim_Misc_H_Infostands","HSim_Misc_H_Inspection_Visuals","HSim_Misc_H_Interior","HSim_Misc_H_Loudspeakers","HSim_Misc_H_Market","HSim_Misc_H_Office_Objects","HSim_Misc_H_Perimeter_Ligh","HSim_Misc_H_Pike","HSim_Misc_H_Platform_Cart","HSim_Misc_H_Portable_Generator","HSim_Misc_H_Props","HSim_Misc_H_SawHorse","HSim_Misc_H_Shooting_Range","HSim_Misc_H_Signs","HSim_Misc_H_Sink","HSim_Misc_H_Targets","HSim_Misc_H_Tent","HSim_Misc_H_Toilet","HSim_Misc_H_Tools","HSim_Misc_H_Tools_Racking","HSim_Misc_H_Trash","HSim_Misc_H_Weather_Station","HSim_Misc_H_Weld_Gastank","HSim_Misc_H_Wheel_Chocks","HSim_Misc_H_Wheeled_Scaffolding","HSim_Misc_H_wheeled_tool_cart","HSim_Misc_H_Wheeled_Whiteboard","HSim_Misc_H_Winch","HSim_Misc_H_Windsock","HSim_Misc_H_Workbench","HSim_Misc_H_Wrecks","HSim_Structures_H","HSim_Structures_H_Airport_Papi","HSim_Structures_H_Harbour","HSim_Structures_H_Heliports_Heliport_Big","HSim_Structures_H_Heliports_Heliport_Small","HSim_Structures_H_Industrial_A_CraneCon","HSim_Structures_H_Industrial_Rooftop_Objects","HSim_Structures_US_H","HSim_Structures_US_H_Bld_US","HSim_Structures_US_H_Landmarks_Space_Needle","HSim_Tracked_H","HSim_Tracked_H_BMP2","HSim_Tracked_US_H","HSim_Tracked_US_H_M1A2","HSim_Tracked_US_H_MLRS","HSim_Data_H_EditorGroups","HSim_Anims_H","HSim_Anims_H_config_sdr","HSim_Anims_H_config_wmn","CUP_Hsim_Language_H","Hsim_Language_H","CUP_Hsim_Language_missions_H","Hsim_Language_missions_H","a3_epoch_community","A3_epoch_assets_1","epoch_objects","A3_epoch_assets_3","A3_epoch_vehicles","a3_epoch_weapons","A3_Data_F","A3_Data_F_Hook","A3_Data_F_ParticleEffects","A3_Data_F_Bootcamp","A3_Data_F_Exp_A","A3_Data_F_Kart_ParticleEffects","A3_Data_F_Mark","A3_Editor_F","A3_Functions_F_Bootcamp","A3_Functions_F_Curator","A3_Functions_F_Exp_A","A3_Functions_F_Heli","A3_Functions_F_Mark","A3_Functions_F_MP_Mark","A3_Language_F","A3_Language_F_Beta","A3_Language_F_Curator","A3_Language_F_EPA","A3_Language_F_EPB","A3_Language_F_EPC","A3_Language_F_Gamma","A3_Language_F_Heli","A3_Language_F_Kart","A3_Language_F_Mark","A3_LanguageMissions_F","A3_LanguageMissions_F_Beta","A3_LanguageMissions_F_Gamma","A3_LanguageMissions_F_Kart","A3_Misc_F","A3_Misc_F_Helpers","A3_Modules_F","A3_Modules_F_DynO","A3_Modules_F_Effects","A3_Modules_F_Events","A3_Modules_F_GroupModifiers","A3_Modules_F_HC","A3_Modules_F_Intel","A3_Modules_F_LiveFeed","A3_Modules_F_Marta","A3_Modules_F_Misc","A3_Modules_F_Multiplayer","A3_Modules_F_ObjectModifiers","A3_Modules_F_Sites","A3_Modules_F_Skirmish","A3_Modules_F_StrategicMap","A3_Modules_F_Supports","A3_Modules_F_UAV","A3_Modules_F_Beta","A3_Modules_F_Beta_FiringDrills","A3_Modules_F_EPB","A3_Modules_F_EPB_Misc","A3_Modules_F_Heli","A3_Modules_F_Heli_SpawnAi","A3_Modules_F_Mark","A3_Modules_F_Mark_FiringDrills","A3_Modules_F_MP_Mark","A3_Modules_F_Mark_Objectives","A3_Music_F","A3_Music_F_Bootcamp","A3_Music_F_EPA","A3_Music_F_EPB","A3_Music_F_EPC","A3_Music_F_Heli","A3_Music_F_Mark","A3_Roads_F","A3_Rocks_F","A3_Sounds_F","A3_Sounds_F_Bootcamp","A3_Sounds_F_EPB","A3_Sounds_F_EPC","A3_Sounds_F_Exp_A","A3_Structures_F","A3_Structures_F_Bridges","A3_Structures_F_Civ","A3_Structures_F_Civ_Accessories","A3_Structures_F_Civ_Ancient","A3_Structures_F_Civ_BellTowers","A3_Structures_F_Civ_Calvaries","A3_Structures_F_Civ_Camping","A3_Structures_F_Civ_Chapels","A3_Structures_F_Civ_Constructions","A3_Structures_F_Civ_Dead","A3_Structures_F_Civ_Garbage","A3_Structures_F_Civ_Graffiti","A3_Structures_F_Civ_InfoBoards","A3_Structures_F_Civ_Kiosks","A3_Structures_F_Civ_Lamps","A3_Structures_F_Civ_Market","A3_Structures_F_Civ_Offices","A3_Structures_F_Civ_Pavements","A3_Structures_F_Civ_PlayGround","A3_Structures_F_Civ_SportsGrounds","A3_Structures_F_Civ_Statues","A3_Structures_F_Civ_Tourism","A3_Structures_F_Dominants","A3_Structures_F_Dominants_Amphitheater","A3_Structures_F_Dominants_Castle","A3_Structures_F_Dominants_Church","A3_Structures_F_Dominants_Hospital","A3_Structures_F_Dominants_Lighthouse","A3_Structures_F_Dominants_WIP","A3_Structures_F_Furniture","A3_Structures_F_Households","A3_Structures_F_Households_Addons","A3_Structures_F_Households_House_Big01","A3_Structures_F_Households_House_Big02","A3_Structures_F_Households_House_Shop01","A3_Structures_F_Households_House_Shop02","A3_Structures_F_Households_House_Small01","A3_Structures_F_Households_House_Small02","A3_Structures_F_Households_House_Small03","A3_Structures_F_Households_Slum","A3_Structures_F_Households_Stone_Big","A3_Structures_F_Households_Stone_Shed","A3_Structures_F_Households_Stone_Small","A3_Structures_F_Households_WIP","A3_Structures_F_Ind","A3_Structures_F_Ind_AirPort","A3_Structures_F_Ind_Cargo","A3_Structures_F_Ind_CarService","A3_Structures_F_Ind_ConcreteMixingPlant","A3_Structures_F_Ind_Crane","A3_Structures_F_Ind_DieselPowerPlant","A3_Structures_F_Ind_Factory","A3_Structures_F_Ind_FuelStation","A3_Structures_F_Ind_FuelStation_Small","A3_Structures_F_Ind_Pipes","A3_Structures_F_Ind_PowerLines","A3_Structures_F_Ind_ReservoirTank","A3_Structures_F_Ind_Shed","A3_Structures_F_Ind_SolarPowerPlant","A3_Structures_F_Ind_Tank","A3_Structures_F_Ind_Transmitter_Tower","A3_Structures_F_Ind_WavePowerPlant","A3_Structures_F_Ind_Windmill","A3_Structures_F_Ind_WindPowerPlant","A3_Structures_F_Items","A3_Structures_F_Items_Documents","A3_Structures_F_Items_Electronics","A3_Structures_F_Items_Cans","A3_Structures_F_Items_Gadgets","A3_Structures_F_Items_Luggage","A3_Structures_F_Items_Medical","A3_Structures_F_Items_Military","A3_Structures_F_Items_Stationery","A3_Structures_F_Items_Tools","A3_Structures_F_Items_Valuables","A3_Structures_F_Items_Vessels","A3_Structures_F_Mil","A3_Structures_F_Mil_BagBunker","A3_Structures_F_Mil_BagFence","A3_Structures_F_Mil_Barracks","A3_Structures_F_Mil_Bunker","A3_Structures_F_Mil_Cargo","A3_Structures_F_Mil_Flags","A3_Structures_F_Mil_Fortification","A3_Structures_F_Mil_Helipads","A3_Structures_F_Mil_Offices","A3_Structures_F_Mil_Radar","A3_Structures_F_Mil_Shelters","A3_Structures_F_Mil_TentHangar","A3_Structures_F_Naval","A3_Structures_F_Naval_Buoys","A3_Structures_F_Naval_Fishing","A3_Structures_F_Naval_Piers","A3_Structures_F_Naval_RowBoats","A3_Structures_F_Research","A3_Structures_F_System","A3_Structures_F_Training","A3_Structures_F_Training_InvisibleTarget","A3_Structures_F_Walls","A3_Structures_F_Bootcamp_Ind_Cargo","A3_Structures_F_Bootcamp_Items_Sport","A3_Structures_F_Bootcamp_System","A3_Structures_F_Bootcamp_Training","A3_Structures_F_Bootcamp_VR_Blocks","A3_Structures_F_Bootcamp_VR_CoverObjects","A3_Structures_F_Bootcamp_VR_Helpers","A3_Structures_F_EPA_Civ_Camping","A3_Structures_F_EPA_Civ_Constructions","A3_Structures_F_EPA_Items_Electronics","A3_Structures_F_EPA_Items_Food","A3_Structures_F_EPA_Items_Medical","A3_Structures_F_EPA_Items_Tools","A3_Structures_F_EPA_Items_Vessels","A3_Structures_F_EPA_Walls","A3_Structures_F_EPB_Civ_Accessories","A3_Structures_F_EPB_Civ_Camping","A3_Structures_F_EPB_Civ_Dead","A3_Structures_F_EPB_Civ_Garbage","A3_Structures_F_EPB_Civ_Graffiti","A3_Structures_F_EPB_Civ_PlayGround","A3_Structures_F_EPB_Furniture","A3_Structures_F_EPB_Items_Documents","A3_Structures_F_EPB_Items_Luggage","A3_Structures_F_EPB_Items_Military","A3_Structures_F_EPB_Items_Vessels","A3_Structures_F_EPB_Naval_Fishing","A3_Structures_F_EPC_Civ_Accessories","A3_Structures_F_EPC_Civ_Camping","A3_Structures_F_EPC_Civ_Garbage","A3_Structures_F_EPC_Civ_InfoBoards","A3_Structures_F_EPC_Civ_Kiosks","A3_Structures_F_EPC_Civ_PlayGround","A3_Structures_F_EPC_Civ_Tourism","A3_Structures_F_EPC_Dominants_GhostHotel","A3_Structures_F_EPC_Dominants_Stadium","A3_Structures_F_EPC_Furniture","A3_Structures_F_EPC_Items_Documents","A3_Structures_F_EPC_Items_Electronics","A3_Structures_F_EPC_Walls","A3_Structures_F_Exp_A","A3_Structures_F_Exp_A_VR_Blocks","A3_Structures_F_Exp_A_VR_Helpers","A3_Structures_F_Heli_Civ_Accessories","A3_Structures_F_Heli_Civ_Constructions","A3_Structures_F_Heli_Civ_Garbage","A3_Structures_F_Heli_Civ_Market","A3_Structures_F_Heli_Furniture","A3_Structures_F_Heli_Ind_AirPort","A3_Structures_F_Heli_Ind_Cargo","A3_Structures_F_Heli_Ind_Machines","A3_Structures_F_Heli_Items_Airport","A3_Structures_F_Heli_Items_Luggage","A3_Structures_F_Heli_Items_Sport","A3_Structures_F_Heli_Items_Tools","A3_Structures_F_Heli_VR_Helpers","A3_Structures_F_Kart_Civ_SportsGrounds","A3_Structures_F_Kart_Mil_Flags","A3_Structures_F_Mark_Items_Military","A3_Structures_F_Mark_Items_Sport","A3_Structures_F_Mark_Mil_Flags","A3_Structures_F_Mark_Training","A3_Structures_F_Mark_VR_Helpers","A3_Structures_F_Mark_VR_Shapes","A3_Structures_F_Mark_VR_Targets","A3_UIFonts_F","CUP_Buildings_Config","CABuildings","CUP_CABuildings_Misc","CABuildings_Misc","CUP_Desert2_Buildings","Desert2_Buildings","CUP_CA_desert2_Characters","CA_desert2_Characters","CUP_Desert_Config","Desert","CUP_DBE1_Hotfix","DBE1_Hotfix","CUP_CALanguage_e","CALanguage_e","CUP_CALanguage_PMC","CALanguage_PMC","CUP_CALanguage_missions_PMC","CALanguage_missions_PMC","CUP_CAWater2_seafox_EP1","CAWater2_seafox_EP1","CUP_CA_Plants2","CA_Plants2","CUP_CA_Plants2_Plant","CA_Plants2_Plant","CUP_CA_Plants2_Tree","CA_Plants2_Tree","CUP_CA_Plants_E2","CA_Plants_E2","CUP_CA_Plants_E","CA_Plants_E","CUP_CA_Plants_E_Misc","CA_Plants_E_Misc","CUP_CA_Plants_E_Plant","CA_Plants_E_Plant","CUP_CA_Plants_E_Tree","CA_Plants_E_Tree","CUP_Sara_Config","Sara","CUP_Saralite_Config","SaraLite","CUP_CASigns2","CASigns2","CUP_Structures_Config","CAStructures","CUP_CAStructures_A_BuildingWIP","CAStructures_A_BuildingWIP","CUP_CAStructures_A_CraneCon","CAStructures_A_CraneCon","CUP_CAStructuresLand_A_MunicipalOffice","CAStructuresLand_A_MunicipalOffice","CUP_CAStructuresBarn_W","CAStructuresBarn_W","CUP_CAStructures_Castle","CAStructures_Castle","CUP_CAStructuresHouse","CAStructuresHouse","CUP_CAStructuresHouse_A_FuelStation","CAStructuresHouse_A_FuelStation","CUP_CAStructuresHouse_A_Hospital","CAStructuresHouse_A_Hospital","CUP_CAStructuresHouse_A_Office01","CAStructuresHouse_A_Office01","CUP_CAStructuresHouse_A_Office02","CAStructuresHouse_A_Office02","CUP_CAStructuresHouse_a_stationhouse","CAStructuresHouse_a_stationhouse","CUP_CAStructuresHouse_Church_02","CAStructuresHouse_Church_02","CUP_CAStructuresHouse_Church_03","CAStructuresHouse_Church_03","CUP_CAStructuresHouse_Church_05R","CAStructuresHouse_Church_05R","CUP_CAStructuresHouse_HouseBT","CAStructuresHouse_HouseBT","CUP_CAStructuresHouse_HouseV2","CAStructuresHouse_HouseV2","CUP_CAStructuresHouse_HouseV","CAStructuresHouse_HouseV","CUP_CAStructuresLand_Ind_Stack_Big","CAStructuresLand_Ind_Stack_Big","CUP_CAStructures_IndPipe1","CAStructures_IndPipe1","CUP_CAStructuresInd_Quarry","CAStructuresInd_Quarry","CUP_Ind_SawMill","Ind_SawMill","CUP_CAStructures_Mil","CAStructures_Mil","CUP_CAStructures_Misc","CAStructures_Misc","CUP_CAStructures_Misc_Armory","CAStructures_Misc_Armory","CUP_CAStructures_Misc_Armory_Armor_Popuptarget","CAStructures_Misc_Armory_Armor_Popuptarget","CUP_CAStructures_Misc_Powerlines","CAStructures_Misc_Powerlines","CUP_CAStructures_Nav","CAStructures_Nav","CUP_CAStructuresLand_Nav_Boathouse","CAStructuresLand_Nav_Boathouse","CUP_CAStructures_Proxy_BuildingParts","CAStructures_Proxy_BuildingParts","CUP_CAStructures_Proxy_Ruins","CAStructures_Proxy_Ruins","CUP_CAStructures_Rail","CAStructures_Rail","CUP_CAStructuresHouse_rail_station_big","CAStructuresHouse_rail_station_big","CUP_CAStructures_Ruins","CAStructures_Ruins","CUP_CAStructuresShed_Small","CAStructuresShed_Small","CUP_CAStructuresHouse_Shed_Ind","CAStructuresHouse_Shed_Ind","CUP_CAStructures_Wall","CAStructures_Wall","CUP_CAUI","CAUI","CUP_CAWater2_LHD","CAWater2_LHD","CUP_Models_DBE1_Config","Models_DBE1","CUP_Kamenolom_DBE1","Kamenolom_DBE1","CUP_Pila_DBE1","Pila_DBE1","CUP_UI_DBE1","UI_DBE1","CUP_Vysilac_DBE1","Vysilac_DBE1","CUP_Zakladna_DBE1","Zakladna_DBE1","CUP_Sara_dbe1_Config","Sara_dbe1","a3_epoch_structures","A3_Animals_F","A3_Animals_F_AnimConfig","A3_Animals_F_Fishes","A3_Animals_F_Kestrel","A3_Animals_F_Rabbit","A3_Animals_F_Seagull","A3_Animals_F_Snakes","A3_Animals_F_Turtle","A3_Animals_F_Chicken","A3_Animals_F_Dog","A3_Animals_F_Goat","A3_Animals_F_Sheep","A3_Anims_F","A3_Anims_F_Config_Sdr","A3_Anims_F_EPA","A3_Anims_F_EPC","A3_Anims_F_Exp_A","A3_Anims_F_Kart","A3_Anims_F_Mark_Deployment","A3_Language_F_Bootcamp","A3_Language_F_Exp_A","A3_Map_Data","A3_Map_Stratis","A3_Map_Stratis_Scenes","A3_Plants_F_Bush","A3_Props_F_Exp_A","A3_Props_F_Exp_A_Military","A3_Signs_F","A3_Signs_F_AD","A3_Structures_F_Signs_Companies","A3_Structures_F_Bootcamp_Civ_Camping","A3_Structures_F_Bootcamp_Civ_SportsGrounds","A3_Structures_F_Bootcamp_Items_Electronics","A3_Structures_F_Bootcamp_Items_Food","A3_Structures_F_Heli_Items_Electronics","A3_Structures_F_Heli_Items_Food","A3_Structures_F_Kart_Signs_Companies","A3_UI_F","A3_UI_F_Curator","A3_UI_F_Kart","A3_UI_F_Mark","A3_UI_F_MP_Mark","A3_Weapons_F","A3_Weapons_F_NATO","A3_Weapons_F_CSAT","A3_Weapons_F_AAF","A3_weapons_F_FIA","A3_Weapons_F_ItemHolders","A3_Weapons_F_Headgear","A3_Weapons_F_Uniforms","A3_Weapons_F_Vests","A3_Weapons_F_Ammoboxes","A3_Weapons_F_DummyWeapons","A3_Weapons_F_Explosives","A3_Weapons_F_Items","A3_Weapons_F_Launchers_NLAW","A3_Weapons_F_Launchers_LAW","A3_Weapons_F_Launchers_Titan","A3_Weapons_F_EPA_LongRangeRifles_DMR_01","A3_Weapons_F_EBR","A3_Weapons_F_LongRangeRifles_GM6","A3_Weapons_F_LongRangeRifles_M320","A3_Weapons_F_Machineguns_M200","A3_Weapons_F_Machineguns_Zafir","A3_Weapons_F_Pistols_ACPC2","A3_Weapons_F_Pistols_P07","A3_Weapons_F_Pistols_Pistol_heavy_01","A3_Weapons_F_Pistols_Pistol_heavy_02","A3_Weapons_F_Pistols_Rook40","A3_Weapons_F_Rifles_Khaybar","A3_Weapons_F_Rifles_Mk20","A3_Weapons_F_Rifles_MX","A3_Weapons_F_EPB_Rifles_MX_Black","A3_Weapons_F_Rifles_SDAR","A3_Weapons_F_Rifles_TRG20","A3_Weapons_F_Pistols_PDW2000","A3_Weapons_F_Rifles_Vector","a3_weapons_f_rifles_SMG_02","A3_Weapons_F_beta","A3_Weapons_F_Beta_Ammoboxes","A3_Weapons_F_beta_EBR","A3_Weapons_F_EPA_LongRangeRifles_GM6","A3_Weapons_F_EPB_LongRangeRifles_M320","A3_Weapons_F_beta_Rifles_Khaybar","A3_Weapons_F_beta_Rifles_MX","A3_Weapons_F_beta_Rifles_TRG20","A3_Weapons_F_Bootcamp_LongRangeRifles_GM6","A3_Weapons_F_Bootcamp_LongRangeRifles_M320","A3_Weapons_F_EPB_LongRangeRifles_GM3","A3_Weapons_F_gamma","A3_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_EPA_EBR","A3_Weapons_F_EPA_Rifles_MX","A3_Weapons_F_Kart_Pistols_Pistol_Signal_F","A3_Weapons_F_Mark_LongRangeRifles_DMR_01","A3_Weapons_F_Mark_EBR","A3_Weapons_F_Mark_LongRangeRifles_GM6","A3_Weapons_F_Mark_LongRangeRifles_GM6_camo","A3_Weapons_F_Mark_LongRangeRifles_M320","A3_Weapons_F_Mark_LongRangeRifles_M320_camo","A3_Weapons_F_Mark_Machineguns_M200","A3_Weapons_F_Mark_Machineguns_Zafir","A3_Weapons_F_Mark_Rifles_Khaybar","A3_Weapons_F_Mark_Rifles_Mk20","A3_Weapons_F_Mark_Rifles_MX","A3_Weapons_F_Mark_Rifles_SDAR","A3_Weapons_F_Mark_Rifles_TRG20","CUP_Buildings2_Config","CABuildings2","CUP_A_Crane_02","A_Crane_02","CUP_A_GeneralStore_01","A_GeneralStore_01","CUP_CABuildings2_A_Pub","CABuildings2_A_Pub","CUP_A_statue","A_statue","CUP_Barn_Metal","Barn_Metal","CUP_CABuildingParts","CABuildingParts","CUP_CABuildingParts_Signs","CABuildingParts_Signs","CUP_CATEC","CATEC","CUP_Church_01","Church_01","CUP_Farm_Cowshed","Farm_Cowshed","CUP_Farm_WTower","Farm_WTower","CUP_CAHouseBlock_A","CAHouseBlock_A","CUP_CAHouseBlock_B","CAHouseBlock_B","CUP_CAHouseBlock_C","CAHouseBlock_C","CUP_CAHouseBlock_D","CAHouseBlock_D","CUP_HouseRuins","HouseRuins","CUP_Ind_Dopravnik","Ind_Dopravnik","CUP_Ind_Expedice","Ind_Expedice","CUP_Ind_MalyKomin","Ind_MalyKomin","CUP_Ind_Mlyn","Ind_Mlyn","CUP_Ind_Pec","Ind_Pec","CUP_ind_silomale","ind_silomale","CUP_Ind_SiloVelke","Ind_SiloVelke","CUP_Ind_Vysypka","Ind_Vysypka","CUP_Ind_Garage01","Ind_Garage01","CUP_CAStructures_IndPipe1_todo_delete","CAStructures_IndPipe1_todo_delete","CUP_IndPipe2","IndPipe2","CUP_Ind_Shed_01","Ind_Shed_01","CUP_Ind_Shed_02","Ind_Shed_02","CUP_Ind_Tank","Ind_Tank","CUP_Ind_Workshop01","Ind_Workshop01","CUP_CABuildings2_Misc_Cargo","CABuildings2_Misc_Cargo","CUP_Misc_PowerStation","Misc_PowerStation","CUP_Misc_WaterStation","Misc_WaterStation","CUP_Rail_House_01","Rail_House_01","CUP_Shed_small","Shed_small","CUP_Shed_wooden","Shed_wooden","CUP_particle_effects","particle_effects","CUP_Chernarus_Config","Chernarus","CUP_Chernarus_Summer_Config","Chernarus_Summer","CUP_Desert2_Config","Porto","CUP_Hotfix_Config","CA_Hotfix","CUP_CA_QGClutterHotfix","CA_QGClutterHotfix","CUP_CA_Hotfix_vez_ropa","CA_Hotfix_vez_ropa","CUP_CAMisc2","CAMisc2","CUP_Misc3_Config","CAMisc3","CUP_WarfareBuildings","WarfareBuildings","CUP_Misc_e_Config","CAMisc_E","CUP_CAMisc_E_WF","CAMisc_E_WF","CUP_CAMP_Armory_Misc","CAMP_Armory_Misc","CUP_CAMP_Armory_Misc_Concrete_Wall","CAMP_Armory_Misc_Concrete_Wall","CUP_CAMP_Armory_Misc_Entrance_Gate","CAMP_Armory_Misc_Entrance_Gate","CUP_CAMP_Armory_Misc_Info_Board","CAMP_Armory_Misc_Info_Board","CUP_CAMP_Armory_Misc_Infostands","CAMP_Armory_Misc_Infostands","CUP_CAMP_Armory_Misc_Laptop","CAMP_Armory_Misc_Laptop","CUP_CAMP_Armory_Misc_Loudspeakers","CAMP_Armory_Misc_Loudspeakers","CUP_CAMP_Armory_Misc_Plasticpole","CAMP_Armory_Misc_Plasticpole","CUP_CAMP_Armory_Misc_Red_Light","CAMP_Armory_Misc_Red_Light","CUP_CAMP_Armory_Misc_Sign_Armex","CAMP_Armory_Misc_Sign_Armex","CUP_CAMP_Armory_Misc_Sign_Direction","CAMP_Armory_Misc_Sign_Direction","CUP_CA_Plants2_Bush","CA_Plants2_Bush","CUP_CA_Plants2_Misc","CA_Plants2_Misc","CUP_CA_Plants_E_Bush","CA_Plants_E_Bush","CUP_CA_Plants_PMC","CA_Plants_PMC","CUP_CARoads2Bridge","CARoads2Bridge","CUP_CARoads_PMC_Bridge","CARoads_PMC_Bridge","CUP_A_TVTower","A_TVTower","CUP_CAStructures_Nav_pier","CAStructures_Nav_pier","CUP_CAStructures_Railway","CAStructures_Railway","CUP_Structures_e_Config","CAStructures_E","CUP_CAStructures_E_HouseA","CAStructures_E_HouseA","CUP_CAStructures_E_HouseA_A_BuildingWIP","CAStructures_E_HouseA_A_BuildingWIP","CUP_CAStructures_E_HouseA_A_CityGate1","CAStructures_E_HouseA_A_CityGate1","CUP_CAStructures_E_HouseA_A_Minaret","CAStructures_E_HouseA_A_Minaret","CUP_CAStructures_E_HouseA_A_Minaret_Porto","CAStructures_E_HouseA_A_Minaret_Porto","CUP_CAStructures_E_HouseA_A_Mosque_big","CAStructures_E_HouseA_A_Mosque_big","CUP_CAStructures_E_HouseA_A_Mosque_small","CAStructures_E_HouseA_A_Mosque_small","CUP_CAStructures_E_HouseA_A_Office01","CAStructures_E_HouseA_A_Office01","CUP_CAStructures_E_HouseA_a_stationhouse","CAStructures_E_HouseA_a_stationhouse","CUP_CAStructures_E_HouseA_A_Statue","CAStructures_E_HouseA_A_Statue","CUP_CAStructures_E_HouseA_A_Villa","CAStructures_E_HouseA_A_Villa","CUP_CAStructures_E_HouseC","CAStructures_E_HouseC","CUP_CAStructures_E_HouseK","CAStructures_E_HouseK","CUP_CAStructures_E_HouseL","CAStructures_E_HouseL","CUP_CAStructures_E_Ind","CAStructures_E_Ind","CUP_CAStructures_E_Ind_Ind_Coltan_Mine","CAStructures_E_Ind_Ind_Coltan_Mine","CUP_CAStructures_E_Ind_Ind_FuelStation","CAStructures_E_Ind_Ind_FuelStation","CUP_CAStructures_E_Ind_Ind_Garage01","CAStructures_E_Ind_Ind_Garage01","CUP_CAStructures_E_Ind_Oil_Mine","CAStructures_E_Ind_Oil_Mine","CUP_CAStructures_E_Ind_IndPipes","CAStructures_E_Ind_IndPipes","CUP_CAStructures_E_Ind_Misc_PowerStation","CAStructures_E_Ind_Misc_PowerStation","CUP_CAStructures_E_Ind_Ind_Shed","CAStructures_E_Ind_Ind_Shed","CUP_CAStructures_E_Mil","CAStructures_E_Mil","CUP_CAStructures_E_Misc","CAStructures_E_Misc","CUP_CAStructures_E_Misc_Misc_cables","CAStructures_E_Misc_Misc_cables","CUP_CAStructures_E_Misc_Misc_Construction","CAStructures_E_Misc_Misc_Construction","CUP_CAStructures_E_Misc_Misc_Garbage","CAStructures_E_Misc_Misc_Garbage","CUP_CAStructures_E_Misc_Misc_Interier","CAStructures_E_Misc_Misc_Interier","CUP_CAStructures_E_Misc_Misc_Lamp","CAStructures_E_Misc_Misc_Lamp","CUP_CAStructures_E_Misc_Misc_Market","CAStructures_E_Misc_Misc_Market","CUP_CAStructures_E_Misc_Misc_powerline","CAStructures_E_Misc_Misc_powerline","CUP_CAStructures_E_Misc_Misc_Water","CAStructures_E_Misc_Misc_Water","CUP_CAStructures_E_Misc_Misc_Well","CAStructures_E_Misc_Misc_Well","CUP_CAStructures_E_Wall","CAStructures_E_Wall","CUP_CAStructures_E_Wall_Wall_L","CAStructures_E_Wall_Wall_L","CUP_Structures_pmc_Config","CAStructures_PMC","CUP_CAStructures_PMC_Buildings","CAStructures_PMC_Buildings","CUP_CAStructures_PMC_Buildings_Bunker","CAStructures_PMC_Buildings_Bunker","CUP_CAStructures_PMC_Buildings_GeneralStore_PMC","CAStructures_PMC_Buildings_GeneralStore_PMC","CUP_CAStructures_PMC_Buildings_Ruin_Cowshed","CAStructures_PMC_Buildings_Ruin_Cowshed","CUP_CAStructures_PMC_Ind","CAStructures_PMC_Ind","CUP_CAStructures_PMC_FuelStation","CAStructures_PMC_FuelStation","CUP_CAStructures_PMC_Misc","CAStructures_PMC_Misc","CUP_CAStructures_PMC_Misc_Shed","CAStructures_PMC_Misc_Shed","CUP_CAStructures_PMC_Ruins","CAStructures_PMC_Ruins","CUP_CAStructures_PMC_Walls","CAStructures_PMC_Walls","CUP_Takistan_Config","Takistan","CUP_Utes_Config","Utes","CUP_Zargabad_Config","zargabad","CUP_ibr_plants","ibr_plants","a2_epoch_weapons","A3_epoch_assets","A3_Anims_F_Heli","A3_Characters_F","A3_Characters_F_BLUFOR","A3_Characters_F_Civil","A3_Characters_F_Heads","A3_Characters_F_OPFOR","A3_Characters_F_Proxies","A3_Characters_F_Beta","A3_Characters_F_INDEP","A3_Characters_F_Bootcamp","A3_Characters_F_EPB_Heads","A3_Characters_F_Gamma","A3_Characters_F_Mark","A3_Data_F_Curator","A3_Data_F_Curator_Eagle","A3_Data_F_Curator_Intel","A3_Data_F_Curator_Misc","A3_Data_F_Curator_Respawn","3DEN","A3_Data_F_Kart","A3_UAV_F_Characters_F_Gamma","A3_UAV_F_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_gamma_Items","A3_Map_Altis","A3_Map_Altis_Scenes","A3_Missions_F","A3_Missions_F_Beta","A3_Missions_F_Gamma","A3_Missions_F_Kart","A3_Modules_F_Bootcamp","A3_Modules_F_Curator","A3_Modules_F_Curator_Animals","A3_Modules_F_Curator_CAS","A3_Modules_F_Curator_Curator","A3_Modules_F_Curator_Effects","A3_Modules_F_Curator_Environment","A3_Modules_F_Curator_Flares","A3_Modules_F_Curator_Intel","A3_Modules_F_Curator_Lightning","A3_Modules_F_Curator_Mines","A3_Modules_F_Curator_Misc","A3_Modules_F_Curator_Multiplayer","A3_Modules_F_Curator_Objectives","A3_Modules_F_Curator_Ordnance","A3_Modules_F_Curator_Respawn","A3_Modules_F_Curator_Smokeshells","A3_Modules_F_Exp_A","A3_Modules_F_Kart","A3_Modules_F_Kart_TimeTrials","A3_Props_F_Exp_A_Military_Equipment","A3_Static_F","A3_Static_F_Mortar_01","A3_Static_F_Beta_Mortar_01","A3_Static_F_Gamma","A3_Static_F_Gamma_Mortar_01","A3_Static_F_Mark_Designator_01","A3_Static_F_Mark_Designator_02","A3_Supplies_F_Heli","A3_Supplies_F_Heli_Bladders","A3_Supplies_F_Heli_CargoNets","A3_Supplies_F_Heli_Fuel","A3_Supplies_F_Heli_Slingload","A3_Supplies_F_Mark","A3_UI_F_Bootcamp","A3_UI_F_Exp_A","A3_UI_F_Heli","A3_Weapons_F_Acc","A3_Weapons_F_Beta_Acc","A3_Weapons_F_Bootcamp_Ammoboxes","A3_Weapons_F_EPA","A3_Weapons_F_EPA_Acc","A3_Weapons_F_EPA_Ammoboxes","A3_Weapons_F_EPB","A3_Weapons_F_EPB_Acc","A3_Weapons_F_EPB_Ammoboxes","A3_Weapons_F_EPC","A3_Weapons_F_gamma_Acc","A3_Weapons_F_Kart","A3_Weapons_F_Mark_Acc","CUP_Afghan_Config","Mountains_ACR","CUP_Bohemia_Config","Woodland_ACR","CUP_Bootcamp_acr_Config","Bootcamp_ACR","CUP_Data_baf_Config","CA_BAF","CUP_Desert_e_Config","Desert_E","CUP_CALanguage_Baf","CALanguage_Baf","CUP_CALanguageMissions_baf","CALanguageMissions_baf","CUP_Misc_acr_Config","CAMisc_ACR","CUP_CAMisc_ACR_3DMarkers","CAMisc_ACR_3DMarkers","CUP_CAMisc_ACR_Container","CAMisc_ACR_Container","CUP_CAMisc_ACR_Dog","CAMisc_ACR_Dog","CUP_CAMisc_ACR_Helpers","CAMisc_ACR_Helpers","CUP_CAMisc_ACR_PBX","CAMisc_ACR_PBX","CUP_CAMisc_ACR_ScaffoldingSmall","CAMisc_ACR_ScaffoldingSmall","CUP_CAMisc_ACR_Shooting_range","CAMisc_ACR_Shooting_range","CUP_CAMisc_ACR_Sign_Mines","CAMisc_ACR_Sign_Mines","CUP_CAMisc_ACR_Targets","CAMisc_ACR_Targets","CUP_CAMisc_ACR_Targets_InvisibleTarget","CAMisc_ACR_Targets_InvisibleTarget","CUP_CAMisc_ACR_TestSphere","CAMisc_ACR_TestSphere","CUP_CAMisc_BAF","CAMisc_BAF","CUP_Provinggrounds_pmc_Config","ProvingGrounds_PMC","CUP_Shapur_baf_Config","Shapur_BAF","CUP_BaseConfig_F","A3_Air_F","A3_Air_F_Heli_Light_01","A3_Air_F_Heli_Light_02","A3_Air_F_Beta","A3_Air_F_Beta_Heli_Attack_01","A3_Air_F_Beta_Heli_Attack_02","A3_Air_F_Beta_Heli_Transport_01","A3_Air_F_Beta_Heli_Transport_02","A3_Air_F_Beta_Parachute_01","A3_Air_F_Beta_Parachute_02","A3_Air_F_EPB_Heli_Light_03","A3_Air_F_EPC_Plane_CAS_01","A3_Air_F_EPC_Plane_CAS_02","A3_Air_F_Gamma_Plane_Fighter_03","A3_Air_F_Heli","A3_Air_F_Heli_Heli_Attack_01","A3_Air_F_Heli_Heli_Attack_02","A3_Air_F_Heli_Heli_Light_01","A3_Air_F_Heli_Heli_Light_02","A3_Air_F_Heli_Heli_Light_03","A3_Air_F_Heli_Heli_Transport_01","A3_Air_F_Heli_Heli_Transport_02","A3_Air_F_Heli_Heli_Transport_03","A3_Air_F_Heli_Heli_Transport_04","A3_Armor_F","A3_armor_f_beta","A3_Armor_F_Panther","A3_armor_f_beta_APC_Tracked_02","A3_Armor_F_EPB_APC_tracked_03","A3_Armor_F_EPB_MBT_03","A3_Armor_F_Slammer","A3_Armor_F_T100K","A3_Boat_F","A3_Boat_F_Boat_Armed_01","A3_Boat_F_Boat_Transport_01","A3_Boat_F_Beta_Boat_Armed_01","A3_Boat_F_Beta_Boat_Transport_01","A3_Boat_F_SDV_01","A3_Boat_F_EPC_Submarine_01_F","A3_Boat_F_Civilian_Boat","A3_Boat_F_Trawler","A3_Boat_F_Gamma_Boat_Transport_01","A3_Boat_F_Heli_Boat_Armed_01","A3_Boat_F_Heli_SDV_01","A3_Characters_F_Common","A3_Characters_F_Bootcamp_Common","A3_Characters_F_EPA","A3_Characters_F_EPB","A3_Characters_F_EPC","A3_Characters_F_Kart","A3_Data_F_Curator_Characters","A3_Data_F_Curator_Virtual","A3_Data_F_Exp_A_Virtual","A3_Data_F_Heli","A3_Air_F_Gamma_UAV_01","A3_Air_F_Gamma_UAV_02","A3_Missions_F_Bootcamp","A3_Missions_F_Curator","A3_Missions_F_EPA","A3_Missions_F_EPB","A3_Missions_F_EPC","A3_Missions_F_Exp_A","A3_Missions_F_Heli","A3_Missions_F_Mark","A3_Missions_F_MP_Mark","A3_Modules_F_Bootcamp_Misc","A3_Modules_F_Curator_Chemlights","A3_Soft_F","A3_Soft_F_MRAP_01","A3_Soft_F_MRAP_02","A3_Soft_F_Offroad_01","A3_Soft_F_Quadbike","A3_Soft_F_MRAP_03","A3_Soft_F_Beta_Quadbike","A3_Soft_F_HEMTT","A3_Soft_F_TruckHeavy","A3_Soft_F_EPC_Truck_03","A3_Soft_F_Car","A3_Soft_F_Gamma_Offroad","A3_Soft_F_Gamma_Quadbike","A3_Soft_F_SUV","A3_Soft_F_Gamma_HEMTT","A3_Soft_F_Gamma_TruckHeavy","A3_Soft_F_Truck","A3_Soft_F_Heli_Car","A3_Soft_F_Heli_MRAP_01","A3_Soft_F_Heli_MRAP_02","A3_Soft_F_Heli_MRAP_03","A3_Soft_F_Heli_Quadbike","A3_Soft_F_Heli_SUV","A3_Soft_F_Heli_Truck","A3_Soft_F_Kart_Kart_01","A3_Static_F_Gamma_AA","A3_Static_F_Gamma_AT","A3_Structures_F_Mil_Scrapyard","A3_Structures_F_Wrecks","A3_Structures_F_EPA_Mil_Scrapyard","A3_Weapons_F_Bootcamp","A3_Weapons_F_Mark","A3_Weapons_F_Mark_LongRangeRifles_DMR_02","A3_Weapons_F_Mark_LongRangeRifles_DMR_03","A3_Weapons_F_Mark_LongRangeRifles_DMR_04","A3_Weapons_F_Mark_LongRangeRifles_DMR_05","A3_Weapons_F_Mark_LongRangeRifles_DMR_06","A3_Weapons_F_Mark_Machineguns_MMG_01","A3_Weapons_F_Mark_Machineguns_MMG_02","A3_epoch_language","A3_epoch_vehicles_1","A3_Air_F_EPC_Plane_Fighter_03","A3_Armor_F_AMV","A3_Armor_F_Marid","A3_Armor_F_EPC_MBT_01","A3_Armor_F_APC_Wheeled_03","A3_CargoPoses_F","A3_CargoPoses_F_Heli","A3_Soft_F_Crusher_UGV","A3_Soft_F_Bootcamp_Offroad_01","A3_Soft_F_Bootcamp_Quadbike","A3_Soft_F_Bootcamp_Truck","A3_Soft_F_Heli_Crusher_UGV","CUP_Core","CUP_StandaloneTerrains_Core","CUP_StandaloneTerrains_Core_Faction","CUP_StandaloneTerrains_Core_VehicleClass","CUP_Worlds","CUP_Worlds_Ambient","CUP_Worlds_Author","CUP_Worlds_Clutter","CUP_Worlds_ClutterDist","CUP_Worlds_Delete","CUP_Worlds_DisableInfiniteTerrain","CUP_Worlds_DustEffects","CUP_Worlds_EnvSounds","CUP_Worlds_FullDetailDist","CUP_Worlds_Grid","CUP_Worlds_Intros","CUP_Worlds_Lighting","CUP_Worlds_Lighting_Chernarus","CUP_Worlds_Lighting_Desert","CUP_Worlds_MapSize","CUP_Worlds_MidDetailTexture","CUP_Worlds_NoDetailDist","CUP_Worlds_PictureMap","CUP_Worlds_PictureShot","CUP_Worlds_Seabed","CUP_Worlds_SkyTexture","CUP_Worlds_StreetLamp","CUP_Worlds_Surfaces","CUP_Worlds_Water","A3_epoch_config","CUP_A1_EditorObjects","CUP_A2_EditorObjects","A3_epoch_code","A3_epoch_functions"]; -_skn_whitelist_cfgPatches = [_serverSettingsConfig, "antihack_whitelistedCfgPatches", _whitelistPatches] call EPOCH_fnc_returnConfigEntry; +_skn_check_files = [_serverSettingsConfig, "antihack_checkFilesNew", _checkFiles] call EPOCH_fnc_returnConfigEntry; + +_skn_whitelist_cfgPatches = [_serverSettingsConfig, "antihack_whitelistedCfgPatches", []] call EPOCH_fnc_returnConfigEntry; _skn_adminsOwner = [_serverSettingsConfig, "adminMenu_Owner", []] call EPOCH_fnc_returnConfigEntry; _skn_adminsHigh = [_serverSettingsConfig, "adminMenu_High", []] call EPOCH_fnc_returnConfigEntry; _skn_adminsLow = [_serverSettingsConfig, "adminMenu_Low", []] call EPOCH_fnc_returnConfigEntry; @@ -102,8 +100,8 @@ _skn_cfgPatchesCfg = [_serverSettingsConfig, "antihack_cfgPatchesMode", [2]] cal _skn_PVSPrefix = [_serverSettingsConfig, "antihack_PVSPrefix", "EPAH_"] call EPOCH_fnc_returnConfigEntry; // build array with X number of random strings -_rndVAR_Count = 84; // 85 = number of (_skn_rndVA deleteAt 0) -_skn_rndVA = call compile('epochserver' callExtension format['810|%1', _rndVAR_Count]); +_rndVAR_Count = 99; // 86 = number of (_skn_rndVA deleteAt 0) +_skn_rndVA = parseSimpleArray ('epochserver' callExtension format['810|%1', _rndVAR_Count]); EPOCH_hiveWhitelistVarsArray = []; @@ -140,9 +138,10 @@ EPOCH_server_setPToken = compileFinal ("private '_var';_var = 'epochserver' call if (!_skn_enableAntihack) exitWith { EPOCH_server_pushPlayer = compileFinal (" - _C_SET = _this select 2; + params ['_playerNetID','_playerUID','_C_SET','_fsmHandle','_player']; _C_SET pushBack ''; - ['_C_SET', _C_SET] remoteExec ['EPOCH_playerLoginInit',(_this select 0)];"); + [_fsmHandle,['_C_SET', _C_SET]] remoteExecCall ['setFSMVariable', _player]; + "); EPOCH_server_isPAdmin = compileFinal ("false"); EPOCH_server_Authed = compileFinal ("true"); EPOCH_server_disconnect = compileFinal("true"); @@ -161,7 +160,6 @@ _skn_AH_Ban = _skn_rndVA deleteAt 0; _skn_AH_rndVar = _skn_rndVA deleteAt 0; _skn_doKickBan = _skn_PVSPrefix + (_skn_rndVA deleteAt 0); -_skn_server_getRealTime = _skn_rndVA deleteAt 0; //ADMIN STUFF: //PVC from SERVER: _skn_pv_hackerLog = _skn_rndVA deleteAt 0; @@ -216,6 +214,9 @@ _skn_godMode = _skn_rndVA deleteAt 0; _skn_repairVehicle = _skn_rndVA deleteAt 0; _skn_spawnLoot = _skn_rndVA deleteAt 0; _skn_mapLootArray = _skn_rndVA deleteAt 0; +_skn_mapAnimalArray = _skn_rndVA deleteAt 0; +_skn_mapAIArray = _skn_rndVA deleteAt 0; +_skn_mapBasesArray = _skn_rndVA deleteAt 0; //ADMIN TOGGLE VARIABLES _skn_tg_Spec = _skn_rndVA deleteAt 0; @@ -235,8 +236,10 @@ _skn_tg_godMode = _skn_rndVA deleteAt 0; _skn_tg_map_player = _skn_rndVA deleteAt 0; _skn_tg_map_corpse = _skn_rndVA deleteAt 0; _skn_tg_map_loot = _skn_rndVA deleteAt 0; +_skn_tg_map_animals = _skn_rndVA deleteAt 0; _skn_tg_map_vehicle = _skn_rndVA deleteAt 0; _skn_tg_map_ai = _skn_rndVA deleteAt 0; +_skn_tg_map_trader = _skn_rndVA deleteAt 0; _skn_tg_map_basebuilding = _skn_rndVA deleteAt 0; _skn_t1 = _skn_rndVA deleteAt 0; @@ -377,7 +380,7 @@ for "_i" from 1 to 3 do { "; }; }; - if (["MAP-PLAYER","MAP-CORPSE","MAP-LOOT","MAP-VEHICLE","MAP-AI","MAP-BASEBUILDING"] call _stringInArray) then { + if (["MAP-PLAYER","MAP-CORPSE","MAP-LOOT","MAP-ANIMALS","MAP-VEHICLE","MAP-AI","MAP-BASEBUILDING"] call _stringInArray) then { _temp = _temp + ",['Map Tools', [],'','1',[]]"; if ("MAP-PLAYER" in _case) then { _temp = _temp + " @@ -391,7 +394,12 @@ for "_i" from 1 to 3 do { }; if ("MAP-LOOT" in _case) then { _temp = _temp + " - ,[' Loot Marker', [], {"+_skn_tg_map_loot+" = !"+_skn_tg_map_loot+"; if ("+_skn_tg_map_loot+") then {waitUntil {"+_skn_mapLootArray+" = nearestObjects[getPos player, ['WH_Loot', 'Animated_Loot'], 10000];uiSleep 10;!"+_skn_tg_map_loot+"};"+_skn_mapLootArray+" = []};['Loot MARKER',if ("+_skn_tg_map_loot+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] + ,[' Loot Marker', [], {"+_skn_tg_map_loot+" = !"+_skn_tg_map_loot+"; if ("+_skn_tg_map_loot+") then {waitUntil {"+_skn_mapLootArray+" = nearestObjects[player,['WH_Loot', 'Animated_Loot'], 12500];uiSleep 10;!"+_skn_tg_map_loot+"};"+_skn_mapLootArray+" = []};['Loot MARKER',if ("+_skn_tg_map_loot+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] + "; + }; + if ("MAP-ANIMALS" in _case) then { + _temp = _temp + " + ,[' Animal Marker', [], {"+_skn_tg_map_animals+" = !"+_skn_tg_map_animals+"; if ("+_skn_tg_map_animals+") then {waitUntil {"+_skn_mapAnimalArray+" = nearestObjects[player, ['Sheep_random_EPOCH','Goat_random_EPOCH','Snake_random_EPOCH','Snake2_random_EPOCH','Hen_random_EPOCH','Cock_random_EPOCH','Fin_random_EPOCH','Alsatian_random_EPOCH','Rabbit_EPOCH'], 12500];uiSleep 10;!"+_skn_tg_map_animals+"};"+_skn_mapAnimalArray+" = []};['Animal MARKER',if ("+_skn_tg_map_animals+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] "; }; if ("MAP-VEHICLE" in _case) then { @@ -401,12 +409,17 @@ for "_i" from 1 to 3 do { }; if ("MAP-AI" in _case) then { _temp = _temp + " - ,[' AI Marker', [], {"+_skn_tg_map_ai+" = !"+_skn_tg_map_ai+"; ['AI MARKER',if ("+_skn_tg_map_ai+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] + ,[' AI Marker', [], {"+_skn_tg_map_ai+" = !"+_skn_tg_map_ai+"; if ("+_skn_tg_map_ai+") then {waitUntil {"+_skn_mapAIArray+" = nearestObjects[player, ['I_Soldier_EPOCH','I_Soldier1_EPOCH','I_Soldier2_EPOCH','I_Soldier3_EPOCH','O_recon_F'], 12500];uiSleep 10;!"+_skn_tg_map_ai+"};"+_skn_mapAIArray+" = []}; ['AI MARKER',if ("+_skn_tg_map_ai+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] + "; + }; + if ("MAP-TRADER" in _case) then { + _temp = _temp + " + ,[' Trader Marker', [], {"+_skn_tg_map_trader+" = !"+_skn_tg_map_trader+"; ['Trader MARKER',if ("+_skn_tg_map_trader+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] "; }; if ("MAP-BASEBUILDING" in _case) then { _temp = _temp + " - ,[' Base Building Marker (WIP)', [], {"+_skn_tg_map_basebuilding+" = !"+_skn_tg_map_basebuilding+"; ['Base Building MARKER',if ("+_skn_tg_map_basebuilding+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] + ,[' Base Building Marker', [], {"+_skn_tg_map_basebuilding+" = !"+_skn_tg_map_basebuilding+"; if ("+_skn_tg_map_basebuilding+") then {waitUntil {"+_skn_mapBasesArray+" = ([worldSize/2,worldSize/2,0]) nearObjects['PlotPole_EPOCH', 12500];uiSleep 15;!"+_skn_tg_map_basebuilding+"};"+_skn_mapBasesArray+" = []}; ['Base Building MARKER',if ("+_skn_tg_map_basebuilding+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] "; }; }; @@ -516,16 +529,16 @@ if (_skn_PVSPrefix == "") then { }; EPOCH_server_pushPlayer = compileFinal (" - _C_SET = _this select 2; - if (_this select 1 in "+ str _skn_adminUIDArray+") then { - (_this select 0) publicVariableClient '"+_skn_Admin_Code+"'; - (_this select 0) publicVariableClient '"+_skn_pv_adminLog+"'; - (_this select 0) publicVariableClient '"+_skn_pv_hackerLog+"'; + params ['_playerNetID','_playerUID','_C_SET','_fsmHandle','_player']; + if (_playerUID in "+ str _skn_adminUIDArray+") then { + _playerNetID publicVariableClient '"+_skn_Admin_Code+"'; + _playerNetID publicVariableClient '"+_skn_pv_adminLog+"'; + _playerNetID publicVariableClient '"+_skn_pv_hackerLog+"'; _C_SET pushBack '[] spawn "+_skn_Admin_Init+"'; } else { _C_SET pushBack '[] spawn "+_skn_AH_Init+"'; }; - ['_C_SET', _C_SET] remoteExec ['EPOCH_playerLoginInit',(_this select 0)]; + [_fsmHandle,['_C_SET', _C_SET]] remoteExecCall ['setFSMVariable', _player]; true "); EPOCH_server_isPAdmin = compileFinal ("if (isNull _this) then {false} else {getPlayerUID _this in "+str _skn_adminUIDArray+"}"); @@ -535,11 +548,12 @@ _sknBanANDSleepQuick = _skn_AH_Ban+"; uiSleep 1"; // CfgPatches Check _sknPatches = []; -"_sknPatches pushBack (configName _x)" configClasses (configFile >> "CfgPatches"); +"_sknPatches pushBack (configName _x); true" configClasses (configFile >> "CfgPatches"); {_sknPatches pushBackUnique _x}forEach _skn_whitelist_cfgPatches; _skn_addonCheckCode = if (_skn_check_addons) then {"[] spawn{_config = '!(configName _x in "+str _sknPatches+")' configClasses (configFile >> 'CfgPatches');if !(_config isEqualTo []) then {[format['Disallowed Addon %1',_config],["+str (_skn_cfgPatchesCfg select 0)+",0]] call "+_skn_AH_Ban+"}};"} else {""}; _skn_fileCheckCode = if (_skn_check_files isEqualTo []) then {""} else {"{if (str(compile preprocessFileLineNumbers (_x select 0)) != str(missionNamespace getVariable [_x select 1,'']))exitWith{[format['Modified File %1 (%2/%3)',_x select 1,count toArray str (compile preprocessFileLineNumbers (_x select 0)),count toArray str(missionNamespace getVariable [_x select 1,''])],0] call "+_skn_AH_Ban+"}} forEach "+str _skn_check_files+";"}; +// Addaction Checks _sknAddActionCheck = if ([_serverSettingsConfig, "antihack_addActionCheck", true] call EPOCH_fnc_returnConfigEntry) then{ " if (player == _ActionVehicle) then[{_ActionCount = _ActionCount + 1}, { _ActionVehicle = player; _ActionCount = 0 }]; _addCase = player addAction['', '', [], -5, false, true, '', 'false']; @@ -549,16 +563,46 @@ if (_addCase != _ActionCount) then{ }; "} else {""}; +// Anti teleport checks +_antiTeleportCheck = if ([_serverSettingsConfig, "antihack_antiTeleportCheck", true] call EPOCH_fnc_returnConfigEntry) then{" +_cntBan = 0; +while {true} do { + _lastTime = diag_tickTime; + _lastPos = getPosATL vehicle player; + _notNearbySpawn = _lastPos distance "+str _skn_spawnPointCenter+" > "+str _centerDistance+"; + while {alive player} do { + _curTime = diag_tickTime; + _curPos = getPosATL vehicle player; + _distance = _lastPos distance _curPos; -call compile (_skn_server_getRealTime+" = { - _time = call compile ('epochserver' callExtension '510'); - _hour = _time select 3; - _min = _time select 4; - if (_min < 10) then {_min = '0'+str _min}; - if (_hour < 10) then {_hour = '0'+str _hour}; - format ['%1:%2',_hour,_min] -};"); + if ((_curTime-_lastTime) > 1 || _distance > "+str _maxTravelDistance+") then { + if (((_distance/(_curTime-_lastTime)) > "+str _maxTravelDistance+") && _notNearbySpawn && (player == vehicle player)) then { + if (isNil '"+_skn_antiTeleportPVC+"') then { + [format['[TEST] TP from %1 to %2, %3 meters, now at %4', _lastPos, _curPos, round _distance, getPosATL player],1] call "+_sknBanANDSleep+"; + vehicle player setPosATL _lastPos; + _cntBan = _cntBan + 1; + if (_cntBan > 4) then { + }; + } else { + uiSleep 10; + _lastPos = getPosATL vehicle player; + _lastTime = diag_tickTime; + _notNearbySpawn = false; + }; + } else { + _lastPos = _curPos; + _lastTime = _curTime; + _notNearbySpawn = _lastPos distance "+str _skn_spawnPointCenter+" > "+str _centerDistance+"; + }; + }; + }; + uiSleep 0.1; +}; +uiSleep 0.25; +"} else {""}; + +// Init Server Side Event Handlers //[_data,_player,_token]; call compile("'"+_skn_doTokenAuth+"' addPublicVariableEventHandler { _array = _this select 1; @@ -617,7 +661,7 @@ call compile ("'"+_skn_doKickBan+"' addPublicVariableEventHandler { ['kick', _player , format['"+_epoch_kickReason+" %1',_reason]] call EPOCH_serverCommand; }; }; - "+_skn_pv_hackerLog+" pushBack[[_logMode, call "+_skn_server_getRealTime+", name _player, getPlayerUID _player, _text], _logColor]; + "+_skn_pv_hackerLog+" pushBack[[_logMode, call EPOCH_server_getRealTime, name _player, getPlayerUID _player, _text], _logColor]; [_logName, format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog; diag_log str([_logName, format['%1 (%2): %3', name _player, getPlayerUID _player, _text]]); { @@ -859,43 +903,7 @@ _skn_code_antihack = compileFinal (" }; }; _t = _t + '"+_skn_t3+"'; - [] spawn { - _cntBan = 0; - while {true} do { - _lastTime = diag_tickTime; - _lastPos = getPosATL vehicle player; - _notNearbySpawn = _lastPos distance "+str _skn_spawnPointCenter+" > "+str _centerDistance+"; - while {alive player} do { - _curTime = diag_tickTime; - _curPos = getPosATL vehicle player; - _distance = _lastPos distance _curPos; - - if ((_curTime-_lastTime) > 1 || _distance > "+str _maxTravelDistance+") then { - if (((_distance/(_curTime-_lastTime)) > "+str _maxTravelDistance+") && _notNearbySpawn && (player == vehicle player)) then { - if (isNil '"+_skn_antiTeleportPVC+"') then { - [format['[TEST] TP from %1 to %2, %3 meters, now at %4', _lastPos, _curPos, round _distance, getPosATL player],1] call "+_sknBanANDSleep+"; - vehicle player setPosATL _lastPos; - _cntBan = _cntBan + 1; - if (_cntBan > 4) then { - - }; - } else { - uiSleep 10; - _lastPos = getPosATL vehicle player; - _lastTime = diag_tickTime; - _notNearbySpawn = false; - }; - } else { - _lastPos = _curPos; - _lastTime = _curTime; - _notNearbySpawn = _lastPos distance "+str _skn_spawnPointCenter+" > "+str _centerDistance+"; - }; - }; - }; - uiSleep 0.1; - }; - uiSleep 0.25; - }; + [] spawn {"+_antiTeleportCheck+"}; _t = _t + '"+_skn_t4+"'; [] spawn { uiNamespace setVariable['ESP_mainMap', nil]; @@ -961,7 +969,7 @@ call compile (" _adminNAME = "+str _skn_adminNAMEArray+" select ("+str _skn_adminUIDArray+" find _adminUID); ['aml', format['%1 (%2): [%4] %3',_adminNAME,_adminUID,_this select 0,_toggle]] call EPOCH_fnc_server_hiveLog; - "+_skn_pv_adminLog+" pushBack [call "+_skn_server_getRealTime+",_adminNAME,_toggle,_this select 0]; + "+_skn_pv_adminLog+" pushBack [call EPOCH_server_getRealTime,_adminNAME,_toggle,_this select 0]; diag_log format ['SKN2 AdminRequest %1',"+_skn_pv_adminLog+"]; { if (_x call EPOCH_server_isPAdmin) then { @@ -1132,6 +1140,7 @@ call compile ("'"+_skn_doAdminRequest+"' addPublicVariableEventHandler { _serverSettingsConfig = configFile >> 'CfgEpochServer'; _removeweapons = [_serverSettingsConfig, 'removevehweapons', []] call EPOCH_fnc_returnConfigEntry; _removemagazinesturret = [_serverSettingsConfig, 'removevehmagazinesturret', []] call EPOCH_fnc_returnConfigEntry; + _disableVehicleTIE = [_serverSettingsConfig, 'disableVehicleTIE', true] call EPOCH_fnc_returnConfigEntry; _position = getPosATL _target; _slot = EPOCH_VehicleSlots select 0; @@ -1143,7 +1152,9 @@ call compile ("'"+_skn_doAdminRequest+"' addPublicVariableEventHandler { _vehObj call EPOCH_server_setVToken; addToRemainsCollector[_vehObj]; - _vehObj disableTIEquipment true; + if (_disableVehicleTIE) then { + _vehObj disableTIEquipment true; + }; clearWeaponCargoGlobal _vehObj; clearMagazineCargoGlobal _vehObj; @@ -1230,7 +1241,7 @@ call compile ("'"+_skn_doAdminRequest+"' addPublicVariableEventHandler { };"); _skn_admincode = compileFinal (" - comment 'Epoch Mod Antihack - Niklas Wagner - www.skaronator.com - Aaron Clark - www.epochmod.com - License: (CC) Attribution-NonCommercial-NoDerivatives 4.0 International'; + waitUntil {(getPlayerUID player) != ''}; "+_skn_tg_sortOrder+" = 'Range'; "+_skn_tg_toggle+" = []; @@ -1248,9 +1259,14 @@ _skn_admincode = compileFinal (" "+_skn_tg_map_corpse+" = false; "+_skn_tg_map_loot+" = false; "+_skn_mapLootArray+" = []; + "+_skn_tg_map_animals+" = false; + "+_skn_mapAnimalArray+" = []; "+_skn_tg_map_vehicle+" = false; "+_skn_tg_map_ai+" = false; + "+_skn_mapAIArray+" = []; + "+_skn_tg_map_trader+" = false; "+_skn_tg_map_basebuilding+" = false; + "+_skn_mapBasesArray+" = []; uiNamespace setVariable['ESP_mainMap', findDisplay 12 displayCtrl 51]; uiNamespace setVariable['ESP_adminMap', findDisplay -1337 displayCtrl 7]; @@ -1282,7 +1298,7 @@ _skn_admincode = compileFinal (" getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _color, visiblePosition _x, _size, _size, getDir _x, typeOf _x ]; }; - }forEach (allPlayers select {!alive _x}); + }forEach allDeadMen; }; if ("+_skn_tg_map_loot+") then { { @@ -1299,8 +1315,8 @@ _skn_admincode = compileFinal (" }; }forEach "+_skn_mapLootArray+"; }; - if ("+_skn_tg_map_vehicle+") then { - _size = (1/ctrlMapScale _display) max 20; + if ("+_skn_tg_map_animals+") then { + _size = (0.5/ctrlMapScale _display) max 20; { if (alive _x) then { _display drawIcon [ @@ -1308,20 +1324,53 @@ _skn_admincode = compileFinal (" getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'displayName') ]; }; + }forEach "+_skn_mapAnimalArray+"; + }; + if ("+_skn_tg_map_vehicle+") then { + _size = (1/ctrlMapScale _display) max 20; + { + if((_x isKindOf 'LandVehicle') || (_x isKindOf 'Ship') || (_x isKindOf 'Air') || (_x isKindOf 'Tank'))then{ + if (alive _x) then { + _display drawIcon [ + getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x, + getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'displayName') + ]; + }; + }; }forEach vehicles; }; if ("+_skn_tg_map_ai+") then { + _size = (0.5/ctrlMapScale _display) max 20; + { + if (alive _x) then { + _display drawIcon [ + getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x, + getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'displayName') + ]; + }; + }forEach "+_skn_mapAIArray+"; + }; + if ("+_skn_tg_map_trader+") then { _size = (0.5/ctrlMapScale _display) max 20; { _agent = agent _x; - _display drawIcon [ - getText (configFile >> 'CfgVehicles' >> typeOf _agent >> 'Icon'), _agent call _getDmgColor, visiblePosition _agent, _size, _size, getDir _agent, - getText (configFile >> 'CfgVehicles' >> typeOf _agent >> 'displayName') - ]; + _typeOf = typeOf _agent; + if!(_typeOf in ['Sheep_random_EPOCH','Goat_random_EPOCH','Snake_random_EPOCH','Snake2_random_EPOCH','Hen_random_EPOCH','Cock_random_EPOCH','Fin_random_EPOCH','Alsatian_random_EPOCH','Rabbit_EPOCH'])then{ + _display drawIcon [ + getText (configFile >> 'CfgVehicles' >> _typeOf >> 'Icon'), _agent call _getDmgColor, visiblePosition _agent, _size, _size, getDir _agent, + getText (configFile >> 'CfgVehicles' >> _typeOf >> 'displayName') + ]; + }; }forEach agents; }; if ("+_skn_tg_map_basebuilding+") then { - + _size = (1/ctrlMapScale _display) max 20; + { + _display drawIcon [ + getText (configFile >> 'CfgVehicles' >> 'PlotPole_Epoch' >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x, + str(_x getVariable ['BUILD_OWNER', _owner])+' '+(getText (configFile >> 'CfgVehicles' >> 'PlotPole_Epoch' >> 'displayName')) + ]; + }forEach "+_skn_mapBasesArray+"; }; if ("+_skn_tg_old_espMap+") then { { @@ -1430,20 +1479,16 @@ _skn_admincode = compileFinal (" "+_skn_tg_godMode+" = !"+_skn_tg_godMode+"; if ("+_skn_tg_godMode+") then { ['God Mode',2] call "+_skn_adminLog_PVC+"; - player setVariable ['EPOCH_gm_enabled',true,true]; + EPOCH_GMODE = true; waitUntil { player setBleedingRemaining 0; player setOxygenRemaining 1; player allowDamage false; - { - missionNamespace setVariable[format['EPOCH_player%1', _x], EPOCH_defaultVars select(EPOCH_customVars find _x)] - } forEach['Temp','Hunger','Thirst','Toxicity','Stamina','HitPoints','BloodP']; - EPOCH_playerEnergy = EPOCH_playerEnergyMax; uiSleep 0.25; !"+_skn_tg_godMode+" }; player allowDamage true; - player setVariable ['EPOCH_gm_enabled',false,true]; + EPOCH_GMODE = nil; } else { ['God Mode',1] call "+_skn_adminLog_PVC+"; } @@ -1475,7 +1520,7 @@ _skn_admincode = compileFinal (" _masterConfig = 'CfgBuildingLootPos' call EPOCH_returnConfig; _lootClasses = []; _lootClassesIgnore = ['Default']; - '_cN = configName _x;if !(_cN in _lootClassesIgnore)then{_lootClasses pushBack _cN};' configClasses _masterConfig; + '_cN = configName _x;if !(_cN in _lootClassesIgnore)then{_lootClasses pushBack _cN}; true' configClasses _masterConfig; _cntBuildings = 0; { if (_x call EPOCH_spawnLoot) then { @@ -1767,216 +1812,160 @@ _skn_admincode = compileFinal (" _button = _this call "+_skn_getCtrl+"; _button ctrlSetTextColor [1, 0, 0, 1]; {_x call "+_skn_getCtrl+" ctrlSetTextColor [1, 1, 1, 1]}forEach([61,62,63,64,65,66,67,68,69,70,71]-[_this]); + _cfgPricing = 'CfgPricing' call EPOCH_returnConfig; if (_this == 61) then { _airVehicles = "" - getText(_x >> 'displayName') != '' && - getText(_x >> 'picture') != '' && - getNumber(_x >> 'type') != 0 && - getText (_x >> 'vehicleClass') in ['Air'] + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'type') != 0 && + getText (_x >> 'vehicleClass') in ['Air'] && + isClass(_cfgPricing >> configName _x) ""configClasses (configFile >> 'CfgVehicles'); { - _config = 'CfgPricing' call EPOCH_returnConfig; - if (isClass(_config >> configName _x)) then{ - _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; - _ctrl lbSetData[_index, str[configName _x, 6, 0]]; - _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; - }; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, 6, 0]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _airVehicles; }; if (_this == 62) then { _landVehicles = "" - getText(_x >> 'displayName') != '' && - getText(_x >> 'picture') != '' && - configName _x != 'PaperCar' && - getText (_x >> 'vehicleClass') in ['Car'] + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + configName _x != 'PaperCar' && + getText (_x >> 'vehicleClass') in ['Car'] && + isClass(_cfgPricing >> configName _x) ""configClasses (configFile >> 'CfgVehicles'); { - _config = 'CfgPricing' call EPOCH_returnConfig; - if (isClass(_config >> configName _x)) then{ - _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; - _ctrl lbSetData[_index, str[configName _x, 6, 1]]; - _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; - }; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, 6, 1]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _landVehicles; }; if (_this == 63) then { _shipVehicles = "" - getText(_x >> 'displayName') != '' && - getText(_x >> 'picture') != '' && - getNumber(_x >> 'type') in [1,2,3,4] && - getText (_x >> 'vehicleClass') in ['Ship'] + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'type') in [1,2,3,4] && + getText (_x >> 'vehicleClass') in ['Ship'] && + isClass(_cfgPricing >> configName _x) ""configClasses (configFile >> 'CfgVehicles'); { - _config = 'CfgPricing' call EPOCH_returnConfig; - if (isClass(_config >> configName _x)) then{ - _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; - _ctrl lbSetData[_index, str[configName _x, 6, 2]]; - _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; - }; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, 6, 2]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _shipVehicles; }; if (_this == 64) then { _weapons = "" - getText(_x >> 'displayName') != '' && - getText(_x >> 'picture') != '' && - getNumber(_x >> 'scope') in [0,2] && - getNumber(_x >> 'type') in [1,2,4] + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'scope') in [1,2] && + getNumber(_x >> 'type') in [1,2,4] && + isClass(_cfgPricing >> configName _x) ""configClasses (configFile >> 'CfgWeapons'); { - _config = 'CfgPricing' call EPOCH_returnConfig; - if (isClass(_config >> configName _x)) then{ - _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; - _type = getNumber(_x >> 'type') - 1; - if (getNumber(_x >> 'type') == 4) then { _type = 2 }; - _ctrl lbSetData[_index, str[configName _x, _type, _type + 3]]; - _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; - }; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _type = getNumber(_x >> 'type') - 1; + if (getNumber(_x >> 'type') == 4) then { _type = 2 }; + _ctrl lbSetData[_index, str[configName _x, _type, _type + 3]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _weapons; }; if (_this == 65) then { _magazines = "" - getText(_x >> 'displayName') != '' && - getText(_x >> 'picture') != '' && - getNumber(_x >> 'scope') in [0,2] && - getText(_x >> 'ammo') != '' + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'scope') in [1,2] && + getText(_x >> 'ammo') != '' && + isClass(_cfgPricing >> configName _x) ""configClasses (configFile >> 'CfgMagazines'); { - _config = 'CfgPricing' call EPOCH_returnConfig; - if (isClass(_config >> configName _x)) then{ - _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; - _ctrl lbSetData[_index, str[configName _x, -1, 6]]; - _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; - }; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, -1, 6]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _magazines; }; if (_this == 66) then { _magazines = "" - getText(_x >> 'displayName') != '' && - getText(_x >> 'picture') != '' && - getNumber(_x >> 'scope') in[0, 2] && - getText(_x >> 'ammo') == '' + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'scope') in [1,2] && + getText(_x >> 'ammo') == '' && + isClass(_cfgPricing >> configName _x) ""configClasses(configFile >> 'CfgMagazines'); { - _config = 'CfgPricing' call EPOCH_returnConfig; - if (isClass(_config >> configName _x)) then{ - _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; - _ctrl lbSetData[_index, str[configName _x, -1, 7]]; - _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; - }; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, -1, 7]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _magazines; }; if (_this == 67) then { - - _backpack = ""getText(_x >> 'displayName') != '' && getText(_x >> 'picture') != '' && getNumber(_x >> 'isbackpack') == 1""configClasses(configFile >> 'CfgVehicles'); + _backpack = "" + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'isbackpack') == 1 && + isClass(_cfgPricing >> configName _x) + ""configClasses(configFile >> 'CfgVehicles'); { - _config = 'CfgPricing' call EPOCH_returnConfig; - if (isClass(_config >> configName _x)) then{ - _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; - _ctrl lbSetData[_index, str[configName _x, 3, 8]]; - _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; - }; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, 3, 8]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _backpack; }; if (_this == 68) then { - _uniforms = ['U_O_FullGhillie_lsh', - 'U_O_FullGhillie_sard', - 'U_O_FullGhillie_ard', - 'U_O_CombatUniform_ocamo', - 'U_O_GhillieSuit', - 'U_O_PilotCoveralls', - 'U_O_Wetsuit', - 'U_OG_Guerilla1_1', - 'U_OG_Guerilla2_1', - 'U_OG_Guerilla2_2', - 'U_OG_Guerilla2_3', - 'U_OG_Guerilla3_1', - 'U_OG_Guerilla3_2', - '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', - 'U_Wetsuit_uniform', - 'U_Wetsuit_White', - 'U_Wetsuit_Blue', - 'U_Wetsuit_Purp', - 'U_Wetsuit_Camo', - 'U_CamoRed_uniform', - 'U_CamoAloha_uniform', - 'U_CamoBiker_uniform', - 'U_CamoBubblegum_uniform', - 'U_CamoLumberjack_uniform', - 'U_CamoOutback_uniform', - 'U_CamoPink_uniform', - 'U_CamoPinkPolka_uniform', - 'U_CamoBrn_uniform', - 'U_CamoBlue_uniform', - 'U_Camo_uniform', - 'U_ghillie1_uniform', - 'U_ghillie2_uniform', - 'U_ghillie3_uniform', - 'U_C_Driver_1', - 'U_C_Driver_2', - 'U_C_Driver_3', - 'U_C_Driver_4', - 'U_C_Driver_1_black', - 'U_C_Driver_1_blue', - 'U_C_Driver_1_green', - 'U_C_Driver_1_red', - 'U_C_Driver_1_white', - 'U_C_Driver_1_yellow', - 'U_C_Driver_1_orange', - 'U_C_Driver_1_red']; - + _uniforms = "" + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'scope') in [1,2] && + getNumber(_x >> 'ItemInfo' >> 'type') in [801] && + isClass(_cfgPricing >> configName _x) + ""configClasses(configFile >> 'CfgWeapons'); { - _index = _ctrl lbAdd format['%1', getText(configFile >> 'CfgWeapons' >> _x >> 'displayName')]; - _ctrl lbSetData[_index, str[_x, -1, 9]]; - _ctrl lbSetPicture[_index, getText(configFile >> 'CfgWeapons' >> _x >> 'picture')]; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, -1, 9]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _uniforms; }; if (_this == 69) then { - _optics = ['optic_Arco', 'optic_Hamr', 'optic_Aco', 'optic_ACO_grn', 'optic_Aco_smg', 'optic_ACO_grn_smg', 'optic_Holosight', 'optic_Holosight_smg', 'optic_SOS', 'optic_MRCO', 'optic_DMS', 'optic_Yorris', 'optic_MRD', 'optic_LRPS', 'optic_NVS', 'optic_tws', 'optic_tws_mg']; - _muzzles = ['muzzle_snds_H','muzzle_snds_L','muzzle_snds_M','muzzle_snds_B','muzzle_snds_H_MG','muzzle_snds_acp','Heal_EPOCH','Defib_EPOCH','Repair_EPOCH','acc_flashlight','acc_pointer_IR']; - _misc = ['Binocular','NVG_EPOCH','ItemCompass','ItemGPS','ItemMap','EpochRadio0','EpochRadio1','EpochRadio2','EpochRadio3','EpochRadio4','EpochRadio5','EpochRadio6','EpochRadio7','EpochRadio8','EpochRadio9','ItemWatch']; - _attachments = _optics + _muzzles + _misc; + _attachments = "" + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'scope') in [1,2] && + ((configName _x) call BIS_fnc_itemType) select 0 in ['Item'] && + isClass(_cfgPricing >> configName _x) + ""configClasses(configFile >> 'CfgWeapons'); { - _config = 'CfgPricing' call EPOCH_returnConfig; - if (isClass(_config >> _x)) then{ - _index = _ctrl lbAdd format['%1', getText(configFile >> 'CfgWeapons' >> _x >> 'displayName')]; - _ctrl lbSetData[_index, str[_x, -1, 9]]; - _ctrl lbSetPicture[_index, getText(configFile >> 'CfgWeapons' >> _x >> 'picture')]; - }; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, -1, 9]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _attachments; }; if (_this == 70) then { - _headgear = ['wolf_mask_epoch','pkin_mask_epoch','clown_mask_epoch']; - for '_h' from 1 to 104 do + _headgear = "" + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'scope') in [1,2] && + ((configName _x) call BIS_fnc_itemType) select 1 in ['Headgear'] && + isClass(_cfgPricing >> configName _x) + ""configClasses(configFile >> 'CfgWeapons'); { - _headgear pushBack format['H_%1_EPOCH',_h]; - }; - { - _index = _ctrl lbAdd format['%1', getText(configFile >> 'cfgWeapons' >> _x >> 'displayName')]; - _ctrl lbSetData[_index, str[_x, -1, 9]]; - _ctrl lbSetPicture[_index, getText(configFile >> 'cfgWeapons' >> _x >> 'picture')]; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, -1, 9]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _headgear; }; if (_this == 71) then { - _vests = []; - for '_v' from 1 to 40 do + _vests = "" + getText(_x >> 'displayName') != '' && + getText(_x >> 'picture') != '' && + getNumber(_x >> 'scope') in [1,2] && + ((configName _x) call BIS_fnc_itemType) select 1 in ['Vest'] && + isClass(_cfgPricing >> configName _x) + ""configClasses(configFile >> 'CfgWeapons'); { - _vests pushBack format['V_%1_EPOCH', _v]; - }; - { - _index = _ctrl lbAdd format['%1', getText(configFile >> 'cfgWeapons' >> _x >> 'displayName')]; - _ctrl lbSetData[_index, str[_x, -1, 9]]; - _ctrl lbSetPicture[_index, getText(configFile >> 'cfgWeapons' >> _x >> 'picture')]; + _index = _ctrl lbAdd format['%1', getText(_x >> 'displayName')]; + _ctrl lbSetData[_index, str[configName _x, -1, 9]]; + _ctrl lbSetPicture[_index, getText(_x >> 'picture')]; }forEach _vests; }; }; diff --git a/Sources/epoch_server/init/server_variables.sqf b/Sources/epoch_server/init/server_variables.sqf index 8ee3e104..e9fb4965 100644 --- a/Sources/epoch_server/init/server_variables.sqf +++ b/Sources/epoch_server/init/server_variables.sqf @@ -36,12 +36,11 @@ private _configArray = [ ["lootMultiplier", 0.5], ["WeatherStaticForecast", []], ["showEarthQuakes", true], + ["showSatellites", true], ["showShippingContainers", true], ["cloneCost", 100], ["vehicleLockTime", 1800], - ["antagonistChanceTrash", 0.09], ["antagonistChancePDeath", 0.33], - ["antagonistChanceLoot", 0.09], ["taxRate", 0.1], ["starterTraderItems", [[], []]], ["SHOW_TRADERS", true], @@ -54,6 +53,7 @@ private _configArray = [ ["expiresBank", "7776000"], ["expiresVehicle", "604800"], ["expiresAIdata", "604800"], + ["expiresCommunityStats", "7776000"], ["hiveAdminCmdExec", false], ["hiveAdminSavePlayerList", true], ["hiveAdminCmdTime", 5], diff --git a/Sources/epoch_server/system/Trader_brain.fsm b/Sources/epoch_server/system/Trader_brain.fsm index c435380c..9d8d3942 100644 --- a/Sources/epoch_server/system/Trader_brain.fsm +++ b/Sources/epoch_server/system/Trader_brain.fsm @@ -1,4 +1,4 @@ -/*%FSM*/ +/*%FSM*/ /*%FSM*/ /* item0[] = {"trader",0,250,-200.000000,-275.000000,-100.000000,-225.000000,0.000000,"trader"}; @@ -72,488 +72,513 @@ link37[] = {26,7}; link38[] = {27,28}; link39[] = {28,1}; link40[] = {29,7}; -globals[] = {25.000000,1,0,0,16777215,640,480,1,92,6316128,1,-256.926910,577.747742,523.678101,-359.150879,832,880,1}; -window[] = {2,-1,-1,-1,-1,603,1758,2783,78,3,850}; +globals[] = {0.000000,0,0,0,0,640,480,1,92,6316128,1,-256.926910,577.747742,523.678101,-359.150879,828,844,1}; +window[] = {2,-1,-1,-32000,-32000,557,1952,2977,32,3,850}; *//*%FSM*/ class FSM { - fsmName = "traders"; - class States - { - /*%FSM*/ - class trader - { - name = "trader"; - init = /*%FSM*/"_trader = _this select 0;" \n - "_home = _this select 1;" \n - "_work = _this select 2 select 0;" \n - "_schedule = _this select 2 select 1;" \n - "_trgt = objNull;" \n - "" \n - "_trader disableAI ""FSM"";" \n - "_trader disableAI ""TARGET"";" \n - "_trader disableAI ""AUTOTARGET"";" \n - "_trader setBehaviour ""CARELESS"";" \n - "_trader setCombatMode ""BLUE"";" \n - "" \n - "_traderNames=[""Aaron"",""Kenneth"",""Paul"",""Darren"",""Damian"",""Niklas"",""Andrew"",""Nigel"",""Harry"",""Phil"",""Antony"",""Dave"",""Hammish"",""Richard"",""Peter"",""Conor""];" \n - "_traderName = selectRandom _traderNames;" \n - "" \n - "_trgtArray = [""Epoch_Man_base_F"",""Epoch_Female_base_F""];" \n - "_tRange = 20;//Travel Range - Pause if players within range when travelling home" \n - "_sRange = 10;//Serve Range - Look at players within this distance" \n - "_maxTravelTime = 480;//Max time before process times out and continues, after moving. moveToCompleted will timeout before this." \n - "_atWork = false;" \n - "_atHome = true;" \n - "_lastDir = getDir _trader;" \n - "_l = diag_tickTime;" \n - "" \n - "" \n - "" \n - "" \n - "" \n - ""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class _ + fsmName = "traders"; + class States { - priority = 5.000000; - to="reset_vars"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/""/*%FSM*/; - action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + /*%FSM*/ + class trader + { + name = "trader"; + itemno = 0; + init = /*%FSM*/"_trader = _this select 0;" \n + "_home = _this select 1;" \n + "_work = _this select 2 select 0;" \n + "_schedule = _this select 2 select 1;" \n + "_trgt = objNull;" \n + "" \n + "_trader disableAI ""FSM"";" \n + "_trader disableAI ""TARGET"";" \n + "_trader disableAI ""AUTOTARGET"";" \n + "_trader setBehaviour ""CARELESS"";" \n + "_trader setCombatMode ""BLUE"";" \n + "" \n + "_traderNames=[""Aaron"",""Kenneth"",""Paul"",""Darren"",""Damian"",""Niklas"",""Andrew"",""Nigel"",""Harry"",""Phil"",""Antony"",""Dave"",""Hammish"",""Richard"",""Peter"",""Conor""];" \n + "_traderName = selectRandom _traderNames;" \n + "" \n + "_trgtArray = [""Epoch_Man_base_F"",""Epoch_Female_base_F""];" \n + "_tRange = 20;//Travel Range - Pause if players within range when travelling home" \n + "_sRange = 10;//Serve Range - Look at players within this distance" \n + "_maxTravelTime = 480;//Max time before process times out and continues, after moving. moveToCompleted will timeout before this." \n + "_atWork = false;" \n + "_atHome = true;" \n + "_lastDir = getDir _trader;" \n + "_l = diag_tickTime;" \n + "" \n + "" \n + "" \n + "" \n + "" \n + ""/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class _ + { + itemno = 29; + priority = 5.000000; + to="reset_vars"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class decision + { + name = "decision"; + itemno = 2; + init = /*%FSM*/""/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class decision_made + { + itemno = 3; + priority = 100.000000; + to="action"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_decisionMade;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class dispose + { + itemno = 6; + priority = 90.000000; + to="decision"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!(alive _trader)"/*%FSM*/; + action=/*%FSM*/"_doDispose = true;" \n + "_decisionMade = true;"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class no_decisiion + { + itemno = 26; + priority = 85.000000; + to="reset_vars"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_decisionMade && diag_tickTime - _t > 3;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class look_at + { + itemno = 23; + priority = 80.000000; + to="decision"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"count _nrPlyrs >0 && diag_tickTime - _l > 3;"/*%FSM*/; + action=/*%FSM*/"_servePlyr = true;" \n + "_decisionMade = true;" \n + "_trgt = _nrPlyrs select 0;"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class go_work + { + itemno = 17; + priority = 70.000000; + to="decision"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(!_atWork) && (_daytime > (_schedule select 0) && _daytime < (_schedule select 1));"/*%FSM*/; + action=/*%FSM*/"_goWork = true;" \n + "_decisionMade = true;"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class go_home + { + itemno = 18; + priority = 60.000000; + to="decision"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(!_atHome) && (!(_daytime > (_schedule select 0) && _daytime < (_schedule select 1)));"/*%FSM*/; + action=/*%FSM*/"_goHome = true;" \n + "_decisionMade = true;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class action + { + name = "action"; + itemno = 4; + init = /*%FSM*/"_nrPlyrs = _trader nearEntities [_trgtArray, _tRange];"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class actioned + { + itemno = 5; + priority = 100.000000; + to="criteria"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_actionDone;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class dispose + { + itemno = 12; + priority = 80.000000; + to="end"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_doDispose;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class interrupt + { + itemno = 27; + priority = 75.000000; + to="trade"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_override;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class serve + { + itemno = 24; + priority = 70.000000; + to="look_at"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_servePlyr;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class work + { + itemno = 19; + priority = 60.000000; + to="move_to_work"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_goWork && !_override;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class home + { + itemno = 21; + priority = 50.000000; + to="move_to_home"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_goHome && !_override;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class reset_vars + { + name = "reset_vars"; + itemno = 7; + init = /*%FSM*/"//Default Vars" \n + "" \n + "" \n + "_rnd = 0;" \n + "_actionDone = false;" \n + "_decisionMade = false;" \n + "_sWait = 0;" \n + "_doDispose = false;" \n + "_chooseTarget = false;" \n + "_criteria = Nil;" \n + "_criteriaMet = false;" \n + "_allowInterrupt = false;" \n + "_t = diag_tickTime;" \n + "" \n + "" \n + "_traderPos=[0,0,0];" \n + "_goWork = false;" \n + "_goHome = false;" \n + "_nrPlyrs = [];" \n + "_servePlyr = false;" \n + "_override = false;" \n + "" \n + "_criteriaMetAction = nil;" \n + "" \n + "_traderPos = getPosATL _trader;" \n + "_daytime = daytime;" \n + "_nrPlyrs = _trader nearEntities [_trgtArray, _sRange];"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class _ + { + itemno = 16; + priority = 5.000000; + to="decision"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class end + { + name = "end"; + itemno = 11; + init = /*%FSM*/"diag_log format[""KILLED TRADER: %1"", (!alive _trader)];"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + }; + }; + /*%FSM*/ + /*%FSM*/ + class criteria + { + name = "criteria"; + itemno = 13; + init = /*%FSM*/"//intentionally left blank"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class met + { + itemno = 9; + priority = 10.000000; + to="reset_vars"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(call compile _criteria) || (diag_tickTime > (_t + _sWait));"/*%FSM*/; + action=/*%FSM*/"if (!isNil ""_criteriaMetAction"") then {" \n + "call compile _criteriaMetAction;" \n + "};"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class _ + { + itemno = 8; + priority = 5.000000; + to="interrupt_action"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class interrupt_action + { + name = "interrupt_action"; + itemno = 14; + init = /*%FSM*/""/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class player + { + itemno = 15; + priority = 10.000000; + to="decision"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(count _nrPlyrs > 0) && _allowInterrupt;"/*%FSM*/; + action=/*%FSM*/"_trader moveTo getPos _trader;" \n + "_override = true;" \n + "_actionDone = false;"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class _ + { + itemno = 10; + priority = 5.000000; + to="action"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class move_to_work + { + name = "move_to_work"; + itemno = 20; + init = /*%FSM*/"_trader moveTo _work;" \n + "_sWait = _maxTravelTime;" \n + "_actionDone = true;" \n + "_t = diag_tickTime;" \n + "_criteria = format[""moveToCompleted %1"",""_trader""];" \n + "_criteriaMetAction = format [""_atWork = %1"",true];" \n + "_atHome = false;" \n + "_allowInterrupt = true;" \n + "" \n + "_markers = _trader getVariable[""MARKER_REF"",[]];" \n + "if !(_markers isEqualTo []) then {" \n + " [_markers] call EPOCH_server_deleteGlobalMarkerSet;" \n + " ['DynamicTrader', _work] call EPOCH_server_createGlobalMarkerSet;" \n + " _trader setVariable['MARKER_REF', _markers];" \n + "};" \n + ""/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class _ + { + itemno = 1; + priority = 5.000000; + to="action"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class move_to_home + { + name = "move_to_home"; + itemno = 22; + init = /*%FSM*/"_trader moveTo _home;" \n + "_sWait = _maxTravelTime;" \n + "_actionDone = true;" \n + "_t = diag_tickTime;" \n + "_criteria = format[""moveToCompleted %1"",""_trader""];" \n + "_criteriaMetAction = format [""_atHome = %1"",true];" \n + "_atWork = false;" \n + "_allowInterrupt = true;" \n + "" \n + "_markers = _trader getVariable[""MARKER_REF"",[] ];" \n + "if !(_markers isEqualTo []) then {" \n + " [_markers] call EPOCH_server_deleteGlobalMarkerSet;" \n + " ['DynamicTrader', _home] call EPOCH_server_createGlobalMarkerSet;" \n + " _trader setVariable['MARKER_REF', _markers];" \n + "};" \n + ""/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class _ + { + itemno = 1; + priority = 5.000000; + to="action"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class look_at + { + name = "look_at"; + itemno = 25; + init = /*%FSM*/"if !(isNull _trgt) then {" \n + "_dir = _trader getDir _trgt;" \n + "if(_lastDir != _dir)then{" \n + " _trader setDir _dir;" \n + " _lastDir = _dir;" \n + "};" \n + "};" \n + "_sWait = 1;" \n + "_actionDone = true;" \n + "_t = diag_tickTime;" \n + "_criteria = format [""%1"", true ];" \n + "_l = diag_tickTime;"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class _ + { + itemno = 1; + priority = 5.000000; + to="action"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class trade + { + name = "trade"; + itemno = 28; + init = /*%FSM*/"if !(isNull _trgt) then {" \n + " _trader setDir (_trader getDir _trgt);" \n + "};" \n + "_sWait = 480;" \n + "_actionDone = true;" \n + "_t = diag_tickTime;" \n + "_allowInterrupt = true;" \n + "_criteria = format [""count %1 < %2"",""_nrPlyrs"",1];" \n + "" \n + "if (_goHome) then {" \n + "_criteriaMetAction = format [""%1 moveTo %2"",""_trader"",""_home""];" \n + "};" \n + "" \n + "if (_goWork) then {" \n + "_criteriaMetAction = format [""%1 moveTo %2"",""_trader"",""_work""];" \n + "};" \n + ""/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class _ + { + itemno = 1; + priority = 5.000000; + to="action"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class decision - { - name = "decision"; - init = /*%FSM*/""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class decision_made + initState="trader"; + finalStates[] = { - priority = 100.000000; - to="action"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"_decisionMade;"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; + "end", }; - /*%FSM*/ - /*%FSM*/ - class dispose - { - priority = 90.000000; - to="decision"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"!(alive _trader)"/*%FSM*/; - action=/*%FSM*/"_doDispose = true;" \n - "_decisionMade = true;"/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class no_decisiion - { - priority = 85.000000; - to="reset_vars"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"!_decisionMade && diag_tickTime - _t > 3;"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class look_at - { - priority = 80.000000; - to="decision"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"count _nrPlyrs >0 && diag_tickTime - _l > 3;"/*%FSM*/; - action=/*%FSM*/"_servePlyr = true;" \n - "_decisionMade = true;" \n - "_trgt = _nrPlyrs select 0;"/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class go_work - { - priority = 70.000000; - to="decision"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"(!_atWork) && (_daytime > (_schedule select 0) && _daytime < (_schedule select 1));"/*%FSM*/; - action=/*%FSM*/"_goWork = true;" \n - "_decisionMade = true;"/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class go_home - { - priority = 60.000000; - to="decision"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"(!_atHome) && (!(_daytime > (_schedule select 0) && _daytime < (_schedule select 1)));"/*%FSM*/; - action=/*%FSM*/"_goHome = true;" \n - "_decisionMade = true;"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class action - { - name = "action"; - init = /*%FSM*/"_nrPlyrs = _trader nearEntities [_trgtArray, _tRange];"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class actioned - { - priority = 100.000000; - to="criteria"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"_actionDone;"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class dispose - { - priority = 80.000000; - to="end"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"_doDispose;"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class interrupt - { - priority = 75.000000; - to="trade"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"_override;"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class serve - { - priority = 70.000000; - to="look_at"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"_servePlyr;"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class work - { - priority = 60.000000; - to="move_to_work"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"_goWork && !_override;"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class home - { - priority = 50.000000; - to="move_to_home"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"_goHome && !_override;"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class reset_vars - { - name = "reset_vars"; - init = /*%FSM*/"//Default Vars" \n - "" \n - "" \n - "_rnd = 0;" \n - "_actionDone = false;" \n - "_decisionMade = false;" \n - "_sWait = 0;" \n - "_doDispose = false;" \n - "_chooseTarget = false;" \n - "_criteria = Nil;" \n - "_criteriaMet = false;" \n - "_allowInterrupt = false;" \n - "_t = diag_tickTime;" \n - "" \n - "" \n - "_traderPos=[0,0,0];" \n - "_goWork = false;" \n - "_goHome = false;" \n - "_nrPlyrs = [];" \n - "_servePlyr = false;" \n - "_override = false;" \n - "" \n - "_criteriaMetAction = nil;" \n - "" \n - "_traderPos = getPosATL _trader;" \n - "_daytime = daytime;" \n - "_nrPlyrs = _trader nearEntities [_trgtArray, _sRange];"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class _ - { - priority = 5.000000; - to="decision"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/""/*%FSM*/; - action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class end - { - name = "end"; - init = /*%FSM*/"diag_log format[""KILLED TRADER: %1"", (!alive _trader)];"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - }; - }; - /*%FSM*/ - /*%FSM*/ - class criteria - { - name = "criteria"; - init = /*%FSM*/"//intentionally left blank"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class met - { - priority = 10.000000; - to="reset_vars"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"(call compile _criteria) || (diag_tickTime > (_t + _sWait));"/*%FSM*/; - action=/*%FSM*/"if (!isNil ""_criteriaMetAction"") then {" \n - "call compile _criteriaMetAction;" \n - "};"/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class _ - { - priority = 5.000000; - to="interrupt_action"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/""/*%FSM*/; - action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class interrupt_action - { - name = "interrupt_action"; - init = /*%FSM*/""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class player - { - priority = 10.000000; - to="decision"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"(count _nrPlyrs > 0) && _allowInterrupt;"/*%FSM*/; - action=/*%FSM*/"_trader moveTo getPos _trader;" \n - "_override = true;" \n - "_actionDone = false;"/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class _ - { - priority = 5.000000; - to="action"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/""/*%FSM*/; - action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class move_to_work - { - name = "move_to_work"; - init = /*%FSM*/"_trader moveTo _work;" \n - "_sWait = _maxTravelTime;" \n - "_actionDone = true;" \n - "_t = diag_tickTime;" \n - "_criteria = format[""moveToCompleted %1"",""_trader""];" \n - "_criteriaMetAction = format [""_atWork = %1"",true];" \n - "_atHome = false;" \n - "_allowInterrupt = true;" \n - "" \n - "_marker = _trader getVariable[""MARKER_REF"",""""];" \n - "if (_marker != """") then {" \n - " deleteMarker _marker;" \n - " _pos = getPosATL _trader;" \n - " _marker = createMarker [str(_pos), (_pos)];" \n - " _marker setMarkerShape ""ICON"";" \n - " _marker setMarkerType ""mil_dot"";" \n - " _marker setMarkerColor ""ColorBrown"";" \n - " _trader setVariable[""MARKER_REF"", _marker];" \n - "};" \n - ""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class _ - { - priority = 5.000000; - to="action"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/""/*%FSM*/; - action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class move_to_home - { - name = "move_to_home"; - init = /*%FSM*/"_trader moveTo _home;" \n - "_sWait = _maxTravelTime;" \n - "_actionDone = true;" \n - "_t = diag_tickTime;" \n - "_criteria = format[""moveToCompleted %1"",""_trader""];" \n - "_criteriaMetAction = format [""_atHome = %1"",true];" \n - "_atWork = false;" \n - "_allowInterrupt = true;" \n - "" \n - "_marker = _trader getVariable[""MARKER_REF"",""""];" \n - "if (_marker != """") then {" \n - " deleteMarker _marker;" \n - " _pos = getPosATL _trader;" \n - " _marker = createMarker [str(_pos), (_pos)];" \n - " _marker setMarkerShape ""ICON"";" \n - " _marker setMarkerType ""mil_dot"";" \n - " _marker setMarkerColor ""ColorBrown"";" \n - " _trader setVariable[""MARKER_REF"", _marker];" \n - "};" \n - ""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class _ - { - priority = 5.000000; - to="action"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/""/*%FSM*/; - action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class look_at - { - name = "look_at"; - init = /*%FSM*/"if !(isNull _trgt) then {" \n - "_dir = _trader getDir _trgt;" \n - "if(_lastDir != _dir)then{" \n - " _trader setDir _dir;" \n - " _lastDir = _dir;" \n - "};" \n - "};" \n - "_sWait = 1;" \n - "_actionDone = true;" \n - "_t = diag_tickTime;" \n - "_criteria = format [""%1"", true ];" \n - "_l = diag_tickTime;"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class _ - { - priority = 5.000000; - to="action"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/""/*%FSM*/; - action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class trade - { - name = "trade"; - init = /*%FSM*/"if !(isNull _trgt) then {" \n - " _trader setDir (_trader getDir _trgt);" \n - "};" \n - "_sWait = 480;" \n - "_actionDone = true;" \n - "_t = diag_tickTime;" \n - "_allowInterrupt = true;" \n - "_criteria = format [""count %1 < %2"",""_nrPlyrs"",1];" \n - "" \n - "if (_goHome) then {" \n - "_criteriaMetAction = format [""%1 moveTo %2"",""_trader"",""_home""];" \n - "};" \n - "" \n - "if (_goWork) then {" \n - "_criteriaMetAction = format [""%1 moveTo %2"",""_trader"",""_work""];" \n - "};" \n - ""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class _ - { - priority = 5.000000; - to="action"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/""/*%FSM*/; - action=/*%FSM*/"_doneCheck = false;"/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - }; - initState="trader"; - finalStates[] = - { - "end" - }; }; -/*%FSM*/ +/*%FSM*/ \ No newline at end of file diff --git a/Sources/epoch_server/system/server_monitor.fsm b/Sources/epoch_server/system/server_monitor.fsm index f0a7683b..92c5ea94 100644 --- a/Sources/epoch_server/system/server_monitor.fsm +++ b/Sources/epoch_server/system/server_monitor.fsm @@ -4,15 +4,15 @@ item0[] = {"Init",0,250,600.000000,-575.000000,700.000000,-525.000000,0.000000,"Init"}; item1[] = {"_",8,218,600.000000,-500.000000,700.000000,-450.000000,0.000000,""}; item2[] = {"Process",2,250,600.000000,-350.000000,700.000000,-300.000000,0.000000,"Process"}; -item3[] = {"De_simulate_Vehicle",4,218,750.000000,-225.000000,850.000000,-175.000000,2.000000,"De-simulate" \n "Vehicle Check"}; -item4[] = {"Simulate_Vehicle",4,218,750.000000,-300.000000,850.000000,-250.000000,1.000000,"Simulate" \n "Vehicle Check"}; -item5[] = {"CMD_queue",4,218,450.000000,-450.000000,550.000000,-400.000000,10.000000,"CMD queue"}; -item6[] = {"Save_Players",4,218,450.000000,-375.000000,550.000000,-325.000000,3.000000,"Save" \n "Players"}; -item7[] = {"Cleanup",4,218,750.000000,-375.000000,850.000000,-325.000000,8.000000,"Cleanup"}; -item8[] = {"Events",4,4314,450.000000,-225.000000,550.000000,-175.000000,0.000000,"Events"}; -item9[] = {"Save_Vehicles",4,218,450.000000,-300.000000,550.000000,-250.000000,4.000000,"Save" \n "Vehicles"}; -item10[] = {"Cleanup_Handler",4,218,750.000000,-450.000000,850.000000,-400.000000,8.000000,"Cleanup" \n "Handler"}; -item11[] = {"Server_FPS",4,218,600.000000,-225.000000,700.000000,-175.000000,0.000000,"Server FPS"}; +item3[] = {"Vehicle_and_Player",4,218,750.986694,-310.854675,850.986694,-260.854675,1.000000,"" \n "Vehicle and Player" \n "Checks"}; +item4[] = {"CMD_queue",4,218,450.000000,-450.000000,550.000000,-400.000000,10.000000,"CMD queue"}; +item5[] = {"Save_Players",4,218,450.000000,-375.000000,550.000000,-325.000000,3.000000,"Save" \n "Players"}; +item6[] = {"Cleanup",4,218,750.000000,-375.000000,850.000000,-325.000000,8.000000,"Cleanup"}; +item7[] = {"Events_Manager",4,4314,599.992371,-192.435822,699.992371,-142.435822,0.000000,"Events" \n "Manager"}; +item8[] = {"Save_Vehicles",4,218,450.000000,-300.000000,550.000000,-250.000000,4.000000,"Save" \n "Vehicles"}; +item9[] = {"Cleanup_Handler",4,218,750.000000,-450.000000,850.000000,-400.000000,8.000000,"Cleanup" \n "Handler"}; +item10[] = {"Server_FPS",4,218,746.045227,-248.683014,846.045227,-198.683014,0.000000,"Server FPS"}; +item11[] = {"Forced_Restart",4,218,684.856567,-214.145233,784.856567,-164.145233,0.000000,"Forced" \n "Restart"}; link0[] = {0,1}; link1[] = {1,2}; link2[] = {2,3}; @@ -33,8 +33,8 @@ link16[] = {8,2}; link17[] = {9,2}; link18[] = {10,2}; link19[] = {11,2}; -globals[] = {0.000000,0,0,0,0,640,480,1,3,6316128,1,275.180084,1161.319580,208.497711,-659.879456,898,884,1}; -window[] = {2,-1,-1,-1,-1,968,208,1500,208,3,916}; +globals[] = {0.000000,0,0,0,0,640,480,1,5,6316128,1,275.180084,1161.319580,208.497711,-659.879456,898,884,1}; +window[] = {2,-1,-1,-1,-1,838,78,1370,78,3,916}; *//*%FSM*/ class FSM { @@ -46,15 +46,24 @@ class FSM { name = "Init"; init = /*%FSM*/"diag_log ""Loaded Server FSM"";" \n + "" \n + "_cfgSecConf = (configFile >> ""CfgSecConf"");" \n + "_cfgSecConf_vehicles = (_cfgSecConf >> ""vehicles"");" \n + "_safeVehicles = [_cfgSecConf_vehicles, ""safeVehicles"", [""I_UAV_01_F"",""B_Heli_Transport_01_F"",""Steerable_Parachute_F"",""NonSteerable_Parachute_F"",""Land_Camping_Light_F"",""container_epoch""]] call EPOCH_fnc_returnConfigEntry;" \n "" \n "_serverSettingsConfig = configFile >> ""CfgEpochServer"";" \n "_ahInitAuthCfg = [_serverSettingsConfig, ""antihack_ahInitAuthCfg"", [0,180]] call EPOCH_fnc_returnConfigEntry;" \n "_events = [_serverSettingsConfig, ""events"", []] call EPOCH_fnc_returnConfigEntry;" \n - "_simulationHandler = [_serverSettingsConfig, ""simulationHandlerOld"", false] call EPOCH_fnc_returnConfigEntry;" \n "" \n "_initAhInitBanOrLog = _ahInitAuthCfg select 0;" \n "_initTimeLimit = _ahInitAuthCfg select 1;" \n "" \n + "// Load Epoch Events 3.0" \n + "{" \n + " diag_log format[""Loading Settings for %1 event..."",configName _x];" \n + " _events pushBack [getNumber (_x >> ""delay""),getText (_x >> ""script""),getNumber (_x >> ""runOnStart""),getNumber (_x >> ""usePrefix""),getNumber (_x >> ""runNumTimes""),getArray (_x >> ""input""),getArray (_x >> ""disallowedWorlds"")];" \n + "} forEach (""isClass _x"" configClasses (configFile >> ""CfgEpochServerEvents""));" \n + "" \n "_cmdDelay = EPOCH_hiveAdminCmdTime;" \n "_cmdRun = EPOCH_hiveAdminCmdExec;" \n "_savePlayerList = EPOCH_hiveAdminSavePlayerList;" \n @@ -65,9 +74,6 @@ class FSM "_prevRestartIn = 0;" \n "_serverLocked = false;" \n "_serverRestarting = false;" \n - "" \n - "_activeVehicles = [];" \n - "_toBeDesimulated = [];" \n "_players = [];" \n "_prevPlayers = [];" \n "_cleanupItems = [];" \n @@ -76,8 +82,6 @@ class FSM "_serverFpsTime = diag_tickTime;" \n "_serverFPSCheckFine = true;" \n "" \n - "_safeVehicles = [""I_UAV_01_F"",""B_Heli_Transport_01_F"",""Steerable_Parachute_F"",""NonSteerable_Parachute_F"",""Land_Camping_Light_F"",""container_epoch""];" \n - "" \n "_delayTimeSim = diag_tickTime;" \n "_delayTimeCMD = diag_tickTime;" \n "_delayTimeDeSim = diag_tickTime;" \n @@ -91,74 +95,73 @@ class FSM "_instanceID = call EPOCH_fn_InstanceID;" \n "" \n "_checkAuth = {" \n - " _puid = _this select 0;" \n - " _player = _this select 1;" \n - " if !(isNull _player) then {" \n - " if !(_puid call EPOCH_server_Authed) then {" \n - " _lastCheck = _player getVariable ""LAST_AUTH_CHECK"";" \n - " if (isNil ""_lastCheck"") then {" \n - " _player setVariable[""LAST_AUTH_CHECK"", diag_tickTime];" \n - " _lastCheck = diag_tickTime;" \n - " };" \n - " if (diag_tickTime - _lastCheck > _initTimeLimit) then {" \n - " _player setVariable[""LAST_AUTH_CHECK"", nil];" \n - " if (_initAhInitBanOrLog == 0) then {" \n - " 'epochserver' callExtension format['820|%1|EpochMod.com Autoban #R2', _puid];" \n - " ['ahb', format['%1 (%2): Player not Authenticated', name _player, _puid]] call EPOCH_fnc_server_hiveLog;" \n - " } else {" \n - " ['ahl', format['%1 (%2): Player not Authenticated', name _player, _puid]] call EPOCH_fnc_server_hiveLog;" \n - " };" \n - " };" \n - " } else {" \n - " _player setVariable[""LAST_AUTH_CHECK"", nil];" \n - " };" \n - " };" \n + " params [""_puid"",""_player""];" \n + " if !(isNull _player) then {" \n + " if !(_puid call EPOCH_server_Authed) then {" \n + " private _lastCheck = _player getVariable ""LAST_AUTH_CHECK"";" \n + " if (isNil ""_lastCheck"") then {" \n + " _player setVariable[""LAST_AUTH_CHECK"", diag_tickTime];" \n + " _lastCheck = diag_tickTime;" \n + " };" \n + " if (diag_tickTime - _lastCheck > _initTimeLimit) then {" \n + " _player setVariable[""LAST_AUTH_CHECK"", nil];" \n + " if (_initAhInitBanOrLog == 0) then {" \n + " 'epochserver' callExtension format['820|%1|EpochMod.com Autoban #R2', _puid];" \n + " ['ahb', format['%1 (%2): Player not Authenticated', name _player, _puid]] call EPOCH_fnc_server_hiveLog;" \n + " } else {" \n + " ['ahl', format['%1 (%2): Player not Authenticated', name _player, _puid]] call EPOCH_fnc_server_hiveLog;" \n + " };" \n + " };" \n + " } else {" \n + " _player setVariable[""LAST_AUTH_CHECK"", nil];" \n + " };" \n + " };" \n "};" \n "" \n "_cleanIt = {" \n - " if !(isNull _this) then {" \n - " _lastCheck = _this getVariable ""LAST_CHECK"";" \n - " if (isNil ""_lastCheck"") then {" \n - " _this setVariable[""LAST_CHECK"", diag_tickTime];" \n - " _lastCheck = diag_tickTime;" \n - " };" \n - " if (diag_tickTime - _lastCheck > 1200) then {" \n - " _list = _this nearEntities[[""Epoch_Male_F"", ""Epoch_Female_F"", ""LandVehicle"", ""Ship"", ""Air"", ""Tank""], 45];" \n - " if ({ isPlayer _x }count _list == 0) then {" \n - " _this setVariable [""LAST_CHECK"",nil];" \n - " //diag_log format[""DEBUG: _cleanIT del %1"", _this];" \n - " deleteVehicle _this;" \n - "" \n - " };" \n - " };" \n - " };" \n + " if !(isNull _this) then {" \n + " private _lastCheck = _this getVariable ""LAST_CHECK"";" \n + " if (isNil ""_lastCheck"") then {" \n + " _this setVariable[""LAST_CHECK"", diag_tickTime];" \n + " _lastCheck = diag_tickTime;" \n + " };" \n + " if (diag_tickTime - _lastCheck > 1200) then {" \n + " private _list = (_this nearEntities [[""Epoch_Male_F"",""Epoch_Female_F"",""LandVehicle"",""Ship"",""Air"",""Tank""], 45]) select {isPlayer _x};" \n + " if (_list isEqualTo []) then {" \n + " _this setVariable [""LAST_CHECK"",nil];" \n + " //diag_log format[""DEBUG: _cleanIT del %1"", _this];" \n + " deleteVehicle _this;" \n + " };" \n + " };" \n + " };" \n "};" \n "" \n "_cleanIt2 = {" \n - " if !(isNull _this) then {" \n - " _removed = false;" \n - " _lastCheck = _this getVariable ""LAST_CHECK"";" \n - " if (isNil ""_lastCheck"") then {" \n - " _this setVariable[""LAST_CHECK"", diag_tickTime];" \n - " _lastCheck = diag_tickTime;" \n - " };" \n - " if (diag_tickTime - _lastCheck > 1200) then {" \n - " _list = _this nearEntities[[""Epoch_Male_F"", ""Epoch_Female_F"", ""LandVehicle"", ""Ship"", ""Air"", ""Tank""], 45];" \n - " if ({ isPlayer _x }count _list == 0) then {" \n - " {" \n - " deleteVehicle _x;" \n - " }forEach nearestObjects[_this, [""WeaponHolder""], 2];" \n - " _this setVariable [""LAST_CHECK"",nil];" \n - " //diag_log format[""DEBUG: _cleanIT2 del %1"", _this];" \n - " deleteVehicle _this;" \n - " _removed = true;" \n - " };" \n - " };" \n - " if !(_removed) then {" \n - " EPOCH_cleanupQueue pushBack _this;" \n - " };" \n - " };" \n - "};"/*%FSM*/; + " if !(isNull _this) then {" \n + " private _removed = false;" \n + " private _lastCheck = _this getVariable ""LAST_CHECK"";" \n + " if (isNil ""_lastCheck"") then {" \n + " _this setVariable[""LAST_CHECK"", diag_tickTime];" \n + " _lastCheck = diag_tickTime;" \n + " };" \n + " if (diag_tickTime - _lastCheck > 1200) then {" \n + " private _list = (_this nearEntities [[""Epoch_Male_F"",""Epoch_Female_F"",""LandVehicle"",""Ship"",""Air"",""Tank""], 45]) select {isPlayer _x};" \n + " if (_list isEqualTo []) then {" \n + " {" \n + " deleteVehicle _x;" \n + " }forEach nearestObjects[_this, [""WeaponHolder""], 2];" \n + " _this setVariable [""LAST_CHECK"",nil];" \n + " //diag_log format[""DEBUG: _cleanIT2 del %1"", _this];" \n + " deleteVehicle _this;" \n + " _removed = true;" \n + " };" \n + " };" \n + " if !(_removed) then {" \n + " EPOCH_cleanupQueue pushBack _this;" \n + " };" \n + " };" \n + "};" \n + ""/*%FSM
*/; precondition = /*%FSM*/""/*%FSM*/; class Links { @@ -275,41 +278,12 @@ class FSM "if (_savePlayerList) then {" \n " [""PLAYERS"", (call EPOCH_fn_InstanceID), _players] call EPOCH_fnc_server_hiveSET;" \n "};" \n - "" \n + "// Group cleanup" \n "{if (units _x isEqualTo []) then {deleteGroup _x}}forEach allGroups"/*%FSM*/; }; /*%FSM*/ - /*%FSM*/ - class De_simulate_Vehicle - { - priority = 2.000000; - to="Process"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"((diag_tickTime - _delayTimeDeSim) > 12)"/*%FSM*/; - action=/*%FSM*/"_delayTimeDeSim = diag_tickTime;" \n - "" \n - "if !(_activeVehicles isEqualTo []) then {" \n - " _selectedVehicle = _activeVehicles deleteAt 0;" \n - " if !(isNull _selectedVehicle) then {" \n - " _deSim = false;" \n - " if (crew _selectedVehicle isEqualTo []) then {" \n - " if ((getPos _selectedVehicle) select 2 < 1) then {" \n - " if ({isPlayer _x} count (_selectedVehicle nearEntities[[""CAManBase"", ""LandVehicle"", ""Ship"", ""Air"", ""Tank""], 300]) == 0) then {" \n - " _selectedVehicle enableSimulationGlobal false;" \n - " _deSim = true;" \n - " };" \n - " };" \n - " };" \n - " // add vehicle to back of list for later de-simulation" \n - " if !(_deSim) then {" \n - " _activeVehicles pushBack _selectedVehicle;" \n - " };" \n - " };" \n - "};"/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class Simulate_Vehicle + /*%FSM*/ + class Vehicle_and_Player { priority = 1.000000; to="Process"; @@ -317,39 +291,112 @@ class FSM condition=/*%FSM*/"((diag_tickTime - _delayTimeSim) > 5)"/*%FSM*/; action=/*%FSM*/"_delayTimeSim = diag_tickTime;" \n "_playersTemp = [];" \n - "{ " \n - " {" \n - " if !(typeOf _x in _safeVehicles) then {" \n - " if (_x call EPOCH_server_getVToken) then {" \n - " if (_simulationHandler && !(simulationEnabled _x)) then {" \n - " _x enableSimulationGlobal true;" \n - " _activeVehicles pushBack _x;" \n - " };" \n - " } else {" \n - " if ((objectCurators _x) isEqualTo []) then {" \n - " diag_log format[""DEBUG: Invalid Vehicle Token, deleted %1"",_x];" \n - " deleteVehicle _x;" \n - " };" \n - " };" \n - " };" \n - " }forEach (_x nearEntities[[""LandVehicle"", ""Ship"", ""Air"", ""Tank""], 300]);" \n + "{" \n + " private _vehicle = vehicle _x;" \n + " // if player is inside a vehicle check vehicle is in allowed safe vehicles list." \n + " if (_vehicle != _x && {!(typeOf _vehicle in _safeVehicles)}) then {" \n + " // check if vehicle has token set server side and ignore vehicle if was spawned by a Curator (zeus)" \n + " if ((objectCurators _vehicle) isEqualTo [] && {!(_vehicle call EPOCH_server_getVToken)}) then {" \n + " diag_log format[""ADMIN: Invalid Vehicle detected and deleted %1 with %2 driving"",_vehicle,_x];" \n + " deleteVehicle _vehicle;" \n + " };" \n + " };" \n "" \n - " _pUID = getPlayerUID _x;" \n + " private _pUID = getPlayerUID _x;" \n + " // Add all player UIDs to array for use later." \n + " if (_pUID != """") then { _playersTemp pushBack _pUID; };" \n "" \n - " if !(_x call EPOCH_server_isPAdmin) then {" \n - " if (isObjectHidden _x) then {" \n - " _x hideObjectGlobal false;" \n - " };" \n - " if (_pUID != """") then {" \n - " _playersTemp pushBack _pUID;" \n - " [_pUID, _x] call _checkAuth;" \n - " };" \n - " } else {" \n - " if (_pUID != """") then { _playersTemp pushBack _pUID; };" \n - " };" \n + " // If player is not admin check perform checks." \n + " if !(_x call EPOCH_server_isPAdmin) then {" \n + " // check if player is hidden and if so force back visable." \n + " if (isObjectHidden _x) then {" \n + " _x hideObjectGlobal false;" \n + " diag_log format[""ADMIN: Warning!!! player was hidden and forced visable %1"",_x];" \n + " };" \n + " // check player has authenticated with reverse token check." \n + " if (_pUID != """") then {" \n + " [_pUID, _x] call _checkAuth;" \n + " };" \n + " };" \n "" \n "}forEach allPlayers;" \n - "_players = _playersTemp;"/*%FSM*/; + "_players = _playersTemp;" \n + ""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Events_Manager + { + priority = 0.000000; + to="Process"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"((diag_tickTime - _pvehTime) > 1)"/*%FSM*/; + action=/*%FSM*/"// Epoch Events" \n + "_pvehTime = diag_tickTime;" \n + "_events append (missionNamespace getVariable [""EPOCH_dynamicEvents"", []]);" \n + "missionNamespace setVariable [""EPOCH_dynamicEvents"", nil];" \n + "_newEvents = [];" \n + "{" \n + " _x params [""_time"", ""_scriptName"", [""_runAtStart"",0], [""_usePrePostfix"",1], [""_runNumTimes"",-1], [""_input"",[]], [""_disallowedWorlds"",[]] ];" \n + " _scriptParams = [];" \n + " _scriptcmdMode = ""execVM"";" \n + " if (_scriptName isEqualType []) then {" \n + " _scriptParams = _scriptName param [0,[]];" \n + " _scriptcmdMode = _scriptName param [1,""call""];" \n + " _scriptName = _scriptName param [2,""""];" \n + " };" \n + " _eventKey = format[""EPOCH_EVENT_%1"", _scriptName];" \n + " _eventCounter = format[""EPOCH_EVENT_COUNTER_%1"", _scriptName];" \n + " _lastTime = missionNamespace getVariable _eventKey;" \n + " _counter = missionNamespace getVariable [_eventCounter,0];" \n + " if (isNil ""_lastTime"") then {" \n + " _startTime = diag_tickTime;" \n + " if (_runAtStart isEqualTo 1) then {" \n + " _startTime = diag_tickTime - _time;" \n + " };" \n + " missionNamespace setVariable[_eventKey, _startTime];" \n + " _lastTime = _startTime;" \n + " };" \n + " if ((_counter >= _runNumTimes && _runNumTimes != -1) || worldName in _disallowedWorlds) then {" \n + " diag_log format[""DEBUG: server event removed %1"", _scriptName];" \n + " missionNamespace setVariable[_eventKey, nil];" \n + " missionNamespace setVariable[_eventCounter, nil];" \n + " } else {" \n + " _newEvents pushBack _x;" \n + " if ((diag_tickTime - _lastTime) >= _time) then {" \n + " missionNamespace setVariable[_eventKey, diag_tickTime];" \n + " _preFix = """";" \n + " _postFix = """";" \n + " if (_usePrePostfix == 1) then {" \n + " _preFix = ""\epoch_server_settings\EpochEvents\"";" \n + " _postFix = "".sqf"";" \n + " };" \n + " if (_usePrePostfix == 2) then {" \n + " _preFix = ""\epoch_server_events\EpochEvents\"";" \n + " _postFix = "".sqf"";" \n + " };" \n + " switch (_scriptcmdMode) do {" \n + " case (""call""): {" \n + " // call" \n + " _scriptParams call (missionNamespace getVariable [_scriptName, {}]);" \n + " };" \n + " case (""spawn""): {" \n + " // spawn" \n + " _scriptParams spawn (missionNamespace getVariable [_scriptName, {}]);" \n + " };" \n + " default {" \n + " // execVM" \n + " _handle = _input execVM format[""%1%2%3"",_preFix,_scriptName,_postFix];" \n + " };" \n + " };" \n + " _counter = _counter + 1;" \n + " missionNamespace setVariable[_eventCounter, _counter];" \n + " diag_log format[""DEBUG: server event %1"", _scriptName];" \n + " };" \n + " };" \n + "} forEach _events;" \n + "// remove expired events" \n + "_events = _newEvents;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ @@ -374,41 +421,14 @@ class FSM ""/*%FSM*/; }; /*%FSM*/ - /*%FSM*/ - class Events + /*%FSM*/ + class Forced_Restart { priority = 0.000000; to="Process"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"((diag_tickTime - _pvehTime) > 20)"/*%FSM*/; - action=/*%FSM*/"// Epoch Events" \n - "_pvehTime = diag_tickTime;" \n - "{" \n - " _x params [""_time"", ""_scriptName"", [""_runAtStart"",0],[""_usePrePostfix"",1]];" \n - " _eventKey = format[""EPOCH_EVENT_%1"", _forEachIndex];" \n - " _lastTime = missionNamespace getVariable _eventKey;" \n - " if (isNil ""_lastTime"") then {" \n - " _startTime = diag_tickTime;" \n - " if (_runAtStart isEqualTo 1) then {" \n - " _startTime = diag_tickTime - _time;" \n - " };" \n - " missionNamespace setVariable[_eventKey, _startTime];" \n - " _lastTime = _startTime;" \n - " };" \n - " if ((diag_tickTime - _lastTime) >= _time) then {" \n - " missionNamespace setVariable[_eventKey, diag_tickTime];" \n - " _preFix = """";" \n - " _postFix = """";" \n - " if (_usePrePostfix == 1) then {" \n - " _preFix = ""\epoch_server_settings\EpochEvents\"";" \n - " _postFix = "".sqf"";" \n - " };" \n - " _handle = [] execVM format[""%1%2%3"",_preFix,_scriptName,_postFix];" \n - " diag_log format[""DEBUG: _event %1"", _scriptName];" \n - " };" \n - "} forEach _events;" \n - "" \n - "// restart script" \n + action=/*%FSM*/"// restart script" \n "if (_scriptBasedRestart) then {" \n " if (diag_tickTime >= _forceRestartTimeWarning) then {" \n " if (!_serverLocked) then {" \n @@ -444,7 +464,6 @@ class FSM " };" \n " };" \n "};" \n - "" \n ""/*%FSM*/; }; /*%FSM*/ diff --git a/Sources/epoch_server/treeView.txt b/Sources/epoch_server/treeView.txt index 56790711..6f9b91b4 100644 Binary files a/Sources/epoch_server/treeView.txt and b/Sources/epoch_server/treeView.txt differ diff --git a/Sources/epoch_server_core/build.hpp b/Sources/epoch_server_core/build.hpp index 62344aa7..ebdd6286 100644 --- a/Sources/epoch_server_core/build.hpp +++ b/Sources/epoch_server_core/build.hpp @@ -1 +1 @@ -build=757; +build=826; diff --git a/Sources/epoch_server_core/compile/epoch_hive/fn_server_hiveMD5.sqf b/Sources/epoch_server_core/compile/epoch_hive/fn_server_hiveMD5.sqf new file mode 100644 index 00000000..39210a11 --- /dev/null +++ b/Sources/epoch_server_core/compile/epoch_hive/fn_server_hiveMD5.sqf @@ -0,0 +1,30 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: md5 hash function + Returns md5 hash if only one string is given as input. + Returns array of md5 hashes if input was an array. + + 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_core/compile/epoch_hive/fn_server_hiveMD5.sqf + + Usage Examples: + _hash = "Hello World" call EPOCH_fnc_server_hiveMD5; + // _hash = "b10a8db164e0754105b7a99be72e3fe5" + or multiple: + _hashes = ["Hello World","Lorem Ipsum"] call EPOCH_fnc_server_hiveMD5; + // _hashes = ["b10a8db164e0754105b7a99be72e3fe5", "6dbd01b4309de2c22b027eb35a3ce18b"] + +*/ +params ["_val"]; +if (_this isEqualType []) then { + _val = _this joinString "|"; + parseSimpleArray ("epochserver" callExtension ([840,_val] joinString "|")); +} else { + (parseSimpleArray ("epochserver" callExtension ([840,_val] joinString "|"))) select 0; +} diff --git a/Sources/epoch_server_core/compile/epoch_hive/fn_server_hiveUnitTest.sqf b/Sources/epoch_server_core/compile/epoch_hive/fn_server_hiveUnitTest.sqf index eaf7a720..75bc7186 100644 --- a/Sources/epoch_server_core/compile/epoch_hive/fn_server_hiveUnitTest.sqf +++ b/Sources/epoch_server_core/compile/epoch_hive/fn_server_hiveUnitTest.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_core/compile/epoch_hive/fn_server_hiveUnitTest.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_charCheck","_expires","_payload","_payload_64k","_payload_64k_count","_response","_startTime","_testID"]; +private ["_charCheck","_expires","_hashes","_payload","_payload_64k","_payload_64k_count","_response","_startTime","_testID"]; //[[[end]]] _testID = "1234567890"; _payload = "32D1ECB8511569B43A5CC39DF4261CACDA912C798B066EE1E1EE06E2F09D02073C1B3FC638F091D58E7691DA7D0F7E1F01371CB58346572A015F6F93429F3BDC"; @@ -147,3 +147,9 @@ diag_log format ["Epoch UnitTest: EPOCH_fnc_server_hiveLog Time: %2 : %1 ", _res _startTime = diag_tickTime; _response = ['TEST_LOG', _payload_64k] call EPOCH_fnc_server_hiveLog; diag_log format ["Epoch UnitTest: EPOCH_fnc_server_hiveLog 64k Time: %2 : %1 ", _response, (diag_tickTime-_startTime)]; + +// MD5 HASH +_hashes = ["Hello World","Lorem Ipsum"] call EPOCH_fnc_server_hiveMD5; +// _hashes = ["b10a8db164e0754105b7a99be72e3fe5", "6dbd01b4309de2c22b027eb35a3ce18b"] +_charCheck = _hashes isEqualTo ["b10a8db164e0754105b7a99be72e3fe5", "6dbd01b4309de2c22b027eb35a3ce18b"]; +diag_log format ["Epoch UnitTest: EPOCH_fnc_server_hiveMD5 Time: %2 : %1 ", ["isOK:",_charCheck], (diag_tickTime-_startTime)]; diff --git a/Sources/epoch_server_core/config.cpp b/Sources/epoch_server_core/config.cpp index aab44f00..75de838a 100644 --- a/Sources/epoch_server_core/config.cpp +++ b/Sources/epoch_server_core/config.cpp @@ -42,6 +42,7 @@ class cfgFunctions class server_hiveDEL {}; class server_hiveLog {}; class server_hiveUnitTest {}; + class server_hiveMD5 {}; }; }; }; diff --git a/Sources/epoch_server_core/treeView.txt b/Sources/epoch_server_core/treeView.txt index 9d6b2ea4..526063b2 100644 Binary files a/Sources/epoch_server_core/treeView.txt and b/Sources/epoch_server_core/treeView.txt differ diff --git a/Sources/epoch_server_debris_event/EpochEvents/DynamicDebris.sqf b/Sources/epoch_server_debris_event/EpochEvents/DynamicDebris.sqf new file mode 100644 index 00000000..843b9cf4 --- /dev/null +++ b/Sources/epoch_server_debris_event/EpochEvents/DynamicDebris.sqf @@ -0,0 +1,132 @@ +/* + Author/s: + Aaron Clark - EpochMod.com + + Description: + Spawns Debris 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_debris_event/EpochEvents/DebrisSpawner.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_allRoads","_allowDebris","_debris","_debrisCounter","_debrisLocations","_debrisLocationsKey","_debrisLocationsTMP","_debug","_disallowedLocations","_expiresDebris","_export","_instanceID","_intersections","_marker","_maxDebrisLimit","_nearbyLocations","_newDebrisCounter","_object","_offsetX","_offsetY","_position","_response","_rng","_rngChance","_scriptHiveKey","_seed","_selectedDebris","_upperPos","_worldSize"]; +//[[[end]]] +// exit if already ran once. +if (isNil "EPOCH_DynamicDebrisEnabled") exitWith {}; +EPOCH_DynamicDebrisEnabled = true; +_debug = false; +_expiresDebris = 604800; +_debris = [ + "Land_GarbageBags_F", + "Land_GarbagePallet_F", + "Land_GarbageWashingMachine_F", + "Land_GarbageHeap_01_F", + "Land_GarbageHeap_03_F", + "Land_GarbageHeap_04_F", + "Land_Wreck_Skodovka_F", + "Land_Wreck_CarDismantled_F", + "Land_Wreck_Truck_F", + "Land_Wreck_Car2_F", + "Land_Wreck_Car_F", + "Land_Wreck_Car3_F", + "Land_Wreck_Hunter_F", + "Land_Wreck_Van_F", + "Land_Wreck_Offroad_F", + "Land_Wreck_UAZ_F", + "Land_Wreck_Ural_F", + "Land_Wreck_Truck_dropside_F", + "Land_Wreck_HMMWV_F" +]; +_disallowedLocations = ["Airport"]; + +_debrisCounter = 0; +_newDebrisCounter = 0; +_worldSize = worldSize/2; +_instanceID = call EPOCH_fn_InstanceID; + +_maxDebrisLimit = 500; // max total objects to spawn +_rngChance = 0.95; // Lower this to spawn more positions +_scriptHiveKey = "EPOCH:DynamicDebris789"; // change this to force a new seed to be generated. + +_debrisLocationsKey = format ["%1:%2", _instanceID, worldname]; +_response = [_scriptHiveKey, _debrisLocationsKey] call EPOCH_fnc_server_hiveGETRANGE; + +_response params [["_status",0],["_data",[]] ]; +_debrisLocations = []; +_debrisLocationsTMP = []; +if (_status == 1 && _data isEqualType [] && !(_data isEqualTo [])) then { + _debrisLocations = _data; +} else { + diag_log format["DEBUG: Generating new Debris Locations... this is only done once every %1 days.",(_expiresDebris/86400)]; + _allRoads = [_worldSize,_worldSize] nearRoads _worldSize; + _allRoads = _allRoads call BIS_fnc_arrayShuffle; + + _seed = random 999999; + diag_log format["DEBUG: Generating new Debris Locations... with seed %1.",_seed]; + { + if (_newDebrisCounter >= _maxDebrisLimit) exitWith {}; + _position = getPosASL _x; + _position params ["_posX","_posY"]; + _rng = _seed random [_posX,_posY]; + if (_rng > _rngChance) then { + + _nearbyLocations = nearestLocations [_position, _disallowedLocations, 100]; + if (_nearbyLocations isEqualTo []) then { + + if (_debug) then { + _marker = createMarker[str(_position), _position]; + _marker setMarkerShape "ICON"; + _marker setMarkerType "waypoint"; + _marker setMarkerColor "ColorGreen"; + }; + _selectedDebris = selectRandom _debris; + _offsetX = (random 10) - 5; + _offsetY = (random 10) - 5; + + _position set [0,(_position select 0) + _offsetX]; + _position set [1,(_position select 1) + _offsetY]; + _position set [2,(_position select 2) - 1]; + + _upperPos = +_position; + _upperPos set [2,(_position select 2) + 3]; + + _intersections = lineIntersectsSurfaces [_upperPos, _position, objNull, objNull, true, 1]; + if !(_intersections isEqualTo []) then { + (_intersections select 0) params ["_intersectPosASL","_surfaceNormal","_intersectObject","_parentObject"]; + _allowDebris = true; + if !(isNull _intersectObject) then { + _allowDebris = !((typeOf _intersectObject) in _debris); + }; + if (_allowDebris) then { + _object = createSimpleObject [_selectedDebris, _intersectPosASL]; + _object setDir random 360; + _object setVectorUp _surfaceNormal; + _object setPosASL _intersectPosASL; + _export = [_selectedDebris,getPosWorld _object, vectorDir _object, vectorUp _object]; + _debrisLocationsTMP pushBack _export; + _newDebrisCounter = _newDebrisCounter + 1; + }; + }; + }; + }; + } forEach _allRoads; + [_scriptHiveKey, _debrisLocationsKey, _expiresDebris, _debrisLocationsTMP] call EPOCH_fnc_server_hiveSETEX; +}; + +{ + if (_debrisCounter >= _maxDebrisLimit) exitWith {}; + if (_x isEqualType [] && !(_x isEqualTo [])) then { + _x params ["_selectedDebris","_posWorld", "_vectorDir", "_vectorUp"]; + _object = createSimpleObject [_selectedDebris, _posWorld]; + _object setPosWorld _posWorld; + _object setVectorDirAndUp [_vectorDir,_vectorUp]; + _debrisCounter = _debrisCounter + 1; + }; +} forEach _debrisLocations; + +if (_debug) then { + diag_log format["DEBUG: Spawned %1 Existing Debris",_debrisCounter]; + if (_newDebrisCounter > 0) then { + diag_log format["DEBUG: Spawned %1 New Debris.",_newDebrisCounter]; + }; +}; diff --git a/Sources/epoch_server_debris_event/build.hpp b/Sources/epoch_server_debris_event/build.hpp new file mode 100644 index 00000000..ebdd6286 --- /dev/null +++ b/Sources/epoch_server_debris_event/build.hpp @@ -0,0 +1 @@ +build=826; diff --git a/Sources/epoch_server_debris_event/config.cpp b/Sources/epoch_server_debris_event/config.cpp new file mode 100644 index 00000000..91a0eaed --- /dev/null +++ b/Sources/epoch_server_debris_event/config.cpp @@ -0,0 +1,38 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Epoch Server Event (DynamicDebris) + + 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_debris_event { + requiredVersion = 0.1; + requiredAddons[] = {"A3_server_events"}; + #include "build.hpp" + }; +}; + +// import settings +class CfgEpochServerEvents +{ + class DynamicDebris { + delay = 120; // delay in seconds between executions , + script = "\epoch_server_debris_event\EpochEvents\DynamicDebris.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. + disallowedWorlds[] = {"VR"}; + }; +}; diff --git a/Sources/epoch_server_debris_event/license.txt b/Sources/epoch_server_debris_event/license.txt new file mode 100644 index 00000000..35440e4b --- /dev/null +++ b/Sources/epoch_server_debris_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_debris_event/treeView.txt b/Sources/epoch_server_debris_event/treeView.txt new file mode 100644 index 00000000..07354a72 Binary files /dev/null and b/Sources/epoch_server_debris_event/treeView.txt differ diff --git a/Sources/epoch_server_events/build.hpp b/Sources/epoch_server_events/build.hpp new file mode 100644 index 00000000..ebdd6286 --- /dev/null +++ b/Sources/epoch_server_events/build.hpp @@ -0,0 +1 @@ +build=826; diff --git a/Sources/epoch_server_events/config.cpp b/Sources/epoch_server_events/config.cpp new file mode 100644 index 00000000..1d9d43f9 --- /dev/null +++ b/Sources/epoch_server_events/config.cpp @@ -0,0 +1,47 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + BASE Epoch Server Events !!!DO NOT EDIT THIS FILE!!! Copy the epoch_server_debris_event to make new ones. + + 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_settngs/config.cpp +*/ + +#define _ARMA_ + +class CfgPatches { + class A3_server_events { + requiredVersion = 0.1; + requiredAddons[] = {}; + #include "build.hpp" + }; +}; + +// import settings +class CfgEpochServerEvents +{ + /* EXAMPLES ONLY !!! DO NOT EDIT THIS FILE make a copy of the Dynamic Debris Event !!! + class ContainerSpawner { + delay = 1200; // delay in seconds between executions , + script = "\epoch_server_events\EpochEvents\ContainerSpawner.sqf"; // script: name or full path if usePrefix is set to 0 + runOnStart = 0; // runOnStart: 1 = run script at startup, 0 normal delay + usePrefix = 0; // usePrefix: 1 = use pre/postfix path (inside epoch settings 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. + }; + class AirDrop { + delay = 2700; // delay in seconds between executions , + script = "AirDrop"; // script: name or full path if usePrefix is set to 0 + runOnStart = 0; // runOnStart: 1 = run script at startup, 0 normal delay + usePrefix = 2; // usePrefix: 1 = use pre/postfix path (inside epoch settings 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_events/license.txt b/Sources/epoch_server_events/license.txt new file mode 100644 index 00000000..35440e4b --- /dev/null +++ b/Sources/epoch_server_events/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_events/treeView.txt b/Sources/epoch_server_events/treeView.txt new file mode 100644 index 00000000..803c0221 Binary files /dev/null and b/Sources/epoch_server_events/treeView.txt differ diff --git a/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf b/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf index 6d15fb90..b4def8fc 100644 --- a/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf +++ b/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf @@ -6,7 +6,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_ferrisPosition","_item","_marker"]; +private ["_ferrisPosition","_item","_markers"]; //[[[end]]] _ferrisPosition = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 4000, 0] call BIS_fnc_findSafePos; if ((count _ferrisPosition) == 2) then{ @@ -18,10 +18,6 @@ if ((count _ferrisPosition) == 2) then{ } forEach["Carnival_Tent", "Land_Slide_F", "Carnival_Tent", "Land_Carousel_01_F", "Carnival_Tent", "Carnival_Tent"]; if (EPOCH_showShippingContainers) then{ - _marker = createMarker[str(_ferrisPosition), _ferrisPosition]; - _marker setMarkerShape "ICON"; - _marker setMarkerType "mil_dot"; - // _marker setMarkerText "Ferris"; - _marker setMarkerColor "ColorOrange"; + _markers = ["Carnival",_ferrisPosition] call EPOCH_server_createGlobalMarkerSet; }; }; diff --git a/Sources/epoch_server_settings/EpochEvents/ContainerSpawner.sqf b/Sources/epoch_server_settings/EpochEvents/ContainerSpawner.sqf index 495e31bb..18286054 100644 --- a/Sources/epoch_server_settings/EpochEvents/ContainerSpawner.sqf +++ b/Sources/epoch_server_settings/EpochEvents/ContainerSpawner.sqf @@ -6,16 +6,12 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settings/EpochEvents/ContainterSpawner.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_cargoPosition","_item","_marker"]; +private ["_cargoPosition","_item","_markers"]; //[[[end]]] _cargoPosition = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 4000, 1] call BIS_fnc_findSafePos; if ((count _cargoPosition) == 2) then{ _item = createVehicle["Cargo_Container", _cargoPosition, [], 0.0, "CAN_COLLIDE"]; if (EPOCH_showShippingContainers) then{ - _marker = createMarker[str(_cargoPosition), _cargoPosition]; - _marker setMarkerShape "ICON"; - _marker setMarkerType "mil_dot"; - // _marker setMarkerText "Container"; - _marker setMarkerColor "ColorOrange"; + _markers = ["Container",_cargoPosition] call EPOCH_server_createGlobalMarkerSet; }; }; diff --git a/Sources/epoch_server_settings/EpochEvents/EarthQuake.sqf b/Sources/epoch_server_settings/EpochEvents/EarthQuake.sqf index 087ef34d..cef11b69 100644 --- a/Sources/epoch_server_settings/EpochEvents/EarthQuake.sqf +++ b/Sources/epoch_server_settings/EpochEvents/EarthQuake.sqf @@ -6,31 +6,25 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settings/EpochEvents/Earthquake.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_chance","_item","_marker","_minerals","_playersNearEpicenter","_position"]; +private ["_chance","_item","_markers","_minerals","_playersNearEpicenter","_position"]; //[[[end]]] _position = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 1000, 0] call BIS_fnc_findSafePos; if ((count _position) == 2) then{ _playersNearEpicenter = _position nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 1000]; - if !(_playersNearEpicenter isEqualTo[]) then{ + // decrease chance with more players + _chance = linearConversion [1, 100, (count allPlayers), 0, 0.5, true]; + if ((random 1) > _chance) then { - // decrease chance with more players - _chance = linearConversion [1, 100, (count allPlayers), 0, 0.5, true]; - if ((random 1) > _chance) then { + if !(_playersNearEpicenter isEqualTo[]) then{ // send earthquake to each player in zone - { - [_position] remoteExec ['EPOCH_client_earthQuake',_x]; - }forEach _playersNearEpicenter; + [_position] remoteExec ['EPOCH_client_earthQuake',_playersNearEpicenter]; + }; - // todo configize - _minerals = ["MineralDepositCopper_EPOCH", "MineralDepositGold_EPOCH", "MineralDepositSilver_EPOCH"]; - _item = createVehicle[(selectRandom _minerals), _position, [], 0.0, "CAN_COLLIDE"]; - if (EPOCH_showEarthQuakes) then{ - _marker = createMarker[str(_position), _position]; - _marker setMarkerShape "ICON"; - _marker setMarkerType "mil_dot"; - // _marker setMarkerText "Mineral"; - _marker setMarkerColor "ColorGrey"; - }; + // Mineral veins + _minerals = ["MineralDepositCopper_EPOCH", "MineralDepositGold_EPOCH", "MineralDepositSilver_EPOCH"]; + _item = createVehicle[(selectRandom _minerals), _position, [], 0.0, "CAN_COLLIDE"]; + if (EPOCH_showEarthQuakes) then{ + _markers = ["EarthQuake",_position] call EPOCH_server_createGlobalMarkerSet; }; }; }; diff --git a/Sources/epoch_server_settings/EpochEvents/GardenManager.sqf b/Sources/epoch_server_settings/EpochEvents/GardenManager.sqf new file mode 100644 index 00000000..a9dbd071 --- /dev/null +++ b/Sources/epoch_server_settings/EpochEvents/GardenManager.sqf @@ -0,0 +1,74 @@ +/* + Garden Manager + by Aaron Clark - EpochMod.com + + Improvements and or bugfixes and other contributions are welcome via the github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settings/EpochEvents/GardenManager.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_babies","_babyClasses","_cargo","_garden","_mature","_matureClasses","_modifiedGardens","_seedClasses","_seeds","_spoil","_teenClasses","_teens"]; +//[[[end]]] + +_seedClasses = ["SeedPacket_GoldenSeal","SeedPacket_Hemp","SeedPacket_Poppy","SeedPacket_Pumpkin","SeedPacket_Sunflower"]; +_babyClasses = ["Sapling_GoldenSeal","Sapling_Hemp","Sapling_Poppy","Sapling_Pumpkin","Sapling_Sunflower"]; +_teenClasses = ["SaplingTeen_GoldenSeal","SaplingTeen_Hemp","SaplingTeen_Poppy","SaplingTeen_Pumpkin","SaplingTeen_Sunflower"]; +_matureClasses = ["GoldenSeal","Hemp","Poppy","Pumpkin","Sunflower"]; +_spoil = false; + +// init var if not set +if (isNil "EPOCH_activeGardens") then {EPOCH_activeGardens = []}; +// remove any null objects +EPOCH_activeGardens = EPOCH_activeGardens - [objNull]; + +_modifiedGardens = []; +{ + _garden = _x; + _cargo = magazineCargo _x; + // find all seeds + _seeds = _cargo select {_x in _seedClasses}; + // find all baby plants + _babies = _cargo select {_x in _babyClasses}; + // find all teen plants + _teens = _cargo select {_x in _teenClasses}; + // find all mature plants + _mature = _cargo select {_x in _matureClasses}; + + // normalize storage + clearWeaponCargoGlobal _x; + clearMagazineCargoGlobal _x; + clearBackpackCargoGlobal _x; + clearItemCargoGlobal _x; + + // convert seeds to baby plants. + { + _garden addMagazineCargoGlobal [(_babyClasses param [_seedClasses find _x, _x]), 1]; + } forEach _seeds; + + // convert baby plants to teen + { + _garden addMagazineCargoGlobal [(_teenClasses param [_babyClasses find _x, _x]), 1]; + } forEach _babies; + + // convert teen plants to mature + { + _garden addMagazineCargoGlobal [(_matureClasses param [_teenClasses find _x, _x]), 1]; + } forEach _teens; + + // readd mature plants if spoil == false + if !(_spoil) then { + { + _garden addMagazineCargoGlobal [_x, 1]; + } forEach _mature; + }; + + // push to temp array for save + if !((magazineCargo _garden) isEqualTo _cargo) then { + _modifiedGardens pushBack _garden; + }; + +} forEach EPOCH_activeGardens; + +// force all modified gardens to save via queue +if !(_modifiedGardens isEqualTo []) then { + [_modifiedGardens] call EPOCH_server_save_vehicles; +}; diff --git a/Sources/epoch_server_settings/EpochEvents/PaydayEvent.sqf b/Sources/epoch_server_settings/EpochEvents/PaydayEvent.sqf index 964260ef..a028312f 100644 --- a/Sources/epoch_server_settings/EpochEvents/PaydayEvent.sqf +++ b/Sources/epoch_server_settings/EpochEvents/PaydayEvent.sqf @@ -7,3 +7,5 @@ */ {[_x,100] call EPOCH_server_effectCrypto;} forEach (allPlayers select {alive _x}); + +// Add on screen notification large crypto symbol and maybe audio clip CHA-CHING, configurable option for hosts diff --git a/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf b/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf index b56af8ec..dbdbfa9c 100644 --- a/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf +++ b/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf @@ -15,7 +15,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_debug","_decayTime","_jammers","_marker","_nearbyLocations","_plant","_plantCount","_plants","_playersNearby","_position","_restricted","_scatter","_selectedLocation","_showPlantMarkers","_timeStamp"]; +private ["_debug","_decayTime","_jammers","_markers","_nearbyLocations","_plant","_plantCount","_plants","_playersNearby","_position","_restricted","_scatter","_selectedLocation","_showPlantMarkers","_timeStamp"]; //[[[end]]] // SET THIS TO TRUE TO GET MESSAGES IN LOG. @@ -97,10 +97,7 @@ if ((count _position) == 2) then{ // SET UP THE MARKER. if (_showPlantMarkers) then{ - _marker = createMarker[str(_position), _position]; - _marker setMarkerShape "ICON"; - _marker setMarkerType "waypoint"; - _marker setMarkerColor "ColorGreen"; + _markers = ["PlantSpawn",_position] call EPOCH_server_createGlobalMarkerSet; }; // TICK COUNTER + 1 SPAWNED PLANT PATCH. @@ -115,26 +112,30 @@ if ((count _position) == 2) then{ EPOCH_plantCounter = EPOCH_plantCounter - 1; // DELETE THAT MARKER. if (_showPlantMarkers) then{ - deleteMarker _marker; + [_markers] call EPOCH_server_deleteGlobalMarkerSet; }; // remove any left over "dead" plants (only if decayTime is reached) {deleteVehicle _x} forEach _plantsLeft; }; // set marker to brown to show 50% decay but not if already marked as picked (red). - if !(getMarkerColor _marker in ["ColorRed","ColorBrown"]) then { - if ((diag_tickTime - _timeStamp) > (_decayTime/2)) then { - _marker setMarkerColor "ColorBrown"; + { + if !(getMarkerColor _x in ["ColorRed","ColorBrown"]) then { + if ((diag_tickTime - _timeStamp) > (_decayTime/2)) then { + _x setMarkerColor "ColorBrown"; + }; }; - }; + }forEach _markers; // WAIT FOR A PLAYER TO Pick one plant then set marker to red if (count _plantsLeft != _plantCount) then { if (_showPlantMarkers) then{ - if (getMarkerColor _marker != "ColorRed") then { - _marker setMarkerColor "ColorRed"; - }; + { + if (getMarkerColor _x != "ColorRed") then { + _x setMarkerColor "ColorRed"; + }; + }forEach _markers; }; }; sleep 30; }; }; -// END SCRIPT. +// END SCRIPT. \ No newline at end of file diff --git a/Sources/epoch_server_settings/EpochEvents/Satellite.sqf b/Sources/epoch_server_settings/EpochEvents/Satellite.sqf new file mode 100644 index 00000000..f73216a2 --- /dev/null +++ b/Sources/epoch_server_settings/EpochEvents/Satellite.sqf @@ -0,0 +1,30 @@ +/* + Crashed Satellite Event + by Aaron Clark - EpochMod.com + + Improvements and or bugfixes and other contributions are welcome via the github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settings/EpochEvents/Satellite.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_satellite","_markers","_playersNearEpicenter","_position","_satellites"]; +//[[[end]]] +_position = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 1000, 0] call BIS_fnc_findSafePos; +if ((count _position) == 2) then{ + + // spawn Satellite + _satellites = ["Land_Wreck_Satellite_EPOCH"]; + _satellite = createVehicle[(selectRandom _satellites), _position, [], 0.0, "CAN_COLLIDE"]; + + // send shockwave + effects to each player in zone at time of crash + _playersNearEpicenter = _position nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 1000]; + if !(_playersNearEpicenter isEqualTo[]) then{ + [_satellite, -1, 0.8, false] remoteExec ['BIS_fnc_sandstorm',_playersNearEpicenter]; + }; + + // set rads + _satellite setVariable ["EPOCH_Rads", [30,50], true]; //30 rads within 50 meters + + if (EPOCH_showSatellites) then{ + _markers = ["Satellite",_position] call EPOCH_server_createGlobalMarkerSet; + }; +}; diff --git a/Sources/epoch_server_settings/build.hpp b/Sources/epoch_server_settings/build.hpp index 62344aa7..ebdd6286 100644 --- a/Sources/epoch_server_settings/build.hpp +++ b/Sources/epoch_server_settings/build.hpp @@ -1 +1 @@ -build=757; +build=826; diff --git a/Sources/epoch_server_settings/config.cpp b/Sources/epoch_server_settings/config.cpp index 120307a7..39bbf3a2 100644 --- a/Sources/epoch_server_settings/config.cpp +++ b/Sources/epoch_server_settings/config.cpp @@ -20,7 +20,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = 0.1; - epochVersion = "0.5.0.0"; + epochVersion = "1.0.0"; requiredAddons[] = {}; #include "build.hpp" }; @@ -61,11 +61,37 @@ class CfgEpoch {"NameCityCapital",4}, {"Airport",5} }; + + // Radiation System + radioactiveLocations[] = {"NameCityCapital", "NameCity", "Airport"}; + radioactiveLocationsCount = 3; + // Block radioactive locations spawn + radioactiveLocBLObjects[] = {"PlotPole_EPOCH"}; + radioactiveLocBLDistance = 500; + customRadioactiveLocations[] = { // position , intensity , object to spawn radiated + // {{11650,11900,0}, 500, "Land_Device_assembled_F"}, + // {{0,0,0}, 0, ""} //any of these will throw an error in the rpt + // leave this empty to spawn 0 custom locations + }; + + // Traders traderBlds[] = {"House", "Building"}; traderHomes[] = {"House", "Building"}; traderUniforms[] = {"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"}; - containerPos[] = {}; + + // Shipwrecks + shipwreckLootEnabled = 1; + maxSpawnedShipwrecks = 12; + + // Debug Box telePos[] = {}; + lightPos[] = { + {-16.623,-8.50195,-10.5417}, + {15.0352,-9.08594,-10.5417} + }; + debugBoxClass = "Debug_static_F"; + cloneClasses[] = {"clone_empty_static_F", "clone_male_static_F", "clone_female_static_F"}; + propsPos[] = {}; staticNpcPos[] = {}; forcedVehicleSpawnTable = ""; @@ -255,6 +281,7 @@ class CfgEpoch #include "configs\maps\stratis.h" #include "configs\maps\altis.h" #include "configs\maps\chernarus.h" + #include "configs\maps\chernarusredux.h" #include "configs\maps\chernarus_summer.h" #include "configs\maps\australia.h" #include "configs\maps\takistan.h" @@ -273,4 +300,5 @@ class CfgEpoch #include "configs\maps\Woodland_ACR.h" #include "configs\maps\Napf.h" #include "configs\maps\tanoa.h" + #include "configs\maps\Malden.h" }; diff --git a/Sources/epoch_server_settings/configs/CfgEpochVehicles.h b/Sources/epoch_server_settings/configs/CfgEpochVehicles.h index ac5ee9b7..4b360b88 100644 --- a/Sources/epoch_server_settings/configs/CfgEpochVehicles.h +++ b/Sources/epoch_server_settings/configs/CfgEpochVehicles.h @@ -18,14 +18,26 @@ class CfgEpochVehicles textureSelectionIndex[] = {0}; availableColors[] = {{ "\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE01_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE02_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE03_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE04_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE05_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE06_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE07_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE08_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_BASE09_CO.paa" }}; }; + class C_Hatchback_01_EPOCH1: C_Hatchback_01_EPOCH{}; + class C_Hatchback_01_EPOCH2: C_Hatchback_01_EPOCH{}; + class C_Hatchback_01_EPOCH3: C_Hatchback_01_EPOCH{}; + class C_Hatchback_01_EPOCH4: C_Hatchback_01_EPOCH{}; class C_Offroad_01_EPOCH { textureSelectionIndex[] = {0,1}; availableColors[] = {{ "\A3\soft_F\Offroad_01\Data\Offroad_01_ext_co.paa","\A3\soft_F\Offroad_01\Data\Offroad_01_ext_BASE01_CO.paa","\A3\soft_F\Offroad_01\Data\Offroad_01_ext_BASE02_CO.paa","\A3\soft_F\Offroad_01\Data\Offroad_01_ext_BASE03_CO.paa","\A3\soft_F\Offroad_01\Data\Offroad_01_ext_BASE04_CO.paa","\A3\soft_F\Offroad_01\Data\Offroad_01_ext_BASE05_CO.paa" }}; }; + class C_Offroad_01_EPOCH1: C_Offroad_01_EPOCH{}; + class C_Offroad_01_EPOCH2: C_Offroad_01_EPOCH{}; + class C_Offroad_01_EPOCH3: C_Offroad_01_EPOCH{}; + class C_Offroad_01_EPOCH4: C_Offroad_01_EPOCH{}; class C_SUV_01_EPOCH { textureSelectionIndex[] = {0}; availableColors[] = {{ "\A3\Soft_F_Gamma\SUV_01\Data\SUV_01_ext_CO.paa","\A3\Soft_F_Gamma\SUV_01\Data\SUV_01_ext_02_CO.paa","\A3\Soft_F_Gamma\SUV_01\Data\SUV_01_ext_03_CO.paa","\A3\Soft_F_Gamma\SUV_01\Data\SUV_01_ext_04_CO.paa" }}; }; + class C_SUV_01_EPOCH1: C_SUV_01_EPOCH{}; + class C_SUV_01_EPOCH2: C_SUV_01_EPOCH{}; + class C_SUV_01_EPOCH3: C_SUV_01_EPOCH{}; + class C_SUV_01_EPOCH4: C_SUV_01_EPOCH{}; class C_Van_01_transport_EPOCH { textureSelectionIndex[] = {0}; availableColors[] = {{ "\A3\soft_f_gamma\van_01\Data\van_01_ext_CO.paa","\A3\soft_f_gamma\van_01\Data\van_01_ext_red_CO.paa" }}; @@ -34,6 +46,10 @@ class CfgEpochVehicles textureSelectionIndex[] = {0}; availableColors[] = {{ "\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_SPORT01_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_SPORT02_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_SPORT03_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_SPORT04_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_SPORT05_CO.paa","\A3\soft_f_gamma\Hatchback_01\data\Hatchback_01_ext_SPORT06_CO.paa" }}; }; + class C_Hatchback_02_EPOCH1: C_Hatchback_02_EPOCH{}; + class C_Hatchback_02_EPOCH2: C_Hatchback_02_EPOCH{}; + class C_Hatchback_02_EPOCH3: C_Hatchback_02_EPOCH{}; + class C_Hatchback_02_EPOCH4: C_Hatchback_02_EPOCH{}; class C_Quadbike_01_EPOCH { textureSelectionIndex[] = {0,1}; availableColors[] = {{ "\A3\Soft_F_Beta\Quadbike_01\Data\Quadbike_01_CIV_BLACK_CO.paa","\A3\Soft_F_Beta\Quadbike_01\Data\Quadbike_01_CIV_BLUE_CO.paa","\A3\Soft_F_Beta\Quadbike_01\Data\Quadbike_01_CIV_RED_CO.paa","\A3\Soft_F_Beta\Quadbike_01\Data\Quadbike_01_CIV_WHITE_CO.paa" },{ "\A3\Soft_F_Beta\Quadbike_01\Data\Quadbike_01_wheel_CIVBLACK_CO.paa","\A3\Soft_F_Beta\Quadbike_01\Data\Quadbike_01_wheel_CIVBLUE_CO.paa","\A3\Soft_F_Beta\Quadbike_01\Data\Quadbike_01_wheel_CIVRED_CO.paa","\A3\Soft_F_Beta\Quadbike_01\Data\Quadbike_01_wheel_CIVWHITE_CO.paa" }}; diff --git a/Sources/epoch_server_settings/configs/CfgLootTable.h b/Sources/epoch_server_settings/configs/CfgLootTable.h index 26de6527..96e1b34a 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable.h @@ -20,6 +20,25 @@ class CfgLootTable { { "WoodLog_EPOCH", "magazine" }, 1 } }; }; + class Rock + { + items[] = { + { { "PartOre", "magazine" }, 1 }, + { { "ItemRock", "magazine" }, 2 } + }; + }; + class Cinder + { + items[] = { + { { "CinderBlocks", "magazine" }, 1 } + }; + }; + class Wreck + { + items[] = { + { { "ItemScraps", "magazine" }, 1 } + }; + }; class Bush { items[] = { @@ -45,7 +64,8 @@ class CfgLootTable { items[] = { { { "ItemCompass", "item" }, 20 }, - { { "ItemGPS", "item" }, 10 }, + { { "ItemGeigerCounter_EPOCH", "item" }, 1 }, + { { "ItemGPS", "item" }, 9 }, { { "EpochRadio0", "item" }, 3 }, { { "EpochRadio1", "item" }, 3 }, { { "EpochRadio2", "item" }, 3 }, @@ -57,17 +77,39 @@ class CfgLootTable { { "EpochRadio8", "item" }, 1 }, { { "EpochRadio9", "item" }, 1 }, { { "ItemWatch", "item" }, 30 }, - { { "FAK", "item" }, 20 } + { { "FAK", "magazine" }, 20 } + }; + }; + class Repairs + { + items[] = { + { { "VehicleRepair", "magazine" }, 30 }, + { { "SpareTire", "magazine" }, 10 }, + { { "EngineParts", "magazine" }, 10 }, + { { "EngineBlock", "magazine" }, 10 }, + { { "ItemGlass", "magazine" }, 15 }, + { { "ItemDuctTape", "magazine" }, 20 }, + { { "ItemRotor", "magazine" }, 5 } + }; + }; + class VehicleDocs + { + items[] = { + { { "ItemVehDoc1", "magazine" }, 20 }, + { { "ItemVehDoc2", "magazine" }, 15 }, + { { "ItemVehDoc3", "magazine" }, 4 }, + { { "ItemVehDoc4", "magazine" }, 2 } }; }; class Equipment { items[] = { - { { "Rangefinder", "weapon" }, 5 }, + { { "Rangefinder", "weapon" }, 15 }, { { "Binocular", "item" }, 40 }, - { { "NVG_EPOCH", "item" }, 10 }, - { { "acc_flashlight", "item" }, 20 }, - { { "acc_pointer_IR", "item" }, 20 }, + { { "NVG_EPOCH", "item" }, 5 }, + { { "acc_flashlight", "item" }, 15 }, + { { "acc_flashlight_pistol", "item" }, 10 }, + { { "acc_pointer_IR", "item" }, 5 }, // Marksman DLC { { "Bipods", "CfgLootTable" }, 5 } @@ -154,7 +196,7 @@ class CfgLootTable { { "ItemMixOil", "magazine" }, 4 }, { { "ItemCoolerE", "magazine" }, 6 }, { { "CircuitParts", "magazine" }, 8 }, - { { "VehicleRepair", "magazine" }, 7 }, + { { "Repairs", "CfgLootTable" }, 7 }, { { "Towelette", "magazine" }, 14 }, { { "HotColdPacks", "CfgLootTable" }, 9 }, { { "PaintCans", "CfgLootTable" }, 9 }, @@ -162,20 +204,39 @@ class CfgLootTable { { "CanFood", "CfgLootTable" }, 8 }, { { "Primitive", "CfgLootTable" }, 21 }, { { "lighter_epoch", "magazine" }, 1 }, - + { { "Seeds", "CfgLootTable" }, 1 }, { { "ItemAluminumBar", "magazine" }, 2 }, { { "ItemCopperBar", "magazine" }, 2 }, - { { "ItemTinBar", "magazine" }, 1 } + { { "ItemTinBar", "magazine" }, 1 }, + { { "ItemCanteen_Dirty", "magazine" }, 5 }, + { { "ItemCanteen_Clean", "magazine" }, 1 }, + { { "ItemBottlePlastic_Dirty", "magazine" }, 5 }, + { { "ItemBottlePlastic_Clean", "magazine" }, 1 } + + }; + }; + + class Seeds + { + items[] = { + { { "ItemSeedBag", "magazine" }, 10 }, + { { "SeedPacket_Hemp", "magazine" }, 1 }, + { { "SeedPacket_GoldenSeal", "magazine" }, 1 }, + { { "SeedPacket_Poppy", "magazine" }, 1 }, + { { "SeedPacket_Pumpkin", "magazine" }, 2 }, + { { "SeedPacket_Sunflower", "magazine" }, 2 } }; }; class Primitive { items[] = { - { { "ItemRock", "magazine" }, 1 }, - { { "ItemRope", "magazine" }, 1 }, - { { "ItemStick", "magazine" }, 1 }, - { { "ItemScraps", "magazine" }, 1 } + { { "ItemRock", "magazine" }, 5 }, + { { "ItemRope", "magazine" }, 2 }, + { { "ItemStick", "magazine" }, 5 }, + { { "ItemScraps", "magazine" }, 1 }, + { { "ItemCanvas", "magazine" }, 1 }, + { { "ItemBurlap", "magazine" }, 1 } }; }; @@ -196,17 +257,28 @@ class CfgLootTable class CanFood { items[] = { + { { "ItemPowderMilk", "magazine" }, 3 }, + { { "ItemRicebox", "magazine" }, 3 }, + { { "ItemCereals", "magazine" }, 3 }, + { { "ItemVitamins", "magazine" }, 3 }, { { "honey_epoch", "magazine" }, 5 }, { { "emptyjar_epoch", "magazine" }, 13 }, + { { "water_epoch", "magazine" }, 3 }, + { { "clean_water_epoch", "magazine" }, 1 }, { { "FoodBioMeat", "magazine" }, 11 }, { { "sardines_epoch", "magazine" }, 11 }, { { "meatballs_epoch", "magazine" }, 13 }, { { "scam_epoch", "magazine" }, 14 }, { { "sweetcorn_epoch", "magazine" }, 14 }, - { { "FoodSnooter", "magazine" }, 9 }, + { { "FoodSnooter", "magazine" }, 5 }, + { { "krypto_candy_epoch", "magazine" }, 4 }, { { "TacticalBacon", "magazine" }, 5 }, { { "FoodMeeps", "magazine" }, 1 }, - { { "ItemEmptyTin", "magazine" }, 5 } + { { "ItemEmptyTin", "magazine" }, 5 }, + { { "ItemBakedBeans", "magazine" }, 3 }, + { { "HotAxeSauce_epoch", "magazine" }, 1 } + + }; }; @@ -229,11 +301,12 @@ class CfgLootTable class GenericBed { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 3 }, { { "ItemLockbox", "magazine" }, 5 }, { { "ItemMixOil", "magazine" }, 4 }, { { "ItemCoolerE", "magazine" }, 6 }, { { "CircuitParts", "magazine" }, 8 }, - { { "VehicleRepair", "magazine" }, 7 }, + { { "Repairs", "CfgLootTable" }, 7 }, { { "Towelette", "magazine" }, 14 }, { { "HotColdPacks", "CfgLootTable" }, 8 }, { { "PaintCans", "CfgLootTable" }, 9 }, @@ -246,9 +319,10 @@ class CfgLootTable class GenericLarge { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 4 }, { { "MortarBucket", "magazine" }, 16 }, { { "CinderBlocks", "magazine" }, 17 }, - { { "VehicleRepair", "magazine" }, 16 }, + { { "Repairs", "CfgLootTable" }, 16 }, { { "CircuitParts", "magazine" }, 17 }, { { "ItemCorrugated", "magazine" }, 17 }, { { "ItemSolar", "magazine" }, 5 }, @@ -264,12 +338,13 @@ class CfgLootTable class GenericAuto { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 4 }, { { "ItemSafe", "magazine" }, 1 }, { { "ItemLockbox", "magazine" }, 4 }, { { "jerrycan_epoch", "magazine" }, 5 }, { { "CircuitParts", "magazine" }, 6 }, { { "MortarBucket", "magazine" }, 9 }, - { { "VehicleRepair", "magazine" }, 10 }, + { { "Repairs", "CfgLootTable" }, 10 }, { { "ItemCorrugated", "magazine" }, 11 }, { { "CinderBlocks", "magazine" }, 12 }, { { "JackKit", "magazine" }, 8 }, @@ -569,13 +644,15 @@ class CfgLootTable class Tools { items[] = { - { { "Hatchet", "weapon" }, 62 }, + { { "Hatchet", "weapon" }, 40 }, { { "MeleeSledge", "weapon" }, 20 }, { { "ChainSaw", "weapon" }, 10 }, { { "Plunger", "weapon" }, 4 }, { { "MeleeSword", "weapon" }, 1 }, { { "MeleeRod", "weapon" }, 2 }, - { { "lighter_epoch", "magazine" }, 1 } + { { "lighter_epoch", "magazine" }, 1 }, + { { "SmeltingTools_EPOCH", "magazine" }, 10 } + }; }; @@ -713,16 +790,13 @@ class CfgLootTable }; }; - class Shipwreak + class Shipwreck { items[] = { { { "Gems", "CfgLootTable" }, 5 }, { { "MetalBars", "CfgLootTable" }, 26 }, { { "PartOreGold", "magazine" }, 10 }, - { { "PartOreSilver", "magazine" }, 13 }, - { { "ItemKiloHemp", "magazine" }, 12 }, - { { "ItemScraps", "magazine" }, 16 }, - { { "PartOre", "magazine" }, 18 } + { { "PartOreSilver", "magazine" }, 13 } }; }; class MetalBars @@ -760,21 +834,74 @@ class CfgLootTable { { "PartOre", "magazine" }, 35 } }; }; + class CopperMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 15 }, + { { "PartOreGold", "magazine" }, 20 }, + { { "PartOreSilver", "magazine" }, 30 }, + { { "PartOre", "magazine" }, 35 } + }; + }; + class SilverMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 15 }, + { { "PartOreGold", "magazine" }, 20 }, + { { "PartOreSilver", "magazine" }, 35 }, + { { "PartOre", "magazine" }, 30 } + }; + }; + class GoldMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 20 }, + { { "PartOreGold", "magazine" }, 35 }, + { { "PartOreSilver", "magazine" }, 20 }, + { { "PartOre", "magazine" }, 25 } + }; + }; + class Satellite + { + items[] = { + { { "MetalBars", "CfgLootTable" }, 5 }, + { { "CircuitParts", "magazine" }, 1 }, + { { "Gems", "CfgLootTable" }, 3 }, + { { "ItemScraps", "magazine" }, 1 }, + { { "ItemCorrugated", "magazine" }, 2 }, + { { "ItemSolar", "magazine" }, 1 }, + { { "ItemBattery", "magazine" }, 1 }, + { { "ItemCables", "magazine" }, 1 } + }; + }; class Food { items[] = { - { { "ItemCoolerE", "magazine" }, 4 }, - { { "Sodas", "CfgLootTable" }, 47 }, - { { "CanFood", "CfgLootTable" }, 49 } + { { "ItemCoolerE", "magazine" }, 3 }, + { { "bluburger_epoch", "magazine" }, 4 }, + { { "redburger_epoch", "magazine" }, 4 }, + { { "gyro_wrap_epoch", "magazine" }, 4 }, + { { "icecream_epoch", "magazine" }, 3 }, + { { "Sodas", "CfgLootTable" }, 45 }, + { { "CanFood", "CfgLootTable" }, 40 } }; }; class Medical { items[] = { - { { "FAK", "item" }, 97 }, + { { "FAK", "magazine" }, 50 }, { { "Heal_EPOCH", "item" }, 2 }, { { "Defib_EPOCH", "item" }, 1 }, - { { "EnergyPack", "magazine" }, 1 } + { {"atropine_epoch", "magazine" }, 6 }, + { {"adrenaline_epoch", "magazine" }, 5 }, + { {"morphine_epoch", "magazine" }, 3 }, + { {"caffeinepills_epoch", "magazine" }, 10 }, + { {"orlistat_epoch", "magazine" }, 5 }, + { {"nanite_cream_epoch", "magazine" }, 3 }, + { {"nanite_gun_epoch", "magazine" }, 1 }, + { {"nanite_pills_epoch", "magazine" }, 5 }, + { {"iodide_pills_epoch", "magazine" }, 5 }, + { {"ItemWaterPurificationTablets", "magazine" }, 5 } }; }; class BaseBuilding @@ -1071,10 +1198,80 @@ class CfgLootTable { { "U_C_Scientist", "item" }, 1 }, { { "U_OrestesBody", "item" }, 1 }, { { "DLCUniforms", "CfgLootTable" }, 1 }, - { { "MaleUniforms_FullGhillieMarkDLC", "CfgLootTable" }, 1 } + { { "MaleUniforms_FullGhillieMarkDLC", "CfgLootTable" }, 1 }, + + // new uniforms + { { "U_C_Commoner1_1", "item" }, 1 }, + { { "U_C_Poor_2", "item" }, 1 }, + { { "U_C_HunterBody_grn", "item" }, 1 }, + { { "U_C_Poor_shorts_1", "item" }, 1 }, + { { "U_C_Commoner_shorts", "item" }, 1 }, + { { "U_C_ShirtSurfer_shorts", "item" }, 1 }, + { { "U_C_TeeSurfer_shorts_1", "item" }, 1 }, + { { "U_C_TeeSurfer_shorts_2", "item" }, 1 }, + { { "U_NikosBody", "item" }, 1 }, + { { "U_NikosAgedBody", "item" }, 1 }, + { { "U_IG_Guerilla1_1", "item" }, 1 }, + { { "U_IG_leader", "item" }, 1 }, + { { "U_IG_Guerilla2_1", "item" }, 1 }, + { { "U_IG_Guerilla2_3", "item" }, 1 }, + { { "U_IG_Guerilla2_2", "item" }, 1 }, + { { "U_IG_Guerilla3_1", "item" }, 1 }, + { { "U_IG_Guerrilla_6_1", "item" }, 1 }, + { { "U_OG_Guerrilla_6_1", "item" }, 1 }, + { { "U_I_CombatUniform", "item" }, 1 }, + { { "U_I_CombatUniform_shortsleeve", "item" }, 1 }, + { { "U_I_HeliPilotCoveralls", "item" }, 1 }, + { { "U_I_pilotCoveralls", "item" }, 1 }, + { { "U_I_OfficerUniform", "item" }, 1 }, + { { "U_I_Wetsuit", "item" }, 1 }, + { { "U_I_GhillieSuit", "item" }, 1 }, + { { "U_I_CombatUniform_tshirt", "item" }, 1 }, + { { "U_O_OfficerUniform_ocamo", "item" }, 1 }, + { { "U_O_SpecopsUniform_ocamo", "item" }, 1 }, + { { "U_O_CombatUniform_oucamo", "item" }, 1 }, + { { "U_Marshal", "item" }, 1 }, + { { "U_I_FullGhillie_lsh", "item" }, 1 }, + { { "U_I_FullGhillie_sard", "item" }, 1 }, + { { "U_I_FullGhillie_ard", "item" }, 1 }, + { { "U_I_C_Soldier_Para_1_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_2_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_3_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_4_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_5_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_1_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_2_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_3_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_4_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_5_F", "item" }, 1 }, + { { "U_I_C_Soldier_Camo_F", "item" }, 1 }, + { { "U_O_T_Soldier_F", "item" }, 1 }, + { { "U_O_T_Officer_F", "item" }, 1 }, + { { "U_O_T_Sniper_F", "item" }, 1 }, + { { "U_O_T_FullGhillie_tna_F", "item" }, 1 }, + { { "U_O_V_Soldier_Viper_F", "item" }, 1 }, + { { "U_O_V_Soldier_Viper_hex_F", "item" }, 1 }, + { { "U_C_man_sport_1_F", "item" }, 1 }, + { { "U_C_man_sport_2_F", "item" }, 1 }, + { { "U_C_man_sport_3_F", "item" }, 1 }, + { { "U_C_Man_casual_1_F", "item" }, 1 }, + { { "U_C_Man_casual_2_F", "item" }, 1 }, + { { "U_C_Man_casual_3_F", "item" }, 1 }, + { { "U_C_Man_casual_4_F", "item" }, 1 }, + { { "U_C_Man_casual_5_F", "item" }, 1 }, + { { "U_C_Man_casual_6_F", "item" }, 1 }, + // LoW DLC + { { "U_C_ConstructionCoverall_Red_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_vrana_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Black_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Blue_F", "item" }, 1 }, + { { "U_C_Paramedic_01_F", "item" }, 1 }, + { { "U_C_Mechanic_01_F", "item" }, 1 } + }; }; + class MaleUniforms_FullGhillieMarkDLC { items[] = { @@ -1144,7 +1341,92 @@ class CfgLootTable { { "U_Camo_uniform", "item" }, 1 }, { { "U_ghillie1_uniform", "item" }, 1 }, { { "U_ghillie2_uniform", "item" }, 1 }, - { { "U_ghillie3_uniform", "item" }, 1 } + { { "U_ghillie3_uniform", "item" }, 1 }, + + { { "U_JeansPatched1_uniform", "item" }, 1 }, + { { "U_JeansPatched2_uniform", "item" }, 1 }, + { { "U_JeansPatched3_uniform", "item" }, 1 }, + { { "U_JeansPatched4_uniform", "item" }, 1 }, + { { "U_JeansPatched5_uniform", "item" }, 1 }, + { { "U_JeansPatched6_uniform", "item" }, 1 }, + { { "U_JeansPatched7_uniform", "item" }, 1 }, + { { "U_JeansPatched8_uniform", "item" }, 1 }, + { { "U_JeansPatched9_uniform", "item" }, 1 }, + { { "U_JeansPatched10_uniform", "item" }, 1 }, + { { "U_JeansPatched11_uniform", "item" }, 1 }, + { { "U_JeansPatched12_uniform", "item" }, 1 }, + { { "U_JeansPatched13_uniform", "item" }, 1 }, + { { "U_JeansPatched14_uniform", "item" }, 1 }, + { { "U_JeansPatched15_uniform", "item" }, 1 }, + { { "U_JeansPatched16_uniform", "item" }, 1 }, + { { "U_JeansPatched17_uniform", "item" }, 1 }, + { { "U_JeansPatched18_uniform", "item" }, 1 }, + { { "U_JeansPatched19_uniform", "item" }, 1 }, + { { "U_JeansPatched20_uniform", "item" }, 1 }, + { { "U_JeansPatched21_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn1_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn2_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn3_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn4_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn5_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn6_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn7_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn8_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn9_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn10_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn11_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn12_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn13_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn14_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn15_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn16_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn17_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn18_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn19_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn20_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn21_uniform", "item" }, 1 }, + { { "U_JeansArBrn1_uniform", "item" }, 1 }, + { { "U_JeansArBrn2_uniform", "item" }, 1 }, + { { "U_JeansArBrn3_uniform", "item" }, 1 }, + { { "U_JeansArBrn4_uniform", "item" }, 1 }, + { { "U_JeansArBrn5_uniform", "item" }, 1 }, + { { "U_JeansArBrn6_uniform", "item" }, 1 }, + { { "U_JeansArBrn7_uniform", "item" }, 1 }, + { { "U_JeansArBrn8_uniform", "item" }, 1 }, + { { "U_JeansArBrn9_uniform", "item" }, 1 }, + { { "U_JeansArBrn10_uniform", "item" }, 1 }, + { { "U_JeansArBrn11_uniform", "item" }, 1 }, + { { "U_JeansArBrn12_uniform", "item" }, 1 }, + { { "U_JeansArBrn13_uniform", "item" }, 1 }, + { { "U_JeansArBrn14_uniform", "item" }, 1 }, + { { "U_JeansArBrn15_uniform", "item" }, 1 }, + { { "U_JeansArBrn16_uniform", "item" }, 1 }, + { { "U_JeansArBrn17_uniform", "item" }, 1 }, + { { "U_JeansArBrn18_uniform", "item" }, 1 }, + { { "U_JeansArBrn19_uniform", "item" }, 1 }, + { { "U_JeansArBrn20_uniform", "item" }, 1 }, + { { "U_JeansArBrn21_uniform", "item" }, 1 }, + { { "U_JeansBlack1_uniform", "item" }, 1 }, + { { "U_JeansBlack2_uniform", "item" }, 1 }, + { { "U_JeansBlack3_uniform", "item" }, 1 }, + { { "U_JeansBlack4_uniform", "item" }, 1 }, + { { "U_JeansBlack5_uniform", "item" }, 1 }, + { { "U_JeansBlack6_uniform", "item" }, 1 }, + { { "U_JeansBlack7_uniform", "item" }, 1 }, + { { "U_JeansBlack8_uniform", "item" }, 1 }, + { { "U_JeansBlack9_uniform", "item" }, 1 }, + { { "U_JeansBlack10_uniform", "item" }, 1 }, + { { "U_JeansBlack11_uniform", "item" }, 1 }, + { { "U_JeansBlack12_uniform", "item" }, 1 }, + { { "U_JeansBlack13_uniform", "item" }, 1 }, + { { "U_JeansBlack14_uniform", "item" }, 1 }, + { { "U_JeansBlack15_uniform", "item" }, 1 }, + { { "U_JeansBlack16_uniform", "item" }, 1 }, + { { "U_JeansBlack17_uniform", "item" }, 1 }, + { { "U_JeansBlack18_uniform", "item" }, 1 }, + { { "U_JeansBlack19_uniform", "item" }, 1 }, + { { "U_JeansBlack20_uniform", "item" }, 1 }, + { { "U_JeansBlack21_uniform", "item" }, 1 } }; }; @@ -1326,9 +1608,15 @@ class CfgLootTable { { "H_92_EPOCH", "item" }, 1 }, { { "H_104_EPOCH", "item" }, 1 }, { { "H_105_EPOCH", "item" }, 1 }, - { { "wolf_mask_epoch", "item" }, 1 }, - { { "pkin_mask_epoch", "item" }, 1 }, - { { "clown_mask_epoch", "item" }, 1 } + { { "wolf_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "pkin_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "clown_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "hockey_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "plague_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "ghostface_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "skull_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "witch_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "radiation_mask_epoch", "item" }, 1 } }; }; }; diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h b/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h index b50a0ae3..799baad4 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h @@ -20,6 +20,25 @@ class CfgLootTable_CUP { { "WoodLog_EPOCH", "magazine" }, 1 } }; }; + class Rock + { + items[] = { + { { "PartOre", "magazine" }, 1 }, + { { "ItemRock", "magazine" }, 2 } + }; + }; + class Cinder + { + items[] = { + { { "CinderBlocks", "magazine" }, 1 } + }; + }; + class Wreck + { + items[] = { + { { "ItemScraps", "magazine" }, 1 } + }; + }; class Bush { items[] = { @@ -45,7 +64,8 @@ class CfgLootTable_CUP { items[] = { { { "ItemCompass", "item" }, 20 }, - { { "ItemGPS", "item" }, 10 }, + { { "ItemGeigerCounter_EPOCH", "item" }, 1 }, + { { "ItemGPS", "item" }, 9 }, { { "EpochRadio0", "item" }, 3 }, { { "EpochRadio1", "item" }, 3 }, { { "EpochRadio2", "item" }, 3 }, @@ -57,17 +77,39 @@ class CfgLootTable_CUP { { "EpochRadio8", "item" }, 1 }, { { "EpochRadio9", "item" }, 1 }, { { "ItemWatch", "item" }, 30 }, - { { "FAK", "item" }, 20 } + { { "FAK", "magazine" }, 20 } + }; + }; + class Repairs + { + items[] = { + { { "VehicleRepair", "magazine" }, 30 }, + { { "SpareTire", "magazine" }, 10 }, + { { "EngineParts", "magazine" }, 10 }, + { { "EngineBlock", "magazine" }, 10 }, + { { "ItemGlass", "magazine" }, 15 }, + { { "ItemDuctTape", "magazine" }, 20 }, + { { "ItemRotor", "magazine" }, 5 } + }; + }; + class VehicleDocs + { + items[] = { + { { "ItemVehDoc1", "magazine" }, 20 }, + { { "ItemVehDoc2", "magazine" }, 15 }, + { { "ItemVehDoc3", "magazine" }, 4 }, + { { "ItemVehDoc4", "magazine" }, 2 } }; }; class Equipment { items[] = { - { { "Rangefinder", "weapon" }, 5 }, - { { "Binocular", "item" }, 35 }, - { { "NVG_EPOCH", "item" }, 10 }, + { { "Rangefinder", "weapon" }, 15 }, + { { "Binocular", "item" }, 40 }, + { { "NVG_EPOCH", "item" }, 5 }, { { "acc_flashlight", "item" }, 15 }, - { { "acc_pointer_IR", "item" }, 15 }, + { { "acc_flashlight_pistol", "item" }, 10 }, + { { "acc_pointer_IR", "item" }, 5 }, // Marksman DLC { { "Bipods", "CfgLootTable" }, 5 }, // CUP @@ -250,7 +292,7 @@ class CfgLootTable_CUP { { "ItemMixOil", "magazine" }, 4 }, { { "ItemCoolerE", "magazine" }, 6 }, { { "CircuitParts", "magazine" }, 8 }, - { { "VehicleRepair", "magazine" }, 7 }, + { { "Repairs", "CfgLootTable" }, 7 }, { { "Towelette", "magazine" }, 14 }, { { "HotColdPacks", "CfgLootTable" }, 9 }, { { "PaintCans", "CfgLootTable" }, 9 }, @@ -258,18 +300,37 @@ class CfgLootTable_CUP { { "CanFood", "CfgLootTable" }, 8 }, { { "Primitive", "CfgLootTable" }, 21 }, { { "lighter_epoch", "magazine" }, 1 }, + { { "Seeds", "CfgLootTable" }, 1 }, { { "ItemAluminumBar", "magazine" }, 2 }, { { "ItemCopperBar", "magazine" }, 2 }, - { { "ItemTinBar", "magazine" }, 1 } + { { "ItemTinBar", "magazine" }, 1 }, + { { "ItemCanteen_Dirty", "magazine" }, 5 }, + { { "ItemCanteen_Clean", "magazine" }, 1 }, + { { "ItemBottlePlastic_Dirty", "magazine" }, 5 }, + { { "ItemBottlePlastic_Clean", "magazine" }, 1 } + + }; + }; + class Seeds + { + items[] = { + { { "ItemSeedBag", "magazine" }, 10 }, + { { "SeedPacket_Hemp", "magazine" }, 1 }, + { { "SeedPacket_GoldenSeal", "magazine" }, 1 }, + { { "SeedPacket_Poppy", "magazine" }, 1 }, + { { "SeedPacket_Pumpkin", "magazine" }, 2 }, + { { "SeedPacket_Sunflower", "magazine" }, 2 } }; }; class Primitive { items[] = { - { { "ItemRock", "magazine" }, 1 }, - { { "ItemRope", "magazine" }, 1 }, - { { "ItemStick", "magazine" }, 1 }, - { { "ItemScraps", "magazine" }, 1 } + { { "ItemRock", "magazine" }, 5 }, + { { "ItemRope", "magazine" }, 2 }, + { { "ItemStick", "magazine" }, 5 }, + { { "ItemScraps", "magazine" }, 1 }, + { { "ItemCanvas", "magazine" }, 1 }, + { { "ItemBurlap", "magazine" }, 1 } }; }; class Sodas @@ -289,17 +350,28 @@ class CfgLootTable_CUP class CanFood { items[] = { + { { "ItemPowderMilk", "magazine" }, 3 }, + { { "ItemRicebox", "magazine" }, 3 }, + { { "ItemCereals", "magazine" }, 3 }, + { { "ItemVitamins", "magazine" }, 3 }, { { "honey_epoch", "magazine" }, 5 }, { { "emptyjar_epoch", "magazine" }, 13 }, + { { "water_epoch", "magazine" }, 3 }, + { { "clean_water_epoch", "magazine" }, 1 }, { { "FoodBioMeat", "magazine" }, 11 }, { { "sardines_epoch", "magazine" }, 11 }, { { "meatballs_epoch", "magazine" }, 13 }, { { "scam_epoch", "magazine" }, 14 }, { { "sweetcorn_epoch", "magazine" }, 14 }, - { { "FoodSnooter", "magazine" }, 9 }, + { { "FoodSnooter", "magazine" }, 5 }, + { { "krypto_candy_epoch", "magazine" }, 4 }, { { "TacticalBacon", "magazine" }, 5 }, { { "FoodMeeps", "magazine" }, 1 }, - { { "ItemEmptyTin", "magazine" }, 5 } + { { "ItemEmptyTin", "magazine" }, 5 }, + { { "ItemBakedBeans", "magazine" }, 3 }, + { { "HotAxeSauce_epoch", "magazine" }, 1 } + + }; }; @@ -322,11 +394,12 @@ class CfgLootTable_CUP class GenericBed { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 3 }, { { "ItemLockbox", "magazine" }, 5 }, { { "ItemMixOil", "magazine" }, 4 }, { { "ItemCoolerE", "magazine" }, 6 }, { { "CircuitParts", "magazine" }, 8 }, - { { "VehicleRepair", "magazine" }, 7 }, + { { "Repairs", "CfgLootTable" }, 7 }, { { "Towelette", "magazine" }, 14 }, { { "HotColdPacks", "CfgLootTable" }, 8 }, { { "PaintCans", "CfgLootTable" }, 9 }, @@ -339,9 +412,10 @@ class CfgLootTable_CUP class GenericLarge { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 4 }, { { "MortarBucket", "magazine" }, 16 }, { { "CinderBlocks", "magazine" }, 17 }, - { { "VehicleRepair", "magazine" }, 16 }, + { { "Repairs", "CfgLootTable" }, 16 }, { { "CircuitParts", "magazine" }, 17 }, { { "ItemCorrugated", "magazine" }, 17 }, { { "ItemSolar", "magazine" }, 5 }, @@ -355,12 +429,13 @@ class CfgLootTable_CUP class GenericAuto { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 4 }, { { "ItemSafe", "magazine" }, 1 }, { { "ItemLockbox", "magazine" }, 4 }, { { "jerrycan_epoch", "magazine" }, 5 }, { { "CircuitParts", "magazine" }, 6 }, { { "MortarBucket", "magazine" }, 9 }, - { { "VehicleRepair", "magazine" }, 10 }, + { { "Repairs", "CfgLootTable" }, 10 }, { { "ItemCorrugated", "magazine" }, 11 }, { { "CinderBlocks", "magazine" }, 12 }, { { "JackKit", "magazine" }, 8 }, @@ -996,13 +1071,15 @@ class CfgLootTable_CUP class Tools { items[] = { - { { "Hatchet", "weapon" }, 62 }, + { { "Hatchet", "weapon" }, 40 }, { { "MeleeSledge", "weapon" }, 20 }, { { "ChainSaw", "weapon" }, 10 }, { { "Plunger", "weapon" }, 4 }, { { "MeleeSword", "weapon" }, 1 }, { { "MeleeRod", "weapon" }, 2 }, - { { "lighter_epoch", "magazine" }, 1 } + { { "lighter_epoch", "magazine" }, 1 }, + { { "SmeltingTools_EPOCH", "magazine" }, 10 } + }; }; @@ -1276,16 +1353,13 @@ class CfgLootTable_CUP }; }; - class Shipwreak + class Shipwreck { items[] = { { { "Gems", "CfgLootTable" }, 5 }, { { "MetalBars", "CfgLootTable" }, 26 }, { { "PartOreGold", "magazine" }, 10 }, - { { "PartOreSilver", "magazine" }, 13 }, - { { "ItemKiloHemp", "magazine" }, 12 }, - { { "ItemScraps", "magazine" }, 16 }, - { { "PartOre", "magazine" }, 18 } + { { "PartOreSilver", "magazine" }, 13 } }; }; class MetalBars @@ -1323,21 +1397,74 @@ class CfgLootTable_CUP { { "PartOre", "magazine" }, 35 } }; }; + class CopperMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 15 }, + { { "PartOreGold", "magazine" }, 20 }, + { { "PartOreSilver", "magazine" }, 30 }, + { { "PartOre", "magazine" }, 35 } + }; + }; + class SilverMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 15 }, + { { "PartOreGold", "magazine" }, 20 }, + { { "PartOreSilver", "magazine" }, 35 }, + { { "PartOre", "magazine" }, 30 } + }; + }; + class GoldMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 20 }, + { { "PartOreGold", "magazine" }, 35 }, + { { "PartOreSilver", "magazine" }, 20 }, + { { "PartOre", "magazine" }, 25 } + }; + }; + class Satellite + { + items[] = { + { { "MetalBars", "CfgLootTable" }, 5 }, + { { "CircuitParts", "magazine" }, 1 }, + { { "Gems", "CfgLootTable" }, 3 }, + { { "ItemScraps", "magazine" }, 1 }, + { { "ItemCorrugated", "magazine" }, 2 }, + { { "ItemSolar", "magazine" }, 1 }, + { { "ItemBattery", "magazine" }, 1 }, + { { "ItemCables", "magazine" }, 1 } + }; + }; class Food { items[] = { - { { "ItemCoolerE", "magazine" }, 4 }, - { { "Sodas", "CfgLootTable" }, 47 }, - { { "CanFood", "CfgLootTable" }, 49 } + { { "ItemCoolerE", "magazine" }, 3 }, + { { "bluburger_epoch", "magazine" }, 4 }, + { { "redburger_epoch", "magazine" }, 4 }, + { { "gyro_wrap_epoch", "magazine" }, 4 }, + { { "icecream_epoch", "magazine" }, 3 }, + { { "Sodas", "CfgLootTable" }, 45 }, + { { "CanFood", "CfgLootTable" }, 40 } }; }; class Medical { items[] = { - { { "FAK", "item" }, 97 }, + { { "FAK", "magazine" }, 50 }, { { "Heal_EPOCH", "item" }, 2 }, { { "Defib_EPOCH", "item" }, 1 }, - { { "EnergyPack", "magazine" }, 1 } + { {"atropine_epoch", "magazine" }, 6 }, + { {"adrenaline_epoch", "magazine" }, 5 }, + { {"morphine_epoch", "magazine" }, 3 }, + { {"caffeinepills_epoch", "magazine" }, 10 }, + { {"orlistat_epoch", "magazine" }, 5 }, + { {"nanite_cream_epoch", "magazine" }, 3 }, + { {"nanite_gun_epoch", "magazine" }, 1 }, + { {"nanite_pills_epoch", "magazine" }, 5 }, + { {"iodide_pills_epoch", "magazine" }, 5 }, + { {"ItemWaterPurificationTablets", "magazine" }, 5 } }; }; class BaseBuilding @@ -1395,14 +1522,14 @@ class CfgLootTable_CUP class Fin_random_EPOCH { items[] = { - { { "GoatCarcass_EPOCH", "magazine" }, 1 }, + { { "DogCarcass_EPOCH", "magazine" }, 1 }, { { "Pelt_EPOCH", "magazine" }, 1 } }; }; class Alsatian_Random_EPOCH { items[] = { - { { "GoatCarcass_EPOCH", "magazine" }, 1 }, + { { "DogCarcass_EPOCH", "magazine" }, 1 }, { { "Pelt_EPOCH", "magazine" }, 1 } }; }; @@ -1634,7 +1761,75 @@ class CfgLootTable_CUP { { "U_C_Scientist", "item" }, 1 }, { { "U_OrestesBody", "item" }, 1 }, { { "DLCUniforms", "CfgLootTable" }, 1 }, - { { "MaleUniforms_FullGhillieMarkDLC", "CfgLootTable" }, 1 } + { { "MaleUniforms_FullGhillieMarkDLC", "CfgLootTable" }, 1 }, + + // new uniforms + { { "U_C_Commoner1_1", "item" }, 1 }, + { { "U_C_Poor_2", "item" }, 1 }, + { { "U_C_HunterBody_grn", "item" }, 1 }, + { { "U_C_Poor_shorts_1", "item" }, 1 }, + { { "U_C_Commoner_shorts", "item" }, 1 }, + { { "U_C_ShirtSurfer_shorts", "item" }, 1 }, + { { "U_C_TeeSurfer_shorts_1", "item" }, 1 }, + { { "U_C_TeeSurfer_shorts_2", "item" }, 1 }, + { { "U_NikosBody", "item" }, 1 }, + { { "U_NikosAgedBody", "item" }, 1 }, + { { "U_IG_Guerilla1_1", "item" }, 1 }, + { { "U_IG_leader", "item" }, 1 }, + { { "U_IG_Guerilla2_1", "item" }, 1 }, + { { "U_IG_Guerilla2_3", "item" }, 1 }, + { { "U_IG_Guerilla2_2", "item" }, 1 }, + { { "U_IG_Guerilla3_1", "item" }, 1 }, + { { "U_IG_Guerrilla_6_1", "item" }, 1 }, + { { "U_OG_Guerrilla_6_1", "item" }, 1 }, + { { "U_I_CombatUniform", "item" }, 1 }, + { { "U_I_CombatUniform_shortsleeve", "item" }, 1 }, + { { "U_I_HeliPilotCoveralls", "item" }, 1 }, + { { "U_I_pilotCoveralls", "item" }, 1 }, + { { "U_I_OfficerUniform", "item" }, 1 }, + { { "U_I_Wetsuit", "item" }, 1 }, + { { "U_I_GhillieSuit", "item" }, 1 }, + { { "U_I_CombatUniform_tshirt", "item" }, 1 }, + { { "U_O_OfficerUniform_ocamo", "item" }, 1 }, + { { "U_O_SpecopsUniform_ocamo", "item" }, 1 }, + { { "U_O_CombatUniform_oucamo", "item" }, 1 }, + { { "U_Marshal", "item" }, 1 }, + { { "U_I_FullGhillie_lsh", "item" }, 1 }, + { { "U_I_FullGhillie_sard", "item" }, 1 }, + { { "U_I_FullGhillie_ard", "item" }, 1 }, + { { "U_I_C_Soldier_Para_1_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_2_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_3_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_4_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_5_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_1_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_2_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_3_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_4_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_5_F", "item" }, 1 }, + { { "U_I_C_Soldier_Camo_F", "item" }, 1 }, + { { "U_O_T_Soldier_F", "item" }, 1 }, + { { "U_O_T_Officer_F", "item" }, 1 }, + { { "U_O_T_Sniper_F", "item" }, 1 }, + { { "U_O_T_FullGhillie_tna_F", "item" }, 1 }, + { { "U_O_V_Soldier_Viper_F", "item" }, 1 }, + { { "U_O_V_Soldier_Viper_hex_F", "item" }, 1 }, + { { "U_C_man_sport_1_F", "item" }, 1 }, + { { "U_C_man_sport_2_F", "item" }, 1 }, + { { "U_C_man_sport_3_F", "item" }, 1 }, + { { "U_C_Man_casual_1_F", "item" }, 1 }, + { { "U_C_Man_casual_2_F", "item" }, 1 }, + { { "U_C_Man_casual_3_F", "item" }, 1 }, + { { "U_C_Man_casual_4_F", "item" }, 1 }, + { { "U_C_Man_casual_5_F", "item" }, 1 }, + { { "U_C_Man_casual_6_F", "item" }, 1 }, + // LoW DLC + { { "U_C_ConstructionCoverall_Red_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_vrana_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Black_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Blue_F", "item" }, 1 }, + { { "U_C_Paramedic_01_F", "item" }, 1 }, + { { "U_C_Mechanic_01_F", "item" }, 1 } }; }; @@ -1707,7 +1902,92 @@ class CfgLootTable_CUP { { "U_Camo_uniform", "item" }, 1 }, { { "U_ghillie1_uniform", "item" }, 1 }, { { "U_ghillie2_uniform", "item" }, 1 }, - { { "U_ghillie3_uniform", "item" }, 1 } + { { "U_ghillie3_uniform", "item" }, 1 }, + + { { "U_JeansPatched1_uniform", "item" }, 1 }, + { { "U_JeansPatched2_uniform", "item" }, 1 }, + { { "U_JeansPatched3_uniform", "item" }, 1 }, + { { "U_JeansPatched4_uniform", "item" }, 1 }, + { { "U_JeansPatched5_uniform", "item" }, 1 }, + { { "U_JeansPatched6_uniform", "item" }, 1 }, + { { "U_JeansPatched7_uniform", "item" }, 1 }, + { { "U_JeansPatched8_uniform", "item" }, 1 }, + { { "U_JeansPatched9_uniform", "item" }, 1 }, + { { "U_JeansPatched10_uniform", "item" }, 1 }, + { { "U_JeansPatched11_uniform", "item" }, 1 }, + { { "U_JeansPatched12_uniform", "item" }, 1 }, + { { "U_JeansPatched13_uniform", "item" }, 1 }, + { { "U_JeansPatched14_uniform", "item" }, 1 }, + { { "U_JeansPatched15_uniform", "item" }, 1 }, + { { "U_JeansPatched16_uniform", "item" }, 1 }, + { { "U_JeansPatched17_uniform", "item" }, 1 }, + { { "U_JeansPatched18_uniform", "item" }, 1 }, + { { "U_JeansPatched19_uniform", "item" }, 1 }, + { { "U_JeansPatched20_uniform", "item" }, 1 }, + { { "U_JeansPatched21_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn1_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn2_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn3_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn4_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn5_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn6_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn7_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn8_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn9_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn10_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn11_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn12_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn13_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn14_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn15_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn16_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn17_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn18_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn19_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn20_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn21_uniform", "item" }, 1 }, + { { "U_JeansArBrn1_uniform", "item" }, 1 }, + { { "U_JeansArBrn2_uniform", "item" }, 1 }, + { { "U_JeansArBrn3_uniform", "item" }, 1 }, + { { "U_JeansArBrn4_uniform", "item" }, 1 }, + { { "U_JeansArBrn5_uniform", "item" }, 1 }, + { { "U_JeansArBrn6_uniform", "item" }, 1 }, + { { "U_JeansArBrn7_uniform", "item" }, 1 }, + { { "U_JeansArBrn8_uniform", "item" }, 1 }, + { { "U_JeansArBrn9_uniform", "item" }, 1 }, + { { "U_JeansArBrn10_uniform", "item" }, 1 }, + { { "U_JeansArBrn11_uniform", "item" }, 1 }, + { { "U_JeansArBrn12_uniform", "item" }, 1 }, + { { "U_JeansArBrn13_uniform", "item" }, 1 }, + { { "U_JeansArBrn14_uniform", "item" }, 1 }, + { { "U_JeansArBrn15_uniform", "item" }, 1 }, + { { "U_JeansArBrn16_uniform", "item" }, 1 }, + { { "U_JeansArBrn17_uniform", "item" }, 1 }, + { { "U_JeansArBrn18_uniform", "item" }, 1 }, + { { "U_JeansArBrn19_uniform", "item" }, 1 }, + { { "U_JeansArBrn20_uniform", "item" }, 1 }, + { { "U_JeansArBrn21_uniform", "item" }, 1 }, + { { "U_JeansBlack1_uniform", "item" }, 1 }, + { { "U_JeansBlack2_uniform", "item" }, 1 }, + { { "U_JeansBlack3_uniform", "item" }, 1 }, + { { "U_JeansBlack4_uniform", "item" }, 1 }, + { { "U_JeansBlack5_uniform", "item" }, 1 }, + { { "U_JeansBlack6_uniform", "item" }, 1 }, + { { "U_JeansBlack7_uniform", "item" }, 1 }, + { { "U_JeansBlack8_uniform", "item" }, 1 }, + { { "U_JeansBlack9_uniform", "item" }, 1 }, + { { "U_JeansBlack10_uniform", "item" }, 1 }, + { { "U_JeansBlack11_uniform", "item" }, 1 }, + { { "U_JeansBlack12_uniform", "item" }, 1 }, + { { "U_JeansBlack13_uniform", "item" }, 1 }, + { { "U_JeansBlack14_uniform", "item" }, 1 }, + { { "U_JeansBlack15_uniform", "item" }, 1 }, + { { "U_JeansBlack16_uniform", "item" }, 1 }, + { { "U_JeansBlack17_uniform", "item" }, 1 }, + { { "U_JeansBlack18_uniform", "item" }, 1 }, + { { "U_JeansBlack19_uniform", "item" }, 1 }, + { { "U_JeansBlack20_uniform", "item" }, 1 }, + { { "U_JeansBlack21_uniform", "item" }, 1 } }; }; @@ -1889,9 +2169,15 @@ class CfgLootTable_CUP { { "H_92_EPOCH", "item" }, 1 }, { { "H_104_EPOCH", "item" }, 1 }, { { "H_105_EPOCH", "item" }, 1 }, - { { "wolf_mask_epoch", "item" }, 1 }, - { { "pkin_mask_epoch", "item" }, 1 }, - { { "clown_mask_epoch", "item" }, 1 } + { { "wolf_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "pkin_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "clown_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "hockey_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "plague_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "ghostface_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "skull_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "witch_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "radiation_mask_epoch", "item" }, 1 } }; }; }; diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h b/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h index 0e7df11f..f75ec112 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h @@ -20,6 +20,25 @@ class CfgLootTable_MAD { { "WoodLog_EPOCH", "magazine" }, 1 } }; }; + class Rock + { + items[] = { + { { "PartOre", "magazine" }, 1 }, + { { "ItemRock", "magazine" }, 2 } + }; + }; + class Cinder + { + items[] = { + { { "CinderBlocks", "magazine" }, 1 } + }; + }; + class Wreck + { + items[] = { + { { "ItemScraps", "magazine" }, 1 } + }; + }; class Bush { items[] = { @@ -45,7 +64,8 @@ class CfgLootTable_MAD { items[] = { { { "ItemCompass", "item" }, 20 }, - { { "ItemGPS", "item" }, 10 }, + { { "ItemGeigerCounter_EPOCH", "item" }, 1 }, + { { "ItemGPS", "item" }, 9 }, { { "EpochRadio0", "item" }, 3 }, { { "EpochRadio1", "item" }, 3 }, { { "EpochRadio2", "item" }, 3 }, @@ -57,17 +77,39 @@ class CfgLootTable_MAD { { "EpochRadio8", "item" }, 1 }, { { "EpochRadio9", "item" }, 1 }, { { "ItemWatch", "item" }, 30 }, - { { "FAK", "item" }, 20 } + { { "FAK", "magazine" }, 20 } + }; + }; + class Repairs + { + items[] = { + { { "VehicleRepair", "magazine" }, 30 }, + { { "SpareTire", "magazine" }, 10 }, + { { "EngineParts", "magazine" }, 10 }, + { { "EngineBlock", "magazine" }, 10 }, + { { "ItemGlass", "magazine" }, 15 }, + { { "ItemDuctTape", "magazine" }, 20 }, + { { "ItemRotor", "magazine" }, 5 } + }; + }; + class VehicleDocs + { + items[] = { + { { "ItemVehDoc1", "magazine" }, 20 }, + { { "ItemVehDoc2", "magazine" }, 15 }, + { { "ItemVehDoc3", "magazine" }, 4 }, + { { "ItemVehDoc4", "magazine" }, 2 } }; }; class Equipment { items[] = { - { { "Rangefinder", "weapon" }, 5 }, + { { "Rangefinder", "weapon" }, 15 }, { { "Binocular", "item" }, 40 }, - { { "NVG_EPOCH", "item" }, 10 }, - { { "acc_flashlight", "item" }, 20 }, - { { "acc_pointer_IR", "item" }, 20 }, + { { "NVG_EPOCH", "item" }, 5 }, + { { "acc_flashlight", "item" }, 15 }, + { { "acc_flashlight_pistol", "item" }, 10 }, + { { "acc_pointer_IR", "item" }, 5 }, // Marksman DLC { { "Bipods", "CfgLootTable" }, 5 } @@ -154,7 +196,7 @@ class CfgLootTable_MAD { { "ItemMixOil", "magazine" }, 4 }, { { "ItemCoolerE", "magazine" }, 6 }, { { "CircuitParts", "magazine" }, 8 }, - { { "VehicleRepair", "magazine" }, 7 }, + { { "Repairs", "CfgLootTable" }, 7 }, { { "Towelette", "magazine" }, 14 }, { { "HotColdPacks", "CfgLootTable" }, 9 }, { { "PaintCans", "CfgLootTable" }, 9 }, @@ -162,20 +204,37 @@ class CfgLootTable_MAD { { "CanFood", "CfgLootTable" }, 8 }, { { "Primitive", "CfgLootTable" }, 21 }, { { "lighter_epoch", "magazine" }, 1 }, - + { { "Seeds", "CfgLootTable" }, 1 }, { { "ItemAluminumBar", "magazine" }, 2 }, { { "ItemCopperBar", "magazine" }, 2 }, - { { "ItemTinBar", "magazine" }, 1 } + { { "ItemTinBar", "magazine" }, 1 }, + { { "ItemCanteen_Dirty", "magazine" }, 5 }, + { { "ItemCanteen_Clean", "magazine" }, 1 }, + { { "ItemBottlePlastic_Dirty", "magazine" }, 5 }, + { { "ItemBottlePlastic_Clean", "magazine" }, 1 } + + }; + }; + class Seeds + { + items[] = { + { { "ItemSeedBag", "magazine" }, 10 }, + { { "SeedPacket_Hemp", "magazine" }, 1 }, + { { "SeedPacket_GoldenSeal", "magazine" }, 1 }, + { { "SeedPacket_Poppy", "magazine" }, 1 }, + { { "SeedPacket_Pumpkin", "magazine" }, 2 }, + { { "SeedPacket_Sunflower", "magazine" }, 2 } }; }; - class Primitive { items[] = { - { { "ItemRock", "magazine" }, 1 }, - { { "ItemRope", "magazine" }, 1 }, - { { "ItemStick", "magazine" }, 1 }, - { { "ItemScraps", "magazine" }, 1 } + { { "ItemRock", "magazine" }, 5 }, + { { "ItemRope", "magazine" }, 2 }, + { { "ItemStick", "magazine" }, 5 }, + { { "ItemScraps", "magazine" }, 1 }, + { { "ItemCanvas", "magazine" }, 1 }, + { { "ItemBurlap", "magazine" }, 1 } }; }; @@ -196,17 +255,28 @@ class CfgLootTable_MAD class CanFood { items[] = { + { { "ItemPowderMilk", "magazine" }, 3 }, + { { "ItemRicebox", "magazine" }, 3 }, + { { "ItemCereals", "magazine" }, 3 }, + { { "ItemVitamins", "magazine" }, 3 }, { { "honey_epoch", "magazine" }, 5 }, { { "emptyjar_epoch", "magazine" }, 13 }, + { { "water_epoch", "magazine" }, 3 }, + { { "clean_water_epoch", "magazine" }, 1 }, { { "FoodBioMeat", "magazine" }, 11 }, { { "sardines_epoch", "magazine" }, 11 }, { { "meatballs_epoch", "magazine" }, 13 }, { { "scam_epoch", "magazine" }, 14 }, { { "sweetcorn_epoch", "magazine" }, 14 }, - { { "FoodSnooter", "magazine" }, 9 }, + { { "FoodSnooter", "magazine" }, 5 }, + { { "krypto_candy_epoch", "magazine" }, 4 }, { { "TacticalBacon", "magazine" }, 5 }, { { "FoodMeeps", "magazine" }, 1 }, - { { "ItemEmptyTin", "magazine" }, 5 } + { { "ItemEmptyTin", "magazine" }, 5 }, + { { "ItemBakedBeans", "magazine" }, 3 }, + { { "HotAxeSauce_epoch", "magazine" }, 1 } + + }; }; @@ -229,11 +299,12 @@ class CfgLootTable_MAD class GenericBed { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 3 }, { { "ItemLockbox", "magazine" }, 5 }, { { "ItemMixOil", "magazine" }, 4 }, { { "ItemCoolerE", "magazine" }, 6 }, { { "CircuitParts", "magazine" }, 8 }, - { { "VehicleRepair", "magazine" }, 7 }, + { { "Repairs", "CfgLootTable" }, 7 }, { { "Towelette", "magazine" }, 14 }, { { "HotColdPacks", "CfgLootTable" }, 8 }, { { "PaintCans", "CfgLootTable" }, 9 }, @@ -246,9 +317,10 @@ class CfgLootTable_MAD class GenericLarge { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 4 }, { { "MortarBucket", "magazine" }, 16 }, { { "CinderBlocks", "magazine" }, 17 }, - { { "VehicleRepair", "magazine" }, 16 }, + { { "Repairs", "CfgLootTable" }, 16 }, { { "CircuitParts", "magazine" }, 17 }, { { "ItemCorrugated", "magazine" }, 17 }, { { "ItemSolar", "magazine" }, 5 }, @@ -264,12 +336,13 @@ class CfgLootTable_MAD class GenericAuto { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 4 }, { { "ItemSafe", "magazine" }, 1 }, { { "ItemLockbox", "magazine" }, 4 }, { { "jerrycan_epoch", "magazine" }, 5 }, { { "CircuitParts", "magazine" }, 6 }, { { "MortarBucket", "magazine" }, 9 }, - { { "VehicleRepair", "magazine" }, 10 }, + { { "Repairs", "CfgLootTable" }, 10 }, { { "ItemCorrugated", "magazine" }, 11 }, { { "CinderBlocks", "magazine" }, 12 }, { { "JackKit", "magazine" }, 8 }, @@ -573,13 +646,15 @@ class CfgLootTable_MAD class Tools { items[] = { - { { "Hatchet", "weapon" }, 62 }, + { { "Hatchet", "weapon" }, 40 }, { { "MeleeSledge", "weapon" }, 20 }, { { "ChainSaw", "weapon" }, 10 }, { { "Plunger", "weapon" }, 4 }, { { "MeleeSword", "weapon" }, 1 }, { { "MeleeRod", "weapon" }, 2 }, - { { "lighter_epoch", "magazine" }, 1 } + { { "lighter_epoch", "magazine" }, 1 }, + { { "SmeltingTools_EPOCH", "magazine" }, 10 } + }; }; @@ -718,16 +793,13 @@ class CfgLootTable_MAD }; }; - class Shipwreak + class Shipwreck { items[] = { { { "Gems", "CfgLootTable" }, 5 }, { { "MetalBars", "CfgLootTable" }, 26 }, { { "PartOreGold", "magazine" }, 10 }, - { { "PartOreSilver", "magazine" }, 13 }, - { { "ItemKiloHemp", "magazine" }, 12 }, - { { "ItemScraps", "magazine" }, 16 }, - { { "PartOre", "magazine" }, 18 } + { { "PartOreSilver", "magazine" }, 13 } }; }; class MetalBars @@ -765,21 +837,74 @@ class CfgLootTable_MAD { { "PartOre", "magazine" }, 35 } }; }; + class CopperMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 15 }, + { { "PartOreGold", "magazine" }, 20 }, + { { "PartOreSilver", "magazine" }, 30 }, + { { "PartOre", "magazine" }, 35 } + }; + }; + class SilverMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 15 }, + { { "PartOreGold", "magazine" }, 20 }, + { { "PartOreSilver", "magazine" }, 35 }, + { { "PartOre", "magazine" }, 30 } + }; + }; + class GoldMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 20 }, + { { "PartOreGold", "magazine" }, 35 }, + { { "PartOreSilver", "magazine" }, 20 }, + { { "PartOre", "magazine" }, 25 } + }; + }; + class Satellite + { + items[] = { + { { "MetalBars", "CfgLootTable" }, 5 }, + { { "CircuitParts", "magazine" }, 1 }, + { { "Gems", "CfgLootTable" }, 3 }, + { { "ItemScraps", "magazine" }, 1 }, + { { "ItemCorrugated", "magazine" }, 2 }, + { { "ItemSolar", "magazine" }, 1 }, + { { "ItemBattery", "magazine" }, 1 }, + { { "ItemCables", "magazine" }, 1 } + }; + }; class Food { items[] = { - { { "ItemCoolerE", "magazine" }, 4 }, - { { "Sodas", "CfgLootTable" }, 47 }, - { { "CanFood", "CfgLootTable" }, 49 } + { { "ItemCoolerE", "magazine" }, 3 }, + { { "bluburger_epoch", "magazine" }, 4 }, + { { "redburger_epoch", "magazine" }, 4 }, + { { "gyro_wrap_epoch", "magazine" }, 4 }, + { { "icecream_epoch", "magazine" }, 3 }, + { { "Sodas", "CfgLootTable" }, 45 }, + { { "CanFood", "CfgLootTable" }, 40 } }; }; class Medical { items[] = { - { { "FAK", "item" }, 97 }, + { { "FAK", "magazine" }, 50 }, { { "Heal_EPOCH", "item" }, 2 }, { { "Defib_EPOCH", "item" }, 1 }, - { { "EnergyPack", "magazine" }, 1 } + { {"atropine_epoch", "magazine" }, 6 }, + { {"adrenaline_epoch", "magazine" }, 5 }, + { {"morphine_epoch", "magazine" }, 3 }, + { {"caffeinepills_epoch", "magazine" }, 10 }, + { {"orlistat_epoch", "magazine" }, 5 }, + { {"nanite_cream_epoch", "magazine" }, 3 }, + { {"nanite_gun_epoch", "magazine" }, 1 }, + { {"nanite_pills_epoch", "magazine" }, 5 }, + { {"iodide_pills_epoch", "magazine" }, 5 }, + { {"ItemWaterPurificationTablets", "magazine" }, 5 } }; }; class BaseBuilding @@ -1076,7 +1201,75 @@ class CfgLootTable_MAD { { "U_C_Scientist", "item" }, 1 }, { { "U_OrestesBody", "item" }, 1 }, { { "DLCUniforms", "CfgLootTable" }, 1 }, - { { "MaleUniforms_FullGhillieMarkDLC", "CfgLootTable" }, 1 } + { { "MaleUniforms_FullGhillieMarkDLC", "CfgLootTable" }, 1 }, + + // new uniforms + { { "U_C_Commoner1_1", "item" }, 1 }, + { { "U_C_Poor_2", "item" }, 1 }, + { { "U_C_HunterBody_grn", "item" }, 1 }, + { { "U_C_Poor_shorts_1", "item" }, 1 }, + { { "U_C_Commoner_shorts", "item" }, 1 }, + { { "U_C_ShirtSurfer_shorts", "item" }, 1 }, + { { "U_C_TeeSurfer_shorts_1", "item" }, 1 }, + { { "U_C_TeeSurfer_shorts_2", "item" }, 1 }, + { { "U_NikosBody", "item" }, 1 }, + { { "U_NikosAgedBody", "item" }, 1 }, + { { "U_IG_Guerilla1_1", "item" }, 1 }, + { { "U_IG_leader", "item" }, 1 }, + { { "U_IG_Guerilla2_1", "item" }, 1 }, + { { "U_IG_Guerilla2_3", "item" }, 1 }, + { { "U_IG_Guerilla2_2", "item" }, 1 }, + { { "U_IG_Guerilla3_1", "item" }, 1 }, + { { "U_IG_Guerrilla_6_1", "item" }, 1 }, + { { "U_OG_Guerrilla_6_1", "item" }, 1 }, + { { "U_I_CombatUniform", "item" }, 1 }, + { { "U_I_CombatUniform_shortsleeve", "item" }, 1 }, + { { "U_I_HeliPilotCoveralls", "item" }, 1 }, + { { "U_I_pilotCoveralls", "item" }, 1 }, + { { "U_I_OfficerUniform", "item" }, 1 }, + { { "U_I_Wetsuit", "item" }, 1 }, + { { "U_I_GhillieSuit", "item" }, 1 }, + { { "U_I_CombatUniform_tshirt", "item" }, 1 }, + { { "U_O_OfficerUniform_ocamo", "item" }, 1 }, + { { "U_O_SpecopsUniform_ocamo", "item" }, 1 }, + { { "U_O_CombatUniform_oucamo", "item" }, 1 }, + { { "U_Marshal", "item" }, 1 }, + { { "U_I_FullGhillie_lsh", "item" }, 1 }, + { { "U_I_FullGhillie_sard", "item" }, 1 }, + { { "U_I_FullGhillie_ard", "item" }, 1 }, + { { "U_I_C_Soldier_Para_1_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_2_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_3_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_4_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_5_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_1_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_2_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_3_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_4_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_5_F", "item" }, 1 }, + { { "U_I_C_Soldier_Camo_F", "item" }, 1 }, + { { "U_O_T_Soldier_F", "item" }, 1 }, + { { "U_O_T_Officer_F", "item" }, 1 }, + { { "U_O_T_Sniper_F", "item" }, 1 }, + { { "U_O_T_FullGhillie_tna_F", "item" }, 1 }, + { { "U_O_V_Soldier_Viper_F", "item" }, 1 }, + { { "U_O_V_Soldier_Viper_hex_F", "item" }, 1 }, + { { "U_C_man_sport_1_F", "item" }, 1 }, + { { "U_C_man_sport_2_F", "item" }, 1 }, + { { "U_C_man_sport_3_F", "item" }, 1 }, + { { "U_C_Man_casual_1_F", "item" }, 1 }, + { { "U_C_Man_casual_2_F", "item" }, 1 }, + { { "U_C_Man_casual_3_F", "item" }, 1 }, + { { "U_C_Man_casual_4_F", "item" }, 1 }, + { { "U_C_Man_casual_5_F", "item" }, 1 }, + { { "U_C_Man_casual_6_F", "item" }, 1 }, + // LoW DLC + { { "U_C_ConstructionCoverall_Red_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_vrana_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Black_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Blue_F", "item" }, 1 }, + { { "U_C_Paramedic_01_F", "item" }, 1 }, + { { "U_C_Mechanic_01_F", "item" }, 1 } }; }; @@ -1149,7 +1342,92 @@ class CfgLootTable_MAD { { "U_Camo_uniform", "item" }, 1 }, { { "U_ghillie1_uniform", "item" }, 1 }, { { "U_ghillie2_uniform", "item" }, 1 }, - { { "U_ghillie3_uniform", "item" }, 1 } + { { "U_ghillie3_uniform", "item" }, 1 }, + + { { "U_JeansPatched1_uniform", "item" }, 1 }, + { { "U_JeansPatched2_uniform", "item" }, 1 }, + { { "U_JeansPatched3_uniform", "item" }, 1 }, + { { "U_JeansPatched4_uniform", "item" }, 1 }, + { { "U_JeansPatched5_uniform", "item" }, 1 }, + { { "U_JeansPatched6_uniform", "item" }, 1 }, + { { "U_JeansPatched7_uniform", "item" }, 1 }, + { { "U_JeansPatched8_uniform", "item" }, 1 }, + { { "U_JeansPatched9_uniform", "item" }, 1 }, + { { "U_JeansPatched10_uniform", "item" }, 1 }, + { { "U_JeansPatched11_uniform", "item" }, 1 }, + { { "U_JeansPatched12_uniform", "item" }, 1 }, + { { "U_JeansPatched13_uniform", "item" }, 1 }, + { { "U_JeansPatched14_uniform", "item" }, 1 }, + { { "U_JeansPatched15_uniform", "item" }, 1 }, + { { "U_JeansPatched16_uniform", "item" }, 1 }, + { { "U_JeansPatched17_uniform", "item" }, 1 }, + { { "U_JeansPatched18_uniform", "item" }, 1 }, + { { "U_JeansPatched19_uniform", "item" }, 1 }, + { { "U_JeansPatched20_uniform", "item" }, 1 }, + { { "U_JeansPatched21_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn1_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn2_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn3_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn4_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn5_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn6_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn7_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn8_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn9_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn10_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn11_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn12_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn13_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn14_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn15_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn16_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn17_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn18_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn19_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn20_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn21_uniform", "item" }, 1 }, + { { "U_JeansArBrn1_uniform", "item" }, 1 }, + { { "U_JeansArBrn2_uniform", "item" }, 1 }, + { { "U_JeansArBrn3_uniform", "item" }, 1 }, + { { "U_JeansArBrn4_uniform", "item" }, 1 }, + { { "U_JeansArBrn5_uniform", "item" }, 1 }, + { { "U_JeansArBrn6_uniform", "item" }, 1 }, + { { "U_JeansArBrn7_uniform", "item" }, 1 }, + { { "U_JeansArBrn8_uniform", "item" }, 1 }, + { { "U_JeansArBrn9_uniform", "item" }, 1 }, + { { "U_JeansArBrn10_uniform", "item" }, 1 }, + { { "U_JeansArBrn11_uniform", "item" }, 1 }, + { { "U_JeansArBrn12_uniform", "item" }, 1 }, + { { "U_JeansArBrn13_uniform", "item" }, 1 }, + { { "U_JeansArBrn14_uniform", "item" }, 1 }, + { { "U_JeansArBrn15_uniform", "item" }, 1 }, + { { "U_JeansArBrn16_uniform", "item" }, 1 }, + { { "U_JeansArBrn17_uniform", "item" }, 1 }, + { { "U_JeansArBrn18_uniform", "item" }, 1 }, + { { "U_JeansArBrn19_uniform", "item" }, 1 }, + { { "U_JeansArBrn20_uniform", "item" }, 1 }, + { { "U_JeansArBrn21_uniform", "item" }, 1 }, + { { "U_JeansBlack1_uniform", "item" }, 1 }, + { { "U_JeansBlack2_uniform", "item" }, 1 }, + { { "U_JeansBlack3_uniform", "item" }, 1 }, + { { "U_JeansBlack4_uniform", "item" }, 1 }, + { { "U_JeansBlack5_uniform", "item" }, 1 }, + { { "U_JeansBlack6_uniform", "item" }, 1 }, + { { "U_JeansBlack7_uniform", "item" }, 1 }, + { { "U_JeansBlack8_uniform", "item" }, 1 }, + { { "U_JeansBlack9_uniform", "item" }, 1 }, + { { "U_JeansBlack10_uniform", "item" }, 1 }, + { { "U_JeansBlack11_uniform", "item" }, 1 }, + { { "U_JeansBlack12_uniform", "item" }, 1 }, + { { "U_JeansBlack13_uniform", "item" }, 1 }, + { { "U_JeansBlack14_uniform", "item" }, 1 }, + { { "U_JeansBlack15_uniform", "item" }, 1 }, + { { "U_JeansBlack16_uniform", "item" }, 1 }, + { { "U_JeansBlack17_uniform", "item" }, 1 }, + { { "U_JeansBlack18_uniform", "item" }, 1 }, + { { "U_JeansBlack19_uniform", "item" }, 1 }, + { { "U_JeansBlack20_uniform", "item" }, 1 }, + { { "U_JeansBlack21_uniform", "item" }, 1 } }; }; @@ -1334,9 +1612,15 @@ class CfgLootTable_MAD { { "H_92_EPOCH", "item" }, 1 }, { { "H_104_EPOCH", "item" }, 1 }, { { "H_105_EPOCH", "item" }, 1 }, - { { "wolf_mask_epoch", "item" }, 1 }, - { { "pkin_mask_epoch", "item" }, 1 }, - { { "clown_mask_epoch", "item" }, 1 } + { { "wolf_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "pkin_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "clown_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "hockey_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "plague_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "ghostface_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "skull_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "witch_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "radiation_mask_epoch", "item" }, 1 } }; }; }; diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h b/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h index c397233d..2e4b79f1 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h @@ -20,6 +20,25 @@ class CfgLootTable_MADCUP { { "WoodLog_EPOCH", "magazine" }, 1 } }; }; + class Rock + { + items[] = { + { { "PartOre", "magazine" }, 1 }, + { { "ItemRock", "magazine" }, 2 } + }; + }; + class Cinder + { + items[] = { + { { "CinderBlocks", "magazine" }, 1 } + }; + }; + class Wreck + { + items[] = { + { { "ItemScraps", "magazine" }, 1 } + }; + }; class Bush { items[] = { @@ -45,7 +64,8 @@ class CfgLootTable_MADCUP { items[] = { { { "ItemCompass", "item" }, 20 }, - { { "ItemGPS", "item" }, 10 }, + { { "ItemGeigerCounter_EPOCH", "item" }, 1 }, + { { "ItemGPS", "item" }, 9 }, { { "EpochRadio0", "item" }, 3 }, { { "EpochRadio1", "item" }, 3 }, { { "EpochRadio2", "item" }, 3 }, @@ -57,17 +77,39 @@ class CfgLootTable_MADCUP { { "EpochRadio8", "item" }, 1 }, { { "EpochRadio9", "item" }, 1 }, { { "ItemWatch", "item" }, 30 }, - { { "FAK", "item" }, 20 } + { { "FAK", "magazine" }, 20 } + }; + }; + class Repairs + { + items[] = { + { { "VehicleRepair", "magazine" }, 30 }, + { { "SpareTire", "magazine" }, 10 }, + { { "EngineParts", "magazine" }, 10 }, + { { "EngineBlock", "magazine" }, 10 }, + { { "ItemGlass", "magazine" }, 15 }, + { { "ItemDuctTape", "magazine" }, 20 }, + { { "ItemRotor", "magazine" }, 5 } + }; + }; + class VehicleDocs + { + items[] = { + { { "ItemVehDoc1", "magazine" }, 20 }, + { { "ItemVehDoc2", "magazine" }, 15 }, + { { "ItemVehDoc3", "magazine" }, 4 }, + { { "ItemVehDoc4", "magazine" }, 2 } }; }; class Equipment { items[] = { - { { "Rangefinder", "weapon" }, 5 }, + { { "Rangefinder", "weapon" }, 10 }, { { "Binocular", "item" }, 35 }, { { "NVG_EPOCH", "item" }, 10 }, { { "acc_flashlight", "item" }, 15 }, - { { "acc_pointer_IR", "item" }, 15 }, + { { "acc_flashlight_pistol", "item" }, 10 }, + { { "acc_pointer_IR", "item" }, 5 }, // Marksman DLC { { "Bipods", "CfgLootTable" }, 5 }, // CUP @@ -250,7 +292,7 @@ class CfgLootTable_MADCUP { { "ItemMixOil", "magazine" }, 4 }, { { "ItemCoolerE", "magazine" }, 6 }, { { "CircuitParts", "magazine" }, 8 }, - { { "VehicleRepair", "magazine" }, 7 }, + { { "Repairs", "CfgLootTable" }, 7 }, { { "Towelette", "magazine" }, 14 }, { { "HotColdPacks", "CfgLootTable" }, 9 }, { { "PaintCans", "CfgLootTable" }, 9 }, @@ -258,18 +300,37 @@ class CfgLootTable_MADCUP { { "CanFood", "CfgLootTable" }, 8 }, { { "Primitive", "CfgLootTable" }, 21 }, { { "lighter_epoch", "magazine" }, 1 }, + { { "Seeds", "CfgLootTable" }, 1 }, { { "ItemAluminumBar", "magazine" }, 2 }, { { "ItemCopperBar", "magazine" }, 2 }, - { { "ItemTinBar", "magazine" }, 1 } + { { "ItemTinBar", "magazine" }, 1 }, + { { "ItemCanteen_Dirty", "magazine" }, 5 }, + { { "ItemCanteen_Clean", "magazine" }, 1 }, + { { "ItemBottlePlastic_Dirty", "magazine" }, 5 }, + { { "ItemBottlePlastic_Clean", "magazine" }, 1 } + + }; + }; + class Seeds + { + items[] = { + { { "ItemSeedBag", "magazine" }, 10 }, + { { "SeedPacket_Hemp", "magazine" }, 1 }, + { { "SeedPacket_GoldenSeal", "magazine" }, 1 }, + { { "SeedPacket_Poppy", "magazine" }, 1 }, + { { "SeedPacket_Pumpkin", "magazine" }, 2 }, + { { "SeedPacket_Sunflower", "magazine" }, 2 } }; }; class Primitive { items[] = { - { { "ItemRock", "magazine" }, 1 }, - { { "ItemRope", "magazine" }, 1 }, - { { "ItemStick", "magazine" }, 1 }, - { { "ItemScraps", "magazine" }, 1 } + { { "ItemRock", "magazine" }, 5 }, + { { "ItemRope", "magazine" }, 2 }, + { { "ItemStick", "magazine" }, 5 }, + { { "ItemScraps", "magazine" }, 1 }, + { { "ItemCanvas", "magazine" }, 1 }, + { { "ItemBurlap", "magazine" }, 1 } }; }; class Sodas @@ -289,17 +350,28 @@ class CfgLootTable_MADCUP class CanFood { items[] = { + { { "ItemPowderMilk", "magazine" }, 3 }, + { { "ItemRicebox", "magazine" }, 3 }, + { { "ItemCereals", "magazine" }, 3 }, + { { "ItemVitamins", "magazine" }, 3 }, { { "honey_epoch", "magazine" }, 5 }, { { "emptyjar_epoch", "magazine" }, 13 }, + { { "water_epoch", "magazine" }, 3 }, + { { "clean_water_epoch", "magazine" }, 1 }, { { "FoodBioMeat", "magazine" }, 11 }, { { "sardines_epoch", "magazine" }, 11 }, { { "meatballs_epoch", "magazine" }, 13 }, { { "scam_epoch", "magazine" }, 14 }, { { "sweetcorn_epoch", "magazine" }, 14 }, - { { "FoodSnooter", "magazine" }, 9 }, + { { "FoodSnooter", "magazine" }, 5 }, + { { "krypto_candy_epoch", "magazine" }, 4 }, { { "TacticalBacon", "magazine" }, 5 }, { { "FoodMeeps", "magazine" }, 1 }, - { { "ItemEmptyTin", "magazine" }, 5 } + { { "ItemEmptyTin", "magazine" }, 5 }, + { { "ItemBakedBeans", "magazine" }, 3 }, + { { "HotAxeSauce_epoch", "magazine" }, 1 } + + }; }; @@ -322,11 +394,12 @@ class CfgLootTable_MADCUP class GenericBed { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 3 }, { { "ItemLockbox", "magazine" }, 5 }, { { "ItemMixOil", "magazine" }, 4 }, { { "ItemCoolerE", "magazine" }, 6 }, { { "CircuitParts", "magazine" }, 8 }, - { { "VehicleRepair", "magazine" }, 7 }, + { { "Repairs", "CfgLootTable" }, 7 }, { { "Towelette", "magazine" }, 14 }, { { "HotColdPacks", "CfgLootTable" }, 8 }, { { "PaintCans", "CfgLootTable" }, 9 }, @@ -339,9 +412,10 @@ class CfgLootTable_MADCUP class GenericLarge { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 4 }, { { "MortarBucket", "magazine" }, 16 }, { { "CinderBlocks", "magazine" }, 17 }, - { { "VehicleRepair", "magazine" }, 16 }, + { { "Repairs", "CfgLootTable" }, 16 }, { { "CircuitParts", "magazine" }, 17 }, { { "ItemCorrugated", "magazine" }, 17 }, { { "ItemSolar", "magazine" }, 5 }, @@ -355,12 +429,13 @@ class CfgLootTable_MADCUP class GenericAuto { items[] = { + { { "VehicleDocs", "CfgLootTable" }, 4 }, { { "ItemSafe", "magazine" }, 1 }, { { "ItemLockbox", "magazine" }, 4 }, { { "jerrycan_epoch", "magazine" }, 5 }, { { "CircuitParts", "magazine" }, 6 }, { { "MortarBucket", "magazine" }, 9 }, - { { "VehicleRepair", "magazine" }, 10 }, + { { "Repairs", "CfgLootTable" }, 10 }, { { "ItemCorrugated", "magazine" }, 11 }, { { "CinderBlocks", "magazine" }, 12 }, { { "JackKit", "magazine" }, 8 }, @@ -998,13 +1073,15 @@ class CfgLootTable_MADCUP class Tools { items[] = { - { { "Hatchet", "weapon" }, 62 }, + { { "Hatchet", "weapon" }, 40 }, { { "MeleeSledge", "weapon" }, 20 }, { { "ChainSaw", "weapon" }, 10 }, { { "Plunger", "weapon" }, 4 }, { { "MeleeSword", "weapon" }, 1 }, { { "MeleeRod", "weapon" }, 2 }, - { { "lighter_epoch", "magazine" }, 1 } + { { "lighter_epoch", "magazine" }, 1 }, + { { "SmeltingTools_EPOCH", "magazine" }, 10 } + }; }; @@ -1281,16 +1358,13 @@ class CfgLootTable_MADCUP }; }; - class Shipwreak + class Shipwreck { items[] = { { { "Gems", "CfgLootTable" }, 5 }, { { "MetalBars", "CfgLootTable" }, 26 }, { { "PartOreGold", "magazine" }, 10 }, - { { "PartOreSilver", "magazine" }, 13 }, - { { "ItemKiloHemp", "magazine" }, 12 }, - { { "ItemScraps", "magazine" }, 16 }, - { { "PartOre", "magazine" }, 18 } + { { "PartOreSilver", "magazine" }, 13 } }; }; class MetalBars @@ -1328,21 +1402,74 @@ class CfgLootTable_MADCUP { { "PartOre", "magazine" }, 35 } }; }; + class CopperMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 15 }, + { { "PartOreGold", "magazine" }, 20 }, + { { "PartOreSilver", "magazine" }, 30 }, + { { "PartOre", "magazine" }, 35 } + }; + }; + class SilverMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 15 }, + { { "PartOreGold", "magazine" }, 20 }, + { { "PartOreSilver", "magazine" }, 35 }, + { { "PartOre", "magazine" }, 30 } + }; + }; + class GoldMine + { + items[] = { + { { "Gems", "CfgLootTable" }, 20 }, + { { "PartOreGold", "magazine" }, 35 }, + { { "PartOreSilver", "magazine" }, 20 }, + { { "PartOre", "magazine" }, 25 } + }; + }; + class Satellite + { + items[] = { + { { "MetalBars", "CfgLootTable" }, 5 }, + { { "CircuitParts", "magazine" }, 1 }, + { { "Gems", "CfgLootTable" }, 3 }, + { { "ItemScraps", "magazine" }, 1 }, + { { "ItemCorrugated", "magazine" }, 2 }, + { { "ItemSolar", "magazine" }, 1 }, + { { "ItemBattery", "magazine" }, 1 }, + { { "ItemCables", "magazine" }, 1 } + }; + }; class Food { items[] = { - { { "ItemCoolerE", "magazine" }, 4 }, - { { "Sodas", "CfgLootTable" }, 47 }, - { { "CanFood", "CfgLootTable" }, 49 } + { { "ItemCoolerE", "magazine" }, 3 }, + { { "bluburger_epoch", "magazine" }, 4 }, + { { "redburger_epoch", "magazine" }, 4 }, + { { "gyro_wrap_epoch", "magazine" }, 4 }, + { { "icecream_epoch", "magazine" }, 3 }, + { { "Sodas", "CfgLootTable" }, 45 }, + { { "CanFood", "CfgLootTable" }, 40 } }; }; class Medical { items[] = { - { { "FAK", "item" }, 97 }, + { { "FAK", "magazine" }, 50 }, { { "Heal_EPOCH", "item" }, 2 }, { { "Defib_EPOCH", "item" }, 1 }, - { { "EnergyPack", "magazine" }, 1 } + { {"atropine_epoch", "magazine" }, 6 }, + { {"adrenaline_epoch", "magazine" }, 5 }, + { {"morphine_epoch", "magazine" }, 3 }, + { {"caffeinepills_epoch", "magazine" }, 10 }, + { {"orlistat_epoch", "magazine" }, 5 }, + { {"nanite_cream_epoch", "magazine" }, 3 }, + { {"nanite_gun_epoch", "magazine" }, 1 }, + { {"nanite_pills_epoch", "magazine" }, 5 }, + { {"iodide_pills_epoch", "magazine" }, 5 }, + { {"ItemWaterPurificationTablets", "magazine" }, 5 } }; }; class BaseBuilding @@ -1400,14 +1527,14 @@ class CfgLootTable_MADCUP class Fin_random_EPOCH { items[] = { - { { "GoatCarcass_EPOCH", "magazine" }, 1 }, + { { "DogCarcass_EPOCH", "magazine" }, 1 }, { { "Pelt_EPOCH", "magazine" }, 1 } }; }; class Alsatian_Random_EPOCH { items[] = { - { { "GoatCarcass_EPOCH", "magazine" }, 1 }, + { { "DogCarcass_EPOCH", "magazine" }, 1 }, { { "Pelt_EPOCH", "magazine" }, 1 } }; }; @@ -1639,7 +1766,75 @@ class CfgLootTable_MADCUP { { "U_C_Scientist", "item" }, 1 }, { { "U_OrestesBody", "item" }, 1 }, { { "DLCUniforms", "CfgLootTable" }, 1 }, - { { "MaleUniforms_FullGhillieMarkDLC", "CfgLootTable" }, 1 } + { { "MaleUniforms_FullGhillieMarkDLC", "CfgLootTable" }, 1 }, + + // new uniforms + { { "U_C_Commoner1_1", "item" }, 1 }, + { { "U_C_Poor_2", "item" }, 1 }, + { { "U_C_HunterBody_grn", "item" }, 1 }, + { { "U_C_Poor_shorts_1", "item" }, 1 }, + { { "U_C_Commoner_shorts", "item" }, 1 }, + { { "U_C_ShirtSurfer_shorts", "item" }, 1 }, + { { "U_C_TeeSurfer_shorts_1", "item" }, 1 }, + { { "U_C_TeeSurfer_shorts_2", "item" }, 1 }, + { { "U_NikosBody", "item" }, 1 }, + { { "U_NikosAgedBody", "item" }, 1 }, + { { "U_IG_Guerilla1_1", "item" }, 1 }, + { { "U_IG_leader", "item" }, 1 }, + { { "U_IG_Guerilla2_1", "item" }, 1 }, + { { "U_IG_Guerilla2_3", "item" }, 1 }, + { { "U_IG_Guerilla2_2", "item" }, 1 }, + { { "U_IG_Guerilla3_1", "item" }, 1 }, + { { "U_IG_Guerrilla_6_1", "item" }, 1 }, + { { "U_OG_Guerrilla_6_1", "item" }, 1 }, + { { "U_I_CombatUniform", "item" }, 1 }, + { { "U_I_CombatUniform_shortsleeve", "item" }, 1 }, + { { "U_I_HeliPilotCoveralls", "item" }, 1 }, + { { "U_I_pilotCoveralls", "item" }, 1 }, + { { "U_I_OfficerUniform", "item" }, 1 }, + { { "U_I_Wetsuit", "item" }, 1 }, + { { "U_I_GhillieSuit", "item" }, 1 }, + { { "U_I_CombatUniform_tshirt", "item" }, 1 }, + { { "U_O_OfficerUniform_ocamo", "item" }, 1 }, + { { "U_O_SpecopsUniform_ocamo", "item" }, 1 }, + { { "U_O_CombatUniform_oucamo", "item" }, 1 }, + { { "U_Marshal", "item" }, 1 }, + { { "U_I_FullGhillie_lsh", "item" }, 1 }, + { { "U_I_FullGhillie_sard", "item" }, 1 }, + { { "U_I_FullGhillie_ard", "item" }, 1 }, + { { "U_I_C_Soldier_Para_1_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_2_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_3_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_4_F", "item" }, 1 }, + { { "U_I_C_Soldier_Para_5_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_1_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_2_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_3_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_4_F", "item" }, 1 }, + { { "U_I_C_Soldier_Bandit_5_F", "item" }, 1 }, + { { "U_I_C_Soldier_Camo_F", "item" }, 1 }, + { { "U_O_T_Soldier_F", "item" }, 1 }, + { { "U_O_T_Officer_F", "item" }, 1 }, + { { "U_O_T_Sniper_F", "item" }, 1 }, + { { "U_O_T_FullGhillie_tna_F", "item" }, 1 }, + { { "U_O_V_Soldier_Viper_F", "item" }, 1 }, + { { "U_O_V_Soldier_Viper_hex_F", "item" }, 1 }, + { { "U_C_man_sport_1_F", "item" }, 1 }, + { { "U_C_man_sport_2_F", "item" }, 1 }, + { { "U_C_man_sport_3_F", "item" }, 1 }, + { { "U_C_Man_casual_1_F", "item" }, 1 }, + { { "U_C_Man_casual_2_F", "item" }, 1 }, + { { "U_C_Man_casual_3_F", "item" }, 1 }, + { { "U_C_Man_casual_4_F", "item" }, 1 }, + { { "U_C_Man_casual_5_F", "item" }, 1 }, + { { "U_C_Man_casual_6_F", "item" }, 1 }, + // LoW DLC + { { "U_C_ConstructionCoverall_Red_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_vrana_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Black_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Blue_F", "item" }, 1 }, + { { "U_C_Paramedic_01_F", "item" }, 1 }, + { { "U_C_Mechanic_01_F", "item" }, 1 } }; }; @@ -1712,7 +1907,92 @@ class CfgLootTable_MADCUP { { "U_Camo_uniform", "item" }, 1 }, { { "U_ghillie1_uniform", "item" }, 1 }, { { "U_ghillie2_uniform", "item" }, 1 }, - { { "U_ghillie3_uniform", "item" }, 1 } + { { "U_ghillie3_uniform", "item" }, 1 }, + + { { "U_JeansPatched1_uniform", "item" }, 1 }, + { { "U_JeansPatched2_uniform", "item" }, 1 }, + { { "U_JeansPatched3_uniform", "item" }, 1 }, + { { "U_JeansPatched4_uniform", "item" }, 1 }, + { { "U_JeansPatched5_uniform", "item" }, 1 }, + { { "U_JeansPatched6_uniform", "item" }, 1 }, + { { "U_JeansPatched7_uniform", "item" }, 1 }, + { { "U_JeansPatched8_uniform", "item" }, 1 }, + { { "U_JeansPatched9_uniform", "item" }, 1 }, + { { "U_JeansPatched10_uniform", "item" }, 1 }, + { { "U_JeansPatched11_uniform", "item" }, 1 }, + { { "U_JeansPatched12_uniform", "item" }, 1 }, + { { "U_JeansPatched13_uniform", "item" }, 1 }, + { { "U_JeansPatched14_uniform", "item" }, 1 }, + { { "U_JeansPatched15_uniform", "item" }, 1 }, + { { "U_JeansPatched16_uniform", "item" }, 1 }, + { { "U_JeansPatched17_uniform", "item" }, 1 }, + { { "U_JeansPatched18_uniform", "item" }, 1 }, + { { "U_JeansPatched19_uniform", "item" }, 1 }, + { { "U_JeansPatched20_uniform", "item" }, 1 }, + { { "U_JeansPatched21_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn1_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn2_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn3_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn4_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn5_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn6_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn7_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn8_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn9_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn10_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn11_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn12_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn13_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn14_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn15_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn16_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn17_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn18_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn19_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn20_uniform", "item" }, 1 }, + { { "U_JeansBlkBrn21_uniform", "item" }, 1 }, + { { "U_JeansArBrn1_uniform", "item" }, 1 }, + { { "U_JeansArBrn2_uniform", "item" }, 1 }, + { { "U_JeansArBrn3_uniform", "item" }, 1 }, + { { "U_JeansArBrn4_uniform", "item" }, 1 }, + { { "U_JeansArBrn5_uniform", "item" }, 1 }, + { { "U_JeansArBrn6_uniform", "item" }, 1 }, + { { "U_JeansArBrn7_uniform", "item" }, 1 }, + { { "U_JeansArBrn8_uniform", "item" }, 1 }, + { { "U_JeansArBrn9_uniform", "item" }, 1 }, + { { "U_JeansArBrn10_uniform", "item" }, 1 }, + { { "U_JeansArBrn11_uniform", "item" }, 1 }, + { { "U_JeansArBrn12_uniform", "item" }, 1 }, + { { "U_JeansArBrn13_uniform", "item" }, 1 }, + { { "U_JeansArBrn14_uniform", "item" }, 1 }, + { { "U_JeansArBrn15_uniform", "item" }, 1 }, + { { "U_JeansArBrn16_uniform", "item" }, 1 }, + { { "U_JeansArBrn17_uniform", "item" }, 1 }, + { { "U_JeansArBrn18_uniform", "item" }, 1 }, + { { "U_JeansArBrn19_uniform", "item" }, 1 }, + { { "U_JeansArBrn20_uniform", "item" }, 1 }, + { { "U_JeansArBrn21_uniform", "item" }, 1 }, + { { "U_JeansBlack1_uniform", "item" }, 1 }, + { { "U_JeansBlack2_uniform", "item" }, 1 }, + { { "U_JeansBlack3_uniform", "item" }, 1 }, + { { "U_JeansBlack4_uniform", "item" }, 1 }, + { { "U_JeansBlack5_uniform", "item" }, 1 }, + { { "U_JeansBlack6_uniform", "item" }, 1 }, + { { "U_JeansBlack7_uniform", "item" }, 1 }, + { { "U_JeansBlack8_uniform", "item" }, 1 }, + { { "U_JeansBlack9_uniform", "item" }, 1 }, + { { "U_JeansBlack10_uniform", "item" }, 1 }, + { { "U_JeansBlack11_uniform", "item" }, 1 }, + { { "U_JeansBlack12_uniform", "item" }, 1 }, + { { "U_JeansBlack13_uniform", "item" }, 1 }, + { { "U_JeansBlack14_uniform", "item" }, 1 }, + { { "U_JeansBlack15_uniform", "item" }, 1 }, + { { "U_JeansBlack16_uniform", "item" }, 1 }, + { { "U_JeansBlack17_uniform", "item" }, 1 }, + { { "U_JeansBlack18_uniform", "item" }, 1 }, + { { "U_JeansBlack19_uniform", "item" }, 1 }, + { { "U_JeansBlack20_uniform", "item" }, 1 }, + { { "U_JeansBlack21_uniform", "item" }, 1 } }; }; @@ -1897,9 +2177,15 @@ class CfgLootTable_MADCUP { { "H_92_EPOCH", "item" }, 1 }, { { "H_104_EPOCH", "item" }, 1 }, { { "H_105_EPOCH", "item" }, 1 }, - { { "wolf_mask_epoch", "item" }, 1 }, - { { "pkin_mask_epoch", "item" }, 1 }, - { { "clown_mask_epoch", "item" }, 1 } + { { "wolf_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "pkin_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "clown_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "hockey_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "plague_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "ghostface_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "skull_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "witch_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october + { { "radiation_mask_epoch", "item" }, 1 } }; }; }; diff --git a/Sources/epoch_server_settings/configs/CfgMainTable.h b/Sources/epoch_server_settings/configs/CfgMainTable.h index 3d355811..43cf201f 100644 --- a/Sources/epoch_server_settings/configs/CfgMainTable.h +++ b/Sources/epoch_server_settings/configs/CfgMainTable.h @@ -20,15 +20,6 @@ class CfgMainTable lootMin = 1; LootMax = 1; tables[] = { "Food" }; - antagonists[] = { - { "Zombie", 40 }, - { "UAV", 15 }, - { "Cloak", 10 }, // Night = Epoch_Cloak_F, Day = Epoch_Sapper_F - { "Sapper", 20 }, - { "SapperG", 5 }, - { "SapperB", 5 }, - { "PHANTOM", 5 } - }; }; class Tree : Default { @@ -37,6 +28,34 @@ class CfgMainTable LootMax = 6; tables[] = { "Tree" }; }; + class Rock : Default + { + chance = 1; + lootMin = 3; + LootMax = 6; + tables[] = { "Rock" }; + }; + class Ore : Default + { + chance = 1; + lootMin = 3; + LootMax = 6; + tables[] = { "Mine" }; + }; + class Cinder : Default + { + chance = 1; + lootMin = 3; + LootMax = 6; + tables[] = { "Cinder" }; + }; + class Wreck : Default + { + chance = 1; + lootMin = 3; + LootMax = 6; + tables[] = { "Wreck" }; + }; class Bush : Default { chance = 1; @@ -62,14 +81,6 @@ class CfgMainTable { "Generic", 15 }, { "GenericLarge", 18 } }; - antagonists[] = { - { "Zombie", 45 }, - { "UAV", 15 }, - { "Cloak", 10 }, // Night = Epoch_Cloak_F, Day = Epoch_Sapper_F - { "Sapper", 20 }, - { "SapperG", 5 }, - { "SapperB", 5 } - }; }; class TrashSmall : Default { @@ -246,29 +257,33 @@ class CfgMainTable { lootMin = 3; LootMax = 6; - tables[] = { "Shipwreak" }; - antagonists[] = { - { "GreatWhite", 1 } - }; + tables[] = { "Shipwreck" }; }; class MineralDepositCopper_EPOCH : Default { lootMin = 5; LootMax = 10; - tables[] = { "Mine" }; + tables[] = { "CopperMine" }; }; class MineralDepositGold_EPOCH : Default { lootMin = 5; LootMax = 10; - tables[] = { "Mine" }; + tables[] = { "GoldMine" }; }; class MineralDepositSilver_EPOCH : Default { lootMin = 5; LootMax = 10; - tables[] = { "Mine" }; + tables[] = { "SilverMine" }; }; + class Land_Wreck_Satellite_EPOCH : Default + { + lootMin = 8; + LootMax = 14; + tables[] = { "Satellite" }; + }; + class satellite_p3d : Land_Wreck_Satellite_EPOCH {}; class Shelf_EPOCH : Default { lootMin = 3; @@ -518,6 +533,18 @@ class CfgMainTable { "Grenades", 2 } }; }; + class Toilet_EPOCH : Default + { + lootMin = 3; + LootMax = 6; + tables[] = { + { "Primitive", 10 }, + { "Food", 10 }, + { "Grenades", 2 }, + { "Gems", 2 }, + { "Medical", 2 } + }; + }; class Cargo_Container : Default { lootMin = 10; diff --git a/Sources/epoch_server_settings/configs/maps/Bootcamp_ACR.h b/Sources/epoch_server_settings/configs/maps/Bootcamp_ACR.h index 1e917b90..93ba0b39 100644 --- a/Sources/epoch_server_settings/configs/maps/Bootcamp_ACR.h +++ b/Sources/epoch_server_settings/configs/maps/Bootcamp_ACR.h @@ -30,7 +30,7 @@ class Bootcamp_ACR : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Desert_E.h b/Sources/epoch_server_settings/configs/maps/Desert_E.h index a73df1c8..ce66b50b 100644 --- a/Sources/epoch_server_settings/configs/maps/Desert_E.h +++ b/Sources/epoch_server_settings/configs/maps/Desert_E.h @@ -30,7 +30,7 @@ class Desert_E : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Malden.h b/Sources/epoch_server_settings/configs/maps/Malden.h new file mode 100644 index 00000000..959b8807 --- /dev/null +++ b/Sources/epoch_server_settings/configs/maps/Malden.h @@ -0,0 +1,329 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Epoch gamemode server Side map specific configs for Malden. + + 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_settngs/configs/maps/Malden.h +*/ +class Malden : Default +{ + worldSize = 0; // 0 = default to worldSize command + plantLimit = 8; + vehicleSpawnTypes[] = { + {"FlatAreaCity",1}, + {"FlatAreaCitySmall",1}, + {"NameCity",2}, + {"NameVillage",1}, + {"NameCityCapital",4}, + {"Airport",5} + }; + traderBlds[] = { "Land_Kiosk_blueking_F", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_i_Garage_V1_F", "Land_i_Shed_Ind_F", "Land_i_Shop_01_V1_F" }; + telePos[] = { + // N [-0.286865,8.17383,-10.3098] + // S [-0.415527,-7.05298,-10.3098] + // E [13.5127,0.410156,-10.3098] + // W [-14.4316,0.112793,-10.3098] + { "Transport_N_EPOCH", { -0.286865, 8.17383, -10.3098 }, "", { 3074.63,8474.27,0.00150394 } }, + { "Transport_W_EPOCH", { -14.4316, 0.112793, -10.3098 }, "", { 2335.17, 3394.12, 0.000732422 } }, + { "Transport_E_EPOCH", { 13.5127,0.410156,-10.3098 }, "", { 8224.4,8756.69,0.00099802 } } + //{ "Transport_C_EPOCH", { 13.5127, 0.410156, -10.3098 }, "", "south" } + }; +propsPos[] = { + // Phones and ATMs + { "Land_ATM_02_malden_F", {3225.01,6276.43,0}, {{0.951241,-0.30845,0},{0,0,1}}, true }, + { "Land_PhoneBooth_01_malden_F", {3746.04,3256.26,0.161957}, {{-0.967747,-0.251925,0},{0,0,1}}, true }, + { "Land_ATM_01_malden_F", {5103,9074.26,0.508453}, {{0.595228,0.803557,0},{0,0,1}}, true }, + { "Land_PhoneBooth_01_malden_F", {5354.97,2805.33,0}, {{-0.384161,-0.923266,0},{0,0,1}}, true }, + { "Land_PhoneBooth_01_malden_F", {5495.61,7005.75,0.166534}, {{0.448686,-0.893689,0},{0,0,1}}, true }, + { "Land_PhoneBooth_02_malden_F", {5490.94,7003.29,0.169525}, {{0.440054,-0.897971,0},{0,0,1}}, true }, + { "Land_ATM_02_malden_F", {5507.85,3484.96,0}, {{0.984902,-0.173111,0},{0,0,1}}, true }, + { "Land_PhoneBooth_01_malden_F", {6028.37,8621.77,0}, {{-0.21328,-0.976991,0},{0,0,1}}, true }, + { "Land_PhoneBooth_01_malden_F", {6636.54,8819.84,-7.62939e-006}, {{-0.150817,0.988562,0},{0,0,1}}, true }, + { "Land_PhoneBooth_01_malden_F", {6639.32,8820.08,0}, {{-0.0954069,0.995438,0},{0,0,1}}, true }, + { "Land_PhoneBooth_01_malden_F", {6637.91,8819.96,0}, {{-0.103969,0.994581,0},{0,0,1}}, true }, + { "Land_PhoneBooth_02_malden_F", {7053.47,7058.09,0}, {{0.999621,-0.027522,0},{0,0,1}}, true }, + { "Land_PhoneBooth_02_malden_F", {7150.51,6003.52,0}, {{-0.0176981,0.999843,0},{0,0,1}}, true }, + { "Land_ATM_01_malden_F", {7211.19,7791.62,0.101868}, {{0.857566,0.514374,0},{0,0,1}}, true }, + { "Land_ATM_01_malden_F", {8057.78,4054.92,0.233646}, {{0.753691,-0.657229,0},{0,0,1}}, true }, + // "Northern" Trader Camp + { "Land_Cargo20_orange_F", {2995.62,8434.97,0.0128599}, {{-0.528092,-0.84917,0.00549413},{-0.0805372,0.056524,0.995148}}, true }, + { "Land_Cargo20_orange_F", {3001.11,8431.97,0.0119005}, {{-0.528289,-0.849027,0.00800959},{-0.0757817,0.0565452,0.99552}}, true }, + { "Land_Cargo40_grey_F", {3010.16,8429.65,0.0138227}, {{0,0.999436,-0.0335804},{-0.0987155,0.0334163,0.994554}}, true }, + { "Land_Cargo20_white_F", {3019.54,8428.56,0.0277512}, {{0,0.999436,-0.0335804},{-0.140202,0.0332487,0.989565}}, true }, + { "Land_Cargo20_grey_F", {3026,8428.47,-0.00265026}, {{0,0.999586,-0.028787},{-0.0351779,0.0287692,0.998967}}, true }, + { "RoadBarrier_F", {3039.76,8429.82,0.00521612}, {{0.120292,0.99267,-0.0116707},{-0.0939822,0.0230904,0.995306}}, true }, + { "Land_ChairPlastic_F", {3070.96,8471.63,0.000873089}, {{0.992911,0.11875,-0.00503494},{0,0.0423614,0.999102}}, true }, + { "Land_FireExtinguisher_F", {3073,8467.91,0.000711918}, {{0,0.999102,-0.0423614},{0,0.0423614,0.999102}}, true }, + { "Land_CampingChair_V2_F", {3072.99,8470.89,0.000905991}, {{0.708442,0.705135,-0.0298973},{0,0.0423614,0.999102}}, true }, + { "Land_CampingChair_V2_F", {3073.42,8468.59,0.000888348}, {{0.919815,-0.392001,0.0166206},{0,0.0423614,0.999102}}, true }, + { "Land_GarbageContainer_open_F", {3083.92,8487.26,0.0002985}, {{-0.146009,0.988566,-0.0376563},{-0.0303859,0.0335649,0.998975}}, true }, + { "Land_WorkStand_F", {3080.67,8485.54,-0.0225635}, {{0,0.999436,-0.0335804},{-0.0303859,0.0335649,0.998975}}, true }, + { "Land_Icebox_F", {3085.06,8492.61,-0.000498295}, {{0.999975,0.00693204,0.00154894},{-0.00158221,0.00479658,0.999987}}, true }, + { "Tire_Van_02_F", {3085.19,8494.41,6.67572e-006}, {{0,0.999988,-0.00479659},{-0.00158221,0.00479658,0.999987}}, true }, + { "Tire_Van_02_F", {3085.14,8495.22,4.76837e-006}, {{0,0.999988,-0.00479659},{-0.00158221,0.00479658,0.999987}}, true }, + { "Tire_Van_02_F", {3085.22,8494.81,0.265893}, {{0,1,0},{0,0,1}}, true }, + { "Land_PortableGenerator_01_F", {3085.34,8490.96,1.23978e-005}, {{0.999964,-0.00833787,0.00162217},{-0.00158221,0.00479658,0.999987}}, true }, + { "Land_Metal_rack_Tall_F", {3085.44,8497.18,0}, {{0.99999,0.00409792,0.00156256},{-0.00158221,0.00479658,0.999987}}, true }, + { "Land_Metal_rack_Tall_F", {3085.42,8496.38,-4.76837e-007}, {{0.99999,0.00409792,0.00156256},{-0.00158221,0.00479658,0.999987}}, true }, + { "Land_Metal_rack_F", {3085.37,8498.23,2.14577e-005}, {{0.992478,-0.122408,0.00215748},{-0.00158221,0.00479658,0.999987}}, true }, + { "Land_CampingTable_F", {3079.78,8498.57,1.19209e-005}, {{0.997537,-0.0701184,0.00191467},{-0.00158221,0.00479658,0.999987}}, true }, + { "Land_Sink_F", {3079.76,8480.54,0.00252676}, {{0.876306,-0.478479,0.0560832},{-0.0638688,0,0.997958}}, true }, + { "Land_CampingTable_F", {3079.63,8507.07,1.43051e-006}, {{0.997943,-0.0640923,0.00147757},{-0.00158221,-0.00158197,0.999997}}, true }, + { "Land_CzechHedgehog_01_F", {2998.92,8422.76,-5.10216e-005}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {2993.97,8422.44,-3.73125e-005}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {2990.51,8425.96,-0.037242}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {2987.69,8430.18,0.0677153}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {3004.95,8422.89,-1.0252e-005}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {3024.11,8421.45,-3.19481e-005}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {3020.29,8421.5,0.0204887}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {3010.32,8422.05,-2.45571e-005}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {3015.56,8421.94,-0.000506878}, {{0,1,0},{0,0,1}}, true }, + { "Land_CzechHedgehog_01_F", {3027.56,8421.98,-5.29289e-005}, {{0,1,0},{0,0,1}}, true }, + { "Land_Wreck_Truck_F", {3045.11,8416.34,-0.0399089}, {{0.417845,-0.900498,0.120453},{-0.121494,0.0760071,0.989678}}, true }, + { "Land_LampShabby_F", {3040.54,8436.2,0.0175948}, {{-0.967344,0.253466,0},{0,0,1}}, true }, + { "Land_CncBarrier_F", {3038.68,8435.4,-0.065258}, {{0.954189,0.287336,0.0834337},{-0.0939822,0.0230904,0.995306}}, true }, + { "Land_CncBarrier_F", {3032,8431.31,5.91278e-005}, {{0.99894,0.022325,0.0402504},{-0.0407667,0.0231738,0.9989}}, true }, + { "Land_CncBarrier_F", {3030.59,8429.72,-0.0231225}, {{0,0.999586,-0.028787},{-0.0351779,0.0287692,0.998967}}, true }, + { "Land_Razorwire_F", {3049.69,8438.18,-0.0219493}, {{0.47678,-0.877605,0.0498977},{-0.0103981,0.0511302,0.998638}}, true }, + { "Land_Razorwire_F", {3042.89,8435.17,-0.0180011}, {{-0.467815,0.879819,-0.0840743},{-0.0471471,0.0701478,0.996422}}, true }, + { "PortableLight_Double_EPOCH", {3039.39,8461.92,-0.00410295}, {{-0.650916,-0.759109,0.00788934},{0,0.0103923,0.999946}}, true }, + { "Land_UWreck_MV22_F", {3028.78,8517.84,0}, {{0,1,0},{0,0,1}}, true }, + { "Land_Razorwire_F", {3056.91,8440.96,-0.328821}, {{-0.128,0.989448,-0.0678854},{-0.133202,0.0506773,0.989792}}, true }, + { "Land_Razorwire_F", {3071.99,8448.06,0.162379}, {{-0.717775,0.64651,-0.258505},{-0.0900331,0.281972,0.955189}}, true }, + { "Land_Razorwire_F", {3065.21,8443.7,-0.302259}, {{-0.464256,0.850586,-0.246922},{-0.208888,0.165771,0.963787}}, true }, + { "Land_Garbage_square3_F", {3067.21,8468.31,0.000768661}, {{0,1,0},{-0.0423614,0,0.999102}}, true }, + { "Land_GarbageHeap_03_F", {3074.78,8472.64,-0.00442696}, {{0,0.999102,-0.0423614},{0,0.0423614,0.999102}}, true }, + { "Land_WoodPile_F", {3072.45,8466.85,0.00233793}, {{0.872535,0.488114,-0.0206958},{0,0.0423614,0.999102}}, true }, + { "Land_HelipadCircle_F", {3056.01,8466.4,0}, {{0,1,0},{0,0,1}}, true }, + { "Land_Campfire_F", {3071.16,8469.5,0.000163078}, {{0,0.999102,-0.0423614},{0,0.0423614,0.999102}}, false }, + { "Land_LampShabby_F", {3074.85,8484.94,8.98838e-005}, {{-0.635439,0.772151,0},{0,0,1}}, true }, + { "ProtectionZone_Invisible_F", {3060.9,8484.89,6.44742}, {{0,0.999999,0.00161916},{0,-0.00161916,0.999999}}, true }, + { "Land_Razorwire_F", {3083.11,8465.72,-0.0561752}, {{-0.97853,-0.0183062,-0.205291},{-0.205892,0.0414538,0.977696}}, true }, + { "Land_Razorwire_F", {3084.93,8473.08,-0.292695}, {{0.932058,-0.340095,0.124915},{-0.0638688,0.185144,0.980634}}, true }, + { "Land_Razorwire_F", {3076.57,8454.27,-0.283497}, {{-0.823591,0.441944,-0.355503},{-0.364961,0.0668604,0.928619}}, true }, + { "Land_Razorwire_F", {3081.55,8460.04,0.0395131}, {{0.645025,-0.695578,0.316408},{-0.205892,0.240552,0.948548}}, true }, + { "Land_Garbage_square5_F", {3077.64,8490.77,0.00294161}, {{0,0.999712,0.023991},{-0.0303859,-0.0239799,0.999251}}, true }, + { "Land_StallWater_F", {3079.79,8477,-0.0317125}, {{0.997882,0.0124003,0.0638639},{-0.0638688,0,0.997958}}, true }, + { "Land_PicnicTable_01_F", {3079.19,8490.69,0}, {{0,1,0},{0,0,1}}, true }, + { "Land_Sunshade_01_F", {3076.76,8490.18,0.00111628}, {{0,0.999712,0.023991},{-0.0303859,-0.0239799,0.999251}}, true }, + { "Land_WoodenCrate_01_stack_x3_F", {3084.71,8499.77,-0.00206947}, {{0,0.999988,-0.00479659},{-0.00158221,0.00479658,0.999987}}, true }, + { "Land_Razorwire_F", {3090.33,8488.6,-0.260276}, {{-0.843112,0.345059,-0.412428},{-0.437984,0.00432321,0.898972}}, true }, + { "Land_Razorwire_F", {3088.2,8481.35,0.140541}, {{-0.856545,-0.0269148,-0.51537},{-0.516007,0.0287644,0.856102}}, true }, + { "Land_Razorwire_F", {3092.04,8496.52,0.103394}, {{0.920431,-0.0988834,0.378191},{-0.37075,0.0858176,0.924759}}, true }, + { "Land_CratesShabby_F", {3085.11,8504.5,0.000340462}, {{0,0.999872,-0.0159977},{0.0159975,0.0159956,0.999744}}, true }, + { "Land_CratesPlastic_F", {3085.18,8505.46,3.57628e-005}, {{0,0.999872,-0.0159977},{0.0159975,0.0159956,0.999744}}, true }, + { "Land_CratesWooden_F", {3084.38,8502.77,1.90735e-006}, {{-0.0545167,-0.998511,-0.00166587},{-0.00158221,-0.00158197,0.999997}}, true }, + { "Land_CratesWooden_F", {3081.82,8502.78,1.90735e-006}, {{0,0.999999,0.00158197},{-0.00158221,-0.00158197,0.999997}}, true }, + { "Land_Garbage_square5_F", {3077.78,8504.58,-0.000335217}, {{0,0.999999,0.00158197},{-0.00158221,-0.00158197,0.999997}}, true }, + { "Land_GarbagePallet_F", {3084.52,8512.91,-0.0360587}, {{0,0.982208,-0.187798},{0.0159975,0.187774,0.982082}}, true }, + { "Land_WoodenCrate_01_stack_x5_F", {3084.1,8509.15,0.000776291}, {{0.0709465,0.997334,-0.0170923},{0.0159975,0.0159956,0.999744}}, true }, + { "Land_Razorwire_F", {3079.73,8518.7,-0.0379169}, {{0.201449,0.961461,-0.187113},{0.0159975,0.187774,0.982082}}, true }, + { "Land_Razorwire_F", {3087.25,8517.05,-0.0491641}, {{0.201468,0.963169,-0.178091},{0.00800059,0.180195,0.983598}}, true }, + { "Land_Razorwire_F", {3092.3,8504.68,-0.0691781}, {{-0.925833,-0.0848631,-0.368282},{-0.37075,0.0148576,0.928614}}, true }, + { "Land_Razorwire_F", {3092.01,8512.5,0.545356}, {{-0.992275,0.0488398,-0.114041},{-0.0939822,0.304115,0.947988}}, true }, + { "PortableLight_Single_EPOCH", {3084.55,8501.35,-0.000876427}, {{0.94556,0.325441,0.00201092},{-0.00158221,-0.00158197,0.999997}}, true }, + // Eastern Trader Camp + { "Land_MapBoard_01_Wall_Malden_F", {8199.73,8751.68,1.50435}, {{-0.998432,0.0559757,0},{0,0,1}}, true }, + { "Land_Canteen_F", {8220.15,8736.16,0.887077}, {{0,0.999997,0.00239211},{0,-0.00239211,0.999997}}, true }, + { "Land_Tableware_01_tray_F", {8220.33,8735.93,0.887081}, {{0,0.999997,0.00239211},{0,-0.00239211,0.999997}}, true }, + { "Land_Tableware_01_stackOfNapkins_F", {8221.4,8735.97,0.887082}, {{0,0.999997,0.00239211},{0,-0.00239211,0.999997}}, true }, + { "Land_Sleeping_bag_folded_F", {8216.63,8739.25,0.00943279}, {{0.536858,0.84361,0.0103293},{-0.00813388,-0.00706721,0.999942}}, true }, + { "Land_Sleeping_bag_folded_F", {8213.33,8742.03,0.00992632}, {{-0.555284,0.831659,0.00162426},{-0.00195312,-0.00325709,0.999993}}, true }, + { "Land_Sleeping_bag_folded_F", {8211.72,8745.21,0.00896549}, {{0.287965,-0.957616,0.00687788},{0.0115233,0.0106466,0.999877}}, true }, + { "Land_Sleeping_bag_folded_F", {8213.57,8743.15,-4.76837e-007}, {{-0.813133,-0.582079,0},{0,0,1}}, true }, + { "Land_ChairPlastic_F", {8222.85,8735.74,3.8147e-006}, {{-0.590678,-0.806905,-0.00193022},{0,-0.00239211,0.999997}}, true }, + { "Land_ChairPlastic_F", {8219.17,8735.11,1.90735e-006}, {{-0.795639,0.605769,0.00144907},{0,-0.00239211,0.999997}}, true }, + { "Land_TablePlastic_01_F", {8220.96,8736.08,1.43051e-006}, {{-0.065317,-0.997862,-0.00238701},{0,-0.00239211,0.999997}}, true }, + { "Land_FieldToilet_F", {8205.35,8744.03,0.000305176}, {{-0.746161,-0.665681,-0.0106481},{0,-0.0159937,0.999872}}, true }, + { "Land_FieldToilet_F", {8206.17,8743.04,0.000305176}, {{-0.746161,-0.665681,-0.0106481},{0,-0.0159937,0.999872}}, true }, + { "Land_FieldToilet_F", {8207.13,8742.06,0.000317097}, {{-0.746161,-0.665681,-0.0106481},{0,-0.0159937,0.999872}}, true }, + { "Land_CampingChair_V1_F", {8219.92,8734.58,3.33786e-006}, {{-0.365383,-0.930854,-0.00222672},{0,-0.00239211,0.999997}}, true }, + { "Land_CampingChair_V2_white_F", {8217.95,8740.93,-4.76837e-007}, {{-0.228351,-0.973579,0},{0,0,1}}, true }, + { "Land_CampingChair_V2_F", {8219.34,8744.08,-4.76837e-007}, {{0.48697,0.873419,0},{0,0,1}}, true }, + { "Land_CampingChair_V2_white_F", {8217.36,8744.34,-4.76837e-007}, {{-0.570688,0.821167,0},{0,0,1}}, true }, + { "Land_Sink_F", {8209.07,8740.61,0}, {{-0.704756,0.709359,0.0113467},{0,-0.0159937,0.999872}}, true }, + { "Land_PenBlack_F", {8202.94,8751.12,1.31026}, {{0.950445,0.310893,0},{0,0,1}}, true }, + { "Land_Money_F", {8200.91,8754.05,0.754758}, {{0,1,0},{0.00129158,0,0.999999}}, true }, + { "Land_Notepad_F", {8202.76,8750.62,1.28302}, {{0,0.999994,-0.00338291},{0,0.00338291,0.999994}}, true }, + { "Land_FlowerPot_01_Flower_F", {8200.66,8755.31,0.290066}, {{0,1,0},{0.00129158,0,0.999999}}, true }, + { "Land_TableSmall_01_F", {8202.32,8760.14,0.000129223}, {{0.987815,-0.154465,-0.0190204},{0.0159975,-0.0207896,0.999656}}, true }, + { "Land_TableSmall_01_F", {8200.89,8754.07,0.319301}, {{0.930367,-0.366628,-0.00120164},{0.00129158,0,0.999999}}, true }, + { "Land_ChairWood_F", {8200.77,8753.1,0.336327}, {{-0.988987,-0.148,0},{0,0,1}}, true }, + { "Land_ChairWood_F", {8201.53,8754.8,0.312427}, {{-0.53058,0.847635,0.000685285},{0.00129158,0,0.999999}}, true }, + { "Land_WoodenBed_01_F", {8205.4,8754.42,0.378473}, {{0.0844304,0.996429,-0.000109048},{0.00129158,0,0.999999}}, true }, + { "Land_Laptop_02_unfolded_F", {8202.87,8750.11,1.29723}, {{0.8,-0.599997,0.00202974},{0,0.00338291,0.999994}}, true }, + { "Land_File1_F", {8202.91,8750.98,1.28815}, {{0.98503,0.17238,0},{0,0,1}}, true }, + { "Land_SatelliteAntenna_01_F", {8209.93,8757.19,-0.00197601}, {{0.652561,0.757703,-0.00709392},{0.02479,-0.0119912,0.999621}}, true }, + { "Land_WoodenTable_large_F", {8203.04,8750.69,0.421222}, {{-0.0726553,-0.997351,0.00339149},{0,0.00340048,0.999994}}, true }, + { "Land_Sun_chair_F", {8203.34,8758.65,0.000140667}, {{0.993387,0.114013,-0.0135261},{0.0159975,-0.0207896,0.999656}}, true }, + { "Land_Sun_chair_F", {8203.05,8760.83,0.000155449}, {{0.976835,-0.212312,-0.0267717},{0.02479,-0.0119912,0.999621}}, true }, + { "Land_CampingTable_F", {8215.49,8750.42,6.00815e-005}, {{-0.99954,-0.0303333,-0.000364015},{0,-0.0119996,0.999928}}, true }, + { "RoadCone_F", {8222.23,8799.65,-0.207893}, {{0,0.998391,0.0567082},{0.0503349,-0.0566364,0.997125}}, true }, + { "RoadCone_F", {8215.55,8791.29,-0.201303}, {{0,0.999488,0.031983},{0.0749874,-0.0318929,0.996674}}, true }, + { "RoadCone_F", {8224.27,8792.71,-0.207889}, {{0,0.998391,0.0567082},{0.0503349,-0.0566364,0.997125}}, true }, + { "RoadCone_F", {8223.39,8795.95,-0.207932}, {{0,0.998391,0.0567082},{0.0503349,-0.0566364,0.997125}}, true }, + { "RoadCone_F", {8215.33,8795.33,-0.201246}, {{0,0.999488,0.031983},{0.0749874,-0.0318929,0.996674}}, true }, + { "RoadCone_F", {8215.82,8787.73,0.00180101}, {{0,0.999488,0.031983},{0.0749874,-0.0318929,0.996674}}, true }, + { "Land_GarbageContainer_closed_F", {8238.44,8747.71,0.0239067}, {{0.952562,-0.253598,-0.168264},{0.173336,-0.00238033,0.98486}}, true }, + { "Land_GarbageContainer_closed_F", {8238.88,8749.42,0.0274053}, {{0.954561,-0.23921,-0.177743},{0.185522,0.0102176,0.982587}}, true }, + { "Land_Workbench_01_F", {8234.04,8766.72,0.00433969}, {{-0.971237,-0.219147,0.0931256},{0.0884523,0.0310629,0.995596}}, true }, + { "Land_GarbageContainer_closed_F", {8239.42,8751.05,0.0285907}, {{-0.937222,0.310438,0.158879},{0.185522,0.0580706,0.980923}}, true }, + { "Land_GarbageBarrel_01_english_F", {8236.48,8768.79,0.00550508}, {{-0.692755,0.720114,0.0390791},{0.0884523,0.0310629,0.995596}}, true }, + { "Land_HelipadCircle_F", {8192.97,8791.68,0}, {{0,0.999672,0.0255917},{0.122276,-0.0253997,0.992171}}, true }, + { "Land_HBarrier_5_F", {8223.57,8732.43,-0.000534058}, {{-0.0980172,0.995182,0.0023806},{0,-0.00239211,0.999997}}, true }, + { "Land_HBarrier_5_F", {8212.46,8734.23,0}, {{-0.620428,-0.784264,0},{0,0,1}}, true }, + { "Land_HBarrier_5_F", {8200.71,8746.35,-0.0358186}, {{-0.998628,-0.0523504,-0.000837383},{0,-0.0159937,0.999872}}, true }, + { "Land_HBarrier_5_F", {8208.17,8738.05,0.0243478}, {{0.675598,0.737176,0.0117917},{0,-0.0159937,0.999872}}, true }, + { "Land_HBarrier_5_F", {8204.06,8742.11,0.0256491}, {{0.711713,0.70238,0.0112351},{0,-0.0159937,0.999872}}, true }, + { "Land_HBarrier_5_F", {8217.79,8732.08,-0.00536346}, {{-0.0723662,-0.997378,0.000173109},{0.00239211,0,0.999997}}, true }, + { "Land_TentA_F", {8217.81,8737.06,1.71661e-005}, {{-0.327965,-0.944687,-0.00225981},{0,-0.00239211,0.999997}}, true }, + { "Land_TentA_F", {8211.84,8743.5,5.29289e-005}, {{-0.952163,-0.305211,0.0152308},{0.015994,0,0.999872}}, true }, + { "Land_TentA_F", {8211.06,8746.34,2.28882e-005}, {{-0.995529,-0.0931043,0.0159242},{0.0159937,0,0.999872}}, true }, + { "Land_TentA_F", {8213.44,8740.86,0}, {{-0.807753,-0.589521,0},{0,0,1}}, true }, + { "Land_TentA_F", {8215.26,8738.64,0}, {{-0.650515,-0.759493,0},{0,0,1}}, true }, + { "Land_Garbage_square3_F", {8224.11,8738.91,0}, {{0,1,0},{0,0,1}}, true }, + { "Land_Garbage_square5_F", {8217.01,8747.23,0}, {{0,1,0},{0,0,1}}, true }, + { "Land_Campfire_F", {8218.38,8742.65,0}, {{0,1,0},{0,0,1}}, false }, + { "Land_WaterTank_04_F", {8205.41,8770.02,0}, {{-0.891667,0.452693,0},{0,0,1}}, true }, + { "ProtectionZone_Invisible_F", {8224.4,8756.69,0.00099802}, {{0,0.999974,-0.00720107},{0.0191948,0.00719974,0.99979}}, true }, + { "Land_HBarrier_5_F", {8200.46,8759.23,0.0446353}, {{0.997748,-0.0648074,-0.0173148},{0.0159975,-0.0207896,0.999656}}, true }, + { "Land_HBarrier_5_F", {8201.25,8770.14,0.0769663}, {{0.981896,-0.18675,-0.0316901},{0.0247923,-0.0391571,0.998925}}, true }, + { "Land_HBarrier_5_F", {8200.81,8764.41,0.083931}, {{0.996074,-0.083972,-0.0280132},{0.0247923,-0.0391571,0.998925}}, true }, + { "Land_TentDome_F", {8203.29,8763.57,0.00987482}, {{-0.177538,-0.983521,-0.0341469},{0.0247923,-0.0391571,0.998925}}, true }, + { "Land_Sunshade_F", {8202.34,8759.58,0.000490665}, {{0,0.999784,0.0207922},{0.0159975,-0.0207896,0.999656}}, true }, + { "Land_Garbage_square3_F", {8212.5,8769.83,0.00545883}, {{0,0.999409,0.0343797},{0.0191975,-0.0343733,0.999225}}, true }, + { "Land_Garbage_square5_F", {8212.51,8760.21,0.000863552}, {{0,0.999928,0.0119996},{0,-0.0119996,0.999928}}, true }, + { "Land_SignM_WarningMilitaryArea_english_F", {8214.52,8783.16,0}, {{0.0807734,-0.996732,0},{0,0,1}}, true }, + { "Flag_RedCrystal_F", {8216.19,8779.96,-4.76837e-007}, {{0,1,0},{0,0,1}}, true }, + { "Land_HBarrier_5_F", {8207.88,8779.19,0.0214648}, {{-0.290202,0.954198,0.0727313},{0.029589,-0.0670187,0.997313}}, true }, + { "Land_HBarrier_5_F", {8203.46,8775.56,0.094923}, {{0.847742,-0.52694,-0.0605614},{0.029589,-0.0670187,0.997313}}, true }, + { "Land_HBarrier_5_F", {8213.22,8781.17,0.0560451}, {{-0.289995,0.95312,0.0863969},{0.0479446,-0.0756943,0.995978}}, true }, + { "Land_BarGate_F", {8220.44,8782.99,0}, {{-0.114469,0.993427,0},{0,0,1}}, false }, + { "Land_Mil_ConcreteWall_F", {8223.92,8796.41,4.76837e-007}, {{0.975071,0.221895,0},{0,0,1}}, true }, + { "Land_Mil_ConcreteWall_F", {8214.73,8791.15,4.76837e-007}, {{0.990362,0.138503,0},{0,0,1}}, true }, + { "Land_Mil_ConcreteWall_F", {8215.21,8786.69,0}, {{0.990362,0.138503,0},{0,0,1}}, true }, + { "Land_Mil_ConcreteWall_F", {8214.22,8795.5,0}, {{0.990362,0.138503,0},{0,0,1}}, true }, + { "Land_Mil_ConcreteWall_F", {8222.54,8800.68,4.76837e-007}, {{-0.913812,-0.406138,0},{0,0,1}}, true }, + { "Land_Wreck_Heli_Attack_01_F", {8230.12,8702.72,-0.0943418}, {{0,0.991907,-0.126964},{0.109733,0.126197,0.985917}}, true }, + { "Land_SignM_WarningMilitaryArea_english_F", {8238.98,8738.46,0}, {{-0.7157,0.698408,0},{0,0,1}}, true }, + { "Flag_RedCrystal_F", {8235.69,8742.08,0}, {{0,1,0},{0,0,1}}, true }, + { "Land_HBarrier_5_F", {8238.48,8743.32,-0.203916}, {{0.812708,-0.564495,-0.144401},{0.173336,-0.00238033,0.98486}}, true }, + { "Land_HBarrier_5_F", {8240.79,8748.59,0.137378}, {{-0.952517,0.247559,0.177271},{0.185522,0.0102176,0.982587}}, true }, + { "Land_BarGate_F", {8232.11,8736.13,-4.76837e-007}, {{-0.552951,0.833214,0},{0,0,1}}, false }, + { "Land_BagFence_Long_F", {8238.28,8738.67,0.00416136}, {{0.592364,-0.798642,-0.106186},{0.173336,-0.00238033,0.98486}}, true }, + { "Land_BagFence_Corner_F", {8240.12,8739.77,0.0845289}, {{-0.478555,-0.87421,0.0821129},{0.173336,-0.00238033,0.98486}}, true }, + { "Land_BagFence_Corner_F", {8226.35,8730.97,0.0133686}, {{-0.995955,-0.077641,0.0452289},{0.0455516,-0.00238963,0.998959}}, true }, + { "Land_BagFence_Round_F", {8227.31,8729.58,0.00468349}, {{0.244496,0.96961,-0.00882935},{0.0455516,-0.00238963,0.998959}}, true }, + { "Land_BagFence_Round_F", {8229.18,8730.87,-0.014102}, {{-0.99371,0.102299,0.0455569},{0.0455516,-0.00238963,0.998959}}, true }, + { "Land_BagFence_Round_F", {8241.76,8742.07,-0.0326204}, {{-0.625078,-0.773034,0.108146},{0.173336,-0.00238033,0.98486}}, true }, + { "Land_BagFence_Round_F", {8241.81,8739.81,-0.0276465}, {{-0.663004,0.739182,0.118475},{0.173336,-0.00238033,0.98486}}, true }, + { "Land_LampHalogen_F", {8225.8,8735.55,-4.76837e-007}, {{0.942949,0.332936,0},{0,0,1}}, true }, + { "Land_LampHalogen_F", {8226.55,8734.46,0}, {{-0.649994,-0.75994,0},{0,0,1}}, true }, + { "Land_HBarrier_1_F", {8236.6,8740.2,1.57356e-005}, {{-0.633946,-0.773375,-0.00185001},{0,-0.00239211,0.999997}}, true }, + { "Land_HBarrier_1_F", {8227.19,8733.18,0.0010457}, {{0.938561,0.342549,-0.0419781},{0.0455516,-0.00238963,0.998959}}, true }, + { "Land_PaperBox_open_empty_F", {8234.91,8759.52,0.00190353}, {{-0.991253,-0.118236,0.0586348},{0.0519298,0.0590158,0.996905}}, true }, + { "Land_HBarrier_5_F", {8238.81,8765.79,0.00236273}, {{0.973259,0.152852,-0.171472},{0.168745,0.0307379,0.98518}}, true }, + { "Land_HBarrier_5_F", {8237.89,8771.46,0.00236273}, {{0.973259,0.152852,-0.171472},{0.168745,0.0307379,0.98518}}, true }, + { "Land_HBarrier_5_F", {8241.05,8754.42,-0.0505013}, {{0.970278,0.147022,-0.192213},{0.185522,0.0580706,0.980923}}, true }, + { "Land_HBarrier_5_F", {8239.78,8760.04,-0.0505013}, {{0.970278,0.147022,-0.192213},{0.185522,0.0580706,0.980923}}, true }, + { "Land_ScrapHeap_1_F", {8234.62,8771.85,-0.00834084}, {{-0.221623,0.975073,-0.0107328},{0.0884523,0.0310629,0.995596}}, true }, + { "Land_PaperBox_closed_F", {8236.63,8759.77,0.00311756}, {{0.988431,0.139408,-0.0597411},{0.0519298,0.0590158,0.996905}}, true }, + { "Land_Pallet_MilBoxes_F", {8235.1,8762.83,0.00204849}, {{-0.980306,-0.191075,0.0499058},{0.0519288,-0.00559174,0.998635}}, true }, + { "Land_GarbageHeap_04_F", {8237.09,8757.11,-0.00887489}, {{0,0.998252,-0.0590955},{0.0519298,0.0590158,0.996905}}, true }, + { "Land_GarbagePallet_F", {8235.77,8755.07,-0.0131106}, {{0,0.998252,-0.0590955},{0.0519298,0.0590158,0.996905}}, true }, + { "Land_Garbage_square5_F", {8229.27,8768.14,-0.00140619}, {{0,0.999984,0.00559929},{0.0519288,-0.00559174,0.998635}}, true }, + { "Land_GarbageBags_F", {8238.65,8753.3,0.137726}, {{0,0.998252,-0.0590965},{0.185522,0.0580706,0.980923}}, true }, + { "Land_Wreck_Hunter_F", {8228.89,8799.27,-0.0184212}, {{-0.784361,0.607893,0.123465},{0.0971384,-0.0762128,0.992349}}, true }, + { "Land_BagBunker_Small_F", {8227.83,8787.76,0.0522332}, {{0.203236,-0.975907,-0.0793713},{0.116795,-0.0563211,0.991558}}, true }, + { "Flag_NATO_F", {8226.87,8781.72,4.76837e-007}, {{0,1,0},{0,0,1}}, true }, + { "Land_PowerGenerator_F", {8232.82,8780.23,0.00719833}, {{-0.752689,0.650498,0.101543},{0.116795,-0.0198578,0.992957}}, true }, + { "Land_HBarrier_5_F", {8236.95,8777.19,0.0915666}, {{0.980661,0.160399,-0.112141},{0.116795,-0.0198578,0.992957}}, true }, + { "Land_HBarrier_5_F", {8233.95,8782.17,-0.231368}, {{-0.600282,-0.797919,0.05465},{0.116795,-0.0198578,0.992957}}, true }, + { "Land_HBarrier_5_F", {8228.36,8783.77,-0.186376}, {{0.0708746,-0.995973,-0.054904},{0.0884518,-0.0485504,0.994897}}, true }, + { "Land_LampHalogen_F", {8228.48,8780.74,0}, {{0.873624,0.486601,0},{0,0,1}}, true }, + { "Land_LampHalogen_F", {8234.58,8779,1.43051e-006}, {{-0.812201,0.583377,0},{0,0,1}}, true }, + { "Land_Mil_ConcreteWall_F", {8225.03,8792.2,4.76837e-007}, {{-0.956993,-0.290112,0},{0,0,1}}, true }, + { "Land_LuggageHeap_01_F", {8287.5,8720.69,0.00329256}, {{0,0.99998,-0.0063944},{0.112874,0.00635354,0.993589}}, true }, + { "Land_LuggageHeap_04_F", {8288.41,8718.79,0.000181437}, {{0,0.99998,-0.0063944},{0.112874,0.00635354,0.993589}}, true }, + { "Land_LuggageHeap_04_F", {8285.92,8722.28,0.00569487}, {{0.623789,-0.780154,-0.0474102},{0.0837045,0.00637196,0.99647}}, true }, + { "Land_LuggageHeap_03_F", {8287.61,8722.98,0.00234711}, {{0,0.99998,-0.0063944},{0.112874,0.00635354,0.993589}}, true }, + { "Land_LuggageHeap_03_F", {8290.21,8719.18,0.00234711}, {{0,0.99998,-0.0063944},{0.112874,0.00635354,0.993589}}, true }, + { "Land_LuggageHeap_02_F", {8287.69,8721.73,-0.00678658}, {{0,0.99998,-0.0063944},{0.112874,0.00635354,0.993589}}, true }, + { "Land_LuggageHeap_05_F", {8289.71,8721.17,0.0191203}, {{0,0.99998,-0.0063944},{0.112874,0.00635354,0.993589}}, true }, + { "Land_LuggageHeap_05_F", {8285.86,8719.33,0.0138569}, {{0,0.99998,-0.0063944},{0.0837045,0.00637196,0.99647}}, true }, + { "Land_Sign_WarningNoWeapon_F", {8280.21,8727.94,0}, {{0.999999,-0.00138812,0},{0,0,1}}, true }, + { "Land_Wreck_HMMWV_F", {8289.57,8738.86,0}, {{-0.999304,0.0373081,0},{0,0,1}}, true }, + { "Land_PortableLight_double_F", {8278.5,8730.81,0}, {{0.0128195,0.999918,0},{0,0,1}}, true }, + { "Land_UWreck_FishingBoat_F", {8312.56,8711.5,-0.266865}, {{0.868645,0.494922,-0.0225495},{0.063074,-0.0653286,0.995868}}, true }, + // "Western" Trader Camp + { "Land_CampingChair_V1_F", {2311.88,3409.6,0.0055542}, {{-0.933025,0.3464,-0.0973245},{-0.116795,-0.0357304,0.992513}}, true }, + { "Land_CampingChair_V1_F", {2313.02,3407.45,0.0010376}, {{-0.364928,-0.930023,-0.0434126},{-0.0271882,-0.0359633,0.998983}}, true }, + { "Land_CampingChair_V2_F", {2314.42,3410.46,0.000213623}, {{0.653104,0.755931,0.0449882},{-0.0271882,-0.0359633,0.998983}}, true }, + { "Land_Bench_F", {2315.26,3408.7,-0.000488281}, {{0.252638,0.966663,0.0416755},{-0.0271882,-0.0359633,0.998983}}, true }, + { "PortableLight_Single_SIM_EPOCH", {2320.64,3416.14,0.000808716}, {{0.850793,0.524976,-0.0234907},{0.0127978,0.0239893,0.99963}}, true }, + { "PortableLight_Single_SIM_EPOCH", {2328.91,3388.61,0.00326538}, {{-0.921127,0.387624,-0.0356616},{-0.0487428,-0.0239649,0.998524}}, true }, + { "Land_GarbageContainer_open_F", {2330.92,3398.96,0.000228882}, {{0.977381,-0.210993,0.014426},{-0.011995,0.012797,0.999846}}, true }, + { "Land_BarrelWater_F", {2345.1,3379.22,0.00137329}, {{0,0.999233,-0.0391708},{-0.0431594,0.0391343,0.998301}}, true }, + { "Land_BarrelWater_F", {2345.7,3379.17,0.00138855}, {{0,0.999233,-0.0391708},{-0.0431594,0.0391343,0.998301}}, true }, + { "Land_BarrelWater_F", {2345.5,3378,0.00137329}, {{0.582642,-0.81073,0.0569705},{-0.0431594,0.0391343,0.998301}}, true }, + { "Land_CampingTable_F", {2331.68,3386.26,0.00161743}, {{-0.725634,-0.688029,-0.00846754},{-0.0487416,0.0391227,0.998045}}, true }, + { "Land_TablePlastic_01_F", {2334.87,3407.46,0.000106812}, {{-0.995764,0.0919293,-0.00147084},{0,0.0159977,0.999872}}, true }, + { "Land_WoodenTable_large_F", {2338.3,3401.98,0.000213623}, {{0.96056,-0.277419,0.0190381},{-0.0151952,0.0159958,0.999757}}, true }, + { "Land_Bench_F", {2362.77,3418.12,0.000488281}, {{-0.963148,0.268955,0.00307803},{0.0168009,0.0487359,0.99867}}, true }, + { "Land_Bench_F", {2359.21,3415.32,-0.000915527}, {{0.0511924,0.998687,-0.00182742},{0.0191947,0.000845572,0.999815}}, true }, + { "Land_HelipadSquare_F", {2320.92,3354.75,-1.52588e-005}, {{0.67542,0.737433,0.000311218},{-0.0829134,0.0755215,0.993691}}, true }, + { "Land_TentDome_F", {2313.72,3418.62,-0.00376892}, {{-0.807417,-0.589473,0.0244832},{0.0127978,0.0239893,0.99963}}, true }, + { "Land_TentDome_F", {2316.23,3405.6,-0.00708008}, {{0.939469,0.34054,0.0378279},{-0.0271882,-0.0359633,0.998983}}, true }, + { "Land_TentDome_F", {2318.97,3417.68,-0.0156403}, {{-0.899506,0.436907,0.001031},{0.0127978,0.0239893,0.99963}}, true }, + { "Land_TentDome_F", {2318.86,3417.65,-0.00643921}, {{-0.899506,0.436907,0.001031},{0.0127978,0.0239893,0.99963}}, true }, + { "Land_TentDome_F", {2319.62,3410.17,-0.00038147}, {{0.81714,0.576298,-0.0127619},{0.0127978,0.00399642,0.99991}}, true }, + { "Land_CampingChair_V1_folded_F", {2320.91,3413.5,1.52588e-005}, {{-0.737724,-0.674615,0.0256342},{0.0127978,0.0239893,0.99963}}, true }, + { "Land_Garbage_square3_F", {2314.48,3401.96,0.00643921}, {{0,0.999353,0.0359766},{-0.0271882,-0.0359633,0.998983}}, true }, + { "Land_Garbage_square5_F", {2315.04,3415.47,-0.00216675}, {{0,0.999712,-0.0239912},{0.0127978,0.0239893,0.99963}}, true }, + { "Land_Campfire_F", {2313.85,3408.93,-0.000305176}, {{0,0.999353,0.0359766},{-0.0271882,-0.0359633,0.998983}}, false }, + { "ProtectionZone_Invisible_F", {2335.17,3394.12,0.000732422}, {{0.159745,0.9871,-0.0107174},{-0.011995,0.012797,0.999846}}, true }, + { "Land_PortableLight_single_F", {2339.4,3377.5,-0.00457764}, {{-0.641599,-0.76704,0},{0,0,1}}, true }, + { "Land_ClothShelter_02_F", {2343.39,3379.52,0.00270081}, {{0,0.999233,-0.0391708},{-0.0431594,0.0391343,0.998301}}, true }, + { "Land_Garbage_square3_F", {2326.63,3392.23,0.00495911}, {{0,0.999712,0.0239934},{-0.0487428,-0.0239649,0.998524}}, true }, + { "Land_Garbage_square3_F", {2342.08,3398.28,-0.00131226}, {{0,0.999954,-0.00959931},{-0.0151952,0.0095982,0.999838}}, true }, + { "Land_Garbage_square5_F", {2345.81,3385.1,-0.00442505}, {{0,0.997531,-0.070225},{-0.012,0.07022,0.997459}}, true }, + { "Land_Garbage_square5_F", {2336.22,3388.28,0.00367737}, {{0,0.999712,0.0239934},{-0.0487428,-0.0239649,0.998524}}, true }, + { "Land_StallWater_F", {2341.81,3379.84,0.00115967}, {{-0.997554,-0.0566793,-0.0409052},{-0.0431594,0.0391343,0.998301}}, true }, + { "Land_PortableLight_single_F", {2332.02,3405.45,0}, {{-0.995439,0.0954,0},{0,0,1}}, true }, + { "Land_PartyTent_01_F", {2335.71,3404.76,0.000320435}, {{-0.155449,-0.987718,0.0158032},{0,0.0159977,0.999872}}, true }, + { "Land_GarbageWashingMachine_F", {2330.29,3421.09,0.00328064}, {{0,0.998436,0.0559132},{-0.10659,-0.0555947,0.992748}}, true }, + { "Land_Garbage_square5_F", {2342.82,3414.69,0.00460815}, {{0,0.998436,0.0559122},{-0.0127979,-0.0559077,0.998354}}, true }, + { "Land_Garbage_line_F", {2344.54,3410.43,0.0129242}, {{-0.8827,-0.469929,-0.00265337},{-0.0127979,0.0183943,0.999749}}, true }, + { "Land_Wreck_CarDismantled_F", {2331.54,3426.21,0.0324249}, {{0.655651,0.749953,0.0877054},{-0.10659,-0.0230633,0.994036}}, true }, + { "Land_GarbageHeap_01_F", {2356.66,3389.44,0.000198364}, {{0.997743,-0.0656321,0.0141985},{-0.0135972,0.00959842,0.999861}}, true }, + { "Land_Bench_01_F", {2365.13,3414.81,0}, {{0.979477,-0.201554,0},{0,0,1}}, true }, + { "Land_Garbage_square5_F", {2359.55,3413.34,-0.000778198}, {{0,1,-0.000845728},{0.0191947,0.000845572,0.999815}}, true }, + { "Land_Campfire_F", {2362.33,3415.94,-0.000335693}, {{0,0.998811,-0.0487416},{0.0670486,0.0486319,0.996564}}, false }, + { "Land_Wreck_Van_F", {2361.54,3427.32,0.00337219}, {{0,0.999712,-0.0239937},{0.0423613,0.0239722,0.998815}}, true } + +}; + staticNpcPos[] = { + // Eastern Trader Camp + { "C_man_hunter_1_F", { 8232.18, 8771.34, 0.00125885 }, 256 }, + { "C_man_pilot_F", { 8233.3, 8761.5, 0.00149393 }, 270 }, + { "C_man_w_worker_F", { 8221.92, 8738.06, 0.00143862 }, 010 }, + { "C_scientist_F", { 8209.06, 8761.39, 0.00152349 }, 054 }, + // "Northern" Trader Camp + { "C_man_polo_5_F", { 3040.71, 8465.4, 0.00144076 }, 052 }, + { "C_journalist_F", { 3079.2, 8474.5, 0.00206375 }, 290 }, + { "C_man_p_shorts_1_F_afro", { 3023.66, 8483.85, 8.38264 }, 047 }, + { "C_man_polo_6_F", { 3080.98, 8496.67, 0.00145102 }, 258 }, + { "C_man_shorts_2_F", { 3080.35, 8505.38, 0.00143909 }, 250 }, + // "Western" Trader Camp + { "C_man_polo_2_F_euro", { 2334.19, 3405.76, 0.00138855 }, 095 }, + { "C_man_polo_1_F", { 2343.79, 3378.75, 0.00138855 }, 004 }, + { "C_man_p_beggar_F", { 2330.36, 3388.18, 0.00140381 }, 082 } + }; +}; diff --git a/Sources/epoch_server_settings/configs/maps/Mountains_ACR.h b/Sources/epoch_server_settings/configs/maps/Mountains_ACR.h index 6b1468d9..95863155 100644 --- a/Sources/epoch_server_settings/configs/maps/Mountains_ACR.h +++ b/Sources/epoch_server_settings/configs/maps/Mountains_ACR.h @@ -30,7 +30,7 @@ class Mountains_ACR : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Napf.h b/Sources/epoch_server_settings/configs/maps/Napf.h index c1b713ad..49d8b42c 100644 --- a/Sources/epoch_server_settings/configs/maps/Napf.h +++ b/Sources/epoch_server_settings/configs/maps/Napf.h @@ -30,7 +30,7 @@ class Napf : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Porto.h b/Sources/epoch_server_settings/configs/maps/Porto.h index 73b10ee9..c4485913 100644 --- a/Sources/epoch_server_settings/configs/maps/Porto.h +++ b/Sources/epoch_server_settings/configs/maps/Porto.h @@ -30,7 +30,7 @@ class Porto : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/ProvingGrounds_PMC.h b/Sources/epoch_server_settings/configs/maps/ProvingGrounds_PMC.h index 1c0dafae..1203a188 100644 --- a/Sources/epoch_server_settings/configs/maps/ProvingGrounds_PMC.h +++ b/Sources/epoch_server_settings/configs/maps/ProvingGrounds_PMC.h @@ -29,8 +29,9 @@ class ProvingGrounds_PMC : Default {"VegetationFir",1}, {"ViewPoint",1} }; + shipwreckLootEnabled = 0; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Sara.h b/Sources/epoch_server_settings/configs/maps/Sara.h index fa353461..a929738a 100644 --- a/Sources/epoch_server_settings/configs/maps/Sara.h +++ b/Sources/epoch_server_settings/configs/maps/Sara.h @@ -30,7 +30,7 @@ class Sara : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/SaraLite.h b/Sources/epoch_server_settings/configs/maps/SaraLite.h index f6b29071..450388aa 100644 --- a/Sources/epoch_server_settings/configs/maps/SaraLite.h +++ b/Sources/epoch_server_settings/configs/maps/SaraLite.h @@ -30,7 +30,7 @@ class SaraLite : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Sara_dbe1.h b/Sources/epoch_server_settings/configs/maps/Sara_dbe1.h index c9bf2e90..50539a9e 100644 --- a/Sources/epoch_server_settings/configs/maps/Sara_dbe1.h +++ b/Sources/epoch_server_settings/configs/maps/Sara_dbe1.h @@ -30,7 +30,7 @@ class Sara_dbe1 : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Shapur_BAF.h b/Sources/epoch_server_settings/configs/maps/Shapur_BAF.h index d0444bee..7385cd83 100644 --- a/Sources/epoch_server_settings/configs/maps/Shapur_BAF.h +++ b/Sources/epoch_server_settings/configs/maps/Shapur_BAF.h @@ -29,8 +29,9 @@ class Shapur_BAF : Default {"VegetationFir",1}, {"ViewPoint",1} }; + shipwreckLootEnabled = 0; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Utes.h b/Sources/epoch_server_settings/configs/maps/Utes.h index aad53c1d..bf0965a1 100644 --- a/Sources/epoch_server_settings/configs/maps/Utes.h +++ b/Sources/epoch_server_settings/configs/maps/Utes.h @@ -30,7 +30,7 @@ class Utes : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/Woodland_ACR.h b/Sources/epoch_server_settings/configs/maps/Woodland_ACR.h index f9f44013..56cb9c24 100644 --- a/Sources/epoch_server_settings/configs/maps/Woodland_ACR.h +++ b/Sources/epoch_server_settings/configs/maps/Woodland_ACR.h @@ -30,7 +30,7 @@ class Woodland_ACR : Default {"ViewPoint",1} }; traderBlds[] = {"House", "Building"}; - containerPos[] = {}; + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/altis.h b/Sources/epoch_server_settings/configs/maps/altis.h index ad1afb15..36ead027 100644 --- a/Sources/epoch_server_settings/configs/maps/altis.h +++ b/Sources/epoch_server_settings/configs/maps/altis.h @@ -26,47 +26,6 @@ class Altis : Default {"Airport",5} }; traderBlds[] = { "Land_Kiosk_blueking_F", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_i_Garage_V1_F", "Land_i_Shed_Ind_F", "Land_i_Shop_01_V1_F" }; - containerPos[] = { - { 8599.97, 24513.6, 0 }, - { 6282.61, 22654, 0 }, - { 3431.42, 22447.1, 0 }, - { 3524.53, 22718.1, 0 }, - { 3528.63, 22747.7, 0 }, - { 2185.4, 21454.6, 0 }, - { 2180.42, 21429.5, 0 }, - { 2105.21, 23439.7, 0 }, - { 2352.68, 19379.2, 0 }, - { 3022.73, 13520.1, 0 }, - { 2997.03, 13502.6, 0 }, - { 1940.41, 10095.8, 0 }, - { 7454.79, 9247.77, 0 }, - { 7485.66, 9255.52, 0 }, - { 12060.5, 6203.39, 0 }, - { 12059.2, 6183.42, 0 }, - { 14205.4, 7549.47, 0 }, - { 14373.1, 7688.5, 0 }, - { 14376.8, 7715.9, 0 }, - { 13115, 9491.82, 0 }, - { 13666, 11913.7, 0 }, - { 13682.8, 11890.2, 0 }, - { 15209.5, 14341.1, 0 }, - { 15326.2, 14361.6, 0 }, - { 15340.7, 14291.1, 0 }, - { 15351.3, 14278.1, 0 }, - { 15419.5, 14287.1, 0 }, - { 15951.8, 9707.72, 0 }, - { 22199.6, 5697.94, 0 }, - { 22279.2, 8641.17, 0 }, - { 26135.7, 19798.5, 0 }, - { 27908.6, 24460.4, 0 }, - { 23164.5, 24046.1, 0 }, - { 21016.3, 20024.2, 0 }, - { 18776.8, 18291.9, 0 }, - { 17361.2, 18792.1, 0 }, - { 17598.9, 18813.6, 0 }, - { 17560, 18928.3, 0 }, - { 17702.8, 19466.5, 0 } - }; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/bornholm.h b/Sources/epoch_server_settings/configs/maps/bornholm.h index fdd93181..f7b68c42 100644 --- a/Sources/epoch_server_settings/configs/maps/bornholm.h +++ b/Sources/epoch_server_settings/configs/maps/bornholm.h @@ -30,53 +30,6 @@ class Bornholm : Default {"ViewPoint",1} }; traderBlds[] = { "Land_bo_A_GeneralStore_01", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_i_Garage_V1_F", "Land_i_Shed_Ind_F", "Land_i_Shop_01_V1_F" }; - containerPos[] = { - { 18276.7, 5930.02, 0.105503 }, - { 18142.7, 7628.1, 0.147504 }, - { 18373, 9326.29, -0.0195802 }, - { 18429.3, 9653.04, 0.0745009 }, - { 15894.8, 10978.7, 0.155209 }, - { 13107, 12840.1, 0.060528 }, - { 12081.4, 14079.6, 0.159698 }, - { 10485, 14763.4, 0.00850928 }, - { 7643.97, 16718.9, 0.0803894 }, - { 5647.32, 18407.6, 0.144234 }, - { 3693.63, 20478.6, 0.0152661 }, - { 1398.27, 12447.5, 0.135922 }, - { 1416.68, 10925.5, 0.228794 }, - { 1507.54, 9632.03, 0.287258 }, - { 2357, 5879.23, 0.113886 }, - { 6615.51, 3727.44, 0.234562 }, - { 8881.91, 2446.3, 0.096174 }, - { 9450.38, 2165.44, 0.0539615 }, - { 9757.82, 1885.78, 0.139444 }, - { 10919.3, 1326.26, 0.137976 }, - { 11691.1, 1116.76, 0.44969 }, - { 12315.6, 890.317, 0.0811119 }, - { 13411.1, 589.964, 0.159001 }, - { 14730.6, 338.716, 0.382669 }, - { 16252.7, 975.236, 0.020526 }, - { 17007.2, 2213.23, 0.00994802 }, - { 16815.7, 3624.59, 0.166415 }, - { 18434.4, 6221.01, 0.075858 }, - { 18440.5, 7046.81, 0.125163 }, - { 18470.3, 6651.96, 0.095651 }, - { 16904.5, 2948.45, 0.0231119 }, - { 17085.8, 1873.29, 0.0425238 }, - { 15044.3, 94.8836, 0.0266737 }, - { 14128.8, 570.867, 0.233156 }, - { 7761.55, 3241.01, 0.374451 }, - { 4603.31, 4481.2, 0.0859278 }, - { 2954, 5100.5, 0.0802823 }, - { 1343.62, 6652.17, 0.0688806 }, - { 1436.73, 14426.6, 1.10503 }, - { 1832.78, 15933.8, 0.675109 }, - { 4210.6, 20421, 0.219392 }, - { 4778, 19805.7, -0.0322686 }, - { 7218.53, 16901.3, 0.0510412 }, - { 19394.9, 22393.8, 0.0649745 }, - { 19819.5, 22216.8, 0.0780932 } - }; telePos[] = { { "Transport_C_EPOCH", { -0.415527, -7.05298, -10.3098 }, "", { 14121.2, 11331.5, 0.000305176 } }, { "Transport_W_EPOCH", { -14.4316, 0.112793, -10.3098 }, "", { 1322.18, 8733.92, 0.0136757 } }, diff --git a/Sources/epoch_server_settings/configs/maps/chernarusredux.h b/Sources/epoch_server_settings/configs/maps/chernarusredux.h new file mode 100644 index 00000000..2f5af4b0 --- /dev/null +++ b/Sources/epoch_server_settings/configs/maps/chernarusredux.h @@ -0,0 +1,497 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: Uro1, Robio + + Description: + Epoch gamemode server Side map specific configs for chernarus redux. + + 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_settngs/configs/maps/chernarusredux.h +*/ +class ChernarusRedux : Default +{ + worldSize = 12000; + plantLimit = 10; + vehicleSpawnTypes[] = { + {"FlatAreaCity",1}, + {"FlatAreaCitySmall",1}, + {"NameCity",2}, + {"NameVillage",1}, + {"NameCityCapital",4}, + {"Airport",5}, + {"NameLocal",2}, + {"StrongpointArea",1}, + {"VegetationBroadleaf",1}, + {"VegetationFir",1}, + {"ViewPoint",1} + }; + traderBlds[] = { "Land_A_FuelStation_Build", "Land_A_GeneralStore_01", "Land_A_GeneralStore_01a", "Land_A_Office01", "Land_Ind_Garage01", "Land_Ind_Workshop01_04", "Land_Ind_Workshop01_L", "Land_Shed_Ind02", "Land_Tovarna2", "Land_sara_hasic_zbroj" }; + telePos[] = { + // N [-0.286865,8.17383,-10.3098] + // S [-0.415527,-7.05298,-10.3098] + // E [13.5127,0.410156,-10.3098] + // W [-14.4316,0.112793,-10.3098] + { "Transport_W_EPOCH", { -14.4316, 0.112793, -10.3098 }, "", { 4569.52, 4524.24, 0.201431 } }, // South West + { "Transport_E_EPOCH", { 13.5127, 0.410156, -10.3098 }, "", { 12077.8, 5121.92, 0.00144958 } }, // South East + { "Transport_N_EPOCH", { -0.286865, 8.17383, -10.3098 }, "", { 10688.6, 9428.98, 0.00144958 } } // North East + }; + propsPos[] = { + // phones + { "Land_PhoneBooth_02_F", { 10455.2, 2214.84, 0 }, 52.4502 }, + { "Land_PhoneBooth_02_F", { 10480, 2350.02, 0.101999 }, 326.023 }, + { "Land_PhoneBooth_02_F", { 10479.1, 2349.45, 0.101999 }, 326.023 }, + { "Land_PhoneBooth_02_F", { 6809.42, 2703.85, 0.101999 }, 131.438 }, + { "Land_PhoneBooth_02_F", { 6795.85, 2484.88, 0 }, 312.46 }, + { "Land_PhoneBooth_02_F", { 6738.58, 2393.89, 0 }, 221.25 }, + { "Land_PhoneBooth_02_F", { 6409.57, 2439.88, 0.0883212 }, 46.4278 }, + { "Land_PhoneBooth_02_F", { 7496.04, 5126.04, -0.000732422 }, 182.17 }, + { "Land_PhoneBooth_02_F", { 10132.1, 5471.31, 1.52588e-005 }, 46.4049 }, + { "Land_TouristShelter_01_F", { 11285.3, 5492.9, 1.52588e-005 }, 160.867 }, + { "Land_PhoneBooth_02_F", { 11282.8, 5491.04, 0 }, 162.031 }, + { "Land_PhoneBooth_02_F", { 13359.8, 6170.49, 0 }, 176.672 }, + { "Land_PhoneBooth_02_F", { 12102.1, 7283.6, 0 }, 96.4346 }, + { "Land_PhoneBooth_02_F", { 10654.9, 8013.35, 0.102005 }, 303.161 }, + { "Land_PhoneBooth_02_F", { 12022.4, 9151.21, 0 }, 47.4504 }, + { "Land_PhoneBooth_02_F", { 12023.3, 9150.26, 0 }, 45.6474 }, + { "Land_PhoneBooth_02_F", { 12265.6, 9479.49, 1.18411 }, 141.691 }, + { "Land_PhoneBooth_02_F", { 6017.95, 7821.39, -0.00500488 }, 223.037 }, + { "Land_PhoneBooth_02_F", { 6227.46, 7721.33, 0 }, 36.2285 }, + { "Land_TouristShelter_01_F", { 1969.65, 7361.86, 0 }, 35.9378 }, + { "Land_PhoneBooth_02_F", { 1971.84, 7359.15, -1.52588e-005 }, 127.545 }, + { "Land_PhoneBooth_02_F", { 8785.43, 11618.8, 0 }, 100.044 }, + { "Land_PhoneBooth_02_F", { 11242.2, 12209.9, 0 }, 118.072 }, + { "Land_PhoneBooth_02_F", { 2706.84, 10002.9, 0 }, 12.6221 }, + // City Klen + { "Land_MarketShelter_F", { 11396.6, 11368.6, -0.0245056 }, 216.043 }, + { "Land_i_Stone_Shed_V1_F", { 11392.3, 11388.6, 0 }, 216.9 }, + { "Land_Wreck_Offroad2_F", { 11398.5, 11382.7, -0.00628662 }, 181.726 }, + { "Land_Slums01_8m", { 11383.6, 11393.7, 0.00790405 }, 300.102 }, + { "Land_Slums01_8m", { 11379.6, 11386.9, -0.00378418 }, 300.014 }, + { "Land_GarbageBags_F", { 11394.1, 11382.3, 0.00491333 }, 0.000760495 }, + { "Land_CratesPlastic_F", { 11398.8, 11372.4, -0.000823975 }, 359.71 }, + { "Land_BarrelWater_F", { 11390, 11370.7, 0.000457764 }, 359.997 }, + { "Land_Chapel_V2_F", { 11429, 11352.8, 0.258972 }, 126.48 }, + { "Land_u_House_Big_02_V1_F", { 11417.7, 11362.8, 0 }, 36.7593 }, + { "Land_Cages_F", { 11401.1, 11369.3, 0.00457764 }, 76.3813 }, + { "Land_GarbagePallet_F", { 11426.1, 11367.2, 0.00119019 }, 0.234284 }, + { "Land_i_Stone_HouseBig_V3_F", { 11405.1, 11375.6, 0 }, 129.339 }, + { "Land_Slums02_4m", { 11414.1, 11377.4, 0.0258484 }, 39.2923 }, + { "Land_Slums02_4m", { 11417, 11375.1, 0.00820923 }, 39.284 }, + { "Land_Slums02_4m", { 11407.2, 11383.1, 0.00335693 }, 39.2788 }, + { "Land_Slums02_4m", { 11419.8, 11372.7, 0.00827026 }, 39.284 }, + { "Land_Wreck_Truck_dropside_F", { 11429.9, 11380.5, 0.000671387 }, 0.00762456 }, + { "Land_d_Shop_01_V1_F", { 11453.7, 11350.2, 0.298096 }, 127.575 }, + { "Land_Garbage_square5_F", { 11449.2, 11357.1, 3.05176e-005 }, 0.000244135 }, + { "Land_GarbagePallet_F", { 11452.4, 11353.4, -0.0103455 }, 0.234284 }, + { "Land_PhoneBooth_02_F", { 11459, 11364.1, 3.05176e-005 }, 124.922 }, + { "Land_d_Addon_02_V1_F", { 11436, 11377.1, 3.05176e-005 }, 37.7171 }, + { "Land_i_Stone_HouseSmall_V3_F", { 11464.1, 11229.2, 0 }, 206.45 }, + { "Land_Wired_Fence_8mD_F", { 11480.2, 11247.8, 0.228699 }, 359.571 }, + { "Land_GarbagePallet_F", { 11473.9, 11223.8, -0.0253296 }, 0.234284 }, + { "Land_Wired_Fence_8m_F", { 11476.1, 11253.8, 0.219452 }, 359.549 }, + { "Land_d_Shop_02_V1_F", { 11460.3, 11357.9, 0 }, 215.984 }, + { "Land_Garbage_line_F", { 11464.2, 11351.2, 0.000854492 }, 52.1301 }, + { "Land_WheelieBin_01_F", { 11461.5, 11349.7, 0 }, 0.0691075 }, + { "Land_GarbagePallet_F", { 11463.7, 11363.2, -0.0102539 }, 0.234284 }, + { "Land_GarbageContainer_closed_F", { 11463.6, 11351.2, 3.05176e-005 }, 130.585 }, + { "Land_Timbers_F", { 11469.3, 11389.7, 0.0153503 }, 359.649 }, + { "Land_d_Stone_HouseBig_V1_F", { 11461.3, 11389.2, 0 }, 0 }, + { "Land_GarbagePallet_F", { 11466.6, 11393.2, -0.0388489 }, 0.234284 }, + { "Land_Wreck_Van_F", { 11462.1, 11396.9, -0.0365906 }, 282.773 }, + { "Land_Ancient_Wall_8m_F", { 11535.8, 11265.3, -0.125122 }, 144.692 }, + { "Land_Ancient_Wall_4m_F", { 11556.4, 11279, -0.112091 }, 148.121 }, + { "Land_Ancient_Wall_8m_F", { 11567.8, 11287.4, 0.0343018 }, 144.515 }, + { "Land_HBarrier_5_F", { 11577.4, 11307.8, -0.0361633 }, 324.948 }, + { "Land_HBarrier_5_F", { 11572.7, 11307.1, 0.0201416 }, 21.0099 }, + { "Land_HBarrier_5_F", { 11562.9, 11309.6, 0.0461121 }, 48.0841 }, + { "Land_HBarrier_5_F", { 11567.4, 11307.6, 0.0220337 }, 355.004 }, + { "Land_Cargo_HQ_V3_F", { 11571.9, 11330.1, -0.0317078 }, 268 }, + { "Land_HBarrier_5_F", { 11555.9, 11323.6, 0.0753479 }, 231.934 }, + { "Land_HBarrier_5_F", { 11562.4, 11326.7, -0.125763 }, 49.9669 }, + { "Land_HBarrier_5_F", { 11560.6, 11331.7, -0.0820618 }, 87.9061 }, + { "Land_HBarrier_5_F", { 11564.1, 11322.1, 0.0942078 }, 88.1076 }, + { "Land_HBarrier_5_F", { 11557.4, 11319, -0.0873108 }, 272.274 }, + { "Land_HBarrier_5_F", { 11564.8, 11339.8, 0.0496521 }, 177.031 }, + { "Land_HBarrier_5_F", { 11561.2, 11337.2, -0.0386963 }, 107.942 }, + { "Land_HBarrier_5_F", { 11557.3, 11313.6, -0.120697 }, 271.244 }, + { "Land_HBarrier_5_F", { 11566.1, 11318.1, 0.0227051 }, 36.0297 }, + { "Land_HBarrier_5_F", { 11557.1, 11332, 0.112 }, 177.096 }, + { "Land_HBarrier_3_F", { 11559.8, 11311.4, 0.0235596 }, 180.944 }, + { "Land_PortableLight_double_F", { 11578.2, 11325.2, -0.00167847 }, 357.96 }, + { "Land_PortableLight_double_F", { 11565.8, 11331, 0.00180054 }, 87.9936 }, + { "Land_PortableLight_double_F", { 11579.4, 11336.2, 0.00131226 }, 229.004 }, + { "Land_HBarrier_5_F", { 11570.4, 11340, 0.0419312 }, 176.992 }, + { "Land_HBarrier_5_F", { 11575.8, 11340.3, -0.00686646 }, 176.886 }, + { "Land_Cargo_Patrol_V3_F", { 11598.1, 11309, -0.261566 }, 315 }, + { "Land_HBarrier_5_F", { 11604.1, 11309.6, 0.263916 }, 91.8105 }, + { "Land_HBarrier_5_F", { 11592.5, 11305.2, 0.325073 }, 42.8493 }, + { "Land_HBarrier_5_F", { 11587.8, 11308.1, 0.193237 }, 23.3538 }, + { "Land_HBarrier_5_F", { 11602, 11304.9, -0.0116272 }, 133.822 }, + { "Land_HBarrier_5_F", { 11582.7, 11309.1, -0.0935974 }, 179.212 }, + { "Land_HBarrier_5_F", { 11597.2, 11303.2, 0.501007 }, 1.93882 }, + { "Land_PortableLight_double_F", { 11600.9, 11306.2, 0.0727539 }, 311.827 }, + { "Land_Wreck_HMMWV_F", { 11601.7, 11318.8, 0.0107117 }, 0.254173 }, + { "Land_HBarrier_5_F", { 11580.2, 11338.1, -0.0474548 }, 230.951 }, + { "Land_HBarrier_5_F", { 11604.3, 11315.3, 0.15564 }, 90.3624 }, + { "Land_HBarrier_5_F", { 11605.4, 11320.6, 0.00527954 }, 108.727 }, + { "Land_HBarrier_5_F", { 11605.2, 11325.8, -0.31781 }, 239.194 }, + { "Land_HBarrier_5_F", { 11602.4, 11336.2, -0.191833 }, 230.52 }, + { "Land_HBarrier_5_F", { 11587, 11332.5, 0.0287476 }, 272.043 }, + { "Land_HBarrier_5_F", { 11588, 11327.3, -0.0723877 }, 242.815 }, + { "Land_HBarrier_5_F", { 11604, 11331, 0.0708313 }, 271.184 }, + { "Land_HBarrier_5_F", { 11589.1, 11322.3, -0.0202026 }, 273.918 }, + { "Land_HBarrier_5_F", { 11586.6, 11318.1, 0.0480652 }, 330.046 }, + { "Land_HBarrier_5_F", { 11581.5, 11316.5, 0.0766602 }, 358.179 }, + { "Land_HBarrier_5_F", { 11584.9, 11336.1, -0.142578 }, 180.844 }, + { "Land_Tyres_F", { 11589.7, 11334.3, -0.0446472 }, 202.731 }, + { "Land_ToiletBox_F", { 11585.2, 11333.7, 0.00323486 }, 359.952 }, + { "Land_ToiletBox_F", { 11582.7, 11333.7, 0.00323486 }, 359.965 }, + { "Land_WaterTank_F", { 11584.8, 11322.4, 0.00262451 }, 270.952 }, + { "Land_Pallet_F", { 11599.1, 11334.4, 0.0012207 }, 167.913 }, + { "Land_PaperBox_open_empty_F", { 11593.4, 11312.9, 0.0102844 }, 166.48 }, + { "Land_PaperBox_closed_F", { 11595.3, 11314, 0.0174255 }, 20.1509 }, + { "Land_Pallets_stack_F", { 11599, 11336.3, 0.00747681 }, 107.491 }, + { "Land_BarrelSand_grey_F", { 11582.4, 11318.9, 0.00143433 }, 200.963 }, + { "Land_BarrelEmpty_F", { 11583, 11319.7, 0.00137329 }, 143.048 }, + { "Land_wpp_Turbine_V2_F", { 11630.6, 11256.4, 3.05176e-005 }, 0 }, + { "Land_wpp_Turbine_V2_F", { 11634.6, 11338.9, 0 }, 0 }, + { "Land_wpp_Turbine_V2_F", { 11645.6, 11296.8, 0 }, 0 }, + // North East + {"Land_ClutterCutter_medium_F",{10679.6,9435.62,7.62939e-006},0.0643096}, + {"Land_LampShabby_F",{10673.1,9422,-7.62939e-006},48.6578}, + {"Land_WoodenCart_F",{10677.4,9442.94,-0.0199509},0.1255}, + {"Land_Slums02_4m",{10674.5,9433.75,0.00186157},224.018}, + {"Land_Slums02_4m",{10673.4,9444.57,0.0374298},309.223}, + {"Land_Slums02_4m",{10672.1,9437.09,-0.00406647},244.438}, + {"Land_Slums02_4m",{10676.8,9446.41,0.0543442},0.119723}, + {"Land_Slums02_4m",{10671.6,9441.05,0.0140839},283.663}, + {"Land_Garbage_line_F",{10674,9443.57,0.0653152},217.23}, + {"Land_JunkPile_F",{10679.5,9444.45,0.00154877},359.709}, + {"Land_InvisibleBarrier_F",{10673.7,9444.29,0},131.152}, + {"Land_InvisibleBarrier_F",{10672,9440.85,7.62939e-006},285.049}, + {"Land_InvisibleBarrier_F",{10676.8,9445.61,0},182.439}, + {"Land_InvisibleBarrier_F",{10672.5,9437.2,0},63.0227}, + {"Land_InvisibleBarrier_F",{10674.8,9434.01,0},43.6106}, + {"Land_Campfire_F",{10679.6,9435.56,0.000465393},359.367}, + {"Land_WoodPile_F",{10675.9,9441.61,0.00293732},359.088}, + {"Land_CncBarrier_F",{10677,9430.56,3.8147e-005},38.2729}, + {"Land_Axe_F",{10676.6,9441.46,-0.00322723},73.9678}, + {"Land_HelipadEmpty_F",{10686.6,9418.95,4.57764e-005},0.0323291}, + {"Land_ClutterCutter_large_F",{10686.8,9435.84,-7.62939e-006},359.153}, + {"Land_Garbage_square5_F",{10690.6,9430.02,0.000267029},0.00641501}, + {"Land_Slums02_4m",{10684.4,9427.61,0.00271606},33.3528}, + {"Land_Slums02_4m",{10694.4,9429.21,0.0391235},116.206}, + {"Land_Slums02_4m",{10690.7,9442.29,0.0845108},48.305}, + {"Land_Slums02_4m",{10694.1,9436.97,0.0754395},67.0969}, + {"Land_Slums02_4m",{10695.1,9433.24,0.0348969},86.0347}, + {"Land_Slums02_4m",{10687.4,9444.58,0.0864868},22.401}, + {"Land_Slums02_4m",{10687.7,9426.84,0.00393677},356.182}, + {"Land_Slums02_4m",{10680.9,9446.4,0.0634003},1.21943}, + {"Land_Slums02_4m",{10681,9429.68,0.00272369},33.3528}, + {"Land_Slums02_4m",{10691.6,9426.76,-0.00839233},160.21}, + {"Land_TentDome_F",{10687.7,9442.09,-0.0244064},290.361}, + {"Land_InvisibleBarrier_F",{10680.9,9445.82,0},182.266}, + {"Land_InvisibleBarrier_F",{10684.1,9427.22,0},33.8221}, + {"Land_InvisibleBarrier_F",{10680.8,9429.46,0},33.8225}, + {"Land_InvisibleBarrier_F",{10690.3,9441.82,0},227.277}, + {"Land_InvisibleBarrier_F",{10694.5,9433.07,0},268.195}, + {"Land_InvisibleBarrier_F",{10687,9444.06,7.62939e-006},196.736}, + {"Land_InvisibleBarrier_F",{10687.7,9426.38,0},351.992}, + {"Land_InvisibleBarrier_F",{10691.6,9427.21,-7.62939e-006},334.964}, + {"Land_InvisibleBarrier_F",{10693.8,9436.79,0},248.547}, + {"Land_InvisibleBarrier_F",{10687.7,9426.38,0},352.452}, + {"Land_InvisibleBarrier_F",{10693.9,9429.35,0},297.599}, + {"Land_WorkStand_F",{10689.6,9431.71,0.00012207},0.4623}, + {"Land_FieldToilet_F",{10700.1,9449.24,0.0270386},229.999}, + {"Land_PortableLight_double_F",{10688.4,9426.99,-7.62939e-006},152.941}, + {"Land_Cages_F",{10691,9428.64,9.91821e-005},359.15}, + {"Land_WoodenTable_large_F",{10685.9,9434.16,0.000358582},143.934}, + {"Land_Pallets_stack_F",{10692.5,9430.88,0.0114899},359.393}, + {"Land_WheelCart_F",{10683.8,9441.73,0.0119476},181.87}, + {"Land_ShelvesWooden_khaki_F",{10685.5,9440.39,0.0146866},238.174}, + {"Land_CampingChair_V1_F",{10683.2,9430.95,0.00310516},0.668239}, + {"Land_CratesPlastic_F",{10699.1,9449.65,0.00570679},110.237}, + {"Land_BarrelWater_F",{10684.7,9440.29,0.0127869},2.49711}, + {"Land_Slums02_pole",{10682.8,9445.84,0.00499725},0.672715}, + {"Land_Slums02_pole",{10691.6,9440.46,0.00566864},321.615}, + {"Land_GasTank_01_khaki_F",{10690.6,9431.43,0.00012207},200.712}, + // South East + { "Land_spp_Mirror_F", { 12021.8, 5100.76, -7.62939e-006 }, 182.521 }, + { "Land_spp_Mirror_Broken_F", { 12031.5, 5104.48, 0 }, 182.521 }, + { "Land_Slums01_8m", { 12050.9, 5109.1, -0.00202179 }, 359.933 }, + { "Land_Slums01_8m", { 12051, 5121.93, 0.0187302 }, 118.143 }, + { "Land_Slums01_8m", { 12054.5, 5128.94, 0.0217743 }, 118.269 }, + { "Land_WoodPile_large_F", { 12057.6, 5121.48, -9.15527e-005 }, 21.8792 }, + { "Land_WoodPile_large_F", { 12057.1, 5119.12, 9.91821e-005 }, 203.739 }, + { "Land_WoodPile_large_F", { 12058.9, 5123.89, -0.00171661 }, 197.098 }, + { "Land_WoodPile_large_F", { 12055.8, 5119.65, -9.15527e-005 }, 16.6504 }, + { "Land_Garbage_square3_F", { 12058.5, 5119.32, -0.000190735 }, 200.54 }, + { "Land_Cages_F", { 12051, 5119.59, 0.00479126 }, 22.0683 }, + { "Land_HelipadEmpty_F", { 12058.1, 5100.99, 0 }, 359.533 }, + { "Land_cargo_addon02_V2_F", { 12075.8, 5110.74, 0 }, 313.277 }, + { "Land_Slums01_8m", { 12067.6, 5108.54, -0.00462341 }, 194.501 }, + { "Land_Slums01_8m", { 12067, 5122.79, -0.00128937 }, 106.496 }, + { "Land_Slums01_8m", { 12078.5, 5109.96, -0.00531769 }, 302.472 }, + { "Land_Slums01_8m", { 12080.8, 5125.66, -0.0038147 }, 62.4229 }, + { "Land_Slums01_8m", { 12071.9, 5107.49, -0.00380707 }, 194.501 }, + { "Land_Wreck_Offroad_F", { 12074.4, 5127.79, 0.0411682 }, 325.773 }, + { "Land_LampShabby_F", { 12070.6, 5109.13, -0.0195618 }, 0 }, + { "Land_Wreck_Car3_F", { 12078.6, 5126.01, 0.0244293 }, 146.6 }, + { "Land_TentDome_F", { 12076.8, 5111.69, 3.8147e-005 }, 359.62 }, + { "Land_Garbage_line_F", { 12078, 5124.46, -0.0770569 }, 142.344 }, + { "Land_JunkPile_F", { 12073.8, 5125.85, -0.0101395 }, 359.544 }, + { "Land_InvisibleBarrier_F", { 12065.4, 5108.95, 0 }, 16.7308 }, + { "Land_InvisibleBarrier_F", { 12074.6, 5106.78, 0 }, 19.2329 }, + { "Land_InvisibleBarrier_F", { 12081.8, 5123.84, 0 }, 243.383 }, + { "Land_InvisibleBarrier_F", { 12070.3, 5107.81, 0 }, 16.7344 }, + { "Land_InvisibleBarrier_F", { 12079.7, 5111.63, 0 }, 122.723 }, + { "Land_InvisibleBarrier_F", { 12080.1, 5127.47, 0 }, 239.065 }, + { "Land_InvisibleBarrier_F", { 12077.2, 5107.93, 0 }, 122.631 }, + { "Land_InvisibleBarrier_F", { 12069.1, 5128.14, 0 }, 122.279 }, + { "Land_InvisibleBarrier_F", { 12067.6, 5124.65, 0 }, 112.368 }, + { "Land_InvisibleBarrier_F", { 12066.5, 5120.62, 0 }, 104.748 }, + { "Land_Campfire_F", { 12070.3, 5113.58, 0.00119019 }, 0 }, + { "Land_WoodPile_F", { 12073, 5117.34, -0.00229645 }, 236.097 }, + { "Land_CncBarrier_F", { 12065.4, 5116.71, 0 }, 103.32 }, + { "Land_CncBarrier_stripes_F", { 12082.8, 5121.11, 0.0150528 }, 90.5238 }, + { "Land_CncBarrier_stripes_F", { 12082.3, 5117.84, 0.0185394 }, 104.536 }, + { "Land_CncBarrier_stripes_F", { 12064.5, 5112.14, 0.0020752 }, 279.748 }, + { "Land_CncBarrier_stripes_F", { 12081.2, 5114.26, 0.0116425 }, 300.824 }, + { "Land_WheelCart_F", { 12073, 5108.21, 0.00278473 }, 301.42 }, + { "Land_Slums01_pole", { 12068.4, 5126.9, 0.000801086 }, 260.084 }, + { "Land_Portable_generator_F", { 12069.8, 5108.61, 0.00123596 }, 359.87 }, + { "Land_CampingChair_V2_F", { 12076.1, 5109.27, 0.00286865 }, 99.2684 }, + { "Land_CratesPlastic_F", { 12072.4, 5118.94, 3.05176e-005 }, 359.993 }, + { "Land_BarrelWater_F", { 12073.1, 5110.06, 0.00231171 }, 359.255 }, + { "Land_Axe_fire_F", { 12077.1, 5109.95, -0.00322723 }, 359.907 }, + { "Land_Slums01_8m", { 12070.5, 5130.62, 0.0177002 }, 300.964 }, + { "Land_Slums01_8m", { 12075.7, 5131.46, 0.00196838 }, 40.0636 }, + { "Land_Slums01_8m", { 12060.6, 5133.4, 0.000160217 }, 168.792 }, + { "Land_LampShabby_F", { 12063, 5131.89, 0 }, 169.228 }, + { "Land_InvisibleBarrier_F", { 12073.8, 5133.13, -7.62939e-006 }, 221.588 }, + { "Land_InvisibleBarrier_F", { 12071.2, 5131.82, 0 }, 122.469 }, + { "Land_InvisibleBarrier_F", { 12077.1, 5130.37, 0 }, 221.588 }, + { "Land_Slums01_pole", { 12072.6, 5134.17, 0.00662994 }, 359.468 }, + { "Land_Slums01_pole", { 12064.7, 5134.13, 0.0012207 }, 359.827 }, + { "Land_Garbage_square5_F", { 12093.4, 5120.34, 0.00907135 }, 359.692 }, + { "Land_FieldToilet_F", { 12093.7, 5119.73, 0.0153198 }, 155.607 }, + { "Land_Grave_rocks_F", { 12116.8, 5130.7, 0 }, 0 }, + // South West + { "Flag_US_F", { 4542.15, 4522, -1.52588e-005 }, 209.275 }, + { "Land_HelipadEmpty_F", { 4552.98, 4515.85, 0 }, 0 }, + { "Land_ToiletBox_F", { 4556.27, 4549.86, 0.175018 }, 0.00193372 }, + { "Land_Timbers_F", { 4564.65, 4516.04, 0.199997 }, 325.751 }, + { "Land_Wreck_Van_F", { 4573.34, 4506.86, 0.199997 }, 151.285 }, + { "Land_Garbage_square5_F", { 4588.59, 4516.25, 0.199997 }, 0 }, + { "Land_LampStreet_small_F", { 4577.73, 4514.35, 0.199997 }, 239.902 }, + { "Land_Pipes_large_F", { 4581.84, 4521.72, 0.174988 }, 146.546 }, + { "Land_Pallets_F", { 4586.84, 4514.64, 0.275681 }, 335.695 }, + { "Land_EngineCrane_01_F", { 4581.71, 4510.71, 0.174988 }, 95.9295 }, + { "Land_GarbageContainer_open_F", { 4582.15, 4523.48, 0.175003 }, 151.569 }, + { "Land_Workbench_01_F", { 4585.25, 4521.76, 0.174988 }, 50.0718 }, + { "Barrels", { 4589.08, 4516.4, 0.225494 }, 239.1 }, + { "SignAd_SponsorS_Redstone_F", { 4585.1, 4511.84, 0 }, 142.53 }, + { "Land_WoodenTable_large_F", { 4579.26, 4513.71, 0.175003 }, 142.285 }, + { "Land_Sink_F", { 4573.95, 4519.14, 0.175003 }, 51.2154 }, + { "Land_CncBarrier_stripes_F", { 4578.63, 4513.11, 0.199997 }, 231.189 }, + { "Land_CncBarrier_stripes_F", { 4577.53, 4518.75, 0.199997 }, 325.531 }, + { "Land_CncBarrier_stripes_F", { 4576.61, 4515.73, 0.199997 }, 231.189 }, + { "Land_WoodenTable_small_F", { 4578.02, 4515.24, 0.174988 }, 319.098 }, + { "Land_WeldingTrolley_01_F", { 4585.96, 4513.3, 0.174988 }, 236.669 }, + { "Land_Bench_F", { 4573.12, 4520.15, 0.175003 }, 232.492 }, + { "Land_ToolTrolley_01_F", { 4586.23, 4520.34, 0.175018 }, 228.625 }, + { "Land_ToolTrolley_02_F", { 4587.01, 4519.39, 0.174973 }, 320.682 }, + { "Land_PlasticCase_01_large_F", { 4588.17, 4518.07, 0.174988 }, 321.256 }, + { "Land_WheelieBin_01_F", { 4581.21, 4522.58, 0.175003 }, 139.325 }, + { "Land_WaterCooler_01_old_F", { 4575.21, 4518.16, 0.175064 }, 226.8 }, + { "Land_ChairWood_F", { 4583.23, 4521.15, 0.175018 }, 270.935 }, + { "Land_BarrelWater_F", { 4574.63, 4517.66, 0.175049 }, 354.242 }, + { "Land_PlasticCase_01_medium_F", { 4579.23, 4513.68, 0.175003 }, 120.138 }, + { "Land_Tyre_F", { 4576.11, 4505.51, 0.0297241 }, 358.563 }, + { "Land_GasTank_01_blue_F", { 4588.49, 4515.58, 0.175034 }, 327.133 }, + { "Land_GasTank_01_yellow_F", { 4588.23, 4515.09, 0.175034 }, 247.551 }, + { "Land_PlasticCase_01_small_F", { 4578.02, 4515.24, 0.174988 }, 137.793 }, + { "Land_SurvivalRadio_F", { 4586.07, 4521.12, 0.941803 }, 269.968 }, + { "Fridge_01_closed_F", { 4576.98, 4516.48, 0.175064 }, 238.777 }, + // Boat Vendor + { "Land_WorkStand_F", { 13678.8, 4032.35, -0.00124931 }, 359.908 }, + { "Land_WheelCart_F", { 13671.7, 4037.31, 0.00549078 }, 0.0201131 }, + { "Land_TentDome_F", { 13661.6, 4027.37, -0.014101 }, 359.452 }, + { "Land_Pier_Box_F", { 13696.5, 4033.33, 0.599987 }, 0 }, + { "Land_Campfire_F", { 13681.2, 4035.13, 0.00247145 }, 0.1179 }, + { "Land_Wreck_Traw_F", { 13710.9, 3862.6, 0.242525 }, 0.611813 }, + { "Land_WavePowerPlant_F", { 13878.7, 3932.25, 9.53635 }, 345.483 }, + // Stary Sobor Military + { "Land_HBarrierBig_F", { 6296.66, 7795.88, -0.00692749 }, 219.542 }, + { "Land_HBarrier_5_F", { 6290.16, 7793.43, 0.0203857 }, 218.553 }, + { "Land_HBarrier_5_F", { 6297.02, 7790.79, 0.110291 }, 130.462 }, + { "Land_HBarrier_5_F", { 6285.72, 7796.98, 0.0177002 }, 219.491 }, + { "Land_PaperBox_closed_F", { 6292.73, 7799.57, -0.00213623 }, 221.545 }, + { "Land_WaterTank_F", { 6299.27, 7797.89, 0.00109863 }, 219.43 }, + { "Land_HBarrierBig_F", { 6272.08, 7813.91, 0.00427246 }, 193.847 }, + { "Land_HBarrierBig_F", { 6297.31, 7802.14, -0.00527954 }, 307.543 }, + { "Land_HBarrierBig_F", { 6276.2, 7808.03, 0.000549316 }, 83.8871 }, + { "Land_HBarrierBig_F", { 6280.2, 7801.39, -0.00228882 }, 37.4585 }, + { "Land_HBarrier_5_F", { 6288.43, 7824.38, 0.00488281 }, 217.5 }, + { "Land_HBarrier_5_F", { 6293.44, 7822.44, -0.00402832 }, 175.45 }, + { "Land_PortableLight_double_F", { 6278.42, 7808.37, 0 }, 261.498 }, + { "Land_Pallets_stack_F", { 6291.09, 7800.92, 0.000518799 }, 203.664 }, + { "Land_HBarrierBig_F", { 6293.92, 7846.05, -0.000823975 }, 37.5492 }, + { "Land_HBarrier_5_F", { 6288.87, 7844.77, 0.0146179 }, 125.61 }, + { "Land_HBarrier_5_F", { 6287.4, 7836.51, 0.00183105 }, 36.5104 }, + { "Land_HBarrier_5_F", { 6285.68, 7840.26, 0.00210571 }, 125.565 }, + { "Land_PortableLight_double_F", { 6288.7, 7841.98, 0 }, 125.471 }, + { "Land_Cargo_Patrol_V1_F", { 6291.25, 7840.74, 0 }, 125.498 }, + { "Land_BagBunker_Large_F", { 6284.77, 7830.87, 0.000396729 }, 125.544 }, + { "Land_Cargo_Patrol_V1_F", { 6315.33, 7798.51, 0 }, 306.498 }, + { "Land_HBarrierBig_F", { 6304.61, 7794.26, -0.00469971 }, 164.31 }, + { "Land_HBarrierBig_F", { 6312.32, 7793.03, -0.00683594 }, 219.624 }, + { "Land_HBarrier_5_F", { 6317.45, 7794.16, 0.0157166 }, 307.501 }, + { "Land_HBarrier_5_F", { 6320.83, 7798.61, 0.0254822 }, 307.457 }, + { "Land_PortableLight_double_F", { 6317.92, 7796.97, 0 }, 307.493 }, + { "Land_PortableLight_double_F", { 6309.06, 7797.2, 0 }, 188.5 }, + { "Land_ToiletBox_F", { 6314.53, 7793.88, 0.000274658 }, 132.45 }, + { "Land_BagBunker_Large_F", { 6326.43, 7813.56, -0.000640869 }, 307.499 }, + { "Land_HBarrier_5_F", { 6319.26, 7802.51, -0.00213623 }, 219.502 }, + { "Land_HBarrier_5_F", { 6318.51, 7814.62, -0.00192261 }, 219.497 }, + { "Land_HBarrier_5_F", { 6329.87, 7820.18, 0.0175171 }, 299.066 }, + { "Land_HBarrier_5_F", { 6301.78, 7807.92, -0.00479126 }, 307.524 }, + { "Land_HBarrier_5_F", { 6313.51, 7816.39, -0.000457764 }, 171.499 }, + { "Land_TentA_F", { 6325.46, 7824.22, 9.15527e-005 }, 94.5132 }, + { "Land_TentA_F", { 6323.97, 7829.37, 0.00863647 }, 82.3408 }, + { "Land_Campfire_F", { 6317.24, 7829.11, -0.0592346 }, 26.001 }, + { "Land_WoodPile_F", { 6312.93, 7826.2, 0.00164795 }, 1.00009 }, + { "Land_WaterBarrel_F", { 6304.27, 7808.83, -3.05176e-005 }, 136.44 }, + { "Land_Sack_F", { 6326, 7822.95, 0.010437 }, 353.513 }, + { "Land_Basket_F", { 6325.17, 7822.36, 9.15527e-005 }, 137.301 }, + { "Land_MetalBarrel_F", { 6305.22, 7808.31, 0 }, 244.342 }, + { "Land_BarrelTrash_grey_F", { 6305.45, 7807.6, 0.000549316 }, 313.436 }, + { "Land_BarrelEmpty_grey_F", { 6304.88, 7807.12, 0 }, 307.487 }, + { "Land_WoodenLog_F", { 6317.17, 7827.17, 0.000335693 }, 77.1906 }, + { "Land_Axe_F", { 6313.81, 7826.37, -0.00338745 }, 248.999 }, + { "Land_CanisterFuel_F", { 6313.75, 7825.28, 6.10352e-005 }, 34.3382 }, + { "Land_Canteen_F", { 6323.97, 7823.34, 9.15527e-005 }, 347.753 }, + { "Land_TinContainer_F", { 6317.53, 7827.55, 0.00189209 }, 235.145 }, + { "Land_Camping_Light_F", { 6317.18, 7827.1, 0.481659 }, 78.9907 }, + { "Land_HBarrierBig_F", { 6325.11, 7838.57, 0.00241089 }, 219.523 }, + { "Land_HBarrierBig_F", { 6301.64, 7845.13, -0.00299072 }, 342.464 }, + { "Land_HBarrierBig_F", { 6309.64, 7843.89, -0.00140381 }, 37.508 }, + { "Land_HBarrierBig_F", { 6317.6, 7841.65, 0.00088501 }, 187.754 }, + { "Land_HBarrierBig_F", { 6309.25, 7837.67, 0.0010376 }, 125.494 }, + { "Land_HBarrierBig_F", { 6328.96, 7831.3, 0.000183105 }, 265.544 }, + { "Land_HBarrier_5_F", { 6305.08, 7831.75, 0.013855 }, 306.499 }, + { "Land_TentA_F", { 6323.29, 7833.88, -3.05176e-005 }, 56.9963 }, + { "Land_ToiletBox_F", { 6306.66, 7840.59, 0.000305176 }, 37.4933 }, + { "Land_Pallets_F", { 6305.09, 7836.28, 0.00402832 }, 301.498 }, + { "Land_WoodenBox_F", { 6315.52, 7830.8, 0.000152588 }, 135.939 }, + { "Land_HBarrierBig_F", { 6355.05, 7758.61, 0.01651 }, 180.899 }, + { "Land_HBarrier_3_F", { 6341.05, 7763.39, -0.024231 }, 230.09 }, + { "Land_PaperBox_closed_F", { 6355.89, 7769.34, 0.000213623 }, 300.988 }, + { "Land_HBarrierBig_F", { 6356.52, 7790.86, -0.0449524 }, 90.0002 }, + { "Land_HBarrierBig_F", { 6334.66, 7777.03, 0.000701904 }, 260.011 }, + { "Land_HBarrierBig_F", { 6356.92, 7782.55, -0.0672607 }, 89.0069 }, + { "Land_HBarrier_5_F", { 6358.21, 7796.04, -0.00231934 }, 178 }, + { "Land_HBarrier_5_F", { 6359.02, 7777.34, -0.0152588 }, 177.997 }, + { "Land_HBarrier_3_F", { 6345.2, 7793.81, 0.00137329 }, 299 }, + { "Land_HBarrier_3_F", { 6349.54, 7771.55, -0.00192261 }, 230.001 }, + { "Land_HBarrier_3_F", { 6332.6, 7798.95, 0.00323486 }, 299 }, + { "Land_PaperBox_closed_F", { 6357.05, 7771.16, 0 }, 270 }, + { "Land_Pallets_stack_F", { 6348.26, 7791.23, 3.05176e-005 }, 225.003 }, + { "Land_Pallets_stack_F", { 6348.28, 7788.84, 0.00216675 }, 263.003 }, + { "Land_HBarrierBig_F", { 6350.34, 7814.14, -0.000396729 }, 134.998 }, + { "Land_Razorwire_F", { 6352.86, 7822.44, 0.000793457 }, 196.803 }, + { "Land_HBarrier_5_F", { 6330.96, 7824.57, -0.0115967 }, 68.0471 }, + { "Land_HBarrierBig_F", { 6375.54, 7759.76, 0.0117493 }, 178.122 }, + { "Land_HBarrier_3_F", { 6386.83, 7765.76, 0.0414429 }, 128.913 }, + { "Land_Cargo_Tower_V1_F", { 6364.71, 7786.91, 0.00137329 }, 269 }, + { "Land_HBarrierBig_F", { 6371.91, 7791.33, -0.0449524 }, 90 }, + { "Land_HBarrierBig_F", { 6372.13, 7782.9, -0.0224304 }, 90.0001 }, + { "Land_HBarrier_5_F", { 6370.43, 7777.76, -0.0215149 }, 177.996 }, + { "Land_HBarrier_5_F", { 6369.94, 7796.64, -0.00372314 }, 179 }, + { "Land_HBarrier_3_F", { 6380.18, 7795.26, 0.00366211 }, 244.001 }, + { "Land_HBarrier_3_F", { 6378.41, 7772.92, -0.0100403 }, 129 }, + { "Land_ToiletBox_F", { 6360.83, 7789.36, -3.05176e-005 }, 269.005 }, + { "Land_WaterTank_F", { 6375.86, 7785.65, 0.00012207 }, 0.000633659 }, + { "Land_WaterTank_F", { 6375.74, 7788.49, 0.000183105 }, 0.000302211 }, + { "Land_PortableLight_double_F", { 6360.99, 7782.88, 8.57773 }, 88.0059 }, + { "Land_PortableLight_double_F", { 6363.69, 7791.14, 4.66943 }, 272 }, + { "Land_HBarrierBig_F", { 6375.25, 7815.47, 0.00146484 }, 226.006 }, + { "Land_Razorwire_F", { 6361.44, 7821.18, -0.0170898 }, 353.994 }, + { "Land_HBarrier_3_F", { 6363.49, 7807.3, 0.00195313 }, 357.999 }, + { "Land_HBarrierBig_F", { 6390.12, 7781.39, -0.000366211 }, 275 }, + { "Land_HBarrier_3_F", { 6391.39, 7801.7, 0.00195313 }, 244 }, + // NW Airfield + { "Land_Airport_Tower_F", { 4327.37, 10905.9, 0 }, 61.1295 }, + { "Land_Offices_01_V1_F", { 4573.46, 9819.88, 0 }, 244.926 }, + { "Land_i_Barracks_V2_F", { 4598.97, 9720.41, 0 }, 100.719 }, + // Wind Farm + {"Land_wpp_Turbine_V2_F", { 5449.11, 13270.3, -0.00350952 }, 0 }, + {"Land_wpp_Turbine_V2_F", { 5477.64, 13280.7, 3.05176e-005 }, 0 }, + {"Land_spp_Transformer_F", { 5478.29, 13300.4, 0 }, 0}, + {"Land_dp_transformer_F", { 5482.13, 13300.9, -3.05176e-005 }, 0 }, + {"Land_wpp_Turbine_V2_F", { 5503.9, 13291.3, 0.0585327 }, 0 }, + // Old Hero small military post. + { "Land_HBarrier_5_F", { 12899.8, 12748.4, 0.02034 }, 354.796 }, + { "Land_HBarrier_5_F", { 12894.1, 12748, 0.013916 }, 354.737 }, + { "Land_Cargo_Patrol_V2_F", { 12897.5, 12750.2, 0 }, 85.8348 }, + { "Land_HBarrier_5_F", { 12898.8, 12763.6, 0.00309753 }, 354.799 }, + { "Land_HBarrier_5_F", { 12891.9, 12751.4, 0.132568 }, 85.9089 }, + { "Land_HBarrier_5_F", { 12893.1, 12763.1, 0.0252838 }, 354.791 }, + { "Land_Garbage_square5_F", { 12898.5, 12754.1, 0.403336 }, 356.786 }, + { "Land_HBarrier_3_F", { 12894.2, 12753.5, -0.00849915 }, 176.727 }, + { "Land_Sign_WarningMilitaryArea_F", { 12878.3, 12753.7, 0 }, 86.9098 }, + { "Land_Cargo_HQ_V2_F", { 12921.2, 12747.4, 1.52588e-005 }, 354.835 }, + { "Land_HBarrier_5_F", { 12906.8, 12739.5, 0.185944 }, 32.8205 }, + { "Land_HBarrier_5_F", { 12928.2, 12739.4, -0.0260773 }, 353.715 }, + { "Land_HBarrier_5_F", { 12922.9, 12739.1, -0.00527954 }, 353.753 }, + { "Land_HBarrier_5_F", { 12917.2, 12738.6, -0.00486755 }, 353.757 }, + { "Land_HBarrier_5_F", { 12912.2, 12738.2, -0.0137329 }, 353.744 }, + { "Land_HBarrier_5_F", { 12901.8, 12744.8, 0.200394 }, 86.3687 }, + { "Land_Garbage_square5_F", { 12909.3, 12746, 1.08038 }, 303.574 }, + { "Land_HBarrier_3_F", { 12903.3, 12741.9, -0.0743713 }, 214.774 }, + { "Land_Cargo_Patrol_V2_F", { 12924.7, 12773.8, 0 }, 210.835 }, + { "Land_ScrapHeap_2_F", { 12915.2, 12759.6, 0.0301971 }, 169.814 }, + { "Land_Loudspeakers_F", { 12915.6, 12750.6, 0 }, 356.835 }, + { "Land_ScrapHeap_1_F", { 12921.4, 12760.3, 0.0139313 }, 349.801 }, + { "Land_HBarrier_5_F", { 12921.6, 12756, -0.0275116 }, 353.819 }, + { "Land_HBarrier_5_F", { 12929.5, 12770.1, 0.118179 }, 84.8375 }, + { "Land_HBarrier_5_F", { 12929.9, 12764.5, 0.142838 }, 84.8577 }, + { "Land_HBarrier_5_F", { 12918.7, 12776.7, -0.0367279 }, 353.82 }, + { "Land_HBarrier_5_F", { 12913.2, 12776.2, -0.0335236 }, 353.831 }, + { "Land_HBarrier_5_F", { 12919.8, 12776.8, -0.0367126 }, 353.82 }, + { "Land_HBarrier_5_F", { 12916, 12755.5, -0.0212097 }, 353.818 }, + { "Land_HBarrier_5_F", { 12927.1, 12773.9, 0.00674438 }, 30.819 }, + { "Land_HBarrier_5_F", { 12927.1, 12756.5, -0.0491486 }, 353.797 }, + { "Land_HBarrier_5_F", { 12900.6, 12767.1, 0.0879211 }, 86.4439 }, + { "Land_HBarrier_5_F", { 12903.9, 12773.6, -0.0444031 }, 307.87 }, + { "Land_HBarrier_5_F", { 12901.7, 12752, 0.132278 }, 86.4207 }, + { "Land_HBarrier_5_F", { 12907.7, 12775.7, -0.0238953 }, 353.847 }, + { "Land_HBarrier_5_F", { 12905.2, 12754.4, 0.00515747 }, 354.814 }, + { "Land_GarbageBags_F", { 12904.7, 12751, -0.0263214 }, 26.6415 }, + { "Land_Garbage_square5_F", { 12917.5, 12761.8, 0.00386047 }, 19.7988 }, + { "Land_HBarrier_3_F", { 12901.2, 12770.2, 0.0333557 }, 130.704 }, + { "Land_HBarrier_3_F", { 12923.5, 12776.2, -0.00253296 }, 212.829 }, + { "Land_JunkPile_F", { 12907.2, 12769.1, 0.00367737 }, 354.816 }, + { "Land_Pallets_stack_F", { 12909, 12767.7, 0.000915527 }, 128.791 }, + { "Land_CratesShabby_F", { 12910.4, 12768, 0.0017395 }, 245.684 }, + { "Land_GarbageBarrel_01_F", { 12914.8, 12763.5, -0.00370789 }, 182.87 }, + { "Land_HBarrier_5_F", { 12931.5, 12742.2, -0.338425 }, 264.829 }, + { "Land_HBarrier_5_F", { 12931.2, 12747.7, -0.208801 }, 264.774 }, + { "Land_HBarrier_5_F", { 12930.4, 12758.9, 0.141861 }, 84.8576 }, + { "Land_HBarrier_5_F", { 12930.8, 12753.3, -0.150925 }, 264.812 } + }; + staticNpcPos[] = { + // South West + { "C_man_hunter_1_F", { 4585.05, 4516.51, 0.201431 }, 273.197 }, + // South East + { "C_man_hunter_1_F", { 12075.5, 5109.38, 0.00123596 }, 313.34}, + // North East + { "C_man_hunter_1_F", { 10686.8,9437.87,0.00151825 }, 231.976}, + //Boat Trader + { "C_man_hunter_1_F", { 13694, 4033.22, 0.0021317 }, 93.5839 } + }; +}; diff --git a/Sources/epoch_server_settings/configs/maps/esseker.h b/Sources/epoch_server_settings/configs/maps/esseker.h index 2a0fd8e2..b094763c 100644 --- a/Sources/epoch_server_settings/configs/maps/esseker.h +++ b/Sources/epoch_server_settings/configs/maps/esseker.h @@ -30,9 +30,7 @@ class Esseker : Default {"ViewPoint",1} }; traderBlds[] = { "Land_i_House_Big_02_V3_dam_F", "Land_A_GeneralStore_01", "Land_A_GeneralStore_01a", "Land_sara_domek_zluty", "Land_Tovarna2", "Land_Shed_Ind02", "Land_i_House_Big_01_V3_dam_F", "Land_HouseV2_02_Interier", "Land_i_House_Small_01_V3_dam_F", "Land_HouseV_1I4", "Land_dum_rasovna", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_u_House_Small_02_V1_F", "Land_i_Stone_HouseSmall_V1_F", "Land_i_Stone_Shed_V1_F"}; - - containerPos[] = {}; - + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/stratis.h b/Sources/epoch_server_settings/configs/maps/stratis.h index 5ca2c046..03eab01b 100644 --- a/Sources/epoch_server_settings/configs/maps/stratis.h +++ b/Sources/epoch_server_settings/configs/maps/stratis.h @@ -166,20 +166,6 @@ class Stratis : Default {"ViewPoint",1} }; traderBlds[] = { "Land_Kiosk_blueking_F", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_i_Garage_V1_F", "Land_i_Shed_Ind_F", "Land_i_Shop_01_V1_F" }; - containerPos[] = { - { 2583.59, 6024.51, 0 }, - { 3830.73, 7823.08, 0 }, - { 5153.42, 7048.41, 0 }, - { 6871.89, 5628.74, 0 }, - { 4429.52, 2354.84, 0 }, - { 2907.18, 543.774, 0 }, - { 2213.17, 1095.78, 0 }, - { 1663.35, 2728.73, 0 }, - { 1661.67, 2861.41, 0 }, - { 1646.04, 2882.86, 0 }, - { 1748.63, 3488.93, 0 }, - { 1461.86, 4783.48, 0 } - }; telePos[] = { // N [-0.286865,8.17383,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/takistan.h b/Sources/epoch_server_settings/configs/maps/takistan.h index e4cf8e2b..804215ee 100644 --- a/Sources/epoch_server_settings/configs/maps/takistan.h +++ b/Sources/epoch_server_settings/configs/maps/takistan.h @@ -30,9 +30,7 @@ class Takistan : Default {"ViewPoint",1} }; traderBlds[] = { "Land_Kiosk_blueking_F", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_i_Garage_V1_F", "Land_i_Shed_Ind_F", "Land_i_Shop_01_V1_F" }; - - containerPos[] = {}; - + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/tanoa.h b/Sources/epoch_server_settings/configs/maps/tanoa.h index 61f4eda7..cbe0ef8f 100644 --- a/Sources/epoch_server_settings/configs/maps/tanoa.h +++ b/Sources/epoch_server_settings/configs/maps/tanoa.h @@ -190,24 +190,7 @@ class Tanoa : Default {"B_T_VTOL_01_infantry_F",1}, {"B_T_VTOL_01_vehicle_F",1} }; - traderBlds[] = { "Land_Kiosk_blueking_F", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_i_Garage_V1_F", "Land_i_Shed_Ind_F", "Land_i_Shop_01_V1_F" }; - - // shipwrecks - containerPos[] = { - {5417.12,7233.08,0}, - {10745.6,5659.3,0}, - {4550.64,7004.8,0}, - {4529.56,7067.6,0}, - {12755.3,5956.91,0}, - {12752.4,5924.02,0}, - {4082.7,9994.33,0}, - {4843.83,12908.4,0}, - {3425.5,4455.52,0}, - {8851.5,14416.5,0}, - {10472.7,14135.5,0}, - {10538.3,14127.5,0} - }; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] diff --git a/Sources/epoch_server_settings/configs/maps/vr.h b/Sources/epoch_server_settings/configs/maps/vr.h index 8489b484..6b9f53dd 100644 --- a/Sources/epoch_server_settings/configs/maps/vr.h +++ b/Sources/epoch_server_settings/configs/maps/vr.h @@ -16,16 +16,12 @@ class VR : Default { worldSize = 10000; plantLimit = 0; - vehicleSpawnTypes[] = { - {"FlatAreaCity",1}, - {"FlatAreaCitySmall",1}, - {"NameCity",2}, - {"NameVillage",1}, - {"NameCityCapital",4}, - {"Airport",5} - }; + vehicleSpawnTypes[] = {}; + radioactiveLocations[] = {}; + radioactiveLocationsCount = 0; + allowedVehiclesList[] = {}; traderBlds[] = { "Land_Kiosk_blueking_F", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_i_Garage_V1_F", "Land_i_Shed_Ind_F", "Land_i_Shop_01_V1_F" }; - containerPos[] = {}; + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] @@ -34,6 +30,9 @@ class VR : Default // W [-14.4316,0.112793,-10.3098] { "Transport_C_EPOCH", { -0.286865, 8.17383, -10.3098 }, "", { 4089.82, 4597.71, 0.00143433 } } }; + lightPos[] = {}; + debugBoxClass = ""; + cloneClasses[] = {}; propsPos[] = {}; staticNpcPos[] = {}; }; diff --git a/Sources/epoch_server_settings/configs/maps/zargabad.h b/Sources/epoch_server_settings/configs/maps/zargabad.h index e0552d0e..a6ee1916 100644 --- a/Sources/epoch_server_settings/configs/maps/zargabad.h +++ b/Sources/epoch_server_settings/configs/maps/zargabad.h @@ -30,9 +30,7 @@ class Zargabad : Default {"ViewPoint",1} }; traderBlds[] = { "Land_Kiosk_blueking_F", "Land_FuelStation_Build_F", "Land_CarService_F", "Land_i_Garage_V1_F", "Land_i_Shed_Ind_F", "Land_i_Shop_01_V1_F" }; - - containerPos[] = {}; - + shipwreckLootEnabled = 0; telePos[] = { // N [-0.286865,8.17383,-10.3098] // S [-0.415527,-7.05298,-10.3098] @@ -43,7 +41,7 @@ class Zargabad : Default //{ "Transport_E_EPOCH", { 13.5127,0.410156,-10.3098 }, "", "east" }, { "Transport_C_EPOCH", { -0.415527,-7.05298,-10.3098 }, "", "south" } }; - + propsPos[] = { }; diff --git a/Sources/epoch_server_settings/configs/security/security_checks.h b/Sources/epoch_server_settings/configs/security/security_checks.h index b8a07b86..80f41604 100644 --- a/Sources/epoch_server_settings/configs/security/security_checks.h +++ b/Sources/epoch_server_settings/configs/security/security_checks.h @@ -16,14 +16,21 @@ class CfgSecConf { debug = "false"; + class vehicles { + safeVehicles[] = {"I_UAV_01_F","B_Heli_Transport_01_F","Steerable_Parachute_F","NonSteerable_Parachute_F","Land_Camping_Light_F","container_epoch"}; + }; + class remoteExecClient{ - functions[] = {"bankBalance", "resetGroup", "groupUpdate", "groupUidUpdate", "healPlayer","tradeComplete"}; + functions[] = {"bankBalance", "resetGroup", "groupUpdate", "groupUidUpdate", "healPlayer","tradeComplete","resetTempGroup","tempGroupUpdate","tempGroupUidUpdate"}; // code bankBalance = "EPOCH_bankBalance = _this;"; resetGroup = "Epoch_my_Group = []; Epoch_my_GroupUID = '';"; groupUpdate = "Epoch_my_Group = _this; call EPOCH_Group_update;"; groupUidUpdate = "Epoch_my_GroupUID = _this;"; - healPlayer = "{missionNamespace setVariable[format['EPOCH_player%1', _x], EPOCH_defaultVars select(EPOCH_customVars find _x)]} forEach['Temp','Hunger','Thirst','Toxicity','Stamina','HitPoints','BloodP','Alcohol','Radiation'];"; + resetTempGroup = "Epoch_my_tempGroup = []; Epoch_my_tempGroupUID = '';"; + tempGroupUpdate = "Epoch_my_tempGroup = _this; call EPOCH_tempGroup_update;"; + tempGroupUidUpdate = "Epoch_my_tempGroupUID = _this;"; + healPlayer = "{missionNamespace setVariable[format['EPOCH_player%1', _x], EPOCH_defaultVars select(EPOCH_customVars find _x)]} forEach['Temp','Hunger','Thirst','Toxicity','Stamina','BloodP','Alcohol','Radiation'];"; tradeComplete = "EPOCH_TRADE_COMPLETE = _this;"; }; @@ -80,7 +87,7 @@ class CfgSecConf class whitelist { #include "data\custom_vars.h" // whitelisted variables }; - badVars[] = {"ESP_map","ESP_mainMap","ESP_adminMap","AntiAntiAntiAntiHax","fnc_usec_damageHandler","fnc_usec_unconscious","VAGINA_secret","yolo","VERSION","life_fnc_handleDamage","EPOCH_spawnVehicle_PVS","CLASS911_Menu","nuke_vars","JJMMEE_INIT_MENU","PLAYERON","PLAYERNEXT2","ALTISLIFEON","LY_Menu","PLAY","LY_SwaggerLikeUs","BIS_fnc_dbg_reminder_value","BIS_fnc_dbg_reminder"}; + badVars[] = {"EPOCH_GMODE","ESP_map","ESP_mainMap","ESP_adminMap","AntiAntiAntiAntiHax","fnc_usec_damageHandler","fnc_usec_unconscious","VAGINA_secret","yolo","VERSION","life_fnc_handleDamage","EPOCH_spawnVehicle_PVS","CLASS911_Menu","nuke_vars","JJMMEE_INIT_MENU","PLAYERON","PLAYERNEXT2","ALTISLIFEON","LY_Menu","PLAY","LY_SwaggerLikeUs","BIS_fnc_dbg_reminder_value","BIS_fnc_dbg_reminder"}; nilVars[] = {"EPOCH_antiWallCount","EPOCH_playerEnergy","EPOCH_playerHunger","EPOCH_playerStamina","EPOCH_playerCrypto","EPOCH_target","EPOCH_ESP_TARGETS","EPOCH_ESPMAP_TARGETS","EPOCH_taxRate","EPOCH_ESP_VEHICLEPLAYER","EPOCH_ESP_PLAYER","EPOCH_ESP_VEHICLES"}; }; diff --git a/Sources/epoch_server_settings/treeView.txt b/Sources/epoch_server_settings/treeView.txt index f08d042c..d4663fc3 100644 Binary files a/Sources/epoch_server_settings/treeView.txt and b/Sources/epoch_server_settings/treeView.txt differ diff --git a/Sources/epoch_server_vip_event/EpochEvents/event1.sqf b/Sources/epoch_server_vip_event/EpochEvents/event1.sqf new file mode 100644 index 00000000..682d2107 --- /dev/null +++ b/Sources/epoch_server_vip_event/EpochEvents/event1.sqf @@ -0,0 +1,42 @@ +/* + Author/s: + Aaron Clark - EpochMod.com + + Description: + VIP Event - Reveals the map location of a random player that possesses a specific item every x minutes. + + Improvements and or bugfixes and other contributions are welcome via the github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_vip_event/EpochEvents/event1.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_marker","_name","_owner","_player","_players","_position"]; +//[[[end]]] +params [["_item","ItemBriefcaseGold100oz"]]; +// marker name +_marker = "VIPMarker1"; +// remove any previous markers +if (_marker in allMapMarkers) then { + deleteMarker _marker; +}; +// get all alive players with the VIP item. +_players = allPlayers select {(alive _x && (_item in magazines _x))}; +// continue if players found +if !(_players isEqualTo []) then { + // select random player + _player = selectRandom _players; + _position = getpos _player; + _owner = owner _player; + _name = name _player; + // make marker + _marker = createMarker[_marker, _position]; + _marker setMarkerShape "ICON"; + _marker setMarkerType "hd_objective"; + _marker setMarkerColor "ColorRed"; + _marker setMarkerText "VIP"; + // tell player about VIP status + ["You are the VIP!", 5] remoteExec ['Epoch_message',_player]; + // broadcast to everyone else + [format["%1 is the VIP!",_name], 5] remoteExec ['Epoch_message',[-2,-_owner]]; + // debug + diag_log format["Epoch: VIP Marker triggered on %1", _player]; +}; diff --git a/Sources/epoch_server_vip_event/build.hpp b/Sources/epoch_server_vip_event/build.hpp new file mode 100644 index 00000000..ebdd6286 --- /dev/null +++ b/Sources/epoch_server_vip_event/build.hpp @@ -0,0 +1 @@ +build=826; diff --git a/Sources/epoch_server_vip_event/config.cpp b/Sources/epoch_server_vip_event/config.cpp new file mode 100644 index 00000000..d694edce --- /dev/null +++ b/Sources/epoch_server_vip_event/config.cpp @@ -0,0 +1,38 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Epoch Server Event (DynamicDebris) + + 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_vip_event/config.cpp +*/ + +#define _ARMA_ + +class CfgPatches { + class A3_server_vip_event { + requiredVersion = 0.1; + requiredAddons[] = {"A3_server_events"}; + #include "build.hpp" + }; +}; + +// import settings +class CfgEpochServerEvents +{ + class VIP { + delay = 900; // delay in seconds between executions , + script = "\epoch_server_vip_event\EpochEvents\event1.sqf"; // script: name or full path if usePrefix is set to 0. + runOnStart = 0; // runOnStart: 0 normal delay, 1 = run script at startup. + usePrefix = 0; // usePrefix: 0 = use full file path, 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). + runNumTimes = -1; // runNumTimes: 0 = disabled, 1+ = number of times to execute before removing event, -1 = no limit. + input[] = {"ItemBriefcaseGold100oz"}; // array input to execVM at time of run and accessed with _this inside of script. + disallowedWorlds[] = {"VR"}; + }; +}; diff --git a/Sources/epoch_server_vip_event/license.txt b/Sources/epoch_server_vip_event/license.txt new file mode 100644 index 00000000..35440e4b --- /dev/null +++ b/Sources/epoch_server_vip_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_vip_event/treeView.txt b/Sources/epoch_server_vip_event/treeView.txt new file mode 100644 index 00000000..771da4f2 Binary files /dev/null and b/Sources/epoch_server_vip_event/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Altis/mission.sqm b/Sources/mpmissions/epoch.Altis/mission.sqm index 7fddf8ca..a9a1ad9a 100644 --- a/Sources/mpmissions/epoch.Altis/mission.sqm +++ b/Sources/mpmissions/epoch.Altis/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "a3_map_altis" + "a3_map_altis", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6076,35 +6077,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={23598.076,3.1900001,17997.086}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.Altis/treeView.txt b/Sources/mpmissions/epoch.Altis/treeView.txt index b14aebcc..5801c4ef 100644 Binary files a/Sources/mpmissions/epoch.Altis/treeView.txt and b/Sources/mpmissions/epoch.Altis/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Australia/mission.sqm b/Sources/mpmissions/epoch.Australia/mission.sqm index 8f5b63ce..ab6c12b2 100644 --- a/Sources/mpmissions/epoch.Australia/mission.sqm +++ b/Sources/mpmissions/epoch.Australia/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "australia" + "australia", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6076,35 +6077,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={30400,0,6100}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.Australia/treeView.txt b/Sources/mpmissions/epoch.Australia/treeView.txt index e68453a3..cb9c9ad2 100644 Binary files a/Sources/mpmissions/epoch.Australia/treeView.txt and b/Sources/mpmissions/epoch.Australia/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Bootcamp_ACR/mission.sqm b/Sources/mpmissions/epoch.Bootcamp_ACR/mission.sqm index 10b69553..ef608e78 100644 --- a/Sources/mpmissions/epoch.Bootcamp_ACR/mission.sqm +++ b/Sources/mpmissions/epoch.Bootcamp_ACR/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_bootcamp_acr_config" + "cup_bootcamp_acr_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6084,35 +6085,5 @@ class Mission }; id=402; }; - class Item204 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={30.454964,0,24.159744}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=405; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=404; - }; }; }; diff --git a/Sources/mpmissions/epoch.Bootcamp_ACR/treeView.txt b/Sources/mpmissions/epoch.Bootcamp_ACR/treeView.txt index e96f0ceb..f1f086ae 100644 Binary files a/Sources/mpmissions/epoch.Bootcamp_ACR/treeView.txt and b/Sources/mpmissions/epoch.Bootcamp_ACR/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Bornholm/mission.sqm b/Sources/mpmissions/epoch.Bornholm/mission.sqm index 41c1fc33..b4b38241 100644 --- a/Sources/mpmissions/epoch.Bornholm/mission.sqm +++ b/Sources/mpmissions/epoch.Bornholm/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "bornholm" + "bornholm", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -61,9 +62,9 @@ class Mission id=0; }; class Item1 - { + { dataType="Marker"; - position[]={13812.688,0,6877.9214}; + position[]={2404,0,16540}; name="respawn_east"; type="Empty"; id=1; @@ -71,7 +72,7 @@ class Mission class Item2 { dataType="Marker"; - position[]={13812.688,0,6877.9214}; + position[]={2404,0,16540}; name="respawn_west"; type="Empty"; id=2; @@ -6076,35 +6077,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={13812.688,0,6877.9214}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.Bornholm/treeView.txt b/Sources/mpmissions/epoch.Bornholm/treeView.txt index 7f590b73..d189b62e 100644 Binary files a/Sources/mpmissions/epoch.Bornholm/treeView.txt and b/Sources/mpmissions/epoch.Bornholm/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Chernarus/mission.sqm b/Sources/mpmissions/epoch.Chernarus/mission.sqm index 92c4507d..dcd4c6be 100644 --- a/Sources/mpmissions/epoch.Chernarus/mission.sqm +++ b/Sources/mpmissions/epoch.Chernarus/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_chernarus_config" + "cup_chernarus_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6077,35 +6078,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={1024.8502,0,2023.5204}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.Chernarus/treeView.txt b/Sources/mpmissions/epoch.Chernarus/treeView.txt index 78bbc630..8779d842 100644 Binary files a/Sources/mpmissions/epoch.Chernarus/treeView.txt and b/Sources/mpmissions/epoch.Chernarus/treeView.txt differ diff --git a/Sources/mpmissions/epoch.ChernarusRedux/mission.sqm b/Sources/mpmissions/epoch.ChernarusRedux/mission.sqm new file mode 100644 index 00000000..a33afb70 --- /dev/null +++ b/Sources/mpmissions/epoch.ChernarusRedux/mission.sqm @@ -0,0 +1,6082 @@ +version=51; +class EditorData +{ + moveGridStep=1; + angleGridStep=0.2617994; + scaleGridStep=1; + autoGroupingDist=10; + toggles=1; + class ItemIDProvider + { + nextID=2; + }; + class Camera + { + pos[]={7542.4932,93.791428,15492.986}; + dir[]={-0.8989169,-0.17364819,-0.40223712}; + up[]={-0.15850332,0.98480779,-0.070925266}; + aside[]={-0.40844229,0,0.91278416}; + }; +}; +binarizationWanted=0; +addons[]= +{ + "A3_epoch_config", + "chernarusredux", + "a3_characters_f" +}; +randomSeed=12032465; +class ScenarioData +{ + author="[VB]AWOL"; +}; +class Mission +{ + class Intel + { + briefingName="Epoch Mod"; + timeOfChanges=28800; + startWeather=0; + startWind=0; + startWaves=0; + forecastWeather=0; + forecastWind=0; + forecastWaves=0; + forecastLightnings=0; + year=2035; + month=6; + day=24; + hour=12; + minute=0; + startFogDecay=0; + forecastFogDecay=0; + }; + class Entities + { + items=203; + class Item0 + { + dataType="Marker"; + position[]={6968.658,0,8345.914}; + name="center"; + type="Empty"; + id=0; + }; + class Item1 + { + dataType="Marker"; + position[]={1024.82,0,2023.51}; + name="respawn_east"; + type="Empty"; + id=1; + }; + class Item2 + { + dataType="Marker"; + position[]={1024.8502,0,2023.5204}; + name="respawn_west"; + type="Empty"; + id=2; + }; + class Item3 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=4; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=3; + }; + class Item4 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=6; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=5; + }; + class Item5 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=8; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=7; + }; + class Item6 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=10; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=9; + }; + class Item7 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=12; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=11; + }; + class Item8 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=14; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=13; + }; + class Item9 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=16; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=15; + }; + class Item10 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=18; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=17; + }; + class Item11 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=20; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=19; + }; + class Item12 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=22; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=21; + }; + class Item13 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=24; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=23; + }; + class Item14 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=26; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=25; + }; + class Item15 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=28; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=27; + }; + class Item16 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=30; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=29; + }; + class Item17 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=32; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=31; + }; + class Item18 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=34; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=33; + }; + class Item19 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=36; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=35; + }; + class Item20 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=38; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=37; + }; + class Item21 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=40; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=39; + }; + class Item22 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=42; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=41; + }; + class Item23 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=44; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=43; + }; + class Item24 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=46; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=45; + }; + class Item25 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=48; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=47; + }; + class Item26 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=50; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=49; + }; + class Item27 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=52; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=51; + }; + class Item28 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=54; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=53; + }; + class Item29 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=56; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=55; + }; + class Item30 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=58; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=57; + }; + class Item31 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=60; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=59; + }; + class Item32 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=62; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=61; + }; + class Item33 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=64; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=63; + }; + class Item34 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=66; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=65; + }; + class Item35 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=68; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=67; + }; + class Item36 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=70; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=69; + }; + class Item37 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=72; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=71; + }; + class Item38 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=74; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=73; + }; + class Item39 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=76; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=75; + }; + class Item40 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=78; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=77; + }; + class Item41 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=80; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=79; + }; + class Item42 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=82; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=81; + }; + class Item43 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=84; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=83; + }; + class Item44 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=86; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=85; + }; + class Item45 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=88; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=87; + }; + class Item46 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=90; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=89; + }; + class Item47 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=92; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=91; + }; + class Item48 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=94; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=93; + }; + class Item49 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=96; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=95; + }; + class Item50 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=98; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=97; + }; + class Item51 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=100; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=99; + }; + class Item52 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=102; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=101; + }; + class Item53 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=104; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=103; + }; + class Item54 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=106; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=105; + }; + class Item55 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=108; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=107; + }; + class Item56 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=110; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=109; + }; + class Item57 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=112; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=111; + }; + class Item58 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=114; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=113; + }; + class Item59 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=116; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=115; + }; + class Item60 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=118; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=117; + }; + class Item61 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=120; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=119; + }; + class Item62 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=122; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=121; + }; + class Item63 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=124; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=123; + }; + class Item64 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=126; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=125; + }; + class Item65 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=128; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=127; + }; + class Item66 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=130; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=129; + }; + class Item67 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=132; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=131; + }; + class Item68 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=134; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=133; + }; + class Item69 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=136; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=135; + }; + class Item70 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=138; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=137; + }; + class Item71 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=140; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=139; + }; + class Item72 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=142; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=141; + }; + class Item73 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=144; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=143; + }; + class Item74 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=146; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=145; + }; + class Item75 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=148; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=147; + }; + class Item76 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=150; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=149; + }; + class Item77 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=152; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=151; + }; + class Item78 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=154; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=153; + }; + class Item79 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=156; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=155; + }; + class Item80 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=158; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=157; + }; + class Item81 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=160; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=159; + }; + class Item82 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=162; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=161; + }; + class Item83 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=164; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=163; + }; + class Item84 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=166; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=165; + }; + class Item85 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=168; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=167; + }; + class Item86 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=170; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=169; + }; + class Item87 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=172; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=171; + }; + class Item88 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=174; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=173; + }; + class Item89 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=176; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=175; + }; + class Item90 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=178; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=177; + }; + class Item91 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=180; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=179; + }; + class Item92 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=182; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=181; + }; + class Item93 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=184; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=183; + }; + class Item94 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=186; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=185; + }; + class Item95 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=188; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=187; + }; + class Item96 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=190; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=189; + }; + class Item97 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=192; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=191; + }; + class Item98 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=194; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=193; + }; + class Item99 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=196; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=195; + }; + class Item100 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=198; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=197; + }; + class Item101 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=200; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=199; + }; + class Item102 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=202; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=201; + }; + class Item103 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=204; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=203; + }; + class Item104 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=206; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=205; + }; + class Item105 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=208; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=207; + }; + class Item106 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=210; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=209; + }; + class Item107 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=212; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=211; + }; + class Item108 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=214; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=213; + }; + class Item109 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=216; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=215; + }; + class Item110 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=218; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=217; + }; + class Item111 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=220; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=219; + }; + class Item112 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=222; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=221; + }; + class Item113 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=224; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=223; + }; + class Item114 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=226; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=225; + }; + class Item115 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=228; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=227; + }; + class Item116 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=230; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=229; + }; + class Item117 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=232; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=231; + }; + class Item118 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=234; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=233; + }; + class Item119 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=236; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=235; + }; + class Item120 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=238; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=237; + }; + class Item121 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=240; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=239; + }; + class Item122 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=242; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=241; + }; + class Item123 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=244; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=243; + }; + class Item124 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=246; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=245; + }; + class Item125 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=248; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=247; + }; + class Item126 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=250; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=249; + }; + class Item127 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=252; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=251; + }; + class Item128 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=254; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=253; + }; + class Item129 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=256; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=255; + }; + class Item130 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=258; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=257; + }; + class Item131 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=260; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=259; + }; + class Item132 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=262; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=261; + }; + class Item133 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=264; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=263; + }; + class Item134 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=266; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=265; + }; + class Item135 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=268; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=267; + }; + class Item136 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=270; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=269; + }; + class Item137 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=272; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=271; + }; + class Item138 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=274; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=273; + }; + class Item139 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=276; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=275; + }; + class Item140 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=278; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=277; + }; + class Item141 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=280; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=279; + }; + class Item142 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=282; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=281; + }; + class Item143 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=284; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=283; + }; + class Item144 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=286; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=285; + }; + class Item145 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=288; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=287; + }; + class Item146 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=290; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=289; + }; + class Item147 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=292; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=291; + }; + class Item148 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=294; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=293; + }; + class Item149 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=296; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=295; + }; + class Item150 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=298; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=297; + }; + class Item151 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=300; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=299; + }; + class Item152 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=302; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=301; + }; + class Item153 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=304; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=303; + }; + class Item154 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=306; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=305; + }; + class Item155 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=308; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=307; + }; + class Item156 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=310; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=309; + }; + class Item157 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=312; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=311; + }; + class Item158 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=314; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=313; + }; + class Item159 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=316; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=315; + }; + class Item160 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=318; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=317; + }; + class Item161 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=320; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=319; + }; + class Item162 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=322; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=321; + }; + class Item163 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=324; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=323; + }; + class Item164 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=326; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=325; + }; + class Item165 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=328; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=327; + }; + class Item166 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=330; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=329; + }; + class Item167 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=332; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=331; + }; + class Item168 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=334; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=333; + }; + class Item169 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=336; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=335; + }; + class Item170 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=338; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=337; + }; + class Item171 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=340; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=339; + }; + class Item172 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=342; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=341; + }; + class Item173 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=344; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=343; + }; + class Item174 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=346; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=345; + }; + class Item175 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=348; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=347; + }; + class Item176 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=350; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=349; + }; + class Item177 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=352; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=351; + }; + class Item178 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=354; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=353; + }; + class Item179 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=356; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=355; + }; + class Item180 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=358; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=357; + }; + class Item181 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=360; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=359; + }; + class Item182 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=362; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=361; + }; + class Item183 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=364; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=363; + }; + class Item184 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=366; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=365; + }; + class Item185 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=368; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=367; + }; + class Item186 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=370; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=369; + }; + class Item187 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=372; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=371; + }; + class Item188 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=374; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=373; + }; + class Item189 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=376; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=375; + }; + class Item190 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=378; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=377; + }; + class Item191 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=380; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=379; + }; + class Item192 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=382; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=381; + }; + class Item193 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=384; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=383; + }; + class Item194 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=386; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=385; + }; + class Item195 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=388; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=387; + }; + class Item196 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=390; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=389; + }; + class Item197 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=392; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=391; + }; + class Item198 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=394; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=393; + }; + class Item199 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=396; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=395; + }; + class Item200 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=398; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=397; + }; + class Item201 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=400; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=399; + }; + class Item202 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={1024.8502,0,2023.5204}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=402; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=401; + }; + }; +}; diff --git a/Sources/mpmissions/epoch.ChernarusRedux/treeView.txt b/Sources/mpmissions/epoch.ChernarusRedux/treeView.txt new file mode 100644 index 00000000..8779d842 Binary files /dev/null and b/Sources/mpmissions/epoch.ChernarusRedux/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Chernarus_Summer/mission.sqm b/Sources/mpmissions/epoch.Chernarus_Summer/mission.sqm index 4ce49634..07ef80f6 100644 --- a/Sources/mpmissions/epoch.Chernarus_Summer/mission.sqm +++ b/Sources/mpmissions/epoch.Chernarus_Summer/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_chernarus_summer_config" + "cup_chernarus_summer_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6077,35 +6078,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={1024.8502,0,2023.5204}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.Chernarus_Summer/treeView.txt b/Sources/mpmissions/epoch.Chernarus_Summer/treeView.txt index 3303c0f7..0e34d454 100644 Binary files a/Sources/mpmissions/epoch.Chernarus_Summer/treeView.txt and b/Sources/mpmissions/epoch.Chernarus_Summer/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Desert_E/mission.sqm b/Sources/mpmissions/epoch.Desert_E/mission.sqm index 4a40269c..b6fd9da4 100644 --- a/Sources/mpmissions/epoch.Desert_E/mission.sqm +++ b/Sources/mpmissions/epoch.Desert_E/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_desert_e_config" + "cup_desert_e_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6085,35 +6086,5 @@ class Mission }; id=402; }; - class Item204 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={8.4882975,0,8.1249542}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=405; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=404; - }; }; }; diff --git a/Sources/mpmissions/epoch.Desert_E/treeView.txt b/Sources/mpmissions/epoch.Desert_E/treeView.txt index 1288a2b4..598d8bf9 100644 Binary files a/Sources/mpmissions/epoch.Desert_E/treeView.txt and b/Sources/mpmissions/epoch.Desert_E/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Esseker/mission.sqm b/Sources/mpmissions/epoch.Esseker/mission.sqm index 9cdccc08..62d0ed90 100644 --- a/Sources/mpmissions/epoch.Esseker/mission.sqm +++ b/Sources/mpmissions/epoch.Esseker/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "esseker" + "esseker", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6077,35 +6078,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={263.93359,0,1416.0308}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.Esseker/treeView.txt b/Sources/mpmissions/epoch.Esseker/treeView.txt index f1bfbcef..7bd60f3d 100644 Binary files a/Sources/mpmissions/epoch.Esseker/treeView.txt and b/Sources/mpmissions/epoch.Esseker/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Malden/mission.sqm b/Sources/mpmissions/epoch.Malden/mission.sqm new file mode 100644 index 00000000..6418e64a --- /dev/null +++ b/Sources/mpmissions/epoch.Malden/mission.sqm @@ -0,0 +1,6097 @@ +version=51; +class EditorData +{ + moveGridStep=1; + angleGridStep=0.2617994; + scaleGridStep=1; + autoGroupingDist=10; + toggles=1; + class ItemIDProvider + { + nextID=2; + }; + class Camera + { + pos[]={7542.4932,93.791428,15492.986}; + dir[]={-0.8989169,-0.17364819,-0.40223712}; + up[]={-0.15850332,0.98480779,-0.070925266}; + aside[]={-0.40844229,0,0.91278416}; + }; +}; +binarizationWanted=0; +addons[]= +{ + "A3_epoch_config", + "a3_characters_f" +}; +randomSeed=12032465; +class ScenarioData +{ + author="[VB]AWOL"; +}; +class Mission +{ + class Intel + { + briefingName="Epoch Mod"; + timeOfChanges=28800; + startWeather=0; + startWind=0; + startWaves=0; + forecastWeather=0; + forecastWind=0; + forecastWaves=0; + forecastLightnings=0; + year=2035; + month=6; + day=24; + hour=12; + minute=0; + startFogDecay=0; + forecastFogDecay=0; + }; + class Entities + { + items=205; + class Item0 + { + dataType="Marker"; + position[]={5881.4692,0,6711.854}; + name="center"; + type="Empty"; + id=0; + }; + class Item1 + { + dataType="Marker"; + position[]={10090.576,0,2139.79}; + name="respawn_east"; + type="Empty"; + id=1; + }; + class Item2 + { + dataType="Marker"; + position[]={10090.576,0,2139.79}; + name="respawn_west"; + type="Empty"; + id=2; + }; + class Item3 + { + dataType="Marker"; + position[]={4658.4561,0,10188.492}; + name="west"; + type="Empty"; + id=3; + }; + class Item4 + { + dataType="Marker"; + position[]={8707.7588,0,6930.1099}; + name="east"; + type="Empty"; + id=4; + }; + class Item5 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=6; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=5; + }; + class Item6 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=8; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=7; + }; + class Item7 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=10; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=9; + }; + class Item8 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=12; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=11; + }; + class Item9 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=14; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=13; + }; + class Item10 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=16; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=15; + }; + class Item11 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=18; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=17; + }; + class Item12 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=20; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=19; + }; + class Item13 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=22; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=21; + }; + class Item14 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=24; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=23; + }; + class Item15 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=26; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=25; + }; + class Item16 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=28; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=27; + }; + class Item17 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=30; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=29; + }; + class Item18 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=32; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=31; + }; + class Item19 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=34; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=33; + }; + class Item20 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=36; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=35; + }; + class Item21 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=38; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=37; + }; + class Item22 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=40; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=39; + }; + class Item23 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=42; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=41; + }; + class Item24 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=44; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=43; + }; + class Item25 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=46; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=45; + }; + class Item26 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=48; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=47; + }; + class Item27 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=50; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=49; + }; + class Item28 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=52; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=51; + }; + class Item29 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=54; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=53; + }; + class Item30 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=56; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=55; + }; + class Item31 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=58; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=57; + }; + class Item32 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=60; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=59; + }; + class Item33 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=62; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=61; + }; + class Item34 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=64; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=63; + }; + class Item35 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=66; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=65; + }; + class Item36 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=68; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=67; + }; + class Item37 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=70; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=69; + }; + class Item38 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=72; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=71; + }; + class Item39 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=74; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=73; + }; + class Item40 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=76; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=75; + }; + class Item41 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=78; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=77; + }; + class Item42 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=80; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=79; + }; + class Item43 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=82; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=81; + }; + class Item44 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=84; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=83; + }; + class Item45 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=86; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=85; + }; + class Item46 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=88; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=87; + }; + class Item47 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=90; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=89; + }; + class Item48 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=92; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=91; + }; + class Item49 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=94; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=93; + }; + class Item50 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=96; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=95; + }; + class Item51 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=98; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=97; + }; + class Item52 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=100; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=99; + }; + class Item53 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=102; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=101; + }; + class Item54 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=104; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=103; + }; + class Item55 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=106; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=105; + }; + class Item56 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=108; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=107; + }; + class Item57 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=110; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=109; + }; + class Item58 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=112; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=111; + }; + class Item59 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=114; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=113; + }; + class Item60 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=116; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=115; + }; + class Item61 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=118; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=117; + }; + class Item62 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=120; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=119; + }; + class Item63 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=122; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=121; + }; + class Item64 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=124; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=123; + }; + class Item65 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=126; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=125; + }; + class Item66 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=128; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=127; + }; + class Item67 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=130; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=129; + }; + class Item68 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=132; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=131; + }; + class Item69 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=134; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=133; + }; + class Item70 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=136; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=135; + }; + class Item71 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=138; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=137; + }; + class Item72 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=140; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=139; + }; + class Item73 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=142; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=141; + }; + class Item74 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=144; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=143; + }; + class Item75 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=146; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=145; + }; + class Item76 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=148; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=147; + }; + class Item77 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=150; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=149; + }; + class Item78 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=152; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=151; + }; + class Item79 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=154; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=153; + }; + class Item80 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=156; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=155; + }; + class Item81 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=158; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=157; + }; + class Item82 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=160; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=159; + }; + class Item83 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=162; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=161; + }; + class Item84 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=164; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=163; + }; + class Item85 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=166; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=165; + }; + class Item86 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=168; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=167; + }; + class Item87 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=170; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=169; + }; + class Item88 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=172; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=171; + }; + class Item89 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=174; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=173; + }; + class Item90 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=176; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=175; + }; + class Item91 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=178; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=177; + }; + class Item92 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=180; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=179; + }; + class Item93 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=182; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=181; + }; + class Item94 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=184; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=183; + }; + class Item95 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=186; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=185; + }; + class Item96 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=188; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=187; + }; + class Item97 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=190; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=189; + }; + class Item98 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=192; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=191; + }; + class Item99 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=194; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=193; + }; + class Item100 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=196; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=195; + }; + class Item101 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=198; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=197; + }; + class Item102 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=200; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=199; + }; + class Item103 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=202; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=201; + }; + class Item104 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=204; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=203; + }; + class Item105 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=206; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=205; + }; + class Item106 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=208; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=207; + }; + class Item107 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=210; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=209; + }; + class Item108 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=212; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=211; + }; + class Item109 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=214; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=213; + }; + class Item110 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=216; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=215; + }; + class Item111 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=218; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=217; + }; + class Item112 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=220; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=219; + }; + class Item113 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=222; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=221; + }; + class Item114 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=224; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=223; + }; + class Item115 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=226; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=225; + }; + class Item116 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=228; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=227; + }; + class Item117 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=230; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=229; + }; + class Item118 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=232; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=231; + }; + class Item119 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=234; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=233; + }; + class Item120 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=236; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=235; + }; + class Item121 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=238; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=237; + }; + class Item122 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=240; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=239; + }; + class Item123 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=242; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=241; + }; + class Item124 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=244; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=243; + }; + class Item125 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=246; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=245; + }; + class Item126 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=248; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=247; + }; + class Item127 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=250; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=249; + }; + class Item128 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=252; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=251; + }; + class Item129 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=254; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=253; + }; + class Item130 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=256; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=255; + }; + class Item131 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=258; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=257; + }; + class Item132 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=260; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=259; + }; + class Item133 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=262; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=261; + }; + class Item134 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=264; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=263; + }; + class Item135 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=266; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=265; + }; + class Item136 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=268; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=267; + }; + class Item137 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=270; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=269; + }; + class Item138 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=272; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=271; + }; + class Item139 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=274; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=273; + }; + class Item140 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=276; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=275; + }; + class Item141 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=278; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=277; + }; + class Item142 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=280; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=279; + }; + class Item143 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=282; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=281; + }; + class Item144 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=284; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=283; + }; + class Item145 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=286; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=285; + }; + class Item146 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=288; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=287; + }; + class Item147 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=290; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=289; + }; + class Item148 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=292; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=291; + }; + class Item149 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=294; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=293; + }; + class Item150 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=296; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=295; + }; + class Item151 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=298; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=297; + }; + class Item152 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=300; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=299; + }; + class Item153 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=302; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=301; + }; + class Item154 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=304; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=303; + }; + class Item155 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=306; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=305; + }; + class Item156 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=308; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=307; + }; + class Item157 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=310; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=309; + }; + class Item158 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=312; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=311; + }; + class Item159 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=314; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=313; + }; + class Item160 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=316; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=315; + }; + class Item161 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=318; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=317; + }; + class Item162 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=320; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=319; + }; + class Item163 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=322; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=321; + }; + class Item164 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=324; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=323; + }; + class Item165 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=326; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=325; + }; + class Item166 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=328; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=327; + }; + class Item167 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=330; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=329; + }; + class Item168 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=332; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=331; + }; + class Item169 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=334; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=333; + }; + class Item170 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=336; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=335; + }; + class Item171 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=338; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=337; + }; + class Item172 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=340; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=339; + }; + class Item173 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=342; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=341; + }; + class Item174 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=344; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=343; + }; + class Item175 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=346; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=345; + }; + class Item176 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=348; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=347; + }; + class Item177 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=350; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=349; + }; + class Item178 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=352; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=351; + }; + class Item179 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=354; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=353; + }; + class Item180 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=356; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=355; + }; + class Item181 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=358; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=357; + }; + class Item182 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=360; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=359; + }; + class Item183 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=362; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=361; + }; + class Item184 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=364; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=363; + }; + class Item185 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=366; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=365; + }; + class Item186 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=368; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=367; + }; + class Item187 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=370; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=369; + }; + class Item188 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=372; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=371; + }; + class Item189 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=374; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=373; + }; + class Item190 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=376; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=375; + }; + class Item191 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=378; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=377; + }; + class Item192 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=380; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=379; + }; + class Item193 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=382; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=381; + }; + class Item194 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=384; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=383; + }; + class Item195 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=386; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=385; + }; + class Item196 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=388; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=387; + }; + class Item197 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=390; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=389; + }; + class Item198 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=392; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=391; + }; + class Item199 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=394; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=393; + }; + class Item200 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=396; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=395; + }; + class Item201 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=398; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=397; + }; + class Item202 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=400; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=399; + }; + class Item203 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=402; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=401; + }; + class Item204 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={10090.576,0,2139.79}; + angles[]={0,4.7169838,0}; + }; + side="Civilian"; + flags=3; + class Attributes + { + isPlayable=1; + }; + id=404; + type="VirtualMan_EPOCH"; + }; + }; + class Attributes + { + }; + id=403; + }; + }; +}; diff --git a/Sources/mpmissions/epoch.Malden/treeView.txt b/Sources/mpmissions/epoch.Malden/treeView.txt new file mode 100644 index 00000000..9301efd1 Binary files /dev/null and b/Sources/mpmissions/epoch.Malden/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Mountains_ACR/mission.sqm b/Sources/mpmissions/epoch.Mountains_ACR/mission.sqm index b15b9c41..be759571 100644 --- a/Sources/mpmissions/epoch.Mountains_ACR/mission.sqm +++ b/Sources/mpmissions/epoch.Mountains_ACR/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_afghan_config" + "cup_afghan_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6101,35 +6102,5 @@ class Mission }; id=404; }; - class Item206 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={4864.4897,0,397.39026}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=407; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=406; - }; }; }; diff --git a/Sources/mpmissions/epoch.Mountains_ACR/treeView.txt b/Sources/mpmissions/epoch.Mountains_ACR/treeView.txt index b6e30441..87bb9b25 100644 Binary files a/Sources/mpmissions/epoch.Mountains_ACR/treeView.txt and b/Sources/mpmissions/epoch.Mountains_ACR/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Napf/mission.sqm b/Sources/mpmissions/epoch.Napf/mission.sqm index 28fdea93..331e5c63 100644 --- a/Sources/mpmissions/epoch.Napf/mission.sqm +++ b/Sources/mpmissions/epoch.Napf/mission.sqm @@ -21,7 +21,8 @@ class EditorData binarizationWanted=0; addons[]= { - "a3_epoch_config" + "a3_epoch_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6099,35 +6100,5 @@ class Mission }; id=404; }; - class Item206 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={4712.0864,8.8047247,16664.449}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=407; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=406; - }; }; }; diff --git a/Sources/mpmissions/epoch.Napf/treeView.txt b/Sources/mpmissions/epoch.Napf/treeView.txt index ec1ce1ef..fd2874f6 100644 Binary files a/Sources/mpmissions/epoch.Napf/treeView.txt and b/Sources/mpmissions/epoch.Napf/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Porto/mission.sqm b/Sources/mpmissions/epoch.Porto/mission.sqm index e3e6149b..c462a655 100644 --- a/Sources/mpmissions/epoch.Porto/mission.sqm +++ b/Sources/mpmissions/epoch.Porto/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_desert2_config" + "cup_desert2_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6085,35 +6086,5 @@ class Mission }; id=402; }; - class Item204 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={808.42041,0,2754.4238}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=405; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=404; - }; }; }; diff --git a/Sources/mpmissions/epoch.Porto/treeView.txt b/Sources/mpmissions/epoch.Porto/treeView.txt index 8bd8bad7..2d603e7c 100644 Binary files a/Sources/mpmissions/epoch.Porto/treeView.txt and b/Sources/mpmissions/epoch.Porto/treeView.txt differ diff --git a/Sources/mpmissions/epoch.ProvingGrounds_PMC/mission.sqm b/Sources/mpmissions/epoch.ProvingGrounds_PMC/mission.sqm index 2bfdcd61..dc59797a 100644 --- a/Sources/mpmissions/epoch.ProvingGrounds_PMC/mission.sqm +++ b/Sources/mpmissions/epoch.ProvingGrounds_PMC/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_provinggrounds_pmc_config" + "cup_provinggrounds_pmc_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6085,35 +6086,5 @@ class Mission }; id=402; }; - class Item204 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={8.4882975,0,8.1249542}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=405; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=404; - }; }; }; diff --git a/Sources/mpmissions/epoch.ProvingGrounds_PMC/treeView.txt b/Sources/mpmissions/epoch.ProvingGrounds_PMC/treeView.txt index 2f323242..bf0c73a4 100644 Binary files a/Sources/mpmissions/epoch.ProvingGrounds_PMC/treeView.txt and b/Sources/mpmissions/epoch.ProvingGrounds_PMC/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Sara/mission.sqm b/Sources/mpmissions/epoch.Sara/mission.sqm index b2a76899..b4ec4ca4 100644 --- a/Sources/mpmissions/epoch.Sara/mission.sqm +++ b/Sources/mpmissions/epoch.Sara/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_sara_config" + "cup_sara_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6101,35 +6102,5 @@ class Mission }; id=404; }; - class Item206 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={9466.5723,0,3495.4368}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=407; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=406; - }; }; }; diff --git a/Sources/mpmissions/epoch.Sara/treeView.txt b/Sources/mpmissions/epoch.Sara/treeView.txt index 285ab72e..76085528 100644 Binary files a/Sources/mpmissions/epoch.Sara/treeView.txt and b/Sources/mpmissions/epoch.Sara/treeView.txt differ diff --git a/Sources/mpmissions/epoch.SaraLite/mission.sqm b/Sources/mpmissions/epoch.SaraLite/mission.sqm index 9b6604e9..de66895a 100644 --- a/Sources/mpmissions/epoch.SaraLite/mission.sqm +++ b/Sources/mpmissions/epoch.SaraLite/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_saralite_config" + "cup_saralite_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData diff --git a/Sources/mpmissions/epoch.SaraLite/treeView.txt b/Sources/mpmissions/epoch.SaraLite/treeView.txt index 6cdf003b..7c96a288 100644 Binary files a/Sources/mpmissions/epoch.SaraLite/treeView.txt and b/Sources/mpmissions/epoch.SaraLite/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Sara_dbe1/mission.sqm b/Sources/mpmissions/epoch.Sara_dbe1/mission.sqm index 232dd967..636fcd27 100644 --- a/Sources/mpmissions/epoch.Sara_dbe1/mission.sqm +++ b/Sources/mpmissions/epoch.Sara_dbe1/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_sara_dbe1_config" + "cup_sara_dbe1_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6101,35 +6102,5 @@ class Mission }; id=404; }; - class Item206 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={9466.5723,0,3495.4368}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=407; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=406; - }; }; }; diff --git a/Sources/mpmissions/epoch.Sara_dbe1/treeView.txt b/Sources/mpmissions/epoch.Sara_dbe1/treeView.txt index fe37b325..130f4dc4 100644 Binary files a/Sources/mpmissions/epoch.Sara_dbe1/treeView.txt and b/Sources/mpmissions/epoch.Sara_dbe1/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Shapur_BAF/mission.sqm b/Sources/mpmissions/epoch.Shapur_BAF/mission.sqm index 278ea963..12aef418 100644 --- a/Sources/mpmissions/epoch.Shapur_BAF/mission.sqm +++ b/Sources/mpmissions/epoch.Shapur_BAF/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_shapur_baf_config" + "cup_shapur_baf_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6085,35 +6086,5 @@ class Mission }; id=402; }; - class Item204 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={8.5185719,0,8.1347198}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=405; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=404; - }; }; }; diff --git a/Sources/mpmissions/epoch.Shapur_BAF/treeView.txt b/Sources/mpmissions/epoch.Shapur_BAF/treeView.txt index 71cc2f1c..b5ffe8bf 100644 Binary files a/Sources/mpmissions/epoch.Shapur_BAF/treeView.txt and b/Sources/mpmissions/epoch.Shapur_BAF/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Stratis/mission.sqm b/Sources/mpmissions/epoch.Stratis/mission.sqm index a36ad5a1..2c76487b 100644 --- a/Sources/mpmissions/epoch.Stratis/mission.sqm +++ b/Sources/mpmissions/epoch.Stratis/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "a3_map_stratis" + "a3_map_stratis", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6077,35 +6078,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={1719.5787,0,5121.1045}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.Stratis/treeView.txt b/Sources/mpmissions/epoch.Stratis/treeView.txt index 00811e69..d94dd9b8 100644 Binary files a/Sources/mpmissions/epoch.Stratis/treeView.txt and b/Sources/mpmissions/epoch.Stratis/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Takistan/mission.sqm b/Sources/mpmissions/epoch.Takistan/mission.sqm index ca1035e5..895637be 100644 --- a/Sources/mpmissions/epoch.Takistan/mission.sqm +++ b/Sources/mpmissions/epoch.Takistan/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_takistan_config" + "cup_takistan_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6077,35 +6078,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={-107.9753,0,-91.194214}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.Takistan/treeView.txt b/Sources/mpmissions/epoch.Takistan/treeView.txt index 7d9327ff..6e058e17 100644 Binary files a/Sources/mpmissions/epoch.Takistan/treeView.txt and b/Sources/mpmissions/epoch.Takistan/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Tanoa/mission.sqm b/Sources/mpmissions/epoch.Tanoa/mission.sqm index c598e854..eac00b52 100644 --- a/Sources/mpmissions/epoch.Tanoa/mission.sqm +++ b/Sources/mpmissions/epoch.Tanoa/mission.sqm @@ -21,7 +21,8 @@ class EditorData binarizationWanted=0; addons[]= { - "A3_epoch_config" + "A3_epoch_config", + "a3_characters_f" }; class AddonsMetaData { @@ -6095,35 +6096,5 @@ class Mission }; id=402; }; - class Item204 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={9969.2129,298.72415,12166.665}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=7; - class Attributes - { - isPlayable=1; - }; - id=405; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=404; - }; }; }; diff --git a/Sources/mpmissions/epoch.Tanoa/treeView.txt b/Sources/mpmissions/epoch.Tanoa/treeView.txt index 92b5a339..8f268deb 100644 Binary files a/Sources/mpmissions/epoch.Tanoa/treeView.txt and b/Sources/mpmissions/epoch.Tanoa/treeView.txt differ diff --git a/Sources/mpmissions/epoch.VR/mission.sqm b/Sources/mpmissions/epoch.VR/mission.sqm index 1c160eda..7cd9bb50 100644 --- a/Sources/mpmissions/epoch.VR/mission.sqm +++ b/Sources/mpmissions/epoch.VR/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "map_vr" + "map_vr", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6077,35 +6078,5 @@ class Mission }; id=401; }; - class Item203 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={1719.5787,0,5121.1045}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=404; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=403; - }; }; }; diff --git a/Sources/mpmissions/epoch.VR/treeView.txt b/Sources/mpmissions/epoch.VR/treeView.txt index bae97448..b9da552c 100644 Binary files a/Sources/mpmissions/epoch.VR/treeView.txt and b/Sources/mpmissions/epoch.VR/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Woodland_ACR/mission.sqm b/Sources/mpmissions/epoch.Woodland_ACR/mission.sqm index 240d1d1d..d1922825 100644 --- a/Sources/mpmissions/epoch.Woodland_ACR/mission.sqm +++ b/Sources/mpmissions/epoch.Woodland_ACR/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_bohemia_config" + "cup_bohemia_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6101,35 +6102,5 @@ class Mission }; id=404; }; - class Item206 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={1270.4408,0,234.18149}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=407; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=406; - }; }; }; diff --git a/Sources/mpmissions/epoch.Woodland_ACR/treeView.txt b/Sources/mpmissions/epoch.Woodland_ACR/treeView.txt index 5d2df949..38f8d57b 100644 Binary files a/Sources/mpmissions/epoch.Woodland_ACR/treeView.txt and b/Sources/mpmissions/epoch.Woodland_ACR/treeView.txt differ diff --git a/Sources/mpmissions/epoch.Zargabad/mission.sqm b/Sources/mpmissions/epoch.Zargabad/mission.sqm index 6e58fcee..1cf17857 100644 --- a/Sources/mpmissions/epoch.Zargabad/mission.sqm +++ b/Sources/mpmissions/epoch.Zargabad/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_zargabad_config" + "cup_zargabad_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6093,35 +6094,5 @@ class Mission }; id=403; }; - class Item205 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={4331.02,0,148.62354}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=406; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=405; - }; }; }; diff --git a/Sources/mpmissions/epoch.Zargabad/treeView.txt b/Sources/mpmissions/epoch.Zargabad/treeView.txt index 87073fe4..ff68a25e 100644 Binary files a/Sources/mpmissions/epoch.Zargabad/treeView.txt and b/Sources/mpmissions/epoch.Zargabad/treeView.txt differ diff --git a/Sources/mpmissions/epoch.utes/mission.sqm b/Sources/mpmissions/epoch.utes/mission.sqm index d6e66e0c..dfc4d3e7 100644 --- a/Sources/mpmissions/epoch.utes/mission.sqm +++ b/Sources/mpmissions/epoch.utes/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "cup_utes_config" + "cup_utes_config", + "a3_characters_f" }; randomSeed=12032465; class ScenarioData @@ -6085,35 +6086,5 @@ class Mission }; id=402; }; - class Item204 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={4154.1626,0,3645.7505}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=3; - class Attributes - { - isPlayable=1; - }; - id=405; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=404; - }; }; }; diff --git a/Sources/mpmissions/epoch.utes/treeView.txt b/Sources/mpmissions/epoch.utes/treeView.txt index 87c42cb5..9c94aefb 100644 Binary files a/Sources/mpmissions/epoch.utes/treeView.txt and b/Sources/mpmissions/epoch.utes/treeView.txt differ diff --git a/Sources/mpmissions/epoch_RyanZed.Tanoa/mission.sqm b/Sources/mpmissions/epoch_RyanZed.Tanoa/mission.sqm index 69a48f6c..640940c2 100644 --- a/Sources/mpmissions/epoch_RyanZed.Tanoa/mission.sqm +++ b/Sources/mpmissions/epoch_RyanZed.Tanoa/mission.sqm @@ -22,7 +22,8 @@ binarizationWanted=0; addons[]= { "A3_epoch_config", - "Ryanzombies" + "Ryanzombies", + "a3_characters_f" }; class AddonsMetaData { @@ -6101,35 +6102,5 @@ class Mission }; id=402; }; - class Item204 - { - dataType="Group"; - side="Civilian"; - class Entities - { - items=1; - class Item0 - { - dataType="Object"; - class PositionInfo - { - position[]={9969.2129,298.72415,12166.665}; - angles[]={0,4.7169838,0}; - }; - side="Civilian"; - flags=7; - class Attributes - { - isPlayable=1; - }; - id=405; - type="VirtualMan_EPOCH"; - }; - }; - class Attributes - { - }; - id=404; - }; }; }; diff --git a/Sources/mpmissions/epoch_RyanZed.Tanoa/treeView.txt b/Sources/mpmissions/epoch_RyanZed.Tanoa/treeView.txt index 2ab74cd8..ced25099 100644 Binary files a/Sources/mpmissions/epoch_RyanZed.Tanoa/treeView.txt and b/Sources/mpmissions/epoch_RyanZed.Tanoa/treeView.txt differ diff --git a/Tools/BAT/paa2png.bat b/Tools/BAT/paa2png.bat new file mode 100644 index 00000000..b1e3a886 --- /dev/null +++ b/Tools/BAT/paa2png.bat @@ -0,0 +1,3 @@ +rem Adjust path to Pal2PacE.exe below +rem Put this batch inside the same folder as your .paa textures, handy for mass extracting data if you have unRapped your game into P:\ drive +for %%f in (*.paa) do ( "D:\SteamLibrary\steamapps\common\Arma 3 Tools\TexView2\Pal2PacE.exe" "%%~nf.paa" "%%~nf.png" ) \ No newline at end of file diff --git a/Tools/BAT/paa2tga.bat b/Tools/BAT/paa2tga.bat new file mode 100644 index 00000000..f6d8e8a1 --- /dev/null +++ b/Tools/BAT/paa2tga.bat @@ -0,0 +1 @@ + for %%f in (*.paa) do ( "D:\SteamLibrary\steamapps\common\Arma 3 Tools\TexView2\Pal2PacE.exe" "%%~nf.paa" "%%~nf.tga" ) \ No newline at end of file diff --git a/Tools/Build/BuildExperimental.cmd b/Tools/Build/BuildExperimental.cmd new file mode 100644 index 00000000..13739f09 --- /dev/null +++ b/Tools/Build/BuildExperimental.cmd @@ -0,0 +1,72 @@ +@Echo Off +SETLOCAL ENABLEDELAYEDEXPANSION + +REM path to compiled mod +SET WORKSHOP_PATH=C:\Program Files (x86)\Steam\steamapps\common\Arma 3\@epochhive + +REM steam workshop id to update +SET WORKSHOPID=558243173 + +REM Arma 3 tools folder path +SET TOOLSPATH=C:\Program Files (x86)\Steam\steamapps\common\Arma 3 Tools + +REM set tool paths +SET AddonBuilder=%TOOLSPATH%\AddonBuilder +SET Publisher=%TOOLSPATH%\Publisher + +REM path to sources +SET MAIN_PATH=C:\Jenkins\workspace\hModTeam_Epoch_experimental-4BF7YIB2XXMEG3NYNJNCJCCUWHF7IEANIHR4LFGH2DZDQBP37UIA +SET SOURCE_PATH=%MAIN_PATH%\Sources + +SET AB_includes_path="C:\GITTEMP\includes.txt" + +REM set build and version paths +SET currentVersion="%MAIN_PATH%\version.txt" +SET currentBuild="%MAIN_PATH%\build.txt" + +SET /p BUILDNUMBER=<%currentBuild% +SET /A BUILDNUMBER = BUILDNUMBER + 1 +echo %BUILDNUMBER% > %currentBuild% + +REM build all pbos +for /d %%D in ("%SOURCE_PATH%\*") do ( + if exist "%%~fD\config.cpp" ( + SET pboBuild="%%~fD\build.hpp" + echo build=%BUILDNUMBER%; > !pboBuild! + REM START "AddonBuilder" /min /WAIT "%AddonBuilder%\AddonBuilder.exe" "P:\%%~nxD" "%WORKSHOP_PATH%\addons" -packonly -clear -prefix="%%~nxD" -project="P:\%%~nxD" -include=%AB_includes_path% + START "AddonBuilder" /min /WAIT "%AddonBuilder%\AddonBuilder.exe" "%%~fD" "%WORKSHOP_PATH%\addons" -packonly -clear -prefix="%%~nxD" -project="%%~fD" -include=%AB_includes_path% + echo %%~nxD + ) +) + +::allmaps +echo building mpmissions pbo's +SET clientBuildInc="%MAIN_PATH%\Sources\epoch_config\build.hpp" +echo build=%BUILDNUMBER%; > !clientBuildInc! + +SET OUTPUT_PATH=%WORKSHOP_PATH%\MPMissions + +for /f "tokens=*" %%G in ('dir /b /s /a:d "!SOURCE_PATH!\mpmissions\epoch.*"') do ( + SET MISSION=%%~nxG + rd /s/q p:\!MISSION! + rem Moving files into temp folder + xcopy /s/e/y/q/i/d "!SOURCE_PATH!\mpmissions\!MISSION!" P:\!MISSION! + xcopy /s/y/q/i/f "!SOURCE_PATH!\description.ext" P:\!MISSION! + xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_code" P:\!MISSION!\epoch_code + xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_config" P:\!MISSION!\epoch_config + START "" /min /WAIT "%AddonBuilder%\AddonBuilder.exe" "P:\!MISSION!" "!OUTPUT_PATH!" -clear -prefix=\ -project=P:\ -include=!AB_includes_path! + echo building !MISSION! pbo +) + + +REM upload to steam Workshop +SET SOURCE_PATH=%MAIN_PATH%\Server_Install_Pack + +REM copy mod from steamcmd cache to server +REM xcopy /s/e/y/q/i "%SOURCE_PATH%\mpmissions" "%WORKSHOP_PATH%\mpmissions" +REM xcopy /s/e/y/q/i "%SOURCE_PATH%\@epochhive\addons" "%WORKSHOP_PATH%\addons" +xcopy /s/e/y/q/i "%SOURCE_PATH%\sc\battleye" "%WORKSHOP_PATH%\sc\battleye" + +START "" /WAIT "%Publisher%\PublisherCmd.exe" update /id:%WORKSHOPID% /changeNote:"Build: %BUILDNUMBER% See Changelog: https://github.com/EpochModTeam/Epoch/blob/experimental/changelog.md" /path:"%WORKSHOP_PATH%" + +exit /b 0 diff --git a/Tools/DevFrameWork/@EpochDevTools/Addons/rmx_init.pbo b/Tools/DevFrameWork/@EpochDevTools/Addons/rmx_init.pbo new file mode 100644 index 00000000..8ccc309e Binary files /dev/null and b/Tools/DevFrameWork/@EpochDevTools/Addons/rmx_init.pbo differ diff --git a/Tools/DevFrameWork/@EpochDevTools/Addons/rmx_sandbox.pbo b/Tools/DevFrameWork/@EpochDevTools/Addons/rmx_sandbox.pbo new file mode 100644 index 00000000..03c93eca Binary files /dev/null and b/Tools/DevFrameWork/@EpochDevTools/Addons/rmx_sandbox.pbo differ diff --git a/Tools/DevFrameWork/@EpochDevTools/mod.cpp b/Tools/DevFrameWork/@EpochDevTools/mod.cpp new file mode 100644 index 00000000..342e092b Binary files /dev/null and b/Tools/DevFrameWork/@EpochDevTools/mod.cpp differ diff --git a/Tools/DevFrameWork/@EpochDevTools/mod.paa b/Tools/DevFrameWork/@EpochDevTools/mod.paa new file mode 100644 index 00000000..2c4442fd Binary files /dev/null and b/Tools/DevFrameWork/@EpochDevTools/mod.paa differ diff --git a/Tools/DevFrameWork/README.md b/Tools/DevFrameWork/README.md new file mode 100644 index 00000000..bcc0b90d --- /dev/null +++ b/Tools/DevFrameWork/README.md @@ -0,0 +1,99 @@ +Epoch Developer Libraries (Framework) +===== +http://epochmod.com + +## This guide is WIP + +These tools are for developers only, please do not use on public servers, local development servers only! + +Technically you can simply copy/paste existing files into your Arma root and forget about it, unless you intend to use these tools for its intended purpose - as a development framework + +Don't forget to load the @mod on client + +Server config: + +Make sure -filepatching is enabled + +##### .bat file example +``` +@echo off +start "arma3" arma3server.exe autoInit -filepatching -mod=@EpochExperimental; -serverMod=@EpochHive; -port=2302 -config=c:\a3server\sc\server.cfg -cfg=C:\A3Server\sc\basic.cfg -profiles=sc -name=sc +``` + +* server.cfg +* verifySignatures = 0; +* BattlEye = 0; +* allowedFilePatching = 2; +* // WHITELIST FILE TYPES +* allowedLoadFileExtensions[] = {:}; +* allowedPreprocessFileExtensions[] = {"sqf"}; +* allowedHTMLLoadExtensions[] = {"html"}; + + +# Advanced: + + +Create your own sandbox using mine as a template, this will save you headache on future tool updates. +I will provide a clean template later. + +To create your own sandbox: +* Copy rmx_sanbox folder and rename it +* update .bat file to support your new folder +* update $PBOPREFIX$ +* delete "epoch" folder +* clean up config.cpp (see class A3E) +* cleanup sandbox.sqf +* you can either clean up variables.sqf, rename or delete it. It is used for F3 menu - to save permament code snippets :) + +Config.cpp +``` +preInit = 1; //function run as soon as missionNamespace is created +postInit = 1; //function is run after everything else is loaded +recompile = 1; //function is not finalized and can be recompiled live using rmx_fnc_recompile or F3 menu (auto populated) +``` + +### Tools: + +##### F2 - Debug console +you need an include in each of your scritps for it to work +``` +#include <\x\Addons\rmx_init\defines.inc> +``` + +to call debug console events you need to call infos, warnings or critical from your scripts. Examples: +``` +"this is info" info; +(2+2) warning; +(call _myfnc) critical; +``` + +#### F3 - Quick launch + +Edit variables.sqf + +Quick launch depends on rmx_var_quickFnc_items array, that's all there is to it. + +You can save code snippets here that you use the most. +``` +Syntax: [[RGBA],name,function] +``` + +#### F4 - variable watcher, see my youtube video + +#### F5, F6 etc tools are mostly used for Single player to change weather or post processing effects. + + +edit .bat file + +make sure you also point to includes.txt correctly without spaces + +Shit, this documentation will take me a week to compile all the features properly... + +License: +===== +Arma Public License Share Alike (APL-SA). +http://www.bistudio.com/community/licenses/arma-public-license-share-alike + +Credits: +===== +https://github.com/EpochModTeam/Epoch/blob/release/CREDITS.md diff --git a/Tools/DevFrameWork/x/addons/include.txt b/Tools/DevFrameWork/x/addons/include.txt new file mode 100644 index 00000000..ff480c36 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/include.txt @@ -0,0 +1 @@ +*.xml;*.pac;*.paa;*.sqf;*.sqs;*.bikb;*.fsm;*.wss;*.ogg;*.wav;*.fxy;*.csv;*.html;*.lip;*.txt;*.wrp;*.bisurf;*.rvmat;*.sqm;*.ext;*.rtm;*.p3d;*.cfg; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/pack.bat b/Tools/DevFrameWork/x/addons/pack.bat new file mode 100644 index 00000000..56de4ab3 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/pack.bat @@ -0,0 +1,42 @@ +@echo on +setlocal + +rd P:\temp /s /q + +SET bin=D:\SteamLibrary\SteamApps\common\Arma 3 Tools\AddonBuilder +SET arma=E:\Steam\SteamApps\common\Arma 3 +SET patch=E:\Steam\SteamApps\common\Arma 3\x\addons +SET modPath=%arma%\@EpochDev\Addons +SET devPath=%arma%\@EpochDevTools\Addons + +:: Array +SET list=epoch_code epoch_config a3_epoch_language +SET devlist=rmx_init rmx_sandbox +:: Loops trough array and makes PBO if folder exists +for %%i in (%list%) do ( + IF EXIST %patch%\%%i ( + "%bin%\AddonBuilder.exe" "%patch%\%%i" "%patch%" -prefix="x\addons\a3_%%i" -include=F:\includes.txt -temp=P:\temp -packonly + ) +) +for %%i in (%devlist%) do ( + IF EXIST %patch%\%%i ( + "%bin%\AddonBuilder.exe" "%patch%\%%i" "%patch%" -prefix="x\addons\%%i" -include=F:\includes.txt -temp=P:\temp -packonly + ) +) + +for %%i in (%devlist%) do ( + move /Y "%patch%\%%i.pbo" "%devPath%" +) + +::for %%i in (%list%) do ( +:: rename "%patch%\%%i.pbo" "a3_%%i.pbo" +::) + +move /Y "%patch%\*.pbo" "%modPath%" + +set IP=192.168.1.100 +set PORT=2302 + +rem timeout 3 +rem start "MP" "%arma%\arma3.exe" -connect=%IP% -port=%PORT% -filePatching -window -mod=@EpochExperimental;@EpochDevLibs; -malloc=system -skipintro -noSplash -noPause -world=empty -showScriptErrors -password=test123 +@exit \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/$PBOPREFIX$ b/Tools/DevFrameWork/x/addons/rmx_init/$PBOPREFIX$ new file mode 100644 index 00000000..0a5a5ec5 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/$PBOPREFIX$ @@ -0,0 +1 @@ +x\addons\rmx_init \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/BIS_AddonInfo.hpp b/Tools/DevFrameWork/x/addons/rmx_init/BIS_AddonInfo.hpp new file mode 100644 index 00000000..bddf91d4 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/BIS_AddonInfo.hpp @@ -0,0 +1,5 @@ +class BIS_AddonInfo +{ + author=""; + timepacked="1468263040"; +}; diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/atmosFEAR.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/atmosFEAR.hpp new file mode 100644 index 00000000..5978f990 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/atmosFEAR.hpp @@ -0,0 +1,680 @@ +class dUI_atmosFear { + idd = 8100; + enableSimulation = 1; + movingEnable = 1; + onKeyDown = "_this call rmx_fnc_keyDown;"; + onUnload = "['unload'] call rmx_fnc_atmosFearActions;"; + + class controls { + + //Background + class dUI_af_background: IGUIBack + { + idc = -1; + x = 0.304062 * safezoneW + safezoneX; + y = 0.1898 * safezoneH + safezoneY; + w = 0.39184 * safezoneW; + h = 0.671 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //Frames + class dUI_af_f_generics: RscFrame + { + idc = -1; + x = 0.31336 * safezoneW + safezoneX; + y = 0.225 * safezoneH + safezoneY; + w = 0.370186 * safezoneW; + h = 0.1694 * safezoneH; + colorText[] = {1,1,1,1}; + }; + class dUI_af_f_fog: RscFrame + { + idc = -1; + text = "Fog"; //--- ToDo: Localize; + x = 0.313344 * safezoneW + safezoneX; + y = 0.4032 * safezoneH + safezoneY; + w = 0.37125 * safezoneW; + h = 0.1188 * safezoneH; + }; + class dUI_af_f_wind: RscFrame + { + idc = -1; + text = "Wind"; //--- ToDo: Localize; + x = 0.313344 * safezoneW + safezoneX; + y = 0.5308 * safezoneH + safezoneY; + w = 0.37125 * safezoneW; + h = 0.242 * safezoneH; + }; + + //Text + class dUI_af_txt_winda2_array: RscText + { + idc = 8101; + text = "[100, 100, true]"; //--- ToDo: Localize; + x = 0.315406 * safezoneW + safezoneX; + y = 0.7112 * safezoneH + safezoneY; + w = 0.133031 * safezoneW; + h = 0.0198 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_txt_wind_dir_val: RscText + { + idc = 8102; + text = "360"; //--- ToDo: Localize; + x = 0.380375 * safezoneW + safezoneX; + y = 0.6452 * safezoneH + safezoneY; + w = 0.0505318 * safezoneW; + h = 0.0198 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_title: RscText + { + idc = -1; + text = "AtmosFEAR"; //--- ToDo: Localize; + x = 0.298925 * safezoneW + safezoneX; + y = 0.1986 * safezoneH + safezoneY; + w = 0.0721875 * safezoneW; + h = 0.022 * safezoneH; + colorText[] = {0.75,0.34,0,1}; + colorBackground[] = {0,0,0,0.8}; + }; + class dUI_af_txt_gusts: RscText + { + idc = -1; + text = "Gusts"; //--- ToDo: Localize; + x = 0.315407 * safezoneW + safezoneX; + y = 0.3306 * safezoneH + safezoneY; + w = 0.0360937 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_Lightnings: RscText + { + idc = -1; + text = "Lightnings"; //--- ToDo: Localize; + x = 0.315413 * safezoneW + safezoneX; + y = 0.2382 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_Overcast: RscText + { + idc = -1; + text = "Overcast"; //--- ToDo: Localize; + x = 0.315406 * safezoneW + safezoneX; + y = 0.269 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_rain: RscText + { + idc = -1; + text = "Rain"; //--- ToDo: Localize; + x = 0.315407 * safezoneW + safezoneX; + y = 0.3636 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_rainbow: RscText + { + idc = -1; + text = "Rainbow"; //--- ToDo: Localize; + x = 0.315407 * safezoneW + safezoneX; + y = 0.2998 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_fog_density: RscText + { + idc = -1; + text = "Density"; //--- ToDo: Localize; + x = 0.315408 * safezoneW + safezoneX; + y = 0.4208 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_fog_decay: RscText + { + idc = -1; + text = "Decay"; //--- ToDo: Localize; + x = 0.315407 * safezoneW + safezoneX; + y = 0.4538 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_fog_altitude: RscText + { + idc = -1; + text = "Altitude"; //--- ToDo: Localize; + x = 0.315408 * safezoneW + safezoneX; + y = 0.4868 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_wind_str: RscText + { + idc = -1; + text = "Strength"; //--- ToDo: Localize; + x = 0.315407 * safezoneW + safezoneX; + y = 0.5462 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_wind_dir: RscText + { + idc = -1; + text = "Direction"; //--- ToDo: Localize; + x = 0.31519 * safezoneW + safezoneX; + y = 0.644667 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_wind_frc: RscText + { + idc = -1; + text = "Force"; //--- ToDo: Localize; + x = 0.315407 * safezoneW + safezoneX; + y = 0.5792 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_waves: RscText + { + idc = -1; + text = "Waves"; //--- ToDo: Localize; + x = 0.315407 * safezoneW + safezoneX; + y = 0.6122 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_winda2: RscText + { + idc = -1; + text = "Wind (A2)"; //--- ToDo: Localize; + x = 0.315732 * safezoneW + safezoneX; + y = 0.686667 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_help1: RscText + { + idc = -1; + text = "m/s Positive: EAST | Negative: WEST"; //--- ToDo: Localize; + x = 0.483501 * safezoneW + safezoneX; + y = 0.6826 * safezoneH + safezoneY; + w = 0.197976 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_help2: RscText + { + idc = -1; + text = "m/s Positive: NORTH | Negative: SOUTH"; //--- ToDo: Localize; + x = 0.482876 * safezoneW + safezoneX; + y = 0.713519 * safezoneH + safezoneY; + w = 0.197976 * safezoneW; + h = 0.0198 * safezoneH; + }; + class dUI_af_txt_help3: RscText + { + idc = -1; + text = "Force?"; //--- ToDo: Localize; + x = 0.483501 * safezoneW + safezoneX; + y = 0.7442 * safezoneH + safezoneY; + w = 0.0453749 * safezoneW; + h = 0.0198 * safezoneH; + }; + + //Progress Bar + class dUI_af_p_lightning: RscProgress + { + idc = 8110; + texture = ""; + textureExt = ""; + colorBar[] = {0.9, 0.9, 0.9, 0.9}; + colorExtBar[] = {1, 1, 1, 1}; + colorFrame[] = {1, 1, 1, 1}; + x = 0.362842 * safezoneW + safezoneX; + y = 0.236 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_p_overcast: dUI_af_p_lightning + { + idc = 8111; + x = 0.362844 * safezoneW + safezoneX; + y = 0.2668 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_p_rainbow: dUI_af_p_lightning + { + idc = 8112; + x = 0.362844 * safezoneW + safezoneX; + y = 0.2976 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_p_gusts: dUI_af_p_lightning + { + idc = 8113; + x = 0.362844 * safezoneW + safezoneX; + y = 0.3284 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_p_rain: dUI_af_p_lightning + { + idc = 8114; + x = 0.362844 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + + class dUI_af_p_fog_density: dUI_af_p_lightning + { + idc = 8115; + x = 0.362843 * safezoneW + safezoneX; + y = 0.4186 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + + class dUI_af_p_fog_decay: dUI_af_p_lightning + { + idc = 8116; + x = 0.362844 * safezoneW + safezoneX; + y = 0.4538 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_p_fog_altitude: dUI_af_p_lightning + { + idc = 8117; + x = 0.362844 * safezoneW + safezoneX; + y = 0.4868 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + + class dUI_af_p_wind_str: dUI_af_p_lightning + { + idc = 8118; + x = 0.362842 * safezoneW + safezoneX; + y = 0.5462 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; + + class dUI_af_p_waves: dUI_af_p_lightning + { + idc = 8119; + x = 0.362844 * safezoneW + safezoneX; + y = 0.61 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; +/* + class dUI_af_p_wind_frc: dUI_af_p_lightning //not implemented yet + { + idc = 8120; + x = 0.363234 * safezoneW + safezoneX; + y = 0.577985 * safezoneH + safezoneY; + w = 0.0876563 * safezoneW; + h = 0.022 * safezoneH; + }; +*/ + //Input fields + + class dUI_af_t_rain: RscEdit + { + idc = 8130; + text = "0"; //--- ToDo: Localize; + x = 0.453595 * safezoneW + safezoneX; + y = 0.3592 * safezoneH + safezoneY; + w = 0.0268126 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_fog: RscEdit + { + idc = 8131; + text = "0"; //--- ToDo: Localize; + x = 0.454626 * safezoneW + safezoneX; + y = 0.4538 * safezoneH + safezoneY; + w = 0.0268126 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_wind: RscEdit + { + idc = 8132; + text = "0"; //--- ToDo: Localize; + x = 0.453594 * safezoneW + safezoneX; + y = 0.5462 * safezoneH + safezoneY; + w = 0.0268126 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_force: RscEdit + { + idc = 8133; + text = "0"; //--- ToDo: Localize; + x = 0.45422 * safezoneW + safezoneX; + y = 0.577748 * safezoneH + safezoneY; + w = 0.0268126 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_waves: RscEdit + { + idc = 8134; + text = "0"; //--- ToDo: Localize; + x = 0.454625 * safezoneW + safezoneX; + y = 0.61 * safezoneH + safezoneY; + w = 0.0268126 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + + class dUI_af_t_dir: RscEdit + { + idc = 8135; + text = "0"; //--- ToDo: Localize; + x = 0.454625 * safezoneW + safezoneX; + y = 0.643 * safezoneH + safezoneY; + w = 0.0268126 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_winda2_x: RscEdit + { + idc = 8136; + text = "x"; //--- ToDo: Localize; + x = 0.454625 * safezoneW + safezoneX; + y = 0.6804 * safezoneH + safezoneY; + w = 0.0268126 * safezoneW; + h = 0.0242 * safezoneH; + }; + + class dUI_af_t_winda2_y: RscEdit + { + idc = 8137; + text = "y"; //--- ToDo: Localize; + x = 0.454626 * safezoneW + safezoneX; + y = 0.7112 * safezoneH + safezoneY; + w = 0.0268126 * safezoneW; + h = 0.0242 * safezoneH; + }; + class dUI_af_t_export: RscEdit + { + idc = 8138; + x = 0.312343 * safezoneW + safezoneX; + y = 0.8234 * safezoneH + safezoneY; + w = 0.0948749 * safezoneW; + h = 0.0264 * safezoneH; + }; + class dUI_af_t_day: RscEdit + { + idc = 8139; + text = "26"; //--- ToDo: Localize; + x = 0.48762 * safezoneW + safezoneX; + y = 0.7882 * safezoneH + safezoneY; + w = 0.0268124 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_month: RscEdit + { + idc = 8140; + text = "1"; //--- ToDo: Localize; + x = 0.516495 * safezoneW + safezoneX; + y = 0.7882 * safezoneH + safezoneY; + w = 0.0268124 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_year: RscEdit + { + idc = 8141; + text = "1985"; //--- ToDo: Localize; + x = 0.54537 * safezoneW + safezoneX; + y = 0.7882 * safezoneH + safezoneY; + w = 0.0268124 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_hours: RscEdit + { + idc = 8142; + text = "24"; //--- ToDo: Localize; + x = 0.48731 * safezoneW + safezoneX; + y = 0.8245 * safezoneH + safezoneY; + w = 0.0268124 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_minutes: RscEdit + { + idc = 8143; + text = "00"; //--- ToDo: Localize; + x = 0.516082 * safezoneW + safezoneX; + y = 0.8245 * safezoneH + safezoneY; + w = 0.0268124 * safezoneW; + h = 0.0242 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + class dUI_af_t_skipTime: RscEdit + { + idc = 8144; + text = "0.5"; //--- ToDo: Localize; + x = 0.637155 * safezoneW + safezoneX; + y = 0.7794 * safezoneH + safezoneY; + w = 0.0278435 * safezoneW; + h = 0.0286 * safezoneH; + colorText[] = {0.79,0.46,0,1}; + }; + //Sliders + class dUI_af_s_lightnings: RscSlider + { + idc = 8150; + x = 0.483519 * safezoneW + safezoneX; + y = 0.2382 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_overcast: RscSlider + { + idc = 8151; + x = 0.4835 * safezoneW + safezoneX; + y = 0.269 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_rainbow: RscSlider + { + idc = 8152; + x = 0.483501 * safezoneW + safezoneX; + y = 0.2976 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_gusts: RscSlider + { + idc = 8153; + x = 0.4835 * safezoneW + safezoneX; + y = 0.3284 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_rain: RscSlider + { + idc = 8154; + x = 0.483501 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_fog_Decay: RscSlider + { + idc = 8155; + x = 0.484532 * safezoneW + safezoneX; + y = 0.4538 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_fog_density: RscSlider + { + idc = 8156; + x = 0.484531 * safezoneW + safezoneX; + y = 0.4208 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_fog_altitude: RscSlider + { + idc = 8157; + x = 0.484046 * safezoneW + safezoneX; + y = 0.48817 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_wind_str: RscSlider + { + idc = 8158; + x = 0.483501 * safezoneW + safezoneX; + y = 0.5462 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_wind_frc: RscSlider + { + idc = 8159; + x = 0.483499 * safezoneW + safezoneX; + y = 0.5792 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_waves: RscSlider + { + idc = 8160; + x = 0.483501 * safezoneW + safezoneX; + y = 0.6122 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + class dUI_af_s_dir: RscSlider + { + idc = 8161; + x = 0.4835 * safezoneW + safezoneX; + y = 0.6452 * safezoneH + safezoneY; + w = 0.195919 * safezoneW; + h = 0.022 * safezoneH; + }; + + //Checkboxes + class dUI_af_b_winda2: RscCheckbox + { + idc = 8170; + x = 0.452564 * safezoneW + safezoneX; + y = 0.742 * safezoneH + safezoneY; + w = 0.0144373 * safezoneW; + h = 0.0264 * safezoneH; + }; + + //Combo + class dUI_af_c_import: RscCombo + { + idc = 8180; + x = 0.312318 * safezoneW + safezoneX; + y = 0.786 * safezoneH + safezoneY; + w = 0.0948858 * safezoneW; + h = 0.0264 * safezoneH; + onLBSelChanged = "_this call rmx_fnc_atmosFearActions;"; + }; + + //Buttons + class dUI_af_btn_rpt: RscShortcutButton + { + idc = 8190; + text = "RPT"; //--- ToDo: Localize; + x = 0.647438 * safezoneW + safezoneX; + y = 0.8168 * safezoneH + safezoneY; + w = 0.0422814 * safezoneW; + h = 0.033 * safezoneH; + onButtonClick = "_this call rmx_fnc_atmosFearActions;"; + tooltip = "Apply changes before exporting to RPT"; + }; + class dUI_af_btn_apply: RscShortcutButton + { + idc = 8191; + text = "Apply"; //--- ToDo: Localize; + x = 0.59175 * safezoneW + safezoneX; + y = 0.8168 * safezoneH + safezoneY; + w = 0.0515625 * safezoneW; + h = 0.033 * safezoneH; + onButtonClick = "_this call rmx_fnc_atmosFearActions;"; + }; + class dUI_af_btn_import: RscButton + { + idc = 8192; + text = "Load"; //--- ToDo: Localize; + x = 0.410281 * safezoneW + safezoneX; + y = 0.786 * safezoneH + safezoneY; + w = 0.0257811 * safezoneW; + h = 0.0264 * safezoneH; + onButtonClick = "_this call rmx_fnc_atmosFearActions;"; + }; + class dUI_af_btn_export: RscButton + { + idc = 8193; + text = "Save"; //--- ToDo: Localize; + x = 0.410281 * safezoneW + safezoneX; + y = 0.8234 * safezoneH + safezoneY; + w = 0.0567187 * safezoneW; + h = 0.0264 * safezoneH; + onButtonClick = "_this call rmx_fnc_atmosFearActions;"; + tooltip = "Apply changes before saving"; + }; + class dUI_af_btn_set: RscButton + { + idc = 8194; + text = "set"; //--- ToDo: Localize; + x = 0.544957 * safezoneW + safezoneX; + y = 0.8245 * safezoneH + safezoneY; + w = 0.0268124 * safezoneW; + h = 0.0242 * safezoneH; + onButtonClick = "_this call rmx_fnc_atmosFearActions;"; + }; + class dUI_af_btn_plus: RscButton + { + idc = 8195; + text = "+"; //--- ToDo: Localize; + x = 0.666031 * safezoneW + safezoneX; + y = 0.7816 * safezoneH + safezoneY; + w = 0.0185621 * safezoneW; + h = 0.0242 * safezoneH; + onButtonClick = "_this call rmx_fnc_atmosFearActions;"; + }; + class dUI_af_btn_minus: RscButton + { + idc = 8196; + text = "-"; //--- ToDo: Localize; + x = 0.615499 * safezoneW + safezoneX; + y = 0.7816 * safezoneH + safezoneY; + w = 0.0185621 * safezoneW; + h = 0.0242 * safezoneH; + onButtonClick = "_this call rmx_fnc_atmosFearActions;"; + }; + class dUI_af_btn_del: RscButton + { + idc = 8197; + text = "Delete"; //--- ToDo: Localize; + x = 0.437093 * safezoneW + safezoneX; + y = 0.786 * safezoneH + safezoneY; + w = 0.0309372 * safezoneW; + h = 0.0264 * safezoneH; + onButtonClick = "_this call rmx_fnc_atmosFearActions;"; + }; + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/console.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/console.hpp new file mode 100644 index 00000000..c85e2689 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/console.hpp @@ -0,0 +1,399 @@ +class dUI_console { + idd = 9100; + enableSimulation = 1; + movingEnable = 1; + class controls { + + class dUI_consoleFrame: RscFrame + { + idc = 9200; + x = 0.00211241 * safezoneW + safezoneX; + y = 0 * safezoneH + safezoneY; + w = 0.244332 * safezoneW; + h = 0.03 * safezoneH; + }; + class dUI_console_text_plain_0: RscText + { + idc = 9201; + text = "Info"; + x = 0.0699683 * safezoneW + safezoneX; + y = 0 * safezoneH + safezoneY; + w = 0.0216566 * safezoneW; + h = 0.0286 * safezoneH; + }; + class dUI_console_text_plain_1: RscText + { + idc = 9202; + text = "Critical"; + x = 0.155556 * safezoneW + safezoneX; + y = 0 * safezoneH + safezoneY; + w = 0.0340316 * safezoneW; + h = 0.0286 * safezoneH; + }; + class dUI_console_text_plain_2: RscText + { + idc = 9203; + text = "Warnings"; + x = 0.101936 * safezoneW + safezoneX; + y = 0 * safezoneH + safezoneY; + w = 0.0433128 * safezoneW; + h = 0.0286 * safezoneH; + }; + class dUI_console_text_plain_3: RscText + { + idc = 9204; + text = "Pause"; + x = 0.200936 * safezoneW + safezoneX; + y = 0 * safezoneH + safezoneY; + w = 0.0340316 * safezoneW; + h = 0.0286 * safezoneH; + }; + class dUI_console_checkbox_0: RscCheckbox + { + idc = 9205; + x = 0.0905927 * safezoneW + safezoneX; + y = 0.0022 * safezoneH + safezoneY; + w = 0.0123751 * safezoneW; + h = 0.022 * safezoneH; + onCheckedChanged = "_this call rmx_fnc_consoleFilters;"; + }; + class dUI_console_checkbox_1: RscCheckbox + { + idc = 9206; + x = 0.144212 * safezoneW + safezoneX; + y = 0.0022 * safezoneH + safezoneY; + w = 0.0123751 * safezoneW; + h = 0.022 * safezoneH; + onCheckedChanged = "_this call rmx_fnc_consoleFilters;"; + }; + class dUI_console_checkbox_2: RscCheckbox + { + idc = 9207; + x = 0.189587 * safezoneW + safezoneX; + y = 0.0022 * safezoneH + safezoneY; + w = 0.0123751 * safezoneW; + h = 0.022 * safezoneH; + onCheckedChanged = "_this call rmx_fnc_consoleFilters;"; + }; + class dUI_console_checkbox_3: RscCheckbox + { + idc = 9208; + x = 0.229813 * safezoneW + safezoneX; + y = 0.0021 * safezoneH + safezoneY; + w = 0.0123751 * safezoneW; + h = 0.022 * safezoneH; + onCheckedChanged = "_this call rmx_fnc_consoleFilters;"; + }; + class dUI_console_button_0: RscButton + { + idc = 9209; + text = "-"; + x = 0.0320173 * safezoneW + safezoneX; + y = 0.0022 * safezoneH + safezoneY; + w = 0.0175308 * safezoneW; + h = 0.0264 * safezoneH; + onButtonClick = "_this call rmx_fnc_consoleFilters;"; + }; + class dUI_console_button_1: RscButton + { + idc = 9210; + text = "+"; + x = 0.0503738 * safezoneW + safezoneX; + y = 0.0022 * safezoneH + safezoneY; + w = 0.0175308 * safezoneW; + h = 0.0264 * safezoneH; + onButtonClick = "_this call rmx_fnc_consoleFilters;"; + }; + class dUI_console_button_3: RscButton + { + idc = 9211; + text = "Clear"; + x = 0.00396872 * safezoneW + safezoneX; + y = 0.0021 * safezoneH + safezoneY; + w = 0.0268124 * safezoneW; + h = 0.0264 * safezoneH; + onButtonClick = "_this call rmx_fnc_consoleFilters;"; + }; + + class dUI_consoleGroup: RscControlsGroup + { + idc = 9050; + x = 0 * safezoneW + safezoneX; + y = 0 * safezoneH + safezoneY; + w = 1 * safezoneW; + h = 0 * safezoneH; + colorBackground[] = {0,0,0,0}; + shadow=0; + + class VScrollbar + { + width = 0.02; + autoScrollSpeed = 1; + autoScrollDelay = 2; + autoScrollRewind = 0; + shadow=0; + }; + + class HScrollbar + { + height = 0; + shadow=0; + }; + + class ScrollBar + { + color[] = {1,1,1,0.6}; + colorActive[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.3}; + thumb = "#(argb,8,8,3)color(1,1,1,1)"; + arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)"; + arrowFull = "#(argb,8,8,3)color(1,1,1,1)"; + border = "#(argb,8,8,3)color(1,1,1,1)"; + }; + + class controls + { + class dUI_console_text_0: dUI_ConsoleText + { + idc = 9000; + y = 0 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_1: dUI_ConsoleText + { + idc = 9001; + y = 0.025 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_2: dUI_ConsoleText + { + idc = 9002; + y = 0.05 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_3: dUI_ConsoleText + { + idc = 9003; + y = 0.075 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_4: dUI_ConsoleText + { + idc = 9004; + y = 0.1 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_5: dUI_ConsoleText + { + idc = 9005; + y = 0.125 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_6: dUI_ConsoleText + { + idc = 9006; + y = 0.15 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_7: dUI_ConsoleText + { + idc = 9007; + y = 0.175 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_8: dUI_ConsoleText + { + idc = 9008; + y = 0.2 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_9: dUI_ConsoleText + { + idc = 9009; + y = 0.225 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_10: dUI_ConsoleText + { + idc = 9010; + y = 0.25 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_11: dUI_ConsoleText + { + idc = 9011; + y = 0.275 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_12: dUI_ConsoleText + { + idc = 9012; + y = 0.3 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_13: dUI_ConsoleText + { + idc = 9013; + y = 0.325 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_14: dUI_ConsoleText + { + idc = 9014; + y = 0.35 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_15: dUI_ConsoleText + { + idc = 9015; + y = 0.375 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_16: dUI_ConsoleText + { + idc = 9016; + y = 0.4 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_17: dUI_ConsoleText + { + idc = 9017; + y = 0.425 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_18: dUI_ConsoleText + { + idc = 9018; + y = 0.45 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_19: dUI_ConsoleText + { + idc = 9019; + y = 0.475 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_20: dUI_ConsoleText + { + idc = 9020; + y = 0.5 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_21: dUI_ConsoleText + { + idc = 9021; + y = 0.525 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_22: dUI_ConsoleText + { + idc = 9022; + y = 0.55 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_23: dUI_ConsoleText + { + idc = 9023; + y = 0.575 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_24: dUI_ConsoleText + { + idc = 9024; + y = 0.6 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_25: dUI_ConsoleText + { + idc = 9025; + y = 0.625 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_26: dUI_ConsoleText + { + idc = 9026; + y = 0.65 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_27: dUI_ConsoleText + { + idc = 9027; + y = 0.675 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_28: dUI_ConsoleText + { + idc = 9028; + y = 0.7 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_29: dUI_ConsoleText + { + idc = 9029; + y = 0.725 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_30: dUI_ConsoleText + { + idc = 9030; + y = 0.75 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_31: dUI_ConsoleText + { + idc = 9031; + y = 0.775 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_32: dUI_ConsoleText + { + idc = 9032; + y = 0.8 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_33: dUI_ConsoleText + { + idc = 9033; + y = 0.825 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_34: dUI_ConsoleText + { + idc = 9034; + y = 0.85 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_35: dUI_ConsoleText + { + idc = 9035; + y = 0.875 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_36: dUI_ConsoleText + { + idc = 9036; + y = 0.9 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_37: dUI_ConsoleText + { + idc = 9037; + y = 0.925 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + class dUI_console_text_38: dUI_ConsoleText + { + idc = 9038; + y = 0.95 * safeZoneH; + colorBackground[] = {0.2,0.2,0.2,0.31}; + }; + class dUI_console_text_39: dUI_ConsoleText + { + idc = 9039; + y = 0.975 * safeZoneH; + colorBackground[] = {0.3,0.3,0.3,0.31}; + }; + }; + }; + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/console2.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/console2.hpp new file mode 100644 index 00000000..097ccf73 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/console2.hpp @@ -0,0 +1,7 @@ +class dUI_console2: dUI_console +{ + duration = 1e+1000; + fadein = 0.5; + fadeout = 0.5; + onLoad = "uiNamespace setVariable ['rmx_var_console2',_this select 0]"; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/editor.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/editor.hpp new file mode 100644 index 00000000..82e66c3a --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/editor.hpp @@ -0,0 +1,229 @@ +/* #Wekeqo +$[ + 1.063, + ["console",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], + [-2200,"bgrnd",[0,"",[0,-3.72529e-009,0.95,1],[-1,-1,-1,-1],[0.2,0.2,0.2,0.2],[-1,-1,-1,-1],"","-1"],[]], + [-1000,"title",[0,"Code Editor",[0,0,0.95,0.04],[-1,-1,-1,-1],[1,0.5,0,1],[-1,-1,-1,-1],"","-1"],[]], + [1400,"",[0,"",[0.025,0.12,0.9025,0.8],[-1,-1,-1,-1],[0.5,0.5,0.5,1],[-1,-1,-1,-1],"","-1"],[]], + [1600,"tab1",[0,"Tab1",[0.025,0.08,0.0975,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1601,"tab2",[0,"Tab2",[0.125,0.08,0.0975,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1602,"tab3",[0,"Tab3",[0.225,0.08,0.0975,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1603,"",[0,"Tab4",[0.325,0.08,0.0985,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1604,"",[0,"Tab5",[0.425,0.08,0.0975,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1605,"",[0,"Tab6",[0.525,0.08,0.0975,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1606,"",[0,"Tab7",[0.625,0.08,0.0975,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1607,"",[0,"Tab8",[0.725,0.08,0.0975,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1608,"",[0,"Tab9",[0.825,0.08,0.1025,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1001,"txt",[0,"Transparency",[0.005,0.94,0.14,0.036],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1900,"",[0,"",[0.155,0.928,0.39,0.068],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1609,"hide",[0,"_",[0.875,0,0.075,0.04],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1610,"Execute",[0,"Execute",[0.825,0.92,0.1025,0.08],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1611,"save",[0,"Save Tabs",[0.7,0.92,0.1025,0.08],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1612,"clear",[0,"Clear Tab",[0.575,0.92,0.1025,0.08],[1,0.5,0,1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]] +] +*/ + +class dUI_editor { + idd = 7100; + enableSimulation = 1; + movingEnable = 1; + onLoad = "'load' call rmx_fnc_codeEditorActions"; + onUnload = "'unload' call rmx_fnc_codeEditorActions"; + class controls { + class ce_bgrnd: IGUIBack + { + idc = 7200; + x = 0; + y = -3.72529e-009; + w = 0.95; + h = 1; + colorBackground[] = {0.2,0.2,0.2,1}; + moving = 1; + }; + class ce_title: RscText + { + idc = 7300; + text = "Code Editor"; //--- ToDo: Localize; + x = 0; + y = 0; + w = 0.95; + h = 0.04; + colorBackground[] = {1,0.5,0,1}; + moving = 1; + }; + class ce_editBox: RscEdit + { + idc = 7201; + x = 0.025; + y = 0.125; + w = 0.9025; + h = 0.7925; + colorBackground[] = {0.3,0.3,0.3,0.1}; + style = 16; + lineSpacing = 1; + colorText[] = {1,1,1,1}; + sizeEx = 0.05; + }; + class ce_tab0: RscButton + { + idc = 7202; + text = "Alfa"; //--- ToDo: Localize; + x = 0.025; + y = 0.08; + w = 0.0975; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 0] call rmx_fnc_codeEditorActions"; + }; + class ce_tab1: RscButton + { + idc = 7203; + text = "Bravo"; //--- ToDo: Localize; + x = 0.125; + y = 0.08; + w = 0.0975; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 1] call rmx_fnc_codeEditorActions"; + }; + class ce_tab2: RscButton + { + idc = 7204; + text = "Charlie"; //--- ToDo: Localize; + x = 0.225; + y = 0.08; + w = 0.0975; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 2] call rmx_fnc_codeEditorActions"; + }; + class ce_tab3: RscButton + { + idc = 7205; + text = "Delta"; //--- ToDo: Localize; + x = 0.325; + y = 0.08; + w = 0.0985; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 3] call rmx_fnc_codeEditorActions"; + }; + class ce_tab4: RscButton + { + idc = 7206; + text = "Echo"; //--- ToDo: Localize; + x = 0.425; + y = 0.08; + w = 0.0975; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 4] call rmx_fnc_codeEditorActions"; + }; + class ce_tab5: RscButton + { + idc = 7207; + text = "Foxtrot"; //--- ToDo: Localize; + x = 0.525; + y = 0.08; + w = 0.0975; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 5] call rmx_fnc_codeEditorActions"; + }; + class ce_tab6: RscButton + { + idc = 7208; + text = "Golf"; //--- ToDo: Localize; + x = 0.625; + y = 0.08; + w = 0.0975; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 6] call rmx_fnc_codeEditorActions"; + }; + class ce_tab7: RscButton + { + idc = 7209; + text = "Hotel"; //--- ToDo: Localize; + x = 0.725; + y = 0.08; + w = 0.0975; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 7] call rmx_fnc_codeEditorActions"; + }; + class ce_tab8: RscButton + { + idc = 7210; + text = "India"; //--- ToDo: Localize; + x = 0.825; + y = 0.08; + w = 0.1025; + h = 0.04; + colorText[] = {0.2,0.2,0.2,0.4}; + action = "['tabs', 8] call rmx_fnc_codeEditorActions"; + }; + class ce_txt: RscText + { + idc = 7211; + text = "Transparency"; //--- ToDo: Localize; + x = 0.005; + y = 0.94; + w = 0.14; + h = 0.036; + }; + class ce_slidhur: RscSlider + { + idc = 7212; + x = 0.155; + y = 0.928; + w = 0.265; + h = 0.068; + onMouseButtonUp = "'slider' call rmx_fnc_codeEditorActions"; + }; + class ce_btn_Client: RscButton + { + idc = 7213; + text = "Client"; //--- ToDo: Localize; + x = 0.825; + y = 0.92; + w = 0.1025; + h = 0.08; + colorText[] = {1,0.5,0,1}; + action = "'exec_client' call rmx_fnc_codeEditorActions"; + }; + class ce_btn_save: RscButton + { + idc = 7214; + text = "Save Tab"; //--- ToDo: Localize; + x = 0.5725; + y = 0.92; + w = 0.1025; + h = 0.08; + colorText[] = {1,0.5,0,1}; + action = "'save' call rmx_fnc_codeEditorActions"; + }; + class ce_btn_clear: RscButton + { + idc = 7215; + text = "Clear Tab"; //--- ToDo: Localize; + x = 0.4475; + y = 0.92; + w = 0.1025; + h = 0.08; + colorText[] = {1,0.5,0,1}; + action = "'clear' call rmx_fnc_codeEditorActions"; + }; + class ce_btn_Server: RscButton + { + idc = 7216; + text = "Server"; //--- ToDo: Localize; + x = 0.6975; + y = 0.92; + w = 0.1025; + h = 0.08; + colorText[] = {1,0.5,0,1}; + action = "'exec_server' call rmx_fnc_codeEditorActions"; + }; + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/gui_dependencies.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/gui_dependencies.hpp new file mode 100644 index 00000000..0af285f0 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/gui_dependencies.hpp @@ -0,0 +1,103 @@ +class RscPicture; +class RscButton; +class RscProgress; +class RscCombo; +class RscListBox; +class ScrollBar; +class HScrollbar; +class VScrollbar; +class RscText; +class RscStructuredText; +class RscShortcutButton; +class RscIGUIShortcutButton; +class RscGearShortcutButton; +class IGUIBack; +class CA_Title; +class RscControlsGroup; +class RscActiveText; +class RscLineBreak; +class RscIGUIListNBox; +class Attributes; +class RscFrame; +class RscCheckbox; +class RscEdit; +class RscSlider; + +//Fucking ninja cancer new to A3? +class RscActivePicture; +class RscActivePictureKeepAspect; + +class dUI_ConsoleText { //structured text for console + idc = -1; + type = 13; // defined constant + style = 0x00; + colorBackground[] = {0.2,0.2,0.2,0.7}; + x = 0 * safezoneW; + y = 0 * safezoneH; + w = 1 * safezoneW; + h = 0.025 * safezoneH; + size = 0.02; + text = ""; + + class Attributes { + font = "LucidaConsoleB"; //https://community.bistudio.com/wiki/File:Arma3Fonts.png + color = "#000000"; + align = "left"; //align of text. Values can be "left", "center" or "right" + valign = "middle"; //vertical align of text. Values can be "top", "middle", "bottom". + shadow = false; + shadowColor = "#ff0000"; + size = "1.25"; + }; +}; + +class dUI_rscText: RscText { + style = 0x02; + shadow = 2; +}; + +class dUI_sandbox { + idd = 666666; + enableSimulation = 1; + //movingEnable = 1; + class controls {}; +}; + +class rmx_ST3 +{ + x=0; + y=0; + h=0.035; + w=0.1; + text=""; + //size="(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + size = 0.04; + colorText[]={1,1,1,1}; + colorBackground[] = {0.2,0.2,0.2,0.7}; + shadow=2; + type = 13; + style = 0x02; + class Attributes + { + font="PuristaMedium"; // "RobotoCondensed"; + color="#ffffff"; + colorLink="#D09B43"; + align="center"; + valign = "top" + shadow=2; + }; +}; + +class rmx_watcherProgress: RscProgress +{ + idc = -1; + texture = "#(argb,8,8,3)color(1,1,1,1)"; + textureExt = ""; + colorBar[] = {1, 1, 1, 0.1}; + colorExtBar[] = {1, 1, 1, 1}; + colorFrame[] = {1, 1, 1, 1}; + x = 0.6; + y = 0.92; + w = 0.3; + h = 0.08; + +}; diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/ppEffects.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/ppEffects.hpp new file mode 100644 index 00000000..4db8d1c5 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/ppEffects.hpp @@ -0,0 +1,1213 @@ +class dUI_ppEffects { + idd = 6100; + enableSimulation = 1; + movingEnable = 1; + onKeyDown = "_this call rmx_fnc_keyDown;"; + onUnload = "['unload'] call rmx_fnc_ppViewerUpdate;"; + + class controls { + //category background + class cat_bckgrnd: IGUIBack + { + idc = -1; + x = 0.33499 * safezoneW + safezoneX; + y = 0.247 * safezoneH + safezoneY; + w = 0.331031 * safezoneW; + h = 0.0704 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //category text + class cat_logo: RscText + { + idc = -1; + text = "ppEffects Viewer"; //--- ToDo: Localize; + x = 0.33499 * safezoneW + safezoneX; + y = 0.225 * safezoneH + safezoneY; + w = 0.331051 * safezoneW; + h = 0.022 * safezoneH; + colorText[] = {0.76,0.98,0.27,1}; + colorBackground[] = {0,0,0,1}; + }; + class cat_txt: RscText + { + idc = -1; + text = "Category:"; //--- ToDo: Localize; + x = 0.337052 * safezoneW + safezoneX; + y = 0.2602 * safezoneH + safezoneY; + w = 0.0422813 * safezoneW; + h = 0.0198 * safezoneH; + }; + + + //category combo + class cat_combo: RscCombo + { + idc = 6110; + x = 0.385523 * safezoneW + safezoneX; + y = 0.258 * safezoneH + safezoneY; + w = 0.0938438 * safezoneW; + h = 0.022 * safezoneH; + onLBSelChanged = "_this call rmx_fnc_ppViewerUpdate;"; + }; + class cat_load_combo: RscCombo + { + idc = 6111; + x = 0.484529 * safezoneW + safezoneX; + y = 0.258 * safezoneH + safezoneY; + w = 0.0938436 * safezoneW; + h = 0.022 * safezoneH; + onLBSelChanged = "_this call rmx_fnc_ppViewerUpdate;"; + }; + + //category edit + class cat_edit: RscEdit + { + idc = 6120; + x = 0.484544 * safezoneW + safezoneX; + y = 0.291 * safezoneH + safezoneY; + w = 0.0938436 * safezoneW; + h = 0.0242 * safezoneH; + }; + + //category buttons + class cat_btn_Load: RscShortcutButton + { + idc = 6130; + text = "Load"; //--- ToDo: Localize; + x = 0.581386 * safezoneW + safezoneX; + y = 0.2558 * safezoneH + safezoneY; + w = 0.0433128 * safezoneW; + h = 0.0286 * safezoneH; + onButtonClick = "'import' call rmx_fnc_ppViewerGetSet;"; + }; + class cat_btn_save: RscShortcutButton + { + idc = 6131; + text = "Save"; //--- ToDo: Localize; + x = 0.581481 * safezoneW + safezoneX; + y = 0.2888 * safezoneH + safezoneY; + w = 0.0433128 * safezoneW; + h = 0.0286 * safezoneH; + onButtonClick = "'export' call rmx_fnc_ppViewerGetSet;"; + }; + class cat_btn_disable: RscShortcutButton + { + idc = 6132; + text = "Disable"; //--- ToDo: Localize; + x = 0.335057 * safezoneW + safezoneX; + y = 0.2888 * safezoneH + safezoneY; + w = 0.048469 * safezoneW; + h = 0.0286 * safezoneH; + onButtonClick = "_this call rmx_fnc_ppViewerUpdate;"; + }; + class cat_btn_random: RscShortcutButton + { + idc = 6133; + text = "RND"; //--- ToDo: Localize; + x = 0.444295 * safezoneW + safezoneX; + y = 0.2888 * safezoneH + safezoneY; + w = 0.0350628 * safezoneW; + h = 0.0286 * safezoneH; + onButtonClick = "_this call rmx_fnc_ppViewerUpdate;"; + }; + class cat_btn_del: RscShortcutButton + { + idc = 6134; + text = "DEL"; //--- ToDo: Localize; + x = 0.626845 * safezoneW + safezoneX; + y = 0.2558 * safezoneH + safezoneY; + w = 0.0391878 * safezoneW; + h = 0.0286 * safezoneH; + onButtonClick = "_this call rmx_fnc_ppViewerUpdate;"; + }; + class cat_btn_rpt: RscShortcutButton + { + idc = 6135; + text = "RPT"; //--- ToDo: Localize; + x = 0.626847 * safezoneW + safezoneX; + y = 0.2888 * safezoneH + safezoneY; + w = 0.0391878 * safezoneW; + h = 0.0286 * safezoneH; + onButtonClick = "_this call rmx_fnc_ppViewerUpdate;"; + }; + class cat_btn_resetALL: RscShortcutButton + { + idc = 6136; + text = "Reset ALL"; //--- ToDo: Localize; + x = 0.383726 * safezoneW + safezoneX; + y = 0.288652 * safezoneH + safezoneY; + w = 0.0598124 * safezoneW; + h = 0.0286 * safezoneH; + onButtonClick = "_this call rmx_fnc_ppViewerUpdate;"; + }; + + //color correction + //background + class cc_bckgrnd: IGUIBack + { + idc = 6210; + + x = 0.335 * safezoneW + safezoneX; + y = 0.335 * safezoneH + safezoneY; + w = 0.33 * safezoneW; + h = 0.33 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //text + class cc_txt_brightness: RscText + { + idc = 6220; + + text = "Brightness"; //--- ToDo: Localize; + x = 0.362838 * safezoneW + safezoneX; + y = 0.357 * safezoneH + safezoneY; + w = 0.048469 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_contrast: RscText + { + idc = 6221; + + text = "Contrast"; //--- ToDo: Localize; + x = 0.480516 * safezoneW + safezoneX; + y = 0.356711 * safezoneH + safezoneY; + w = 0.0391878 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_offset: RscText + { + idc = 6222; + + text = "Offset"; //--- ToDo: Localize; + x = 0.597874 * safezoneW + safezoneX; + y = 0.358333 * safezoneH + safezoneY; + w = 0.0360941 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_blend: RscText + { + idc = 6223; + + text = "Blend (RGBA)"; //--- ToDo: Localize; + x = 0.353565 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.0690937 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_colorize1: RscText + { + idc = 6224; + + text = "Colorize (RGBA)"; //--- ToDo: Localize; + x = 0.463909 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.0690937 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_colorize2: RscText + { + idc = 6225; + + text = "Colorize (RGBA)"; //--- ToDo: Localize; + x = 0.577344 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.0690937 * safezoneW; + h = 0.0176 * safezoneH; + }; + + //Sliders + class cc_slider_brightness: RscSlider + { + idc = 6230; + + x = 0.337062 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class cc_slider_contrast: RscSlider + { + idc = 6231; + + x = 0.450501 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_offset: RscSlider + { + idc = 6232; + + x = 0.563939 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_bR: RscSlider + { + idc = 6233; + + x = 0.337063 * safezoneW + safezoneX; + y = 0.4714 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_bG: RscSlider + { + idc = 6234; + + x = 0.337062 * safezoneW + safezoneX; + y = 0.5154 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_bB: RscSlider + { + idc = 6235; + + x = 0.337062 * safezoneW + safezoneX; + y = 0.5594 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_bA: RscSlider + { + idc = 6236; + + x = 0.337062 * safezoneW + safezoneX; + y = 0.6034 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_c1R: RscSlider + { + idc = 6237; + + x = 0.4505 * safezoneW + safezoneX; + y = 0.4714 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_c1G: RscSlider + { + idc = 6238; + + x = 0.450501 * safezoneW + safezoneX; + y = 0.5154 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_c1B: RscSlider + { + idc = 6239; + + x = 0.4505 * safezoneW + safezoneX; + y = 0.5594 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_c1A: RscSlider + { + idc = 6240; + + x = 0.450501 * safezoneW + safezoneX; + y = 0.6034 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_c2R: RscSlider + { + idc = 6241; + + x = 0.563938 * safezoneW + safezoneX; + y = 0.4714 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_c2G: RscSlider + { + idc = 6242; + + x = 0.564551 * safezoneW + safezoneX; + y = 0.516089 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_c2B: RscSlider + { + idc = 6243; + + x = 0.56403 * safezoneW + safezoneX; + y = 0.559607 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_c2A: RscSlider + { + idc = 6244; + + x = 0.564562 * safezoneW + safezoneX; + y = 0.602896 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + //vignette pre + //text + class cc_txt_vignette: RscText + { + idc = 6250; + + text = "Vignette effect"; //--- ToDo: Localize; + x = 0.358722 * safezoneW + safezoneX; + y = 0.6452 * safezoneH + safezoneY; + w = 0.0690937 * safezoneW; + h = 0.0176 * safezoneH; + }; + + //checkbox + class cc_bool_vignette: RscCheckbox + { + idc = 6251; + x = 0.342218 * safezoneW + safezoneX; + y = 0.6386 * safezoneH + safezoneY; + w = 0.0175312 * safezoneW; + h = 0.0308 * safezoneH; + onCheckedChanged = "_this call rmx_fnc_ppViewerUpdate;"; + }; + + //CC vignette + //background + class cc_v_bckgrnd: IGUIBack + { + idc = 6260; + + x = 0.335 * safezoneW + safezoneX; + y = 0.687 * safezoneH + safezoneY; + w = 0.33 * safezoneW; + h = 0.187 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //text + class cc_txt_vHS: RscText + { + idc = 6270; + + text = "H Size:"; //--- ToDo: Localize; + x = 0.337062 * safezoneW + safezoneX; + y = 0.6914 * safezoneH + safezoneY; + w = 0.0474377 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_vVS: RscText + { + idc = 6271; + + text = "V Size:"; //--- ToDo: Localize; + x = 0.337062 * safezoneW + safezoneX; + y = 0.7354 * safezoneH + safezoneY; + w = 0.048469 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_vUnknown: RscText + { + idc = 6272; + + text = "?"; //--- ToDo: Localize; + x = 0.337062 * safezoneW + safezoneX; + y = 0.7794 * safezoneH + safezoneY; + w = 0.0680624 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_vhP: RscText + { + idc = 6273; + + text = "H Pos:"; //--- ToDo: Localize; + x = 0.512372 * safezoneW + safezoneX; + y = 0.6914 * safezoneH + safezoneY; + w = 0.0474377 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_vVP: RscText + { + idc = 6274; + + text = "V Pos:"; //--- ToDo: Localize; + x = 0.512372 * safezoneW + safezoneX; + y = 0.734607 * safezoneH + safezoneY; + w = 0.048469 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_vSTR: RscText + { + idc = 6275; + + text = "Strength:"; //--- ToDo: Localize; + x = 0.512374 * safezoneW + safezoneX; + y = 0.7794 * safezoneH + safezoneY; + w = 0.048469 * safezoneW; + h = 0.0176 * safezoneH; + }; + class cc_txt_vA: RscText + { + idc = 6276; + + text = "Alpha:"; //--- ToDo: Localize; + x = 0.441215 * safezoneW + safezoneX; + y = 0.8256 * safezoneH + safezoneY; + w = 0.0319691 * safezoneW; + h = 0.0176 * safezoneH; + }; + + //sliders + class cc_slider_vHS: RscSlider + { + idc = 6280; + + x = 0.388629 * safezoneW + safezoneX; + y = 0.6914 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class cc_slider_vVS: RscSlider + { + idc = 6281; + + x = 0.388631 * safezoneW + safezoneX; + y = 0.7354 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class cc_slider_vUnknown: RscSlider + { + idc = 6282; + + x = 0.388629 * safezoneW + safezoneX; + y = 0.7794 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_vHP: RscSlider + { + idc = 6283; + + x = 0.564969 * safezoneW + safezoneX; + y = 0.6914 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class cc_slider_vVP: RscSlider + { + idc = 6284; + + x = 0.563937 * safezoneW + safezoneX; + y = 0.7354 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class cc_slider_vSTR: RscSlider + { + idc = 6285; + + x = 0.564052 * safezoneW + safezoneX; + y = 0.7794 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class cc_slider_vA: RscSlider + { + idc = 6286; + + x = 0.476281 * safezoneW + safezoneX; + y = 0.8256 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + //Chromatic aberation + //background + + class ca_bckgrnd: IGUIBack + { + idc = 6310; + + x = 0.335 * safezoneW + safezoneX; + y = 0.335 * safezoneH + safezoneY; + w = 0.33 * safezoneW; + h = 0.066 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //text + class ca_txt_X: RscText + { + idc = 6320; + + text = "X:"; //--- ToDo: Localize; + x = 0.337064 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0134063 * safezoneW; + h = 0.0176 * safezoneH; + }; + class ca_txt_Y: RscText + { + idc = 6321; + + text = "Y:"; //--- ToDo: Localize; + x = 0.461012 * safezoneW + safezoneX; + y = 0.362037 * safezoneH + safezoneY; + w = 0.0134063 * safezoneW; + h = 0.0176 * safezoneH; + }; + class ca_txt_AR: RscText + { + idc = 6322; + + text = "Aspect Ratio:"; //--- ToDo: Localize; + x = 0.584562 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0587812 * safezoneW; + h = 0.0176 * safezoneH; + }; + //sliders + class ca_slider_x: RscSlider + { + idc = 6330; + + x = 0.357687 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class ca_slider_y: RscSlider + { + idc = 6331; + + x = 0.481439 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + //checkbox + class ca_cb: RscCheckbox + { + idc = 6340; + x = 0.645406 * safezoneW + safezoneX; + y = 0.3548 * safezoneH + safezoneY; + w = 0.0175312 * safezoneW; + h = 0.0308 * safezoneH; + onCheckedChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + + //Film grain + //background + class fg_bckgrnd: IGUIBack + { + idc = 6410; + + x = 0.335 * safezoneW + safezoneX; + y = 0.335 * safezoneH + safezoneY; + w = 0.33 * safezoneW; + h = 0.154 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //text + class fg_txt_sharpness: RscText + { + idc = 6420; + + text = "Sharpness"; //--- ToDo: Localize; + x = 0.476279 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0464065 * safezoneW; + h = 0.0176 * safezoneH; + }; + class fg_txt_intensity: RscText + { + idc = 6421; + + text = "Intensity"; //--- ToDo: Localize; + x = 0.368002 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0464065 * safezoneW; + h = 0.0176 * safezoneH; + }; + class fg_txt_GS: RscText + { + idc = 6422; + + text = "Grain Size"; //--- ToDo: Localize; + x = 0.588687 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0464065 * safezoneW; + h = 0.0176 * safezoneH; + }; + class fg_txt_intensityx0: RscText + { + idc = 6423; + + text = "Intensity X0"; //--- ToDo: Localize; + x = 0.357688 * safezoneW + safezoneX; + y = 0.4274 * safezoneH + safezoneY; + w = 0.0546564 * safezoneW; + h = 0.0176 * safezoneH; + }; + class fg_txt_intensityx1: RscText + { + idc = 6424; + + text = "Intensity X1"; //--- ToDo: Localize; + x = 0.471122 * safezoneW + safezoneX; + y = 0.4274 * safezoneH + safezoneY; + w = 0.0546564 * safezoneW; + h = 0.0176 * safezoneH; + }; + class fg_txt_mono: RscText + { + idc = 6425; + + text = "Monochromic:"; //--- ToDo: Localize; + x = 0.572185 * safezoneW + safezoneX; + y = 0.4494 * safezoneH + safezoneY; + w = 0.0587812 * safezoneW; + h = 0.0176 * safezoneH; + }; + //sliders + class fg_slider_sharpness: RscSlider + { + idc = 6430; + + x = 0.450501 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class fg_slider_intensity: RscSlider + { + idc = 6431; + + x = 0.337062 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class fg_slider_gs: RscSlider + { + idc = 6432; + + x = 0.563937 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class fg_slider_intensityx0: RscSlider + { + idc = 6433; + + x = 0.337064 * safezoneW + safezoneX; + y = 0.4494 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class fg_slider_intensityx1: RscSlider + { + idc = 6434; + + x = 0.450489 * safezoneW + safezoneX; + y = 0.44977 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + //checkbox + class fg_bool: RscCheckbox + { + idc = 6440; + x = 0.630971 * safezoneW + safezoneX; + y = 0.4428 * safezoneH + safezoneY; + w = 0.0175312 * safezoneW; + h = 0.0308 * safezoneH; + onCheckedChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + //Radial blur + //background + class rb_bckgrnd: IGUIBack + { + idc = 6510; + + x = 0.335 * safezoneW + safezoneX; + y = 0.335 * safezoneH + safezoneY; + w = 0.33 * safezoneW; + h = 0.11 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //text + class rb_txt_rX: RscText + { + idc = 6520; + + text = "Relative X:"; //--- ToDo: Localize; + x = 0.337064 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0505312 * safezoneW; + h = 0.0176 * safezoneH; + }; + class rb_txt_rY: RscText + { + idc = 6521; + + text = "Relative Y:"; //--- ToDo: Localize; + x = 0.502066 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0505312 * safezoneW; + h = 0.0176 * safezoneH; + }; + class rb_txt_cX: RscText + { + idc = 6522; + + text = "Centre X:"; //--- ToDo: Localize; + x = 0.337064 * safezoneW + safezoneX; + y = 0.4054 * safezoneH + safezoneY; + w = 0.0505312 * safezoneW; + h = 0.0176 * safezoneH; + }; + class rb_txt_cY: RscText + { + idc = 6523; + + text = "Centre Y:"; //--- ToDo: Localize; + x = 0.502063 * safezoneW + safezoneX; + y = 0.4054 * safezoneH + safezoneY; + w = 0.0505312 * safezoneW; + h = 0.0176 * safezoneH; + }; + + //sliders + class rb_slider_rX: RscSlider + { + idc = 6530; + + x = 0.398937 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class rb_slider_rY: RscSlider + { + idc = 6531; + + x = 0.563938 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class rb_slider_cX: RscSlider + { + idc = 6532; + + x = 0.398937 * safezoneW + safezoneX; + y = 0.4054 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class rb_slider_cY: RscSlider + { + idc = 6533; + + x = 0.563937 * safezoneW + safezoneX; + y = 0.4054 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + //Water distrortion + //background + class wd_bckgrnd: IGUIBack + { + idc = 6610; + + x = 0.335 * safezoneW + safezoneX; + y = 0.335 * safezoneH + safezoneY; + w = 0.33 * safezoneW; + h = 0.308 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //text + class wd_txt_blur: RscText + { + idc = 6620; + + text = "Blurriness"; //--- ToDo: Localize; + x = 0.365935 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0505312 * safezoneW; + h = 0.0176 * safezoneH; + }; + class wd_txt_sT: RscText + { + idc = 6621; + + text = "Strength Top"; //--- ToDo: Localize; + x = 0.469066 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0598124 * safezoneW; + h = 0.0176 * safezoneH; + }; + class wd_txt_sB: RscText + { + idc = 6622; + + text = "Strength Bottom"; //--- ToDo: Localize; + x = 0.575282 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0732187 * safezoneW; + h = 0.0176 * safezoneH; + }; + class wd_txt_wS: RscText + { + idc = 6623; + + text = "Wave speed"; //--- ToDo: Localize; + x = 0.357687 * safezoneW + safezoneX; + y = 0.4494 * safezoneH + safezoneY; + w = 0.0567186 * safezoneW; + h = 0.0176 * safezoneH; + }; + class wd_txt_wA: RscText + { + idc = 6624; + + text = "Wave amplitudes"; //--- ToDo: Localize; + x = 0.461842 * safezoneW + safezoneX; + y = 0.4494 * safezoneH + safezoneY; + w = 0.0763125 * safezoneW; + h = 0.0176 * safezoneH; + }; + class wd_txt_PC: RscText + { + idc = 6625; + + text = "Phase Coefficients"; //--- ToDo: Localize; + x = 0.572189 * safezoneW + safezoneX; + y = 0.4494 * safezoneH + safezoneY; + w = 0.0835313 * safezoneW; + h = 0.0176 * safezoneH; + }; + + //sliders + class wd_slider_blur: RscSlider + { + idc = 6630; + + x = 0.337064 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class wd_slider_sT: RscSlider + { + idc = 6631; + + x = 0.4505 * safezoneW + safezoneX; + y = 0.383333 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_sB: RscSlider + { + idc = 6632; + + x = 0.564041 * safezoneW + safezoneX; + y = 0.382756 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + class wd_slider_wS1: RscSlider + { + idc = 6633; + + x = 0.337063 * safezoneW + safezoneX; + y = 0.4714 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_wS2: RscSlider + { + idc = 6634; + + x = 0.337468 * safezoneW + safezoneX; + y = 0.515511 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_wS3: RscSlider + { + idc = 6635; + + x = 0.336958 * safezoneW + safezoneX; + y = 0.55903 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_wS4: RscSlider + { + idc = 6636; + + x = 0.336958 * safezoneW + safezoneX; + y = 0.602896 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_wA1: RscSlider + { + idc = 6637; + + x = 0.45051 * safezoneW + safezoneX; + y = 0.470719 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_wA2: RscSlider + { + idc = 6638; + + x = 0.4505 * safezoneW + safezoneX; + y = 0.5154 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_wA3: RscSlider + { + idc = 6639; + + x = 0.45102 * safezoneW + safezoneX; + y = 0.55903 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_wA4: RscSlider + { + idc = 6640; + + x = 0.4505 * safezoneW + safezoneX; + y = 0.603704 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_pC1: RscSlider + { + idc = 6641; + + x = 0.563938 * safezoneW + safezoneX; + y = 0.4714 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_pC2: RscSlider + { + idc = 6642; + + x = 0.563937 * safezoneW + safezoneX; + y = 0.5154 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_pC3: RscSlider + { + idc = 6643; + + x = 0.563937 * safezoneW + safezoneX; + y = 0.5594 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class wd_slider_pC4: RscSlider + { + idc = 6644; + + x = 0.563938 * safezoneW + safezoneX; + y = 0.6034 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + //Dynamic blur + //background + class db_bckgrnd: IGUIBack + { + idc = 6710; + + x = 0.335 * safezoneW + safezoneX; + y = 0.335 * safezoneH + safezoneY; + w = 0.33 * safezoneW; + h = 0.088 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + + //text + class db_txt_blur: RscText + { + idc = 6720; + + text = "Bluriness"; //--- ToDo: Localize; + x = 0.478344 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0598124 * safezoneW; + h = 0.0176 * safezoneH; + }; + //slider + class db_slider_blur: RscSlider + { + idc = 6730; + + x = 0.4505 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + + //Color Inversion + //background + class ci_bckgrnd: IGUIBack + { + idc = 6810; + + x = 0.335 * safezoneW + safezoneX; + y = 0.335 * safezoneH + safezoneY; + w = 0.33 * safezoneW; + h = 0.088 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + //text + class ci_txt_red: RscText + { + idc = 6820; + + text = "Red"; //--- ToDo: Localize; + x = 0.378309 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.022688 * safezoneW; + h = 0.0176 * safezoneH; + }; + class ci_txt_green: RscText + { + idc = 6821; + + text = "Green"; //--- ToDo: Localize; + x = 0.485561 * safezoneW + safezoneX; + y = 0.3614 * safezoneH + safezoneY; + w = 0.0288754 * safezoneW; + h = 0.0176 * safezoneH; + }; + class ci_txt_blue: RscText + { + idc = 6822; + + text = "Blue"; //--- ToDo: Localize; + x = 0.601987 * safezoneW + safezoneX; + y = 0.361807 * safezoneH + safezoneY; + w = 0.0247506 * safezoneW; + h = 0.0176 * safezoneH; + }; + //sliders + class ci_slider_red: RscSlider + { + idc = 6830; + + x = 0.337064 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class ci_slider_green: RscSlider + { + idc = 6831; + + x = 0.450501 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + class ci_slider_blue: RscSlider + { + idc = 6832; + + x = 0.563938 * safezoneW + safezoneX; + y = 0.3834 * safezoneH + safezoneY; + w = 0.0989998 * safezoneW; + h = 0.0308 * safezoneH; + onSliderPosChanged = "_this call rmx_fnc_ppViewerEffects;"; + }; + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/quickFunction.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/quickFunction.hpp new file mode 100644 index 00000000..eaf60f9d --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/quickFunction.hpp @@ -0,0 +1,56 @@ +class dUI_quickFunction { + idd = 9400; + enableSimulation = 1; + movingEnable = 1; + onKeyDown = "_this call rmx_fnc_keyDown;"; + class controls { + class dUI_qf_back: IGUIBack + { + idc = 9401; + x = 0.386562 * safezoneW + safezoneX; + y = 0.269 * safezoneH + safezoneY; + w = 0.226875 * safezoneW; + h = 0.462 * safezoneH; + colorBackground[] = {0,0,0,0.5}; + }; + class dUI_qf_title: RscText + { + idc = 9402; + text = "Quick function"; //--- ToDo: Localize; + x = 0.386562 * safezoneW + safezoneX; + y = 0.269 * safezoneH + safezoneY; + w = 0.226875 * safezoneW; + h = 0.022 * safezoneH; + colorBackground[] = {1,0,0,1}; + }; + class dUI_qf_lb: RscListbox + { + idc = 9403; + x = 0.396875 * safezoneW + safezoneX; + y = 0.357 * safezoneH + safezoneY; + w = 0.207282 * safezoneW; + h = 0.33 * safezoneH; + colorBackground[] = {0,0,0,0.8}; + }; + class dUI_qf_params: RscEdit + { + idc = 9404; + text = "'Params are saved into profileNamespace'"; //--- ToDo: Localize; + x = 0.396875 * safezoneW + safezoneX; + y = 0.313 * safezoneH + safezoneY; + w = 0.207281 * safezoneW; + h = 0.0242 * safezoneH; + colorBackground[] = {0,0,0,0.8}; + }; + class dUI_qf_hint: RscText + { + idc = 9405; + text = "Double click listbox item to Execute"; //--- ToDo: Localize; + x = 0.422656 * safezoneW + safezoneX; + y = 0.698 * safezoneH + safezoneY; + w = 0.155731 * safezoneW; + h = 0.022 * safezoneH; + colorBackground[] = {0,0,0,0}; + }; + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/watcher.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/watcher.hpp new file mode 100644 index 00000000..1eb7be0f --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/watcher.hpp @@ -0,0 +1,111 @@ +/* #Rubowe +$[ + 1.063, + ["dsa",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], + [2200,"vw_bckgrnd",[0,"",[0,0.04,0.465,0.08],[-1,-1,-1,-1],[0.2,0.2,0.2,0.4],[-1,-1,-1,-1],"","-1"],["idc = 7501;"]], + [1000,"vw_title",[0,"Drag to move",[0,0,0.465,0.04],[-1,-1,-1,-1],[0.2,0.2,0.2,1],[-1,-1,-1,-1],"","-1"],["idc = 7502;","style = 2;","moving = 1;","onMouseButtonUp = |^savePos^ call rmx_fnc_watcherActions;|;"]], + [1001,"vw_pin: RscActivePictureKeepAspect",[0,"x\addons\rmx_init\data\retardedPinUp.paa",[0.429999,0,0.03,0.04],[-1,-1,-1,-1],[-1,-1,-1,-1],[1,1,1,1],"","-1"],["idc = 7503;","onMouseButtonUp = |^pin^ call rmx_fnc_watcherActions;|;"]], + [1400,"vw_code",[0,"",[0,0.04,0.465,0.04],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],["idc = 7504;"]], + [2100,"vw_combo",[0,"",[0.115,0.08,0.275,0.04],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],["idc = 7505;"]], + [1600,"vw_btnAdd",[0,"Add",[0.390001,0.08,0.075,0.04],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],["idc = 7506;","action = |^execute^ call rmx_fnc_watcherActions;|;"]], + [2300,"vw_grp",[0,"",[0,0.12,0.465,0.044],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],["idc = 7507;"]], + [2101,"vw_combo_transparency",[0,"",[0,0.08,0.115,0.04],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],["idc = 7505;"]] +] +*/ + + + +class dUI_watcher { + idd = 7500; + enableSimulation = 1; + movingEnable = 1; + onUnload = "'unload' call rmx_fnc_watcherActions;"; + onLoad = "'load' call rmx_fnc_watcherActions;"; + class controls { + class vw_bckgrnd: IGUIBack + { + idc = 7501; + x = 0; + y = 0.04; + w = 0.465; + h = 0.08; + colorBackground[] = {0.2,0.2,0.2,0.4}; + }; + class vw_title: RscText + { + idc = 7502; + text = "Drag to move"; //--- ToDo: Localize; + x = 0; + y = 0; + w = 0.465; + h = 0.04; + colorBackground[] = {0.2,0.2,0.2,1}; + style = 0x02; //center + moving = 1; + }; + class vw_pin: RscActivePictureKeepAspect + { + idc = 7503; + text = "x\addons\rmx_init\data\retardedPinUp.paa"; + x = 0.43; + y = 0; + w = 0.03; + h = 0.04; + onMouseButtonUp = "'pin' call rmx_fnc_watcherActions;"; + }; + class vw_code: RscEdit + { + idc = 7504; + text = ""; + x = 0; + y = 0.04; + w = 0.465; + h = 0.04; + }; + class vw_combo: RscCombo + { + idc = 7505; + x = 0.115; + y = 0.08; + w = 0.275; + h = 0.04; + }; + class vw_btnAdd: RscButton + { + idc = 7506; + text = "Add"; //--- ToDo: Localize; + x = 0.390001; + y = 0.08; + w = 0.075; + h = 0.04; + colorText[] = {1,1,1,1}; + action = "'execute' call rmx_fnc_watcherActions;"; + }; + class vw_grp: RscControlsGroup + { + idc = 7507; + x = 0; + y = 0.12; + w = 0.465; + h = 0; + class VScrollbar: VScrollbar + { + width = 0; + }; + class HScrollbar: VScrollbar + { + height = 0; + }; + class controls{}; + }; + class vw_comboTransparency: RscCombo + { + idc = 7508; + x = 0; + y = 0.08; + w = 0.115; + h = 0.04; + }; + onLBSelChanged = "'fade' call rmx_fnc_watcherActions;"; + }; +}; diff --git a/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/watcher2.hpp b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/watcher2.hpp new file mode 100644 index 00000000..b702b47e --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/CfgGUI/watcher2.hpp @@ -0,0 +1,7 @@ +class dUI_watcher2: dUI_watcher +{ + duration = 1e+1000; + fadein = 0.5; + fadeout = 0.5; + onLoad = "uiNamespace setVariable ['rmx_var_watcher2',_this select 0]"; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/config.cpp b/Tools/DevFrameWork/x/addons/rmx_init/config.cpp new file mode 100644 index 00000000..a33b8b3e --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/config.cpp @@ -0,0 +1,127 @@ +#include "BIS_AddonInfo.hpp" +//Author: Raimonds Virtoss / Raymix +class CfgPatches { + class rmx_init { + units[] = {}; + weapons[] = {}; + requiredVersion = 0.1; + //requiredAddons[] = {""}; + }; +}; +class CfgMods +{ + class rmx_devLibs + { + dir = "@EpochDEV"; + name = "RMX Dev library"; + picture = ""; + hidePicture = 0; + hideName = 0; + action = "http://raimonds.me"; + version = "0.1"; + }; +}; + +class CfgAddons +{ + access = 1; + class PreloadBanks + { + }; + class PreloadAddons + { + class rmx_devLibs + { + list[] = {}; + }; + }; +}; + +// deps needs cleanup +#include "CfgGUI\gui_dependencies.hpp" + +// dominion custom console, use Shift + F2 to activate +#include "CfgGUI\console.hpp" + +// quick function launcher, developers only, use dev_variables.sqf ... F2 to activate +#include "CfgGUI\quickFunction.hpp" + +// Code Editor ... ENTER to activate +#include "CfgGUI\editor.hpp" + +// Variable Watcher ... CTRL + ENTER to activate +#include "CfgGUI\watcher.hpp" + +// AtmosFEAR ... F5 to activate +#include "CfgGUI\atmosFEAR.hpp" + +// ppEffects viewer ... F6 to activate +#include "CfgGUI\ppEffects.hpp" + +class RscTitles { + class Default //use to delete title resources + { + idd = -1; + fadein = 0; + fadeout = 0; + duration = 0; + }; + //default console, F2 to activate (Shift + F2 to make buttons active) + #include "CfgGUI\console2.hpp" + #include "CfgGUI\watcher2.hpp" +}; + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Dev functions init - do not edit, important! +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +class devFunctions { //don't add fnc here, use appropriate pbo + init = "x\Addons\rmx_init\functions.sqf"; + + class rmx { + class raymix_dialogs { + file = "x\Addons\rmx_init\functions"; + class dialogVars {preInit = 1;recompile = 1;}; // vars + class buffer {preInit = 1;}; + class eventHandlers {preInit = 1;}; + + class getColorScheme{}; + class atmosFear {}; //Press F5 to toggle + class atmosFearActions {}; + class atmosFearUpdate {}; + class ppViewer {}; //Press F6 to toggle + class ppViewerUpdate {}; + class ppViewerEffects {}; + class ppViewerGetSet {}; + class console {}; //press F2 or shift + F2 to toggle + class consoleFilters {}; + class consoleUpdate {}; + class quickFnc {}; //press F3 to toggle dialog + class keyDown {recompile = 1;}; + class keyUp {}; + class output {}; + class codeEditor {recompile = 1;}; //press ENTER to toggle + class codeEditorActions {recompile = 1;}; + class watcher {recompile = 1;}; //press CTRL + ENTER to toggle + class watcherActions {recompile = 1;}; + class watcherAddRemove {recompile = 1;}; + class watcherRunner {recompile = 1;}; + }; + }; +}; +class cfgFunctions { //DO NOT EDIT BELOW + class rmx { + class rec { + file = "x\Addons\rmx_init"; + class recompile { + preInit = 1; + postInit = 1; + }; + }; + }; +}; +class RscStandardDisplay; +class RscDisplayStart: RscStandardDisplay +{ + onLoad = "[2] call compile preprocessfilelinenumbers gettext (configfile >> 'CfgFunctions' >> 'init'); call compile preprocessfilelinenumbers gettext (configfile >> 'devFunctions' >> 'init'); ['onLoad',_this,'RscDisplayLoading','Loading'] call (uinamespace getvariable 'BIS_fnc_initDisplay')"; +}; + diff --git a/Tools/DevFrameWork/x/addons/rmx_init/data/critical.paa b/Tools/DevFrameWork/x/addons/rmx_init/data/critical.paa new file mode 100644 index 00000000..27fdb258 Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/data/critical.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_init/data/info.paa b/Tools/DevFrameWork/x/addons/rmx_init/data/info.paa new file mode 100644 index 00000000..b2f51027 Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/data/info.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_init/data/retardedPinDown.paa b/Tools/DevFrameWork/x/addons/rmx_init/data/retardedPinDown.paa new file mode 100644 index 00000000..2e7e7a51 Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/data/retardedPinDown.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_init/data/retardedPinUp.paa b/Tools/DevFrameWork/x/addons/rmx_init/data/retardedPinUp.paa new file mode 100644 index 00000000..977bab16 Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/data/retardedPinUp.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_init/data/w_error.paa b/Tools/DevFrameWork/x/addons/rmx_init/data/w_error.paa new file mode 100644 index 00000000..3c96187f Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/data/w_error.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_init/data/w_off.paa b/Tools/DevFrameWork/x/addons/rmx_init/data/w_off.paa new file mode 100644 index 00000000..9c94114a Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/data/w_off.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_init/data/w_on.paa b/Tools/DevFrameWork/x/addons/rmx_init/data/w_on.paa new file mode 100644 index 00000000..f1afe19b Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/data/w_on.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_init/data/warning.paa b/Tools/DevFrameWork/x/addons/rmx_init/data/warning.paa new file mode 100644 index 00000000..a9cbe25d Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/data/warning.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_init/defines.inc b/Tools/DevFrameWork/x/addons/rmx_init/defines.inc new file mode 100644 index 00000000..0ee537ae --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/defines.inc @@ -0,0 +1,18 @@ +#define info call _sendInfo +#define warning call _sendWarning +#define critical call _sendCritical + +#define ST_SIZE18 "size='1.8'" +#define ST_SIZE2 "size='2'" +#define ST_SKYBLUE "color='#00D0DF'" +#define ST_GREEN "color='#A5FD6B'" +#define ST_ORANGE "color='#FEA834'" +#define ST_RED "color='#ff0000'" +#define ST_WHITE "color='#FFFFFF'" +#define ST_TAHOMAB "font='TahomaB'" +#define ST_PURISTAMEDIUM "font='PuristaMedium'" +#define ST_SHADOW1 "shadow='1' shadowColor='#000000'" +#define ST_SHADOW2 "shadow='2'" +#define ST_INFO "" +#define ST_WARNING "" +#define ST_CRITICAL "" \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/fn_recompile.sqf b/Tools/DevFrameWork/x/addons/rmx_init/fn_recompile.sqf new file mode 100644 index 00000000..5cce2e59 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/fn_recompile.sqf @@ -0,0 +1,16 @@ +//todo use param +private ["_fnc"]; +_fnc = gettext (configfile >> "devFunctions" >> "init"); +if (_fnc != "") then { + if (typeName _this isEqualTo typeName "") then { + _this call compile preprocessfilelinenumbers _fnc; + } else { + call compile preprocessfilelinenumbers _fnc; + }; + true +} else { + diag_log "Init param not found, check config pbo"; + false +}; + + diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions.sqf new file mode 100644 index 00000000..e42f63f8 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions.sqf @@ -0,0 +1,374 @@ +//--- Fake header +_fnc_scriptName = if (isnil "_fnc_scriptName") then {"Dev Function Libs"} else {_fnc_scriptName}; + +/****************************************************************************************************** + DEFINE HEADERS +******************************************************************************************************/ + +private ["_this","_headerMetaData","_headerBuffer","_headerDebugOff","_headerNone","_headerSQF","_debugLevel","_debugEnabled","_headerDefault","_fncCompile","_recompile","_debugHeader","_debugDestination"]; + +_headerMetaData = " + _fnc_scriptNameParentTemp = if !(isnil '_fnc_scriptName') then {_fnc_scriptName} else {'%1'}; + private ['_fnc_scriptNameParent']; + _fnc_scriptNameParent = _fnc_scriptNameParentTemp; + _fnc_scriptNameParentTemp = nil; + + private ['_fnc_scriptName']; + _fnc_scriptName = '%1'; + scriptname _fnc_scriptName; +"; + +_headerBuffer = " + _sendInfo = {rmx_var_logMsg pushBack [0,_fnc_scriptName,_this]}; + _sendWarning = {rmx_var_logMsg pushBack [1,_fnc_scriptName,_this]}; + _sendCritical = {rmx_var_logMsg pushBack [2,_fnc_scriptName,_this]}; + +"; + +_headerDebugOff = " + _sendInfo = {}; + _sendWarning = {}; + _sendCritical = {}; + +"; +_headerNone = ""; + +_debugEnabled = getNumber (configfile >> "devFunctions" >> "debugEnabled"); + +//default headers if no specific entries are given +_headerDefault = if (_debugEnabled > 0) then {_headerMetaData + _headerBuffer} else {_headerNone + _headerDebugOff}; +/****************************************************************************************************** + Compile function +******************************************************************************************************/ + +_fncCompile = { + private ["_fncVar","_fncMeta","_fncPath","_fncHeader","_fncExt","_header","_fncFinal","_footer"]; + _fncVar = _this select 0; + _fncMeta = _this select 1; + _fncHeader = _this select 2; + _fncFinal = _this select 3; + + _fncPath = _fncMeta select 0; + _fncExt = _fncMeta select 1; + + switch _fncExt do { + + //--- SQF + case ".sqf": { + _header = switch (_fncHeader) do { + + //--- No header (used in low-level functions, like 'fired' event handlers for every weapon) + case -1: { + _headerNone + _headerDebugOff + }; + case 1: { + _headerMetaData + _headerBuffer + }; + default { + _headerDefault + }; + }; + + if (_fncFinal) then { + compileFinal (format [_header,_fncVar] + preprocessfilelinenumbers _fncPath); + } else { + compile (format [_header,_fncVar] + preprocessfilelinenumbers _fncPath); + }; + }; + + //--- FSM + case ".fsm": { + compileFinal format ["%1_fsm = _this execfsm '%2';",_fncVar,_fncPath]; + }; + + default {0} + }; +}; + +_fnc_recompile = { + private "_this"; + _fnc_scriptname = "rmx_recompile"; + { + diag_log format ["Recompiling: %1",_x]; + _x call rmx_fnc_recompile; + } count _this; +}; + +_fnc_init = { + private ["_this","_call"]; + _fnc_scriptname = _this select 0; + _call = _this select 1; + { + diag_log format ["[%2]: Calling: %1",_x,_fnc_scriptname]; + call (missionNamespace getVariable _x); //with missionNamespace do {call _x;}; + } count _call; +}; + +_fnc_createShortcuts = { + private "_this"; + { + _allowRecompile = (_x call (uiNamespace getvariable "bis_fnc_functionMeta")) select 5; + _xCode = uiNamespace getvariable _x; //shortcut copied over directly + if (_allowRecompile) then { + _xCode = call compile str (uiNamespace getvariable _x); //shortcut call compiles every mission start + }; + //diag_log format ["[%2]: Creating shortcut: %1",_x,_fnc_scriptname]; + missionNamespace setvariable [_x,_xCode]; + } foreach _this; +}; +/****************************************************************************************************** + COMPILE ONE FUNCTION + + When input is string containing function name, only that one function is recompiled. + + The script stops here, reads function's meta data and recompile the function + based on its extension and header. + Basically - it takes meta data from uiNamespace and uses it to replace function inside missionNamespace. + + This will work even if recompile = 0; is set, but will fail because it's compileFinal in this case + +******************************************************************************************************/ + +//--- Compile only selected +if (isnil "_this") then {_this = [];}; +if (typename _this != typename []) then {_this = [_this];}; +_recompile = if (count _this > 0) then {_this select 0} else {0}; + +if (typename _recompile == typename "") exitwith { + private ["_fnc","_fncMeta","_headerType","_var","_fncUINamespace"]; + + //--- Recompile specific function + _fncUINamespace = true; + _fnc = uiNamespace getvariable _recompile; + if (isnil "_fnc") then {_fnc = missionNamespace getvariable _recompile; _fncUINamespace = false;}; + if !(isnil "_fnc") then { + _fncMeta = _recompile call (uiNamespace getvariable "bis_fnc_functionMeta"); + _headerType = if (count _this > 1) then {_this select 1} else {0}; + _var = [_recompile,[_recompile,_fncMeta,_headerType,false] call _fncCompile]; + if (_fncUINamespace) then {uiNamespace setvariable _var;}; + missionNamespace setvariable _var; + if (isnil "_functions_listRecompile") then { + diag_log format ["[%3]: %1 recompiled with _meta %2",_recompile,_fncMeta,_fnc_scriptname]; + }; + } else { + diag_log format ["[%2]: %1 is not a function.",_recompile,_fnc_scriptname]; + }; +}; + + +/****************************************************************************************************** +If params passed did not contain string, function will automatically detect if: fresh compiles, new mission or recompile + +Detection is done by finalizing devlibs_init boolean inside 2 namespaces: +If bool doesn't exist anywhere, then game is launched +If bool exists only in uiNamespace then game was started, but not mission +If bool exists in missionNamespace, then server/client is running and will only recompile non-final functions. + +To make functions non-final while developing, use recompile = 1; inside pbo configs, simple as that. +******************************************************************************************************/ + + +if (call (uiNamespace getvariable ["devlibs_init",{false}])) exitWith { + private ["_functions_list","_functions_listRecompile","_functions_listPreInit","_functions_listPostInit"]; + + _functions_listRecompile = call (uiNamespace getvariable ["rmx_functions_listRecompile",{[]}]); + + if (call (missionNamespace getvariable ["devlibs_init",{false}])) then { + _functions_listRecompile call _fnc_recompile; + } else { + _functions_list = call (uiNamespace getvariable ["rmx_functions_list",{[]}]); + _functions_listPreInit = call (uiNamespace getvariable ["rmx_functions_listPreInit",{[]}]); + _functions_listPostInit = call (uiNamespace getvariable ["rmx_functions_listPostInit",{[]}]); + + _functions_listRecompile call _fnc_recompile; + + _functions_list call _fnc_createShortcuts; + ["preInit",_functions_listPreInit] call _fnc_init; + + [_functions_listPostInit,_fnc_init] spawn { + waitUntil {!isNil {missionNamespace getVariable "bis_fnc_init"}}; + ["postInit",(_this select 0)] call (_this select 1); + }; + missionNamespace setvariable ["devlibs_init",compileFinal "true"]; + }; +}; + +_functions_list = []; +uiNamespace setvariable ["rmx_functions_list",_functions_list]; +_functions_listPreInit = []; +uiNamespace setvariable ["rmx_functions_listPreInit",_functions_listPreInit]; +_functions_listPostInit = []; +uiNamespace setvariable ["rmx_functions_listPostInit",_functions_listPostInit]; +_functions_listRecompile = []; +uiNamespace setvariable ["rmx_functions_listRecompile",_functions_listRecompile]; +_functions_listPreStart = []; + +/****************************************************************************************************** +SCAN devFunctions if devlibs_init was not detected anywhere. +This part is done only once per game launch. Because of this an extra var inside uiNamespace is created with suffix _meta. +These _meta variables contain path to files, but are final. +If config file, file name or file path are changed, you'll have to re-PBO the whole structure again. + +Go through devFunctions, scan categories and declare all functions. + +Following variables are stored: +_fnc_ - actual code of the function +_fnc__meta - additional meta data of this format + [,,
,,,,] + * path - path to actual file + * extension - file extension, either ".sqf" or ".fsm" + * debugLevel - header type + * preInit - function is executed automatically upon mission start, before objects are initalized + * postInit - function is executed automatically upon mission start, after objects are initialized + * recompile - function is recompiled upon mission start + * category - function's category based on config structure + +******************************************************************************************************/ + +private ["_pathFile","_devFunctions"]; +_pathFile = gettext (configfile >> "devFunctions" >> "file"); + +_devFunctions = (configfile >> "devFunctions"); +for "_c" from 0 to (count _devFunctions - 1) do { + private ["_currentTag"]; + _currentTag = _devFunctions select _c; + + //--- Is Tag + if (isclass _currentTag) then { + private ["_tag","_tagName","_itemPathTag"]; + _tag = configname _currentTag; + _tagName = gettext (_currentTag >> "tag"); + if (_tagName == "") then {_tagName = configname _currentTag}; + _itemPathTag = gettext (_currentTag >> "file"); + + for "_i" from 0 to (count _currentTag - 1) do { + private ["_currentCategory"]; + _currentCategory = _currentTag select _i; + + //--- Is Category + if (isclass _currentCategory) then { + private ["_categoryName","_itemPathCat"]; + _categoryName = configname _currentCategory; + _itemPathCat = gettext (_currentCategory >> "file"); + + for "_n" from 0 to (count _currentCategory - 1) do { + private ["_currentItem"]; + _currentItem = _currentCategory select _n; + + //--- Is Item + if (isclass _currentItem) then { + private ["_epoch","_str","_itemName","_itemPathItem","_itemExt","_itemPreInit","_itemPostInit","_itemPreStart","_itemPath","_itemVar","_itemCompile","_itemRecompile"]; + + //--- Read function + _itemName = configname _currentItem; + _itemPathItem = gettext (_currentItem >> "file"); + _itemExt = gettext (_currentItem >> "ext"); + _itemPreInit = getnumber (_currentItem >> "preInit"); + _itemPostInit = getnumber (_currentItem >> "postInit"); + _itemPreStart = getnumber (_currentItem >> "preStart"); + _itemRecompile = getnumber (_currentItem >> "recompile"); + if (_itemExt == "") then {_itemExt = ".sqf"}; + _itemPath = if (_itemPathItem != "") then { + if (_tagName in ["rmx"]) then { //more tags can be added + //--- Disable rewriting of global functions from outside + private ["_itemPathItemRMX","_itemPathSlash"]; + _itemPathItemRMX = (tolower _itemPathItem) find "x"; + _itemPathSlash = (tolower _itemPathItem) find "\"; + diag_log format ["Not compiling: %1",_itemPathItem]; //remove later? + if ((_itemPathItemRMX < 0 || _itemPathItemRMX > 1) && _itemPathSlash > 0) then {_itemPathItem = "";}; + }; + _itemPathItem + } else { + "" + }; + + _epoch = _tagName in ["EPOCH","A3E"]; + + //path in category + if (_itemPath == "") then { + if (_epoch) then { + _itemPath = if (_itemPathCat != "") then {_itemPathCat + "\EPOCH_" + _itemName + _itemExt} else { + "" + }; + } else { + _itemPath = if (_itemPathCat != "") then {_itemPathCat + "\" + _itemName + _itemExt} else { + if (_itemPathTag != "") then {_itemPathTag + "\" + _itemName + _itemExt} else {""}; + }; + }; + }; + + _itemHeader = getnumber (_currentItem >> "debugHeader"); + _str = if (_epoch) then {"_"} else {"_fnc_"}; + + //category name as folder + if (_itemPath == "") then { + if (_epoch) then { + _itemPath = _itemPathTag + "\" + _categoryName + "\EPOCH_" + _itemName + _itemExt + } else { + _itemPath = _pathFile + "\" + _categoryName + "\" + _itemName + _itemExt + }; + }; + + _itemVar = _tagName + _str + _itemName; + _itemMeta = [_itemPath,_itemExt,_itemHeader,_itemPreInit > 0,_itemPostInit > 0,_itemRecompile> 0,_tag,_categoryName,_itemName]; + _itemCompile = if (_itemRecompile > 0) then { + [_itemVar,_itemMeta,_itemHeader,false] call _fncCompile; + } else { + [_itemVar,_itemMeta,_itemHeader,true] call _fncCompile; + }; + + //--- Register function + if !(_itemVar in _functions_list) then { + //---- Save function + uiNamespace setvariable [_itemVar, _itemCompile]; + //--- Save function meta data + uiNamespace setvariable [_itemVar + "_meta",compileFinal str _itemMeta]; + + _functions_list set [count _functions_list,_itemVar]; + }; + //--- Add to list of functions executed when missionNamespace is created (during loading screen) + if (_itemPreInit > 0) then { + if !(_itemVar in _functions_listPreInit) then { + _functions_listPreInit set [count _functions_listPreInit,_itemVar]; + }; + }; + //--- Add to list of functions executed after client, world and vehicles are created. + if (_itemPostInit > 0) then { + if !(_itemVar in _functions_listPostInit) then { + _functions_listPostInit set [count _functions_listPostInit,_itemVar]; + }; + }; + //--- Add to list of functions executed upon game start where missionNamespace does not exist. + if (_itemPreStart > 0) then { + if !(_itemVar in _functions_listPreStart) then { + _functions_listPreStart set [count _functions_listPreStart,_itemVar]; + }; + }; + //--- Add to list of functions that are not finalized and can be recompiled (DEV only). use recompile = 1; + if (_itemRecompile > 0) then { + if !(_itemVar in _functions_listRecompile) then { + _functions_listRecompile set [count _functions_listRecompile,_itemVar]; + }; + }; + }; + }; + }; + }; + }; +}; + +//--- Save the lists +uiNamespace setvariable ["rmx_functions_list",compileFinal str (_functions_list)]; +uiNamespace setvariable ["rmx_functions_listRecompile",compileFinal str (_functions_listRecompile)]; +uiNamespace setvariable ["rmx_functions_listPreInit",compileFinal str (_functions_listPreInit)]; +uiNamespace setvariable ["rmx_functions_listPostInit",compileFinal str (_functions_listPostInit)]; +uiNamespace setvariable ["devlibs_init",compileFinal "true"]; + +// Call preStarted functions + +{ + _function = [] call (uiNamespace getvariable _x); + uiNamespace setvariable [_x + "_preStart",_function]; +} foreach _functions_listPreStart; + +diag_log format ["[%1]: functions compiled",_fnc_scriptName]; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFear.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFear.sqf new file mode 100644 index 00000000..18854259 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFear.sqf @@ -0,0 +1,106 @@ +/* + Function Name: rmx_fnc_atmosFear + Author: Raimonds Virtoss | Raymix + Description: Atmosphere control dialog + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_display","_diag","_listBox"]; +disableSerialization; + +switch (rmx_var_atmosFearEnabled) do { + case false: + { + _diag = createDialog "dUI_atmosFear"; + _display = findDisplay 8100; + + for "_i" from 8110 to 8119 do { + rmx_var_afProgress set [count rmx_var_afProgress,_display displayCtrl _i]; + }; + + for "_i" from 8130 to 8144 do { + rmx_var_afInput set [count rmx_var_afInput,_display displayCtrl _i]; + }; + + for "_i" from 8150 to 8161 do { + rmx_var_afSliders set [count rmx_var_afSliders,_display displayCtrl _i]; + }; + rmx_var_afMisc = [_display displayCtrl 8170, _display displayCtrl 8180]; //cb, combo + rmx_var_afText = [_display displayCtrl 8101, _display displayCtrl 8102]; + + ["load"] call rmx_fnc_atmosFearActions; + [] spawn rmx_fnc_atmosFearUpdate; + rmx_var_atmosFearEnabled = true; + }; + case true: + { + rmx_var_atmosFearEnabled = false; + closeDialog 0; + }; +}; + +true + +/* +main dialog - 8100 + +Dynamic text: + A2 winds 8101 + wind direction 8102 + +progress bars: + lightnings 8110 + overcst 8111 + rainbow 8112 + gusts 8113 + rain 8114 + fog density 8115 + fog decay 8116 + fog altitude 8117 + wind str 8118 + waves 8119 + +Input fields: + rain 8130 + fog 8131 + wind 8132 + force 8133 //3 + waves 8134 + direction 8135 //select 5 + wind a2 x 8136 + wind a2 y 8137 + export 8138 + day 8139 //select 9 + month 8140 + year 8141 + hours 8142 + minutes 8143 + skiptime 8144 + +Sliders: + lightnings 8150 + overcast 8151 + rainbow 8152 + gusts 8153 + rain 8154 + fog decay 8155 //5 + fog density 8156 + fog altitude 8157 //select 7 + wind str 8158 + wind frc 8159 //9 + waves 8160 + direction 8161 + +Checkboxes: + wind a2 8170 + +combo box: + import 8180 + +buttons: + rpt 8190 + apply 8191 + load 8192 + save 8193 +*/ \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFearActions.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFearActions.sqf new file mode 100644 index 00000000..8a75aa2f --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFearActions.sqf @@ -0,0 +1,272 @@ +/* + Function Name: rmx_fnc_atmosFearActions + Author: Raimonds Virtoss | Raymix + Description: Button actions + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_args"]; + +_args = _this select 0; +if (typeName _args != "STRING") then {_args = str _args}; +//hintSilent str _this; + +switch (_args) do { + case "load": + { + { + _x sliderSetRange [0,1]; + } forEach rmx_var_afSliders; + + (rmx_var_afSliders select 7) sliderSetRange [0,1000]; //fog altitude in meters + (rmx_var_afSliders select 11) sliderSetRange [0,360]; //wind direction in degrees + + private "_date"; + _date = date; //[2035,5,28,13,41] + (rmx_var_afInput select 9) ctrlSetText str (_date select 2); //day + (rmx_var_afInput select 10) ctrlSetText str (_date select 1); //month + (rmx_var_afInput select 11) ctrlSetText str (_date select 0); //year + (rmx_var_afInput select 12) ctrlSetText str (_date select 3); //hours + (rmx_var_afInput select 13) ctrlSetText str (_date select 4); //minutes + + //set saved slider positions and inputs + // [0,0,0,0,[0,0],[0,[0,0,0]],[0,0],[0,0],[0,0],[0,0],[0,0,false]] + (rmx_var_afSliders select 0) sliderSetPosition (rmx_var_afProfile select 0); + (rmx_var_afSliders select 1) sliderSetPosition (rmx_var_afProfile select 1); + (rmx_var_afSliders select 2) sliderSetPosition (rmx_var_afProfile select 2); + (rmx_var_afSliders select 3) sliderSetPosition (rmx_var_afProfile select 3); + + (rmx_var_afInput select 0) ctrlSetText str (rmx_var_afProfile select 4 select 0); //rain + (rmx_var_afSliders select 4) sliderSetPosition (rmx_var_afProfile select 4 select 1); + + (rmx_var_afInput select 1) ctrlSetText str (rmx_var_afProfile select 5 select 0); //fog + (rmx_var_afSliders select 5) sliderSetPosition (rmx_var_afProfile select 5 select 1 select 0); + (rmx_var_afSliders select 6) sliderSetPosition (rmx_var_afProfile select 5 select 1 select 1); + (rmx_var_afSliders select 7) sliderSetPosition (rmx_var_afProfile select 5 select 1 select 2); + + (rmx_var_afInput select 2) ctrlSetText str (rmx_var_afProfile select 6 select 0); //Wind str + (rmx_var_afSliders select 8) sliderSetPosition (rmx_var_afProfile select 6 select 1); + + (rmx_var_afInput select 3) ctrlSetText str (rmx_var_afProfile select 7 select 0); //Wind force + (rmx_var_afSliders select 9) sliderSetPosition (rmx_var_afProfile select 7 select 1); + + (rmx_var_afInput select 4) ctrlSetText str (rmx_var_afProfile select 8 select 0); //Waves + (rmx_var_afSliders select 10) sliderSetPosition (rmx_var_afProfile select 8 select 1); + + (rmx_var_afInput select 5) ctrlSetText str (rmx_var_afProfile select 9 select 0); //Direction + (rmx_var_afSliders select 11) sliderSetPosition (rmx_var_afProfile select 9 select 1); + + (rmx_var_afInput select 6) ctrlSetText str (rmx_var_afProfile select 10 select 0); //x + (rmx_var_afInput select 7) ctrlSetText str (rmx_var_afProfile select 10 select 1); //y + (rmx_var_afMisc select 0) cbSetChecked (rmx_var_afProfile select 10 select 2); + + lbClear (rmx_var_afMisc select 1); + { + (rmx_var_afMisc select 1) lbAdd (_x select 0); + } forEach rmx_var_afLoadSave; + (rmx_var_afMisc select 1) lbSetCurSel rmx_var_afSelected; + }; + case "unload": + { + ["save"] call rmx_fnc_atmosFearActions; + rmx_var_atmosFearEnabled = false; + rmx_var_afProgress = []; + rmx_var_afInput = []; + rmx_var_afSliders = []; + rmx_var_afText = []; + rmx_var_afMisc = []; + }; + case "save": + { + // [0,0,0,0,[0,0],[0,[0,0,0]],[0,0],[0,0],[0,0],[0,0],[0,0,false]] + rmx_var_afProfile = + [ + sliderPosition (rmx_var_afSliders select 0), + sliderPosition (rmx_var_afSliders select 1), + sliderPosition (rmx_var_afSliders select 2), + sliderPosition (rmx_var_afSliders select 3), + [ + call compile (ctrlText (rmx_var_afInput select 0)), + sliderPosition (rmx_var_afSliders select 4) + ], + [ + call compile (ctrlText (rmx_var_afInput select 1)), + [ + sliderPosition (rmx_var_afSliders select 5), + sliderPosition (rmx_var_afSliders select 6), + sliderPosition (rmx_var_afSliders select 7) + ] + ], + [ + call compile (ctrlText (rmx_var_afInput select 2)), + sliderPosition (rmx_var_afSliders select 8) + ], + [ + call compile (ctrlText (rmx_var_afInput select 3)), + sliderPosition (rmx_var_afSliders select 9) + ], + [ + call compile (ctrlText (rmx_var_afInput select 4)), + sliderPosition (rmx_var_afSliders select 10) + ], + [ + call compile (ctrlText (rmx_var_afInput select 5)), + sliderPosition (rmx_var_afSliders select 11) + ], + [ + call compile (ctrlText (rmx_var_afInput select 6)), + call compile (ctrlText (rmx_var_afInput select 7)), + cbChecked (rmx_var_afMisc select 0) + ] + ]; + + profileNamespace setVariable ["rmx_var_afProfile",rmx_var_afProfile]; + }; + case "Control #8190": //RPT + { + diag_log format ["<<<<<<<<<< AtmosFEAR Template output >>>>>>>>>> + + class RENAME_ME + { + setLightnings = %1; + setOvercast = %2; + setRainbow = %3; + setGusts = %4; + setRain[] = %5; + setFog[] = %6; + setWindStr[] = %7; + setWindForce[] = %8; + setWaves[] = %9; + setWindDir[] = %10; + setWind[] = %11; + }; + + <<<<<<<<<< >>>>>>>>>>", + rmx_var_afProfile select 0,rmx_var_afProfile select 1, + rmx_var_afProfile select 2,rmx_var_afProfile select 3, + rmx_var_afProfile select 4,rmx_var_afProfile select 5, + rmx_var_afProfile select 6,rmx_var_afProfile select 7, + rmx_var_afProfile select 8,rmx_var_afProfile select 9, + rmx_var_afProfile select 10]; + }; + case "Control #8191": //Apply + { + private "_time"; + + _time = 24*60*60; + skipTime -24; + _time setLightnings sliderPosition (rmx_var_afSliders select 0); + _time setOvercast sliderPosition (rmx_var_afSliders select 1); + _time setRainbow sliderPosition (rmx_var_afSliders select 2); + _time setGusts sliderPosition (rmx_var_afSliders select 3); + + _time setRain 0; + _time setFog [0, 0, 0]; + + skipTime 24; + simulWeatherSync; + call compile (ctrlText(rmx_var_afInput select 0)) setRain sliderPosition (rmx_var_afSliders select 4); + call compile (ctrlText(rmx_var_afInput select 1)) setFog + [ + sliderPosition (rmx_var_afSliders select 5), + sliderPosition (rmx_var_afSliders select 6), + sliderPosition (rmx_var_afSliders select 7) + ]; + call compile (ctrlText(rmx_var_afInput select 2)) setWindStr sliderPosition (rmx_var_afSliders select 8); + call compile (ctrlText(rmx_var_afInput select 3)) setWindForce sliderPosition (rmx_var_afSliders select 9); + call compile (ctrlText(rmx_var_afInput select 4)) setWaves sliderPosition (rmx_var_afSliders select 10); + call compile (ctrlText(rmx_var_afInput select 5)) setWindDir sliderPosition (rmx_var_afSliders select 11); + + setWind + [ + call compile (ctrlText(rmx_var_afInput select 6)), + call compile (ctrlText(rmx_var_afInput select 7)), + cbChecked (rmx_var_afMisc select 0) + ]; + + }; + case "Control #8180": //combo + { + rmx_var_afSelected = _this select 1; + }; + case "Control #8192": //Import + { + private ["_in","_inVal"]; + _in = profileNamespace getVariable ["rmx_var_afLoadSave",[]]; + if (_in isEqualTo []) exitWith {hint "Nothing to load"}; + _inVal = _in select rmx_var_afSelected; + rmx_var_afProfile = _inVal select 1; + ["load"] call rmx_fnc_atmosFearActions; + //(format ["Importing: %1",rmx_var_afProfile]) info; + }; + case "Control #8193": //Export + { + if (ctrlText (rmx_var_afInput select 8) isEqualTo "") exitWith {hint "Name cannot be blank"}; + rmx_var_afLoadSave = profileNamespace getVariable ["rmx_var_afLoadSave",[]]; + rmx_var_afLoadSave pushBack [ + ctrlText (rmx_var_afInput select 8), + rmx_var_afProfile + ]; + profileNamespace setVariable ["rmx_var_afLoadSave",rmx_var_afLoadSave]; + + lbClear (rmx_var_afMisc select 1); + + { + (rmx_var_afMisc select 1) lbAdd (_x select 0); + } forEach rmx_var_afLoadSave; + //(format ["Exporting: %1",rmx_var_afLoadSave select ((count rmx_var_afLoadSave)-1)]) info; + }; + case "Control #8197": //delete + { + if (profileNamespace getVariable ["rmx_var_afLoadSave",[]] isEqualTo [] ) exitWith {hint "Nothing saved"}; + private ["_in","_rem"]; + _in = profileNamespace getVariable "rmx_var_afLoadSave"; + _rem = _in deleteAt rmx_var_afSelected; + profileNamespace setVariable ["rmx_var_afLoadSave",_in]; + (format ["Deleted setting: %1 = %2",_rem select 0,_rem select 1]) warning; + lbClear (rmx_var_afMisc select 1); + + { + (rmx_var_afMisc select 1) lbAdd (_x select 0); + } forEach rmx_var_afLoadSave; + }; + case "Control #8194": //set time + { + private "_arr"; + _arr = [ + call compile (ctrlText(rmx_var_afInput select 11)), + call compile (ctrlText(rmx_var_afInput select 10)), + call compile (ctrlText(rmx_var_afInput select 9)), + call compile (ctrlText(rmx_var_afInput select 12)), + call compile (ctrlText(rmx_var_afInput select 13)) + ]; + setDate _arr; + }; + case "Control #8195": //skipTime + + { + skipTime (call compile (ctrlText(rmx_var_afInput select 14))); + + private "_date"; + _date = date; //[2035,5,28,13,41] + (rmx_var_afInput select 9) ctrlSetText str (_date select 2); //day + (rmx_var_afInput select 10) ctrlSetText str (_date select 1); //month + (rmx_var_afInput select 11) ctrlSetText str (_date select 0); //year + (rmx_var_afInput select 12) ctrlSetText str (_date select 3); //hours + (rmx_var_afInput select 13) ctrlSetText str (_date select 4); //minutes + }; + case "Control #8196": //skipTime - + { + skipTime -(call compile (ctrlText(rmx_var_afInput select 14))); + + private "_date"; + _date = date; //[2035,5,28,13,41] + (rmx_var_afInput select 9) ctrlSetText str (_date select 2); //day + (rmx_var_afInput select 10) ctrlSetText str (_date select 1); //month + (rmx_var_afInput select 11) ctrlSetText str (_date select 0); //year + (rmx_var_afInput select 12) ctrlSetText str (_date select 3); //hours + (rmx_var_afInput select 13) ctrlSetText str (_date select 4); //minutes + }; +}; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFearUpdate.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFearUpdate.sqf new file mode 100644 index 00000000..db617f87 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/atmosFearUpdate.sqf @@ -0,0 +1,35 @@ +/* + Function Name: rmx_fnc_atmosFearUpdate + Author: Raimonds Virtoss | Raymix + Description: Updates progress bars + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_doMath","_fog"]; + +_doMath = {}; + +while {rmx_var_atmosFearEnabled} do { + uiSleep 0.1; + if !(rmx_var_atmosFearEnabled) exitWith{}; //required to avoid RPT error. + (rmx_var_afProgress select 0) progressSetPosition lightnings; + (rmx_var_afProgress select 1) progressSetPosition overcast; + (rmx_var_afProgress select 2) progressSetPosition rainbow; + (rmx_var_afProgress select 3) progressSetPosition gusts; + (rmx_var_afProgress select 4) progressSetPosition rain; + + _fog = fogParams; + (rmx_var_afProgress select 5) progressSetPosition (_fog select 0); //density + (rmx_var_afProgress select 6) progressSetPosition (_fog select 1); //decay value + (rmx_var_afProgress select 7) progressSetPosition ((_fog select 2) / 1000); //altitude + + (rmx_var_afProgress select 8) progressSetPosition windStr; //str + + (rmx_var_afProgress select 9) progressSetPosition waves; //waves + + (rmx_var_afText select 0) ctrlSetText str wind; + (rmx_var_afText select 1) ctrlSetText str windDir; +}; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/buffer.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/buffer.sqf new file mode 100644 index 00000000..4ade5ae6 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/buffer.sqf @@ -0,0 +1,114 @@ +/* + Function Name: rmx_fnc_buffer + Author: Raimonds Virtoss | Raymix + Description: Buffers the debug messages each cycle then processes them when console is open + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +[] spawn { + private ["_updateConsole","_appendToBuffer","_fnc_composeST"]; + + _fnc_updateConsole = { + private ["_this","_tmp"]; + rmx_var_console_list resize 39; + _tmp = [_this]; + _tmp append rmx_var_console_list; + rmx_var_console_list = _tmp; + call rmx_fnc_consoleUpdate; + }; + + _fnc_appendToBuffer = { + private ["_this","_cntBuffer","_cntInput"]; + _cntBuffer = count rmx_var_logBuffer; + _cntInput = count _this; + + if (_cntBuffer >= rmx_var_logBufferSize) then { + rmx_var_logBuffer deleteRange [0,_cntInput]; + }; + rmx_var_logBuffer append _this; + }; + + _fnc_composeST = { + private ["_type","_msg","_fnc","_img","_fncName","_txt","_final"]; + _type = _this select 0; + _fnc = _this select 1; + _msg = _this select 2; + + switch (_type) do { + default //anything else, TODO: ability to colorize + { + _fncName = parseText format [" [%1] ",_fnc,ST_SIZE18,ST_GREEN,ST_TAHOMAB,ST_SHADOW1]; + _txt = parseText format ["%1",_msg,ST_SIZE18,ST_WHITE,ST_PURISTAMEDIUM,ST_SHADOW2]; + _final = composeText [_fncName, _txt]; + }; + case 0: //info + { + _fncName = parseText format [" [%1] ",_fnc,ST_SIZE18,ST_SKYBLUE,ST_TAHOMAB,ST_SHADOW1]; + _txt = parseText format ["%1",_msg,ST_SIZE18,ST_WHITE,ST_PURISTAMEDIUM,ST_SHADOW2]; + _final = composeText [_fncName, _txt]; + }; + case 1: //warning + { + _img = parseText format ["%1",ST_WARNING,ST_SIZE18,ST_WHITE,ST_SHADOW1]; + _fncName = parseText format [" [%1] ",_fnc,ST_SIZE18,ST_ORANGE,ST_TAHOMAB,ST_SHADOW1]; + _txt = parseText format ["%1",_msg,ST_SIZE18,ST_WHITE,ST_PURISTAMEDIUM,ST_SHADOW2]; + _final = composeText [_img,_fncName,_txt]; + }; + case 2: //critical + { + _img = parseText format ["%1",ST_CRITICAL,ST_SIZE18,ST_WHITE,ST_SHADOW1]; + _fncName = parseText format [" [%1] ",_fnc,ST_SIZE18,ST_RED,ST_TAHOMAB,ST_SHADOW1]; + _txt = parseText format ["%1",_msg,ST_SIZE18,ST_WHITE,ST_PURISTAMEDIUM,ST_SHADOW2]; + _final = composeText [_img,_fncName,_txt]; + }; + }; + [_type, _final] + }; + + //TODO: add console filters + while {true} do + { + private ["_cycleTimer","_snapShot","_queue","_st"]; + _cycleTimer = diag_tickTime; + _snapShot = rmx_var_logMsg; + _snapShotST = []; + rmx_var_logMsg = []; + + { + _st = _x call _fnc_composeST; + _snapShotST pushBack _st; + } forEach _snapShot; + + _snapShotST call _fnc_appendToBuffer; + + if (!rmx_var_consoleCheckbox_pause && rmx_var_consoleEnabled) then { + { + _queue = _forEachIndex; + if !(rmx_var_consoleEnabled) exitWith {rmx_var_logBuffer deleteRange [0,_queue];}; + + switch (_x select 0) do { + case 0: + { + if (rmx_var_consoleCheckbox_info) then {(_x select 1) call _fnc_updateConsole;}; + }; + case 1: + { + if (rmx_var_consoleCheckbox_warnings) then {(_x select 1) call _fnc_updateConsole;}; + }; + case 2: + { + if (rmx_var_consoleCheckbox_critical) then {(_x select 1) call _fnc_updateConsole;}; + }; + default {(_x select 1) call _fnc_updateConsole;}; + }; + }forEach rmx_var_logBuffer; + if (rmx_var_consoleEnabled) exitWith {rmx_var_logBuffer = [];}; + }; + + //format ["Cycle finished in %1 seconds, new cycle in %2 seconds",(diag_tickTime - _cycleTimer),rmx_var_logSweepCycle] warning; //If cycle takes too long, try to optimize script + UISleep rmx_var_logSweepCycle; + }; +}; +true + diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/codeEditor.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/codeEditor.sqf new file mode 100644 index 00000000..e277ff51 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/codeEditor.sqf @@ -0,0 +1,48 @@ +/* + Function Name: rmx_fnc_codeEditor + Author: Raimonds Virtoss | Raymix + Description: Display custom in-game code Editor with tabs saved to HDD + Usage: Press ENTER to toggle menu on or off + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_display"]; +disableSerialization; + +if (rmx_var_editorControl) exitWith { + findDisplay 7100 closeDisplay 1; + rmx_var_editorControl = false; +}; + +rmx_var_editorControl = true; + +findDisplay 46 createDisplay "dUI_editor"; +_display = findDisplay 7100; +_display displayAddEventHandler ["keyDown", "_this call rmx_fnc_keyDown;"]; + +rmx_var_ctrl_editorMain = [_display displayCtrl 7200, _display displayCtrl 7300]; +rmx_var_ctrl_editorItems = []; + +for "_i" from 7200 to 7216 do { + rmx_var_ctrl_editorItems set [count rmx_var_ctrl_editorItems,_display displayCtrl _i]; +}; + +true + + + + + + + + + + + + + + + + + diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/codeEditorActions.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/codeEditorActions.sqf new file mode 100644 index 00000000..cb0da2ed --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/codeEditorActions.sqf @@ -0,0 +1,106 @@ +/* + Function Name: rmx_fnc_codeEditorActions + Author: Raimonds Virtoss | Raymix + Description: Actions required for Editor + + License: --- +*/ +private ["_action","_tab"]; + +_action = param [0, 100]; +_tab = param [1, 0]; + +switch (_action) do +{ + case "exec_client": + { + playSound "click"; + _code = ctrlText (rmx_var_ctrl_editorItems select 1); + call compile _code; //add try catch + }; + case "exec_server": + { + hintSilent (ctrlText (rmx_var_ctrl_editorItems select 1)); + }; + case "save": + { + playSound "click"; + rmx_var_ctrl_editorTabContent set [rmx_var_editorIndex, ctrlText (rmx_var_ctrl_editorItems select 1)]; + profileNamespace setVariable ["rmx_var_ctrl_editorTabContent",rmx_var_ctrl_editorTabContent]; + }; + case "clear": + { + playSound "click"; + (rmx_var_ctrl_editorItems select 1) ctrlSetText ""; + rmx_var_ctrl_editorTabContent set [rmx_var_editorIndex, ctrlText (rmx_var_ctrl_editorItems select 1)]; + }; + case "slider": + { + playSound "click"; + _pos = (sliderPosition (rmx_var_ctrl_editorItems select 12)) / 10; + { + _x ctrlSetFade (_pos min 0.7); + _x ctrlCommit 1; + } forEach rmx_var_ctrl_editorItems + rmx_var_ctrl_editorMain; + }; + case "load": + { + setMousePosition [0.5,0.5]; + [] spawn { + waitUntil {!isNull (rmx_var_ctrl_editorItems select 1)}; + (rmx_var_ctrl_editorItems select 1) ctrlSetText (rmx_var_ctrl_editorTabContent select rmx_var_editorIndex); + + //read positions + disableSerialization; + if (!isnil "rmx_var_editorPosition") then + { + { + _x ctrlSetPosition (rmx_var_editorPosition select _forEachIndex); + _x ctrlCommit 0; + } forEach rmx_var_ctrl_editorItems + rmx_var_ctrl_editorMain; + }; + + (rmx_var_ctrl_editorItems select 12) sliderSetPosition rmx_var_ctrl_editorContentFade; + "slider" call rmx_fnc_codeEditorActions; + + for "_i" from 2 to 10 do + { + (rmx_var_ctrl_editorItems select _i) ctrlSetTextColor [0.2,0.2,0.2,0.4]; + }; + (rmx_var_ctrl_editorItems select rmx_var_editorIndex + 2) ctrlSetTextColor (call rmx_fnc_getColorScheme); + (rmx_var_ctrl_editorMain select 1) ctrlSetBackgroundColor (call rmx_fnc_getColorScheme); + + for "_c" from 13 to 16 do { + (rmx_var_ctrl_editorItems select _c) ctrlSetTextColor (call rmx_fnc_getColorScheme); + }; + }; + }; + case "unload": + { + rmx_var_editorControl = false; + rmx_var_ctrl_editorTabContent set [rmx_var_editorIndex, ctrlText (rmx_var_ctrl_editorItems select 1)]; + + //store positions + rmx_var_editorPosition = []; + + { + rmx_var_editorPosition pushBack (ctrlPosition _x); + } forEach rmx_var_ctrl_editorItems + rmx_var_ctrl_editorMain; + rmx_var_ctrl_editorContentFade = sliderPosition (rmx_var_ctrl_editorItems select 12); + profileNamespace setVariable ["rmx_var_ctrl_editorContentFade", rmx_var_ctrl_editorContentFade]; + }; + case "tabs": + { + playSound "click"; + rmx_var_editorIndex = _tab; + profilenamespace setVariable ["rmx_var_editorIndex", rmx_var_editorIndex]; + + for "_i" from 2 to 10 do + { + (rmx_var_ctrl_editorItems select _i) ctrlSetTextColor [0.2,0.2,0.2,0.4]; + }; + (rmx_var_ctrl_editorItems select _tab + 2) ctrlSetTextColor (call rmx_fnc_getColorScheme); + + (rmx_var_ctrl_editorItems select 1) ctrlSetText (rmx_var_ctrl_editorTabContent select _tab); + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/console.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/console.sqf new file mode 100644 index 00000000..2367cf8c --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/console.sqf @@ -0,0 +1,64 @@ +/* + Function Name: rmx_fnc_console + Author: Raimonds Virtoss | Raymix + Description: Display custom in-game console + Usage: Press F2 to enable + Note: Player movement is not disabled + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_display","_item","_currPosItem","_console","_currPos","_newPos"]; +disableSerialization; + +switch (rmx_var_consoleEnabled) do { + case false: + { + if (_shift) then { + findDisplay 46 createDisplay "dUI_console"; + _display = findDisplay 9100; + _display displayAddEventHandler ["keyDown", "_this call rmx_fnc_keyDown;"]; + } else { + 9100 cutRsc ["dUI_console2","PLAIN"]; + _display = uiNamespace getVariable "rmx_var_console2"; + }; + rmx_var_ctrl_console = []; + rmx_var_ctrl_consoleItems = []; + + for "_i" from 9000 to 9039 do { + rmx_var_ctrl_console set [count rmx_var_ctrl_console,_display displayCtrl _i]; + }; + + {rmx_var_ctrl_consoleItems set [count rmx_var_ctrl_consoleItems,_display displayCtrl _x]; + }count [9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9050]; + + (rmx_var_ctrl_consoleItems select 5) cbSetChecked rmx_var_consoleCheckbox_info; + (rmx_var_ctrl_consoleItems select 6) cbSetChecked rmx_var_consoleCheckbox_warnings; + (rmx_var_ctrl_consoleItems select 7) cbSetChecked rmx_var_consoleCheckbox_critical; + (rmx_var_ctrl_consoleItems select 8) cbSetChecked rmx_var_consoleCheckbox_pause; + + if (rmx_var_consoleSetting <= 0) then {rmx_var_consoleSetting = 0}; //correct min + if (rmx_var_consoleSetting >= 1.6) then {rmx_var_consoleSetting = 1.6}; //correct max + for "_i" from 0 to 11 do { + _item = rmx_var_ctrl_consoleItems select _i; + _currPosItem = ctrlPosition _item; + _item ctrlSetPosition [_currPosItem select 0,(_currPosItem select 1) + rmx_var_consoleSetting,_currPosItem select 2,_currPosItem select 3]; + _item ctrlCommit 0.2; + }; + + _console = rmx_var_ctrl_consoleItems select 12; + _currPos = ctrlPosition _console; + _newPos = [_currPos select 0,_currPos select 1,_currPos select 2,(_currPos select 3) + rmx_var_consoleSetting]; + _console ctrlSetPosition _newPos; + _console ctrlCommit 0.2; + + rmx_var_consoleEnabled = true; + call rmx_fnc_consoleUpdate; + }; + case true: + { + findDisplay 9100 closeDisplay 1; + 9100 cutRsc ["Default","PLAIN"]; + rmx_var_consoleEnabled = false; + }; +}; diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/consoleFilters.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/consoleFilters.sqf new file mode 100644 index 00000000..c15619e9 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/consoleFilters.sqf @@ -0,0 +1,82 @@ +/* + Function Name: rmx_fnc_consoleFilters + Author: Raimonds Virtoss | Raymix + Description: Manages debug console and saves settings to profile if required + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_case","_checkBoxState"]; +disableSerialization; + +_case = str (_this select 0); +_checkBoxState = _this select 1; +switch (_case) do { //TODO - save to profile Namespace + case "Control #9205": //Checkbox: info + { + rmx_var_consoleCheckbox_info = if (_checkBoxState == 1) then {true} else {false}; + }; + case "Control #9206": //Checkbox: warnings + { + rmx_var_consoleCheckbox_warnings = if (_checkBoxState == 1) then {true} else {false}; + }; + case "Control #9207": //Checkbox: critical + { + rmx_var_consoleCheckbox_critical = if (_checkBoxState == 1) then {true} else {false}; + }; + case "Control #9208": //Checkbox: pause + { + rmx_var_consoleCheckbox_pause = if (_checkBoxState == 1) then {true} else {false}; + }; + case "Control #9209": //Button - + { + private ["_item","_currPosItem","_console","_currPos","_newPos"]; + + if (rmx_var_consoleSetting <= 0) exitWith {rmx_var_consoleSetting = 0}; + for "_i" from 0 to 11 do { + _item = rmx_var_ctrl_consoleItems select _i; + _currPosItem = ctrlPosition _item; + _item ctrlSetPosition [_currPosItem select 0,(_currPosItem select 1) - 0.2,_currPosItem select 2,_currPosItem select 3]; + _item ctrlCommit 0.2; + }; + + _console = rmx_var_ctrl_consoleItems select 12; + _currPos = ctrlPosition _console; + _newPos = [_currPos select 0,_currPos select 1,_currPos select 2,(_currPos select 3) - 0.2]; + _console ctrlSetPosition _newPos; + _console ctrlCommit 0.2; + rmx_var_consoleSetting = rmx_var_consoleSetting -0.2; + }; + case "Control #9210": //Button + + { + private ["_item","_currPosItem","_console","_currPos","_newPos"]; + + if (rmx_var_consoleSetting >= 1.6) exitWith {rmx_var_consoleSetting = 1.6}; + for "_i" from 0 to 11 do { + _item = rmx_var_ctrl_consoleItems select _i; + _currPosItem = ctrlPosition _item; + _item ctrlSetPosition [_currPosItem select 0,(_currPosItem select 1) + 0.2,_currPosItem select 2,_currPosItem select 3]; + _item ctrlCommit 0.2; + }; + + _console = rmx_var_ctrl_consoleItems select 12; + _currPos = ctrlPosition _console; + _newPos = [_currPos select 0,_currPos select 1,_currPos select 2,(_currPos select 3) + 0.2]; + _console ctrlSetPosition _newPos; + _console ctrlCommit 0.2; + rmx_var_consoleSetting = rmx_var_consoleSetting + 0.2; + }; + case "Control #9211": //Button Clear + { + for "_i" from 0 to 39 do { + rmx_var_console_list set [_i,(text "")]; + }; + rmx_var_logBuffer = []; + call rmx_fnc_consoleUpdate; + }; + default {format ["Wrong input: %1",_this] warning;}; +}; + +//save variable settings permanently +profileNamespace setVariable ["rmx_var_consoleSetting",rmx_var_consoleSetting]; +profileNamespace setVariable ["rmx_var_consoleCBstate",[rmx_var_consoleCheckbox_info,rmx_var_consoleCheckbox_warnings,rmx_var_consoleCheckbox_critical,rmx_var_consoleCheckbox_pause]]; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/consoleUpdate.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/consoleUpdate.sqf new file mode 100644 index 00000000..51be3201 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/consoleUpdate.sqf @@ -0,0 +1,18 @@ +/* + Function Name: rmx_fnc_consoleUpdate + Author: Raimonds Virtoss | Raymix + Description: Writes to console + Can be called to refresh/update console + License: --- +*/ +disableSerialization; + +if (!rmx_var_consoleEnabled) exitWith {true}; //required: _ctrl only works when dialog exists + +{ + _ctrl = rmx_var_ctrl_console select _forEachIndex; + _ctrl ctrlSetStructuredText _x; + _ctrl ctrlCommit 0; +} forEach rmx_var_console_list; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/dialogVars.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/dialogVars.sqf new file mode 100644 index 00000000..04a4951e --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/dialogVars.sqf @@ -0,0 +1,111 @@ +/* + Function Name: rmx_fnc_dialogVars + Author: Raimonds Virtoss | Raymix + Description: Variable defines used for currently developed functions or debugging. + + This function is recompiled and called during preInit + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> + +rmx_var_logMsg = []; +rmx_var_logBufferSize = 200; +rmx_var_logBuffer = []; +rmx_var_logsweepcycle = 0.01; + +"Use Shift + F2 to open console as a display with ability to click buttons" warning; + +rmx_var_quickFnc_items = [[[0,1,0,1],"Example","call doSTUFF;"]]; + +//Default dialog toggle state defines +if (isNil "rmx_var_consoleEnabled") then {rmx_var_consoleEnabled = false;}; +if (isNil "rmx_var_quickFncEnabled") then {rmx_var_quickFncEnabled = false;}; +if (isNil "rmx_var_atmosFearEnabled") then {rmx_var_atmosFearEnabled = false;}; +if (isNil "rmx_var_ppViewerEnabled") then {rmx_var_ppViewerEnabled = false;}; +if (isNil "rmx_var_editorControl") then {rmx_var_editorControl = false;}; +if (isNil "rmx_var_watcherControl") then {rmx_var_watcherControl = false;}; +if (isNil "rmx_var_watcherPinned") then {rmx_var_watcherPinned = false;}; + +//gather default saved variables for console state from profile namespace (checkbox selection and console size) +rmx_var_consoleSetting = profileNamespace getVariable ["rmx_var_consoleSetting",0]; +rmx_var_consoleCBstate = profileNamespace getVariable ["rmx_var_consoleCBstate",[true,true,true,false]]; +rmx_var_consoleCheckbox_info = rmx_var_consoleCBstate select 0; +rmx_var_consoleCheckbox_warnings = rmx_var_consoleCBstate select 1; +rmx_var_consoleCheckbox_critical = rmx_var_consoleCBstate select 2; +rmx_var_consoleCheckbox_pause = rmx_var_consoleCBstate select 3; + +//generate structured array for console early to avoid problems +if (isNil "rmx_var_console_list") then { + rmx_var_console_list = []; rmx_var_console_list resize 40; + for "_i" from 0 to 39 do { + rmx_var_console_list set [_i,(text "")]; + }; +}; + +/* -------------------- PP VIEWER -------------------- */ +rmx_var_ppCatMain = []; +rmx_var_ppCatCC = []; +rmx_var_ppCatCCV = []; +rmx_var_ppCatCA = []; +rmx_var_ppCatFG = []; +rmx_var_ppCatRB = []; +rmx_var_ppCatWD = []; +rmx_var_ppCatDB = []; +rmx_var_ppCatCI = []; +rmx_var_ppTemplate = [["colorCorrections",1501],["chromAberration",201],["filmGrain",2001],["radialBlur",101],["wetdistortion",301],["dynamicBlur",401],["colorInversion",2501]]; +rmx_var_ppSelected = 0; +rmx_var_ppiSelected = 0; + +rmx_var_ppCcPos = [1,1,0,0,0,0,0,0,0,0,1,0,0,0,0]; +rmx_var_ppCcvPos = [0,0,0,0,0,0,0]; +rmx_var_ppCaPos = [0,0,false]; +rmx_var_ppFgPos = [0,0,1,0,0,false]; +rmx_var_ppRbPos = [0,0,0,0]; +rmx_var_ppWdPos = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; +rmx_var_ppDbPos = [0]; +rmx_var_ppCiPos = [0,0,0]; + +with profileNamespace do { + if !(isNil "rmx_var_ppLoadSave") then { + if (rmx_var_ppLoadSave isEqualTo []) then {rmx_var_ppLoadSave = nil}; + }; +}; +rmx_var_ppLoadSave = profileNamespace getVariable ["rmx_var_ppLoadSave",[[0,"Nothing saved",[1,1,0,0,0,0,0,0,0,0,1,0,0,0,0]]]]; +rmx_var_ppHandles = []; +{ + private "_hndl"; + _hndl = ppEffectCreate [(_x select 0),(_x select 1)]; + _hndl ppEffectEnable false; + rmx_var_ppHandles set [count rmx_var_ppHandles,_hndl]; //pushBack suddenly started giving error +} forEach rmx_var_ppTemplate; +//profileNamespace setVariable ["rmx_var_ppLoadSave",nil]; //deletes profileNS var + +/* -------------------- AtmosFEAR -------------------- */ +rmx_var_afProgress = []; +rmx_var_afInput = []; +rmx_var_afSliders = []; +rmx_var_afMisc = []; +rmx_var_afText = []; +rmx_var_afSelected = 0; + +with profileNamespace do { + if !(isNil "rmx_var_afLoadSave") then { + if (rmx_var_afLoadSave isEqualTo []) then {rmx_var_afLoadSave = nil}; + }; +}; +rmx_var_afProfile = profileNamespace getVariable ["rmx_var_afProfile",[0,0,0,0,[0,0],[0,[0,0,0]],[0,0],[0,0],[0,0],[0,0],[0,0,false]]]; +rmx_var_afLoadSave = profileNamespace getVariable ["rmx_var_afLoadSave",[["Nothing saved",[]]]]; + +/* -------------------- Code Editor -------------------- */ +rmx_var_ctrl_editorContentFade = profileNamespace getVariable ["rmx_var_ctrl_editorContentFade",0]; +rmx_var_editorIndex = profileNamespace getVariable ["rmx_var_editorIndex",1]; +rmx_var_ctrl_editorTabContent = profileNamespace getVariable ["rmx_var_ctrl_editorTabContent",["", "", "", "", "", "", "", "", ""]]; + +/* -------------------- Variable Watcher -------------------- */ +if (isNil "rmx_var_watcher_running") then {rmx_var_watcher_running = false;}; +if (isNil "rmx_var_watcherGrpControls") then {rmx_var_watcherGrpControls = []}; +rmx_var_watcherGrpControls_data = profileNamespace getVariable ["rmx_var_watcherGrpControls_data",[]]; + + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/epoch.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/epoch.sqf new file mode 100644 index 00000000..e69de29b diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/eventHandlers.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/eventHandlers.sqf new file mode 100644 index 00000000..240ba240 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/eventHandlers.sqf @@ -0,0 +1,18 @@ +/* + Function Name: rmx_fnc_eventHandlers + Author: Raimonds Virtoss | Raymix + Description: Bunch of EHs + + License: --- +*/ + +[] spawn { + if !(isServer) then { + waitUntil { uiSleep 0.1; (!isNull (findDisplay 46) && (!isNil "EPOCH_loadingScreenDone")) }; + }; + uiSleep 2; //increase if EH is not getting applied + (findDisplay 46) displayAddEventHandler ["KeyDown","_this call rmx_fnc_keyDown"]; + //(findDisplay 46) displayAddEventHandler ["KeyUp","_this call rmx_fnc_keyUp"]; +}; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/getColorScheme.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/getColorScheme.sqf new file mode 100644 index 00000000..5105a408 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/getColorScheme.sqf @@ -0,0 +1,14 @@ +/* +More at profile vars, unrap first +gui_bcg_rgb_preset +gui_titletext_rgb_preset +gui_bcg_rgb_g +igui_bcg_rgb_b +PresetRColive +*/ +[ + profileNamespace getVariable "gui_bcg_rgb_r", + profileNamespace getVariable "gui_bcg_rgb_g", + profileNamespace getVariable "gui_bcg_rgb_b", + profileNamespace getVariable "gui_bcg_rgb_a" +] \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/keyDown.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/keyDown.sqf new file mode 100644 index 00000000..fc8c2cc3 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/keyDown.sqf @@ -0,0 +1,113 @@ +/* + Function Name: rmx_fnc_keyDown + + Author: Raimonds Virtoss | Raymix + Description: This file detects keystrokes released and calls a function + + List of all keys: + https://community.bistudio.com/wiki/ListOfKeyCodes + + License: --- +*/ +private ["_handled","_key","_dev","_shift","_ctrl","_alt"]; + +_key = param [1,0]; +_shift = param [2,false]; +_ctrl = param [3,false]; +//_alt = param [4,false]; + +_handled = false; + +//disable annoying cmd menu in SP +//if (isServer) then { + if (_this select 1 in [ + 2,3,4,5,6,7,8,9,10,11, //1-0 + 59,60,61,62,63,64,65,66,67,68, //F1-F0 + 14, //backspace + 41 //tilde + ]) then { + [] spawn { + waitUntil {commandingMenu != ""}; + showCommandingMenu ""; + }; + }; +//}; + +switch (_this select 1) do +{ +/* + case 5: + { + _rnd = ""; + for "_i" from 0 to (floor random 50) + 2 do { + _rnd = _rnd + (["a","b","c","d","1","2","3","4"," ","!"] select (floor random 10)); + }; + _st = composeText [parseText "red text here ", linebreak, parseText "green text here "]; + [_st,floor random 10] call Epoch_dynamicText; + }; + + case 57: + { + //[cursorTarget modelToWorld [0,0,0], floor random 10, 10] call Epoch_gui3DCooldown; + //[cursorTarget, 10, "x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa", "Testtesttest", [0,0,0]] call epoch_gui3dModelPos; + //[player modelToWorld [0,2,2],10,"x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa", "Testtesttest"] call epoch_gui3dWorldPos; + //[cursorTarget,0] call epoch_guiObjHP; + _handled = true; + }; +*/ + case 14: //BACKSPACE + { + if (_ctrl) then { + 'rmx_fnc_sandbox' call rmx_fnc_recompile; [] spawn rmx_fnc_sandbox; + }; + }; + case 28: //ENTER + { + if (_ctrl) then { + call rmx_fnc_codeEditor; + _handled = true; + }; + }; + case 74: {rmx_var_3dCtrlSpin_Vector = rmx_var_3dCtrlSpin_Vector - 0.1;}; + case 78: {rmx_var_3dCtrlSpin_Vector = rmx_var_3dCtrlSpin_Vector + 0.1;}; + case 60: //F2 + { + call rmx_fnc_console; + _handled = true; + }; + case 61: //F3 + { + call rmx_fnc_quickFnc; + _handled = true; + }; + case 62: //F4 + { + call rmx_fnc_watcher; + _handled = true; + }; + case 63: //F5 + { + call rmx_fnc_atmosFear; + _handled = true; + }; + case 64: //F6 + { + call rmx_fnc_ppViewer; + _handled = true; + }; + case 65: //F7 + { + ["Reserved for particle effects GUI editor","Hotkey reserved!"] spawn bis_fnc_guiMessage; + _handled = true; + }; + case 66: //F8 + { + ["Reserved for camera director GUI editor","Hotkey reserved!"] spawn bis_fnc_guiMessage; + _handled = true; + }; + +}; + +//uncomment to find keys on the go +//hint format ["Key [%1] pressed", (_this select 1)]; +_handled; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/keyUp.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/keyUp.sqf new file mode 100644 index 00000000..722f4ac7 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/keyUp.sqf @@ -0,0 +1,23 @@ +/* + Function Name: rmx_fnc_keyUp + Author: Raimonds Virtoss | Raymix + Description: This file detects keystrokes released and calls a function + + List of all keys: + https://community.bistudio.com/wiki/ListOfKeyCodes + + License: --- +*/ +private ["_handled","_key","_dev"]; + +_key = _this select 1; +_handled = false; + +switch (_this select 1) do +{ + default {_handled = true;}; +}; + +//uncomment to find keys on the go +//hint format ["Key [%1] released", (_this select 1)]; +_handled; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/output.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/output.sqf new file mode 100644 index 00000000..caf7c1d1 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/output.sqf @@ -0,0 +1,48 @@ +/* + Function Name: rmx_dev_output + Author: Raimonds Virtoss | Raymix + Description: outputs params from quick function + + Usage: ["hint","Test"] call d_dev_output; + "Test" call d_dev_output; + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> + +if (typeName _this != typeName []) then {_this = [_this];}; +if (typeName (_this select 0) == "CONTROL") then {_this = ["No params"]}; + +switch (_this select 0) do { + default { + diag_log str _this; + }; + case "hint": + { + hint str (_this select 1); + }; + case "hintSilent": + { + hintSilent str (_this select 1); + }; + case "diag_log": + { + diag_log str (_this select 1); + }; + case "systemChat": + { + systemChat str (_this select 1); + }; + case "info": + { + (_this select 1) info; + }; + case "warning": + { + (_this select 1) warning; + }; + case "critical": + { + (_this select 1) critical; + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewer.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewer.sqf new file mode 100644 index 00000000..dc16eee7 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewer.sqf @@ -0,0 +1,250 @@ +/* + Function Name: rmx_fnc_ppViewer + Author: Raimonds Virtoss | Raymix + Description: Postprocess viewer + + License: --- +*/ +private ["_display","_diag"]; +disableSerialization; + +switch (rmx_var_ppViewerEnabled) do { + case false: + { + _diag = createDialog "dUI_ppEffects"; + _display = findDisplay 6100; + + {rmx_var_ppCatMain set [count rmx_var_ppCatMain,_display displayCtrl _x];}count + [ + 6110,6111, //combo + 6120, //edit + 6130,6130,6130,6130,6130,6130,6130 //buttons + ]; + + {rmx_var_ppCatCC set [count rmx_var_ppCatCC,_display displayCtrl _x];}count + [ + 6210, //bg + 6220,6221,6222,6223,6224,6225,6250, //txt + 6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244, //sliders + 6251 //bool + ]; + + {rmx_var_ppCatCCV set [count rmx_var_ppCatCCV,_display displayCtrl _x];}count + [ + 6260, //bg + 6270,6271,6272,6273,6274,6275,6276, //txt + 6280,6281,6282,6283,6284,6285,6286 //sliders + ]; + + {rmx_var_ppCatCA set [count rmx_var_ppCatCA,_display displayCtrl _x];}count + [ + 6310, //bg + 6320,6321,6322, //txt + 6330,6331, //sliders + 6340 //cb + ]; + + {rmx_var_ppCatFG set [count rmx_var_ppCatFG,_display displayCtrl _x];}count + [ + 6410, //bg + 6420,6421,6422,6423,6424,6425, //txt + 6430,6431,6432,6433,6434, //sliders + 6440 //cb + ]; + + {rmx_var_ppCatRB set [count rmx_var_ppCatRB,_display displayCtrl _x];}count + [ + 6510, //bg + 6520,6521,6522,6523, //txt + 6530,6531,6532,6533 //sliders + ]; + + {rmx_var_ppCatWD set [count rmx_var_ppCatWD,_display displayCtrl _x];}count + [ + 6610, //bg + 6620,6621,6622,6623,6624,6625, //txt + 6630,6631,6632,6633,6634,6635,6636,6637,6638,6639,6640,6641,6642,6643,6644 //sliders + ]; + + {rmx_var_ppCatDB set [count rmx_var_ppCatDB,_display displayCtrl _x];}count + [ + 6710, //bg + 6720, //txt + 6730 //sliders + ]; + + {rmx_var_ppCatCI set [count rmx_var_ppCatCI,_display displayCtrl _x];}count + [ + 6810, //bg + 6820,6821,6822, //txt + 6830,6831,6832 //sliders + ]; + + "range" call rmx_fnc_ppViewerGetSet; //sets slider ranges + ["load"] call rmx_fnc_ppViewerUpdate; + "" call rmx_fnc_ppViewerGetSet; //loads default positions and selections + call rmx_fnc_ppViewerEffects; + rmx_var_ppViewerEnabled = true; + }; + case true: + { + closeDialog 0; + rmx_var_ppViewerEnabled = false; + }; +}; + +true +/* + +dUI_ppEffects - IDD 6100 + +Category: + Combo: Main: 6110 + Load: 6111 + + Edit: 6120 + + Buttons: Load: 6130 + Save: 6131 + Reset: 6132 + Random: 6133 + Delete: 6134 + RPT: 6135 + Reset ALL: 6136 + +Color Correction: + Background: 6210 + + Text: Brightness: 6220 + Contrast: 6221 + Offset: 6222 + Blend: 6223 + Colorize1: 6224 + Colorize2: 6225 + Vignette: 6250 + + Sliders: Brightness: 6230 + Contrast: 6231 + Offset: 6232 + Blend Red: 6233 + Blend Green: 6234 + Blend Blue: 6235 + Blend Alpha: 6236 + Colorize1 Red: 6237 + Colorize1 Green: 6238 + Colorize1 Blue: 6239 + Colorize1 Alpha: 6240 + Colorize2 Red: 6241 + Colorize2 Green: 6242 + Colorize2 Blue: 6243 + Colorize2 Alpha: 6244 + + Bool: + Vignette bool: 6251 + + Vignette: Background: 6260 + + Text: Hsize: 6270 + Vsize: 6271 + ?: 6272 + Hpos: 6273 + Vpos: 6274 + STR: 6275 + Alpha: 6276 + + Slider: Hsize: 6280 + Vsize: 6281 + ?: 6282 + Hpos: 6283 + Vpos: 6284 + STR: 6285 + Alpha: 6286 + +Chromatic aberration + Background: 6310 + + Text: X: 6320 + Y: 6321 + Aspect: 6322 + + Sliders: X: 6330 + Y: 6331 + + Checkbox: CB: 6340 + +Film grain + Background: 6410 + + Text: Sharpness: 6420 + Intensity: 6421 + Grain Size: 6422 + Intensityx0: 6423 + Intensityx1: 6424 + Monochromic: 6425 + + Sliders: Sharpness: 6430 + Intensity: 6431 + Grain Size: 6432 + Intensityx0: 6433 + Intensityx1: 6434 + + Checkbox: Bool: 6440 + +Radial Blur + Background: 6510 + + Text: Relative X: 6520 + Relative Y: 6521 + Centre X: 6522 + Centre Y: 6523 + + Sliders: Relative X: 6530 + Relative Y: 6531 + Centre X: 6532 + Centre Y: 6533 + +Water Distortion + BackGround: 6610 + + Text: Bluriness: 6620 + STR Top: 6621 + STR Bot: 6622 + Wave speed: 6623 + Wave amp: 6624 + Phase: 6625 + + Sliders: Blur: 6630 + STR Top: 6631 + STR Bot: 6632 + Wave speed 1: 6633 + Wave speed 2: 6634 + Wave speed 3: 6635 + Wave speed 4: 6636 + Wave amp 1: 6637 + Wave amp 2: 6638 + Wave amp 3: 6639 + Wave amp 4: 6640 + Phase 1: 6641 + Phase 2: 6642 + Phase 3: 6643 + Phase 4: 6644 + +Dynamic blur + Background: 6710 + + Text: 6720 + + Slider: 6730 + +Color inversion + Background: 6810 + + Text: Red: 6820 + Green: 6821 + Blue: 6822 + + Sliders: Red: 6830 + Green: 6831 + Blue: 6832 + +*/ \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerEffects.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerEffects.sqf new file mode 100644 index 00000000..4e082785 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerEffects.sqf @@ -0,0 +1,86 @@ +/* + Function Name: rmx_fnc_ppViewerEffects + Author: Raimonds Virtoss | Raymix + Description: PPV Effects, responsible for all the math and applying effects + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_currEffect","_handle","_adjust"]; +disableSerialization; + +_currEffect = rmx_var_ppTemplate select rmx_var_ppSelected select 0; +_handle = rmx_var_ppHandles select rmx_var_ppSelected; + +//hintSilent format ["E: %1",_this]; + +switch (_currEffect) do { + case "colorCorrections": + { + rmx_var_ppCcPos = []; + for "_i" from 8 to 22 do { + rmx_var_ppCcPos pushBack (sliderPosition (rmx_var_ppCatCC select _i)); + }; + if (cbChecked (rmx_var_ppCatCC select 23)) then { + rmx_var_ppCcvPos = []; + for "_i" from 8 to 14 do { + rmx_var_ppCcvPos pushBack (sliderPosition (rmx_var_ppCatCCV select _i)); + }; + rmx_var_ppCcPos append rmx_var_ppCcvPos; + }; + _adjust = rmx_var_ppCcPos; + }; + case "chromAberration": + { + rmx_var_ppCaPos = [ + sliderPosition (rmx_var_ppCatCA select 4), + sliderPosition (rmx_var_ppCatCA select 5), + cbChecked (rmx_var_ppCatCA select 6) + ]; + _adjust = rmx_var_ppCaPos; + }; + case "filmGrain": + { + rmx_var_ppFgPos = []; + for "_i" from 7 to 11 do { + rmx_var_ppFgPos pushBack (sliderPosition (rmx_var_ppCatFG select _i)); + }; + rmx_var_ppFgPos pushBack (cbChecked (rmx_var_ppCatFG select 12)); + _adjust = rmx_var_ppFgPos; + }; + case "radialBlur": + { + rmx_var_ppRbPos = []; + for "_i" from 5 to 8 do { + rmx_var_ppRbPos pushBack (sliderPosition (rmx_var_ppCatRB select _i)); + }; + _adjust = rmx_var_ppRbPos; + }; + case "wetdistortion": + { + rmx_var_ppWdPos = []; + for "_i" from 7 to 21 do { + rmx_var_ppWdPos pushBack (sliderPosition (rmx_var_ppCatWD select _i)); + }; + _adjust = rmx_var_ppWdPos; + }; + case "dynamicBlur": + { + rmx_var_ppDbPos = [sliderPosition (rmx_var_ppCatDB select 2)]; + _adjust = rmx_var_ppDbPos; + }; + case "colorInversion": + { + rmx_var_ppCiPos = []; + for "_i" from 4 to 6 do { + rmx_var_ppCiPos pushBack (sliderPosition (rmx_var_ppCatCI select _i)); + }; + _adjust = rmx_var_ppCiPos; + }; +}; +//(format ["%1 >> %2",_currEffect,_adjust]) info; +_handle ppEffectEnable true; +_handle ppEffectAdjust _adjust; +_handle ppEffectCommit 0; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerGetSet.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerGetSet.sqf new file mode 100644 index 00000000..26d28c37 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerGetSet.sqf @@ -0,0 +1,117 @@ +/* + Function Name: rmx_fnc_ppViewerGetSet + Author: Raimonds Virtoss | Raymix + Description: PPV profiles and positions + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +disableSerialization; + + +switch (_this) do { + default { + (rmx_var_ppCatMain select 0) lbSetCurSel rmx_var_ppSelected; + (rmx_var_ppCatMain select 1) lbSetCurSel rmx_var_ppiSelected; + if ((cbChecked (rmx_var_ppCatCC select 23)) && (rmx_var_ppSelected isEqualTo 0)) then { + { + _x ctrlShow true; + } count rmx_var_ppCatCCV; + }; + + (rmx_var_ppCatCA select 6) cbSetChecked (rmx_var_ppCaPos select 2); + (rmx_var_ppCatFG select 12) cbSetChecked (rmx_var_ppFgPos select 5); + + { + _x sliderSetPosition (rmx_var_ppCcPos select _forEachIndex); + } forEach (rmx_var_ppCatCC select [8,15]); + { + _x sliderSetPosition (rmx_var_ppCcvPos select _forEachIndex); + } forEach (rmx_var_ppCatCCV select [8,7]); + { + _x sliderSetPosition (rmx_var_ppCaPos select _forEachIndex); + } forEach (rmx_var_ppCatCA select [4,2]); + { + _x sliderSetPosition (rmx_var_ppFgPos select _forEachIndex); + } forEach (rmx_var_ppCatFG select [7,5]); + { + _x sliderSetPosition (rmx_var_ppRbPos select _forEachIndex); + } forEach (rmx_var_ppCatRB select [5,4]); + { + _x sliderSetPosition (rmx_var_ppWdPos select _forEachIndex); + } forEach (rmx_var_ppCatWD select [7,15]); + { + _x sliderSetPosition (rmx_var_ppDbPos select _forEachIndex); + } forEach [(rmx_var_ppCatDB select 2)]; + { + _x sliderSetPosition (rmx_var_ppCiPos select _forEachIndex); + } forEach (rmx_var_ppCatCI select [4,3]); + + }; + case "range": + { + for "_i" from 8 to 22 do { + (rmx_var_ppCatCC select _i) sliderSetRange [0, 1]; + }; + + for "_i" from 8 to 14 do { + (rmx_var_ppCatCCV select _i) sliderSetRange [0, 1]; + }; + + (rmx_var_ppCatCA select 4) sliderSetRange [0, 1]; //x + (rmx_var_ppCatCA select 5) sliderSetRange [0, 1]; //y + + (rmx_var_ppCatFG select 7) sliderSetRange [0, 20]; //sharpness + (rmx_var_ppCatFG select 8) sliderSetRange [0, 1]; //intensity + (rmx_var_ppCatFG select 9) sliderSetRange [1, 8]; //grain size + (rmx_var_ppCatFG select 10) sliderSetRange [0, 1]; //x0 + (rmx_var_ppCatFG select 11) sliderSetRange [0, 1]; //x1 + + (rmx_var_ppCatRB select 5) sliderSetRange [0, 1]; //Rx + (rmx_var_ppCatRB select 6) sliderSetRange [0, 1]; //Ry + (rmx_var_ppCatRB select 7) sliderSetRange [0, 0.5]; //Cx + (rmx_var_ppCatRB select 8) sliderSetRange [0, 0.5]; //Cy + + for "_i" from 7 to 21 do { + (rmx_var_ppCatWD select _i) sliderSetRange [-1, 1]; + }; + + (rmx_var_ppCatDB select 2) sliderSetRange [0, 1]; //db + + for "_i" from 4 to 6 do { + (rmx_var_ppCatCI select _i) sliderSetRange [0, 1]; + }; + + }; + case "import": + { + private ["_in","_var","_inVal"]; + _in = profileNamespace getVariable ["rmx_var_ppLoadSave",[]]; + if (_in isEqualTo []) exitWith {hint "Nothing to load"}; + _inVal = _in select rmx_var_ppiSelected; + _var = ["rmx_var_ppCcPos","rmx_var_ppCaPos","rmx_var_ppFgPos","rmx_var_ppRbPos","rmx_var_ppWdPos","rmx_var_ppDbPos","rmx_var_ppCiPos"] select (_inVal select 0); + missionNamespace setVariable [_var,(_inVal select 2)]; + rmx_var_ppSelected = _inVal select 0; + "" call rmx_fnc_ppViewerGetSet; //loads default positions and selections + call rmx_fnc_ppViewerEffects; + }; + case "export": + { + if (ctrlText (rmx_var_ppCatMain select 2) isEqualTo "") exitWith {hint "Effect name cannot be blank"}; + rmx_var_ppLoadSave = profileNamespace getVariable ["rmx_var_ppLoadSave",[]]; + rmx_var_ppLoadSave pushBack [ + rmx_var_ppSelected, + ctrlText (rmx_var_ppCatMain select 2), + ([rmx_var_ppCcPos,rmx_var_ppCaPos,rmx_var_ppFgPos,rmx_var_ppRbPos,rmx_var_ppWdPos,rmx_var_ppDbPos,rmx_var_ppCiPos] select rmx_var_ppSelected) + ]; + profileNamespace setVariable ["rmx_var_ppLoadSave",rmx_var_ppLoadSave]; + + lbClear (rmx_var_ppCatMain select 1); + + { + (rmx_var_ppCatMain select 1) lbAdd (_x select 1); + } forEach rmx_var_ppLoadSave; + }; +}; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerUpdate.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerUpdate.sqf new file mode 100644 index 00000000..a5d25a01 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/ppViewerUpdate.sqf @@ -0,0 +1,196 @@ +/* + Function Name: rmx_fnc_ppViewerUpdate + Author: Raimonds Virtoss | Raymix + Description: PPV updater, responsible for main category and slider positions + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_args","_selection","_ctrl"]; +disableSerialization; + +_args = _this select 0; +_selection = _this select 1; +_ctrl = [rmx_var_ppCatCC, rmx_var_ppCatCA, rmx_var_ppCatFG, rmx_var_ppCatRB, rmx_var_ppCatWD, rmx_var_ppCatDB, rmx_var_ppCatCI, rmx_var_ppCatCCV]; +if (typeName _args != "STRING") then {_args = str _args}; +//hintSilent format ["U: %1",_this]; + +switch (_args) do { + case "load": + { + { + { + _x ctrlShow false; + } count _x; + } forEach _ctrl; + + lbClear (rmx_var_ppCatMain select 0); + + { + (rmx_var_ppCatMain select 0) lbAdd _x; + } forEach ["Color Correction","Chromatic Aberration","Film Grain","Radial Blur","Wet Distortion","Dynamic Blur","Color inversion"]; //does not like count + + lbClear (rmx_var_ppCatMain select 1); + + { + (rmx_var_ppCatMain select 1) lbAdd (_x select 1); + } forEach rmx_var_ppLoadSave; + }; + case "unload": + { + rmx_var_ppViewerEnabled = false; + rmx_var_ppCatMain = []; + rmx_var_ppCatCC = []; + rmx_var_ppCatCCV = []; + rmx_var_ppCatCA = []; + rmx_var_ppCatFG = []; + rmx_var_ppCatRB = []; + rmx_var_ppCatWD = []; + rmx_var_ppCatDB = []; + rmx_var_ppCatCI = []; + }; + case "import": + { + { + { + if (ctrlShown _x) then {_x ctrlShow false;}; + } count _x; + } forEach _ctrl; + + { + _x ctrlShow true; + } count (_ctrl select (rmx_var_ppLoadSave select rmx_var_ppiSelected select 0)); + }; + case "Control #6110": //main combo + { + { + { + if (ctrlShown _x) then {_x ctrlShow false;}; + } count _x; + } forEach _ctrl; + + { + _x ctrlShow true; + } count (_ctrl select _selection); + rmx_var_ppSelected = _selection; + }; + case "Control #6111": //loadsave combo + { + rmx_var_ppiSelected = _selection; + }; + case "Control #6132": //reset + { + private "_currEffect"; + _currEffect = rmx_var_ppHandles select rmx_var_ppSelected; + _currEffect ppEffectEnable false; + }; + case "Control #6133": //random + { + switch (rmx_var_ppSelected) do { + case 0: //cc + { + rmx_var_ppCcPos = [random 1,random 1,random 1,random 1,random 1,random 1,random 1,random 1,random 1,random 1,random 1,random 1,random 1,random 1,random 1]; + if (cbChecked (rmx_var_ppCatCC select 23)) then { + rmx_var_ppCcvPos = [random 1,random 1,random 1,random 1,random 1,random 1,random 1]; + rmx_var_ppCcPos append rmx_var_ppCcvPos; + }; + }; + case 1: //ca + { + private "_bool"; + _bool = if (random 1 > 0.5) then {true} else {false}; + rmx_var_ppCaPos = [random 1,random 1,_bool]; + (rmx_var_ppCatCA select 6) cbSetChecked _bool; + }; + case 2: //fg + { + private "_bool"; + _bool = if (random 1 > 0.5) then {true} else {false}; + rmx_var_ppFgPos = [random 20,random 1,(random 7) + 1,random 1,random 1,_bool]; + (rmx_var_ppCatFG select 12) cbSetChecked _bool; + }; + case 3: //rb + { + rmx_var_ppRbPos = [random 1,random 1,random 0.5,random 0.5]; + }; + case 4: //wd + { + rmx_var_ppWdPos = [(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1,(random 2 ) - 1]; + }; + case 5: //db + { + rmx_var_ppDbPos = [random 1]; + }; + case 6: //ci + { + rmx_var_ppCiPos = [random 1,random 1,random 1]; + }; + + }; + "" call rmx_fnc_ppViewerGetSet; + call rmx_fnc_ppViewerEffects; + }; + case "Control #6134": //del + { + if (profileNamespace getVariable ["rmx_var_ppLoadSave",[]] isEqualTo [] ) exitWith {hint "Nothing saved"}; + + private ["_in","_rem"]; + _in = profileNamespace getVariable "rmx_var_ppLoadSave"; + _rem = _in deleteAt rmx_var_ppiSelected; + profileNamespace setVariable ["rmx_var_ppLoadSave",_in]; + (format ["Deleted effect: %1 = %2",_rem select 1,_rem select 2]) warning; + lbClear (rmx_var_ppCatMain select 1); + + { + (rmx_var_ppCatMain select 1) lbAdd (_x select 1); + } forEach rmx_var_ppLoadSave; + + }; + case "Control #6135": // RPT + { + { + diag_log format ["<< %1 >>",(_x select 0)]; + diag_log (_x select 1); + } forEach + [ + ["colorCorrections", rmx_var_ppCcPos], + ["chromAberration", rmx_var_ppCaPos], + ["filmGrain", rmx_var_ppFgPos], + ["radialBlur", rmx_var_ppRbPos], + ["wetdistortion", rmx_var_ppWdPos], + ["dynamicBlur", rmx_var_ppDbPos], + ["colorInversion", rmx_var_ppCiPos] + ]; + }; + case "Control #6136": //reset all + { + { + _x ppEffectEnable false; + } forEach rmx_var_ppHandles; + rmx_var_ppCcPos = [1,1,0,0,0,0,0,0,0,0,1,0,0,0,0]; + rmx_var_ppCcvPos = [0,0,0,0,0,0,0]; + rmx_var_ppCaPos = [0,0,false]; + rmx_var_ppFgPos = [0,0,1,0,0,false]; + rmx_var_ppRbPos = [0,0,0,0]; + rmx_var_ppWdPos = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; + rmx_var_ppDbPos = [0]; + rmx_var_ppCiPos = [0,0,0]; + "" call rmx_fnc_ppViewerGetSet; + }; + + case "Control #6251": //vignette bool + { + private "_bool"; + _bool = if (_selection isEqualTo 0) then {false} else {true}; + { + _x ctrlShow _bool; + } count rmx_var_ppCatCCV; + + }; + default + { + + }; +}; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/quickFnc.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/quickFnc.sqf new file mode 100644 index 00000000..f061531b --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/quickFnc.sqf @@ -0,0 +1,34 @@ +/* + Function Name: rmx_fnc_dev_quickFnc + Author: Raimonds Virtoss | Raymix + Description: Function quick-launch dialog +*/ +private ["_display","_diag","_listBox"]; +disableSerialization; + +switch (rmx_var_quickFncEnabled) do { + case false: + { + _diag = createDialog "dUI_quickFunction"; + _display = findDisplay 9400; + _listBox = _display displayCtrl 9403; + _editBox = _display displayCtrl 9404; + _listBox ctrlSetEventHandler ["LBDblClick","_editBox = ctrlText (findDisplay 9400 displayCtrl 9404); _fnc = ((_this select 0) lbData (_this select 1)); systemChat _fnc; call compile (_editBox + ' ' + _fnc);"]; + _editBox ctrlSetText (profileNamespace getVariable ["rmx_var_quickFnc_editBox","Params"]); + + { + _idx = _listBox lbAdd (_x select 1); + _listBox lbSetColor [_idx,(_x select 0)]; + _listBox lbSetData [_idx,(_x select 2)]; + _listBox lbSetTooltip [_idx,(_x select 2)]; + } count rmx_var_quickFnc_items; + + rmx_var_quickFncEnabled = true; + }; + case true: + { + profileNamespace setVariable ["rmx_var_quickFnc_editBox",ctrlText (findDisplay 9400 displayCtrl 9404)]; + closeDialog 0; + rmx_var_quickFncEnabled = false; + }; +}; diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/watcher.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/watcher.sqf new file mode 100644 index 00000000..e1fa036b --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/watcher.sqf @@ -0,0 +1,156 @@ +/* + Function Name: rmx_fnc_watcher + Author: Raimonds Virtoss | Raymix + Description: Display custom in-game code Editor with tabs saved to HDD + Usage: Press CTRL + ENTER to enable + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> +private ["_display"]; + +_display = displayNull; + +if (str (findDisplay 7500) isEqualTo "Display #7500") then { + "unload" call rmx_fnc_watcherActions; +}; + +findDisplay 7500 closeDisplay 1; +7500 cutRsc ["Default","PLAIN"]; + + + +if (!rmx_var_watcherControl) then { + + findDisplay 46 createDisplay "dUI_watcher"; + _display = findDisplay 7500; + _display displayAddEventHandler ["keyDown", "_this call rmx_fnc_keyDown;"]; + rmx_var_watcherControl = true; +} else { + + if (rmx_var_watcherPinned) then { + 7500 cutRsc ["dUI_watcher2","PLAIN"]; + _display = uiNamespace getVariable "rmx_var_watcher2"; + }; + rmx_var_watcherControl = false; +}; + +//Exit if not pinned +if (isNull _display) exitWith {false}; + +setMousePosition [0.5,0.5]; + +rmx_var_ctrl_watcherItems = []; + +for "_i" from 7501 to 7508 do { + rmx_var_ctrl_watcherItems set [count rmx_var_ctrl_watcherItems,_display displayCtrl _i]; +}; + +//Load positions, create if doesn't exist anywhere +rmx_var_watcherPositions = profileNamespace getVariable ["rmx_var_watcherPositions",nil]; +if (isNil "rmx_var_watcherPositions") then { + rmx_var_watcherPositions = []; + { + rmx_var_watcherPositions pushBack (ctrlPosition _x); + } forEach rmx_var_ctrl_watcherItems; +}; + +{ + _x ctrlSetPosition (rmx_var_watcherPositions select _forEachIndex); + _x ctrlCommit 0; +} forEach rmx_var_ctrl_watcherItems; + +if (!rmx_var_watcherPinned) then { + (rmx_var_ctrl_watcherItems select 2) ctrlSetText "x\addons\rmx_init\data\retardedPinUp.paa"; +} else { + (rmx_var_ctrl_watcherItems select 2) ctrlSetText "x\addons\rmx_init\data\retardedPinDown.paa"; +}; + +(rmx_var_ctrl_watcherItems select 1) ctrlSetBackgroundColor (call rmx_fnc_getColorScheme); + +if (!rmx_var_watcherControl && rmx_var_watcherPinned) then { + (rmx_var_ctrl_watcherItems select 1) ctrlSetText ""; + (rmx_var_ctrl_watcherItems select 1) ctrlSetBackgroundColor [0,0,0,0]; + { + (rmx_var_ctrl_watcherItems select _x) ctrlShow false; + }count [0,1,2,3,4,5,7]; +}; + +{ + _idx = (rmx_var_ctrl_watcherItems select 4) lbadd _x; +} count +[ + "{code} String", + "{code} Boolean", + "{code} Progress Bar", + "[string] missionNamespace", + "[string] uiNamespace", + "[string] profileNamespace" +]; + +{ + _idx = (rmx_var_ctrl_watcherItems select 7) lbadd _x; +} count +[ + "Fade 0%", + "Fade 10%", + "Fade 20%", + "Fade 30%", + "Fade 40%", + "Fade 50%", + "Fade 60%", + "Fade 70%", + "Fade 80%", + "Fade 90%" +]; + +(rmx_var_ctrl_watcherItems select 7) ctrlSetEventHandler ["LBSelChanged","'fade' call rmx_fnc_watcherActions;"]; +(rmx_var_ctrl_watcherItems select 7) lbsetCurSel (profileNamespace getVariable ["rmx_var_ctrl_watcherContentFade",0]); +(rmx_var_ctrl_watcherItems select 4) lbSetCurSel 0; +(rmx_var_ctrl_watcherItems select 3) ctrlSetText ""; + +[] spawn { + disableSerialization; + if (count rmx_var_watcherGrpControls_data > 0) then { + _tmp = rmx_var_watcherGrpControls_data; + "unload" call rmx_fnc_watcherActions; + rmx_var_watcherGrpControls_data = []; + { + (rmx_var_ctrl_watcherItems select 3) ctrlSetText (_x select 0); + (rmx_var_ctrl_watcherItems select 4) lbSetCurSel (_x select 1); + [true, (_x select 1)] call rmx_fnc_watcherAddRemove; + uiSleep 0.01; + }forEach _tmp; + + (rmx_var_ctrl_watcherItems select 4) lbSetCurSel 0; + (rmx_var_ctrl_watcherItems select 3) ctrlSetText ""; + }; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherActions.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherActions.sqf new file mode 100644 index 00000000..252e7ea9 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherActions.sqf @@ -0,0 +1,66 @@ +/* + Function Name: rmx_fnc_watcherActions + Author: Raimonds Virtoss | Raymix + Description: Display custom in-game code Editor with tabs saved to HDD + Usage: NONE, required for main FNC + + License: --- +*/ +#include <\x\Addons\rmx_init\defines.inc> + +_switch = param [0, 100]; + +switch (_switch) do { + case "load": + { + [] spawn rmx_fnc_watcherRunner; + }; + case "unload": + { + rmx_var_watcherPositions = []; //reset positions to save new ones + { + rmx_var_watcherPositions pushBack (ctrlPosition _x); + } forEach rmx_var_ctrl_watcherItems; + { + { + _x call Epoch_getIDC; + ctrlDelete _x; + } forEach _x; + } forEach rmx_var_watcherGrpControls; + + rmx_var_watcherGrpControls = []; + profileNamespace setVariable ["rmx_var_watcherPositions",rmx_var_watcherPositions]; + }; + case "fade": + { + _fade = lbCurSel (rmx_var_ctrl_watcherItems select 7); + + { + (rmx_var_ctrl_watcherItems select _x) ctrlSetFade (_fade / 10); + (rmx_var_ctrl_watcherItems select _x) ctrlCommit 0.5; + } count [0,1,4,5,6,7]; + + profileNamespace setVariable ["rmx_var_ctrl_watcherContentFade",_fade]; + }; + case "pin": + { + if (rmx_var_watcherPinned) then { + (rmx_var_ctrl_watcherItems select 2) ctrlSetText "x\addons\rmx_init\data\retardedPinUp.paa"; + rmx_var_watcherPinned = false; + } else { + (rmx_var_ctrl_watcherItems select 2) ctrlSetText "x\addons\rmx_init\data\retardedPinDown.paa"; + rmx_var_watcherPinned = true; + }; + }; + case "execute": + { + private ["_sel"]; + _sel = lbCurSel (rmx_var_ctrl_watcherItems select 4); + _editbox = ctrlText (rmx_var_ctrl_watcherItems select 3); + + //if (_editbox isEqualTo "") exitWith {"Edit field cannot be blank!" warning}; + [true, _sel] call rmx_fnc_watcherAddRemove; + }; +}; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherAddRemove.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherAddRemove.sqf new file mode 100644 index 00000000..35d828ae --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherAddRemove.sqf @@ -0,0 +1,114 @@ +#include <\x\Addons\rmx_init\defines.inc> +disableSerialization; +if !(_this isEqualTypeParams [true,0]) exitWith {false}; +params ["_add","_idx"]; +//TODO: ONLOAD to populate controls +//TODO: + +//if ((_idx < 0) || (_idx > count rmx_var_watcherGrpControls)) exitWith {false}; +if (_idx < 0) exitWith {false}; + +//_display = if (rmx_var_watcherPinned) then {uiNamespace getVariable "rmx_var_watcher2"} else {findDisplay 7500}; + +_isPinned = uiNamespace getVariable ["rmx_var_watcher2",displayNull]; +_display = if (_isPinned isEqualTo displayNull) then { + findDisplay 7500 +} else { + _isPinned +}; + +_grp = _display displayCtrl 7507; +_codeBox = _display displayCtrl 7504; +_grpPos = ctrlPosition _grp; + +if (_add) then { + _grpPos set [3, (_grpPos select 3) + 0.108]; + _grp ctrlSetPosition _grpPos; + _grp ctrlCommit 0; + _color = call Epoch_getColorScheme; + + //Create debug elements + _cTop = _display ctrlCreate ["RscText", call Epoch_getIDC, _grp]; + _cVarBG = _display ctrlCreate ["RscText", call Epoch_getIDC, _grp]; + _cVar = switch (_idx) do { + case 1: {_display ctrlCreate ["RscPicture", call Epoch_getIDC, _grp]}; + case 2: {_display ctrlCreate ["RscProgress", call Epoch_getIDC, _grp]}; + default {_display ctrlCreate ["RscEdit", call Epoch_getIDC, _grp]}; + }; + _cX = _display ctrlCreate ["RscButton", call Epoch_getIDC, _grp]; + _cOk = _display ctrlCreate ["RscButton", call Epoch_getIDC, _grp]; + _cEdit = _display ctrlCreate ["RscEdit", call Epoch_getIDC, _grp]; + + //store debug elements into an array + _cArr = [_cTop, _cVarBG, _cVar, _cX, _cOk, _cEdit]; + + //store group of debug elements with others + rmx_var_watcherGrpControls pushBack _cArr; + rmx_var_watcherGrpControls_data pushBack [ctrlText _codeBox,_idx]; //index of execute + profileNamespace setVariable ["rmx_var_watcherGrpControls_data",rmx_var_watcherGrpControls_data]; + + //Give position and parent variable data + _ctrlSettings = + [ + [[0,0,0.465,0.012],[0,0,0,0], "", [0,0,0,0]], + [[0,0.012,0.4225,0.048],[0,0,0,0.6], "", [0,0,0,0]], + [[0,0.06,0.4225,0.048],[1,1,1,0.1], "", [1,1,1,1]], + [[0.4225,0.06,0.0425,0.048],[1,1,1,1], "X", _color], + [[0.4225,0.012,0.0425,0.048],[1,1,1,1], "Ok", _color], + [[0,0.012,0.4225,0.048],[0,0,0,0.6], ctrlText _codeBox, _color] + ]; + + { + _x ctrlSetPosition (_ctrlSettings select _forEachIndex select 0); + _x ctrlSetBackgroundColor (_ctrlSettings select _forEachIndex select 1); + _x ctrlSetText (_ctrlSettings select _forEachIndex select 2); + _x ctrlSetTextColor (_ctrlSettings select _forEachIndex select 3); + _x ctrlCommit 0; + } forEach _cArr; + +} else { + if (rmx_var_watcherGrpControls isEqualTo []) exitWith {false}; + + _grpPos set [3, (_grpPos select 3) - 0.108]; + _grp ctrlSetPosition _grpPos; + _grp ctrlCommit 0; + + { + _x call Epoch_getIDC; + ctrlDelete _x; + } forEach (rmx_var_watcherGrpControls select _idx); + rmx_var_watcherGrpControls deleteAt _idx; + rmx_var_watcherGrpControls_data deleteAt _idx; //generated index from buttonSetAction (see below) + profileNamespace setVariable ["rmx_var_watcherGrpControls_data",rmx_var_watcherGrpControls_data]; +}; +// y +// 0.012 + 0.108 * rmx_var_watcherGrpIndex +_ctrlSettingsY = [0, 0.012, 0.06, 0.06, 0.012, 0.012]; + +//Refresh/Update positions after changes +{ + _count = _forEachIndex; + { + _yPos = ctrlPosition _x; + _yPos set [1, (_ctrlSettingsY select _forEachIndex) + 0.108 * _count]; + _x ctrlSetPosition _yPos; + _x ctrlCommit 0; + } forEach _x; + + (_x select 3) buttonSetAction (format ["[false, %1] call rmx_fnc_watcherAddRemove;",_forEachIndex]); + (_x select 4) buttonSetAction (format ["(rmx_var_watcherGrpControls_data select %1) set [0, ctrlText(rmx_var_watcherGrpControls select %1 select 5)]",_forEachIndex]); + + + +} forEach rmx_var_watcherGrpControls; + +//Don't delete yet, used to visualize group size +/* +_c = _display ctrlCreate ["RscText", 909090]; +_c = _display displayCtrl 909090; +_c ctrlSetPosition _grpPos; +_c ctrlCommit 0; +_c ctrlSetBackgroundColor [1,0,0,0.1]; +*/ + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherRunner.sqf b/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherRunner.sqf new file mode 100644 index 00000000..7de9ec87 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_init/functions/watcherRunner.sqf @@ -0,0 +1,122 @@ +if (rmx_var_watcher_running) exitWith {false}; +rmx_var_watcher_running = true; + +disableSerialization; +_fnc_findDisplay = { + _isPinned = uiNamespace getVariable ["rmx_var_watcher2",displayNull]; + _display = if (_isPinned isEqualTo displayNull) then { + findDisplay 7500 + } else { + _isPinned + }; + _display +}; + +_scheme = call Epoch_getColorScheme; + +while {str(call _fnc_findDisplay) isEqualTo "Display #7500"} do +{ + { + if !(rmx_var_watcherGrpControls isEqualTo []) then { + _var = _x select 0; + _idx = _x select 1; + _ctrl = rmx_var_watcherGrpControls select _forEachIndex select 2; + if !(isNil "_ctrl") then { + switch _idx do { + case 0: //code + { + _compiled = nil; + _compiled = call compile _var; + if !(isNil "_compiled") then { + _ctrl ctrlSetText (str _compiled); + _ctrl ctrlSetTextColor [1,1,1,1]; + } else { + _ctrl ctrlSetText "Syntax Error!"; + _ctrl ctrlSetTextColor [1,0,0,1]; + }; + + }; + case 1: //bool + { + _compiled = nil; + _compiled = call compile _var; + if !(isNil "_compiled") then { + if (_compiled isEqualType true) then { + if (_compiled) then { + _ctrl ctrlSetText "x\addons\rmx_init\data\w_on.paa"; + _ctrl ctrlSetTextColor _scheme; + _ctrl ctrlEnable true; + } else { + _ctrl ctrlSetText "x\addons\rmx_init\data\w_off.paa"; + _ctrl ctrlSetTextColor [1,1,1,1]; + }; + } else { + _ctrl ctrlSetText "x\addons\rmx_init\data\w_error.paa"; + _ctrl ctrlSetTextColor [1,0,0,1]; + }; + } else { + _ctrl ctrlSetText "x\addons\rmx_init\data\w_error.paa"; + _ctrl ctrlSetTextColor [1,0,0,1]; + }; + }; + case 2: //progress + { + _compiled = nil; + _compiled = call compile _var; + if !(isNil "_compiled") then { + if (_compiled isEqualType 0) then { + if (_compiled <= 1 && _compiled >= 0) then { + _ctrl progressSetPosition _compiled; + _ctrl ctrlSetTextColor [1,1,1,1]; + } else { + _ctrl progressSetPosition 1; + _ctrl ctrlSetTextColor [1,0,0,1]; + }; + } else { + _ctrl progressSetPosition 1; + _ctrl ctrlSetTextColor [1,0,0,1]; + }; + } else { + _ctrl progressSetPosition 1; + _ctrl ctrlSetTextColor [1,0,0,1]; + }; + }; + case 3: //mission + { + _variable = missionNamespace getVariable [_var,"nil"]; + _ctrl ctrlSetText (str _variable); + if (_variable isEqualTo "nil") then { + _ctrl ctrlSetTextColor [1,0,0,1]; + } else { + _ctrl ctrlSetTextColor [1,1,1,1]; + }; + }; + case 4: //ui + { + _variable = uiNamespace getVariable [_var,"nil"]; + _ctrl ctrlSetText (str _variable); + if (_variable isEqualTo "nil") then { + _ctrl ctrlSetTextColor [1,0,0,1]; + } else { + _ctrl ctrlSetTextColor [1,1,1,1]; + }; + }; + case 5: //profileName + { + _variable = profileNamespace getVariable [_var,"nil"]; + _ctrl ctrlSetText (str _variable); + if (_variable isEqualTo "nil") then { + _ctrl ctrlSetTextColor [1,0,0,1]; + } else { + _ctrl ctrlSetTextColor [1,1,1,1]; + }; + }; + }; + }; + }; + } forEach rmx_var_watcherGrpControls_data; + uiSleep 0.1; +}; + +rmx_var_watcher_running = false; +true diff --git a/Tools/DevFrameWork/x/addons/rmx_init/texHeaders.bin b/Tools/DevFrameWork/x/addons/rmx_init/texHeaders.bin new file mode 100644 index 00000000..c178195c Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_init/texHeaders.bin differ diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/$PBOPREFIX$ b/Tools/DevFrameWork/x/addons/rmx_sandbox/$PBOPREFIX$ new file mode 100644 index 00000000..96f84e67 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/$PBOPREFIX$ @@ -0,0 +1 @@ +x\addons\rmx_sandbox \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/config.cpp b/Tools/DevFrameWork/x/addons/rmx_sandbox/config.cpp new file mode 100644 index 00000000..f61513df --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/config.cpp @@ -0,0 +1,45 @@ +//Author: Raimonds Virtoss / Raymix +class CfgPatches { + class rmx_sandbox { + units[] = {}; + weapons[] = {}; + requiredVersion = 0.1; + requiredAddons[] = {"rmx_init"}; + }; +}; + + +class devFunctions { + debugEnabled = 1; //enables console debug + class rmx { + class sandbox { + file = "x\Addons\rmx_sandbox"; + class variables {recompile = 1; preInit = 1;}; + class sandbox {recompile = 1;}; + }; + }; + + class A3E { + tag = "EPOCH"; + file = "x\Addons\rmx_sandbox\epoch"; + class generic { + file = "x\Addons\rmx_sandbox\epoch"; + //class dragControl {}; + //class dynamicHUD_start {postInit = 1; recompile = 1;}; + //class dynamicHUD_loadSave {recompile = 1;}; + //class dynamicHUD_adjust {recompile = 1;}; + //class getHUDCtrl {}; + class tradeMouseEvents {recompile = 1;}; + class tradeLoad {recompile = 1;}; + class tradeUnLoad {recompile = 1;}; + class tradePopulateLB {recompile = 1;}; + class tradeRefresh {recompile = 1;}; + class tradeMainLoop {recompile = 1;}; + }; + }; + +}; + +#include "epoch\epoch_configs.hpp" +#include "epoch\Epoch_GUI_rmx.hpp" +#include "epoch\CfgPricing.hpp" \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/CfgPricing.hpp b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/CfgPricing.hpp new file mode 100644 index 00000000..4915a44c --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/CfgPricing.hpp @@ -0,0 +1,1494 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: Raimonds Virtoss - epochmod.com + + Description: + Prices for Trading system. DLC items could have their own categories (safe to add) + + 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_config/Configs/CfgPricing.hpp +*/ + +class CfgPricing2 +{ + class All { //Don't edit these! + class All + { + displayName = "All"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; //icon + }; + }; + class Items { //major class, hardcoded, don't change + class Consumables //minor class, unlimited, name used in Trader config server side + { + displayName = "Consumables"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; //icon + class WhiskeyNoodle {price = 80;}; + class honey_epoch {price = 5;}; + class FoodBioMeat {price = 4;}; + class FoodMeeps {price = 50;}; + class FoodSnooter {price = 5;}; + class sardines_epoch {price = 2;}; + class meatballs_epoch {price = 2;}; + class scam_epoch {price = 4;}; + class TacticalBacon {price = 5;}; + class sweetcorn_epoch {price = 2;}; + class CookedSheep_EPOCH {price = 5;}; + class CookedGoat_EPOCH {price = 5;}; + class SnakeMeat_EPOCH {price = 3;}; + class CookedRabbit_EPOCH {price = 5;}; + class CookedChicken_EPOCH {price = 3;}; + class ItemTrout {price = 2;}; + class ItemTroutCooked {price = 20;}; + class ItemSeaBass {price = 5;}; + class ItemSeaBassCooked {price = 50;}; + class ItemTuna {price = 10;}; + class ItemTunaCooked {price = 100;}; + class FoodWalkNSons {price = 5;}; + class ItemSodaOrangeSherbet {price = 4;}; + class ItemSodaPurple {price = 5;}; + class ItemSodaMocha {price = 8;}; + class ItemSodaBurst {price = 4;}; + class ItemSodaRbull {price = 5;}; + class water_epoch {price = 5;}; + class clean_water_epoch {price = 10;}; + class EnergyPack {price = 3; tax = 0.9;}; + class EnergyPackLg {price = 30; tax = 0.9;}; + class ItemSodaAlpineDude { + price = 5; + }; + class ItemHotwire { + price = 15; + }; + class ItemKeyKit { + price = 15; + }; + }; + class Tools + { + displayName = "Items"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class JackKit {price = 25;}; + class ItemLockbox {price = 250; tax = 0.5;}; + class ItemSafe { price = 1250; tax = 0.5; }; + class ItemCompass {price = 3;}; + class ItemGPS {price = 20;}; + class EpochRadio0 {price = 2;}; + class EpochRadio1 {price = 4;}; + class EpochRadio2 {price = 6;}; + class EpochRadio3 {price = 8;}; + class EpochRadio4 {price = 10;}; + class EpochRadio5 {price = 12;}; + class EpochRadio6 {price = 14;}; + class EpochRadio7 {price = 16;}; + class EpochRadio8 {price = 18;}; + class EpochRadio9 {price = 20;}; + class VehicleRepair {price = 35;}; + class VehicleRepairLg {price = 50;}; + class ItemWatch {price = 2;}; + class Binocular {price = 4;}; + class NVG_EPOCH {price = 35;}; + class Rangefinder {price = 4;}; + class Laserdesignator {price = 4;}; + class ItemComboLock { + price = 45; + }; + }; + class Craft + { + displayName = "Crafting"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class CircuitParts {price = 50;}; + class ItemCoolerE {price = 50;}; + class PaintCanClear {price = 1;}; + class PaintCanBlk {price = 1;}; + class PaintCanBlu {price = 1;}; + class PaintCanBrn {price = 1;}; + class PaintCanGrn {price = 1;}; + class PaintCanOra {price = 1;}; + class PaintCanPur {price = 1;}; + class PaintCanRed {price = 1;}; + class PaintCanTeal {price = 1;}; + class PaintCanYel {price = 1;}; + class ItemMixOil {price = 5;}; + class emptyjar_epoch {price = 5;}; + class lighter_epoch { price = 50; }; + class WoodLog_EPOCH { price = 1; }; + class ItemRope { price = 5; }; + class ItemStick { price = 1; }; + class ItemRock { price = 1; }; + class PartOreGold {price = 70;}; + class PartOreSilver {price = 7;}; + class PartOre {price = 1;}; + class ItemGoldBar {price = 100;}; + class ItemSilverBar {price = 10;}; + class ItemGoldBar10oz {price = 1000;}; + class ItemTopaz {price = 25;}; + class ItemOnyx {price = 30;}; + class ItemSapphire {price = 50;}; + class ItemAmethyst {price = 25;}; + class ItemEmerald {price = 25;}; + class ItemCitrine {price = 25;}; + class ItemRuby {price = 75;}; + class ItemQuartz {price = 5;}; + class ItemJade {price = 100;}; + class ItemGarnet {price = 25;}; + class ItemKiloHemp {price = 100;}; + // Building resources + class PartPlankPack {price = 2;}; + class CinderBlocks {price = 20;}; + class MortarBucket {price = 20;}; + class ItemScraps {price = 2;}; + class ItemCorrugated {price = 8;}; + class ItemCorrugatedLg {price = 25;}; + + // Building parts + class KitStudWall {price = 10;}; + class KitWoodFloor {price = 10;}; + class KitWoodStairs {price = 10;}; + class KitWoodTower {price = 10;}; + class KitWoodRamp {price = 14;}; + class KitSpikeTrap {price = 25;}; + class KitMetalTrap {price = 25;}; + class KitTankTrap {price = 25;}; + class KitHesco3 { price = 25; }; + class KitWoodLadder { price = 10; }; + class KitFirePlace {price = 4;}; + class KitTiPi {price = 10;}; + class KitShelf {price = 90;}; + class KitWorkbench { price = 10; }; + + class KitWoodFoundation { price = 20; }; + class KitFoundation {price = 90;}; + class KitPlotPole {price = 300;}; + class KitSolarGen { price = 200; }; + class KitCinderWall {price = 140;}; + + class ItemSolar { price = 75; }; + class ItemCables { price = 50; }; + class ItemBattery { price = 50; }; + class Pelt_EPOCH {price = 1;}; + class Venom_EPOCH {price = 10;}; + + //autogen stuff + class ItemPipe { + price = 10; + }; + class ItemBulb { + price = 10; + }; + class ItemBurlap { + price = 10; + }; + class ItemBriefcaseE { + price = 10; + }; + class ItemBriefcaseGold100oz { + price = 10000; + }; + class ItemAluminumBar { + price = 10; + }; + class ItemCopperBar { + price = 100; + }; + class ItemTinBar { + price = 1; + }; + class ItemPlywoodPack { + price = 100; + }; + }; + class Junk + { + displayName = "Junk"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class CUP_item_Money { price = 1000; }; + class CUP_item_Kostey_photos { price = 100; }; + class CUP_item_Kostey_map_case { price = 100; }; + class CUP_item_Kostey_notebook { price = 100; }; + class CUP_item_CDF_dogtags { price = 100; }; + class CUP_item_Moscow_Bombing_File { price = 100; }; + class CUP_item_Cobalt_File { price = 100; }; + class ItemDocument {price = 5;}; + class ItemDocumentMission {price = 5;}; + class ItemEmptyTin { + price = 1; + }; + class ItemSodaEmpty { + price = 1; + }; + class ItemKey { + price = 10; + }; + class ItemKeyBlue { + price = 10; + }; + class ItemKeyGreen { + price = 10; + }; + class ItemKeyRed { + price = 10; + }; + class ItemKeyYellow { + price = 10; + }; + class ItemDoc1 { + price = 10; + }; + class ItemDoc2 { + price = 10; + }; + class ItemDoc3 { + price = 10; + }; + class ItemDoc4 { + price = 10; + }; + class ItemDoc5 { + price = 10; + }; + class ItemDoc6 { + price = 10; + }; + class ItemDoc7 { + price = 10; + }; + class ItemDoc8 { + price = 10; + }; + class ItemVehDoc1 { + price = 10; + }; + class ItemVehDoc2 { + price = 10; + }; + class ItemVehDoc3 { + price = 10; + }; + class ItemVehDoc4 { + price = 10; + }; + }; + class Meds + { + displayName = "Medical"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class FAK {price = 3;}; + class Towelette {price = 1;}; + class HeatPack {price = 2;}; + class ColdPack {price = 2;}; + }; + class Fuel + { + displayName = "Fuel"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class jerrycan_epoch { price = 10; }; + class jerrycanE_epoch { price = 5; }; + class ItemBarrelF { + price = 200; + }; + class ItemBarrelE { + price = 50; + }; + }; + }; + + class Weapons { + class Melee + { + displayName = "Melee"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class ChainSaw {price = 125;}; + class CrudeHatchet { price = 5; }; + class MeleeMaul { price = 10; }; + class WoodClub { price = 5; }; + class Plunger { price = 15; }; + class MeleeSledge {price = 50;}; + class MeleeSword { price = 1111; }; + class MeleeRod { price = 100; }; + class Hatchet {price = 25;}; + }; + class Pistol + { + displayName = "Handguns"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class hgun_ACPC2_F {price = 20;}; + class hgun_Rook40_F {price = 20;}; + class hgun_P07_F {price = 20;}; + class hgun_Pistol_heavy_01_F {price = 25;}; + class hgun_Pistol_heavy_02_F {price = 25;}; + class ruger_pistol_epoch {price = 40;}; + class 1911_pistol_epoch {price = 6;}; + class hgun_Pistol_Signal_F {price = 20;}; + class MultiGun {price = 100;}; + class hgun_PDW2000_F {price = 35;}; + class CUP_hgun_Compact { price = 20; }; + class CUP_hgun_Duty { price = 20; }; + class CUP_hgun_Phantom { price = 25; }; + class CUP_hgun_Glock17 { price = 25; }; + class CUP_hgun_Makarov { price = 20; }; + class CUP_hgun_MicroUzi { price = 45; }; + class CUP_hgun_TaurusTracker455 { price = 35; }; + class CUP_hgun_PB6P9 { price = 30; }; + class CUP_hgun_SA61 { price = 30; }; + class CUP_hgun_M9 { price = 30; }; + class CUP_hgun_TaurusTracker455_gold { price = 300; }; + class CUP_hgun_Colt1911 { price = 30; }; + }; + class shotgun + { + displayName = "Shotguns"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + // Shotguns + class CUP_sgun_AA12 { price = 75; }; + class CUP_sgun_M1014 { price = 50; }; + class CUP_sgun_Saiga12K { price = 45; }; + class speargun_epoch { price = 75; }; + }; + class LMG + { + displayName = "LMG"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class LMG_Mk200_F {price = 150;}; + class LMG_Zafir_F {price = 150;}; + class CUP_lmg_L110A1 { price = 150; }; + class CUP_lmg_M240 { price = 150; }; + class CUP_lmg_minimipara { price = 150; }; + class CUP_lmg_minimi { price = 150; }; + class CUP_lmg_m249_para { price = 150; }; + class CUP_lmg_M249_E2 { price = 150; }; + class CUP_lmg_minimi_railed { price = 150; }; + class CUP_lmg_m249_pip1 { price = 150; }; + class CUP_lmg_m249_pip4 { price = 150; }; + class CUP_lmg_L7A2 { price = 150; }; + class CUP_lmg_PKM { price = 150; }; + class CUP_lmg_Pecheneg { price = 150; }; + class CUP_lmg_UK59 { price = 150; }; + class CUP_lmg_m249_pip2 { price = 150; }; + class CUP_lmg_m249_pip3 { price = 150; }; + class CUP_lmg_m249_SQuantoon { price = 150; }; + class CUP_lmg_M60E4 { price = 150; }; + class CUP_lmg_Mk48_des { price = 150; }; + class CUP_lmg_Mk48_wdl { price = 150; }; + }; + class SMG + { + displayName = "SMG"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class SMG_01_F {price = 35;}; + class SMG_02_F {price = 35;}; + class CUP_smg_bizon { price = 75; }; + class CUP_smg_EVO { price = 100; }; + class CUP_smg_MP5SD6 { price = 125; }; + class CUP_smg_MP5A5 { price = 100; }; + }; + class Rifles + { + displayName = "Rifle"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class Rollins_F {price = 50;}; + class arifle_MX_SW_F {price = 150;}; + class arifle_MX_SW_Black_F {price = 150;}; + class arifle_MXM_Black_F {price = 50;}; + class arifle_MX_GL_Black_F {price = 75;}; + class arifle_MX_Black_F {price = 50;}; + class arifle_MXC_Black_F {price = 50;}; + class sr25_epoch { price = 50; }; + class l85a2_epoch { price = 50; }; + class l85a2_pink_epoch { price = 50; }; + class l85a2_ugl_epoch { price = 50; }; + class arifle_Katiba_F {price = 50;}; + class arifle_Katiba_C_F {price = 50;}; + class arifle_Katiba_GL_F {price = 75;}; + class arifle_MXC_F {price = 50;}; + class arifle_MX_F {price = 50;}; + class arifle_MX_GL_F {price = 75;}; + class arifle_MXM_F {price = 50;}; + class arifle_SDAR_F {price = 50;}; + class arifle_TRG21_F {price = 50;}; + class arifle_TRG20_F {price = 50;}; + class arifle_TRG21_GL_F {price = 75;}; + class arifle_Mk20_F {price = 50;}; + class arifle_Mk20C_F {price = 50;}; + class arifle_Mk20_GL_F {price = 75;}; + class arifle_Mk20_plain_F {price = 50;}; + class arifle_Mk20C_plain_F {price = 50;}; + class arifle_Mk20_GL_plain_F {price = 75;}; + class CUP_arifle_AK107_GL { price = 75; }; + class CUP_arifle_AK47 { price = 75; }; + class CUP_arifle_AK74 { price = 75; }; + class CUP_arifle_AK74_GL { price = 75; }; + class CUP_arifle_AK74M { price = 75; }; + class CUP_arifle_AK74M_GL { price = 75; }; + class CUP_arifle_AKM { price = 75; }; + class CUP_arifle_AKS { price = 75; }; + class CUP_arifle_AKS_Gold { price = 75; }; + class CUP_arifle_AKS74 { price = 75; }; + class CUP_arifle_RPK74 { price = 75; }; + class CUP_arifle_L85A2_GL { price = 75; }; + class CUP_arifle_M16A4_Base { price = 75; }; + class CUP_arifle_M4A1_black { price = 75; }; + class CUP_arifle_M4A1_BUIS_GL { price = 75; }; + class CUP_arifle_M4A1_BUIS_camo_GL { price = 75; }; + class CUP_arifle_M4A1_BUIS_desert_GL { price = 75; }; + class CUP_arifle_M16A2 { price = 75; }; + class CUP_arifle_M16A2_GL { price = 75; }; + class CUP_arifle_M16A4_GL { price = 75; }; + class CUP_arifle_M4A3_desert { price = 75; }; + class CUP_arifle_M4A1 { price = 75; }; + class CUP_arifle_CZ805_A1 { price = 75; }; + class CUP_arifle_CZ805_GL { price = 75; }; + class CUP_arifle_CZ805_B_GL { price = 75; }; + class CUP_arifle_FNFAL { price = 100; }; + class CUP_arifle_FNFAL_railed { price = 100; }; + class CUP_arifle_FNFAL5061 { price = 100; }; + class CUP_arifle_G36A { price = 75; }; + class CUP_arifle_G36K { price = 75; }; + class CUP_arifle_G36C { price = 75; }; + class CUP_arifle_MG36 { price = 75; }; + class CUP_arifle_Mk16_CQC { price = 75; }; + class CUP_arifle_Mk16_CQC_FG { price = 75; }; + class CUP_arifle_Mk16_CQC_SFG { price = 75; }; + class CUP_arifle_Mk16_CQC_EGLM { price = 75; }; + class CUP_arifle_Mk16_STD { price = 75; }; + class CUP_arifle_Mk16_STD_FG { price = 75; }; + class CUP_arifle_Mk16_STD_SFG { price = 75; }; + class CUP_arifle_Mk16_STD_EGLM { price = 75; }; + class CUP_arifle_Mk16_SV { price = 75; }; + class CUP_arifle_Mk17_CQC { price = 75; }; + class CUP_arifle_Mk17_CQC_FG { price = 75; }; + class CUP_arifle_Mk17_CQC_SFG { price = 75; }; + class CUP_arifle_Mk17_CQC_EGLM { price = 75; }; + class CUP_arifle_Mk17_STD { price = 75; }; + class CUP_arifle_Mk17_STD_FG { price = 75; }; + class CUP_arifle_Mk17_STD_SFG { price = 75; }; + class CUP_arifle_Mk17_STD_EGLM { price = 75; }; + class CUP_arifle_Mk20 { price = 100; }; + class CUP_arifle_Sa58RIS1 { price = 75; }; + class CUP_arifle_Sa58RIS2_gl { price = 75; }; + class CUP_arifle_XM8_Carbine_FG { price = 75; }; + class CUP_arifle_XM8_Carbine { price = 75; }; + class CUP_arifle_XM8_Carbine_GL { price = 75; }; + class CUP_arifle_xm8_sharpshooter { price = 75; }; + class CUP_arifle_xm8_SAW { price = 75; }; + class CUP_arifle_XM8_Compact { price = 75; }; + class CUP_arifle_XM8_Compact_Rail { price = 75; }; + class CUP_arifle_CZ805_A2 { price = 75; }; + class CUP_arifle_CZ805_B { price = 75; }; + class CUP_arifle_Sa58P { price = 75; }; + class CUP_arifle_Sa58P_des { price = 75; }; + class CUP_arifle_Sa58V { price = 75; }; + class CUP_arifle_Sa58V_camo { price = 75; }; + class CUP_arifle_Sa58RIS1_des { price = 75; }; + class CUP_arifle_Sa58RIS2 { price = 75; }; + class CUP_arifle_Sa58RIS2_camo { price = 75; }; + class CUP_arifle_AK107 { price = 75; }; + class CUP_arifle_AKS74U { price = 75; }; + class CUP_arifle_RPK74_45 { price = 75; }; + class CUP_arifle_RPK74M { price = 75; }; + class CUP_arifle_FNFAL5062 { price = 75; }; + class CUP_arifle_FNFAL_OSW { price = 75; }; + class CUP_arifle_G36A_camo { price = 75; }; + class CUP_arifle_G36K_camo { price = 75; }; + class CUP_arifle_G36C_camo { price = 75; }; + class CUP_arifle_MG36_camo { price = 75; }; + class CUP_arifle_L85A2 { price = 75; }; + class CUP_arifle_L86A2 { price = 75; }; + class CUP_arifle_M4A1_camo { price = 75; }; + class CUP_arifle_M4A1_desert { price = 75; }; + class CUP_arifle_XM8_Railed { price = 75; }; + // DLC machine guns + class MMG_01_hex_F { price = 150; }; + class MMG_01_tan_F { price = 150; }; + class MMG_02_camo_F { price = 150; }; + class MMG_02_black_F { price = 150; }; + class MMG_02_sand_F { price = 150; }; + // new weapons + class m249_EPOCH {price = 150;}; + class m249Tan_EPOCH {price = 150;}; + class m107Tan_EPOCH {price = 200;}; + class m107_EPOCH {price = 200;}; + class m16_EPOCH {price = 100;}; + class m16Red_EPOCH {price = 125;}; + class M14_EPOCH {price = 125;}; + class M14Grn_EPOCH {price = 150;}; + class m4a3_EPOCH {price = 100;}; + class AKM_EPOCH {price = 100;}; + }; + class Scoped + { + displayName = "Sniper"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class srifle_EBR_F {price = 150;}; + class srifle_GM6_F {price = 150;}; + class srifle_LRR_F {price = 200;}; + class srifle_DMR_01_F {price = 200;}; + class CUP_srifle_AS50 { price = 200; }; + class CUP_srifle_LeeEnfield { price = 100; }; + class CUP_srifle_LeeEnfield_rail { price = 150; }; + class CUP_srifle_M107_Base { price = 200; }; + class CUP_srifle_M110 { price = 200; }; + class CUP_srifle_M14 { price = 150; }; + class CUP_srifle_M14_DMR { price = 150; }; + class CUP_srifle_Mk12SPR { price = 200; }; + class CUP_srifle_M24_des { price = 200; }; + class CUP_srifle_M40A3 { price = 200; }; + class CUP_srifle_ksvk { price = 150; }; + class CUP_srifle_SVD { price = 200; }; + class CUP_srifle_VSSVintorez { price = 200; }; + class CUP_srifle_CZ750 { price = 200; }; + class CUP_srifle_CZ550 { price = 200; }; + class CUP_srifle_CZ550_rail { price = 200; }; + class CUP_srifle_M24_wdl { price = 200; }; + class CUP_srifle_SVD_des { price = 200; }; + class CUP_srifle_AWM_des { price = 200; }; + class CUP_srifle_AWM_wdl { price = 200; }; + class CUP_srifle_G22_des { price = 200; }; + // DLC sniper rifles + class srifle_DMR_02_F { price = 150; }; + class srifle_DMR_02_camo_F { price = 150; }; + class srifle_DMR_02_sniper_F { price = 150; }; + class srifle_DMR_03_F { price = 150; }; + class srifle_DMR_03_khaki_F { price = 150; }; + class srifle_DMR_03_tan_F { price = 150; }; + class srifle_DMR_03_multicam_F { price = 150; }; + class srifle_DMR_03_woodland_F { price = 150; }; + class srifle_DMR_03_spotter_F { price = 150; }; + class srifle_DMR_04_Tan_F { price = 150; }; + class srifle_DMR_05_blk_F { price = 150; }; + class srifle_DMR_05_hex_F { price = 150; }; + class srifle_DMR_05_tan_f { price = 150; }; + class srifle_DMR_06_camo_F { price = 150; }; + class srifle_DMR_06_olive_F { price = 150; }; + }; + }; + + class Attachments { + class Muzzles + { + displayName = "Muzzle"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + //Epoch + class muzzle_snds_H {price = 5;}; + class muzzle_snds_L {price = 5;}; + class muzzle_snds_M {price = 5;}; + class muzzle_snds_B {price = 5;}; + class muzzle_snds_H_MG {price = 5;}; + class muzzle_snds_acp {price = 5;}; + + //CUP + class CUP_muzzle_snds_M110 { price = 5; }; + class CUP_muzzle_snds_M14 { price = 5; }; + class CUP_muzzle_PBS4 { price = 5; }; + class CUP_muzzle_PB6P9 { price = 5; }; + class CUP_muzzle_Bizon { price = 5; }; + class CUP_muzzle_snds_M9 { price = 5; }; + class CUP_muzzle_snds_MicroUzi { price = 5; }; + class CUP_muzzle_snds_AWM { price = 5; }; + class CUP_muzzle_snds_G36_black { price = 5; }; + class CUP_muzzle_snds_G36_desert { price = 5; }; + class CUP_muzzle_snds_L85 { price = 5; }; + class CUP_muzzle_snds_M16_camo { price = 5; }; + class CUP_muzzle_snds_M16 { price = 5; }; + class CUP_muzzle_snds_SCAR_L { price = 5; }; + class CUP_muzzle_mfsup_SCAR_L { price = 5; }; + class CUP_muzzle_snds_SCAR_H { price = 5; }; + class CUP_muzzle_mfsup_SCAR_H { price = 5; }; + class CUP_muzzle_snds_XM8 { price = 5; }; + + // DLC muzzles + class muzzle_snds_338_black { price = 5; }; + class muzzle_snds_338_green { price = 5; }; + class muzzle_snds_338_sand { price = 5; }; + class muzzle_snds_93mmg { price = 5; }; + class muzzle_snds_93mmg_tan { price = 5; }; + class muzzle_sr25S_epoch { price = 5; }; + }; + class mgun + { + displayName = "Multigun"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class Heal_EPOCH {price = 3;}; + class Defib_EPOCH {price = 5;}; + class Repair_EPOCH {price = 2;}; + }; + class Optics + { + displayName = "Optics"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + // Epoch + class Elcan_epoch { price = 5; }; + class Elcan_reflex_epoch { price = 10; }; + + class CUP_optic_PSO_1 { price = 10; }; + class CUP_optic_PSO_3 { price = 10; }; + class CUP_optic_Kobra { price = 10; }; + class CUP_optic_GOSHAWK { price = 10; }; + class CUP_optic_NSPU { price = 10; }; + class CUP_optic_PechenegScope { price = 10; }; + class CUP_optic_SB_3_12x50_PMII { price = 10; }; + class CUP_optic_AN_PAS_13c2 { price = 10; }; + class CUP_optic_LeupoldMk4 { price = 10; }; + class CUP_optic_HoloBlack { price = 10; }; + class CUP_optic_HoloWdl { price = 10; }; + class CUP_optic_HoloDesert { price = 10; }; + class CUP_optic_Eotech533 { price = 10; }; + class CUP_optic_Eotech533Grey { price = 10; }; + class CUP_optic_CompM4 { price = 10; }; + class CUP_optic_SUSAT { price = 10; }; + class CUP_optic_ACOG { price = 10; }; + class CUP_optic_CWS { price = 10; }; + class CUP_optic_Leupold_VX3 { price = 10; }; + class CUP_optic_AN_PVS_10 { price = 10; }; + class CUP_optic_CompM2_Black { price = 10; }; + class CUP_optic_CompM2_Woodland { price = 10; }; + class CUP_optic_CompM2_Woodland2 { price = 10; }; + class CUP_optic_CompM2_Desert { price = 10; }; + class CUP_optic_RCO { price = 10; }; + class CUP_optic_RCO_desert { price = 10; }; + class CUP_optic_LeupoldM3LR { price = 15; }; + class CUP_optic_LeupoldMk4_10x40_LRT_Desert { price = 15; }; + class CUP_optic_LeupoldMk4_10x40_LRT_Woodland { price = 15; }; + class CUP_optic_ElcanM145 { price = 10; }; + class CUP_optic_AN_PAS_13c1 { price = 10; }; + class CUP_optic_LeupoldMk4_CQ_T { price = 10; }; + class CUP_optic_ELCAN_SpecterDR { price = 10; }; + class CUP_optic_LeupoldMk4_MRT_tan { price = 10; }; + class CUP_optic_SB_11_4x20_PM { price = 10; }; + class CUP_optic_ZDDot { price = 10; }; + class CUP_optic_MRad { price = 10; }; + class CUP_optic_TrijiconRx01_desert { price = 10; }; + class CUP_optic_TrijiconRx01_black { price = 10; }; + class CUP_optic_AN_PVS_4 { price = 10; }; + + class optic_Arco {price = 10;}; + class optic_Hamr {price = 10;}; + class optic_Aco {price = 10;}; + class optic_ACO_grn {price = 10;}; + class optic_Aco_smg {price = 10;}; + class optic_ACO_grn_smg {price = 10;}; + class optic_Holosight {price = 10;}; + class optic_Holosight_smg {price = 10;}; + class optic_SOS {price = 10;}; + class optic_MRCO {price = 10;}; + class optic_DMS {price = 10;}; + class optic_Yorris {price = 10;}; + class optic_MRD {price = 10;}; + class optic_LRPS {price = 20;}; + class optic_NVS {price = 30;}; + class optic_Nightstalker {price = 50;}; + class optic_tws {price = 20;}; + class optic_tws_mg {price = 20;}; + // DLC optics + class optic_AMS { price = 10; }; + class optic_AMS_khk { price = 10; }; + class optic_AMS_snd { price = 10; }; + class optic_KHS_blk { price = 10; }; + class optic_KHS_hex { price = 10; }; + class optic_KHS_old { price = 10; }; + class optic_KHS_tan { price = 10; }; + }; + class ACC + { + displayName = "Accessories"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class acc_flashlight {price = 5;}; + class acc_pointer_IR {price = 5;}; + class CUP_acc_Glock17_Flashlight { price = 5; }; + class CUP_acc_ANPEQ_15 { price = 5; }; + class CUP_acc_ANPEQ_2 { price = 5; }; + class CUP_acc_Flashlight { price = 5; }; + class CUP_acc_Flashlight_wdl { price = 5; }; + class CUP_acc_Flashlight_desert { price = 5; }; + class CUP_acc_XM8_light_module { price = 5; }; + class CUP_acc_ANPEQ_2_camo { price = 5; }; + class CUP_acc_ANPEQ_2_desert { price = 5; }; + class CUP_acc_ANPEQ_2_grey { price = 5; }; + class CUP_acc_CZ_M3X { price = 5; }; + }; + class Bipods + { + displayName = "Bipods"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class CUP_bipod_Harris_1A2_L { price = 15; }; + class CUP_bipod_VLTOR_Modpod { price = 15; }; + // DLC bipods + class bipod_01_F_snd { price = 15; }; + class bipod_01_F_blk { price = 15; }; + class bipod_01_F_mtp { price = 15; }; + class bipod_02_F_blk { price = 15; }; + class bipod_02_F_tan { price = 15; }; + class bipod_02_F_hex { price = 15; }; + class bipod_03_F_blk { price = 15; }; + class bipod_03_F_oli { price = 15; }; + }; + class Camo + { + displayName = "Camo"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class CUP_Mxx_camo { price = 10; }; + class CUP_Mxx_camo_half { price = 10; }; + class CUP_SVD_camo_g { price = 10; }; + class CUP_SVD_camo_g_half { price = 10; }; + class CUP_SVD_camo_d { price = 10; }; + class CUP_SVD_camo_d_half { price = 10; }; + }; + }; + + class Magazines { + class RifleAmmo + { + displayName = "Rifle Ammo"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class 5Rnd_rollins_mag {price = 2; tax = 0.9;}; + class 30Rnd_65x39_caseless_green {price = 3; tax = 0.9;}; + class 30Rnd_65x39_caseless_green_mag_Tracer {price = 4; tax = 0.9;}; + class 30Rnd_65x39_caseless_mag {price = 3; tax = 0.9;}; + class 30Rnd_65x39_caseless_mag_Tracer {price = 4; tax = 0.9;}; + class 20Rnd_556x45_UW_mag {price = 3; tax = 0.9;}; + class 30Rnd_556x45_Stanag {price = 3; tax = 0.9;}; + class 30Rnd_556x45_Stanag_Tracer_Red {price = 4; tax = 0.9;}; + class 30Rnd_556x45_Stanag_Tracer_Green {price = 4; tax = 0.9;}; + class 30Rnd_556x45_Stanag_Tracer_Yellow {price = 4; tax = 0.9;}; + class 20Rnd_762x51_Mag {price = 4; tax = 0.9;}; + class 5Rnd_127x108_Mag {price = 3; tax = 0.9;}; + class 5Rnd_127x108_APDS_Mag {price = 6; tax = 0.9;}; + class 7Rnd_408_Mag {price = 4; tax = 0.9;}; + class 10Rnd_762x54_Mag {price = 2; tax = 0.9;}; + class 10Rnd_338_Mag { price = 2; tax = 0.9; }; + class 130Rnd_338_Mag{ price = 2; tax = 0.9; }; + class 10Rnd_93x64_DMR_05_Mag { price = 2; tax = 0.9; }; + class 10Rnd_127x54_Mag { price = 2; tax = 0.9; }; + class CUP_30Rnd_545x39_AK_M { price = 5; tax = 0.9; }; + class CUP_30Rnd_TE1_Green_Tracer_545x39_AK_M { price = 5; tax = 0.9; }; + class CUP_30Rnd_TE1_Red_Tracer_545x39_AK_M { price = 5; tax = 0.9; }; + class CUP_30Rnd_TE1_White_Tracer_545x39_AK_M { price = 5; tax = 0.9; }; + class CUP_30Rnd_TE1_Yellow_Tracer_545x39_AK_M { price = 5; tax = 0.9; }; + class CUP_45Rnd_TE4_LRT4_Green_Tracer_545x39_RPK_M { price = 5; tax = 0.9; }; + class CUP_30Rnd_762x39_AK47_M { price = 5; tax = 0.9; }; + class CUP_75Rnd_TE4_LRT4_Green_Tracer_545x39_RPK_M { price = 5; tax = 0.9; }; + class CUP_20Rnd_762x51_CZ805B { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Yellow_Tracer_762x51_CZ805B { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Red_Tracer_762x51_CZ805B { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Green_Tracer_762x51_CZ805B { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_White_Tracer_762x51_CZ805B { price = 5; tax = 0.9; }; + class CUP_20Rnd_762x51_FNFAL_M { price = 5; tax = 0.9; }; + class CUP_20Rnd_762x51_B_SCAR { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Yellow_Tracer_762x51_SCAR { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Red_Tracer_762x51_SCAR { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Green_Tracer_762x51_SCAR { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_White_Tracer_762x51_SCAR { price = 5; tax = 0.9; }; + class CUP_30Rnd_Sa58_M_TracerG { price = 5; tax = 0.9; }; + class CUP_30Rnd_Sa58_M_TracerR { price = 5; tax = 0.9; }; + class CUP_30Rnd_Sa58_M_TracerY { price = 5; tax = 0.9; }; + class CUP_30Rnd_Sa58_M { price = 5; tax = 0.9; }; + // new magazines kiory + class 30rnd_556_magazine{ price = 5; tax = 0.9; }; + class 20rnd_762_magazine{ price = 5; tax = 0.9; }; + // new magazines seq + class 30Rnd_762x39_Mag {price = 5; tax = 0.9;}; + class 200Rnd_556x45_M249 {price = 5; tax = 0.9;}; + + class 200Rnd_65x39_cased_Box {price = 5; tax = 0.9;}; + class 100Rnd_65x39_caseless_mag {price = 3; tax = 0.9;}; + class 200Rnd_65x39_cased_Box_Tracer {price = 5; tax = 0.9;}; + class 100Rnd_65x39_caseless_mag_Tracer {price = 4; tax = 0.9;}; + class 150Rnd_762x51_Box {price = 4; tax = 0.9;}; + class 150Rnd_762x51_Box_Tracer {price = 5; tax = 0.9;}; + class 150Rnd_762x54_Box{ price = 4; tax = 0.9; }; + class 150Rnd_762x54_Box_Tracer{ price = 5; tax = 0.9; }; + class 150Rnd_93x64_Mag{ price = 6; tax = 0.9; }; + + //needs proper categories + class 16Rnd_9x21_Mag {price = 2; tax = 0.9;}; + class 30Rnd_9x21_Mag {price = 3; tax = 0.9;}; + class 9Rnd_45ACP_Mag {price = 2; tax = 0.9;}; + class 11Rnd_45ACP_Mag {price = 2; tax = 0.9;}; + class 6Rnd_45ACP_Cylinder {price = 2; tax = 0.9;}; + class 10rnd_22X44_magazine {price = 2; tax = 0.9;}; + class 9rnd_45X88_magazine {price = 2; tax = 0.9;}; + class 6Rnd_GreenSignal_F {price = 2;}; + class 6Rnd_RedSignal_F {price = 2;}; + }; + class HandgunAmmo + { + displayName = "Handgun Ammo"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class CUP_10Rnd_9x19_Compact { price = 3; tax = 0.9; }; + class CUP_18Rnd_9x19_Phantom { price = 3; tax = 0.9; }; + class CUP_17Rnd_9x19_glock17 { price = 3; tax = 0.9; }; + class CUP_8Rnd_9x18_Makarov_M { price = 3; tax = 0.9; }; + class CUP_8Rnd_9x18_MakarovSD_M { price = 3; tax = 0.9; }; + class CUP_30Rnd_9x19_UZI { price = 3; tax = 0.9; }; + class CUP_6Rnd_45ACP_M { price = 3; tax = 0.9; }; + class CUP_20Rnd_B_765x17_Ball_M { price = 3; tax = 0.9; }; + class CUP_15Rnd_9x19_M9 { price = 3; tax = 0.9; }; + class CUP_7Rnd_45ACP_1911 { price = 3; tax = 0.9; }; + }; + class ShotgunAmmo + { + displayName = "Shotgun Ammo"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class CUP_20Rnd_B_AA12_Pellets { price = 5; tax = 0.9; }; + class CUP_20Rnd_B_AA12_74Slug { price = 5; tax = 0.9; }; + class CUP_20Rnd_B_AA12_HE { price = 15; tax = 0.9; }; + class CUP_8Rnd_B_Beneli_74Slug { price = 5; tax = 0.9; }; + class CUP_8Rnd_B_Beneli_74Pellets { price = 5; tax = 0.9; }; + class CUP_8Rnd_B_Saiga12_74Slug_M { price = 5; tax = 0.9; }; + class CUP_8Rnd_B_Saiga12_74Pellets_M { price = 5; tax = 0.9; }; + class spear_magazine { price = 5; tax = 0.9; }; + }; + class SniperAmmo + { + displayName = "Sniper Ammo"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class CUP_5Rnd_127x99_as50_M { price = 5; tax = 0.9; }; + class CUP_10x_303_M { price = 5; tax = 0.9; }; + class CUP_10Rnd_127x99_m107 { price = 5; tax = 0.9; }; + class CUP_20Rnd_762x51_B_M110 { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Yellow_Tracer_762x51_M110 { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Red_Tracer_762x51_M110 { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_Green_Tracer_762x51_M110 { price = 5; tax = 0.9; }; + class CUP_20Rnd_TE1_White_Tracer_762x51_M110 { price = 5; tax = 0.9; }; + class CUP_5Rnd_762x51_M24 { price = 5; tax = 0.9; }; + class CUP_5Rnd_127x108_KSVK_M { price = 5; tax = 0.9; }; + class CUP_10Rnd_762x54_SVD_M { price = 5; tax = 0.9; }; + class CUP_10Rnd_9x39_SP5_VSS_M { price = 5; tax = 0.9; }; + class CUP_20Rnd_9x39_SP5_VSS_M { price = 5; tax = 0.9; }; + class CUP_10Rnd_762x51_CZ750_Tracer { price = 5; tax = 0.9; }; + class CUP_10Rnd_762x51_CZ750 { price = 5; tax = 0.9; }; + class CUP_5x_22_LR_17_HMR_M { price = 5; tax = 0.9; }; + class CUP_5Rnd_86x70_L115A1 { price = 5; tax = 0.9; }; + class CUP_5Rnd_762x67_G22 { price = 5; tax = 0.9; }; + }; + class LMGAmmo + { + displayName = "LMG Ammo"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class CUP_100Rnd_TE4_LRT4_White_Tracer_762x51_Belt_M { price = 7; tax = 0.9; }; + class CUP_100Rnd_TE4_LRT4_Red_Tracer_762x51_Belt_M { price = 7; tax = 0.9; }; + class CUP_100Rnd_TE4_LRT4_762x54_PK_Tracer_Green_M { price = 7; tax = 0.9; }; + class CUP_50Rnd_UK59_762x54R_Tracer { price = 5; tax = 0.9; }; + }; + class SMGAmmo + { + displayName = "SMG Ammo"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class 30Rnd_45ACP_Mag_SMG_01 {price = 2; tax = 0.9;}; + class 30Rnd_45ACP_Mag_SMG_01_Tracer_Green {price = 3; tax = 0.9;}; + class CUP_64Rnd_9x19_Bizon_M { price = 5; tax = 0.9; }; + class CUP_64Rnd_Green_Tracer_9x19_Bizon_M { price = 4; tax = 0.9; }; + class CUP_64Rnd_Red_Tracer_9x19_Bizon_M { price = 4; tax = 0.9; }; + class CUP_64Rnd_White_Tracer_9x19_Bizon_M { price = 4; tax = 0.9; }; + class CUP_64Rnd_Yellow_Tracer_9x19_Bizon_M { price = 4; tax = 0.9; }; + class CUP_30Rnd_9x19_MP5 { price = 4; tax = 0.9; }; + }; + class Thrown + { + displayName = "Thrown"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class UGL_FlareWhite_F {price = 2;}; + class UGL_FlareGreen_F {price = 2;}; + class UGL_FlareRed_F {price = 2;}; + class UGL_FlareYellow_F {price = 2;}; + class UGL_FlareCIR_F {price = 2;}; + class 1Rnd_Smoke_Grenade_shell {price = 4;}; + class 1Rnd_SmokeRed_Grenade_shell {price = 4;}; + class 1Rnd_SmokeGreen_Grenade_shell {price = 4;}; + class 1Rnd_SmokeYellow_Grenade_shell {price = 4;}; + class 1Rnd_SmokePurple_Grenade_shell {price = 4;}; + class 1Rnd_SmokeBlue_Grenade_shell {price = 4;}; + class 1Rnd_SmokeOrange_Grenade_shell {price = 4;}; + class 3Rnd_HE_Grenade_shell {price = 10;}; + class 3Rnd_UGL_FlareWhite_F {price = 4;}; + class 3Rnd_UGL_FlareGreen_F {price = 4;}; + class 3Rnd_UGL_FlareRed_F {price = 4;}; + class 3Rnd_UGL_FlareYellow_F {price = 4;}; + class 3Rnd_UGL_FlareCIR_F {price = 4;}; + class 3Rnd_Smoke_Grenade_shell {price = 3;}; + class 3Rnd_SmokeRed_Grenade_shell {price = 3;}; + class 3Rnd_SmokeGreen_Grenade_shell {price = 3;}; + class 3Rnd_SmokeYellow_Grenade_shell {price = 3;}; + class 3Rnd_SmokePurple_Grenade_shell {price = 3;}; + class 3Rnd_SmokeBlue_Grenade_shell {price = 3;}; + class 3Rnd_SmokeOrange_Grenade_shell {price = 3;}; + class HandGrenade_Stone {price = 1;}; + class SmokeShell {price = 2;}; + class SmokeShellYellow {price = 2;}; + class SmokeShellGreen {price = 2;}; + class SmokeShellRed {price = 2;}; + class SmokeShellPurple {price = 2;}; + class SmokeShellOrange {price = 2;}; + class SmokeShellBlue {price = 2;}; + class Chemlight_green {price = 1;}; + class Chemlight_red {price = 1;}; + class Chemlight_yellow {price = 1;}; + class Chemlight_blue {price = 1;}; + }; + class Explosives + { + displayName = "Explosives"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class HandGrenade {price = 15;}; + class MiniGrenade {price = 10;}; + class DemoCharge_Remote_Mag {price = 40;}; + class SatchelCharge_Remote_Mag {price = 75;}; + class ATMine_Range_Mag {price = 50;}; + class ClaymoreDirectionalMine_Remote_Mag {price = 50;}; + class APERSMine_Range_Mag {price = 30;}; + class APERSBoundingMine_Range_Mag {price = 50;}; + class SLAMDirectionalMine_Wire_Mag {price = 40;}; + class APERSTripMine_Wire_Mag {price = 30;}; + }; + }; + + class Gear { + class Uniform + { + displayName = "Outfits"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + // Marksman DLC + class U_O_FullGhillie_lsh { price = 7; }; + class U_O_FullGhillie_sard { price = 7; }; + class U_O_FullGhillie_ard { price = 7; }; + + class U_O_CombatUniform_ocamo {price = 5;}; + class U_O_GhillieSuit {price = 5;}; + class U_O_PilotCoveralls {price = 5;}; + class U_O_Wetsuit {price = 5;}; + class U_OG_Guerilla1_1 {price = 5;}; + class U_OG_Guerilla2_1 {price = 5;}; + class U_OG_Guerilla2_2 {price = 5;}; + class U_OG_Guerilla2_3 {price = 5;}; + class U_OG_Guerilla3_1 {price = 5;}; + class U_OG_Guerilla3_2 {price = 5;}; + class U_OG_leader {price = 5;}; + + class U_C_Poloshirt_stripped {price = 4;}; + class U_C_Poloshirt_blue {price = 4;}; + class U_C_Poloshirt_burgundy {price = 4;}; + class U_C_Poloshirt_tricolour {price = 4;}; + class U_C_Poloshirt_salmon {price = 4;}; + class U_C_Poloshirt_redwhite {price = 4;}; + class U_C_Poor_1 {price = 5;}; + class U_C_WorkerCoveralls {price = 5;}; + class U_C_Journalist {price = 5;}; + class U_C_Scientist {price = 5;}; + class U_OrestesBody {price = 5;}; + class U_Wetsuit_uniform {price = 5;}; + class U_Wetsuit_White {price = 5;}; + class U_Wetsuit_Blue {price = 5;}; + class U_Wetsuit_Purp {price = 5;}; + class U_Wetsuit_Camo {price = 5;}; + class U_Camo_uniform {price = 5;}; + class U_ghillie1_uniform {price = 5;}; + class U_ghillie2_uniform {price = 5;}; + class U_ghillie3_uniform {price = 5;}; + class U_CamoBlue_uniform {price = 5;}; + class U_CamoBrn_uniform {price = 5;}; + class U_CamoRed_uniform {price = 5;}; + + class U_C_Driver_1 {price = 5;}; + class U_C_Driver_2 {price = 5;}; + class U_C_Driver_3 {price = 5;}; + class U_C_Driver_4 {price = 5;}; + class U_C_Driver_1_black {price = 5;}; + class U_C_Driver_1_blue {price = 5;}; + class U_C_Driver_1_green {price = 5;}; + class U_C_Driver_1_red {price = 5;}; + class U_C_Driver_1_white {price = 5;}; + class U_C_Driver_1_yellow {price = 5;}; + class U_C_Driver_1_orange {price = 5;}; + }; + class Headgear + { + displayName = "Headgear"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class wolf_mask_epoch {price = 30;}; + class pkin_mask_epoch {price = 30;}; + class clown_mask_epoch {price = 30;}; + class H_1_EPOCH {price = 3;}; + class H_2_EPOCH {price = 3;}; + class H_3_EPOCH {price = 3;}; + class H_4_EPOCH {price = 3;}; + class H_5_EPOCH {price = 3;}; + class H_6_EPOCH {price = 3;}; + class H_7_EPOCH {price = 3;}; + class H_8_EPOCH {price = 3;}; + class H_9_EPOCH {price = 3;}; + class H_10_EPOCH {price = 3;}; + class H_11_EPOCH {price = 3;}; + class H_12_EPOCH {price = 3;}; + class H_13_EPOCH {price = 3;}; + class H_14_EPOCH {price = 3;}; + class H_15_EPOCH {price = 3;}; + class H_16_EPOCH {price = 3;}; + class H_17_EPOCH {price = 3;}; + class H_18_EPOCH {price = 3;}; + class H_19_EPOCH {price = 3;}; + class H_20_EPOCH {price = 3;}; + class H_21_EPOCH {price = 3;}; + class H_22_EPOCH {price = 3;}; + class H_23_EPOCH {price = 3;}; + class H_24_EPOCH {price = 3;}; + class H_25_EPOCH {price = 3;}; + class H_26_EPOCH {price = 3;}; + class H_27_EPOCH {price = 3;}; + class H_28_EPOCH {price = 3;}; + class H_29_EPOCH {price = 3;}; + class H_30_EPOCH {price = 3;}; + class H_31_EPOCH {price = 3;}; + class H_32_EPOCH {price = 3;}; + class H_33_EPOCH {price = 3;}; + class H_34_EPOCH {price = 3;}; + class H_35_EPOCH {price = 3;}; + class H_36_EPOCH {price = 3;}; + class H_37_EPOCH {price = 3;}; + class H_38_EPOCH {price = 3;}; + class H_39_EPOCH {price = 3;}; + class H_40_EPOCH {price = 3;}; + class H_41_EPOCH {price = 3;}; + class H_42_EPOCH {price = 3;}; + class H_43_EPOCH {price = 3;}; + class H_44_EPOCH {price = 3;}; + class H_45_EPOCH {price = 3;}; + class H_46_EPOCH {price = 3;}; + class H_47_EPOCH {price = 3;}; + class H_48_EPOCH {price = 3;}; + class H_49_EPOCH {price = 3;}; + class H_50_EPOCH {price = 3;}; + class H_51_EPOCH {price = 3;}; + class H_52_EPOCH {price = 3;}; + class H_53_EPOCH {price = 3;}; + class H_54_EPOCH {price = 3;}; + class H_55_EPOCH {price = 3;}; + class H_56_EPOCH {price = 3;}; + class H_57_EPOCH {price = 3;}; + class H_58_EPOCH {price = 3;}; + class H_59_EPOCH {price = 3;}; + class H_60_EPOCH {price = 3;}; + class H_61_EPOCH {price = 3;}; + class H_62_EPOCH {price = 3;}; + class H_63_EPOCH {price = 3;}; + class H_64_EPOCH {price = 3;}; + class H_65_EPOCH {price = 3;}; + class H_66_EPOCH {price = 3;}; + class H_67_EPOCH {price = 3;}; + class H_68_EPOCH {price = 3;}; + class H_69_EPOCH {price = 3;}; + class H_70_EPOCH {price = 3;}; + class H_71_EPOCH {price = 3;}; + class H_72_EPOCH {price = 3;}; + class H_73_EPOCH {price = 3;}; + class H_74_EPOCH {price = 3;}; + class H_75_EPOCH {price = 3;}; + class H_76_EPOCH {price = 3;}; + class H_77_EPOCH {price = 3;}; + class H_78_EPOCH {price = 3;}; + class H_79_EPOCH {price = 3;}; + class H_80_EPOCH {price = 3;}; + class H_81_EPOCH {price = 3;}; + class H_82_EPOCH {price = 3;}; + class H_83_EPOCH {price = 3;}; + class H_84_EPOCH {price = 3;}; + class H_85_EPOCH {price = 3;}; + class H_86_EPOCH {price = 3;}; + class H_87_EPOCH {price = 3;}; + class H_88_EPOCH {price = 3;}; + class H_89_EPOCH {price = 3;}; + class H_90_EPOCH {price = 3;}; + class H_91_EPOCH {price = 3;}; + class H_92_EPOCH {price = 3;}; + class H_93_EPOCH {price = 3;}; + class H_94_EPOCH {price = 5;}; + class H_95_EPOCH {price = 5;}; + class H_96_EPOCH {price = 5;}; + class H_97_EPOCH {price = 5;}; + class H_98_EPOCH {price = 5;}; + class H_99_EPOCH {price = 5;}; + class H_100_EPOCH {price = 5;}; + class H_101_EPOCH {price = 5;}; + class H_102_EPOCH {price = 5;}; + class H_103_EPOCH {price = 5;}; + class H_104_EPOCH {price = 3;}; + }; + class Vests + { + displayName = "Vests"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + 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;}; + class V_4_EPOCH {price = 5;}; + class V_5_EPOCH {price = 5;}; + class V_6_EPOCH {price = 5;}; + class V_7_EPOCH {price = 5;}; + class V_8_EPOCH {price = 5;}; + class V_9_EPOCH {price = 5;}; + class V_10_EPOCH {price = 5;}; + class V_11_EPOCH {price = 5;}; + class V_12_EPOCH {price = 5;}; + class V_13_EPOCH {price = 5;}; + class V_14_EPOCH {price = 5;}; + class V_15_EPOCH {price = 5;}; + class V_16_EPOCH {price = 5;}; + class V_17_EPOCH {price = 5;}; + class V_18_EPOCH {price = 5;}; + class V_19_EPOCH {price = 5;}; + class V_20_EPOCH {price = 5;}; + class V_21_EPOCH {price = 5;}; + class V_22_EPOCH {price = 5;}; + class V_23_EPOCH {price = 5;}; + class V_24_EPOCH {price = 5;}; + class V_25_EPOCH {price = 5;}; + class V_26_EPOCH {price = 5;}; + class V_27_EPOCH {price = 5;}; + class V_28_EPOCH {price = 5;}; + class V_29_EPOCH {price = 5;}; + class V_30_EPOCH {price = 5;}; + class V_31_EPOCH {price = 5;}; + class V_32_EPOCH {price = 5;}; + class V_33_EPOCH {price = 5;}; + class V_34_EPOCH {price = 5;}; + class V_35_EPOCH {price = 5;}; + class V_36_EPOCH {price = 5;}; + class V_37_EPOCH {price = 5;}; + class V_38_EPOCH {price = 5;}; + class V_39_EPOCH {price = 5;}; + class V_40_EPOCH {price = 5;}; + }; + }; + + class Backpacks { + class BSmall + { + displayName = "Small Backpacks"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class B_AssaultPack_cbr {price = 10;}; + class B_AssaultPack_dgtl {price = 10;}; + class B_AssaultPack_khk {price = 10;}; + class B_AssaultPack_mcamo {price = 10;}; + class B_AssaultPack_ocamo {price = 10;}; + class B_AssaultPack_rgr {price = 10;}; + class B_AssaultPack_sgg {price = 10;}; + class B_AssaultPack_blk { price = 10; }; + class smallbackpack_red_epoch {price = 22;}; + class smallbackpack_green_epoch {price = 22;}; + class smallbackpack_teal_epoch {price = 22;}; + class smallbackpack_pink_epoch {price = 22;}; + class I_UAV_01_backpack_F {price = 22;}; + class B_FieldPack_blk {price = 15;}; + class B_FieldPack_cbr {price = 15;}; + class B_FieldPack_khk {price = 15;}; + class B_FieldPack_ocamo {price = 15;}; + class B_FieldPack_oli {price = 15;}; + class B_FieldPack_oucamo {price = 15;}; + }; + class BMedium + { + displayName = "Medium Backpacks"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class B_TacticalPack_blk {price = 20;}; + class B_TacticalPack_mcamo {price = 20;}; + class B_TacticalPack_ocamo {price = 20;}; + class B_TacticalPack_oli {price = 20;}; + class B_TacticalPack_rgr {price = 20;}; + class B_Kitbag_cbr {price = 25;}; + class B_Kitbag_mcamo {price = 25;}; + class B_Kitbag_rgr {price = 25;}; + class B_Kitbag_sgg {price = 25;}; + }; + class BLarge + { + displayName = "Large Backpacks"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class B_Carryall_cbr {price = 40;}; + class B_Carryall_khk {price = 40;}; + class B_Carryall_mcamo {price = 40;}; + class B_Carryall_ocamo {price = 40;}; + class B_Carryall_oli {price = 40;}; + class B_Carryall_oucamo {price = 40;}; + }; + class para + { + displayName = "Parachute"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class B_Parachute {price = 25;}; // no packed option + }; + class packed + { + displayName = "Packed backpacks"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class Item_AssaultPack_cbr { + price = 10; + }; + class Item_AssaultPack_dgtl { + price = 10; + }; + class Item_AssaultPack_khk { + price = 10; + }; + class Item_AssaultPack_mcamo { + price = 10; + }; + class Item_AssaultPack_ocamo { + price = 10; + }; + class Item_AssaultPack_rgr { + price = 10; + }; + class Item_AssaultPack_sgg { + price = 10; + }; + class Item_AssaultPack_blk { + price = 10; + }; + class Item_Carryall_cbr { + price = 40; + }; + class Item_Carryall_khk { + price = 40; + }; + class Item_Carryall_mcamo { + price = 40; + }; + class Item_Carryall_ocamo { + price = 40; + }; + class Item_Carryall_oli { + price = 40; + }; + class Item_Carryall_oucamo { + price = 40; + }; + class Item_FieldPack_blk { + price = 15; + }; + class Item_FieldPack_cbr { + price = 15; + }; + class Item_FieldPack_khk { + price = 15; + }; + class Item_FieldPack_ocamo { + price = 15; + }; + class Item_FieldPack_oli { + price = 15; + }; + class Item_FieldPack_oucamo { + price = 15; + }; + class Item_Kitbag_cbr { + price = 25; + }; + class Item_Kitbag_mcamo { + price = 25; + }; + class Item_Kitbag_rgr { + price = 25; + }; + class Item_Kitbag_sgg { + price = 25; + }; + class Item_TacticalPack_blk { + price = 20; + }; + class Item_TacticalPack_mcamo { + price = 20; + }; + class Item_TacticalPack_ocamo { + price = 20; + }; + class Item_TacticalPack_oli { + price = 20; + }; + class Item_TacticalPack_rgr { + price = 20; + }; + class Item_smallbackpack_red { + price = 22; + }; + class Item_smallbackpack_green { + price = 22; + }; + class Item_smallbackpack_teal { + price = 22; + }; + class Item_smallbackpack_pink { + price = 22; + }; + }; + }; + + class Vehicles { + class Air1 + { + displayName = "Airplanes"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class C_Plane_Civil_01_F {price = 5000;}; + class C_Plane_Civil_01_racing_F {price = 5000;}; + class B_T_VTOL_01_infantry_F {price = 10000;}; + class B_T_VTOL_01_vehicle_F {price = 10000;}; + + //CUP + class CUP_C_C47_CIV {price = 1600;}; + class CUP_C_DC3_CIV {price = 2400;}; + }; + class Air2 + { + displayName = "Helicopters"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class mosquito_epoch { price = 1500; }; + class B_Heli_Light_01_EPOCH {price = 2500;}; + class O_Heli_Light_02_unarmed_EPOCH {price = 2500;}; + class I_Heli_Transport_02_EPOCH {price = 2500;}; + class I_Heli_light_03_unarmed_EPOCH {price = 2500;}; + class C_Heli_Light_01_civil_EPOCH {price = 2500;}; + class O_Heli_Transport_04_EPOCH {price = 2500;}; + class O_Heli_Transport_04_bench_EPOCH {price = 2500;}; + class O_Heli_Transport_04_box_EPOCH {price = 2500;}; + class O_Heli_Transport_04_covered_EPOCH {price = 2500;}; + class B_Heli_Transport_03_unarmed_EPOCH {price = 2500;}; + }; + class Land1 + { + displayName = "Light Vehicles"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class K01 {price = 300;}; + class K02 {price = 300;}; + class K03 {price = 300;}; + class K04 {price = 300;}; + class ebike_epoch {price = 1500;}; + class C_Quadbike_01_EPOCH {price = 500;}; + + //CUP + class CUP_B_M1030 {price = 500;}; + }; + class Land2 + { + displayName = "Medium Vehicles"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class C_Offroad_01_EPOCH {price = 750;}; + class C_Hatchback_01_EPOCH {price = 750;}; + class C_Hatchback_02_EPOCH {price = 1000;}; + class C_SUV_01_EPOCH {price = 750;}; + class C_Van_01_box_EPOCH {price = 1000;}; + class C_Van_01_transport_EPOCH {price = 1000;}; + class B_MRAP_01_EPOCH {price = 2500;}; + class I_MRAP_03_EPOCH { price = 2500; }; + class B_G_Offroad_01_armed_EPOCH {price = 2500;}; + + //APEX + class C_Offroad_02_unarmed_F {price = 3500;}; + class I_C_Offroad_02_unarmed_F {price = 3500;}; + class B_T_LSV_01_unarmed_F {price = 4400;}; + class O_LSV_02_unarmed_F {price = 4300;}; + class O_T_LSV_02_unarmed_F {price = 4600;}; + class B_CTRG_LSV_01_light_F {price = 4400;}; + class B_LSV_01_unarmed_F {price = 4400;}; + + //CUP + class CUP_B_LR_Transport_CZ_W {price = 800;}; + class CUP_C_LR_Transport_CTK {price = 800;}; + class CUP_B_Zodiac_USMC {price = 800;}; + class CUP_C_Skoda_Red_CIV {price = 800;}; + class CUP_C_Skoda_White_CIV {price = 800;}; + class CUP_C_Skoda_Blue_CIV {price = 800;}; + class CUP_C_Skoda_Green_CIV {price = 800;}; + class CUP_C_SUV_CIV {price = 1500;}; + class CUP_B_HMMWV_Transport_USA {price = 2500;}; + class CUP_B_HMMWV_Unarmed_USA {price = 2500;}; + class CUP_C_SUV_TK {price = 2000;}; + class CUP_B_LR_Transport_CZ_D {price = 1100;}; + class CUP_C_Datsun_Covered {price = 800;}; + class CUP_C_Datsun_Plain {price = 800;}; + class CUP_C_Datsun_Tubeframe {price = 800;}; + class CUP_C_Datsun_4seat {price = 800;}; + class CUP_C_Datsun {price = 800;}; + class CUP_C_Golf4_green_Civ {price = 800;}; + class CUP_C_Golf4_red_Civ {price = 800;}; + class CUP_C_Golf4_blue_Civ {price = 800;}; + class CUP_C_Golf4_black_Civ {price = 800;}; + class CUP_C_Golf4_kitty_Civ {price = 800;}; + class CUP_C_Golf4_reptile_Civ {price = 800;}; + class CUP_C_Golf4_camodigital_Civ {price = 800;}; + class CUP_C_Golf4_camodark_Civ {price = 800;}; + class CUP_C_Golf4_camo_Civ {price = 800;}; + class CUP_C_Golf4_white_Civ {price = 800;}; + class CUP_C_Golf4_whiteblood_Civ {price = 800;}; + class CUP_C_Golf4_yellow_Civ {price = 800;}; + class CUP_C_Octavia_CIV {price = 1600;}; + class CUP_B_HMMWV_Ambulance_USA {price = 1500;}; + class CUP_C_UAZ_Unarmed_TK_CIV {price = 1000;}; + class CUP_C_UAZ_Open_TK_CIV {price = 1000;}; + class CUP_B_UAZ_Unarmed_CDF {price = 1000;}; + }; + class Land3 + { + displayName = "Heavy Vehicles"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class B_Truck_01_transport_EPOCH {price = 1000;}; + class B_Truck_01_covered_EPOCH {price = 1000;}; + class B_Truck_01_mover_EPOCH {price = 1000;}; + class B_Truck_01_box_EPOCH {price = 1000;}; + class O_Truck_02_covered_EPOCH {price = 1000;}; + class O_Truck_02_transport_EPOCH {price = 1000;}; + class O_Truck_03_covered_EPOCH {price = 1000;}; + class O_Truck_02_box_EPOCH {price = 1000;}; + + //CUP + class CUP_C_Ural_Civ_03 {price = 1200;}; + class CUP_C_Ural_Open_Civ_03 {price = 1200;}; + class CUP_C_Ural_Civ_02 {price = 1200;}; + class CUP_B_TowingTractor_USMC {price = 800;}; + class CUP_C_Ural_Civ_01 {price = 1000;}; + class CUP_C_Ural_Open_Civ_01 {price = 1000;}; + class CUP_B_Ural_CDF {price = 1000;}; + class CUP_B_Ural_Open_CDF {price = 1000;}; + class CUP_C_Ural_Open_Civ_02 {price = 1000;}; + class CUP_B_Ural_Empty_CDF {price = 1000;}; + }; + class Ship + { + displayName = "Boats"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + class C_Rubberboat_EPOCH {price = 500;}; + class C_Rubberboat_02_EPOCH {price = 500;}; + class C_Rubberboat_03_EPOCH {price = 500;}; + class C_Rubberboat_04_EPOCH {price = 500;}; + class jetski_epoch {price = 500;}; + class C_Boat_Civil_01_EPOCH {price = 750;}; + class C_Boat_Civil_01_police_EPOCH {price = 750;}; + class C_Boat_Civil_01_rescue_EPOCH {price = 750;}; + class B_SDV_01_EPOCH {price = 1000;}; + + //APEX + class CUP_C_Fishing_Boat_Chernarus {price = 800;}; + class C_Scooter_Transport_01_F {price = 1200;}; + class C_Boat_Transport_02_F {price = 1200;}; + }; + class Terminal + { + displayName = "UAV"; //localize these + picture = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + //Mission Items + class B_UavTerminal {price = 10;}; + class O_UavTerminal {price = 10;}; + class I_UAV_01_F {price = 50;}; + }; + }; + +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_GUI_rmx.hpp b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_GUI_rmx.hpp new file mode 100644 index 00000000..ebca1678 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_GUI_rmx.hpp @@ -0,0 +1,550 @@ +/* #Ziboja +$[ + 1.063, + ["trader_menu",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], + [-2202,"main_menu_mainBG",[0,"",[0,0,1,1],[-1,-1,-1,-1],[0.21,0.22,0.25,1],[-1,-1,-1,-1],"","-1"],[]], + [-1201,"main_menu_top_BG",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa",[0,0,1,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1802,"main_menu_top_frame",[0,"",[0,0,1,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-2200,"dyn_menu_left_bg",[0,"",[-0.2,0,0.2,1.06],[-1,-1,-1,-1],[0.21,0.22,0.25,1],[-1,-1,-1,-1],"","-1"],[]], + [-1800,"dyn_menu_left_frame",[0,"",[-0.2,0,0.2,1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1200,"dyn_menu_left_buttonBG",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa",[-0.2,0,0.2,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1205,"dyn_menu_left_indicator",[0,"#(argb,8,8,3)color(1,1,1,1)",[-0.2,0,0.0075,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1202,"placeholder_left",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa",[-0.05,0.012,0.0375,0.04],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-2201,"dyn_menu_right_bg",[0,"",[1,0,0.2,1.06],[-1,-1,-1,-1],[0.21,0.22,0.25,1],[-1,-1,-1,-1],"","-1"],[]], + [-1801,"dyn_menu_right_frame",[0,"",[1,0,0.2,1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1203,"dyn_menu_right_buttonBG",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa",[1,0,0.2,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1206,"dyn_menu_right_indicator",[0,"#(argb,8,8,3)color(1,1,1,1)",[1.1925,0,0.0075,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1204,"placeholder_right",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa",[1.01,0.012,0.0375,0.04],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1500,"main_menu_left_LB",[0,"",[0,0.06,0.5,0.62],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1803,"main_menu_left_frame",[0,"",[0,0.06,0.5,0.62],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-2100,"main_menu_left_CB",[0,"",[0.28,0.008,0.2125,0.044],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1400,"main_menu_left_search",[0,"Type here to Search ...",[0.0075,0.008,0.265,0.044],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1501,"main_menu_right_LB",[0,"",[0.5,0.06,0.5,0.62],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1804,"main_menu_right_frame",[0,"",[0.5,0.06,0.5,0.62],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-2101,"main_menu_right_CB",[0,"",[0.78,0.008,0.2125,0.044],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1401,"main_menu_right_search",[0,"Type here to Search ...",[0.51,0.008,0.265,0.044],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1207,"main_menu_activeButton_TRADE",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa",[0,1,0.5,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1208,"main_menu_activeButton_CANCEL",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa",[0.5,1,0.5,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1000,"main_menu_activeButtonText_TRADE",[0,"Trade",[0.25,1.004,0.105,0.056],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1001,"main_menu_activeButtonText_CANCEL",[0,"Close",[0.7225,1.004,0.105,0.056],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1805,"desc_frame",[0,"",[0,0.68,1,0.32],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1209,"desc_icon",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa",[0.5,0.82,0.1375,0.18],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1002,"desc_item_descriptionShort",[0,"Short description",[0.5,0.741158,0.5,0.036],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1211,"desc_title_bg",[0,"x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa",[0,0.68,1,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1502,"desc_transaction_log_LB",[0,"",[0,0.74,0.5,0.26],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1100,"desc_rsctext_left",[0,"",[0,0.68,0.5,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1101,"desc_rsctext_right",[0,"",[0.5,0.68,0.5,0.06],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-1102,"desc_rscText_itemPropertiesFromCfgPricing",[0,"",[0.6375,0.776,0.3625,0.224],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [-2203,"hide_background",[0,"",[0.25,0.58,0.5,0.1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1003,"hide_main_menu_rscProgress",[0,"Slider",[0.2625,0.6,0.25,0.062],[-1,-1,-1,-1],[0,0,0,1],[-1,-1,-1,-1],"","-1"],[]], + [1402,"hide_valuebox",[0,"",[0.5225,0.6,0.09,0.064],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1600,"hide_btn_ok",[0,"OK",[0.6225,0.6,0.0525,0.064],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], + [1601,"hide_btn_X",[0,"X",[0.685,0.6,0.0525,0.064],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]] +] +*/ + + + +//delete on release +class IGUIBack; +class rmx_rscPicture; +class RscFrame; +class RscStructuredText; +class RscText; +class RscActivePicture; +class RscEdit; +class RscCombo; +class RscListbox; +class RscButton; +class RscProgress; +class rmx_rscControlsGroup; + +class rmx_CT_TREE +{ + access = 0; // Control access (0 - ReadAndWrite, 1 - ReadAndCreate, 2 - ReadOnly, 3 - ReadOnlyVerified) + idc = -1; // Control identification (without it, the control won't be displayed) + type = 12; // Type CT_TREE + style = ST_LEFT; // Style + default = 0; // Control selected by default (only one within a display can be used) + blinkingPeriod = 0; // Time in which control will fade out and back in. Use 0 to disable the effect. + + x = 0; // Horizontal coordinates + y = 0; // Vertical coordinates + w = 1; // Width + h = 1; // Height + + colorBorder[] = {0,0,0,0}; // Frame color + + colorBackground[] = {0,0,0,0}; // Fill color + colorSelectBackground[]={0,0,0,0.5}; + colorSelect[] = {0.3,0.3,0.3,1}; // Selected item fill color (when multiselectEnabled is 0) + colorMarked[] = {0.3,0.3,0.3,0.5}; // Marked item fill color (when multiselectEnabled is 1) + colorMarkedSelected[] = {1,0.5,0,1}; // Selected item fill color (when multiselectEnabled is 1) + colorSearch[]= + { + "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.77])", + "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.51])", + "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.08])", + "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.8])" + }; + colorDisabled[]={1,1,1,0.25}; + colorArrow[] = {0,0,0,0}; + colorLines[]={0,0,0,0}; + + borderSize=0; + rowHeight=0.043909099; + sizeEx = 0.03; // Text size + font = "TahomaB"; // Font from CfgFontFamilies + shadow = 1; // Shadow (0 - none, 1 - N/A, 2 - black outline) + colorText[] = {1,1,1,1}; // Text color + colorSelectText[] = {1,1,1,1}; // Selected text color (when multiselectEnabled is 0) + colorMarkedText[] = {1,1,1,1}; // Selected text color (when multiselectEnabled is 1) + + colorPicture[]={1,1,1,1}; + colorPictureSelected[]={0,0,0,1}; + colorPictureDisabled[]={1,1,1,0.25}; + colorPictureRight[]={1,1,1,1}; + colorPictureRightSelected[]={0,0,0,1}; + colorPictureRightDisabled[]={1,1,1,0.25}; + + tooltip = ""; // Tooltip text + tooltipColorShade[] = {0,0,0,1}; // Tooltip background color + tooltipColorText[] = {1,1,1,1}; // Tooltip text color + tooltipColorBox[] = {1,1,1,1}; // Tooltip frame color + + multiselectEnabled = 1; // Allow selecting multiple items while holding Ctrl or Shift + expandOnDoubleclick = 1; // Expand/collapse item upon double-click + + hiddenTexture = "A3\ui_f\data\gui\rsccommon\rsctree\hiddenTexture_ca.paa"; // Expand icon + expandedTexture = "A3\ui_f\data\gui\rsccommon\rsctree\expandedTexture_ca.paa"; // Collapse icon + + maxHistoryDelay = 1; // Time since last keyboard type search to reset it + + // Scrollbar configuration + class ScrollBar + { + width = 0; // Unknown? + height = 0; // Unknown? + scrollSpeed = 0.01; // Unknown? + + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; // Arrow + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; // Arrow when clicked on + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; // Slider background (stretched vertically) + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; // Dragging element (stretched vertically) + + color[] = {1,1,1,1}; // Scrollbar color + }; + + /* + onTreeSelChanged = "systemChat str ['onTreeSelChanged',_this]; false"; + onTreeLButtonDown = "systemChat str ['onTreeLButtonDown',_this]; false"; + onTreeDblClick = "systemChat str ['onTreeDblClick',_this]; false"; + onTreeExpanded = "systemChat str ['onTreeExpanded',_this]; false"; + onTreeCollapsed = "systemChat str ['onTreeCollapsed',_this]; false"; + onTreeMouseExit = "systemChat str ['onTreeMouseExit',_this]; false"; + */ +}; + +class rmx_traderUI { + idd = 55500; + enableSimulation = 1; + movingEnable = 0; + onUnload = "call epoch_tradeUnload;"; + onLoad = "setMousePosition [0.5, 0.5];"; + + class controls + { + class main_menu_mainBG: IGUIBack + { + idc = 55501; + x = 0; + y = 0; + w = 1; + h = 1; + colorBackground[] = {0.21,0.22,0.25,1}; + }; + class main_menu_top_BG: rmx_rscPicture + { + idc = 55502; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa"; + x = 0; + y = 0; + w = 1; + h = 0.06; + }; + class dyn_menu_left_bg_trigger: IGUIBack + { + idc = 55600; + x = SafezoneX; //-0.5; + y = SafeZoneY; //0; + w = "(abs SafezoneX)" //0.5; + h = safeZoneW; //1.06; + colorBackground[] = {0,0,0,0}; + //onLoad = "(_this select 0) ctrlEnable true"; + //onMouseEnter = "['left','enter'] call Epoch_tradeMouseEvents"; + //onMouseExit = "['left','exit'] call Epoch_tradeMouseEvents"; + }; + class dyn_menu_right_bg_trigger: IGUIBack + { + idc = 55601; + x = 1; + y = SafeZoneY; //0; + w = abs SafezoneX; // 0.5; + h = safeZoneW; //1.06; + colorBackground[] = {0,0,0,0}; + //onLoad = "(_this select 0) ctrlEnable true"; + //onMouseEnter = "['right','enter'] call Epoch_tradeMouseEvents"; + //onMouseExit = "['right','exit'] call Epoch_tradeMouseEvents"; + }; + class dyn_menu_left_bg: IGUIBack + { + idc = 55602; + x = -0.06; + y = 0; + w = 0.06; + h = 1.06; + colorBackground[] = {0.21,0.22,0.25,1}; + }; + class dyn_menu_right_bg: IGUIBack + { + idc = 55603; + x = 1; + y = 0; + w = 0.06; + h = 1.06; + colorBackground[] = {0.21,0.22,0.25,1}; + }; + class main_menu_left_LB: RscListbox + { + idc = 55604; + x = 0; + y = 0.06; + w = 0.5; + h = 0.62; + }; + class main_menu_left_CB: RscCombo + { + idc = 55605; + x = 0.28; + y = 0.008; + w = 0.2125; + h = 0.044; + }; + class main_menu_left_search: RscEdit + { + idc = 55606; + text = "Type here to Search ..."; //--- ToDo: Localize; + x = 0.0075; + y = 0.008; + w = 0.265; + h = 0.044; + }; + class main_menu_right_LB: RscListbox + { + idc = 55607; + x = 0.5; + y = 0.06; + w = 0.5; + h = 0.62; + }; + class main_menu_right_CB: RscCombo + { + idc = 55608; + x = 0.78; + y = 0.008; + w = 0.2125; + h = 0.044; + }; + class main_menu_right_search: RscEdit + { + idc = 55609; + text = "Type here to Search ..."; //--- ToDo: Localize; + x = 0.51; + y = 0.008; + w = 0.265; + h = 0.044; + }; + class main_menu_activeButton_TRADE: rmx_rscPicture + { + idc = 55503; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa"; + x = 0; + y = 1; + w = 0.5; + h = 0.06; + }; + class main_menu_activeButton_CANCEL: rmx_rscPicture + { + idc = 55504; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa"; + x = 0.5; + y = 1; + w = 0.5; + h = 0.06; + }; + class main_menu_activeButtonText_TRADE: RscText + { + idc = 55506; + style = 0x02; + font = "PolenticalNeon"; + sizeEx = 0.05; + text = "Trade"; //--- ToDo: Localize; + x = 0; + y = 1; + w = 0.5; + h = 0.06; + onLoad = "(_this select 0) ctrlEnable true"; + onMouseEnter = "(_this select 0) ctrlSetTextColor (call Epoch_getColorScheme);"; + onMouseExit = "(_this select 0) ctrlSetTextColor [1,1,1,1];" + onMouseButtonUp = "['btn','trade'] call Epoch_tradeMouseEvents"; + }; + class main_menu_activeButtonText_CANCEL: RscText + { + idc = 55507; + style = 0x02; + font = "PolenticalNeon"; + sizeEx = 0.05; + text = "Close"; //--- ToDo: Localize; + x = 0.5; + y = 1; + w = 0.5; + h = 0.06; + onLoad = "(_this select 0) ctrlEnable true"; + onMouseEnter = "(_this select 0) ctrlSetTextColor (call Epoch_getColorScheme);"; + onMouseExit = "(_this select 0) ctrlSetTextColor [1,1,1,1];" + onMouseButtonUp = "['btn','close'] call Epoch_tradeMouseEvents"; + }; + class desc_icon: rmx_rscPicture + { + idc = 55610; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + x = 0.5; + y = 0.82; + w = 0.1375; + h = 0.18; + }; + class desc_item_descriptionShort: RscText + { + idc = 55611; + text = "Short description"; //--- ToDo: Localize; + x = 0.5; + y = 0.741158; + w = 0.5; + h = 0.036; + }; + class desc_title_bg: rmx_rscPicture + { + idc = 55508; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa"; + x = 0; + y = 0.68; + w = 1; + h = 0.06; + }; + class desc_transaction_log_LB: RscListbox + { + idc = 55612; + x = 0; + y = 0.74; + w = 0.5; + h = 0.26; + }; + class desc_rsctext_left: RscStructuredText + { + idc = 55613; + x = 0; + y = 0.68; + w = 0.5; + h = 0.06; + }; + class desc_rsctext_right: RscStructuredText + { + idc = 55614; + x = 0.5; + y = 0.68; + w = 0.5; + h = 0.06; + }; + class desc_rscText_itemPropertiesFromCfgPricing: RscStructuredText + { + idc = 55615; + style = ST_MULTI; + + x = 0.6375; + y = 0.776; + w = 0.3625; + h = 0.224; + }; + class hide_background: IGUIBack + { + idc = 55616; + x = 0.25; + y = 0.58; + w = 0.5; + h = 0.1; + colorBackground[] = {0.21,0.22,0.25,1}; + onLoad = "(_this select 0) ctrlShow false"; + }; + class hide_main_menu_rscProgress: RscProgress + { + idc = 55617; + x = 0.2625; + y = 0.6; + w = 0.25; + h = 0.062; + onLoad = "(_this select 0) ctrlShow false"; + }; + class hide_valuebox: RscEdit + { + idc = 55618; + + SizeEx = 0.03; + x = 0.5225; + y = 0.6; + w = 0.09; + h = 0.064; + onLoad = "(_this select 0)ctrlShow false"; + }; + class hide_btn_ok: RscButton + { + idc = 55619; + text = "OK"; //--- ToDo: Localize; + x = 0.6225; + y = 0.6; + w = 0.0525; + h = 0.064; + onLoad = "(_this select 0) ctrlShow false"; + }; + class hide_btn_X: RscButton + { + idc = 55620; + text = "X"; //--- ToDo: Localize; + x = 0.685; + y = 0.6; + w = 0.0525; + h = 0.064; + onLoad = "(_this select 0) ctrlShow false"; + }; + class trade_frame: RscFrame + { + idc = 55509; + x = 0; + y = 0; + w = 1; + h = 1; + }; + }; +}; +/* + class dyn_menu_left_buttonBG: rmx_rscPicture + { + idc = 1200; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa"; + x = -0.2; + y = 0; + w = 0.2; + h = 0.06; + }; + class dyn_menu_left_indicator: rmx_rscPicture + { + idc = 1205; + text = "#(argb,8,8,3)color(1,1,1,1)"; + x = -0.2; + y = 0; + w = 0.0075; + h = 0.06; + }; + class placeholder_left: rmx_rscPicture + { + idc = 1202; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + x = -0.05; + y = 0.012; + w = 0.0375; + h = 0.04; + }; + + class dyn_menu_right_buttonBG: rmx_rscPicture + { + idc = 1203; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa"; + x = 1; + y = 0; + w = 0.2; + h = 0.06; + }; + class dyn_menu_right_indicator: rmx_rscPicture + { + idc = 1206; + text = "#(argb,8,8,3)color(1,1,1,1)"; + x = 1.1925; + y = 0; + w = 0.0075; + h = 0.06; + }; + class placeholder_right: rmx_rscPicture + { + idc = 1204; + text = "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + x = 1.01; + y = 0.012; + w = 0.0375; + h = 0.04; + }; +*/ + +/* + class desc_frame: RscFrame + { + idc = 1805; + x = 0; + y = 0.68; + w = 1; + h = 0.32; + }; + + class main_menu_right_frame: RscFrame + { + idc = 1804; + x = 0.5; + y = 0.06; + w = 0.5; + h = 0.62; + }; + + class main_menu_left_frame: RscFrame + { + idc = 1803; + x = 0; + y = 0.06; + w = 0.5; + h = 0.62; + }; + + class dyn_menu_right_frame: RscFrame + { + idc = 1801; + x = 1; + y = 0; + w = 0.2; + h = 1.06; + }; + + class main_menu_top_frame: RscFrame + { + idc = 1802; + x = 0; + y = 0; + w = 1; + h = 0.06; + }; + + class dyn_menu_left_frame: RscFrame + { + idc = 1800; + x = -0.2; + y = 0; + w = 0.2; + h = 1.06; + }; +*/ \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeLoad.sqf b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeLoad.sqf new file mode 100644 index 00000000..ea3c043e --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeLoad.sqf @@ -0,0 +1,132 @@ +createDialog "rmx_traderUI"; +_dsp = findDisplay 55500; + +//_slider progressSetPosition 1; +rmx_var_traderCategories= ["All","Air1","Air2","Land1","Land2","Land3","Ship","Terminal"]; +_clrScheme = call Epoch_getColorScheme; + +rmx_var_tradeCtrls = []; + +for "_i" from 55600 to 55620 do { + rmx_var_tradeCtrls pushBack (_dsp displayCtrl _i); +}; + +{ + _idxL = (rmx_var_tradeCtrls select 5) lbAdd _x; + _idxR = (rmx_var_tradeCtrls select 8) lbAdd _x; + (rmx_var_tradeCtrls select 5) lbSetCurSel 0; + (rmx_var_tradeCtrls select 8) lbSetCurSel 0; +} count ["No Sorting", "Alphabet", "Price: Low", "Price: High"]; + + +_leftCategories = ["Gear", "Nearby", "Vehicle Gear", "Owned Vehicles"]; //make multidimensional with pics + +rmx_var_traderLeftMenuCTRLs = []; +_leftCtrlGroup = _dsp ctrlCreate ["rmx_rscControlsGroup", call epoch_getIDC]; +_leftCtrlGroup ctrlSetPosition [-0.2,0,0.2,1]; +_leftCtrlGroup ctrlCommit 0; + +for "_i" from 0 to (count _leftCategories)-1 do { + _LBG = _dsp ctrlCreate ["RscPicture", call epoch_getIDC,_leftCtrlGroup]; + _LIcon = _dsp ctrlCreate ["RscPicture", call epoch_getIDC,_leftCtrlGroup]; + _LText = _dsp ctrlCreate ["RscText", call epoch_getIDC,_leftCtrlGroup]; + rmx_var_traderLeftMenuCTRLs pushBack [_LBG, _LIcon, _LText]; + + _displayName = (_leftCategories select _i); + _LText ctrlEnable true; //create rsctext with EH in configs + _LText ctrlSetEventHandler ["mouseEnter", format ["(_this select 0) ctrlSetTextColor %1",_clrScheme]]; + _LText ctrlSetEventHandler ["mouseExit", format ["(_this select 0) ctrlSetTextColor %1",[1,1,1,1]]]; + _LText ctrlSetEventHandler ["MouseButtonUp", format ["['left', 'click', '%1'] call Epoch_tradeMouseEvents;",_displayName]]; + + _LBG ctrlSetText "x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa"; + _LIcon ctrlSetText "x\addons\rmx_sandbox\epoch\trader_menu_v2\trade_placeholder.paa"; + _LText ctrlSetText _displayName; + + _LBG ctrlSetPosition [0.14,_i * 0.06,0.06,0.06]; + _LBG ctrlCommit 0; + + _LText ctrlSetPosition [0.05,_i * 0.06,0.15,0.06]; + _LText ctrlSetFade 1; + _LText ctrlCommit 0; + + _LIcon ctrlSetPosition [0.15,_i * 0.06 + 0.012,0.0375,0.04]; + _LIcon ctrlCommit 0; +}; + + + +_mainCategories = "true" configClasses ("CfgPricing2" call EPOCH_returnConfig); + +rmx_var_RCatConfigs = []; +{ + rmx_var_RCatConfigs append ("true" configClasses _x); +} count _mainCategories; + +rmx_var_traderRightMenuCTRLs = []; +_rightCtrlGroup = _dsp ctrlCreate ["rmx_rscControlsGroup", call epoch_getIDC]; +_rightCtrlGroup ctrlSetPosition [1,0,0.2,1]; +_rightCtrlGroup ctrlCommit 0; + +_cnt = 0; +{ + if (configName _x in rmx_var_traderCategories) then { + _RBG = _dsp ctrlCreate ["RscPicture", call epoch_getIDC,_rightCtrlGroup]; + _RIcon = _dsp ctrlCreate ["RscPicture", call epoch_getIDC,_rightCtrlGroup]; + _RText = _dsp ctrlCreate ["RscText", call epoch_getIDC,_rightCtrlGroup]; + rmx_var_traderRightMenuCTRLs pushBack [_RBG, _RIcon, _RText]; + + _displayName = (getText (_x >> "displayName")); + _RText ctrlEnable true; + _RText ctrlSetEventHandler ["mouseEnter", format ["(_this select 0) ctrlSetTextColor %1",_clrScheme]]; + _RText ctrlSetEventHandler ["mouseExit", format ["(_this select 0) ctrlSetTextColor %1",[1,1,1,1]]]; + _RText ctrlSetEventHandler ["MouseButtonUp", format ["['right', 'click', '%1'] call Epoch_tradeMouseEvents;",_displayName]]; + + _RBG ctrlSetText "x\addons\rmx_sandbox\epoch\trader_menu_v2\tradebg.paa"; + _RIcon ctrlSetText (getText (_x >> "picture")); + _RText ctrlSetText _displayName; + + _RBG ctrlSetPosition [0,_cnt * 0.06,0.06,0.06]; + _RBG ctrlCommit 0; + + _RText ctrlSetPosition [0,_cnt * 0.06,0.15,0.06]; + _RText ctrlSetFade 1; + _RText ctrlCommit 0; + + _RIcon ctrlSetPosition [0.01,_cnt * 0.06 + 0.012,0.0375,0.04]; + _RIcon ctrlCommit 0; + + _cnt = _cnt + 1; + }; +} forEach rmx_var_RCatConfigs; + +rmx_var_traderGroupCTRLs = [_leftCtrlGroup, _rightCtrlGroup]; + +rmx_var_traderMenuActive = true; + +[] spawn epoch_tradeMainLoop; + +["right","All"] call epoch_tradePopulateLB; + +/* + 0 left trigger + 1 right trigger + 2 left BG + 3 right BG + 4 left LB + 5 left CB + 6 left search + 7 right LB + 8 right CB + 9 right search + 10 desc pic + 11 desc descShort + 12 transaction LB + 13 desc left ST + 14 desc right ST + 15 desc multiline ST + 16 hide BG + 17 hide progress + 18 hide edit + 19 hide btn ok + 20 hide btn X +*/ \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeMainLoop.sqf b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeMainLoop.sqf new file mode 100644 index 00000000..fcae17b4 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeMainLoop.sqf @@ -0,0 +1,19 @@ +_tempPos = true; + +while {rmx_var_traderMenuActive} do { + + _mpos = getMousePosition; + _onLeft = if ((_mpos select 0) < 0.5) then {true} else {false}; + + if !(_tempPos isEqualTo _onLeft) then { + _tempPos = _onLeft; + + if _onLeft then { + ['left','enter'] call Epoch_tradeMouseEvents; + ['right','exit'] call Epoch_tradeMouseEvents; + } else { + ['left','exit'] call Epoch_tradeMouseEvents; + ['right','enter'] call Epoch_tradeMouseEvents; + }; + }; +}; diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeMouseEvents.sqf b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeMouseEvents.sqf new file mode 100644 index 00000000..1c48e657 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeMouseEvents.sqf @@ -0,0 +1,119 @@ +params ["_trigger", "_event",["_category", "All"]]; +disableSerialization; + +switch _trigger do { + case "left": + { + _leftBG = rmx_var_tradeCtrls select 2; + switch _event do { + case "enter": + { + _leftBG ctrlSetPosition [-0.2,0,0.2,1.06]; + _leftBG ctrlCommit 0.1; + + { + _temp = ctrlPosition (_x select 0); + _temp set [0, 0]; + _temp set [2, 0.2]; + (_x select 0) ctrlSetPosition _temp; + (_x select 0) ctrlCommit 0.1; + + _temp = ctrlPosition (_x select 1); + _temp set [0, 0.01]; + (_x select 1) ctrlSetPosition _temp; + (_x select 1) ctrlCommit 0.1; + + (_x select 2) ctrlSetFade 0; + (_x select 2) ctrlCommit 0.3; + } forEach rmx_var_traderLeftMenuCTRLs; + + }; + case "exit": + { + _leftBG ctrlSetPosition [-0.06,0,0.06,1.06]; + _leftBG ctrlCommit 0.1; + + { + _temp = ctrlPosition (_x select 0); + _temp set [0, 0.14]; + _temp set [2, 0.06]; + (_x select 0) ctrlSetPosition _temp; + (_x select 0) ctrlCommit 0.1; + + _temp = ctrlPosition (_x select 1); + _temp set [0, 0.15]; + (_x select 1) ctrlSetPosition _temp; + (_x select 1) ctrlCommit 0.1; + + (_x select 2) ctrlSetFade 1; + (_x select 2) ctrlCommit 0; + } forEach rmx_var_traderLeftMenuCTRLs; + }; + case "click": + { + [_trigger,_category] call Epoch_tradePopulateLB; + }; + }; + }; + case "right": + { + _rightBG = rmx_var_tradeCtrls select 3; + switch _event do { + case "enter": + { + _rightBG ctrlSetPosition [1,0,0.2,1.06]; + _rightBG ctrlCommit 0.1; + + { + _temp = ctrlPosition (_x select 0); + _temp set [2, 0.2]; + (_x select 0) ctrlSetPosition _temp; + (_x select 0) ctrlCommit 0.1; + + _temp = ctrlPosition (_x select 1); + _temp set [0, 0.15]; + (_x select 1) ctrlSetPosition _temp; + (_x select 1) ctrlCommit 0.1; + + (_x select 2) ctrlSetFade 0; + (_x select 2) ctrlCommit 0.3; + } forEach rmx_var_traderRightMenuCTRLs; + + ctrlSetFocus (rmx_var_traderGroupCTRLs select 1); + }; + case "exit": + { + _rightBG ctrlSetPosition [1,0,0.06,1.06]; + _rightBG ctrlCommit 0.1; + + { + _temp = ctrlPosition (_x select 0); + _temp set [2, 0.06]; + (_x select 0) ctrlSetPosition _temp; + (_x select 0) ctrlCommit 0.1; + + _temp = ctrlPosition (_x select 1); + _temp set [0, 0.01]; + (_x select 1) ctrlSetPosition _temp; + (_x select 1) ctrlCommit 0.1; + + (_x select 2) ctrlSetFade 1; + (_x select 2) ctrlCommit 0; + } forEach rmx_var_traderRightMenuCTRLs; + }; + case "click": + { + [_trigger,_category] call Epoch_tradePopulateLB; + }; + }; + }; + case "btn": + { + switch _event do { + case "close": {systemChat "Close";}; + case "trade": {systemChat "Trade";}; + }; + }; +}; + +true diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradePopulateLB.sqf b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradePopulateLB.sqf new file mode 100644 index 00000000..3a1f99a7 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradePopulateLB.sqf @@ -0,0 +1,45 @@ +params ["_trigger", ["_category", "All"]]; + +switch _trigger do { + case "left": + { + + }; + case "right": + { + _cfg = []; + + if (_category isEqualTo "All") then { + { + if (configName _x in rmx_var_traderCategories) then { + _cfg pushBack _x; + }; + } forEach rmx_var_RCatConfigs; + + } else { + { + if (getText (_x >> "displayName") isEqualTo _category) exitWith {_cfg = [_x]}; + } forEach rmx_var_RCatConfigs; + }; + + _rLB = rmx_var_tradeCtrls select 7; + lbClear _rLB; + { + _items = "true" configClasses _x; + { + _itemData = [(configName _x),["displayName", "picture"]] call epoch_itemData; + if !(_itemData isEqualTo [""]) then { + _idx = _rLB lbAdd (_itemData select 0); + _rLB lbSetPicture [_idx,(_itemData select 1)]; + }; + } forEach _items; + + } forEach _cfg; + _rLB lbSetCurSel 0; + //call LB sorting from here (plus make EH and fnc itself) + }; + case "log": + { + + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeRefresh.sqf b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeRefresh.sqf new file mode 100644 index 00000000..e69de29b diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeUnLoad.sqf b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeUnLoad.sqf new file mode 100644 index 00000000..4be9532c --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/Epoch_tradeUnLoad.sqf @@ -0,0 +1,19 @@ +//unregister dynamic IDCs + +rmx_var_traderMenuActive = false; + +(rmx_var_traderGroupCTRLs select 0) call epoch_getIDC; +(rmx_var_traderGroupCTRLs select 1) call epoch_getIDC; + +{ + { + _x call epoch_getIDC; + } forEach _x; +}forEach rmx_var_traderLeftMenuCTRLs; + +{ + { + _x call epoch_getIDC; + } forEach _x; +}forEach rmx_var_traderRightMenuCTRLs; + diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/epoch_configs.hpp b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/epoch_configs.hpp new file mode 100644 index 00000000..8d8a8cdd --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/epoch_configs.hpp @@ -0,0 +1,559 @@ +class RscMapControl; +class Bush +{ + icon="\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; + color[]={0.44999999,0.63999999,0.33000001,0.40000001}; + size="14/2"; + importance="0.2 * 14 * 0.05 * 0.05"; + coefMin=0.25; + coefMax=4; +}; +class Rock +{ + icon="\A3\ui_f\data\map\mapcontrol\rock_ca.paa"; + color[]={0.1,0.1,0.1,0.80000001}; + size=12; + importance="0.5 * 12 * 0.05"; + coefMin=0.25; + coefMax=4; +}; +class SmallTree +{ + icon="\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; + color[]={0.44999999,0.63999999,0.33000001,0.40000001}; + size=12; + importance="0.6 * 12 * 0.05"; + coefMin=0.25; + coefMax=4; +}; +class Tree +{ + icon="\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; + color[]={0.44999999,0.63999999,0.33000001,0.40000001}; + size=12; + importance="0.9 * 16 * 0.05"; + coefMin=0.25; + coefMax=4; +}; +class busstop +{ + icon="\A3\ui_f\data\map\mapcontrol\busstop_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class fuelstation +{ + icon="\A3\ui_f\data\map\mapcontrol\fuelstation_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class hospital +{ + icon="\A3\ui_f\data\map\mapcontrol\hospital_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class church +{ + icon="\A3\ui_f\data\map\mapcontrol\church_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class lighthouse +{ + icon="\A3\ui_f\data\map\mapcontrol\lighthouse_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class power +{ + icon="\A3\ui_f\data\map\mapcontrol\power_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class powersolar +{ + icon="\A3\ui_f\data\map\mapcontrol\powersolar_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class powerwave +{ + icon="\A3\ui_f\data\map\mapcontrol\powerwave_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class powerwind +{ + icon="\A3\ui_f\data\map\mapcontrol\powerwind_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class quay +{ + icon="\A3\ui_f\data\map\mapcontrol\quay_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class transmitter +{ + icon="\A3\ui_f\data\map\mapcontrol\transmitter_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class watertower +{ + icon="\A3\ui_f\data\map\mapcontrol\watertower_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; +}; +class Cross +{ + icon="\A3\ui_f\data\map\mapcontrol\Cross_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={0,0,0,1}; +}; +class Chapel +{ + icon="\A3\ui_f\data\map\mapcontrol\Chapel_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={0,0,0,1}; +}; +class Shipwreck +{ + icon="\A3\ui_f\data\map\mapcontrol\Shipwreck_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={0,0,0,1}; +}; +class Bunker +{ + icon="\A3\ui_f\data\map\mapcontrol\bunker_ca.paa"; + size=14; + importance="1.5 * 14 * 0.05"; + coefMin=0.25; + coefMax=4; + color[]={0,0,0,1}; +}; +class Fortress +{ + icon="\A3\ui_f\data\map\mapcontrol\bunker_ca.paa"; + size=16; + importance="2 * 16 * 0.05"; + coefMin=0.25; + coefMax=4; + color[]={0,0,0,1}; +}; +class Fountain +{ + icon="\A3\ui_f\data\map\mapcontrol\fountain_ca.paa"; + size=11; + importance="1 * 12 * 0.05"; + coefMin=0.25; + coefMax=4; + color[]={0,0,0,1}; +}; +class Ruin +{ + icon="\A3\ui_f\data\map\mapcontrol\ruin_ca.paa"; + size=16; + importance="1.2 * 16 * 0.05"; + coefMin=1; + coefMax=4; + color[]={0,0,0,1}; +}; +class Stack +{ + icon="\A3\ui_f\data\map\mapcontrol\stack_ca.paa"; + size=20; + importance="2 * 16 * 0.05"; + coefMin=0.89999998; + coefMax=4; + color[]={0,0,0,1}; +}; +class Tourism +{ + icon="\A3\ui_f\data\map\mapcontrol\tourism_ca.paa"; + size=16; + importance="1 * 16 * 0.05"; + coefMin=0.69999999; + coefMax=4; + color[]={0,0,0,1}; +}; +class ViewTower +{ + icon="\A3\ui_f\data\map\mapcontrol\viewtower_ca.paa"; + size=16; + importance="2.5 * 16 * 0.05"; + coefMin=0.5; + coefMax=4; + color[]={0,0,0,1}; +}; +class rmx_emailMap: RscMapControl +{ + IDC=6969691; + ShowCountourInterval=0; + //important for center + x = 0; + y = 0; + w = 1; + h = 1; + moveOnEdges=1; + maxSatelliteAlpha=0; + alphaFadeStartScale=10; + alphaFadeEndScale=10; + ptsPerSquareTxt=500; + ptsPerSquareFor=15; + ptsPerSquareForEdge=15; + ptsPerSquareRoad=6; + ptsPerSquareObj=15; + colorBackground[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.5 + }; + colorSea[]={0,0,0,0.40000001}; + colorForest[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.69999999 + }; + colorForestBorder[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.5 + }; + colorRocks[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.1 + }; + colorRocksBorder[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.5 + }; + colorLevels[]={0,0,0,0}; + colorMainCountlines[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.60000002 + }; + colorCountlines[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.2 + }; + colorMainCountlinesWater[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.69999999 + }; + colorCountlinesWater[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.40000001 + }; + colorPowerLines[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.5 + }; + colorRailWay[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + colorTracks[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.15000001 + }; + colorTracksFill[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.30000001 + }; + colorRoads[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + colorRoadsFill[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.5 + }; + colorMainRoads[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + colorMainRoadsFill[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.69999999 + }; + colorGrid[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.30000001 + }; + colorGridMap[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 0.2 + }; + class bush: Bush + { + color[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.40000001 + }; + }; + class rock: Rock + { + color[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.80000001 + }; + }; + class smalltree: SmallTree + { + color[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.40000001 + }; + }; + class tree: Tree + { + color[]= + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + 0.40000001 + }; + }; + class busstop: busstop + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class fuelstation: fuelstation + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class hospital: hospital + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class church: church + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class lighthouse: lighthouse + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class power: power + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class powersolar: powersolar + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class powerwave: powerwave + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class powerwind: powerwind + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class quay: quay + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class shipwreck: Shipwreck + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class transmitter: transmitter + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; + class watertower: watertower + { + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + 1 + }; + }; +}; \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/trader_menu_v2/trade_placeholder.paa b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/trader_menu_v2/trade_placeholder.paa new file mode 100644 index 00000000..688dc71b Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/trader_menu_v2/trade_placeholder.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/trader_menu_v2/tradebg.paa b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/trader_menu_v2/tradebg.paa new file mode 100644 index 00000000..f522121b Binary files /dev/null and b/Tools/DevFrameWork/x/addons/rmx_sandbox/epoch/trader_menu_v2/tradebg.paa differ diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/sandbox.sqf b/Tools/DevFrameWork/x/addons/rmx_sandbox/sandbox.sqf new file mode 100644 index 00000000..db779a14 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/sandbox.sqf @@ -0,0 +1,198 @@ +#include <\x\Addons\rmx_init\defines.inc> +disableSerialization; + +call rmx_fnc_recompile; + +//New trader menu +/* +"Epoch_tradeMainLoop" call rmx_fnc_recompile; +"Epoch_tradeLoad" call rmx_fnc_recompile; +"Epoch_tradeUnLoad" call rmx_fnc_recompile; +"Epoch_tradeMouseEvents" call rmx_fnc_recompile; +"Epoch_tradeMouseEvents" call rmx_fnc_recompile; +"Epoch_tradePopulateLB" call rmx_fnc_recompile; +call Epoch_tradeLoad; +*/ + +// dunno what's this for +/* +for "_i" from 1 to 7 do { + _c = ["botcenter",_i] call epoch_getHUDCtrl; + _c ctrlSetText "\x\addons\a3_epoch_code\Data\owner.paa"; +}; + +_c1 = ["botcenter",1] call epoch_getHUDCtrl; +*/ + + +/* +//"epoch_dynamicHUD_adjust" call rmx_fnc_recompile; +findDisplay 46 createDisplay "dUI_sandbox"; + +_dsp = findDisplay 666666; + +_c = _dsp ctrlCreate ["rmx_emailMap", call epoch_getIDC]; + +_c ctrlSetPosition [0,0,1,1]; +_c ctrlSetFade 0.1; +_c ctrlCommit 0; + +_c ctrlMapAnimAdd [0, 1, getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition")]; +ctrlMapAnimCommit _c; +_c ctrlMapAnimAdd [2, 0.1, getPosATL player]; +ctrlMapAnimCommit _c; +*/ +/* +disableSerialization; +findDisplay 46 createDisplay "dUI_sandbox"; +_dsp = findDisplay 666666; + +_c = _dsp ctrlCreate ["rmx_drag_RscActivePicture", 909090]; +_c1 = _dsp ctrlCreate ["rmx_drag_RscActivePicture", 909091]; + +_c ctrlSetPosition [0,0,0.25,0.25]; +_c1 ctrlSetPosition [1,0,0.25,0.25]; +_c ctrlCommit 0; +_c1 ctrlCommit 0; + +_c ctrlSetText "x\addons\rmx_init\data\retardedPinUp.paa"; +_c ctrlSetTextColor [1,0.5,0,0.2]; + +_c1 ctrlSetText "x\addons\rmx_init\data\retardedPinUp.paa"; +_c1 ctrlSetTextColor [1,1,0,1]; +*/ +/* +for "_i" from 0 to 360 step 2 do { + _c ctrlSetAngle [_i,0.5,0.5]; + hint str (ctrlAngle _c); + uiSleep 0.01; +}; +*/ + +/* +rmx_fnc_moveShit = { + _ctrl = param [0]; + _curr = ctrlPosition _Ctrl; + _mpos = getmousePosition; + + if (rmx_var_drag_MouseDown) then { + _ctrl ctrlSetPosition [(_mpos select 0) - (_curr select 2) / 2, (_mpos select 1) - (_curr select 3) / 2 ]; + _ctrl ctrlCommit 0; + }; +}; + +_c ctrlSetEventHandler ["mousemoving", "_this call rmx_fnc_moveShit;"]; +_c ctrlSetEventHandler ["MouseButtonDown", "rmx_var_MouseDown = true;"]; +_c ctrlSetEventHandler ["MouseButtonUp", "rmx_var_MouseDown = false;"]; +_c1 ctrlSetEventHandler ["mousemoving", "_this call rmx_fnc_moveShit;"]; +_c1 ctrlSetEventHandler ["MouseButtonDown", "rmx_var_MouseDown = true;"]; +_c1 ctrlSetEventHandler ["MouseButtonUp", "rmx_var_MouseDown = false;"]; +*/ + +//'rmx_fnc_epoch' call rmx_fnc_recompile; +/* +_a = "H"; +_b = "Hi"; +_c = "Hello World"; +_d = "Lorem ipsum dolor sit amet, diceret imperdiet consectetuer"; +_e = "Lorem ipsum dolor sit amet, diceret imperdiet consectetuer te sed, et qui civibus incorrupte, vis ei eirmod cetero. Vim sint evertitur ea, eum ea euismod commune singulis. Eos essent torquatos elaboraret ea, at per simul adversarium. Vis te homero intellegam. Usu ne tantas quaeque, wisi consectetuer has eu."; +_f = "xiiiiiiIiiiiiiiiiiiiiiiiiiiiiiiiix"; +_g = "xWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWx"; +_h = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +_i = "abcdefghijklmnopqrstuvwxyz"; +*/ + +/* +sleep 1; +disableSerialization; +createDialog "rmx_rscContainer"; +_dsp = findDisplay 99440; +_c = _dsp displayCtrl 99441; + +_c ctrlSetModelScale 0.2; +_c ctrlSetModelDirAndUp [[0,1,0],[0,0,1]]; +*/ +//launch again to refresh memory +/* +rmx_test = false; +uiSleep 1; +rmx_test = true; +_IDC = 28901; +_getIDC = {_IDC = _IDC + 1; _IDC}; + +rmx_var_testControls = []; + +_stuff = nearestOBjects [player, ["K03"],100]; + +{ + _ctrl = (findDisplay 46) ctrlCreate ["RscPicture",call _getIDC]; + _ctrl ctrlSetText "\x\addons\a3_epoch_code\Data\owner.paa"; + _ctrl ctrlSetPosition [0,0,0.1,0.1]; + _ctrl ctrlCommit 0; + rmx_var_testControls set [_forEachIndex, [_x, _ctrl]]; +}forEach _stuff; + +while {rmx_test} do { + { + (_x select 1) ctrlSetPosition (worldToScreen getPos(_x select 0)); + (_x select 1) ctrlCommit 0; + }forEach rmx_var_testControls; + //uiSleep 0.5; +}; + +{ + ctrlDelete (_x select 1); +}forEach rmx_var_testControls; + +rmx_var_testControls = []; + +*/ +//for "_i" from 0 to 200 do {_veh = "K03" createVehicle position player}; + +/* +{ + if ((str _x find "barrelwater_f.p3d") != -1) exitWith {player setPosATL(getPosATL _x)}; +} forEach nearestObjects [position player,[],3000]; + +*/ + +/******** POST PROCESSING +[] spawn { + _priority = 10; + _fullBlur = [1]; + _noBlur = [0]; + _animSpeed = 2; + + _handle = ["dynamicBlur",_priority] call epoch_postProcessCreate; //create effect + [_handle, _animSpeed, _fullBlur] call epoch_postprocessAdjust; //adds blur for 2 sec till max + uiSleep _animSpeed; + [_handle, _animSpeed, _noBlur] call epoch_postprocessAdjust; //removes blurr for 2 sec till min + uiSleep _animSpeed; + _handle call epoch_postprocessDestroy; //remove effect +}; +**************************/ + +//("") critical; + +/******** 3D ctrl +disableSerialization; +_display = (findDisplay 46) createDisplay "rmx_rscObject"; +_display displaySetEventHandler ["unload","rmx_var_3dCtrlSpin = false;"]; +_ctrl = _display displayCtrl 77771; +_ctrl2 = _display ctrlCreate ["rmx_rscPicture",77772]; +_ctrl2 ctrlSetText "#(rgb,8,8,3)color(1,1,1,0.1)"; +_ctrl2 ctrlSetPosition [0,0,1,1]; +_ctrl2 ctrlCommit 0; +_ctrl2 ctrlEnable true; +_ctrl2 ctrlSetEventHandler ["MouseMoving", "[_this,(findDisplay 77770) displayCtrl 77771] call Epoch_3DctrlYaw;"]; +_ctrl2 ctrlSetEventHandler ["MouseEnter", "rmx_var_3dCtrlSpin = false;"]; +_ctrl2 ctrlSetEventHandler ["MouseExit", "[(findDisplay 77770) displayCtrl 77771] call Epoch_3DctrlSpin;"]; + +_model1 = "\x\addons\a3_epoch_assets_1\models\chainsaw.p3d"; +_model2 = "\x\addons\a3_epoch_vehicles\jetski.p3d"; +_model3 = "\x\addons\a3_epoch_assets_3\cfgVehicles\Characters\female_ghillie.p3d"; + +_ctrl ctrlSetModel _model3; +_ctrl ctrlSetPosition [0.5, 1, 0.5]; +_ctrl ctrlSetModelScale 0.5; +**************************/ \ No newline at end of file diff --git a/Tools/DevFrameWork/x/addons/rmx_sandbox/variables.sqf b/Tools/DevFrameWork/x/addons/rmx_sandbox/variables.sqf new file mode 100644 index 00000000..6111ec76 --- /dev/null +++ b/Tools/DevFrameWork/x/addons/rmx_sandbox/variables.sqf @@ -0,0 +1,41 @@ +/* + Function Name: rmx_fnc_variables + Author: Raimonds Virtoss | Raymix + +*/ + +#include <\x\Addons\rmx_init\defines.inc> + +/*********************************** QUICK FUNCTION ***********************************/ +if (isNil "rmx_var_godMode") then {rmx_var_godMode = true;}; +/* + Add function or FSM to quicklaunch menu. If exists, params from dialog are attached in front + Careful with params if not function, will break ofc... + Usage: + [color, name, function] + + Server compile example (removed) ::> + //fnc grabs code block from specified function and sends it trough PV + //requires EH on server to combine and call compile elements ie - call compile (format ["%1 = %2",_this select 0, _this select 1]); + [[1,1,1,1],"Server recompile example","['rmx_fnc_remoteRecompile','rmx_fnc_remoteRecompileLocal'] call rmx_fnc_recompileOnServer;"], +*/ +rmx_var_quickFnc_items = +[ + [[0.76,0.99,0.4,1],"exec sandbox.sqf ( CTRL + Backspace)","'rmx_fnc_sandbox' call rmx_fnc_recompile; [] spawn rmx_fnc_sandbox;"], + [[0,1,0,1],"Output params","call rmx_fnc_output;"], + [[1,0,0,1],format ["allowDamage: [%1]",rmx_var_godMode],"rmx_var_godMode = if (rmx_var_godMode) then {false} else {true}; player allowDamage rmx_var_godMode; call rmx_fnc_variables"], + + [[0,0,0,0],"-----------","Separator"], + [[1,0.5,0,1],"Recompile dev variables","'rmx_fnc_variables' call rmx_fnc_recompile; call rmx_fnc_variables"], + [[1,0.5,0,1],"Recompile ALL functions","call rmx_fnc_recompile;"], //can be used with params, but use generated list + [[0,1,1,1],"*** Generated recompile list ***","don't run this line"] //leave this one, easier on github merge because no comma +]; + +// generates list of functions with recompile tag +{ + rmx_var_quickFnc_items pushBack [[1,1,1,0.4],format ["%1",_x],format ["'%1' call rmx_fnc_recompile;",_x]]; +} forEach (call (uiNamespace getvariable ["rmx_functions_listRecompile",{[]}])); + +/***************************************************************************************/ + +true diff --git a/Tools/Install/InstallEpochExperimentalClient.cmd b/Tools/Install/InstallEpochExperimentalClient.cmd new file mode 100644 index 00000000..073fd9dd --- /dev/null +++ b/Tools/Install/InstallEpochExperimentalClient.cmd @@ -0,0 +1,16 @@ +@ECHO OFF +SET STEAMUN=admin@youremail.net +SET STEAMPW=changeme +SET ARMASVRPATH=C:\Arma3Server +SET ARMAAPPID=107410 +SET MODFOLDER=@Epoch +:: Workshop IDs: EpochExperimental = 455221958 Normal Epoch = 421839251 +SET ARMAWORKSHOPID=455221958 +:: remove old folder +rd /s/q "%ARMASVRPATH%\%MODFOLDER%" +:: update workshop mod +START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% validate +quit +:: copy files back to server +xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%" +del "%ARMASVRPATH%\Keys\epoch*.bikey" +xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys" diff --git a/Tools/Install/InstallEpochExperimentalServer.cmd b/Tools/Install/InstallEpochExperimentalServer.cmd new file mode 100644 index 00000000..36785ab9 --- /dev/null +++ b/Tools/Install/InstallEpochExperimentalServer.cmd @@ -0,0 +1,14 @@ +@ECHO OFF +SET STEAMUN=admin@youremail.net +SET STEAMPW=changeme +SET ARMASVRPATH=C:\Arma3Server +SET ARMAAPPID=107410 +SET ARMAWORKSHOPID=558243173 +:: update workshop mod +START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% validate +quit +:: copy files back to server +xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\@EpochHive" +:: copy battleye files to live +xcopy /s/e/y/q/i "%ARMASVRPATH%\@EpochHive\sc\BattlEye" "%ARMASVRPATH%\SC\BattlEye" +:: update mission files +xcopy /s/e/y/q/i "%ARMASVRPATH%\@EpochHive\MPMissions" "%ARMASVRPATH%\MPMissions" diff --git a/Tools/SQF/arraytoLootConfig.sqf b/Tools/SQF/arraytoLootConfig.sqf new file mode 100644 index 00000000..edb32f51 --- /dev/null +++ b/Tools/SQF/arraytoLootConfig.sqf @@ -0,0 +1,94 @@ +// convert array if items to loot config format + +_items = ["U_JeansPatched1_uniform", +"U_JeansPatched2_uniform", +"U_JeansPatched3_uniform", +"U_JeansPatched4_uniform", +"U_JeansPatched5_uniform", +"U_JeansPatched6_uniform", +"U_JeansPatched7_uniform", +"U_JeansPatched8_uniform", +"U_JeansPatched9_uniform", +"U_JeansPatched10_uniform", +"U_JeansPatched11_uniform", +"U_JeansPatched12_uniform", +"U_JeansPatched13_uniform", +"U_JeansPatched14_uniform", +"U_JeansPatched15_uniform", +"U_JeansPatched16_uniform", +"U_JeansPatched17_uniform", +"U_JeansPatched18_uniform", +"U_JeansPatched19_uniform", +"U_JeansPatched20_uniform", +"U_JeansPatched21_uniform", +"U_JeansBlkBrn1_uniform", +"U_JeansBlkBrn2_uniform", +"U_JeansBlkBrn3_uniform", +"U_JeansBlkBrn4_uniform", +"U_JeansBlkBrn5_uniform", +"U_JeansBlkBrn6_uniform", +"U_JeansBlkBrn7_uniform", +"U_JeansBlkBrn8_uniform", +"U_JeansBlkBrn9_uniform", +"U_JeansBlkBrn10_uniform", +"U_JeansBlkBrn11_uniform", +"U_JeansBlkBrn12_uniform", +"U_JeansBlkBrn13_uniform", +"U_JeansBlkBrn14_uniform", +"U_JeansBlkBrn15_uniform", +"U_JeansBlkBrn16_uniform", +"U_JeansBlkBrn17_uniform", +"U_JeansBlkBrn18_uniform", +"U_JeansBlkBrn19_uniform", +"U_JeansBlkBrn20_uniform", +"U_JeansBlkBrn21_uniform", +"U_JeansArBrn1_uniform", +"U_JeansArBrn2_uniform", +"U_JeansArBrn3_uniform", +"U_JeansArBrn4_uniform", +"U_JeansArBrn5_uniform", +"U_JeansArBrn6_uniform", +"U_JeansArBrn7_uniform", +"U_JeansArBrn8_uniform", +"U_JeansArBrn9_uniform", +"U_JeansArBrn10_uniform", +"U_JeansArBrn11_uniform", +"U_JeansArBrn12_uniform", +"U_JeansArBrn13_uniform", +"U_JeansArBrn14_uniform", +"U_JeansArBrn15_uniform", +"U_JeansArBrn16_uniform", +"U_JeansArBrn17_uniform", +"U_JeansArBrn18_uniform", +"U_JeansArBrn19_uniform", +"U_JeansArBrn20_uniform", +"U_JeansArBrn21_uniform", +"U_JeansBlack1_uniform", +"U_JeansBlack2_uniform", +"U_JeansBlack3_uniform", +"U_JeansBlack4_uniform", +"U_JeansBlack5_uniform", +"U_JeansBlack6_uniform", +"U_JeansBlack7_uniform", +"U_JeansBlack8_uniform", +"U_JeansBlack9_uniform", +"U_JeansBlack10_uniform", +"U_JeansBlack11_uniform", +"U_JeansBlack12_uniform", +"U_JeansBlack13_uniform", +"U_JeansBlack14_uniform", +"U_JeansBlack15_uniform", +"U_JeansBlack16_uniform", +"U_JeansBlack17_uniform", +"U_JeansBlack18_uniform", +"U_JeansBlack19_uniform", +"U_JeansBlack20_uniform", +"U_JeansBlack21_uniform"]; + +_configStr = ""; +{ + _configStr = _configStr + format[' +{ { "%1", "item" }, 1 },',_x]; +} forEach _items; + +copyToClipboard _configStr; diff --git a/Tools/SQF/getCfgPatches.sqf b/Tools/SQF/getCfgPatches.sqf index 359d09a6..efca71f5 100644 --- a/Tools/SQF/getCfgPatches.sqf +++ b/Tools/SQF/getCfgPatches.sqf @@ -1,6 +1,6 @@ _knownCfgPatches = ["A3Data","A3_BaseConfig_F","A3_Dubbing_Radio_F","A3_Functions_F","A3_Functions_F_EPA","A3_Functions_F_EPC","Map_VR","A3_Map_VR_Scenes","a3_epoch_community","A3_epoch_assets_1","epoch_objects","A3_epoch_assets_3","A3_epoch_vehicles","a3_epoch_weapons","A3_Data_F","A3_Data_F_Hook","A3_Data_F_ParticleEffects","A3_Data_F_Bootcamp","A3_Data_F_Kart_ParticleEffects","A3_Editor_F","A3_Functions_F_Bootcamp","A3_Functions_F_Curator","A3_Functions_F_Heli","A3_Language_F","A3_Language_F_Beta","A3_Language_F_Curator","A3_Language_F_EPA","A3_Language_F_EPB","A3_Language_F_EPC","A3_Language_F_Gamma","A3_Language_F_Heli","A3_Language_F_Kart","A3_LanguageMissions_F","A3_LanguageMissions_F_Beta","A3_LanguageMissions_F_Gamma","A3_LanguageMissions_F_Kart","A3_Misc_F","A3_Misc_F_Helpers","A3_Modules_F","A3_Modules_F_DynO","A3_Modules_F_Effects","A3_Modules_F_Events","A3_Modules_F_GroupModifiers","A3_Modules_F_HC","A3_Modules_F_Intel","A3_Modules_F_LiveFeed","A3_Modules_F_Marta","A3_Modules_F_Misc","A3_Modules_F_Multiplayer","A3_Modules_F_ObjectModifiers","A3_Modules_F_Sites","A3_Modules_F_Skirmish","A3_Modules_F_StrategicMap","A3_Modules_F_Supports","A3_Modules_F_UAV","A3_Modules_F_Beta","A3_Modules_F_Beta_FiringDrills","A3_Modules_F_EPB","A3_Modules_F_EPB_Misc","A3_Modules_F_Heli","A3_Modules_F_Heli_SpawnAi","A3_Music_F","A3_Music_F_Bootcamp","A3_Music_F_EPA","A3_Music_F_EPB","A3_Music_F_EPC","A3_Music_F_Heli","A3_Roads_F","A3_Rocks_F","A3_Sounds_F","A3_Sounds_F_Bootcamp","A3_Sounds_F_EPB","A3_Sounds_F_EPC","A3_Structures_F","A3_Structures_F_Bridges","A3_Structures_F_Civ","A3_Structures_F_Civ_Accessories","A3_Structures_F_Civ_Ancient","A3_Structures_F_Civ_BellTowers","A3_Structures_F_Civ_Calvaries","A3_Structures_F_Civ_Camping","A3_Structures_F_Civ_Chapels","A3_Structures_F_Civ_Constructions","A3_Structures_F_Civ_Dead","A3_Structures_F_Civ_Garbage","A3_Structures_F_Civ_Graffiti","A3_Structures_F_Civ_InfoBoards","A3_Structures_F_Civ_Kiosks","A3_Structures_F_Civ_Lamps","A3_Structures_F_Civ_Market","A3_Structures_F_Civ_Offices","A3_Structures_F_Civ_Pavements","A3_Structures_F_Civ_PlayGround","A3_Structures_F_Civ_SportsGrounds","A3_Structures_F_Civ_Statues","A3_Structures_F_Civ_Tourism","A3_Structures_F_Dominants","A3_Structures_F_Dominants_Amphitheater","A3_Structures_F_Dominants_Castle","A3_Structures_F_Dominants_Church","A3_Structures_F_Dominants_Hospital","A3_Structures_F_Dominants_Lighthouse","A3_Structures_F_Dominants_WIP","A3_Structures_F_Furniture","A3_Structures_F_Households","A3_Structures_F_Households_Addons","A3_Structures_F_Households_House_Big01","A3_Structures_F_Households_House_Big02","A3_Structures_F_Households_House_Shop01","A3_Structures_F_Households_House_Shop02","A3_Structures_F_Households_House_Small01","A3_Structures_F_Households_House_Small02","A3_Structures_F_Households_House_Small03","A3_Structures_F_Households_Slum","A3_Structures_F_Households_Stone_Big","A3_Structures_F_Households_Stone_Shed","A3_Structures_F_Households_Stone_Small","A3_Structures_F_Households_WIP","A3_Structures_F_Ind","A3_Structures_F_Ind_AirPort","A3_Structures_F_Ind_Cargo","A3_Structures_F_Ind_CarService","A3_Structures_F_Ind_ConcreteMixingPlant","A3_Structures_F_Ind_Crane","A3_Structures_F_Ind_DieselPowerPlant","A3_Structures_F_Ind_Factory","A3_Structures_F_Ind_FuelStation","A3_Structures_F_Ind_FuelStation_Small","A3_Structures_F_Ind_Pipes","A3_Structures_F_Ind_PowerLines","A3_Structures_F_Ind_ReservoirTank","A3_Structures_F_Ind_Shed","A3_Structures_F_Ind_SolarPowerPlant","A3_Structures_F_Ind_Tank","A3_Structures_F_Ind_Transmitter_Tower","A3_Structures_F_Ind_WavePowerPlant","A3_Structures_F_Ind_Windmill","A3_Structures_F_Ind_WindPowerPlant","A3_Structures_F_Items","A3_Structures_F_Items_Documents","A3_Structures_F_Items_Electronics","A3_Structures_F_Items_Cans","A3_Structures_F_Items_Gadgets","A3_Structures_F_Items_Luggage","A3_Structures_F_Items_Medical","A3_Structures_F_Items_Military","A3_Structures_F_Items_Stationery","A3_Structures_F_Items_Tools","A3_Structures_F_Items_Valuables","A3_Structures_F_Items_Vessels","A3_Structures_F_Mil","A3_Structures_F_Mil_BagBunker","A3_Structures_F_Mil_BagFence","A3_Structures_F_Mil_Barracks","A3_Structures_F_Mil_Bunker","A3_Structures_F_Mil_Cargo","A3_Structures_F_Mil_Flags","A3_Structures_F_Mil_Fortification","A3_Structures_F_Mil_Helipads","A3_Structures_F_Mil_Offices","A3_Structures_F_Mil_Radar","A3_Structures_F_Mil_Shelters","A3_Structures_F_Mil_TentHangar","A3_Structures_F_Naval","A3_Structures_F_Naval_Buoys","A3_Structures_F_Naval_Fishing","A3_Structures_F_Naval_Piers","A3_Structures_F_Naval_RowBoats","A3_Structures_F_Research","A3_Structures_F_System","A3_Structures_F_Training","A3_Structures_F_Training_InvisibleTarget","A3_Structures_F_Walls","A3_Structures_F_Bootcamp_Ind_Cargo","A3_Structures_F_Bootcamp_Items_Sport","A3_Structures_F_Bootcamp_System","A3_Structures_F_Bootcamp_Training","A3_Structures_F_Bootcamp_VR_Blocks","A3_Structures_F_Bootcamp_VR_CoverObjects","A3_Structures_F_Bootcamp_VR_Helpers","A3_Structures_F_EPA_Civ_Camping","A3_Structures_F_EPA_Civ_Constructions","A3_Structures_F_EPA_Items_Electronics","A3_Structures_F_EPA_Items_Food","A3_Structures_F_EPA_Items_Medical","A3_Structures_F_EPA_Items_Tools","A3_Structures_F_EPA_Items_Vessels","A3_Structures_F_EPA_Walls","A3_Structures_F_EPB_Civ_Accessories","A3_Structures_F_EPB_Civ_Camping","A3_Structures_F_EPB_Civ_Dead","A3_Structures_F_EPB_Civ_Garbage","A3_Structures_F_EPB_Civ_Graffiti","A3_Structures_F_EPB_Civ_PlayGround","A3_Structures_F_EPB_Furniture","A3_Structures_F_EPB_Items_Documents","A3_Structures_F_EPB_Items_Luggage","A3_Structures_F_EPB_Items_Military","A3_Structures_F_EPB_Items_Vessels","A3_Structures_F_EPB_Naval_Fishing","A3_Structures_F_EPC_Civ_Accessories","A3_Structures_F_EPC_Civ_Camping","A3_Structures_F_EPC_Civ_Garbage","A3_Structures_F_EPC_Civ_InfoBoards","A3_Structures_F_EPC_Civ_Kiosks","A3_Structures_F_EPC_Civ_PlayGround","A3_Structures_F_EPC_Civ_Tourism","A3_Structures_F_EPC_Dominants_GhostHotel","A3_Structures_F_EPC_Dominants_Stadium","A3_Structures_F_EPC_Furniture","A3_Structures_F_EPC_Items_Documents","A3_Structures_F_EPC_Items_Electronics","A3_Structures_F_EPC_Walls","A3_Structures_F_Heli_Civ_Accessories","A3_Structures_F_Heli_Civ_Constructions","A3_Structures_F_Heli_Civ_Garbage","A3_Structures_F_Heli_Civ_Market","A3_Structures_F_Heli_Furniture","A3_Structures_F_Heli_Ind_AirPort","A3_Structures_F_Heli_Ind_Cargo","A3_Structures_F_Heli_Ind_Machines","A3_Structures_F_Heli_Items_Airport","A3_Structures_F_Heli_Items_Luggage","A3_Structures_F_Heli_Items_Sport","A3_Structures_F_Heli_Items_Tools","A3_Structures_F_Heli_VR_Helpers","A3_Structures_F_Kart_Civ_SportsGrounds","A3_Structures_F_Kart_Mil_Flags","A3_UIFonts_F","a3_epoch_structures","A3_Animals_F","A3_Animals_F_AnimConfig","A3_Animals_F_Fishes","A3_Animals_F_Kestrel","A3_Animals_F_Rabbit","A3_Animals_F_Seagull","A3_Animals_F_Snakes","A3_Animals_F_Turtle","A3_Animals_F_Chicken","A3_Animals_F_Dog","A3_Animals_F_Goat","A3_Animals_F_Sheep","A3_Anims_F","A3_Anims_F_Config_Sdr","A3_Anims_F_EPA","A3_Anims_F_EPC","A3_Anims_F_Kart","A3_Language_F_Bootcamp","A3_Map_Data","A3_Map_Stratis","A3_Map_Stratis_Scenes","A3_Plants_F_Bush","A3_Signs_F","A3_Signs_F_AD","A3_Structures_F_Signs_Companies","A3_Structures_F_Bootcamp_Civ_Camping","A3_Structures_F_Bootcamp_Civ_SportsGrounds","A3_Structures_F_Bootcamp_Items_Electronics","A3_Structures_F_Bootcamp_Items_Food","A3_Structures_F_Heli_Items_Electronics","A3_Structures_F_Heli_Items_Food","A3_Structures_F_Kart_Signs_Companies","A3_UI_F","A3_UI_F_Curator","A3_UI_F_Kart","A3_Weapons_F","A3_Weapons_F_NATO","A3_Weapons_F_CSAT","A3_Weapons_F_AAF","A3_weapons_F_FIA","A3_Weapons_F_ItemHolders","A3_Weapons_F_Headgear","A3_Weapons_F_Uniforms","A3_Weapons_F_Vests","A3_Weapons_F_Ammoboxes","A3_Weapons_F_DummyWeapons","A3_Weapons_F_Explosives","A3_Weapons_F_Items","A3_Weapons_F_Launchers_NLAW","A3_Weapons_F_Launchers_LAW","A3_Weapons_F_Launchers_Titan","A3_Weapons_F_EPA_LongRangeRifles_DMR_01","A3_Weapons_F_EBR","A3_Weapons_F_LongRangeRifles_GM6","A3_Weapons_F_LongRangeRifles_M320","A3_Weapons_F_Machineguns_M200","A3_Weapons_F_Machineguns_Zafir","A3_Weapons_F_Pistols_ACPC2","A3_Weapons_F_Pistols_P07","A3_Weapons_F_Pistols_Pistol_heavy_01","A3_Weapons_F_Pistols_Pistol_heavy_02","A3_Weapons_F_Pistols_Rook40","A3_Weapons_F_Rifles_Khaybar","A3_Weapons_F_Rifles_Mk20","A3_Weapons_F_Rifles_MX","A3_Weapons_F_EPB_Rifles_MX_Black","A3_Weapons_F_Rifles_SDAR","A3_Weapons_F_Rifles_TRG20","A3_Weapons_F_Pistols_PDW2000","A3_Weapons_F_Rifles_Vector","a3_weapons_f_rifles_SMG_02","A3_Weapons_F_beta","A3_Weapons_F_Beta_Ammoboxes","A3_Weapons_F_beta_EBR","A3_Weapons_F_EPA_LongRangeRifles_GM6","A3_Weapons_F_EPB_LongRangeRifles_M320","A3_Weapons_F_beta_Rifles_Khaybar","A3_Weapons_F_beta_Rifles_MX","A3_Weapons_F_beta_Rifles_TRG20","A3_Weapons_F_Bootcamp_LongRangeRifles_GM6","A3_Weapons_F_Bootcamp_LongRangeRifles_M320","A3_Weapons_F_EPB_LongRangeRifles_GM3","A3_Weapons_F_gamma","A3_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_EPA_EBR","A3_Weapons_F_EPA_Rifles_MX","A3_Weapons_F_Kart_Pistols_Pistol_Signal_F","a2_epoch_weapons","A3_epoch_assets","A3_Anims_F_Heli","A3_Characters_F","A3_Characters_F_BLUFOR","A3_Characters_F_Civil","A3_Characters_F_Heads","A3_Characters_F_OPFOR","A3_Characters_F_Proxies","A3_Characters_F_Beta","A3_Characters_F_INDEP","A3_Characters_F_Bootcamp","A3_Characters_F_EPB_Heads","A3_Characters_F_Gamma","A3_Data_F_Curator","A3_Data_F_Curator_Eagle","A3_Data_F_Curator_Intel","A3_Data_F_Curator_Misc","A3_Data_F_Curator_Respawn","A3_Data_F_Kart","A3_UAV_F_Characters_F_Gamma","A3_UAV_F_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_gamma_Items","A3_Map_Altis","A3_Map_Altis_Scenes","A3_Missions_F","A3_Missions_F_Beta","A3_Missions_F_Gamma","A3_Missions_F_Kart","A3_Modules_F_Bootcamp","A3_Modules_F_Curator","A3_Modules_F_Curator_Animals","A3_Modules_F_Curator_CAS","A3_Modules_F_Curator_Curator","A3_Modules_F_Curator_Effects","A3_Modules_F_Curator_Environment","A3_Modules_F_Curator_Flares","A3_Modules_F_Curator_Intel","A3_Modules_F_Curator_Lightning","A3_Modules_F_Curator_Mines","A3_Modules_F_Curator_Misc","A3_Modules_F_Curator_Multiplayer","A3_Modules_F_Curator_Objectives","A3_Modules_F_Curator_Ordnance","A3_Modules_F_Curator_Respawn","A3_Modules_F_Curator_Smokeshells","A3_Modules_F_Kart","A3_Modules_F_Kart_TimeTrials","A3_Static_F","A3_Static_F_Mortar_01","A3_Static_F_Beta_Mortar_01","A3_Static_F_Gamma","A3_Static_F_Gamma_Mortar_01","A3_Supplies_F_Heli","A3_Supplies_F_Heli_Bladders","A3_Supplies_F_Heli_CargoNets","A3_Supplies_F_Heli_Fuel","A3_Supplies_F_Heli_Slingload","A3_UI_F_Bootcamp","A3_UI_F_Heli","A3_Weapons_F_Acc","A3_Weapons_F_Beta_Acc","A3_Weapons_F_Bootcamp_Ammoboxes","A3_Weapons_F_EPA","A3_Weapons_F_EPA_Acc","A3_Weapons_F_EPA_Ammoboxes","A3_Weapons_F_EPB","A3_Weapons_F_EPB_Acc","A3_Weapons_F_EPB_Ammoboxes","A3_Weapons_F_EPC","A3_Weapons_F_gamma_Acc","A3_Weapons_F_Kart","A3_Air_F","A3_Air_F_Heli_Light_01","A3_Air_F_Heli_Light_02","A3_Air_F_Beta","A3_Air_F_Beta_Heli_Attack_01","A3_Air_F_Beta_Heli_Attack_02","A3_Air_F_Beta_Heli_Transport_01","A3_Air_F_Beta_Heli_Transport_02","A3_Air_F_Beta_Parachute_01","A3_Air_F_Beta_Parachute_02","A3_Air_F_EPB_Heli_Light_03","A3_Air_F_EPC_Plane_CAS_01","A3_Air_F_EPC_Plane_CAS_02","A3_Air_F_Gamma_Plane_Fighter_03","A3_Air_F_Heli","A3_Air_F_Heli_Heli_Attack_01","A3_Air_F_Heli_Heli_Attack_02","A3_Air_F_Heli_Heli_Light_01","A3_Air_F_Heli_Heli_Light_02","A3_Air_F_Heli_Heli_Light_03","A3_Air_F_Heli_Heli_Transport_01","A3_Air_F_Heli_Heli_Transport_02","A3_Air_F_Heli_Heli_Transport_03","A3_Air_F_Heli_Heli_Transport_04","A3_Air_F_RTD","A3_Armor_F","A3_armor_f_beta","A3_Armor_F_Panther","A3_armor_f_beta_APC_Tracked_02","A3_Armor_F_EPB_APC_tracked_03","A3_Armor_F_EPB_MBT_03","A3_Armor_F_Slammer","A3_Armor_F_T100K","A3_Boat_F","A3_Boat_F_Boat_Armed_01","A3_Boat_F_Boat_Transport_01","A3_Boat_F_Beta_Boat_Armed_01","A3_Boat_F_Beta_Boat_Transport_01","A3_Boat_F_SDV_01","A3_Boat_F_EPC_Submarine_01_F","A3_Boat_F_Civilian_Boat","A3_Boat_F_Trawler","A3_Boat_F_Gamma_Boat_Transport_01","A3_Boat_F_Heli_Boat_Armed_01","A3_Boat_F_Heli_SDV_01","A3_Characters_F_Common","A3_Characters_F_Bootcamp_Common","A3_Characters_F_EPA","A3_Characters_F_EPB","A3_Characters_F_EPC","A3_Characters_F_Kart","A3_Data_F_Curator_Characters","A3_Data_F_Curator_Virtual","A3_Data_F_Heli","A3_Air_F_Gamma_UAV_01","A3_Air_F_Gamma_UAV_02","A3_Missions_F_Bootcamp","A3_Missions_F_Curator","A3_Missions_F_EPA","A3_Missions_F_EPB","A3_Missions_F_EPC","A3_Missions_F_Heli","A3_Modules_F_Bootcamp_Misc","A3_Modules_F_Curator_Chemlights","A3_Soft_F","A3_Soft_F_MRAP_01","A3_Soft_F_MRAP_02","A3_Soft_F_Offroad_01","A3_Soft_F_Quadbike","A3_Soft_F_MRAP_03","A3_Soft_F_Beta_Quadbike","A3_Soft_F_HEMTT","A3_Soft_F_TruckHeavy","A3_Soft_F_EPC_Truck_03","A3_Soft_F_Car","A3_Soft_F_Gamma_Offroad","A3_Soft_F_Gamma_Quadbike","A3_Soft_F_SUV","A3_Soft_F_Gamma_HEMTT","A3_Soft_F_Gamma_TruckHeavy","A3_Soft_F_Truck","A3_Soft_F_Heli_Car","A3_Soft_F_Heli_MRAP_01","A3_Soft_F_Heli_MRAP_02","A3_Soft_F_Heli_MRAP_03","A3_Soft_F_Heli_Quadbike","A3_Soft_F_Heli_SUV","A3_Soft_F_Heli_Truck","A3_Soft_F_Kart_Kart_01","A3_Static_F_Gamma_AA","A3_Static_F_Gamma_AT","A3_Structures_F_Mil_Scrapyard","A3_Structures_F_Wrecks","A3_Structures_F_EPA_Mil_Scrapyard","A3_Weapons_F_Bootcamp","A3_epoch_language","A3_epoch_vehicles_1","A3_Air_F_EPC_Plane_Fighter_03","A3_Armor_F_AMV","A3_Armor_F_Marid","A3_Armor_F_EPC_MBT_01","A3_Armor_F_APC_Wheeled_03","A3_CargoPoses_F","A3_CargoPoses_F_Heli","A3_Soft_F_Crusher_UGV","A3_Soft_F_Bootcamp_Offroad_01","A3_Soft_F_Bootcamp_Quadbike","A3_Soft_F_Bootcamp_Truck","A3_Soft_F_Heli_Crusher_UGV","A3_epoch_config","A3_epoch_code"]; _unknownCfgPatches = []; -"if !((configName _x) in _knownCfgPatches) then {_unknownCfgPatches pushBack (configName _x)}" configClasses (configFile >> "CfgPatches"); +"if !((configName _x) in _knownCfgPatches) then {_unknownCfgPatches pushBack (configName _x)}; true" configClasses (configFile >> "CfgPatches"); copyToClipboard str _unknownCfgPatches; diff --git a/Tools/SQF/getMaleUniforms.sqf b/Tools/SQF/getMaleUniforms.sqf new file mode 100644 index 00000000..d983bfba --- /dev/null +++ b/Tools/SQF/getMaleUniforms.sqf @@ -0,0 +1,80 @@ +// makes loot and price configs for missing compatible items. + +// get all model classes +EP = (configProperties [configFile >> "CfgVehicles", "isClass _x" , true]); + +// list existing uniforms +_existing = ["U_O_CombatUniform_ocamo", +"U_O_GhillieSuit", +"U_O_PilotCoveralls", +"U_O_Wetsuit", +"U_C_Poor_1", +"U_C_WorkerCoveralls", +"U_C_Journalist", +"U_C_Scientist", +"U_OrestesBody", +"U_O_FullGhillie_lsh", +"U_O_FullGhillie_sard", +"U_O_FullGhillie_ard", +"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_OG_Guerilla1_1", +"U_OG_Guerilla2_1", +"U_OG_Guerilla2_2", +"U_OG_Guerilla2_3", +"U_OG_Guerilla3_1", +"U_OG_Guerilla3_2", +"U_OG_leader", +"U_C_Driver_1", +"U_C_Driver_2", +"U_C_Driver_3", +"U_C_Driver_4", +"U_C_Driver_1_black", +"U_C_Driver_1_blue", +"U_C_Driver_1_green", +"U_C_Driver_1_red", +"U_C_Driver_1_white", +"U_C_Driver_1_yellow", +"U_C_Driver_1_orange", +"U_C_Driver_1_red"]; + +_compatibleUniformClasses = EP select {(3 in getArray(_x >> "modelSides")) && !(1 in getArray(_x >> "modelSides"))}; +_compatibleUniforms = []; +{ + _uniform = getText(_x >> "uniformClass"); + if !(_uniform in ["","-"]) then { + _compatibleUniforms pushBackUnique _uniform; + }; +} forEach _compatibleUniformClasses; + +_badUniforms = []; +{ + if !(_x in _compatibleUniforms) then { + _badUniforms pushBackUnique _x; + }; +} forEach _existing; +EP = _badUniforms; + +// remove +_finalUniforms = _compatibleUniforms - _existing; + +_configStr = ""; +{ + _configStr = _configStr + format[' +{ { "%1", "item" }, 1 },',_x]; +} forEach _finalUniforms; + + +{ + _configStr = _configStr + format[' +class %1 +{ + price = 7; +};',_x]; +} forEach _finalUniforms; + +copyToClipboard _configStr; diff --git a/Tools/SQF/memoryPointsToConfig.sqf b/Tools/SQF/memoryPointsToConfig.sqf new file mode 100644 index 00000000..82ccf6e4 --- /dev/null +++ b/Tools/SQF/memoryPointsToConfig.sqf @@ -0,0 +1,36 @@ +EPOCH_dbg_replaceBrackets = { + _return = []; + { + _string = _x; + if (_string == 93) then { + _string = 125; + }; + if (_string == 91) then { + _string = 123; + }; + _return pushBack _string; + } forEach toArray(format['%1',_this]); + _return = toString _return; + _return +}; + + +_memoryPoints = []; +_points = ["NF2","SF2","EF2","WF2","C","CB","CinN","CinE","CinS","CinW","N","E","S","W","NE","NW","SE","SW","NF","SF","EF","WF"]; +{ + _memoryPos = cursorObject selectionPosition [_x,"Memory"]; + if !(_memoryPos isEqualTo [0,0,0]) then { + _memoryPoints pushBack [_x,_memoryPos]; + }; +} forEach _points; + + +_configStr = "// snap points for " + typeOf cursorObject + " +"; +{ + _configStr = _configStr + format['%1[] = %2; +',_x select 0,(_x select 1) call EPOCH_dbg_replaceBrackets]; +} forEach _memoryPoints; + + +copyToClipboard _configStr; diff --git a/Tools/SQF/saveLootPositionsVector.sqf b/Tools/SQF/saveLootPositionsVector.sqf index fbdac529..0651cfdc 100644 --- a/Tools/SQF/saveLootPositionsVector.sqf +++ b/Tools/SQF/saveLootPositionsVector.sqf @@ -41,34 +41,7 @@ BIS_fnc_returnVector = { _v }; -_import = ["Land_TentHangar_V1_F", -"Land_TentHangar_V1_dam_F", -"Land_Dome_Big_F", -"Land_Dome_Small_F", -"Land_GH_MainBuilding_entry_F", -"Land_dp_smallTank_F", -"Land_i_House_Big_01_V1_dam_F", -"Land_i_House_Big_01_V2_dam_F", -"Land_i_House_Big_01_V3_dam_F", -"Land_u_House_Big_01_V1_dam_F", -"Land_i_House_Big_02_V2_dam_F", -"Land_i_Shop_01_V1_dam_F", -"Land_i_Shop_01_V2_dam_F", -"Land_i_Shop_01_V3_dam_F", -"Land_u_Shop_01_V1_dam_F", -"Land_i_Shop_02_V1_dam_F", -"Land_i_Shop_02_V2_dam_F", -"Land_i_Shop_02_V3_dam_F", -"Land_u_Shop_02_V1_dam_F", -"Land_i_House_Small_01_V1_dam_F", -"Land_i_House_Small_01_V2_dam_F", -"Land_i_House_Small_01_V3_dam_F", -"Land_u_House_Small_01_V1_dam_F", -"Land_i_House_Small_02_V1_dam_F", -"Land_i_House_Small_02_V2_dam_F", -"Land_i_House_Small_02_V3_dam_F", -"Land_u_House_Small_02_V1_dam_F", -"Land_i_House_Small_03_V1_dam_F"]; +_import = ["Land_New_WiredFence_10m_F","Land_New_WiredFence_5m_F","Land_New_WiredFence_10m_Dam_F","Land_LampHalogen_F","Land_LampStreet_F","Land_spp_Transformer_F","Land_Stone_Gate_F","Land_Pier_F","Land_Pier_addon","Land_PierLadder_F","Land_nav_pier_m_F","Land_Barn_01_grey_F","Land_LampShabby_F","Land_LampHarbour_F","Land_PowerLine_01_pole_small_F","Land_PowerLine_01_wire_50m_F","Land_PowerLine_01_wire_50m_main_F","Land_Metal_Shed_F","Land_PowerLine_01_pole_transformer_F","Land_Shed_08_brown_F","Land_Pier_small_F","Land_WallCity_01_gate_yellow_F","Land_Stone_Shed_V1_ruins_F","Land_Barn_01_brown_F","Land_Shed_08_grey_F","Land_Net_Fence_Gate_F","Land_Grave_rocks_F","Land_LampStreet_small_F","Land_TBox_F","Land_BellTower_02_V1_F","Land_City_Gate_F","Land_WallCity_01_gate_pink_F","Land_Supermarket_01_malden_F","Land_WallCity_01_gate_blue_F","Land_PowerLine_01_pole_junction_F","Land_PowerLine_01_pole_tall_F","Land_fs_roof_F","Land_fs_feed_F","Land_BellTower_01_V1_F","Land_BellTower_02_V2_F","Land_Pier_Box_F","Land_GH_Stairs_F","Land_WallCity_01_gate_grey_F","Land_WoodenWall_02_s_gate_closed_F","Land_Bunker_01_big_F","Land_Lighthouse_03_green_F","Land_Bunker_01_small_F","Land_i_Garage_V1_dam_F","Land_WallCity_01_gate_whiteblue_F","Land_Stone_HouseBig_V1_ruins_F","Land_Stone_HouseSmall_V1_ruins_F","Land_Bunker_01_HQ_F","Land_ConcreteWall_01_l_gate_closed_F","Land_Lighthouse_03_red_F","Land_Carousel_01_F","Land_Canal_Wall_Stairs_F","Land_Bunker_01_tall_F","Land_ReservoirTank_01_military_F","Land_DomeDebris_01_hex_damaged_green_F","Land_DomeDebris_01_hex_green_F","Land_Cargo_House_V3_derelict_F","Land_DomeDebris_01_struts_large_green_F","Land_spp_Mirror_Broken_F","Land_spp_Mirror_ruins_F","Land_Cargo_Patrol_V2_ruins_F","Land_DomeDebris_01_struts_small_green_F","Land_TTowerSmall_1_F","Land_PipeFence_01_m_gate_v1_closed_F","Land_TTowerSmall_2_F","Land_PipeFence_01_m_gate_v2_closed_F","Land_FuelStation_01_roof_malevil_F","Land_FuelStation_01_pump_malevil_F","Land_cmp_Shed_F","Land_NetFence_02_m_gate_v1_closed_F","Land_ReservoirTank_V1_F","Land_HelipadCircle_F","Land_IndPipe2_big_ground2_F","Land_IndPipe2_big_ground1_F","Land_IndPipe2_big_18ladder_F","Land_IndPipe2_bigL_L_F","Land_Grave_forest_F","Land_NavigLight","Land_Runway_PAPI_3","Land_Runway_PAPI_2","Land_Runway_PAPI","Land_Runway_PAPI_4","Land_NavigLight_3_F","Land_Flush_Light_red_F","Land_Flush_Light_green_F","Land_runway_edgelight","Land_Flush_Light_yellow_F","Land_runway_edgelight_blue_F","Land_HelipadCivil_F","Land_LampAirport_F","Land_HelipadSquare_F","Land_HelipadRescue_F","Land_IndPipe2_bigL_R_F","Land_ReservoirTank_Airport_F","Land_Communication_F","Land_FuelStation_Feed_F","Land_Unfinished_Building_01_noLadder_F"]; EPB = []; { @@ -99,7 +72,9 @@ ToolRack_EPOCH = [[[0,0,1.5],[0,0,-0.1]],[[0,0,1.5],[0,0,2.3]],[[0,0,1.5],[1,0,1 Shoebox_EPOCH = [[[0,0,0.1],[0,0,-0.1]],[[0,0,0.1],[0,0,0.3]],[[0,0,0.1],[0.3,0,0.1]],[[0,0,0.1],[-0.3,0,0.1]],[[0,0,0.1],[0,0.2,0.1]],[[0,0,0.1],[0,-0.2,0.1]]]; Tarp_EPOCH = [[[0,0,0.2],[0,0,-0.1]],[[0,0,0.2],[0,0,1]],[[0,0,0.2],[0.9,0,0.2]],[[0,0,0.2],[-0.9,0,0.2]],[[0,0,0.2],[0,1,0.2]],[[0,0,0.2],[0,-0.9,0.2]]]; Freezer_EPOCH = [[[0,0,0.5],[0,0,-0.1]],[[0,0,0.5],[0,0,1.1]],[[0,0,0.5],[0.7,0,0.5]],[[0,0,0.5],[-0.7,0,0.5]],[[0,0,0.5],[0,0.5,0.5]],[[0,0,0.5],[0,-0.6,0.5]]]; -Cabinet_EPOCH = [[[0,0,0],[0,0,-0.4]],[[0,0,0],[0,0,0.4]],[[0,0,0],[0.2,0,0]],[[0,0,0],[-0.1,0,0]],[[0,0,0],[0,0.3,0]],[[0,0,0],[0,-0.3,0]]]; +Cabinet_EPOCH = [[[0,0,0],[0,0,-0.2]],[[0,0,0],[0,0,0.2]],[[0,0,0],[0.1,0,0]],[[0,0,0],[-0.1,0,0]],[[0,0,0],[0,0.15,0]],[[0,0,0],[0,-0.15,0]]]; + +// ,{"toiletPos","toilet_epoch",false},{"kitchenSinkPos","KitchenSink_epoch",false} EPOCH_lootClassesRaw = [ ["shelfPos", "Shelf_EPOCH", true], @@ -117,7 +92,9 @@ EPOCH_lootClassesRaw = [ ["shoeboxPos", "Shoebox_EPOCH", false], ["palletPos", "Tarp_EPOCH", false], ["freezerPos", "Freezer_EPOCH", false], - ["cabinetPos", "Cabinet_EPOCH", false] + ["cabinetPos", "Cabinet_EPOCH", false], + ["toiletPos", "toilet_epoch", false], + ["kitchenSinkPos", "KitchenSink_epoch", false] ]; EPOCH_lootSIMClassesRaw = [ ["shelfPos", "Shelf_SIM_EPOCH", true], @@ -135,7 +112,9 @@ EPOCH_lootSIMClassesRaw = [ ["shoeboxPos", "Shoebox_SIM_EPOCH", false], ["palletPos", "Tarp_SIM_EPOCH", false], ["freezerPos", "Freezer_SIM_EPOCH", false], - ["cabinetPos", "Cabinet_EPOCH", false] + ["cabinetPos", "Cabinet_EPOCH", false], + ["toiletPos", "toilet_SIM_epoch", false], + ["kitchenSinkPos", "KitchenSink_SIM_epoch", false] ]; EPOCH_lootClassesCustom = []; @@ -440,7 +419,7 @@ EPOCH_KeyDownCustom = { if (_ctrl) then { - EPB = []; "if (isclass _x) then {EPB pushBack (configName _x); true}" configClasses (getMissionConfig "CfgBuildingLootPos") + EPB = []; "if (isclass _x) then {EPB pushBack (configName _x)}; true" configClasses (getMissionConfig "CfgBuildingLootPos") } else { _buildLoading = objNull; @@ -565,7 +544,11 @@ EPOCH_LOOT = { }; EP_building = createVehicle [_this, player modelToWorld [0,25,0] , [], 0, "CAN_COLLIDE"]; - EP_building setDir Base_angle; + _memoryPoints = ["one","two","three","four"]; + { + EP_building animate [_x,0,true]; + } forEach _memoryPoints; + EP_building setDir Base_angle; EP_building setPosATL _curPos; _loots = [ @@ -584,7 +567,9 @@ EPOCH_LOOT = { ["shoeboxPos", "Shoebox_EPOCH", false], ["palletPos", "Tarp_EPOCH", false], ["freezerPos", "Freezer_EPOCH", false], - ["cabinetPos", "Cabinet_EPOCH", false] + ["cabinetPos", "Cabinet_EPOCH", false], + ["toiletPos", "toilet_epoch", false], + ["kitchenSinkPos", "KitchenSink_epoch", false] ]; _building = EP_building; @@ -708,8 +693,8 @@ KK_boundingBox = { { _x params ["_startV","_stopV"]; - _start = DUMMY modelToWorld _startV; - _stop = DUMMY modelToWorld _stopV; + _start = DUMMY modelToWorld (_startV vectorMultiply 0.01); + _stop = DUMMY modelToWorld (_stopV vectorMultiply 0.01); _color = [1,1,1,1]; _ins = lineIntersectsSurfaces [AGLToASL _start,AGLToASL _stop,EPOCH_vehTarget,player,true,1,"FIRE","NONE"]; diff --git a/Tools/SQF/scratch.sqf b/Tools/SQF/scratch.sqf new file mode 100644 index 00000000..126289ff --- /dev/null +++ b/Tools/SQF/scratch.sqf @@ -0,0 +1,22 @@ +_dynamicEvents = _missionNamespace getVariable ["EPOCH_dynamicEvents", []]; +missionNamespace setVariable ["EPOCH_dynamicEvents", _dynamicEvents + [ + [ + 2700, // SECOND + [[123,"mockpayload"] "call", "EPOCH_mockServerFunction"], // EVENT for execVM or [ payload, ("call" or "spawn"), name of already compiled missionNamespace function] + 0, // INIT 1 = run script at startup or 0 normal delay + 1, // PREPOSTFIX 1 = use pre/postfix path (inside epoch settings pbo) 0 = use full file path (Ignored if not using execVM) + -1, // RUNNUMTIMES -1 infinite + [], // execVM payload (Ignored if not using execVM) + [] // disallowed worlds + ], + [ + 300, + [[456,"mockpayload2"] "spawn", "EPOCH_mockServerFunction2"], + 0, + 1, + -1, + [], + [] + ], + +]]; diff --git a/Tools/SQF/snapPointsGenV2.sqf b/Tools/SQF/snapPointsGenV2.sqf new file mode 100644 index 00000000..c1544cfc --- /dev/null +++ b/Tools/SQF/snapPointsGenV2.sqf @@ -0,0 +1,349 @@ +Hesco3_EPOCH = [ + [[0,0,-0.6],[0,0,-0.75]], + [[1.6,0,-0.0307557],[1.8625,0,-0.0307557]], + [[-1.6,0,-0.0307557],[-1.8625,0,-0.0307557]] +]; +WoodWall1_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodWall2_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodWall3_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodWall4_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodLargeWall_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodFloor_Epoch = [ + [[2.5555,0,0.15],[2.8555,0,0.15]], + [[0,-2.5555,0.15],[0,2.8555,0.15]], + [[-2.5555,0,0.15],[-2.8555,0,0.15]], + [[0,-2.5555,0.15],[0,-2.8555,0.15]], + + [[2.5555,0,0.15],[2.5555,0,-0.15]], + [[-2.5555,0,0.15],[-2.5555,0,-0.15]], + [[0,-2.5555,0.15],[0,-2.5555,-0.15]], + [[0,2.5555,0.15],[0,2.5555,-0.15]] +]; +MetalFloor_EPOCH = [ + [[2.5555,0,0.15],[2.8555,0,0.15]], + [[0,-2.5555,0.15],[0,2.8555,0.15]], + [[-2.5555,0,0.15],[-2.8555,0,0.15]], + [[0,-2.5555,0.15],[0,-2.8555,0.15]], + + [[2.5555,0,0.15],[2.5555,0,-0.15]], + [[-2.5555,0,0.15],[-2.5555,0,-0.15]], + [[0,-2.5555,0.15],[0,-2.5555,-0.15]], + [[0,2.5555,0.15],[0,2.5555,-0.15]] +]; +WoodLargeWallCor_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodLargeWallDoorway_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodLargeWallDoor_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodLargeWallDoorL_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +WoodStairs_EPOCH = [ + [[0,0,0.05],[0,0,-0.20]] +]; +WoodStairs2_EPOCH = [ + [[0,0,0.05],[0,0,-0.20]] +]; +WoodTower_EPOCH = [ + [[0,0,0.05],[0,0,-0.20]] +]; +WoodRamp_EPOCH = [ + [[0,0,0.05],[0,0,-0.20]] +]; +CinderWallGarage_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +CinderWall_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; +CinderWallHalf_EPOCH = [ + [[0,0,0.120775],[0,0,-0.190775]], + [[2.46932,0,1.5],[2.76932,0,1.5]], + [[-2.46932,0,1.5],[-2.76932,0,1.5]] +]; + + +EPOCH_buildClasses = [ +"Hesco3_EPOCH", +"WoodWall1_EPOCH", +"WoodWall2_EPOCH", +"WoodWall3_EPOCH", +"WoodWall4_EPOCH", + +"MetalFloor_EPOCH", +"WoodFloor_EPOCH", + +"WoodLargeWall_EPOCH", +"WoodLargeWallCor_EPOCH", +"WoodLargeWallDoorway_EPOCH", +"WoodLargeWallDoor_EPOCH", +"WoodLargeWallDoorL_EPOCH", + +"WoodStairs_EPOCH", +"WoodStairs2_EPOCH", +"WoodTower_EPOCH", +"WoodRamp_EPOCH", + +"CinderWallGarage_EPOCH", +"CinderWall_EPOCH", +"CinderWallHalf_EPOCH" +]; + +EPOCH_buildClassesCount = count EPOCH_buildClasses - 1; +Epoch_selectedBuildClasIndex = 0; +EPOCH_selectedBuildClass = EPOCH_buildClasses select 0; + +EPOCH_objPOS = player modelToWorld[0, 5, 1]; +if !(surfaceIsWater _currentPos) then { + EPOCH_objPOS = ATLtoASL _currentPos; +}; + +{ + detach _x; +} forEach attachedObjects player; + +EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle EPOCH_objPOS; +EPOCH_currentBuildObj setPosATL EPOCH_objPOS; +EPOCH_currentBuildObj attachTo[player]; +EPOCH_selectedEditIndex = 0; + +EPOCH_fnc_AGLToATL = { + _pos = _this; + if !(surfaceIsWater _pos) then {_pos = ASLToATL _pos}; + _pos +}; + +EPOCH_KeyDownFunctionhandler = { + _dikCode = _this select 1; + _shift = _this select 2; + _ctrl = _this select 3; + _alt = _this select 4; + _handled = false; + + switch (_dikCode) do { + + case 0xC7 : { + _index = missionNamespace getVariable ["EPOCH_selectedEditIndex",0]; + _index = _index + 1; + missionNamespace setVariable ["EPOCH_selectedEditIndex",_index]; + hint str(_index); + _handled = true; + }; + case 0xCF : { + + _index = missionNamespace getVariable ["EPOCH_selectedEditIndex",0]; + _index = _index - 1; + missionNamespace setVariable ["EPOCH_selectedEditIndex",_index]; + hint str(_index); + _handled = true; + }; + + case 0xC8 : { + hint "UP"; + _extents = (missionNamespace getVariable EPOCH_selectedBuildClass) ; + _new = []; + { + if (_foreachindex == EPOCH_selectedEditIndex) then { + _extents1 = _x select 0; + _extents2 = _x select 1; + _new pushBack ([[_extents1 select 0, _extents1 select 1, (_extents1 select 2)-0.1],[_extents2 select 0, _extents2 select 1, (_extents2 select 2)+0.1]]); + } else { + _new pushBack _x; + }; + } forEach _extents; + missionNamespace setVariable [EPOCH_selectedBuildClass,_new]; + _handled = true; + }; + case 0xD0 : { + hint "DOWN"; + _extents = (missionNamespace getVariable EPOCH_selectedBuildClass) ; + _new = []; + { + if (_foreachindex == EPOCH_selectedEditIndex) then { + _extents1 = _x select 0; + _extents2 = _x select 1; + _new pushBack ([[_extents1 select 0, _extents1 select 1, (_extents1 select 2)+0.1],[_extents2 select 0, _extents2 select 1, (_extents2 select 2)-0.1]]); + } else { + _new pushBack _x; + }; + } forEach _extents; + missionNamespace setVariable [EPOCH_selectedBuildClass,_new]; + _handled = true; + }; + case 0xCB : { + hint "LEFT"; + _extents = (missionNamespace getVariable EPOCH_selectedBuildClass) ; + _new = []; + { + if (_foreachindex == EPOCH_selectedEditIndex) then { + _extents1 = _x select 0; + _extents2 = _x select 1; + + if (_ctrl) then { + _new pushBack [[_extents1 select 0, (_extents1 select 1)-0.1, _extents1 select 2],[_extents2 select 0, (_extents2 select 1)+0.1, _extents2 select 2]]; + } else { + _new pushBack [[(_extents1 select 0)-0.1, _extents1 select 1, _extents1 select 2],[(_extents2 select 0)+0.1, _extents2 select 1, _extents2 select 2]]; + }; + + + } else { + _new pushBack _x; + }; + } forEach _extents; + missionNamespace setVariable [EPOCH_selectedBuildClass,_new]; + + _handled = true; + }; + case 0xCD : { + hint "RIGHT"; + _extents = (missionNamespace getVariable EPOCH_selectedBuildClass) ; + + _new = []; + { + if (_foreachindex == EPOCH_selectedEditIndex) then { + _extents1 = _x select 0; + _extents2 = _x select 1; + + if (_ctrl) then { + _new pushBack [[_extents1 select 0, (_extents1 select 1)+0.1, _extents1 select 2],[_extents2 select 0, (_extents2 select 1)-0.1, _extents2 select 2]]; + } else { + _new pushBack [[(_extents1 select 0)+0.1, _extents1 select 1, _extents1 select 2],[(_extents2 select 0)-0.1, _extents2 select 1, _extents2 select 2]]; + }; + + + } else { + _new pushBack _x; + }; + } forEach _extents; + missionNamespace setVariable [EPOCH_selectedBuildClass,_new]; + + _handled = true; + }; + case 0xC9 : { + Epoch_selectedBuildClasIndex = ((Epoch_selectedBuildClasIndex + 1) min EPOCH_buildClassesCount) max 0; + EPOCH_selectedBuildClass = EPOCH_buildClasses select Epoch_selectedBuildClasIndex; + + if !(isNull EPOCH_currentBuildObj) then { + deleteVehicle EPOCH_currentBuildObj; + EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle EPOCH_objPOS; + EPOCH_currentBuildObj setPosATL EPOCH_objPOS; + EPOCH_currentBuildObj attachTo[player]; + + + + }; + + hint EPOCH_selectedBuildClass; + _handled = true; + }; + case 0xD1 : { + Epoch_selectedBuildClasIndex = ((Epoch_selectedBuildClasIndex - 1) min EPOCH_buildClassesCount) max 0; + EPOCH_selectedBuildClass = EPOCH_buildClasses select Epoch_selectedBuildClasIndex; + hint EPOCH_selectedBuildClass; + + if !(isNull EPOCH_currentBuildObj) then { + deleteVehicle EPOCH_currentBuildObj; + EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle EPOCH_objPOS; + EPOCH_currentBuildObj setPosATL EPOCH_objPOS; + EPOCH_currentBuildObj attachTo[player]; + + + }; + + _handled = true; + }; + }; + _handled +}; + +[] spawn { + (findDisplay 46) displayRemoveAllEventHandlers "KeyDown"; + (findDisplay 46) displayAddEventHandler["KeyDown",{_this call EPOCH_KeyDownFunctionhandler}]; +}; + +onEachFrame { + + _numberOfContacts = 0; + _maxWidth = 0; + _maxLength = 0; + _maxHeight = 0; + + _getSettings = missionNamespace getVariable format["%1_MAX",(typeOf EPOCH_currentBuildObj)]; + if !(isNil "_getSettings") then { + _maxWidth = _getSettings param [0,0]; + _maxLength = _getSettings param [1,0]; + _maxHeight = _getSettings param [2,0]; + + } else { + _bbr = boundingBoxReal EPOCH_currentBuildObj; + _p1 = _bbr select 0; + _p2 = _bbr select 1; + _maxWidth = abs ((_p2 select 0) - (_p1 select 0)/2); + _maxLength = abs ((_p2 select 1) - (_p1 select 1)/2); + _maxHeight = abs ((_p2 select 2) - (_p1 select 2)); + missionNamespace setVariable [format["%1_MAX",(typeOf EPOCH_currentBuildObj)],[_maxWidth,_maxLength,_maxHeight]]; + }; + _color = [0,0,1,1]; + + { + _pos1 = EPOCH_currentBuildObj modelToWorld (_x select 0); + _pos2 = EPOCH_currentBuildObj modelToWorld (_x select 1); + drawLine3D [_pos1,_pos2,_color]; + } forEach[ + [[0,0,_maxHeight],[0,0,-_maxHeight]], + [[_maxWidth,0,_maxHeight],[-_maxWidth,0,_maxHeight]], + [[0,_maxLength,_maxHeight],[0,-_maxLength,_maxHeight]] + ]; + + _color = [0,1,0,1]; + { + _pos1 = EPOCH_currentBuildObj modelToWorld (_x select 0); + _pos2 = EPOCH_currentBuildObj modelToWorld (_x select 1); + + _ins = lineIntersectsSurfaces [AGLToASL _pos1, AGLToASL _pos2,player,EPOCH_currentBuildObj,true,1,"VIEW","FIRE"]; + if (count _ins == 0) then { + drawIcon3D ["a3\weapons_f\data\clear_empty.paa", [1,1,1,1], _pos2, 1, 1, 45, "no", 1, 0.02, "TahomaB"]; + } else { + drawIcon3D ["a3\weapons_f\data\clear_empty.paa", [1,1,1,1], ASLToATL (_ins select 0 select 0), 1, 1, 45, "yes", 1, 0.02, "TahomaB"]; + }; + + drawLine3D [_pos1,_pos2,_color]; + } forEach (missionNamespace getVariable format["%1",(typeOf EPOCH_currentBuildObj)]); + +}; diff --git a/Tools/SQF/snapPointsGenV3.sqf b/Tools/SQF/snapPointsGenV3.sqf new file mode 100644 index 00000000..5ee7a8d9 --- /dev/null +++ b/Tools/SQF/snapPointsGenV3.sqf @@ -0,0 +1,259 @@ +Bed_EPOCH = [[[0,0,0.6],[0,0,-0.1]],[[0,0,0.6],[0,0,0.9]],[[0,0,0.5],[1.1,0,0.5]],[[0,0,0.5],[-0.7,0,0.5]],[[0,0,0.5],[0,1.4,0.5]],[[0,0,0.5],[0,-1.4,0.5]]]; +Fridge_EPOCH = [[[0,0,1.1],[0,0,-0.1]],[[0,0,1.1],[0,0,2.1]],[[0,0,1.1],[0.5,0,1.1]],[[0,0,1.1],[-0.5,0,1.1]],[[0,0,1.1],[0,0.4,1.1]],[[0,0,1.1],[0,-0.9,1.1]]]; +Shelf_EPOCH = [[[0,0,1],[0,0,-0.1]],[[0,0,1],[0,0,1.8]],[[0,0,1],[0.5,0,1]],[[0,0,1],[-0.5,0,1]],[[0,0,1],[0,0.2,1]],[[0,0,1],[0,-0.6,1]]]; +Couch_EPOCH = [[[0,0,0.4],[0,0,-0.1]],[[0,0,0.4],[0,0,1.2]],[[0,0,0.4],[1.3,0,0.4]],[[0,0,0.4],[-0.3,0,0.4]],[[0,0,0.4],[0,1.4,0.4]],[[0,0,0.4],[0,-1.4,0.4]]]; +wardrobe_epoch = [[[0,0,1.3],[0,0,-0.1]],[[0,0,1.3],[0,0,2.3]],[[0,0,1.3],[0.7,0,1.3]],[[0,0,1.3],[-0.7,0,1.3]],[[0,0,1.3],[0,0.4,1.3]],[[0,0,1.3],[0,-0.6,1.3]]]; +cooker_epoch = [[[0,0,0],[0,0,-0.7]],[[0,0,0],[0,0,0.7]],[[0,0,0],[0.4,0,0]],[[0,0,0],[-0.4,0,0]],[[0,0,0],[0,0.5,0]],[[0,0,0],[0,-0.7,0]]]; +Chair_EPOCH = [[[0,0,0.5],[0,0,-0.1]],[[0,0,0.5],[0,0,1.5]],[[0,0,0.6],[0.6,0,0.6]],[[0,0,0.6],[-0.6,0,0.6]],[[0,0,0.6],[0,0.6,0.6]],[[0,0,0.5],[0,-0.6,0.5]]]; +Filing_epoch = [[[0,0,0.8],[0,0,-0.1]],[[0,0,0.8],[0,0,1.6]],[[0,0,0.8],[0.3,0,0.8]],[[0,0,0.8],[-0.3,0,0.8]],[[0,0,0.8],[0,0.4,0.8]],[[0,0,0.8],[0,-0.5,0.8]]]; +Pelican_EPOCH = [[[0,0,0.2],[0,0,-0.1]],[[0,0,0.2],[0,0,0.7]],[[0,0,0.2],[0.9,0,0.2]],[[0,0,0.2],[-0.9,0,0.2]],[[0,0,0.2],[0,0.6,0.2]],[[0,0,0.2],[0,-0.4,0.2]]]; +Table_EPOCH = [[[0,0,0.5],[0,0,-0.1]],[[0,0,0.5],[0,0,0.8]],[[0,0,0.5],[1.1,0,0.5]],[[0,0,0.5],[-1,0,0.5]],[[0,0,0.5],[0,0.5,0.5]],[[0,0,0.5],[0,-0.7,0.5]]]; +Locker_EPOCH = [[[0,0,1.1],[0,0,-0.1]],[[0,0,1.1],[0,0,2.1]],[[0,0,1.1],[1,0,1.1]],[[0,0,1.1],[-0.9,0,1.1]],[[0,0,1.1],[0,0.4,1.1]],[[0,0,1.1],[0,-0.5,1.1]]]; +ToolRack_EPOCH = [[[0,0,1.5],[0,0,-0.1]],[[0,0,1.5],[0,0,2.3]],[[0,0,1.5],[1,0,1.5]],[[0,0,1.5],[-0.9,0,1.5]],[[0,0,1.5],[0,0.05,1.5]],[[0,0,1.5],[0,-0.4,1.5]]]; +Shoebox_EPOCH = [[[0,0,0.1],[0,0,-0.1]],[[0,0,0.1],[0,0,0.3]],[[0,0,0.1],[0.3,0,0.1]],[[0,0,0.1],[-0.3,0,0.1]],[[0,0,0.1],[0,0.2,0.1]],[[0,0,0.1],[0,-0.2,0.1]]]; +Tarp_EPOCH = [[[0,0,0.2],[0,0,-0.1]],[[0,0,0.2],[0,0,1]],[[0,0,0.2],[0.9,0,0.2]],[[0,0,0.2],[-0.9,0,0.2]],[[0,0,0.2],[0,1,0.2]],[[0,0,0.2],[0,-0.9,0.2]]]; +Freezer_EPOCH = [[[0,0,0.5],[0,0,-0.2]],[[0,0,0.5],[0,0,1.1]],[[0,0,0.5],[0.7,0,0.5]],[[0,0,0.5],[-0.7,0,0.5]],[[0,0,0.5],[0,0.5,0.5]],[[0,0,0.5],[0,-0.6,0.5]]]; +Cabinet_EPOCH = [[[0,0,0],[0,0,-0.4]],[[0,0,0],[0,0,0.4]],[[0,0,0],[0.2,0,0]],[[0,0,0],[-0.2,0,0]],[[0,0,0],[0,0.3,0]],[[0,0,0],[0,-0.3,0]]]; + +EPOCH_buildClasses = [ +"Shelf_EPOCH", +"Fridge_EPOCH", +"Bed_EPOCH", +"Couch_EPOCH", +"wardrobe_epoch", +"cooker_epoch", +"Chair_EPOCH", +"Filing_epoch", +"Pelican_EPOCH", +"Table_EPOCH", +"Locker_EPOCH", +"ToolRack_EPOCH", +"Shoebox_EPOCH", +"Tarp_EPOCH", +"Freezer_EPOCH", +"Cabinet_EPOCH" +]; + +EPOCH_buildClassesCount = count EPOCH_buildClasses - 1; +Epoch_selectedBuildClasIndex = 0; +EPOCH_selectedBuildClass = EPOCH_buildClasses select 0; + +EPOCH_objPOS = player modelToWorld[0, 5, 0.5]; +if !(surfaceIsWater _currentPos) then { + EPOCH_objPOS = ATLtoASL _currentPos; +}; + +{ + detach _x; +} forEach attachedObjects player; + +EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle EPOCH_objPOS; +EPOCH_currentBuildObj setPosATL EPOCH_objPOS; +comment "EPOCH_currentBuildObj attachTo[player];"; +EPOCH_selectedEditIndex = 0; + +EPOCH_fnc_AGLToATL = { + _pos = _this; + if !(surfaceIsWater _pos) then {_pos = ASLToATL _pos}; + _pos +}; + +EPOCH_KeyDownFunctionhandler = { + _dikCode = _this select 1; + _shift = _this select 2; + _ctrl = _this select 3; + _alt = _this select 4; + _handled = false; + + switch (_dikCode) do { + + case 0xC7 : { + _index = missionNamespace getVariable ["EPOCH_selectedEditIndex",0]; + _index = _index + 1; + missionNamespace setVariable ["EPOCH_selectedEditIndex",_index]; + hint str(_index); + _handled = true; + }; + case 0xCF : { + + _index = missionNamespace getVariable ["EPOCH_selectedEditIndex",0]; + _index = _index - 1; + missionNamespace setVariable ["EPOCH_selectedEditIndex",_index]; + hint str(_index); + _handled = true; + }; + + case 0xC8 : { + hint "UP"; + _extents = missionNamespace getVariable [EPOCH_selectedBuildClass,[[[0,0,0],[0,0,0]]]]; + _new = []; + { + if (_foreachindex == EPOCH_selectedEditIndex) then { + _extents1 = _x select 0; + _extents2 = _x select 1; + if (_ctrl) then { + _new pushBack ([[_extents1 select 0, _extents1 select 1, (_extents1 select 2)+0.1],[_extents2 select 0, _extents2 select 1, (_extents2 select 2)+0.1]]); + } else { + _new pushBack ([[_extents1 select 0, _extents1 select 1, (_extents1 select 2)],[_extents2 select 0, _extents2 select 1, (_extents2 select 2)+0.1]]); + }; + } else { + _new pushBack _x; + }; + } forEach _extents; + missionNamespace setVariable [EPOCH_selectedBuildClass,_new]; + _handled = true; + }; + case 0xD0 : { + hint "DOWN"; + _extents = missionNamespace getVariable [EPOCH_selectedBuildClass,[[[0,0,0],[0,0,0]]]]; + _new = []; + { + if (_foreachindex == EPOCH_selectedEditIndex) then { + _extents1 = _x select 0; + _extents2 = _x select 1; + if (_ctrl) then { + _new pushBack ([[_extents1 select 0, _extents1 select 1, (_extents1 select 2)-0.1],[_extents2 select 0, _extents2 select 1, (_extents2 select 2)-0.1]]); + } else { + _new pushBack ([[_extents1 select 0, _extents1 select 1, (_extents1 select 2)],[_extents2 select 0, _extents2 select 1, (_extents2 select 2)-0.1]]); + }; + + } else { + _new pushBack _x; + }; + } forEach _extents; + missionNamespace setVariable [EPOCH_selectedBuildClass,_new]; + _handled = true; + }; + case 0xCB : { + hint "LEFT"; + _extents = missionNamespace getVariable [EPOCH_selectedBuildClass,[[[0,0,0],[0,0,0]]]]; + _new = []; + { + if (_foreachindex == EPOCH_selectedEditIndex) then { + _extents1 = _x select 0; + _extents2 = _x select 1; + + if (_ctrl) then { + _new pushBack [[_extents1 select 0, (_extents1 select 1), _extents1 select 2],[_extents2 select 0, (_extents2 select 1)+0.1, _extents2 select 2]]; + } else { + _new pushBack [[(_extents1 select 0), _extents1 select 1, _extents1 select 2],[(_extents2 select 0)+0.1, _extents2 select 1, _extents2 select 2]]; + }; + + + } else { + _new pushBack _x; + }; + } forEach _extents; + missionNamespace setVariable [EPOCH_selectedBuildClass,_new]; + + _handled = true; + }; + case 0xCD : { + hint "RIGHT"; + _extents = missionNamespace getVariable [EPOCH_selectedBuildClass,[[[0,0,0],[0,0,0]]]]; + + _new = []; + { + if (_foreachindex == EPOCH_selectedEditIndex) then { + _extents1 = _x select 0; + _extents2 = _x select 1; + + if (_ctrl) then { + _new pushBack [[_extents1 select 0, (_extents1 select 1), _extents1 select 2],[_extents2 select 0, (_extents2 select 1)-0.1, _extents2 select 2]]; + } else { + _new pushBack [[(_extents1 select 0), _extents1 select 1, _extents1 select 2],[(_extents2 select 0)-0.1, _extents2 select 1, _extents2 select 2]]; + }; + + + } else { + _new pushBack _x; + }; + } forEach _extents; + missionNamespace setVariable [EPOCH_selectedBuildClass,_new]; + + _handled = true; + }; + case 0xC9 : { + Epoch_selectedBuildClasIndex = ((Epoch_selectedBuildClasIndex + 1) min EPOCH_buildClassesCount) max 0; + EPOCH_selectedBuildClass = EPOCH_buildClasses select Epoch_selectedBuildClasIndex; + + if !(isNull EPOCH_currentBuildObj) then { + deleteVehicle EPOCH_currentBuildObj; + EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle EPOCH_objPOS; + EPOCH_currentBuildObj setPosATL EPOCH_objPOS; + comment "EPOCH_currentBuildObj attachTo[player];"; + + + + }; + + hint EPOCH_selectedBuildClass; + _handled = true; + }; + case 0xD1 : { + Epoch_selectedBuildClasIndex = ((Epoch_selectedBuildClasIndex - 1) min EPOCH_buildClassesCount) max 0; + EPOCH_selectedBuildClass = EPOCH_buildClasses select Epoch_selectedBuildClasIndex; + hint EPOCH_selectedBuildClass; + + if !(isNull EPOCH_currentBuildObj) then { + deleteVehicle EPOCH_currentBuildObj; + EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle EPOCH_objPOS; + EPOCH_currentBuildObj setPosATL EPOCH_objPOS; + comment "EPOCH_currentBuildObj attachTo[player];"; + + + }; + + _handled = true; + }; + }; + _handled +}; + +[] spawn { + (findDisplay 46) displayRemoveAllEventHandlers "KeyDown"; + (findDisplay 46) displayAddEventHandler["KeyDown",{_this call EPOCH_KeyDownFunctionhandler}]; +}; + +onEachFrame { + + _numberOfContacts = 0; + _maxWidth = 0; + _maxLength = 0; + _maxHeight = 0; + + _getSettings = missionNamespace getVariable format["%1_MAX",(typeOf EPOCH_currentBuildObj)]; + if !(isNil "_getSettings") then { + _maxWidth = _getSettings param [0,0]; + _maxLength = _getSettings param [1,0]; + _maxHeight = _getSettings param [2,0]; + + } else { + _bbr = boundingBoxReal EPOCH_currentBuildObj; + _p1 = _bbr select 0; + _p2 = _bbr select 1; + _maxWidth = abs ((_p2 select 0) - (_p1 select 0)/2); + _maxLength = abs ((_p2 select 1) - (_p1 select 1)/2); + _maxHeight = abs ((_p2 select 2) - (_p1 select 2)); + missionNamespace setVariable [format["%1_MAX",(typeOf EPOCH_currentBuildObj)],[_maxWidth,_maxLength,_maxHeight]]; + }; + + _color = [0,1,0,1]; + { + _pos1 = EPOCH_currentBuildObj modelToWorld (_x select 0); + _pos2 = EPOCH_currentBuildObj modelToWorld (_x select 1); + + _ins = lineIntersectsSurfaces [AGLToASL _pos2, AGLToASL _pos1,player,objNull,true,1,"VIEW","FIRE"]; + (_ins select 0) params ["_intersectPosASL","_surfaceNormal","_intersectObject","_parentObject"]; + + if (_intersectObject isEqualTo EPOCH_currentBuildObj) then { + drawIcon3D ["a3\weapons_f\data\clear_empty.paa", [1,1,1,1], _pos1, 1, 1, 45, "start", 1, 0.02, "TahomaB"]; + drawIcon3D ["a3\weapons_f\data\clear_empty.paa", [1,1,1,1], _pos2, 1, 1, 45, "stop", 1, 0.02, "TahomaB"]; + } else { + drawIcon3D ["a3\weapons_f\data\clear_empty.paa", [1,1,1,1], ASLToATL (_ins select 0 select 0), 1, 1, 45, "no", 1, 0.02, "TahomaB"]; + }; + + drawLine3D [_pos1,_pos2,_color]; + } forEach (missionNamespace getVariable format["%1",(typeOf EPOCH_currentBuildObj)]); + +}; diff --git a/build.txt b/build.txt index 39071e3e..b039bdc3 100644 --- a/build.txt +++ b/build.txt @@ -1 +1 @@ -757 +826 diff --git a/changelog.md b/changelog.md new file mode 100644 index 00000000..61cd2358 --- /dev/null +++ b/changelog.md @@ -0,0 +1,1050 @@ +# Change Log +All changes for [Arma 3](https://arma3.com/) [Epoch Mod](https://epochmod.com) are listed in this changelog. + +## [Unreleased] +### Added +- Favorites bar. Users can pin (almost) any item to the bar by dragging items from inventory to equip/un-equip (Weapons, attachments, head gear, etc.) or consume (eat, drink, build, etc.) using keyboard mapping without having gear open. Use ESC menu to change the mappings. Server admins, see client_init.sqf for config. @raymix +- Advanced Vehicle Repair System - Repairing your vehicle just got more realistic. Patch a leaky fuel tank with Duct Tape. If you blow a tire you now need to find a Spare. Engine too damaged? grab an engine block to repair it. @Ignatz-Heman +- Repair Items: (ItemDuctTape, SpareTire, EngineParts, EngineBlock, ItemGlass, FuelTank, ItemRotor). @Helion4 +- Vehicle Upgrade System - Upgrade your ride by using one of the new vehicle upgrade documents found in the world. @DirtySanchez +- Vector Base Building (uses Arrow keys by default and with SHIFT / ALT you can control the steps). @DirtySanchez & @Ignatz-Heman +- New Base Building Objects: Quarter and Half wood floors @DirtySanchez, Cinder block floor, Cinder wall with a window. Metal and Cinder Towers @Helion4. +- Added the following new buildables (bringing most buildables from A2/Epoch to A3 using standard ARMA models): Burn Barrel, Light Pole, Small (forest and desert) Camo Nets, Large (forest and desert) Camo Nets, Camp Fire, Field Toilet, Scaffolding, Sink (water source), Single and Double Portable Lights, Lifeguard Tower, Sun Shade, Fuel Pump, Small Sandbag Bunker, Short Sandbag Wall, Long Sandbag Wall, Bar Gate and Water Pump, @morgoth0 (Grahame) and @DirtySanchez +- A-frame and Dome tents as insecure storage objects. @morgoth0, @DirtySanchez, @Helion4 +- Farming system - craft-able garden plot allows you to grow seeds into mature plants. Models by @Helion4, configs by @DirtySanchez +- Medical items: Adrenaline Shot (adrenaline_epoch), Caffeine Pills (caffeinepills_epoch). Orlistat Pills (orlistat_epoch) by @Helion4 and configs by @DirtySanchez +- Food items: ItemCereals, ItemPowderMilk_F, ItemRiceBox, ItemVitamins. @DirtySanchez +- 84 new Female outfits based on 20 top designs and 4 new pairs of jeans(Blue Patched, Arid Brown, Black/Brown, Black). @DirtySanchez, @ComatoseBadger +- Pricing and loot table additions for 65 additional male uniforms. +- Vehicle Ammo Reloading from Inventory and Vehicle Ammo. @DirtySanchez +- Radiation System with radioactive out of bounds, locations, and random crashed satellites. Model @Helion4 +- Digital Geiger Counter - used to detect Radiation levels by pointing at radioactive objects. (Sounds @vbawol, Model @Helion4, and UI + digital font @raymix) +- Radiation meds - pills, creme and injector to reduce radiation effects @Helion4 +- Barrel Bomb - large craft-able explosive that can be placed and detonated. @DirtySanchez +- Brown Briefcase that contains 100oz Silver. @DirtySanchez +- Old "Zombie Parts" Bag (ItemBioHazardBag). +- 5 new Halloween masks for October. @Helion4, @DirtySanchez +- Option to drink directly from water sources. @Ignatz-HeMan +- Karma changes for deaths, suicides, PvP(including hero* and bandit* levels), trader kills, revives, trading sales and purchases. +- Custom map markers and icons by @xDrokZ, @DirtySanchez +- Epoch Events 3.0: External pbo based events. see epoch_server_vip_event or epoch_server_debris_event for examples. +- VIP Event - Reveals the map location of a random player that possesses a specific item (default: ItemBriefcaseGold100oz) every X (default: 15) minutes. +- Dynamic Debris: Dynamically spawns vehicle and other debris on the roadways. Scans the roads on startup and uses a random seed generator to determine the locations of debris. Debris is spawned using createSimpleObject for best performance and is made to conform with the uppermost roadway surface. +- Epoch Dev Libs, See https://github.com/EpochModTeam/Epoch/tree/experimental/Tools/DevFrameWork for more info. @raymix +- Md5 hash function and Unit test to the hive. See usage example with EPOCH_fnc_server_hiveMD5 SQF function. +- Dynamic Simulation is now fully enabled. See "CfgDynamicSimulation" for configs. @DirtySanchez +- Conditional loot table options to allow omitting items from loot tables via custom logic. +- Map support for Malden 2035. @morgoth0 +- Map support for Chernarus Redux. @xDrokZ and @morgoth0 +- Burgers! @Helion4 +- New masks - Hockey, Plague, ghostface, skull, witch @Helion4 + +### Changed +- Mineral nodes can now only be harvested using the sledge hammer. +- Crafting recipes can now have item requirements and Crafting metal bars now require Smelting Tools. +- Player save and login optimized to use get|setUnitLoadout. +- Karma now persists death and moved to community stats. +- CBA extended event handler and zeus curator support for Epoch Vehicles. @DirtySanchez +- Base PlotPole ESP added to Epoch Admin Panel. @SMVampire +- Helper arrow to indicate the door-opening direction for Base Building. @Ignatz-Heman +- Base Building elements can be detached to walk around the Element before saving. @Ignatz-Heman +- Made ServicePoint more configurable @Ignatz-Heman +- Base Building: Replaced 0/90/180/270° direction build mode with "Rotate 90°". @Ignatz-Heman +- Base Building: Max building height now will be checked directly at building element placement. @Ignatz-Heman +- Separated Hunger and Thirst loss values to baseHungerLoss/baseThirstLoss and removed baseHTLoss from CfgEpochClient. +- Hunger and Thirst loss rates are now affected by timeMultiplier. +- Bump to hive version 0.6.0.0, Note: this requires epochserver hive extension updates server side. +- Gas Station Auto-Refuel is now disabled on all maps. Use disableAutoRefuel = false; via epochconfig.hpp to disable. @SMVampire +### Fixed +- Players are given negative rating so that AI will attack properly even if player side is civilian. @morgoth0, @Ignatz-Heman +- Player stats variables are now obfuscated, and hitpoints tracked via the server. +- Bad conversion: bool RPT spam caused by incorrect usage of configClasses. @DirtySanchez +- Snapping issues base building @DirtySanchez +- Sounds not working due to changes to 3dSay command in recent A3 updates. @DirtySanchez +- Spawning at base above Water was not working correctly. @Ignatz-Heman +- One step is higher on stairs, can't run up while crouched. #447 @Helion44 +- L85 Elcan optic issues. #678 @Helion44, @DirtySanchez +- Zombie falsely triggers Mission success. @Ignatz-Heman +- Base Building 90° and 270° Snap was broken. +- Sometimes snapped Base Building elements rotated back on save. +- BE kicks since 1.76. + +## [0.5.0.0] - 2017-03-17 +### Added +- Epoch is leaving alpha and entering beta! All Epoch Asset project sources are now available via our GitHub +LFS and under APL-SA license here: https://github.com/EpochModTeam/EpochCore +- Added Service Point to Rearm, Repair and Refuel. Thanks to @Ignatz-HeMan +- 7 new Keesha camo skins by Craig Hauer aka ComatoseBadger. +- 64-bit database extension support for Windows (EpochServer_x64.dll) and Linux (epochserver_x64.so) servers. Linux support is pending testing. +- Custom event handler and OnEachFrame hooks added. https://github.com/EpochModTeam/Epoch/tree/experimental/Sources/epoch_code/customs Thanks to @Ignatz-HeMan +- Crafting recipe: Mortar (Uses: 12x Rock, 2x dirty water) (Requires: Fire and workbench within 3m). Thanks to @baaljayjay for the suggestion. +- Customizability of units spawned by UAV alert via CfgEpochClient > uavAlertUnitSpawnTemplate. (Default: I_Soldier_EPOCH) +- Toxic Smoke Grenades can now be found in the world. +- Respawn in base feature, each player must interact with Jammer and choose "Make Spawnpoint" to enable. +- Selling to traders with bank debt greater than -50000(default), pays the bank debt back to below the limit instead of the player. Thanks to @Ignatz-HeMan +- 200 player support to all mission files, thanks to increased group limits in Arma 1.68! +- Experimental support for Mad ArmA Mod: https://forums.bistudio.com/forums/topic/200295-mad-arma-mad-max-inspired-mod/ +- "MeleeRod" (Fishing Rod) to Crafting Menu (1x Rope,1x Stick,1x Metal Scraps) @Ignatz-HeMan +- Vehicle and Loot tables can be set via epochconfig settings (forcedVehicleSpawnTable, forcedLootSpawnTable) to force specific vehicle or loot tables. +- Install script for Mad Arma mod via Steam workshop in the tools/install folder. +### Changed +- Epoch Message function now supports custom colors. Thanks to @SPKcoding +- Epoch Event: ChangeWeather has been updated to allow for better random control of weather and defaults to bad weather. +- Optimized database SET and SETEX calls in both SQF and C++. +- Optimized database GETRANGE call. +- Optimized NPC Trading and fixed issue if trade failed. Thanks to @Ignatz-HeMan +- Great White Sharks will now spawn if the player is deep enough in the ocean. +- Objects or Players that have been given "Crypto" variable can be accessed via the dynamic menu (Space Bar) for a "Take Crypto" action. +- Air Drops are now triggered via Epoch Events server side every 45m at random, instead of randomly triggered client side. +- To prevent issues with ownership only Group Leader can place a Jammer. jammerGLOnly = 0 in CfgEpochClient to disable. Thanks to @Ignatz-HeMan and @82ndab-Bravo17 +- Spawn in base now use player position instead of jammers (reset spawn point to use). @Ignatz-HeMan +- Force "Take Crypto" option on dead bodies. @Ignatz-HeMan +- Added optional Classnames for Service Point Pos. @Ignatz-HeMan +- Some Cleanups and Script optimization to the service point scripts. @Ignatz-HeMan +- Removed "Alpha" text from debug monitor. +- Add flag to enable database unit test. enableUnitTestOnStart = 1 in epochconfig.hpp to enable +- Delete rest of unused clientside Airdrop Event code. @Ignatz-HeMan +- further optimized DB call for weather script. +- Re-add missing comments in some config files. +- Numerous other fixes and optimizations. +### Removed +- EpochServer extension calls 100 and 101 as they are no longer needed. +### Fixed +- Crash bug when opening base building upgrade menu since Arma 3 1.68. +- Wrong variable name in EPOCH_clientRevive.sqf. Thanks to @Ignatz-HeMan +- Sometimes getting stuck only walking. Thanks to @Ignatz-HeMan +- Repack of Energy Pack is now possible. +- Toxic Smoke Grenade not making you Toxic thanks to @Ignatz-HeMan +- some missing semicolons in CfgPricing. @SPKcoding +- Joining and leaving a group and optimize with added usage of params. @Ignatz-HeMan +- Group invites from the same Group were not possible until relog. @Ignatz-HeMan +- Heal not working when using SafeZones with VehicleGodmode and only HitPoint is damaged. @Ignatz-HeMan +- fix deleteVehicle BE kick with sharks +- CBA related Battleye kicks with current CBA version. +- Static weather settings not working. @82ndab-Bravo17 +- Battleye kicks for CUP weapon and attachment BE kicks. +- Battleye kicks for towing tractor from CUP. +- Fixed / updated and added Trader Missions and ported to run it on Events instead fsm. @Ignatz-HeMan +- Several minor fixes, cleanup, and private array updates. +- Fix for Weaponholder disappearing while adding loot. @Ignatz-HeMan +### Security +- redis-server.exe to latest version: 3.2.100 from: https://github.com/MSOpenTech/redis/releases +- Requires Arma 3 1.68 or higher. + +## [0.4.0.0] - 2016-11-02 +### Added +- Dynamic and extensible inventory sub menu system for item interaction and crafting options. (Double click item in your inventory) +- Vehicle immunity when a vehicle is left locked inside a player owned base (within jammer range) at server startup. Thanks to @morgoth0 for the feedback! +- Stamina loss when a player jumps. +- Option to pour our gas to get an empty Jerry can and a "Drink" option to poison yourself. +- Option to pour out honey and get an empty jar instead of eating it. +- Example mission file epoch_RyanZed.Tanoa that includes "RyanZombies" in the required addons array. +- EpochServer.dll/so is now statically linked to pcre3 and hredis. On Windows, this means that the pcre3.dll file in the arma 3 root can now be removed. On Linux, we no longer depend on libhredis and libpcre to be installed. +### Changed +- Inventory Armor stats feature now dynamic and no longer forced via config. +- Group menu and group requests options are now found options on the self-action menu. (SPACE BAR) +- Wardrobe mirror now works in single player. +- Jetski and Electric Motorcycle motorcycle in-vehicle HUD now functions in singleplayer or editor. +- Updated Tanoa trade city layout and added ATM's. Thanks to @morgoth0 (aka Grahame on EpochMod.com Forum) +- Players now start with only 30% Hunger and Thirst instead of 100%. +### Fixed +- Increased mass of "Hotwire Kit" (ItemHotwire) magazine item from 2 to 50 to address balance issues. Thanks to PR from @Ignatz-HeMan +- Disposal of Snakes and other animals when inside a protection zone. +- Shark bite attack and effect can now target all players. +- Female ghillie suit transparency issue since Arma update 1.62. +- Fireplace position incorrectly shifted down after lighting the fireplace. Thanks for the report by @Ignatz-HeMan #592 +- Increased anti-teleport range that should hopefully allow for proper HALO spawning. +- Typos in Battleye script.txt that caused the filter not to function properly. +- Trailing commas in mission addons array. Thanks to @SPKcoding (aka $p4rky on EpochMod.com Forum) +- No longer possible to unlock Doors / Gates while using a UAV. Thanks to PR from @Ignatz-HeMan +- Database logging now trims log entries via the LogLimit setting provided in EpochServer.ini. The default is 1000 log records per list. + +## [0.3.9.0] - 2016-06-19 +### Added +- A big thanks to Isaac, Axeman's chief tester! +- Tanoa map support. +- New Task-based Mission System. +- (Optional) Support for Ryan's Zombies and Demons mod: http://steamcommunity.com/sharedfiles/filedetails/?id=501966277 with custom Epoch implementation. +- New custom variable EPOCH_playerNuisance that increases based on the type of weapon fired and decreases at a rate of 1 per 10 seconds. This is used to track how active a shooter the player is. +- Player option to Morph into a random antagonist (from deathMorphClass) after death. The array 'deathMorphClass' found in CfgEpochClient can be used to specify what antagonists to randomly spawn. +- Player option to detonate body after death. Sacrifice yourself by generating a runaway thermal cascade using the nano bots within your body. Nothing left to revive. +- object loot tables for zombies, sharks, and Dogs. +- looting Dogs for meat (uses placeholder object "goat leg"). Negative Karma given for eating or gutting dogs. +- Improved plant spawner by Redbeard Actual and [VB]AWOL. +- Allow Epoch Events to accept full file path if 4th variable in the EpochEvents array is set to 0. Default is 1. +- Function to effect a players Crypto server side: EPOCH_server_effectCrypto +- New experimental PBO packing tool found in Epoch/Tools/PowerShell/ +- Server function to allow remote exec of setVariable on client - Allows client to ask another client to set a local variable, via the server. Server can run same function. +- Epoch AH: Added ability to kick, instead of just log or ban. +### Changed +- Increased loot bias 10% overall and increased loot density for military and other larger buildings. +- new function Epoch_message replaces Epoch_dynamicText. +- Object Interaction and EPOCH_client_bitePlayer settings in now config CfgObjectInteractions. Lootable objects can now affect player stats. +- Moved all Base Building variables to gamemode config CfgBaseBuilding. +- Moved all Item Interaction to new gamemode config CfgItemInteractions. +- Sapper groan or detonate can be triggered by setting a variable on the target or Sapper. +- The server can be asked by a client / server to trigger an antagonist on another client. Antagonist is then run on target PC, independent from caller of the function. +- Epoch Unit Spawn code. Now can be called specifying the target of the antagonist. The antagonist will run on target client PC. +- Sapper defaults tweaked to make them more responsive. +- New Sapper antagonist config options: +reflexSpeed - Set the loop pause. Defaults have been lowered to make Sapper more responsive. +nestChance - A percentage chance, at each Sapper spawn, that he will create a nest. +hideLevel - (Fear Emotion) Set level at which Sapper will go into hiding based on fear of armed players, being shot near etc. +chargeLevel - (Anger Emotion) Set level at which sapper will trigger 'charge the player' mode. +- New UAV Support Troops antagonist config options: +unitTypes - an array of soldier classes to randomly choose from. Custom weapons to-do, use soldiers with default weapon loadout or handle weapons with a custom script. +maxUnitNum - Maximum number of units to spawn per UAV. +minAISkill - Minimum value for any AI skill. +maxAimingAccuracy -> maxGeneral - Set the maximum value for each available AI skill. A random number between minAISkill and the value for each will be set as that skill. +- Changed gamemode to Survival, (might show as unknown gamemode pre 1.62) +- Reworked vehicle load function and made vehicles immune to damage for 120 seconds after startup. +- cfgpatches check now kicks by default with message a message. +- Vehicle persistence texture configs are now found in server settings PBO. https://github.com/EpochModTeam/Epoch/blob/experimental/Sources/epoch_server_settings/configs/CfgEpochVehicles.h +- Use new disableChannels syntax in 1.60 and enable text chat on side chat and not voice. Thanks to @morgoth0 for the heads up! https://github.com/EpochModTeam/Epoch/issues/544 +- ForceRestart option should now restart as soon as all players disconnect and server is locked. +- Epoch Events can now self-initialize on server startup (if the third events[] array element is 1). Fixes issue with the weather not changing till first event run. +- Loot position tool: Epoch/Tools/SQF/saveLootPositionsVector.sqf +- World config tool: Epoch/Tools/SQF/getTreesAndTrash.sqf +- Changed name of a3_epoch_server.pbo to epoch_server.pbo. Also changed path from \x\addons\a3_epoch_server to \epoch_server +- Changed name of a3_epoch_server_settings.pbo to epoch_server_settings.pbo. +### Removed +- Epoch AH removed whitelisted variable check system. +- STEAMAPI Vac ban check as it needs to be reworked in the extension. +### Fixed +- To prevent A3 dupe issues Epoch Militia Solders when taking uniforms, they no longer have uniforms. +- To prevent animation glitch with weapon switching on the move and holstering. You now must be standing still to holster your weapon. +- Custom Epoch Gestures not working since 1.60. +- Issue with animals not returning raw meat. +- Getting wet and cold on standing on pier. Thanks to umfufu for the report! http://epochmod.com/forum/topic/41929-getting-10-points-of-wetness/ +- Missing texture issues with some base building objects since 0.3.8. +- Take into account trader stored per class vehicle limits when spawning new vehicles. +- Disappearing Mags on login / revive. Thanks to He-Man for the fix: http://epochmod.com/forum/topic/42178-disappearing-mags-on-login-revive-fix/#comment-277194 +- CUP mods enabled check logic typo. Thanks to @morgoth0 for the report: https://github.com/EpochModTeam/Epoch/issues/543 +- BE kick when player opened stock A3 dialog (Game > Options > Layout). +- BE kick with Spawn Loot admin panel option. Thanks to @jostster for the report: https://github.com/EpochModTeam/Epoch/issues/540 +### Security +- RConPort 2306 added to example-beserver.cfg for changes since A3 1.58. +- Removed old .bikey and added new one for 0390. +- Requires Arma 3 1.60 or higher. + +## [0.3.8.0] - 2016-03-15 +### Added +- FastNights Epoch Event. http://epochmod.com/forum/topic/41949-accelerated-time/?do=findComment&comment=275310 +- Install batch for all CUP mods and CBA. https://github.com/EpochModTeam/Epoch/tree/release/Tools/Install +- Split gamemode from main assets, all epoch client gamemode code and configs are now found in the mission file under APL-SA license. https://github.com/EpochModTeam/Epoch +- Support for CUP Vehicles and Weapons. +- Display temperatures in both Fahrenheit and Celsius. +- Fully reworked loot object spawn system. +- Headers added to all gamemode files that include: Author, Description, Github Source link, Usage, and Examples. +- All text based feedback now use new EPOCH_dynamicText function. +- Show current build number on debug monitor. +- Player Karma stat is now effected by Arma 3 rating system via Event Handler. More TBA. +- Players can now harvest Hemp from maps that it grows wild. +- Support for Napf by Momo and ANixon http://steamcommunity.com/sharedfiles/filedetails/?id=635780806. +- Batch files to rebuild server and mission pbo's can be found in Github Root/Tools/Build folder. +- Updated version redis-server.exe to latest build (2.8.2400) and added full Redis config examples. +- limit to number of plant sites that can spawn. Can be controlled with "plantLimit" inside (CfgEpoch >> worldName). +- Support for Eden editor mission files (version 51) and attributes. +- Battleye filter updates for CUP Weapons and CBA. +### Changed +- Trash looting is now done by interaction system only. Hold Space Bar and choose Examine. +- Can now over heat if fatigued and air temperature is greater than 100F or 37C +- Crafting now supports Water sources from 'CfgWorldInteractions' configs. +- Moved Cultist and Sapper permanently to the enemy side. +- Disabled remote sensors on server and client as all AI Epoch is locally controlled. https://community.bistudio.com/wiki/disableRemoteSensors +- Repacked all pbo's to make use of the new 32-bit P3D binarization process. https://dev.arma3.com/post/techrep-00026 +- Massive code overhaul to make use of many new SQF commands instead of slower SQF logic. +- Increased the amount of Krypto a player can hold from 25k to 250k. +- Improve loot positions in existing maps and add more missing positions for CUP maps. +- General cleanup and reorganizing of files. +- Moved vehicle spawn limit configs to per map configs found in server settings PBO (CfgEpoch > WorldName > allowedVehiclesList). +- Use BIS_fnc_addStackedEventHandler for onEachFrame, onPlayerConnected, onPlayerDisconnected to increase compatibility with other mods like CBA. +- Lower disconnect timeout to 10 seconds with disconnectTimeout set via config.cfg. https://community.bistudio.com/wiki/server.cfg +- Mission system can now use missionConfigFile configs. +- publicVariableClient calls changed to use remoteExec. This should provide better performance and reliability as PVC's can be unreliable under heavy use and can also bottleneck the games netcode. +- CfgClientFunctions is now able to be overridden via description.ext. +- Fully removed BIS MP init override and added remoteExec BE filter rule for initPlayerServer.sqf usage. (Still must be whitelisted in remoteExec configs to use) +- The function EPOCH_fnc_addItemOverflow now supports spawning items and weapons types given a count. +- Moved the secure storage config variable 'returnOnPack' from cfgvehicles config to CfgBaseBuilding. +- Make use of new getOutMan EH for vehicle epoch anti wall glitch checks. +- Change last few uses of hintSilent to Epoch_dynamicText. Now only the debug monitor uses hintSilent. +- 1.58 Difficulty Overhaul changes to enable 3rd person. Thanks to klinGiii on the forum: http://epochmod.com/forum/index.php?/topic/41922-158-difficulty-overhaul +- Epoch AH reworked displayAddEventHandler checks to use CfgEpochClient configs. +- Increased range for vehicle interactions to fix issues with access to larger vehicles. Thanks to Grahame for the report: http://epochmod.com/forum/index.php?/topic/41894-cannot-unlock-large-vehicles/ +- Preloading sapper by spawning one on the map at server start. +- Change to Github markdown for credits and license. +- RConPort 2303 added to example-beserver.cfg for changes since A3 1.58. +- epochAH.hpp updated "antihack_checkFiles" for new file paths. +- Some AI Scripts Mods may not work with disableRemoteSensors enabled. You can disable with "disableRemoteSensors = false;" in CfgEpochClient. +- Defined proper settings in full redis-example.conf +### Removed +- Old BEC plugin as its not needed anymore. +### Fixed +- Temporary direction and angle placement issues when base building. +- Force player to lobby if the player did not tapout after timer runs out. +- Incorrect scope on some magazine items prevented them from showing in the admin spawn menu. +- Reworked player login, fixes issues with players logging in without gear (when one or more players are logging in at the same time, IE. server startup) +- suppress loot spawning at main traders. Thanks to Ghostrider-DbD- for the report. http://epochmod.com/forum/topic/41954-loot-spawning-at-traders/ +- BE kick since 1.58 hotfix. http://epochmod.com/forum/topic/41961-rscdebugconsole_watch-battleye-kick/?do=findComment&comment=275456 +- Use player object as input for remoteExec instead of owner net ID. http://epochmod.com/forum/topic/41959-be-carefull-with-remoteexec-and-owner/ +- Attempt fix issues with temporary angle and rotation issues with base building. +- Check for base kit item is in players inventory before spawning ghost. +- Prevent empty group menu display. Thanks to He-Man! for the fix. +- Group system marked player as "Dead Player" if moderator status was change while player offline. Thanks to He-Man! for the fix. +- Group system invite and kick from group options not working. Thanks to He-Man for the fixes: http://epochmod.com/forum/topic/41893-group-menu-broken-kick-invite-for-admin-not-possible/#comment-275429 +- Rewrote deleteVehicle.txt BE filter to correct filter syntax to fix false kicks. Thanks to BetterDeadThanZed for the report http://epochmod.com/forum/index.php?/topic/41933-players-kicked-for-moving-safes/#comment-275297 +- Fixed Arma install batch script not closing after update. +- Mission loot payout not working. Thanks to @He-Man for the fix: http://epochmod.com/forum/index.php?/topic/41892-payout-trader-mission-broken/ +- Crafting recipe for Vehicle Repair Kit had the wrong part in usedIn array. Thanks to LeBarbare for the report: http://epochmod.com/forum/index.php?/topic/41896-wrong-recipe-place/ +- Green Marked traders unable to be accessed. Thanks to @He-Man for the report: http://epochmod.com/forum/index.php?/topic/41887-radom-unexpected-script-failure-with-traders-ai_slot/ +- Trailing commas in CfgLootTable. +- Disallow building inside of vehicles. +- Incorrectly enabled CUP vehicles and weapons support if only Core and Maps were enabled. +- remoteExec Battleye kick fixed. +- Player gets stuck waiting for inventory to load. +- Delete base object if over limit. +### Security +- Required Arma 3 version is now 1.58 or higher. +- Removed old .bikey and added new one for 0380. + +## [0.3.7.0] - 2016-01-28 +### Added +- Drinking a Soda now returns an Empty Soda Can (ItemSodaEmpty). +- Eating a can of food now returns an Empty Tin Can (ItemEmptyTin). +- Repack magazines feature. Simply select a magazine and press the "Repack" button. +- 55 Gallon (210 liters) Fuel Barrel that can be used to refill/siphon vehicles. (Full - ItemBarrelF,Empty - ItemBarrelE). +- Ability to siphon fuel from other fuel sources like gas stations and gas tanks (transportFuel > 0). +- Crafting Burlap (ItemBurlap) from 2x Hemp (ItemKiloHemp) while at a workbench. +- Crafting of Plywood sheets (ItemPlywoodPack) from 3x Wood Log (WoodLog_EPOCH). +- Crafting of Aluminum Bars (ItemAluminumBar) from 6x Empty Soda Cans (ItemSodaEmpty) and one jar of water (water_epoch). Also requires a fire nearby. +- Crafting of Tin Bars (ItemTinBar) from 6x Empty Soda Cans (ItemEmptyTin) and one jar of water (water_epoch). Also requires a fire nearby. +- Copper Bars (ItemCopperBar) that can be crafted from cables (ItemCables) nearby a fire. Cables can also be made from Copper Bars at a workbench. +- Briefcase Full (ItemBriefcaseGold100oz) crafted from ten 10oz Gold bars and an Empty Briefcase (ItemBriefcaseE). +- Crafting of Bars (ItemGoldBar and ItemSilverBar) from Gold (PartOreGold) and Silver (PartOreSilver) Ores. +- Pack/unpack empty backpacks into carryable magazine items. +- Hotwire Kit (ItemHotwire). +- Key Makers Kit (ItemKeyKit). +- Keys in colors: (Black ItemKey,ItemKeyRed,ItemKeyGreen,ItemKeyBlue,ItemKeyYellow). +- Metal Pipes (ItemPipe). +- Documents (Trash,Books,Vehicle Upgrades) (ItemDoc1-8, ItemVehDoc1-4). +- Light Bulb (ItemBulb). +- Newly world spawned vehicles now have randomized damage. +- Setting to control random magazine ammo counts in loot spawner. CfgEpochClient -> randomizeMagazineAmmoCount (default: true) +- Debug box now dynamically spawns with flood lights to help players see inside the box at night. +- CfgEpochClient 'WorldInteractions' config now stores all environmental loot classes and types for all supported maps. +- CUP terrain pack support added: Sahrani, Southern Sahrani, United Sahrani, Porto, Utes, Chernarus, Chernarus Summer, Desert, Takistan, Zargabad, Shapur, Proving Grounds, Bukovina, Bystrica, Takistan Mountains. +### Changed +- Upgrading Wood Stud Wall and Tower to Plywood covered versions requires Plywood (ItemPlywoodPack). +- Debug monitor now shows all custom stats dynamically based on 'customVarsDefaults' config. +- Increased angle that the player is able to aim up. +- Drinking Alcohol increases the new "Alcohol" stat instead of directly affecting blood pressure. +- Crafting Hesco barrier now require 3x Burlap. +- Crafting wood and metal spike traps now also require Sticks and a Hydraulic Jack. +- Change all publicVariableServer calls to use remoteExec calls for better performance. +- Removed support for AIA terrain pack in favor of CUP terrain pack. +- Empty fuel barrel added to large trash and vehicle loot tables. +- Earthquakes with mineral veins spawn chances increased with less players. +- Driver or passengers of a driverless can now control vehicle locks. Also, only the owner can control locks from outside of an occupied vehicle. +- Commented out Halloween masks from loot tables. +- Player positions in database now use Epoch precision position functions. +- New Battleye remoteExec.txt for added remoteExec calls. +- if the 5th array element is true 'telePos' config array can now use world position for teleport pads location. +### Fixed +- Previous patch had incorrectly reduced armor values of the Cultist. +- Male(Female) characters lose vest items after equipping opposite sex's vest. +- Secure storage locking mechanism improvements should prevent any unwanted intrusions. +- Reworked login to prevent getting stuck at "waiting for inventory". +- Prevented death just after revive due still having high blood pressure. +- Incorrectly being able to sell/buy items from a dead trader. +- Snakes now require line of sight to bite player. +- Custom epoch swing animations for Hatchet and sledge now work correctly. +- Boss Sapper incorrectly cleaned up before detonation. +- Admin tools map AI markers not working. +- Static propPos campfires not working on Takistan due to disabled simulation. +- When killed instead of saving blank array delete (object, trader, vehicle) data from database. +### Security +- For CUP, use double quotes around mod for spaces in folder Example: -mod="@Epoch;@CUP Terrains - Core;@CUP Terrains - Maps;" +- Removed old .bikey and added new one for 0370. + +## [0.3.6.0] - 2015-12-17 +### Added +- Ability to sell Primary weapon from hands and empty backpacks. Thanks to @He-Man +### Changed +- Increased max player load 2x to compensate for the new stamina system in 1.54. +- Increased backpack storage limits to allow carrying long weapons. +- Weapons will now only spawn with a single magazine and a random ammo count. +- Magazines now spawn with a random ammo count. +- Disable simulation of locked storage devices. This also prevents removal of items until device is unlocked/re-simulated. +### Fixed +- New workaround for inventoryOpened and locked storage protection. +- cursorTarget function to only use new Epoch method while underwater. Should help with targeting issues on land. +- Canceling build mode did not remove the ghost object as it should have. +- Updated Epoch armor stats UI system to support new changes since 1.54. +- Changes to default Arma weapon configs to allow long (Lynx, etc) weapons to be stored in backpacks. +- Unable to sell after attempting to sell a temporary vehicle. Thanks to @He-Man +- Updated Hitpoints for all custom Epoch characters, fixes the hitpoint .rpt errors since 1.54. +- Reduce run speed of Sappers since 1.54 update. +- Wood tower "add/remove wall" options are now only available when build mode is enabled. +- Typo in server side AH event handler code and repacked a3_server_settings.pbo. +- Storage was incorrectly set to set damage to 99% instead of 1%. +- Add player objects to remains collector, this should allow for proper corpse cleanup. +### Security +- Removed old .bikey and added new one for 0360. + +## [0.3.5.0] - 2015-12-09 +### Added +- Metal Floors as upgrade in-place option for wood floors. +- Gender selection screen improvements. +- New interaction system. +- Persistent wood and metal spike traps. +- New custom 3x wide hesco type barrier. +- New custom tank trap. +- Updated version of the Fishing Rod. The reel was too small. +- Documentation on server core framework functions and hive calls. +- muzzle_snds_338_sand to loot and pricing tables. +- Client side master loop is now fully config (CfgMasterLoop) based. +- Ability to fully change default player loadouts via CfgEpochServer configs: +(defaultGoggles, defaultHeadgear, defaultBackpack, defaultVestFemale, defaultVestMale, defaultUniformFemale, defaultUniformMale, itemsInContainers, weaponsInContainers, normalMagazines, weaponsAndItems) +- Server pack Tools folder now contains InstalEpoch.cmd that is an updated version of the command line download Epoch client files download script for steam workshop. +### Changed +- Disable simulation of locked storage devices. This also prevents removal of items until device is unlocked/re-simulated. +- Made wood ramp shorter by about 30% and slightly reduced height of wood towers and stairs. +- Refine ghost preview base building snap checks. +- Players now start with a Quartz radio by default. +- Overhaul of secure storage system to make it faster. +- Increased reverse token check timeout from 90 to 180 seconds. +### Fixed +- Typo in server side AH event handler code and repacked a3_server_settings.pbo. +- Storage was incorrectly set to set damage to 99% instead of 1% to temp force maintenance option after restart. +- Add player objects to remains collector, this should allow for proper corpse cleanup. +- Selection ring now correctly shows damage/decay level of target when build mode is disabled. +- Was unable to use cursorTarget underwater, fixed using new custom made function. +- NPC item trades that cannot fit in the player's inventory will be placed at the feet of the player. +- Not losing Stamina while swimming. +- Removed extra roadway on top of columns. +- Error Zero divisor in client-side master loop. +- .rpt error after gutting animal. +- Dynamic traders did not correctly track the stored vehicle count and limits. +- Force trader data save to save when loading starter items. +- Added private array to all Epoch Event scripts due to feedback. +- Removed forced weather sync on server startup from server init phase so weather changes are now solely dependent on Epoch Events weather script. +- EPOCH_fnc_returnConfigEntry and V2 functions did not use defaults properly. +### Security +- Removed old .bikey and added new one for 0350. + +## [0.3.4.0] - 2015-10-14 +### Added +- The source code for the a3_epoch_server.pbo is now on the GitHub. +- Fishing Pole and ocean fishing also added crafting recipes to allow cooking fish. +- Workbench storage device added and used as a nearby crafting requirement for most Kit based crafting options. +- New secure storage device: The Epoch Safe. +- Totally new crafting system and UI by Raymix. +- Epoch variant of the unarmed Strider vehicle. (I_MRAP_03_EPOCH) +- Broad Sword Melee weapon that can chop down trees and mine rocks. +- Halloween Clown mask and re-added Wolf/Pumpkin masks to loot tables as well as Meeps Candy. +- New Quiet dog bark and whine. +- Example "Epoch Event" Code to provide an example on how to broadcast a message to all players using BE. +- 'CfgTraderLimits' config can control stock limit per trader per item. Default is 100 per item class per trader. +- storedVehicleLimit variable in CfgEpochServer can now control the total max allowed vehicles on traders. Default limit is 20. +### Changed +- Fixed boats spawning on land and added 3d waypoint to purchased vehicle location. +- Removed debug hint text for 3d rotation of objects as it was not needed. +- Re-enable Move button, this system will stay and be refined in the next few patches. +- Dog text format updated. +- Dog whine, instead of bark, when alerting of other nearby players (When player crouched). +- Dog prey kills now use animal looting system. i.e. Dog will loot dead animals, and other objects then will fetch loot. +- Attached weapon (loot) holder is now dropped if dog finds a new one. Needs update. +- Make dog sounds global and use quieter sounds to alert player once dog is tamed. Untamed dog or when attacking is still loud. +- Add occasional quiet dog whine when other players in the area. +- General Dog timeout tweaks to compensate for Arma Animals 'doing their own thing' +- Reworked secure data storage system to be more reliable. (NOTE: This may cause issues with existing lockboxes spawn on the ground with incorrect orientation.) +- Base building maintain option now also maintains storage devices. +- Moved vehicle spawn config that controls how many vehicles can spawn at different location types to settings pbo. See new vehicleSpawnTypes array in the (WorldName).hpp config. +- Use new sort command instead of BIS_fncSortBy. +- Use new worldSize command as default if maps worldSize setting in CfgEpoch does not exist. +### Fixed +- Dog not taming due to var reset in wrong place / BIS animal update. +- Unable to remove lit fireplace. +- Group members unable to lock a Lockbox or Safe that was placed by the group leader. +- Shadow artifact at top of Jammer. +- Reduce client fps lag when first joining the server by preloading objects before exiting loading screen. +- Being unable to remove a solar generator. +- Angry Pumpkin mask was incorrectly visible in first person. +- Issue with Headless clients being treated as players. @dayzai/Face +- Logging to the database was not working due to missing function. +- Issue when trading vehicles that caused the trader data to save data to the wrong slot. +- Added missing prices for female vests. +- Error Generic error in expression in EPOCH_server_repairVehicle. +### Security +- Removed old .bikey and added new one for 0340. + +## [0.3.3.1] - 2015-09-11 +### Fixed +- Energy was incorrectly allowed to fall below 0. +- Typo that prevented small vehicle repair kits from working. +- Issue that caused the wrong base building upgrade-in-place option to be selected. +- Targeting issues with trash, snakes, and dead Sappers. +- Three male vests had invisible texture issues. +- Added check for getAllHitPointsDamage returning a blank array when loading buildings. +- Error in rpt when spawning vehicles if no class was selected. +- EAH was banning revived players incorrectly due to token changed check. +### Security +- Removed old .bikey and added new one for 0331. + +## [0.3.3.0] - 2015-09-11 +### Added +- Basic energy capacity system controls how much power is available based on the type of energy source. +- New upgrade system for Wood Tower, add two lumber packs to add windowed wall. +- 4 new plywood walls as first level base walls. +- Wood Ladder that can be crafted from 4x lumber. +- Wood Tower that can be crafted from a Wood Floor and 4x lumber. +- Solar Generator base item can be crafted from items found in the world. When placed gives passive power within (75m Default). +- New loot/crafting items (Solar Panels, Wire Cables, Battery Box) added to loot tables. +- NightVision now use a static rate of 3 per 10 seconds. This can be changed with 'energyCostNV' variable via CfgEpochClient. +- Max rate of energy gain can be controlled with 'energyRegenMax' variable via CfgEpochClient. +- Max range of energy gain can be controlled with 'energyRange' variable via CfgEpochClient. +- Standard base building upgrade system now supports multiple options and has a basic UI. +### Changed +- Moved client gamemode and CfgFunctions init to mission file. +- Base building upgrade recipes and remove payouts now have dedicated config "CfgBaseBuilding" and code supports over-loading via description.ext. +- Removed base object "Move" in 3d option in favor of a more refined ghost snap mode. +- Server side database functions renamed and now use cfgFunctions via a new pbo "epoch_server_core". +- Increase max payout of Air Drop event loot. +- Make use of new command getAllHitPointsDamage in A3 1.50 to increase the performance of hitpoint data storage. +- Use new A3 command setHitIndex instead of setHitPointDamage so we can use all hitpoints regardless of name. +- Change BIS_fnc_distance2D usage over to distance2D command that was added with A3 1.50 for better performance. +### Removed +- CfgEpochClient removed from description.ext as it can be simply added again from our configs as needed. +### Fixed +- Cultist spawning is now fixed. +- Can now press '2' to disable building snap mode and 1 to re-enable. +- Can now disable base building by pressing Esc or 'gear' menu. +- Normalized snap memory points for wood tower and stairs. +- Loot code for "CfgBuildingLootPos" now uses EPOCH_returnConfig to allow over-loading via description.ext. +- Error in rpt "No geometry and no visual shape" with Poppy and Goldenseal plants models. +- JetSki sinking like a rock since Arma 1.44, fix was to add buoyancy=1 property to GEO lod. +- The angle of snapping was incorrect when building on angles. +- Issue that caused shifting of some base objects after restart. +- Pumpkins on Chernarus incorrectly payout trash loot and now have separate configs for extra trash loot items. +- Color not persisting when picking up corrugated walls. +- Only maintain damaged objects and object health is repaired on maintain. +- CfgEpochClient missionConfigFile version check was incorrectly using configFile. +- Loot object "Blue Tarp" weaponholder proxy position was in the wrong position. +- Reduce base hunger/thirst loss rate by half if players stamina is above 100. Base rate now can be changed with "baseHTLoss" variable in CfgEpochClient. +### Security +- Requires Arma 3 1.50 or higher. +- Removed old .bikey and added new one for 0330. + +## [0.3.2.0] - 2015-09-11 +### Added +- Please welcome our newest team member SteamPunkGears http://www.twitch.tv/steampunkgears +- New food item Tactical Bacon gives 500 hunger. +- Revamped upgraded wood stair model. @SteamPunkGears +- Armor stats for Uniforms, Vests, and Headgear now visible on inventory GUI. +- Consume and Craft buttons added to inventory GUI, allows quicker action and identification of craftable items. +- New custom wood log model. @SteamPunkGears +- New Medicine Cabinet loot object that spawns mostly medical loot. @SteamPunkGears +- Custom Epoch Client function compiler. +### Changed +- Lowered armor on certain base building objects that had way too much armor. +- Increased hunger and thirst loss a bit and you can now die from prolonged lack of hunger or thirst. +- Tweaked stats UI thresholds so that players will now see notifications sooner. Icons are now colorized and flash when at a critical level. +- version.txt added to client files to aid file mirrors. +### Fixed +- Incorrect class for snake prevented killing snakes and looting them. +- Use init eventhandler to remove local snakes and rabbits on spawning as maps other than Altis or Stratis spawn them randomly. +- Dog brain targeting updates for prey like snakes and chickens. +- AirDrops now have there own loot table with better loot payout. +- Bornholm environmental loot configs had incorrect p3d names. Thanks to Robio! +- Missing price value for M-900 helicopter. +- Swap all references of old Rahim 10Rnd 762x51 to 10Rnd 762x54. +### Security +- Removed old .bikey and added new one for 0320. +- Added //new2 to the top of scripts.txt to enable kicking again. + +## [0.3.1.0] - 2015-07-29 +### Added +- Epoch version of the M-900 helicopter with all texture variants. +- Crafting of Energy Packs from electronic components, clean water and near a fire. +- Experimental Sapper Migration Event. +- Increased precision of positions stored in database for Bases, Vehicles, and storage. +- More variations of soldier classes and loadouts (from drone detection). +- CfgBuildingLootPos can be now overridden via missionConfig. +- Weather code migrated into an Epoch Event and code moved to settings pbo. +### Changed +- Lower crafting requirement of cinder block wall, from 4 cinder blocks to 2. +- Removed Epoch setWaves sync code as it should no longer be needed after 1.46. +- Female Ghillies armor, weight, storage now match CSAT male variants. +- Female Wetsuits armor, weight, storage now match CSAT male variants. +- Female Camo Clothes armor, weight, storage now match "Guerilla" gear, like "U_OG_Guerilla2_2". +- Increased loot position bias for all buildings from 15 to 25%. +- Enabled Air Drops. +- Added small chance for primary weapons to be found under green military beds. +- Land_Laptop_device_F can now be used as a Bank terminal. +- Config.cfg requiredBuild and hostname for A3 1.48 +- Added Bornholm blocked areas to main config and description.ext. Thanks to DarthRogue! +### Fixed +- Typo in esseker.h position only had 2 elements of the needed 3 for setposATL. +- Added checks to make sure you can only P2P trade while not in a vehicle. +- Re-add missing AiA TP and Bornholm loot positions. +- Fixed "no config.bin SmokeShellWhite" error when sapper off gasses. +- Environment sounds had been disabled. Removed enableEnvironment false; from client init. +- Can't chop down tall trees. Converted to 2d Distance check. +- Shipping container doors did not open and threw error. Updated to the 1.48 way of opening doors using functions. +- Shoeboxes added to more building on Takistan and any other maps that use the same building classes. +- Vehicle storage space has been normalized. Thanks to Uro1! +- Missing function compile for helicopter Air Drop. +### Security +- Server pbo is no longer obfuscated. + +## [0.3.0.4] - 2015-09-11 +### Added +- Support for Esseker map. +- Support for Takistan and loot positions for more AiA TP buildings. +- Support for Australia Terrain Thanks to the communites of http://uk-gaming-zone.co.uk/, http://thewild.zone, http://www.utomnia.com/ +- More loot positions for AiA TP buildings and updates to existing positions to add pallets and freezers. +- Female characters now have uniform storage once again. +- Server side config for max player Krypto limits. +- Environmental loot checks recoded and now allow for config via description.ext. +- Drone spawn chances reduced. +- Client spawning Sapper and Drone chance can now be controlled via description.ext. +- Server side version check added to CfgEpochClient. +### Changed +- Reduce payouts on scrap metal farming. +- Disabled Vehicle Simulation Handler by default as it does not seem to be needed anymore. re-enable vehicle simulation handler with simulationHandler = true in epochconfig.hpp. +- lower primary weapon spawn chances. +- Lower Krypto value for metal salvage and scraps. +- Disable moving traders by default again (Needs recoding in fsm) +- Increased weight of Cinder Blocks and Mortar Buckets. +- Revert workaround for 1.46 crash fix requires 1.46 build 131265 or higher. +- telepos array now uses modelToWorld offsets instead of world space positions. +- Increased delay between antagonist spawns to 10 minutes. +- Updated description.ext and mission pbos for new cultist configs. +- Updated windows command line example to show usage of -serverMod +### Removed +- Helicopter air drop event code disabled by default as it needs more work. +### Fixed +- Increase range on proximity checks for gear should help with loot target issues. +- Krypto device will now only drop if player actually had Krypto. +- Added missing backpack B_AssaultPack_blk to loot table and pricing. +- Teleport issues on Stratis or any other map with one or less teleport pad. +- Added prevention of using tactical view. +- Unable to sell new 762x54 150Rnd ammo box. +- Energy, krypto stats shown and mouse auto centers once again when opening inventory. +- Recoil_default error on first use of hatchet. +- Weight added to SR-25 and L85A2 rifles. +- Lower base armor on characters to Arma defaults should fix issues with damage reporting. +- Cultist should now spawn correctly and also has a totally reworked code structure. + +## [0.3.0.3] - 2015-05-31 +### Added +- Use starter items array if existing trader loads without any items. +- Example of extended BE settings, will need tweaked if used. +- Latest version of redis-server.exe for Windows v2.8.19.1 from https://github.com/MSOpenTech/redis +### Changed +- Passing a 4th param in propsPos (true) will disable simulation (should be used on objects without doors or other animations) +- propsPos config can now take an array with {vectorDir,vectorUp} instead of azimuth to get precise positioning. +- setvariableval.txt updated to filter player object names and changed logging back to kick. +- Forced disable simulation of most props in altis.h. +### Fixed +- Fix possible crash while using Battleye integration under high load (epochserver.dll and epochserver.so updates) +- Force save of building to fix issue with data expiring while in play. + +## [0.3.0.2] - 2015-05-02 +### Added +- Server side function "EPOCH_serverCommand" can use the following BE commands: shutdown, lock, unlock, message, kick, ban. +- Battleye integration of loadbans and loadevents so (BEC + watchdog) should no longer be required. +- Scripted server restarts now broadcast a message 5 minutes before restart lock the server and message every 1 minute, then kicks everyone with the message "server restarting" before forcing a restart. +- Linux support added. +- Modified Linux start script by BIstudio and Nasdero. +- Major Epoch Anti-Hack updates to make more config based. +- Experimental learning mode to EAH whitelist variable check. Disabled by default as it requires some setup to prevent false positives. +- Battleye integration within the DLL now. (requires battleye IP, port,password in epochserver.ini) +### Changed +- Uniforms now store items again. +- Disabled MD5 check. +- Optimized when writing/reading more than 8K chars to database. +- Traders now move to work and home by default forceStaticTraders = false. +### Removed +- Removed srifle_DMR_03_spotter_F from loots.h as it is missing textures. +### Fixed +- Multiple NPC missions started at the same time caused dupe. +- Typo in killed event handler caused false BE kick. +- Group names may only contain alphanumeric characters - or _. +- Server side trade FSM updated to fix direction issues. +- Marker should now move with trader as they move from work to home. +- Issue with occasional data corruption when saving more than 8k chars. +### Security +- Filter invalid database data input for better security.* +- *pcre3.dll must be installed into the Arma 3 root directory. + +## [0.3.0.1] - 2015-03-14 +### Added +- Damage level of base building objects now based on expiry time. +- The owner of a Frequency Jammer device can now remove and get full refund of Jammer kit. +- Ability to remove normal storage devices (Shelf and Tipi). Items will be dumped on the ground along with a partial refund of crafting materials. +- Edit or add Trader prices "CfgPricing" via the missionConfigFile. (Documentation link) +- Edit or add Crafting recipes "CfgCrafting" via the missionConfigFile. (Documentation link) +- Antagonists spawn system overhaul with spawn bias system. (Documentation link) +### Changed +- Persistence of damage of Base Building and storage objects removed. +- Balance loot and increased chances for explosives. +- Server settings "CfgEpoch" configs are now split based on the map for better clarity. +- Crypto is now only tracked and stored via the server. +- Moved loot configs to epoch server settings PBO. (Documentation link) +- Chance to spawn sapper every 5 minutes (max of 3 within 800m). Chances increase while in a city and if the player is soiled. +- Chance to spawn drone when player fires weapon (max of 3 within 800m). Chances increase while in a city and are reduced if player uses a silencer. +- Initial Sapper spawn distance increased. +- SR-25 and L85a2 use existing ammo now. +- Increased damage for Speargun x2. +- Updated 3d interact system with new icons (Unknown, Dead Body). +- Marker colors for loot events changed to orange. +- lower default NPC starter items. +### Removed +- Removed developer debug from AH admin. +### Fixed +- UAV drone now spawns correctly at a distance so that it is longer audible on spawn. +- Incorrect text output if trader is at max limit for item. +- rvmat texture path issues with Pink L85A2 +- Mission document payout now uses unified loot spawn function. +- Lower example NPC starter items to 50. +- Vehicles didn't spawn in Citys on Bornholm. (Thanks to DarthRogue) +### Security +- Updated example server.cfg for 1.40. + +## [0.3.0.0] - 2015-03-11 +### Added +- Wood and cinder base objects now show damage state when over 50% damaged. +- Car Jack item added to every fresh spawned vehicle. +- Can now loot a dead UAV Drone and in return get Electronic components. +- Ability to specify starter items for freshly spawned traders via epochconfig. +- New custom epoch weapons: SR-25 and L85A2 (Grenade Launcher and Pink Painted) by Kiory. +- Vehicle lock time is now stored in hive and will persist across server restarts. +- 3d interaction visuals to show you when an action is available. +- New loot bias system with nestable tables and overall loot balance. +- LootMultiplier in epochconfig, (0.5 default, 1 = high loot, 0.1 = low loot). +- Goldenseal plant can be consumed to reduce toxicity. +- Pumpkin food item can be harvested from pumpkin patches on Chernarus and found randomly. +- Dynamic Air Supply Drop Event. Use smoke grenades to signal. +- Trader mission accessed with "Talk" on trader: Pikes Peak Express. +- Ability to eat raw foods but at the risk of toxicity. +- New items (Rock, Stick, and Rope) for crafting and added to trash loot. +- New craftable primitive melee weapons: Crude Hatchet, Wood Club, Maul Hammer. +- Keesha default character now has shoes. +- Crafting of Rope from Hemp. +- Harvest Sticks from a bush using a Hatchet. +- Mining of Iron Ore and Rocks with sledgehammer. +- Removal with refund of Base building items. Respects Jammer Owner and group. +- Most base building items now use a hybrid Static/Physx system with ghost preview on first placement. +- Epoch Events 2.0. All server time based events moved to server settings pbo. Scripts are executed with execVM using a simple timer. New events and timers can be changed via epochconfig. +- New "Boss" Sapper variant with a larger bang. +- Both Sapper variants put off toxic gas if killed without blowing up. +- Player can now select gender after each death. +- Frequency Jammer now required by default to build a base. Can be controlled with desc.ext mission variable: buildingRequireJammer. +- Building limit (default: 100) added to Frequency Jammer. Change with desc.ext mission variable: buildingCountLimit. +- Building Jammer Range (default: 75m). Change with desc.ext mission variable: buildingJammerRange. +- Hive weather control system as well as Static override var WeatherStaticForecast via epochconfig. +- Trader purchased vehicle position can now be controlled with a smoke grenade or a chemlight within 50m of trader. +- Wood foundations can be crafted with 8x lumber. +- Bornholm Support: Custom a2 building classes for loot spawns and mission file and config support from http://urogaming.co.uk/ +- Base building objects now persist damage and armor increased substantially. +- Suppress loot spawn within the range of a Frequency Jammer. +- Blocked base building areas for Chernarus. +- Logging of building, storage, and vehicle killed events to hive log. (StorageKilled, VehicleKilled, BuildingKilled) +- Offroad MG Pickup. (Classname: B_G_Offroad_01_armed_EPOCH) +- Server FPS to the debug monitor. (Max: 50, recommend fps are >15 to keep the game stable) +- Chance to spawn Lockbox and Backpacks in lockers or wardrobes. +- Variable when Loadingscreen finish. (EPOCH_loadingScreenDone change from nil to true) +- Base object interact menu (Remove, Move,Upgrade) shown only in build mode after targeting object with Space Bar. +- Admin Tool: Different Map Marker for Vehicles, AI, Player, Loot, Base Building and Dead Player. +- Admin Tool: Different 3D Tools for Player, Vehicles, and Loot. +- Admin Tool: Features: God Mode, Spawn Loot, Teleport In-front. +### Changed +- Toxicity increase from consuming a toxic food item is now random. +- Increased default antagonist spawn chances. +- NPC Trader inventory menu now stacks like items and shows quantity. +- Players are now sent to the lobby after dead, simply press ok to respawn. +- Can now sell and buy uniforms from traders. +- NPC trader data (AI_ITEMS) will now expire in 7 days if no changes are made within that time. Change this with expiresAIdata in epochconfig. +- Added chance to spawn Lockbox and Backpacks in lockers, wardrobes, shipping containers. +- Fireplace recipe changed to require 2 Rocks and 1 Stick to make empty fireplace. Then upgrade with 1 Wood Log to start the fire. +- Player names saved to a separate data set on player connect. +- Deathlog now logs distance and position. +- Sapper's brain reworked. +- Display of personal Crypto balance when opening bank interface. +- Loot Balance: Lowered heavy muzzles count & increased pistol muzzle. +- Increased loot bias for Ferris Wheel and corrected z-height on loot positions. +- Improve Cleanup System on Server. +- Behavior changed on UAV troop support. +- Dog to glitch less, reduced whines and more chance to wander. +### Fixed +- Accuracy and fire rates of custom ported A2 weapons fixed (M107, AKM, M4A3, M16, M14, M249). +- Sharks not spawning off shipwrecks. +- Black icons on admin panel spawn menu. +- Soiled and Wet calculation corrected. +- Pumpkin patches on Chernarus now payout proper loot. +- Traders now only allow one vehicle per trade. +- Alpha transparency issue with empty clone vats. +- Attempt to prevent vehicle damage during server startup. +- Removed fireplace sound for now due to Arma issues with sound cleanup. +- Frequency Jammer can not be built or placed within 3x Jammer radius. (default 225m) +- GUI scale issues with additional button menu (Group Menu, Requests) on inventory. +- Missing sounds on Ruger pistol and removed ability to use silencer. +- Dupe fixes for backpacks, vests, uniforms. +- Player revive did not work even after respawn. +- zasleh1_proxy.p3d error with M4A3. +- Prevent loot objects from spawning under the ground. +- Group kick and mod options did not work. +- Cleanup and removal of unneeded rpt debug logs. +- Removed spoiler button in Welcome Screen. +- Misspelling in debug monitor (crypto). +- Welcome screen will be now displayed only once after a major patch (eg. 0.3/0.4/0.5). +### Security +- Requires Arma version 1.40 or higher. + +## [0.2.5.2] - 2014-12-03 +### Added +- Started on Basic food crafting: Cooked Meat + Sweet corn + empty cooler equals full hunger; returns empty cooler. +- Crafting of Large Energy packs: 3x small energy pack + Circuit Parts and a nearby fire. +- Basic wild plant spawner: Poppy +- New dynamic event object: Ferris Wheel +- Antagonist chances moved to epochconfig. +- Split server events from weather and added separate timers for each epochconfig. +- Direction labels added to teleport pads. +- Epoch Story: Debug area is now Epoch Cloning facility. +- Started support for all "AiA Terrain Pack" maps, starting with Chernarus. +- Support for Krypto account access from classed ATM and phonebooth objects. +- New loot objects: Tarp covered pallet and freezer chest. +- Tree support for Bornholm. +- Player Krypto accounts now expire after 90 days of inactivity. Can be changed with expiresBank. +- Further enhanced DLL logging. +- Paint stripper & building parts pricing have been added to Traders. +### Changed +- Further optimized sound system. +- Optimize cleanup system for more stable server fps. +- Increased the amount of thirst gained from Drinks/Sodas. +- Increased the amount of hunger gained from Can Food and Cooked Meats. +### Fixed +- Better way to track dead state of player. +- Losing group when logging out while dead. +- Revive statistics were not persisting. +- Removed doppelganger code for now, as it was not working as intended. +- Epoch welcome message encoding issue and fixed Scroll bar. +- Parachutes should now be cleaned up. +- Bug in sound system with Cultist caused error that broke master loop. +- False publicVariable kicks that happen since the ArmA 3 update 1.36. (BattlEye Log shows PLAYER_REJECT_NoResponse) +- False script restriction kicks that happen when player destroy electric wire. + +## [0.2.5.1] - 2014-09-11 +### Added +- Control sound volume in-game with Ctrl plus - or +. +### Fixed +- Issue that caused admin panel to bug out and close all dialogs. + +## [0.2.5.0] - 2014-11-28 +### Added +- Custom single seater "Mosquito" Light helicopter. +- Consumables can now give the player multiple attributes on use. +- Honey can now be consumed and an empty jar is returned. +- Empty Food cooler added. To be used with food crafting. +- Metal Scraps added and can be found in many places as well as crafted into Salvage Metal. +- 3 new Soda cans some with unique attributes. +- Player Krypto account added. Accessed by pressing the Inventory key next to a phonebooth or an ATM. Larger the transaction the longer it takes. +- Custom Weapons: AK47, M14, m249, m107, m4a3 ported from Arma 2. +- Camo version of the female wetsuit. +- Female Ghillie Suits Tan, Light Green, Dark Green. +- SteamAPI support added for future features and VAC ban check system. +- In-game Admin Panel cleanup and features added: Spawn Menu, 3D ESP, Map ESP, Basic Admin levels. +### Changed +- Removed all "Take" and "Rearm" actions to prevent taking items from locked vehicles. A new take option will be added soon to allow item access underwater. +- Sledge Hammer damage increased 2x. +- Loot now spawns more readily. +- Loot table tweaks to increase building materials. +- setTimeMultiplier 4x enabled by default. Can be changed with timeMultiplier in epochconfig. +- Shelf, tipi, and Frequency Jammer are now built using the PhysX build mode. +- Combat Logging: Players now leave a Doppelganger behind for 60 seconds after disconnect. This can be changed or disabled in epochconfig.hpp server side. +- Death trigger now spawns shark if player is killed at sea. +- Added Override vars to epochconfig that control object expiry. vehicle, building, storage (7 days), players (30 days). +- Vehicle slots limit now based directly on total of per vehicle counts in allowed vehicles list. +- Reworked backend of NPC trader mechanism to be more accurate and optimized. +- Land vehicles now spawn in cities near roads instead of anywhere on roads. +- Many performance and security changes server side. +- Vehicle save queue system for better performance. +- Seasonal items like Meeps and Halloween masks removed from loot tables. +### Fixed +- UAV's are no longer static and now move like they are supposed to. +- Fully disabled thermal equipment for all vehicles. +- Geometry of walls changed to help reduce glitching. +- Disallow Holster and GetOver action near base walls, to reduce wall glitching. +- Global setdamage event with Communication towers. +### Security +- Reworked server configs. InstanceID is now set in EpochServer.ini and the rest in epochconfig.hpp now found in @EpochHive folder. + +## [0.2.0.1] - 2014-10-29 +### Added +- Added crafting of Salvage Metal from Iron Ore found at mineral veins. +- Added proper ghost models for TiPi and shelf. +### Changed +- Updated Red Gull Texture and Icon. +- Increased chance to find Mortar Buckets. +- Ctrl+T now used for Trade requests to other players. +### Fixed +- Traders spawning smoke grenades after selling them. +- Just built base objects now use player direction for initial object direction. +- Player logs out while dead will now correctly spawn fresh on login. +- Global setdamage event on powerlines. +- Traders can no longer spawn on top of each other. +- Multiple players could double spawn loot in the same building. +- Can now build Frequency Jammer properly. +- Player rollback after revive and relog. +- Many server side fixes. + +## [0.2.0.0] - 2014-09-29 +### Added +- Two Halloween masks Pumpkin head and Werewolf. +- Fireplace model. +- Custom Anti-Hack Framework by Skaronator. +- Replacement First Aid Kit double click on the item and use. Heals other players or your self. +- Wooden Ramp/Roof base object can be crafted with 6 lumber packs. +- Three new food items: Snooters and Meeps Candy and Walk N' Sons Soda. +- Electric Motorcycle has been added. +- Car Jack added and has a chance to be found in freshly spawned vehicles. +- New lootable furniture "Shoebox" added. +- Military variant of the bed now spawns in specific military buildings. +- Unisex vest called "side pack". All fresh spawns start with this item. +- Group request menu, Group requests can now be accessed via the "Requests" button in the inventory. +- Player trading now started with the inventory key (Default "I") and accepted with the "T" key. +- Use paint cans to paint corrugated walls and use paint thinner to remove paint. +- Wood stairs upgradable for additional landing area. +- Circuit Parts found in the world to be used for crafting. +- Lockable Cinder And Wood Doors upgrade with Circuit Parts. Ownership is controlled by frequency jammer group owner. +- 9 more radios have been added and can be crafted using gems. +- Many Inventory items now have proper icons instead of placeholder. +- Give player energy if within 75m of a solar tower or wind tower. +- Temp Lockable vehicles each time you lock a vehicle it will remain locked to you or your group for 30 minutes. +- Base building objects get deleted after 7 days. Moving the object or Painting walls extends this for 7 more days. +- Player Character are cleaned up after 30 days inactivity. +### Changed +- "T" key action moved to Inventory Button. Use your inventory key (Default "I") once to smash trash piles and again to open gear. +- Increased storage of all vests by 50% and reduced armor by half. +- Building base objects from inventory kits now instantly forces build mode and consumes item. +- P2p trading now more reliable, however now places traded items at your feet. +- Reduced Dog and snake spawn chances. +- Respawn button disabled. +- Increased Building material spawns on trash piles. +- Increased chances for Tools to spawn on Tool Rack. +- Hunger and Thirst loss rates increased. +- Increased purchase price of Ammo by a total of 100%. +- Reduced Hunter armor levels by 50%. +- Trader "Steal" option removed for now. +- Traders now only wear uniforms that spawn in the world. +### Removed +- Hellcat Helicopter and and Nightstalker scope till balance issues are sorted. +- Uniform storage space and selling of uniforms to traders removed due to dupe issues. +### Fixed +- Mineral veins now spawn at epicenters. +- Geometry changed on cinder wall to prevent phasing though it +- Lockbox can no longer be destroyed while open. +- Dump items on the ground if packed with items in lockbox. +- Overflow items to the ground if player does not have space when trading with another player. +- Added prices for Chainsaw so it is now possible to sell/buy to traders. +- It wasn't possible to snap the foundation to other foundations. +- Group Leader can no longer enter the commander vision. +- false PublicVariable Restriction on server start. +- Night Vision wasn't disabled when the player run out of energy. +- Added prices for Karts so it is now possible to sell/buy to traders. +- Shelf and Tipi storage devices are no longer indestructible and have limited storage space. +- Trader purchased vehicles should now look for a safer place to spawn vehicle within 120m. +- Text output from certain actions now show proper display names instead of classnames. +- Vehicles now persist exact position, angle, and direction so it should result in less damage at spawn. +- Some false BE kicks for base building. +### Security +- new bikey for 0.2 added remove any previous ones. +- Improved backend DLL by Fank + +## [0.1.0.3] - 2014-09-25 +### Added +- Whitelisting removed. +- carts DLC content added go-karts, helmets, uniforms. +- Snake bite sound. +- Gender Selection. +### Changed +- Dog brain fixes and optimizations. +- Shark brain fixes and optimizations. +- Cultist and Sapper are now looted with Inventory button instead of T. +- lowered group invite distance to only 10m. +- Removed rating and score from debug as they are not currently used. +- Lower Hunter hit point armor levels a bit in an attempt to balance. +- Lowered animal spawn rate. +### Fixed +- Sniper rifle scope attachment issues. +- Further fixes to group invite system. +- Removed leftover debug systemchat text spam from Sapper brain. +- Incorrect model for jerrycan and locker. +- Texture on wardrobe. +- NVG did not disable correctly after running out of energy. +- Reduced global variable spam from p2p trade system. +- Gumby leg bug with jump animation and crtl+w. +- Many other fixes and security changes. + +## [0.1.0.2] - 2014-09-13 +### Added +- New Dog Brain with many new features. http://epochmod.com/forum/index.php?/topic/17052-dog-brain-0102/ +- More event driven chances to spawn antagonists. +- Great White Shark. +- Speargun found only in boats. +- NVG goggles now require Energy to use (5 Energy every 10 sec). +- Alert sound to drones when they spot you. +- AI Soldiers should now attack you even in a vehicle. +### Changed +- Suppress some group leader options by disabling use of 0-9, f1-f12, backspace, and commandmode. +- Code lockout added to Take Krypto code to prevent spam. +- Improved quality of Shipwreck and pelican loots. +- Disabled side chat on all servers, use Quartz radio instead. +- Furniture spawning moved client side for better server performance. +- Added cleanup on furniture, weaponholders, and Krypto devices every 20min if no players within 45m. +- Group System - Invite List is alphabetically sorted. +### Fixed +- Fixed typo that caused storage devices not to save correctly. +- Overhaul of vehicle selling code to prevent issues. +- incorrect scope with ItemKiloHemp. +- Fixed and improved group system. +- Double click action button text had incorrect text for some items like "Vehicle Repair Parts". +- Fixed UI icons disappearing due to conflicting resource layer with dynamic text. +- Added workaround for players not saving due to specific character in player name. +- When first building a base item it will spawn as simulated and start to save. +- Only allow owner or members of group to upgrade-in-place base objects if a Frequency jammer is placed. +- Players can now trade Krypto using P2P trade menu. +- P2P trading now correctly removes weapons from backpacks. +- AI soldiers now spawn with the correct radio, vest, and hat. +- Random traders can no longer occupy the same building. +- Preview of building objects now use proper ghost preview models. +- "Mine" trader city teleport point moved so that protection zone covers area. + +## [0.1.0.1] - 2014-09-11 +### Added +- Test adding mineral spawns at a 30% chance to earthquakes epicenters. +- Added spawning of semi-secure lockbox storage (shared with your group) (only owner can pack). +- Loot added to Sapper and Cultist (press "T" to loot dead body). +### Changed +- Reduced multi-gun ammo count to 10 from 99. +- Increased crafting requirements on many base items (it was kept low for testing). +- Lower chances to spawn Dogs and lowered animal spawn limit from 6 to 3. +- Shipping containers now have more loot and (building mats & backpacks). +- Removed ammo and weapons from Fridge and stove. +- Increased cultist and Sapper armor levels. +- Try to find a better place to spawn purchased vehicles. +- Player must be local (last driver) to sell a vehicle. +- Increased range for buying and selling vehicles. +- Lowered volume on Dog and Chicken sounds. +- Server side tax rate on NPC trader purchases (currently 10%). +- Manipulating base objects now have varying energy consumption. +- Disable simulation on any ThingX props at Trader cities. +### Fixed +- Incorrect path for snake corpse model. +- Fixed double chickens. +- Frequency jammer (Plot pole) now works for both owner and group members. +- Group invite system. +- Missing alert sound added to Sapper. +- fixed description for .22 Ruger. +- Check for invalid player data and revert to default (fixes some bugged players issues with joining servers). +- fixed AI cleanup on player disconnect.