From d5b249e8e1eae008e00339ed574a01983a9a1974 Mon Sep 17 00:00:00 2001 From: hydrant Date: Wed, 28 Nov 2018 19:36:46 +0100 Subject: [PATCH] Rewrite of vehicle system --- Model/DatabaseContext.cs | 7 ++++ Server/Commands/Admin.cs | 9 +++-- Server/Entities/FactionVehicles.cs | 21 ++--------- Server/Entities/ServerVehicle.cs | 40 +++++++++++++++++++++ Server/Entities/ShopVehicles.cs | 22 ++---------- Server/Entities/UserVehicle.cs | 20 ++--------- Server/Extensions/VehicleExtension.cs | 31 ----------------- Server/Managers/LoadManager.cs | 47 +++++++++++-------------- Server/Managers/SaveManager.cs | 50 +++++++++------------------ Server/Managers/VehicleManager.cs | 39 +++++++++++++++++++++ Server/Saves/SavedVehicle.cs | 23 ++---------- Server/Util/DatabaseHelper.cs | 2 +- 12 files changed, 137 insertions(+), 174 deletions(-) create mode 100644 Server/Entities/ServerVehicle.cs delete mode 100644 Server/Extensions/VehicleExtension.cs create mode 100644 Server/Managers/VehicleManager.cs diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 7cf90449..b90f80fa 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -37,6 +37,10 @@ namespace reallife_gamemode.Model modelBuilder.Entity() .HasIndex(u => u.BusinessId) .IsUnique(true); + + modelBuilder.Entity() + .Property(sv => sv.Active) + .HasDefaultValue(true); } //User @@ -80,5 +84,8 @@ namespace reallife_gamemode.Model // Control Panel public DbSet News { get; set; } + + // Server Vehicles + public DbSet ServerVehicles { get; set; } } } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index a8e4ba5d..72a3851f 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1835,7 +1835,7 @@ namespace reallife_gamemode.Server.Commands var dataSet = new UserVehicle { UserId = player.GetUser().Id, - Model = (VehicleHash) playerVehicle.Model, + Model = (VehicleHash)playerVehicle.Model, PositionX = playerVehicle.Position.X, PositionY = playerVehicle.Position.Y, PositionZ = playerVehicle.Position.Z, @@ -1844,8 +1844,7 @@ namespace reallife_gamemode.Server.Commands PrimaryColor = Convert.ToByte(playerVehicle.PrimaryColor), SecondaryColor = Convert.ToByte(playerVehicle.SecondaryColor), Locked = playerVehicle.Locked, - Engine = playerVehicle.EngineStatus, - Dimension = Convert.ToByte(playerVehicle.Dimension), + Active = true }; playerVehicle.SetData("ownerId",player.GetUser().Id); saveVehicle.UserVehicles.Add(dataSet); @@ -1928,10 +1927,10 @@ namespace reallife_gamemode.Server.Commands { ShopVehicle sVehicle = getShopVehicle.ShopVehicles.FirstOrDefault(u => u.Id == shopVehicleId); Entities.Faction receiverUser = getShopVehicle.Factions.FirstOrDefault(u => u.Name == "LSPD"); - BankManager.TransferMoney(player.GetUser(), receiverUser, sVehicle.Price, "Fahrzeug gekauft: " + sVehicle.ModelName); + BankManager.TransferMoney(player.GetUser(), receiverUser, sVehicle.Price, "Fahrzeug gekauft: " + NAPI.Vehicle.GetVehicleDisplayName(sVehicle.Model)); //TODO Anpassen Vehicle boughtVehicle = NAPI.Vehicle.CreateVehicle(sVehicle.Model, new Vector3(sVehicle.PositionX, sVehicle.PositionY + 10, sVehicle.PositionZ + 0.5), sVehicle.Heading, - sVehicle.PrimaryColor, sVehicle.SecondaryColor, "LoG", sVehicle.Alpha, false, true, 0); + sVehicle.PrimaryColor, sVehicle.SecondaryColor, "LoG", 255, false, true, 0); player.SetIntoVehicle(boughtVehicle, 0); //TODO fügt das Fahrzeug als Userfahrzeug hinzu CmdAdminOwn(player); diff --git a/Server/Entities/FactionVehicles.cs b/Server/Entities/FactionVehicles.cs index 3e67d3cc..dc9c77d6 100644 --- a/Server/Entities/FactionVehicles.cs +++ b/Server/Entities/FactionVehicles.cs @@ -14,28 +14,11 @@ using System.Text; namespace reallife_gamemode.Server.Entities { - public class FactionVehicle + [Table("FactionVehicles")] + public class FactionVehicle : ServerVehicle { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } [ForeignKey("Faction")] public int? FactionId { get; set; } public Faction Faction { get; set; } - - public VehicleHash Model { get; set; } - public float PositionX { get; set; } - public float PositionY { get; set; } - public float PositionZ { get; set; } - public float Heading { get; set; } - [StringLength(8)] - public string NumberPlate { get; set; } - public byte Alpha { get; set; } - public byte PrimaryColor { get; set; } - public byte SecondaryColor { get; set; } - public bool Locked { get; set; } - public bool Engine { get; set; } - public byte Dimension { get; set; } - public bool Active { get; set; } } } diff --git a/Server/Entities/ServerVehicle.cs b/Server/Entities/ServerVehicle.cs new file mode 100644 index 00000000..8d614f17 --- /dev/null +++ b/Server/Entities/ServerVehicle.cs @@ -0,0 +1,40 @@ +using GTANetworkAPI; +using reallife_gamemode.Model; +using reallife_gamemode.Server.Managers; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace reallife_gamemode.Server.Entities +{ + public abstract class ServerVehicle + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + public VehicleHash Model { get; set; } + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } + public float Heading { get; set; } + [StringLength(8)] + public string NumberPlate { get; set; } + public int PrimaryColor { get; set; } + public int SecondaryColor { get; set; } + public bool Locked { get; set; } + public bool Active { get; set; } + + [NotMapped] + public Vector3 Position => new Vector3(PositionX, PositionY, PositionZ); + + public Vehicle Spawn() + { + Vehicle veh = NAPI.Vehicle.CreateVehicle(this.Model, this.Position, this.Heading, this.PrimaryColor, this.SecondaryColor, this.NumberPlate, locked: this.Locked, engine: false); + VehicleManager.AddVehicle(this, veh); + return veh; + } + } +} diff --git a/Server/Entities/ShopVehicles.cs b/Server/Entities/ShopVehicles.cs index 3ce052f3..7f1d173f 100644 --- a/Server/Entities/ShopVehicles.cs +++ b/Server/Entities/ShopVehicles.cs @@ -14,30 +14,12 @@ using System.Text; namespace reallife_gamemode.Server.Entities { - public class ShopVehicle + [Table("ShopVehicles")] + public class ShopVehicle : ServerVehicle { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } - [ForeignKey("Shop")] public int? ShopId { get; set; } public Shop Shop { get; set; } - - public VehicleHash Model { get; set; } - [StringLength(32)] - public string ModelName { get; set; } public int Price { get; set; } - public float PositionX { get; set; } - public float PositionY { get; set; } - public float PositionZ { get; set; } - public float Heading { get; set; } - [StringLength(8)] - public string NumberPlate { get; set; } - public byte Alpha { get; set; } - public byte PrimaryColor { get; set; } - public byte SecondaryColor { get; set; } - public byte Dimension { get; set; } - public bool Active { get; set; } } } diff --git a/Server/Entities/UserVehicle.cs b/Server/Entities/UserVehicle.cs index 2c8be155..e6021bc9 100644 --- a/Server/Entities/UserVehicle.cs +++ b/Server/Entities/UserVehicle.cs @@ -14,27 +14,11 @@ using System.Text; namespace reallife_gamemode.Server.Entities { - public class UserVehicle + [Table("UserVehicles")] + public class UserVehicle : ServerVehicle { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } [ForeignKey("User")] public int UserId { get; set; } public User User { get; set; } - - public VehicleHash Model { get; set; } - public float PositionX { get; set; } - public float PositionY { get; set; } - public float PositionZ { get; set; } - public float Heading { get; set; } - [StringLength(8)] - public string NumberPlate { get; set; } - public byte Alpha { get; set; } - public byte PrimaryColor { get; set; } - public byte SecondaryColor { get; set; } - public bool Locked { get; set; } - public bool Engine { get; set; } - public byte Dimension { get; set; } } } diff --git a/Server/Extensions/VehicleExtension.cs b/Server/Extensions/VehicleExtension.cs deleted file mode 100644 index 7a6e9886..00000000 --- a/Server/Extensions/VehicleExtension.cs +++ /dev/null @@ -1,31 +0,0 @@ -using GTANetworkAPI; -using Microsoft.EntityFrameworkCore; -using reallife_gamemode.Model; -using reallife_gamemode.Server.Entities; -using reallife_gamemode.Server.Managers; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -/** -* @overview Life of German Reallife - Vehicle Extension (VehicleExtension.cs) -* @author hydrant -* @copyright (c) 2008 - 2018 Life of German -*/ - -namespace reallife_gamemode.Server.Extensions -{ - public static class VehicleExtension - { - /// - /// Gibt zurück, ob das Vehicle ein Fraktions-Fahrzeug ist - /// - /// Das Vehicle, von dem man wissen möchte, ob es ein Fraktionsfahrzeug ist - /// - public static bool IsFactionVehicle(this Vehicle vehicle) - { - return LoadManager.FactionVehicleList.Contains(vehicle); - } - } -} diff --git a/Server/Managers/LoadManager.cs b/Server/Managers/LoadManager.cs index b97c8f48..fa0125b3 100644 --- a/Server/Managers/LoadManager.cs +++ b/Server/Managers/LoadManager.cs @@ -40,44 +40,39 @@ namespace reallife_gamemode.Server.Managers GotoPointList.Add(g); } } - foreach (Saves.SavedVehicle v in loadData.Vehicles) + + foreach(ServerVehicle veh in loadData.ServerVehicles) { - if (v.Active == true) + if (!veh.Active) continue; + + Vehicle current = veh.Spawn(); + + if (veh is Saves.SavedVehicle savedV) { - NAPI.Vehicle.CreateVehicle((uint)v.Model, new Vector3(v.PositionX, v.PositionY, v.PositionZ), v.Heading, (v.PrimaryColor), - v.SecondaryColor, v.NumberPlate, v.Alpha, v.Locked, v.Engine = false, v.Dimension); + NAPI.Vehicle.CreateVehicle((uint)savedV.Model, new Vector3(savedV.PositionX, savedV.PositionY, savedV.PositionZ), savedV.Heading, savedV.PrimaryColor, + savedV.SecondaryColor, savedV.NumberPlate, 255, savedV.Locked); } - } - foreach (FactionVehicle v in loadData.FactionVehicles) - { - if (v.Active == true) + if (veh is FactionVehicle factionV) { - Vehicle current = NAPI.Vehicle.CreateVehicle((uint)v.Model, new Vector3(v.PositionX, v.PositionY, v.PositionZ), v.Heading, (v.PrimaryColor), - v.SecondaryColor, v.NumberPlate, v.Alpha, v.Locked, v.Engine = false, v.Dimension); - current.SetData("factionId", v.FactionId); + current.SetData("factionId", factionV.FactionId); FactionVehicleList.Add(current); } - } - foreach (ShopVehicle v in loadData.ShopVehicles) - { - if (v.Active == true) + if (veh is ShopVehicle shopV) { - Vehicle current = NAPI.Vehicle.CreateVehicle((uint)v.Model, new Vector3(v.PositionX, v.PositionY, v.PositionZ), v.Heading, (v.PrimaryColor), - v.SecondaryColor, v.NumberPlate, v.Alpha, false, false, v.Dimension); + string displayName = NAPI.Vehicle.GetVehicleDisplayName(shopV.Model); ShopVehicleList.Add(current); NAPI.Vehicle.SetVehicleEngineHealth(current, 0); - var tLabel = NAPI.TextLabel.CreateTextLabel(v.ModelName + " | " + v.Price + "~g~$", new Vector3(v.PositionX, v.PositionY, v.PositionZ + 1.5), 10, 1, 0, new Color(255, 255, 255), false, v.Dimension); - current.SetData("shopVehicleId", v.Id); + var tLabel = NAPI.TextLabel.CreateTextLabel(displayName + " | " + shopV.Price + "~g~$", new Vector3(shopV.PositionX, shopV.PositionY, shopV.PositionZ + 1.5), 10, 1, 0, new Color(255, 255, 255), false); + current.SetData("shopVehicleId", shopV.Id); tLabel.AttachTo(current, "chassis", new Vector3(0, 0, 1.5), new Vector3(0, 0, 0)); } + if (veh is UserVehicle userV) + { + UserVehicleList.Add(current); + } } - foreach (UserVehicle v in loadData.UserVehicles) - { - Vehicle current = NAPI.Vehicle.CreateVehicle((uint)v.Model, new Vector3(v.PositionX, v.PositionY, v.PositionZ), v.Heading, (v.PrimaryColor), - v.SecondaryColor, v.NumberPlate, v.Alpha, false, false, v.Dimension); - current.SetData("ownerId", v.UserId); - UserVehicleList.Add(current); - } + + } } } diff --git a/Server/Managers/SaveManager.cs b/Server/Managers/SaveManager.cs index 686412fb..b6576923 100644 --- a/Server/Managers/SaveManager.cs +++ b/Server/Managers/SaveManager.cs @@ -1,4 +1,5 @@ using GTANetworkAPI; +using reallife_gamemode.Server.Entities; using reallife_gamemode.Server.Extensions; using reallife_gamemode.Server.Managers; using System; @@ -68,11 +69,9 @@ namespace reallife_gamemode.Server.Events PrimaryColor = vehiclePrimaryColor, SecondaryColor = vehicleSecondaryColor, Locked = vehicleLocked, - Engine = vehicleEngine, - Dimension = vehicleDimension, Active = true }; - saveData.Vehicles.Add(dataSet); + saveData.ServerVehicles.Add(dataSet); saveData.SaveChanges(); } } @@ -93,11 +92,9 @@ namespace reallife_gamemode.Server.Events PrimaryColor = vehiclePrimaryColor, SecondaryColor = vehicleSecondaryColor, Locked = vehicleLocked, - Engine = vehicleEngine, - Dimension = vehicleDimension, Active = true }; - saveData.FactionVehicles.Add(dataSet); + saveData.ServerVehicles.Add(dataSet); saveData.SaveChanges(); } } @@ -109,7 +106,6 @@ namespace reallife_gamemode.Server.Events var dataSet = new Entities.ShopVehicle { Model = vehicleModel, - ModelName = vehicleModelName, PositionX = vehiclePosition.X, PositionY = vehiclePosition.Y, PositionZ = vehiclePosition.Z, @@ -117,10 +113,9 @@ namespace reallife_gamemode.Server.Events NumberPlate = vehicleNumberPlate, PrimaryColor = vehiclePrimaryColor, SecondaryColor = vehicleSecondaryColor, - Dimension = vehicleDimension, Active = true }; - saveData.ShopVehicles.Add(dataSet); + saveData.ServerVehicles.Add(dataSet); saveData.SaveChanges(); } } @@ -139,44 +134,31 @@ namespace reallife_gamemode.Server.Events }; saveData.GotoPoints.Add(dataSet); saveData.SaveChanges(); - LoadManager.GotoPointList.Add(dataSet); } } public static void SaveAllOnSave() { + // Alle Fahrzeuge using (var saveAll = new Model.DatabaseContext()) { - //TODO Fahrzeugschäden und Tankfüllstände - //User Vehicle - foreach (Vehicle v in LoadManager.UserVehicleList) + foreach(ServerVehicle veh in saveAll.ServerVehicles) { - int ownerId = v.GetData("ownerId"); - Entities.UserVehicle userVehicle = saveAll.UserVehicles.FirstOrDefault(u => u.UserId == ownerId); - userVehicle.PositionX = v.Position.X; - userVehicle.PositionY = v.Position.Y; - userVehicle.PositionZ = v.Position.Z; - userVehicle.Heading = v.Heading; - } + Vehicle v = VehicleManager.GetVehicleFromServerVehicle(veh); - //Faction Vehicle - foreach (Vehicle v in LoadManager.FactionVehicleList) - { - int factionId = v.GetData("factionId"); - Entities.FactionVehicle factionVehicle = saveAll.FactionVehicles.FirstOrDefault(u => u.FactionId == factionId); - factionVehicle.PositionX = v.Position.X; - factionVehicle.PositionY = v.Position.Y; - factionVehicle.PositionZ = v.Position.Z; - factionVehicle.Heading = v.Heading; + veh.PositionX = v.Position.X; + veh.PositionY = v.Position.Y; + veh.PositionZ = v.Position.Z; + veh.Heading = v.Heading; } //Alle Spieler foreach (Client player in NAPI.Pools.GetAllPlayers()) { - int userId = player.GetUser().Id; - Entities.User user = saveAll.Users.FirstOrDefault(u => u.Id == userId); - user.PositionX = player.Position.X; - user.PositionY = player.Position.Y; - user.PositionZ = player.Position.Z; + Vector3 pos = player.Position; + User user = player.GetUser(saveAll); + user.PositionX = pos.X; + user.PositionY = pos.Y; + user.PositionZ = pos.Z; } saveAll.SaveChanges(); diff --git a/Server/Managers/VehicleManager.cs b/Server/Managers/VehicleManager.cs new file mode 100644 index 00000000..80dadeea --- /dev/null +++ b/Server/Managers/VehicleManager.cs @@ -0,0 +1,39 @@ +using GTANetworkAPI; +using reallife_gamemode.Server.Entities; +using System; +using System.Collections.Generic; +using System.Text; + +namespace reallife_gamemode.Server.Managers +{ + public class VehicleManager + { + private static Dictionary _serverVehicles = new Dictionary(); + + 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; + } + + public static Vehicle GetVehicleFromServerVehicle(ServerVehicle serverVehicle) + { + Console.WriteLine("calling GetVehicleFromServerVehicle | " + serverVehicle.Id); + if(!_serverVehicles.ContainsKey(serverVehicle.Id)) + { + return null; + } + + return NAPI.Pools.GetAllVehicles().Find(v => v.Handle == _serverVehicles[serverVehicle.Id]); + } + } +} diff --git a/Server/Saves/SavedVehicle.cs b/Server/Saves/SavedVehicle.cs index 7653474c..43f9c3d3 100644 --- a/Server/Saves/SavedVehicle.cs +++ b/Server/Saves/SavedVehicle.cs @@ -4,6 +4,7 @@ using System.Text; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using GTANetworkAPI; +using reallife_gamemode.Server.Entities; /** * @overview Life of German Reallife - Saves SavedVehicle.cs @@ -13,24 +14,6 @@ using GTANetworkAPI; namespace reallife_gamemode.Server.Saves { - public class SavedVehicle - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } - public VehicleHash Model { get; set; } - public float PositionX { get; set; } - public float PositionY { get; set; } - public float PositionZ { get; set; } - public float Heading { get; set; } - [StringLength(8)] - public string NumberPlate { get; set; } - public byte Alpha { get; set; } - public byte PrimaryColor { get; set; } - public byte SecondaryColor { get; set; } - public bool Locked { get; set; } - public bool Engine { get; set; } - public byte Dimension { get; set; } - public bool Active { get; set; } - } + public class SavedVehicle : ServerVehicle + { } } diff --git a/Server/Util/DatabaseHelper.cs b/Server/Util/DatabaseHelper.cs index e049fcee..81aee4db 100644 --- a/Server/Util/DatabaseHelper.cs +++ b/Server/Util/DatabaseHelper.cs @@ -14,7 +14,7 @@ namespace reallife_gamemode.Server.Util NAPI.Util.ConsoleOutput("Initializing database..."); using(var dbContext = new DatabaseContext()) { - dbContext.Users.First(); + dbContext.Users.FirstOrDefault(); dbContext.SaveChanges(); } }