Jump to content

celery

Member
  • Content Count

    5142
  • Joined

  • Last visited

  • Medals

  • Medals

Everything posted by celery

  1. So what's the formula or command to turn a vectordir array into degrees?
  2. I made this little script to browse faces quickly and in hi-res. :) The script is relatively user-friendly: use the mouse wheel to browse faces and left or right click the mouse to cycle between camo variants and press the wheel to change between vanilla and expansion faces. You will see the face's name in the hint box. Download mission Place the folder into your My Documents\ArmA 2 Other Profiles\Username\missions folder and load the mission in the editor under Desert.
  3. Voice actors forum group Find actors or become one! Voice acting can dramatically boost a mission's immersion if the actor has an even somewhat good microphone. Finding voices for your mission or campaign can be a long and difficult process because the few that see your request somewhere on the editing forums might not fit all the roles you had in mind and the mission's release gets postponed until a suitable voice is found. The Voice actors forum group is an initiative with the goal of gathering all willing voice actors into one place to make it easier for them to get their voices heard and for mission makers to find suitable voice actors more efficiently. If you want to benefit the community by offering voiceovers, join the forum group and write about yourself in the group's thread or if you're brave, advertise yourself in this one! If you're a mission maker, feel free to browse the members and send PMs to those that you think would suit your mission's voiceover roles. It would be great if the group got bigger and became the foremost hub for offering and requesting voice talent. Making immersive missions would become that much easier and it's a great way for aspiring professionals to add something, even little things such as this, to their CV. I think it would do no harm if this thread was also used for offering and requesting voice acting for projects.
  4. part three Map: Chernarus Players: 1-10 Story: Yesterday morning, you escaped Berezino in an armored car after being abandoned by a group of survivors. You arrived in Polana, a relatively zombie-free village, and stayed there for a day. Zombies have begun increasing in the area, so you need to move on. The map you got from the survivors a week ago has a marker over Black Forest. It could be a safehouse or munitions cache for all you know, so that's where you're going. Description: This is a zombie coop mission with specific objectives and one life per character. Equipment and munitions are scarce and the enemy is dangerous and numerous, which promotes tactics, teamwork and good shooting. The zombies are resistant to bullets, and only a headshot is a reliable way to kill them. This part tests your ability to stay calm and functional under anxiety-inducing conditions. Other parts of the series: Dawn of the Apocalypse, the single player prologue mission Dawn of the Apocalypse, COOP version Part one Part two Features: Addon-free but convincing zombies Black Forest in all its blackness Several zombie behavior types Player characters have unique equipment and diaries Custom healing script with shareable bandages Zombies may drop bandages and magazines Pistols are accurate Selectable friendly fire damage rate JIP players start close to the group Character gear, bandages and damage are saved in case a player disconnects Spectator mode after death You can continue the game after dying by picking a new character slot Credits: Mission and scripts: Celery Apocalypse series concept: Zipper5 and Celery Noises and screams: Thief II: The Metal Age and freesound.org 3rd party music: Thief: Deadly Shadows soundtrack composed by Eric Brosius Antonio Cora - The Cellar Shadow Sneaker - Dreams of Dead Thoughts Shadow Sneaker - Midnight Whispered My Name Requirements: ARMA 2 and Operation Arrowhead (version 1.60) Mod compatibility: The mission has been designed to run without mods but should work fine with most mods. ACE is accommodated by removing the stamina feature. Installation: Put the pbo file into your ArmA 2\MPMissions folder. >Download version 1.4< Changelog: OFFICIAL STRATEGY GUIDE Disclaimer: I made this mission in the capacity of a private community member with no official interaction with Bohemia Interactive.
  5. A simple serverside script for cleaning up the mess. You can set the removal time for bodies and vehicles, and prevent either type from being removed with the value 0. Just put [60,120] execVM "cly_removedead.sqf" in your init script and corpses will vanish after one minute and vehicle wrecks after two. If you want to exclude an individual unit or vehicle from this script, give it the good old this setVariable ["CLY_removedead",false,true]. If you want to remove it immediately upon death through this script, use this setVariable ["CLY_removedead",true,true]. An option to prevent the removal of units with any or specific gear has been added, instructions in script. cly_removedead.sqf /* CLY Remove Dead by Celery Removes dead units and vehicles from the battlefield. Version 2011.10.28 The script is less functional in plain Arma 2 because it lacks the allDead command. In plain Arma 2 the script... - is probably a little heavier - doesn't remove vehicles or animals - lacks the hideBody transition due to its bugged nature in Arma 2 Free Execute in init script: [60,0,true] execVM "cly_removedead.sqf"; [wait time for men,wait time for vehicles,remove units with gear (optional, default true)] execVM "cly_removedead.sqf"; A wait time of 0 prevents that type from being removed. Prevent an individual unit from being removed: this setVariable ["CLY_removedead",false,true] Remove an individual unit immediately upon death: this setVariable ["CLY_removedead",true,true] Use the CLY_ignoregear array to define gear classnames that don't prevent a unit's removal when only gearless bodies are removed. Alternatively, use CLY_keepgear to define gear that prevents removal when geared unit removal is enabled. Remember correct upper and lower case in classnames or it won't work! Check config browsers if not sure. */ if (!isServer) exitWith {}; CLY_ignoregear=["ItemRadio","ItemCompass","ItemWatch","ItemMap","ItemGPS"]; CLY_keepgear=[]; CLY_noremovegear=[]; _oa=isClass (configFile/"CfgPatches"/"CA_E"); _manwait=_this select 0; _vehiclewait=if (count _this>1) then {_this select 1} else {_manwait}; CLY_removegeared=if (count _this>2) then {_this select 2} else {true}; CLY_removedeadpending=[]; CLY_dontremovedead=[]; CLY_dontremovedeadremove=[]; publicVariable "CLY_dontremovedeadremove"; //Spawnable script _removedead={ _unit=_this select 0; _wait=_this select 1; sleep _wait; waitUntil {isNull flag _unit}; _gear=if (_unit isKindOf "Man") then {(magazines _unit+weapons _unit)-CLY_ignoregear} else {[]}; if (isNull _unit or _unit in CLY_dontremovedead or (CLY_removegeared and {_x in CLY_keepgear} count _gear>0) or (!CLY_removegeared and count _gear>0)) exitWith { CLY_removedeadpending=CLY_removedeadpending-[_unit]; }; if (_unit isKindOf "Man" and isClass (configFile/"CfgPatches"/"CA_E")) then { hideBody _unit; _removetime=time+8; while {getPos _unit select 2<0.2 and time<_removetime} do {sleep 0.1}; }; CLY_removedeadpending=CLY_removedeadpending-[_unit]; deleteVehicle _unit; }; //Loop _allunits=[]; _alldead=[]; while {true} do { if (!_oa) then {_allunits=allUnits}; sleep 1; if (!_oa) then { {if (!alive _x) then {_alldead set [count _alldead,_x]}} forEach _allunits; {if (isNull _x) then {_alldead=_alldead-[_x]}} forEach _alldead; } else {_alldead=allDead}; { if (isNil {_x getVariable "CLY_removedead"}) then { if !(_x in CLY_removedeadpending) then { _wait=if (_x isKindOf "Man") then {_manwait} else {_vehiclewait}; _gear=if (_x isKindOf "Man") then {(magazines _x+weapons _x)-CLY_ignoregear} else {[]}; if (_wait>0 and ((CLY_removegeared and {_x in CLY_keepgear} count _gear==0) or (!CLY_removegeared and count _gear==0))) then { [_x,_wait] spawn _removedead; CLY_removedeadpending set [count CLY_removedeadpending,_x]; }; }; } else { if (_x getVariable "CLY_removedead") then { if (vehicle _x==_x) then { CLY_removedeadpending set [count CLY_removedeadpending,_x]; [_x,0] spawn _removedead; _x setVariable ["CLY_removedead",nil]; }; } else { CLY_dontremovedead set [count CLY_dontremovedead,_x]; _x setVariable ["CLY_removedead",nil]; }; }; } forEach _alldead-CLY_dontremovedead; if (count CLY_dontremovedeadremove>0) then { CLY_dontremovedead=CLY_dontremovedead-CLY_dontremovedeadremove; CLY_dontremovedeadremove=[]; publicVariable "CLY_dontremovedeadremove"; }; };
  6. HandleDamage event handler explained There has been little documentation about how the "HandleDamage" event handler exactly works and as a consequence its use has been scarce and its potential untapped. I myself understood it properly only recently while perfecting the damage model for an upcoming zombie mission. So here goes. The passed array _this select 0: Unit the EH is assigned to _this select 1: Selection (=body part) that was hit _this select 2: Damage to the above selection (sum of dealt and prior damage) _this select 3: Source of damage (returns the unit if no source) _this select 4: Ammo classname of the projectile that dealt the damage (returns "" if no projectile) Infantry selections "": The overall damage that determines the damage value of the unit. Unit dies at damage over 0.9. "head_hit": Unit dies at damage over 0.9. "body": Unit dies at damage over 0.9. "hands": Unit doesn't die with damage to this part. "legs": Unit doesn't die with damage to this part. The "" part is the reason why consecutive leg hits are fatal. Whenever the unit is hit, "" gets damage based on the power of the hit with no other modifiers. Wherever you hit the unit, it will die when this overall damage quota is up. You will notice that when shooting at a unit's feet (with e.g. a Makarov) it will almost always die after the same amount of rounds. How the EH fires The event handler fires multiple times at the same time when the unit is damaged, once for each selection. The sequence is always the same, the sequence for infantry being the same as in the selection list above. Only the current selection and its damage are remembered during each activation unless you assign variables to them. If a selection is not damaged at all and there are no damaged selections after it in the sequence (e.g. a shot in the head without damage to legs), the EH doesn't fire for that selection. Manipulating damage The last value given in the EH's code is the damage that it gives for the current selection. For example, this addEventHandler ["HandleDamage", {_this select 2}] will have a unit receive damage as if it didn't have the event handler at all. Changing _this select 2 to 1 will make the unit die however minor the original damage was, while this addEventHandler ["HandleDamage", {}] makes the unit invulnerable to all damage. You can allow damage to specific selections by passing a damage value if the selection is of a certain type: this addEventHandler ["HandleDamage", {if (_this select 1 in ["head_hit", "legs"]) then {_this select 2}}] will pass only the damage that the head and legs were dealt. If the code is too complex to be written into the EH itself, only callable scripts should be used for the purpose of determining damage because the damage has to be given in the EH's code. Poor man's getHit Until BI is kind enough to give us a command to return the damage of individual selections, HandleDamage is the best workaround. This EH will assign the "gethit" variable to a unit. As a bonus, there's a damage modifier included free of charge, just change the blue value! Add this to a unit: _unit setVariable ["selections", []]; _unit setVariable ["gethit", []]; _unit addEventHandler [ "HandleDamage", { _unit = _this select 0; _selections = _unit getVariable ["selections", []]; _gethit = _unit getVariable ["gethit", []]; _selection = _this select 1; if !(_selection in _selections) then { _selections set [count _selections, _selection]; _gethit set [count _gethit, 0]; }; _i = _selections find _selection; _olddamage = _gethit select _i; _damage = _olddamage + ((_this select 2) - _olddamage) * [b][color="#0000FF"]1[/color][/b]; _gethit set [_i, _damage]; _damage; } ]; To get the damage of a selection: _index = _unit getVariable ["selections", []] find [color="#B22222"]"nameofselection"[/color]; _damage = if (_index >= 0) then { _unit getVariable "gethit" select _index; } else { 0; }; Remember that event handlers will carry on to respawned units as do setVariables, so the "selections" and "gethit" variables should be set to [] again at respawn as well as when the unit gets healed or repaired.
  7. part one Map: Chernarus Players: 1-10 Description: This is a zombie coop mission with specific objectives and one life per character. Equipment and munitions are scarce and the enemy is dangerous and numerous, which promotes tactics, teamwork and good shooting. The zombies are resistant to bullets, and only a headshot is a reliable way to kill them. This part requires you to focus on tactics and fire discipline. Story: Most of Chernarus has been overrun by zombies. Shortly after the outbreak began, the world was alerted with an emergency transmission and a quarantine was attempted by the CDF, Russia, NATO and hired professionals. The quarantine failed after 22 hours and all surviving units retreated to protect the capital region except for the Russians who have a long border with Chernarus to the north. You are one of the few survivors left in South Zagoria, the ground zero of the outbreak, and have been waiting for a passing ship or other form of help on the eastern shore in vain. Just a moment ago, you picked up a plea for help over the radio requesting assistance at the Olsha hill radio tower. You must go northwest and investigate. Chernarus Apocalypse series: Dawn of the Apocalypse - SP: http://www.armaholic.com/page.php?id=12135 Dawn of the Apocalypse - Coop: http://www.armaholic.com/page.php?id=15523 Chernarus Apocalypse, part one: http://www.armaholic.com/page.php?id=14211 Chernarus Apocalypse, part two: http://www.armaholic.com/page.php?id=14632 Chernarus Apocalypse, part three: http://www.armaholic.com/page.php?id=15372 Features: Addon-free but convincing zombies Several zombie behavior types Player characters have unique equipment and diaries Custom healing script with shareable bandages Zombies may drop bandages and magazines Pistols are accurate Selectable friendly fire damage rate JIP players start close to the group Character gear, bandages and damage are saved in case a player disconnects Spectator mode after death You can continue the game after dying by picking a new unit slot Pacifist or partial stealth run is very hard but possible Credits: Mission and scripts: Celery Apocalypse series concept: Celery and Zipper5 Voice acting: Rejenorst (www.rejenorst.com) Music: Thief: Deadly Shadows soundtrack composed by Eric Brosius Noises and screams: Thief II: The Metal Age and Operation Flashpoint: Cold War Crisis Fog script: Rockhount (original by Yac) Requirements: Arma 2 Operation Arrowhead Army of the Czech Republic DLC: http://www.armaholic.com/page.php?id=17321 Mod compatibility: The mission has been designed to run without mods but should work fine with most mods ACE is accommodated with the removal of its stamina feature WARNING: DayZ makes you spawn as a bird because it erases classes used by the rest of the game! Installation: Put the pbo file into your ArmA 2\MPMissions folder. >Download version 1.5< Changelog: OFFICIAL STRATEGY GUIDE
  8. The Day of the Camel Author: Celery Map: Zargabad Players: 1 Description: A warlord has set up base in a small town and the community of that town has hired you to take him out. Obtain the means to kill your target, neutralize him and leave the town. The guards in the town don't know that you're an assassin, but they'll catch wind if you behave aggressively or otherwise out of place. You can finish the mission by slaughtering everyone or without being detected at all, or something between those two extremes. Features: - A custom-made stealth system that resembles that of the Hitman game series - Holster script for hiding your pistol - Fully and professionally voiced dialogue Requirements: - Arma 2 - Operation Arrowhead Known issues: The walking loop may freeze for some unknown reason. Try restarting the mission with or without the beta patch. Installation: Put the pbo file into your ArmA 2\Missions folder and find the mission in your single player scenarios menu. >>>Download the mission<<< Changelog:
  9. I just thought I'd share this. :) Put this in the init field of the desired unit: this addEventHandler ["Fired",{[_this select 0,getNumber (configFile/"CfgAmmo"/(_this select 4)/"explosive")] spawn {if (_this select 1==1) then {sleep 0.75};_this select 0 setVehicleAmmo 1}}] And it will have unlimited ammo with no need to reload, no scripts or anything else required! Works on vehicles, too. There is a check for explosive ammo to limit the full auto spammage of rocket and grenade launchers, but the sleep time can be edited or deleted. :p
  10. This thread is for discussing my future pvp missions in Arma 2. I will release public beta versions here for evaluation. Beta missions released: Tequila Sunshine v0.86c Ranch III v0.86c UAV Rage v0.84 Road Rage v0.81 Deathmatch Plus v0.88 Shipment v0.89b Vodka Fest v0.90a Vanilla: Chernarus v0.90 Browse the thread for newer releases as I'm too lazy to update this post.
  11. If you're encountering a mysterious malfunction in your scripts, the first thing you should do is put the -showScriptErrors parameter in your Arma 2 shortcut's target line. It will enable you to see script error output in the top part of your screen. An error message will a) help you solve the problem yourself, or b) help us solve it for you without needless guessing and elaborate proofreading.
  12. CLY Jukebox This script will play music tracks in succession. You can define the order of the tracks, their starting point and when they end. You can choose whether the list plays just once or loops, or you can choose to have them play indefinitely and randomly. The script also remembers the progress of a track when you pause or save a game, and the track will resume from where it left off when the game is unpaused or loaded. Normally pausing causes the track to skip and savegames don't store audio progress. Execute the script like this: 0=[0,["EP1_Track08",63,134,1],["EP1_Track14",0,255,0.8]] execVM "cly_jukebox.sqf" [<0: no loop 1: loop 2: play random tracks indefinitely>,["track name",start mark,end mark,volume 0-1],[...]] You can pause the music with CLY_jukeboxpause=true, which enables you to play some other track in the meanwhile, and CLY_jukeboxpause=false will resume playing the jukebox from where it left. Stop the script with CLY_jukeboxkill=<fade out in seconds>. Starting a new jukebox will automatically end the current one. cly_jukebox.sqf //CLY Jukebox by Celery // //This script will let you play several music tracks in succession. //Loading a savegame or visiting the ESC menu will not disrupt the music. // //Requires // onPauseScript="cly_jukebox.sqf"; //in description.ext. // //Execute anywhere when needed with the required arguments. // //Example: //0=[0,["EP1_Track08",63,134,1],["EP1_Track14",0,255,0.8]] execVM "cly_jukebox.sqf" //Arguments: //[loop,["track name",start mark,end mark,volume],[...]] //Loop: <0: no loop 1: loop 2: play random tracks indefinitely> // //You can stop the script with CLY_jukeboxkill=<fade out in seconds> //CLY_jukeboxkill=5 will fade the music to zero in 5 seconds and the script ends. // //You can pause the script with CLY_jukeboxpause=true and unpause with false. //////////////////////////////////////////////////////////////////////////////////// //Resume track at correct mark after ESC or load if (typeName (_this select 0)=="DISPLAY") exitWith {CLY_jukeboxresume=true}; if (isNil "CLY_jukeboxresumescript") then { CLY_jukeboxresumescript=[] spawn { while {true} do { _loadcheck=[] spawn {disableSerialization;waitUntil {false}}; waitUntil {scriptDone _loadcheck}; CLY_jukeboxresume=true; }; }; }; _loop=_this select 0; _tracks=[]; {if (typeName _x=="ARRAY") then {_tracks=_tracks+[_x]}} forEach _this; if (count _tracks==0) exitWith {hint "No tracks recognized by CLY Jukebox!"}; _i=-1; _track=""; _lasttrack=""; _volume=1; _fadein=0; _fadeout=0.3; _trackstart=0; _trackstarts=0; _trackend=0; _trackends=-1; _duration=_trackend-_trackstart; _resumedata=["",0]; //ID number of the script: prevents two scripts from running in parallel if (!isNil "CLY_jukeboxid") then {CLY_jukeboxid=CLY_jukeboxid+1}; if (isNil "CLY_jukeboxid") then {CLY_jukeboxid=0}; _jukeboxid=CLY_jukeboxid; //Kill switch: set to 0 or more and the jukebox will fade out in that many seconds CLY_jukeboxkill=-1; //Pause flag CLY_jukeboxpause=false; //Resume flag: will be true and makes music resume correctly when game is paused or loaded CLY_jukeboxresume=false; scopeName "main"; while {CLY_jukeboxkill<0 and CLY_jukeboxid==_jukeboxid and (_loop>0 or _i<count _tracks)} do { //Select track if (time>_trackends) then { _i=_i+1; if (_i>=count _tracks) then { if (_loop==0) then {CLY_jukeboxkill=1;breakTo "main"} else {_i=0}; }; _trackdata=[]; if (_loop!=2) then { _trackdata=_tracks select _i; } else { _trackdata=_tracks select floor random count _tracks; while {_loop==2 and count _tracks>1 and _trackdata select 0==_lasttrack} do { _trackdata=_tracks select floor random count _tracks; }; }; _track=_trackdata select 0; _trackstart=_trackdata select 1; _trackend=_trackdata select 2; _volume=_trackdata select 3; _duration=_trackend-_trackstart; _fadein=0; if (_trackstart>0) then {_fadein=0.2}; _fadeout fadeMusic 0; sleep _fadeout; _fadeout=1; if (CLY_jukeboxkill>=0 or CLY_jukeboxid!=_jukeboxid) then {breakTo "main"}; _fadein fadeMusic _volume; playMusic [_track,_trackstart]; _lasttrack=_track; _trackstarts=time; _trackends=time+_trackend-_trackstart; _resumedata=[_track,time-_trackstarts+_trackstart]; }; //Resume if ESC or loadgame if (CLY_jukeboxresume) then {playMusic _resumedata;CLY_jukeboxresume=false}; _resumedata=[_track,time-_trackstarts+_trackstart]; //Jukebox pause if (CLY_jukeboxpause) then { 1 fadeMusic 0; sleep 1; waitUntil {!CLY_jukeboxpause}; if (CLY_jukeboxkill<0 and CLY_jukeboxid==_jukeboxid) then { 1 fadeMusic _volume; playMusic _resumedata; } else { breakTo "main"; }; }; sleep 0.05; }; if (CLY_jukeboxkill>=0) then {CLY_jukeboxkill fadeMusic 0}; description.ext: onPauseScript="cly_jukebox.sqf";
  13. Then disable it for the duration of your playthrough please.
  14. Are you using any mods that affect AI behavior?
  15. celery

    Why in multiplayer no team balance?

    Because it's annoying as hell for the players and scripting it would be a pain in the ass if not impossible without breaking something else in a mission. Players themselves have some responsibility in how they pick their sides.
  16. celery

    UAVs: Feedback and wishes

    Issues: Darter moves unacceptably slowly when under AI control – under player control it can move ~70 km/h Darter's yaw rate is way too slow Darter has effectively unlimited fuel when you put it in your backpack and back on the ground Waypoint completion radius is too big for Darter If you want to take over a UAV's gunner in the terminal, you have to go through its pilot first No speed setting Altitude options are named too vaguely ROE and altitude can't be changed without waypoints You become an enemy of the state if you crash a UAV – this feature has never been useful even for proper aircraft CAS plane doesn't know what to do with its laser designator or laser-guided bombs(?)
  17. It's infected, not zombie.
  18. Back in the 90s, a gaming PC was rendered obsolete within a couple of years. These days a mid-range PC from 2009 can run most games fine unless you specifically want to play Crysis, Arma & co. I'm not sure what hardware today's casual PCs have, but it has to be pretty low-budget if what you're saying is correct.
  19. The script was not made for Arma 3. If you want an Arma 3 removal script, open one of my deathmatch missions.
  20. celery

    At least a few "exotic" weapons?

    I believe the point of having old or civilian-grade weapons is to broaden the spectrum for different scenarios that don't focus on conventional warfare. Currently there aren't good ways to convey a ragtag paramilitary group in practical terms because all the game's rifles inhabit the same demigod tier of automatic, high-powered and modular tools of mayhem. Imagine if Arma 2 only had Mk16s and Mk17s.
  21. What if a tournament admin starts antagonizing certain players by vandalizing their forum accounts and disrupting their voice comms? I had that happen to me and my friends some years ago in IC/CF, and none of the other admins were inclined to do anything about it (except short-term reversals of said misdeeds) because the offending admin was their buddy.
  22. celery

    Is the 40mm lethal enough?

    You mean its damage somehow increases the longer I use it or what? Because in the other parts of the Arma series it's a pretty effective area of effect weapon, not so in Arma 3. I've already had plenty of situations where I should've landed the grenade close enough to kill my opponent, but he instead shrugged it off and proceeded to kill me the more simple way.
  23. celery

    Is the 40mm lethal enough?

    The UGL seems to be fairly useless in Arma 3.
  24. Jet Rage - Aerial awesomeness for 2-20 players No, Jet Rage isn't about the community response to the number of jet-propelled aircraft at Arma 3's release. Jet Rage is about jet combat where you can concentrate on the action itself. No pilot has those pesky missiles at respawn: they have to earn them by visiting the airbase. You don't have to search for your enemies: you see them clearly on your HUD. Rearming and repairing isn't a chore: you just do some cool low-altitude flying in a valley, something that you'd want to do anyway! All in all, this is your one-way flight to more interesting dogfights and furballs! Features A gripping portrayal of society's decadence in the year 2035 Cannon damage is multiplied for a more exciting dogfighting experience Rearm and repair by flying in valleys or get missiles as well by touching down on the runway Custom HUD extension shows enemy planes and their distance and speed Your plane's sensor jammer allows you hide your HUD signature Express yourself by choosing the color your opponents will see you in their HUD Addon requirements (optional) All in Arma (Arma 2 and Operation Arrowhead planes) F/A-18 Super Hornet by John_Spartan and Saul Known issues Su-34's countermeasures can be replenished only at the runway because the game lacks a command to set turret ammunition individually Version 1.0 - Steam Workshop - Armaholic - Mediafire Changelog
×