Casings - Add infantry bullet casings (#8857)

* 1st pass on casings

* Readability tweaks

* Pretty sure these are needed...

* Jonpas never lies

* Whitespace fix

* Add brother Diwako and allow client override

* Use index, avoid count

* Both settings a client-side

* Add Commy fixings

* Proper case for diwako + config

* Formatting and AGLtoASL

* Perf warning

* if not required

* Axing parentheses

* Remove pointless GVAR update in settings

* Update addons/casings/functions/fnc_createCasing.sqf

Removed unused param

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* Update addons/casings/functions/fnc_createCasing.sqf

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* Update addons/casings/functions/fnc_createCasing.sqf

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* Default to off due to performance concerns on low-end hardware

* Add LIS check to avoid floating

* Cleanup header

* Further playtesting shows ROADWAY & FIRE have better results

* Re-enable by default

* Update addons/casings/functions/fnc_createCasing.sqf

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* Update addons/casings/functions/fnc_createCasing.sqf

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* Update addons/casings/functions/fnc_createCasing.sqf

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* Update addons/casings/functions/fnc_createCasing.sqf

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* offset setPosWorld with small z-bump

Co-authored-by: PabstMirror <pabstmirror@gmail.com>
This commit is contained in:
Cyruz 2022-05-08 04:45:24 +01:00 committed by GitHub
parent e994906169
commit 3ddec6cb15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 184 additions and 0 deletions

View File

@ -0,0 +1 @@
z\ace\addons\casings

View File

@ -0,0 +1,17 @@
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
};
};
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
};
};
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
};
};

4
addons/casings/README.md Normal file
View File

@ -0,0 +1,4 @@
ace_casings
===============
Create persistent empty casing when bullets are fired by infantry weapons.

View File

@ -0,0 +1 @@
PREP(createCasing);

View File

@ -0,0 +1,7 @@
#include "script_component.hpp"
if (!hasInterface || !GVAR(enabled)) exitWith {};
GVAR(cachedCasings) = createHashMap;
GVAR(casings) = [];
["CAManBase", "FiredMan", {call FUNC(createCasing)}] call CBA_fnc_addClassEventHandler;

View File

@ -0,0 +1,11 @@
#include "script_component.hpp"
ADDON = false;
PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
#include "initSettings.sqf"
ADDON = true;

View File

@ -0,0 +1,3 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"

17
addons/casings/config.cpp Normal file
View File

@ -0,0 +1,17 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author = ECSTRING(common,ACETeam);
authors[] = {"esteldunedain","Cyruz","diwako"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgEventHandlers.hpp"

View File

@ -0,0 +1,68 @@
#include "script_component.hpp"
/*
* Author: esteldunedain / Cyruz / diwako
* Produces a casing matching the fired weapons caliber on the ground around the unit
*
* Arguments:
* 0: unit - Object the event handler is assigned to <OBJECT>
* 1: ammo - Ammo used <STRING>
*
* Return Value:
* None
*
* Example:
* [player, "", "","", "B_556x45_Ball"] call ace_casings_fnc_createCasing
*
* Public: No
*/
params ["_unit", "", "", "", "_ammo"];
if (!isNull objectParent _unit) exitWith {};
private _modelPath = GVAR(cachedCasings) get _ammo;
if (isNil "_modelPath") then {
private _cartridge = getText (configFile >> "CfgAmmo" >> _ammo >> "cartridge");
//Default cartridge is a 5.56mm model
_modelPath = switch (_cartridge) do {
case "FxCartridge_9mm": { "A3\Weapons_f\ammo\cartridge_small.p3d" };
case "FxCartridge_65": { "A3\weapons_f\ammo\cartridge_65.p3d" };
case "FxCartridge_762": { "A3\weapons_f\ammo\cartridge_762.p3d" };
case "FxCartridge_127": { "A3\weapons_f\ammo\cartridge_127.p3d" };
case "FxCartridge_slug": { "A3\weapons_f\ammo\cartridge_slug.p3d" };
case "": { "" };
default { "A3\Weapons_f\ammo\cartridge.p3d" };
};
GVAR(cachedCasings) set [_ammo, _modelPath];
};
if (_modelPath isEqualTo "") exitWith {};
private _unitPos = getposASL _unit;
// Distant shooters don't produce as many cases
if ((AGLToASL positionCameraToWorld [0,0,0]) vectorDistance _unitPos > 100 && {random 1 < 0.9}) exitWith {};
private _weapDir = _unit weaponDirection currentWeapon _unit;
private _ejectDir = _weapDir vectorCrossProduct [0, 0, 1];
private _pos = _unitPos
vectorAdd (_weapDir vectorMultiply (-0.5 + random 2))
vectorAdd (_ejectDir vectorMultiply (0.2 + random 2));
[
{
params ["_modelPath", "_pos"];
private _lisPos = (lineIntersectsSurfaces [_pos, _pos vectorAdd [0,0,-1e11], objNull, objNull, true, 1, "ROADWAY", "FIRE"]) #0;
private _casing = createSimpleObject [_modelPath, (_lisPos #0 vectorAdd [0,0,0.005]), true];
_casing setDir (random 360);
_casing setVectorUp _lisPos #1;
private _idx = GVAR(casings) pushBack _casing;
for "_" from 0 to (_idx - GVAR(maxCasings)) do {
deleteVehicle (GVAR(casings) deleteAt 0);
};
},
[_modelPath,_pos],
0.4
] call CBA_fnc_waitAndExecute;

View File

@ -0,0 +1 @@
#include "\z\ace\addons\casings\script_component.hpp"

View File

@ -0,0 +1,17 @@
[
QGVAR(enabled), "CHECKBOX",
[LSTRING(displayName), LSTRING(description)],
LSTRING(Settings_DisplayName),
true,
false,
{},
true
] call CBA_fnc_addSetting;
[
QGVAR(maxCasings), "SLIDER",
[LSTRING(maxCasings_displayName), LSTRING(maxCasings_description)],
LSTRING(Settings_DisplayName),
[100, 500, 250, -1],
false
] call CBA_fnc_addSetting;

View File

@ -0,0 +1,17 @@
#define COMPONENT casings
#define COMPONENT_BEAUTIFIED Casings
#include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_CASINGS
#define DEBUG_MODE_FULL
#endif
#ifdef DEBUG_SETTINGS_CASINGS
#define DEBUG_SETTINGS DEBUG_SETTINGS_CASINGS
#endif
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Casings">
<Key ID="STR_ACE_Casings_Settings_DisplayName">
<English>ACE Casings</English>
</Key>
<Key ID="STR_ACE_Casings_displayName">
<English>Casings Enabled</English>
</Key>
<Key ID="STR_ACE_Casings_description">
<English>Enable persistent casings (POTENTIAL performance impact on old/weak systems)</English>
</Key>
<Key ID="STR_ACE_Casings_maxCasings_displayName">
<English>Maximum casings</English>
</Key>
<Key ID="STR_ACE_Casings_maxCasings_description">
<English>Maximum amount of casings to display</English>
</Key>
</Package>
</Project>