ServerScript update

This commit is contained in:
EntenKoeniq
2021-08-15 07:54:25 +02:00
parent fc9a581ff6
commit b9e40f8e36
3 changed files with 193 additions and 28 deletions

View File

@ -29,7 +29,7 @@ namespace CoopServer
public static NetServer MainNetServer; public static NetServer MainNetServer;
private static readonly Dictionary<string, EntitiesPlayer> Players = new(); public static readonly Dictionary<string, EntitiesPlayer> Players = new();
private static ServerScript GameMode; private static ServerScript GameMode;
@ -126,35 +126,43 @@ namespace CoopServer
#endregion #endregion
} }
try if (MainSettings.DefaultGameMode)
{ {
Logging.Info("Loading gamemode..."); GameMode = new DefaultScript();
GameMode.Start();
Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "gamemodes" + Path.DirectorySeparatorChar + "FirstMod.dll"); }
Type[] types = asm.GetExportedTypes(); else if (!string.IsNullOrEmpty(MainSettings.GameMode))
IEnumerable<Type> validTypes = types.Where(t => !t.IsInterface && !t.IsAbstract).Where(t => typeof(ServerScript).IsAssignableFrom(t)); {
Type[] enumerable = validTypes as Type[] ?? validTypes.ToArray(); try
if (!enumerable.Any())
{ {
Logging.Error("ERROR: No classes that inherit from ServerScript have been found in the assembly. Starting freeroam."); Logging.Info("Loading gamemode...");
}
else Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "gamemodes" + Path.DirectorySeparatorChar + MainSettings.GameMode + ".dll");
{ Type[] types = asm.GetExportedTypes();
GameMode = Activator.CreateInstance(enumerable.ToArray()[0]) as ServerScript; IEnumerable<Type> validTypes = types.Where(t => !t.IsInterface && !t.IsAbstract).Where(t => typeof(ServerScript).IsAssignableFrom(t));
if (GameMode == null) Type[] enumerable = validTypes as Type[] ?? validTypes.ToArray();
if (!enumerable.Any())
{ {
Logging.Warning("Could not create gamemode: it is null."); Logging.Error("ERROR: No classes that inherit from ServerScript have been found in the assembly. Starting freeroam.");
} }
else else
{ {
GameMode.Start(); GameMode = Activator.CreateInstance(enumerable.ToArray()[0]) as ServerScript;
if (GameMode == null)
{
Logging.Warning("Could not create gamemode: it is null.");
}
else
{
GameMode.Start();
}
} }
} }
} catch (Exception e)
catch (Exception e) {
{ Logging.Error(e.Message);
Logging.Error(e.Message); }
} }
Listen(); Listen();
@ -603,6 +611,11 @@ namespace CoopServer
// Send a message to targets or all players // Send a message to targets or all players
private static void SendChatMessage(ChatMessagePacket packet, List<NetConnection> targets = null) private static void SendChatMessage(ChatMessagePacket packet, List<NetConnection> targets = null)
{ {
if (GameMode != null && GameMode.OnChatMessage(packet.Username, packet.Message))
{
return;
}
packet.Message = packet.Message.Replace("~", ""); packet.Message = packet.Message.Replace("~", "");
Logging.Info(packet.Username + ": " + packet.Message); Logging.Info(packet.Username + ": " + packet.Message);

View File

@ -1,7 +1,98 @@
using Lidgren.Network; using System;
using System.Collections.Generic;
using Lidgren.Network;
namespace CoopServer namespace CoopServer
{ {
class DefaultScript : ServerScript
{
private List<string> Admins = new();
private string AdminPassword = "test123";
public override void OnPlayerConnect(Entities.EntitiesPlayer client)
{
SendChatMessageToAll("Say hello to " + client.Username);
}
public override void OnPlayerDisconnect(Entities.EntitiesPlayer player, string reason)
{
Logging.Info(player.Username + " left the server, reason: " + reason);
if (Admins.Contains(player.Username))
{
Admins.Remove(player.Username);
}
}
public override bool OnChatMessage(string username, string message)
{
if (!message.StartsWith("/"))
{
return false;
}
string[] messageSplitted = message.Split(" ");
int messageSplittedLength = messageSplitted.Length;
if (messageSplittedLength == 0)
{
return true;
}
if (!Admins.Contains(username))
{
if (messageSplitted[0] != "/rcon")
{
SendChatMessageToPlayer(username, "Please login with \"/rcon <PASSWORD>\"!");
return true;
}
if (messageSplitted.Length < 2)
{
SendChatMessageToPlayer(username, "Password missing!");
return true;
}
if (messageSplitted[1] != AdminPassword)
{
SendChatMessageToPlayer(username, "Wrong password!");
Logging.Warning("Player [" + username + "] tried to login rcon with [" + messageSplitted[1] + "]");
return true;
}
Admins.Add(username);
SendChatMessageToPlayer(username, "Login successfully!");
Logging.Info("Login successfully! [RCON][" + username + "]");
return true;
}
if (messageSplitted[0] == "/kick")
{
if (messageSplittedLength < 3)
{
SendChatMessageToPlayer(username, "Please use \"/kick <USERNAME> <REASON>\"");
return true;
}
try
{
KickPlayerByUsername(messageSplitted[1], messageSplittedLength >= 3 ? messageSplitted[2] : "Kicked by " + username + "!");
SendChatMessageToPlayer(username, "Player [" + messageSplitted[1] + "] kicked!");
}
catch (Exception e)
{
SendChatMessageToPlayer(username, e.Message);
}
return true;
}
SendChatMessageToPlayer(username, "Command \"" + messageSplitted[0] + "\" not found!");
return true;
}
}
public class ServerScript public class ServerScript
{ {
public virtual void Start() public virtual void Start()
@ -9,14 +100,48 @@ namespace CoopServer
Logging.Info("Gamemode loaded successfully!"); Logging.Info("Gamemode loaded successfully!");
} }
public virtual void OnPlayerConnect(Entities.EntitiesPlayer client) public virtual void OnPlayerConnect(Entities.EntitiesPlayer player)
{ {
Logging.Info("New player [" + client.SocialClubName + " | " + client.Username + "] connected!"); Logging.Info("New player [" + player.SocialClubName + " | " + player.Username + "] connected!");
} }
public virtual void OnPlayerDisconnect(Entities.EntitiesPlayer client, string reason) public virtual void OnPlayerDisconnect(Entities.EntitiesPlayer player, string reason)
{ {
Logging.Info(client.Username + " left the server, reason: " + reason); Logging.Info(player.Username + " left the server, reason: " + reason);
}
public virtual bool OnChatMessage(string username, string message) { return false; }
protected static List<string> GetAllConnections()
{
List<string> result = new();
lock (Server.MainNetServer.Connections)
{
Server.MainNetServer.Connections.ForEach(con => result.Add(NetUtility.ToHexString(con.RemoteUniqueIdentifier)));
}
return result;
}
protected static int GetAllPlayersCount() { lock (Server.Players) return Server.Players.Count; }
protected static Dictionary<string, Entities.EntitiesPlayer> GetAllPlayers() { lock (Server.Players) return Server.Players; }
protected static void KickPlayerByUsername(string username, string reason)
{
lock (Server.Players)
{
foreach (KeyValuePair<string, Entities.EntitiesPlayer> player in Server.Players)
{
if (player.Value.Username == username)
{
Server.MainNetServer.Connections.Find(e => NetUtility.ToHexString(e.RemoteUniqueIdentifier) == player.Key).Disconnect(reason);
return;
}
}
}
throw new Exception("Player [" + username + "] not found!");
} }
protected static void SendChatMessageToAll(string message, string username = "Server") protected static void SendChatMessageToAll(string message, string username = "Server")
@ -27,11 +152,36 @@ namespace CoopServer
Message = message Message = message
}; };
Logging.Info(username + packet.Message); Logging.Info(username + ": " + packet.Message);
NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage(); NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage();
packet.PacketToNetOutGoingMessage(outgoingMessage); packet.PacketToNetOutGoingMessage(outgoingMessage);
Server.MainNetServer.SendMessage(outgoingMessage, Server.MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, 0); Server.MainNetServer.SendMessage(outgoingMessage, Server.MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, 0);
} }
protected static void SendChatMessageToPlayer(string username, string message, string from = "Server")
{
lock (Server.Players)
{
foreach (KeyValuePair<string, Entities.EntitiesPlayer> player in Server.Players)
{
if (player.Value.Username == username)
{
ChatMessagePacket packet = new()
{
Username = from,
Message = message
};
Logging.Info(from + ": " + packet.Message);
NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage();
packet.PacketToNetOutGoingMessage(outgoingMessage);
Server.MainNetServer.SendMessage(outgoingMessage, Server.MainNetServer.Connections.Find(con => NetUtility.ToHexString(con.RemoteUniqueIdentifier) == player.Key), NetDeliveryMethod.ReliableOrdered, 0);
return;
}
}
}
}
} }
} }

View File

@ -6,6 +6,8 @@
public int MaxPlayers { get; set; } = 16; public int MaxPlayers { get; set; } = 16;
public string ServerName { get; set; } = "GTACoop:R server"; public string ServerName { get; set; } = "GTACoop:R server";
public string WelcomeMessage { get; set; } = "Welcome on this server :)"; public string WelcomeMessage { get; set; } = "Welcome on this server :)";
public bool DefaultGameMode { get; set; } = true;
public string GameMode { get; set; } = "";
public bool Allowlist { get; set; } = false; public bool Allowlist { get; set; } = false;
public bool NpcsAllowed { get; set; } = true; public bool NpcsAllowed { get; set; } = true;
public string MasterServer { get; set; } = "https://gtacoopr.entenkoeniq.de/servers"; public string MasterServer { get; set; } = "https://gtacoopr.entenkoeniq.de/servers";