Dayz Explorer 1.29.162510
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(g_Game.GetPlayer());
10
11 if (player)
12 {
13 vector headPos = player.GetDamageZonePos("Head"); // animated position in the middle of the zone
14 float ammoRangeKill = g_Game.ConfigGetFloat(string.Format("CfgAmmo %1 indirectHitRange", ammoType));
15 float ammoRangeMaxMult = 4.0;
16
17 string indirectHitRangeMultiplier = string.Format("CfgAmmo %1 indirectHitRangeMultiplier", ammoType);
18 if (g_Game.ConfigIsExisting(indirectHitRangeMultiplier))
19 {
21 ammoRangeMaxMult = Math.Clamp(g_Game.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()
void Grenade_Base()
Definition enmath.c:7
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
DayZGame g_Game
Definition dayzgame.c:3942
override void OnExplosionEffects(Object source, Object directHit, int componentIndex, string surface, vector pos, vector surfNormal, float energyFactor, float explosionFactor, bool isWater, string ammoType)
void SetParticleExplosion(int particle)
void SetAmmoType(string pAmmoType)
void FlashGrenadeLight()
EGrenadeType
Definition grenade_base.c:2
CollisionFlags
Definition endebug.c:141
vector GetPosition()
Get the world position of the Effect.
Definition effect.c:473
class Land_Buoy extends House m_Light