Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_DamageArea.c
Go to the documentation of this file.
2{
3 [Attribute(defvalue: "1", desc: "Should this area be automatically registered to the system, when owner is initalized")]
5
6 [Attribute(desc: "Damage type of the damage which is going to be applied, when player enters the area.\nWhen none is selected the damage is no applied.", uiwidget: UIWidgets.ComboBox, enumType: EDamageType)]
8
9 [Attribute(desc: "How much damage should be dealt upon entering the zone")]
10 protected float m_fDamageValue;
11
12 [Attribute()]
14
15 [Attribute(defvalue: "0", desc: "Remove Effect When Leaving The Area\nNOTE:If component has many areas with same Damage Effect, then leaving one zone will cause a removal of all instances of this Damage Effects type, that was applied by this component owner.")]
17
18 [Attribute(defvalue: "1", desc: "Should the damage go through watertight compartments to be applied to its occupants")]
20
21 [Attribute(defvalue: SCR_EHitZoneSelectionMode.DEFAULT.ToString(), desc: "Determines how hit zone is selected.\nThis attribute is also passed to the Custom Hit Zone Selector when such is present.", uiwidget: UIWidgets.ComboBox, enumType: SCR_EHitZoneSelectionMode)]
23
24 [Attribute(desc: "Custom selector of the hit zones. If not provided then basic area logic is used.")]
26
27 //------------------------------------------------------------------------------------------------
33
34 //------------------------------------------------------------------------------------------------
37 override void OnAreaEntered(notnull IEntity entity)
38 {
40 {
42 if (compartmentAccessComp)
43 {
44 compartmentAccessComp.GetOnPlayerCompartmentExit().Insert(ReevaluateDamageEffect);
45 compartmentAccessComp.GetOnPlayerCompartmentEnter().Insert(ReevaluateDamageEffect);
46
47 BaseCompartmentSlot compartment = compartmentAccessComp.GetCompartment();
48
49 if (compartment && compartmentAccessComp.GetCompartment().GetIsWaterTight())
50 return;
51 }
52 }
53
54 AddEffect(entity);
55 }
56
57 //------------------------------------------------------------------------------------------------
60 override void OnAreaExit(IEntity entity)
61 {
62 if (!entity)
63 return;
64
66 {
68 if (compartmentAccessComp)
69 {
70 compartmentAccessComp.GetOnPlayerCompartmentExit().Remove(ReevaluateDamageEffect);
71 compartmentAccessComp.GetOnPlayerCompartmentEnter().Remove(ReevaluateDamageEffect);
72 }
73 }
74
76 {
77 super.OnAreaExit(entity);
78 return;
79 }
80
81 RemoveEffect(entity);
82 }
83
84
85 //------------------------------------------------------------------------------------------------
89 protected void ReevaluateDamageEffect(ChimeraCharacter playerCharacter, IEntity compartmentEntity)
90 {
91 if (!playerCharacter)
92 return;
93
94 SCR_CompartmentAccessComponent compartmentAccessComp = SCR_CompartmentAccessComponent.Cast(playerCharacter.FindComponent(SCR_CompartmentAccessComponent));
95 BaseCompartmentSlot compartment;
96 if (compartmentAccessComp)
97 compartment = compartmentAccessComp.GetCompartment();
98
99 if (compartmentAccessComp && compartment && compartmentAccessComp.GetCompartment().GetIsWaterTight())
100 {
101 RemoveEffect(playerCharacter);
102 }
103 else
104 {
105 if (!IsEffectApplied(playerCharacter) && !compartmentAccessComp.IsSwitchingSeatsAnim())
106 AddEffect(playerCharacter);
107 }
108 }
109
110 //------------------------------------------------------------------------------------------------
113 protected bool IsEffectApplied(notnull IEntity entity)
114 {
115 const SCR_ExtendedDamageManagerComponent damageManager = SCR_ExtendedDamageManagerComponent.Cast(SCR_DamageManagerComponent.GetDamageManager(entity));
116 array<ref SCR_PersistentDamageEffect> damageEffects = {};
117 if (damageManager.FindAllDamageEffectsOfType(GetDamageEffect().Type(), damageEffects) < 1)
118 return false;
119
120 const IEntity owner = GetParent();
121 foreach (SCR_PersistentDamageEffect effect : damageEffects)
122 {
123 if (effect.GetInstigator().GetInstigatorEntity() == owner)
124 return true;
125 }
126
127 return false;
128 }
129
130 //------------------------------------------------------------------------------------------------
133 protected void AddEffect(notnull IEntity entity)
134 {
135 const SCR_ExtendedDamageManagerComponent damageManager = SCR_ExtendedDamageManagerComponent.Cast(SCR_DamageManagerComponent.GetDamageManager(entity));
136 if (!damageManager)
137 return;
138
139 HitZone hitZone = GetAffectedHitZone(damageManager, m_eHitZoneSelectionMode);
140 if (!hitZone)
141 return;
142
143 if (m_fDamageValue == 0 || m_eDamageType == int.MAX) //int.MAX is equal to selecting in the prefab the option 'none' for m_eDamageType
144 {
145 damageManager.AddDamageEffect(GetDamageEffect(damageManager, hitZone));
146 return;
147 }
148
149 const IEntity owner = GetParent();
150 vector posDirNorm[3];
151 posDirNorm[0] = entity.GetOrigin();
153 entity, hitZone, Instigator.CreateInstigator(owner),
154 null, 0, 0);
155
156 context.damageEffect = GetDamageEffect(damageManager, hitZone);
157 context.damageSource = owner;
158 damageManager.HandleDamage(context);
159 }
160
161 //------------------------------------------------------------------------------------------------
164 protected void RemoveEffect(notnull IEntity entity)
165 {
166 const SCR_ExtendedDamageManagerComponent dmgMgr = SCR_ExtendedDamageManagerComponent.Cast(SCR_DamageManagerComponent.GetDamageManager(entity));
167 if (!dmgMgr)
168 return;
169
170 array<ref SCR_PersistentDamageEffect> damageEffects = {};
171 if (dmgMgr.FindAllDamageEffectsOfType(GetDamageEffect().Type(), damageEffects) < 1)
172 return;
173
174 const IEntity owner = GetParent();
175 foreach (SCR_PersistentDamageEffect effect : damageEffects)
176 {
177 if (effect.GetInstigator().GetInstigatorEntity() == owner)
178 effect.Terminate();
179 }
180 }
181
182 //------------------------------------------------------------------------------------------------
187 protected BaseDamageEffect GetDamageEffect(SCR_DamageManagerComponent dmgMgr = null, HitZone affectedHitZone = null)
188 {
189 return m_DamageEffect;
190 }
191
192 //------------------------------------------------------------------------------------------------
197 protected HitZone GetAffectedHitZone(notnull SCR_DamageManagerComponent dmgMgr, SCR_EHitZoneSelectionMode hitZoneSelectionMode)
198 {
200 {
201 HitZone hitZone = m_CustomHitZoneSelector.SelectHitZone(dmgMgr, hitZoneSelectionMode);
202 if (hitZone)
203 return hitZone;
204
205 if (m_CustomHitZoneSelector.ShouldAbortWhenNoCompatibleHitZonesWereFound())
206 return null;
207 }
208
209 if (hitZoneSelectionMode == SCR_EHitZoneSelectionMode.DEFAULT)
210 return dmgMgr.GetDefaultHitZone();
211
212 array<HitZone> hitZones = {};
213 if (hitZoneSelectionMode == SCR_EHitZoneSelectionMode.RANDOM)
214 dmgMgr.GetAllHitZones(hitZones);
215 else
216 dmgMgr.GetPhysicalHitZones(hitZones);
217
218 if (hitZones.IsEmpty())
219 return null;
220
221 if (hitZoneSelectionMode == SCR_EHitZoneSelectionMode.FIRST_PHYSICAL)
222 return hitZones[0];
223
224 return hitZones.GetRandomElement();
225 }
226
227 //------------------------------------------------------------------------------------------------
228 override void DisplayInfo()
229 {
230 DbgUI.Text("Area information");
231 DbgUI.Text("Area prefab = "+SCR_DamageAreaComponent.GetPrefabname(GetParent()));
232 }
233}
SCR_EHitZoneSelectionMode
Faction GetParent()
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
int Type
Definition DbgUI.c:66
proto external Managed FindComponent(typename typeName)
OnPlayerExitCompartment GetOnPlayerCompartmentExit(bool createNew=true)
OnPlayerEnterCompartment GetOnPlayerCompartmentEnter(bool createNew=true)
BaseDamageEffect GetDamageEffect(SCR_DamageManagerComponent dmgMgr=null, HitZone affectedHitZone=null)
SCR_EHitZoneSelectionMode m_eHitZoneSelectionMode
bool m_bRegisterAutomatically
void AddEffect(notnull IEntity entity)
void ReevaluateDamageEffect(ChimeraCharacter playerCharacter, IEntity compartmentEntity)
override void OnAreaEntered(notnull IEntity entity)
ref SCR_BaseHitZoneSelector m_CustomHitZoneSelector
HitZone GetAffectedHitZone(notnull SCR_DamageManagerComponent dmgMgr, SCR_EHitZoneSelectionMode hitZoneSelectionMode)
EDamageType m_eDamageType
bool IsEffectApplied(notnull IEntity entity)
ref BaseDamageEffect m_DamageEffect
bool m_bPenetrateWatertightCompartments
override void DisplayInfo()
bool IsRegisteredAutomatically()
override void OnAreaExit(IEntity entity)
bool m_bRemoveEffectWhenLeavingTheArea
void RemoveEffect(notnull IEntity entity)
SCR_FieldOfViewSettings Attribute
EDamageType
Definition EDamageType.c:13
@ MAX