using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using GTANetworkAPI; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Finance; using ReallifeGamemode.Server.Managers; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Types; using ReallifeGamemode.Server.Util; using ReallifeGamemode.Services; using ReallifeGamemode.Server.Log; namespace ReallifeGamemode.Server.Commands { internal class UserCommands : Script { private static readonly ILogger logger = LogManager.GetLogger(); private const int SMS_PRICE = 5; [Command("rent", "~m~rent stop")] public void CmdUserStopRent(Player player, String option = "") { if (!player.IsLoggedIn()) return; if (option != "stop") { player.SendChatMessage("Mit \"/rent stop\" kannst du die Miete kündigen"); return; } if (!player.HasData("hasRentcar")) { ChatService.ErrorMessage(player, "Du hast zurzeit kein Fahrzeug gemietet"); return; } Rentcar.cancelRent(player); } [Command("eventport", "~m~eventport")] public void CmdUserEventport(Player player, string option = "") { if (!player.IsLoggedIn()) return; option = option.ToLower(); if (option == "on") { if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { return; } Vector3 position = player.Position; PositionManager.eventportPosition = position; PositionManager.eventportActive = true; player.SendChatMessage("~y~Du hast hier erfolgreich einen Eventport gesetzt."); ChatService.BroadcastAdmin($"~b~[ADMIN]~s~ ~y~{player.Name}~s~ hat einen Eventport erstellt.", AdminLevel.ADMIN); logger.LogInformation("Admin {0} created the eventport at x: {1}, y: {2}, z: {3}", player.Name, position.X, position.Y, position.Z); return; } if (option == "off") { if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { return; } PositionManager.eventportActive = false; player.SendChatMessage("~y~Du hast den Eventport deaktiviert."); ChatService.BroadcastAdmin($"~b~[ADMIN]~s~ ~y~{player.Name}~s~ hat einen Eventport deaktiviert.", AdminLevel.ADMIN); logger.LogInformation("Admin {0} removed the eventport", player.Name); return; } if (!PositionManager.eventportActive || PositionManager.eventportPosition == null) { player.SendChatMessage("~y~Im Moment ist kein Eventport aktiv."); return; } using (var dbContext = new DatabaseContext()) { User user = player.GetUser(dbContext); if (user.Wanteds > 0 || user.JailTime > 0 || player.HasData("inGangWar") || !player.IsAlive()) { ChatService.ErrorMessage(player, "Momentan kannst du keinen Eventport nutzen"); return; } } Random rnd = new Random(); int randomX = rnd.Next(-3, 3); int randomY = rnd.Next(-3, 3); Vector3 currentEventport = PositionManager.eventportPosition; Vector3 teleportPosition = new Vector3(currentEventport.X + randomX, currentEventport.Y + randomY, currentEventport.Z); logger.LogInformation("Player {0} used the eventport to x: {1}, y: {2}, z: {3}", player.Name, currentEventport.X, currentEventport.Y, currentEventport.Z); player.SafeTeleport(teleportPosition); player.SendNotification("Du hast dich zum Event teleportiert"); } [Command("sms", "~m~Benutzung: ~s~/sms [Spieler] [Nachricht]", GreedyArg = true)] public void CmdUserSMS(Player player, string name, string msg) { if (!player.IsLoggedIn()) return; Player target = PlayerService.GetPlayerByNameOrId(name); if (target == null || !target.IsLoggedIn()) { ChatService.PlayerNotFound(player); return; } if (target == player) { ChatService.ErrorMessage(player, "Du kannst dir keine SMS schreiben"); return; } using (var dbContext = new DatabaseContext()) { User user = player.GetUser(dbContext); if (user.BankAccount.Balance < SMS_PRICE) { ChatService.ErrorMessage(player, "Dafür hast du nicht genug Geld auf deinem Bankkonto"); return; } logger.LogInformation("Player {0} sent a sms to {1} for {2} dollars", player.Name, target.Name, SMS_PRICE); user.BankAccount.Balance -= SMS_PRICE; dbContext.SaveChanges(); } msg = Regex.Replace(msg, "(~[a-zA-Z]~)|(!{(.*)})", ""); ChatService.SendMessage(player, $"~y~SMS ~w~an ~y~{ target.Name }~w~: { msg }"); ChatService.SendMessage(target, $"~y~SMS ~w~von ~y~{ player.Name }~w~: { msg }"); } [Command("look", "~m~look")] public void CmdUserLook(Player player) { if (!player.IsLoggedIn()) return; Vehicle veh = NAPI.Pools.GetAllVehicles() .Where(v => v.Position.DistanceTo(player.Position) <= 5) .OrderBy(v => v.Position.DistanceTo(player.Position)) .FirstOrDefault(); if (veh == null) { return; } var lastDriverDic = new Dictionary(); if (VehicleManager.lastDriversInVehicle.ContainsKey(veh)) { lastDriverDic = VehicleManager.lastDriversInVehicle[veh]; } else { player.SendNotification("~r~Mit diesem Fahrzeug ist noch niemand gefahren"); return; } var list = lastDriverDic.Select(v => new { Name = v.Key, Time = v.Value }).OrderByDescending(v => v.Time).ToList(); player.TriggerEvent("lookLastDrivers", JsonConvert.SerializeObject(list)); } [Command("id", "~m~Benutzung: ~s~/id [Name]")] public void CmdUserId(Player player, String targetname) { Player target = PlayerService.GetPlayerByNameOrId(targetname); if (target == null) { player.SendChatMessage("~c~Spieler ist nicht online."); } else { player.SendChatMessage("~c~ID: (" + target.Id + ") " + target.Name); } } [Command("dice", "~m~Benutzung: ~s~/dice")] public void CmdUserDice(Player player) { if (!player.IsLoggedIn()) return; Random rnd = new Random(); int number = rnd.Next(1, 7); var peopleInRange = NAPI.Player.GetPlayersInRadiusOfPlayer(7, player); foreach (var managedPlayer in peopleInRange) { if (!managedPlayer.IsLoggedIn()) return; ChatService.SendMessage(managedPlayer, "* " + player.Name + " hat eine " + number + " gewürfelt."); } } [Command("car", "~m~Benutzung: ~s~/car")] public void CmdUserCar(Player player) { if (!player.IsLoggedIn()) return; Vehicle pVeh = null; if (player.IsInVehicle) { pVeh = player.Vehicle; } else { pVeh = NAPI.Pools.GetAllVehicles().Where(v => v.Position.DistanceTo(player.Position) <= 5).OrderBy(v => v.Position.DistanceTo(player.Position)).FirstOrDefault(); } if (pVeh == null) { return; } using var dbContext = new DatabaseContext(); if (pVeh.GetServerVehicle(dbContext) is ServerVehicle veh) { User user = player.GetUser(dbContext); string addInfoStr = ""; if (user.IsAdmin(AdminLevel.ADMIN)) { addInfoStr += $" | DB-ID: {veh.Id}"; } if (user.IsAdmin(AdminLevel.HEADADMIN)) { if (veh is FactionVehicle factionVehicle) { addInfoStr += " | Kaufpreis: " + factionVehicle.BuyPrice.ToMoneyString(); } else if (veh is UserVehicle userVehicle) { addInfoStr += " | Kaufpreis: " + userVehicle.Price.ToMoneyString(); } } ChatService.SendMessage(player, "~m~" + ((VehicleHash)pVeh.Model) + " | " + veh.ToString() + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor + " | ID: " + pVeh.Handle.Value + addInfoStr); } else { ChatService.SendMessage(player, "~m~" + ((VehicleHash)pVeh.Model) + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor + " | ID: " + pVeh.Handle.Value); } } [Command("help", "~m~Benutzung: ~s~/help")] public void CmdUserHelp(Player player) { player.SendChatMessage("E - Interagieren (ATM, Türen, Shops, Friseur etc."); player.SendChatMessage("M - Interaktionsmenü öffnen und schließen"); player.SendChatMessage("Z - Fahrzeug auf -/ abschließen sowie im Fahrzeuginteraktionsmenü öffnen"); player.SendChatMessage("N - Fahrzeugmotor Starten"); player.SendChatMessage("O - Onlineliste öffnen / schließen"); player.SendChatMessage("I - Inventar öffnen / schließen"); player.SendChatMessage("F4 - Mikrofon an/aus schalten"); player.SendChatMessage("/report - Support-Anfrage"); } [Command("hup")] public void CmdUserHup(Player player) { player.CheckToggleSurrender(); } [Command("event", "~m~Benutzung: ~s~/event [Nachricht]", GreedyArg = true)] public void CmdFactionNREventchat(Player player, string msg) { if (player.HasData("eventAllowed") == false) { ChatService.NotAuthorized(player); return; } ChatService.BroadcastFaction("~b~[Event] " + player.Name + ": " + msg, new List() { 9 }); } } }