diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 4a29423d..858e40f7 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -1300,13 +1300,11 @@ namespace ReallifeGamemode.Server.Commands if (serverVehicle == null) { VehicleManager.DeleteVehicle(v); - v.Trailer?.Delete(); + VehicleManager.DeleteVehicle(v.Trailer); continue; } Vehicle newVeh = serverVehicle.Spawn(v); - newVeh.Repair(); - newVeh.Rotation = new Vector3(0, 0, serverVehicle.Heading); respawnedVehicleCount++; } diff --git a/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs b/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs index 5e4c3c38..170b9681 100644 --- a/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs +++ b/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs @@ -15,19 +15,32 @@ namespace ReallifeGamemode.Server.Extensions public static Vehicle GetVehicle(this ServerVehicle veh) => VehicleManager.GetVehicleFromServerVehicle(veh); - public static Vehicle Spawn(this ServerVehicle veh, Vehicle currentVeh = null) + public static Vehicle Spawn(this ServerVehicle veh, Vehicle currentVeh) { - if (currentVeh != null) VehicleManager.DeleteVehicle(currentVeh); + if (currentVeh == null) + { + currentVeh = VehicleManager.GetVehicleFromServerVehicle(veh); + } + + if(currentVeh != null) + { + VehicleManager.DeleteVehicle(currentVeh); + } + Vector3 position = veh.Position; uint model = (uint)veh.Model; float heading = veh.Heading; int c1 = veh.PrimaryColor; int c2 = veh.SecondaryColor; + Vehicle newVeh = NAPI.Vehicle.CreateVehicle(model, position, heading, c1, c2, "", 255, false, false); + veh.Livery = veh.Livery; VehicleStreaming.SetEngineState(newVeh, false); VehicleStreaming.SetLockStatus(newVeh, veh.Locked); + VehicleManager.AddVehicle(veh, newVeh); + newVeh.Rotation = new Vector3(0, 0, heading); newVeh.SetSharedData("drivenDistance", veh.DistanceDriven); @@ -71,6 +84,7 @@ namespace ReallifeGamemode.Server.Extensions { numberplate = "NV" + numberplate; } + NAPI.Vehicle.SetVehicleNumberPlate(newVeh, numberplate); veh.NumberPlate = numberplate; diff --git a/ReallifeGamemode.Server/Managers/BusinessManager.cs b/ReallifeGamemode.Server/Managers/BusinessManager.cs index 77ad2d06..e55a250e 100644 --- a/ReallifeGamemode.Server/Managers/BusinessManager.cs +++ b/ReallifeGamemode.Server/Managers/BusinessManager.cs @@ -168,13 +168,13 @@ namespace ReallifeGamemode.Server.Managers player.TriggerEvent("SERVER:Util_setWaypoint", spawnPos.X, spawnPos.Y); - User u = player.GetUser(dbContext); + User user = player.GetUser(dbContext); ServerVehicle newVeh = null; if (target == "Spieler") { - TransactionResult result = BankManager.TransferMoney(u, business, price, "Auto gekauft", dbContext); + TransactionResult result = BankManager.TransferMoney(user, business, price, "Auto gekauft", dbContext); if (result == TransactionResult.SENDER_NOT_ENOUGH_MONEY) { player.SendNotification("~r~Du hast nicht genug Geld: " + price.ToMoneyString()); @@ -190,7 +190,7 @@ namespace ReallifeGamemode.Server.Managers PositionY = spawnPos.Y, PositionZ = spawnPos.Z, Locked = false, - UserId = player.GetUser().Id, + UserId = user.Id, Model = shopVehicle.Model, PrimaryColor = 111, SecondaryColor = 111, @@ -200,7 +200,7 @@ namespace ReallifeGamemode.Server.Managers } else if (target == "Fraktion") { - var faction = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == u.FactionId).First(); + var faction = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == user.FactionId).First(); TransactionResult result = BankManager.TransferMoney(faction, business, (int)(price * FACTION_CAR_MULTIPLIER), "Auto gekauft", dbContext); if (result == TransactionResult.SENDER_NOT_ENOUGH_MONEY) { @@ -216,7 +216,7 @@ namespace ReallifeGamemode.Server.Managers PositionY = spawnPos.Y, PositionZ = spawnPos.Z, Locked = false, - Owners = JsonConvert.SerializeObject(new int[] { player.GetUser(dbContext).FactionId.Value }), + Owners = JsonConvert.SerializeObject(new int[] { user.FactionId.Value }), Model = shopVehicle.Model, PrimaryColor = 111, SecondaryColor = 111, @@ -243,7 +243,7 @@ namespace ReallifeGamemode.Server.Managers dbContext.ServerVehicles.Add(newVeh); dbContext.SaveChanges(); - newVeh.Spawn(); + newVeh.Spawn(null); } } diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index 1cc4b1a4..75ac2599 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -491,10 +491,10 @@ namespace ReallifeGamemode.Server.Managers ChatService.SendMessage(player, $"~b~[INFO]~s~ Du hast durch den Autoverkauf ~g~{backPrice.ToMoneyString()}~s~ erhalten."); + VehicleManager.DeleteVehicle(veh); + dbContext.UserVehicles.Remove(userVehicle); dbContext.SaveChanges(); - - veh?.Delete(); } [RemoteEvent("CLIENT:InteractionMenu_FactionVehicleInteraction")] @@ -552,10 +552,10 @@ namespace ReallifeGamemode.Server.Managers ChatService.SendMessage(player, $"~b~[INFO]~s~ Die Fraktionskasse ~g~{backPrice.ToMoneyString()}~s~ erhalten."); + VehicleManager.DeleteVehicle(veh); + dbContext.FactionVehicles.Remove(factionVehicle); dbContext.SaveChanges(); - - veh?.Delete(); } } diff --git a/ReallifeGamemode.Server/Managers/LoadManager.cs b/ReallifeGamemode.Server/Managers/LoadManager.cs index a7ab3190..d898e5e4 100644 --- a/ReallifeGamemode.Server/Managers/LoadManager.cs +++ b/ReallifeGamemode.Server/Managers/LoadManager.cs @@ -29,10 +29,12 @@ namespace ReallifeGamemode.Server.Managers foreach (ServerVehicle veh in dbContext.ServerVehicles) { - if (!veh.Active) continue; + if (!veh.Active) + { + continue; + } - Vehicle current = veh.Spawn(); - TuningManager.ApplyTuningToServerVehicle(veh); + veh.Spawn(null); } } } diff --git a/ReallifeGamemode.Server/Managers/VehicleManager.cs b/ReallifeGamemode.Server/Managers/VehicleManager.cs index e4f05cae..923a6112 100644 --- a/ReallifeGamemode.Server/Managers/VehicleManager.cs +++ b/ReallifeGamemode.Server/Managers/VehicleManager.cs @@ -1,8 +1,10 @@ using GTANetworkAPI; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; +using ReallifeGamemode.Server.Log; using ReallifeGamemode.Server.Util; using System; using System.Collections.Generic; @@ -777,6 +779,8 @@ namespace ReallifeGamemode.Server.Managers private static readonly Dictionary lastPositions = new Dictionary(); private static DateTime lastSave = DateTime.UtcNow; + private static ILogger logger = LogManager.GetLogger(); + public static void CheckEnabledMods() { foreach (var name in _enabledMods) @@ -851,11 +855,13 @@ namespace ReallifeGamemode.Server.Managers { if (_serverVehicles.ContainsKey(serverVehicle.Id)) { - return; + logger.LogCritical("Server Vehicle {Id} already has a spawned vehicle", serverVehicle.Id); + _serverVehicles[serverVehicle.Id].Entity().Delete(); } if (_serverVehicles.ContainsValue(vehicle.Handle)) { + logger.LogCritical("Vehicle handle {Handle} already belongs"); return; } @@ -870,7 +876,7 @@ namespace ReallifeGamemode.Server.Managers _serverVehicles.Remove(sVeh.Id); } - veh.Delete(); + veh?.Delete(); } public static Vehicle GetVehicleFromHandle(NetHandle handle) @@ -941,20 +947,15 @@ namespace ReallifeGamemode.Server.Managers public static void VehicleManagerVehicleDeath(Vehicle vehicle) { ServerVehicle serverVehicle = GetServerVehicleFromVehicle(vehicle); - NAPI.Util.ConsoleOutput("VehicleDeat: Debug 1"); if (serverVehicle == null) { - NAPI.Util.ConsoleOutput("VehicleDeath: Debug 2"); vehicle.Delete(); return; } InventoryManager.RemoveAllItemsfromVehicleInventory(vehicle); - - NAPI.Util.ConsoleOutput("VehicleDeath: Debug 3"); - Vehicle newVeh = serverVehicle.Spawn(vehicle); - newVeh.Repair(); - newVeh.Rotation = new Vector3(0, 0, serverVehicle.Heading); + + serverVehicle.Spawn(vehicle); } [RemoteEvent("CLIENT:setMarkerBehindVehicle")]