344 lines
11 KiB
C#
344 lines
11 KiB
C#
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<UserCommands>();
|
|
|
|
private const int PASSWORD_CHANGE_FEE = 5000;
|
|
private const int SMS_PRICE = 5;
|
|
|
|
[Command("rent", "~m~rent stop")]
|
|
public void CmdUserStopRent(Player player, String option = "")
|
|
{
|
|
if (!player.IsLoggedIn()) return;
|
|
|
|
if (option.ToLower() != "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, RentCancelReason.byPlayer);
|
|
}
|
|
|
|
[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;
|
|
}
|
|
|
|
uint dimension = player.Dimension;
|
|
PositionManager.eventportDimension = dimension;
|
|
|
|
Vector3 position = player.Position;
|
|
PositionManager.eventportPosition = player.Position;
|
|
|
|
PositionManager.eventportActive = true;
|
|
|
|
player.SendChatMessage("~y~Du hast hier erfolgreich einen Eventport gesetzt.");
|
|
ChatService.BroadcastAdmin($"~y~[EVENTPORT] ~s~{player.Name} hat den Eventport aktiviert (Dimension: {dimension}).", AdminLevel.ADMIN);
|
|
logger.LogInformation("Admin {0} created the eventport at x: {1}, y: {2}, z: {3} in dimension {4}", player.Name, position.X, position.Y, position.Z, dimension);
|
|
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($"~y~[EVENTPORT] ~s~{player.Name} hat den Eventport deaktiviert.", AdminLevel.ADMIN);
|
|
logger.LogInformation("Admin {0} removed the eventport", player.Name);
|
|
return;
|
|
}
|
|
|
|
if (!PositionManager.eventportActive || PositionManager.eventportPosition == null)
|
|
{
|
|
ChatService.ErrorMessage(player, "Es 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.Dimension = PositionManager.eventportDimension;
|
|
player.SendChatMessage("~y~[EVENTPORT] ~s~Du hast dich zum Event teleportiert");
|
|
}
|
|
|
|
[Command("changepw", "~m~Benutzung: ~s~/changepw [Aktuelles Passwort] [Neues Passwort]", SensitiveInfo = true)]
|
|
public void CmdUserChangePw(Player player, string oldPassword, string newPassword)
|
|
{
|
|
if (!player.IsLoggedIn()) return;
|
|
|
|
if (oldPassword == newPassword)
|
|
{
|
|
ChatService.ErrorMessage(player, "Die eingegebenen Passwörter sind identisch");
|
|
return;
|
|
}
|
|
|
|
if (newPassword.Length < GlobalHelper.requiredPasswordLength)
|
|
{
|
|
ChatService.ErrorMessage(player, "Das neue Passwort muss aus mindestens sechs Zeichen bestehen");
|
|
return;
|
|
}
|
|
|
|
using (var dbContext = new DatabaseContext())
|
|
{
|
|
User user = player.GetUser(dbContext);
|
|
|
|
if (user.Password != NAPI.Util.GetHashSha256(oldPassword))
|
|
{
|
|
ChatService.ErrorMessage(player, "Du hast dein aktuelles Passwort falsch eingegeben");
|
|
return;
|
|
}
|
|
|
|
user.Password = NAPI.Util.GetHashSha256(newPassword);
|
|
logger.LogInformation("Player {0} changed their password for {1}", player.Name, PASSWORD_CHANGE_FEE.ToMoneyString());
|
|
|
|
user.BankAccount.Balance -= PASSWORD_CHANGE_FEE;
|
|
dbContext.SaveChanges();
|
|
}
|
|
|
|
ChatService.SendMessage(player, $"~y~[ACCOUNT] ~s~Du hast dein Passwort erfolgreich geändert. Dir wurden ~y~{ PASSWORD_CHANGE_FEE.ToMoneyString() } ~s~in Rechnung gestellt.");
|
|
}
|
|
|
|
[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<string, DateTime>();
|
|
|
|
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<int>() { 9 });
|
|
}
|
|
}
|
|
}
|