diff --git a/Client/Gui/playerlist.html b/Client/Gui/playerlist.html new file mode 100644 index 00000000..27f3ec10 --- /dev/null +++ b/Client/Gui/playerlist.html @@ -0,0 +1,40 @@ + + + + + + + + + + +
+
+ + + + + + + + + +
ID
Name
Ping
+
+ + + + \ No newline at end of file diff --git a/Client/Gui/playerlist.js b/Client/Gui/playerlist.js new file mode 100644 index 00000000..bc24759c --- /dev/null +++ b/Client/Gui/playerlist.js @@ -0,0 +1,35 @@ +/** + * @overview Life of German Reallife - Gui Playerlist playerlist.js + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +var playerlistBrowser +var pList; + +mp.events.add("showPlayerlist", () => { + if (!playerlistBrowser) { + playerlistBrowser = mp.browsers.new('package://Gui/playerlist.html'); + mp.gui.chat.activate(false); + mp.gui.cursor.show(true, true); + } +}); + +mp.events.add("fetchPlayerList", (playersJson) => { + + pList = JSON.parse(playersJson); + + pList.forEach((player) => { + mp.gui.chat.push(player.Id + ", " + player.Name + ", " + player.Ping); + }); +}); + + +//function getTable() { +// var table = ""; +// pList.forEach((player) => { +// var tableRow = "" + player.Id + "" + player.Name + "" + player.Ping + ""; +// table = table + tableRow; +// }) +// return document.write(table); +//} \ No newline at end of file diff --git a/Client/Gui/script.js b/Client/Gui/script.js new file mode 100644 index 00000000..6e54688e --- /dev/null +++ b/Client/Gui/script.js @@ -0,0 +1,8 @@ +$(document).ready(function () { + + mp.trig + + for (var player in pList) { + $("#playerData").append("" + player.Id + "" + player.Name + "" + player.Ping + ""); + } +}); \ No newline at end of file diff --git a/Client/Gui/style.css b/Client/Gui/style.css new file mode 100644 index 00000000..d28c2277 --- /dev/null +++ b/Client/Gui/style.css @@ -0,0 +1,38 @@ +/** + * @overview Life of German Reallife - Save CSS style.css + * @author Orangebox, hydrant, VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +.playerlist { + background-color: rgba(61, 68, 87, 0.50); + position: absolute; + top: 50%; + left: 50%; + margin-right: -50%; + transform: translate(-50%, -50%); + min-width: 60%; + text-align: center; +} + +body { + font-family: "Roboto", sans-serif; + -webkit-font-smoothing: antialiased; + overflow: hidden; +} +td { + align-content: stretch; + padding-left: 10px; + padding-right: 10px; + box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 0 0 0 rgba(0, 0, 0, 0.24); + border-top: 2px double gray; + border-bottom: 2px double gray; + border-width: 0.5px; + width: auto; +} + +table { + margin: auto; + align-self:center; + width: 100%; +} \ No newline at end of file diff --git a/Client/Player/keys.js b/Client/Player/keys.js new file mode 100644 index 00000000..cc1a69be --- /dev/null +++ b/Client/Player/keys.js @@ -0,0 +1,45 @@ +/** + * @overview Life of German Reallife - Player Keys keys.js + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +//https://docs.microsoft.com/de-de/windows/desktop/inputdev/virtual-key-codes + +var chat = false; + +//ENTER +mp.keys.bind(0x0D, false, function () { + if (chat === true) { + chat = false; + } +}); + +//I +mp.keys.bind(0x49, false, function () { + if (!chat) { + mp.events.callRemote("keyPress:I"); + mp.events.call("showPlayerlist"); + } +}); + +//N +mp.keys.bind(0x4E, false, function () { + if (!chat) { + mp.events.callRemote("keyPress:N"); + } +}); + +//T +mp.keys.bind(0x54, false, function () { + if (chat === false) { + chat = true; + } +}); + +//X +mp.keys.bind(0x58, false, function () { + if (!chat) { + mp.events.callRemote("keyPress:X"); + } +}); diff --git a/Client/index.js b/Client/index.js index 7a6e6771..75951af2 100644 --- a/Client/index.js +++ b/Client/index.js @@ -10,7 +10,9 @@ require('./Save/main.js'); require('./Save/save.js'); require('./Gui/infobox.js'); +require('./Gui/playerlist.js'); require('./Login/main.js'); +require('./Player/keys.js'); require('./Save/main.js'); require('./FactionManagement/main.js'); diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 03b389b8..e4dcabaf 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -599,8 +599,13 @@ namespace reallife_gamemode.Server.Commands if (player.IsInVehicle) { Vehicle vehicle = player.Vehicle; +<<<<<<< HEAD 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)); +======= + SaveData.SaveVehicleData((VehicleHash)vehicle.Model, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, + Convert.ToByte(vehicle.PrimaryColor), Convert.ToByte(vehicle.SecondaryColor), vehicle.Locked, Convert.ToByte(vehicle.Dimension)); +>>>>>>> feature/client-player-keys } else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); break; diff --git a/Server/Events/Key.cs b/Server/Events/Key.cs new file mode 100644 index 00000000..cbe9e732 --- /dev/null +++ b/Server/Events/Key.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; +using Newtonsoft.Json; +using reallife_gamemode.Server.Util; +/** +* @overview Life of German Reallife - Event Key (Key.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Events +{ + public class Key : Script + { + [RemoteEvent("keyPress:I")] + public void KeyPressI(Client player) + { + List players = NAPI.Pools.GetAllPlayers(); + List ListPlayers = new List(); + + foreach(Client listPlayer in players) + { + var lPlayer = new ListPlayer(); + lPlayer.Id = listPlayer.Handle.Value; + lPlayer.Name = listPlayer.Name; + lPlayer.Ping = listPlayer.Ping; + + ListPlayers.Add(lPlayer); + } + player.TriggerEvent("fetchPlayerList", JsonConvert.SerializeObject(ListPlayers)); + } + [RemoteEvent("keyPress:N")] + public void KeyPressN(Client player) + { + if (NAPI.Player.IsPlayerInAnyVehicle(player)) + { + bool engineStatus = NAPI.Vehicle.GetVehicleEngineStatus(player.Vehicle); + if (engineStatus == false) + { + player.Vehicle.EngineStatus = true; + } + else + { + player.Vehicle.EngineStatus = false; + } + } + } + [RemoteEvent("keyPress:X")] + public void KeyPressX(Client player) + { + if (NAPI.Player.IsPlayerInAnyVehicle(player)) + { + if (player.Seatbelt == false) + { + player.Seatbelt = true; + } + else + { + player.Seatbelt = false; + } + } + } + } +} diff --git a/Server/Events/SaveData.cs b/Server/Events/SaveData.cs new file mode 100644 index 00000000..76df8990 --- /dev/null +++ b/Server/Events/SaveData.cs @@ -0,0 +1,78 @@ +using GTANetworkAPI; +using System; +using System.Collections.Generic; +using System.Text; + +namespace reallife_gamemode.Server.Events +{ + public class SaveData : Script + { + [RemoteEvent("OnSaveBlipData")] + public void OnSaveBlipData(Client player, string blipSprite, string blipName, string blipScale, string blipColor, + string blipAlpha, string blipDrawDistance, string blipShortRange, string blipRotation, string blipDimension) + { + float x = player.Position.X; + float y = player.Position.Y; + float z = player.Position.Z; + short sprite = short.Parse(blipSprite); + string name = blipName; + float scale = float.Parse(blipScale); + byte color = Convert.ToByte(blipColor); + byte alpha = Convert.ToByte(blipAlpha); + float drawDistance = float.Parse(blipDrawDistance); + bool shortRange = bool.Parse(blipShortRange); + float rotation = float.Parse(blipRotation); + byte dimension = Convert.ToByte(blipDimension); + + NAPI.Blip.CreateBlip(uint.Parse(blipSprite), new Vector3(x,y,z), scale, color, name, alpha, drawDistance, shortRange, short.Parse(blipRotation), dimension); + + using (var saveData = new Model.DatabaseContext()) + { + var dataSet = new Server.Saves.SavedBlip + { + Sprite = sprite, + PositionX = x, + PositionY = y, + PositionZ = z, + Name = blipName, + Scale = scale, + Color = color, + Alpha = alpha, + DrawDistance = drawDistance, + ShortRange = shortRange, + Rotation = rotation, + Dimension = dimension, + Active = true + }; + saveData.Blips.Add(dataSet); + saveData.SaveChanges(); + } + } + + public static void SaveVehicleData(VehicleHash vehicleModel, Vector3 vehiclePosition, float vehicleHeading, + string vehicleNumberPlate, byte vehiclePrimaryColor, byte vehicleSecondaryColor, bool vehicleLocked, byte vehicleDimension) + { + using (var saveData = new Model.DatabaseContext()) + { + var dataSet = new Server.Saves.SavedVehicle + { + Model = vehicleModel, + PositionX = vehiclePosition.X, + PositionY = vehiclePosition.Y, + PositionZ = vehiclePosition.Z, + Heading = vehicleHeading, + NumberPlate = vehicleNumberPlate, + PrimaryColor = vehiclePrimaryColor, + SecondaryColor = vehicleSecondaryColor, + Locked = vehicleLocked, + Engine = false, + Dimension = vehicleDimension, + Active = true + }; + saveData.Vehicles.Add(dataSet); + saveData.SaveChanges(); + } + } + + } +} diff --git a/Server/Extensions/ClientExtension.cs b/Server/Extensions/ClientExtension.cs index b9c3c4e8..72022f84 100644 --- a/Server/Extensions/ClientExtension.cs +++ b/Server/Extensions/ClientExtension.cs @@ -19,7 +19,11 @@ namespace reallife_gamemode.Server.Extensions { public static User GetUser(this Client client, DatabaseContext context = null) { +<<<<<<< HEAD if (!client.IsLoggedIn()) return null; +======= + +>>>>>>> feature/client-player-keys using (DatabaseContext dbContext = new DatabaseContext()) if(context == null) { @@ -36,7 +40,70 @@ namespace reallife_gamemode.Server.Extensions public static bool IsLoggedIn(this Client player) { +<<<<<<< HEAD return player.HasData("isLoggedIn") ? player.GetData("isLoggedIn") : false; +======= + if(context == null) + { + using(context = new DatabaseContext()) + { + User u = client.GetUser(); + if (u == null) return null; + return u.GetFaction(); + } + } + else + { + User u = client.GetUser(); + if (u == null) return null; + return u.GetFaction(); + } + } + + public static bool IsLoggedIn(Client player) + { + 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(unbanUser).BanId); + unbanUser.Bans.Remove(targetUser); + unbanUser.SaveChanges(); + } + admin.SendChatMessage(target.Name + " wurde entbannt."); + //TODO ***Admin Info: {ADMIN-NAME} hat {USER-NAME} entbannt. +>>>>>>> feature/client-player-keys } } } diff --git a/Server/Services/ChatService.cs b/Server/Services/ChatService.cs index c28b4627..a9dabf48 100644 --- a/Server/Services/ChatService.cs +++ b/Server/Services/ChatService.cs @@ -27,7 +27,11 @@ namespace reallife_gamemode.Server.Services { player.SendChatMessage("~r~[FEHLER]~s~ Der Spieler wurde nicht gefunden."); } +<<<<<<< HEAD +======= + +>>>>>>> feature/client-player-keys public static void PlayerNotLoggedIn(Client player) { player.SendChatMessage("~r~[FEHLER]~s~ Du bist nicht eingeloggt."); @@ -36,7 +40,10 @@ namespace reallife_gamemode.Server.Services { player.SendChatMessage("~r~[FEHLER]~s~ Die Aktion wurde nicht ausgeführt."); } +<<<<<<< HEAD +======= +>>>>>>> feature/client-player-keys public static void BroadcastFaction(string message, List factions) { foreach (Client c in NAPI.Pools.GetAllPlayers()) @@ -55,6 +62,7 @@ namespace reallife_gamemode.Server.Services public static void BroadcastFaction(string message, Faction faction) { BroadcastFaction(message, new List { faction }); +<<<<<<< HEAD } public static void BroadcastAdmin(string message, AdminLevel minLevel) @@ -66,6 +74,8 @@ namespace reallife_gamemode.Server.Services p.SendChatMessage(message); } }); +======= +>>>>>>> feature/client-player-keys } } } diff --git a/Server/Util/ListPlayer.cs b/Server/Util/ListPlayer.cs new file mode 100644 index 00000000..40ea85c4 --- /dev/null +++ b/Server/Util/ListPlayer.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; + +/** + * @overview Life of German Reallife - Util ListPlayer ListPlayer.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Util +{ + public class ListPlayer + { + public int Id { get; set; } + public string Name { get; set; } + public int Ping { get; set; } + } +}