diff --git a/Bot/Bot.vcxproj b/Bot/Bot.vcxproj
index 5d7b0e5..6041625 100644
--- a/Bot/Bot.vcxproj
+++ b/Bot/Bot.vcxproj
@@ -101,7 +101,7 @@
-
+
diff --git a/Bot/Bot.vcxproj.filters b/Bot/Bot.vcxproj.filters
index e11e6f6..0e62b61 100644
--- a/Bot/Bot.vcxproj.filters
+++ b/Bot/Bot.vcxproj.filters
@@ -49,7 +49,7 @@
-
+
Resource Files
diff --git a/ChannelRelay/ChannelRelay.vcxproj b/ChannelRelay/ChannelRelay.vcxproj
index 50e352a..a698648 100644
--- a/ChannelRelay/ChannelRelay.vcxproj
+++ b/ChannelRelay/ChannelRelay.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/ChannelRelay/ChannelRelay.vcxproj.filters b/ChannelRelay/ChannelRelay.vcxproj.filters
index db13a8b..5037d3e 100644
--- a/ChannelRelay/ChannelRelay.vcxproj.filters
+++ b/ChannelRelay/ChannelRelay.vcxproj.filters
@@ -28,7 +28,7 @@
Resource Files
-
+
Resource Files
diff --git a/CoreCommands/CoreCommands.vcxproj b/CoreCommands/CoreCommands.vcxproj
index c3ffabd..317fbdf 100644
--- a/CoreCommands/CoreCommands.vcxproj
+++ b/CoreCommands/CoreCommands.vcxproj
@@ -76,7 +76,7 @@
-
+
diff --git a/CoreCommands/CoreCommands.vcxproj.filters b/CoreCommands/CoreCommands.vcxproj.filters
index a44f450..7712bac 100644
--- a/CoreCommands/CoreCommands.vcxproj.filters
+++ b/CoreCommands/CoreCommands.vcxproj.filters
@@ -18,7 +18,7 @@
Resource Files
-
+
Resource Files
diff --git a/ExtraCommands/ExtraCommands.vcxproj b/ExtraCommands/ExtraCommands.vcxproj
index c789d45..4d27b73 100644
--- a/ExtraCommands/ExtraCommands.vcxproj
+++ b/ExtraCommands/ExtraCommands.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/ExtraCommands/ExtraCommands.vcxproj.filters b/ExtraCommands/ExtraCommands.vcxproj.filters
index 962b5d1..4800491 100644
--- a/ExtraCommands/ExtraCommands.vcxproj.filters
+++ b/ExtraCommands/ExtraCommands.vcxproj.filters
@@ -18,7 +18,7 @@
Resource Files
-
+
Resource Files
diff --git a/FunCommands/FunCommands.vcxproj b/FunCommands/FunCommands.vcxproj
index a2f1bca..26240b4 100644
--- a/FunCommands/FunCommands.vcxproj
+++ b/FunCommands/FunCommands.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/FunCommands/FunCommands.vcxproj.filters b/FunCommands/FunCommands.vcxproj.filters
index bea1f66..f6aee8d 100644
--- a/FunCommands/FunCommands.vcxproj.filters
+++ b/FunCommands/FunCommands.vcxproj.filters
@@ -18,7 +18,7 @@
Resource Files
-
+
Resource Files
diff --git a/HTTPServer/HTTPServer.vcxproj b/HTTPServer/HTTPServer.vcxproj
index 52d83e0..ab5e6b4 100644
--- a/HTTPServer/HTTPServer.vcxproj
+++ b/HTTPServer/HTTPServer.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/HTTPServer/HTTPServer.vcxproj.filters b/HTTPServer/HTTPServer.vcxproj.filters
index 2db592d..f8a745d 100644
--- a/HTTPServer/HTTPServer.vcxproj.filters
+++ b/HTTPServer/HTTPServer.vcxproj.filters
@@ -18,7 +18,7 @@
Resource Files
-
+
Resource Files
diff --git a/IRC.Core/IRC.Core.vcxproj b/IRC.Core/IRC.Core.vcxproj
index eca8021..e701f08 100644
--- a/IRC.Core/IRC.Core.vcxproj
+++ b/IRC.Core/IRC.Core.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/IRC.Core/IRC.Core.vcxproj.filters b/IRC.Core/IRC.Core.vcxproj.filters
index ee8f459..c176c51 100644
--- a/IRC.Core/IRC.Core.vcxproj.filters
+++ b/IRC.Core/IRC.Core.vcxproj.filters
@@ -28,7 +28,7 @@
Resource Files
-
+
Resource Files
diff --git a/Jupiter b/Jupiter
index 0963bf9..ae3294c 160000
--- a/Jupiter
+++ b/Jupiter
@@ -1 +1 @@
-Subproject commit 0963bf950533632a26f266f2f8575dc4344f22d8
+Subproject commit ae3294c72b799178bc79b312fe43f34c28deca86
diff --git a/Plugin.Example/Plugin.Example.vcxproj b/Plugin.Example/Plugin.Example.vcxproj
index 5ef3426..393b417 100644
--- a/Plugin.Example/Plugin.Example.vcxproj
+++ b/Plugin.Example/Plugin.Example.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/Plugin.Example/Plugin.Example.vcxproj.filters b/Plugin.Example/Plugin.Example.vcxproj.filters
index bd2fd23..f7cd026 100644
--- a/Plugin.Example/Plugin.Example.vcxproj.filters
+++ b/Plugin.Example/Plugin.Example.vcxproj.filters
@@ -28,7 +28,7 @@
Resource Files
-
+
Resource Files
diff --git a/Plugin.Template/Plugin.Template.vcxproj b/Plugin.Template/Plugin.Template.vcxproj
index 02a6afe..119632d 100644
--- a/Plugin.Template/Plugin.Template.vcxproj
+++ b/Plugin.Template/Plugin.Template.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/Plugin.Template/Plugin.Template.vcxproj.filters b/Plugin.Template/Plugin.Template.vcxproj.filters
index bd2fd23..f7cd026 100644
--- a/Plugin.Template/Plugin.Template.vcxproj.filters
+++ b/Plugin.Template/Plugin.Template.vcxproj.filters
@@ -28,7 +28,7 @@
Resource Files
-
+
Resource Files
diff --git a/PluginManager/PluginManager.vcxproj b/PluginManager/PluginManager.vcxproj
index 3abf96b..8630669 100644
--- a/PluginManager/PluginManager.vcxproj
+++ b/PluginManager/PluginManager.vcxproj
@@ -76,7 +76,7 @@
-
+
diff --git a/PluginManager/PluginManager.vcxproj.filters b/PluginManager/PluginManager.vcxproj.filters
index 34d708a..3a01235 100644
--- a/PluginManager/PluginManager.vcxproj.filters
+++ b/PluginManager/PluginManager.vcxproj.filters
@@ -18,7 +18,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.AlwaysRecord/RenX.AlwaysRecord.vcxproj b/RenX.AlwaysRecord/RenX.AlwaysRecord.vcxproj
index 3f0d1f5..333fcb8 100644
--- a/RenX.AlwaysRecord/RenX.AlwaysRecord.vcxproj
+++ b/RenX.AlwaysRecord/RenX.AlwaysRecord.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.AlwaysRecord/RenX.AlwaysRecord.vcxproj.filters b/RenX.AlwaysRecord/RenX.AlwaysRecord.vcxproj.filters
index d9b473c..51e33df 100644
--- a/RenX.AlwaysRecord/RenX.AlwaysRecord.vcxproj.filters
+++ b/RenX.AlwaysRecord/RenX.AlwaysRecord.vcxproj.filters
@@ -31,7 +31,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Announcements/RenX.Announcements.vcxproj b/RenX.Announcements/RenX.Announcements.vcxproj
index c613ef0..49c8213 100644
--- a/RenX.Announcements/RenX.Announcements.vcxproj
+++ b/RenX.Announcements/RenX.Announcements.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Announcements/RenX.Announcements.vcxproj.filters b/RenX.Announcements/RenX.Announcements.vcxproj.filters
index d23c2ff..a09426b 100644
--- a/RenX.Announcements/RenX.Announcements.vcxproj.filters
+++ b/RenX.Announcements/RenX.Announcements.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Commands/RenX.Commands.vcxproj b/RenX.Commands/RenX.Commands.vcxproj
index ac81f7c..43549e6 100644
--- a/RenX.Commands/RenX.Commands.vcxproj
+++ b/RenX.Commands/RenX.Commands.vcxproj
@@ -75,7 +75,7 @@
-
+
Document
diff --git a/RenX.Commands/RenX.Commands.vcxproj.filters b/RenX.Commands/RenX.Commands.vcxproj.filters
index 035bc98..d556510 100644
--- a/RenX.Commands/RenX.Commands.vcxproj.filters
+++ b/RenX.Commands/RenX.Commands.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Core/RenX.Core.vcxproj b/RenX.Core/RenX.Core.vcxproj
index cf248c7..53bddcd 100644
--- a/RenX.Core/RenX.Core.vcxproj
+++ b/RenX.Core/RenX.Core.vcxproj
@@ -98,7 +98,7 @@
-
+
diff --git a/RenX.Core/RenX.Core.vcxproj.filters b/RenX.Core/RenX.Core.vcxproj.filters
index 7783403..ed86325 100644
--- a/RenX.Core/RenX.Core.vcxproj.filters
+++ b/RenX.Core/RenX.Core.vcxproj.filters
@@ -18,7 +18,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp
index d828a2e..f904a01 100644
--- a/RenX.Core/RenX_Server.cpp
+++ b/RenX.Core/RenX_Server.cpp
@@ -1388,7 +1388,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line)
RenX::PlayerInfo *player;
if (this->isSeamless() == false)
- RenX::Server::wipePlayers();
+ this->wipePlayers();
else if (this->players.size() != 0)
{
for (Jupiter::DLList::Node *n = this->players.getNode(0); n != nullptr; n = n->next)
diff --git a/RenX.ExcessiveHeadshots/RenX.ExcessiveHeadshots.vcxproj b/RenX.ExcessiveHeadshots/RenX.ExcessiveHeadshots.vcxproj
index a5ea79d..f8fd8ee 100644
--- a/RenX.ExcessiveHeadshots/RenX.ExcessiveHeadshots.vcxproj
+++ b/RenX.ExcessiveHeadshots/RenX.ExcessiveHeadshots.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.ExcessiveHeadshots/RenX.ExcessiveHeadshots.vcxproj.filters b/RenX.ExcessiveHeadshots/RenX.ExcessiveHeadshots.vcxproj.filters
index 0bed5bc..f6c957f 100644
--- a/RenX.ExcessiveHeadshots/RenX.ExcessiveHeadshots.vcxproj.filters
+++ b/RenX.ExcessiveHeadshots/RenX.ExcessiveHeadshots.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.ExtraLogging/RenX.ExtraLogging.vcxproj b/RenX.ExtraLogging/RenX.ExtraLogging.vcxproj
index 47e4882..e987e3f 100644
--- a/RenX.ExtraLogging/RenX.ExtraLogging.vcxproj
+++ b/RenX.ExtraLogging/RenX.ExtraLogging.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.ExtraLogging/RenX.ExtraLogging.vcxproj.filters b/RenX.ExtraLogging/RenX.ExtraLogging.vcxproj.filters
index 35ec5ae..d0af5f3 100644
--- a/RenX.ExtraLogging/RenX.ExtraLogging.vcxproj.filters
+++ b/RenX.ExtraLogging/RenX.ExtraLogging.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Greetings/RenX.Greetings.vcxproj b/RenX.Greetings/RenX.Greetings.vcxproj
index 3aa47a4..7ab9a75 100644
--- a/RenX.Greetings/RenX.Greetings.vcxproj
+++ b/RenX.Greetings/RenX.Greetings.vcxproj
@@ -76,7 +76,7 @@
-
+
diff --git a/RenX.Greetings/RenX.Greetings.vcxproj.filters b/RenX.Greetings/RenX.Greetings.vcxproj.filters
index 2a35b21..b224b94 100644
--- a/RenX.Greetings/RenX.Greetings.vcxproj.filters
+++ b/RenX.Greetings/RenX.Greetings.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.HybridUUID/RenX.HybridUUID.vcxproj b/RenX.HybridUUID/RenX.HybridUUID.vcxproj
index c3f9f47..7388481 100644
--- a/RenX.HybridUUID/RenX.HybridUUID.vcxproj
+++ b/RenX.HybridUUID/RenX.HybridUUID.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.HybridUUID/RenX.HybridUUID.vcxproj.filters b/RenX.HybridUUID/RenX.HybridUUID.vcxproj.filters
index 274faf5..ea981f8 100644
--- a/RenX.HybridUUID/RenX.HybridUUID.vcxproj.filters
+++ b/RenX.HybridUUID/RenX.HybridUUID.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.IRCJoin/RenX.IRCJoin.vcxproj b/RenX.IRCJoin/RenX.IRCJoin.vcxproj
index 0488448..2e6f3a5 100644
--- a/RenX.IRCJoin/RenX.IRCJoin.vcxproj
+++ b/RenX.IRCJoin/RenX.IRCJoin.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.IRCJoin/RenX.IRCJoin.vcxproj.filters b/RenX.IRCJoin/RenX.IRCJoin.vcxproj.filters
index b8f58d0..81b9b33 100644
--- a/RenX.IRCJoin/RenX.IRCJoin.vcxproj.filters
+++ b/RenX.IRCJoin/RenX.IRCJoin.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Ladder.All-Time/RenX.Ladder.All-Time.vcxproj b/RenX.Ladder.All-Time/RenX.Ladder.All-Time.vcxproj
index 5bab885..0aeed76 100644
--- a/RenX.Ladder.All-Time/RenX.Ladder.All-Time.vcxproj
+++ b/RenX.Ladder.All-Time/RenX.Ladder.All-Time.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Ladder.All-Time/RenX.Ladder.All-Time.vcxproj.filters b/RenX.Ladder.All-Time/RenX.Ladder.All-Time.vcxproj.filters
index 3199366..e16b176 100644
--- a/RenX.Ladder.All-Time/RenX.Ladder.All-Time.vcxproj.filters
+++ b/RenX.Ladder.All-Time/RenX.Ladder.All-Time.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Ladder.Daily/RenX.Ladder.Daily.vcxproj b/RenX.Ladder.Daily/RenX.Ladder.Daily.vcxproj
index a43cd17..c30ee22 100644
--- a/RenX.Ladder.Daily/RenX.Ladder.Daily.vcxproj
+++ b/RenX.Ladder.Daily/RenX.Ladder.Daily.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Ladder.Daily/RenX.Ladder.Daily.vcxproj.filters b/RenX.Ladder.Daily/RenX.Ladder.Daily.vcxproj.filters
index 21fc8b3..744caa1 100644
--- a/RenX.Ladder.Daily/RenX.Ladder.Daily.vcxproj.filters
+++ b/RenX.Ladder.Daily/RenX.Ladder.Daily.vcxproj.filters
@@ -26,7 +26,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Ladder.Monthly/RenX.Ladder.Monthly.vcxproj b/RenX.Ladder.Monthly/RenX.Ladder.Monthly.vcxproj
index bbe7002..db817ce 100644
--- a/RenX.Ladder.Monthly/RenX.Ladder.Monthly.vcxproj
+++ b/RenX.Ladder.Monthly/RenX.Ladder.Monthly.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Ladder.Monthly/RenX.Ladder.Monthly.vcxproj.filters b/RenX.Ladder.Monthly/RenX.Ladder.Monthly.vcxproj.filters
index 81306c7..70b6503 100644
--- a/RenX.Ladder.Monthly/RenX.Ladder.Monthly.vcxproj.filters
+++ b/RenX.Ladder.Monthly/RenX.Ladder.Monthly.vcxproj.filters
@@ -26,7 +26,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Ladder.Web/RenX.Ladder.Web.vcxproj b/RenX.Ladder.Web/RenX.Ladder.Web.vcxproj
index 3bddbed..df26a39 100644
--- a/RenX.Ladder.Web/RenX.Ladder.Web.vcxproj
+++ b/RenX.Ladder.Web/RenX.Ladder.Web.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Ladder.Web/RenX.Ladder.Web.vcxproj.filters b/RenX.Ladder.Web/RenX.Ladder.Web.vcxproj.filters
index 1bd8865..c44f99c 100644
--- a/RenX.Ladder.Web/RenX.Ladder.Web.vcxproj.filters
+++ b/RenX.Ladder.Web/RenX.Ladder.Web.vcxproj.filters
@@ -31,7 +31,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Ladder.Weekly/RenX.Ladder.Weekly.vcxproj b/RenX.Ladder.Weekly/RenX.Ladder.Weekly.vcxproj
index e2492f6..837a949 100644
--- a/RenX.Ladder.Weekly/RenX.Ladder.Weekly.vcxproj
+++ b/RenX.Ladder.Weekly/RenX.Ladder.Weekly.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Ladder.Weekly/RenX.Ladder.Weekly.vcxproj.filters b/RenX.Ladder.Weekly/RenX.Ladder.Weekly.vcxproj.filters
index 4e22405..c1daad8 100644
--- a/RenX.Ladder.Weekly/RenX.Ladder.Weekly.vcxproj.filters
+++ b/RenX.Ladder.Weekly/RenX.Ladder.Weekly.vcxproj.filters
@@ -26,7 +26,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Ladder.Yearly/RenX.Ladder.Yearly.vcxproj b/RenX.Ladder.Yearly/RenX.Ladder.Yearly.vcxproj
index ce5eef8..a899442 100644
--- a/RenX.Ladder.Yearly/RenX.Ladder.Yearly.vcxproj
+++ b/RenX.Ladder.Yearly/RenX.Ladder.Yearly.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Ladder.Yearly/RenX.Ladder.Yearly.vcxproj.filters b/RenX.Ladder.Yearly/RenX.Ladder.Yearly.vcxproj.filters
index 6a93ff7..1bb02e7 100644
--- a/RenX.Ladder.Yearly/RenX.Ladder.Yearly.vcxproj.filters
+++ b/RenX.Ladder.Yearly/RenX.Ladder.Yearly.vcxproj.filters
@@ -26,7 +26,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Ladder/RenX.Ladder.vcxproj b/RenX.Ladder/RenX.Ladder.vcxproj
index fcc3980..197442d 100644
--- a/RenX.Ladder/RenX.Ladder.vcxproj
+++ b/RenX.Ladder/RenX.Ladder.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Ladder/RenX.Ladder.vcxproj.filters b/RenX.Ladder/RenX.Ladder.vcxproj.filters
index a3835d6..165f028 100644
--- a/RenX.Ladder/RenX.Ladder.vcxproj.filters
+++ b/RenX.Ladder/RenX.Ladder.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Listen/RenX.Listen.vcxproj b/RenX.Listen/RenX.Listen.vcxproj
index 348d222..9663b7a 100644
--- a/RenX.Listen/RenX.Listen.vcxproj
+++ b/RenX.Listen/RenX.Listen.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Listen/RenX.Listen.vcxproj.filters b/RenX.Listen/RenX.Listen.vcxproj.filters
index 2c7667e..2480076 100644
--- a/RenX.Listen/RenX.Listen.vcxproj.filters
+++ b/RenX.Listen/RenX.Listen.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Logging/RenX.Logging.vcxproj b/RenX.Logging/RenX.Logging.vcxproj
index 9dfdcd7..3387246 100644
--- a/RenX.Logging/RenX.Logging.vcxproj
+++ b/RenX.Logging/RenX.Logging.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Logging/RenX.Logging.vcxproj.filters b/RenX.Logging/RenX.Logging.vcxproj.filters
index e30f257..024f4ad 100644
--- a/RenX.Logging/RenX.Logging.vcxproj.filters
+++ b/RenX.Logging/RenX.Logging.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Medals/RenX.Medals.vcxproj b/RenX.Medals/RenX.Medals.vcxproj
index 3420b1a..dcc2f02 100644
--- a/RenX.Medals/RenX.Medals.vcxproj
+++ b/RenX.Medals/RenX.Medals.vcxproj
@@ -76,7 +76,7 @@
-
+
diff --git a/RenX.Medals/RenX.Medals.vcxproj.filters b/RenX.Medals/RenX.Medals.vcxproj.filters
index 965f9a2..b86921f 100644
--- a/RenX.Medals/RenX.Medals.vcxproj.filters
+++ b/RenX.Medals/RenX.Medals.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.MinPlayers/RenX.MinPlayers.vcxproj b/RenX.MinPlayers/RenX.MinPlayers.vcxproj
index 2b3f714..e1abcc7 100644
--- a/RenX.MinPlayers/RenX.MinPlayers.vcxproj
+++ b/RenX.MinPlayers/RenX.MinPlayers.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.MinPlayers/RenX.MinPlayers.vcxproj.filters b/RenX.MinPlayers/RenX.MinPlayers.vcxproj.filters
index 48d98fa..cee27d3 100644
--- a/RenX.MinPlayers/RenX.MinPlayers.vcxproj.filters
+++ b/RenX.MinPlayers/RenX.MinPlayers.vcxproj.filters
@@ -31,7 +31,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.ModSystem/RenX.ModSystem.vcxproj b/RenX.ModSystem/RenX.ModSystem.vcxproj
index 787ee50..7a43eef 100644
--- a/RenX.ModSystem/RenX.ModSystem.vcxproj
+++ b/RenX.ModSystem/RenX.ModSystem.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.ModSystem/RenX.ModSystem.vcxproj.filters b/RenX.ModSystem/RenX.ModSystem.vcxproj.filters
index c68443c..6263c99 100644
--- a/RenX.ModSystem/RenX.ModSystem.vcxproj.filters
+++ b/RenX.ModSystem/RenX.ModSystem.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Net/RenX.Net.vcxproj b/RenX.Net/RenX.Net.vcxproj
new file mode 100644
index 0000000..2f9cd6e
--- /dev/null
+++ b/RenX.Net/RenX.Net.vcxproj
@@ -0,0 +1,86 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+
+ {29C995BB-6A23-4704-BF8D-EA177D5FC7A5}
+ RenX.Net
+
+
+
+ Application
+ true
+ v140
+ MultiByte
+
+
+ DynamicLibrary
+ false
+ v140
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)$(Configuration)\Plugins\
+ AllRules.ruleset
+
+
+
+ Level3
+ Disabled
+ true
+
+
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ ../Bot;../Jupiter;../RenX.Core;../HTTPServer
+ _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
+
+
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RenX.Net/RenX.Net.vcxproj.filters b/RenX.Net/RenX.Net.vcxproj.filters
new file mode 100644
index 0000000..66d45c6
--- /dev/null
+++ b/RenX.Net/RenX.Net.vcxproj.filters
@@ -0,0 +1,41 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+
\ No newline at end of file
diff --git a/RenX.Net/RenX_Net.cpp b/RenX.Net/RenX_Net.cpp
new file mode 100644
index 0000000..471c869
--- /dev/null
+++ b/RenX.Net/RenX_Net.cpp
@@ -0,0 +1,274 @@
+/**
+ * Copyright (C) 2016 Jessica James.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Written by Jessica James
+ */
+
+#include "RenX_Net.h"
+
+using namespace Jupiter::literals;
+
+constexpr ProductID RENEGADE_X = 0x01;
+
+constexpr RequestID REQUEST_SERVER_LIST = 0x01; // version_number
+constexpr RequestID REQUEST_SERVER_LIST_UPDATE = 0x02; // version_number, revision_id
+constexpr RequestID REQUEST_SERVER_DATA = 0x03; // server_id
+
+constexpr int REQUEST_SIZE_TABLE[] =
+{
+ -1, // Invalid request
+ sizeof(int32_t), // REQUEST_SERVER_LIST
+ sizeof(int32_t) + sizeof(int32_t) // REQUEST_SERVER_LIST_UPDATE
+ // sizeof (int32_t) // REQUEST_SERVER_DATA
+};
+
+constexpr size_t minimum_request_size = REQUEST_SIZE_TABLE[REQUEST_SERVER_LIST]; // Size of smallest request
+constexpr size_t maximum_request_size = REQUEST_SIZE_TABLE[REQUEST_SERVER_LIST_UPDATE]; // Size of largest request
+
+// Size of packet header
+constexpr size_t packet_header_size = sizeof(ProductID) + sizeof(RequestID);
+
+constexpr int getRequestSize(RequestID in_request_id)
+{
+ return in_request_id >= sizeof(REQUEST_SIZE_TABLE) / sizeof(int)
+ ? -1 // Invalid request
+ : REQUEST_SIZE_TABLE[in_request_id];
+}
+
+/** Plugin initialization and destruction */
+
+bool RenX_NetPlugin::initialize() //(const Jupiter::CStringType &bind_address, uint16_t bind_port, bool &out_success, std::chrono::milliseconds in_timeout_period)
+{
+ m_timeout_period = std::chrono::milliseconds(this->config.getLongLong(Jupiter::ReferenceString::empty, "TimeoutPeriod"_jrs, 10000));
+
+ if (m_server_socket.bind(Jupiter::CStringS(this->config.get(Jupiter::ReferenceString::empty, "Address"_jrs)).c_str(), this->config.getInt(Jupiter::ReferenceString::empty, "Port"_jrs, 21338), true) == false)
+ return false;
+
+ m_server_socket.setBlocking(false);
+ return true;
+}
+
+RenX_NetPlugin::~RenX_NetPlugin()
+{
+ m_server_socket.close();
+}
+
+int RenX_NetPlugin::OnRehash()
+{
+ Jupiter::Plugin::OnRehash();
+
+ return 0;
+}
+
+/** Server List functions */
+
+void RenX_NetPlugin::assignServerIDs()
+{
+}
+
+void RenX_NetPlugin::addServerToServerList(RenX::Server *server)
+{
+}
+
+void RenX_NetPlugin::updateServerList()
+{
+}
+
+/** Client processing */
+
+void RenX_NetPlugin::process_request(RenX_NetPlugin::Client &client)
+{
+ size_t index;
+ const uint32_t *request_params;
+ ServerList *list;
+
+ request_params = reinterpret_cast(client.m_request_buffer.ptr());
+
+ switch (client.m_request_id)
+ {
+ case REQUEST_SERVER_LIST:
+ index = 0;
+ if (m_server_list.size() != 0)
+ {
+ while (index != m_server_list.size())
+ {
+ list = m_server_list.get(index);
+ if (list->version_number == *request_params)
+ {
+ client.sock.send(list->data);
+ break;
+ }
+
+ if (++index == m_server_list.size())
+ {
+ // Version not found
+ break;
+ }
+ }
+ }
+ // else // m_server_list not initialized correctly (misconfiguration)
+ break;
+
+ default: // Invalid request. Reset timeout to destroy on next loop.
+ client.timeout = std::chrono::steady_clock::now();
+ break;
+ }
+
+ client.sock.shutdown();
+}
+
+int RenX_NetPlugin::think()
+{
+ RenX_NetPlugin::Client *client;
+ Jupiter::Socket *sock;
+ int request_packet_size;
+ Jupiter::DLList::Node *node;
+ Jupiter::DLList::Node *tmp;
+
+ // handle new clients
+ while ((sock = m_server_socket.accept()) != nullptr)
+ {
+ sock->setBlocking(false);
+ request_packet_size = sock->peek();
+
+ if (request_packet_size > maximum_request_packet_size // This is larger than expected (invalid) request. Toss the socket.
+ || (request_packet_size <= 0 && sock->getLastError() != 10035)) // Error!
+ delete sock;
+ else
+ {
+ client = new RenX_NetPlugin::Client();
+ client->sock = std::move(*sock);
+ client->timeout = std::chrono::steady_clock::now() + m_timeout_period;
+
+ if (request_packet_size == expected_request_packet_size) // we have a full request
+ {
+ process_request(*client);
+
+ m_clients_pending_close.add(client);
+ }
+ else // request is not complete; toss it to further processing
+ m_clients_processing.add(client);
+ }
+ }
+
+ // check processing clients for remainder of data; timeout as necessary
+ if (m_clients_processing.size() != 0)
+ {
+ node = m_clients_processing.getNode(0);
+ while (node != nullptr)
+ {
+ client = node->data;
+ request_packet_size = client->sock.peek();
+
+ if (request_packet_size == expected_request_packet_size) // Full request
+ {
+ process_request(*client);
+
+ tmp = node;
+ node = node->next;
+
+ m_clients_processing.remove(tmp);
+
+ client->timeout = std::chrono::steady_clock::now() + m_timeout_period;
+ m_clients_pending_close.add(client);
+ }
+ else if (request_packet_size > expected_request_packet_size // Invalid request
+ || client->timeout <= std::chrono::steady_clock::now() // Incomplete request & timed out
+ || (request_packet_size <= 0 && client->sock.getLastError() != 10035)) // Error!
+ {
+ client->sock.close();
+
+ tmp = node;
+ node = node->next;
+
+ delete m_clients_processing.remove(tmp);
+ }
+ else // Incomplete request
+ node = node->next;
+ }
+ }
+
+ // check old clients for clean close; timeout as necessary
+ if (m_clients_pending_close.size() != 0)
+ {
+ node = m_clients_pending_close.getNode(0);
+ while (node != nullptr)
+ {
+ client = node->data;
+ request_packet_size = client->sock.recv();
+
+ if (request_packet_size == 0 // Shutdown successfully
+ || (request_packet_size < 0 && client->sock.getLastError() != 10035) // Error!
+ || client->timeout <= std::chrono::steady_clock::now()) // Timeout
+ {
+ client->sock.close();
+
+ tmp = node;
+ node = node->next;
+
+ delete m_clients_pending_close.remove(tmp);
+ }
+ else // Still pending; go to next
+ node = node->next;
+ }
+ }
+
+ return 0;
+}
+
+/** Events */
+
+void RenX_NetPlugin::RenX_OnServerFullyConnected(RenX::Server *server)
+{
+ if (++m_server_id == 0) // Overflow; this will actually invalidate the results of any previous server list
+ this->assignServerIDs();
+ else
+ server->varData.set(this->getName(), "i"_jrs, Jupiter::ReferenceString(reinterpret_cast(&m_server_id), sizeof(m_server_id)));
+
+ // Server added; append
+ this->addServerToServerList(server);
+}
+
+void RenX_NetPlugin::RenX_OnServerDisconnect(RenX::Server *server, RenX::DisconnectReason reason)
+{
+ // Server removed; update
+ this->updateServerList();
+}
+
+void RenX_NetPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player)
+{
+ // User count changed; update
+ this->updateServerList();
+}
+
+void RenX_NetPlugin::RenX_OnPart(RenX::Server *server, const RenX::PlayerInfo *player)
+{
+ // User count changed; update
+ this->updateServerList();
+}
+
+void RenX_NetPlugin::RenX_OnMapLoad(RenX::Server *server, const Jupiter::ReadableString &map)
+{
+ // Level name changed; update
+ this->updateServerList();
+}
+
+// Plugin instantiation and entry point.
+RenX_NetPlugin pluginInstance;
+
+extern "C" __declspec(dllexport) Jupiter::Plugin *getPlugin()
+{
+ return &pluginInstance;
+}
diff --git a/RenX.Net/RenX_Net.h b/RenX.Net/RenX_Net.h
new file mode 100644
index 0000000..1bd8685
--- /dev/null
+++ b/RenX.Net/RenX_Net.h
@@ -0,0 +1,93 @@
+/**
+ * Copyright (C) 2016 Jessica James.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Written by Jessica James
+ */
+
+#if !defined _RENX_NET_GAME_H_HEADER
+#define _RENX_NET_GAME_H_HEADER
+
+#include
+#include "Jupiter/Thinker.h"
+#include "Jupiter/CString.h"
+#include "Jupiter/TCPSocket.h"
+#include "Jupiter/DLList.h"
+#include "Jupiter/ArrayList.h"
+#include "RenX_Plugin.h"
+#include "RenX_Server.h"
+
+typedef uint8_t ProductID;
+typedef uint8_t RequestID;
+typedef uint32_t ServerID;
+
+class RenX_NetPlugin : public RenX::Plugin
+{
+public:
+
+ struct Client
+ {
+ Jupiter::Socket sock;
+ std::chrono::steady_clock::time_point timeout;
+
+ ProductID m_product_id;
+ RequestID m_request_id;
+ Jupiter::String m_request_buffer;
+ };
+
+ struct ServerList
+ {
+ uint32_t version_number = 0;
+ uint32_t revision_id = 0;
+
+ Jupiter::String data;
+ Jupiter::ArrayList servers;
+ };
+
+ void assignServerIDs();
+ void addServerToServerList(RenX::Server *server);
+ void updateServerList();
+ ~RenX_NetPlugin();
+
+public: // Jupiter::Plugin
+ virtual bool initialize() override;
+ int OnRehash() override;
+ int think() override;
+
+public: // RenX::Plugin
+ void RenX_OnServerFullyConnected(RenX::Server *server) override;
+ void RenX_OnServerDisconnect(RenX::Server *server, RenX::DisconnectReason reason) override;
+ void RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player) override;
+ void RenX_OnPart(RenX::Server *server, const RenX::PlayerInfo *player) override;
+ void RenX_OnMapLoad(RenX::Server *server, const Jupiter::ReadableString &map) override;
+
+private:
+ void process_request(Client &client);
+
+ std::chrono::milliseconds m_ping_frequency;
+ std::chrono::milliseconds m_ping_timeout;
+
+ Jupiter::TCPSocket m_server_socket;
+ Jupiter::DLList m_clients;
+ Jupiter::DLList m_clients_pending_close;
+
+ uint32_t m_server_id;
+
+ uint32_t m_min_server_version;
+ uint32_t m_max_server_version;
+
+ Jupiter::ArrayList m_server_list;
+};
+
+#endif // _RENX_SERVERLIST_GAME_H_HEADER
\ No newline at end of file
diff --git a/RenX.NicknameUUID/RenX.NicknameUUID.vcxproj b/RenX.NicknameUUID/RenX.NicknameUUID.vcxproj
index 4bc6055..ff38cdf 100644
--- a/RenX.NicknameUUID/RenX.NicknameUUID.vcxproj
+++ b/RenX.NicknameUUID/RenX.NicknameUUID.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.NicknameUUID/RenX.NicknameUUID.vcxproj.filters b/RenX.NicknameUUID/RenX.NicknameUUID.vcxproj.filters
index d35c490..8d680c1 100644
--- a/RenX.NicknameUUID/RenX.NicknameUUID.vcxproj.filters
+++ b/RenX.NicknameUUID/RenX.NicknameUUID.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Plugin.Template/RenX.Plugin.Template.vcxproj b/RenX.Plugin.Template/RenX.Plugin.Template.vcxproj
index 696ab3e..24214af 100644
--- a/RenX.Plugin.Template/RenX.Plugin.Template.vcxproj
+++ b/RenX.Plugin.Template/RenX.Plugin.Template.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Plugin.Template/RenX.Plugin.Template.vcxproj.filters b/RenX.Plugin.Template/RenX.Plugin.Template.vcxproj.filters
index 25968fc..e301d20 100644
--- a/RenX.Plugin.Template/RenX.Plugin.Template.vcxproj.filters
+++ b/RenX.Plugin.Template/RenX.Plugin.Template.vcxproj.filters
@@ -31,7 +31,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.ServerList/RenX.ServerList.vcxproj b/RenX.ServerList/RenX.ServerList.vcxproj
index 7061318..c8837d0 100644
--- a/RenX.ServerList/RenX.ServerList.vcxproj
+++ b/RenX.ServerList/RenX.ServerList.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.ServerList/RenX.ServerList.vcxproj.filters b/RenX.ServerList/RenX.ServerList.vcxproj.filters
index 14c4699..7758384 100644
--- a/RenX.ServerList/RenX.ServerList.vcxproj.filters
+++ b/RenX.ServerList/RenX.ServerList.vcxproj.filters
@@ -31,7 +31,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.SetJoin/RenX.SetJoin.vcxproj b/RenX.SetJoin/RenX.SetJoin.vcxproj
index 079d664..4a726c9 100644
--- a/RenX.SetJoin/RenX.SetJoin.vcxproj
+++ b/RenX.SetJoin/RenX.SetJoin.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.SetJoin/RenX.SetJoin.vcxproj.filters b/RenX.SetJoin/RenX.SetJoin.vcxproj.filters
index 6340f48..4ab7674 100644
--- a/RenX.SetJoin/RenX.SetJoin.vcxproj.filters
+++ b/RenX.SetJoin/RenX.SetJoin.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/RenX.Warn/RenX.Warn.vcxproj b/RenX.Warn/RenX.Warn.vcxproj
index 0dac73d..b3a6d9c 100644
--- a/RenX.Warn/RenX.Warn.vcxproj
+++ b/RenX.Warn/RenX.Warn.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/RenX.Warn/RenX.Warn.vcxproj.filters b/RenX.Warn/RenX.Warn.vcxproj.filters
index 56f02df..eac43d6 100644
--- a/RenX.Warn/RenX.Warn.vcxproj.filters
+++ b/RenX.Warn/RenX.Warn.vcxproj.filters
@@ -21,7 +21,7 @@
Resource Files
-
+
Resource Files
diff --git a/SetJoin/SetJoin.vcxproj b/SetJoin/SetJoin.vcxproj
index 2c74eed..242cdee 100644
--- a/SetJoin/SetJoin.vcxproj
+++ b/SetJoin/SetJoin.vcxproj
@@ -75,7 +75,7 @@
-
+
diff --git a/SetJoin/SetJoin.vcxproj.filters b/SetJoin/SetJoin.vcxproj.filters
index 97446f3..3dd58a2 100644
--- a/SetJoin/SetJoin.vcxproj.filters
+++ b/SetJoin/SetJoin.vcxproj.filters
@@ -18,7 +18,7 @@
Resource Files
-
+
Resource Files