From efc58e05dde7d4304516b6b6a606253bf3c151ba Mon Sep 17 00:00:00 2001 From: Bob Da Ross <52760019+BobDaRoss@users.noreply.github.com> Date: Mon, 10 May 2021 17:10:49 -0500 Subject: [PATCH 1/3] Update version --- SeamlessClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SeamlessClient.cs b/SeamlessClient.cs index d416d18..f2048b5 100644 --- a/SeamlessClient.cs +++ b/SeamlessClient.cs @@ -106,7 +106,7 @@ namespace SeamlessClientPlugin - public static string Version = "1.2.12"; + public static string Version = "1.2.20"; public static bool Debug = false; private static bool Initilized = false; From e9cac15a3ae452d491c94ed6d1166e4bd7e17f64 Mon Sep 17 00:00:00 2001 From: Bob Da Ross <52760019+BobDaRoss@users.noreply.github.com> Date: Mon, 10 May 2021 18:08:30 -0500 Subject: [PATCH 2/3] Fixed spectator issue --- SeamlessClient.cs | 2 +- SeamlessTransfer/SwitchServers.cs | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/SeamlessClient.cs b/SeamlessClient.cs index f2048b5..55e4f3e 100644 --- a/SeamlessClient.cs +++ b/SeamlessClient.cs @@ -182,7 +182,7 @@ namespace SeamlessClientPlugin public static void DisposeInitilizations() { PingTimer.Stop(); - MyAPIGateway.Multiplayer.UnregisterSecureMessageHandler(SeamlessClientNetID, MessageHandler); + MyAPIGateway.Multiplayer?.UnregisterSecureMessageHandler(SeamlessClientNetID, MessageHandler); Initilized = false; } diff --git a/SeamlessTransfer/SwitchServers.cs b/SeamlessTransfer/SwitchServers.cs index ec11521..a4baa59 100644 --- a/SeamlessTransfer/SwitchServers.cs +++ b/SeamlessTransfer/SwitchServers.cs @@ -7,6 +7,7 @@ using Sandbox.Game.Gui; using Sandbox.Game.GUI; using Sandbox.Game.Multiplayer; using Sandbox.Game.World; +using Sandbox.ModAPI; using SeamlessClientPlugin.Utilities; using System; using System.Collections.Concurrent; @@ -98,7 +99,7 @@ namespace SeamlessClientPlugin.SeamlessTransfer RemoveOldEntities(); StartEntitySync(); - + MyModAPIHelper.Initialize(); // Allow the game to start proccessing incoming messages in the buffer MyMultiplayer.Static.StartProcessingClientMessages(); } @@ -107,12 +108,19 @@ namespace SeamlessClientPlugin.SeamlessTransfer private void LoadOnlinePlayers() { //Get This players ID + MyPlayer.PlayerId? savingPlayerId = new MyPlayer.PlayerId(Sync.MyId); if (!savingPlayerId.HasValue) { SeamlessClient.TryShow("SavingPlayerID is null! Creating Default!"); savingPlayerId = new MyPlayer.PlayerId(Sync.MyId); } + SeamlessClient.TryShow("Saving PlayerID: " + savingPlayerId.ToString()); + + Sync.Players.LoadConnectedPlayers(TargetWorld.Checkpoint, savingPlayerId); + Sync.Players.LoadControlledEntities(TargetWorld.Checkpoint.ControlledEntities, TargetWorld.Checkpoint.ControlledObject, savingPlayerId); + /* + SeamlessClient.TryShow("Saving PlayerID: " + savingPlayerId.ToString()); @@ -145,6 +153,8 @@ namespace SeamlessClientPlugin.SeamlessTransfer } } + */ + } private void SetWorldSettings() @@ -169,8 +179,8 @@ namespace SeamlessClientPlugin.SeamlessTransfer MySession.Static.WorldBoundaries = TargetWorld.Checkpoint.WorldBoundaries; MySession.Static.InGameTime = MyObjectBuilder_Checkpoint.DEFAULT_DATE; MySession.Static.ElapsedGameTime = new TimeSpan(TargetWorld.Checkpoint.ElapsedGameTime); - - + MySession.Static.Settings.EnableSpectator = false; + MySession.Static.Password = TargetWorld.Checkpoint.Password; MySession.Static.PreviousEnvironmentHostility = TargetWorld.Checkpoint.PreviousEnvironmentHostility; @@ -248,16 +258,23 @@ namespace SeamlessClientPlugin.SeamlessTransfer private void LoadConnectedClients() { + + + Patches.LoadMembersFromWorld.Invoke(MySession.Static, new object[] { TargetWorld, MyMultiplayer.Static }); + + //Re-Initilize Virtual clients object VirtualClientsValue = Patches.VirtualClients.GetValue(MySession.Static); Patches.InitVirtualClients.Invoke(VirtualClientsValue, null); + /* SeamlessClient.TryShow("Loading exsisting Members From World!"); foreach (var Client in TargetWorld.Checkpoint.Clients) { SeamlessClient.TryShow("Adding New Client: " + Client.Name); Sync.Clients.AddClient(Client.SteamId, Client.Name); - } + }*/ + } private void StartEntitySync() From 1a1a47d07a7f592135a0a006a92b7a4e14d8f93d Mon Sep 17 00:00:00 2001 From: Bob Da Ross <52760019+BobDaRoss@users.noreply.github.com> Date: Wed, 16 Jun 2021 23:45:12 -0500 Subject: [PATCH 3/3] Removed the need to ping the target server first. May reduce load times for high latency people --- Messages/Transfer.cs | 3 ++- SeamlessClient.cs | 3 ++- SeamlessTransfer/PingServer.cs | 41 +++++++++---------------------- SeamlessTransfer/SwitchServers.cs | 24 ++++++++++++++---- Utilities/Patches.cs | 17 +++++++++++-- 5 files changed, 50 insertions(+), 38 deletions(-) diff --git a/Messages/Transfer.cs b/Messages/Transfer.cs index 58e72e9..3b3342d 100644 --- a/Messages/Transfer.cs +++ b/Messages/Transfer.cs @@ -46,7 +46,8 @@ namespace SeamlessClientPlugin.SeamlessTransfer [ProtoMember(9)] public MyObjectBuilder_Toolbar PlayerToolbar; - public List PlayerBuildSlots; + [ProtoMember(10)] + public string ServerName; public Transfer(ulong ServerID, string IPAdress) { diff --git a/SeamlessClient.cs b/SeamlessClient.cs index 55e4f3e..569df3b 100644 --- a/SeamlessClient.cs +++ b/SeamlessClient.cs @@ -174,7 +174,6 @@ namespace SeamlessClientPlugin public static void RunInitilizations() { - TryShow("Initilizing Communications!"); MyAPIGateway.Multiplayer.RegisterSecureMessageHandler(SeamlessClientNetID, MessageHandler); Initilized = true; } @@ -197,6 +196,8 @@ namespace SeamlessClientPlugin { Transfer TransferMessage = Recieved.GetTransferData(); + + ServerPing.StartServerPing(TransferMessage); } } diff --git a/SeamlessTransfer/PingServer.cs b/SeamlessTransfer/PingServer.cs index 1bb18d9..5ec2162 100644 --- a/SeamlessTransfer/PingServer.cs +++ b/SeamlessTransfer/PingServer.cs @@ -13,7 +13,7 @@ namespace SeamlessClientPlugin.SeamlessTransfer public class ServerPing { - private static WorldRequest Request; + private static WorldRequest Request { get { return Transfer.WorldRequest; } } private static Transfer Transfer; @@ -21,7 +21,6 @@ namespace SeamlessClientPlugin.SeamlessTransfer { // We need to first ping the server to make sure its running and so we can get a connection Transfer = ClientTransfer; - Request = Transfer.WorldRequest; if (Transfer.TargetServerID == 0) @@ -30,40 +29,24 @@ namespace SeamlessClientPlugin.SeamlessTransfer return; } + + + MyGameServerItem E = new MyGameServerItem(); + E.ConnectionString = Transfer.IPAdress; + E.SteamID = Transfer.TargetServerID; + E.Name = Transfer.ServerName; + - SeamlessClient.TryShow("Beginning Redirect to server: " + Transfer.TargetServerID); - MyGameService.OnPingServerResponded += PingResponded; - MyGameService.OnPingServerFailedToRespond += FailedToRespond; - MyGameService.PingServer(Transfer.IPAdress); - } - - private static void PingResponded(object sender, MyGameServerItem e) - { - //If server ping was successful we need to begin the switching proccess - UnRegisterEvents(); - - SeamlessClient.TryShow($"{e.Name} was successfully pinged!"); - SwitchServers Switcher = new SwitchServers(e, Request.DeserializeWorldData()); + SwitchServers Switcher = new SwitchServers(E, Request.DeserializeWorldData()); Switcher.BeginSwitch(); - // LoadServer.LoadWorldData(e, Request.DeserializeWorldData()); - } + // MyGameService.OnPingServerResponded += PingResponded; + //MyGameService.OnPingServerFailedToRespond += FailedToRespond; - private static void FailedToRespond(object sender, EventArgs e) - { - // If the target server failed to respond, we need to exit/return to menu - UnRegisterEvents(); - } - - - private static void UnRegisterEvents() - { - //Un-register ping events - MyGameService.OnPingServerResponded -= PingResponded; - MyGameService.OnPingServerFailedToRespond -= FailedToRespond; + //MyGameService.PingServer(Transfer.IPAdress); } } } diff --git a/SeamlessTransfer/SwitchServers.cs b/SeamlessTransfer/SwitchServers.cs index a4baa59..e7e40ca 100644 --- a/SeamlessTransfer/SwitchServers.cs +++ b/SeamlessTransfer/SwitchServers.cs @@ -15,9 +15,11 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using VRage; using VRage.Game; using VRage.Game.ModAPI; using VRage.GameServices; +using VRage.Steam; using VRage.Utils; using VRageMath; using VRageRender; @@ -69,15 +71,24 @@ namespace SeamlessClientPlugin.SeamlessTransfer MyMultiplayer.Static = Utility.CastToReflected(instance, Patches.ClientType); MyMultiplayer.Static.ExperimentalMode = true; + // Set the new SyncLayer to the MySession.Static.SyncLayer + Patches.MySessionLayer.SetValue(MySession.Static, MyMultiplayer.Static.SyncLayer); + SeamlessClient.TryShow("Successfully set MyMultiplayer.Static"); - MyHud.Chat.RegisterChat(MyMultiplayer.Static); + Sync.Clients.SetLocalSteamId(Sync.MyId, false, MyGameService.UserName); Sync.Players.RegisterEvents(); + + + + + } + private void OnJoinEvent(object sender, VRage.Network.JoinResultMsg e) { ForceClientConnection(); @@ -90,8 +101,11 @@ namespace SeamlessClientPlugin.SeamlessTransfer private void ForceClientConnection() { - // Set the new SyncLayer to the MySession.Static.SyncLayer - Patches.MySessionLayer.SetValue(MySession.Static, MyMultiplayer.Static.SyncLayer); + + + MyHud.Chat.RegisterChat(MyMultiplayer.Static); + + MyMultiplayer.Static.OnSessionReady(); LoadConnectedClients(); LoadOnlinePlayers(); @@ -289,7 +303,7 @@ namespace SeamlessClientPlugin.SeamlessTransfer } //typeof(MyGuiScreenTerminal).GetMethod("CreateTabs") - MyMultiplayer.Static.OnSessionReady(); + MySession.Static.LoadDataComponents(); //MyGuiSandbox.LoadData(false); //MyGuiSandbox.AddScreen(MyGuiSandbox.CreateScreen(MyPerGameSettings.GUI.HUDScreen)); @@ -299,7 +313,7 @@ namespace SeamlessClientPlugin.SeamlessTransfer SeamlessClient.TryShow("OnlinePlayers: " + MySession.Static.Players.GetOnlinePlayers().Count); SeamlessClient.TryShow("Loading Complete!"); - MyMultiplayer.Static.OnSessionReady(); + //Recreate all controls... Will fix weird gui/paint/crap MyGuiScreenHudSpace.Static.RecreateControls(true); } diff --git a/Utilities/Patches.cs b/Utilities/Patches.cs index e1a88d4..c837e00 100644 --- a/Utilities/Patches.cs +++ b/Utilities/Patches.cs @@ -30,6 +30,7 @@ namespace SeamlessClientPlugin.SeamlessTransfer public static readonly Type VirtualClientsType = Type.GetType("Sandbox.Engine.Multiplayer.MyVirtualClients, Sandbox.Game"); public static readonly Type GUIScreenChat = Type.GetType("Sandbox.Game.Gui.MyGuiScreenChat, Sandbox.Game"); public static readonly Type MyMultiplayerClientBase = Type.GetType("Sandbox.Engine.Multiplayer.MyMultiplayerClientBase, Sandbox.Game"); + public static readonly Type MySteamServerDiscovery = Type.GetType("VRage.Steam.MySteamServerDiscovery, Vrage.Steam"); /* Harmony Patcher */ private static Harmony Patcher = new Harmony("SeamlessClientPatcher"); @@ -58,6 +59,8 @@ namespace SeamlessClientPlugin.SeamlessTransfer public static MethodInfo LoadMembersFromWorld { get; private set; } public static MethodInfo LoadMultiplayer { get; private set; } + public static MethodInfo SendPlayerData; + public static event EventHandler OnJoinEvent; @@ -97,9 +100,9 @@ namespace SeamlessClientPlugin.SeamlessTransfer LoadPlayerInternal = GetMethod(typeof(MyPlayerCollection), "LoadPlayerInternal", BindingFlags.Instance | BindingFlags.NonPublic); LoadMembersFromWorld = GetMethod(typeof(MySession), "LoadMembersFromWorld", BindingFlags.NonPublic | BindingFlags.Instance); LoadMultiplayer = GetMethod(typeof(MySession), "LoadMultiplayer", BindingFlags.Static | BindingFlags.NonPublic); + SendPlayerData = GetMethod(ClientType, "SendPlayerData", BindingFlags.Instance | BindingFlags.NonPublic); - - + MethodInfo ConnectToServer = GetMethod(typeof(MyGameService), "ConnectToServer", BindingFlags.Static | BindingFlags.Public); @@ -108,6 +111,7 @@ namespace SeamlessClientPlugin.SeamlessTransfer Patcher.Patch(OnJoin, postfix: new HarmonyMethod(GetPatchMethod(nameof(OnUserJoined)))); Patcher.Patch(LoadingAction, prefix: new HarmonyMethod(GetPatchMethod(nameof(LoadMultiplayerSession)))); + //Patcher.Patch(ConnectToServer, prefix: new HarmonyMethod(GetPatchMethod(nameof(OnConnectToServer)))); } private static MethodInfo GetPatchMethod(string v) @@ -222,6 +226,15 @@ namespace SeamlessClientPlugin.SeamlessTransfer } } + private static bool OnConnectToServer(MyGameServerItem server, Action onDone) + { + if (SeamlessClient.IsSwitching) + return false; + + + return true; + } +