DayZ Scripts
v1.21.156300 ยท Jun 20, 2023
 
Loading...
Searching...
No Matches
PluginAdminLog.c
Go to the documentation of this file.
1class PluginAdminLog extends PluginBase // Class for admin log messages handled by script
2{
4 string m_Pid;
8 string m_Message;
15 string m_PosArray[3];
17 PlayerStat<float> m_StatWater;
18 PlayerStat<float> m_StatEnergy;
19 BleedingSourcesManagerServer m_BleedMgr;
20 // filters
21 protected int m_HitFilter;
22 protected int m_PlacementFilter;
23 protected int m_ActionsFilter;
24 protected int m_PlayerListFilter;
25
28 const int TIMER_PLAYERLIST = GetPlayerListTimer();
29
30 protected const ref set<Man> m_AlreadyReportedDead = new set<Man>();//holds a list of dead players so that we know not to report their EEHitBy events any longer. We can't use IsAlive() as that would disqualify the killing EEHitBy event, which is necessary to report
31
32 static int GetPlayerListTimer()
33 {
34 return 300; // seconds
35 }
36
37 /*
38 EXE side ADM log messages (not removable):
39 Connect / Disconnect
40 Chat
41 Player->Admin report (ingame chat: #toadmin <text>)
42 */
43
45 {
46 m_HitFilter = GetGame().ServerConfigGetInt("adminLogPlayerHitsOnly"); // 1 - log player hits only / 0 - log all hits ( animals/infected )
47 m_PlacementFilter = GetGame().ServerConfigGetInt("adminLogPlacement"); // 1 - log placement ( traps, tents )
48 m_ActionsFilter = GetGame().ServerConfigGetInt("adminLogBuildActions"); // 1 - log basebuilding actions ( build, dismantle, destroy )
49 m_PlayerListFilter = GetGame().ServerConfigGetInt("adminLogPlayerList"); // 1 - log periodic player list with position every 5 minutes
50
51 m_PlayerArray = new array<Man>;
52
53 if ( m_PlayerListFilter == 1 )
54 {
55 m_Timer = new Timer();
56 m_Timer.Run( TIMER_PLAYERLIST , this, "PlayerList", NULL, true );
57 }
58 }
59
61 {
62 }
63
64 void LogPrint( string message )
65 {
66 GetGame().AdminLog( message );
67 }
68
69 string GetPlayerPrefix( PlayerBase player, PlayerIdentity identity ) // player name + id + position prefix for log prints
70 {
71
72 m_Position = player.GetPosition();
73 m_PosArray[3] = { m_Position[0].ToString(), m_Position[2].ToString(), m_Position[1].ToString() };
74
75 for ( int i = 0; i < 3; i++ ) // trim position precision
76 {
77 m_DotIndex = m_PosArray[i].IndexOf(".");
78 if ( m_DotIndex != -1 )
79 {
80 m_PosArray[i] = m_PosArray[i].Substring( 0, m_DotIndex + 2 );
81 }
82 }
83
84 if ( !identity ) // return partial message even if it fails to fetch identity
85 {
86 return "Player \"" + "Unknown/Dead Entity" + "\" (id=" + "Unknown" + " pos=<" + m_PosArray[0] + ", " + m_PosArray[1] + ", " + m_PosArray[2] + ">)";
87 }
88
89 m_PlayerName = "\"" + identity.GetName() + "\"";
90 m_Pid = identity.GetId();
91
92 if ( !player.IsAlive() )
93 {
94 m_PlayerName = m_PlayerName + " (DEAD)";
95 }
96
97 return "Player " + m_PlayerName + " (id=" + m_Pid + " pos=<" + m_PosArray[0] + ", " + m_PosArray[1] + ", " + m_PosArray[2] + ">)";
98 }
99
100 string GetHitMessage( TotalDamageResult damageResult, int component, string zone, string ammo)
101 {
102 if ( damageResult )
103 {
104 float dmg = damageResult.GetHighestDamage("Health");
105 return " into " + zone + "(" + component.ToString() + ") for " + dmg.ToString() + " damage (" + ammo + ")";
106 }
107 else // block
108 {
109 return " into Block" + "(" + component.ToString() + ") for 0 damage ";
110 }
111 }
112
113 void PlayerKilled( PlayerBase player, Object source ) // PlayerBase.c
114 {
115
116 if (!player || !source)
117 {
118 LogPrint("DEBUG: PlayerKilled() player/source does not exist");
119 return;
120 }
121
122 PlayerBase playerSource = PlayerBase.Cast( EntityAI.Cast( source ).GetHierarchyParent() );
123 if (!playerSource)
124 {
125 playerSource = PlayerBase.Cast( source );
126 }
127
128 string playerPrefix, playerPrefix2;
129 if (playerSource)
130 {
131 playerPrefix2 = GetPlayerPrefix( playerSource , playerSource.GetIdentity() );
132 }
133
134 playerPrefix = GetPlayerPrefix( player , player.GetIdentity() );
135 if (player == source) // deaths not caused by another object (starvation, dehydration)
136 {
137 m_StatWater = player.GetStatWater();
138 m_StatEnergy = player.GetStatEnergy();
139 m_BleedMgr = player.GetBleedingManagerServer();
140
141 if ( m_StatWater && m_StatEnergy && m_BleedMgr )
142 {
143 LogPrint( playerPrefix + " died. Stats> Water: " + m_StatWater.Get().ToString() + " Energy: " + m_StatEnergy.Get().ToString() + " Bleed sources: " + m_BleedMgr.GetBleedingSourcesCount().ToString() );
144 }
145 else if ( m_StatWater && m_StatEnergy && !m_BleedMgr )
146 {
147 LogPrint( playerPrefix + " died. Stats> Water: " + m_StatWater.Get().ToString() + " Energy: " + m_StatEnergy.Get().ToString() );
148 }
149 else
150 {
151 LogPrint( playerPrefix + " died. Stats> could not fetch");
152 }
153 }
154 else if (source.IsWeapon() || source.IsMeleeWeapon()) // player
155 {
156
157 if (source.IsMeleeWeapon())
158 {
159 LogPrint( playerPrefix + " killed by " + playerPrefix2 + " with " + source.GetDisplayName() );
160 }
161 else
162 {
163 m_Distance = vector.Distance( player.GetPosition(), playerSource.GetPosition() );
164 LogPrint( playerPrefix + " killed by " + playerPrefix2 + " with " + source.GetDisplayName() + " from " + m_Distance + " meters " );
165 }
166 }
167 else
168 {
169 if (playerSource)
170 {
171 //fists
172 LogPrint( playerPrefix + " killed by " + playerPrefix2 + " with (MeleeFist)" );
173 }
174 else
175 {
176 //rest, Animals, Zombies
177 LogPrint( playerPrefix + " killed by " + source.GetType());
178 }
179
180 }
181 m_AlreadyReportedDead.Insert(player);
182 }
183
184 void PlayerHitBy( TotalDamageResult damageResult, int damageType, PlayerBase player, EntityAI source, int component, string dmgZone, string ammo ) // PlayerBase.c
185 {
186 if ( player && source )
187 {
188 if (m_AlreadyReportedDead.Find(player) != -1)
189 return;
190 string playerPrefix = GetPlayerPrefix( player , player.GetIdentity() ) + "[HP: " + player.GetHealth().ToString() + "]";
191 string playerPrefix2;
192 m_HitMessage = GetHitMessage( damageResult, component, dmgZone, ammo );
193 PlayerBase playerSource;
194 switch ( damageType )
195 {
196 case DamageType.CLOSE_COMBAT: // Player melee, animals, infected
197
198 if ( m_HitFilter != 1 && ( source.IsZombie() || source.IsAnimal() ) ) // Infected & Animals
199 {
200 m_DisplayName = source.GetDisplayName();
201
202 LogPrint( playerPrefix + " hit by " + m_DisplayName + m_HitMessage );
203 }
204 else if ( source.IsPlayer() ) // Fists
205 {
206 playerSource = PlayerBase.Cast( source );
207 playerPrefix2 = GetPlayerPrefix( playerSource , playerSource.GetIdentity() );
208
209 LogPrint( playerPrefix + " hit by " + playerPrefix2 + m_HitMessage );
210 }
211 else if ( source.IsMeleeWeapon() ) // Melee weapons
212 {
213 m_ItemInHands = source.GetDisplayName();
214 playerSource = PlayerBase.Cast( source.GetHierarchyParent() );
215 playerPrefix2 = GetPlayerPrefix( playerSource , playerSource.GetIdentity() );
216
217 LogPrint( playerPrefix + " hit by " + playerPrefix2 + m_HitMessage + " with " + m_ItemInHands );
218 }
219 else
220 {
221 m_DisplayName = source.GetType();
222
223 LogPrint( playerPrefix + " hit by " + m_DisplayName + m_HitMessage );
224 }
225 break;
226
227 case DamageType.FIRE_ARM: // Player ranged
228
229 if ( source.IsWeapon() )
230 {
231 m_ItemInHands = source.GetDisplayName();
232 playerSource = PlayerBase.Cast( source.GetHierarchyParent() );
233 playerPrefix2 = GetPlayerPrefix( playerSource , playerSource.GetIdentity() );
234 m_Distance = vector.Distance( player.GetPosition(), playerSource.GetPosition() );
235
236 LogPrint( playerPrefix + " hit by " + playerPrefix2 + m_HitMessage + " with " + m_ItemInHands + " from " + m_Distance + " meters ");
237 }
238 else
239 {
240 m_DisplayName = source.GetType();
241
242 LogPrint( playerPrefix + " hit by " + m_DisplayName + m_HitMessage );
243 }
244 break;
245
246 case DamageType.EXPLOSION: // Explosion
247
248 LogPrint( playerPrefix + " hit by explosion (" + ammo + ")" );
249 break;
250
251 case DamageType.STUN: // unused atm
252
253 LogPrint( playerPrefix + " stunned by " + ammo );
254 break;
255
256 case DamageType.CUSTOM: // Others (Vehicle hit, fall, fireplace, barbed wire ...)
257 float globalHealthDamage = damageResult.GetDamage("", "Health");
258 if (ammo == DayZPlayerImplementFallDamage.FALL_DAMAGE_AMMO_HEALTH || ammo == DayZPlayerImplementFallDamage.FALL_DAMAGE_AMMO_SHOCK || ammo == DayZPlayerImplementFallDamage.FALL_DAMAGE_AMMO_HEALTH_OTHER_ATTACHMENTS)
259 {
260 if (globalHealthDamage > 0.0)
261 LogPrint(playerPrefix + " hit by " + ammo);
262 }
263 else if ( source.GetType() == "AreaDamageManager" )
264 {
265 EntityAI parent = EntityAI.Cast( source );
266 if ( parent )
267 {
268 LogPrint( playerPrefix + " hit by " + parent.GetType() + " with " + ammo );
269 }
270 }
271 else
272 {
273 m_DisplayName = source.GetType();
274
275 LogPrint( playerPrefix + " hit by " + m_DisplayName + " with " + ammo );
276 }
277 break;
278
279 default:
280
281 LogPrint("DEBUG: PlayerHitBy() unknown damageType: " + ammo );
282 break;
283 }
284 }
285 else
286 {
287 LogPrint("DEBUG: player/source does not exist");
288 }
289 }
290
291 void UnconStart( PlayerBase player ) // PlayerBase.c
292 {
293 m_PlayerPrefix = GetPlayerPrefix( player , player.GetIdentity() );
294
295 LogPrint( m_PlayerPrefix + " is unconscious" );
296 }
297
298 void UnconStop( PlayerBase player ) // PlayerBase.c
299 {
300 if ( player.IsAlive() ) // Do not log uncon stop for dead players
301 {
302 m_PlayerPrefix = GetPlayerPrefix( player , player.GetIdentity() );
303
304 LogPrint( m_PlayerPrefix + " regained consciousness" );
305 }
306 }
307
308 void OnPlacementComplete( Man player, ItemBase item ) // ItemBase.c
309 {
310 if ( m_PlacementFilter == 1 )
311 {
312 m_Source = PlayerBase.Cast( player );
313 m_PlayerPrefix = GetPlayerPrefix( m_Source , m_Source.GetIdentity() );
314 m_DisplayName = item.GetDisplayName();
315
316 if ( m_DisplayName == "" )
317 {
318 LogPrint( m_PlayerPrefix + " placed unknown object" );
319 }
320 else
321 {
322 LogPrint( m_PlayerPrefix + " placed " + m_DisplayName );
323 }
324 }
325 }
326
327 void OnContinouousAction( ActionData action_data ) // ActionContinouousBase.c
328 {
329 if ( m_ActionsFilter == 1 )
330 {
331 m_Message = action_data.m_Action.GetAdminLogMessage(action_data);
332
333 if(m_Message == "")
334 return;
335
336 m_PlayerPrefix = GetPlayerPrefix( action_data.m_Player , action_data.m_Player.GetIdentity() );
337
338 LogPrint( m_PlayerPrefix + m_Message );
339 }
340 }
341
342 void Suicide( PlayerBase player ) // EmoteManager.c
343 {
344 m_PlayerPrefix = GetPlayerPrefix( player , player.GetIdentity() );
345
346 LogPrint( m_PlayerPrefix + " committed suicide" );
347 }
348
349 void BleedingOut( PlayerBase player ) // Bleeding.c
350 {
351 m_PlayerPrefix = GetPlayerPrefix( player , player.GetIdentity() );
352
353 LogPrint( m_PlayerPrefix + " bled out" );
354 }
355
356 //"top" == 'true' for flag all the way at the top, 'false' for all the way at the bottom
357 void TotemFlagChange(bool top, notnull PlayerBase player, notnull EntityAI totem)
358 {
359 if (m_ActionsFilter !=1)
360 return;
361
362 string prefix = GetPlayerPrefix(player, player.GetIdentity());
363 string flagType = totem.FindAttachmentBySlotName("Material_FPole_Flag").ClassName();
364 string action;
365
366 if (top)
367 action = "raised ";
368 else
369 action = "lowered ";
370
371 LogPrint( prefix + " has " + action + flagType + " on " + totem.ClassName() + " at " + totem.GetPosition());
372 }
373
375 {
376 GetGame().GetPlayers( m_PlayerArray );
377
378 if ( m_PlayerArray.Count() != 0 )
379 {
380 LogPrint( "##### PlayerList log: " + m_PlayerArray.Count().ToString() + " players" );
381
382 foreach ( Man player: m_PlayerArray )
383 {
384 m_Player = PlayerBase.Cast(player);
385 m_PlayerPrefix = GetPlayerPrefix( m_Player , m_Player.GetIdentity() );
386
387 LogPrint( m_PlayerPrefix );
388 }
389
390 LogPrint( "#####" );
391 }
392 }
393
394 void DirectAdminLogPrint(string str)
395 {
396 LogPrint(str);
397 }
398
399 void PlayerCorpseDestroyed(Man player)
400 {
401 m_AlreadyReportedDead.RemoveItem(player);
402 }
403}
DamageType
exposed from C++ (do not change)
ref Timer m_Timer
Definition DayZGame.c:687
void DayZPlayerImplementFallDamage(DayZPlayer pPlayer)
protected vector m_Position
Cached world position.
Definition Effect.c:41
DayZPlayer m_Player
Definition Hand_Events.c:42
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
PlayerBase m_Player
Definition ActionBase.c:33
ref ActionBase m_Action
Definition ActionBase.c:27
proto native int ServerConfigGetInt(string name)
Server config parsing. Returns 0 if not found.
proto native void GetPlayers(out array< Man > players)
proto native void AdminLog(string text)
override bool IsMeleeWeapon()
proto owned string GetId()
unique id of player (hashed steamID, database Xbox id...) can be used in database or logs
proto owned string GetName()
nick (short) name of player
The class that will be instanced (moddable)
Definition gameplay.c:378
string m_Message
void LogPrint(string message)
void Suicide(PlayerBase player)
string m_ItemInHands
string m_HitMessage
void TotemFlagChange(bool top, notnull PlayerBase player, notnull EntityAI totem)
protected int m_ActionsFilter
autoptr array< Man > m_PlayerArray
protected int m_PlayerListFilter
string GetPlayerPrefix(PlayerBase player, PlayerIdentity identity)
void UnconStop(PlayerBase player)
void OnContinouousAction(ActionData action_data)
PlayerBase m_Player
string m_PlayerPrefix
protected int m_HitFilter
PlayerBase m_Source
void PluginAdminLog()
void OnPlacementComplete(Man player, ItemBase item)
protected int m_PlacementFilter
vector m_Position
string m_DisplayName
string m_PlayerPrefix2
void PlayerHitBy(TotalDamageResult damageResult, int damageType, PlayerBase player, EntityAI source, int component, string dmgZone, string ammo)
void UnconStart(PlayerBase player)
void PlayerList()
PlayerStat< float > m_StatEnergy
static int GetPlayerListTimer()
PlayerStat< float > m_StatWater
void BleedingOut(PlayerBase player)
void PlayerKilled(PlayerBase player, Object source)
void ~PluginAdminLog()
void PlayerCorpseDestroyed(Man player)
void DirectAdminLogPrint(string str)
ref Timer m_Timer
BleedingSourcesManagerServer m_BleedMgr
string GetHitMessage(TotalDamageResult damageResult, int component, string zone, string ammo)
string m_PlayerName
proto native float GetDamage(string zoneName, string healthType)
proto native float GetHighestDamage(string healthType)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto string ToString()
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
proto string ToString(bool beautify=true)
Vector to string.
proto native CGame GetGame()
proto string Substring(int start, int len)
Substring of 'str' from 'start' position 'len' number of characters.
string Get(int index)
Gets n-th character from string.
Definition EnString.c:434
proto native int IndexOf(string sample)
Finds 'sample' in 'str'. Returns -1 when not found.
static proto string ToString(void var, bool type=false, bool name=false, bool quotes=true)
Return string representation of variable.