Skip to content

Commit

Permalink
Fix issue where client portals overwrote server portals
Browse files Browse the repository at this point in the history
  • Loading branch information
xNarnia committed Dec 9, 2021
1 parent 96dbd70 commit 6a1bde4
Show file tree
Hide file tree
Showing 8 changed files with 180 additions and 64 deletions.
72 changes: 71 additions & 1 deletion ServerPortals.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
using System.IO;
using Terraria.DataStructures;
using Terraria.ID;
using ServerPortals.Tiles;
using System;

namespace ServerPortals
{
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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<PortalTileEntity>();

int id = instance.Find(x, y);

if (id == -1)
{
id = ModContent.GetInstance<PortalTileEntity>().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
}
}
}
16 changes: 12 additions & 4 deletions Tiles/IServerPortal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
}
}
58 changes: 24 additions & 34 deletions Tiles/PortalParentTile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

Expand Down Expand Up @@ -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);
Expand All @@ -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<PortalTileEntity>();
int index = te.Find(left, top);
if (index == -1)
{
index = GetInstance<PortalTileEntity>().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;
Expand All @@ -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
Expand Down Expand Up @@ -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)
{
Expand Down
71 changes: 51 additions & 20 deletions Tiles/PortalTileEntity.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Xna.Framework;
using ServerPortals.UI;
using System;
using System.Collections.Generic;
using System.IO;
Expand All @@ -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<string>("ServerIP");
ServerPort = tag.Get<int>("ServerPort");
ServerName = tag.Get<string>("ServerName");
ServerDescription = tag.Get<string>("ServerDescription");
IP = tag.Get<string>("ServerIP");
Port = tag.Get<int>("ServerPort");
Name = tag.Get<string>("ServerName");
Description = tag.Get<string>("ServerDescription");
}

public override bool ValidTile(int i, int j)
Expand All @@ -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;
}
}
}
8 changes: 4 additions & 4 deletions UI/Menus/GateLabelMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
14 changes: 14 additions & 0 deletions UI/Menus/ServerTransferCreationMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using Terraria.ModLoader;
using Terraria.UI;
using ReLogic.Graphics;
using ServerPortals.Tiles;

namespace ServerPortals.UI
{
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion build.txt
Original file line number Diff line number Diff line change
@@ -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
version = 1.0.1
2 changes: 2 additions & 0 deletions description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit 6a1bde4

Please sign in to comment.