Allows sending messages only to a group of users

In some circumstances (like proximity, missions...) we may want
to target messages to only a sub set of all the users connected
to the server. Adding this optional parameter to SendModPacketToAll
and SendChatMessageToAll allows that while being backwards
compatible with the API
Fixes some problems introduced in the non interactive mode
Changes the SetLocalTraffic parameter to make it more readable
so now SetLocalTraffic(true) means to ENABLE local traffic while
SetLocalTraffic(false) means DISABLE local traffic
This commit is contained in:
Makinolo
2021-12-14 20:24:03 -07:00
parent 7394c40562
commit ee79fe5cc2
5 changed files with 32 additions and 11 deletions

View File

@ -166,9 +166,10 @@ namespace CoopServer
{
try
{
Logging.Info("Loading resource...");
string resourcepath = AppDomain.CurrentDomain.BaseDirectory + "resources" + Path.DirectorySeparatorChar + MainSettings.Resource + ".dll";
Logging.Info($"Loading resource {resourcepath}...");
Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "resources" + Path.DirectorySeparatorChar + MainSettings.Resource + ".dll");
Assembly asm = Assembly.LoadFrom(resourcepath);
Type[] types = asm.GetExportedTypes();
IEnumerable<Type> validTypes = types.Where(t => !t.IsInterface && !t.IsAbstract).Where(t => typeof(ServerScript).IsAssignableFrom(t));
Type[] enumerable = validTypes as Type[] ?? validTypes.ToArray();

View File

@ -207,10 +207,19 @@ namespace CoopServer
#endregion
#region FUNCTIONS
public static void SendModPacketToAll(string mod, byte customID, byte[] bytes)
public static void SendModPacketToAll(string mod, byte customID, byte[] bytes, List<long> playerIdList = null)
{
try
{
List<NetConnection> connections;
if (playerIdList == null)
{
connections = Server.MainNetServer.Connections;
}
else
{
connections = Server.MainNetServer.Connections.FindAll(c => playerIdList.Contains(c.RemoteUniqueIdentifier));
}
NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage();
new ModPacket()
{
@ -220,7 +229,7 @@ namespace CoopServer
CustomPacketID = customID,
Bytes = bytes
}.PacketToNetOutGoingMessage(outgoingMessage);
Server.MainNetServer.SendMessage(outgoingMessage, Server.MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.Mod);
Server.MainNetServer.SendMessage(outgoingMessage, connections, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.Mod);
Server.MainNetServer.FlushSendQueue();
}
catch (Exception e)
@ -285,7 +294,7 @@ namespace CoopServer
return Server.Clients.Find(x => x.Player.Username.ToLower() == username.ToLower());
}
public static void SendChatMessageToAll(string message, string username = "Server")
public static void SendChatMessageToAll(string message, string username = "Server", List<long> playerIdList = null)
{
try
{
@ -294,13 +303,22 @@ namespace CoopServer
return;
}
List<NetConnection> connections;
if (playerIdList == null)
{
connections = Server.MainNetServer.Connections;
}
else
{
connections = Server.MainNetServer.Connections.FindAll(c => playerIdList.Contains(c.RemoteUniqueIdentifier));
}
NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage();
new ChatMessagePacket()
{
Username = username,
Message = message
}.PacketToNetOutGoingMessage(outgoingMessage);
Server.MainNetServer.SendMessage(outgoingMessage, Server.MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.Chat);
Server.MainNetServer.SendMessage(outgoingMessage, connections, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.Chat);
}
catch (Exception e)
{