363 lines
9.7 KiB
C#
363 lines
9.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using GTANetworkAPI;
|
|
using Microsoft.Extensions.Logging;
|
|
using ReallifeGamemode.Database.Entities;
|
|
using ReallifeGamemode.Database.Models;
|
|
using ReallifeGamemode.Server.Extensions;
|
|
using ReallifeGamemode.Server.Log;
|
|
using ReallifeGamemode.Server.Services;
|
|
|
|
namespace ReallifeGamemode.Server.Managers
|
|
{
|
|
internal class TuningManager : Script
|
|
{
|
|
private static readonly ILogger logger = LogManager.GetLogger<TuningManager>();
|
|
private static List<ColShape> tuningGarages = new List<ColShape>();
|
|
|
|
public static void LoadTuningGarages()
|
|
{
|
|
using (var dbContext = new DatabaseContext())
|
|
{
|
|
foreach (TuningGarage garage in dbContext.TuningGarages)
|
|
{
|
|
AddTuningGarage(garage.Position);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Fügt eine Tuning-Garage zum Spiel hinzu
|
|
/// </summary>
|
|
/// <param name="pos">Die Position der Garage</param>
|
|
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)
|
|
{
|
|
c.TriggerEvent("showTuningInfo");
|
|
}
|
|
};
|
|
|
|
colShape.OnEntityExitColShape += (cs, c) =>
|
|
{
|
|
if (c.IsInVehicle)
|
|
{
|
|
c.TriggerEvent("hideTuningInfo", true);
|
|
}
|
|
};
|
|
|
|
tuningGarages.Add(colShape);
|
|
}
|
|
|
|
private static bool IsPlayerAllowedToTuneVehicle(Player c, ServerVehicle serverVehicle, DatabaseContext dbContext)
|
|
{
|
|
User user = c.GetUser();
|
|
if (user == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
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.Where(vM => vM.ServerVehicleId == sVeh.Id).OrderByDescending(v => v.Slot).ToList())
|
|
{
|
|
if (vMod.Slot == -2)
|
|
{
|
|
veh.SetSharedData("wheelType", vMod.ModId);
|
|
NAPI.ClientEvent.TriggerClientEventForAll("vehicleToggleMod", veh, -2, 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 if (vMod.Slot == 23)
|
|
{
|
|
veh.SetMod(23, vMod.ModId);
|
|
}
|
|
else veh.SetMod(vMod.Slot, vMod.ModId - 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
[RemoteEvent("startPlayerTuning")]
|
|
public void StartPlayerTuning(Player player)
|
|
{
|
|
if (!player.IsInVehicle) return;
|
|
|
|
Vehicle vehicle = player.Vehicle;
|
|
|
|
bool onlyRepair = false;
|
|
|
|
using var dbContext = new DatabaseContext();
|
|
|
|
ServerVehicle serverVehicle = vehicle.GetServerVehicle(dbContext);
|
|
if (serverVehicle is FactionVehicle factionVehicle && factionVehicle.BuyPrice == 0)
|
|
{
|
|
NotificationService.SendErrorNotification(player, "Dieses Fahrzeug kann aktuell leider nicht getunt werden");
|
|
onlyRepair = true;
|
|
}
|
|
|
|
if (!IsPlayerAllowedToTuneVehicle(player, serverVehicle, dbContext))
|
|
{
|
|
onlyRepair = true;
|
|
}
|
|
|
|
player.TriggerEvent("showTuningMenu", false, GetVehicleBasePrice(player.Vehicle), onlyRepair);
|
|
}
|
|
|
|
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;
|
|
logger.LogInformation("Player {0} bought a tuning part for server vehicle {1}, slot: {2}, mod: {3} for {4} dollars", player.Name, sV.Id, slot, index, price);
|
|
|
|
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();
|
|
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)
|
|
{
|
|
logger.LogInformation("Player {0} bought wheels for server vehicle {1}, type: {2}, wheels: {3} for {4} dollars", player.Name, serverVehicle.Id, wheelType, wheelIndex, price);
|
|
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);
|
|
}
|
|
}
|
|
}
|