From 6a1bde49c50d1b2cc38e3ff00c4f581b7575d88b Mon Sep 17 00:00:00 2001 From: Panini Date: Thu, 9 Dec 2021 12:30:42 -0500 Subject: [PATCH] Fix issue where client portals overwrote server portals --- ServerPortals.cs | 72 +++++++++++++++++++++++++- Tiles/IServerPortal.cs | 16 ++++-- Tiles/PortalParentTile.cs | 58 +++++++++------------ Tiles/PortalTileEntity.cs | 71 ++++++++++++++++++------- UI/Menus/GateLabelMenu.cs | 8 +-- UI/Menus/ServerTransferCreationMenu.cs | 14 +++++ build.txt | 3 +- description.txt | 2 + 8 files changed, 180 insertions(+), 64 deletions(-) diff --git a/ServerPortals.cs b/ServerPortals.cs index e44816b..3d21057 100644 --- a/ServerPortals.cs +++ b/ServerPortals.cs @@ -7,6 +7,8 @@ using System.IO; using Terraria.DataStructures; using Terraria.ID; +using ServerPortals.Tiles; +using System; namespace ServerPortals { @@ -118,8 +120,11 @@ public override void UpdateUI(GameTime gameTime) public override void HandlePacket(BinaryReader reader, int whoAmI) { MessageType type = (MessageType)reader.ReadByte(); + if (type == MessageType.ClientSendTEUpdate) ReceiveClientSendTEUpdate(reader, whoAmI); + else if (type == MessageType.ClientSendPortalPlacement) + ReceiveClientPortalPlacement(reader, whoAmI); base.HandlePacket(reader, whoAmI); } @@ -154,9 +159,74 @@ public static void ClientSendTEUpdate(int id) } } + public static void ReceiveClientPortalPlacement(BinaryReader reader, int whoAmI) + { + if (Main.netMode == 2) + { + try + { + string IP = reader.ReadString(); + int Port = reader.ReadInt32(); + string Name = reader.ReadString(); + string Desc = reader.ReadString(); + int x = reader.ReadInt32(); + int y = reader.ReadInt32(); + + var instance = ModContent.GetInstance(); + + int id = instance.Find(x, y); + + if (id == -1) + { + id = ModContent.GetInstance().Place(x, y); + } + + PortalTileEntity tileEntity = (PortalTileEntity)TileEntity.ByID[id]; + tileEntity.SetData(new Server() + { + IP = IP, + Port = Port, + Name = Name, + Description = Desc + }); + NetMessage.SendData(MessageID.TileEntitySharing, -1, -1, null, id, x, y); + } + catch + { + Console.WriteLine("- Error receiving Portal Placement"); + } + } + else if (Main.netMode == 1) + { + reader.ReadString(); + reader.ReadInt32(); + reader.ReadString(); + reader.ReadString(); + reader.ReadInt32(); + reader.ReadInt32(); + } + } + + public static void ClientSendPortalPlacement(Server server, int tileX, int tileY) + { + if (Main.netMode == 1) + { + ModPacket packet = Instance.GetPacket(); + packet.Write((byte)MessageType.ClientSendPortalPlacement); + packet.Write(server.IP); + packet.Write(server.Port); + packet.Write(server.Name); + packet.Write(server.Description); + packet.Write(tileX); + packet.Write(tileY); + packet.Send(); + } + } + public enum MessageType : byte { - ClientSendTEUpdate + ClientSendTEUpdate, + ClientSendPortalPlacement } } } \ No newline at end of file diff --git a/Tiles/IServerPortal.cs b/Tiles/IServerPortal.cs index c2f2a98..bb8e119 100644 --- a/Tiles/IServerPortal.cs +++ b/Tiles/IServerPortal.cs @@ -8,9 +8,17 @@ namespace ServerPortals.Tiles { public interface IServerPortal { - string ServerIP { get; set; } - int ServerPort { get; set; } - string ServerName { get; set; } - string ServerDescription { get; set; } + string IP { get; set; } + int Port { get; set; } + string Name { get; set; } + string Description { get; set; } + } + + public struct Server : IServerPortal + { + public string IP { get; set; } + public int Port { get; set; } + public string Name { get; set; } + public string Description { get; set; } } } diff --git a/Tiles/PortalParentTile.cs b/Tiles/PortalParentTile.cs index d52d86f..882947a 100644 --- a/Tiles/PortalParentTile.cs +++ b/Tiles/PortalParentTile.cs @@ -19,10 +19,10 @@ namespace ServerPortals.Tiles { public class PortalParentTile : ModTile, IServerPortal { - public string ServerIP { get; set; } - public int ServerPort { get; set; } - public string ServerName { get; set; } - public string ServerDescription { get; set; } + public string IP { get; set; } + public int Port { get; set; } + public string Name { get; set; } + public string Description { get; set; } public int LeftPoint { get; set; } public int TopPoint { get; set; } @@ -82,6 +82,8 @@ public override void SetDefaults() TileObjectData.addAlternate(5); TileObjectData.addTile(Type); + mineResist = 500; + ModTranslation name = CreateMapEntryName(); name.SetDefault("Server Transfer Portal"); AddMapEntry(new Color(150, 150, 250), name); @@ -98,38 +100,15 @@ public override bool CanPlace(int i, int j) return false; } - ServerIP = ServerPortals.ServerTransferMenu.InputServerIP.Text; + IP = ServerPortals.ServerTransferMenu.InputServerIP.Text; int.TryParse(ServerPortals.ServerTransferMenu.InputServerPort.Text, out int OutPort); - ServerPort = OutPort; - ServerName = ServerPortals.ServerTransferMenu.InputServerName.Text; - ServerDescription = ServerPortals.ServerTransferMenu.InputServerDescription.Text; + Port = OutPort; + Name = ServerPortals.ServerTransferMenu.InputServerName.Text; + Description = ServerPortals.ServerTransferMenu.InputServerDescription.Text; return base.CanPlace(i, j); } - public override void PlaceInWorld(int i, int j, Item item) - { - Tile tile = Main.tile[i, j]; - int left = i - tile.frameX % 36 / 18; - int top = j - tile.frameY / 18; - - PortalTileEntity te = GetInstance(); - int index = te.Find(left, top); - if (index == -1) - { - index = GetInstance().Place(left, top); - } - - PortalTileEntity tileEntity = (PortalTileEntity)TileEntity.ByID[index]; - tileEntity.ServerIP = ServerIP; - tileEntity.ServerPort = ServerPort; - tileEntity.ServerName = ServerName; - tileEntity.ServerDescription = ServerDescription; - - ServerPortals.ClientSendTEUpdate(index); - base.PlaceInWorld(i, j, item); - } - public override void NumDust(int i, int j, bool fail, ref int num) { num = 1; @@ -156,10 +135,11 @@ public override bool NewRightClick(int i, int j) } PortalTileEntity tileEntity = (PortalTileEntity)TileEntity.ByID[index]; - Netplay.ListenPort = tileEntity.ServerPort; - if (Netplay.SetRemoteIP(tileEntity.ServerIP)) + Netplay.ListenPort = tileEntity.Port; + if (Netplay.SetRemoteIP(tileEntity.IP)) { PortalTileEntity.ServerSelectLock = true; + Main.CloseNPCChatOrSign(); ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToServerIP), 1); } else @@ -198,7 +178,17 @@ private void ConnectToServerIP(object threadContext) string data = "a"; byte[] buffer = Encoding.ASCII.GetBytes(data); int timeout = 1000; - PingReply reply = pingSender.Send(Netplay.ServerIP, timeout, buffer, options); + + PingReply reply = null; + try + { + reply = pingSender.Send(Netplay.ServerIP, timeout, buffer, options); + } + catch + { + Main.NewText("Could not ping destination server!"); + return; + } if (reply.Status == IPStatus.Success) { diff --git a/Tiles/PortalTileEntity.cs b/Tiles/PortalTileEntity.cs index 604cf7b..7d17a85 100644 --- a/Tiles/PortalTileEntity.cs +++ b/Tiles/PortalTileEntity.cs @@ -1,4 +1,5 @@ using Microsoft.Xna.Framework; +using ServerPortals.UI; using System; using System.Collections.Generic; using System.IO; @@ -20,48 +21,56 @@ public class PortalTileEntity : ModTileEntity, IServerPortal internal const int range = 50; internal const int drawBorderWidth = 5; - public string ServerIP { get; set; } - public int ServerPort { get; set; } - public string ServerName { get; set; } - public string ServerDescription { get; set; } + public string IP { get; set; } + public int Port { get; set; } + public string Name { get; set; } + public string Description { get; set; } public static bool ServerSelectLock { get; set; } = false; public static bool NeedToSend { set; get; } = false; + public void SetData(Server server) + { + IP = server.IP; + Port = server.Port; + Name = server.Name; + Description = server.Description; + } + public override void NetReceive(BinaryReader reader, bool lightReceive) { base.NetReceive(reader, lightReceive); - ServerIP = reader.ReadString(); - ServerPort = reader.ReadInt32(); - ServerName = reader.ReadString(); - ServerDescription = reader.ReadString(); + IP = reader.ReadString(); + Port = reader.ReadInt32(); + Name = reader.ReadString(); + Description = reader.ReadString(); } public override void NetSend(BinaryWriter writer, bool lightSend) { base.NetSend(writer, lightSend); - writer.Write(ServerIP); - writer.Write(ServerPort); - writer.Write(ServerName); - writer.Write(ServerDescription); + writer.Write(IP); + writer.Write(Port); + writer.Write(Name); + writer.Write(Description); } public override TagCompound Save() { return new TagCompound { - {"ServerIP", ServerIP}, - {"ServerPort", ServerPort}, - {"ServerName", ServerName}, - {"ServerDescription", ServerDescription} + {"ServerIP", IP}, + {"ServerPort", Port}, + {"ServerName", Name}, + {"ServerDescription", Description} }; } public override void Load(TagCompound tag) { - ServerIP = tag.Get("ServerIP"); - ServerPort = tag.Get("ServerPort"); - ServerName = tag.Get("ServerName"); - ServerDescription = tag.Get("ServerDescription"); + IP = tag.Get("ServerIP"); + Port = tag.Get("ServerPort"); + Name = tag.Get("ServerName"); + Description = tag.Get("ServerDescription"); } public override bool ValidTile(int i, int j) @@ -74,5 +83,27 @@ public override bool ValidTile(int i, int j) Tile tile = Main.tile[i, j]; return tile.active() && validTiles.Contains(tile.type) && tile.frameX == 0 && tile.frameY == 0; } + + public override int Hook_AfterPlacement(int i, int j, int type, int style, int direction) + { + Tile tile = Main.tile[i, j]; + int left = i - tile.frameX % 36 / 18; + int top = j - tile.frameY / 18; + + if (Main.netMode == 1) + { + NetMessage.SendTileRange(Main.myPlayer, i, j, 3, 6); + NetMessage.SendData(MessageID.TileEntityPlacement, -1, -1, null, left, top, type); + ServerPortals.ClientSendPortalPlacement(ServerTransferCreationMenu.GetData(), i, j); + return -1; + } + + int id = Place(left, top); + + PortalTileEntity tileEntity = (PortalTileEntity)TileEntity.ByID[id]; + tileEntity.SetData(ServerTransferCreationMenu.GetData()); + + return ID; + } } } diff --git a/UI/Menus/GateLabelMenu.cs b/UI/Menus/GateLabelMenu.cs index 971c69d..1b3a44a 100644 --- a/UI/Menus/GateLabelMenu.cs +++ b/UI/Menus/GateLabelMenu.cs @@ -42,10 +42,10 @@ public override void Draw(SpriteBatch spriteBatch) public static void UpdateLabelUsing(IServerPortal portalTile) { - ServerIP = portalTile.ServerIP; - ServerPort = portalTile.ServerPort; - ServerName = portalTile.ServerName; - ServerDescription = portalTile.ServerDescription; + ServerIP = portalTile.IP; + ServerPort = portalTile.Port; + ServerName = portalTile.Name; + ServerDescription = portalTile.Description; } } } diff --git a/UI/Menus/ServerTransferCreationMenu.cs b/UI/Menus/ServerTransferCreationMenu.cs index e9dea63..b5dcebe 100644 --- a/UI/Menus/ServerTransferCreationMenu.cs +++ b/UI/Menus/ServerTransferCreationMenu.cs @@ -10,6 +10,7 @@ using Terraria.ModLoader; using Terraria.UI; using ReLogic.Graphics; +using ServerPortals.Tiles; namespace ServerPortals.UI { @@ -95,6 +96,19 @@ public override void OnInitialize() Append(Panel); } + public static Server GetData() + { + var output = new Server(); + + output.IP = ServerPortals.ServerTransferMenu.InputServerIP.Text; + int.TryParse(ServerPortals.ServerTransferMenu.InputServerPort.Text, out int OutPort); + output.Port = OutPort; + output.Name = ServerPortals.ServerTransferMenu.InputServerName.Text; + output.Description = ServerPortals.ServerTransferMenu.InputServerDescription.Text; + + return output; + } + public override void Update(GameTime gameTime) { base.Update(gameTime); diff --git a/build.txt b/build.txt index f726b28..b976a2d 100644 --- a/build.txt +++ b/build.txt @@ -1,5 +1,6 @@ displayName = Server Portals author = Lady Narnia +homepage = https://forums.terraria.org/index.php?threads/server-portals-create-portals-to-multiplayers-servers-directly-in-your-world.109793/ includePDB=true buildIgnore=.git/,.vs/,.bin/, .obj/ -version = 1.0 \ No newline at end of file +version = 1.0.1 \ No newline at end of file diff --git a/description.txt b/description.txt index 6e781d4..40264a2 100644 --- a/description.txt +++ b/description.txt @@ -4,6 +4,8 @@ Link your multiplayer servers together with Server Portals! Spawn in these magical doorways and assign IP addresses to them. Simply right-click to be taken to that server! Make your own single-player server hub... Or share it with friends and go on an adventure! +Connect the world with Server Portals! + Note: - These portals can not be crafted and MUST be spawned in - Portals do not drop when broken (for security reasons) \ No newline at end of file