diff --git a/ReallifeGamemode.Client/Tuning/main.ts b/ReallifeGamemode.Client/Tuning/main.ts index 66414bb5..23d08583 100644 --- a/ReallifeGamemode.Client/Tuning/main.ts +++ b/ReallifeGamemode.Client/Tuning/main.ts @@ -43,7 +43,7 @@ export default function tuning(globalData: IGlobalData) { { Slot: 15, Name: "Federung", Price: 2000 }, { Slot: 18, Name: "Turbo", BasePercentage: 45, PriceIncreasePerLevel: 0 }, { Slot: 22, Name: "Licht", Price: 500 }, - { Slot: -2, Name: "Reifen", Price: 1000 }, + { Slot: -2, Name: "Reifen", Price: 3000 }, { Slot: -1, Name: "Lackierung", Price: 1000 }, { Slot: 25, Name: "Nummernschildhalter", Price: 500 }, { Slot: 27, Name: "Innenausstatung", Price: 500 }, @@ -117,6 +117,49 @@ export default function tuning(globalData: IGlobalData) { } ]; + const wheelTypes = [ + { + Name: "Sport", + Type: 0, + }, + { + Name: "Muscle", + Type: 1, + }, + { + Name: "Lowrider", + Type: 2, + }, + { + Name: "SUV", + Type: 3, + }, + { + Name: "Offroad", + Type: 4, + }, + { + Name: "Tuner", + Type: 5, + }, + { + Name: "High End", + Type: 7, + }, + { + Name: "Benny's Originals", + Type: 8, + }, + { + Name: "Benny's Bespoke", + Type: 9, + }, + { + Name: "Street", + Type: 11, + } + ]; + var mainMenu: NativeUI.Menu; mp.events.add('showTuningInfo', () => { @@ -209,10 +252,11 @@ export default function tuning(globalData: IGlobalData) { return; } else if (modType == -2) { var wheelsItem = new UIMenuItem("Reifen"); - var wheelsMenu = getWheelsMenu(); + var wheelsMenu = getWheelsMenu(localVehicle); mainMenu.AddItem(wheelsItem); mainMenu.BindMenuToItem(wheelsMenu, wheelsItem); + return; } var num = localVehicle.getNumMods(modType); @@ -497,11 +541,99 @@ export default function tuning(globalData: IGlobalData) { } } - function getWheelsMenu(): NativeUI.Menu { + var currentWheelType = null; + var currentWheel = null; + var currentWheelItem: NativeUI.UIMenuItem = null; + var wheelPrice = getModSlotPrice(-2, 0, 0); + var currentSelectedWheelItem: NativeUI.UIMenuItem = null; + + function getWheelsMenu(vehicle: VehicleMp): NativeUI.Menu { var wheelsMenu = new NativeUI.Menu("Reifen", "rollin on dem rims", new NativeUI.Point(0, screenRes.y / 3)); + + currentWheelType = vehicle.getWheelType(); + currentWheel = vehicle.getMod(23); + currentWheelItem = null; + + wheelTypes.forEach(wheelType => { + var type = wheelType.Type; + + var modsLoaded = false; + + var menuOpenTime: number = null; + + var typeItem = new UIMenuItem(wheelType.Name); + wheelsMenu.AddItem(typeItem); + + var wheelTypeMenu = new Menu(wheelType.Name, "skyr", new Point(0, screenRes.y / 3)); + + wheelsMenu.BindMenuToItem(wheelTypeMenu, typeItem); + + wheelTypeMenu.IndexChange.on((index: number) => { + vehicle.setMod(23, index); + }); + + wheelTypeMenu.MenuOpen.on(() => { + menuOpenTime = Date.now(); + vehicle.setWheelType(type); + if (modsLoaded) { + return; + } + + var wheelNums = vehicle.getNumMods(23); + + for (var i = 0; i < wheelNums; i++) { + var modText = ""; + + modText = mp.game.ui.getLabelText(vehicle.getModTextLabel(23, i)); + if (modText === "NULL") modText = getModName(vehicle, 23, i); + + var item = new VehicleModMenuItem(modText); + + if (type == currentWheelType && i == currentWheel) { + currentWheelItem = item; + currentWheelItem.SetRightBadge(BadgeStyle.Car); + } else { + item.SetRightLabel("$" + moneyformat(wheelPrice)); + } + + wheelTypeMenu.AddItem(item); + } + + modsLoaded = true; + }); + + wheelTypeMenu.ItemSelect.on((item, index: number) => { + if (Date.now() - menuOpenTime < 500 || item == currentWheelItem) { + return; + } + + currentSelectedWheelItem = item; + mp.events.callRemote("CLIENT:Tuning_SetVehicleWheels", type, index, wheelPrice); + }); + + wheelTypeMenu.MenuClose.on(() => { + vehicle.setWheelType(currentWheelType); + vehicle.setMod(23, currentWheel); + }) + }); + return wheelsMenu; } + mp.events.add("SERVER:Tuning_SetWheelsSuccessfull", (type, index) => { + currentWheelType = type; + currentWheel = index; + + if (currentWheelItem) { + currentWheelItem.SetRightLabel("$" + moneyformat(wheelPrice)); + currentWheelItem.SetRightBadge(BadgeStyle.None); + } + + currentWheelItem = currentSelectedWheelItem; + currentWheelItem.SetRightBadge(BadgeStyle.Car); + currentWheelItem.SetRightLabel(""); + }) + function getColorMenu(): NativeUI.Menu { var currentColors = mp.players.local.vehicle.getColours(0, 0); diff --git a/ReallifeGamemode.Client/Tuning/sync.ts b/ReallifeGamemode.Client/Tuning/sync.ts index 1ff457cf..bd23fcb6 100644 --- a/ReallifeGamemode.Client/Tuning/sync.ts +++ b/ReallifeGamemode.Client/Tuning/sync.ts @@ -11,6 +11,11 @@ if (taxiLight) vehicle.setTaxiLights(taxiLight); var mod18 = vehicle.getVariable('mod18'); + var wheelType = vehicle.getVariable('wheelType'); + + if (wheelType !== undefined) { + vehicle.setWheelType(wheelType); + } if (mod18 !== undefined) { vehicle.toggleMod(18, mod18); @@ -22,8 +27,13 @@ if (!veh) { return; } - - veh.toggleMod(slot, newval); + if (slot == -2) { + veh.setWheelType(newval); + } + else { + veh.toggleMod(slot, newval); + } + }); mp.events.addDataHandler("vehicleTaxiLight", (entity: VehicleMp, state: boolean) => { diff --git a/ReallifeGamemode.Server/Managers/TuningManager.cs b/ReallifeGamemode.Server/Managers/TuningManager.cs index 3799c5eb..f1199c33 100644 --- a/ReallifeGamemode.Server/Managers/TuningManager.cs +++ b/ReallifeGamemode.Server/Managers/TuningManager.cs @@ -44,7 +44,7 @@ namespace ReallifeGamemode.Server.Managers colShape.OnEntityExitColShape += (cs, c) => { - if(c.IsInVehicle) + if (c.IsInVehicle) { c.TriggerEvent("hideTuningInfo", true); } @@ -56,23 +56,23 @@ namespace ReallifeGamemode.Server.Managers private static bool IsPlayerAllowedToTuneVehicle(Player c, Vehicle vehicle, DatabaseContext dbContext) { User user = c.GetUser(); - if(user == null) + if (user == null) { return false; } ServerVehicle serverVehicle = vehicle.GetServerVehicle(dbContext); - if(serverVehicle == null) + if (serverVehicle == null) { return false; } - if(serverVehicle is UserVehicle userVehicle && userVehicle.UserId == user.Id) + if (serverVehicle is UserVehicle userVehicle && userVehicle.UserId == user.Id) { return true; } - if(serverVehicle is FactionVehicle factionVehicle && factionVehicle.GetOwners().Contains(user.FactionId ?? 0)) + if (serverVehicle is FactionVehicle factionVehicle && factionVehicle.GetOwners().Contains(user.FactionId ?? 0)) { return true; } @@ -117,23 +117,23 @@ namespace ReallifeGamemode.Server.Managers private int GetVehicleBasePrice(Vehicle vehicle) { - if(vehicle == null) + if (vehicle == null) { return 0; } ServerVehicle serverVehicle = vehicle.GetServerVehicle(); - if(serverVehicle == null) + if (serverVehicle == null) { return 0; } - if(serverVehicle is UserVehicle userVehicle) + if (serverVehicle is UserVehicle userVehicle) { return userVehicle.Price ?? 0; } - if(serverVehicle is FactionVehicle factionVehicle) + if (serverVehicle is FactionVehicle factionVehicle) { return factionVehicle.BuyPrice; } @@ -257,5 +257,69 @@ namespace ReallifeGamemode.Server.Managers 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); + + 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; + } + + vehicle.SetSharedData("wheelType", wheelType); + NAPI.ClientEvent.TriggerClientEventForAll("vehicleToggleMod", vehicle, -2, wheelType); + + dbContext.SaveChanges(); + } } }