using System; using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; namespace ReallifeGamemode.Server.Managers { internal class TuningManager : Script { private static List tuningGarages = new List(); public static void LoadTuningGarages() { using (var dbContext = new DatabaseContext()) { foreach (TuningGarage garage in dbContext.TuningGarages) { AddTuningGarage(garage.Position); } } } /// /// Fügt eine Tuning-Garage zum Spiel hinzu /// /// Die Position der Garage public static void AddTuningGarage(Vector3 pos) { NAPI.Blip.CreateBlip(446, pos, 0.7f, 4, "Los Santos Customs", shortRange: true); ColShape colShape = NAPI.ColShape.CreateSphereColShape(pos, 5, 0); colShape.OnEntityEnterColShape += (cs, c) => { using var dbContext = new DatabaseContext(); if (c.IsInVehicle && c.VehicleSeat == 0 && IsPlayerAllowedToTuneVehicle(c, c.Vehicle, dbContext)) { c.TriggerEvent("showTuningInfo"); } }; colShape.OnEntityExitColShape += (cs, c) => { if (c.IsInVehicle) { c.TriggerEvent("hideTuningInfo", true); } }; tuningGarages.Add(colShape); } private static bool IsPlayerAllowedToTuneVehicle(Player c, Vehicle vehicle, DatabaseContext dbContext) { User user = c.GetUser(); if (user == null) { return false; } ServerVehicle serverVehicle = vehicle.GetServerVehicle(dbContext); if (serverVehicle == null) { return false; } if (serverVehicle is UserVehicle userVehicle && userVehicle.UserId == user.Id) { return true; } if (serverVehicle is FactionVehicle factionVehicle && factionVehicle.GetOwners().Contains(user.FactionId ?? 0)) { return true; } return false; } public static void ApplyTuningToServerVehicle(ServerVehicle sVeh) { Vehicle veh = VehicleManager.GetVehicleFromServerVehicle(sVeh); if (veh == null) return; veh.SetSharedData("mod18", false); using (var dbContext = new DatabaseContext()) { foreach (VehicleMod vMod in dbContext.VehicleMods.ToList().FindAll(vM => vM.ServerVehicleId == sVeh.Id)) { if (vMod.Slot == -2) { veh.SetSharedData("wheelType", vMod.ModId); } else if (vMod.Slot == 18) { veh.SetSharedData("mod" + vMod.Slot, true); } else if (vMod.Slot == 22) { int color = vMod.ModId - 2; if (vMod.ModId == 0) color = -1; if (vMod.ModId == 1) color = 13; veh.SetSharedData("headlightColor", color); } else veh.SetMod(vMod.Slot, vMod.ModId - 1); } } } [RemoteEvent("startPlayerTuning")] public void StartPlayerTuning(Player player) { if (!player.IsInVehicle) return; player.TriggerEvent("showTuningMenu", false, GetVehicleBasePrice(player.Vehicle)); } private int GetVehicleBasePrice(Vehicle vehicle) { if (vehicle == null) { return 0; } ServerVehicle serverVehicle = vehicle.GetServerVehicle(); if (serverVehicle == null) { return 0; } if (serverVehicle is UserVehicle userVehicle) { return userVehicle.Price ?? 0; } if (serverVehicle is FactionVehicle factionVehicle) { return factionVehicle.BuyPrice; } return 0; } [RemoteEvent("repairVehicle")] public void RepairVehicle(Player player) { if (!player.IsInVehicle) return; player.Vehicle.Repair(); } [RemoteEvent("setVehicleMod")] public void SetVehicleMod(Player player, int slot, int index, int price) { using var dbContext = new DatabaseContext(); User user = player.GetUser(dbContext); if (user.BankAccount.Balance < price) { player.SendNotification("Du hast nicht genug Geld für dieses Tuningteil!"); return; } else { user.BankAccount.Balance -= price; } player.TriggerEvent("SERVER:Tuning_ModSucessfull", slot, index); Vehicle pV = player.Vehicle; if (index == 0) index--; if (slot != 18) { if (slot == 22) { int color = index - 2; if (index == 0) color = -1; if (index == 1) color = 13; pV.SetSharedData("headlightColor", color); } else { pV.SetMod(slot, index - 1); } } else { bool newVal = index == -1 ? false : true; pV.SetSharedData("mod" + slot, newVal); NAPI.ClientEvent.TriggerClientEventForAll("vehicleToggleMod", pV, slot, newVal); } dbContext.SaveChanges(); ServerVehicle sV = player.Vehicle.GetServerVehicle(dbContext); if (sV == null) return; VehicleMod vMod = dbContext.VehicleMods.FirstOrDefault(m => m.ServerVehicleId == sV.Id && m.Slot == slot); if (vMod == null && index != -1) { vMod = new VehicleMod { ServerVehicleId = sV.Id, Slot = slot, ModId = index }; dbContext.VehicleMods.Add(vMod); } else if (vMod != null && index == -1) { dbContext.VehicleMods.Remove(vMod); } else { if (vMod == null) { vMod = new VehicleMod { ServerVehicleId = sV.Id, Slot = slot }; dbContext.VehicleMods.Add(vMod); } vMod.ModId = index; } dbContext.SaveChanges(); } [RemoteEvent("CLIENT:TuningManager_SetVehicleColor")] public void TuningManagerSetVehicleColor(Player player, bool primarySecondary, int color) { Vehicle veh = player.Vehicle; if (primarySecondary) { veh.PrimaryColor = color; } else { veh.SecondaryColor = color; } using var dbContext = new DatabaseContext(true); ServerVehicle serverVeh = VehicleManager.GetServerVehicleFromVehicle(veh, dbContext); if (serverVeh == null) { return; } if (primarySecondary) { serverVeh.PrimaryColor = color; } else { serverVeh.SecondaryColor = color; } dbContext.SaveChanges(); } [RemoteEvent("CLIENT:Tuning_SetVehicleWheels")] public void TuningManagerSetVehicleWheels(Player player, int wheelType, int wheelIndex, int price) { if (!player.IsInVehicle) { return; } Vehicle vehicle = player.Vehicle; using var dbContext = new DatabaseContext(); User user = player.GetUser(dbContext); if (user.BankAccount.Balance < price) { player.SendNotification("Du hast nicht genug Geld für dieses Tuningteil!"); return; } user.BankAccount.Balance -= price; player.TriggerEvent("SERVER:Tuning_SetWheelsSuccessfull", wheelType, wheelIndex); ServerVehicle serverVehicle = vehicle.GetServerVehicle(dbContext); if (serverVehicle != null) { VehicleMod typeMod = dbContext.VehicleMods.Where(m => m.ServerVehicleId == serverVehicle.Id && m.Slot == -2).FirstOrDefault(); if (typeMod == null) { typeMod = new VehicleMod() { ServerVehicleId = serverVehicle.Id, Slot = -2, ModId = wheelType }; dbContext.VehicleMods.Add(typeMod); } else { typeMod.ModId = wheelType; } VehicleMod wheelMod = dbContext.VehicleMods.Where(m => m.ServerVehicleId == serverVehicle.Id && m.Slot == 23).FirstOrDefault(); if (wheelMod == null) { wheelMod = new VehicleMod() { ServerVehicleId = serverVehicle.Id, Slot = 23, ModId = wheelIndex }; dbContext.VehicleMods.Add(wheelMod); } else { wheelMod.ModId = wheelIndex; } dbContext.SaveChanges(); } vehicle.SetMod(23, wheelIndex); vehicle.SetSharedData("wheelType", wheelType); NAPI.ClientEvent.TriggerClientEventForAll("vehicleToggleMod", vehicle, -2, wheelType); } } }