diff --git a/ReallifeGamemode.Client/Gui/deathscreen.ts b/ReallifeGamemode.Client/Gui/deathscreen.ts index 5aeb9d91..904af4c4 100644 --- a/ReallifeGamemode.Client/Gui/deathscreen.ts +++ b/ReallifeGamemode.Client/Gui/deathscreen.ts @@ -6,46 +6,39 @@ export default function deathScreen() { - var playerName; - var playerId; - var playerMoney; var dutyMedics = 0; - var isDeath = false; - var deathTime; - var respawnTime; + var isDead = false; var deathSeconds; - var fade; var deathDate: Date; - var taskTimeout = false; const maxDeathTime = 120; - const medicJobTime = maxDeathTime * -1; + var respawnTime; + var fade; mp.game.gameplay.setFadeOutAfterDeath(false); - mp.events.add("startDeathTimer", (isAdmin) => { - if (isDeath === false) { - isDeath = true; - mp.gui.chat.activate(true); + mp.events.add("startDeathTimer", (isSupporter) => { + if (isDead === false) { + isDead = true; + mp.gui.chat.activate(isSupporter); mp.game.audio.playSoundFrontend(-1, "Bed", "WastedSounds", true); deathDate = new Date(); respawnTime = Math.floor(deathDate.getTime() / 1000 + maxDeathTime); fade = 255 - maxDeathTime; mp.game.graphics.requestStreamedTextureDict("Mptattoos", true); mp.events.call("GetDutyMedics"); - taskTimeout = false; } }); mp.events.add("onPlayerRevived", () => { - isDeath = false; + isDead = false; mp.gui.chat.activate(true); mp.game.gameplay.setFadeOutAfterDeath(false); mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("Mptattoos"); }); mp.events.add("respawnDeathPlayer", () => { - isDeath = false; + isDead = false; mp.gui.chat.activate(true); mp.game.gameplay.setFadeOutAfterDeath(false); mp.events.callRemote('RespawnPlayerAtHospital'); @@ -59,23 +52,24 @@ export default function deathScreen() { mp.events.add("render", () => { var currentDate = new Date(); - if (isDeath === true) { - + if (isDead === true) { var medicString; + if (dutyMedics > 0) { medicString = "Das L.S.E.D. wurde benachrichtigt\nDerzeit "; + if (dutyMedics === 1) { medicString += "befindet sich ~g~" + dutyMedics + " Mitglied"; } else { medicString += "befinden sich ~g~" + dutyMedics + " Mitglieder"; } + medicString += " ~s~im Dienst"; } else { medicString = "Derzeit befinden sich ~r~keine Einsatzkräfte ~s~im Dienst"; } deathSeconds = respawnTime - Math.floor(currentDate.getTime() / 1000); - var alpha = fade + Math.floor(currentDate.getTime() / 1000 - deathDate.getTime() / 1000); if (deathSeconds >= 0) { mp.game.graphics.set2dLayer(2); mp.game.graphics.drawSprite("Mptattoos", "clearout", 0.625, 0.5, 0.1, 0.1, 0, 255, 255, 255, 236); @@ -95,6 +89,8 @@ export default function deathScreen() { outline: true, centre: false }); + + var alpha = fade + Math.floor(currentDate.getTime() / 1000 - deathDate.getTime() / 1000); mp.game.graphics.set2dLayer(1); mp.game.graphics.drawRect(0.5, 0.5, 1, 1, 0, 0, 0, alpha); diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 3ee952f5..40675252 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; @@ -1240,7 +1240,7 @@ namespace ReallifeGamemode.Server.Commands return; } - ChatService.SendMessage(player, $"~b~[AMDIN]~s~ Das Fahrzeug ~y~{serverVehicle.Id}~s~ wurde respawnt"); + ChatService.SendMessage(player, $"~b~[ADMIN] ~s~Du hast das Fahrzeug ~b~#{serverVehicle.Id} ~s~respawnt."); Vehicle newVeh = serverVehicle.Spawn(veh); newVeh.Repair(); @@ -1258,7 +1258,7 @@ namespace ReallifeGamemode.Server.Commands if (radius > 500) { - ChatService.ErrorMessage(player, $"Der angegebene Radius ist zu hoch (Maximum: 500)"); + ChatService.ErrorMessage(player, $"Der angegebene Radius ist zu hoch (Maximum: 500 SE)"); return; } @@ -1285,7 +1285,7 @@ namespace ReallifeGamemode.Server.Commands respawnedVehicleCount++; } - ChatService.BroadcastAdmin($"~g~Fahrzeug(e) respawnt: ~s~{player.Name} hat {respawnedVehicleCount} Fahrzeuge respawnt (Radius: {radius} SE).", AdminLevel.ADMIN); + ChatService.BroadcastAdmin($"~b~[ADMIN] {player.Name} ~s~hat ~b~{respawnedVehicleCount} Fahrzeug(e) ~s~respawnt (Radius: {radius} SE).", AdminLevel.ADMIN); } [Command("sethp", "~m~Benutzung: ~s~/sethp [Spieler] (HP)")] diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index 63568241..0d8b87c2 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -197,15 +197,7 @@ namespace ReallifeGamemode.Server.Events } player.SetData("isDead", true); - - if (player.GetUser().IsAdmin(AdminLevel.ADMIN) == true) - { - player.TriggerEvent("startDeathTimer", true); - } - else - { - player.TriggerEvent("startDeathTimer", false); - } + player.TriggerEvent("startDeathTimer", user.IsAdmin(AdminLevel.SUPPORTER)); //TODO PICTURE NOTIFICATION + SOUND für Medics } diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index a7c1c4d5..7f771e97 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -194,14 +194,7 @@ namespace ReallifeGamemode.Server.Events { if (user.Dead == true) { - if (user.IsAdmin(AdminLevel.ADMIN) == true) - { - player.TriggerEvent("startDeathTimer", true); - } - else - { - player.TriggerEvent("startDeathTimer", false); - } + player.TriggerEvent("startDeathTimer", user.IsAdmin(AdminLevel.SUPPORTER)); player.SafeSetHealth(0); player.SetData("isDead", true); } diff --git a/ReallifeGamemode.Server/Managers/HanfManager.cs b/ReallifeGamemode.Server/Managers/HanfManager.cs index 3edd2d54..30cff510 100644 --- a/ReallifeGamemode.Server/Managers/HanfManager.cs +++ b/ReallifeGamemode.Server/Managers/HanfManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -32,16 +32,16 @@ namespace ReallifeGamemode.Server.Managers /// public static int SEED_PRICE = 0; - private const int SEED_PRICE_MIN = 40; - private const int SEED_PRICE_MAX = 75; + private const int SEED_PRICE_MIN = 175; + private const int SEED_PRICE_MAX = 225; /// /// Aktueller Hanf-Verkaufspreis /// public static int CANNABIS_PRICE = 0; - private const int CANNABIS_PRICE_MIN = 50; - private const int CANNABIS_PRICE_MAX = 125; + private const int CANNABIS_PRICE_MIN = 80; + private const int CANNABIS_PRICE_MAX = 140; /// /// Wie viele Samen ein Spieler pro Tag maximal kaufen darf @@ -394,6 +394,7 @@ namespace ReallifeGamemode.Server.Managers if (player.IsAdminDuty() && player.IsTSupport() && user.IsAdmin(AdminLevel.ADMIN)) { + logger.LogInformation("Admin {0} removed the cannabis plant {1} from {2}", player.Name, plant.Id, plant.PlantedBy.Name); player.SendNotification($"Du hast die Hanf-Pflanze von ~y~{plant.PlantedBy.Name}~s~ entfernt"); plant.Harvested = true; dbContext.SaveChanges(); @@ -416,6 +417,7 @@ namespace ReallifeGamemode.Server.Managers if (user.FactionId != 3 && user.FactionId != 1) // Zivi / Gangmember erntet ab { + logger.LogInformation("Player {0} harvested the cannabis plant {1} from {2}", player.Name, plant.Id, plant.PlantedBy.Name); player.SyncAnimation("harvestPlant"); plant.Harvested = true; bool isPlantRotten = DateTime.Now - plant.PlantDate > MAX_PLANT_TIME; @@ -468,6 +470,7 @@ namespace ReallifeGamemode.Server.Managers { if (!(player.HasData("IsCarryingPlant") || player.GetData("IsCarryingPlant"))) { + logger.LogInformation("Cop {0} harvested the cannabis plant {1} from {2}", player.Name, plant.Id, plant.PlantedBy.Name); player.SetData("IsCarryingPlant", true); player.SendNotification($"Du hast eine Pflanze von ~y~{plant.PlantedBy.Name}~s~ ausgegraben"); @@ -536,6 +539,8 @@ namespace ReallifeGamemode.Server.Managers InventoryManager.RemoveUserItem(user, userCannabisItem, CANNABIS_NEEDED_FOR_JOINT); InventoryManager.AddItemToInventory(player, jointItem.Id, 1); + logger.LogInformation("Player {0} used the joint manufacturer to build {1} cannabis to 1 joint", player.Name, CANNABIS_NEEDED_FOR_JOINT); + player.SendNotification($"Du hast {CANNABIS_NEEDED_FOR_JOINT} Hanfblüten in einen Joint verarbeitet"); NAPI.ClientEvent.TriggerClientEventInRange(player.Position, 100.0f, "SERVER:Hanf_PlayManufacturerAnim", _manufacturerAnim); @@ -641,6 +646,7 @@ namespace ReallifeGamemode.Server.Managers var price = amount * CANNABIS_PRICE; user.Handmoney += price; InventoryManager.RemoveUserItem(user, cannabisUserItem, amount); + dbContext.SaveChanges(); logger.LogInformation("Player {0} sold {1} cannabis to the server for {2} dollars", player.Name, amount, price); diff --git a/ReallifeGamemode.Server/Managers/InventoryManager.cs b/ReallifeGamemode.Server/Managers/InventoryManager.cs index a2ff976f..6bebc678 100644 --- a/ReallifeGamemode.Server/Managers/InventoryManager.cs +++ b/ReallifeGamemode.Server/Managers/InventoryManager.cs @@ -341,15 +341,24 @@ namespace ReallifeGamemode.Server.Managers veh = new NetHandle(vehicleItems[player].FirstOrDefault().vehicle, EntityType.Vehicle).Entity(); ServerVehicle serverVehicle = VehicleManager.GetServerVehicleFromVehicle(veh, context); - VehicleItem vehItem = context.VehicleItems.Where(v => v.VehicleId == serverVehicle.Id && v.ItemId == itemID).FirstOrDefault(); + + if (serverVehicle.Locked || VehicleStreaming.GetLockState(veh)) + { + player.TriggerEvent("Error", "Transfer nicht möglich."); + return; + } + + VehicleItem vehItem = context.VehicleItems.Where(v => v.VehicleId == serverVehicle.Id && v.ItemId == itemID && v.Amount >= itemAmount).FirstOrDefault(); if (vehItem == null) { player.TriggerEvent("Error", "Transfer nicht möglich."); return; } + + IItem item = GetItemById(itemID); + if (serverVehicle is FactionVehicle factionVehicle) { - IItem item = GetItemById(itemID); if (factionVehicle.Model == VehicleHash.Riot && user.Faction?.StateOwned == true) { player.TriggerEvent("Error", "Transfer nicht möglich."); @@ -357,6 +366,8 @@ namespace ReallifeGamemode.Server.Managers } } + logger.LogInformation("Player {0} transferred the item {1} ({2}, amount: {3}) from vehicle {4} to his inventory", player.Name, item.Name, item.Id, itemAmount, serverVehicle.Id); + RemoveVehicleItem(serverVehicle, vehItem, itemAmount, player); SetVehicleItems(player); @@ -364,7 +375,6 @@ namespace ReallifeGamemode.Server.Managers SetBackpackItems(player); context.SaveChanges(); - IItem iItem = GetItemById(vehItem.ItemId); } } diff --git a/ReallifeGamemode.Server/Managers/VehicleManager.cs b/ReallifeGamemode.Server/Managers/VehicleManager.cs index 130f312d..f6bc6317 100644 --- a/ReallifeGamemode.Server/Managers/VehicleManager.cs +++ b/ReallifeGamemode.Server/Managers/VehicleManager.cs @@ -1139,10 +1139,17 @@ namespace ReallifeGamemode.Server.Managers { using (var dbContext = new DatabaseContext()) { - Vehicle vehicle = NAPI.Pools.GetAllVehicles().Find(v => v.Id == id); ServerVehicle sV = vehicle.GetServerVehicle(dbContext); + var items = InventoryManager.GetVehicleItems(vehicle); + if (items.Any()) + { + string itemsStr = string.Join(", ", items.Select(i => $"{i.ItemId} (amount: {i.Amount})")); + logger.LogInformation("Vehicle {0} died and lost the items: {1}", sV.Id, itemsStr); + InventoryManager.RemoveAllItemsfromVehicleInventory(vehicle); + } + if (sV is UserVehicle uV) { if(vehicle.Class == 14) //boot @@ -1186,7 +1193,6 @@ namespace ReallifeGamemode.Server.Managers Vehicle newVeh = sV.Spawn(vehicle); newVeh.Repair(); } - InventoryManager.RemoveAllItemsfromVehicleInventory(vehicle); } } diff --git a/ReallifeGamemode.Server/Services/ChatService.cs b/ReallifeGamemode.Server/Services/ChatService.cs index fa3b1165..6f5cda7d 100644 --- a/ReallifeGamemode.Server/Services/ChatService.cs +++ b/ReallifeGamemode.Server/Services/ChatService.cs @@ -42,7 +42,6 @@ namespace ReallifeGamemode.Server.Services public static void SendMessage(Player player, string message) { if (player == null) return; - if (player.GetData("isDead") == true && (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true)) return; player.SendChatMessage(message); }