DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ OnExplosionEffects()

override void Grenade_Base::OnExplosionEffects ( Object source,
Object directHit,
int componentIndex,
string surface,
vector pos,
vector surfNormal,
float energyFactor,
float explosionFactor,
bool isWater,
string ammoType )
inlineprivate

values less than 1.0 make no sense

removes possible obstacles made by items around the grenade(or on the same position)

См. определение в файле FlashGrenade.c строка 5

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
43 array<ref RaycastRVResult> results = new array<ref RaycastRVResult>;
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 }
class LogManager EntityAI
const int MAX
Определения EnConvert.c:27
class GP5GasMask extends MaskBase ItemBase
PlayerBase GetPlayer()
Определения ModifierBase.c:51
proto native float ConfigGetFloat(string path)
Get float value from config on path.
const float FX_RANGE_MAX_MULT
Определения FlashGrenade.c:3
CollisionFlags flags
Определения DayZPhysics.c:63
proto native CGame GetGame()
CollisionFlags
Определения EnDebug.c:141

Перекрестные ссылки Math::Clamp(), CGame::ConfigGetFloat(), vector::Distance(), vector::DistanceSq(), RaycastRVParams::flags, FX_RANGE_MAX_MULT, GetGame(), GetPlayer(), MAX, DayZPhysics::RaycastRVProxy() и Math::SqrFloat().