Update from acemod master (#1)

* 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. see b1b07c5

* 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 in 77c2b99ee5 .
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 translate feee7f5 (#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 translation d02dacf (#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)
This commit is contained in:
Drofseh 2017-07-10 01:27:29 -07:00 committed by GitHub
parent a66ab50975
commit 4d1a5194ea
2004 changed files with 39022 additions and 15385 deletions

55
.gibot.yml Normal file
View File

@ -0,0 +1,55 @@
stages:
mark_for_closing:
days: 30
labels:
- need more info
- invalid
- can't reproduce
- wontfix
- information required
exclude:
- marked for cleanup
comment:
- 'Hello @{author}! There has been no activity on this ticket for over a period of {days} days. I am automatically replying to let you know we will close this ticket within 1 week due to inactivity and consider this resolved.'
- 'If you believe this is in error, please reply with the requested information.'
- 'Thank you. :robot:'
action:
close: false
comment: true
assign_label:
- marked for cleanup
clean_up:
days: 7
labels:
- marked for cleanup
comment:
- 'Hello @{author}! We have detected no activity for {days} days on this ticket. We therefore assume that the original reporter has lost interest or the issue has been resolved.'
- 'Since we have marked this ticket for deletion, we will be closing it.'
- 'If this has been closed in error, please create a comment below and we can reopen this issue. Note that you may need to provide additional information that was requested.'
- 'Thank you. :robot:'
action:
close: true
comment: true
assign_label:
- closed by bot
remove_label:
- marked for cleanup
remind_about_old_ticket:
days: 160
labels:
- bug
- critical bug
exclude:
- need more info
- invalid
- can't reproduce
- wontfix
- information required
- marked for cleanup
- inactive
comment:
- 'Hello @acemod/maintainers. This ticket has been open for over {days} days without any activity.'
action:
comment: true
assign_label:
- inactive

View File

@ -3,8 +3,10 @@
**ACE3 Version:** `3.x.x` (stable / dev + commit hash)
**Mods:**
- `@CBA_A3`
- `@ace`
```
- CBA_A3
- ace
```
**Description:**
- Add a detailed description of the error. This makes it easier for us to fix the issue.

View File

@ -2,4 +2,4 @@
- Describe what this pull request will do
- Each change in a separate line
- Include documentation if applicable
- Respect the [Development Guidelines](http://ace3mod.com/wiki/development/)
- Respect the [Development Guidelines](https://ace3mod.com/wiki/development/)

View File

@ -0,0 +1,20 @@
# No issues and PRs without labels
issues=false
pr-wo-labels=false
# Issues are disabled, don't fetch them
max-issues=0
# Label filters
exclude-labels=by design,can't reproduce,duplicate,question,invalid,wontfix,ignore changelog
# Tag is created before generating changelog for release candidates
unreleased=false
# No section labels, we only want a list of merged PRs (label separation only works for Issues)
simple-list=true
# Misc
author=false
compare-link=false
header-label=## Change Log Summary

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ texHeaders.bin
*.swo
*.biprivatekey
Thumbs.db
CHANGELOG.md

3
.lgtm
View File

@ -1,3 +0,0 @@
approvals = 1
pattern = "(?i)LGTM|(?i):\\+1:|(?i):shipit:"
self_approval_off = true

View File

@ -1,4 +1,4 @@
# ACE3 CONTRIBUTOR LIST
# ACE3 CONTRIBUTOR LIST
# If you contributed, but are not listed here, contact me:
# koffeinflummi@gmail.com
#
@ -29,6 +29,7 @@ Walter Pearce <jaynus@gmail.com>
# CONTRIBUTORS
[BIG]Bull
11RDP-LoupVert <loupvert@11rdp.fr>
654wak654 <ozanegitmen@gmail.com>
ACCtomeek <tomeek99@gmail.com>
adam3adam <br.ada@seznam.cz>
Adanteh
@ -37,6 +38,7 @@ Aggr094 <bastards4glory@gmail.com>
alef <alefor@gmail.com>
Aleksey EpMAK Yermakov <epmak777@gmail.com>
Alganthe <alganthe@live.fr>
Andrea "AtixNeon" Verano <veranoandrea88@gmail.com>
Anthariel <Contact@storm-simulation.com>
Arkhir <wonsz666@gmail.com >
Asgar Serran <piechottaf@web.de>
@ -83,6 +85,7 @@ Harakhti <shadowdragonphd@gmail.com>
havena <silveredenis@gmail.com>
Hawkins
Head <brobergsebastian@gmail.com>
Hybrid V
Karneck <dschultz26@hotmail.com>
Kavinsky <nmunozfernandez@gmail.com>
Kllrt <kllrtik@gmail.com>
@ -90,6 +93,7 @@ legman <juicemelon@msn.com>
Legolasindar "Viper" <legolasindar@gmail.com>
licht-im-Norden87 <lichtimnorden87@gmail.com>
looter <looter222@gmail.com>
Luigi "Luigium" Myrini <luigium@outlook.fr>
Macusercom <macusercom@gmail.com>
MarcBook
meat <p.humberdroz@gmail.com>
@ -101,6 +105,7 @@ nomisum <nomisum@gmail.com>
OnkelDisMaster <onkeldismaster@gmail.com>
oscarmolinadev
PaxJaromeMalues <seemax1991@gmail.com>
Phyma <sethramstrom@gmail.com>
pokertour
Professor <lukas.trneny@wo.cz>
rakowozz

View File

@ -4,7 +4,7 @@
<p align="center">
<a href="https://github.com/acemod/ACE3/releases/latest">
<img src="https://img.shields.io/badge/Version-3.6.2-blue.svg?style=flat-square" alt="ACE3 Version">
<img src="https://img.shields.io/badge/Version-3.10.1-blue.svg?style=flat-square" alt="ACE3 Version">
</a>
<a href="https://github.com/acemod/ACE3/issues">
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?style=flat-square&label=Issues" alt="ACE3 Issues">

Binary file not shown.

Binary file not shown.

BIN
ace_break_line_x64.dll Normal file

Binary file not shown.

BIN
ace_clipboard_x64.dll Normal file

Binary file not shown.

BIN
ace_fcs_x64.dll Normal file

Binary file not shown.

BIN
ace_medical_x64.dll Normal file

Binary file not shown.

BIN
ace_parse_imagepath_x64.dll Normal file

Binary file not shown.

View File

@ -69,7 +69,7 @@ class ACE_Settings {
displayName = CSTRING(simulationInterval_DisplayName);
description = CSTRING(simulationInterval_Description);
typeName = "SCALAR";
value = 0.0;
value = 0.05;
};
class GVAR(simulationRadius) {
category = CSTRING(DisplayName);

View File

@ -71,7 +71,7 @@ class CfgVehicles {
displayName = CSTRING(simulationInterval_DisplayName);
description = CSTRING(simulationInterval_Description);
typeName = "NUMBER";
defaultValue = 0.0;
defaultValue = 0.05;
};
class simulationRadius {
displayName = CSTRING(simulationRadius_DisplayName);

View File

@ -39,7 +39,7 @@ if (!hasInterface) exitWith {};
{
_x params ["_modPBO", "_compatPBO"];
if ((isClass (configFile >> "CfgPatches" >> _modPBO)) && {!isClass (configFile >> "CfgPatches" >> _compatPBO)}) then {
ACE_LOGWARNING_2("Weapon Mod [%1] missing ace compat pbo [%2] (from @ace\optionals)",_modPBO,_compatPBO);
WARNING_2("Weapon Mod [%1] missing ace compat pbo [%2] (from @ace\optionals)",_modPBO,_compatPBO);
};
} forEach [
["RH_acc","ace_compat_rh_acc"],

View File

@ -2,6 +2,8 @@
ADDON = false;
PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
ADDON = true;

View File

@ -10,6 +10,9 @@
* Return Value:
* muzzle velocity shift - m/s <NUMBER>
*
* Example:
* [[], 5] call ace_advanced_ballistics_fnc_calcilateAmmoTemperatureVelocityShift
*
* Public: No
*/
#include "script_component.hpp"

View File

@ -13,6 +13,9 @@
* Return Value:
* corrected ballistic coefficient <NUMBER>
*
* Example:
* [2, 5, 5, 0.5, "ASM"] call ace_advanced_ballistics_fnc_calculateAtmosphericCorrection
*
* Public: No
*/
#include "script_component.hpp"

View File

@ -4,7 +4,7 @@
* Calculates the muzzle velocity shift caused by different barrel lengths
*
* Arguments:
* 0: barrel length - mm
* 0: barrel length - mm <NUMBER>
* 1: muzzle velocity lookup table - m/s <ARRAY>
* 2: barrel length lookup table - mm <ARRAY>
* 3: muzzle velocity - m/s <NUMBER>
@ -12,6 +12,9 @@
* Return Value:
* muzzle velocity shift - m/s <NUMBER>
*
* Example:
* [5, [0,5], [0,5], 5] call ace_advanced_ballistics_fnc_calculateBarrelLengthVelocityShift
*
* Public: No
*/
#include "script_component.hpp"

View File

@ -11,6 +11,9 @@
* Return Value:
* retardation - m/(s^2) <NUMBER>
*
* Example:
* [5, 20, 10] call ace_advanced_ballistics_fnc_calculateRetardation
*
* Public: No
*/
#include "script_component.hpp"

View File

@ -15,6 +15,9 @@
* Return Value:
* stability factor <NUMBER>
*
* Example:
* [1, 2, 3, 4, 5, 6, 7] call ace_advanced_ballistics_fnc_calculateStabilityFactor
*
* Public: No
*/
#include "script_component.hpp"

View File

@ -10,6 +10,9 @@
* Return Value:
* None
*
* Example:
* [] call ace_advanced_ballistics_fnc_diagnoseWeapons
*
* Public: No
*/
#define DEBUG_MODE_FULL

View File

@ -9,6 +9,9 @@
* Return Value:
* None
*
* Example:
* [] call ace_advanced_ballistics_fnc_displayProtractor
*
* Public: No
*/
#include "script_component.hpp"

View File

@ -8,6 +8,9 @@
* Return Value:
* None
*
* Example:
* [] call ace_advanced_ballistics_fnc_handleFirePFH
*
* Public: No
*/
#include "script_component.hpp"

View File

@ -9,6 +9,9 @@
* Return Value:
* None
*
* Example:
* [] call ace_advanced_ballistics_fnc_handleFired
*
* Public: No
*/
#include "script_component.hpp"
@ -42,12 +45,6 @@ if (!GVAR(simulateForEveryone) && !(local _unit)) then {
//if (!GVAR(vehicleGunnerEnabled) && !(_unit isKindOf "Man")) then { _abort = true; }; // We currently do not have firedEHs on vehicles
if (GVAR(disabledInFullAutoMode) && getNumber(configFile >> "CfgWeapons" >> _weapon >> _mode >> "autoFire") == 1) then { _abort = true; };
if (_abort || !(GVAR(extensionAvailable))) exitWith {
if (missionNamespace getVariable [QEGVAR(windDeflection,enabled), false]) then {
EGVAR(windDeflection,trackedBullets) pushBack [_projectile, getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction")];
};
};
// Get Weapon and Ammo Configurations
_AmmoCacheEntry = uiNamespace getVariable format[QGVAR(%1), _ammo];
if (isNil "_AmmoCacheEntry") then {
@ -86,6 +83,12 @@ if (GVAR(ammoTemperatureEnabled) || GVAR(barrelLengthInfluenceEnabled)) then {
};
};
if (_abort || !(GVAR(extensionAvailable))) exitWith {
if (missionNamespace getVariable [QEGVAR(windDeflection,enabled), false]) then {
EGVAR(windDeflection,trackedBullets) pushBack [_projectile, getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction")];
};
};
_bulletTraceVisible = false;
if (GVAR(bulletTraceEnabled) && cameraView == "GUNNER") then {
if (currentWeapon ACE_player == binocular ACE_player) then {

View File

@ -10,6 +10,9 @@
* Return Value:
* None
*
* Example:
* [LOGIC, [bob, kevin], true] call ace_advanced_ballistics_fnc_initModuleSettings
*
* Public: No
*/
#include "script_component.hpp"

View File

@ -8,6 +8,9 @@
* Return Value:
* None
*
* Example:
* [] call ace_advanced_ballistics_fnc_initializeTerrainExtension
*
* Public: No
*/
#include "script_component.hpp"
@ -22,6 +25,7 @@ _initStartTime = CBA_missionTime;
_mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize");
if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith {
INFO_1("Terrain already initialized [world: %1]", worldName);
#ifdef DEBUG_MODE_FULL
systemChat "AdvancedBallistics: Terrain already initialized";
#endif
@ -32,11 +36,14 @@ _gridCells = _mapGrids * _mapGrids;
GVAR(currentGrid) = 0;
INFO_2("Starting Terrain Extension [cells: %1] [world: %2]", _gridCells, worldName);
[{
params ["_args","_idPFH"];
_args params ["_mapGrids", "_gridCells", "_initStartTime"];
if (GVAR(currentGrid) >= _gridCells) exitWith {
INFO_2("Finished terrain initialization in %1 seconds [world: %2]", ceil(CBA_missionTime - _initStartTime), worldName);
#ifdef DEBUG_MODE_FULL
systemChat format["AdvancedBallistics: Finished terrain initialization in %1 seconds", ceil(CBA_missionTime - _initStartTime)];
#endif

View File

@ -7,18 +7,21 @@
* ammo - classname <STRING>
*
* Return Value:
* 0: _airFriction
* 1: _caliber
* 2: _bulletLength
* 3: _bulletMass
* 4: _transonicStabilityCoef
* 5: _dragModel
* 6: _ballisticCoefficients
* 7: _velocityBoundaries
* 8: _atmosphereModel
* 9: _ammoTempMuzzleVelocityShifts
* 10: _muzzleVelocityTable
* 11: _barrelLengthTable
* 0: _airFriction <NUMBER>
* 1: _caliber <NUMBER>
* 2: _bulletLength <NUMBER>
* 3: _bulletMass <NUMBER>
* 4: _transonicStabilityCoef <NUMBER>
* 5: _dragModel <NUMBER>
* 6: _ballisticCoefficients <NUMBER>
* 7: _velocityBoundaries <NUMBER>
* 8: _atmosphereModel <NUMBER>
* 9: _ammoTempMuzzleVelocityShifts <NUMBER>
* 10: _muzzleVelocityTable <NUMBER>
* 11: _barrelLengthTable <NUMBER>
*
* Example:
* ["ammo"] call ace_advanced_ballistics_fnc_readAmmoDataFromConfig
*
* Public: No
*/
@ -26,7 +29,7 @@
TRACE_1("Reading Ammo Config",_this);
private ["_ammo", "_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable", "_result"];
_ammoConfig = configFile >> "CfgAmmo" >> _this;
private _ammoConfig = configFile >> "CfgAmmo" >> _this;
_airFriction = getNumber(_ammoConfig >> "airFriction");
_caliber = getNumber(_ammoConfig >> "ACE_caliber");
@ -59,7 +62,7 @@ if ((_typicalSpeed > 0) && {_typicalSpeed < 360}) then {
if (_inheritedBarrelConfig || _inheritedTempConfig) then {
private _parentConfig = inheritsFrom _ammoConfig;
private _parentSpeed = getNumber (_parentConfig >> "typicalSpeed");
ACE_LOGWARNING_4("Subsonic Ammo %1 (%2 m/s) missing `ACE_muzzleVelocities` or `ACE_ammoTempMuzzleVelocityShifts` configs, attempting to use parent %3 (%4m/s)",_this,_typicalSpeed,configName _parentConfig, _parentSpeed);
WARNING_4("Subsonic Ammo %1 (%2 m/s) missing `ACE_muzzleVelocities` or `ACE_ammoTempMuzzleVelocityShifts` configs, attempting to use parent %3 (%4m/s)",_this,_typicalSpeed,configName _parentConfig, _parentSpeed);
if (_parentSpeed <= 0) exitWith {//Handle weird or null parent
_muzzleVelocityTable = [];
_ammoTempMuzzleVelocityShifts = [];

View File

@ -7,9 +7,12 @@
* weapon - classname <STRING>
*
* Return Value:
* 0: _barrelTwist
* 1: _twistDirection
* 2: _barrelLength
* 0: _barrelTwist <NUMBER>
* 1: _twistDirection <NUMBER>
* 2: _barrelLength <NUMBER>
*
* Example:
* ["weapon"] call ace_advanced_ballistics_fnc_readWeaponDataFromConfig
*
* Public: No
*/
@ -30,6 +33,6 @@ private _barrelLength = getNumber(_weaponConfig >> "ACE_barrelLength");
private _result = [_barrelTwist, _twistDirection, _barrelLength];
uiNamespace setVariable [format[QGVAR(%1), _weapon], _result];
uiNamespace setVariable [format[QGVAR(%1), _this], _result];
_result

View File

@ -4,7 +4,6 @@
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define CBA_DEBUG_SYNCHRONOUS
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_ADVANCEDBALLISTICS

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Advanced_Ballistics">
<Key ID="STR_ACE_Advanced_Ballistics_WindInfoKey">
@ -12,6 +12,10 @@
<Hungarian>Széladatok mutatása</Hungarian>
<Czech>Zobrazit údaje o větru</Czech>
<Portuguese>Mostrar Informação do Vento</Portuguese>
<Japanese>風の情報を表示</Japanese>
<Korean>바람의 정보를 표시</Korean>
<Chinese>顯示風況</Chinese>
<Chinesesimp>显示风况</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_ProtractorKey">
<English>Show Protractor</English>
@ -24,6 +28,10 @@
<Hungarian>Szögmérő mutatása</Hungarian>
<Czech>Zobrazit úhloměr</Czech>
<Portuguese>Mostrar Transferidor</Portuguese>
<Japanese>分度器を表示</Japanese>
<Korean>각도기 표시</Korean>
<Chinese>顯示量角器</Chinese>
<Chinesesimp>显示量角器</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_DisplayName">
<English>Advanced Ballistics</English>
@ -36,6 +44,10 @@
<Hungarian>Fejlett ballisztika</Hungarian>
<Russian>Продвинутая баллистика</Russian>
<Italian>Balistica Avanzata</Italian>
<Japanese>アドバンスド バリスティックス</Japanese>
<Korean>고급 탄도학</Korean>
<Chinese>先進彈道系統</Chinese>
<Chinesesimp>先进弹道系统</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_enabled_DisplayName">
<English>Advanced Ballistics</English>
@ -48,6 +60,10 @@
<Hungarian>Fejlett ballisztika</Hungarian>
<Russian>Продвинутая баллистика</Russian>
<Italian>Balistica Avanzata</Italian>
<Japanese>アドバンスド バリスティックス</Japanese>
<Korean>고급 탄도학</Korean>
<Chinese>先進彈道系統</Chinese>
<Chinesesimp>先进弹道系统</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_enabled_Description">
<English>Enables advanced ballistics</English>
@ -60,6 +76,10 @@
<Hungarian>Engedélyezi a fejlett ballisztikát</Hungarian>
<Russian>Включает продвинутую баллистику</Russian>
<Italian>Abilita Balistica Avanzata</Italian>
<Japanese>アドバンスド バリスティックスを有効化</Japanese>
<Korean>고급 탄도학을 적용합니다</Korean>
<Chinese>啟用先進彈道系統</Chinese>
<Chinesesimp>启用先进弹道系统</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_DisplayName">
<English>Enabled For Snipers</English>
@ -72,6 +92,10 @@
<Hungarian>Mesterlövészeknek engedélyezve</Hungarian>
<Russian>Включена для снайперов</Russian>
<Italian>Abilita per Tiratori Scelti</Italian>
<Japanese>狙撃手へ有効化</Japanese>
<Korean>저격수만 적용</Korean>
<Chinese>啟用給狙擊手</Chinese>
<Chinesesimp>启用给狙击手</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_Description">
<English>Enables advanced ballistics for non local snipers (when using high power optics)</English>
@ -84,6 +108,10 @@
<Hungarian>Engedélyezi a fejlett ballisztikát nem-helyi mesterlövészeknek (nagy-teljesítményű optika használatakor)</Hungarian>
<Russian>Включает продвинутую баллистику для нелокальных снайперов (при использовании мощной оптики)</Russian>
<Italian>Abilita Balistica Avanzata per Tiratori Scelti non locali (con ottiche ad alto potenziale)</Italian>
<Japanese>非ローカルの狙撃手 (高倍率スコープを使っている場合)へアドバンスド バリスティックスを有効化します</Japanese>
<Korean>고급 탄도학을 비-저격수 인원에게도 적용합니다(고성능 조준경을 사용시)</Korean>
<Chinese>啟用先進彈道系統給非本地狙擊手(當使用高倍率光學瞄鏡時)</Chinese>
<Chinesesimp>启用先进弹道系统给非本地狙击手(当使用高倍率光学瞄镜时)</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_DisplayName">
<English>Enabled For Group Members</English>
@ -96,6 +124,10 @@
<Hungarian>Csoporttagoknak engedélyezve</Hungarian>
<Russian>Включена для группы</Russian>
<Italian>Abilita per Membri del Gruppo</Italian>
<Japanese>グループ メンバーへ有効化</Japanese>
<Korean>그룹 멤버도 적용</Korean>
<Chinese>啟用給小隊成員</Chinese>
<Chinesesimp>启用给小队成员</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_Description">
<English>Enables advanced ballistics for non local group members</English>
@ -108,6 +140,10 @@
<Hungarian>Engedélyezi a fejlett ballisztikát nem-helyi csoporttagoknak</Hungarian>
<Russian>Включает продвинутую баллистику для нелокальных членов группы</Russian>
<Italian>Abilita Balistica Avanzata per Membri non locali del Gruppo</Italian>
<Japanese>非ローカルのグループ メンバーへアドバンスド バリスティックスを有効化します</Japanese>
<Korean>고급 탄도학을 비-그룹멤버에게도 적용합니다</Korean>
<Chinese>啟用先進彈道系統給非本地小隊成員</Chinese>
<Chinesesimp>启用先进弹道系统给非本地小队成员</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_DisplayName">
<English>Enabled For Everyone</English>
@ -120,6 +156,10 @@
<Hungarian>Mindenkinek engedélyezve</Hungarian>
<Russian>Включена для всех</Russian>
<Italian>Abilita per tutti</Italian>
<Japanese>全員に有効化</Japanese>
<Korean>모두에게 적용</Korean>
<Chinese>啟用給所有人</Chinese>
<Chinesesimp>启用给所有人</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_Description">
<English>Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer)</English>
@ -131,7 +171,11 @@
<French>Active la balistique avancée pour tous les joueurs non locaux (activer cette option peut avoir un impact sur les performance en multi durant les grands échanges de tirs)</French>
<Hungarian>Engedélyezi a fejlett ballisztikát az összes nem-helyi játékosnak (ez a funkció leronthatja a teljesítményt intenzív többjátékos tűzharcok alatt)</Hungarian>
<Russian>Включает продвинутую баллистику для всех нелокальных игроков (включение этой опции может снизить производительность при массовых перестрелках в мультиплеере)</Russian>
<Italian>Abilita Balistica Avanzata per tutti i giocatori non locali (abilitare questo parametro potrebbe degradare le prestazioni durante scontri intensi in multiplayer)</Italian>
<Italian>Abilita Balistica Avanzata per tutti i giocatori non locali (abilitare questo parametro potrebbe ridurre le prestazioni durante scontri intensi in multiplayer)</Italian>
<Japanese>非ローカルの全プレイヤーへアドバンスド バリスティックスを有効化します (マルチプレイで大規模な銃撃戦がおこなわれると、動作の低下を招きます)</Japanese>
<Korean>고급 탄도학을 모든 비-로컬그룹에게도 적용합니다(적용 후 대규모 전투시 성능하락을 유발할 수 있습니다)</Korean>
<Chinese>啟用先進彈道系統給所有非本地玩家 (啟用此功能後,在多人連線大量交火時可能會降低效能)</Chinese>
<Chinesesimp>启用先进弹道系统给所有非本地玩家 (启用此功能后,在多人连线大量交火时可能会降低效能)</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_DisplayName">
<English>Always Enabled For Group Members</English>
@ -144,6 +188,10 @@
<Hungarian>Mindig engedélyezve csoporttagoknak</Hungarian>
<Russian>Всегда включена для членов группы</Russian>
<Italian>Sempre abilitato per Membri del Gruppo</Italian>
<Japanese>常にグループ メンバーへ有効化</Japanese>
<Korean>그룹 멤버에게 항상 적용</Korean>
<Chinese>永遠啟用給小隊成員</Chinese>
<Chinesesimp>永远启用给小队成员</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_Description">
<English>Always enables advanced ballistics when a group member fires</English>
@ -155,7 +203,11 @@
<French>Active tout le temps la balistique avancée quand un membre du groupe ouvre le feu</French>
<Hungarian>Mindig engedélyezi a fejlett ballisztikát, ha egy csoporttag tüzel</Hungarian>
<Russian>Всегда включает продвинутую баллистику когда стреляет член группы</Russian>
<Italian>Abilita sempre Balistica Avanzata quando un Membro del Gruppo spara</Italian>
<Italian>Abilita sempre Balistica Avanzata quando un membro del gruppo spara</Italian>
<Japanese>グループ メンバーが射撃した時、常にアドバンスド バリスティックスを有効化します</Japanese>
<Korean>그룹 멤버가 발사시 항상 고급 탄도학을 적용합니다</Korean>
<Chinese>當小隊成員開火時,永遠啟用先進彈道系統</Chinese>
<Chinesesimp>当小队成员开火时,永远启用先进弹道系统</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_DisplayName">
<English>Disabled In FullAuto Mode</English>
@ -168,6 +220,10 @@
<Hungarian>Automata módban letiltva</Hungarian>
<Russian>Выкл. для автомат. режима</Russian>
<Italian>Disabilita in modalità di fuoco automatico</Italian>
<Japanese>フルオートでは無効化</Japanese>
<Korean>조정간 자동시 비활성화</Korean>
<Chinese>在全自動模式時關閉</Chinese>
<Chinesesimp>在全自动模式时关闭</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_Description">
<English>Disables the advanced ballistics during full auto fire</English>
@ -180,6 +236,10 @@
<Hungarian>Letiltja a fejlett ballisztikát automata tüzelés folyamán</Hungarian>
<Russian>Выключает продвинутую баллистику при стрельбе в полностью автоматическом режиме</Russian>
<Italian>Disabilita Balistica Avanzata durante fuoco automatico</Italian>
<Japanese>フルオートで射撃中ではアドバンスド バリスティックスを無効化します</Japanese>
<Korean>조정간 자동시 고급 탄도학을 비활성화 합니다</Korean>
<Chinese>在全自動模式開火時,關閉先進彈道系統</Chinese>
<Chinesesimp>在全自动模式开火时,关闭先进弹道系统</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_DisplayName">
<English>Enable Ammo Temperature Simulation</English>
@ -192,6 +252,10 @@
<Hungarian>Lőszer-hő szimuláció engedélyezése</Hungarian>
<Russian>Симуляция температуры для боеприпасов</Russian>
<Italian>Abilita simulazione della temperatura delle munizioni</Italian>
<Japanese>弾薬の温度シミュレーションを有効化</Japanese>
<Korean>탄약 온도 구현 적용</Korean>
<Chinese>啟用彈藥溫度模擬系統</Chinese>
<Chinesesimp>启用弹药温度模拟系统</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_Description">
<English>Muzzle velocity varies with ammo temperature</English>
@ -203,7 +267,11 @@
<French>La température de la munition influe sur la vélocité intiale</French>
<Hungarian>A kezdősebesség a lőszer hőmérsékletétől függően változó</Hungarian>
<Russian>Начальная скорость пули зависит от температуры</Russian>
<Italian>Velocità alla volata varia con la temperatura delle munizioni</Italian>
<Italian>La velocità dello sparo varia a seconda della temperatura delle munizioni</Italian>
<Japanese>弾薬の温度により初速値を変化させます</Japanese>
<Korean>탄약 온도에 비례해 총구 속도가 달라집니다</Korean>
<Chinese>子彈初速將隨彈藥溫度而有所變化</Chinese>
<Chinesesimp>子弹初速将随弹药温度而有所变化</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_DisplayName">
<English>Enable Barrel Length Simulation</English>
@ -216,6 +284,10 @@
<Hungarian>Csőhossz-szimuláció engedélyezése</Hungarian>
<Russian>Симуляция длины ствола</Russian>
<Italian>Abilita simulazione della lunghezza della canna</Italian>
<Japanese>銃身長のシミュレーションを有効化</Japanese>
<Korean>총열 길이 구현 적용</Korean>
<Chinese>啟用槍管長度模擬系統</Chinese>
<Chinesesimp>启用枪管长度模拟系统</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_Description">
<English>Muzzle velocity varies with barrel length</English>
@ -227,7 +299,11 @@
<French>La longueur du canon influe sur la vélocité initale</French>
<Hungarian>A kezdősebesség a cső hosszától függően változó</Hungarian>
<Russian>Начальная скорость пули зависит от длины ствола</Russian>
<Italian>Velocità alla volata varia con la lunghezza della canna</Italian>
<Italian>La velocità di sparo varia a seconda della lunghezza della canna</Italian>
<Japanese>銃身長により初速値を変化させます</Japanese>
<Korean>총구 속도가 총열에 비례해 달라집니다</Korean>
<Chinese>子彈初速將隨槍管長度而有所變化</Chinese>
<Chinesesimp>子弹初速将随枪管长度而有所变化</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_DisplayName">
<English>Enable Bullet Trace Effect</English>
@ -239,7 +315,11 @@
<French>Activer l'effet balle traçante</French>
<Hungarian>Nyomkövető-effekt engedélyezése</Hungarian>
<Russian>Следы пуль</Russian>
<Italian>Abilita effetto di tracciatura dei proiettili</Italian>
<Italian>Abilita effetto dei Proiettili Traccianti</Italian>
<Japanese>弾丸の痕跡表示を有効化</Japanese>
<Korean>예광탄 효과 적용</Korean>
<Chinese>啟用曳光彈效果</Chinese>
<Chinesesimp>启用曳光弹效果</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_Description">
<English>Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics)</English>
@ -251,7 +331,11 @@
<French>Active une tracante pour les munitions de gros calibre (seulement visible en utilisant des optiques avancées)</French>
<Hungarian>Engedélyezi a nagy kaliberű lövedékek nyomának vizuális követését (csak nagy teljesítményű optikán keresztül látható)</Hungarian>
<Russian>Включает эффект следов пуль для больших калибров (видны только через мощную оптику)</Russian>
<Italian>Abilita effetto di tracciatura per proiettili di alto calibro (visibile solo attraverso ottiche ad alto potenziale)</Italian>
<Italian>Abilita effetto dei proiettili traccianti di alto calibro (visibile solo attraverso ottiche ad alto potenziale)</Italian>
<Japanese>大口径の銃弾による弾丸の痕跡表示を有効化します (高倍率スコープを介してでしか見れません)</Japanese>
<Korean>대구경 탄환에 예광탄 효과를 적용합니다(오직 고성능 조준경 사용시에만 보입니다)</Korean>
<Chinese>啟用曳光彈效果給大口徑子彈 (只有透過高倍率光學瞄鏡才能看到)</Chinese>
<Chinesesimp>启用曳光弹效果给大口径子弹 (只有透过高倍率光学瞄镜才能看到)</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_DisplayName">
<English>Simulation Interval</English>
@ -264,6 +348,10 @@
<Hungarian>Szimuláció intervalluma</Hungarian>
<Russian>Интервал симуляции</Russian>
<Italian>Intervallo Simulazione</Italian>
<Japanese>シミュレーション間隔</Japanese>
<Korean>구현 간격</Korean>
<Chinese>模擬間隔</Chinese>
<Chinesesimp>模拟间隔</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_Description">
<English>Defines the interval between every calculation step</English>
@ -276,6 +364,10 @@
<Hungarian>Meghatározza a számítási lépések közötti időintervallumot</Hungarian>
<Russian>Определяет временной интервал между вычислениями</Russian>
<Italian>Definisce l'intervallo tra ogni step di calcolo</Italian>
<Japanese>各計算ごとの間隔を定義します</Japanese>
<Korean>각 계산 단위의 간격을 정의합니다</Korean>
<Chinese>定義每個模擬計算之間的時間間隔</Chinese>
<Chinesesimp>定义每个模拟计算之间的时间间隔</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_DisplayName">
<English>Simulation Radius</English>
@ -288,6 +380,10 @@
<Hungarian>Szimuláció hatóköre</Hungarian>
<Russian>Радиус симуляции</Russian>
<Italian>Raggio Simulazione</Italian>
<Japanese>シミュレーションの適用範囲</Japanese>
<Korean>구현 범위</Korean>
<Chinese>模擬半徑</Chinese>
<Chinesesimp>模拟半径</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_Description">
<English>Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles</English>
@ -300,6 +396,10 @@
<Hungarian>Meghatározza a játékos körüli hatókört (méterben), ahol a lövedékek fejlett ballisztikát használnak</Hungarian>
<Russian>Определяет радиус вокруг игрока (в метрах), в котором продвинутая баллистика применяется к снарядам</Russian>
<Italian>Definisce il raggio attorno al giocatore (in metri) per cui la Balistica Avanzata è applicata ai proiettili</Italian>
<Japanese>プレイヤーの周囲にアドバンスド バリスティックスによる弾道を適用させる範囲を半径で定義します (メートル)</Japanese>
<Korean>플레이어 주위의 발사체를 고급 탄도학으로 정의하는 범위를 정합니다(미터)</Korean>
<Chinese>以玩家的半徑距離(公尺)定義先進彈道系統啟用範圍</Chinese>
<Chinesesimp>以玩家的半径距离(公尺)定义先进弹道系统启用范围</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_Description">
<English>This module enables advanced ballistics simulation - meaning the trajectory of projectiles is influenced by variables like air temperature, atmospheric pressure, humidity, gravity, the type of ammunition and the weapon from which it was fired.</English>
@ -312,6 +412,10 @@
<Russian>Этот модуль включает симуляцию продвинутой баллистики - при этом на траекторию полета снаряда влияют различные параметры, такие как температура воздуха, атмосферное давление, влажность, гравитация, тип боеприпаса и оружия, из которого произвели выстрел.</Russian>
<Spanish>Este módulo permite la simulación balística avanzada - es decir, la trayectoria de los proyectiles está influenciada por variables como la temperatura del aire, la presión atmosférica, la humedad, la gravedad, el tipo de municiones y el arma desde el que fue disparada.</Spanish>
<Italian>Questo modulo abilita la simulazione della Balistica Avanzata - cioè la traiettoria dei proiettili è influenzata da variabili come la temperatura dell'aria, pressione atmosferica, umidità, gravità, il tipo di munizione e l'arma da cui è sparata</Italian>
<Japanese>このモジュールはアドバンスド バリスティックスを有効化します。弾道は気温や気圧、湿度、重力、弾薬の種類、発射する武器から影響を受けるようになります。</Japanese>
<Korean>이 모듈은 고급 탄도학을 적용시킵니다 - 이는 발사체의 궤적이 기온, 대기압, 습도, 중력, 탄환의 종류와 어느 무기에서 발사되는지에 따라 영향을 받습니다.</Korean>
<Chinese>該模塊實現先進的彈道仿真 - 這意味著子彈的軌跡是由空氣溫度、大氣壓力、濕度、重力、彈藥類型以及射擊的武器所影響.</Chinese>
<Chinesesimp>该模块实现先进的弹道仿真 - 这意味着子弹的轨迹是由空气温度、大气压力、湿度、重力、弹药类型以及射击的武器所影响.</Chinesesimp>
</Key>
</Package>
</Project>

View File

@ -5,6 +5,6 @@ PREP(getMetabolicCosts);
PREP(handleEffects);
PREP(handlePlayerChanged);
PREP(handleStaminaBar);
PREP(mainLoop);
PREP(moduleSettings);
PREP(pfhMain);
PREP(removeDutyFactor);

View File

@ -12,31 +12,40 @@ if (!hasInterface) exitWith {};
GVAR(ppeBlackout) ppEffectCommit 0.4;
// - GVAR updating and initialization -----------------------------------------
if !(isNull ACE_player) then {
[ACE_player, objNull] call FUNC(handlePlayerChanged);
};
["unit", FUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler;
["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler;
["visibleMap", {
params ["", "_visibleMap"]; // command visibleMap is updated one frame later
private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull];
_staminaBarContainer ctrlShow ((!_visibleMap) && {(vehicle ACE_player) == ACE_player});
}, true] call CBA_fnc_addPlayerEventHandler;
["vehicle", {
private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull];
_staminaBarContainer ctrlShow ((!visibleMap) && {(vehicle ACE_player) == ACE_player});
}, true] call CBA_fnc_addPlayerEventHandler;
// - Duty factors -------------------------------------------------------------
[QEGVAR(medical,pain), {
1 + (((_this getVariable [QEGVAR(medical,pain), 0]) min 1) / 10)
if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then {
[QEGVAR(medical,pain), { // 0->1.0, 0.5->1.05, 1->1.1
linearConversion [0, 1, (_this getVariable [QEGVAR(medical,pain), 0]), 1, 1.1, true];
}] call FUNC(addDutyFactor);
[QEGVAR(medical,bloodVolume), {
2 - (((_this getVariable [QEGVAR(medical,bloodVolume), 100]) min 100) / 100)
[QEGVAR(medical,bloodVolume), { // 100->1.0, 90->1.1, 80->1.2
linearConversion [100, 0, (_this getVariable [QEGVAR(medical,bloodVolume), 100]), 1, 2, true];
}] call FUNC(addDutyFactor);
[QEGVAR(dragging,isCarrying), {
if (_this getVariable [QEGVAR(dragging,isCarrying), false]) then {
3
} else {
1
};
if (["ACE_Dragging"] call EFUNC(common,isModLoaded)) then {
[QEGVAR(dragging,isCarrying), {
[1, 3] select (_this getVariable [QEGVAR(dragging,isCarrying), false]);
}] call FUNC(addDutyFactor);
[QEGVAR(weather,temperature), {
(((missionNamespace getVariable [QEGVAR(weather,currentTemperature), 25]) - 35) / 10) max 2 min 1
};
if (["ACE_Weather"] call EFUNC(common,isModLoaded)) then {
[QEGVAR(weather,temperature), { // 35->1, 45->2
linearConversion [35, 45, (missionNamespace getVariable [QEGVAR(weather,currentTemperature), 25]), 1, 2, true];
}] call FUNC(addDutyFactor);
};
// - Add main PFH -------------------------------------------------------------
[FUNC(pfhMain), 1, []] call CBA_fnc_addPerFrameHandler;
// - Add main loop at 1 second interval -------------------------------------------------------------
[FUNC(mainLoop), [], 1] call CBA_fnc_waitAndExecute;
}] call CBA_fnc_addEventHandler;
["ace_settingChanged", {

View File

@ -2,7 +2,9 @@
ADDON = false;
PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
//#include "initSettings.sqf"
GVAR(staminaBarWidth) = 10 * (((safezoneW / safezoneH) min 1.2) / 40);

View File

@ -7,7 +7,7 @@ class CfgPatches {
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author = CSTRING(ACETeam);
author = ECSTRING(common,ACETeam);
authors[] = {"BaerMitUmlaut"};
url = ECSTRING(main,URL);
VERSION_CONFIG;

View File

@ -8,6 +8,11 @@
*
* Return Value:
* None
*
* Example:
* ["ID", 5] call ace_advanced_fatigue_fnc_addDutyFactor
*
* Public: No
*/
#include "script_component.hpp"
params [["_id", "", [""]], ["_factor", 1, [0, {}]]];

View File

@ -7,6 +7,11 @@
*
* Return Value:
* None
*
* Example:
* [DISPLAY] call ace_advanced_fatigue_fnc_createStaminaBar
*
* Public: No
*/
#include "script_component.hpp"
params ["_display"];

View File

@ -21,14 +21,16 @@ private _duty = 1;
private _animType = _animName select [1, 3];
GVAR(isSwimming) = false;
GVAR(isProne) = (stance _unit) == "PRONE";
if (_animType in ["idl", "mov"]) then {
if (_animType in ["idl", "mov", "adj"]) then {
switch (_animName select [5, 3]) do {
case ("knl"): {
_duty = 1.5;
};
case ("pne"): {
_duty = 12;
_duty = 10;
GVAR(isProne) = true; // #4880 - Unarmed sprint->prone has wrong `stance`
};
default {
_duty = 1;
@ -47,10 +49,16 @@ if (_animType in ["idl", "mov"]) then {
};
} else {
// swimming and diving
if (_animType in ["swm", "ssw", "bsw", "dve", "sdv", "bdv"]) then {
_duty = 5;
switch (true) do {
case (_animType in ["swm", "ssw", "bsw"]): {
_duty = 6.5;
GVAR(isSwimming) = true;
};
case (_animType in ["dve", "sdv", "bdv"]): {
_duty = 2.5;
GVAR(isSwimming) = true;
};
};
};
_duty

View File

@ -18,18 +18,8 @@
#include "script_component.hpp"
params ["_unit", "_velocity"];
private _virtualLoad = 0;
{
_virtualLoad = _virtualLoad + (_x getVariable [QEGVAR(movement,vLoad), 0]);
} forEach [
_unit,
uniformContainer _unit,
vestContainer _unit,
backpackContainer _unit
];
private _gearMass = ((_unit getVariable [QEGVAR(movement,totalLoad), loadAbs _unit]) / 22.046) * GVAR(loadFactor);
private _gearMass = ((loadAbs _unit + _virtualLoad) * 0.1 / 2.2046) * GVAR(loadFactor);
private _terrainFactor = 1;
private _terrainAngle = asin (1 - ((surfaceNormal getPosASL _unit) select 2));
private _terrainGradient = (_terrainAngle / 45 min 1) * 5 * GVAR(terrainGradientFactor);
private _duty = GVAR(animDuty);
@ -50,12 +40,12 @@ if (_velocity > 2) then {
(
2.10 * SIM_BODYMASS
+ 4 * (SIM_BODYMASS + _gearMass) * ((_gearMass / SIM_BODYMASS) ^ 2)
+ _terrainFactor * (SIM_BODYMASS + _gearMass) * (0.90 * (_velocity ^ 2) + 0.66 * _velocity * _terrainGradient)
+ (SIM_BODYMASS + _gearMass) * (0.90 * (_velocity ^ 2) + 0.66 * _velocity * _terrainGradient)
) * 0.23 * _duty
} else {
(
1.05 * SIM_BODYMASS
+ 4 * (SIM_BODYMASS + _gearMass) * ((_gearMass / SIM_BODYMASS) ^ 2)
+ _terrainFactor * (SIM_BODYMASS + _gearMass) * (1.15 * (_velocity ^ 2) + 0.66 * _velocity * _terrainGradient)
+ (SIM_BODYMASS + _gearMass) * (1.15 * (_velocity ^ 2) + 0.66 * _velocity * _terrainGradient)
) * 0.23 * _duty
};

View File

@ -58,7 +58,18 @@ if (GVAR(ppeBlackoutLast) == 1) then {
// - Physical effects ---------------------------------------------------------
if (GVAR(isSwimming)) exitWith {
_unit setAnimSpeedCoef (1 - _fatigue / 3);
_unit setAnimSpeedCoef linearConversion [0.7, 0.9, _fatigue, 1, 0.5, true];
if ((isSprintAllowed _unit) && {_fatigue > 0.7}) then {
[_unit, "blockSprint", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
} else {
if ((!isSprintAllowed _unit) && {_fatigue < 0.7}) then {
[_unit, "blockSprint", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
};
};
};
if ((getAnimSpeedCoef _unit) != 1) then {
_unit setAnimSpeedCoef 1;
};
if (_overexhausted) then {

View File

@ -8,13 +8,21 @@
*
* Return Value:
* None
*
* Example:
* [newbob, oldbob] call ace_advanced_fatigue_fnc_handlePlayerChanged
*
* Public: No
*/
#include "script_component.hpp"
params ["_newUnit", "_oldUnit"];
TRACE_2("unit changed",_newUnit,_oldUnit);
if !(isNull _oldUnit) then {
_oldUnit enableStamina true;
_oldUnit removeEventHandler ["AnimChanged", _oldUnit getVariable [QGVAR(animHandler), -1]];
_oldUnit setVariable [QGVAR(animHandler), nil];
TRACE_1("remove old",_oldUnit getVariable QGVAR(animHandler));
_oldUnit setVariable [QGVAR(ae1Reserve), GVAR(ae1Reserve)];
_oldUnit setVariable [QGVAR(ae2Reserve), GVAR(ae2Reserve)];
@ -30,6 +38,7 @@ if (_newUnit getVariable [QGVAR(animHandler), -1] == -1) then {
private _animHandler = _newUnit addEventHandler ["AnimChanged", {
GVAR(animDuty) = _this call FUNC(getAnimDuty);
}];
TRACE_1("add new",_animHandler);
_newUnit setVariable [QGVAR(animHandler), _animHandler];
};
@ -50,7 +59,6 @@ GVAR(peakPower) = VO2MAX_STRENGTH * GVAR(VO2MaxPower);
GVAR(ae1PathwayPower) = GVAR(peakPower) / (13.3 + 16.7 + 113.3) * 13.3 * ANTPERCENT ^ 1.28 * 1.362;
GVAR(ae2PathwayPower) = GVAR(peakPower) / (13.3 + 16.7 + 113.3) * 16.7 * ANTPERCENT ^ 1.28 * 1.362;
GVAR(anPathwayPower) = GVAR(peakPower) - _ae1PathwayPower - _ae2PathwayPower;
GVAR(ppeBlackoutLast) = 100;
GVAR(lastBreath) = 0;

View File

@ -7,6 +7,11 @@
*
* Return Value:
* None
*
* Example:
* [0.5] call ace_advanced_fatigue_fnc_handleStaminaBar
*
* Public: No
*/
#include "script_component.hpp"
params ["_stamina"];

View File

@ -1,18 +1,34 @@
/*
* Author: BaerMitUmlaut
* Main perFrameHandler that updates fatigue values.
* Main looping function that updates fatigue values.
*
* Arguments:
* None
*
* Return Value:
* None
*
* Example:
* [] call ace_advanced_fatigue_fnc_mainLoop
*
* Public: No
*/
#include "script_component.hpp"
if (isNull ACE_player) exitWith {}; // Map intros
if (!alive ACE_player) exitWith { // Dead people don't breath, Will also handle null (Map intros)
[FUNC(mainLoop), [], 1] call CBA_fnc_waitAndExecute;
private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull];
_staminaBarContainer ctrlSetFade 1;
_staminaBarContainer ctrlCommit 1;
};
private _currentWork = REE;
private _currentSpeed = (vectorMagnitude (velocity ACE_player)) min 6;
// fix #4481. Diving to the ground is recorded as PRONE stance with running speed velocity. Cap maximum speed to fix.
if (GVAR(isProne)) then {
_currentSpeed = _currentSpeed min 1.5;
};
if ((vehicle ACE_player == ACE_player) && {_currentSpeed > 0.1} && {isTouchingGround ACE_player || {underwater ACE_player}}) then {
_currentWork = [ACE_player, _currentSpeed] call FUNC(getMetabolicCosts);
_currentWork = _currentWork max REE;
@ -21,11 +37,11 @@ if ((vehicle ACE_player == ACE_player) && {_currentSpeed > 0.1} && {isTouchingGr
// Calculate muscle damage increase
// Note: Muscle damage recovery is ignored as it takes multiple days
GVAR(muscleDamage) = GVAR(muscleDamage) + (_currentWork / GVAR(peakPower)) ^ 3.2 * 0.00004;
private _muscleIntegrity = 1 - GVAR(muscleDamage);
private _muscleIntegritySqrt = sqrt (1 - GVAR(muscleDamage));
// Calculate available power
private _ae1PathwayPowerFatigued = GVAR(ae1PathwayPower) * sqrt (GVAR(ae1Reserve) / AE1_MAXRESERVE) * OXYGEN * sqrt _muscleIntegrity;
private _ae2PathwayPowerFatigued = GVAR(ae2PathwayPower) * sqrt (GVAR(ae2Reserve) / AE2_MAXRESERVE) * OXYGEN * sqrt _muscleIntegrity;
private _ae1PathwayPowerFatigued = GVAR(ae1PathwayPower) * sqrt (GVAR(ae1Reserve) / AE1_MAXRESERVE) * OXYGEN * _muscleIntegritySqrt;
private _ae2PathwayPowerFatigued = GVAR(ae2PathwayPower) * sqrt (GVAR(ae2Reserve) / AE2_MAXRESERVE) * OXYGEN * _muscleIntegritySqrt;
// Calculate how much power is consumed from each reserve
private _ae1Power = _currentWork min _ae1PathwayPowerFatigued;
@ -61,3 +77,5 @@ private _perceivedFatigue = 1 - (_anReservePercentage min _aeReservePercentage);
if (GVAR(enableStaminaBar)) then {
[GVAR(anReserve) / AN_MAXRESERVE] call FUNC(handleStaminaBar);
};
[FUNC(mainLoop), [], 1] call CBA_fnc_waitAndExecute;

View File

@ -7,6 +7,11 @@
*
* Return Value:
* None
*
* Example:
* [MODULE] call ace_advanced_fatigue_fnc_moduleSettings
*
* Public: No
*/
#include "script_component.hpp"
params ["_logic"];

View File

@ -7,6 +7,11 @@
*
* Return Value:
* None
*
* Example:
* ["ID"] call ace_advanced_fatigue_fnc_removeDutyFactor
*
* Public: No
*/
#include "script_component.hpp"
params [["_id", "", [""]]];

View File

@ -4,7 +4,6 @@
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define CBA_DEBUG_SYNCHRONOUS
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_ADVANCED_FATIGUE

View File

@ -4,54 +4,145 @@
<Key ID="STR_ACE_Advanced_Fatigue_PerformanceFactor">
<English>Performance Factor</English>
<German>Leistungsfaktor</German>
<Japanese>パフォーマンス要因</Japanese>
<Polish>Współczynnik wydolności</Polish>
<Korean>성능 요인</Korean>
<French>Facteur de performance</French>
<Italian>Fattore Prestazione</Italian>
<Chinese>體力值</Chinese>
<Chinesesimp>体力值</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_PerformanceFactor_Description">
<English>Influences the overall performance of all players with no custom factor. Higher means better.</English>
<German>Beinflusst die Leistungsfähigkeit aller Spieler ohne eigenen Leistungsfaktor. Ein höherer Wert bedeutet bessere Leistung.</German>
<Japanese>非カスタム要因をもつ全プレイヤーへ全体的に動作を影響させます。高いほど影響がでます。</Japanese>
<Polish>Wpływa na ogólną wydolność organizmu u wszystkich graczy bez ustawionego niestandardowego współczynnika. Więcej znaczy lepiej.</Polish>
<Korean>모든 성능이 임의로 설정된 값 없이 영향받습니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Influence les performances générales de tous les joueurs sans facteurs personalisés. Une valeur plus élevée implique de meilleures performances.</French>
<Italian>Influenza qualsiasi prestazione di tutti i giocatori smuniti di un fattore personalizzato. Maggiore significa migliore.</Italian>
<Chinese>影響所有玩家的體力表現. 值越高代表體力越好.</Chinese>
<Chinesesimp>影响所有玩家的体力表现. 值越高代表体力越好.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_PerformanceFactor_EdenDescription">
<English>Influences the overall performance of this unit. Higher means better.</English>
<German>Beinflusst die Leistungsfähigkeit dieser Einheit. Ein höherer Wert bedeutet bessere Leistung.</German>
<Japanese>非カスタム要因をもつ全プレイヤーへ全体的に動作を影響させます。高いほど影響がでます。</Japanese>
<Polish>Wpływa na ogólną wydolność tej jednostki. Więcej znaczy lepiej.</Polish>
<Korean>모든 성능이 이 단위로 영향을 받습니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Influence les performances générales de cette unité. Une valeur plus élevée implique de meilleures performances.</French>
<Italian>Influenza qualsiasi prestazione di questa unità. Maggiore significa migliore.</Italian>
<Chinese>影響這個單位的體力表現. 值越高代表體力越好.</Chinese>
<Chinesesimp>影响这个单位的体力表现. 值越高代表体力越好.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RecoveryFactor">
<English>Recovery Factor</English>
<German>Erholungsfaktor</German>
<Japanese>回復要因</Japanese>
<Polish>Współczynnik regeneracji</Polish>
<Korean>회복 요인</Korean>
<French>Facteur de récupération</French>
<Italian>Fattore Recupero</Italian>
<Chinese>回復值</Chinese>
<Chinesesimp>回复值</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RecoveryFactor_Description">
<English>Changes how fast the player recovers when resting. Higher is faster.</English>
<German>Ändert, wie schnell ein Spieler Ausdauer regeneriert. Ein höherer Wert bedeutet eine schnellere Regeneration.</German>
<Japanese>休憩時は、プレイヤーが早く回復します。高いほど早くなります。</Japanese>
<Polish>Wpływa na czas regeneracji podczas postoju. Więcej znaczy szybciej.</Polish>
<Korean>얼마나 빨리 회복하는지를 바꿉니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Change la vitesse à laquelle les joueurs récupèrent leur endurance lorsqu'ils se reposent. Une valeur plus élevée implique une récupération plus rapide.</French>
<Italian>Determina in quanto tempo il giocatore recupera quando rilassato. Maggiore significa migliore.</Italian>
<Chinese>決定玩家休息多久就能回復體力. 值越高恢復越快.</Chinese>
<Chinesesimp>决定玩家休息多久就能回复体力. 值越高恢复越快.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_LoadFactor">
<English>Load Factor</English>
<German>Gewichtsfaktor</German>
<Japanese>負荷要因</Japanese>
<Polish>Współczynnik masy ekwipunku</Polish>
<Korean>부담 요인</Korean>
<French>Facteur d'encombrement</French>
<Italian>Fattore Caricamento</Italian>
<Chinese>負重量</Chinese>
<Chinesesimp>负重量</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_LoadFactor_Description">
<English>Increases or decreases how much weight influences the players performance. Zero means equipment weight has no performance influence.</English>
<German>Erhöht oder verringert, wie viel Einfluss das Ausrüstungsgewicht auf die Leistung hat. Null heißt, dass es keinen Einfluss hat.</German>
<Japanese>重量によりプレイヤーの動作への影響下増加したり、低下します。装備を持っていない場合、影響はしません。</Japanese>
<Polish>Zmniejsza lub zwiększa wpływ ciężaru ekwipunku na wydolność gracza. Zero oznacza kompletny brak wpływu na wydolność.</Polish>
<Korean>플레이어가 무게에 따라 얼마나 영향받는지를 증가시키거나 감소시킵니다. 0의 경우 플레이어가 장비 무게에 영향받지 않습니다.</Korean>
<French>Augmente ou réduit l'influence que le poids à sur les performances des joueurs. Zéro implique que le poids de l'équipement n'a pas d'influence sur les performances.</French>
<Italian>Incrementa o decrementa quanto il peso influenza le prestazioni dei giocatori. Zero significa che il peso dell'equipaggiamento non ha alcuna influenza nelle prestazioni.</Italian>
<Chinese>增加或降低玩家所能承受的負重量. 如設定值為0, 代表裝備的重量將不會影響到玩家的體力表現.</Chinese>
<Chinesesimp>增加或降低玩家所能承受的负重量. 如设定值为0, 代表装备的重量将不会影响到玩家的体力表现.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_TerrainGradientFactor">
<English>Terrain Gradient Factor</English>
<German>Terrainsteigungsfaktor</German>
<Japanese>地形の勾配による要因</Japanese>
<Polish>Współczynnik terenu</Polish>
<Korean>지형 경사도 요인</Korean>
<French>Facteur d'inclinaison du terrain</French>
<Italian>Fattore Pendenza Terreno</Italian>
<Chinese>地形陡峭影響值</Chinese>
<Chinesesimp>地形陡峭影响值</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_TerrainGradientFactor_Description">
<English>Sets how much steep terrain increases stamina loss. Higher means higher stamina loss.</English>
<German>Beeinflusst, wie stark Steigungen den Ausdauerverbrauch erhöhen. Ein höherer Wert erhöht den Ausdauerverbrauch.</German>
<Japanese>地形によって影響する体力の消費量を決定します。高数値ではより体力を消費します。</Japanese>
<Polish>Wpływa na to w jakim stopniu stromy teren wpływa na utratę wytrzymałości. Więcej oznacza szybszą utratę wytrzymałości.</Polish>
<Korean>경사도에 따라 얼마나 피로해지는지를 정합니다. 값이 클수록 더 많은 피로를 유발합니다.</Korean>
<French>Configure l'influence de l'inclinaison du terrain sur la perte d'endurance. Une valeur plus élevée implique une perte d'endurance plus importante.</French>
<Italian>Stabilisce quanto la pendenza del terreno incrementa la perdita della stamina. Maggiore significa più stamina persa.</Italian>
<Chinese>設定陡峭的地形將會影響多少體力的流失. 值越高代表體力流失越快.</Chinese>
<Chinesesimp>设定陡峭的地形将会影响多少体力的流失. 值越高代表体力流失越快.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled">
<English>Enabled</English>
<German>Aktiv</German>
<Japanese>有効化</Japanese>
<Polish>Włączone</Polish>
<Korean>활성화</Korean>
<French>Activé</French>
<Italian>Abilitato</Italian>
<Chinese>啟用</Chinese>
<Chinesesimp>启用</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled_Description">
<English>Enables/disables Advanced Fatigue.</English>
<German>Aktiviert/deaktiviert Advanced Fatigue.</German>
<Japanese>アドバンスド疲労の有効化と無効化</Japanese>
<Polish>Włącza/wyłącza zaawansowaną wytrzymałość</Polish>
<Korean>고급 피로도 활성화/비활성화</Korean>
<French>Active/désactive la fatigue avancée.</French>
<Italian>Abilita/disabilita la Fatica Avanzata.</Italian>
<Chinese>啟用/關閉進階體力.</Chinese>
<Chinesesimp>启用/关闭进阶体力.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_EnableStaminaBar">
<English>Show stamina bar</English>
<German>Zeige Ausdauerleiste</German>
<Japanese>体力バーを表示</Japanese>
<Polish>Pokaż pasek wytrzymałości</Polish>
<Korean>피로도 막대</Korean>
<French>Afficher la barre d'endurance</French>
<Italian>Mostra barra stamina</Italian>
<Chinese>顯示體力條</Chinese>
<Chinesesimp>显示体力条</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_EnableStaminaBar_Description">
<English>Shows the stamina bar.</English>
<German>Zeigt die Ausdauerleiste an.</German>
<Japanese>体力バーを表示します。</Japanese>
<Polish>Pokazuje pasek wytrzymałości.</Polish>
<Korean>피로도 막대를 보여줍니다.</Korean>
<French>Affiche la barre d'endurance.</French>
<Italian>Mostra la barra della stamina.</Italian>
<Chinese>顯示體力條.</Chinese>
<Chinesesimp>显示体力条.</Chinesesimp>
</Key>
</Package>
</Project>

View File

@ -12,6 +12,6 @@ class Extended_PreInit_EventHandlers {
class Extended_PostInit_EventHandlers {
class ADDON {
clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient));
init = QUOTE(call COMPILE_FILE(XEH_postInit));
};
};

View File

@ -58,7 +58,7 @@ class CfgVehicles {
class ACE_Actions {
class GVAR(pickUp) {
displayName = CSTRING(PickUp);
condition = QUOTE(_player call FUNC(canPrepare));
condition = QUOTE([ARR_2(_player,true)] call FUNC(canPrepare));
statement = QUOTE(_this call FUNC(pickUp));
distance = 1.8; // Requires >1.7 to work when standing with weapon on back
icon = "\a3\ui_f\data\igui\cfg\actions\obsolete\ui_action_takemine_ca.paa";

View File

@ -1,5 +1,8 @@
#include "script_component.hpp"
// Fired XEH
[QGVAR(throwFiredXEH), FUNC(throwFiredXEH)] call CBA_fnc_addEventHandler;
// Exit on HC
if (!hasInterface) exitWith {};
@ -8,7 +11,7 @@ GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
{
{
private _ammo = getText (configFile >> "CfgMagazines" >> _x >> "ammo");
GVAR(ammoMagLookup) setVariable [_ammo, _x];
if (_ammo != "") then { GVAR(ammoMagLookup) setVariable [_ammo, _x]; };
} count (getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines"));
nil
} count getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles");
@ -63,6 +66,14 @@ GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
[_this select 1, "Player changed"] call FUNC(exitThrowMode);
}] call CBA_fnc_addPlayerEventhandler;
["visibleMap", {
params ["", "_visibleMap"]; // command visibleMap is updated one frame later
if (_visibleMap && {ACE_player getVariable [QGVAR(inHand), false]}) then {
[ACE_player, "Opened Map"] call FUNC(exitThrowMode);
};
}] call CBA_fnc_addPlayerEventhandler;
["ace_interactMenuOpened", {
// Exit if advanced throwing is disabled (pick up only supports advanced throwing)
if (!GVAR(enabled)) exitWith {};
@ -80,8 +91,13 @@ GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
}] call CBA_fnc_addEventHandler;
// Fired XEH
[QGVAR(throwFiredXEH), FUNC(throwFiredXEH)] call CBA_fnc_addEventHandler;
// Set last thrown time on Vanilla Throwing and Advanced Throwing
["ace_firedPlayer", {
//IGNORE_PRIVATE_WARNING ["_unit", "_weapon"];
if (_weapon == "Throw") then {
_unit setVariable [QGVAR(lastThrownTime), CBA_missionTime];
};
}] call CBA_fnc_addEventHandler;
// Display handlers
@ -100,8 +116,7 @@ addMissionEventHandler ["Draw3D", { // Blue is predicted before throw, red is re
drawIcon3D ["\a3\ui_f\data\gui\cfg\hints\icon_text\group_1_ca.paa", [0,0,1,1], _newTrajAGL, 1, 1, 0, "", 2];
} forEach GVAR(predictedPath);
{
_newTrajAGL = _x;
drawIcon3D ["\a3\ui_f\data\gui\cfg\hints\icon_text\group_1_ca.paa", [1,0,0,1], _newTrajAGL, 1, 1, 0, "", 2];
drawIcon3D ["\a3\ui_f\data\gui\cfg\hints\icon_text\group_1_ca.paa", [1,0,0,1], _x, 1, 1, 0, "", 2];
} forEach GVAR(flightPath)
}];
#endif

View File

@ -2,6 +2,8 @@
ADDON = false;
PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
ADDON = true;

View File

@ -4,6 +4,7 @@
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Ignore Last Thrown Time <BOOL> (default: false)
*
* Return Value:
* Can Prepare <BOOL>
@ -15,14 +16,19 @@
*/
#include "script_component.hpp"
params ["_unit"];
params ["_unit", ["_ignoreLastThrownTime", false]];
// Don't delay when picking up
if (_ignoreLastThrownTime) then {
_unit setVariable [QGVAR(lastThrownTime), -1];
};
GVAR(enabled) &&
#ifndef DEBUG_MODE_FULL
{_unit getVariable [QGVAR(lastThrownTime), CBA_missionTime - 3] < CBA_missionTime - 2} && // Prevent throwing in quick succession
#else
#ifdef ALLOW_QUICK_THROW
{true} &&
#else
{_unit getVariable [QGVAR(lastThrownTime), CBA_missionTime - 3] < CBA_missionTime - 2} && // Prevent throwing in quick succession
#endif
{!(call EFUNC(common,isFeatureCameraActive))} &&

View File

@ -47,11 +47,15 @@ for "_i" from 0.05 to 1.45 step 0.1 do {
if (_newTrajASL distance (getPosASLVisual ACE_player) <= 20) then {
if ((ASLToATL _newTrajASL) select 2 <= 0) then {
_cross = 1
_cross = 1; // 1: Distance Limit (Green)
} else {
// Even vanilla throwables go through glass, only "GEOM" LOD will stop it but that will also stop it when there is glass in a window
if (lineIntersects [_prevTrajASL, _newTrajASL]) then {
_cross = 2;
if (lineIntersects [_prevTrajASL, _newTrajASL]) then { // Checks the "VIEW" LOD
_cross = 2; // 2: View LOD Block (Red)
} else {
if (!((lineIntersectsSurfaces [_prevTrajASL, _newTrajASL, _activeThrowable, ACE_player, true, 1, "GEOM", "FIRE"]) isEqualTo [])) then {
_cross = 3; // 3: GEOM/FIRE LOD Block (Yellow) - pass a3 bulding glass, but blocked on some CUP glass
};
};
};
@ -60,7 +64,7 @@ for "_i" from 0.05 to 1.45 step 0.1 do {
private _movePerc = linearConversion [3, 0, vectorMagnitude (velocity ACE_player), 0, 1, true];
_alpha = _alpha * _movePerc;
private _col = [ [1, 1, 1, _alpha], [0, 1, 0, _alpha], [1, 0, 0, _alpha] ] select _cross;
private _col = [ [1, 1, 1, _alpha], [0, 1, 0, _alpha], [1, 0, 0, _alpha], [1, 1, 0, _alpha] ] select _cross;
if (_cross != 2 && {lineIntersects [eyePos ACE_player, _newTrajASL]}) then {
_col set [3, 0.1]

View File

@ -15,7 +15,7 @@
*/
#include "script_component.hpp"
if (dialog || {!(ACE_player getVariable [QGVAR(inHand), false])} || {!([ACE_player] call FUNC(canPrepare))}) exitWith {
if (dialog || {!(ACE_player getVariable [QGVAR(inHand), false])} || {!([ACE_player, true] call FUNC(canPrepare))}) exitWith {
[ACE_player, "In dialog or no throwable in hand or cannot prepare throwable"] call FUNC(exitThrowMode);
};
@ -36,6 +36,11 @@ if (_throwable isEqualTo [] && {!_primed}) exitWith {
private _throwableMag = _throwable param [0, "#none"];
// If not primed, double check we actually have the magazine in inventory
if ((!_primed) && {!((_throwableMag in (uniformItems ACE_player)) || {_throwableMag in (vestItems ACE_player)} || {_throwableMag in (backpackItems ACE_player)})}) exitWith {
[ACE_player, "No valid throwable (glitched currentThrowable)"] call FUNC(exitThrowMode);
};
// Get correct throw power for primed grenade
if (_primed) then {
private _ammoType = typeOf _activeThrowable;
@ -63,7 +68,7 @@ private _power = linearConversion [0, 180, _phi - 30, 1, 0.3, true];
ACE_player setVariable [QGVAR(throwSpeed), _throwSpeed * _power];
#ifdef DEBUG_MODE_FULL
hintSilent format ["Heading: %1\nPower: %2\nSpeed: %3\nThrowMag: %4", _phi, _power, _throwSpeed * _power, _throwableMag];
hintSilent format ["Heading: %1\nPower: %2\nSpeed: %3\nThrowMag: %4\nMuzzle: %5", _phi, _power, _throwSpeed * _power, _throwableMag, ACE_player getVariable [QGVAR(activeMuzzle), ""]];
#endif
private _throwableType = getText (configFile >> "CfgMagazines" >> _throwableMag >> "ammo");
@ -71,16 +76,25 @@ private _throwableType = getText (configFile >> "CfgMagazines" >> _throwableMag
if (!([ACE_player] call FUNC(canThrow)) && {!_primed}) exitWith {
if (!isNull _activeThrowable) then {
deleteVehicle _activeThrowable;
// Restore muzzle ammo (setAmmo 1 has no impact if no appliccable throwable in inventory)
ACE_player setAmmo [ACE_player getVariable [QGVAR(activeMuzzle), ""], 1];
};
};
if (isNull _activeThrowable || {(_throwableType != typeOf _activeThrowable) && {!_primed}}) then {
if (!isNull _activeThrowable) then {
deleteVehicle _activeThrowable;
// Restore muzzle ammo (setAmmo 1 has no impact if no appliccable throwable in inventory)
ACE_player setAmmo [ACE_player getVariable [QGVAR(activeMuzzle), ""], 1];
};
_activeThrowable = _throwableType createVehicleLocal [0, 0, 0];
_activeThrowable enableSimulation false;
ACE_player setVariable [QGVAR(activeThrowable), _activeThrowable];
// Set muzzle ammo to 0 to block vanilla throwing (can only be 0 or 1)
private _muzzle = _throwableMag call FUNC(getMuzzle);
ACE_player setAmmo [_muzzle, 0];
ACE_player setVariable [QGVAR(activeMuzzle), _muzzle];
};
// Exit in case of explosion in hand

View File

@ -25,13 +25,26 @@ if !(_unit getVariable [QGVAR(inHand), false]) exitWith {};
systemChat format ["Exit Throw Mode: %1", _reason];
#endif
private _activeThrowable = _unit getVariable [QGVAR(activeThrowable), objNull];
if !(_unit getVariable [QGVAR(primed), false]) then {
deleteVehicle (_unit getVariable [QGVAR(activeThrowable), objNull]);
deleteVehicle _activeThrowable;
} else {
_unit setVariable [QGVAR(lastThrownTime), CBA_missionTime];
// Fix floating for throwables without proper physics (eg. IR Grenade)
_activeThrowable setVelocity [0, 0, -0.1];
// Set thrower
private _instigator = (getShotParents _activeThrowable) param [1, _unit]; // getShotParents could be [] on replaced grenades (like IR chemlight)
[QEGVAR(common,setShotParents), [_activeThrowable, _unit, _instigator]] call CBA_fnc_serverEvent;
};
// Restore muzzle ammo (setAmmo 1 has no impact if no appliccable throwable in inventory)
_unit setAmmo [_unit getVariable [QGVAR(activeMuzzle), ""], 1];
_unit setVariable [QGVAR(inHand), false];
_unit setVariable [QGVAR(primed), false];
_unit setVariable [QGVAR(activeThrowable), objNull];
_unit setVariable [QGVAR(activeMuzzle), ""];
_unit setVariable [QGVAR(throwType), THROW_TYPE_DEFAULT];
_unit setVariable [QGVAR(throwSpeed), THROW_SPEED_DEFAULT];
_unit setVariable [QGVAR(dropMode), false];

View File

@ -13,8 +13,7 @@
* Example:
* [logic, [unit1, unit2], true] call ace_advanced_throwing_fnc_moduleInit
*
* Public:
* No
* Public: No
*/
#include "script_component.hpp"
@ -30,4 +29,4 @@ if (!_activated) exitWith {};
[_logic, QGVAR(enablePickUp), "enablePickUp"] call EFUNC(common,readSettingFromModule);
[_logic, QGVAR(enablePickUpAttached), "enablePickUpAttached"] call EFUNC(common,readSettingFromModule);
ACE_LOGINFO_1("Advanced Throwing Module Initialized. Enabled: %1",GVAR(enabled));
INFO_1("Advanced Throwing Module Initialized. Enabled: %1",GVAR(enabled));

View File

@ -23,12 +23,15 @@ if (_unit getVariable [QGVAR(inHand), false]) exitWith {
TRACE_1("inHand",_unit);
if (!(_unit getVariable [QGVAR(primed), false])) then {
TRACE_1("not primed",_unit);
// Restore muzzle ammo (setAmmo 1 has no impact if no appliccable throwable in inventory)
// selectNextGrenade relies on muzzles array (setAmmo 0 removes the muzzle from the array and current can't be found, cycles between 0 and 1 muzzles)
ACE_player setAmmo [ACE_player getVariable [QGVAR(activeMuzzle), ""], 1];
[_unit] call EFUNC(weaponselect,selectNextGrenade);
};
};
// Try selecting next throwable if none currently selected
if ((isNull (_unit getVariable [QGVAR(activeThrowable), objNull])) && {(currentThrowable _unit) isEqualTo []} && {!([_unit] call EFUNC(weaponselect,selectNextGrenade))}) exitWith {
if (isNull (_unit getVariable [QGVAR(activeThrowable), objNull]) && {(currentThrowable _unit) isEqualTo []} && {!([_unit] call EFUNC(weaponselect,selectNextGrenade))}) exitWith {
TRACE_1("no throwables",_unit);
};

View File

@ -26,7 +26,16 @@ private _throwableMag = (currentThrowable _unit) select 0;
_unit removeItem _throwableMag;
private _throwableType = getText (configFile >> "CfgMagazines" >> _throwableMag >> "ammo");
private _muzzle = _throwableMag call FUNC(getMuzzle);
private _muzzle = _unit getVariable [QGVAR(activeMuzzle), ""];
// Set muzzle ammo to 0 to block vanilla throwing (can only be 0 or 1), removeItem above resets it
_unit setAmmo [_muzzle, 0];
// Handle weird scripted grenades (RHS) which could cause unexpected behaviour
private _nonInheritedCfg = configProperties [configFile >> "CfgAmmo" >> _throwableType, 'configName _x == QGVAR(replaceWith)', false];
if ((count _nonInheritedCfg) == 1) then {
_throwableType = getText (_nonInheritedCfg select 0);
};
// Create actual throwable globally
private _activeThrowableOld = _unit getVariable [QGVAR(activeThrowable), objNull];
@ -45,6 +54,9 @@ deleteVehicle _activeThrowableOld;
_activeThrowable // projectile
]] call CBA_fnc_globalEvent;
// Set prime instigator
[QEGVAR(common,setShotParents), [_activeThrowable, _unit, _unit]] call CBA_fnc_serverEvent;
if (_showHint) then {
// Show primed hint
private _displayNameShort = getText (configFile >> "CfgMagazines" >> _throwableMag >> "displayNameShort");

View File

@ -7,7 +7,7 @@
* None
*
* Return Value:
* Nothing
* None
*
* Example:
* call ace_advanced_throwing_fnc_renderPickUpInteraction
@ -22,15 +22,19 @@
// isNull is necessarry to prevent rare error when ending mission with interact key down
if (EGVAR(interact_menu,keyDown) && {!isNull ACE_player}) then {
// Rescan when player moved >5 meters from last pos, nearObjects is costly
// Rescan when player moved >5 meters from last pos, nearObjects can be costly with a lot of objects around
if ((getPosASL ACE_player) distance _setPosition > 5) then {
// IR throwbles inherit from GrenadeCore, others from GrenadeHand, IR Chemlights are special snowflakes
// Grenades inherit from GrenadeHand, IR throwbles from IRStrobeBase, IR Chemlights are special snowflakes
// nearEntities does not see throwables
_nearThrowables = ACE_player nearObjects ["GrenadeHand", PICK_UP_DISTANCE];
_nearThrowables append (ACE_player nearObjects ["GrenadeCore", PICK_UP_DISTANCE]);
_nearThrowables append (ACE_player nearObjects ["IRStrobeBase", PICK_UP_DISTANCE]);
_nearThrowables append (ACE_player nearObjects ["ACE_Chemlight_IR_Dummy", PICK_UP_DISTANCE]);
{
if (!(_x in _throwablesHelped) && {GVAR(enablePickUpAttached) || {!GVAR(enablePickUpAttached) && {isNull (attachedTo _x)}}}) then {
if (!(_x in _throwablesHelped) &&
{!(_x isKindOf "SmokeShellArty")} && {!(_x isKindOf "G_40mm_Smoke")} && // All smokes inherit from "GrenadeHand" >> "SmokeShell"
{GVAR(enablePickUpAttached) || {!GVAR(enablePickUpAttached) && {isNull (attachedTo _x)}}}
) then {
TRACE_2("Making PickUp Helper",_x,typeOf _x);
private _pickUpHelper = QGVAR(pickUpHelper) createVehicleLocal [0, 0, 0];

View File

@ -54,8 +54,6 @@ if (!(_unit getVariable [QGVAR(primed), false])) then {
_activeThrowable setVelocity _newVelocity;
};
_unit setVariable [QGVAR(lastThrownTime), CBA_missionTime];
// Invoke listenable event
["ace_throwableThrown", [_unit, _activeThrowable]] call CBA_fnc_localEvent;
}, [

View File

@ -3,9 +3,9 @@
#include "\z\ace\addons\main\script_mod.hpp"
// #define DRAW_THROW_PATH
// #define ALLOW_QUICK_THROW
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define CBA_DEBUG_SYNCHRONOUS
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_ADVANCED_THROWING

View File

@ -1,89 +1,257 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Advanced_Throwing">
<Key ID="STR_ACE_Advanced_Throwing_Category">
<English>Advanced Throwing</English>
<Russian>Улучшенный бросок гранат</Russian>
<Japanese>アドバンスド投てき</Japanese>
<Polish>Zaawansowane rzucanie</Polish>
<German>Erweitertes Wurfsystem</German>
<Korean>고급 투척</Korean>
<French>Lancé amélioré</French>
<Italian>Lancio Avanzato</Italian>
<Chinese>進階投擲</Chinese>
<Chinesesimp>进阶投掷</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Module_Description">
<English>Allows changing advanced throwing behaviour.</English>
<Russian>Позволяет настраивать поведение улучшенного броска гранат.</Russian>
<Japanese>アドバンスド投てきの挙動変更を許可します。</Japanese>
<Polish>Zezwala na zmianę zachowania zaawansowanego trybu rzucania.</Polish>
<German>Erlaubt es, das Verhalten des erweiterten Wurfsystems zu ändern.</German>
<Korean>고급 투척 행위를 허가합니다</Korean>
<French>Permet de changer la configuration du lancé amélioré.</French>
<Italian>Permette il cambiamento della modalità di tiro.</Italian>
<Chinese>允許使用更多不同的投擲方式.</Chinese>
<Chinesesimp>允许使用更多不同的投掷方式.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Enable_DisplayName">
<English>Enable Advanced Throwing</English>
<Russian>Включить улучшенный бросок</Russian>
<Japanese>アドバンスド投てきを有効化</Japanese>
<Polish>Aktywuj zaawansowane rzucanie</Polish>
<German>Aktiviere erweitertes Wurfsystem</German>
<Korean>고급 투척 활성화 </Korean>
<French>Active le lancé amélioré</French>
<Italian>Abilita Lancio Avanzato</Italian>
<Chinese>啟用進階投擲</Chinese>
<Chinesesimp>启用进阶投掷</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Enable_Description">
<English>Enables advanced throwing system.</English>
<Russian>Включает систему улучшенного броска.</Russian>
<Japanese>アドバンスド投てきシステムを有効化</Japanese>
<Polish>Aktywuje system zaawansowanego rzucania.</Polish>
<German>Aktiviert das erweiterte Wurfsystem.</German>
<Korean>고급 투척을 활성화 합니다</Korean>
<French>Active le système de lancé amélioré.</French>
<Italian>Abilita il sistema di lancio avanzato.</Italian>
<Chinese>啟用進階投擲系統.</Chinese>
<Chinesesimp>启用进阶投掷系统.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ShowThrowArc_DisplayName">
<English>Show Throw Arc</English>
<Russian>Показать траекторию броска</Russian>
<Japanese>軌道を表示</Japanese>
<Polish>Pokaż trasę lotu</Polish>
<German>Zeige Wurfbogen</German>
<Korean>투척 궤적 표시</Korean>
<French>Afficher l'arc de lancé</French>
<Italian>Mostra Arco di Tiro</Italian>
<Chinese>顯示投擲軌道</Chinese>
<Chinesesimp>显示投掷轨道</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ShowThrowArc_Description">
<English>Enables visualization of the throw arc (where throwable will fly).</English>
<Russian>Включает визуализацию траектории броска (как полетит граната).</Russian>
<Japanese>投てき物の予測軌道の表示を有効化します。</Japanese>
<Polish>Wyświetla wizualizację trasy przelotu granatu.</Polish>
<German>Aktiviert die Visualisierung des Wurfbogens (wohin das Objekt geworfen werden wird).</German>
<Korean>투척 궤도를 시각화 합니다(투척물이 어디로 갈지)</Korean>
<French>Active la visualisation de l'arc de lancé (où l'objet lancé va atterrir).</French>
<Italian>Abilita la visualizzazione dell'arco del tiro (dove l'oggetto lanciabile volerà).</Italian>
<Chinese>顯示投擲軌道幫助投擲.</Chinese>
<Chinesesimp>显示投掷轨道帮助投掷.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ShowMouseControls_DisplayName">
<English>Show Throwing Mouse Controls</English>
<Russian>Показывать управление мышью</Russian>
<Japanese>投てきのマウス操作を表示</Japanese>
<Polish>Pokaż podpowiedzi sterowania myszą</Polish>
<German>Zeige Maussteuerung beim Werfen</German>
<Korean>마우스 조작 표시</Korean>
<French>Afficher les contrôles à la souris du lancé</French>
<Italian>Mostra Comandi Mouse Lancio</Italian>
<Chinese>顯示滑鼠投擲控制提示</Chinese>
<Chinesesimp>显示滑鼠投掷控制提示</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ShowMouseControls_Description">
<English>Enables visual cues for mouse controls when throwable is prepared.</English>
<Russian>Включает отображение подсказок по управлению мышью, когда граната подготовлена.</Russian>
<Japanese>投てき物を投げるとき、マウス操作の説明表示を有効化します。</Japanese>
<Polish>Wyświetla podpowiedzi sterowania myszą kiedy obiekt miotany jest w ręku.</Polish>
<German>Aktiviert visuelle Hinweise zur Maussteuerung, wenn ein Objekt zum Werfen vorbereitet wird.</German>
<Korean>투척물을 준비시 마우스 조작을 시각화해서 보여줍니다</Korean>
<French>Active les aides visuels pour les controles à la souris lorsqu'un lancé est préparé.</French>
<Italian>Abilita la visualizzazione dei controlli del mouse quando l'oggetto lanciabile è pronto.</Italian>
<Chinese>開啟後會在準備投擲時, 顯示滑鼠相關操作.</Chinese>
<Chinesesimp>开启后会在准备投掷时, 显示滑鼠相关操作.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnablePickUp_DisplayName">
<English>Enable Throwables Pick Up</English>
<Russian>Включить подбор гранат</Russian>
<Japanese>投てき物の拾い上げを有効化</Japanese>
<Polish>Zezwól na podnoszenie obiektów miotanych</Polish>
<German>Aktiviere Aufheben von Wurfobjekten</German>
<Korean>투척물 줍기 활성화</Korean>
<French>Active la récupération des objets lancés</French>
<Italian>Abilita Raccogli Oggetti</Italian>
<Chinese>啟用可撿取地面投擲物</Chinese>
<Chinesesimp>启用可捡取地面投掷物</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnablePickUp_Description">
<English>Enables ability to pick up throwables from the ground.</English>
<Russian>Включает возможность подбирать гранаты с земли.</Russian>
<Japanese>地面に落ちている投てき物の拾い上げ動作を有効化します。</Japanese>
<Polish>Umożliwia podnoszenie obiektów miotanych z ziemi.</Polish>
<German>Aktiviert die Möglichkeit, geworfene Objekte wieder vom Boden aufzuheben.</German>
<Korean>땅에 떨어진 투척물을 주울 수 있게 해줍니다.</Korean>
<French>Active la capacité de récupérer les objets lancés sur le sol.</French>
<Italian>Abilita la possibilità di raccogliere un oggetto lanciabile da terra.</Italian>
<Chinese>啟用後, 可撿取地面上的投擲物.</Chinese>
<Chinesesimp>启用后, 可捡取地面上的投掷物.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnablePickUpAttached_DisplayName">
<English>Enable Attached Throwables Pick Up</English>
<Russian>Включить подбор прикрепленных гранат</Russian>
<Japanese>拾い上げた投てき物の取り付けを有効化</Japanese>
<Polish>Zezwól na podnoszenie przyczepionych obiektów miotanych</Polish>
<German>Aktiviere erneute Aufnahme befestigter Wurfobjekte</German>
<Korean>부착 투척물 줍기 활성화</Korean>
<French>Active le ramassage d'objets lançables attachés</French>
<Italian>Abilita Raccogli Oggetti Lanciabili da altri Oggetti</Italian>
<Chinese>啟用可撿取附著投擲物</Chinese>
<Chinesesimp>启用可捡取附着投掷物</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnablePickUpAttached_Description">
<English>Enables ability to pick up throwables from attached objects.</English>
<Russian>Включает возможность подбирать гранаты, прикрепленные к объектам.</Russian>
<Japanese>オブジェクトに取り付けられていた投てき物を拾い上げられるようにします。</Japanese>
<Polish>Umożliwia podnoszenie obiektów miotanych przyczepionych do innych obiektów.</Polish>
<German>Aktiviert die Möglichkeit, befestigte Wurfobjekte erneut aufzunehmen.</German>
<Korean>부착된 투척물을 주울 수 있게 해줍니다.</Korean>
<French>Active la capacité à ramasser les objets lançables attaché à d'autres objets.</French>
<Italian>Abilita la possibilità di raccogliere gli oggetti lanciabili dagli altri oggetti. </Italian>
<Chinese>啟用後, 可撿取附著在物件上的投擲物.</Chinese>
<Chinesesimp>启用后, 可捡取附着在物件上的投掷物.</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Prepare">
<English>Prepare/Change Throwable</English>
<Russian>Подготовить/заменить гранату</Russian>
<Japanese>機能の起動/変更</Japanese>
<Polish>Przygotuj/zmień ob. miotany</Polish>
<German>Wurfobjekt vorbereiten/wechseln</German>
<Korean>투척물 준비/변경</Korean>
<French>Préparer/changer d'objet</French>
<Italian>Prepara/Cambia Oggetto lanciabile</Italian>
<Chinese>準備/變更投擲物</Chinese>
<Chinesesimp>准备/变更投掷物</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_dropModeHold">
<English>Throwable Drop Mode (Hold)</English>
<Russian>Режим броска гранаты (удерживать)</Russian>
<Japanese>投てきモード (押しっぱ)</Japanese>
<Polish>Tryb upuszczania ob. miotanego (przytrzymaj)</Polish>
<German>Wurfobjekt Fallmodus (halten)</German>
<Korean>투척물 떨어뜨리기 모드(꾹눌러서)</Korean>
<French>Mode de lancé de l'objet (Tenir)</French>
<Italian>Modalità Oggetto Gettabile (Mantenere)</Italian>
<Chinese>投擲模式 (按住)</Chinese>
<Chinesesimp>投掷模式 (按住)</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_DropModeToggle">
<English>Throwable Drop Mode (Toggle)</English>
<Russian>Режим броска гранаты (переключить)</Russian>
<Japanese>投てきモード (トグル)</Japanese>
<Polish>Tryb upuszczania ob. miotanego (przełącz)</Polish>
<German>Wurfobjekt Fallmodus (umschalten)</German>
<Korean>투척물 떨어뜨리기 모드(토글)</Korean>
<French>Mode de lancé de l'objet (Basculer)</French>
<Italian>Modalità Oggetto lanciabile Gettabile (Interruttore)</Italian>
<Chinese>投擲模式 (切換)</Chinese>
<Chinesesimp>投掷模式 (切换)</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Primed">
<English>Primed</English>
<Russian>Подготовлена</Russian>
<Japanese>起動した</Japanese>
<Polish>Odbezpieczony</Polish>
<German>Scharf gemacht</German>
<Korean>뇌관 작동</Korean>
<French>Amorcer</French>
<Italian>Armato</Italian>
<Chinese>引信開始燃燒</Chinese>
<Chinesesimp>引信开始燃烧</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Throw">
<English>Throw</English>
<Russian>Бросить</Russian>
<Japanese>投げる</Japanese>
<Polish>Rzuć</Polish>
<German>Werfen</German>
<Korean>던지기</Korean>
<French>Lancer</French>
<Italian>Lanciare</Italian>
<Chinese>投擲</Chinese>
<Chinesesimp>投掷</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ChangeMode">
<English>(Scroll) Change Mode</English>
<Russian>(Скролл) Изменить режим</Russian>
<Japanese>(スクロール) モード変更</Japanese>
<Polish>(Kółko m.) zmień tryb</Polish>
<German>(Scrollen) Modus wechseln</German>
<Korean>(마우스 휠) 모드 변경</Korean>
<French>(Molette souris) Changer de mode</French>
<Italian>(Scorrere) Cambio Modalità</Italian>
<Chinese>(滾輪) 變更模式</Chinese>
<Chinesesimp>(滚轮) 变更模式</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Extend">
<English>(Scroll) Extend</English>
<Russian>(Скролл) Увеличить</Russian>
<Japanese>(スクロール) 遠くに</Japanese>
<Polish>(Kółko m.) przedłuż</Polish>
<German>(Scrollen) Erweitern</German>
<Korean>(마우스 휠) 연장</Korean>
<French>(Molette souris) Etendre</French>
<Italian>(Scorrere) Estendere</Italian>
<Chinese>(滾輪) 延長</Chinese>
<Chinesesimp>(滚轮) 延长</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Cook">
<English>(Click) Cook</English>
<Russian>(Клик) Подготовить</Russian>
<Japanese>(クリック) 起爆</Japanese>
<Polish>(Kliknięcie) Odbezpiecz</Polish>
<German>(Klicken) Abkochen</German>
<Korean>(클릭) 예열</Korean>
<French>(Clique) Dégoupiller</French>
<Italian>(Click) Arma</Italian>
<Chinese>(點擊) 提早拉開引信</Chinese>
<Chinesesimp>(点击) 提早拉开引信</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_PickUp">
<English>Pick Up</English>
<Russian>Подобрать</Russian>
<Japanese>拾い上げる</Japanese>
<Polish>Podnieś</Polish>
<German>Aufheben</German>
<Korean>줍기</Korean>
<French>Ramasser</French>
<Italian>Raccogli</Italian>
<Chinese>撿取</Chinese>
<Chinesesimp>捡取</Chinesesimp>
</Key>
</Package>
</Project>

View File

@ -1,28 +0,0 @@
/*
* Documentation:
* https://community.bistudio.com/wiki/AI_Sub-skills
*
* The idea here is to reduce the AI's godlike aiming
* capabilties while retaining it's high intelligence.
* The AI should be smart enough to move through a town,
* but also be 'human' in their reaction time and aim.
*
* Note: All these values can still be adjusted via
* scripts, these arrays just change what 0 & 1
* are for setSkill.
*/
class CfgAISkill {
aimingAccuracy[] = {0,0, 1,0.8}; // {0,0,1,1}; v1.26 defaults
aimingShake[] = {0,0, 1,0.6}; // {0,0,1,1};
aimingSpeed[] = {0,0, 1,0.7}; // {0,0.5,1,1};
commanding[] = {0,0, 1,0.8}; // {0,0,1,1};
courage[] = {0,0, 1,0.7}; // {0,0,1,1};
endurance[] = {0,0, 1,0.7}; // {0,0,1,1};
general[] = {0,0, 1,0.9}; // {0,0,1,1};
// apparently breaks rapid firing in single fire mode for players
//reloadSpeed[] = {0,0, 1,0.8}; // {0,0,1,1};
spotDistance[] = {0,0, 1,0.9}; // {0,0.2,1,0.4};
spotTime[] = {0,0, 1,0.7}; // {0,0,1,0.7};
};

View File

@ -2,8 +2,6 @@
// weapon config changes, by commy2
/* documentation:
aiDispersionCoefX = 1.0 Dispersion multiplier for AI units (axis X - left to right).
aiDispersionCoefY = 1.0 Dispersion multiplier for AI units (axis Y - top-down).
aiRateOfFire = 5.0 Delay between shots at given aiRateOfFireDistance.
aiRateOfFireDistance = 500 At shorter distance delay (aiRateOfFire) goes linearly to zero.
*/
@ -15,19 +13,12 @@ class Mode_FullAuto;
class CfgWeapons {
// rifles
class RifleCore;
class Rifle: RifleCore {
aiDispersionCoefX = 6;
aiDispersionCoefY = 6;
};
class Rifle_Base_F: Rifle {};
class Rifle_Long_Base_F: Rifle_Base_F {};
class Rifle_Base_F;
class Rifle_Short_Base_F;
class Rifle_Long_Base_F;
// MX
class arifle_MX_Base_F: Rifle_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
modes[] += {"ACE_Burst_far"};
class Single: Mode_SemiAuto {
@ -70,8 +61,6 @@ class CfgWeapons {
// MX carbine
class arifle_MXC_F: arifle_MX_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
class Single: Single {
minRange = 120; // 2;
@ -143,8 +132,6 @@ class CfgWeapons {
// MX machine gun
class arifle_MX_SW_F: arifle_MX_Base_F {
aiDispersionCoefY = 24.0;
aiDispersionCoefX = 21.0;
// Shit is still broken
//modes[] += {"ACE_Burst_far"};
modes[] = {"Single","manual","close","short","medium","far_optic1","far_optic2","ACE_Burst_far"};
@ -180,8 +167,6 @@ class CfgWeapons {
// Katiba
class arifle_Katiba_Base_F: Rifle_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
modes[] += {"ACE_Burst_far"};
class Single: Mode_SemiAuto {
@ -224,8 +209,6 @@ class CfgWeapons {
// Katiba carbine
class arifle_Katiba_C_F: arifle_Katiba_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
class Single: Single {
minRange = 120; // 2;
@ -268,8 +251,6 @@ class CfgWeapons {
// F2002
class mk20_base_F: Rifle_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
modes[] += {"ACE_Burst_far"};
class Single: Mode_SemiAuto {
@ -316,8 +297,6 @@ class CfgWeapons {
// F2002 carbine
class arifle_Mk20C_F: mk20_base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
class Single: Single {
minRange = 120; // 2;
@ -358,8 +337,6 @@ class CfgWeapons {
// TAR-20
class Tavor_base_F: Rifle_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
modes[] += {"ACE_Burst_far"};
class Single: Mode_SemiAuto {
@ -407,8 +384,6 @@ class CfgWeapons {
// TAR-21
class arifle_TRG21_F: Tavor_base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
class Single: Single {
minRange = 120; // 2;
@ -457,8 +432,6 @@ class CfgWeapons {
// SDAR
class SDAR_base_F: Rifle_Base_F {
aiDispersionCoefY = 28.0;
aiDispersionCoefX = 20.0;
class Single: Mode_SemiAuto {
minRange = 10; //2;
@ -470,9 +443,7 @@ class CfgWeapons {
};
// PD2000
class pdw2000_base_F: Rifle_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
class pdw2000_base_F: Rifle_Short_Base_F {
class Single: Mode_SemiAuto {
minRange = 100; //2;
@ -484,9 +455,7 @@ class CfgWeapons {
};
// Vector
class SMG_01_Base: Rifle_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
class SMG_01_Base: Rifle_Short_Base_F {
class Single: Mode_SemiAuto {
minRange = 50; //2;
@ -498,9 +467,7 @@ class CfgWeapons {
};
// Scorpion EVO
class SMG_02_base_F: Rifle_Base_F {
aiDispersionCoefY = 18.0;
aiDispersionCoefX = 12.0;
class SMG_02_base_F: Rifle_Short_Base_F {
class Single: Mode_SemiAuto {
minRange = 50; //2;
@ -515,8 +482,6 @@ class CfgWeapons {
// Stoner
class LMG_Mk200_F: Rifle_Long_Base_F {
aiDispersionCoefY = 24.0;
aiDispersionCoefX = 21.0;
modes[] += {"ACE_Burst_far"};
class medium;
@ -544,8 +509,6 @@ class CfgWeapons {
// Negev
class LMG_Zafir_F: Rifle_Long_Base_F {
aiDispersionCoefY = 23.0;
aiDispersionCoefX = 19.0;
modes[] += {"ACE_Burst_far"};
class Single: Mode_SemiAuto {
@ -719,8 +682,6 @@ class CfgWeapons {
// marksmen medium mg
class MMG_01_base_F: Rifle_Long_Base_F {
aiDispersionCoefY = 25.0;
aiDispersionCoefX = 20.0;
modes[] += {"ACE_Burst_far"};
class manual;
@ -745,8 +706,6 @@ class CfgWeapons {
};
class MMG_02_base_F: Rifle_Long_Base_F {
aiDispersionCoefY = 20.0;
aiDispersionCoefX = 15.0;
modes[] += {"ACE_Burst_far"};
class manual;

View File

@ -1,7 +1,7 @@
ace_ai
======
Minor changes of AI skill and overhaul of AI firing modes of vanilla weapons, encouraging the AI to use full-auto and bursts more often.
Overhaul of AI firing modes of vanilla weapons, encouraging the AI to use full-auto and bursts more often.
## Maintainers

View File

@ -14,5 +14,4 @@ class CfgPatches {
};
};
#include "CfgAISkill.hpp"
#include "CfgWeapons.hpp"

View File

@ -4,7 +4,6 @@
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define CBA_DEBUG_SYNCHRONOUS
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_AI

View File

@ -1,4 +1,3 @@
class CfgAmmo {
class BulletBase;
class B_20mm : BulletBase {
@ -11,11 +10,11 @@ class CfgAmmo {
explosive = 1.8;
tracersEvery = 3;
tracerEndTime = 3.5;
CraterEffects = "ExploAmmoCrater";
explosionEffects = "ExploAmmoExplosion";
model = "\A3\Weapons_f\Data\bullettracer\tracer_red";
};
class ACE_20mm_HE : B_20mm {};
class ACE_20mm_AP : B_20mm {
hit = 50;
@ -40,30 +39,20 @@ class CfgAmmo {
// also adjust tracer, "muh lightshow"; also adjust splash damage radius
class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase {
hit = 80;
indirectHit = 12;
indirectHitRange = 3; //2;
caliber = 1.4;
deflecting = 3;
fuseDistance = 3;
tracerStartTime = 0.02;
timeToLive = 40;
hit = 80; // default: 180
indirectHit = 12; // default: 4
indirectHitRange = 3; // default: 3
caliber = 1.4; // default: 5
deflecting = 3; // default: 5
fuseDistance = 3; // default: 10
tracerStartTime = 0.02; // default: 0.1
timeToLive = 40; // default: 6
};
// helper projectiles to simulate a rof > fps
class ACE_Gatling_30mm_HE_Plane_CAS_01_Deploy: Gatling_30mm_HE_Plane_CAS_01_F {
simulation = "shotSubmunitions";
triggerTime = 0;
submunitionAmmo = "ACE_Gatling_30mm_HE_Plane_CAS_01_Sub";
submunitionConeType[] = {"custom", {{0,0}, {0,0}, {0,0}} };
};
class ACE_Gatling_30mm_HE_Plane_CAS_01_Sub: Gatling_30mm_HE_Plane_CAS_01_F {};
// adjust damage and splash damage, closer to bluefor gatling with same caliber
class Cannon_30mm_HE_Plane_CAS_02_F: Gatling_30mm_HE_Plane_CAS_01_F {
hit = 70; //40;
indirectHit = 11; //14;
indirectHitRange = 3;
hit = 70; // default: 150
indirectHit = 11; // default: 4
indirectHitRange = 3; // default: 3
};
};

View File

@ -1,9 +1,7 @@
class CfgMagazines {
// shoot helper object to tripple rof
class VehicleMagazine;
class 1000Rnd_Gatling_30mm_Plane_CAS_01_F: VehicleMagazine {
ammo = "ACE_Gatling_30mm_HE_Plane_CAS_01_Deploy";
count = 1170;
};

View File

@ -1,4 +1,3 @@
class CfgVehicles {
class All {
class Turrets;
@ -11,7 +10,6 @@ class CfgVehicles {
};
class Air: AllVehicles {};
class Helicopter: Air {
class Turrets {
class MainTurret;
@ -19,13 +17,11 @@ class CfgVehicles {
};
class Plane: Air {};
class ParachuteBase: Helicopter {
class Turrets;
};
class UAV: Plane {};
class Helicopter_Base_F: Helicopter {
class Turrets: Turrets {
class CopilotTurret;
@ -37,12 +33,10 @@ class CfgVehicles {
class Turrets: Turrets {
class CopilotTurret;
};
//class UserActions;
};
class Heli_Light_01_base_F: Helicopter_Base_H {
lockDetectionSystem = 0;
incomingMissileDetectionSystem = 16;
incomingMissileDetectionSystem = 16; // Vanilla: 0
driverCanEject = 1;
class Turrets: Turrets {
@ -53,17 +47,8 @@ class CfgVehicles {
};
};
class Heli_Light_01_unarmed_base_F: Heli_Light_01_base_F {};
class B_Heli_Light_01_F: Heli_Light_01_unarmed_base_F {
/*class Turrets: Turrets {
class CopilotTurret: CopilotTurret {};
};*/
};
class Heli_Light_01_armed_base_F: Heli_Light_01_base_F {
lockDetectionSystem = 0;
incomingMissileDetectionSystem = 16;
incomingMissileDetectionSystem = 16; // Vanilla: 0
driverCanEject = 1;
class Turrets: Turrets {
@ -72,14 +57,10 @@ class CfgVehicles {
};
};
};
class B_Heli_Light_01_armed_F: Heli_Light_01_armed_base_F {};
class Heli_Light_02_base_F: Helicopter_Base_H {
driverCanEject = 1;
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
magazines[] = {"2000Rnd_762x51_Belt_T_Green","12Rnd_PG_missiles","168Rnd_CMFlare_Chaff_Magazine"};
incomingMissileDetectionSystem = 16; // Vanilla: 24
magazines[] = {"2000Rnd_762x51_Belt_T_Green", "12Rnd_PG_missiles", "168Rnd_CMFlare_Chaff_Magazine"}; // Switch gun magazine to 7.62mm from 6.5mm
class Turrets: Turrets {
class CopilotTurret: CopilotTurret {
@ -97,11 +78,8 @@ class CfgVehicles {
#include "Heli_Attack_01_base_F.hpp"
class B_Heli_Attack_01_F: Heli_Attack_01_base_F {};
class Heli_Attack_02_base_F: Helicopter_Base_F {
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
incomingMissileDetectionSystem = 16; // Vanilla: 24
driverCanEject = 1;
class Turrets: Turrets {
@ -112,8 +90,7 @@ class CfgVehicles {
};
class Heli_Transport_01_base_F: Helicopter_Base_H {
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
incomingMissileDetectionSystem = 16; // Vanilla: 24
driverCanEject = 1;
class Turrets: Turrets {
@ -121,36 +98,21 @@ class CfgVehicles {
canEject = 1;
showHMD = 1;
};
class MainTurret: MainTurret {
magazines[] = {"2000Rnd_762x51_Belt_T_Red"};
magazines[] = {"2000Rnd_762x51_Belt_T_Red"}; // Switch gun magazine to 7.62mm from 6.5mm
canEject = 1;
};
class RightDoorGun: MainTurret {
magazines[] = {"2000Rnd_762x51_Belt_T_Red"};
canEject = 1;
};
};
/*class UserActions {
class DoorL1_Open {
available = 1;
condition = "((this doorPhase 'door_L') == 0) AND Alive(this) AND driver this != player AND gunner this != player";
class RightDoorGun: MainTurret {
magazines[] = {"2000Rnd_762x51_Belt_T_Red"}; // Switch gun magazine to 7.62mm from 6.5mm
canEject = 1;
};
class DoorR1_Open: DoorL1_Open {
condition = "((this doorPhase 'door_R') == 0) AND Alive(this) AND driver this != player AND gunner this != player";
};
class DoorL1_Close: DoorL1_Open {
condition = "((this doorPhase 'door_L') > 0) AND Alive(this) AND driver this != player AND gunner this != player";
};
class DoorR1_Close: DoorL1_Close {
condition = "((this doorPhase 'door_R') > 0) AND Alive(this) AND driver this != player AND gunner this != player";
};
};*/
};
class Heli_Transport_02_base_F: Helicopter_Base_H {
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
incomingMissileDetectionSystem = 16; // Vanilla: 24
driverCanEject = 1;
class Turrets: Turrets {
@ -159,186 +121,71 @@ class CfgVehicles {
showHMD = 1;
};
};
/*class UserActions: UserActions {
class DoorL1_Open {
available = 1;
condition = "this animationPhase ""door_back_L"" < 0.5 AND Alive(this)";
};
class DoorR1_Open: DoorL1_Open {
condition = "this animationPhase ""door_back_R"" < 0.5 AND Alive(this)";
};
class DoorL1_Close: DoorL1_Open {
condition = "this animationPhase ""door_back_L"" > 0.5 AND Alive(this)";
};
class DoorR1_Close: DoorL1_Close {
condition = "this animationPhase ""door_back_R"" > 0.5 AND Alive(this)";
};
class CargoRamp_Open: DoorL1_Open {
userActionID = 52;
displayName = CSTRING(OpenCargoRamp);
textToolTip = CSTRING(OpenCargoRamp);
position = "action_cargoramp";
radius = 3.0;
condition = "this animationPhase ""cargoramp_open"" < 0.5 AND Alive(this)";
statement = "this animateDoor ['cargoramp_open', 1]";
};
class CargoRamp_Close: DoorL1_Close {
userActionID = 55;
displayName = CSTRING(CloseCargoRamp);
textToolTip = CSTRING(CloseCargoRamp);
position = "action_cargoramp";
radius = 3.0;
condition = "this animationPhase ""cargoramp_open"" > 0.5 AND Alive(this)";
statement = "this animateDoor ['cargoramp_open', 0]";
};
};*/
};
class Heli_light_03_base_F: Helicopter_Base_F {};
class I_Heli_light_03_base_F: Heli_light_03_base_F {
lockDetectionSystem = 0;
incomingMissileDetectionSystem = 16;
class Heli_light_03_base_F: Helicopter_Base_F {
lockDetectionSystem = 0; // Vanilla: 12
incomingMissileDetectionSystem = 16; // Vanilla: 24
driverCanEject = 1;
weapons[] = {"M134_minigun","missiles_DAR","CMFlareLauncher", "ACE_AIR_SAFETY" };
magazines[] = {"5000Rnd_762x51_Yellow_Belt","24Rnd_missiles","168Rnd_CMFlare_Chaff_Magazine"};
class Turrets: Turrets {
class MainTurret: MainTurret {
canEject = 1;
showHMD = 1;
gunBeg = "commanderview";
gunEnd = "laserstart";
memoryPointGun = "laserstart";
stabilizedInAxes = 3;
weapons[] = {"Laserdesignator_mounted"};
soundServo[] = {"",0.01,1,30};
weapons[] = {"Laserdesignator_mounted"}; // Add Laser Designator
magazines[] = {"Laserbatteries"};
inGunnerMayFire = 1;
};
};
};
class I_Heli_light_03_F: Heli_light_03_base_F {
class Turrets: Turrets {
class MainTurret: MainTurret {};
};
};
class Heli_light_03_unarmed_base_F: Heli_light_03_base_F {};
class I_Heli_light_03_unarmed_F: Heli_light_03_unarmed_base_F {};
class Plane_CAS_01_base_F: Plane_Base_F {
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
class Turrets;
#include <flightmodel_thunderbolt.hpp>
lockDetectionSystem = 12; // Vanilla: 8
incomingMissileDetectionSystem = 16; // Vanilla: 24
};
class Plane_CAS_02_base_F: Plane_Base_F {
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
class Turrets;
#include <flightmodel_yak.hpp>
lockDetectionSystem = 12; // Vanilla: 8
incomingMissileDetectionSystem = 16; // Vanilla: 24
};
class Plane_Fighter_03_base_F: Plane_Base_F {
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
class Turrets;
#include <flightmodel_alca.hpp>
};
class UAV_01_base_F: Helicopter_Base_F {
/*class Turrets: Turrets {
class MainTurret: MainTurret {};
};*/
lockDetectionSystem = 12; // Vanilla: 8
incomingMissileDetectionSystem = 16; // Vanilla: 24
};
class UAV_02_base_F: UAV {
weapons[] = {};
weapons[] = {}; // Remove flare launcher
magazines[] = {};
class Turrets {
class MainTurret;
};
};
class UAV_02_CAS_base_F: UAV_02_base_F {
weapons[] = {};
weapons[] = {}; // Remove flare launcher
magazines[] = {};
/*class Turrets: Turrets {
class MainTurret: MainTurret {};
};*/
};
class Heli_Transport_03_base_F: Helicopter_Base_H {};
class B_Heli_Transport_03_base_F: Heli_Transport_03_base_F {
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
class Heli_Transport_03_base_F: Helicopter_Base_H {
incomingMissileDetectionSystem = 16; // Vanilla: 24
driverCanEject = 1;
class Turrets: Turrets {
class CopilotTurret: CopilotTurret {
canEject = 1;
};
//class MainTurret: MainTurret {};
class RightDoorGun: MainTurret {};
};
};
class B_Heli_Transport_03_unarmed_base_F: Heli_Transport_03_base_F {
class Turrets: Turrets {
class CopilotTurret: CopilotTurret {
canEject = 1;
};
//class MainTurret: MainTurret {};
//class RightDoorGun: MainTurret {};
};
};
class Heli_Transport_04_base_F: Helicopter_Base_H {
lockDetectionSystem = 12;
incomingMissileDetectionSystem = 16;
incomingMissileDetectionSystem = 16; // Vanilla: 24
driverCanEject = 1;
class Turrets: Turrets {
class CopilotTurret: CopilotTurret {
canEject = 1;
};
class LoadmasterTurret: MainTurret {
canEject = 1;
};
};
};
class O_Heli_Transport_04_bench_F: Heli_Transport_04_base_F {
class Turrets: Turrets {
class CopilotTurret: CopilotTurret {
canEject = 1;
};
class LoadmasterTurret: LoadmasterTurret {
canEject = 1;
};
};
};
class O_Heli_Transport_04_covered_F: Heli_Transport_04_base_F {
class Turrets: Turrets {
class CopilotTurret: CopilotTurret {
canEject = 1;
};
class LoadmasterTurret: LoadmasterTurret {
canEject = 1;
};
};
};
};

View File

@ -1,13 +1,8 @@
class Mode_SemiAuto;
class Mode_Burst;
class Mode_FullAuto;
class CfgWeapons {
class RocketPods;
class ACE_AIR_SAFETY : RocketPods
{
class ACE_AIR_SAFETY : RocketPods {
CanLock = 0;
displayName = "SAFE";
displayNameMagazine = "SAFE";
@ -21,18 +16,6 @@ class CfgWeapons {
magazineReloadTime = 0.1;
};
// Manual Switching Of Flare Mode
class SmokeLauncher;
class CMFlareLauncher: SmokeLauncher {
modes[] = {"Single","Burst","AIBurst"};
class Single: Mode_SemiAuto {
reloadTime = 0.1;
};
class Burst: Mode_Burst {
displayName = CSTRING(CMFlareLauncher_Burst_Name);
};
};
// bigger mag for comanche
class CannonCore;
class gatling_20mm: CannonCore {
@ -43,6 +26,7 @@ class CfgWeapons {
reloadTime = 0.023; //0.04;
dispersion = 0.006; //0.0022;
};
class close: manual {};
class short: close {};
class medium: close {};
@ -57,18 +41,22 @@ class CfgWeapons {
dispersion = 0.006;
displayName = CSTRING(gatling_20mm_Name);
};
class close: close {
reloadTime = 0.04;
dispersion = 0.006;
};
class short: short {
reloadTime = 0.04;
dispersion = 0.006;
};
class medium: medium {
reloadTime = 0.04;
dispersion = 0.006;
};
class far: far {
reloadTime = 0.04;
dispersion = 0.006;
@ -78,14 +66,13 @@ class CfgWeapons {
// buff gatling rof
class MGunCore;
class MGun: MGunCore {};
class LMG_RCWS: MGun {};
class LMG_Minigun: LMG_RCWS {
class manual: MGun {
reloadTime = 0.075; //0.015;
dispersion = 0.00093; //0.006;
};
class close: manual {};
class short: close {};
class medium: close {};
@ -94,10 +81,12 @@ class CfgWeapons {
class LMG_Minigun_heli: LMG_Minigun {
showAimCursorInternal = 0;
class manual: manual {
reloadTime = 0.015; //0.033; Note: This is a way to fast ROF (requires over 60 FPS) @todo
dispersion = 0.006; //0.0087;
};
class close: manual {};
class short: close {};
class medium: close {};
@ -110,30 +99,16 @@ class CfgWeapons {
dispersion = 0.0064; //0.0023;
multiplier = 1;
};
class HighROF: LowROF {
reloadTime = 0.02; //0.03;
dispersion = 0.0064; //0.0023;
multiplier = 1;
};
class close: HighROF {};
class short: close {};
class medium: LowROF {};
class far: medium {};
};
class Gatling_30mm_Plane_CAS_01_F: CannonCore {
autoFire = 1;
burst = 1;
class LowROF: Mode_FullAuto {
autoFire = 0;
burst = 22; //65;
reloadTime = 0.0462; //0.0154; //0.034;
multiplier = 3;
};
class close: LowROF {};
class near: close {};
class short: close {};
class medium: close {};
class far: close {};
};
};

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
ace_aircraft
============
Changes to air weaponry, flight models and HUDs.
Changes to air weaponry, ejection and HUDs.
- Contributions by Kimi (geraldbolso1899) for HUD updates

View File

@ -10,35 +10,32 @@ class HScrollbar;
class RscLadderPicture;
class RscControlsGroupNoScrollbars;
class RscInGameUI
{
class RscInGameUI {
class RscUnitInfo;
class Rsc_ACE_Helo_UI_Turret: RscUnitInfo
{
class Rsc_ACE_Helo_UI_Turret: RscUnitInfo {
idd = 300;
controls[] = {"CA_IGUI_elements_group", "CA_VehicleToggles"};
class VScrollbar;
class HScrollbar;
class CA_IGUI_elements_group: RscControlsGroup
{
class CA_IGUI_elements_group: RscControlsGroup {
idc = 170;
class VScrollbar: VScrollbar
{
class VScrollbar: VScrollbar {
width = 0;
};
class HScrollbar: HScrollbar
{
class HScrollbar: HScrollbar {
height = 0;
};
x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))";
y = "0 * (0.025 * SafezoneH) + (SafezoneY)";
w = "53.5 * (0.01875 * SafezoneH)";
h = "40 * (0.025 * SafezoneH)";
class controls
{
class CA_Distance: RscText
{
class controls {
class CA_Distance: RscText {
idc = 151;
style = 2;
sizeEx = "0.0295 * SafezoneH";
@ -49,8 +46,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class CA_Speed: RangeText
{
class CA_Speed: RangeText {
idc = 188;
style = 2;
sizeEx = "0.0295 * SafezoneH";
@ -62,8 +59,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class CA_Alt: RangeText
{
class CA_Alt: RangeText {
idc = 189;
style = 2;
sizeEx = "0.0295 * SafezoneH";
@ -75,8 +72,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class CA_VisionMode: RscText
{
class CA_VisionMode: RscText {
idc = 152;
style = 0;
sizeEx = "0.0295 * SafezoneH";
@ -88,8 +85,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class CA_FlirMode: RscText
{
class CA_FlirMode: RscText {
idc = 153;
style = 0;
sizeEx = "0.0295 * SafezoneH";
@ -101,8 +98,8 @@ class RscInGameUI
w = "4.5 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class ValueGrid: RangeText
{
class ValueGrid: RangeText {
idc = 172;
font = "EtelkaMonospacePro";
style = 2;
@ -113,8 +110,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class TextTADS: RangeText
{
class TextTADS: RangeText {
idc = 1010;
text = "TADS";
font = "EtelkaMonospacePro";
@ -125,8 +122,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class ValueTime: RangeText
{
class ValueTime: RangeText {
idc = 190;
text = "20:28:35";
font = "EtelkaMonospacePro";
@ -138,8 +135,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class CA_Laser: RscText
{
class CA_Laser: RscText {
idc = 158;
style = "0x30 + 0x800";
sizeEx = "0.038 * SafezoneH";
@ -151,8 +148,8 @@ class RscInGameUI
w = "12.5 * (0.01875 * SafezoneH)";
h = "12 * (0.025 * SafezoneH)";
};
class CA_Heading: RscText
{
class CA_Heading: RscText {
idc = 156;
style = 0;
sizeEx = "0.038 * SafezoneH";
@ -167,37 +164,37 @@ class RscInGameUI
};
};
};
class Rsc_ACE_Helo_UI_01: RscUnitInfo
{
class Rsc_ACE_Helo_UI_01: RscUnitInfo {
controls[] = {"WeaponInfoControlsGroupRight", "CA_TextFlaresMode", "CA_TextFlares", "CA_VehicleToggles", "CA_Radar"};
};
class Rsc_ACE_Helo_UI_02: RscUnitInfo
{
class Rsc_ACE_Helo_UI_02: RscUnitInfo {
controls[] = {"CA_TextFlaresMode", "CA_TextFlares", "CA_VehicleToggles", "CA_Radar"};
};
class Rsc_ACE_Drones_UI_Turret: RscUnitInfo
{
class Rsc_ACE_Drones_UI_Turret: RscUnitInfo {
idd = 300;
controls[] = {"CA_Zeroing", "CA_IGUI_elements_group", "CA_VehicleToggles"};
class CA_IGUI_elements_group: RscControlsGroup
{
class CA_IGUI_elements_group: RscControlsGroup {
idc = 170;
class VScrollbar: VScrollbar
{
class VScrollbar: VScrollbar {
width = 0;
};
class HScrollbar: HScrollbar
{
class HScrollbar: HScrollbar {
height = 0;
};
x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))";
y = "0 * (0.025 * SafezoneH) + (SafezoneY)";
w = "53.5 * (0.01875 * SafezoneH)";
h = "40 * (0.025 * SafezoneH)";
class controls
{
class CA_Distance: RscText
{
class controls {
class CA_Distance: RscText {
idc = 151;
style = 2;
sizeEx = "0.0295 * SafezoneH";
@ -208,8 +205,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class CA_Speed: RangeText
{
class CA_Speed: RangeText {
idc = 188;
style = 2;
sizeEx = "0.0295 * SafezoneH";
@ -221,8 +218,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class CA_Alt: RangeText
{
class CA_Alt: RangeText {
idc = 189;
style = 2;
sizeEx = "0.0295 * SafezoneH";
@ -234,8 +231,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class ValueTime: RangeText
{
class ValueTime: RangeText {
idc = 190;
text = "20:28:35";
font = "EtelkaMonospacePro";
@ -247,8 +244,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class CA_VisionMode: RscText
{
class CA_VisionMode: RscText {
idc = 152;
style = 0;
sizeEx = "0.0295 * SafezoneH";
@ -261,8 +258,8 @@ class RscInGameUI
w = "4 * (0.01875 * SafezoneH)";
h = "1.0 * (0.025 * SafezoneH)";
};
class CA_FlirMode: RscText
{
class CA_FlirMode: RscText {
idc = 153;
style = 0;
sizeEx = "0.0295 * SafezoneH";
@ -275,8 +272,8 @@ class RscInGameUI
w = "4.5 * (0.01875 * SafezoneH)";
h = "1.0 * (0.025 * SafezoneH)";
};
class TgT_Grid_text: RangeText
{
class TgT_Grid_text: RangeText {
idc = 1005;
text = "TGT:";
font = "EtelkaMonospacePro";
@ -288,8 +285,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class TGT_ValueGrid: RangeText
{
class TGT_ValueGrid: RangeText {
idc = 172;
font = "EtelkaMonospacePro";
colorText[] = {0.706, 0.0745, 0.0196, 0.8};
@ -301,8 +298,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class OWN_Grid_text: RangeText
{
class OWN_Grid_text: RangeText {
idc = 1005;
text = "OWN:";
font = "EtelkaMonospacePro";
@ -314,8 +311,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class OWN_ValueGrid: RangeText
{
class OWN_ValueGrid: RangeText {
idc = 171;
font = "EtelkaMonospacePro";
colorText[] = {0.15, 1, 0.15, 0.8};
@ -327,8 +324,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class CA_Laser: RscText
{
class CA_Laser: RscText {
idc = 158;
style = "0x30 + 0x800";
sizeEx = "0.038 * SafezoneH";
@ -341,8 +338,8 @@ class RscInGameUI
w = "12.5 * (0.01875 * SafezoneH)";
h = "12 * (0.025 * SafezoneH)";
};
class CA_Heading: RscText
{
class CA_Heading: RscText {
idc = 156;
style = 0;
sizeEx = "0.038 * SafezoneH";
@ -358,29 +355,28 @@ class RscInGameUI
};
};
};
class Rsc_ACE_Drones_UI_Pilots: RscUnitInfo
{
class Rsc_ACE_Drones_UI_Pilots: RscUnitInfo {
idd = 300;
controls[] = {"WeaponInfoControlsGroupRight", "CA_BackgroundVehicle", "CA_BackgroundVehicleTitle", "CA_BackgroundVehicleTitleDark", "CA_BackgroundFuel", "CA_Vehicle", "CA_VehicleRole", "CA_HitZones", "CA_SpeedBackground", "CA_SpeedUnits", "CA_Speed", "CA_ValueFuel", "CA_AltBackground", "CA_AltUnits", "CA_Alt", "CA_VehicleToggles", "CA_Radar", "DriverOpticsGroup"};
class DriverOpticsGroup: RscControlsGroup
{
class DriverOpticsGroup: RscControlsGroup {
idc = 392;
class VScrollbar: VScrollbar
{
class VScrollbar: VScrollbar {
width = 0;
};
class HScrollbar: HScrollbar
{
class HScrollbar: HScrollbar {
height = 0;
};
x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))";
y = "0 * (0.025 * SafezoneH) + (SafezoneY)";
w = "53.5 * (0.01875 * SafezoneH)";
h = "40 * (0.025 * SafezoneH)";
class controls
{
class TextGrid: RscText
{
class controls {
class TextGrid: RscText {
style = 0;
sizeEx = "0.02 * SafezoneH";
shadow = 0;
@ -392,8 +388,8 @@ class RscInGameUI
w = "5 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class ValueGrid: TextGrid
{
class ValueGrid: TextGrid {
idc = 189;
text = "382546";
x = "10.3 * (0.01875 * SafezoneH)";
@ -401,8 +397,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class TextTime: TextGrid
{
class TextTime: TextGrid {
idc = 1010;
text = "TIME [UTC]:";
x = "5.8 * (0.01875 * SafezoneH)";
@ -410,8 +406,8 @@ class RscInGameUI
w = "5 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class ValueTime: TextGrid
{
class ValueTime: TextGrid {
idc = 101;
text = "20:28:35";
x = "10 * (0.01875 * SafezoneH)";
@ -419,8 +415,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class TextMag: TextGrid
{
class TextMag: TextGrid {
idc = 1011;
text = "CAM MAG:";
x = "5.8 * (0.01875 * SafezoneH)";
@ -428,8 +424,8 @@ class RscInGameUI
w = "5 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class OpticsZoom: TextGrid
{
class OpticsZoom: TextGrid {
idc = 192;
text = "28x";
x = "10.3 * (0.01875 * SafezoneH)";
@ -437,8 +433,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class BorderLineSpdTop: RscPicture
{
class BorderLineSpdTop: RscPicture {
idc = 1203;
text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa";
x = "3.343 * (0.01875 * SafezoneH)";
@ -446,8 +442,8 @@ class RscInGameUI
w = "3 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class BorderLineSpdBottom: RscPicture
{
class BorderLineSpdBottom: RscPicture {
idc = 1207;
text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa";
x = "3.343 * (0.01875 * SafezoneH)";
@ -455,8 +451,8 @@ class RscInGameUI
w = "3 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class BorderLineAltTop: RscPicture
{
class BorderLineAltTop: RscPicture {
idc = 1205;
text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa";
x = "47.16 * (0.01875 * SafezoneH)";
@ -464,8 +460,8 @@ class RscInGameUI
w = "3 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class BorderLineAltBottom: RscPicture
{
class BorderLineAltBottom: RscPicture {
idc = 1206;
text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa";
x = "47.16 * (0.01875 * SafezoneH)";
@ -473,8 +469,8 @@ class RscInGameUI
w = "3 * (0.01875 * SafezoneH)";
h = "1 * (0.025 * SafezoneH)";
};
class TextSpd: TextGrid
{
class TextSpd: TextGrid {
idc = 1004;
text = "SPD";
x = "4.8 * (0.01875 * SafezoneH)";
@ -482,8 +478,8 @@ class RscInGameUI
w = "5 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class SpeedValueBorder: RscPicture
{
class SpeedValueBorder: RscPicture {
idc = 1200;
text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\altimeter_value_ca.paa";
x = "6.3 * (0.01875 * SafezoneH)";
@ -491,8 +487,8 @@ class RscInGameUI
w = "5 * (0.01875 * SafezoneH)";
h = "2 * (0.025 * SafezoneH)";
};
class CA_Speed: TextGrid
{
class CA_Speed: TextGrid {
idc = 190;
sizeEx = "0.03*SafezoneH";
text = "120";
@ -501,8 +497,8 @@ class RscInGameUI
w = "6 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class AnalogueSpeed: RscLadderPicture
{
class AnalogueSpeed: RscLadderPicture {
idc = 384;
topValue = 1312;
bottomValue = -345;
@ -513,8 +509,8 @@ class RscInGameUI
w = "5 * (0.01875 * SafezoneH)";
h = "14 * (0.025 * SafezoneH)";
};
class TextAlt: TextGrid
{
class TextAlt: TextGrid {
idc = 1006;
text = "ALT";
x = "46.9 * (0.01875 * SafezoneH)";
@ -522,8 +518,8 @@ class RscInGameUI
w = "5 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class AltValueBorder: RscPicture
{
class AltValueBorder: RscPicture {
idc = 1201;
text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\airspeed_value_ca.paa";
x = "42.25 * (0.01875 * SafezoneH)";
@ -531,8 +527,8 @@ class RscInGameUI
w = "5 * (0.01875 * SafezoneH)";
h = "2 * (0.025 * SafezoneH)";
};
class CA_Alt: TextGrid
{
class CA_Alt: TextGrid {
idc = 191;
sizeEx = "0.03 * SafezoneH";
style = 1;
@ -542,8 +538,8 @@ class RscInGameUI
w = "3.2 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class AnalogueAlt: RscLadderPicture
{
class AnalogueAlt: RscLadderPicture {
idc = 385;
topValue = 14430;
bottomValue = -2110;
@ -554,8 +550,8 @@ class RscInGameUI
w = "2.5 * (0.01875 * SafezoneH)";
h = "14 * (0.025 * SafezoneH)";
};
class AnalogueHorizon: RscLadderPicture
{
class AnalogueHorizon: RscLadderPicture {
idc = 383;
topValue = 90;
bottomValue = -90;
@ -566,8 +562,8 @@ class RscInGameUI
w = "20 * (0.01875 * SafezoneH)";
h = "30 * (0.025 * SafezoneH)";
};
class HorizonCenter: RscPicture
{
class HorizonCenter: RscPicture {
idc = 1202;
text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\horizon_aircraft_ca.paa";
x = "24.75 * (0.01875 * SafezoneH)";

View File

@ -1,24 +0,0 @@
acceleration = 300;
maxSpeed = 936;
irScanRangeMin = 500;
irScanRangeMax = 5000;
aileronSensitivity = 0.64;
elevatorSensitivity = 0.682;
rudderInfluence = 0.001;
aileronControlsSensitivityCoef = 3;
elevatorControlsSensitivity = 2;
rudderControlsSensitivityoef = 4;
elevatorCoef[] = {0.6,0.73,0.62,0.52,0.39,0.33,0.28};
aileronCoef[] = {0.5,0.68,0.75,0.86,0.92,0.96,1};
rudderCoef[] = {0.9,0.75,0.58,0.45,0.38,0.35,0.3};
envelope[] = {0,0.06,1.2,3,3.6,3.75,3.65,3.45,3.3,2.8,2.4,1.9,1.5};
angleOfIndicence = 0.0523599; //determines velocity vector behaviour, how quickly it catches up with where your nose is pointing, I think
draconicForceXCoef = 7.5; //max angle of attack, lower value gives higher aoa
draconicForceYCoef = 0.2198; //Something to do with bleed off of speed, low values seem to increase bleed off
draconicForceZCoef = 5.12; //????
draconicTorqueXCoef = 0.18; //resistance to elevator input, also impacts speed degradation
draconicTorqueYCoef = 0.000017;
thrustCoef[] = {1.3,1.27,1.24,1.2,1.17,1.15,1.13,1.1,1.06,1,0.94,0.72,0.51,0.4,0.25,0};
gunAimDown = 0.029;
flapsFrictionCoef = 0.32;

View File

@ -1,22 +0,0 @@
maxSpeed = 736;
aileronSensitivity = 0.85;
elevatorSensitivity = 0.75;
rudderInfluence = 0.001;
aileronControlsSensitivityCoef = 3;
elevatorControlsSensitivity = 2;
rudderControlsSensitivityoef = 4;
elevatorCoef[] = {0.7,0.75,0.75,0.65,0.55,0.45,0.35};
aileronCoef[] = {0.6,0.85,0.88,0.92,0.95,0.97,1};
rudderCoef[] = {0.8,0.75,0.65,0.5,0.4,0.33,0.3};
flapsFrictionCoef = 0.35;
angleOfIndicence = 0.0523599;
draconicForceXCoef = 9.5;
draconicForceYCoef = 0.56;
draconicForceZCoef = 0.1;
draconicTorqueXCoef = 0.58;
draconicTorqueYCoef = 0.00013;
envelope[] = {0,0,0.75,2.4,3.6,3.8,3.7,3.2,2.2,1.7,0.9};
thrustCoef[] = {1,1.2,1.3,1.25,1.06,1.01,1,0.92,0.75,0.65,0.5,0.25,0};
acceleration = 265;
landingSpeed = 220;

View File

@ -1,21 +0,0 @@
maxSpeed = 1059;
acceleration = 300;
aileronSensitivity = 0.635;
elevatorSensitivity = 0.814;
rudderInfluence = 0.001;
aileronControlsSensitivityCoef = 3;
elevatorControlsSensitivity = 2;
rudderControlsSensitivityoef = 4;
elevatorCoef[] = {0.6,0.76,0.7,0.65,0.58,0.47,0.43};
aileronCoef[] = {0.5,0.85,0.87,0.89,0.92,0.95,1};
rudderCoef[] = {0.8,0.7,0.6,0.5,0.4,0.32,0.27};
angleOfIndicence = 0.0523599;
draconicForceXCoef = 7.6;
draconicForceYCoef = 0.75;
draconicForceZCoef = 0.085;
draconicTorqueXCoef = 0.815;
draconicTorqueYCoef = 0.000152;
envelope[] = {0,0.446,1.5,3.9,5.2,4.8,4.2,3.5,2,1,0.5};
thrustCoef[] = {1,1.2,1.7,1.7,1.65,1.54,1.32,1.1,0.95,0.75,0.5,0.35,0};
flapsFrictionCoef = 0.32;

View File

@ -4,7 +4,6 @@
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define CBA_DEBUG_SYNCHRONOUS
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_AIRCRAFT

View File

@ -1,18 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Aircraft">
<Key ID="STR_ACE_Aircraft_CMFlareLauncher_Burst_Name">
<English>Burst</English>
<German>Feuerstoß</German>
<Spanish>Ráfaga</Spanish>
<Polish>Seria</Polish>
<Czech>Dávka</Czech>
<French>Rafale</French>
<Russian>Очередь</Russian>
<Hungarian>Sorozat</Hungarian>
<Portuguese>Rajada</Portuguese>
<Italian>Raffica</Italian>
</Key>
<Key ID="STR_ACE_Aircraft_gatling_20mm_Name">
<English>XM301</English>
<German>XM301</German>
@ -24,6 +12,10 @@
<Hungarian>XM301</Hungarian>
<Portuguese>XM301</Portuguese>
<Italian>XM301</Italian>
<Japanese>XM301</Japanese>
<Korean>XM301</Korean>
<Chinese>XM301</Chinese>
<Chinesesimp>XM301</Chinesesimp>
</Key>
<Key ID="STR_ACE_Aircraft_OpenCargoRamp">
<English>Open Cargo Door</English>
@ -36,6 +28,10 @@
<Russian>Открыть грузовой отсек</Russian>
<Italian>Apri la rampa di carico</Italian>
<Portuguese>Abrir porta de carga</Portuguese>
<Japanese>カーゴ ドアを開く</Japanese>
<Korean>화물칸 개방</Korean>
<Chinese>開啟貨艙門</Chinese>
<Chinesesimp>开启货舱门</Chinesesimp>
</Key>
<Key ID="STR_ACE_Aircraft_CloseCargoRamp">
<English>Close Cargo Door</English>
@ -48,6 +44,10 @@
<Russian>Закрыть грузовой отсек</Russian>
<Italian>Chiudi la rampa di carico</Italian>
<Portuguese>Fechar porta de carga</Portuguese>
<Japanese>カーゴ ドアを閉じる</Japanese>
<Korean>화물칸 폐쇄</Korean>
<Chinese>關閉貨艙門</Chinese>
<Chinesesimp>关闭货舱门</Chinesesimp>
</Key>
</Package>
</Project>

View File

@ -4,7 +4,6 @@
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define CBA_DEBUG_SYNCHRONOUS
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_APL

View File

@ -2,6 +2,10 @@
#define ST_RIGHT 1
#define ST_CENTER 2
#define ST_WITH_RECT 160
#define LB_TEXTURES 0x10
class ATragMX_RscText {
idc=-1;
type=0;
@ -93,7 +97,7 @@ class ATragMX_RscToolbox {
class ATragMX_RscListBox {
idc=-1;
type=5;
style=0;
style=LB_TEXTURES;
font="TahomaB";
sizeEx=0.028;
rowHeight=0.03;
@ -113,13 +117,14 @@ class ATragMX_RscListBox {
soundSelect[]={"",0.09,1};
class ScrollBar {
color[]={1,1,1,0.6};
colorActive[]={1,1,1,1};
colorDisabled[]={1,1,1,0.3};
//thumb="\ca\ui\data\igui_scrollbar_thumb_ca.paa";
//arrowFull="\ca\ui\data\igui_arrow_top_active_ca.paa";
//arrowEmpty="\ca\ui\data\igui_arrow_top_ca.paa";
//border="\ca\ui\data\igui_border_scroll_ca.paa";
width=0.05;
color[]={0.15,0.21,0.23,0.3};
colorActive[]={0.15,0.21,0.23,0.3};
colorDisabled[]={0.15,0.21,0.23,0.3};
arrowEmpty="\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
arrowFull="\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
border="\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
thumb="\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
};
class ListScrollBar : ScrollBar {
@ -128,7 +133,6 @@ class ATragMX_RscListBox {
class ATragMX_RscListNBox: ATragMX_RscListBox {
idc=-1;
type=102;
columns[]={0.0, 0.225, 0.475, 0.7};
drawSideArrows=0;
idcLeft=-1;
idcRight=-1;
@ -350,6 +354,7 @@ class ATragMX_Display {
colorBackground[]={0.15,0.21,0.23,0.3};
colorFocused[]={0.15,0.21,0.23,0.2};
text="MV";
action=QUOTE(0 call FUNC(toggle_muzzle_velocity_data));
};
class TEXT_MUZZLE_VELOCITY_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT {
idc=130;
@ -383,18 +388,18 @@ class ATragMX_Display {
y=0.265*safezoneH+safezoneY+0.320;
text="";
};
class TEXT_BAROMETRIC_PRESSURE: TEXT_AIR_FRICTION {
class TEXT_BAROMETRIC_PRESSURE: TEXT_TEMPERATURE {
idc=21;
x=0.550*safezoneW+safezoneX+0.20;
y=0.265*safezoneH+safezoneY+0.355;
text="BP";
};
class TEXT_BAROMETRIC_PRESSURE_OUTPUT: TEXT_TEMPERATURE_OUTPUT {
idc=210;
y=0.265*safezoneH+safezoneY+0.355;
};
class TEXT_RELATIVE_HUMIDITY: TEXT_AIR_FRICTION {
class TEXT_RELATIVE_HUMIDITY: TEXT_BAROMETRIC_PRESSURE {
idc=22;
x=0.550*safezoneW+safezoneX+0.20;
y=0.265*safezoneH+safezoneY+0.390;
text="RH";
};
@ -526,7 +531,7 @@ class ATragMX_Display {
};
class TEXT_ELEVATION_OUTPUT_ABSOLUTE: ATragMX_RscText {
idc=400;
style=160;
style=ST_WITH_RECT+ST_RIGHT;
sizeEx=0.025;
w=0.065;
h=0.032;
@ -606,17 +611,40 @@ class ATragMX_Display {
class TEXT_SCOPE_CLICK_NUMBER: TEXT_GUN_LIST {
idc=2001;
style=ST_CENTER;
w=0.03;
w=0.025;
x=0.550*safezoneW+safezoneX+0.27;
text="4";
action=QUOTE(call FUNC(toggle_solution_setup));
};
class TEXT_CALCULATE: TEXT_SCOPE_UNIT {
class TEXT_OPTIONS: TEXT_GUN_LIST {
idc=3000;
style=ST_RIGHT;
x=0.550*safezoneW+safezoneX+0.3;
text="Calc";
action=QUOTE(call FUNC(calculate_target_solution));
text="Options";
action=QUOTE(false call FUNC(toggle_option_menu));
};
class TEXT_OPTIONS_BACKGROUND: ATragMX_RscButton {
idc=3001;
colorBackground[]={0.15,0.21,0.23,0.2};
colorBackgroundActive[]={0.15,0.21,0.23,0.2};
colorFocused[]={0.15,0.21,0.23,0.2};
x=0.550*safezoneW+safezoneX+0.105;
y=0.265*safezoneH+safezoneY+0.17;
w=0.3;
h=0.535;
offsetPressedX=0.0;
offsetPressedY=0.0;
action=QUOTE(false call FUNC(toggle_option_menu));
};
class TEXT_OPTIONS_LIST_OUTPUT: ATragMX_RscListBox {
idc=3002;
style=0;
w=0.17;
h=0.28;
x=0.550*safezoneW+safezoneX+0.225;
y=0.265*safezoneH+safezoneY+0.355;
sizeEx=0.025;
onMouseButtonClick=QUOTE(true call FUNC(toggle_option_menu));
};
class TEXT_RANGE_CARD_SCOPE_UNIT: TEXT_GUN_PROFILE {
@ -666,6 +694,7 @@ class ATragMX_Display {
};
class TEXT_RANGE_CARD_OUTPUT: ATragMX_RscListNBox {
idc=5007;
columns[]={0.0, 0.225, 0.475, 0.7};
idcLeft=50061;
idcRight=50062;
w=0.285;
@ -674,16 +703,17 @@ class ATragMX_Display {
y=0.265*safezoneH+safezoneY+0.27;
};
class TEXT_GUN_LIST_OUTPUT: ATragMX_RscListBox {
class TEXT_GUN_LIST_OUTPUT: ATragMX_RscListNBox {
idc=6000;
columns[]={-0.05};
w=0.16;
h=0.45;
x=0.550*safezoneW+safezoneX+0.11;
y=0.265*safezoneH+safezoneY+0.24;
sizeEx=0.025;
sizeEx=0.018;
colorSelectBackground[]={0.15,0.21,0.23,0.3};
colorSelectBackground2[]={0.15,0.21,0.23,0.3};
onMouseButtonDblClick=QUOTE(true call FUNC(toggle_gun_list));
onLBDblClick=QUOTE(true call FUNC(toggle_gun_list));
};
class TEXT_GUN_LIST_COLUMN_CAPTION: TEXT_GUN_PROFILE {
idc=6001;
@ -766,8 +796,9 @@ class ATragMX_Display {
class TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE: TEXT_TARGET_RANGE_ASSIST_MEASUREMENT_METHOD {
idc=7003;
style=ST_RIGHT;
x=0.550*safezoneW+safezoneX+0.10;
x=0.550*safezoneW+safezoneX+0.092;
y=0.265*safezoneH+safezoneY+0.4;
w=0.128;
text="Target Size";
};
class TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE {
@ -874,22 +905,22 @@ class ATragMX_Display {
class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE {
idc=8000;
x=0.550*safezoneW+safezoneX+0.13;
x=0.550*safezoneW+safezoneX+0.12;
text="Target Range";
};
class TEXT_TARGET_SPEED_ASSIST_NUM_TICKS: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE {
idc=8001;
x=0.550*safezoneW+safezoneX+0.13;
x=0.550*safezoneW+safezoneX+0.12;
text="Num Ticks";
};
class TEXT_TARGET_SPEED_ASSIST_TIME: TEXT_TARGET_RANGE_ASSIST_ANGLE {
idc=8002;
x=0.550*safezoneW+safezoneX+0.13;
x=0.550*safezoneW+safezoneX+0.12;
text="Time (secs)";
};
class TEXT_TARGET_SPEED_ASSIST_TARGET_ESTIMATED_SPEED: TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE {
idc=8003;
x=0.550*safezoneW+safezoneX+0.13;
x=0.550*safezoneW+safezoneX+0.12;
text="Est Speed";
};
class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE_INPUT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT {
@ -1040,6 +1071,8 @@ class ATragMX_Display {
x=0.550*safezoneW+safezoneX+0.12;
y=0.265*safezoneH+safezoneY+0.28;
text="";
onKeyDown=QUOTE(call FUNC(trim_gun_name));
onKeyUp=QUOTE(call FUNC(trim_gun_name));
};
class TEXT_ADD_NEW_GUN_OK: ATragMX_RscButton {
idc=11002;
@ -1468,5 +1501,343 @@ class ATragMX_Display {
y=0.265*safezoneH+safezoneY+0.55;
action=QUOTE(0 call FUNC(toggle_solution_setup));
};
class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE: TEXT_BORE_HEIGHT {
idc=16000;
w=0.22;
y=0.265*safezoneH+safezoneY+0.25;
sizeEx=0.022;
text="Temperature";
};
class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE {
idc=16001;
x=0.550*safezoneW+safezoneX+0.215;
sizeEx=0.022;
text="Muzzle velocity";
};
class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1: ATragMX_RscEdit {
idc=160021;
w=0.082;
h=0.035;
x=0.550*safezoneW+safezoneX+0.128;
y=0.265*safezoneH+safezoneY+0.29;
text="0";
};
class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_2: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 {
idc=160022;
y=0.265*safezoneH+safezoneY+0.325;
};
class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_3: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 {
idc=160023;
y=0.265*safezoneH+safezoneY+0.360;
};
class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_4: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 {
idc=160024;
y=0.265*safezoneH+safezoneY+0.395;
};
class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_5: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 {
idc=160025;
y=0.265*safezoneH+safezoneY+0.430;
};
class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_6: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 {
idc=160026;
y=0.265*safezoneH+safezoneY+0.465;
};
class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_7: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 {
idc=160027;
y=0.265*safezoneH+safezoneY+0.500;
};
class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_1: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 {
idc=160031;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_2: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_2 {
idc=160032;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_3: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_3 {
idc=160033;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_4: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_4 {
idc=160034;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_5: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_5 {
idc=160035;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_6: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_6 {
idc=160036;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_7: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_7 {
idc=160037;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_MUZZLE_VELOCITY_DATA_CLEAR: TEXT_TARGET_DATA_NEXT {
idc=16004;
style=ST_CENTER;
h=0.035;
y=0.265*safezoneH+safezoneY+0.3625;
text="Clear";
action=QUOTE(call FUNC(clear_muzzle_velocity_data));
};
class TEXT_MUZZLE_VELOCITY_DATA_QUESTIONMARK: TEXT_MUZZLE_VELOCITY_DATA_CLEAR {
idc=16005;
y=0.265*safezoneH+safezoneY+0.430;
text="?";
action="";
};
class TEXT_MUZZLE_VELOCITY_DATA_DONE: TEXT_TARGET_DATA_DONE {
idc=16006;
action=QUOTE(1 call FUNC(toggle_muzzle_velocity_data));
};
class TEXT_MUZZLE_VELOCITY_DATA_CANCEL: TEXT_TARGET_DATA_CANCEL {
idc=16007;
action=QUOTE(0 call FUNC(toggle_muzzle_velocity_data));
};
class TEXT_MUZZLE_VELOCITY_DATA_PREV: TEXT_TARGET_DATA_PREV {
idc=16008;
};
class TEXT_MUZZLE_VELOCITY_DATA_NEXT: TEXT_TARGET_DATA_NEXT {
idc=16009;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE: TEXT_BORE_HEIGHT {
idc=17000;
w=0.22;
x=0.550*safezoneW+safezoneX+0.15;
y=0.265*safezoneH+safezoneY+0.25;
sizeEx=0.022;
text="Meters";
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE {
idc=17001;
x=0.550*safezoneW+safezoneX+0.235;
sizeEx=0.022;
text="BC-Coef";
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1: ATragMX_RscEdit {
idc=170021;
w=0.082;
h=0.035;
x=0.550*safezoneW+safezoneX+0.128;
y=0.265*safezoneH+safezoneY+0.29;
text="0";
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_2: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 {
idc=170022;
y=0.265*safezoneH+safezoneY+0.325;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_3: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 {
idc=170023;
y=0.265*safezoneH+safezoneY+0.360;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_4: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 {
idc=170024;
y=0.265*safezoneH+safezoneY+0.395;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_5: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 {
idc=170025;
y=0.265*safezoneH+safezoneY+0.430;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_6: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 {
idc=170026;
y=0.265*safezoneH+safezoneY+0.465;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_7: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 {
idc=170027;
y=0.265*safezoneH+safezoneY+0.500;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_1: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 {
idc=170031;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_2: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_2 {
idc=170032;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_3: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_3 {
idc=170033;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_4: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_4 {
idc=170034;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_5: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_5 {
idc=170035;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_6: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_6 {
idc=170036;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_7: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_7 {
idc=170037;
x=0.550*safezoneW+safezoneX+0.225;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_QUESTIONMARK: TEXT_TARGET_DATA_NEXT {
idc=17004;
style=ST_CENTER;
w=0.04;
h=0.035;
y=0.265*safezoneH+safezoneY+0.35;
text="?";
action="";
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_CLEAR: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_QUESTIONMARK {
idc=17005;
w=0.07;
y=0.265*safezoneH+safezoneY+0.4175;
text="Clear";
action=QUOTE(call FUNC(clear_c1_ballistic_coefficient_data));
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DONE: TEXT_TARGET_DATA_DONE {
idc=17006;
action=QUOTE(1 call FUNC(toggle_c1_ballistic_coefficient_data));
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_CANCEL: TEXT_TARGET_DATA_CANCEL {
idc=17007;
action=QUOTE(0 call FUNC(toggle_c1_ballistic_coefficient_data));
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_PREV: TEXT_TARGET_DATA_PREV {
idc=17008;
};
class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_NEXT: TEXT_TARGET_DATA_NEXT {
idc=17009;
};
class TEXT_TRUING_DROP_ZERO_RANGE: ATragMX_RscText {
idc=18000;
style=ST_LEFT;
x=0.550*safezoneW+safezoneX+0.115;
y=0.265*safezoneH+safezoneY+0.220;
w=0.135;
h=0.03;
sizeEx=0.025;
text="ZR=100meters";
};
class TEXT_TRUING_DROP_DROP_UNIT: TEXT_TRUING_DROP_ZERO_RANGE {
idc=18001;
style=ST_LEFT;
x=0.550*safezoneW+safezoneX+0.25;
text="Drop=mil";
};
class TEXT_TRUING_DROP_TARGET_RANGE: TEXT_TRUING_DROP_ZERO_RANGE {
idc=18002;
y=0.265*safezoneH+safezoneY+0.35;
sizeEx=0.027;
text="Target Range";
};
class TEXT_TRUING_DROP_DROP: TEXT_TRUING_DROP_TARGET_RANGE {
idc=18003;
w=0.07;
y=0.265*safezoneH+safezoneY+0.40;
text="Drop";
};
class TEXT_TRUING_DROP_MUZZLE_VELOCITY: TEXT_TRUING_DROP_DROP {
idc=18004;
y=0.265*safezoneH+safezoneY+0.50;
text="MV";
};
class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT: TEXT_TRUING_DROP_DROP {
idc=18005;
y=0.265*safezoneH+safezoneY+0.55;
text="C1";
};
class TEXT_TRUING_DROP_DROP_OUTPUT: ATragMX_RscEdit {
idc=18006;
style=ST_WITH_RECT+ST_RIGHT;
colorBackground[]={0.15,0.21,0.23,0.3};
colorDisabled[]={0,0,0,1};
w=0.06;
y=0.265*safezoneH+safezoneY+0.40;
x=0.550*safezoneW+safezoneX+0.17;
text="";
};
class TEXT_TRUING_DROP_MUZZLE_VELOCITY_OUTPUT: TEXT_TRUING_DROP_DROP_OUTPUT {
idc=18007;
y=0.265*safezoneH+safezoneY+0.50;
text="";
};
class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT_OUTPUT: TEXT_TRUING_DROP_DROP_OUTPUT {
idc=18008;
y=0.265*safezoneH+safezoneY+0.55;
text="";
};
class TEXT_TRUING_DROP_SUPER: TEXT_TARGET_A {
idc=18009;
w=0.06;
x=0.550*safezoneW+safezoneX+0.25;
y=0.265*safezoneH+safezoneY+0.30;
text="SUPER";
action=QUOTE(GVAR(truingDropMode) = 0; call FUNC(update_truing_drop_selection));
};
class TEXT_TRUING_DROP_SUB: TEXT_TRUING_DROP_SUPER {
idc=18010;
x=0.550*safezoneW+safezoneX+0.32;
text="SUB";
action=QUOTE(GVAR(truingDropMode) = 1; call FUNC(update_truing_drop_selection));
};
class TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT: ATragMX_RscEdit {
idc=18011;
style=ST_WITH_RECT+ST_RIGHT;
colorDisabled[]={0,0,0,0.6};
w=0.06;
x=0.550*safezoneW+safezoneX+0.25;
y=0.265*safezoneH+safezoneY+0.35;
};
class TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT {
idc=18012;
x=0.550*safezoneW+safezoneX+0.32;
};
class TEXT_TRUING_DROP_DROP_SUPER_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT {
idc=18013;
y=0.265*safezoneH+safezoneY+0.40;
};
class TEXT_TRUING_DROP_DROP_SUB_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT {
idc=18014;
y=0.265*safezoneH+safezoneY+0.40;
};
class TEXT_TRUING_DROP_CALC: TEXT_GUN_LIST {
idc=18015;
style=ST_CENTER;
w=0.11;
x=0.550*safezoneW+safezoneX+0.26;
y=0.265*safezoneH+safezoneY+0.45;
text="Calc";
action=QUOTE(true call FUNC(calculate_truing_drop));
};
class TEXT_TRUING_DROP_MV_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT {
idc=18016;
y=0.265*safezoneH+safezoneY+0.50;
};
class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT {
idc=18017;
y=0.265*safezoneH+safezoneY+0.55;
};
class TEXT_TRUING_DROP_ACCEPT: TEXT_GUN_LIST {
idc=18018;
w=0.085;
h=0.04;
x=0.550*safezoneW+safezoneX+0.125;
y=0.265*safezoneH+safezoneY+0.60;
text="Accept";
action=QUOTE(1 call FUNC(toggle_truing_drop));
};
class TEXT_TRUING_DROP_CANCEL: TEXT_TRUING_DROP_ACCEPT {
idc=18019;
x=0.550*safezoneW+safezoneX+0.210;
text="Cancel";
action=QUOTE(0 call FUNC(toggle_truing_drop));
};
class TEXT_TRUING_DROP_RESTORE: TEXT_TRUING_DROP_CANCEL {
idc=18020;
x=0.550*safezoneW+safezoneX+0.29525;
text="Restore";
action=QUOTE(true call FUNC(restore_truing_drop));
};
};
};

View File

@ -1,13 +1,17 @@
PREP(add_new_gun);
PREP(calculate_distance_at_velocity);
PREP(calculate_range_card);
PREP(calculate_solution);
PREP(calculate_target_range_assist);
PREP(calculate_target_solution);
PREP(calculate_target_speed_assist);
PREP(calculate_truing_drop);
PREP(can_show);
PREP(change_gun);
PREP(change_target_slot);
PREP(clear_c1_ballistic_coefficient_data);
PREP(clear_muzzle_velocity_data);
PREP(clear_user_data);
PREP(create_dialog);
PREP(cycle_gun_list);
@ -18,17 +22,29 @@ PREP(cycle_scope_unit);
PREP(cycle_target_size_units);
PREP(cycle_target_speed_direction);
PREP(delete_gun);
PREP(evaluate_option_menu_input);
PREP(init);
PREP(initGunList);
PREP(insert_c1_ballistic_coefficient_data);
PREP(insert_muzzle_velocity_data);
PREP(parse_input);
PREP(read_gun_list_entries_from_config);
PREP(recalculate_c1_ballistic_coefficient);
PREP(recalculate_muzzle_velocity);
PREP(reset_relative_click_memory);
PREP(restore_atmo_default);
PREP(restore_truing_drop);
PREP(restore_user_data);
PREP(save_gun);
PREP(shift_c1_ballistic_coefficient_data);
PREP(shift_muzzle_velocity_data);
PREP(show_add_new_gun);
PREP(show_atmo_env_data);
PREP(show_c1_ballistic_coefficient_data);
PREP(show_gun_ammo_data);
PREP(show_gun_list);
PREP(show_main_page);
PREP(show_muzzle_velocity_data);
PREP(show_range_card);
PREP(show_range_card_setup);
PREP(show_solution_setup);
@ -36,24 +52,36 @@ PREP(show_target_data);
PREP(show_target_range_assist);
PREP(show_target_speed_assist);
PREP(show_target_speed_assist_timer);
PREP(show_truing_drop);
PREP(sord);
PREP(store_gun_list);
PREP(store_user_data);
PREP(target_speed_assist_timer);
PREP(toggle_atmo_env_data);
PREP(toggle_c1_ballistic_coefficient_data);
PREP(toggle_coriolis);
PREP(toggle_gun_ammo_data);
PREP(toggle_gun_list);
PREP(toggle_muzzle_velocity_data);
PREP(toggle_option_menu);
PREP(toggle_range_card);
PREP(toggle_range_card_setup);
PREP(toggle_solution_setup);
PREP(toggle_target_data);
PREP(toggle_target_range_assist);
PREP(toggle_target_speed_assist);
PREP(toggle_truing_drop);
PREP(trim_gun_name);
PREP(true_c1_ballistic_coefficient);
PREP(true_muzzle_velocity);
PREP(update_atmosphere);
PREP(update_atmo_env_data);
PREP(update_atmo_selection);
PREP(update_c1_ballistic_coefficient_data);
PREP(update_gun);
PREP(update_gun_ammo_data);
PREP(update_inclination_angle);
PREP(update_muzzle_velocity_data);
PREP(update_range_card);
PREP(update_relative_click_memory);
PREP(update_result);
@ -62,6 +90,8 @@ PREP(update_solution_setup);
PREP(update_target);
PREP(update_target_data);
PREP(update_target_selection);
PREP(update_truing_drop_data);
PREP(update_truing_drop_selection);
PREP(update_unit_selection);
PREP(update_zero_range);
PREP(on_close_dialog);

View File

@ -2,53 +2,7 @@
#include "initKeybinds.sqf"
if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ATRAGMX_PROFILE_NAMESPACE_VERSION && count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then {
GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList";
} else {
// Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model
GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ],
["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ],
["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ],
["12.7x99mm API" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.99, 12.9, 38.10, 0.670, 1, "ASM" ],
["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ],
[".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 26.57, 10.4, 33.02, 0.970, 1, "ASM" ],
["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ],
[".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"],
[".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"],
[".338LM API526" , 895, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.560, 1, "ASM" ],
[".300WM Mk248 Mod0" , 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.268, 7, "ICAO"],
[".300WM Mk248 Mod1" , 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"],
[".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"],
["7.62x54mmR" , 800, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"],
["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.200, 7, "ICAO"],
["7.62x51mm M118LR" , 780, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"],
["7.62x51mm Mk316" , 780, 100, 0.0710319, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"],
["7.62x51mm Mk319" , 910, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"],
["7.62x51mm M993" , 930, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO"],
["7.62x51mm Subsonic", 320, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"],
["6.5x39mm" , 800, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"],
["6.5x47mm Lapua" , 800, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"],
["6.5mm Creedmor" , 840, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.317, 7, "ICAO"],
["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ],
["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ],
["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ],
["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" ]];
[] call FUNC(clear_user_data);
profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)];
};
[] call FUNC(init);
[] call FUNC(restore_user_data);
GVAR(active) = false;
GVAR(initialised) = false;
[QEGVAR(vector,rangefinderData), {_this call FUNC(sord)}] call CBA_fnc_addEventHandler;

View File

@ -2,6 +2,8 @@
ADDON = false;
PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
ADDON = true;

View File

@ -6,7 +6,7 @@ class CfgPatches {
units[] = {"ACE_Item_ATragMX"};
weapons[] = {"ACE_ATragMX"};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ACE_common", "ACE_weather"};
requiredAddons[] = {"ACE_Advanced_Ballistics", "ACE_common", "ACE_weather"};
author = ECSTRING(common,ACETeam);
authors[] = {"Ruthberg"};
url = ECSTRING(main,URL);
@ -18,7 +18,3 @@ class CfgPatches {
#include "CfgVehicles.hpp"
#include "CfgWeapons.hpp"
#include "RscTitles.hpp"
class ACE_newEvents {
RangerfinderData = QEGVAR(vector,rangefinderData);
};

View File

@ -6,7 +6,7 @@
* Nothing
*
* Return Value:
* Nothing
* None
*
* Example:
* call ace_atragmx_fnc_add_new_gun
@ -15,13 +15,16 @@
*/
#include "script_component.hpp"
call FUNC(trim_gun_name);
private _gunName = ctrlText 11001;
if (_gunName != "") then {
private _gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO"],
private _gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO", [[-15,0],[0,0],[10,0],[15,0],[25,0],[30,0],[35,0]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true];
GVAR(gunList) = GVAR(gunList) + [_gunProfileEntry];
lbAdd [6000, _gunProfileEntry select 0];
lbAdd [6000, _gunName];
profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)];
call FUNC(store_gun_list);
};

View File

@ -0,0 +1,37 @@
/*
* Author: Ruthberg
* Calculates distance at which the bullet velocity drops below the threshold velocity
*
* Arguments:
* theshold velocity <NUMBER>
*
* Return Value:
* distance <NUMBER>
*
* Example:
* 403 call ace_atragmx_fnc_calculate_distance_at_velocity
*
* Public: No
*/
#include "script_component.hpp"
#define __DELTA_T 0.001
if (isNil QGVAR(targetSolutionInput)) exitWith { 0 };
private _thresholdVelocity = _this;
private _velocity = GVAR(targetSolutionInput) select 4;
if (_velocity <= _thresholdVelocity) exitWith { 0 };
private _distance = 0;
while {_velocity > _thresholdVelocity} do {
private _bc = GVAR(targetSolutionInput) select 14;
private _dragModel = GVAR(targetSolutionInput) select 15;
private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _velocity]));
_distance = _distance + _velocity * __DELTA_T;
_velocity = _velocity - (_drag * __DELTA_T);
};
_distance

View File

@ -3,10 +3,10 @@
* Calculates the range card output based on the current data set
*
* Arguments:
* Nothing
* None
*
* Return Value:
* Nothing
* None
*
* Example:
* call ace_atragmx_fnc_calculate_range_card
@ -15,61 +15,16 @@
*/
#include "script_component.hpp"
[] call FUNC(parse_input);
GVAR(rangeCardData) = [];
GVAR(workingMemory) params ["",
"_muzzleVelocity", "",
"_scopeBaseAngle",
"_airFriction",
"_boreHeight", "", "", "", "", "", "",
"_bulletMass",
"_bulletDiameter",
"_barrelTwist",
"_bc",
"_dragModel",
"_atmosphereModel"
];
private _twistDirection = 0;
if (_barrelTwist > 0) then {
_twistDirection = 1;
} else {
if (_barrelTwist < 0) then {
_twistDirection = -1;
};
};
_barrelTwist = abs _barrelTwist;
private _altitude = GVAR(altitude);
private _temperature = GVAR(temperature);
private _barometricPressure = GVAR(barometricPressure);
private _relativeHumidity = GVAR(relativeHumidity);
if (!GVAR(atmosphereModeTBH)) then {
_barometricPressure = 1013.25 * (1 - (0.0065 * _altitude) / (273.15 + _temperature + 0.0065 * _altitude)) ^ 5.255754495;
_relativeHumidity = 50;
};
private _bulletLength = 45.72;
private _stabilityFactor = 1.5;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then {
_stabilityFactor = [_bulletDiameter, _bulletLength, _bulletMass, _barrelTwist * 10, _muzzleVelocity, _temperature, _barometricPressure] call EFUNC(advanced_ballistics,calculateStabilityFactor);
};
};
private _latitude = GVAR(latitude) select GVAR(currentTarget);
private _directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget);
private _windSpeed1 = (GVAR(windSpeed1) select GVAR(currentTarget));
private _windSpeed2 = (GVAR(windSpeed2) select GVAR(currentTarget));
private _windDirection = (GVAR(windDirection) select GVAR(currentTarget));
private _inclinationAngle = (GVAR(inclinationAngle) select GVAR(currentTarget));
private _targetSpeed = (GVAR(targetSpeed) select GVAR(currentTarget));
private _targetRange = GVAR(rangeCardEndRange);
if (GVAR(currentUnit) == 1) then {
_targetRange = _targetRange / 1.0936133;
};
GVAR(rangeCardData) = [];
private _solutionInput = +GVAR(targetSolutionInput);
_solutionInput set [ 8, round(_solutionInput select 4)];
_solutionInput set [13, _targetRange];
_solutionInput set [17, true];
private _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000,
[_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution);
private _result = _solutionInput call FUNC(calculate_solution);

View File

@ -51,7 +51,10 @@ params [
];
_windSpeed params ["_windSpeed1", "_windSpeed2"];
private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"];
private ["_tx", "_tz", "_lastBulletPos", "_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"];
_tx = 0;
_tz = 0;
_lastBulletPos = [0, 0, 0];
_bulletPos = [0, 0, 0];
_bulletVelocity = [0, 0, 0];
_bulletAccel = [0, 0, 0];
@ -74,9 +77,10 @@ _horizontalDeflection = 0;
_spinDrift = 0;
_spinDeflection = 0;
private ["_n", "_range", "_rangeFactor"];
private ["_n", "_range", "_trueRange", "_rangeFactor"];
_n = 0;
_range = 0;
_trueRange = 0;
_rangeFactor = 1;
if (_storeRangeCardData) then {
if (GVAR(currentUnit) == 1) then {
@ -90,22 +94,15 @@ _wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection
_wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0];
_windDrift = 0;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
_bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection);
_bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel]));
};
private ["_speedTotal", "_stepsTotal", "_speedAverage"];
_speedTotal = 0;
_stepsTotal = 0;
_speedAverage = 0;
private ["_eoetvoesMultiplier"];
_eoetvoesMultiplier = 0;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
_eoetvoesMultiplier = 2 * (0.0000729 * _muzzleVelocity / -9.80665) * cos(_latitude) * sin(_directionOfFire);
};
_TOF = 0;
_bulletPos set [0, 0];
_bulletPos set [1, 0];
_bulletPos set [2, -(_boreHeight / 100)];
@ -117,19 +114,11 @@ _bulletVelocity set [2, Sin(_scopeBaseAngle) * _muzzleVelocity];
while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
_bulletSpeed = vectorMagnitude _bulletVelocity;
_speedTotal = _speedTotal + _bulletSpeed;
_stepsTotal = _stepsTotal + 1;
_speedAverage = (_speedTotal / _stepsTotal);
_trueVelocity = _bulletVelocity vectorDiff _wind1;
_trueSpeed = vectorMagnitude _trueVelocity;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
private _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then {
parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed]))
} else {
([_dragModel, _bc, _trueSpeed] call EFUNC(advanced_ballistics,calculateRetardation))
};
private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed]));
_bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag);
} else {
_bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction);
@ -137,29 +126,32 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
_bulletAccel = _bulletAccel vectorAdd _gravity;
_lastBulletPos = _bulletPos;
_bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5));
_bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT);
_bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply _deltaT);
_bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5));
_TOF = _TOF + _deltaT;
if (_storeRangeCardData) then {
_range = GVAR(rangeCardStartRange) + _n * GVAR(rangeCardIncrement);
if ((_bulletPos select 1) * _rangeFactor >= _range && _range <= GVAR(rangeCardEndRange)) then {
if ((_bulletPos select 1) > 0) then {
_elevation = - atan((_bulletPos select 2) / (_bulletPos select 1));
_windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1));
_windDrift = (_wind2 select 0) * (_TOF - (_range / _rangeFactor) / _muzzleVelocity);
_windage2 = - atan(_windDrift / (_bulletPos select 1));
};
if (_range != 0) then {
_lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _range);
_trueRange = _range / _rangeFactor;
if (_trueRange != 0) then {
_tx = (_lastBulletPos select 0) + (_trueRange - (_lastBulletPos select 1)) * ((_bulletPos select 0) - (_lastBulletPos select 0)) / ((_bulletPos select 1) - (_lastBulletPos select 1));
_tz = (_lastBulletPos select 2) + (_trueRange - (_lastBulletPos select 1)) * ((_bulletPos select 2) - (_lastBulletPos select 2)) / ((_bulletPos select 1) - (_lastBulletPos select 1));
_elevation = - atan(_tz / _trueRange);
_windage1 = - atan(_tx / _trueRange);
_windDrift = (_wind2 select 0) * (_TOF - _trueRange / _muzzleVelocity);
_windage2 = - atan(_windDrift / _trueRange);
_lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _trueRange);
};
_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
_kineticEnergy = _kineticEnergy * 0.737562149;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then {
// Coriolis
_horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage;
_horizontalDeflection = 0.0000729 * (_bulletPos select 1) * _TOF * sin(_latitude);
_horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1));
_windage1 = _windage1 + _horizontalCoriolis;
_windage2 = _windage2 + _horizontalCoriolis;
@ -180,14 +172,13 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
};
};
if ((_bulletPos select 1) > 0) then {
_elevation = - atan((_bulletPos select 2) / (_bulletPos select 1));
_windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1));
_windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity);
_windage2 = - atan(_windDrift / (_bulletPos select 1));
};
if (_targetRange != 0) then {
_tx = (_lastBulletPos select 0) + (_targetRange - (_lastBulletPos select 1)) * ((_bulletPos select 0) - (_lastBulletPos select 0)) / ((_bulletPos select 1) - (_lastBulletPos select 1));
_tz = (_lastBulletPos select 2) + (_targetRange - (_lastBulletPos select 1)) * ((_bulletPos select 2) - (_lastBulletPos select 2)) / ((_bulletPos select 1) - (_lastBulletPos select 1));
_elevation = - atan(_tz / _targetRange);
_windage1 = - atan(_tx / _targetRange);
_windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity);
_windage2 = - atan(_windDrift / _targetRange);
_lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _targetRange);
};
@ -196,7 +187,7 @@ _kineticEnergy = _kineticEnergy * 0.737562149;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then {
// Coriolis
_horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage;
_horizontalDeflection = 0.0000729 * (_bulletPos select 1) * _TOF * sin(_latitude);
_horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1));
_windage1 = _windage1 + _horizontalCoriolis;
_windage2 = _windage2 + _horizontalCoriolis;

View File

@ -3,10 +3,10 @@
* Calculates the target range and updates the output fields
*
* Arguments:
* Nothing
* None
*
* Return Value:
* Nothing
* None
*
* Example:
* call ace_atragmx_fnc_calculate_target_range_assist
@ -16,7 +16,7 @@
#include "script_component.hpp"
private _angle = parseNumber(ctrlText 7012);
private _targetSize = parseNumber(ctrlText 7010);
private _targetSize = abs(parseNumber(ctrlText 7010));
if (GVAR(rangeAssistUseTargetHeight)) then {
_targetSize = _targetSize * cos(_angle);
};
@ -43,7 +43,7 @@ switch (GVAR(rangeAssistImageSizeUnit)) do {
_imageSize = _imageSize / 60 / 1.047;
};
};
private _estRange = parseNumber(ctrlText 7013);
private _estRange = abs(parseNumber(ctrlText 7013));
if (GVAR(currentUnit) == 1) then {
_estRange = _estRange / 1.0936133;
};
@ -52,7 +52,7 @@ switch (_this) do {
case 0: {
_targetSize = tan(_imageSize) * _estRange;
if (GVAR(rangeAssistUseTargetHeight)) then {
if (GVAR(rangeAssistUseTargetHeight) && cos(_angle) != 0) then {
_targetSize = _targetSize / cos(_angle);
};
@ -71,7 +71,9 @@ switch (_this) do {
ctrlSetText [7010, Str(Round(_targetSize * 100) / 100)];
};
case 1: {
if (_estRange > 0) then {
_imageSize = atan(_targetSize / _estRange);
};
switch (GVAR(rangeAssistImageSizeUnit)) do {
case 0: {
@ -88,7 +90,9 @@ switch (_this) do {
ctrlSetText [7011, Str(Round(_imageSize * 100) / 100)];
};
case 2: {
if (tan(_imageSize) != 0) then {
_estRange = _targetSize / tan(_imageSize);
};
ctrlSetText [7013, Str(Round(_estRange))];
};

View File

@ -3,10 +3,10 @@
* Calculates the fireing solution and updates the result input/output fields
*
* Arguments:
* Nothing
* None
*
* Return Value:
* Nothing
* None
*
* Example:
* call ace_atragmx_fnc_calculate_target_solution
@ -52,7 +52,7 @@ if (!GVAR(atmosphereModeTBH)) then {
};
private ["_bulletLength", "_stabilityFactor"];
_bulletLength = 45.72;
_bulletLength = 50 * _bulletMass / ((_bulletDiameter/2)^2);
_stabilityFactor = 1.5;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then {
@ -70,9 +70,10 @@ _inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget);
_targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget);
_targetRange = GVAR(targetRange) select GVAR(currentTarget);
private ["_result"];
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000,
[_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution);
GVAR(targetSolutionInput) = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, round(_muzzleVelocity),
[_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire];
private _result = GVAR(targetSolutionInput) call FUNC(calculate_solution);
GVAR(elevationOutput) set [GVAR(currentTarget), _result select 0];
GVAR(windage1Output) set [GVAR(currentTarget), (_result select 1) select 0];
@ -80,5 +81,8 @@ GVAR(windage2Output) set [GVAR(currentTarget), (_result select 1) select 1];
GVAR(leadOutput) set [GVAR(currentTarget), _result select 2];
GVAR(tofOutput) set [GVAR(currentTarget), _result select 3];
GVAR(velocityOutput) set [GVAR(currentTarget), _result select 4];
GVAR(verticalCoriolisOutput) set [GVAR(currentTarget), _result select 6];
GVAR(horizontalCoriolisOutput) set [GVAR(currentTarget), _result select 7];
GVAR(spinDriftOutput) set [GVAR(currentTarget), _result select 8];
[] call FUNC(update_result);

View File

@ -3,10 +3,10 @@
* Calculates the target speed and updates the output fields
*
* Arguments:
* Nothing
* None
*
* Return Value:
* Nothing
* None
*
* Example:
* call ace_atragmx_fnc_calculate_target_speed_assist

View File

@ -0,0 +1,107 @@
/*
* Author: Ruthberg
* Calculates the truing drop and updates the output fields
*
* Arguments:
* parse input <BOOL>
*
* Return Value:
* None
*
* Example:
* call ace_atragmx_fnc_calculate_truing_drop
*
* Public: No
*/
#include "script_component.hpp"
private _parseInput = _this;
private _transonicRange = GVAR(truingDropRangeData) select 0;
private _subsonicRange = GVAR(truingDropRangeData) select 1;
private _transonicDrop = GVAR(truingDropDropData) select 1;
private _subsonicDrop = GVAR(truingDropDropData) select 2;
if (_parseInput) then {
_transonicRange = 0 max abs(parseNumber(ctrlText 18011)) min 4000;
_subsonicRange = 0 max abs(parseNumber(ctrlText 18012)) min 4000;
if (GVAR(currentUnit) != 2) then {
_transonicRange = _transonicRange * 0.9144;
_subsonicRange = _subsonicRange * 0.9144;
};
_transonicRange = Round(_transonicRange);
_subsonicRange = Round(_subsonicRange);
_subsonicRange = _transonicRange max _subsonicRange;
_transonicDrop = -100 max parseNumber(ctrlText 18013) min 100;
_subsonicDrop = -100 max parseNumber(ctrlText 18014) min 100;
private _dropUnit = GVAR(currentScopeUnit);
if (_dropUnit == 3) then {
switch (GVAR(currentScopeClickUnit)) do {
case 0: { _dropUnit = 1; };
case 1: { _dropUnit = 2; };
case 2: { _dropUnit = 0; };
};
};
switch (_dropUnit) do {
case 0: {
_transonicDrop = _transonicDrop * 3.38;
_subsonicDrop = _subsonicDrop * 3.38;
};
case 2: {
_transonicDrop = _transonicDrop / 1.047;
_subsonicDrop = _subsonicDrop / 1.047;
};
};
_transonicDrop = Round(_transonicDrop * 100) / 100;
_subsonicDrop = Round(_subsonicDrop * 100) / 100;
_subsonicDrop = _transonicDrop max _subsonicDrop;
};
if ((GVAR(truingDropDropData) select 0) == 0 || {!([_transonicRange, _subsonicRange] isEqualTo GVAR(truingDropRangeData))}) then {
if (isNil QGVAR(targetSolutionInput)) then {
call FUNC(calculate_target_solution);
};
private _solutionInput = +GVAR(targetSolutionInput);
if (_transonicRange == 0) then {
_transonicRange = Round(403 call FUNC(calculate_distance_at_velocity));
};
_solutionInput set [13, _transonicRange];
private _result1 = _solutionInput call FUNC(calculate_solution);
_transonicDrop = Round((_result1 select 0) * 100) / 100;
GVAR(truingDropRangeData) set [0, _transonicRange];
GVAR(truingDropDropData) set [1, _transonicDrop];
GVAR(truingDropReferenceDropData) set [0, _transonicDrop];
private _speedOfSound = (_solutionInput select 5) call EFUNC(weather,calculateSpeedOfSound);
if (_subsonicRange == 0) then {
_subsonicRange = _speedOfSound call FUNC(calculate_distance_at_velocity);
if (GVAR(currentUnit) == 2) then {
_subsonicRange = _subsonicRange + 200;
} else {
_subsonicRange = _subsonicRange + 200 * 1.0936133;
};
_subsonicRange = Round(_subsonicRange);
};
_solutionInput set [13, _subsonicRange];
private _result2 = _solutionInput call FUNC(calculate_solution);
_subsonicDrop = Round((_result2 select 0) * 100) / 100;
GVAR(truingDropRangeData) set [1, _subsonicRange];
GVAR(truingDropDropData) set [2, _subsonicDrop];
GVAR(truingDropReferenceDropData) set [1, _subsonicDrop];
} else {
if (_transonicDrop != GVAR(truingDropDropData) select 1 || _subsonicDrop != GVAR(truingDropDropData) select 2) then {
GVAR(truingDropDropData) set [1, _transonicDrop];
GVAR(truingDropDropData) set [2, _subsonicDrop];
if (GVAR(truingDropMode) == 0) then {
call FUNC(true_muzzle_velocity);
} else {
call FUNC(true_c1_ballistic_coefficient);
};
};
};
call FUNC(update_truing_drop_data);

View File

@ -3,7 +3,7 @@
* Tests if the ATragMX dialog can be shown
*
* Arguments:
* Nothing
* None
*
* Return Value:
* can_show <BOOL>

View File

@ -8,7 +8,7 @@
* update display <BOOL>
*
* Return Value:
* Nothing
* None
*
* Example:
* call ace_atragmx_fnc_change_gun
@ -26,6 +26,12 @@ if (_restoreMemory) then {
};
GVAR(currentGun) = _gunID;
[false, false] call FUNC(recalculate_muzzle_velocity);
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
false call FUNC(restore_truing_drop);
[false, false] call FUNC(recalculate_c1_ballistic_coefficient);
};
if (_updateDisplay) then {
lbSetCurSel [6000, GVAR(currentGun)];
};
@ -37,6 +43,8 @@ GVAR(currentScopeClickNumber) = 1 max (GVAR(workingMemory) select 8) min 10;
if (_updateDisplay) then {
[] call FUNC(update_gun);
[] call FUNC(update_gun_ammo_data);
[] call FUNC(update_muzzle_velocity_data);
[] call FUNC(update_c1_ballistic_coefficient_data);
};
GVAR(elevationOutput) set [GVAR(currentTarget), 0];
@ -45,6 +53,9 @@ GVAR(windage2Output) set [GVAR(currentTarget), 0];
GVAR(leadOutput) set [GVAR(currentTarget), 0];
GVAR(tofOutput) set [GVAR(currentTarget), 0];
GVAR(velocityOutput) set [GVAR(currentTarget), 0];
GVAR(verticalCoriolisOutput) set [GVAR(currentTarget), 0];
GVAR(horizontalCoriolisOutput) set [GVAR(currentTarget), 0];
GVAR(spinDriftOutput) set [GVAR(currentTarget), 0];
if (_updateDisplay) then {
[] call FUNC(calculate_target_solution);

View File

@ -6,7 +6,7 @@
* target <NUMBER>
*
* Return Value:
* Nothing
* None
*
* Example:
* 2 call ace_atragmx_fnc_change_target_slot
@ -17,9 +17,8 @@
private _target = 0 max _this min 3;
call FUNC(parse_input);
[] call FUNC(parse_input);
GVAR(currentTarget) = _target;
call FUNC(update_target_selection);
[] call FUNC(calculate_target_solution);
call FUNC(calculate_target_solution);

View File

@ -0,0 +1,21 @@
/*
* Author: Ruthberg
* Clears the c1 ballistic coefficient data fields
*
* Arguments:
* None
*
* Return Value:
* None
*
* Example:
* call ace_atragmx_fnc_clear_c1_ballistic_coefficient_data
*
* Public: No
*/
#include "script_component.hpp"
// Distances
{ctrlSetText [_x, "0"]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027];
// Ballistic Coefficients
{ctrlSetText [_x, "0"]} forEach [170031, 170032, 170033, 170034, 170035, 170036, 170037];

Some files were not shown because too many files have changed in this diff Show More