146 lines
6.2 KiB
C#
146 lines
6.2 KiB
C#
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<dynamic>((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<Task> 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);
|
|
}
|
|
}
|
|
}
|
|
|
|
} |