From c42004449d8fd18906c8fcaea3d5bde4ce5f07e6 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 14 Jul 2016 16:16:53 +0200 Subject: [PATCH] Port AGM cook off --- addons/cookoff/$PBOPREFIX$ | 1 + addons/cookoff/CfgCloudlets.hpp | 54 ++++++++ addons/cookoff/CfgEventHandlers.hpp | 18 +++ addons/cookoff/CfgSFX.hpp | 9 ++ addons/cookoff/CfgVehicles.hpp | 56 ++++++++ addons/cookoff/XEH_PREP.hpp | 6 + addons/cookoff/XEH_postInit.sqf | 31 +++++ addons/cookoff/XEH_preInit.sqf | 7 + addons/cookoff/XEH_preStart.sqf | 3 + addons/cookoff/config.cpp | 21 +++ .../cookoff/functions/fnc_blowOffTurret.sqf | 33 +++++ addons/cookoff/functions/fnc_cookOff.sqf | 126 ++++++++++++++++++ addons/cookoff/functions/fnc_engineFire.sqf | 43 ++++++ addons/cookoff/functions/fnc_handleDamage.sqf | 80 +++++++++++ .../functions/fnc_secondaryExplosions.sqf | 64 +++++++++ addons/cookoff/functions/script_component.hpp | 1 + addons/cookoff/script_component.hpp | 20 +++ addons/cookoff/sounds/cookoff.wss | Bin 0 -> 31524 bytes 18 files changed, 573 insertions(+) create mode 100644 addons/cookoff/$PBOPREFIX$ create mode 100644 addons/cookoff/CfgCloudlets.hpp create mode 100644 addons/cookoff/CfgEventHandlers.hpp create mode 100644 addons/cookoff/CfgSFX.hpp create mode 100644 addons/cookoff/CfgVehicles.hpp create mode 100644 addons/cookoff/XEH_PREP.hpp create mode 100644 addons/cookoff/XEH_postInit.sqf create mode 100644 addons/cookoff/XEH_preInit.sqf create mode 100644 addons/cookoff/XEH_preStart.sqf create mode 100644 addons/cookoff/config.cpp create mode 100644 addons/cookoff/functions/fnc_blowOffTurret.sqf create mode 100644 addons/cookoff/functions/fnc_cookOff.sqf create mode 100644 addons/cookoff/functions/fnc_engineFire.sqf create mode 100644 addons/cookoff/functions/fnc_handleDamage.sqf create mode 100644 addons/cookoff/functions/fnc_secondaryExplosions.sqf create mode 100644 addons/cookoff/functions/script_component.hpp create mode 100644 addons/cookoff/script_component.hpp create mode 100644 addons/cookoff/sounds/cookoff.wss diff --git a/addons/cookoff/$PBOPREFIX$ b/addons/cookoff/$PBOPREFIX$ new file mode 100644 index 0000000000..1e1ddfc8d2 --- /dev/null +++ b/addons/cookoff/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\cookoff diff --git a/addons/cookoff/CfgCloudlets.hpp b/addons/cookoff/CfgCloudlets.hpp new file mode 100644 index 0000000000..9b262c75c1 --- /dev/null +++ b/addons/cookoff/CfgCloudlets.hpp @@ -0,0 +1,54 @@ + +class CfgCloudlets { + class GVAR(CookOff) { + interval = 0.004; + circleRadius = 0; + circleVelocity[] = {2,2,2}; + particleShape = "\A3\data_f\ParticleEffects\Universal\Universal"; + particleFSNtieth = 16; + particleFSIndex = 0; + particleFSFrameCount = 32; + particleFSLoop = 0; + angle = 0; + angleVar = 0; + animationName = ""; + particleType = "Billboard"; + timerPeriod = 1; + lifeTime = 1; + moveVelocity[] = {0,4,0}; + rotationVelocity = 1; + weight = 0.4; + volume = 0.45; + rubbing = 0; + size[] = {0.01,0.5,1,1,1.5,0.01,0.001}; + color[] = {{1,1,1,-4},{1,1,1,-3},{1,1,1,-2},{1,1,1,-1},{1,1,1,0}}; + animationSpeed[] = {1}; + randomDirectionPeriod = 5; + randomDirectionIntensity = 1; + onTimerScript = ""; + beforeDestroyScript = ""; + position[] = {0,0,0}; + lifeTimeVar = 0; + positionVar[] = {0,0,0}; + positionVarConst[] = {0,0,0}; + moveVelocityVar[] = {1,2,1}; + moveVelocityVarConst[] = {0,0,0}; + rotationVelocityVar = 3; + sizeVar = 0.1; + colorVar[] = {0,0,0,2}; + randomDirectionPeriodVar = 1; + randomDirectionIntensityVar = 2; + colorCoef[] = {1,1,1,1}; + sizeCoef = 1; + animationSpeedCoef = 1; + particleEffects = ""; + postEffects = ""; + onSurface = 1; + surfaceOffset = 0; + keepOnSurface = 0; + bounceOnSurface = 0.6; + bounceOnSurfaceVar = 0; + destroyOnWaterSurface = 0; + destroyOnWaterSurfaceOffset = 0; + }; +}; diff --git a/addons/cookoff/CfgEventHandlers.hpp b/addons/cookoff/CfgEventHandlers.hpp new file mode 100644 index 0000000000..becf395052 --- /dev/null +++ b/addons/cookoff/CfgEventHandlers.hpp @@ -0,0 +1,18 @@ + +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/cookoff/CfgSFX.hpp b/addons/cookoff/CfgSFX.hpp new file mode 100644 index 0000000000..0e10644729 --- /dev/null +++ b/addons/cookoff/CfgSFX.hpp @@ -0,0 +1,9 @@ + +class CfgSFX { + class GVAR(CookOff) { + name = QGVAR(cookoff); + sounds[] = {QGVAR(cookoff)}; + GVAR(cookoff)[] = {PATHTOF(sounds\cookoff.wss),6,1.8,400,1,0,0,0}; + empty[] = {"",0,0,0,0,0,0,0}; + }; +}; diff --git a/addons/cookoff/CfgVehicles.hpp b/addons/cookoff/CfgVehicles.hpp new file mode 100644 index 0000000000..845eb55d94 --- /dev/null +++ b/addons/cookoff/CfgVehicles.hpp @@ -0,0 +1,56 @@ + +class CfgVehicles { + class Sound; + class GVAR(Sound): Sound { + author = ECSTRING(common,ACETeam); + _generalMacro = QGVAR(Sound); + scope = 1; + sound = QGVAR(CookOff); + }; + + class ThingX; + class GVAR(Turret_MBT_01): ThingX { + author = ECSTRING(common,ACETeam); + _generalMacro = QGVAR(TurretDummy); + scope = 1; + model = "\A3\Structures_F\Wrecks\Wreck_Slammer_turret_F.p3d"; + }; + class GVAR(Turret_MBT_02): ThingX { + author = ECSTRING(common,ACETeam); + _generalMacro = QGVAR(TurretDummy); + scope = 1; + model = "\A3\Structures_F\Wrecks\Wreck_T72_turret_F.p3d"; + }; + + class Tank; + class Tank_F: Tank { + GVAR(ammoLocation) = "HitTurret"; + GVAR(cookoffSelections)[] = {"poklop_gunner","poklop_commander"}; + }; + + class MBT_01_base_F: Tank_F { + GVAR(ammoLocation) = "HitHull"; + }; + class APC_Tracked_01_base_F: Tank_F { + GVAR(ammoLocation) = "HitHull"; + }; + + class Car_F; + class Wheeled_APC_F: Car_F { + GVAR(ammoLocation) = "HitTurret"; + GVAR(cookoffSelections)[] = {"poklop_gunner","poklop_commander"}; + + // big explosions for wheeled APCs (same as for tanks) + explosionEffect = "FuelExplosionBig"; + }; + + class B_MBT_01_base_F; + class B_MBT_01_cannon_F: B_MBT_01_base_F { + GVAR(turret)[] = {QGVAR(Turret_MBT_01),{0,-1,0.5}}; + }; + + class O_MBT_02_base_F; + class O_MBT_02_cannon_F: O_MBT_02_base_F { + GVAR(turret)[] = {QGVAR(Turret_MBT_02),{0,-1,0}}; + }; +}; diff --git a/addons/cookoff/XEH_PREP.hpp b/addons/cookoff/XEH_PREP.hpp new file mode 100644 index 0000000000..5b744f9221 --- /dev/null +++ b/addons/cookoff/XEH_PREP.hpp @@ -0,0 +1,6 @@ + +PREP(handleDamage); +PREP(engineFire); +PREP(cookOff); +PREP(blowOffTurret); +PREP(secondaryExplosions); diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf new file mode 100644 index 0000000000..afcd8e1a05 --- /dev/null +++ b/addons/cookoff/XEH_postInit.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" + +[QGVAR(engineFire), FUNC(engineFire)] call CBA_fnc_addEventHandler; +[QGVAR(cookOff), FUNC(cookOff)] call CBA_fnc_addEventHandler; + +// cookoff and burning engine +["Tank", "init", { + (_this select 0) addEventHandler ["HandleDamage", { + ["tank", _this] call FUNC(handleDamage); + }]; +}, nil, nil, true] call CBA_fnc_addClassEventHandler; + +["Wheeled_APC_F", "init", { + (_this select 0) addEventHandler ["HandleDamage", { + ["tank", _this] call FUNC(handleDamage); + }]; +}, nil, nil, true] call CBA_fnc_addClassEventHandler; + +["Car", "init", { + (_this select 0) addEventHandler ["HandleDamage", { + ["car", _this] call FUNC(handleDamage); + }]; +}, nil, ["Wheeled_APC_F"], true] call CBA_fnc_addClassEventHandler; + +// secondary explosions +["AllVehicles", "killed", {(_this select 0) call FUNC(secondaryExplosions)}, nil, ["Man"]] call CBA_fnc_addClassEventHandler; + +// blow off turret effect +["Tank", "killed", {(_this select 0) call FUNC(blowOffTurret)}] call CBA_fnc_addClassEventHandler; + +//Reammobox_F diff --git a/addons/cookoff/XEH_preInit.sqf b/addons/cookoff/XEH_preInit.sqf new file mode 100644 index 0000000000..a7feade1c3 --- /dev/null +++ b/addons/cookoff/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +#include "XEH_PREP.hpp" + +ADDON = true; diff --git a/addons/cookoff/XEH_preStart.sqf b/addons/cookoff/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/cookoff/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/cookoff/config.cpp b/addons/cookoff/config.cpp new file mode 100644 index 0000000000..8606dfa755 --- /dev/null +++ b/addons/cookoff/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {QGVAR(Sound),QGVAR(Turret_MBT_01),QGVAR(Turret_MBT_02)}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"commy2"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" + +#include "CfgCloudlets.hpp" +#include "CfgSFX.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/cookoff/functions/fnc_blowOffTurret.sqf b/addons/cookoff/functions/fnc_blowOffTurret.sqf new file mode 100644 index 0000000000..1ff505f7ef --- /dev/null +++ b/addons/cookoff/functions/fnc_blowOffTurret.sqf @@ -0,0 +1,33 @@ +/* + * Author: commy2 + * Blow off turret effect. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * None + * + * Example: + * (vehicle player) call ace_cookoff_fnc_blowOffTurret + * + * Public: No + */ +#include "script_component.hpp" + +// delayed so the object is spawned after the model changes to a wreck +// the sudden change in the model would cause nearby physx objects to get stuck +[{ + params ["_vehicle"]; + + private _config = _vehicle call CBA_fnc_getObjectConfig; + getArray (_config >> QGVAR(turret)) params [["_model", "", [""]], ["_offset", [0,0,0], [[]], 3]]; + + if (_model isEqualTo "") exitWith {}; + + private _position = _vehicle modelToWorld _offset; + private _turret = createVehicle [_model, _position, [], 0, "CAN_COLLIDE"]; + + _turret setVectorUp [random 1, random 1, 1]; + _turret setVelocity [random 7, random 7, 8 + random 5]; +}, _this, 1] call CBA_fnc_waitAndExecute; diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf new file mode 100644 index 0000000000..823b8aadb3 --- /dev/null +++ b/addons/cookoff/functions/fnc_cookOff.sqf @@ -0,0 +1,126 @@ +/* + * Author: KoffeinFlummi, commy2 + * Start a cook-off in the given vehicle. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * None + * + * Example: + * (vehicle player) call ace_cookoff_fnc_cookOff + * + * Public: No + */ +#include "script_component.hpp" + +params ["_vehicle"]; + +if (_vehicle getVariable [QGVAR(isCookingOff), false]) exitWith {}; +_vehicle setVariable [QGVAR(isCookingOff), true]; + +[QGVAR(cookOff), _vehicle] call CBA_fnc_remoteEvent; + +[{ + params ["_vehicle"]; + + private _config = _vehicle call CBA_fnc_getObjectConfig; + private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {!((_vehicle selectionPosition _x) isEqualTo [0,0,0])}; + + if (_positions isEqualTo []) then { + ACE_LOGWARNING_1("no valid selection for cookoff found. %1", typeOf _vehicle); + _positions pushBack "#noselection"; + }; + + private _turretConfig = [_vehicle, [0]] call CBA_fnc_getTurret; + private _positionBarrelEnd = getText (_turretConfig >> "gunBeg"); + + // smoke out of cannon and hatches + private _smokeBarrel = "#particlesource" createVehicleLocal [0,0,0]; + _smokeBarrel setParticleClass "MediumDestructionSmoke"; + _smokeBarrel attachTo [_vehicle, [0,0,0], _positionBarrelEnd]; + + private _effects = [_smokeBarrel]; + + { + private _position = [0,-2,0]; + + if !(_x isEqualTo "#noselection") then { + _position = _vehicle selectionPosition _x; + }; + + private _smoke = "#particlesource" createVehicleLocal [0,0,0]; + _smoke setParticleClass "ObjectDestructionSmoke1_2Smallx"; + _smoke attachTo [_vehicle, _position]; + + _effects pushBack _smoke; + } forEach _positions; + + [{ + params ["_vehicle", "_effects", "_positions"]; + + // this shit is busy being on fire, can't go driving around all over the place + if (local _vehicle) then { + _vehicle setFuel 0; + }; + + private _light = "#lightpoint" createVehicleLocal [0,0,0]; + _light setLightBrightness 0.7; + _light setLightAmbient [1,0.4,0.15]; + _light setLightColor [1,0.4,0.15]; + _light lightAttachObject [_vehicle, [0,0,4]]; + + _effects pushBack _light; + + // cookoffs + { + private _position = [0,-2,0]; + + if !(_x isEqualTo "#noselection") then { + _position = _vehicle selectionPosition _x; + }; + + private _fire = "#particlesource" createVehicleLocal [0,0,0]; + _fire setParticleClass QGVAR(CookOff); + _fire attachTo [_vehicle, _position]; + + _effects pushBack _fire; + } forEach _positions; + + if (isServer) then { + private _sound = createSoundSource [QGVAR(Sound), position _vehicle, [], 0]; + + _effects pushBack _sound; + }; + + // indicator for the crew - yo, your shit's on fire + private _fnc_FlameEffect = { + params ["_vehicle", "_fnc_FlameEffect", "_counter"]; + + if (_vehicle == cameraOn) then { + [] call BIS_fnc_flamesEffect; + }; + + DEC(_counter); + + if (_counter > 0) then { + [_fnc_FlameEffect, [_vehicle, _fnc_FlameEffect, _counter], 0.4] call CBA_fnc_waitAndExecute + }; + }; + + [_vehicle, _fnc_FlameEffect, 12] call _fnc_FlameEffect; // recursive function + + [{ + params ["_vehicle", "_effects"]; + + { + deleteVehicle _x; + } forEach _effects; + + if (local _vehicle) then { + _vehicle setDamage 1; + }; + }, [_vehicle, _effects], 4 + random 1] call CBA_fnc_waitAndExecute; + }, [_vehicle, _effects, _positions], 3 + random 2] call CBA_fnc_waitAndExecute; +}, _vehicle, 0.5 + random 0.3] call CBA_fnc_waitAndExecute; diff --git a/addons/cookoff/functions/fnc_engineFire.sqf b/addons/cookoff/functions/fnc_engineFire.sqf new file mode 100644 index 0000000000..a79e24eb00 --- /dev/null +++ b/addons/cookoff/functions/fnc_engineFire.sqf @@ -0,0 +1,43 @@ +/* + * Author: KoffeinFlummi, commy2 + * Start fire in engine block of a car. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * None + * + * Example: + * (vehicle player) call ace_cookoff_fnc_engineFire + * + * Public: No + */ +#include "script_component.hpp" + +params ["_vehicle"]; + +if (_vehicle getVariable [QGVAR(isEngineSmoking), false]) exitWith {}; +_vehicle setVariable [QGVAR(isEngineSmoking), true]; + +[QGVAR(engineFire), _vehicle] call CBA_fnc_remoteEvent; + +private _position = [ + 0, + (boundingBoxReal _vehicle select 1 select 1) - 4, + (boundingBoxReal _vehicle select 0 select 2) + 2 +]; + +private _smoke = "#particlesource" createVehicleLocal [0,0,0]; +_smoke setParticleClass "ObjectDestructionSmoke1_2Smallx"; +_smoke attachTo [_vehicle, _position]; + +[{ + (_this select 0) params ["_vehicle", "_smoke", "_time"]; + + if (!alive _vehicle || {_vehicle getHitPointDamage "HitEngine" < 0.9} || {CBA_missionTime > _time}) then { + deleteVehicle _smoke; + _vehicle setVariable [QGVAR(isEngineSmoking), false]; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; +}, 5, [_vehicle, _smoke, CBA_missionTime + 240]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/cookoff/functions/fnc_handleDamage.sqf b/addons/cookoff/functions/fnc_handleDamage.sqf new file mode 100644 index 0000000000..f1eb8542d9 --- /dev/null +++ b/addons/cookoff/functions/fnc_handleDamage.sqf @@ -0,0 +1,80 @@ +/* + * Author: KoffeinFlummi, commy2 + * Handles all incoming damage for tanks (including wheeled APCs). + * + * Arguments: + * HandleDamage EH + * + * Return Value: + * Damage to be inflicted. + * + * Example: + * _this call ace_cookoff_fnc_handleDamage + * + * Public: No + */ +#include "script_component.hpp" + +params ["_simulationType", "_thisHandleDamage"]; +_thisHandleDamage params ["_vehicle", "", "_damage", "", "_ammo", "_hitIndex"]; + +// it's already dead, who cares? +if (damage _vehicle >= 1) exitWith {}; + +// get hitpoint name +private _hitpoint = "#structural"; + +if (_hitIndex != -1) then { + _hitpoint = toLower ((getAllHitPointsDamage _vehicle param [0, []]) select _hitIndex); +}; + +// get change in damage +private "_oldDamage"; + +if (_hitpoint isEqualTo "#structural") then { + _oldDamage = damage _vehicle; +} else { + _oldDamage = _vehicle getHitIndex _hitIndex; +}; + +private _newDamage = _damage - _oldDamage; + +// handle different types of vehicles +// note: exitWith only works here, because this is not the main scope of handleDamage +// you cannot use the return value together with exitWith in the main scope, it's a bug +// also, we add this event handler with the addEventHandler SQF command, +// because the config version ignores the return value completely +if (_simulationType == "car") exitWith { + // prevent destruction, let cook-off handle it if necessary + if (_hitpoint in ["hithull", "hitfuel", "#structural"] && {!IS_EXPLOSIVE_AMMO(_ammo)}) then { + _damage min 0.89 + } else { + if (_hitpoint isEqualTo "hitengine" && {_damage > 0.9}) then { + _vehicle call FUNC(engineFire); + }; + _damage + }; +}; + +if (_simulationType == "tank") exitWith { + // determine ammo storage location + private _ammoLocationHitpoint = getText (_vehicle call CBA_fnc_getObjectConfig >> QGVAR(ammoLocation)); + + // ammo was hit, high chance for cook-off + if (_hitpoint == _ammoLocationHitpoint) then { + if (_damage > 0.5 && {random 1 < 0.7}) then { + _vehicle call FUNC(cookOff); + }; + } else { + if (_hitpoint in ["hitbody", "hitturret", "#structural"] && {_newDamage > 0.6 + random 0.3}) then { + _vehicle call FUNC(cookOff); + }; + }; + + // prevent destruction, let cook-off handle it if necessary + if (_hitpoint in ["hithull", "hitfuel", "#structural"]) then { + _damage min 0.89 + } else { + _damage + }; +}; diff --git a/addons/cookoff/functions/fnc_secondaryExplosions.sqf b/addons/cookoff/functions/fnc_secondaryExplosions.sqf new file mode 100644 index 0000000000..01a2fa3b3f --- /dev/null +++ b/addons/cookoff/functions/fnc_secondaryExplosions.sqf @@ -0,0 +1,64 @@ +/* + * Author: Maddmatt, commy2 + * Generate an amount of secondary explosions + * + * Arguments: + * 0: Vehicle + * 1: Amount + * + * Return Value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +#define SECONDARIES_DELAY (1 + random 45) + +params ["_vehicle", "_amount"]; + +if (isNil "_amount") then { + // calculate amount of secondary explosions if not specified + _amount = 0; + + { + _x params ["_magazine", "_count"]; + + private _ammo = getText (_magazine call CBA_fnc_getItemConfig >> "ammo"); + + if (IS_EXPLOSIVE_AMMO(_ammo)) then { + if (_ammo isKindOf "ShellBase") then { + ADD(_amount,_count); + } else { + ADD(_amount,_count/50); + }; + }; + } forEach magazinesAmmo _vehicle; +}; + +if (_amount <= 0) exitWith {}; + +private _fnc_secondaryExplosion = { + params ["_vehicle", "_amount", "_fnc_secondaryExplosion"]; + + private _position = _vehicle modelToWorld (_vehicle selectionPosition "destructionEffect2"); + + // these CfgAmmo objects are always global + "SmallSecondary" createVehicle _position; + + DEC(_amount); + + if (!isNull _vehicle && {_amount > 0}) then { + [_fnc_secondaryExplosion, [_vehicle, _amount, _fnc_secondaryExplosion], SECONDARIES_DELAY] call CBA_fnc_waitAndExecute; + }; +}; + +[_fnc_secondaryExplosion, [_vehicle, _amount, _fnc_secondaryExplosion], SECONDARIES_DELAY] call CBA_fnc_waitAndExecute; + +nil + +/*SencondaryExplosion + SecondaryExp + SecondarySmoke + GrenadeExploLight +*/ diff --git a/addons/cookoff/functions/script_component.hpp b/addons/cookoff/functions/script_component.hpp new file mode 100644 index 0000000000..d72f77978f --- /dev/null +++ b/addons/cookoff/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\cookoff\script_component.hpp" diff --git a/addons/cookoff/script_component.hpp b/addons/cookoff/script_component.hpp new file mode 100644 index 0000000000..91afa5df3c --- /dev/null +++ b/addons/cookoff/script_component.hpp @@ -0,0 +1,20 @@ +#define COMPONENT cookoff +#define COMPONENT_BEAUTIFIED Cook off +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define CBA_DEBUG_SYNCHRONOUS +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_COOKOFF + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_COOKOFF + #define DEBUG_SETTINGS DEBUG_SETTINGS_COOKOFF +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define IS_EXPLOSIVE_AMMO(ammo) (getNumber (ammo call CBA_fnc_getObjectConfig >> "explosive") > 0.5) diff --git a/addons/cookoff/sounds/cookoff.wss b/addons/cookoff/sounds/cookoff.wss new file mode 100644 index 0000000000000000000000000000000000000000..11b9d55194f0804dfc6c26185df11c6258cc2fd7 GIT binary patch literal 31524 zcmV)nK%Ku=Q&TVi000010096%9{>P=J^%m$01yBG0PFwI`%~+8^V%O*85{q0|D5_B(*U50w>L^wfWH|4_O=kFDDp_`wsA$(uB!)*~HjO>lg<59-B479w;8c8L$1= z(bCp7(e>~?C$c%d2oC57;LFY7w(7?3*Yn!V#?r%nzN^zv|J@1J^}6)Y6tyMOByu5) z8`ldr3iA0~7(4ya2SFHF_v!`B|BVu67eEXg_7ua;(Eqq}#?#Z|-8TeXC6-T9TmC$) zGXE-;9�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