Files
reallife-gamemode/ReallifeGamemode.Server/Managers/VehicleManager.cs

208 lines
6.0 KiB
C#

using GTANetworkAPI;
using ReallifeGamemode.Server.Entities;
using ReallifeGamemode.Server.Models;
using System;
using System.Collections.Generic;
using System.Timers;
namespace ReallifeGamemode.Server.Managers
{
public class VehicleManager
{
private static readonly List<string> _enabledMods = new List<string>()
{
"models",
"polamggtr",
"impaler3",
"monster4",
"monster5",
"slamvan6",
"issi6",
"cerberus2",
"cerberus3",
"deathbike2",
"dominator6",
"deathbike3",
"impaler4",
"slamvan4",
"slamvan5",
"brutus",
"brutus2",
"brutus3",
"deathbike",
"dominator4",
"dominator5",
"bruiser",
"bruiser2",
"bruiser3",
"rcbandito",
"italigto",
"cerberus",
"impaler2",
"monster3",
"tulip",
"scarab",
"scarab2",
"scarab3",
"issi4",
"issi5",
"clique",
"deveste",
"vamos",
"imperator",
"imperator2",
"imperator3",
"toros",
"deviant",
"schlagen",
"impaler",
"zr380",
"zr3802",
"zr3803",
"flashgt",
"gb200",
"dominator3"
};
private static readonly Dictionary<int, NetHandle> _serverVehicles = new Dictionary<int, NetHandle>();
private static readonly Dictionary<NetHandle, Vector3> lastPositions = new Dictionary<NetHandle, Vector3>();
private static DateTime lastSave = DateTime.UtcNow;
public static void StartTimer()
{
Timer timer = new Timer(500);
timer.Elapsed += VehicleTimerTick;
timer.Start();
}
private static void VehicleTimerTick(object sender, ElapsedEventArgs e)
{
NAPI.Pools.GetAllVehicles().ForEach(v =>
{
Vector3 lastPosition = v.Position;
if (lastPositions.ContainsKey(v.Handle)) lastPosition = lastPositions[v.Handle];
double distanceDriven = v.HasSharedData("drivenDistance") ? v.GetSharedData("drivenDistance") : 0D;
distanceDriven += (lastPosition.DistanceTo(v.Position) / 1000.0);
v.SetSharedData("drivenDistance", (float)distanceDriven);
lastPositions[v.Handle] = v.Position;
});
if (DateTime.UtcNow.Subtract(lastSave).Seconds >= 30)
{
lastSave = DateTime.UtcNow;
// save to db
using (var dbContext = new DatabaseContext())
{
foreach (var key in lastPositions.Keys)
{
Vehicle v = key.Entity<Vehicle>();
if (!v.HasSharedData("drivenDistance")) continue;
ServerVehicle sVeh = VehicleManager.GetServerVehicleFromVehicle(v, dbContext);
if (sVeh == null) continue;
sVeh.DistanceDriven = (float)v.GetSharedData("drivenDistance");
}
dbContext.SaveChanges();
}
}
}
public static void AddVehicle(ServerVehicle serverVehicle, Vehicle vehicle)
{
if(_serverVehicles.ContainsKey(serverVehicle.Id))
{
return;
}
if (_serverVehicles.ContainsValue(vehicle.Handle))
{
return;
}
_serverVehicles[serverVehicle.Id] = vehicle.Handle;
}
internal static void DeleteVehicle(Vehicle veh)
{
ServerVehicle sVeh;
if ((sVeh = GetServerVehicleFromVehicle(veh)) != null)
{
_serverVehicles.Remove(sVeh.Id);
}
veh.Delete();
}
public static Vehicle GetVehicleFromHandle(NetHandle handle)
{
return NAPI.Pools.GetAllVehicles().Find(v => v.Handle == handle);
}
public static Vehicle GetVehicleFromId(int id)
{
return NAPI.Pools.GetAllVehicles().Find(v => v.Handle.Value == id);
}
public static Vehicle GetVehicleFromServerVehicle(ServerVehicle serverVehicle)
{
if(!_serverVehicles.ContainsKey(serverVehicle.Id))
{
return null;
}
return GetVehicleFromHandle(_serverVehicles[serverVehicle.Id]);
}
public static ServerVehicle GetServerVehicleFromVehicle(Vehicle veh, DatabaseContext dbContext = null)
{
if(dbContext == null)
{
using (dbContext = new DatabaseContext())
{
foreach (KeyValuePair<int, NetHandle> pair in _serverVehicles)
{
if (pair.Value == veh.Handle)
{
return dbContext.ServerVehicles.Find(pair.Key);
}
}
}
}
else
{
foreach (KeyValuePair<int, NetHandle> pair in _serverVehicles)
{
if (pair.Value == veh.Handle)
{
return dbContext.ServerVehicles.Find(pair.Key);
}
}
}
return null;
}
public static bool IsValidHash(uint hash)
{
foreach(VehicleHash vh in Enum.GetValues(typeof(VehicleHash)))
{
if ((uint)vh == hash) return true;
}
foreach(string mod in _enabledMods)
{
if (NAPI.Util.GetHashKey(mod) == hash) return true;
}
return false;
}
}
}