ServerScript update
This commit is contained in:
@ -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,11 +126,18 @@ namespace CoopServer
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MainSettings.DefaultGameMode)
|
||||||
|
{
|
||||||
|
GameMode = new DefaultScript();
|
||||||
|
GameMode.Start();
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(MainSettings.GameMode))
|
||||||
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Logging.Info("Loading gamemode...");
|
Logging.Info("Loading gamemode...");
|
||||||
|
|
||||||
Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "gamemodes" + Path.DirectorySeparatorChar + "FirstMod.dll");
|
Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "gamemodes" + Path.DirectorySeparatorChar + MainSettings.GameMode + ".dll");
|
||||||
Type[] types = asm.GetExportedTypes();
|
Type[] types = asm.GetExportedTypes();
|
||||||
IEnumerable<Type> validTypes = types.Where(t => !t.IsInterface && !t.IsAbstract).Where(t => typeof(ServerScript).IsAssignableFrom(t));
|
IEnumerable<Type> validTypes = types.Where(t => !t.IsInterface && !t.IsAbstract).Where(t => typeof(ServerScript).IsAssignableFrom(t));
|
||||||
Type[] enumerable = validTypes as Type[] ?? validTypes.ToArray();
|
Type[] enumerable = validTypes as Type[] ?? validTypes.ToArray();
|
||||||
@ -156,6 +163,7 @@ namespace CoopServer
|
|||||||
{
|
{
|
||||||
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);
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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";
|
||||||
|
Reference in New Issue
Block a user