using System; using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Factions.Medic; using ReallifeGamemode.Server.Inventory; using ReallifeGamemode.Server.Inventory.Interfaces; using ReallifeGamemode.Server.Managers; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Types; using ReallifeGamemode.Server.Util; using ReallifeGamemode.Server.Wanted; using ReallifeGamemode.Services; /** * @overview Life of German Reallife - Events Death (Death.cs) * @author VegaZ * @copyright (c) 2008 - 2018 Life of German */ namespace ReallifeGamemode.Server.Events { public class Death : Script { [ServerEvent(Event.PlayerDeath)] public void OnPlayerDeath(Player player, Player killer, uint reason) { if (!player.IsLoggedIn()) { player.Kick(); return; } using var dbContext = new DatabaseContext(); User user = player.GetUser(dbContext); PositionManager.cuffPoints.Remove(player); //TODO: Zum Full Release entfernen if (player.HasData("togdeath")) { ChatService.SendMessage(player, "Du bist durch " + (killer?.Name ?? "Niemanden") + " gestorben: " + reason.ToString()); } int? killerId = null; float killerPosX = -1; float killerPosY = -1; float killerPosZ = -1; float killerHeading = -1; if (killer.IsLoggedIn()) { var killerUser = killer.GetUser(dbContext); if (killerUser != null) { killerId = killerUser.Id; killerPosX = killer.Position.X; killerPosY = killer.Position.Y; killerPosZ = killer.Position.Z; killerHeading = killer.Heading; if (player.HasData("inGangWar") && killer.HasData("inGangWar")) { Gangwar.Gangwar.GangwarKill(killer, player); } if (player != killer) { Autowanted.Check_AutoWanted(killer, player); string message = "~y~[HINWEIS]: " + killer.Name + " hat " + player.Name + " getötet (" + Managers.WeaponManager.GetCauseOfDeathByHash(reason) + ")"; ChatService.BroadcastAdmin(message, AdminLevel.ADMIN); } } } bool copNearby = NAPI.Pools.GetAllPlayers().Any(u => u.IsDuty() && u.IsAlive() && u.Position.DistanceToSquared(player.Position) <= 200 * 200); if (user.Wanteds > 0) { if (copNearby) { user.SetJailTime(true); Jail.Check_PutBehindBars(user); ChatService.HQMessage(user.Name + " wurde ins Gefängnis eingeliefert."); } else { ChatService.HQMessage(user.Name + " wurde soeben ins Krankenhaus eingeliefert."); } } if (user.JailTime <= 0) { player.SetData("isDead", true); user.Dead = true; if (!player.HasData("reviveSperre") && !player.HasData("inGangWar") && player.GetData("SAdminduty") == false) { //MEDIC AUFTRAG MedicTask reviveTask = new MedicTask() { Victim = player.Name, Position = player.Position, CauseOfDeath = reason.ToString(), Caller = null, Description = "Gestorben", Time = DateTime.Now, Type = MedicTaskType.REVIVE, MedicName = "none" }; Medic.AddTaskToList(reviveTask); Medic.delHealTask(player); ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " ist soeben verstorben.", new List() { 2 }); } if (player.GetUser().IsAdmin(AdminLevel.ADMIN) == true) { player.TriggerEvent("startDeathTimer", true); } else { player.TriggerEvent("startDeathTimer", false); } //TODO PICTURE NOTIFICATION + SOUND für Medics player.ClearAttachments(); List fItem = dbContext.UserItems.Where(u => u.UserId == user.Id).ToList(); foreach (var item in fItem) { IItem iItem = InventoryManager.GetItemById(item.ItemId); if (iItem is IWeaponDealItem obj) { int amount = item.Amount; Vector3 dropPosition = PlayerExtension.GetPositionFromPlayer(player, 0.6f, 0); //new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8f); Random r = new Random(); GTANetworkAPI.Object grndObject; Vector3 textPos = dropPosition; dropPosition.Z -= 1.05f; grndObject = NAPI.Object.CreateObject(3666746839, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 255, 0); GroundItem grndItem = new GroundItem { ItemId = iItem.Id, Amount = amount, Position = dropPosition }; TextLabel grndTxtLbl = NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", textPos, 5, 0.5f, 4, new Color(255, 255, 255), false, 0); GroundItem.AddGroundItem(grndItem, grndObject, grndTxtLbl); dbContext.Remove(item); } var dead = new Database.Entities.Logs.Death { VictimId = player.GetUser().Id, KillerId = killerId, KillerPositionX = killerPosX, KillerPositionY = killerPosY, KillerPositionZ = killerPosZ, KillerHeading = killerHeading, VictimPositionX = player.Position.X, VictimPositionY = player.Position.Y, VictimPositionZ = player.Position.Z, VictimHeading = player.Heading, CauseOfDeath = reason.ToString() }; dbContext.DeathLogs.Add(dead); } } Job.JobBase job = Managers.JobManager.GetJob(player.GetUser().JobId ?? -1); if (job != null) { //ChatService.SendMessage(player, "Debug1"); if (job.GetUsersInJob().Contains(player)) { //ChatService.SendMessage(player, "Debug2"); if (player.Vehicle != null) { //ChatService.SendMessage(player, "Debug3"); /*if (player.Vehicle.GetData("timerJobVehicleRespawn") == true) {*/ if (player.Vehicle.GetServerVehicle() is JobVehicle vehJ) { //ChatService.SendMessage(player, "Debug4"); player.Vehicle.ResetData("timerJobVehicleRespawn"); ServerVehicle sVeh = Managers.VehicleManager.GetServerVehicleFromVehicle(player.Vehicle); ServerVehicleExtensions.Spawn(sVeh, player.Vehicle); } else { //ChatService.SendMessage(player, "Debug5"); } //} } if (Managers.JobManager.playerTimersJobVehicleRespawn.ContainsKey(player)) { //ChatService.SendMessage(player, "Debug6"); Managers.JobManager.playerTimersJobVehicleRespawn[player].Stop(); } //ChatService.SendMessage(player, "Debug7"); player.ResetData("PilotenBase"); job.StopJob(player); ChatService.SendMessage(player, $"~y~[JOB]~s~ Du hast deinen Job ~o~{job.Name}~s~ beendet."); if (player.GetData("HatRoute") == true) { //ChatService.SendMessage(player, "Debug8"); CheckPointHandle.DeleteCheckpoints(player); player.ResetData("HatRoute"); } else { //ChatService.SendMessage(player, "Debug9"); } } else { //ChatService.SendMessage(player, "Debug10"); } } dbContext.SaveChanges(); } [RemoteEvent("RespawnPlayerAtHospital")] public void RespawnPlayerAtHospital(Player player) { player.SetData("isDead", false); using (var dbContext = new DatabaseContext()) { User u; u = player.GetUser(dbContext); u.Dead = false; dbContext.SaveChanges(); } player.RemoveAllWeapons(); MedicTask task = Medic.ReviveTasks.FirstOrDefault(t => t.Victim == player.Name); Player medicPlayer = PlayerService.GetPlayerByNameOrId(task.MedicName); Medic.RemoveTaskFromList(task); NAPI.Player.SpawnPlayer(player, new Vector3(-495.45, -336.33, 34.5), -98.36f); } } }