From 1a5977387b943c8bb6e6715f5fdf39b34226eb45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o?= <48225977+B00STYB00ST@users.noreply.github.com> Date: Sat, 22 Jul 2023 16:45:44 +0200 Subject: [PATCH 1/2] Add files via upload From 3b5e7857aaddfca0fb6d64ff05d911275f53abd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o?= <48225977+B00STYB00ST@users.noreply.github.com> Date: Sat, 22 Jul 2023 16:52:31 +0200 Subject: [PATCH 2/2] Fixed setadmin to prevent promoting to higher rank --- Systems/EssentialAdmin.cs | 3527 +++++++++++++++++++------------------ 1 file changed, 1769 insertions(+), 1758 deletions(-) diff --git a/Systems/EssentialAdmin.cs b/Systems/EssentialAdmin.cs index 2cb7ec4..061971a 100644 --- a/Systems/EssentialAdmin.cs +++ b/Systems/EssentialAdmin.cs @@ -1,1759 +1,1770 @@ -using Life.Network; -using Life.UI; -using Life; -using UnityEngine; -using System.IO; -using Newtonsoft.Json; -using Life.VehicleSystem; -using Mirror; -using Life.PermissionSystem; -using Life.DB; -using Life.AreaSystem; -using System.Collections.Generic; -using System.Threading.Tasks; -using System.Threading; -using Life.InventorySystem; -using System.Linq; - -namespace Essentials -{ - public class EssentialAdmin : BaseEssential - { - public static string adminConfigPath; - - public Dictionary tickets = new Dictionary(); - - private AdminConfig config; - - /// - /// Init Essential Admin system - /// - /// - /// - public override void Init(EssentialsPlugin essentials, LifeServer server) - { - base.Init(essentials, server); - - InitConfig(); - CreateConsoleCommands(); - CreateAdminCommands(); - } - - /// - /// Create console commands - /// - void CreateConsoleCommands() - { - - } - - /// - /// Create admin configuration file or read it - /// - void InitConfig() - { - adminConfigPath = $"{EssentialsPlugin.essentialDirectoryPath}/admin.json"; - - if (!File.Exists(adminConfigPath)) - { - config = new AdminConfig(); - - string json = JsonConvert.SerializeObject(config); - - File.WriteAllText(adminConfigPath, json); - } - else - { - string json = File.ReadAllText(adminConfigPath); - - try - { - config = JsonConvert.DeserializeObject(json); - - string newJson = JsonConvert.SerializeObject(config); - - File.WriteAllText(adminConfigPath, json); - } - catch (System.Exception e) - { - Debug.LogException(e); - } - } - } - - async void TerrainInfoAsync(Player player, LifeArea area) - { - player.SendText($"~ Terrain N°{area.areaId} ~"); - - if (area.permissions != null) - { - if(area.permissions.owner != null) - { - Characters owner = await LifeDB.FetchCharacter(area.permissions.owner.characterId); - - if(owner == null) - { - player.SendText($"Ce terrain n'a pas de propriétaire."); - - return; - } - - string lastConnect = "Inconnu"; - - long seconds = Nova.UnixTimeNow() - owner.LastDisconnect; - - long minutes = seconds / 60; - - if(minutes > 60) - { - long hours = minutes / 60; - - if(hours > 48) - { - long days = hours / 24; - - lastConnect = $"Il y a plus de {days} jours."; - } - else - { - lastConnect = $"Il y a {hours}h."; - } - } - else - { - lastConnect = $"Il y a {minutes} min."; - } - - player.SendText($"Propriétaire: {owner.Firstname} {owner.Lastname} Dernière connexion: {lastConnect}"); - } - else - { - player.SendText($"Ce terrain n'a pas de propriétaire."); - } - - if (area.permissions.coOwners.Count > 0) - { - if(area.permissions.coOwners.Count < 10) - { - foreach (Entity entity in area.permissions.coOwners) - { - Characters coOwner = await LifeDB.FetchCharacter(entity.characterId); - - string lastConnect = "Inconnu"; - - long seconds = Nova.UnixTimeNow() - coOwner.LastDisconnect; - - long minutes = seconds / 60; - - if (minutes > 60) - { - long hours = minutes / 60; - - if (hours > 48) - { - long days = hours / 24; - - lastConnect = $"Il y a plus de {days} jours."; - } - else - { - lastConnect = $"Il y a {hours}h."; - } - } - else - { - lastConnect = $"Il y a {minutes} min."; - } - - player.SendText($"Co-propriétaire: {coOwner.Firstname} {coOwner.Lastname} Dernière connexion: {lastConnect}"); - } - } - else - { - player.SendText($"Ce terrain a plus de 10 co-propriétaires, leur affichage est donc impossible."); - } - } - else - { - player.SendText($"Ce terrain n'a pas de co-propriétaires."); - } - } - else - { - player.SendText($"Ce terrain n'a pas de propriétaire."); - } - } - - /// - /// Create all admin commands - /// - void CreateAdminCommands() - { - SChatCommand terrainInfoCommand = new SChatCommand("/terraininfo", new string[] { "/ti" }, "Show terrain information", "/terraininfo", (player, args) => - { - if(player.IsAdmin) - { - if(player.isInGame && player.setup.areaId > 0) - { - LifeArea area = Nova.a.GetAreaById(player.setup.areaId); - - if(area != null) - { - TerrainInfoAsync(player, area); - }else - { - player.SendText($"Vous n'êtes pas sur un terrain"); - } - } - else - { - player.SendText($"Vous n'êtes pas sur un terrain"); - } - } - }); - - SChatCommand changeNumberCommand = new SChatCommand("/changenumber", "Change the phone number of the nearest player", "/changenumber", (player, args) => - { - if (player.account.adminLevel >= 9) - { - Player closestPlayer = player.GetClosestPlayer(); - - string name = "null"; - - if (closestPlayer != null) - { - name = closestPlayer.GetFullName(); - } - else - { - name = player.GetFullName(); - } - - UIPanel numberPanel = new UIPanel($"Changement de numéro de {name}", UIPanel.PanelType.Input) - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .SetInputPlaceholder("Numéro...") - .AddButton("Valider", (ui) => - { - string number = ui.inputText; - - if (closestPlayer != null) - { - closestPlayer.character.PhoneNumber = number; - _ = closestPlayer.Save(); - } - else - { - player.character.PhoneNumber = number; - _ = player.Save(); - } - - player.SendText($"Numéro modifié avec succès !"); - player.ClosePanel(ui); - }); - - player.ShowPanelUI(numberPanel); - } - }); - - SChatCommand refuelCommand = new SChatCommand("/refuel", "Refuel the current vehicle that you're in", "/refuel", (player, args) => - { - if (player.IsAdmin) - { - Vehicle vehicle = player.GetClosestVehicle(); - - if (vehicle) - { - vehicle.fuel = 100f; - } - } - else - { - player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); - } - }); - - SChatCommand refuelAllCommand = new SChatCommand("/refuelall", "Refual all spawned vehicles", "/refuelall", (player, args) => - { - if (player.IsAdmin) - { - Vehicle[] vehicles = GameObject.FindObjectsOfType(); - - for (int i = 0; i < vehicles.Length; i++) - { - vehicles[i].fuel = 100f; - } - } - else - { - player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); - } - }); - - SChatCommand clearInventoryCommand = new SChatCommand("/clearinventory", new string[] { "/clearinv" }, "Clear your inventory", "/clearinv(entory)", (player, args) => - { - if (player.IsAdmin) - { - player.setup.inventory.Clear(); - } - else - { - player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); - } - }); - - SChatCommand saveCommand = new SChatCommand("/save", "Save the server", "/save", (player, args) => - { - if (player.IsAdmin) - { - _ = server.save.Save(); - } - else - { - player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); - } - }); - - SChatCommand tpPlateCommand = new SChatCommand("/tpveh", "Teleport to vehicle with plate", "/tpveh ", (player, args) => - { - if(args.Length > 0) - { - if (player.IsAdmin) - { - LifeVehicle lifeVeh = Nova.v.GetVehicle(args[0]); - - if(lifeVeh == null) - { - player.SendText($"Véhicule inexistant."); - return; - } - - Vehicle vehicle = Nova.v.GetVehicle(args[0]).instance; - - if(vehicle == null) - { - player.SendText($"Le véhicule est actuellement au garage."); - return; - } - - player.setup.TargetSetPosition(vehicle.transform.position); - } - } - }); - - SChatCommand destroyCommand = new SChatCommand("/destroy", "Destroy nearest quick owner vehicle", "/destroy", (player, args) => - { - if (player.IsAdmin) - { - Vehicle vehicle = player.GetClosestVehicle(5f); - - if (vehicle != null && vehicle.quickOwner > 0) - { - NetworkServer.Destroy(vehicle.gameObject); - } - } - }); - - SChatCommand stowCommand = new SChatCommand("/stowvehicle", new string[] { "/stowveh", "/stow" }, "Stow nearest vehicle or specified vehicle db id", "/stow(vehicle) ", (player, args) => - { - if (player.IsAdmin) - { - if (args.Length > 0) - { - if (int.TryParse(args[0], out int vehicleDbId)) - { - LifeVehicle lifeVehicle = Nova.v.GetVehicle(vehicleDbId); - - if (lifeVehicle == null) - { - player.SendText($"Véhicule introuvable."); - return; - } - else if (lifeVehicle.instance == null) - { - player.SendText($"Le véhicule est rangé au concessionnaire."); - return; - } - - Nova.v.StowVehicle(lifeVehicle.instance.vehicleDbId); - } - else - { - player.SendText($"Format de l'id du véhicule incorrect."); - } - } - else - { - Vehicle vehicle = player.GetClosestVehicle(5f); - - if (vehicle != null && vehicle.vehicleDbId > 0) - { - Nova.v.StowVehicle(vehicle.vehicleDbId); - }else - { - FakeVehicle fake = player.GetClosestFakeVehicle(5f); - - if(fake != null) - { - Nova.v.StowVehicle(fake.vehicleDbId); - } - } - } - } - }); - - SChatCommand stowAllCommand = new SChatCommand("/stowallvehicle", new string[] { "/stowallveh", "/stowall" }, "Stow all spawned vehicle on the map", "/stow(allveh)", (player, args) => - { - if (player.account.adminLevel >= 9) - { - Vehicle[] vehicles = GameObject.FindObjectsOfType(); - - foreach (Vehicle vehicle in vehicles) - { - if (vehicle != null && vehicle.vehicleDbId > 0) - { - Nova.v.StowVehicle(vehicle.vehicleDbId); - } - } - - FakeVehicle[] fakes = GameObject.FindObjectsOfType(); - - foreach (FakeVehicle vehicle in fakes) - { - if (vehicle != null && vehicle.vehicleDbId > 0) - { - Nova.v.StowVehicle(vehicle.vehicleDbId); - } - } - } - }); - - SChatCommand stowAllCivilCommand = new SChatCommand("/stowallcivilvehicle", new string[] { "/stowallcivilveh", "/stowallcivil" }, "Stow all spawned vehicle on the map", "/stow(allveh)", (player, args) => - { - if (player.account.adminLevel >= 9) - { - Vehicle[] vehicles = GameObject.FindObjectsOfType(); - - foreach (Vehicle vehicle in vehicles) - { - if (vehicle != null && vehicle.vehicleDbId > 0 && vehicle.bizId == 0) - { - Nova.v.StowVehicle(vehicle.vehicleDbId); - } - } - - FakeVehicle[] fakes = GameObject.FindObjectsOfType(); - - foreach (FakeVehicle vehicle in fakes) - { - if (vehicle != null && vehicle.vehicleDbId > 0) - { - Nova.v.StowVehicle(vehicle.vehicleDbId); - } - } - } - }); - - SChatCommand bizCommand = new SChatCommand("/editbiz", "Edit the current biz that you're in", "/editbiz", (player, args) => - { - if (!player.IsAdmin) - return; - - UIPanel bizPanel = new UIPanel("Gestion entreprise", UIPanel.PanelType.Tab) - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .AddButton("Sélectionner", (ui) => - { - ui.SelectTab(); - }) - .AddTabLine("Modifier terrain id", (ui) => - { - UIPanel terrainPanel = new UIPanel("Modification de l'id terrain", UIPanel.PanelType.Input) - .SetInputPlaceholder("ID terrain...") - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int terrainId = int.Parse(ui2.inputText); - - if (player.HasBiz()) - { - player.biz.TerrainId = terrainId; - player.biz.Save(); - - player.SendText("Terrain id modifié"); - } - else - { - player.SendText("Vous n'avez pas d'entreprise"); - } - }); - - player.ShowPanelUI(terrainPanel); - }) - .AddTabLine("Modifier id activité", (ui) => - { - UIPanel terrainPanel = new UIPanel("Modification de l'id activité", UIPanel.PanelType.Input) - .SetInputPlaceholder("ID activité...") - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int activityId = int.Parse(ui2.inputText); - - Activities activities = new Activities() - { - ids = new int[] { activityId } - }; - - if (player.HasBiz()) - { - player.biz.Activities = JsonUtility.ToJson(activities); - player.biz.Save(); - - player.SendText("Activité id modifié"); - } - else - { - player.SendText("Vous n'avez pas d'entreprise"); - } - }); - - player.ShowPanelUI(terrainPanel); - }) - .AddTabLine("Se définir propriétaire", (ui) => - { - player.biz.OwnerId = player.character.Id; - player.biz.Save(); - - player.SendText($"Vous êtes désormais propriétaire de l'entreprise."); - }); - - player.ShowPanelUI(bizPanel); - }); - - SChatCommand vehicleCommand = new SChatCommand("/vehicle", new string[] { "/v", "/veh" }, "Vehicle admin menu", "/v(ehicle)", (player, args) => - { - if (!player.IsAdmin) - return; - - UIPanel vAdminPanel = new UIPanel("Gestion véhicule", UIPanel.PanelType.Tab) - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .AddButton("Sélectionner", (ui) => - { - ui.SelectTab(); - }) - .AddTabLine("Définir id entreprise", (ui) => - { - if (player.GetVehicleId() == 0) - { - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - return; - } - - UIPanel idEntreprisePanel = new UIPanel("Définir id entreprise véhicule", UIPanel.PanelType.Input) - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int entId = int.Parse(ui2.inputText); - - Vehicle vehicle = NetworkServer.spawned[player.GetVehicleId()].GetComponent(); - - vehicle.bizId = entId; - - LifeVehicle lifeVehicle = Nova.v.GetVehicle(vehicle.vehicleDbId); - - lifeVehicle.bizId = entId; - lifeVehicle.Save(); - - player.ClosePanel(ui2); - player.SendText(string.Format("Entreprise modifiée avec succès.", LifeServer.COLOR_GREEN)); - }); - - player.ShowPanelUI(idEntreprisePanel); - }) - .AddTabLine("Définir propriétaire", (ui) => - { - if (player.GetVehicleId() == 0) - { - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - return; - } - - UIPanel idProprietairePanel = new UIPanel("Définir id propriétaire", UIPanel.PanelType.Input) - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int ownerId = int.Parse(ui2.inputText); - - Vehicle vehicle = NetworkServer.spawned[player.GetVehicleId()].GetComponent(); - - LifeVehicle lifeVehicle = Nova.v.GetVehicle(vehicle.vehicleDbId); - - lifeVehicle.permissions.owner = new Entity() { characterId = ownerId }; - lifeVehicle.Save(); - - player.ClosePanel(ui2); - player.SendText(string.Format("Propriétaire modifié avec succès.", LifeServer.COLOR_GREEN)); - }); - - player.ShowPanelUI(idProprietairePanel); - }) - .AddTabLine("Créer véhicule", (ui) => - { - UIPanel vPanel = new UIPanel("Véhicule", UIPanel.PanelType.Tab) - .AddButton("Fermer", (ui1) => - { - player.ClosePanel(ui1); - }) - .AddButton("Sélectionner", (ui1) => - { - ui1.SelectTab(); - }); - - for (int i = 0; i < Nova.v.vehicleModels.Length; i++) - { - Vehicle vehicle = Nova.v.vehicleModels[i]; - - if (!vehicle.isDeprecated) - { - int vehId = i; - vPanel.AddTabLine(vehicle.vehicleName, (ui1) => - { - int vehicleId = vehId; - string vStr = string.Format("{0}", vehicle.vehicleName).ToLower(); - - Permissions permissions = new Permissions() - { - owner = new Entity() - { - characterId = player.character.Id - } - }; - - CreateVehicle(player, vehicleId, permissions); - }); - } - - } - player.ShowPanelUI(vPanel); - }) - .AddTabLine("Créer véhicule par id", (ui) => - { - UIPanel createVehicle = new UIPanel("Créer véhicule", UIPanel.PanelType.Input) - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int vehicleId = int.Parse(ui2.inputText); - - if (vehicleId >= Nova.v.vehiclesModelName.Length) - return; - - Permissions permissions = new Permissions() - { - owner = new Entity() - { - characterId = player.character.Id - } - }; - - CreateVehicle(player, vehicleId, permissions); - }); - - player.ShowPanelUI(createVehicle); - }) - .AddTabLine("Définir la couleur", (ui) => - { - if (player.GetVehicleId() == 0) - { - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - return; - } - - uint vehicleId = player.GetVehicleId(); - UIPanel vehColorPanel = new UIPanel("Définir la couleur du véhicule", UIPanel.PanelType.Tab) - .AddButton("Fermer", (ui1) => - { - player.ClosePanel(ui1); - }) - .AddButton("Valider", (ui1) => - { - ui1.SelectTab(); - }) - .AddTabLine("#ffffff", (ui1) => //Blanc - { - Color color = Nova.HexToColor("#ffffff"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#777777", (ui1) => //Gris Clair - { - Color color = Nova.HexToColor("#777777"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#555555", (ui1) => //Gris - { - Color color = Nova.HexToColor("#555555"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#333333", (ui1) => //Gris Foncé - { - Color color = Nova.HexToColor("#333333"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#000000", (ui1) => //Noir - { - Color color = Nova.HexToColor("#000000"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#ff0000", (ui1) => //Rouge - { - Color color = Nova.HexToColor("#ff0000"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#7b0000", (ui1) => //Rouge Foncé - { - Color color = Nova.HexToColor("#7b0000"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#ffff00", (ui1) => //Jaune - { - Color color = Nova.HexToColor("#ffff00"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#7b7b00", (ui1) => //Jaune Foncé - { - Color color = Nova.HexToColor("#7b7b00"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#00ff00", (ui1) => // Vert - { - Color color = Nova.HexToColor("#00ff00"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#007b00", (ui1) => // Vert Foncé - { - Color color = Nova.HexToColor("#007b00"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#00ffff", (ui1) => // Vert - { - Color color = Nova.HexToColor("#00ffff"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#007b7b", (ui1) => // Vert Foncé - { - Color color = Nova.HexToColor("#007b7b"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#0000ff", (ui1) => // Bleu - { - Color color = Nova.HexToColor("#0000ff"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#00007b", (ui1) => // Bleu Foncé - { - Color color = Nova.HexToColor("#00007b"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#ff00ff", (ui1) => // Rose - { - Color color = Nova.HexToColor("#ff00ff"); - ColorVehicle(vehicleId, color); - }) - .AddTabLine("#7b007b", (ui1) => // Violet - { - Color color = Nova.HexToColor("#7b007b"); - ColorVehicle(vehicleId, color); - }); - - player.ShowPanelUI(vehColorPanel); - }) - .AddTabLine("Définir la couleur (hexadécimal)", (ui) => - { - UIPanel hexColorPanel = new UIPanel("Modifier la couleur", UIPanel.PanelType.Input) - .AddButton("Annuler", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - Color color = Nova.HexToColor(ui2.inputText); - uint vehicleId = player.GetVehicleId(); - if (vehicleId > 0U) - { - Vehicle component = NetworkServer.spawned[vehicleId].GetComponent(); - component.Networkcolor = color; - LifeVehicle vehicle = Nova.v.GetVehicle(component.plate); - if (vehicle != null) - { - vehicle.color = Nova.ColorToHex(color); - vehicle.Save(); - } - } - else - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - }) - .SetInputPlaceholder("#ffffff"); - - player.ShowPanelUI(hexColorPanel); - }) - .AddTabLine("Refuel", (ui) => - { - Vehicle vehicle = player.GetClosestVehicle(); - - if (vehicle) - { - vehicle.fuel = 100f; - } - }) - .AddTabLine("Réparer", (ui) => - { - Vehicle vehicle = player.GetClosestVehicle(); - - if (vehicle != null) - { - vehicle.Repair(); - player.ClosePanel(ui); - player.SendText(string.Format(" Véhicule réparé avec succès.", LifeServer.COLOR_GREEN)); - } - }) - .AddTabLine("Ranger", (ui) => - { - Vehicle vehicle = player.GetClosestVehicle(); - - if (vehicle != null && vehicle.vehicleDbId > 0) - { - Nova.v.StowVehicle(vehicle.vehicleDbId); - } - }); - - player.ShowPanelUI(vAdminPanel); - }); - - SChatCommand serviceAdminCommand = new SChatCommand("/serviceadmin", new string[] { "/sa", "/adminservice" }, "Admin service", "/serviceadmin", (player, args) => - { - if (player.IsAdmin) - { - if (!player.isAuthAdmin) - { - player.SendText($"Vous n'êtes pas authentifié."); - return; - } - - if (player.serviceAdmin) - { - player.SetAdminService(false); - player.SendText(string.Format("Service admin désactivé !", LifeServer.COLOR_RED)); - } - else - { - player.SetAdminService(true); - player.SendText(string.Format("Service admin activé !", LifeServer.COLOR_GREEN)); - } - - player.serviceAdmin = !player.serviceAdmin; - } - - }); - - SChatCommand stopCommand = new SChatCommand("/stop", "Stop the server", "/stop", (player, args) => - { - if (player.IsAdmin) - server.Stop(); - else - player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); - }); - - SChatCommand fpsCommand = new SChatCommand("/fps", "Show server fps", "/fps", (player, args) => - { - float msec = Time.deltaTime * 1000.0f; - float fps = 1.0f / Time.deltaTime; - - player.SendText(string.Format("STATS SERVEUR: {0:0.0} ms ({1:0.} fps)", msec, fps)); - }); - - SChatCommand prisonCommand = new SChatCommand("/prison", "Put nearest player in prison", "/prison", (player, args) => - { - if (!player.IsAdmin) - return; - - Player closestPlayer = player.GetClosestPlayer(); - - if (closestPlayer != null) - { - if (closestPlayer.GetVehicleId() != 0) - { - player.SendText(string.Format("Impossible de mettre en prison, faites le sortir du véhicule !", LifeServer.COLOR_RED)); - } - else - { - UIPanel prisonPanel = new UIPanel(string.Format("Mise en prison de {0}", closestPlayer.GetFullName()), UIPanel.PanelType.Input) - .SetText("Entrez la durée de la prison en minutes :") - .SetInputPlaceholder("Durée...") - .AddButton("Annuler", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int time = 0; - - int.TryParse(ui2.inputText, out time); - - if (time > 0) - { - closestPlayer.setup.prisonTime = time * 60; - player.SendText(string.Format("Vous avez mis {1} en prison.", LifeServer.COLOR_GREEN, closestPlayer.GetFullName())); - closestPlayer.SendText(string.Format("Vous avez été placé en prison admin par {1}.", LifeServer.COLOR_RED, player.GetFullName())); - } - else - { - player.SendText(string.Format("Saisissez une valeur supérieur à 0 !", LifeServer.COLOR_RED)); - } - }); - - player.ShowPanelUI(prisonPanel); - } - } - }); - - SChatCommand bcrCommand = new SChatCommand("/removebcr", "Remove bcr to nearest player", "/removebcr", (player, args) => - { - if (!player.IsAdmin) - return; - - Player closestPlayer = player.GetClosestPlayer(); - - if (closestPlayer != null) - { - if (closestPlayer.GetVehicleId() != 0) - { - player.SendText(string.Format("Impossible de lui retirer son BCR, faites le sortir du véhicule !", LifeServer.COLOR_RED)); - } - else - { - UIPanel prisonPanel = new UIPanel(string.Format("Retrait du BCR de {0}", closestPlayer.GetFullName()), UIPanel.PanelType.Text) - .SetText("Retrait du BCR :") - .AddButton("Annuler", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - closestPlayer.character.HasBCR = false; - closestPlayer.setup.TargetLockCFM(true); - closestPlayer.setup.TargetSetPosition(new Vector3(757.7316f, 50.6f, 679.578f)); // spawn position - closestPlayer.SendText($"Un administrateur vous a retiré votre brevet de connaissance des règles."); - }); - - player.ShowPanelUI(prisonPanel); - } - } - }); - - SChatCommand flipCommand = new SChatCommand("/flip", "Flip the current vehicle that you're in", "/flip", (player, args) => - { - if (player.IsAdmin) - { - uint vehicleId = player.GetVehicleId(); - - if (vehicleId > 0) - { - NetworkServer.spawned[vehicleId].GetComponent().RpcFlip(); - - NetworkServer.spawned[vehicleId].transform.rotation = Quaternion.Euler(Vector3.zero); - NetworkServer.spawned[vehicleId].transform.position += Vector3.up * 2f; - } - else - { - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - } - } - }); - - SChatCommand setAdminCommand = new SChatCommand("/setadmin", "Set nearest player admin", "/setadmin", (player, args) => - { - if (player.account.adminLevel > 7) - { - Player closest = player.GetClosestPlayer(); - - if (closest != null) - { - UIPanel setAdminPanel = new UIPanel(string.Format("Définir rang admin de {0}", closest.account.username), UIPanel.PanelType.Input) - .SetInputPlaceholder("Rang admin...") - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .AddButton("Valider", (ui) => - { - closest.account.adminLevel = int.Parse(ui.inputText); - _ = closest.Save(); - player.ClosePanel(ui); - }); - - player.ShowPanelUI(setAdminPanel); - } - } - }); - - SChatCommand editTerrainCommand = new SChatCommand("/terrain", new string[] { "/t" }, "Edit the terrain that you're in", "/t(errain", (player, args) => - { - if (!player.IsAdmin) - return; - - UIPanel terrainPanel = new UIPanel("Gestion terrain", UIPanel.PanelType.Tab) - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .AddButton("Sélectionner", (ui) => - { - ui.SelectTab(); - }) - .AddTabLine("Supprimer co-propriétaires", (ui) => - { - LifeArea area = Nova.a.GetAreaById(player.setup.areaId); - - area.permissions = new Permissions() { coOwners = new List() }; - - area.Save(); - - player.SendText("Co-propriétaires modifiés !"); - }) - .AddTabLine("Modifier propriétaire", (ui) => - { - UIPanel proprioPanel = new UIPanel("Modification du proprio", UIPanel.PanelType.Input) - .SetInputPlaceholder("ID perso...") - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int proprio = int.Parse(ui2.inputText); - - if (player.setup.areaId > 0) - { - LifeArea area = Nova.a.GetAreaById(player.setup.areaId); - - area.permissions = new Permissions() { owner = new Entity() { characterId = proprio }, coOwners = new List() }; - - area.Save(); - - player.SendText("Propriétaire modifié !"); - player.ClosePanel(ui2); - } - }); - - player.ShowPanelUI(proprioPanel); - }) - .AddTabLine("Modifier prix location", (ui) => - { - UIPanel pricePanel = new UIPanel("Modification du prix de location", UIPanel.PanelType.Input) - .SetInputPlaceholder("Prix...") - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int price = int.Parse(ui2.inputText); - - if (player.setup.areaId > 0) - { - LifeArea area = Nova.a.GetAreaById(player.setup.areaId); - - area.rentPrice = price; - - if (area.rentPrice > 0) - { - area.isRentable = true; - } - else - { - area.isRentable = false; - } - - area.Save(); - - player.SendText("Prix de location modifié !"); - player.ClosePanel(ui2); - } - }); - - player.ShowPanelUI(pricePanel); - }) - .AddTabLine("Modifier prix", (ui) => - { - UIPanel pricePanel = new UIPanel("Modification du prix", UIPanel.PanelType.Input) - .SetInputPlaceholder("Prix...") - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - int price = int.Parse(ui2.inputText); - - if (player.setup.areaId > 0) - { - LifeArea area = Nova.a.GetAreaById(player.setup.areaId); - - area.price = price; - - area.Save(); - - player.SendText("Prix modifié !"); - player.ClosePanel(ui2); - } - }); - - player.ShowPanelUI(pricePanel); - }); - - player.ShowPanelUI(terrainPanel); - }); - - SChatCommand giveBcrCommand = new SChatCommand("/givebcr", new string[] { "/addbcr" }, "Give bcr to nearest player or yourself", "/givebcr", (player, args) => - { - if (!player.IsAdmin) - return; - - Player closestPlayer = player.GetClosestPlayer(); - - if (closestPlayer != null) - { - closestPlayer.character.HasBCR = true; - closestPlayer.setup.TargetLockCFM(false); - - closestPlayer.SendText($"Un administrateur vous a donné le BCR."); - } else - { - player.character.HasBCR = true; - player.setup.TargetLockCFM(false); - - player.SendText($"Vous vous êtes donné le BCR."); - } - }); - - SChatCommand dayCommand = new SChatCommand("/day", "Set day", "/day", (player, args) => - { - if (!player.IsAdmin) - return; - - EnviroSkyMgr.instance.SetTimeOfDay(11f); - }); - - SChatCommand nightCommand = new SChatCommand("/night", "Set night", "/night", (player, args) => - { - if (!player.IsAdmin) - return; - - EnviroSkyMgr.instance.SetTimeOfDay(20f); - }); - - SChatCommand morningCommand = new SChatCommand("/morning", "Set morning", "/morning", (player, args) => - { - if (!player.IsAdmin) - return; - - EnviroSkyMgr.instance.SetTimeOfDay(6f); - }); - - SChatCommand timesetCommand = new SChatCommand("/timeset", new string[] { "/time" }, "Set time of day", "/timeset <12,5>", (player, args) => - { - if (!player.IsAdmin) - return; - - if (args.Length == 1) - { - if (float.TryParse(args[0], out float result)) - { - EnviroSkyMgr.instance.SetTimeOfDay(result); - - player.SendText($"Time set to {result}"); - } - else - { - player.SendText($"USAGE: /timeset <12,5>"); - } - } - else - { - player.SendText($"USAGE: /timeset <12,5>"); - } - }); - - SChatCommand setPinCommand = new SChatCommand("/setpin", "Set admin pin", "/setpin", (player, args) => - { - if (!player.IsAdmin && player.account.adminLevel < 10 && !player.isAuthAdmin) - return; - - Player closestPlayer = player.GetClosestPlayer(); - - if (closestPlayer != null) - { - UIPanel pin = new UIPanel(string.Format("Code pin de {0}", closestPlayer.GetFullName()), UIPanel.PanelType.Input) - .SetText("Entrez le code pin :") - .SetInputPlaceholder("Code...") - .AddButton("Annuler", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Valider", (ui2) => - { - closestPlayer.account.adminPin = ui2.inputText; - _ = closestPlayer.Save(); - player.SendText("Pin modifié !"); - player.ClosePanel(ui2); - }); - - player.ShowPanelUI(pin); - } - }); - - SChatCommand forwardCommand = new SChatCommand("/forward", "Move vehicle forward", "/forward", (player, args) => - { - if (player.IsAdmin) - { - uint vehicleId = player.GetVehicleId(); - - if (vehicleId > 0) - { - NetworkServer.spawned[vehicleId].GetComponent().RpcAddPosition(NetworkServer.spawned[vehicleId].transform.forward); - - NetworkServer.spawned[vehicleId].transform.position += NetworkServer.spawned[vehicleId].transform.forward; - } - else - { - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - } - } - }); - - SChatCommand backwardCommand = new SChatCommand("/backward", "Move vehicle backward", "/backward", (player, args) => - { - if (player.IsAdmin) - { - uint vehicleId = player.GetVehicleId(); - - if (vehicleId > 0) - { - NetworkServer.spawned[vehicleId].GetComponent().RpcAddPosition(-NetworkServer.spawned[vehicleId].transform.forward); - - NetworkServer.spawned[vehicleId].transform.position -= NetworkServer.spawned[vehicleId].transform.forward; - } - else - { - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - } - } - }); - - SChatCommand rightCommand = new SChatCommand("/right", "Move vehicle right", "/right", (player, args) => - { - if (player.IsAdmin) - { - uint vehicleId = player.GetVehicleId(); - - if (vehicleId > 0) - { - NetworkServer.spawned[vehicleId].GetComponent().RpcAddPosition(NetworkServer.spawned[vehicleId].transform.right); - - NetworkServer.spawned[vehicleId].transform.position += NetworkServer.spawned[vehicleId].transform.right; - } - else - { - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - } - } - }); - - SChatCommand leftCommand = new SChatCommand("/left", "Move vehicle left", "/left", (player, args) => - { - if (player.IsAdmin) - { - uint vehicleId = player.GetVehicleId(); - - if (vehicleId > 0) - { - NetworkServer.spawned[vehicleId].GetComponent().RpcAddPosition(-NetworkServer.spawned[vehicleId].transform.right); - - NetworkServer.spawned[vehicleId].transform.position -= NetworkServer.spawned[vehicleId].transform.right; - } - else - { - player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); - } - } - }); - - SChatCommand ticketsCommand = new SChatCommand("/tickets", "Open ticket panel", "/tickets", (player, args) => - { - if (player.IsAdmin) - { - UIPanel tickets = new UIPanel("Liste des tickets", UIPanel.PanelType.Tab) - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .AddButton("Fermer le ticket", (ui) => - { - int ticketId = ui.selectedTab; - KeyValuePair ticket = this.tickets.ElementAt(ticketId); - - if(ticket.Key != null) - { - ticket.Key.SendText($"Votre ticket a été fermé par un administrateur."); - this.tickets.Remove(ticket.Key); - player.ClosePanel(ui); - } - }) - .AddButton("Intervenir (TP)", (ui) => - { - ui.SelectTab(); - }); - - foreach (KeyValuePair ticket in this.tickets) - { - if (ticket.Key == null) - continue; - if (ticket.Key.conn == null) - continue; - if (ticket.Key.setup == null) - continue; - - string value = ""; - - if (ticket.Value.Length > 30) - value = ticket.Value.Substring(0, 30); - else - value = ticket.Value; - - tickets.AddTabLine(string.Format("{0} {1} - {2}", new string[] { ticket.Key.character.Firstname, ticket.Key.character.Lastname, value }), (ui2) => - { - player.ClosePanel(ui2); - player.setup.TargetSetPosition(ticket.Key.setup.transform.position); - ticket.Key.ticketOpen = false; - this.tickets.Remove(ticket.Key); - }); - } - - player.ShowPanelUI(tickets); - } - }); - - SChatCommand annoCommand = new SChatCommand("/announce", new string[] { "/anno", "/annonce" }, "Announce in admin", "/anno(unce) ", (player, args) => - { - string text = ""; - - for (int i = 0; i < args.Length; i++) - text += $"{args[i]} "; - - if (player.IsAdmin && player.isAuthAdmin) - { - server.SendMessageToAll($"[ANNONCE] {text}"); - } - }); - - SChatCommand banCommand = new SChatCommand("/ban", "Ban offline player", "/ban", (player, args) => - { - if (!player.IsAdmin) - return; - - BanPlayer(player); - }); - - SChatCommand banSteamCommand = new SChatCommand("/bansteam", "Ban offline player by steam id", "/bansteam", (player, args) => - { - if (!player.IsAdmin) - return; - - BanSteamPlayer(player); - }); - - SChatCommand unbanCommand = new SChatCommand("/unban", "Unban player", "/unban", (player, args) => - { - if (!player.IsAdmin) - return; - - UIPanel passPanel = new UIPanel("Unban", UIPanel.PanelType.Input) - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .AddButton("Débannir", (ui) => - { - int id = int.Parse(ui.inputText); - - Unban(id); - - player.ClosePanel(ui); - }); - - player.ShowPanelUI(passPanel); - }); - - SChatCommand giveCommand = new SChatCommand("/give", new string[] { "/g" }, "Give item to yourself", "/g(ive) ", (player, args) => - { - if(player.IsAdmin) - { - if(player.isAuthAdmin) - { - if(args.Length == 0 || args.Length > 2) - { - player.SendText($"USAGE: /g(ive) "); - return; - } - - Item item = null; - - if(!int.TryParse(args[0], out int itemId)) - { - item = Nova.man.item.GetItem(args[0]); - - if(item == null) - { - player.SendText($"Merci de saisir un nombre ou un nom d'item valide (e.g. /give 6 ou /give sausage)"); - return; - } - - itemId = item.id; - }else - { - item = Nova.man.item.GetItem(itemId); - } - - int number = 1; - - if(args.Length == 2 && int.TryParse(args[1], out int _number)) - { - number = _number; - } - - if(item == null) - { - player.SendText($"Cet objet n'existe pas."); - return; - } - - string data = ""; - - if(item is StateItem) - { - data = (item as StateItem).GetBaseData(); - } - - if(!player.setup.inventory.AddItem(itemId, number, data)) - { - player.SendText($"Vous n'avez pas assez de place dans votre inventaire."); - return; - } - - player.SendText($"Vous avez reçu {number}x {item.itemName}."); - }else - player.SendText($"Vous n'êtes pas authentifié."); - } - else - { - player.SendText($"Permissions insuffissantes."); - } - }); - - SChatCommand weatherCommand = new SChatCommand("/weather", new string[] { "/w" }, "Set weather", "/w(eather) ", (player, args) => - { - if(player.IsAdmin) - { - if (player.isAuthAdmin) - { - if(args.Length != 1) - { - player.SendText($"USAGE: /w(eather) "); - return; - } - - switch(args[0]) - { - case "clear": - server.world.SetWeather(Life.Network.Systems.SWorld.Weather.ClearSky); - break; - case "cloudy": - server.world.SetWeather(Life.Network.Systems.SWorld.Weather.Cloudy1); - break; - case "foggy": - server.world.SetWeather(Life.Network.Systems.SWorld.Weather.Foggy); - break; - case "lightrain": - server.world.SetWeather(Life.Network.Systems.SWorld.Weather.LightRain); - break; - case "rain": - server.world.SetWeather(Life.Network.Systems.SWorld.Weather.HeavyRain); - break; - case "storm": - server.world.SetWeather(Life.Network.Systems.SWorld.Weather.Storm); - break; - } - } - else - player.SendText($"Vous n'êtes pas authentifié."); - } - else - { - player.SendText($"Permissions insuffissantes."); - } - }); - - terrainInfoCommand.Register(); - unbanCommand.Register(); - weatherCommand.Register(); - giveCommand.Register(); - annoCommand.Register(); - ticketsCommand.Register(); - leftCommand.Register(); - rightCommand.Register(); - backwardCommand.Register(); - forwardCommand.Register(); - setPinCommand.Register(); - timesetCommand.Register(); - dayCommand.Register(); - nightCommand.Register(); - morningCommand.Register(); - giveBcrCommand.Register(); - editTerrainCommand.Register(); - setAdminCommand.Register(); - flipCommand.Register(); - bcrCommand.Register(); - prisonCommand.Register(); - fpsCommand.Register(); - stopCommand.Register(); - serviceAdminCommand.Register(); - vehicleCommand.Register(); - bizCommand.Register(); - stowAllCommand.Register(); - stowAllCivilCommand.Register(); - stowCommand.Register(); - destroyCommand.Register(); - saveCommand.Register(); - clearInventoryCommand.Register(); - refuelAllCommand.Register(); - refuelCommand.Register(); - changeNumberCommand.Register(); - tpPlateCommand.Register(); - banCommand.Register(); - banSteamCommand.Register(); - } - - public void BanPlayer(Player player) - { - UIPanel panel = new UIPanel("Bannir un joueur hors ligne", UIPanel.PanelType.Input) - .SetInputPlaceholder("Prénom NOM") - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .AddButton("Suivant", async (ui) => - { - string fullname = ui.inputText; - - string[] names = fullname.Split(' '); - - string firstname = names[0]; - string lastname = ""; - - for (int i = 1; i < names.Length; i++) - { - if (i > 1) - lastname += $" {names[i]}"; - else - lastname += $"{names[i]}"; - } - - Characters character = await LifeDB.FetchCharacter(firstname, lastname); - - if (character == null) - { - player.SendText($"Joueur introuvable."); - return; - } - - UIPanel panel2 = new UIPanel("Bannir un joueur hors ligne - temps", UIPanel.PanelType.Input) - .SetInputPlaceholder("Temps en heure...") - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Bannir", async (ui2) => - { - int number = int.Parse(ui2.inputText); - - Account account = await LifeDB.FetchAccount(character.AccountId); - - account.banTimestamp = (number == -1) ? -1 : Nova.UnixTimeNow() + number * 3600; - - _ = LifeDB.SaveAccount(account); - - player.SendText($"Joueur {account.username} AKA {character.Firstname} {character.Lastname} banni."); - - player.ClosePanel(ui2); - }); - - player.ShowPanelUI(panel2); - }); - - player.ShowPanelUI(panel); - } - - public void BanSteamPlayer(Player player) - { - UIPanel panel = new UIPanel("Bannir un joueur hors ligne par SteamID", UIPanel.PanelType.Input) - .SetInputPlaceholder("SteamId") - .AddButton("Fermer", (ui) => - { - player.ClosePanel(ui); - }) - .AddButton("Suivant", async (ui) => - { - string steamId = ui.inputText; - - Account account = await LifeDB.FetchAccount(steamId); - - - UIPanel panel2 = new UIPanel("Bannir un joueur hors ligne - temps", UIPanel.PanelType.Input) - .SetInputPlaceholder("Temps en heure...") - .AddButton("Fermer", (ui2) => - { - player.ClosePanel(ui2); - }) - .AddButton("Bannir", async (ui2) => - { - int number = int.Parse(ui2.inputText); - - account.banTimestamp = (number == -1) ? -1 : Nova.UnixTimeNow() + number * 3600; - - _ = LifeDB.SaveAccount(account); - - player.SendText($"Joueur {account.username} banni."); - - player.ClosePanel(ui2); - }); - - player.ShowPanelUI(panel2); - }); - - player.ShowPanelUI(panel); - } - - public async void Unban(int accountId) - { - await LifeDB.Unban(accountId); - } - - public void OnPlayerTicket(Player player, string ticket) - { - tickets.Add(player, ticket); - player.ticketOpen = true; - - for (int i = 0; i < server.Players.Count; i++) - { - if (server.Players[i].IsAdmin && server.Players[i].serviceAdmin) - { - string text = string.Format("Nouveau ticket de {0} {1}. Message : {2}. \n /tickets pour voir la liste des tickets", new string[] { player.character.Firstname, player.character.Lastname, ticket }); - server.Players[i].SendText(text); - server.Players[i].setup.TargetPlayClairon(0.2f); - } - } - } - - async void CreateVehicle(Player player, int vehicleId, Permissions permissions) - { - if (Nova.v.vehicleModels[vehicleId].isDeprecated) - { - player.SendText(string.Format("Impossible de faire apparaître un véhicule déprécié.", LifeServer.COLOR_RED)); - return; - } - - Vehicles vehicles = await LifeDB.CreateVehicle(vehicleId, JsonUtility.ToJson(permissions)); - - player.SendText(string.Format("Véhicule créé avec succès", LifeServer.COLOR_GREEN)); - - LifeVehicle vehicle = Nova.v.GetVehicle(vehicles.Id); - - if (vehicle.instance == null) - { - Vehicle instance = GameObject.Instantiate(Nova.v.vehicleModels[vehicle.modelId], player.setup.transform.position, player.setup.transform.rotation); - - NetworkServer.Spawn(instance.gameObject); - - instance.color = Nova.HexToColor(vehicle.color); - instance.plate = vehicle.plate; - - if (instance.engineInventory) - { - if (vehicle.engineInventory.Length > 0) - instance.engineInventory.DeserializeJson(vehicle.engineInventory); - } - - if (instance.vehicleInventory) - { - if (vehicle.inventory.Length > 0) - instance.vehicleInventory.DeserializeJson(vehicle.inventory); - } - - - vehicle.instance = instance; - instance.vehicleDbId = vehicle.vehicleId; - instance.fuel = vehicle.fuel; - } - - vehicle.isStowed = false; - - await Task.Delay(2000); - - vehicle.Save(); - } - - void ColorVehicle(uint vehicleId, Color color) - { - Vehicle component = NetworkServer.spawned[vehicleId].GetComponent(); - component.Networkcolor = color; - LifeVehicle vehicle = Nova.v.GetVehicle(component.plate); - if (vehicle != null) - { - vehicle.color = Nova.ColorToHex(color); - vehicle.Save(); - } - } - } - - [System.Serializable] - public class AdminConfig - { - public void Save() - { - string json = JsonConvert.SerializeObject(this); - - File.WriteAllText(EssentialAdmin.adminConfigPath, json); - } - } +using Life.Network; +using Life.UI; +using Life; +using UnityEngine; +using System.IO; +using Newtonsoft.Json; +using Life.VehicleSystem; +using Mirror; +using Life.PermissionSystem; +using Life.DB; +using Life.AreaSystem; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Threading; +using Life.InventorySystem; +using System.Linq; + +namespace Essentials +{ + public class EssentialAdmin : BaseEssential + { + public static string adminConfigPath; + + public Dictionary tickets = new Dictionary(); + + private AdminConfig config; + + /// + /// Init Essential Admin system + /// + /// + /// + public override void Init(EssentialsPlugin essentials, LifeServer server) + { + base.Init(essentials, server); + + InitConfig(); + CreateConsoleCommands(); + CreateAdminCommands(); + } + + /// + /// Create console commands + /// + void CreateConsoleCommands() + { + + } + + /// + /// Create admin configuration file or read it + /// + void InitConfig() + { + adminConfigPath = $"{EssentialsPlugin.essentialDirectoryPath}/admin.json"; + + if (!File.Exists(adminConfigPath)) + { + config = new AdminConfig(); + + string json = JsonConvert.SerializeObject(config); + + File.WriteAllText(adminConfigPath, json); + } + else + { + string json = File.ReadAllText(adminConfigPath); + + try + { + config = JsonConvert.DeserializeObject(json); + + string newJson = JsonConvert.SerializeObject(config); + + File.WriteAllText(adminConfigPath, json); + } + catch (System.Exception e) + { + Debug.LogException(e); + } + } + } + + async void TerrainInfoAsync(Player player, LifeArea area) + { + player.SendText($"~ Terrain N°{area.areaId} ~"); + + if (area.permissions != null) + { + if(area.permissions.owner != null) + { + Characters owner = await LifeDB.FetchCharacter(area.permissions.owner.characterId); + + if(owner == null) + { + player.SendText($"Ce terrain n'a pas de propriétaire."); + + return; + } + + string lastConnect = "Inconnu"; + + long seconds = Nova.UnixTimeNow() - owner.LastDisconnect; + + long minutes = seconds / 60; + + if(minutes > 60) + { + long hours = minutes / 60; + + if(hours > 48) + { + long days = hours / 24; + + lastConnect = $"Il y a plus de {days} jours."; + } + else + { + lastConnect = $"Il y a {hours}h."; + } + } + else + { + lastConnect = $"Il y a {minutes} min."; + } + + player.SendText($"Propriétaire: {owner.Firstname} {owner.Lastname} Dernière connexion: {lastConnect}"); + } + else + { + player.SendText($"Ce terrain n'a pas de propriétaire."); + } + + if (area.permissions.coOwners.Count > 0) + { + if(area.permissions.coOwners.Count < 10) + { + foreach (Entity entity in area.permissions.coOwners) + { + Characters coOwner = await LifeDB.FetchCharacter(entity.characterId); + + string lastConnect = "Inconnu"; + + long seconds = Nova.UnixTimeNow() - coOwner.LastDisconnect; + + long minutes = seconds / 60; + + if (minutes > 60) + { + long hours = minutes / 60; + + if (hours > 48) + { + long days = hours / 24; + + lastConnect = $"Il y a plus de {days} jours."; + } + else + { + lastConnect = $"Il y a {hours}h."; + } + } + else + { + lastConnect = $"Il y a {minutes} min."; + } + + player.SendText($"Co-propriétaire: {coOwner.Firstname} {coOwner.Lastname} Dernière connexion: {lastConnect}"); + } + } + else + { + player.SendText($"Ce terrain a plus de 10 co-propriétaires, leur affichage est donc impossible."); + } + } + else + { + player.SendText($"Ce terrain n'a pas de co-propriétaires."); + } + } + else + { + player.SendText($"Ce terrain n'a pas de propriétaire."); + } + } + + /// + /// Create all admin commands + /// + void CreateAdminCommands() + { + SChatCommand terrainInfoCommand = new SChatCommand("/terraininfo", new string[] { "/ti" }, "Show terrain information", "/terraininfo", (player, args) => + { + if(player.IsAdmin) + { + if(player.isInGame && player.setup.areaId > 0) + { + LifeArea area = Nova.a.GetAreaById(player.setup.areaId); + + if(area != null) + { + TerrainInfoAsync(player, area); + }else + { + player.SendText($"Vous n'êtes pas sur un terrain"); + } + } + else + { + player.SendText($"Vous n'êtes pas sur un terrain"); + } + } + }); + + SChatCommand changeNumberCommand = new SChatCommand("/changenumber", "Change the phone number of the nearest player", "/changenumber", (player, args) => + { + if (player.account.adminLevel >= 9) + { + Player closestPlayer = player.GetClosestPlayer(); + + string name = "null"; + + if (closestPlayer != null) + { + name = closestPlayer.GetFullName(); + } + else + { + name = player.GetFullName(); + } + + UIPanel numberPanel = new UIPanel($"Changement de numéro de {name}", UIPanel.PanelType.Input) + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .SetInputPlaceholder("Numéro...") + .AddButton("Valider", (ui) => + { + string number = ui.inputText; + + if (closestPlayer != null) + { + closestPlayer.character.PhoneNumber = number; + _ = closestPlayer.Save(); + } + else + { + player.character.PhoneNumber = number; + _ = player.Save(); + } + + player.SendText($"Numéro modifié avec succès !"); + player.ClosePanel(ui); + }); + + player.ShowPanelUI(numberPanel); + } + }); + + SChatCommand refuelCommand = new SChatCommand("/refuel", "Refuel the current vehicle that you're in", "/refuel", (player, args) => + { + if (player.IsAdmin) + { + Vehicle vehicle = player.GetClosestVehicle(); + + if (vehicle) + { + vehicle.fuel = 100f; + } + } + else + { + player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); + } + }); + + SChatCommand refuelAllCommand = new SChatCommand("/refuelall", "Refual all spawned vehicles", "/refuelall", (player, args) => + { + if (player.IsAdmin) + { + Vehicle[] vehicles = GameObject.FindObjectsOfType(); + + for (int i = 0; i < vehicles.Length; i++) + { + vehicles[i].fuel = 100f; + } + } + else + { + player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); + } + }); + + SChatCommand clearInventoryCommand = new SChatCommand("/clearinventory", new string[] { "/clearinv" }, "Clear your inventory", "/clearinv(entory)", (player, args) => + { + if (player.IsAdmin) + { + player.setup.inventory.Clear(); + } + else + { + player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); + } + }); + + SChatCommand saveCommand = new SChatCommand("/save", "Save the server", "/save", (player, args) => + { + if (player.IsAdmin) + { + _ = server.save.Save(); + } + else + { + player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); + } + }); + + SChatCommand tpPlateCommand = new SChatCommand("/tpveh", "Teleport to vehicle with plate", "/tpveh ", (player, args) => + { + if(args.Length > 0) + { + if (player.IsAdmin) + { + LifeVehicle lifeVeh = Nova.v.GetVehicle(args[0]); + + if(lifeVeh == null) + { + player.SendText($"Véhicule inexistant."); + return; + } + + Vehicle vehicle = Nova.v.GetVehicle(args[0]).instance; + + if(vehicle == null) + { + player.SendText($"Le véhicule est actuellement au garage."); + return; + } + + player.setup.TargetSetPosition(vehicle.transform.position); + } + } + }); + + SChatCommand destroyCommand = new SChatCommand("/destroy", "Destroy nearest quick owner vehicle", "/destroy", (player, args) => + { + if (player.IsAdmin) + { + Vehicle vehicle = player.GetClosestVehicle(5f); + + if (vehicle != null && vehicle.quickOwner > 0) + { + NetworkServer.Destroy(vehicle.gameObject); + } + } + }); + + SChatCommand stowCommand = new SChatCommand("/stowvehicle", new string[] { "/stowveh", "/stow" }, "Stow nearest vehicle or specified vehicle db id", "/stow(vehicle) ", (player, args) => + { + if (player.IsAdmin) + { + if (args.Length > 0) + { + if (int.TryParse(args[0], out int vehicleDbId)) + { + LifeVehicle lifeVehicle = Nova.v.GetVehicle(vehicleDbId); + + if (lifeVehicle == null) + { + player.SendText($"Véhicule introuvable."); + return; + } + else if (lifeVehicle.instance == null) + { + player.SendText($"Le véhicule est rangé au concessionnaire."); + return; + } + + Nova.v.StowVehicle(lifeVehicle.instance.vehicleDbId); + } + else + { + player.SendText($"Format de l'id du véhicule incorrect."); + } + } + else + { + Vehicle vehicle = player.GetClosestVehicle(5f); + + if (vehicle != null && vehicle.vehicleDbId > 0) + { + Nova.v.StowVehicle(vehicle.vehicleDbId); + }else + { + FakeVehicle fake = player.GetClosestFakeVehicle(5f); + + if(fake != null) + { + Nova.v.StowVehicle(fake.vehicleDbId); + } + } + } + } + }); + + SChatCommand stowAllCommand = new SChatCommand("/stowallvehicle", new string[] { "/stowallveh", "/stowall" }, "Stow all spawned vehicle on the map", "/stow(allveh)", (player, args) => + { + if (player.account.adminLevel >= 9) + { + Vehicle[] vehicles = GameObject.FindObjectsOfType(); + + foreach (Vehicle vehicle in vehicles) + { + if (vehicle != null && vehicle.vehicleDbId > 0) + { + Nova.v.StowVehicle(vehicle.vehicleDbId); + } + } + + FakeVehicle[] fakes = GameObject.FindObjectsOfType(); + + foreach (FakeVehicle vehicle in fakes) + { + if (vehicle != null && vehicle.vehicleDbId > 0) + { + Nova.v.StowVehicle(vehicle.vehicleDbId); + } + } + } + }); + + SChatCommand stowAllCivilCommand = new SChatCommand("/stowallcivilvehicle", new string[] { "/stowallcivilveh", "/stowallcivil" }, "Stow all spawned vehicle on the map", "/stow(allveh)", (player, args) => + { + if (player.account.adminLevel >= 9) + { + Vehicle[] vehicles = GameObject.FindObjectsOfType(); + + foreach (Vehicle vehicle in vehicles) + { + if (vehicle != null && vehicle.vehicleDbId > 0 && vehicle.bizId == 0) + { + Nova.v.StowVehicle(vehicle.vehicleDbId); + } + } + + FakeVehicle[] fakes = GameObject.FindObjectsOfType(); + + foreach (FakeVehicle vehicle in fakes) + { + if (vehicle != null && vehicle.vehicleDbId > 0) + { + Nova.v.StowVehicle(vehicle.vehicleDbId); + } + } + } + }); + + SChatCommand bizCommand = new SChatCommand("/editbiz", "Edit the current biz that you're in", "/editbiz", (player, args) => + { + if (!player.IsAdmin) + return; + + UIPanel bizPanel = new UIPanel("Gestion entreprise", UIPanel.PanelType.Tab) + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .AddButton("Sélectionner", (ui) => + { + ui.SelectTab(); + }) + .AddTabLine("Modifier terrain id", (ui) => + { + UIPanel terrainPanel = new UIPanel("Modification de l'id terrain", UIPanel.PanelType.Input) + .SetInputPlaceholder("ID terrain...") + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int terrainId = int.Parse(ui2.inputText); + + if (player.HasBiz()) + { + player.biz.TerrainId = terrainId; + player.biz.Save(); + + player.SendText("Terrain id modifié"); + } + else + { + player.SendText("Vous n'avez pas d'entreprise"); + } + }); + + player.ShowPanelUI(terrainPanel); + }) + .AddTabLine("Modifier id activité", (ui) => + { + UIPanel terrainPanel = new UIPanel("Modification de l'id activité", UIPanel.PanelType.Input) + .SetInputPlaceholder("ID activité...") + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int activityId = int.Parse(ui2.inputText); + + Activities activities = new Activities() + { + ids = new int[] { activityId } + }; + + if (player.HasBiz()) + { + player.biz.Activities = JsonUtility.ToJson(activities); + player.biz.Save(); + + player.SendText("Activité id modifié"); + } + else + { + player.SendText("Vous n'avez pas d'entreprise"); + } + }); + + player.ShowPanelUI(terrainPanel); + }) + .AddTabLine("Se définir propriétaire", (ui) => + { + player.biz.OwnerId = player.character.Id; + player.biz.Save(); + + player.SendText($"Vous êtes désormais propriétaire de l'entreprise."); + }); + + player.ShowPanelUI(bizPanel); + }); + + SChatCommand vehicleCommand = new SChatCommand("/vehicle", new string[] { "/v", "/veh" }, "Vehicle admin menu", "/v(ehicle)", (player, args) => + { + if (!player.IsAdmin) + return; + + UIPanel vAdminPanel = new UIPanel("Gestion véhicule", UIPanel.PanelType.Tab) + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .AddButton("Sélectionner", (ui) => + { + ui.SelectTab(); + }) + .AddTabLine("Définir id entreprise", (ui) => + { + if (player.GetVehicleId() == 0) + { + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + return; + } + + UIPanel idEntreprisePanel = new UIPanel("Définir id entreprise véhicule", UIPanel.PanelType.Input) + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int entId = int.Parse(ui2.inputText); + + Vehicle vehicle = NetworkServer.spawned[player.GetVehicleId()].GetComponent(); + + vehicle.bizId = entId; + + LifeVehicle lifeVehicle = Nova.v.GetVehicle(vehicle.vehicleDbId); + + lifeVehicle.bizId = entId; + lifeVehicle.Save(); + + player.ClosePanel(ui2); + player.SendText(string.Format("Entreprise modifiée avec succès.", LifeServer.COLOR_GREEN)); + }); + + player.ShowPanelUI(idEntreprisePanel); + }) + .AddTabLine("Définir propriétaire", (ui) => + { + if (player.GetVehicleId() == 0) + { + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + return; + } + + UIPanel idProprietairePanel = new UIPanel("Définir id propriétaire", UIPanel.PanelType.Input) + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int ownerId = int.Parse(ui2.inputText); + + Vehicle vehicle = NetworkServer.spawned[player.GetVehicleId()].GetComponent(); + + LifeVehicle lifeVehicle = Nova.v.GetVehicle(vehicle.vehicleDbId); + + lifeVehicle.permissions.owner = new Entity() { characterId = ownerId }; + lifeVehicle.Save(); + + player.ClosePanel(ui2); + player.SendText(string.Format("Propriétaire modifié avec succès.", LifeServer.COLOR_GREEN)); + }); + + player.ShowPanelUI(idProprietairePanel); + }) + .AddTabLine("Créer véhicule", (ui) => + { + UIPanel vPanel = new UIPanel("Véhicule", UIPanel.PanelType.Tab) + .AddButton("Fermer", (ui1) => + { + player.ClosePanel(ui1); + }) + .AddButton("Sélectionner", (ui1) => + { + ui1.SelectTab(); + }); + + for (int i = 0; i < Nova.v.vehicleModels.Length; i++) + { + Vehicle vehicle = Nova.v.vehicleModels[i]; + + if (!vehicle.isDeprecated) + { + int vehId = i; + vPanel.AddTabLine(vehicle.vehicleName, (ui1) => + { + int vehicleId = vehId; + string vStr = string.Format("{0}", vehicle.vehicleName).ToLower(); + + Permissions permissions = new Permissions() + { + owner = new Entity() + { + characterId = player.character.Id + } + }; + + CreateVehicle(player, vehicleId, permissions); + }); + } + + } + player.ShowPanelUI(vPanel); + }) + .AddTabLine("Créer véhicule par id", (ui) => + { + UIPanel createVehicle = new UIPanel("Créer véhicule", UIPanel.PanelType.Input) + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int vehicleId = int.Parse(ui2.inputText); + + if (vehicleId >= Nova.v.vehiclesModelName.Length) + return; + + Permissions permissions = new Permissions() + { + owner = new Entity() + { + characterId = player.character.Id + } + }; + + CreateVehicle(player, vehicleId, permissions); + }); + + player.ShowPanelUI(createVehicle); + }) + .AddTabLine("Définir la couleur", (ui) => + { + if (player.GetVehicleId() == 0) + { + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + return; + } + + uint vehicleId = player.GetVehicleId(); + UIPanel vehColorPanel = new UIPanel("Définir la couleur du véhicule", UIPanel.PanelType.Tab) + .AddButton("Fermer", (ui1) => + { + player.ClosePanel(ui1); + }) + .AddButton("Valider", (ui1) => + { + ui1.SelectTab(); + }) + .AddTabLine("#ffffff", (ui1) => //Blanc + { + Color color = Nova.HexToColor("#ffffff"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#777777", (ui1) => //Gris Clair + { + Color color = Nova.HexToColor("#777777"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#555555", (ui1) => //Gris + { + Color color = Nova.HexToColor("#555555"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#333333", (ui1) => //Gris Foncé + { + Color color = Nova.HexToColor("#333333"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#000000", (ui1) => //Noir + { + Color color = Nova.HexToColor("#000000"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#ff0000", (ui1) => //Rouge + { + Color color = Nova.HexToColor("#ff0000"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#7b0000", (ui1) => //Rouge Foncé + { + Color color = Nova.HexToColor("#7b0000"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#ffff00", (ui1) => //Jaune + { + Color color = Nova.HexToColor("#ffff00"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#7b7b00", (ui1) => //Jaune Foncé + { + Color color = Nova.HexToColor("#7b7b00"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#00ff00", (ui1) => // Vert + { + Color color = Nova.HexToColor("#00ff00"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#007b00", (ui1) => // Vert Foncé + { + Color color = Nova.HexToColor("#007b00"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#00ffff", (ui1) => // Vert + { + Color color = Nova.HexToColor("#00ffff"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#007b7b", (ui1) => // Vert Foncé + { + Color color = Nova.HexToColor("#007b7b"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#0000ff", (ui1) => // Bleu + { + Color color = Nova.HexToColor("#0000ff"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#00007b", (ui1) => // Bleu Foncé + { + Color color = Nova.HexToColor("#00007b"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#ff00ff", (ui1) => // Rose + { + Color color = Nova.HexToColor("#ff00ff"); + ColorVehicle(vehicleId, color); + }) + .AddTabLine("#7b007b", (ui1) => // Violet + { + Color color = Nova.HexToColor("#7b007b"); + ColorVehicle(vehicleId, color); + }); + + player.ShowPanelUI(vehColorPanel); + }) + .AddTabLine("Définir la couleur (hexadécimal)", (ui) => + { + UIPanel hexColorPanel = new UIPanel("Modifier la couleur", UIPanel.PanelType.Input) + .AddButton("Annuler", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + Color color = Nova.HexToColor(ui2.inputText); + uint vehicleId = player.GetVehicleId(); + if (vehicleId > 0U) + { + Vehicle component = NetworkServer.spawned[vehicleId].GetComponent(); + component.Networkcolor = color; + LifeVehicle vehicle = Nova.v.GetVehicle(component.plate); + if (vehicle != null) + { + vehicle.color = Nova.ColorToHex(color); + vehicle.Save(); + } + } + else + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + }) + .SetInputPlaceholder("#ffffff"); + + player.ShowPanelUI(hexColorPanel); + }) + .AddTabLine("Refuel", (ui) => + { + Vehicle vehicle = player.GetClosestVehicle(); + + if (vehicle) + { + vehicle.fuel = 100f; + } + }) + .AddTabLine("Réparer", (ui) => + { + Vehicle vehicle = player.GetClosestVehicle(); + + if (vehicle != null) + { + vehicle.Repair(); + player.ClosePanel(ui); + player.SendText(string.Format(" Véhicule réparé avec succès.", LifeServer.COLOR_GREEN)); + } + }) + .AddTabLine("Ranger", (ui) => + { + Vehicle vehicle = player.GetClosestVehicle(); + + if (vehicle != null && vehicle.vehicleDbId > 0) + { + Nova.v.StowVehicle(vehicle.vehicleDbId); + } + }); + + player.ShowPanelUI(vAdminPanel); + }); + + SChatCommand serviceAdminCommand = new SChatCommand("/serviceadmin", new string[] { "/sa", "/adminservice" }, "Admin service", "/serviceadmin", (player, args) => + { + if (player.IsAdmin) + { + if (!player.isAuthAdmin) + { + player.SendText($"Vous n'êtes pas authentifié."); + return; + } + + if (player.serviceAdmin) + { + player.SetAdminService(false); + player.SendText(string.Format("Service admin désactivé !", LifeServer.COLOR_RED)); + } + else + { + player.SetAdminService(true); + player.SendText(string.Format("Service admin activé !", LifeServer.COLOR_GREEN)); + } + + player.serviceAdmin = !player.serviceAdmin; + } + + }); + + SChatCommand stopCommand = new SChatCommand("/stop", "Stop the server", "/stop", (player, args) => + { + if (player.IsAdmin) + server.Stop(); + else + player.SendText(string.Format("Permissions insuffisantes.", LifeServer.COLOR_RED)); + }); + + SChatCommand fpsCommand = new SChatCommand("/fps", "Show server fps", "/fps", (player, args) => + { + float msec = Time.deltaTime * 1000.0f; + float fps = 1.0f / Time.deltaTime; + + player.SendText(string.Format("STATS SERVEUR: {0:0.0} ms ({1:0.} fps)", msec, fps)); + }); + + SChatCommand prisonCommand = new SChatCommand("/prison", "Put nearest player in prison", "/prison", (player, args) => + { + if (!player.IsAdmin) + return; + + Player closestPlayer = player.GetClosestPlayer(); + + if (closestPlayer != null) + { + if (closestPlayer.GetVehicleId() != 0) + { + player.SendText(string.Format("Impossible de mettre en prison, faites le sortir du véhicule !", LifeServer.COLOR_RED)); + } + else + { + UIPanel prisonPanel = new UIPanel(string.Format("Mise en prison de {0}", closestPlayer.GetFullName()), UIPanel.PanelType.Input) + .SetText("Entrez la durée de la prison en minutes :") + .SetInputPlaceholder("Durée...") + .AddButton("Annuler", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int time = 0; + + int.TryParse(ui2.inputText, out time); + + if (time > 0) + { + closestPlayer.setup.prisonTime = time * 60; + player.SendText(string.Format("Vous avez mis {1} en prison.", LifeServer.COLOR_GREEN, closestPlayer.GetFullName())); + closestPlayer.SendText(string.Format("Vous avez été placé en prison admin par {1}.", LifeServer.COLOR_RED, player.GetFullName())); + } + else + { + player.SendText(string.Format("Saisissez une valeur supérieur à 0 !", LifeServer.COLOR_RED)); + } + }); + + player.ShowPanelUI(prisonPanel); + } + } + }); + + SChatCommand bcrCommand = new SChatCommand("/removebcr", "Remove bcr to nearest player", "/removebcr", (player, args) => + { + if (!player.IsAdmin) + return; + + Player closestPlayer = player.GetClosestPlayer(); + + if (closestPlayer != null) + { + if (closestPlayer.GetVehicleId() != 0) + { + player.SendText(string.Format("Impossible de lui retirer son BCR, faites le sortir du véhicule !", LifeServer.COLOR_RED)); + } + else + { + UIPanel prisonPanel = new UIPanel(string.Format("Retrait du BCR de {0}", closestPlayer.GetFullName()), UIPanel.PanelType.Text) + .SetText("Retrait du BCR :") + .AddButton("Annuler", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + closestPlayer.character.HasBCR = false; + closestPlayer.setup.TargetLockCFM(true); + closestPlayer.setup.TargetSetPosition(new Vector3(757.7316f, 50.6f, 679.578f)); // spawn position + closestPlayer.SendText($"Un administrateur vous a retiré votre brevet de connaissance des règles."); + }); + + player.ShowPanelUI(prisonPanel); + } + } + }); + + SChatCommand flipCommand = new SChatCommand("/flip", "Flip the current vehicle that you're in", "/flip", (player, args) => + { + if (player.IsAdmin) + { + uint vehicleId = player.GetVehicleId(); + + if (vehicleId > 0) + { + NetworkServer.spawned[vehicleId].GetComponent().RpcFlip(); + + NetworkServer.spawned[vehicleId].transform.rotation = Quaternion.Euler(Vector3.zero); + NetworkServer.spawned[vehicleId].transform.position += Vector3.up * 2f; + } + else + { + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + } + } + }); + + SChatCommand setAdminCommand = new SChatCommand("/setadmin", "Set nearest player admin", "/setadmin", (player, args) => + { + if (player.account.adminLevel > 7) + { + Player closest = player.GetClosestPlayer(); + + if (closest != null) + { + UIPanel setAdminPanel = new UIPanel(string.Format("Définir rang admin de {0}", closest.account.username), UIPanel.PanelType.Input) + .SetInputPlaceholder("Rang admin...") + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .AddButton("Valider", (ui) => + { + int newLevel = int.Parse(ui.inputText); + + if (newLevel > player.account.adminLevel) + { + player.SendText($"Vous ne pouvez pas définir un rang supérieur au vôtre."); + return; + } + + if (newLevel < 0) + newLevel = 0; + + closest.account.adminLevel = newLevel; + _ = closest.Save(); + player.ClosePanel(ui); + }); + + player.ShowPanelUI(setAdminPanel); + } + } + }); + + SChatCommand editTerrainCommand = new SChatCommand("/terrain", new string[] { "/t" }, "Edit the terrain that you're in", "/t(errain", (player, args) => + { + if (!player.IsAdmin) + return; + + UIPanel terrainPanel = new UIPanel("Gestion terrain", UIPanel.PanelType.Tab) + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .AddButton("Sélectionner", (ui) => + { + ui.SelectTab(); + }) + .AddTabLine("Supprimer co-propriétaires", (ui) => + { + LifeArea area = Nova.a.GetAreaById(player.setup.areaId); + + area.permissions = new Permissions() { coOwners = new List() }; + + area.Save(); + + player.SendText("Co-propriétaires modifiés !"); + }) + .AddTabLine("Modifier propriétaire", (ui) => + { + UIPanel proprioPanel = new UIPanel("Modification du proprio", UIPanel.PanelType.Input) + .SetInputPlaceholder("ID perso...") + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int proprio = int.Parse(ui2.inputText); + + if (player.setup.areaId > 0) + { + LifeArea area = Nova.a.GetAreaById(player.setup.areaId); + + area.permissions = new Permissions() { owner = new Entity() { characterId = proprio }, coOwners = new List() }; + + area.Save(); + + player.SendText("Propriétaire modifié !"); + player.ClosePanel(ui2); + } + }); + + player.ShowPanelUI(proprioPanel); + }) + .AddTabLine("Modifier prix location", (ui) => + { + UIPanel pricePanel = new UIPanel("Modification du prix de location", UIPanel.PanelType.Input) + .SetInputPlaceholder("Prix...") + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int price = int.Parse(ui2.inputText); + + if (player.setup.areaId > 0) + { + LifeArea area = Nova.a.GetAreaById(player.setup.areaId); + + area.rentPrice = price; + + if (area.rentPrice > 0) + { + area.isRentable = true; + } + else + { + area.isRentable = false; + } + + area.Save(); + + player.SendText("Prix de location modifié !"); + player.ClosePanel(ui2); + } + }); + + player.ShowPanelUI(pricePanel); + }) + .AddTabLine("Modifier prix", (ui) => + { + UIPanel pricePanel = new UIPanel("Modification du prix", UIPanel.PanelType.Input) + .SetInputPlaceholder("Prix...") + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + int price = int.Parse(ui2.inputText); + + if (player.setup.areaId > 0) + { + LifeArea area = Nova.a.GetAreaById(player.setup.areaId); + + area.price = price; + + area.Save(); + + player.SendText("Prix modifié !"); + player.ClosePanel(ui2); + } + }); + + player.ShowPanelUI(pricePanel); + }); + + player.ShowPanelUI(terrainPanel); + }); + + SChatCommand giveBcrCommand = new SChatCommand("/givebcr", new string[] { "/addbcr" }, "Give bcr to nearest player or yourself", "/givebcr", (player, args) => + { + if (!player.IsAdmin) + return; + + Player closestPlayer = player.GetClosestPlayer(); + + if (closestPlayer != null) + { + closestPlayer.character.HasBCR = true; + closestPlayer.setup.TargetLockCFM(false); + + closestPlayer.SendText($"Un administrateur vous a donné le BCR."); + } else + { + player.character.HasBCR = true; + player.setup.TargetLockCFM(false); + + player.SendText($"Vous vous êtes donné le BCR."); + } + }); + + SChatCommand dayCommand = new SChatCommand("/day", "Set day", "/day", (player, args) => + { + if (!player.IsAdmin) + return; + + EnviroSkyMgr.instance.SetTimeOfDay(11f); + }); + + SChatCommand nightCommand = new SChatCommand("/night", "Set night", "/night", (player, args) => + { + if (!player.IsAdmin) + return; + + EnviroSkyMgr.instance.SetTimeOfDay(20f); + }); + + SChatCommand morningCommand = new SChatCommand("/morning", "Set morning", "/morning", (player, args) => + { + if (!player.IsAdmin) + return; + + EnviroSkyMgr.instance.SetTimeOfDay(6f); + }); + + SChatCommand timesetCommand = new SChatCommand("/timeset", new string[] { "/time" }, "Set time of day", "/timeset <12,5>", (player, args) => + { + if (!player.IsAdmin) + return; + + if (args.Length == 1) + { + if (float.TryParse(args[0], out float result)) + { + EnviroSkyMgr.instance.SetTimeOfDay(result); + + player.SendText($"Time set to {result}"); + } + else + { + player.SendText($"USAGE: /timeset <12,5>"); + } + } + else + { + player.SendText($"USAGE: /timeset <12,5>"); + } + }); + + SChatCommand setPinCommand = new SChatCommand("/setpin", "Set admin pin", "/setpin", (player, args) => + { + if (!player.IsAdmin && player.account.adminLevel < 10 && !player.isAuthAdmin) + return; + + Player closestPlayer = player.GetClosestPlayer(); + + if (closestPlayer != null) + { + UIPanel pin = new UIPanel(string.Format("Code pin de {0}", closestPlayer.GetFullName()), UIPanel.PanelType.Input) + .SetText("Entrez le code pin :") + .SetInputPlaceholder("Code...") + .AddButton("Annuler", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Valider", (ui2) => + { + closestPlayer.account.adminPin = ui2.inputText; + _ = closestPlayer.Save(); + player.SendText("Pin modifié !"); + player.ClosePanel(ui2); + }); + + player.ShowPanelUI(pin); + } + }); + + SChatCommand forwardCommand = new SChatCommand("/forward", "Move vehicle forward", "/forward", (player, args) => + { + if (player.IsAdmin) + { + uint vehicleId = player.GetVehicleId(); + + if (vehicleId > 0) + { + NetworkServer.spawned[vehicleId].GetComponent().RpcAddPosition(NetworkServer.spawned[vehicleId].transform.forward); + + NetworkServer.spawned[vehicleId].transform.position += NetworkServer.spawned[vehicleId].transform.forward; + } + else + { + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + } + } + }); + + SChatCommand backwardCommand = new SChatCommand("/backward", "Move vehicle backward", "/backward", (player, args) => + { + if (player.IsAdmin) + { + uint vehicleId = player.GetVehicleId(); + + if (vehicleId > 0) + { + NetworkServer.spawned[vehicleId].GetComponent().RpcAddPosition(-NetworkServer.spawned[vehicleId].transform.forward); + + NetworkServer.spawned[vehicleId].transform.position -= NetworkServer.spawned[vehicleId].transform.forward; + } + else + { + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + } + } + }); + + SChatCommand rightCommand = new SChatCommand("/right", "Move vehicle right", "/right", (player, args) => + { + if (player.IsAdmin) + { + uint vehicleId = player.GetVehicleId(); + + if (vehicleId > 0) + { + NetworkServer.spawned[vehicleId].GetComponent().RpcAddPosition(NetworkServer.spawned[vehicleId].transform.right); + + NetworkServer.spawned[vehicleId].transform.position += NetworkServer.spawned[vehicleId].transform.right; + } + else + { + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + } + } + }); + + SChatCommand leftCommand = new SChatCommand("/left", "Move vehicle left", "/left", (player, args) => + { + if (player.IsAdmin) + { + uint vehicleId = player.GetVehicleId(); + + if (vehicleId > 0) + { + NetworkServer.spawned[vehicleId].GetComponent().RpcAddPosition(-NetworkServer.spawned[vehicleId].transform.right); + + NetworkServer.spawned[vehicleId].transform.position -= NetworkServer.spawned[vehicleId].transform.right; + } + else + { + player.SendText(string.Format("Vous n'êtes pas dans un véhicule.", LifeServer.COLOR_RED)); + } + } + }); + + SChatCommand ticketsCommand = new SChatCommand("/tickets", "Open ticket panel", "/tickets", (player, args) => + { + if (player.IsAdmin) + { + UIPanel tickets = new UIPanel("Liste des tickets", UIPanel.PanelType.Tab) + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .AddButton("Fermer le ticket", (ui) => + { + int ticketId = ui.selectedTab; + KeyValuePair ticket = this.tickets.ElementAt(ticketId); + + if(ticket.Key != null) + { + ticket.Key.SendText($"Votre ticket a été fermé par un administrateur."); + this.tickets.Remove(ticket.Key); + player.ClosePanel(ui); + } + }) + .AddButton("Intervenir (TP)", (ui) => + { + ui.SelectTab(); + }); + + foreach (KeyValuePair ticket in this.tickets) + { + if (ticket.Key == null) + continue; + if (ticket.Key.conn == null) + continue; + if (ticket.Key.setup == null) + continue; + + string value = ""; + + if (ticket.Value.Length > 30) + value = ticket.Value.Substring(0, 30); + else + value = ticket.Value; + + tickets.AddTabLine(string.Format("{0} {1} - {2}", new string[] { ticket.Key.character.Firstname, ticket.Key.character.Lastname, value }), (ui2) => + { + player.ClosePanel(ui2); + player.setup.TargetSetPosition(ticket.Key.setup.transform.position); + ticket.Key.ticketOpen = false; + this.tickets.Remove(ticket.Key); + }); + } + + player.ShowPanelUI(tickets); + } + }); + + SChatCommand annoCommand = new SChatCommand("/announce", new string[] { "/anno", "/annonce" }, "Announce in admin", "/anno(unce) ", (player, args) => + { + string text = ""; + + for (int i = 0; i < args.Length; i++) + text += $"{args[i]} "; + + if (player.IsAdmin && player.isAuthAdmin) + { + server.SendMessageToAll($"[ANNONCE] {text}"); + } + }); + + SChatCommand banCommand = new SChatCommand("/ban", "Ban offline player", "/ban", (player, args) => + { + if (!player.IsAdmin) + return; + + BanPlayer(player); + }); + + SChatCommand banSteamCommand = new SChatCommand("/bansteam", "Ban offline player by steam id", "/bansteam", (player, args) => + { + if (!player.IsAdmin) + return; + + BanSteamPlayer(player); + }); + + SChatCommand unbanCommand = new SChatCommand("/unban", "Unban player", "/unban", (player, args) => + { + if (!player.IsAdmin) + return; + + UIPanel passPanel = new UIPanel("Unban", UIPanel.PanelType.Input) + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .AddButton("Débannir", (ui) => + { + int id = int.Parse(ui.inputText); + + Unban(id); + + player.ClosePanel(ui); + }); + + player.ShowPanelUI(passPanel); + }); + + SChatCommand giveCommand = new SChatCommand("/give", new string[] { "/g" }, "Give item to yourself", "/g(ive) ", (player, args) => + { + if(player.IsAdmin) + { + if(player.isAuthAdmin) + { + if(args.Length == 0 || args.Length > 2) + { + player.SendText($"USAGE: /g(ive) "); + return; + } + + Item item = null; + + if(!int.TryParse(args[0], out int itemId)) + { + item = Nova.man.item.GetItem(args[0]); + + if(item == null) + { + player.SendText($"Merci de saisir un nombre ou un nom d'item valide (e.g. /give 6 ou /give sausage)"); + return; + } + + itemId = item.id; + }else + { + item = Nova.man.item.GetItem(itemId); + } + + int number = 1; + + if(args.Length == 2 && int.TryParse(args[1], out int _number)) + { + number = _number; + } + + if(item == null) + { + player.SendText($"Cet objet n'existe pas."); + return; + } + + string data = ""; + + if(item is StateItem) + { + data = (item as StateItem).GetBaseData(); + } + + if(!player.setup.inventory.AddItem(itemId, number, data)) + { + player.SendText($"Vous n'avez pas assez de place dans votre inventaire."); + return; + } + + player.SendText($"Vous avez reçu {number}x {item.itemName}."); + }else + player.SendText($"Vous n'êtes pas authentifié."); + } + else + { + player.SendText($"Permissions insuffissantes."); + } + }); + + SChatCommand weatherCommand = new SChatCommand("/weather", new string[] { "/w" }, "Set weather", "/w(eather) ", (player, args) => + { + if(player.IsAdmin) + { + if (player.isAuthAdmin) + { + if(args.Length != 1) + { + player.SendText($"USAGE: /w(eather) "); + return; + } + + switch(args[0]) + { + case "clear": + server.world.SetWeather(Life.Network.Systems.SWorld.Weather.ClearSky); + break; + case "cloudy": + server.world.SetWeather(Life.Network.Systems.SWorld.Weather.Cloudy1); + break; + case "foggy": + server.world.SetWeather(Life.Network.Systems.SWorld.Weather.Foggy); + break; + case "lightrain": + server.world.SetWeather(Life.Network.Systems.SWorld.Weather.LightRain); + break; + case "rain": + server.world.SetWeather(Life.Network.Systems.SWorld.Weather.HeavyRain); + break; + case "storm": + server.world.SetWeather(Life.Network.Systems.SWorld.Weather.Storm); + break; + } + } + else + player.SendText($"Vous n'êtes pas authentifié."); + } + else + { + player.SendText($"Permissions insuffissantes."); + } + }); + + terrainInfoCommand.Register(); + unbanCommand.Register(); + weatherCommand.Register(); + giveCommand.Register(); + annoCommand.Register(); + ticketsCommand.Register(); + leftCommand.Register(); + rightCommand.Register(); + backwardCommand.Register(); + forwardCommand.Register(); + setPinCommand.Register(); + timesetCommand.Register(); + dayCommand.Register(); + nightCommand.Register(); + morningCommand.Register(); + giveBcrCommand.Register(); + editTerrainCommand.Register(); + setAdminCommand.Register(); + flipCommand.Register(); + bcrCommand.Register(); + prisonCommand.Register(); + fpsCommand.Register(); + stopCommand.Register(); + serviceAdminCommand.Register(); + vehicleCommand.Register(); + bizCommand.Register(); + stowAllCommand.Register(); + stowAllCivilCommand.Register(); + stowCommand.Register(); + destroyCommand.Register(); + saveCommand.Register(); + clearInventoryCommand.Register(); + refuelAllCommand.Register(); + refuelCommand.Register(); + changeNumberCommand.Register(); + tpPlateCommand.Register(); + banCommand.Register(); + banSteamCommand.Register(); + } + + public void BanPlayer(Player player) + { + UIPanel panel = new UIPanel("Bannir un joueur hors ligne", UIPanel.PanelType.Input) + .SetInputPlaceholder("Prénom NOM") + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .AddButton("Suivant", async (ui) => + { + string fullname = ui.inputText; + + string[] names = fullname.Split(' '); + + string firstname = names[0]; + string lastname = ""; + + for (int i = 1; i < names.Length; i++) + { + if (i > 1) + lastname += $" {names[i]}"; + else + lastname += $"{names[i]}"; + } + + Characters character = await LifeDB.FetchCharacter(firstname, lastname); + + if (character == null) + { + player.SendText($"Joueur introuvable."); + return; + } + + UIPanel panel2 = new UIPanel("Bannir un joueur hors ligne - temps", UIPanel.PanelType.Input) + .SetInputPlaceholder("Temps en heure...") + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Bannir", async (ui2) => + { + int number = int.Parse(ui2.inputText); + + Account account = await LifeDB.FetchAccount(character.AccountId); + + account.banTimestamp = (number == -1) ? -1 : Nova.UnixTimeNow() + number * 3600; + + _ = LifeDB.SaveAccount(account); + + player.SendText($"Joueur {account.username} AKA {character.Firstname} {character.Lastname} banni."); + + player.ClosePanel(ui2); + }); + + player.ShowPanelUI(panel2); + }); + + player.ShowPanelUI(panel); + } + + public void BanSteamPlayer(Player player) + { + UIPanel panel = new UIPanel("Bannir un joueur hors ligne par SteamID", UIPanel.PanelType.Input) + .SetInputPlaceholder("SteamId") + .AddButton("Fermer", (ui) => + { + player.ClosePanel(ui); + }) + .AddButton("Suivant", async (ui) => + { + string steamId = ui.inputText; + + Account account = await LifeDB.FetchAccount(steamId); + + + UIPanel panel2 = new UIPanel("Bannir un joueur hors ligne - temps", UIPanel.PanelType.Input) + .SetInputPlaceholder("Temps en heure...") + .AddButton("Fermer", (ui2) => + { + player.ClosePanel(ui2); + }) + .AddButton("Bannir", async (ui2) => + { + int number = int.Parse(ui2.inputText); + + account.banTimestamp = (number == -1) ? -1 : Nova.UnixTimeNow() + number * 3600; + + _ = LifeDB.SaveAccount(account); + + player.SendText($"Joueur {account.username} banni."); + + player.ClosePanel(ui2); + }); + + player.ShowPanelUI(panel2); + }); + + player.ShowPanelUI(panel); + } + + public async void Unban(int accountId) + { + await LifeDB.Unban(accountId); + } + + public void OnPlayerTicket(Player player, string ticket) + { + tickets.Add(player, ticket); + player.ticketOpen = true; + + for (int i = 0; i < server.Players.Count; i++) + { + if (server.Players[i].IsAdmin && server.Players[i].serviceAdmin) + { + string text = string.Format("Nouveau ticket de {0} {1}. Message : {2}. \n /tickets pour voir la liste des tickets", new string[] { player.character.Firstname, player.character.Lastname, ticket }); + server.Players[i].SendText(text); + server.Players[i].setup.TargetPlayClairon(0.2f); + } + } + } + + async void CreateVehicle(Player player, int vehicleId, Permissions permissions) + { + if (Nova.v.vehicleModels[vehicleId].isDeprecated) + { + player.SendText(string.Format("Impossible de faire apparaître un véhicule déprécié.", LifeServer.COLOR_RED)); + return; + } + + Vehicles vehicles = await LifeDB.CreateVehicle(vehicleId, JsonUtility.ToJson(permissions)); + + player.SendText(string.Format("Véhicule créé avec succès", LifeServer.COLOR_GREEN)); + + LifeVehicle vehicle = Nova.v.GetVehicle(vehicles.Id); + + if (vehicle.instance == null) + { + Vehicle instance = GameObject.Instantiate(Nova.v.vehicleModels[vehicle.modelId], player.setup.transform.position, player.setup.transform.rotation); + + NetworkServer.Spawn(instance.gameObject); + + instance.color = Nova.HexToColor(vehicle.color); + instance.plate = vehicle.plate; + + if (instance.engineInventory) + { + if (vehicle.engineInventory.Length > 0) + instance.engineInventory.DeserializeJson(vehicle.engineInventory); + } + + if (instance.vehicleInventory) + { + if (vehicle.inventory.Length > 0) + instance.vehicleInventory.DeserializeJson(vehicle.inventory); + } + + + vehicle.instance = instance; + instance.vehicleDbId = vehicle.vehicleId; + instance.fuel = vehicle.fuel; + } + + vehicle.isStowed = false; + + await Task.Delay(2000); + + vehicle.Save(); + } + + void ColorVehicle(uint vehicleId, Color color) + { + Vehicle component = NetworkServer.spawned[vehicleId].GetComponent(); + component.Networkcolor = color; + LifeVehicle vehicle = Nova.v.GetVehicle(component.plate); + if (vehicle != null) + { + vehicle.color = Nova.ColorToHex(color); + vehicle.Save(); + } + } + } + + [System.Serializable] + public class AdminConfig + { + public void Save() + { + string json = JsonConvert.SerializeObject(this); + + File.WriteAllText(EssentialAdmin.adminConfigPath, json); + } + } } \ No newline at end of file