· 10 years ago · Aug 24, 2016, 10:10 PM
1// Reference: Oxide.Ext.MySql
2using Oxide.Core;
3using Oxide.Core.Database;
4using Oxide.Ext.MySql;
5using System.Text;
6using System.Collections.Generic;
7using Rust;
8using System.Linq;
9using UnityEngine;
10namespace Oxide.Plugins
11{
12 [Info("DBLogger", "Bamabo", "1.0.0")]
13 class DBLogger : RustPlugin
14 {
15 private Dictionary<ulong, Dictionary<string, int>> stats = new Dictionary<ulong, Dictionary<string, int>>();
16 private Dictionary<ulong, float> longshots = new Dictionary<ulong, float>();
17 private readonly Ext.MySql.Libraries.MySql _mySql = Interface.GetMod().GetLibrary<Ext.MySql.Libraries.MySql>();
18 private Core.Database.Connection _mySqlConnection;
19 private BasePlayer lastHeliHit;
20 #region Prepared Statements
21 private const string InsertNewPlayer = @"INSERT IGNORE INTO players(steamID, displayname, level, unspent_xp, x, y, z, lastIP) VALUES (@0, @1, @2, @3, @4, @5, @6, @7)";
22 private const string InsertOrUpdateCrafting =
23 @"INSERT INTO crafting(steamID, built, demolished, repaired, upgraded, bone, cloth, leather, HQM, metal, stone, sulphur, wood, crafted, rotated)
24 VALUES(@0,@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14) ON DUPLICATE KEY UPDATE
25 built = built+@1,
26 demolished = demolished+@2,
27 repaired = repaired+@3,
28 upgraded = upgraded+@4,
29 rotated = rotated+@14,
30 bone = bone+@5,
31 cloth = cloth+@6,
32 leather = leather+@7,
33 HQM = HQM+@8,
34 metal = metal+@9,
35 stone = stone+@10,
36 sulphur = sulphur+@11,
37 wood = wood+@12,
38 crafted = crafted+@13";
39 private const string InsertOrUpdateKills =
40 @"INSERT INTO kills(steamID, autoturret, barrel, bear, boar, chicken, stag, helicopter, horse, player, sleeper, wolf)
41 VALUES(@0,@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11) ON DUPLICATE KEY UPDATE
42 autoturret = autoturret+@1,
43 barrel = barrel+@2,
44 bear = bear+@3,
45 boar = boar+@4,
46 chicken = chicken+@5,
47 stag = stag+@6,
48 helicopter = helicopter+@7,
49 horse = horse+@8,
50 player = player+@9,
51 sleeper = sleeper+@10,
52 wolf = wolf+@11";
53 private const string InsertOrUpdateMisc =
54 @"INSERT INTO misc(steamID, shots_fired, shots_hit, headshots, longest_shot, rockets_fired, explosives_thrown, heals, wounded) VALUES (@0, @1, @2,@3,@4,@5,@6,@7,@8) ON DUPLICATE KEY UPDATE
55 shots_fired = shots_fired+@1,
56 shots_hit = shots_hit+@2,
57 headshots = headshots+@3,
58 longest_shot = greatest(longest_shot,@4),
59 rockets_fired = rockets_fired+@5,
60 explosives_thrown = explosives_thrown+@6,
61 heals = heals+@7,
62 wounded = wounded+@8";
63 private const string InsertOrUpdateDeaths =
64 @"INSERT INTO deaths(steamID, arrow, bear, bleeding, blunt, bite, bullets, burning, cold, drowning, electric, explosion, falling, generic, heat, helicopter, player, poison, radiation, slash, stab, starvation, suicide, thirst, wolf, autoturret, landmine, trap, barricade)
65 VALUES(@0,@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26,@27,@28) ON DUPLICATE KEY UPDATE
66 arrow = arrow+@1,
67 bear = bear+@2,
68 bleeding = bleeding+@3,
69 blunt = blunt+@4,
70 bite = bite+@5,
71 bullets = bullets+@6,
72 burning = burning+@7,
73 cold = cold+@8,
74 drowning = drowning+@9,
75 electric = electric+@10,
76 explosion = explosion+@11,
77 falling = falling+@12,
78 generic = generic+@13,
79 heat = heat+@14,
80 helicopter = helicopter+@15,
81 player = player+@16,
82 poison = poison+@17,
83 radiation = radiation+@18,
84 slash = slash+@19,
85 stab = stab+@20,
86 starvation = starvation+@21,
87 suicide = suicide+@22,
88 thirst = thirst+@23,
89 wolf = wolf+@24,
90 autoturret = autoturret+@25,
91 landmine = landmine+@26,
92 trap = trap+@27,
93 barricade = barricade+@28";
94 private const string InsertOrUpdatePlayers =
95 @"INSERT INTO players(steamID, displayname, level, unspent_xp, x, y, z, lastIP) VALUES (@0, @1, @2, @3, @4, @5, @6, @7)
96 ON DUPLICATE KEY UPDATE
97 displayname = @1,
98 level = @2,
99 unspent_xp = @3,
100 x = @4,
101 y = @5,
102 z = @6,
103 lastIP = @7";
104 private const string Table_Players =
105 @"CREATE TABLE IF NOT EXISTS players (
106 steamID BIGINT NOT NULL PRIMARY KEY,
107 displayname VARCHAR(100),
108 level INT NOT NULL DEFAULT 0,
109 unspent_xp INT NOT NULL DEFAULT 0,
110 x FLOAT NOT NULL,
111 y FLOAT NOT NULL,
112 z FLOAT NOT NULL,
113 lastIP VARCHAR(60),
114 last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
115 first_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
116 private const string Table_Kills =
117 @"CREATE TABLE IF NOT EXISTS kills (
118 steamID BIGINT NOT NULL PRIMARY KEY,
119 autoturret INT NOT NULL DEFAULT 0,
120 barrel INT NOT NULL DEFAULT 0,
121 bear INT NOT NULL DEFAULT 0,
122 boar INT NOT NULL DEFAULT 0,
123 chicken INT NOT NULL DEFAULT 0,
124 stag INT NOT NULL DEFAULT 0,
125 helicopter INT NOT NULL DEFAULT 0,
126 horse INT NOT NULL DEFAULT 0,
127 player INT NOT NULL DEFAULT 0,
128 sleeper INT NOT NULL DEFAULT 0,
129 wolf INT NOT NULL DEFAULT 0,
130 last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);";
131 private const string Table_Deaths =
132 @"CREATE TABLE IF NOT EXISTS deaths(
133 steamID BIGINT NOT NULL PRIMARY KEY,
134 arrow INT NOT NULL DEFAULT 0,
135 bear INT NOT NULL DEFAULT 0,
136 bleeding INT NOT NULL DEFAULT 0,
137 blunt INT NOT NULL DEFAULT 0,
138 bite INT NOT NULL DEFAULT 0,
139 bullets INT NOT NULL DEFAULT 0,
140 burning INT NOT NULL DEFAULT 0,
141 cold INT NOT NULL DEFAULT 0,
142 drowning INT NOT NULL DEFAULT 0,
143 electric INT NOT NULL DEFAULT 0,
144 explosion INT NOT NULL DEFAULT 0,
145 falling INT NOT NULL DEFAULT 0,
146 generic INT NOT NULL DEFAULT 0,
147 heat INT NOT NULL DEFAULT 0,
148 helicopter INT NOT NULL DEFAULT 0,
149 player INT NOT NULL DEFAULT 0,
150 poison INT NOT NULL DEFAULT 0,
151 radiation INT NOT NULL DEFAULT 0,
152 slash INT NOT NULL DEFAULT 0,
153 stab INT NOT NULL DEFAULT 0,
154 starvation INT NOT NULL DEFAULT 0,
155 suicide INT NOT NULL DEFAULT 0,
156 thirst INT NOT NULL DEFAULT 0,
157 wolf INT NOT NULL DEFAULT 0,
158 autoturret INT NOT NULL DEFAULT 0,
159 landmine INT NOT NULL DEFAULT 0,
160 trap INT NOT NULL DEFAULT 0,
161 barricade INT NOT NULL DEFAULT 0,
162 last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);";
163 private const string Table_Misc =
164 @"CREATE TABLE IF NOT EXISTS misc (
165 steamID BIGINT NOT NULL PRIMARY KEY,
166 shots_fired INT NOT NULL DEFAULT 0,
167 shots_hit INT NOT NULL DEFAULT 0,
168 headshots INT NOT NULL DEFAULT 0,
169 longest_shot FLOAT NOT NULL DEFAULT 0,
170 rockets_fired INT NOT NULL DEFAULT 0,
171 explosives_thrown INT NOT NULL DEFAULT 0,
172 heals INT NOT NULL DEFAULT 0,
173 wounded INT NOT NULL DEFAULT 0,
174 last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);";
175 private const string Table_Crafting =
176 @"CREATE TABLE IF NOT EXISTS crafting (
177 steamID BIGINT NOT NULL PRIMARY KEY,
178 built INT NOT NULL DEFAULT 0,
179 demolished INT NOT NULL DEFAULT 0,
180 repaired INT NOT NULL DEFAULT 0,
181 upgraded INT NOT NULL DEFAULT 0,
182 rotated INT NOT NULL DEFAULT 0,
183 bone INT NOT NULL DEFAULT 0,
184 cloth INT NOT NULL DEFAULT 0,
185 leather INT NOT NULL DEFAULT 0,
186 HQM INT NOT NULL DEFAULT 0,
187 metal INT NOT NULL DEFAULT 0,
188 stone INT NOT NULL DEFAULT 0,
189 sulphur INT NOT NULL DEFAULT 0,
190 wood INT NOT NULL DEFAULT 0,
191 crafted INT NOT NULL DEFAULT 0,
192 last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);";
193 private const string Table_PVPKills =
194 @"CREATE TABLE IF NOT EXISTS crafting (
195 attackerID BIGINT NOT NULL PRIMARY KEY,
196 victimID BIGINT NOT NULL PRIMARY KEY,
197 distance FLOAT NOT NULL DEFAULT 0,
198 bone VARCHAR(50),
199 weapon VARCHAR(50),
200
201 )";
202 #endregion Prepared Statements
203
204 [ChatCommand("update")]
205 void cmdUpdate(BasePlayer sender, string command, object[] args)
206 {
207 UpdateAll();
208 }
209
210 void Init()
211 {
212 _mySqlConnection = _mySql.OpenDb("91.134.116.225", 3306, "rust", "rust_user1", "ZAj&MBP%LTDn5agw", this);
213 #region TableQuery
214 _mySql.Query(Sql.Builder.Append(Table_Players), _mySqlConnection, list => { });
215 _mySql.Query(Sql.Builder.Append(Table_Kills), _mySqlConnection, list => { });
216 _mySql.Query(Sql.Builder.Append(Table_Deaths), _mySqlConnection, list => { });
217 _mySql.Query(Sql.Builder.Append(Table_Misc), _mySqlConnection, list => { });
218 _mySql.Query(Sql.Builder.Append(Table_Crafting), _mySqlConnection, list => { });
219
220 #endregion
221 foreach (var player in BasePlayer.activePlayerList)
222 {
223 SetUpDictionary(player);
224 var sql = Sql.Builder.Append(InsertNewPlayer, player.userID, rust.QuoteSafe(player.displayName), player.ExperienceLevel, player.UnspentXp, player.transform.position.x, player.transform.position.y, player.transform.position.z, player.net.connection.ipaddress);
225 _mySql.Query(sql, _mySqlConnection, list => { });
226 }
227 }
228 void Unloaded()
229 {
230 UpdateAll();
231 _mySql.CloseDb(_mySqlConnection);
232 }
233 void OnServerSave()
234 {
235 UpdateAll();
236 }
237 void OnPlayerDisconnected(BasePlayer player, string reason)
238 {
239 UpdateTable_Crafting(player.userID);
240 UpdateTable_Deaths(player.userID);
241 UpdateTable_Kills(player.userID);
242 UpdateTable_Misc(player.userID);
243
244 stats.Remove(player.userID);
245 longshots.Remove(player.userID);
246 }
247 void OnPlayerInit(BasePlayer player)
248 {
249 SetUpDictionary(player);
250 }
251 void OnItemCraftFinished(ItemCraftTask task, Item item)
252 {
253 stats[task.owner.userID]["crafted"] += item.amount;
254 }
255 void OnCollectiblePickup(Item item, BasePlayer player)
256 {
257 if (item.info.displayName.english.Contains("Wood"))
258 stats[player.userID]["resources_wood"] += item.amount;
259 if(item.info.displayName.english.Contains("Stone"))
260 stats[player.userID]["resources_stone"] += item.amount;
261 if (item.info.displayName.english.Contains("Cloth"))
262 stats[player.userID]["resources_cloth"] += item.amount;
263 if (item.info.displayName.english.Contains("Sulfur"))
264 stats[player.userID]["resources_sulphur"] += item.amount;
265 if (item.info.displayName.english.Equals("Metal Ore"))
266 stats[player.userID]["resources_metal"] += item.amount;
267 if (item.info.displayName.english.Contains("High Quality"))
268 stats[player.userID]["resources_HQM"] += item.amount;
269 if (item.info.displayName.english.Contains("Bone"))
270 stats[player.userID]["resources_bone"] += item.amount;
271 if (item.info.displayName.english.Contains("Leather"))
272 stats[player.userID]["resources_leather"] += item.amount;
273 }
274 void OnPlantGather(PlantEntity plant, Item item, BasePlayer player)
275 {
276 if (item.info.displayName.english.Contains("Wood"))
277 stats[player.userID]["resources_wood"] += item.amount;
278 if (item.info.displayName.english.Contains("Stone"))
279 stats[player.userID]["resources_stone"] += item.amount;
280 if (item.info.displayName.english.Contains("Cloth"))
281 stats[player.userID]["resources_cloth"] += item.amount;
282 if (item.info.displayName.english.Contains("Sulfur"))
283 stats[player.userID]["resources_sulphur"] += item.amount;
284 if (item.info.displayName.english.Equals("Metal Ore"))
285 stats[player.userID]["resources_metal"] += item.amount;
286 if (item.info.displayName.english.Contains("High Quality"))
287 stats[player.userID]["resources_HQM"] += item.amount;
288 if (item.info.displayName.english.Contains("Bone"))
289 stats[player.userID]["resources_bone"] += item.amount;
290 if (item.info.displayName.english.Contains("Leather"))
291 stats[player.userID]["resources_leather"] += item.amount;
292 }
293 void OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item)
294 {
295 if(entity.ToPlayer() != null)
296 {
297 if (item.info.displayName.english.Contains("Wood"))
298 stats[entity.ToPlayer().userID]["resources_wood"] += item.amount;
299 if (item.info.displayName.english.Contains("Stone"))
300 stats[entity.ToPlayer().userID]["resources_stone"] += item.amount;
301 if (item.info.displayName.english.Contains("Cloth"))
302 stats[entity.ToPlayer().userID]["resources_cloth"] += item.amount;
303 if (item.info.displayName.english.Contains("Sulfur"))
304 stats[entity.ToPlayer().userID]["resources_sulphur"] += item.amount;
305 if (item.info.displayName.english.Equals("Metal Ore"))
306 stats[entity.ToPlayer().userID]["resources_metal"] += item.amount;
307 if (item.info.displayName.english.Contains("High Quality"))
308 stats[entity.ToPlayer().userID]["resources_HQM"] += item.amount;
309 if (item.info.displayName.english.Contains("Bone"))
310 stats[entity.ToPlayer().userID]["resources_bone"] += item.amount;
311 if (item.info.displayName.english.Contains("Leather"))
312 stats[entity.ToPlayer().userID]["resources_leather"] += item.amount;
313 }
314
315 }
316 void OnWeaponFired(BaseProjectile projectile, BasePlayer player, ItemModProjectile mod, ProtoBuf.ProjectileShoot projectiles)
317 {
318 stats[player.userID]["shots_fired"]++;
319 }
320 void OnHealingItemUse(HeldEntity item, BasePlayer target)
321 {
322 stats[target.userID]["heals"]++;
323 }
324 void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
325 {
326 if (entity.PrefabName.Contains("heli"))
327 stats[lastHeliHit.userID]["kills_helicopter"]++;
328 if (info.InitiatorPlayer != null)
329 {
330 if (!longshots.ContainsKey(info.InitiatorPlayer.userID))
331 longshots.Add(info.InitiatorPlayer.userID, info.ProjectileDistance);
332 else
333 {
334 if(longshots[info.InitiatorPlayer.userID] < info.ProjectileDistance)
335 longshots[info.InitiatorPlayer.userID] = info.ProjectileDistance;
336 }
337
338 var prefab = entity.PrefabName;
339 if (prefab.Contains("autoturret"))
340 stats[info.InitiatorPlayer.userID]["kills_autoturret"]++;
341 if (prefab.Contains("barrel"))
342 stats[info.InitiatorPlayer.userID]["kills_barrel"]++;
343 if (prefab.Contains("bear"))
344 stats[info.InitiatorPlayer.userID]["kills_bear"]++;
345 if (prefab.Contains("boar"))
346 stats[info.InitiatorPlayer.userID]["kills_boar"]++;
347 if (prefab.Contains("chicken"))
348 stats[info.InitiatorPlayer.userID]["kills_chicken"]++;
349 if (prefab.Contains("horse"))
350 stats[info.InitiatorPlayer.userID]["kills_horse"]++;
351 if (prefab.Contains("stag"))
352 stats[info.InitiatorPlayer.userID]["kills_stag"]++;
353 if (entity.ToPlayer() != null)
354 {
355 if(entity.ToPlayer() != info.InitiatorPlayer)
356 {
357 stats[info.InitiatorPlayer.userID]["kills_player"]++;
358 }
359 }
360 if (entity.ToPlayer() != null && entity.ToPlayer().IsSleeping())
361 {
362 stats[info.InitiatorPlayer.userID]["kills_sleeper"]++;
363 }
364 if (prefab.Contains("wolf"))
365 stats[info.InitiatorPlayer.userID]["kills_wolf"]++;
366 }
367 if(entity.ToPlayer() != null)
368 {
369 var prefab = info.Initiator.PrefabName;
370
371 if (prefab.Contains("bear"))
372 stats[entity.ToPlayer().userID]["deaths_bear"]++;
373 if (prefab.Contains("wolf"))
374 stats[entity.ToPlayer().userID]["deaths_wolf"]++;
375 if (prefab.Contains("heli"))
376 stats[entity.ToPlayer().userID]["deaths_helicopter"]++;
377 if (prefab.Contains("beartrap"))
378 stats[entity.ToPlayer().userID]["deaths_trap"]++;
379 if (prefab.Contains("landmine"))
380 stats[entity.ToPlayer().userID]["deaths_landmine"]++;
381 if (prefab.Contains("barricade"))
382 stats[entity.ToPlayer().userID]["deaths_barricade"]++;
383 if (prefab.Contains("autoturret"))
384 stats[entity.ToPlayer().userID]["deaths_autoturret"]++;
385 if (info.InitiatorPlayer != null && info.InitiatorPlayer != entity.ToPlayer())
386 stats[entity.ToPlayer().userID]["deaths_player"]++;
387 if(info.damageTypes.GetMajorityDamageType() == DamageType.Arrow)
388 stats[entity.ToPlayer().userID]["deaths_arrow"]++;
389 if (info.damageTypes.GetMajorityDamageType() == DamageType.Bleeding)
390 stats[entity.ToPlayer().userID]["deaths_bleeding"]++;
391 if (info.damageTypes.GetMajorityDamageType() == DamageType.Blunt)
392 stats[entity.ToPlayer().userID]["deaths_blunt"]++;
393 if (info.damageTypes.GetMajorityDamageType() == DamageType.Bite)
394 stats[entity.ToPlayer().userID]["deaths_bite"]++;
395 if (info.damageTypes.GetMajorityDamageType() == DamageType.Bullet)
396 stats[entity.ToPlayer().userID]["deaths_bullets"]++;
397 if (info.damageTypes.GetMajorityDamageType() == DamageType.Heat)
398 stats[entity.ToPlayer().userID]["deaths_heat"]++;
399 if (info.damageTypes.GetMajorityDamageType() == DamageType.Fall)
400 stats[entity.ToPlayer().userID]["deaths_falling"]++;
401 if (info.damageTypes.GetMajorityDamageType() == DamageType.Cold || info.damageTypes.GetMajorityDamageType() == DamageType.ColdExposure)
402 stats[entity.ToPlayer().userID]["deaths_cold"]++;
403 if (info.damageTypes.GetMajorityDamageType() == DamageType.Drowned)
404 stats[entity.ToPlayer().userID]["deaths_drowning"]++;
405 if (info.damageTypes.GetMajorityDamageType() == DamageType.ElectricShock)
406 stats[entity.ToPlayer().userID]["deaths_electric"]++;
407 if (info.damageTypes.GetMajorityDamageType() == DamageType.Explosion)
408 stats[entity.ToPlayer().userID]["deaths_explosion"]++;
409 if (info.damageTypes.GetMajorityDamageType() == DamageType.Generic)
410 stats[entity.ToPlayer().userID]["deaths_generic"]++;
411 if (info.damageTypes.GetMajorityDamageType() == DamageType.Poison)
412 stats[entity.ToPlayer().userID]["deaths_poison"]++;
413 if (info.damageTypes.GetMajorityDamageType() == DamageType.Radiation || info.damageTypes.GetMajorityDamageType() == DamageType.RadiationExposure)
414 stats[entity.ToPlayer().userID]["deaths_radiation"]++;
415 if (info.damageTypes.GetMajorityDamageType() == DamageType.Slash)
416 stats[entity.ToPlayer().userID]["deaths_slash"]++;
417 if (info.damageTypes.GetMajorityDamageType() == DamageType.Stab)
418 stats[entity.ToPlayer().userID]["deaths_stab"]++;
419 if (info.damageTypes.GetMajorityDamageType() == DamageType.Hunger)
420 stats[entity.ToPlayer().userID]["deaths_hunger"]++;
421 if (info.damageTypes.GetMajorityDamageType() == DamageType.Suicide || info.InitiatorPlayer == entity.ToPlayer())
422 stats[entity.ToPlayer().userID]["deaths_suicide"]++;
423 if (info.damageTypes.GetMajorityDamageType() == DamageType.Thirst)
424 stats[entity.ToPlayer().userID]["deaths_thirst"]++;
425 }
426 }
427 void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
428 {
429 if (info.InitiatorPlayer != null && entity.ToPlayer() != null || entity.PrefabName.Contains("animal"))
430 {
431 if (info.IsProjectile())
432 {
433 stats[info.InitiatorPlayer.userID]["shots_hit"]++;
434 if (info.isHeadshot)
435 stats[info.InitiatorPlayer.userID]["headshots"]++;
436 }
437 }
438 if(info.InitiatorPlayer != null && entity.PrefabName.Contains("heli"))
439 {
440 lastHeliHit = info.InitiatorPlayer;
441 }
442 }
443 void OnEntityBuilt(Planner plan, GameObject go)
444 {
445 stats[plan.GetOwnerPlayer().userID]["structures_built"]++;
446 }
447 void OnStructureDemolish(BuildingBlock block, BasePlayer player)
448 {
449 stats[player.userID]["structures_demolished"]++;
450 }
451 void OnStructureRepair(BuildingBlock block, BasePlayer player)
452 {
453 stats[player.userID]["structures_repaired"]++;
454 }
455 void OnStructureUpgrade(BuildingBlock block, BasePlayer player, BuildingGrade.Enum grade)
456 {
457 stats[player.userID]["structures_upgraded"]++;
458 }
459 void OnExplosiveThrown(BasePlayer player, BaseEntity entity)
460 {
461 stats[player.userID]["explosives_thrown"]++;
462 }
463 void OnRocketLaunched(BasePlayer player, BaseEntity entity)
464 {
465 stats[player.userID]["rockets_fired"]++;
466 }
467 void CanBeWounded(BasePlayer player, HitInfo info)
468 {
469 stats[player.userID]["wounded"]++;
470 }
471 void OnStructureRotate(BuildingBlock block, BasePlayer player)
472 {
473 stats[player.userID]["structures_rotated"]++;
474 }
475
476 void Query(Sql sql, params object[] args) => _mySql.Query(sql, _mySqlConnection, list => { });
477 Sql PrepareSQL(string sql, params object[] args) => Sql.Builder.Append(sql, args);
478 void SetUpDictionary(BasePlayer player)
479 {
480 stats.Add(player.userID, new Dictionary<string, int>
481 {
482 ["kills_autoturret"] = 0,
483 ["kills_barrel"] = 0,
484 ["kills_bear"] = 0,
485 ["kills_boar"] = 0,
486 ["kills_chicken"] = 0,
487 ["kills_stag"] = 0,
488 ["kills_helicopter"] = 0,
489 ["kills_horse"] = 0,
490 ["kills_player"] = 0,
491 ["kills_sleeper"] = 0,
492 ["kills_wolf"] = 0,
493 ["deaths_arrow"] = 0,
494 ["deaths_autoturret"] = 0,
495 ["deaths_landmine"] = 0,
496 ["deaths_barricade"] = 0,
497 ["deaths_trap"] = 0,
498 ["deaths_bear"] = 0,
499 ["deaths_bleeding"] = 0,
500 ["deaths_blunt"] = 0,
501 ["deaths_bite"] = 0,
502 ["deaths_bullets"] = 0,
503 ["deaths_burning"] = 0,
504 ["deaths_cold"] = 0,
505 ["deaths_drowning"] = 0,
506 ["deaths_electric"] = 0,
507 ["deaths_explosion"] = 0,
508 ["deaths_falling"] = 0,
509 ["deaths_generic"] = 0,
510 ["deaths_heat"] = 0,
511 ["deaths_helicopter"] = 0,
512 ["deaths_player"] = 0,
513 ["deaths_poison"] = 0,
514 ["deaths_radiation"] = 0,
515 ["deaths_slash"] = 0,
516 ["deaths_stab"] = 0,
517 ["deaths_starvation"] = 0,
518 ["deaths_suicide"] = 0,
519 ["deaths_thirst"] = 0,
520 ["deaths_wolf"] = 0,
521 ["heals"] = 0,
522 ["wounded"] = 0,
523 ["shots_fired"] = 0,
524 ["shots_hit"] = 0,
525 ["headshots"] = 0,
526 ["rockets_fired"] = 0,
527 ["explosives_thrown"] = 0,
528 ["structures_built"] = 0,
529 ["structures_demolished"] = 0,
530 ["structures_repaired"] = 0,
531 ["structures_upgraded"] = 0,
532 ["structures_rotated"] = 0,
533 ["resources_bone"] = 0,
534 ["resources_cloth"] = 0,
535 ["resources_leather"] = 0,
536 ["resources_HQM"] = 0,
537 ["resources_metal"] = 0,
538 ["resources_stone"] = 0,
539 ["resources_sulphur"] = 0,
540 ["resources_wood"] = 0,
541 ["crafted"] = 0
542 });
543 }
544
545 void UpdateAll()
546 {
547 foreach (var player in BasePlayer.activePlayerList)
548 {
549 Query(PrepareSQL(InsertOrUpdatePlayers, player.userID, rust.QuoteSafe(player.displayName), player.ExperienceLevel, player.UnspentXp, player.transform.position.x, player.transform.position.y, player.transform.position.z, player.net.connection.ipaddress));
550 }
551 foreach (var key in stats.Keys)
552 {
553 UpdateTable_Misc(key);
554 UpdateTable_Deaths(key);
555 UpdateTable_Kills(key);
556 UpdateTable_Crafting(key);
557 }
558 }
559 void UpdateTable_Deaths(ulong key)
560 {
561 Query(
562 PrepareSQL(InsertOrUpdateDeaths, key,
563 stats[key]["deaths_arrow"],
564 stats[key]["deaths_bear"],
565 stats[key]["deaths_bleeding"],
566 stats[key]["deaths_blunt"],
567 stats[key]["deaths_bite"],
568 stats[key]["deaths_bullets"],
569 stats[key]["deaths_burning"],
570 stats[key]["deaths_cold"],
571 stats[key]["deaths_drowning"],
572 stats[key]["deaths_electric"],
573 stats[key]["deaths_explosion"],
574 stats[key]["deaths_falling"],
575 stats[key]["deaths_generic"],
576 stats[key]["deaths_heat"],
577 stats[key]["deaths_helicopter"],
578 stats[key]["deaths_player"],
579 stats[key]["deaths_poison"],
580 stats[key]["deaths_radiation"],
581 stats[key]["deaths_slash"],
582 stats[key]["deaths_stab"],
583 stats[key]["deaths_starvation"],
584 stats[key]["deaths_suicide"],
585 stats[key]["deaths_thirst"],
586 stats[key]["deaths_wolf"],
587 stats[key]["deaths_autoturret"],
588 stats[key]["deaths_landmine"],
589 stats[key]["deaths_trap"],
590 stats[key]["deaths_barricade"])
591 );
592 stats[key]["deaths_arrow"] = 0;
593 stats[key]["deaths_bear"] = 0;
594 stats[key]["deaths_bleeding"] = 0;
595 stats[key]["deaths_blunt"] = 0;
596 stats[key]["deaths_bite"] = 0;
597 stats[key]["deaths_bullets"] = 0;
598 stats[key]["deaths_burning"] = 0;
599 stats[key]["deaths_cold"] = 0;
600 stats[key]["deaths_drowning"] = 0;
601 stats[key]["deaths_electric"] = 0;
602 stats[key]["deaths_explosion"] = 0;
603 stats[key]["deaths_falling"] = 0;
604 stats[key]["deaths_generic"] = 0;
605 stats[key]["deaths_heat"] = 0;
606 stats[key]["deaths_helicopter"] = 0;
607 stats[key]["deaths_player"] = 0;
608 stats[key]["deaths_poison"] = 0;
609 stats[key]["deaths_radiation"] = 0;
610 stats[key]["deaths_slash"] = 0;
611 stats[key]["deaths_stab"] = 0;
612 stats[key]["deaths_starvation"] = 0;
613 stats[key]["deaths_suicide"] = 0;
614 stats[key]["deaths_thirst"] = 0;
615 stats[key]["deaths_wolf"] = 0;
616 stats[key]["deaths_autoturret"] = 0;
617 stats[key]["deaths_landmine"] = 0;
618 stats[key]["deaths_trap"] = 0;
619 stats[key]["deaths_barricade"] = 0;
620 }
621 void UpdateTable_Misc(ulong key)
622 {
623 Query(PrepareSQL(InsertOrUpdateMisc, key,
624 stats[key]["shots_fired"],
625 stats[key]["shots_hit"],
626 stats[key]["headshots"],
627 (longshots.ContainsKey(key) ? longshots[key] : 0),
628 stats[key]["rockets_fired"],
629 stats[key]["explosives_thrown"],
630 stats[key]["heals"],
631 stats[key]["wounded"]
632 ));
633
634 if (longshots.ContainsKey(key))
635 longshots[key] = 0;
636 stats[key]["shots_fired"] = 0;
637 stats[key]["shots_hit"] = 0;
638 stats[key]["headshots"] = 0;
639 stats[key]["rockets_fired"] = 0;
640 stats[key]["explosives_thrown"] = 0;
641 stats[key]["heals"] = 0;
642 stats[key]["wounded"] = 0;
643 }
644 void UpdateTable_Kills(ulong key)
645 {
646 Query(PrepareSQL(InsertOrUpdateKills, key,
647 stats[key]["kills_autoturret"],
648 stats[key]["kills_barrel"],
649 stats[key]["kills_bear"],
650 stats[key]["kills_boar"],
651 stats[key]["kills_chicken"],
652 stats[key]["kills_stag"],
653 stats[key]["kills_helicopter"],
654 stats[key]["kills_horse"],
655 stats[key]["kills_player"],
656 stats[key]["kills_sleeper"],
657 stats[key]["kills_wolf"]
658 ));
659 stats[key]["kills_autoturret"] = 0;
660 stats[key]["kills_barrel"] = 0;
661 stats[key]["kills_bear"] = 0;
662 stats[key]["kills_boar"] = 0;
663 stats[key]["kills_chicken"] = 0;
664 stats[key]["kills_stag"] = 0;
665 stats[key]["kills_helicopter"] = 0;
666 stats[key]["kills_horse"] = 0;
667 stats[key]["kills_player"] = 0;
668 stats[key]["kills_sleeper"] = 0;
669 stats[key]["kills_wolf"] = 0;
670 }
671 void UpdateTable_Crafting(ulong key)
672 {
673 Query(PrepareSQL(InsertOrUpdateCrafting, key,
674 stats[key]["structures_built"],
675 stats[key]["structures_demolished"],
676 stats[key]["structures_repaired"],
677 stats[key]["structures_upgraded"],
678 stats[key]["resources_bone"],
679 stats[key]["resources_cloth"],
680 stats[key]["resources_leather"],
681 stats[key]["resources_HQM"],
682 stats[key]["resources_metal"],
683 stats[key]["resources_stone"],
684 stats[key]["resources_sulphur"],
685 stats[key]["resources_wood"],
686 stats[key]["crafted"],
687 stats[key]["structures_rotated"]
688 ));
689 stats[key]["structures_built"] = 0;
690 stats[key]["structures_demolished"] = 0;
691 stats[key]["structures_repaired"] = 0;
692 stats[key]["structures_upgraded"] = 0;
693 stats[key]["structures_rotated"] = 0;
694 stats[key]["resources_bone"] = 0;
695 stats[key]["resources_cloth"] = 0;
696 stats[key]["resources_leather"] = 0;
697 stats[key]["resources_HQM"] = 0;
698 stats[key]["resources_metal"] = 0;
699 stats[key]["resources_stone"] = 0;
700 stats[key]["resources_sulphur"] = 0;
701 stats[key]["resources_wood"] = 0;
702 stats[key]["crafted"] = 0;
703 }
704 }
705}