Files
reallife-gamemode/ReallifeGamemode.Server/Managers/TuningManager.cs
2021-05-08 02:46:09 +02:00

334 lines
8.5 KiB
C#

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<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 && 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.Where(vM => vM.ServerVehicleId == sVeh.Id).ToList())
{
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);
}
}
}