DayZ 1.29
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
AreaDamage.c
См. документацию.
1// DEPRECATED: Backwards compatibility class to prevent existing mods breaking
2// I wish I could rename this to AreaDamageTimer, but can't, because of backwards compatibility with mods
4{
6
7 protected float m_PlayerDamage;
8 protected float m_OthersDamage;
9
10 protected string m_AmmoName;
11 protected int m_DamageType;
12
13 protected float m_LoopInterval;
14 protected float m_DeferDuration;
15
18 protected ref array<typename> m_DamageableTypes
19
20 protected ref Timer m_LoopTimer;
21 protected ref Timer m_DeferTimer;
22
24 {
25 m_AreaDamage = this;
26
27 m_PlayerDamage = 0.0;
28 m_OthersDamage = 0.0;
29
30 m_AmmoName = "MeleeDamage";
31 m_DamageType = DamageType.CUSTOM;
32
33 m_LoopInterval = 1.0;
34 m_DeferDuration = 1.0;
35
38 m_DamageableTypes = new array<typename>;
39 m_DamageableTypes.Insert(DayZPlayer);
40
43
44 m_TriggerBaseClass = "AreaDamageTrigger";
45 }
46
48 void OnEnter(Object object)
49 {
50 if ( g_Game.IsServer() )
51 {
52 OnEnterServer(object);
53 }
54 else
55 {
56 OnEnterClient(object);
57 }
58 }
59 void OnEnterClient(Object object) {}
60 void OnEnterServer(Object object) {}
61
62 void OnLeave(Object object)
63 {
64 if ( g_Game.IsServer() )
65 {
66 OnLeaveServer(object);
67 }
68 else
69 {
70 OnLeaveClient(object);
71 }
72 }
73
74 void OnLeaveClient(Object object) {}
75 void OnLeaveServer(Object object)
76 {
78 if ( m_DeferTimer && m_DeferTimer.IsRunning() )
79 {
80 m_DeferTimer.Stop();
81 }
82 if ( m_LoopTimer && m_LoopTimer.IsRunning() )
83 {
84 m_LoopTimer.Stop();
85 }
86 }
87
88 protected void EvaluateDamage_Loop(Object object)
89 {
90 m_LoopTimer.Run(m_LoopInterval, this, "EvaluateDamage", new Param1<Object>(object), true);
91 }
92
93 protected void EvaluateDamage_Defer(Object object)
94 {
95 m_DeferTimer.Run(m_DeferDuration, this, "EvaluateDamage", new Param1<Object>(object), false);
96 }
97
98 protected void EvaluateDamage_DeferLoop(Object object)
99 {
100 m_DeferTimer.Run(m_DeferDuration, this, "EvaluateDamage_Loop", new Param1<Object>(object), false);
101 }
102
103 protected void EvaluateDamage(Object object)
104 {
105 string hitzone;
106
107 if ( m_RaycastSources.Count() )
108 {
109 hitzone = GetRaycastedHitZone(object, m_RaycastSources);
110 EvaluateDamage_Common(object, hitzone);
111 }
112 else
113 {
114 hitzone = GetRandomHitZone(m_HitZones);
115 EvaluateDamage_Common(object, hitzone);
116 }
117 }
118
119 protected void EvaluateDamage_Common(Object object, string hitzone)
120 {
121 if ( object && object.IsAlive() )
122 {
123 if ( object.IsAnyInherited( m_DamageableTypes ) )
124 {
125 //If we are hitting an infected or animal, we increase the damage dealt as they do not bleed
126 //Change is multiplier
127 /*DayZInfected dayzInfected = DayZInfected.Cast(object);
128 DayZAnimal dayzAnimal = DayZAnimal.Cast(object);
129 EntityAI eai = EntityAI.Cast(object);
130 if ( dayzInfected || dayzAnimal )
131 {
132 //Agents should not take damage from fireplace, but just in case, keep multiplier relatively low
133 if ( hitzone )
134 {
135 eai.ProcessDirectDamage(m_DamageType, EntityAI.Cast(m_ParentObject), hitzone, m_AmmoName, "0.5 0.5 0.5", 8);
136 }
137 else
138 eai.ProcessDirectDamage(m_DamageType, EntityAI.Cast(m_ParentObject), "", m_AmmoName, "0.5 0.5 0.5", 8);
139 }
140 else*/
141 {
142 object.ProcessDirectDamage(m_DamageType, m_ParentObject, hitzone, m_AmmoName, "0.5 0.5 0.5", 1);
143 }
145 }
146 }
147 }
148
149
153
154 protected string GetRandomHitZone(array<string> hitzones)
155 {
156 Math.Randomize(-1);
157 int idx = Math.RandomInt( 0, 100 ) % hitzones.Count();
158
159 return hitzones[idx];
160 }
161
162 protected string GetRaycastedHitZone(Object victim, array<string> raycast_sources_str)
163 {
164
165 // Vertical raycast start positions: Center, North East, North West, South East, South West
166 //vector raycast_sources[5] = {"0.0 0.1 0.0", "0.2 0.1 0.2", "-.2 0.1 0.2", "0.2 0.1 -.2", "-.2 0.1 -.2"};
167
168 string hitzone;
169 vector contact_pos;
170 vector contact_dir;
171 int contactComponent;
172 bool isSteppedOn = false;
173
174 array<vector> raycast_sources = new array<vector>;
175 ref set<Object> victims = new set<Object>;
176
177 // convert Array of string to array of Vectors
178 for ( int v = 0; v < raycast_sources_str.Count(); ++v)
179 {
180 raycast_sources.Insert(raycast_sources_str[v].ToVector());
181 }
182
183 for ( int i = 0; i < raycast_sources.Count(); ++i )
184 {
185 vector raycast_start_pos = m_AreaDamageTrigger.ModelToWorld( raycast_sources.Get(i) );
186 vector raycast_end_pos = "0 0.5 0" + raycast_start_pos;
187
188 //#ifdef DEVELOPER
189 //Debug.DrawArrow( raycast_start_pos, raycast_end_pos );
190 //#endif
191 DayZPhysics.RaycastRV( raycast_start_pos, raycast_end_pos, contact_pos, contact_dir, contactComponent, victims , null, m_AreaDamageTrigger, true, false, ObjIntersectIFire);
192
193 for ( int j = 0; j < victims.Count(); ++j )
194 {
195 Object contact_obj = victims.Get(j);
196
197 if ( contact_obj.IsAnyInherited(m_DamageableTypes) )
198 {
199 isSteppedOn = true;
200 break;
201 }
202 }
203
204 if ( isSteppedOn )
205 {
206 EntityAI eai = EntityAI.Cast(victim);
207 if ( eai )
208 {
209 hitzone = eai.GetDamageZoneNameByComponentIndex(contactComponent);
210 break;
211 }
212 }
213 }
214
215 if ( isSteppedOn )
216 {
217 return hitzone;
218 }
219 else
220 {
221 // Damage random leg since we don't know what part of player's body was caught in the trap.
222 string dmg_zone_rnd = "LeftFoot";
223 if ( Math.RandomIntInclusive(0, 1) == 1 )
224 dmg_zone_rnd = "RightFoot";
225 return dmg_zone_rnd;
226 }
227 }
228
232
233#ifdef DEVELOPER
234 ref array<Shape> triggerAreaShapes = new array<Shape>();
235
236 void EnableDebug(bool pState = false)
237 {
238 //if (g_Game && (!g_Game.IsClient() || g_Game.IsMultiplayer()))
239 //return;
240
241 if ( pState )
242 {
243 Debug_DrawArea();
244 }
245 else
246 {
247 Debug_CleanupShapes(triggerAreaShapes);
248 }
249 }
250
251 protected void Debug_DrawArea()
252 {
253 vector min = m_AreaPosition + m_ExtentMin;
254 vector max = m_AreaPosition + m_ExtentMax;
255
256 triggerAreaShapes.Insert(Debug.DrawBox(min, max));
257 }
258
259 private void Debug_CleanupShapes(array<Shape> shapesArr)
260 {
261 for ( int it = 0; it < shapesArr.Count(); ++it )
262 {
263 Shape shape = shapesArr[it];
264 Debug.RemoveShape( shape );
265 }
266
267 shapesArr.Clear();
268 }
269#endif
270}
vector m_AreaPosition
Определения AreaDamageManager.c:17
vector m_ExtentMin
Определения AreaDamageManager.c:15
vector m_ExtentMax
Определения AreaDamageManager.c:16
string m_TriggerBaseClass
Определения AreaDamageManager.c:20
override void PostDamageActions()
Usually called from AreaDamageComponent.
Определения AreaDamageManager.c:206
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
AreaDamageTriggerBase m_AreaDamageTrigger
Определения AreaDamageManager.c:11
string Debug()
Определения CachedEquipmentStorageBase.c:29
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3942
Object m_ParentObject
Cached parent.
Определения Effect.c:39
void EnableDebug(bool pEnabled)
Определения PluginPresenceNotifier.c:120
string GetRaycastedHitZone(Object victim, array< string > raycast_sources_str)
Определения AreaDamage.c:162
void EvaluateDamage_Loop(Object object)
Определения AreaDamage.c:88
void OnEnterClient(Object object)
Определения AreaDamage.c:59
AreaDamageBase m_AreaDamage
Определения AreaDamage.c:5
ref Timer m_DeferTimer
Определения AreaDamage.c:21
void EvaluateDamage_Common(Object object, string hitzone)
Определения AreaDamage.c:119
void OnLeave(Object object)
Определения AreaDamage.c:62
float m_PlayerDamage
Определения AreaDamage.c:7
void EvaluateDamage_Defer(Object object)
Определения AreaDamage.c:93
float m_OthersDamage
Определения AreaDamage.c:8
void OnLeaveServer(Object object)
Определения AreaDamage.c:75
string m_AmmoName
Определения AreaDamage.c:10
void EvaluateDamage_DeferLoop(Object object)
Определения AreaDamage.c:98
void AreaDamageBase(EntityAI parent)
Определения AreaDamage.c:23
float m_LoopInterval
Определения AreaDamage.c:13
ref Timer m_LoopTimer
Определения AreaDamage.c:20
void OnLeaveClient(Object object)
Определения AreaDamage.c:74
void OnEnterServer(Object object)
Определения AreaDamage.c:60
float m_DeferDuration
Определения AreaDamage.c:14
void EvaluateDamage(Object object)
Определения AreaDamage.c:103
ref array< string > m_RaycastSources
Определения AreaDamage.c:17
void OnEnter(Object object)
events
Определения AreaDamage.c:48
string GetRandomHitZone(array< string > hitzones)
Определения AreaDamage.c:154
ref array< string > m_HitZones
Определения AreaDamage.c:16
int m_DamageType
Определения AreaDamage.c:11
static proto bool RaycastRV(vector begPos, vector endPos, out vector contactPos, out vector contactDir, out int contactComponent, set< Object > results=NULL, Object with=NULL, Object ignore=NULL, bool sorted=false, bool ground_only=false, int iType=ObjIntersectView, float radius=0.0, CollisionFlags flags=CollisionFlags.NEARESTCONTACT)
Raycasts world by given parameters.
Определения DayZPhysics.c:124
Определения DayZPlayerImplement.c:87
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения DayZPlayerImplement.c:39
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Определения EnConvert.c:119
class DiagMenu Shape
don't call destructor directly. Use Destroy() instead
static proto int Randomize(int seed)
Sets the seed for the random number generator.
static proto int RandomInt(int min, int max)
Returns a random int number between and min [inclusive] and max [exclusive].
static int RandomIntInclusive(int min, int max)
Returns a random int number between and min [inclusive] and max [inclusive].
Определения EnMath.c:54
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8