////////////////////////////////
        // Senders (Server)
        ////////////////////////////////

        public static void SendWormholesAndSettingsViaServer(WormholesMod mymod, Player player)
        {
            if (Main.netMode != 2)
            {
                return;
            }                                               // Server only

            WormholesWorld modworld = mymod.GetModWorld <WormholesWorld>();
            ModPacket      packet   = mymod.GetPacket();

            // Be sure our wormholes are ready to send (if not already)
            modworld.SetupWormholes();

            packet.Write((byte)WormholeNetProtocolTypes.WormholesAndModSettings);
            packet.Write((string)mymod.Config.SerializeMe());
            packet.Write((int)WormholeManager.PortalCount);

            for (int i = 0; i < WormholeManager.PortalCount; i++)
            {
                var link = modworld.Wormholes.Links[i];
                packet.Write((string)link.ID.ToString());
                packet.Write((float)link.LeftPortal.Pos.X);
                packet.Write((float)link.LeftPortal.Pos.Y);
                packet.Write((float)link.RightPortal.Pos.X);
                packet.Write((float)link.RightPortal.Pos.Y);
            }
            packet.Send(player.whoAmI);
        }
        public static void BroadcastWormholeUpdateViaServer(WormholesMod mymod, string id)
        {
            if (Main.netMode != 2)
            {
                return;
            }                                               // Server only

            WormholesWorld modworld = mymod.GetModWorld <WormholesWorld>();
            WormholeLink   link     = modworld.Wormholes.GetLinkById(id);
            ModPacket      packet   = mymod.GetPacket();

            if (link == null)
            {
                ErrorLogger.Log("WormholesNetProtocol.BroadcastWormholeUpdateViaServer - Invalid wormhole link id.");
                return;
            }

            packet.Write((byte)WormholeNetProtocolTypes.WormholeUpdate);
            packet.Write((string)id);
            packet.Write((float)link.RightPortal.Pos.X);
            packet.Write((float)link.RightPortal.Pos.Y);
            packet.Write((float)link.LeftPortal.Pos.X);
            packet.Write((float)link.LeftPortal.Pos.Y);

            packet.Send();              // Broadcast
        }
        ////////////////////////////////
        // Recipients (Client)
        ////////////////////////////////

        private static void ReceiveWormholesAndSettingsOnClient(WormholesMod mymod, BinaryReader reader)
        {
            if (Main.netMode != 1)
            {
                return;
            }                                               // Clients only

            WormholesWorld modworld       = mymod.GetModWorld <WormholesWorld>();
            string         json           = reader.ReadString();
            int            wormhole_count = reader.ReadInt32();

            mymod.Config.DeserializeMe(json);

            for (int i = 0; i < wormhole_count; i++)
            {
                string id       = reader.ReadString();
                float  worm_l_x = reader.ReadSingle();
                float  worm_l_y = reader.ReadSingle();
                float  worm_r_x = reader.ReadSingle();
                float  worm_r_y = reader.ReadSingle();

                Vector2 pos_l = new Vector2(worm_l_x, worm_l_y);
                Vector2 pos_r = new Vector2(worm_r_x, worm_r_y);

                var link = new WormholeLink(id, WormholeLink.GetColor(i), pos_l, pos_r);
                modworld.Wormholes.Links.Insert(i, link);
            }
        }