using System; using System.Threading; using System.Threading.Tasks; using CitizenFX.Core; using static CitizenFX.Core.Native.API; using Nexd.ESX.Client; namespace CardealerClient.Exhibits { public class ExhibitCar { public int Vehicle { get; set; } public Exhibit Exhibit { get; set; } public VehicleData Data { get; set; } public bool TestDrive { get; set; } public ExhibitCar(dynamic data) { Vehicle = 0; Exhibit = Config.CarSlots[0]; Data = new VehicleData(data); TestDrive = false; } public ExhibitCar() {} public ExhibitCar(Exhibit exhibit, VehicleData data) { Vehicle = 0; Exhibit = exhibit; Data = data; TestDrive = false; } public async void Spawn() { int vehicle = await CarDealer.SpawnVehicle(Convert.ToInt32(Data.Properties.Raw.model), Config.ToVector(Exhibit.Location), Exhibit.Location.W, true); Vehicle veh = new Vehicle(vehicle); ESX.Game.SetVehicleProperties(veh, Data.Properties); SetVehicleNumberPlateText(vehicle, Data.Properties.plate); SetEntityInvincible(vehicle, true); SetVehicleDoorsLocked(vehicle, 2); FreezeEntityPosition(vehicle, true); SetVehicleOnGroundProperly(vehicle); BaseScript.TriggerServerEvent("ls:mainCheck", Data.Properties.plate, vehicle, true); /*CarDealer.RealExhibitCars[Exhibit.Slot] = new ExhibitCar() { Vehicle = vehicle, Exhibit = Exhibit, Data = Data, TestDrive = TestDrive };*/ Vehicle = vehicle; BaseScript.TriggerEvent("cardealer:getCarName", Data.Properties.Raw.model, new Action((name => { CarDealer.CarNames[Exhibit.Slot] = Convert.ToString(name); }))); } public void Despawn() { ESX.Game.DeleteVehicle(Vehicle.ToString()); CarDealer.RealExhibitCars[Exhibit.Slot] = null; CarDealer.SlotReady[Exhibit.Slot] = false; } public async void StartTestDrive() { BaseScript.TriggerServerEvent("cardealer:testDrive", Exhibit.Slot, true); Vector3 lastPosition = GetEntityCoords(GetPlayerPed(-1), IsDecalAlive(GetPlayerPed(-1))); Vector3 spawnCoords = Config.ToVector(Config.TestDriveLocation); bool testDrive = true; int vehicle = await CarDealer.SpawnVehicle(Data.Properties.Raw.model, spawnCoords, Config.TestDriveLocation.W); ESX.Game.SetVehicleProperties(new Vehicle(vehicle), Data.Properties); SetVehicleOnGroundProperly(vehicle); SetVehicleEngineHealth(vehicle, 1000); SetVehicleFixed(vehicle); SetVehicleDirtLevel(vehicle, 0); SetVehicleDoorsLocked(vehicle, 1); TaskWarpPedIntoVehicle(GetPlayerPed(-1), vehicle, -1); SetPlayerCanDoDriveBy(PlayerId(), false); BaseScript.TriggerEvent("craftix:refuelVehicle", vehicle); BaseScript.TriggerEvent("crafix:dontCheckVehicle", vehicle); Func handler = async () => { if (!testDrive) return; if (IsControlJustReleased(0, 75)) { testDrive = false; SetPlayerCanDoDriveBy(PlayerId(), true); ESX.Game.DeleteVehicle(vehicle.ToString()); SetEntityCoords(GetPlayerPed(-1), lastPosition.X, lastPosition.Y, lastPosition.Z, true, false, false, false); BaseScript.TriggerServerEvent("cardealer:testDrive", Exhibit.Slot, false); } }; CarDealer.AddTickHandler(handler); await BaseScript.Delay(Config.TestDriveTime); CarDealer.RemoveTickHandler(handler); if (testDrive) { testDrive = false; SetPlayerCanDoDriveBy(PlayerId(), true); ESX.Game.DeleteVehicle(vehicle.ToString()); SetEntityCoords(GetPlayerPed(-1), lastPosition.X, lastPosition.Y, lastPosition.Z, true, false, false, false); BaseScript.TriggerServerEvent("cardealer:testDrive", Exhibit.Slot, false); } } public void SetTestDrive(bool value) { TestDrive = value; if (TestDrive && Vehicle != 0) ESX.Game.DeleteVehicle(Vehicle.ToString()); else if (!TestDrive) Spawn(); CarDealer.SlotReady[Exhibit.Slot] = true; } public async void Buy() { if (!await CarDealer.DisplayConfirmationDialog("Möchtest du dieses Fahrzeug wirklich kaufen?")) return; bool permitted = await CarDealer.ServerCallback("cardealer:checkMoney", Data.Price); if (!permitted) { CarDealer.Notify("Du hast nicht genügend Geld!", "error"); return; } BaseScript.TriggerServerEvent("cardealer:transaction", Data.Owner, Data.Price); Data.Delete(); int vehicle = await CarDealer.SpawnVehicle(Data.Properties.Raw.model, Config.ToVector(Config.SpawnLocation), Config.SpawnLocation.W); ESX.Game.SetVehicleProperties(new Vehicle(vehicle), Data.Properties); SetVehicleNumberPlateText(vehicle, Data.Properties.plate); SetVehicleEngineHealth(vehicle, 1000); SetVehicleFixed(vehicle); SetVehicleDirtLevel(vehicle, 0); TaskWarpPedIntoVehicle(GetPlayerPed(-1), vehicle, -1); BaseScript.TriggerEvent("craftix:refuelVehicle", vehicle); BaseScript.TriggerServerEvent("esx_vehicleshop:setVehicleOwned", ESX.Game.Raw.GetVehicleProperties(vehicle)); } public static void RepairVehicles() { foreach (var car in CarDealer.RealExhibitCars) { if (car is null || car.TestDrive) continue; int vehicle = car.Vehicle; SetVehicleEngineHealth(vehicle, 1000); SetVehicleEngineOn(vehicle, false, false, true); SetVehicleFixed(vehicle); SetVehicleDirtLevel(vehicle, 0); } } } }