diff --git a/ReallifeGamemode.Client/Gui/deathscreen.ts b/ReallifeGamemode.Client/Gui/deathscreen.ts index 375f989a..8374bd18 100644 --- a/ReallifeGamemode.Client/Gui/deathscreen.ts +++ b/ReallifeGamemode.Client/Gui/deathscreen.ts @@ -36,7 +36,8 @@ export default function deathScreen() { deathDate = new Date(); respawnTime = Math.floor(deathDate.getTime() / 1000 + maxDeathTime); fade = 255 - maxDeathTime; - mp.game.graphics.requestStreamedTextureDict("Mptattoos", true); + mp.game.graphics.requestStreamedTextureDict("Mptattoos", true); + mp.events.call("GetDutyMedics"); taskTimeout = false; } }); diff --git a/ReallifeGamemode.Client/Interaction/factioninteraction.ts b/ReallifeGamemode.Client/Interaction/factioninteraction.ts index f10a8a11..8bf52a93 100644 --- a/ReallifeGamemode.Client/Interaction/factioninteraction.ts +++ b/ReallifeGamemode.Client/Interaction/factioninteraction.ts @@ -272,7 +272,8 @@ export default function factionInteraction(globalData: IGlobalData) { factionInteractionMenu.Close(); mp.gui.chat.activate(true); globalData.InMenu = false; - mp.events.call("destroyMedicTaskCheckpoint"); + mp.events.callRemote("updateMedicTask", 1, activeTask.Victim, true); + mp.events.call("destroyMedicTaskCheckpoint"); break; } @@ -318,11 +319,10 @@ export default function factionInteraction(globalData: IGlobalData) { } else { if (tasks[index].MedicName === "none") { mp.game.graphics.requestStreamedTextureDict("medicimages", true); - mp.events.callRemote("updateMedicTask", 0, tasks[index].Victim); + mp.events.callRemote("updateMedicTask", 0, tasks[index].Victim, false); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.checkpoints.new(4, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { - direction: new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 5), color: [255, 0, 0, 150], visible: true, dimension: 0 @@ -357,7 +357,7 @@ export default function factionInteraction(globalData: IGlobalData) { } aTask1.SetRightLabel(mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, tasks[i].Position.x, tasks[i].Position.y, tasks[i].Position.z, true).toFixed(2).toString() + " ~g~m"); - healTaskMenuMedic.AddItem(aTask1); + healTaskMenuMedic.AddItem(aTask1); } let backItem1 = new UIMenuItem("Zur\u00fcck", "Zur\u00fcck zur Fraktionsinteraktion."); @@ -370,13 +370,12 @@ export default function factionInteraction(globalData: IGlobalData) { healTaskMenuMedic.Close(); factionInteractionMenu.Visible = true; } else { - if (tasks[index].MedicName === "none") { + if (tasks[index].MedicName === "none" && tasks[index].Victim != mp.players.local.name) { mp.game.graphics.requestStreamedTextureDict("medicimages", true); - mp.events.callRemote("updateMedicTask", 1, tasks[index].Victim); + mp.events.callRemote("updateMedicTask", 1, tasks[index].Victim, false); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.checkpoints.new(4, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { - direction: new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 5), color: [255, 0, 0, 150], visible: true, dimension: 0 @@ -430,17 +429,19 @@ export default function factionInteraction(globalData: IGlobalData) { mp.events.add('updateHealCheckpoint', (xPos, yPos, zPos) => { if (activeTask && activeTask.Type == 1) { - activeCheckpoint.destroy(); - activeCheckpoint = null; - activeCheckpoint = mp.checkpoints.new(4, new mp.Vector3(xPos, yPos, zPos - 2), 3.0, - { - direction: new mp.Vector3(xPos, yPos, zPos - 5), - color: [255, 0, 0, 150], - visible: true, - dimension: 0 - }); - - mp.game.ui.setNewWaypoint(xPos, yPos); + if (activeCheckpoint && mp.checkpoints.exists(activeCheckpoint)) { + activeCheckpoint.destroy(); + activeCheckpoint = mp.checkpoints.new(4, new mp.Vector3(xPos, yPos, zPos - 2), 3.0, + { + color: [255, 0, 0, 150], + visible: true, + dimension: 0 + }); + mp.game.ui.setNewWaypoint(xPos, yPos); + taskFinish.x = xPos; + taskFinish.y = yPos; + taskFinish.z = zPos; + } } }); diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index cc07d242..0efa1b6e 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -468,7 +468,7 @@ namespace ReallifeGamemode.Server.Commands if (target.GetData("duty") == true) { target.SetData("duty", false); - Medic.UpdateDutyMedics(-1); + Medic.UpdateDutyMedics(); } string adminPlayername = NAPI.Player.GetPlayerName(player); @@ -784,7 +784,7 @@ namespace ReallifeGamemode.Server.Commands if (target.GetData("duty") == true) { target.SetData("duty", false); - Medic.UpdateDutyMedics(-1); + Medic.UpdateDutyMedics(); } string adminPlayername = NAPI.Player.GetPlayerName(player); @@ -879,7 +879,7 @@ namespace ReallifeGamemode.Server.Commands if (target.GetData("duty") == true) { target.SetData("duty", false); - Medic.UpdateDutyMedics(-1); + Medic.UpdateDutyMedics(); } reason = Regex.Replace(reason, "(~[a-zA-Z]~)|(!{(.*)})", ""); diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index 3d8993d1..faeeb590 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -97,7 +97,7 @@ namespace ReallifeGamemode.Server.Events user.Dead = true; - if (!player.HasData("reviveSperre")) + if (!player.HasData("reviveSperre") || !player.HasData("inGangWar") || player.GetData("SAdminduty") == true) { //MEDIC AUFTRAG MedicTask reviveTask = new MedicTask() diff --git a/ReallifeGamemode.Server/Events/Disconnect.cs b/ReallifeGamemode.Server/Events/Disconnect.cs index 886357c5..de3dd8c8 100644 --- a/ReallifeGamemode.Server/Events/Disconnect.cs +++ b/ReallifeGamemode.Server/Events/Disconnect.cs @@ -152,7 +152,7 @@ namespace ReallifeGamemode.Server.Events if (player.GetData("duty") == true) { player.SetData("duty", false); - Medic.UpdateDutyMedics(-1); + Medic.UpdateDutyMedics(); } } } diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 2d5761fb..c1867b2a 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -298,7 +298,7 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("toggleDutyMode", true); if (player.GetUser().FactionId == 2) //Fire Department { - Medic.UpdateDutyMedics(1); + Medic.UpdateDutyMedics(); } switch (factionId) { @@ -336,7 +336,7 @@ namespace ReallifeGamemode.Server.Events user.SetData("duty", false); player.SendNotification("Du bist nun ~r~außer Dienst."); player.TriggerEvent("toggleDutyMode", false); - Medic.UpdateDutyMedics(-1); + Medic.UpdateDutyMedics(); UpdateCharacterCloth.LoadCharacterDefaults(player); } user.SetBlipAndNametagColor(); diff --git a/ReallifeGamemode.Server/Factions/Medic/Medic.cs b/ReallifeGamemode.Server/Factions/Medic/Medic.cs index 89c8fbe7..3d060783 100644 --- a/ReallifeGamemode.Server/Factions/Medic/Medic.cs +++ b/ReallifeGamemode.Server/Factions/Medic/Medic.cs @@ -209,23 +209,38 @@ namespace ReallifeGamemode.Server.Factions.Medic } [RemoteEvent("updateMedicTask")] - public void UpdateMedicTasks(Player player, int type, string victim) + public void UpdateMedicTasks(Player player, int type, string victim, bool isRemoved) { Player target = PlayerService.GetPlayerByNameOrId(victim); switch (type) { case 0: var reviveTask = ReviveTasks.FirstOrDefault(t => t.Victim == victim); - reviveTask.MedicName = player.Name; + if (isRemoved) + { + reviveTask.MedicName = "none"; + } + else + { + reviveTask.MedicName = player.Name; + } + ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Reviveauftrag von " + victim + " angenommen.", new List() { 2 }); target.SendNotification("~w~Sanitäter~g~ " + player.Name + "~w~ eilt zur Rettung."); break; case 1: - var healTask = ReviveTasks.FirstOrDefault(t => t.Victim == victim); - healTask.MedicName = player.Name; - ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Healauftrag von " + victim + " angenommen.", new List() { 2 }); - target.SendNotification("~w~Sanitäter~g~ " + player.Name + "~w~ hat deinen Auftrag angenommen."); + var healTask = HealTasks.FirstOrDefault(t => t.Victim == victim); + if (isRemoved) + { + healTask.MedicName = "none"; + } + else + { + healTask.MedicName = player.Name; + ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Healauftrag von " + victim + " angenommen.", new List() { 2 }); + target.SendNotification("~w~Sanitäter~g~ " + player.Name + "~w~ hat deinen Auftrag angenommen."); + } break; case 2: @@ -273,10 +288,11 @@ namespace ReallifeGamemode.Server.Factions.Medic RemoveTaskFromList(task); } } - - public static void UpdateDutyMedics(int modifier) + [RemoteEvent("GetDutyMedics")] + public static void UpdateDutyMedics() { - dutyMedics = dutyMedics + modifier; + + dutyMedics = NAPI.Pools.GetAllPlayers().Where(c => c.GetData("duty") == true && c.GetUser().FactionId == 2).ToList().Count; NAPI.ClientEvent.TriggerClientEventForAll("updateDutyMedics", dutyMedics); } } diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index 5d9c8f7d..e1d9768b 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -133,81 +133,73 @@ namespace ReallifeGamemode.Server.Gangwar private void update() { - #region Ticket system - - /* - try + NAPI.Task.Run(() => { - Player[] owners = NAPI.Pools.GetAllPlayers().Where(c => c.GetUser().Faction.Name == this.Owner).ToArray(); - Player[] attackers = NAPI.Pools.GetAllPlayers().Where(c => c.GetUser().Faction.Name == this.Attacker).ToArray(); - }catch(NullReferenceException ex) - { - int i = 0; - foreach(var c in playerInGangwar) + foreach (Player gangwarPlayer in this.playerInGangwar) { - if (!NAPI.Entity.DoesEntityExist(c.Handle)) + if (!gangwarPlayer.IsLoggedIn()) { - this.playerInside = this.playerInside.Where(gp => gp != c).ToArray(); + continue; } - i++; + + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, 900 - timerCount); } - } - if (owners.Length > attackers.Length) - this.Att_Score -= owners.Length - attackers.Length; - if(owners.Length < attackers.Length) - this.Def_Score -= attackers.Length - owners.Length; - */ - - #endregion Ticket system - - foreach (Player gangwarPlayer in this.playerInGangwar) - { - gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, 900 - timerCount); - } - /*if (this.Att_Score >= 200) - { - this.takeOver(this.Attacker); - } - else if (this.Def_Score >= 200) - { - this.takeOver(this.Owner); - }*/ - timerCount += 1; - if (timerCount >= 10) //change to 900 (seconds) before release for testing reasons change to whatever you like - { - if (this.Att_Score > this.Def_Score) + /*if (this.Att_Score >= 200) { - foreach (Player gangwarPlayer in this.playerInGangwar) - { - gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); - } this.takeOver(this.Attacker); - this.Def_Score = 0; - return; } - else if (this.Att_Score < this.Def_Score) + else if (this.Def_Score >= 200) { - foreach (Player gangwarPlayer in this.playerInGangwar) - { - gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); - } this.takeOver(this.Owner); - this.Att_Score = 0; - return; - } - else if (this.Def_Score == this.Att_Score) + }*/ + timerCount += 1; + if (timerCount >= 900) //change to 900 (seconds) before release for testing reasons change to whatever you like { - foreach (Player gangwarPlayer in this.playerInGangwar) + if (this.Att_Score > this.Def_Score) { - gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); + foreach (Player gangwarPlayer in this.playerInGangwar) + { + if (!gangwarPlayer.IsLoggedIn()) + { + continue; + } + + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); + } + this.takeOver(this.Attacker); + this.Def_Score = 0; + return; + } + else if (this.Att_Score < this.Def_Score) + { + foreach (Player gangwarPlayer in this.playerInGangwar) + { + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); + } + this.takeOver(this.Owner); + this.Att_Score = 0; + return; + } + else if (this.Def_Score == this.Att_Score) + { + foreach (Player gangwarPlayer in this.playerInGangwar) + { + if (!gangwarPlayer.IsLoggedIn()) + { + continue; + } + + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); + } + this.takeOver(this.Owner); + this.Def_Score = 0; + return; } - this.takeOver(this.Owner); - this.Def_Score = 0; - return; } - } + }); } + public void enter(Player client) { User user = client.GetUser(); @@ -215,7 +207,7 @@ namespace ReallifeGamemode.Server.Gangwar { if (user.Faction.Name != getOwner() && user.Faction.Name != getAttacker()) return; - Player gPlayer = playerInGangwar.Where(c => c != null && !c.Handle.IsNull && c.IsLoggedIn() && c.GetUser().Id == user.Id).FirstOrDefault(); + Player gPlayer = playerInGangwar.Where(c => c != null && !c.Handle.IsNull && c.IsLoggedIn() && c.GetUser()?.Id == user.Id).FirstOrDefault(); if (gPlayer == null) { using (var dbContext = new DatabaseContext()) @@ -257,13 +249,11 @@ namespace ReallifeGamemode.Server.Gangwar Player[] attackers = NAPI.Pools.GetAllPlayers().Where(c => c.IsLoggedIn() && c.GetUser().Faction.Name == this.Attacker).ToArray(); foreach (var o in owners) { - if (o != null) - o.TriggerEvent("CLIENT:win"); + o.TriggerEvent("CLIENT:win"); } foreach (var a in attackers) { - if (a != null) - a.TriggerEvent("CLIENT:loose"); + a.TriggerEvent("CLIENT:loose"); } ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion hat erfolgreich das Gebiet ~g~" + getName() + "~w~ verteidigt.", dbContext.Factions.Where(f => f.Name == getOwner()).FirstOrDefault()); ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion hat den Angrif auf das Gebiet ~r~" + getName() + "~w~ verloren.", dbContext.Factions.Where(f => f.Name == getAttacker()).FirstOrDefault()); @@ -272,15 +262,8 @@ namespace ReallifeGamemode.Server.Gangwar else if (getOwner() != FactionName) { ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte das Gebiet ~r~" + getName() + "~w~ nicht verteidigen.", dbContext.Factions.Where(f => f.Name == getOwner()).FirstOrDefault()); - Console.WriteLine("[DEBUG:GANGWAR] getting owners..."); Player[] owners = NAPI.Pools.GetAllPlayers().Where(c => c.IsLoggedIn() && c.GetUser().Faction.Name == this.Owner).ToArray(); - Console.WriteLine($"[DEBUG:GANGWAR] got owners {owners}."); - Console.WriteLine($"[DEBUG:GANGWAR] got owners {owners.ToString()}."); - - Console.WriteLine("[DEBUG:GANGWAR] getting attackers..."); Player[] attackers = NAPI.Pools.GetAllPlayers().Where(c => c.IsLoggedIn() && c.GetUser().Faction.Name == this.Attacker).ToArray(); - Console.WriteLine($"[DEBUG:GANGWAR] got attackers {attackers}."); - Console.WriteLine($"[DEBUG:GANGWAR] got attackers {attackers.ToString()}."); foreach (var o in owners) { if (o != null) @@ -303,6 +286,11 @@ namespace ReallifeGamemode.Server.Gangwar this.Attacker = null; foreach (var c in playerInGangwar) { + if (!c.IsLoggedIn()) + { + continue; + } + c.TriggerEvent("CLIENT:setAttackBlip", false, TurfID); c.ResetData("inGangWar"); c.ResetData("GotInsideOfTurf"); diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index b1c04dfc..ce9c081a 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -255,7 +255,7 @@ namespace ReallifeGamemode.Server.Managers target.SetData("duty", false); target.TriggerEvent("toggleDutyMode", false); - Medic.UpdateDutyMedics(-1); + Medic.UpdateDutyMedics(); UpdateCharacterCloth.LoadCharacterDefaults(target); target.GetUser(dbContext).FactionRankId = null; target.GetUser(dbContext).FactionId = null; @@ -834,6 +834,7 @@ namespace ReallifeGamemode.Server.Managers { Medic.AddTaskToList(healTask); player.SetData("healauftrag", true); + player.SendNotification("~w~Du hast einen Sanitäter um Hilfe gerufen"); ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat soeben einen Serviceauftrag beantragt.", new List() { 2 }); } } diff --git a/ReallifeGamemode.Server/Util/FactionHelper.cs b/ReallifeGamemode.Server/Util/FactionHelper.cs index 5424dfb6..1f54c2d0 100644 --- a/ReallifeGamemode.Server/Util/FactionHelper.cs +++ b/ReallifeGamemode.Server/Util/FactionHelper.cs @@ -39,7 +39,7 @@ namespace ReallifeGamemode.Server.Util if (player.GetData("duty") == true) { player.SetData("duty", false); - Medic.UpdateDutyMedics(-1); + Medic.UpdateDutyMedics(); } var userClothes = dbContext.CharacterClothes.Where(c => c.UserId == user.Id && c.Duty == true);