From e25af059a466b070b0956636ee28becfbd6d11a7 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 10 Oct 2018 21:06:20 +0200 Subject: [PATCH] Add VehicleShop, SaveManager, Edit LoadManager amm... --- Model/DatabaseContext.cs | 1 + Server/Commands/Admin.cs | 99 ++++++++++++++----- Server/Entities/ShopVehicles.cs | 39 ++++++++ Server/Events/EnterVehicleAttempt.cs | 29 ++++++ Server/Extensions/VehicleExtension.cs | 27 +++++ Server/Managers/LoadManager.cs | 27 ++++- .../SaveData.cs => Managers/SaveManager.cs} | 56 ++++++++++- 7 files changed, 250 insertions(+), 28 deletions(-) create mode 100644 Server/Entities/ShopVehicles.cs create mode 100644 Server/Events/EnterVehicleAttempt.cs create mode 100644 Server/Extensions/VehicleExtension.cs rename Server/{Events/SaveData.cs => Managers/SaveManager.cs} (64%) diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 827f7f71..965d1120 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -60,5 +60,6 @@ namespace reallife_gamemode.Model public DbSet Pickups { get; set; } public DbSet TextLabels { get; set; } public DbSet Vehicles { get; set; } + public DbSet ShopVehicles { get; set; } } } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 26f44ad4..8ebc430f 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -587,7 +587,7 @@ namespace reallife_gamemode.Server.Commands target.GetUser().BanPlayer(admin, reason, mins); } - [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip, ~r~Marker, Ped, Pickup, TextLabel, ~g~Vehicle, FVehicle")] + [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip, ~r~Marker, Ped, Pickup, TextLabel, ~g~Vehicle, FVehicle, SVehicle")] public void CmdAdminSave(Client player, string typ) { switch (typ) @@ -595,6 +595,15 @@ namespace reallife_gamemode.Server.Commands case "Blip": player.TriggerEvent("saveBlip"); break; + case "Vehicle": + if (player.IsInVehicle) + { + Vehicle vehicle = player.Vehicle; + SaveManager.SaveVehicleData((VehicleHash)vehicle.Model, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, + Convert.ToByte(vehicle.PrimaryColor), Convert.ToByte(vehicle.SecondaryColor), vehicle.Locked, vehicle.EngineStatus, Convert.ToByte(vehicle.Dimension)); + } + else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); + break; case "FVehicle": if (player.IsInVehicle) { @@ -606,18 +615,21 @@ namespace reallife_gamemode.Server.Commands else { Vehicle vehicle = player.Vehicle; - SaveData.SaveFactionVehicleData((VehicleHash)vehicle.Model, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, + SaveManager.SaveFactionVehicleData((VehicleHash)vehicle.Model, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, Convert.ToByte(vehicle.PrimaryColor), Convert.ToByte(vehicle.SecondaryColor), vehicle.Locked, vehicle.EngineStatus, Convert.ToByte(vehicle.Dimension), player.GetUser().FactionId); + vehicle.SetData("factionId", player.GetUser().FactionId); + LoadManager.FactionVehicleList.Add(vehicle); } } else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); break; - case "Vehicle": + case "SVehicle": if (player.IsInVehicle) { Vehicle vehicle = player.Vehicle; - SaveData.SaveVehicleData((VehicleHash)vehicle.Model, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, - Convert.ToByte(vehicle.PrimaryColor), Convert.ToByte(vehicle.SecondaryColor), vehicle.Locked, vehicle.EngineStatus, Convert.ToByte(vehicle.Dimension)); + SaveManager.SaveShopVehicleData((VehicleHash)vehicle.Model, vehicle.DisplayName, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, + Convert.ToByte(vehicle.PrimaryColor), Convert.ToByte(vehicle.SecondaryColor), Convert.ToByte(vehicle.Dimension), player.GetUser().FactionId); + LoadManager.ShopVehicleList.Add(vehicle); } else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); break; @@ -734,6 +746,7 @@ namespace reallife_gamemode.Server.Commands if (player.IsInVehicle) { Vehicle playerVehicle = player.Vehicle; + LoadManager.UserVehicleList.Add(playerVehicle); using (var saveVehicle = new DatabaseContext()) { var dataSet = new UserVehicle @@ -751,10 +764,10 @@ namespace reallife_gamemode.Server.Commands Engine = playerVehicle.EngineStatus, Dimension = Convert.ToByte(playerVehicle.Dimension), }; + playerVehicle.SetData("ownerId",player.GetUser().Id); saveVehicle.UserVehicles.Add(dataSet); - saveVehicle.SaveChanges(); + saveVehicle.SaveChanges(); } - } else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); } @@ -1075,7 +1088,7 @@ namespace reallife_gamemode.Server.Commands player.SendChatMessage("IP von " + NAPI.Player.GetPlayerName(target) + ": " + target.Address); } - //TEST COMMAND + //TODO TEST COMMAND [Command("myvehicles")] public void CmdAdminMyVehicles(Client player) { @@ -1113,31 +1126,65 @@ namespace reallife_gamemode.Server.Commands BankManager.TransferUserMoneyToFaction(player.GetUser(), receiverUser, amount, "/FPAY"); } } - - /* - [Command("restart")] - public void CmdAdminRestart(Client player) + //TODO Ausführen bei Tastendruck wenn in Fahrzeug. + [Command("buyv")] + public void BuyShopVehicle(Client player) { - if (ClientExtension.IsLoggedIn(player) == false) - { - ChatService.PlayerNotLoggedIn(player); - return; - } if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); return; } - - var users = NAPI.Pools.GetAllPlayers(); - - foreach(Client user in users) + if (player.IsInVehicle) { - user.SendChatMessage("~r~Server startet neu.~s~ Bitte verbinde dich über ~y~F1~s~ neu."); - user.Kick(); + if (player.Vehicle.HasData("shopVehicleId")) + { + int shopVehicleId = player.Vehicle.GetData("shopVehicleId"); + using (var getShopVehicle = new DatabaseContext()) + { + ShopVehicle sVehicle = getShopVehicle.ShopVehicles.FirstOrDefault(u => u.Id == shopVehicleId); + Entities.Faction receiverUser = getShopVehicle.Factions.FirstOrDefault(u => u.Name == "LSPD"); + BankManager.TransferUserMoneyToFaction(player.GetUser(), receiverUser, sVehicle.Price, "Fahrzeug gekauft: " + sVehicle.ModelName); + //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); + player.SetIntoVehicle(boughtVehicle, 0); + //TODO fügt das Fahrzeug als Userfahrzeug hinzu + CmdAdminOwn(player); + } + } } + } + [Command("saveall")] + public void SaveAll(Client player) + { + SaveManager.SaveAllOnSave(); + } - NAPI.Resource.StopResource("reallife-gamemode"); - }*/ - } + /* + [Command("restart")] + public void CmdAdminRestart(Client player) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + var users = NAPI.Pools.GetAllPlayers(); + + foreach(Client user in users) + { + user.SendChatMessage("~r~Server startet neu.~s~ Bitte verbinde dich über ~y~F1~s~ neu."); + user.Kick(); + } + + NAPI.Resource.StopResource("reallife-gamemode"); + }*/ + } } diff --git a/Server/Entities/ShopVehicles.cs b/Server/Entities/ShopVehicles.cs new file mode 100644 index 00000000..883b5c0c --- /dev/null +++ b/Server/Entities/ShopVehicles.cs @@ -0,0 +1,39 @@ +using GTANetworkAPI; +using reallife_gamemode.Server.Util; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +/** +* @overview Life of German Reallife - Entities ShopVehicles (ShopVehicles.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Entities +{ + public class ShopVehicle + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + public VehicleHash Model { get; set; } + [StringLength(32)] + public string ModelName { get; set; } + public float 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/Events/EnterVehicleAttempt.cs b/Server/Events/EnterVehicleAttempt.cs new file mode 100644 index 00000000..8ac37525 --- /dev/null +++ b/Server/Events/EnterVehicleAttempt.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; +using reallife_gamemode.Server.Entities; +using reallife_gamemode.Server.Extensions; + +namespace reallife_gamemode.Server.Events +{ + + public class EnterVehicleAttempt : Script + { + [ServerEvent(Event.PlayerEnterVehicleAttempt)] + public void OnPlayerEnterVehicleAttempt(Client player, Vehicle vehicle, sbyte seat) + { + if (vehicle.HasData("factionId")) + { + if((vehicle.GetData("factionId") != player.GetUser().FactionId) && seat == 0) + { + //TODO REWORK + player.SetIntoVehicle(vehicle, 1); + player.WarpOutOfVehicle(); + player.SendChatMessage("Du hast kein Recht in dieses Fahrzeug als Fahrer einzusteigen."); + return; + } + } + } + } +} diff --git a/Server/Extensions/VehicleExtension.cs b/Server/Extensions/VehicleExtension.cs new file mode 100644 index 00000000..47f876c9 --- /dev/null +++ b/Server/Extensions/VehicleExtension.cs @@ -0,0 +1,27 @@ +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 + { + public static bool IsFactionVehicle(Vehicle vehicle) + { + bool containsVehicle = LoadManager.FactionVehicleList.Contains(vehicle); + return containsVehicle; + } + } +} diff --git a/Server/Managers/LoadManager.cs b/Server/Managers/LoadManager.cs index 1686b3d9..eba2c76e 100644 --- a/Server/Managers/LoadManager.cs +++ b/Server/Managers/LoadManager.cs @@ -15,6 +15,10 @@ namespace reallife_gamemode.Server.Managers { public class LoadManager : Script { + public static List FactionVehicleList = new List(); + public static List ShopVehicleList = new List(); + public static List UserVehicleList = new List(); + [ServerEvent(Event.ResourceStart)] public void OnResourceStart() { @@ -40,10 +44,31 @@ namespace reallife_gamemode.Server.Managers { if (v.Active == true) { - NAPI.Vehicle.CreateVehicle((uint)v.Model, new Vector3(v.PositionX, v.PositionY, v.PositionZ), v.Heading, (v.PrimaryColor), + 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); + FactionVehicleList.Add(current); } } + foreach (ShopVehicle v in loadData.ShopVehicles) + { + if (v.Active == true) + { + 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); + ShopVehicleList.Add(current); + current.Health = -4000; + 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); + } + } + 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/Events/SaveData.cs b/Server/Managers/SaveManager.cs similarity index 64% rename from Server/Events/SaveData.cs rename to Server/Managers/SaveManager.cs index 667dc6b9..1e0f9c45 100644 --- a/Server/Events/SaveData.cs +++ b/Server/Managers/SaveManager.cs @@ -1,11 +1,14 @@ using GTANetworkAPI; +using reallife_gamemode.Server.Extensions; +using reallife_gamemode.Server.Managers; using System; using System.Collections.Generic; +using System.Linq; using System.Text; namespace reallife_gamemode.Server.Events { - public class SaveData : Script + public class SaveManager : Script { [RemoteEvent("OnSaveBlipData")] public void OnSaveBlipData(Client player, string blipSprite, string blipName, string blipScale, string blipColor, @@ -98,5 +101,56 @@ namespace reallife_gamemode.Server.Events saveData.SaveChanges(); } } + public static void SaveShopVehicleData(VehicleHash vehicleModel, string vehicleModelName, Vector3 vehiclePosition, float vehicleHeading, + string vehicleNumberPlate, byte vehiclePrimaryColor, byte vehicleSecondaryColor, byte vehicleDimension, int? factionId) + { + using (var saveData = new Model.DatabaseContext()) + { + var dataSet = new Entities.ShopVehicle + { + Model = vehicleModel, + ModelName = vehicleModelName, + PositionX = vehiclePosition.X, + PositionY = vehiclePosition.Y, + PositionZ = vehiclePosition.Z, + Heading = vehicleHeading, + NumberPlate = vehicleNumberPlate, + PrimaryColor = vehiclePrimaryColor, + SecondaryColor = vehicleSecondaryColor, + Dimension = vehicleDimension, + Active = true + }; + saveData.ShopVehicles.Add(dataSet); + saveData.SaveChanges(); + } + } + public static void SaveAllOnSave() + { + using (var saveAll = new Model.DatabaseContext()) + { + //Alle User Vehicle + foreach (Vehicle v in LoadManager.UserVehicleList) + { + 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; + } + + //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; + } + + saveAll.SaveChanges(); + } + } } }