Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
flashgrenade.c
Go to the documentation of this file.
1class FlashGrenade extends Grenade_Base
2{
3 const float FX_RANGE_MAX_MULT = 1.0;
4
5 override void OnExplosionEffects(Object source, Object directHit, int componentIndex, string surface, vector pos, vector surfNormal, float energyFactor, float explosionFactor, bool isWater, string ammoType)
6 {
7 super.OnExplosionEffects(source, directHit, componentIndex, surface, pos, surfNormal, energyFactor, explosionFactor, isWater, ammoType);
8
9 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
10
11 if (player)
12 {
13 vector headPos = player.GetDamageZonePos("Head"); // animated position in the middle of the zone
14 float ammoRangeKill = GetGame().ConfigGetFloat(string.Format("CfgAmmo %1 indirectHitRange", ammoType));
15 float ammoRangeMaxMult = 4.0;
16
17 string indirectHitRangeMultiplier = string.Format("CfgAmmo %1 indirectHitRangeMultiplier", ammoType);
18 if (GetGame().ConfigIsExisting(indirectHitRangeMultiplier))
19 {
21 ammoRangeMaxMult = Math.Clamp(GetGame().ConfigGetFloat(indirectHitRangeMultiplier), 1.0, float.MAX);
22 }
23
24 float ammoRangeMax = ammoRangeKill * ammoRangeMaxMult;
25 ammoRangeMax = Math.Clamp(ammoRangeMax * FX_RANGE_MAX_MULT, ammoRangeKill, ammoRangeMax);
26
27 float dist = vector.Distance(headPos, pos);
28 float distSq = vector.DistanceSq(headPos, pos);
29 float radiusMaxSq = Math.SqrFloat(ammoRangeMax);
30
31 if (distSq <= radiusMaxSq)
32 {
33 // ignore collisions with parent if fireplace
34 InventoryItem invItem = InventoryItem.Cast(source);
35 EntityAI parent = invItem.GetHierarchyParent();
36 array<Object> excluded = new array<Object>;
37
38 if (!parent || !parent.IsFireplace())
39 parent = null;
40 else if (parent)
41 excluded.Insert(parent);
42
44 excluded.Insert(this); //Ignore self for visibility check
45
46 //There shouldn't be cases justifying we go further than first entry (if in fireplace, self does not impact)
47 RaycastRVParams rayParams = new RaycastRVParams(pos, headPos, excluded[0]);
48 rayParams.flags = CollisionFlags.ALLOBJECTS;
49 DayZPhysics.RaycastRVProxy(rayParams, results, excluded);
50
52 array<Object> hitObjects = new array<Object>;
53 for (int i = 0; i < results.Count(); i++)
54 {
55 if (results[i].obj && !results[i].obj.IsInherited(ItemBase))
56 {
57 hitObjects.Insert(results[i].obj);
58 }
59 }
60
61 //If player is not first index, object is between player and grenade
62 if (hitObjects.Count() && PlayerBase.Cast(hitObjects[0]))
63 {
64 float effectCoef;
65 if (ammoRangeMax == ammoRangeKill)
66 {
67 effectCoef = 1.0; //edge case, landed right on the edge
68 }
69 effectCoef = 1 - ((dist - ammoRangeKill) / (ammoRangeMax - ammoRangeKill));
70 effectCoef = Math.Clamp(effectCoef, 0.1, 100.0);
71
72 player.OnPlayerReceiveFlashbangHitStart(MiscGameplayFunctions.IsPlayerOrientedTowardPos(player, pos, 60));
73 player.GetFlashbangEffect().SetupFlashbangValues(effectCoef, effectCoef, effectCoef);
74 }
75 }
76 }
77 }
78
79 void FlashGrenade()
80 {
81 SetAmmoType("FlashGrenade_Ammo");
82 SetFuseDelay(2);
83 SetGrenadeType(EGrenadeType.ILLUMINATING);
85 }
86
87 protected override void CreateLight()
88 {
90 }
91
92 void ~FlashGrenade() {}
93}
void SetFuseDelay(float delay)
void SetGrenadeType(EGrenadeType type)
override void CreateLight()
void ~FlashGrenade()
Definition enmath.c:7
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
override void OnExplosionEffects(Object source, Object directHit, int componentIndex, string surface, vector pos, vector surfNormal, float energyFactor, float explosionFactor, bool isWater, string ammoType)
const int MAX
Definition enconvert.c:27
void SetParticleExplosion(int particle)
void SetAmmoType(string pAmmoType)
proto native CGame GetGame()
void FlashGrenadeLight()
EGrenadeType
Definition grenade_base.c:2
CollisionFlags
Definition endebug.c:141
class JsonUndergroundAreaTriggerData GetPosition
class Land_Buoy extends House m_Light
PlayerBase GetPlayer()