* Generic cycle attack profile key for missile guidance (#4787) * Generic cycle attack profile key for missile guidance * Add hint for weapons without huds * Fix Korean strings * Cleanup * Frag Superanal Cleanup (#4803) * Minimal frag cleanup * Why did this even happen in the first place Conflicts: addons/frag/functions/fnc_frago.sqf * New Function to Show BIS Style Curator Messages (#4844) * Add showMessage fnc that shows BIS curator messages * Add documentation * Make function simpler * Modify to fir new syntax * Handle non-string args * Generic cycle attack profile key for missile guidance (#4787) * Generic cycle attack profile key for missile guidance * Add hint for weapons without huds * Fix Korean strings * Cleanup * Cache Nametags onDraw3D flags. (#4847) * Cache Nametag flags * Remove unused privates * Fix fading, cursorOnly mode, improve cache reset * Fix header * Fix Javelin for AI (#4857) * Optimize Laserpointer (#4859) * only process one unit every 0.1 seconds * exitWith to keep indentation low * use event to determine isIR and isTI * correctly remove units with turned on lights from their arrays * handle weaponAccessories command reporting nil Conflicts: addons/laserpointer/XEH_postInit.sqf * Fix RHS m113 compat (#4881) * Fix passenger actions - Ensure order of MainActions (#4883) * Fix getPos order (#4889) * Use createSimpleObject to create tags (#4892) * Update CBA required version (#4899) * prep v3.9.0 * Update required CBA version * Medical/Repair 3den Toolbox State Fix (Bug fix for #4902) (#4905) * Update medical/repair 3den away from missionNamespace * Simplify save * Hide earplug actions if setting disabled (#4913) * Hide earplug actions if setting disabled * Add lines that are new * Pass map gestures draw by reference (#4914) * Verify params in atragmx profile gunlist (#4917) * Fix setVariablePublic reseting to old values (#4938) * Fix setVariablePublic reseting to old values * Don't drop delay time * Reload medical configs into extension on save load (#4941) * Fix lost magazines when restoring gunbag mags (#4942) * Add RHS GREF compat for RKG-3 grenade (#4944) * Fix intergrated scopes (#4945) * Require CBA v3.2.1 (#4954) Conflicts: addons/main/script_mod.hpp * Fix gforce avg on switching to aircraft (#4955) * Fix gforce avg on switching to aircraft * Dont use for-loop for neutral g-forces array * Update maps' latitude (#4961) - add Dingor - add MSKE 2017 - add G.O.S Leskovets - add Trung Si - add I44: Omaha v2 - add I44: Neaville and Neaville (Winter) - add I44: Battle of the Bulge * Fix rangecard not showing wind/lead (#4964) * Give options menu list focus (#4965) * Cleanup use of ACE_HashLocation (#4975) * Add validation on group id for map gesture color mapping (#4976) * Fix vehicle lock lockpick condition, Fix lockpicking from inside (#4985) * Prep 3.9.1 release * Fix cookoff desynch, fix #4900 Randomness would be calculated on every machine, but only vehicle explosion and sound are done by the server. Smoke, light and fire sfx are done by each client. * also fix cooking off ammo boxes * Fix cookoff desynch, fix #4900 Randomness would be calculated on every machine, but only vehicle explosion and sound are done by the server. Smoke, light and fire sfx are done by each client. * also fix cooking off ammo boxes * Add rearm config for Nemmera (#4992) * Sandbags surfaces update (#4971) * Use private keyword, move surface blacklist to script_component.hpp * Check height above terrain * Add Tanoa surfaces, Check if in water * Use 'dust' config entry to determine surface, Add common canDig (checks dustyness) * Re-enable compile cache * Revert to surface blacklist with dust as fallback * Move surface blacklist to script_component because SQF validator complains * Fix unarmed sprint->prone + minor perf improvments (#4887) * AB : AtragMx wiki updated (#4982) * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Add files via upload * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update publish.py for RHS Gref Compat (#4999) * Update atragmx.md * Delete atragmx1.jpg * Add files via upload * Translation: Missing 3 strings in Polish (#5008) * update user url * Jpn translate to v391 (#5011) * jpn translate slideshow Add the Japanese translation for slideshow for v3.9.1 * jpn translate for cookoff Add the Japanese translation for cookoff of the v3.9.1 * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Update atragmx.md * Prep 3.9.1 release * Update atragmx.md * Dupplicate Polish entry (#5018) https://i.gyazo.com/c7557980d7d4c36709be78ef1f2c2a8f.png * Update atragmx.md * Add custom CfgUIGrids for microDagr (#5014) * Update atragmx.md * Add files via upload * Update atragmx.md * fix links and `alt` texts * Duplicate French entry (#5032) Removes a duplicate French entry, didn't saw it :/ * Wiki range card updated (#5029) * Update rangecard.md * Update rangecard.md * Update rangecard.md * Add files via upload * Update rangecard.md * fix links and `alt` texts * Wiki Advanced Ballistics updated (#5030) * Update advanced-ballistics.md * Update advanced-ballistics.md * Update advanced-ballistics.md * Update advanced-ballistics.md * Update advanced-ballistics.md * Update advanced-ballistics.md * Update advanced-ballistics.md * Update advanced-ballistics.md * Update advanced-ballistics.md * Update advanced-ballistics.md * Add files via upload * Update advanced-ballistics.md * fix links and `alt` texts * Wiki Kestrel 4500 updated (#5027) * Update kestrel4500.md * Update kestrel4500.md * Update kestrel4500.md * Update kestrel4500.md * Update kestrel4500.md * Update kestrel4500.md * Update kestrel4500.md * fix links and `alt` texts * Wiki scope updated (#5028) * Update scopes.md * Update scopes.md * Update scopes.md * Add files via upload * Update scopes.md * fix links and `alt` texts * French loc improvement (#5017) * French loc improvement (French) text as it is clutters the interface interface, making it uneasy for medic to use the it smoothly. https://i.gyazo.com/8d7a5bb2f15dd1332cec36f2eef510c8.png Hopefully suggested changes fixes that. There were a few typos and, in my opinion, unaccurate or missing translation. Based on French Army Field Manual, actual paramedical personnel and past work on XMedSys. * Pull 5017 with spaces instead of tabs https://github.com/acemod/ACE3/pull/5017 * Fixes a minor typo Selectioner -> Sélectionner * Duplicate entry (French) Removes a duplicate entry, didn't saw first time * Wiki scope updated_1 (#5037) * Update scopes.md * Update scopes.md * Update scopes.md * Add files via upload * Update scopes.md * fix links and `alt` texts * Delete scope_module.jpg * Add files via upload * Update scopes.md * French additions (Cargo) (#5040) Minor French text additions * French loc fixes (ballistics) (#5041) Minor French loc fixes * Update documentation for Vector21 Add explanation on how to switch range and azimuth units * Add blank line after heading * Update vector.md * Update atragmx.md * fix link atragmx.md * Fix dagr not showing bearing in mils (#5047) * Fix cargo loading to locked vehicle (#5049) * Update ACEX to 3.2.0.4 (#5062) * tweak ACE main menu info box * use https for main menu * use https for main men * fix highlighted info box color (#5075) * Filter headless clients from zeus teleportation (#5070) * Use setShotParents in Advanced Throwing (#5052) * Use setShotParents in Advanced Throwing - close #5034 * Execute setShotParents on server (server-only command) * Fix FCS Vehicle Init (#5063) * Tweak overheating (#4969) * Tweak overheating * Add define for constant magic num * Virtual units - skip goggles/hearing effects (#4988) * Disable goggles and hearing fx for virtual units * Cleanup some other CBA_fnc_addPlayerEventHandler * Fix tagging model cache (#5055) * Frag - Cleanup and Performance (#5010) * Frag - Cleanup and Performance * Add dots * (Medical) French text - minor changes (#5043) Minor changes due to users feedback * French localization complete (#5079) * French localization complete * STR_ACE_MapTools_drawStaightLines_description fix "l'on doit survoler le milieu du trait pour pouvoir le supprimer" * Space management alganthe : Espace en trop après référence. * Diapo alganthe : Slideshow -> diaporama Slide -> diapo * Cohesion fix alganthe : Vous avez traduit le nom du module juste au dessus (displayname). Il est vrai que les créateurs de missions doivent consulter une documentation principalement écrite en anglais, donc vous avez le choix de traduire la ligne ci-dessus ou la garder, les deux semblent valide à mes yeux. Reasoning : since French mission makers read reference material in English, it makes sense not to translate it and thus keep it simple for them. * Caisses de munitions caisse de mun -> caisses de munitions * STR_ACE_Scopes_Description Oops, forgot that one. * Fix RHS mp7 UBC (#5085) * Fix broken url on modules wiki page (#5088) * Fix Javelin for AI for RHS (#5096) * Remove CfgAiSkill config changes (#5091) * Remove CfgAiSkill config changes * Add note to wiki about removal * Add volume toggle docs (#5077) * Add volume toggle docs * Change version and remove ref to another mod * Changes as per review * Fix numbers * Fix refuel nozzle dropping to ground (#5119) * Fix jerry can refuel interaction overlapping (#5107) * Add keybind to toggle interaction menu (#5095) * Add Paradrop Time Coefficient Setting (#5116) * Add coef * Show cargo paradrop time in menu * Unary command, not a function call * If drop time is 0 don't show a progress bar * Add the setting to cargo's editor module * Swap values * Remove extra comma * Move unload message to paradrop event This way the message will show up on all paradrops, not just immidiate ones. * Disable search on spectator unit tree Finally found out how to do this. Having search enabled on the unit tree might seem useful, but it doesn't interact well with keyboard shortcuts used for other purposes like camera control as it causes the tree to jump around unexpectedly. * Simplify spectator compass code * Optimize spectator unit list function Making good use of the new `select` CODE syntax. * Add 3den info to spectator template - A `displayName` shown in the 3DEN multiplayer attributes display - A `respawnTypes` array to define which respawn types the template is compatible with (currently only includes `2,3` - need to investigate compatibility with other types further). * Fix #5081 The default values of the arrays manipulated by these functions overwrite any changes applied before settings have finished initalising. This won't be an issue after #4456 is merged in future. * Improve Japanese translation (#5133) * Add the Japanese translation for cargo Add the Japanese translation for cargo, fix to html tag and few improvement * fix the Japanese transltion Fix the Japanese translation for attach. it was used wrong html tag. * changed The Japanese translation Changed the Japanese translation of azimuth angle * fix The Japanese translation Fix the Japanese translation for chemlights. it was used wrong html tag. * fix The Japanese translation Fix the Japanese translation for laserpointer. it was used wrong html tag. * Fix the Japanese translation Fix the Japanese translation for medical_blood. it was used wrong translation. * Fix the Japanese translation Fix the Japanese translation for rearm. it was used wrong translation. * add The Japanese translation add The Japanese translation to new words * Improve The Japanese translation Improve, fix and change The Japanese translation * minor fix to Japanese translation minor fix to Japanese translation. seeb1b07c5
* Fix Spotting Scope Interaction Point (#5132) * Disable ACE_FCS on RHS Russian Attack Helis (#5145) * Switch 2 perm PFEH to everyFrame (#5140) * Explosives - Add code handler for detonation (#5115) * Explosives - Add code handler for detonation * Add info to wiki * Fix cellphone in demo code, move example to wiki * Zeus Suppression Module (#4977) * add base structure * Add getModuleDestination * Add 2d map support, debug * Cleanup, handle weapon max range * Handle non-local units * Use new showMessage func * Run on groups when placed on leader * Support for Indirect Fire Vehicles * Cleanup * Use doArtilleryFire which was fixed in 1.68 * hitreactions - Close map on hit (#5099) * Wiki AtragMx minor changes (#5111) * fix markdown syntax * Update atragmx.md * AB: Lythium latitude (#5109) * Update fnc_getMapData.sqf * bump1 * bump2 * AB: update compat R3F v3.5 (#5097) * Update CfgWeapons.hpp * Update CfgAmmo.hpp * Update CfgAmmo.hpp * Update CfgWeapons.hpp * Update CfgWeapons.hpp * Update CfgWeapons.hpp * Update CfgWeapons.hpp * Update CfgWeapons.hpp * fix missing `{` * fix `dispersion` * fix space * AtragMx: BC G1 .338LM API526 (#5069) * Update fnc_initGunList.sqf * Update fnc_initGunList.sqf * C1 coefficient 0.58 * Jerry Can - only set global var on server (#5131) * Add Arma 3 Issues breaking ace_rearm (#5150) * MapGesutres - Fix dependency on maptools (#5154) * MapGesutres - Use getVariable to remove dependency * Use isModLoaded * Add missing base class to r3f compat (#5156) * Disable g-forces for UAV AI (#5094) * Increase max weapon index for large modsets (#5054) * Disable rearm,refuel on dead vehicles (#5158) * SQF Lint Cleanup Pass (#5157) * SQF Lint Cleanup Pass * Fix var in TRACE * Add basic python tool * Simplify * Hit space key 6 times * Fix error in dropNozzle * handle error message exceptions * Fix py * 1.70 CMs - Remove countermeasure mode switching (#5163) * 1.70 FCS - Remove ACE_FCS from most vics (#5152) * Handle 1.70 FCS * Cleanup CfgWeapons * Add warning for discreteDistance * 1.70 CMs - Remove countermeasure mode switching (#5163) * 1.70 FCS - Remove ACE_FCS from most vics (#5152) * Handle 1.70 FCS * Cleanup CfgWeapons * Add warning for discreteDistance * Realistic names for 1.70 pylon magazines (#5165) * Realistic names for 1.70 pylon magazines (#5165) * Fix gatling_30mm UBC for 1.70 (#5125) * Fix gatling_30mm UBC for 1.70 * Fix verEsion * Fix gatling_30mm UBC for 1.70 (#5125) * Fix gatling_30mm UBC for 1.70 * Fix verEsion * Prep 3.9.2 (version numbers) * Update required Arma 3 version to 1.70 * Prepare release 3.9.2 * Update helmet hearing protection for RHS-US (#5146) * Update helmet hearing protection for RHS-US * Hearing - Add standardized helmet protection macros * Tweak peltor vol * Disable aircraft flightmodel changes (#5167) * Disable aircraft flightmodel changes * Remove files * Fix merge, cbaEvents, macros, cleanup * Use correct TransportX type for ace items (#5168) * Use correct TransportX type for ace items * Fix messing with flare colors * Just warn for old compat pbos (#5177) * Just warn for old compat pbos * Use CBA_fnc_error big warning box * fix caps * Italian translation (Add & Fix) (#5193) Added Italian translation for: -advanced fatigue -advanced throwing -cook off -dogtags -gunbag -ui-scopes and much more... Fixed a lot of grammatical errors * Zeus updated (#5198) Fixes and adds in the zeus section * Add AtixNeon to AUTHORS.txt * Add realistic names to dynamic loadout classes (#5185) * RHS CH-47 - use animationSourcePhase (#5201) * Fix Zeus teleport players module (#5175) * Add dummy function to zeus UI modules This removes the message about the module having no function when in SP. * Fix zeus teleport module for non-local units BI made a change to the function this module was using. So now it has to be ran local to the player in question. * Adv Throw - Handle getShotParents being [] (#5210) * Correct compat classnames (#5204) * Linking belt refactoring (#5206) * Linking belt refatoring startLinking belt now uses canLinkBelt so if condition needs to be changed then you can do it on one position. * Fixed requested change Fixed requested change * AdvThrow - Handle bugged currentThrowable (#5216) * Fix AB water vapor pressure calc (#4956) * Fix AB water vapor pressure calc * Fix calc in weather * Cleanup usage of constant * Add RVExtensionVersion, Rebuild AB DLLs * CH53 Fastroping and other fixes (#4713) * CH53 Fastroping and Fixes Added fastrope points for CH53. The getOut EH is required to keep the doors open when a unit exits the vehicle and it uses the vehicle animation "doorHandler_R" or "doorHandler_L" as a placeholder to determine if the doors are open(1)/close(0). eg. In UH1Y (Unarmed), when the right door is opened using the useraction, "doorRB" and "doorHandler_R" will be set to 1. * Changed TAB to 4 spaces * Moved bracket to follow guidelines * Refuel for non-AllVehicle objects (#5151) * Enabled refuel for non-AllVehicles objects. Un-magic'd refuel progress timer. * Changed helper attach position to centre of object. Offset applied when rope attached. * Made fully compatible with non-thingX simulation types. Removed destruction effects of helper object. * Using arma model. Removed ACE_Actions from helper object. * Correct use of hideObjectGlobal * Remove actions, cargo, repair on helper * Switched helper to be setVar'd on the nozzle object * Linkingbelt refactoring (#5213) * Linking belt refatoring startLinking belt now uses canLinkBelt so if condition needs to be changed then you can do it on one position. * Fixed requested change Fixed requested change * simplified it even more canLinkBelt now returns a value over 0 if success and -1 if something is not right. * Fixed bug where if error we would not exit Fixed bug where if error we would not exit * changed name on canLinkBelt Changed name to better reflect the function of the function. * Author hype * fixed return value info fixed return value info * fix header * Fix ammo count hidden in UAVs (#5222) * Fix ammo count hidden in UAVs * Switch to ace_reload condition * Add arsenal zeus modules (#4576) * Add zeus arsenal modules * Add french strings to arsenal modules * Fix typo in french string * Make changes to fit review * locality check, use showMessage, set categroy * Cargo load menu overhaul (#4871) * Add submenu with vehicles to cargo load menu * replace private ARRAY with keyword * fix ace function macro using * filter vehicles without cargo * add Load condition, clean params, fix param reusing * replace nearEntities with nearestObjects, add macro * optimize, del magic, replace count with forEach * del unused functions * del useless _this parameter * Cleanup aircraft (#5197) * Refuel - Add setting for hose length (#5224) * Remove unit from laser pointer list if laser removed (#5190) * Handle escape menu with toggle iteractMenu (#5144) * Handle escape menu with toggle iteractMenu * Work on non-cursor menu * Close cursor menu if open when switching * Update fnc_handleEscapeMenu.sqf * French translation missing (#5217) * French translation for the two last entries * French translation for the last entrie * French Translation for the first entrie * correct the spelling error * Lower minimum speed limiter speed to 5 km/h (#5065) * Update fnc_speedLimiter.sqf * No minimum speed needed anymore Minimum speed limit of 10 km/h was needed in the past due to engine limitations. Multiple user tests have shown that the minimum speed is not needed anymore. The new minimum of 0 km/h allows for example setting walking speed for vehicles (<10 km/h). * Change minimum required speed for speed limiter to 3 km/h To avoid problems with negative speeds (driving backwards) and zero speed, the current change switches from 10 km/h minimum speed to 3 km/h minimum speed. This seems to be the optimal solution to allow all relevant speeds including walking speed. * Changed minimum required speed to 5 km/h Officially the minimum required speed is 10 km/h in the master. Lower minimum needed to set car speed to walking speed of accompanying soldiers. Problems have been reported with 3 kmh/ using cars like ATVs. Thus the new commit is set to 5 km/h minimum speed. Not tested with ATVs yet. * Minor fixes, cleanup, add lint ignore directives (#5176) - Fix bug in getNumberMagazinesIn (func not used) - Fix bug in seekerFindLaserSpot (func not used yet) - Everything else is just cleanup * Fix zeus interaction locality (#5214) - The `setUnitPos`, `setFormation`, `setSpeedMode` and `setBehaviour` commands require local arguments - The waypoint equivalents require server execution - Add conditions to only show interactions when the appropriate things are selected * Add cargo eden attributes (#4780) - Add a ace_cargo_space attribute to vehicles to alter how much cargo they can carry. - Add an ace_cargo_size attribute to objects to alter how much cargo space they consume. - Add two public functions `fnc_setSize.sqf` and `fnc_setSpace.sqf` to update the cargo size/space respectively of any given object. - Deprecate cargo makeLoadable module and public function. - Added some macros to get the space/size of a config, making code more readable in places. * Fix IVs not showing in patient display (#5230) Fix #5192 for 3.10 * Remove submuntion ammo changes to A-10 (#5231) * Remove changes to Aircraft cannons * keep ammo changes, i guess * Fix zeus RC units using player damage treshold (#5219) * Fix zeus RC units using player damage treshold Closes #5218 * add pabstmirrors suggestion use gvar * Implement new cook off SFX (#5179) * Implement new cook off SFX with variants * Add hybrid V to authors * Open glass and CUP doors (#5226) * Fixed glassdoor Fixed so glassdoor now works with ace slow open. * Made it more pretty with new file Made it more pretty with new file * Tidy up a bit * Removed white space * Replace tabs with spaces Replace tabs with spaces * Simplified and added comments * Changes + was stupid was commit Changes to go with code guidlines and extra check if door is empty * Tabs to spaces * Small fixes + Fixed so CUP houses now works Fixed so CUP houses now works * Remove todo * Fixed requested changes * Removed whitespaces * Vehicle quick mount (#4931) * Add quickmount files from ACEX * Rename to ACE3, Streamline, Use clientInit * Rename functions to ACE3, Fix crew getting * Fix enabled text * Fix texts * Remove spaces * Rework seat search * NLAW - Predicted Line Of Sight Guidance and Overfly Attack Mode (#4791) * NLAW Prototype * Make AI Compatible * Add Overfly Top Attack Mode * Limit Max Deflection * Base prediction on AI skill * Generic cycle attack profile key for missile guidance * Add hint for weapons without huds * Configure for attack cycle key * Finish OTA ammo effects * Cleanup * Arm at 20m * Disable Debug * No models for short lived sub-ammos * Fix Korean strings * Change AI randomization to use skillFinal * Add wiki doc for nlaw * Cleanup * Cleanup * Cleanup * Hellfire missiles (#4679) * Hellfire * Cleanup dev macros * Cleanup some debug * Add base interaction node for firemode actions * Handle bad data in attack profile variable * Skip ammo checks (returns bad data on added weaps) * Add mags sizes for apache * Add Hellfire Wiki Doc * Cleanup doc * Add pylon support * Add support for pilot controlled weapons * Add label to pylon mags * Cleanup vehicle configs, autoAdd laser des, fix ineractions for driver * [Docs] Update component dependencies Automatically committed through Travis CI. [ci skip] * [Docs] Update component dependencies Automatically committed through Travis CI. [ci skip] * [Docs] Update component dependencies Automatically committed through Travis CI. [ci skip] * Fix spectator icons and camera jitter (#5067) * Use `Visual` commands for icons and external camera position * Fix accidental numerical change (#5235) * Fix being unable to throw last mag (#5242) * Italian Translation Update (#5243) Added Italian translation for: -cargo -hellfire -nlaw -quickmount -refuel -zeus * Cleanup unused hellfire vic stringtable (#5245) * Fix weapon select grenade count wehn using advThrow (#5244) * Raise lower carry object (#5234) * Fix to move items up and down * Fixed private * Fixed public bug * Inserted Pabst solution * Remove extra space * Fixed request + added author * Fixed to correct comment * Tweeked comment again * Added more info about indentations, tabs and EditorConfig (#5249) * Added more info about indentations, tabs and EditorConfig * Fixed original misspelling "Every" * Added Pylon weapon as a valid weapon (#5250) * Disable dragging on big AA Turrets (#5251) * note required PboProject version (#5256) * note required PboProject version * Update setting-up-the-development-environment.md * Conform function headers to coding guidelines (#5255) * Fixed headers to work with silentspike python script * Fixed rest of the files * Fixed ace-team * Rearm - Pylon Support and Dynamically Add Supply Actions (#5183) * Dynamic Add * Support 1.70 Pylon Loadouts * Properly handle old compat pbos - Update RHS Compat * Re-add documentation * cleanup headers (note from other pr) * Cleanup * Fix var spelling * Fix minor debug that got left in (#5260) * Repair specialist rename, fixes #3186 (#5248) * Changed name * Fixed Enginner only german and removed big letters * Added docs + PR fixes #3186 * Removed other languages * Fixed request and added comment * Replace all usage of term "Specialist" * Add Ability to Change Repair Times of Vehicles (#5205) * Add ability to change repair time based on vehicle * Much better * Unary command not function * Allow changing of track or wheel object per vehicle * Lot more complicated than I thought * Fix some event names on wiki (#5254) * Fix some event names on wiki * Switch callable events to functions * Remove maximum distance of attach to vehicle action (#5262) * Remove maximum distance of attachi to vehicle action * Readd max distance, 10 meters to allow usage with big vehicles but also end placement system if too far * Update kestrel4500.md (#5228) * Add repair feature to wiki (#5247) * Add repair feature to wiki * Add blank lines, use adv engineer * Add repair framework page * Fix Large IED defuse distance (#5261) * Fix for large-ied bug because underwater thing have changed * Added size of IED in config and determine defuse range * Added typo * Added help text to wiki about defusing * Better English * Increased the defusal range on large bombs make it similar to small ieds * Add wiki doc * Use getUnitTrait for medics, engineers and EOD (#5246) * Increase required CBA version to 3.3.1 * Prepare version 3.10.0 * Update cargo docs with new public functions (#5266) * Update cargo docs with new public functions * Add myself to squad.xml * Italian translation updated and fixed (#5268) Added newest lines for: -Rearm -Repair * Update homepage version numbers #4692 [ci skip] * Fix isFeatureCameraActive for Spectator enhacements (#5269) * fix isFeatureCameraActive for spec ace_spectator_camera was removed in77c2b99ee5
. spectator module initializes three separate cameras instead, of which for example ace_spectator_freeCamera can be used to check if spec mode is active * use ace_spectator_isSet to check for spec mode * Prepare release 3.10.0 (build 2) * fix video link (#5276) * Jpn translate 73bd37 (#5277) * Update the Jpn translation for cargo Update the Japanese translation for cargo * Add the Jpn translation for hellfire Add the Japanese translation for hellfire * Add the Jpn translation for nlaw Add the Japanese translation for nlaw * Add the Jpn translation for rearm Add the Japanese translation for rearm * Update the Jpn translation for refuel Update the Japanese translation for refuel * Update the Jpn translation for repair Update the Japanese translation for repair * Update the Jpn translation for zeus Update the Japanese translation for zeus * gos ndjenahoud latitude (#5275) * Count untraced errors in make.py (#5265) * Count untraced errors (any errors besides failed PBO builds and missinf files) in make.py * Fix error count and prettify printing * Cleanup heli pod actions (#5271) Close #4783 - Make taru pods non loadable - Make taru pods non draggable - Increase interaction range for huron pods * Make array of cargo holders dynamic (#5274) * Jpn translatefeee7f5
(#5280) * Add the Jpn translation for quickmount Add the Japanese translation for quickmount * Update the Jpn translation for repair Update the Japanese translation for repair * Fix isFeatureCameraActive (#5291) * Fix isFeatureCameraActive (#5291) * Prepare release 3.10.1 * Add malden to getMapData (#5297) * Add malden to getMapData * Merge with CWR2 malden * Add malden to getMapData (#5297) * Add malden to getMapData * Merge with CWR2 malden * Add Chinese Traditional & Simplified Localization (#5295) Add Chinese Traditional & Simplified Localization * compats - Fix config name for resupply vics (#5300) * Modify JoinGroup action to show group name (#5287) * Modify JoinGroup action to show group name * header * Header * Repair - Handle depends = "0" (#5283) * Repair - Handle depends = "0" * quote * Refuel - change nozzle position calc (#5279) * Handle ace_cargo_canLoad set to scalar (#5306) * Add XEH to ace_module (#5304) * Changed hellfire interaction check & added N variant (#5294) * Changed weapon check for interaction to generic ace_hellfire_enabled value * Added November hellfire variant * Cleanup * +1 * Japanese translationd02dacf
(#5309) * add the Jpn translation for repair add the Japanese translation for repair * minor fix to Jpn translation for medical minor fix to Jpn translation for medical * Correct new Chinese stringtable identifiers (#5334) * Fix the issue that SFX variants are not global (#5335) * Fix the issue that SFX variants are not global what means that different players can get different pressure Cookoff sounds to prevent that i split up the sounds in 3 types and used a Weighted select to have the befor used values back * add todo for 1.74 * inherit in CfgSFX from 1 class * fix #5324 (#5325) * Minor update Wiki AtragMx (#5322) * update wiki atragmx * Add files via upload * Fix broken fonts for map gps display (#5337) EtelkaNarrowMediumPro broke with 1.72 hotfix * Handle locked doors (#5345) * Allow repairing from slingload pods (#5316) * Add cargo space to huron containers (#5315) * Rallypoints- Don't modify setVar if already set (#5347)
26 KiB
layout | title | description | group | parent | order |
---|---|---|---|---|---|
wiki | Coding Guidelines | development | wiki | 1 |
1. Naming Conventions
1.1 Variable Names
1.1.1 Global Variable naming
All global variables must start with the ACE prefix followed by the component, separated by underscores. Global variables may not contain the fnc_
prefix if the value is not callable code.
Example: ace_component_myVariableName
For ACE this is done automatically through the usage of the GVAR
macro family.
1.1.2 Private Variable naming
To make code as readable as possible, try to use self explanatory variable names and avoid using single character variable names.
Example: _velocity
instead of _v
1.1.3 Function naming
All functions shall use ACE and the component name as a prefix, as well as the fnc_
prefix behind the component name.
Example: PREFIX_COMPONENT_fnc_functionName
For ACE this is done automatically through the usage of the PREP
macro.
1.2 Files & Config
1.2.1 SQF files
Files containing SQF scripts shall have a file name extension of .sqf
.
1.2.2 Header files
All header files shall have the file name extension of .hpp
.
1.2.3 Own SQF File
All functions shall be put in their own .sqf
file.
1.2.4 Config elements
Config files shall be split up into different header files, each with the name of the config and be included in the config.cpp
of the component.
Example:
#include "ACE_Settings.hpp"
And in ACE_Settings.hpp
:
class ACE_Settings {
// Content
};
1.3 Stringtable
All text that shall be displayed to a user shall be defined in a stringtable.xml
file for multi-language support.
- There shall be no empty stringtable language values.
- All stringtables shall follow the format as specified by Tabler{:target="_blank"} and the [translation guidelines]({{ site.baseurl }}/wiki/development/how-to-translate-ace3.html) form.
2. Macro Usage
2.1 Module/PBO specific Macro Usage
The family of GVAR
macros define global variable strings or constants for use within a module. Please use these to make sure we follow naming conventions across all modules and also prevent duplicate/overwriting between variables in different modules. The macro family expands as follows, for the example of the module 'balls':
Macros | Expands to |
---|---|
GVAR(face) |
ace_balls_face |
QGVAR(face) |
"ace_balls_face" |
QQGVAR(face) |
""ace_balls_face"" used inside QUOTE macros where double quotation is required. |
EGVAR(leg,face) |
ace_leg_face |
QEGVAR(leg,face) |
"ace_leg_face" |
QQEGVAR(leg,face) |
""ace_leg_face"" used inside QUOTE macros where double quotation is required. |
There also exists the FUNC
family of Macros:
Macros | Expands to |
---|---|
FUNC(face) |
ace_balls_fnc_face or the call trace wrapper for that function. |
EFUNC(leg,face) |
ace_leg_fnc_face or the call trace wrapper for that function. |
DFUNC(face) |
ace_balls_fnc_face and will ALWAYS be the function global variable. |
DEFUNC(leg,face) |
ace_leg_fnc_face and will ALWAYS be the function global variable. |
QFUNC(face) |
"ace_balls_fnc_face" |
QEFUNC(leg,face) |
"ace_leg_fnc_face" |
QQFUNC(face) |
""ace_balls_fnc_face"" used inside QUOTE macros where double quotation is required. |
QQEFUNC(leg,face) |
""ace_leg_fnc_face"" used inside QUOTE macros where double quotation is required. |
The FUNC
and EFUNC
macros shall NOT be used inside QUOTE
macros if the intention is to get the function name or assumed to be the function variable due to call tracing (see below). If you need to 100% always be sure that you are getting the function name or variable use the DFUNC
or DEFUNC
macros. For example QUOTE(FUNC(face)) == "ace_balls_fnc_face"
would be an illegal use of FUNC
inside QUOTE
.
Using FUNC
or EFUNC
inside a QUOTE
macro is fine if the intention is for it to be executed as a function.
2.1.1 FUNC
Macros, Call Tracing, and Non-ACE3/Anonymous Functions
ACE3 implements a basic call tracing system that can dump the call stack on errors or wherever you want. To do this the FUNC
macros in debug mode will expand out to include metadata about the call including line numbers and files. This functionality is automatic with the use of calls via FUNC
and EFUNC
, but any calls to other functions need to use the following macros:
Macro | Example |
---|---|
CALLSTACK(functionName) |
[] call CALLSTACK(cba_fnc_someFunction) |
CALLSTACK_NAMED(function,functionName) |
[] call CALLSTACK_NAMED(_anonymousFunction,'My anonymous function!') |
These macros will call these functions with the appropriate wrappers and enable call logging into them (but to no further calls inside obviously).
2.2 General Purpose Macros
CBA script_macros_common.hpp{:target="_blank"}
QUOTE()
is utilized within configuration files for bypassing the quote issues in configuration macros. So, all code segments inside a given config should utilize wrapping in the QUOTE()
macro instead of direct strings. This allows us to use our macros inside the string segments, such as QUOTE(_this call FUNC(balls))
2.2.1 setVariable
, getVariable
family macros
These macros are allowed but are not enforced.
Macro | Expands to |
---|---|
GETVAR(player,MyVarName,false) |
player getVariable ["MyVarName", false] |
GETMVAR(MyVarName,objNull) |
missionNamespace getVariable ["MyVarName", objNull] |
GETUVAR(MyVarName,displayNull) |
uiNamespace getVariable ["MyVarName", displayNull] |
SETVAR(player,MyVarName,127) |
player setVariable ["MyVarName", 127] SETPVAR(player,MyVarName,127) player setVariable ["MyVarName", 127, true] |
SETMVAR(MyVarName,player) |
missionNamespace setVariable ["MyVarName", player] |
SETUVAR(MyVarName,_control) |
uiNamespace setVariable ["MyVarName", _control] |
2.2.2 STRING family macros
Note that you need the strings in module stringtable.xml
in the correct format:
STR_ACE_<module>_<string>
Example: STR_Balls_Banana
Script strings (still require localize
to localize the string):
Macro | Expands to |
---|---|
LSTRING(banana) |
"STR_ACE_balls_banana" |
ELSTRING(leg,banana) |
"STR_ACE_leg_banana" |
Config Strings (require $
as first character):
Macro | Expands to |
---|---|
CSTRING(banana) |
"$STR_ACE_balls_banana" |
ECSTRING(leg,banana) |
"$STR_ACE_leg_banana" |
2.2.3 Path family macros
The family of path macros define global paths to files for use within a module. Please use these to reference files in the ACE3 project. The macro family expands as follows, for the example of the module 'balls':
Macro | Expands to |
---|---|
PATHTOF(data\banana.p3d) |
\z\ace\addons\balls\data\banana.p3d |
QPATHTOF(data\banana.p3d) |
"\z\ace\addons\balls\data\banana.p3d" |
PATHTOEF(leg,data\banana.p3d) |
\z\ace\addons\leg\data\banana.p3d |
QPATHTOEF(leg,data\banana.p3d) |
"\z\ace\addons\leg\data\banana.p3d" |
3. Functions
Functions shall be created in the functions\
subdirectory, named fnc_functionName.sqf
They shall then be indexed via the PREP(functionName)
macro in the XEH_preInit.sqf
file.
The PREP
macro allows for CBA function caching, which drastically speeds up load times. Beware though that function caching is enabled by default and as such to disable it you need to #define DISABLE_COMPILE_CACHE
above your #include "script_components.hpp"
include!
3.1 Headers
Every function should have a header of the following format as the start of their function file:
/*
* Author: [Name of Author(s)]
* [Description]
*
* Arguments:
* 0: The first argument <STRING>
* 1: The second argument <OBJECT>
*
* Return Value:
* The return value <BOOL>
*
* Example:
* ["something", player] call ace_common_fnc_imanexample
*
* Public: [Yes/No]
*/
This is not the case for inline functions or functions not containing their own file.
3.2 Includes
Every function includes the script_component.hpp
file just below the function header. Any additional includes or defines must be below this include.
All scripts written must be below this include and any potential additional includes or defines.
3.2.1 Reasoning
This ensures every function starts of in an uniform way and enforces function documentation.
4. Global Variables
All Global Variables are defined in the XEH_preInit.sqf
file of the component they will be used in with an initial default value.
Exceptions:
- Dynamically generated global variables.
- Variables that do not origin from the ACE3 project, such as BI global variables or third party such as CBA.
5. Code Style
To help with some of the coding style we recommend you get the plugin EditorConfig for your editor. It will help with correct indentations and deleting trailing spaces.
5.1 Braces placement
Braces { }
which enclose a code block will have the first bracket placed behind the statement in case of if
, switch
statements or while
, waitUntil
& for
loops. The second brace will be placed on the same column as the statement but on a separate line.
- Opening brace on the same line as keyword
- Closing brace in own line, same level of indentation as keyword
Yes:
class Something: Or {
class Other {
foo = "bar";
};
};
No:
class Something : Or
{
class Other
{
foo = "bar";
};
};
Also no:
class Something : Or {
class Other {
foo = "bar";
};
};
When using if
/else
, it is encouraged to put else
on the same line as the closing brace to save space:
if (alive player) then {
player setDamage 1;
} else {
hint ":(";
};
In cases where there are a lot of one-liner classes, it is allowed to use something like this to save space:
class One {foo = 1;};
class Two {foo = 2;};
class Three {foo = 3;};
5.1.1 Reasoning
Putting the opening brace in its own line wastes a lot of space, and keeping the closing brace on the same level as the keyword makes it easier to recognize what exactly the brace closes.
5.2 Indents
Every new scope should be on a new indent. This will make the code easier to understand and read. Indentations consist of 4 spaces. Tabs are not allowed. Tabs or spaces are not allowed to trail on a line, last character needs to be non blank.
Good:
call {
call {
if (/* condition */) then {
/* code */
};
};
};
Bad:
call {
call {
if (/* condition */) then {
/* code */
};
};
};
5.3 Inline comments
Inline comments should use //
. Usage of /* */
is allowed for larger comment blocks.
Example:
//// Comment // < incorrect
// Comment // < correct
/* Comment */ // < correct
5.4 Comments in code
All code shall be documented by comments that describe what is being done. This can be done through the function header and/or inline comments.
Comments within the code shall be used when they are describing a complex and critical section of code or if the subject code does something a certain way because of a specific reason. Unnecessary comments in the code are not allowed.
Good:
// find the object with the most blood loss
_highestObj = objNull;
_highestLoss = -1;
{
if ([_x] call EFUNC(medical,getBloodLoss) > _highestLoss) then {
_highestLoss = [_x] call EFUNC(medical,getbloodloss);
_highestObj = _x;
};
} foreach _units;
Good:
// Check if the unit is an engineer
(_obj getvariable [QGVAR(engineerSkill), 0] >= 1);
Bad:
// Get the engineer skill and check if it is above 1
(_obj getvariable [QGVAR(engineerSkill), 0] >= 1);
Bad:
// Get the variable myValue from the object
_myValue = _obj getvariable [QGVAR(myValue), 0];
Bad:
// Loop through all units to increase the myvalue variable
{
_x setvariable [QGVAR(myValue), (_x getvariable [QGVAR(myValue), 0]) + 1];
} forEach _units;
5.5 Brackets around code
When making use of brackets ( )
, use as few as possible, unless doing so decreases readability of the code. Avoid statements such as:
if (!(_value)) then { };
However the following is allowed:
_value = (_array select 0) select 1;
Any conditions in statements shall always be wrapped around brackets.
if (!_value) then {};
if (_value) then {};
5.6 Magic Numbers
There shall be no magic numbers. Any magic number shall be put in a define either on top of the .sqf
file (below the header), or in the script_component.hpp
file in the root directory of the component (recommended) in case it is used in multiple locations.
Magic numbers are any of the following:
- A constant numerical or text value used to identify a file format or protocol
- Distinctive unique values that are unlikely to be mistaken for other meanings
- Unique values with unexplained meaning or multiple occurrences which could (preferably) be replaced with named constants
Source{:target="_blank"}
6. Code Standards
6.1 Error testing
If a function returns error information, then that error information will be tested.
6.2 Unreachable Code
There shall be no unreachable code.
6.3 Function Parameters
Parameters of functions must be retrieved through the usage of the param
or params
commands. If the function is part of the public API, parameters must be checked on allowed data types and values through the usage of the param
and params
commands.
Usage of the CBA Macro PARAM_x
or BIS_fnc_param
is deprecated and not allowed within the ACE project.
6.4 Return Values
Functions and code blocks that specific a return a value must have a meaningful return value. If no meaningful return value, the function should return nil.
6.5 Private Variables
All private variables shall make use of the private
keyword on initialization. When declaring a private variable before initialization, usage of the private ARRAY
syntax is allowed. All private variables must be either initialized using the private
keyword, or declared using the private ARRAY
syntax. Exceptions to this rule are variables obtained from an array, which shall be done with usage of the params
command family, which ensures the variable is declared as private.
Good:
private _myVariable = "hello world";
Good:
_myArray params ["_elementOne", "_elementTwo"];
Bad:
_elementOne = _myArray select 0;
_elementTwo = _myArray select 1;
6.6 Lines of Code
Any one function shall contain no more than 250 lines of code, excluding the function header and any includes.
6.7 Variable declarations
Declarations should be at the smallest feasible scope.
Good:
if (call FUNC(myCondition)) then {
private _areAllAboveTen = true; // <- smallest feasable scope
{
if (_x >= 10) then {
_areAllAboveTen = false;
};
} forEach _anArray;
if (_areAllAboveTen) then {
hint "all values are above ten!";
};
}
Bad:
private _areAllAboveTen = true; // <- this is bad, because it can be initialized in the if statement
if (call FUNC(myCondition)) then {
{
if (_x >= 10) then {
_areAllAboveTen = false;
};
} forEach _anArray;
if (_areAllAboveTen) then {
hint "all values are above ten!";
};
};
6.8 Variable initialization
Private variables will not be introduced until they can be initialized with meaningful values.
Good:
private _myVariable = 0; // good because the value will be used
{
_x params ["_value", "_amount"];
if (_value > 0) then {
_myVariable = _myVariable + _amount;
};
} forEach _array;
Bad:
private _myvariable = 0; // Bad because it is initialized with a zero, but this value does not mean anything
if (_condition) then {
_myVariable = 1;
} else {
_myvariable = 2;
};
Good:
private _myvariable = [1, 2] select _condition;
6.9 Initialization expression in for
loops
The initialization expression in a for
loop shall perform no actions other than to initialize the value of a single for
loop parameter.
6.10. Increment expression in for
loops
The increment expression in a for
loop shall perform no action other than to change a single loop parameter to the next value for the loop.
6.11. getVariable
When using getVariable
, there shall either be a default value given in the statement or the return value shall be checked for correct data type as well as return value. A default value may not be given after a nil
check.
Bad:
_return = obj getvariable "varName";
if (isnil "_return") then {_return = 0 };
Good:
_return = obj getvariable ["varName", 0];
Good:
_return = obj getvariable "varName";
if (isnil "_return") exitwith {};
6.12. Global Variables
Global variables should not be used to pass along information from one function to another. Use arguments instead.
Bad:
fnc_example = {
hint GVAR(myVariable);
};
GVAR(myVariable) = "hello my variable";
call fnc_example;
Good:
fnc_example = {
params ["_content"];
hint _content;
};
["hello my variable"] call fnc_example;
6.13. Temporary Objects & Variables
Unnecessary temporary objects or variables should be avoided.
6.14. Commented out Code
Code that is not used (commented out) shall be deleted.
6.15. Constant Global Variables
There shall be no constant global variables, constants shall be put in a #define
.
6.16. Logging
Functions shall whenever possible and logical, make use of logging functionality through the logging and debugging macros from CBA and ACE3.
6.17. Constant Private Variables
Constant private variables that are used more as once shall be put in a #define
.
6.18. Code used more than once
Any piece of code that could/is used more than once, shall be put in a function and it's separate .sqf
file, unless this code is less as 5 lines and used only in a per-frame handler.
7. Design considerations
7.1 Readability vs Performance
This is a large open source project that will get many different maintainers in its lifespan. When writing code, keep in mind that other developers also need to be able to understand your code. Balancing readability and performance of code is a non black and white subject. The rule of thumb is:
- When improving performance of code that sacrifices readability (or visa-versa), first see if the design of the implementation is done in the best way possible.
- Document that change with the reasoning in the code.
7.2 Scheduled vs Unscheduled
Avoid the usage of scheduled space as much as possible and stay in unscheduled. This is to provide a smooth experience to the user by guaranteeing code to run when we want it. See Performance considerations, spawn
& execVM
for more information.
This also helps avoid various bugs as a result of unguaranteed execution sequences when running multiple scripts.
7.3 Event driven
All ACE3 components shall be implemented in an event driven fashion. This is done to ensure code only runs when it is required and allows for modularity through low coupling components.
Event handlers in ACE3 are implemented through the CBA event system (ACE3's own event system is deprecated since 3.6.0). They should be used to trigger or allow triggering of specific functionality.
More information on the CBA Events System{:target="_blank"} and CBA Player Events{:target="_blank"} pages.
Warning about BIS event handlers:
BIS's event handlers (`addEventHandler`, `addMissionEventHandler`) are slow when passing a large code variable. Use a short code block that calls the function you want.
```js player addEventHandler ["Fired", FUNC(handleFired)]; // bad player addEventHandler ["Fired", {call FUNC(handleFired)}]; // good ```7.4 Hashes
When a key value pair is required, make use of the hash implementation from ACE3.
Hashes are a variable type that store key value pairs. They are not implemented natively in SQF, so there are a number of macros and functions for their usage in ACE3. If you are unfamiliar with the idea, they are similar in function to setVariable
/getVariable
but do not require an object to use.
The following example is a simple usage using our macros which will be explained further below.
_hash = HASHCREATE;
HASH_SET(_hash,"key","value");
if (HASH_HASKEY(_hash,"key")) then {
player sideChat format ["val: %1", HASH_GET(_hash,"key"); // will print out "val: value"
};
HASH_REM(_hash,"key");
if (HASH_HASKEY(_hash,"key")) then {
// this will never execute because we removed the hash key/val pair "key"
};
A description of the above macros is below.
Macro | Use |
---|---|
HASHCREATE |
Used to create an empty hash. |
HASH_SET(hash,key,val) |
Will set the hash key to that value, a key can be anything, even objects. |
HASH_GET(hash,key) |
Will return the value of that key (or nil if it doesn't exist). |
HASH_HASKEY(hash,key) |
Will return true/false if that key exists in the hash. |
HASH_REM(hash,key) |
Will remove that hash key. |
7.4.1 Hashlists
A hashlist is an extension of a hash. It is a list of hashes! The reason for having this special type of storage container rather than using a normal array is that an array of normal hashes that are similar will duplicate a large amount of data in their storage of keys. A hashlist on the other hand uses a common list of keys and an array of unique value containers. The following will demonstrate its usage.
_defaultKeys = ["key1", "key2", "key3"];
// create a new hashlist using the above keys as default
_hashList = HASHLIST_CREATELIST(_defaultKeys);
//lets get a blank hash template out of this hashlist
_hash = HASHLIST_CREATEHASH(_hashList);
//_hash is now a standard hash...
HASH_SET(_hash,"key1","1");
//to store it to the list we need to push it to the list
HASHLIST_PUSH(_hashList, _hash);
//now lets get it out and store it in something else for fun
//it was pushed to an empty list, so it's index is 0
_anotherHash = HASHLIST_SELECT(_hashList,0);
// this should print "val: 1"
player sideChat format["val: %1", HASH_GET(_anotherHash,"key1")];
//Say we need to add a new key to the hashlist
//that we didn't initialize it with? We can simply
//set a new key using the standard HASH_SET macro
HASH_SET(_anotherHash,"anotherKey","another value");
As you can see above working with hashlists are fairly simple, a more in depth explanation of the macros is below.
Macro | Use |
---|---|
HASHLIST_CREATELIST(keys) |
Creates a new hashlist with the default keys, pass [] for no default keys. |
HASHLIST_CREATEHASH(hashlist) |
Returns a blank hash template from a hashlist. |
HASHLIST_PUSH(hashList, hash) |
Pushes a new hash onto the end of the list. |
HASHLIST_SELECT(hashlist, index) |
Returns the hash at that index in the list. |
HASHLIST_SET(hashlist, index, hash) |
Sets a specific index to that hash. |
7.4.1.1 A note on pass by reference and hashes
Hashes and hashlists are implemented with SQF arrays, and as such they are passed by reference to other functions. Remember to make copies (using the +
operator) if you intend for the hash or hashlist to be modified with out the need for changing the original value.
8. Performance Considerations
8.1 Adding Elements to Arrays
When adding new elements to an array, pushBack
shall be used instead of the binary addition or set
. When adding multiple elements to an array append
may be used instead.
Good:
_a pushBack _value;
Also good:
_a append [1,2,3];
Bad:
_a set [ count _a, _value];
_a = a + _[value];
When adding an new element to a dynamic location in an array or when the index is pre-calculated, set
may be used.
When adding multiple elements to an array, the binary addition may be used for the entire addition.
8.2 createVehicle
createVehicle
array shall be used.
8.3 createVehicle(Local)
position
createVehicle(Local)
used with a non-[0, 0, 0]
position performs search for empty space to prevent collisions on spawn.
Where possible [0, 0, 0]
position shall be used, except on #
objects (e.g. #lightsource
, #soundsource
) where empty position search is not performed.
This code requires ~1.00ms and will be higher with more objects near wanted position:
_vehicle = _type createVehicleLocal _posATL;
_vehicle setposATL _posATL;
While this one requires ~0.04ms:
_vehicle = _type createVehicleLocal [0, 0, 0];
_vehicle setposATL _posATL;
8.4 Unscheduled vs Scheduled
All code that has a visible effect for the user or requires time specific guaranteed execution shall be written in unscheduled space.
8.5 Avoid spawn
& execVM
execVM
and spawn
are to be avoided wherever possible.
8.6 Empty Arrays
When checking if an array is empty isEqualTo
shall be used.
8.7 for
Loops
for "_y" from # to # step # do { ... }
shall be used instead of
for [{ ... },{ ... },{ ... }] do { ... };
whenever possible.
8.8 while
Loops
While is only allowed when used to perform a unknown finite amount of steps with unknown or variable increments. Infinite while
loops are not allowed.
Good:
_original = _obj getvariable [QGVAR(value), 0];
while {_original < _weaponThreshold} do {
_original = [_original, _weaponClass] call FUNC(getNewValue);
}
Bad:
while {true} do {
// anything
};
8.9 waitUntil
The waitUntil
command shall not be used. Instead, make use of a per-frame handler:
[{
params ["_args", "_id"];
_args params ["_unit"];
if (_unit getvariable [QGVAR(myVariable), false]) exitwith {
[_id] call CBA_fnc_removePerFrameHandler;
// Execute any code
};
}, [_unit], 0] call CBA_fnc_addPerFrameHandler;