mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Final submunition code cull
This commit is contained in:
parent
a079f61ded
commit
3e3ed12503
@ -11,13 +11,11 @@ PREP(dev_clearTraces);
|
|||||||
PREP(dev_switchUnitHandle);
|
PREP(dev_switchUnitHandle);
|
||||||
|
|
||||||
// Base
|
// Base
|
||||||
PREP(fired);
|
|
||||||
PREP(initRound);
|
PREP(initRound);
|
||||||
|
|
||||||
// Frag
|
// Frag
|
||||||
PREP(addBlackList);
|
PREP(addBlackList);
|
||||||
PREP(initBlackList);
|
PREP(initBlackList);
|
||||||
PREP(submunition);
|
|
||||||
PREP(shouldFrag);
|
PREP(shouldFrag);
|
||||||
PREP(getFragInfo);
|
PREP(getFragInfo);
|
||||||
PREP(doFrag);
|
PREP(doFrag);
|
||||||
|
@ -20,8 +20,7 @@
|
|||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
TRACE_1("",_this);
|
TRACE_1("",_this);
|
||||||
/*params ["_args", ["_isSubMunit", false, [false]]];
|
params [
|
||||||
_args*/ params [
|
|
||||||
["_proj", objNull, [objNull]],
|
["_proj", objNull, [objNull]],
|
||||||
["_posASL", [0,0,0], [[]], [3]],
|
["_posASL", [0,0,0], [[]], [3]],
|
||||||
["_vel", [0,0,0] , [[]], [3]],
|
["_vel", [0,0,0] , [[]], [3]],
|
||||||
|
@ -19,12 +19,9 @@ TRACE_1("",_this);
|
|||||||
params [
|
params [
|
||||||
"_projectile",
|
"_projectile",
|
||||||
["_hitObj", objNull],
|
["_hitObj", objNull],
|
||||||
// "",
|
|
||||||
["_lPosASL", [0, 0, 0]],
|
["_lPosASL", [0, 0, 0]],
|
||||||
["_lVel", [0, 0, 0]],
|
["_lVel", [0, 0, 0]],
|
||||||
["_sNorm", [0, 0, 0]],
|
["_sNorm", [0, 0, 0]],
|
||||||
// "",
|
|
||||||
// "",
|
|
||||||
["_surfaceType", ""],
|
["_surfaceType", ""],
|
||||||
["_ammo", "", [""]],
|
["_ammo", "", [""]],
|
||||||
["_shotParents", [objNull, objNull], [[]]],
|
["_shotParents", [objNull, objNull], [[]]],
|
||||||
@ -70,16 +67,14 @@ private _spallPos = +_lPosASL;
|
|||||||
if (terrainIntersectASL [_lPosASL vectorAdd _unitStep, _lPosASL]) exitWith {
|
if (terrainIntersectASL [_lPosASL vectorAdd _unitStep, _lPosASL]) exitWith {
|
||||||
TRACE_3("terrainIntersect",_lPosASL,_unitStep,_lPosASL);
|
TRACE_3("terrainIntersect",_lPosASL,_unitStep,_lPosASL);
|
||||||
};
|
};
|
||||||
|
// Passed all exitWiths
|
||||||
|
GVAR(lastSpallTime) = CBA_missionTime;
|
||||||
|
|
||||||
|
// check for less than 30 between norm and projectile (120 of 90 deg offset)
|
||||||
if (120 > acos ((vectorNormalized _lVelUnit) vectorDotProduct _sNorm)) then {
|
if (120 > acos ((vectorNormalized _lVelUnit) vectorDotProduct _sNorm)) then {
|
||||||
_spallPos = _spallPos vectorAdd (_unitStep vectorMultiply 5);
|
_spallPos = _spallPos vectorAdd (_unitStep vectorMultiply 5);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Passed all exit withs
|
|
||||||
GVAR(lastSpallTime) = CBA_missionTime;
|
|
||||||
|
|
||||||
// step through
|
|
||||||
for "_i" from 1 to 20 do
|
for "_i" from 1 to 20 do
|
||||||
{
|
{
|
||||||
private _nPos = _spallPos vectorAdd _unitStep;
|
private _nPos = _spallPos vectorAdd _unitStep;
|
||||||
@ -98,8 +93,6 @@ if GVAR(dbgSphere) then {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Select spalled fragment spawner
|
|
||||||
|
|
||||||
private _spawnSize = switch (true) do
|
private _spawnSize = switch (true) do
|
||||||
{
|
{
|
||||||
case (_deltaMomentum < 3): { "_spall_tiny" };
|
case (_deltaMomentum < 3): { "_spall_tiny" };
|
||||||
@ -109,7 +102,6 @@ private _spawnSize = switch (true) do
|
|||||||
default { "_spall_huge" };
|
default { "_spall_huge" };
|
||||||
};
|
};
|
||||||
|
|
||||||
// Spawn spalled fragments
|
|
||||||
private _spallSpawner = createVehicle [
|
private _spallSpawner = createVehicle [
|
||||||
"ace_frag_" + _material + _spawnSize,
|
"ace_frag_" + _material + _spawnSize,
|
||||||
ASLToATL _spallPos,
|
ASLToATL _spallPos,
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
#include "script_component.hpp"
|
|
||||||
/*
|
|
||||||
* Author: nou, jaynus, PabstMirror, Lambda.Tiger
|
|
||||||
* Called from the unified fired EH for all.
|
|
||||||
* If spall is not enabled (default), then cache and only track those that will actually trigger fragmentation.
|
|
||||||
*
|
|
||||||
* Arguments:
|
|
||||||
* None. Parameters inherited from EFUNC(common,firedEH)
|
|
||||||
*
|
|
||||||
* Return Value:
|
|
||||||
* None
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* [clientFiredBIS-XEH] call ace_frag_fnc_fired
|
|
||||||
*
|
|
||||||
* Public: No
|
|
||||||
*/
|
|
||||||
|
|
||||||
//IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"];
|
|
||||||
|
|
||||||
if (isNil "_ammo" ||
|
|
||||||
{_ammo isEqualTo "" ||
|
|
||||||
{isNil "_projectile" ||
|
|
||||||
{isNull _projectile}}}) exitWith {
|
|
||||||
TRACE_2("bad ammo or projectile",_projectile,_ammo);
|
|
||||||
};
|
|
||||||
|
|
||||||
/******* _shouldFrag format *****/
|
|
||||||
// 0: doFragmnent - will the piece fragment
|
|
||||||
// 1: hasSubmuntion - will the round create submunitions
|
|
||||||
private _shouldFrag = _ammo call FUNC(shouldFrag);
|
|
||||||
_shouldFrag params ["_doFrag", "_doSubmunit"];
|
|
||||||
|
|
||||||
if (_doFrag) then {
|
|
||||||
// wait for frag damage to kill units before spawning fragments
|
|
||||||
_projectile addEventHandler ["Explode",
|
|
||||||
{
|
|
||||||
if (isServer) then {
|
|
||||||
[FUNC(doFrag), [_this]] call CBA_fnc_execNextFrame;
|
|
||||||
} else {
|
|
||||||
[QGVAR(frag_eh), [_this]] call CBA_fnc_serverEvent;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_doSubmunit && {GVAR(fragSimComplexity)> 0}) then {
|
|
||||||
_projectile addEventHandler ["SubmunitionCreated", {_this call FUNC(submunition)}];
|
|
||||||
};
|
|
||||||
|
|
||||||
private _shouldSpall = _ammo call FUNC(shouldSpall);
|
|
||||||
|
|
||||||
if (GVAR(spallEnabled) && {_shouldSpall}) then
|
|
||||||
{_projectile addEventHandler [
|
|
||||||
"HitPart",
|
|
||||||
{
|
|
||||||
if (isServer) then {
|
|
||||||
[LINKFUNC(doSpall), _this] call CBA_fnc_execNextFrame;
|
|
||||||
} else {
|
|
||||||
[QGVAR(spall_eh), [_this]] call CBA_fnc_serverEvent;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
@ -24,16 +24,14 @@ if (_ammo isEqualTo "" || {isNull _projectile}) exitWith {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private _shouldFrag = _ammo call FUNC(shouldFrag);
|
private _shouldFrag = _ammo call FUNC(shouldFrag);
|
||||||
_shouldFrag params ["_doFrag"];
|
|
||||||
|
|
||||||
if (_doFrag) then {
|
if (_doFrag) then {
|
||||||
// wait for frag damage to kill units before spawning fragments
|
|
||||||
_projectile addEventHandler [
|
_projectile addEventHandler [
|
||||||
"Explode",
|
"Explode",
|
||||||
{
|
{
|
||||||
params ["_proj"];
|
params ["_proj"];
|
||||||
private _shotParents = getShotParents _proj;
|
private _shotParents = getShotParents _proj;
|
||||||
private _ammo = typeOf _proj;
|
private _ammo = typeOf _proj;
|
||||||
|
// wait for frag damage to kill units before spawning fragments
|
||||||
if (isServer) then {
|
if (isServer) then {
|
||||||
[
|
[
|
||||||
FUNC(doFrag),
|
FUNC(doFrag),
|
||||||
@ -51,7 +49,6 @@ if (_doFrag) then {
|
|||||||
|
|
||||||
|
|
||||||
private _shouldSpall = _ammo call FUNC(shouldSpall);
|
private _shouldSpall = _ammo call FUNC(shouldSpall);
|
||||||
|
|
||||||
if (GVAR(spallEnabled) && {_shouldSpall}) then
|
if (GVAR(spallEnabled) && {_shouldSpall}) then
|
||||||
{
|
{
|
||||||
_projectile addEventHandler [
|
_projectile addEventHandler [
|
||||||
|
@ -8,9 +8,7 @@
|
|||||||
* 0: _ammo <STRING> - cfgAmmo type of ammo to check
|
* 0: _ammo <STRING> - cfgAmmo type of ammo to check
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* _shouldFrag <ARRAY>
|
* _shouldFrag Should the specific round fragment <BOOL>
|
||||||
* 0 - Should the specific round fragment
|
|
||||||
* 1 - Does the munition have a child submunition
|
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
* ["B_556x45_Ball"] call ace_frag_fnc_shouldFrag;
|
* ["B_556x45_Ball"] call ace_frag_fnc_shouldFrag;
|
||||||
@ -23,8 +21,8 @@ params ["_ammo"];
|
|||||||
private _shouldFrag = GVAR(shouldFragCache) get _ammo;
|
private _shouldFrag = GVAR(shouldFragCache) get _ammo;
|
||||||
|
|
||||||
if !(isNil "_shouldFrag") exitWith {_shouldFrag};
|
if !(isNil "_shouldFrag") exitWith {_shouldFrag};
|
||||||
// two arguments, 1st for munition should frag, 2nd for
|
|
||||||
_shouldFrag = [true, false];
|
_shouldFrag = true;
|
||||||
|
|
||||||
private _skip = getNumber (configFile >> "cfgAmmo" >> _ammo >> QGVAR(skip));
|
private _skip = getNumber (configFile >> "cfgAmmo" >> _ammo >> QGVAR(skip));
|
||||||
private _force = getNumber (configFile >> "cfgAmmo" >> _ammo >> QGVAR(force));
|
private _force = getNumber (configFile >> "cfgAmmo" >> _ammo >> QGVAR(force));
|
||||||
@ -35,21 +33,9 @@ private _indirectRange = getNumber(configFile >> "cfgAmmo" >> _ammo >> "indirect
|
|||||||
if (_skip == 1 || (_force == 0 && {_explosive < 0.5 || {_indirectHit < 3
|
if (_skip == 1 || (_force == 0 && {_explosive < 0.5 || {_indirectHit < 3
|
||||||
|| {_indirectRange < 5 && _indirectHit < _indirectRange}}})) then {
|
|| {_indirectRange < 5 && _indirectHit < _indirectRange}}})) then {
|
||||||
TRACE_5("No frag",_ammo,_skip, _explosive, _indirectRange, _indirectHit);
|
TRACE_5("No frag",_ammo,_skip, _explosive, _indirectRange, _indirectHit);
|
||||||
_shouldFrag set [0, false];
|
_shouldFrag = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*if (GVAR(fragSimComplexity) > 1) then {
|
|
||||||
private _hasSubmunit = if (isText (configFile >> "cfgAmmo" >> _ammo >> "submunitionAmmo")) then {
|
|
||||||
"" isNotEqualTo getText (configFile >> "cfgAmmo" >> _ammo >> "submunitionAmmo");
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
[] isNotEqualTo getArray (configFile >> "cfgAmmo" >> _ammo >> "submunitionAmmo");
|
|
||||||
};
|
|
||||||
|
|
||||||
_shouldFrag set [1, _hasSubmunit];
|
|
||||||
TRACE_2("Submunition" ,_ammo, _hasSubmunit);
|
|
||||||
};*/
|
|
||||||
|
|
||||||
GVAR(shouldFragCache) set [_ammo, _shouldFrag];
|
GVAR(shouldFragCache) set [_ammo, _shouldFrag];
|
||||||
|
|
||||||
_shouldFrag
|
_shouldFrag
|
@ -1,40 +0,0 @@
|
|||||||
#include "script_component.hpp"
|
|
||||||
/*
|
|
||||||
* Author: Lambda.Tiger
|
|
||||||
* This function adds event handlers for submunition fragmentation.
|
|
||||||
* It begins by confirming fragmentation and submunition fragmentation is
|
|
||||||
* enabled, requests cached (or live calculated) ammo information array.
|
|
||||||
* and uses that information to add event handlers as needed to the given
|
|
||||||
* submunition.
|
|
||||||
*
|
|
||||||
* Arguments:
|
|
||||||
* Inherits from BI SubmunitionCraeted EH
|
|
||||||
*
|
|
||||||
* Return Value:
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* ["", _submunitionProjectile] call ace_frag_submunition
|
|
||||||
*
|
|
||||||
* Public: No
|
|
||||||
*/
|
|
||||||
|
|
||||||
if !GVAR(enabled) exitWith {};
|
|
||||||
// params ["_projectile", "_submunitionProjectile", "_pos", "_velocity"];
|
|
||||||
params ["", "_submunitionProjectile"];
|
|
||||||
|
|
||||||
private _shouldFrag = GVAR(shouldFragCache) getOrDefaultCall [typeOf _submunitionProjectile, FUNC(shouldFrag), true];
|
|
||||||
_shouldFrag params ["_doFrag", "_doSubmunit"];
|
|
||||||
|
|
||||||
|
|
||||||
if (_doFrag) then {
|
|
||||||
_submunitionProjectile addEventHandler ["Explode", {[_this, true] call FUNC(doFrag)}];
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_doSubmunit) then {
|
|
||||||
_submunitionProjectile addEventHandler ["SubmunitionCreated", {_this call FUNC(submunition)}];
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef DEBUG_MODE_DRAW
|
|
||||||
[_submunitionProjectile] call FUNC(dev_addRound);
|
|
||||||
#endif
|
|
@ -28,17 +28,14 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)];
|
|||||||
[
|
[
|
||||||
QGVAR(fragSimComplexity), "LIST",
|
QGVAR(fragSimComplexity), "LIST",
|
||||||
[LSTRING(FragMode), LSTRING(FragMode_Desc)],
|
[LSTRING(FragMode), LSTRING(FragMode_Desc)],
|
||||||
// ["Fragmentation mode", "Sets how fragments are generated"],
|
|
||||||
[_category, LSTRING(Frag)],
|
[_category, LSTRING(Frag)],
|
||||||
[[2, 1, 0], [LSTRING(FragMode_Opt2),LSTRING(FragMode_Opt1),LSTRING(FragMode_Opt0)], 2],
|
[[2, 1, 0], [LSTRING(FragMode_Opt2),LSTRING(FragMode_Opt1),LSTRING(FragMode_Opt0)], 2],
|
||||||
// [[2, 1, 0], ["Targeted & random fragmentation","Random fragmentation","Unit targeted fragmentation"], 2],
|
|
||||||
true
|
true
|
||||||
] call CBA_fnc_addSetting;
|
] call CBA_fnc_addSetting;
|
||||||
|
|
||||||
[
|
[
|
||||||
QGVAR(atLeastOne), "CHECKBOX",
|
QGVAR(atLeastOne), "CHECKBOX",
|
||||||
[LSTRING(MinFrag), LSTRING(MinFrag_Desc)],
|
[LSTRING(MinFrag), LSTRING(MinFrag_Desc)],
|
||||||
// ["At least one round hit", "Spawn at least one fragment for units in fragmentation range, up to maximum fragments"],
|
|
||||||
[_category, LSTRING(Frag)],
|
[_category, LSTRING(Frag)],
|
||||||
true
|
true
|
||||||
] call CBA_fnc_addSetting;
|
] call CBA_fnc_addSetting;
|
||||||
@ -46,7 +43,6 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)];
|
|||||||
[
|
[
|
||||||
QGVAR(BlackList), "EDITBOX",
|
QGVAR(BlackList), "EDITBOX",
|
||||||
[LSTRING(DefBlackList), LSTRING(DefBlackList_Desc)],
|
[LSTRING(DefBlackList), LSTRING(DefBlackList_Desc)],
|
||||||
// ["Fragmentation BlackList", "Array of ammo classnames strings to blackist fragmentation for."],
|
|
||||||
[_category, LSTRING(Frag)],
|
[_category, LSTRING(Frag)],
|
||||||
QUOTE(['B_556x45_Ball']),
|
QUOTE(['B_556x45_Ball']),
|
||||||
true,
|
true,
|
||||||
|
Loading…
Reference in New Issue
Block a user