diff --git a/Client/Login/main.js b/Client/Login/main.js index ee786ad7..64ae00f6 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -3,17 +3,10 @@ * @author VegaZ, hydrant * @copyright (c) 2008 - 2018 Life of German */ - var loginBrowser; -loginBrowser = mp.browsers.new('package://Login/login.html'); -mp.gui.chat.activate(false); -mp.gui.cursor.show(true, true); -mp.game.ui.displayHud(false); -mp.game.ui.displayRadar(false); - var loginCam = mp.cameras.new('login', new mp.Vector3(-1883.736, -781.4911, 78.27616), new mp.Vector3(3.185999, 0, -79.59519), 40); -loginCam.setActive(true); -mp.game.cam.renderScriptCams(true, false, 0, true, false); + +mp.events.callRemote('IsPlayerBanned'); mp.events.add('loginInformationToServer', (password) => { @@ -73,6 +66,22 @@ mp.events.add('registerFail', (reason) => { showCefError(reason); }); +mp.events.add('showLogin', () => { + + loginBrowser = mp.browsers.new('package://Login/login.html'); + mp.gui.chat.activate(false); + mp.gui.cursor.show(true, true); + mp.game.ui.displayHud(false); + mp.game.ui.displayRadar(false); + + loginCam.setActive(true); + mp.game.cam.renderScriptCams(true, false, 0, true, false); +}); + function showCefError(error) { loginBrowser.execute(`showError(\`` + error + `\`)`); } + +//function isPlayerBanned() { + +//} \ No newline at end of file diff --git a/Main.cs b/Main.cs index 3f6166a1..b6dc0e75 100644 --- a/Main.cs +++ b/Main.cs @@ -25,7 +25,7 @@ namespace reallife_gamemode using (var context = new DatabaseContext()) { - context.Users.FirstOrDefault(); + context.Bans.FirstOrDefault(); context.SaveChanges(); } } diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 6b60c4b8..709f14f9 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -36,8 +36,18 @@ namespace reallife_gamemode.Model base.OnModelCreating(modelBuilder); } + //User public DbSet Users { get; set; } + public DbSet UserVehicles { get; set; } + public DbSet BankAccounts { get; set; } + public DbSet Bans { get; set; } + //Logs + //public DbSet BanLogs { get; set; } + public DbSet BankAccountTransactionLogs { get; set; } + public DbSet DeathLogs { get; set; } + + //Saves public DbSet Blips { get; set; } public DbSet Markers { get; set; } public DbSet Peds { get; set; } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 403de063..394e46c6 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1,11 +1,15 @@ using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Collections.Generic; +using System.Diagnostics; using System.Text; using GTANetworkAPI; using reallife_gamemode.Server.Events; using reallife_gamemode.Server.Extensions; using reallife_gamemode.Server.Services; using reallife_gamemode.Server.Util; +using reallife_gamemode.Model; /** * @overview Life of German Reallife - Admin Commands (Admin.cs) @@ -58,7 +62,6 @@ namespace reallife_gamemode.Server.Commands Vehicle v = NAPI.Vehicle.CreateVehicle(hash, player.Position, player.Rotation.Z, color1, color2); player.SetIntoVehicle(v.Handle, -1); - player.SendChatMessage("Maxspeed: + " +player.Vehicle.MaxSpeed + ""); } [Command("fv")] @@ -551,8 +554,137 @@ namespace reallife_gamemode.Server.Commands else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); break; - } - + } } + + [Command("ban", "~m~Benutzung: ~s~/ban [User] [Zeit in Minuten(0 für Permanent)] [Grund] ", GreedyArg = true)] + public void CmdAdminBan(Client admin, string user, int mins, string reason) + { + if (ClientExtension.IsLoggedIn(admin) == false) + { + ChatService.PlayerNotLoggedIn(admin); + return; + } + if (!admin.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(admin); + return; + } + Client target = ClientService.GetClientByName(user); + ClientExtension.BanPlayer(admin, target, reason, mins); + } + [Command("unban", "~m~Benutzung: ~s~/unban [User] ", GreedyArg = true)] + public void CmdAdminUnban(Client admin, string user) + { + if (ClientExtension.IsLoggedIn(admin) == false) + { + ChatService.PlayerNotLoggedIn(admin); + return; + } + if (!admin.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(admin); + return; + } + Client target = ClientService.GetClientByName(user); + ClientExtension.UnbanPlayer(admin, target); + } + + + //TEST COMMAND + [Command("own")] + public void CmdAdminOwn(Client player) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + if (player.IsInVehicle) + { + Vehicle playerVehicle = player.Vehicle; + using (var saveVehicle = new Model.DatabaseContext()) + { + var dataSet = new Entities.UserVehicle + { + UserId = player.GetUser().Id, + Model = (VehicleHash) playerVehicle.Model, + PositionX = playerVehicle.Position.X, + PositionY = playerVehicle.Position.Y, + PositionZ = playerVehicle.Position.Z, + Heading = playerVehicle.Heading, + NumberPlate = playerVehicle.NumberPlate, + PrimaryColor = Convert.ToByte(playerVehicle.PrimaryColor), + SecondaryColor = Convert.ToByte(playerVehicle.SecondaryColor), + Locked = playerVehicle.Locked, + Engine = playerVehicle.EngineStatus, + Dimension = Convert.ToByte(playerVehicle.Dimension), + }; + saveVehicle.UserVehicles.Add(dataSet); + saveVehicle.SaveChanges(); + } + + } + else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); + + } + //TEST COMMAND + [Command("myvehicles")] + public void CmdAdminMyVehicles(Client player) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.SendChatMessage("Deine Fahrzeuge: "); + using (var loadData = new DatabaseContext()) + { + foreach (Entities.UserVehicle v in loadData.UserVehicles) + { + if (v.UserId == ClientExtension.GetUser(player).Id) + { + player.SendChatMessage("~b~" + NAPI.Vehicle.GetVehicleDisplayName(v.Model)); + } + } + } + } + + /* + [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/Ban.cs b/Server/Entities/Ban.cs new file mode 100644 index 00000000..9a9438c9 --- /dev/null +++ b/Server/Entities/Ban.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using reallife_gamemode.Server.Entities; + +/** +* @overview Life of German Reallife - Entities Ban (Ban.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Entities +{ + public class Ban + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [ForeignKey("User")] + public int UserId { get; set; } + public User User { get; set; } + + public string Reason { get; set; } + public string BannedBy { get; set; } + + public int Applied { get; set; } + public int UntilDateTime { get; set; } + } +} diff --git a/Server/Entities/User.cs b/Server/Entities/User.cs index 5f8532e1..34c4ee3c 100644 --- a/Server/Entities/User.cs +++ b/Server/Entities/User.cs @@ -1,4 +1,5 @@ -using reallife_gamemode.Server.Util; +using GTANetworkAPI; +using reallife_gamemode.Server.Util; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -27,10 +28,18 @@ namespace reallife_gamemode.Server.Entities public int LogUserId { get; set; } [Timestamp] public byte[] RegistrationDate { get; set; } + [EmailAddress] [StringLength(64)] public string Email { get; set; } public AdminLevel AdminLevel { get; set; } + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } + + [ForeignKey("Ban")] + public int? BanId { get; set; } + public Ban Ban { get; set; } public bool IsAdmin(AdminLevel level) => AdminLevel >= level; } diff --git a/Server/Entities/UserBankAccount.cs b/Server/Entities/UserBankAccount.cs new file mode 100644 index 00000000..b636a940 --- /dev/null +++ b/Server/Entities/UserBankAccount.cs @@ -0,0 +1,32 @@ +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 UserBankAccount (UserBankAccount.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Entities +{ + public class UserBankAccount + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + [ForeignKey("User")] + public int UserId { get; set; } + public User User { get; set; } + [StringLength(12)] + public string Bic { get; set; } + [StringLength(32)] + public string Iban { get; set; } + public float Balance { get; set; } + public bool Active { get; set; } + } +} \ No newline at end of file diff --git a/Server/Entities/UserVehicle.cs b/Server/Entities/UserVehicle.cs new file mode 100644 index 00000000..2c8be155 --- /dev/null +++ b/Server/Entities/UserVehicle.cs @@ -0,0 +1,40 @@ +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 UserVehicle (UserVehicle.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Entities +{ + public class UserVehicle + { + [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/Events/Connect.cs b/Server/Events/Connect.cs index 69e1552b..632e42ce 100644 --- a/Server/Events/Connect.cs +++ b/Server/Events/Connect.cs @@ -24,6 +24,36 @@ namespace reallife_gamemode.Server.Events player.Position = new Vector3(-1883.736, -781.4911, -10); player.FreezePosition = true; } - + [RemoteEvent("IsPlayerBanned")] + public void IsPlayerBanned(Client player) + { + using (var loginUser = new Model.DatabaseContext()) + { + var user = loginUser.Users.SingleOrDefault(b => b.Name == player.Name); + if (user.BanId != null) + { + using (var banUser = new DatabaseContext()) + { + + var dt = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + var bannedUser = banUser.Bans.SingleOrDefault(u => u.Id == user.BanId); + if (bannedUser.Applied == bannedUser.UntilDateTime) + { + player.SendChatMessage("!{#FF4040}Du wurdest permanent gebannt! [" + bannedUser.Reason + "]"); + //player.Kick(); + } + else + { + var timeStamp = bannedUser.UntilDateTime; + player.SendChatMessage("Du bist noch bis zum !{#FF4040}" + dt.AddSeconds(timeStamp).ToLocalTime() + " Uhr ~s~gebannt. [" + bannedUser.Reason + "]"); + //player.Kick(); + } + + } + } + else player.TriggerEvent("showLogin"); + } + } + } } diff --git a/Server/Events/Death.cs b/Server/Events/Death.cs index 4eaa85e0..62c3cd55 100644 --- a/Server/Events/Death.cs +++ b/Server/Events/Death.cs @@ -5,6 +5,7 @@ using System.Text; using GTANetworkAPI; using GTANetworkMethods; using reallife_gamemode.Model; +using reallife_gamemode.Server.Extensions; /* * Author: balbo @@ -18,7 +19,38 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.PlayerDeath)] public void OnPlayerDeath(Client player, Client killer, uint reason) { + //TODO: Zum Full Release entfernen NAPI.Chat.SendChatMessageToPlayer(player, "Du bist durch " + killer.Name + " gestorben: " + reason.ToString()); + + int? killerId; + float killerPosX; + float killerPosY; + float killerPosZ; + float killerHeading; + + if (killer.IsNull) + { + killerId = null; + killerPosX = -1; + killerPosY = -1; + killerPosZ = -1; + killerHeading = -1; + } else { + killerId = killer.GetUser().Id; + killerPosX = killer.Position.X; + killerPosY = killer.Position.Y; + killerPosZ = killer.Position.Z; + killerHeading = killer.Heading; + } + + using (var userDeath = new DatabaseContext()) + { + var dead = new Logs.Death { VictimId = player.GetUser().Id, KillerId = killerId, KillerPositionX = killerPosX, KillerPositionY = killerPosY, + KillerPositionZ = killerPosZ, KillerHeading = killerHeading, VictimPositionX = player.Position.X, VictimPositionY = player.Position.Y, + VictimPositionZ = player.Position.Z, VictimHeading = player.Heading, CauseOfDeath = reason.ToString()}; + userDeath.DeathLogs.Add(dead); + userDeath.SaveChanges(); + } } } } diff --git a/Server/Events/Disconnect.cs b/Server/Events/Disconnect.cs index defec9b7..b4696652 100644 --- a/Server/Events/Disconnect.cs +++ b/Server/Events/Disconnect.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using GTANetworkAPI; @@ -11,13 +12,34 @@ using GTANetworkAPI; namespace reallife_gamemode.Server.Events { - class Disconnect : Script + public class Disconnect : Script { [ServerEvent(Event.PlayerDisconnected)] - public void OnPlayerDisconnected(Client player) + public void OnPlayerDisconnected(Client player, DisconnectionType type, string reason) { + if (type == DisconnectionType.Left) + { + NAPI.Util.ConsoleOutput(player.Name + " left"); + } + if (type == DisconnectionType.Kicked) + { + NAPI.Util.ConsoleOutput(player.Name + " kicked"); + } + if (type == DisconnectionType.Timeout) + { + NAPI.Util.ConsoleOutput(player.Name + " Timeoutet"); + } + /* + using (var saveUser = new Model.DatabaseContext()) + { + var user = saveUser.Users.SingleOrDefault(u => u.Name == player.Name); + + user.PositionX = player.Position.X; + user.PositionY = player.Position.Y; + user.PositionZ = player.Position.Z; + saveUser.SaveChanges(); + }*/ player.SetData("isLoggedIn", false); } - } } \ No newline at end of file diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index a6534280..f3dac381 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; using GTANetworkAPI; +using reallife_gamemode.Model; +using reallife_gamemode.Server.Entities; /** * @overview Life of German Reallife - Event Login (Login.cs) @@ -36,7 +38,7 @@ namespace reallife_gamemode.Server.Events if (user.Password != NAPI.Util.GetHashSha256(password)) { player.TriggerEvent("loginFail", "Passwort inkorrekt!"); - } + } else { player.TriggerEvent("loginSuccess"); @@ -44,6 +46,7 @@ namespace reallife_gamemode.Server.Events player.SetData("isLoggedIn", true); player.TriggerEvent("draw"); + player.Position = new Vector3(user.PositionX, user.PositionY, user.PositionZ); } } } diff --git a/Server/Events/Register.cs b/Server/Events/Register.cs index fbc45ecf..1aac5659 100644 --- a/Server/Events/Register.cs +++ b/Server/Events/Register.cs @@ -30,6 +30,7 @@ namespace reallife_gamemode.Server.Events } player.TriggerEvent("registerSuccess"); NAPI.Player.SpawnPlayer(player, Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING); + player.SetData("isLoggedIn", true); } else if (player.SocialClubName == checkedUser.SocialClubName) { diff --git a/Server/Events/ResourceStop.cs b/Server/Events/ResourceStop.cs new file mode 100644 index 00000000..ce98d989 --- /dev/null +++ b/Server/Events/ResourceStop.cs @@ -0,0 +1,38 @@ +using GTANetworkAPI; +using GTANetworkMethods; +using reallife_gamemode.Server.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +/** +* @overview Life of German Reallife - Event ResourceStop (ResourceStop.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Events +{ + public class ResourceStop : Script + { + [ServerEvent(Event.ResourceStop)] + public void OnResourceStop() + { + var users = NAPI.Pools.GetAllPlayers(); + + foreach(Client user in users) + { + using (var saveUsers = new Model.DatabaseContext()) + { + var saveUser = saveUsers.Users.SingleOrDefault(u => u.Name == user.Name); + + saveUser.PositionX = user.Position.X; + saveUser.PositionY = user.Position.Y; + saveUser.PositionZ = user.Position.Z; + saveUsers.SaveChanges(); + } + } + } + } +} diff --git a/Server/Extensions/ClientExtension.cs b/Server/Extensions/ClientExtension.cs index d45bede9..d272dffb 100644 --- a/Server/Extensions/ClientExtension.cs +++ b/Server/Extensions/ClientExtension.cs @@ -18,7 +18,7 @@ namespace reallife_gamemode.Server.Extensions { public static User GetUser(this Client client) { - using(DatabaseContext dbContext = new DatabaseContext()) + using (DatabaseContext dbContext = new DatabaseContext()) { return dbContext.Users.FirstOrDefault(u => u.Name == client.Name); } @@ -28,5 +28,45 @@ namespace reallife_gamemode.Server.Extensions { return player.GetData("isLoggedIn"); } + + public static void BanPlayer(Client admin, Client target, string reason, int mins) + { + using (var banUser = new DatabaseContext()) + { + int unixTimestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; + Ban user; + if (mins == 0) + { + NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " permanent gebannt. [" + reason + "]"); + user = new Ban { UserId = GetUser(target).Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp }; + //TODO user.Kick(); + mins--; + } + else + { + NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " für " + mins + " Minuten gebannt. [" + reason + "]"); + user = new Ban { UserId = GetUser(target).Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp + mins * 60 }; + //TODO user.Kick(); + } + + banUser.Bans.Add(user); + banUser.SaveChanges(); + + var targetUser = banUser.Users.FirstOrDefault(u => u.Name == target.Name); + targetUser.BanId = user.Id; + banUser.SaveChanges(); + } + } + public static void UnbanPlayer(Client admin, Client target) + { + using (var unbanUser = new DatabaseContext()) + { + var targetUser = unbanUser.Bans.FirstOrDefault(u => u.Id == target.GetUser().BanId); + unbanUser.Bans.Remove(targetUser); + unbanUser.SaveChanges(); + } + admin.SendChatMessage(target.Name + " wurde entbannt."); + //TODO ***Admin Info: {ADMIN-NAME} hat {USER-NAME} entbannt. + } } } diff --git a/Server/Logs/BankAccountTransactionHistory.cs b/Server/Logs/BankAccountTransactionHistory.cs new file mode 100644 index 00000000..ac14e6c1 --- /dev/null +++ b/Server/Logs/BankAccountTransactionHistory.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +/** +* @overview Life of German Reallife - Logs BankAccountTransactionHistory (BankAccountTransactionHistory.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Logs +{ + public class BankAccountTransactionHistory + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [StringLength(32)] + public string Sender { get; set; } + public float SenderBalance { get; set; } + public float MoneySent { get; set; } + [StringLength(32)] + public string Receiver { get; set; } + public float ReceiverBalance { get; set; } + public float NewSenderBalance { get; set; } + public float NewReceiverBalance { get; set; } + public float Fee { get; set; } + [Timestamp] + public byte[] Timestamp { get; set; } + } +} diff --git a/Server/Logs/Death.cs b/Server/Logs/Death.cs new file mode 100644 index 00000000..b9f48eb3 --- /dev/null +++ b/Server/Logs/Death.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using reallife_gamemode.Server.Entities; + +/** +* @overview Life of German Reallife - Logs Death (Death.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Logs +{ + public class Death + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [ForeignKey("Victim")] + public int VictimId { get; set; } + public User Victim { get; set; } + + [ForeignKey("Killer")] + public int? KillerId { get; set; } + public User Killer { get; set; } + + public float VictimPositionX { get; set; } + public float VictimPositionY { get; set; } + public float VictimPositionZ { get; set; } + public float VictimHeading { get; set; } + + public float KillerPositionX { get; set; } + public float KillerPositionY { get; set; } + public float KillerPositionZ { get; set; } + public float KillerHeading { get; set; } + + [StringLength(64)] + public string CauseOfDeath { get; set; } + [Timestamp] + public byte[] Timestamp { get; set; } + } +} diff --git a/Server/Managers/LoadManager.cs b/Server/Managers/LoadManager.cs index 4384c916..0ca49ad9 100644 --- a/Server/Managers/LoadManager.cs +++ b/Server/Managers/LoadManager.cs @@ -34,7 +34,7 @@ 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, (int)(v.PrimaryColor), + 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); } }