public override void PlayerDisconnect(Player player)
        {
            FTPlayer ftPlayer = player.GetModPlayer <FTPlayer>();

            if (ftPlayer.isLeader)
            {
                ftPlayer.isLeader = false;
                ModPacket packet = mod.GetPacket();
                packet.Write((byte)PacketMessageType.UpdateServerLeader);
                packet.Write(false);
                packet.Send();
            }
        }
 private void SendClientChangesPacket()
 {
     if (Main.netMode == NetmodeID.MultiplayerClient)
     {
         ModPacket packet = SGAmod.Instance.GetPacket();
         packet.Write(501);
         packet.Write(player.whoAmI);
         packet.Write((double)aimDir);
         packet.Write((byte)AttackCheck);
         packet.Write((byte)EngineerModes);
         packet.Send();
     }
 }
Beispiel #3
0
        public override void SendClientChanges(ModPlayer clientPlayer)
        {
            QuestSystem clone = clientPlayer as QuestSystem;

            if (clone.CurrentQuest != CurrentQuest)
            {
                ModPacket packet = mod.GetPacket();
                packet.Write((byte)3);
                packet.Write(player.whoAmI);
                packet.Write(CurrentQuest);
                packet.Send();
            }
        }
Beispiel #4
0
        internal static void SendTeleporterItems(Teleporter teleporter, int ignoreClient = -1)
        {
            if (Main.netMode == NetmodeID.SinglePlayer)
            {
                return;
            }

            ModPacket packet = GetPacket(PacketType.TeleporterItems);

            packet.Write(teleporter.ID);
            teleporter.Handler.Write(packet);
            packet.Send(ignoreClient: ignoreClient);
        }
Beispiel #5
0
        internal static void SendTeleporterDestination(Teleporter teleporter, int ignoreClient = -1)
        {
            if (Main.netMode == NetmodeID.SinglePlayer)
            {
                return;
            }

            ModPacket packet = GetPacket(PacketType.TeleporterName);

            packet.Write(teleporter.ID);
            packet.Write(teleporter._destination);
            packet.Send(ignoreClient: ignoreClient);
        }
Beispiel #6
0
 public static void SendDepositAll(int ent, List <Item> items)
 {
     if (Main.netMode == 1)
     {
         ModPacket packet = PrepareStorageOperation(ent, 2);
         packet.Write((byte)items.Count);
         foreach (Item item in items)
         {
             ItemIO.Send(item, packet, true);
         }
         packet.Send();
     }
 }
Beispiel #7
0
        public override void SyncPlayer(int toWho, int fromWho, bool newPlayer)
        {
            ModPacket packet = mod.GetPacket();

            packet.Write((byte)ModMessageType.SyncPlayer);
            packet.Write((byte)player.whoAmI);
            for (int i = 0; i < LansToggleableBuffs.instance.getBuffLength(); i++)
            {
                packet.Write(boughtbuffsavail[i]);
                packet.Write(buffsavail[i]);
            }
            packet.Send(toWho, fromWho);
        }
Beispiel #8
0
        protected ModPacket GetPacket(byte packetType, int fromWho)
        {
            ModPacket packet = JoJoStands.Instance.GetPacket();

            packet.Write(HandlerType);
            packet.Write(packetType);

            /*if (Main.netMode == NetmodeID.Server)
             * {
             *      packet.Write((byte)fromWho);
             * }*/
            return(packet);
        }
Beispiel #9
0
        public override void HandlePacket(BinaryReader reader, int whoAmI)
        {
            TLPacketType packetRecieved = (TLPacketType)reader.ReadByte();

            switch (packetRecieved)
            {
            case TLPacketType.SyncJoiningPlayer:
                byte     playerIndex = reader.ReadByte();
                TLPlayer modPlayer   = Main.player[playerIndex].GetModPlayer <TLPlayer>();
                modPlayer.Level      = reader.ReadInt32();
                modPlayer.Experience = reader.ReadInt32();
                break;

            case TLPacketType.SyncLevelData:
                playerIndex          = reader.ReadByte();
                modPlayer            = Main.player[playerIndex].GetModPlayer <TLPlayer>();
                modPlayer.Level      = reader.ReadInt32();
                modPlayer.Experience = reader.ReadInt32();
                if (Main.netMode == NetmodeID.Server)
                {
                    var packet = GetPacket();
                    packet.Write((byte)TLPacketType.SyncLevelData);
                    packet.Write(playerIndex);
                    packet.Write(modPlayer.Level);
                    packet.Write(modPlayer.Experience);
                    packet.Send(-1, playerIndex);
                }
                break;

            case TLPacketType.SyncProjectileExplosion:
                if (Main.netMode == NetmodeID.Server)
                {
                    int       projectileIndex = reader.ReadInt32();
                    ModPacket packet          = GetPacket();
                    packet.Write((byte)TLPacketType.SyncProjectileExplosion);
                    packet.Write(projectileIndex);
                    packet.Send(ignoreClient: whoAmI);
                }
                else
                {
                    int        projectileIndex   = reader.ReadInt32();
                    Projectile projectileAtIndex = Main.projectile[projectileIndex];
                    (projectileAtIndex.modProjectile as TLProjectile).AddExplosiveFlair(projectileAtIndex, true);
                }
                break;

            default:
                TLLogger.WarnFormat($"Unrecognized packet recieved: {packetRecieved}");
                break;
            }
        }
Beispiel #10
0
        public override bool UseItem(Player player)
        {
            Tile targetTile = Framing.GetTileSafely(Player.tileTargetX, Player.tileTargetY);

            if (targetTile.type == TileID.Saplings)
            {
                if (Main.netMode != NetmodeID.SinglePlayer)
                {
                    ModPacket growCoord = mod.GetPacket();
                    growCoord.Write((byte)0);
                    growCoord.Write(Player.tileTargetX);
                    growCoord.Write(Player.tileTargetY);
                    growCoord.Send();
                }
                else if ((Main.tile[Player.tileTargetX, Player.tileTargetY].frameX < 324 || Main.tile[Player.tileTargetX, Player.tileTargetY].frameX >= 540)
                                        ? WorldGen.GrowTree(Player.tileTargetX, Player.tileTargetY) : WorldGen.GrowPalmTree(Player.tileTargetX, Player.tileTargetY))
                {
                    WorldGen.TreeGrowFXCheck(Player.tileTargetX, Player.tileTargetY);
                }
            }
            if (targetTile.type == TileID.Stone)
            {
                int   mossID    = 0;
                int   mossCount = 0;
                Point point     = player.Center.ToTileCoordinates();
                Dictionary <ushort, int> dictionary = new Dictionary <ushort, int>();
                WorldUtils.Gen(new Point(point.X - 25, point.Y - 25), new Shapes.Rectangle(50, 50), new Actions.TileScanner(182, 180, 179, 183, 181, 381).Output(dictionary));
                foreach (KeyValuePair <ushort, int> item in dictionary)
                {
                    if (item.Value > mossCount)
                    {
                        mossCount = item.Value;
                        mossID    = item.Key;
                    }
                }
                if (mossCount == 0)
                {
                    mossID = Utils.SelectRandom <int>(Main.rand, 182, 180, 179, 183, 181);
                }
                if (mossID != 0)
                {
                    Main.tile[Player.tileTargetX, Player.tileTargetY].type = (ushort)mossID;
                    WorldGen.SquareTileFrame(Player.tileTargetX, Player.tileTargetY);
                    if (Main.netMode != NetmodeID.SinglePlayer)
                    {
                        NetMessage.SendTileSquare(-1, Player.tileTargetX, Player.tileTargetY, 1);
                    }
                }
            }
            return(true);
        }
Beispiel #11
0
        /* NETWORK SYNICNG <<<<< WIP >>>>> */

        public override void HandlePacket(BinaryReader reader, int whoAmI)
        {
            MetroidMessageType msgType = (MetroidMessageType)reader.ReadByte();

            switch (msgType)
            {
            case MetroidMessageType.SyncPlayerStats:
            case MetroidMessageType.SyncStartPlayerStats:
                byte    playerID     = reader.ReadByte();
                MPlayer targetPlayer = Main.player[playerID].GetModPlayer <MPlayer>();
                double  statCharge   = reader.ReadDouble();
                bool    spiderBall   = reader.ReadBoolean();
                int     boostEffect  = reader.ReadInt32();
                int     boostCharge  = reader.ReadInt32();

                targetPlayer.statCharge  = (float)statCharge;
                targetPlayer.spiderball  = spiderBall;
                targetPlayer.boostEffect = boostEffect;
                targetPlayer.boostCharge = boostCharge;

                if (msgType == MetroidMessageType.SyncPlayerStats && Main.netMode == NetmodeID.Server)
                {
                    var packet = GetPacket();
                    packet.Write((byte)MetroidMessageType.SyncPlayerStats);
                    packet.Write(playerID);
                    packet.Write(statCharge);
                    packet.Write(spiderBall);
                    packet.Write(boostEffect);
                    packet.Write(boostCharge);
                    packet.Send(-1, playerID);
                }
                break;

            case MetroidMessageType.PlaySyncedSound:
                byte   playerID2     = reader.ReadByte();
                Player targetPlayer2 = Main.player[playerID2];
                string sound         = reader.ReadString();

                Main.PlaySound(GetLegacySoundSlot(SoundType.Custom, "Sounds/" + sound), targetPlayer2.position);

                if (Main.netMode == 2)
                {
                    ModPacket packet = GetPacket();
                    packet.Write((byte)MetroidMessageType.PlaySyncedSound);
                    packet.Write(playerID2);
                    packet.Write(sound);
                    packet.Send(-1, whoAmI);
                }
                break;
            }
        }
Beispiel #12
0
        public static void Write(this ModPacket packet, TagCompound tag)
        {
            packet.Write(tag.Count);
            foreach (var it in tag)
            {
                switch (it.Value)
                {
                case bool b:
                    packet.Write((byte)0);
                    packet.Write(it.Key);
                    packet.Write(b);
                    break;

                case int i:
                    packet.Write((byte)1);
                    packet.Write(it.Key);
                    packet.Write(i);
                    break;

                case float f:
                    packet.Write((byte)2);
                    packet.Write(it.Key);
                    packet.Write(f);
                    break;

                case double d:
                    packet.Write((byte)3);
                    packet.Write(it.Key);
                    packet.Write(d);
                    break;

                case string s:
                    packet.Write((byte)4);
                    packet.Write(it.Key);
                    packet.Write(s);
                    break;

                case byte bt:
                    packet.Write((byte)5);
                    packet.Write(it.Key);
                    packet.Write(bt);
                    break;

                case TagCompound ctag:
                    packet.Write((byte)6);
                    packet.Write(it.Key);
                    packet.Write(ctag);
                    break;
                }
            }
        }
Beispiel #13
0
        public override void SyncPlayer(int toWho, int fromWho, bool newPlayer)
        {
            ModPacket packet = mod.GetPacket();

            packet.Write((byte)AlchemistNPC.AlchemistNPCMessageType.LifeAndManaSync);
            packet.Write((byte)player.whoAmI);
            packet.Write(LifeElixir);
            packet.Write(Fuaran);
            packet.Write(KeepBuffs);
            packet.Write(WellFed);
            packet.Write(BillIsDowned);
            packet.Write(BBP);
            packet.Send(toWho, fromWho);
        }
Beispiel #14
0
 private void OnHit(int damage)
 {
     damageTotal += damage * 60;
     if (Main.netMode != 0)
     {
         ModPacket netMessage = GetPacket(ChaosSpiritMessageType.Damage);
         netMessage.Write(damage * 60);
         if (Main.netMode == 1)
         {
             netMessage.Write(Main.myPlayer);
         }
         netMessage.Send();
     }
 }
Beispiel #15
0
        public void SyncCounters(int player, PlayerCharacter character, bool crit)
        {
            if (Main.netMode != 2)
            {
                return;
            }

            ModPacket packet = mod.GetPacket();

            packet.Write((byte)(crit ? Message.SyncCritHit : Message.SyncHit));
            packet.Write(player);
            packet.Write(crit ? character.critAccuracyCounter : character.accuracyCounter);
            packet.Send();
        }
Beispiel #16
0
 // Make something happen when the npc teleports to a statue. Since this method only runs server side, any visual effects like dusts or gores have to be synced across all clients manually.
 public override void OnGoToStatue(bool toKingStatue)
 {
     if (Main.netMode == NetmodeID.Server)
     {
         ModPacket packet = mod.GetPacket();
         packet.Write((byte)ExampleModMessageType.ExampleTeleportToStatue);
         packet.Write((byte)npc.whoAmI);
         packet.Send();
     }
     else
     {
         StatueTeleport();
     }
 }
        ////////////////////////////////
        // Senders (Server)
        ////////////////////////////////

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

            ModPacket packet = mymod.GetPacket();

            packet.Write((byte)DowsingNetProtocolTypes.ModSettings);
            packet.Write((string)mymod.Config.SerializeMe());

            packet.Send((int)player.whoAmI);
        }
Beispiel #18
0
        public void SendClientMessage()
        {
            if (Main.netMode == NetmodeID.SinglePlayer)
            {
                return;
            }
            ModPacket packet = mod.GetPacket();

            packet.Write((byte)11);
            packet.Write(ID);
            packet.Write(Lightbulb.type);
            packet.Write(Chip.type);
            packet.Send();
        }
        public static void SendRequestedDowsingNpcFromServer(DowsingMod mymod, Player player, int npc_who)
        {
            if (Main.netMode != 2)
            {
                return;
            }                                               // Server only

            ModPacket packet = mymod.GetPacket();

            packet.Write((byte)DowsingNetProtocolTypes.RequestedDowsingNpcWho);
            packet.Write((int)npc_who);

            packet.Send((int)player.whoAmI);
        }
Beispiel #20
0
        private void Box_OnClick(UIMouseEvent evt, UIElement listeningElement)
        {
            if (evt.Target == moreInfo)
            {
                return;
            }
            if (Main.keyState.IsKeyDown(Keys.LeftAlt) || Main.keyState.IsKeyDown(Keys.RightAlt))
            {
                boss.hidden = !boss.hidden;
                if (boss.hidden)
                {
                    WorldAssist.HiddenBosses.Add(boss.Key);
                }
                else
                {
                    WorldAssist.HiddenBosses.Remove(boss.Key);
                }
                BossChecklist.instance.bossChecklistUI.UpdateCheckboxes();
                if (BossChecklist.BossLogConfig.HideUnavailable)
                {
                    BossChecklist.instance.BossLog.UpdateTableofContents();
                }
                if (Main.netMode == NetmodeID.MultiplayerClient)
                {
                    ModPacket packet = BossChecklist.instance.GetPacket();
                    packet.Write((byte)PacketMessageType.RequestHideBoss);
                    packet.Write(boss.Key);
                    packet.Write(boss.hidden);
                    packet.Send();
                }
                return;
            }

            UIBossCheckbox clicked = listeningElement as UIBossCheckbox;

            foreach (var item in BossChecklist.instance.bossChecklistUI.checklistList._items)
            {
                UIBossCheckbox box = (item as UIBossCheckbox);
                if (box != clicked)
                {
                    box.expanded = false;
                    box.AddOrRemoveChild(box.moreInfo, box.expanded);
                    box.Height.Pixels = 15;
                    box.Recalculate();
                }
            }

            expanded = !expanded;
            PostExpand();
        }
        public void SendFavoritedRecipes(int toWho, int fromWho, bool syncPlayer = false)
        {
            ModPacket packet = mod.GetPacket();

            packet.Write((byte)MessageType.SendFavoritedRecipes);
            packet.Write((byte)player.whoAmI);
            packet.Write((bool)syncPlayer);             // prevents duplicate sends when normal syncPlayer is happening.
            packet.Write(favoritedRecipes.Count);
            foreach (var recipeIndex in favoritedRecipes)
            {
                packet.Write(recipeIndex);
            }
            packet.Send(toWho, fromWho);
        }
Beispiel #22
0
        public static void SendPacket(Player player, string name, int fromWho = -1)
        {
            if (Main.netMode == NetmodeID.SinglePlayer)
            {
                return;
            }

            ModPacket packet = TBAR.Instance.GetPacket();

            packet.Write((byte)PacketType.UsedCombo);
            packet.Write((byte)player.whoAmI);
            packet.Write(name);
            packet.Send(-1, fromWho);
        }
Beispiel #23
0
        internal static void SendFluid(Frequency frequency, int slot, int ignoreClient = -1)
        {
            if (Main.netMode == NetmodeID.SinglePlayer)
            {
                return;
            }

            ModPacket packet = GetPacket(PacketType.SyncFluidFrequency);

            packet.Write(frequency);
            packet.Write(slot);
            packet.Write(ModContent.GetInstance <QSWorld>().QEFluidHandlers.FirstOrDefault(fluidPair => Equals(fluidPair.Frequency, frequency)).Handler.GetFluidInSlot(slot));
            packet.Send(ignoreClient: ignoreClient);
        }
Beispiel #24
0
        public override void PostUpdate()
        {
            Player p = Main.player[Main.myPlayer];

            //inventory is closed, so we can't be crafting
            if (!Main.playerInventory)
            {
                startedCrafting = false;
            }

            //Inventory open, not crafting, mouse matches last crafted item
            //We must have started crafting, as last crafted item is reset when we finish crafting
            // so it won't match our mouse unless we craft something new (i.e. can't pick up the thing you last crafted to fool it)
            if (Main.playerInventory &&
                !startedCrafting &&
                Main.mouseItem.type == ZephsChatNotificationsGlobalItem.lastCraftedItemType)
            {
                startedCrafting = true;
            }

            //Inventory open, crafting, mouse item changes
            //If our mouse item changes then it means we've put down whatever we were crafting, so we're done.
            if (Main.playerInventory &&
                startedCrafting &&
                lastMouseItem.type != Main.mouseItem.type &&
                lastMouseItem.type != 0 &&                                 //Disregard empty mouse, since if it's empty it could mean that we've now started crafting
                ZephsChatNotificationsGlobalItem.lastCraftedItemType >= 0) //If it's -1 for some reason then don't print anything to the chat
            {
                if (Main.netMode == NetmodeID.MultiplayerClient)
                {
                    ModPacket packet = mod.GetPacket();
                    packet.Write((byte)3);
                    packet.Write((int)Main.LocalPlayer.whoAmI);
                    packet.Write((int)ZephsChatNotificationsGlobalItem.lastCraftedItemStack);
                    packet.Write((int)ZephsChatNotificationsGlobalItem.lastCraftedItemType);

                    //Send to server since we're the client
                    packet.Send(-1);
                }

                startedCrafting = false;

                //Reset so that "Main.mouseItem.type == ZephsChatNotificationsGlobalItem.lastCraftedItemType" isn't true above
                ZephsChatNotificationsGlobalItem.lastCraftedItemType   = -1;
                ZephsChatNotificationsGlobalItem.lastCraftedItemStack  = -1;
                ZephsChatNotificationsGlobalItem.lastCraftedItemPrefix = -1;
            }

            lastMouseItem = Main.mouseItem;
        }
Beispiel #25
0
 public void Initialize()
 {
     if (attackProgress == 1)
     {
         Vector2 center = npc.Center;
         for (int k = 0; k < 255; k++)
         {
             Player player = Main.player[k];
             if (player.active && player.position.X > center.X - arenaWidth / 2 && player.position.X + player.width < center.X + arenaWidth / 2 && player.position.Y > center.Y - arenaHeight / 2 && player.position.Y + player.height < center.Y + arenaHeight / 2)
             {
                 player.GetModPlayer <ExamplePlayer>(mod).heroLives = 3;
                 if (Main.netMode == 2)
                 {
                     ModPacket netMessage = GetPacket(PuritySpiritMessageType.HeroPlayer);
                     netMessage.Send(k);
                 }
             }
         }
         shieldTimer = 1000;
     }
     attackProgress++;
     if (attackProgress == 90)
     {
         if (ExampleWorld.downedPuritySpirit)
         {
             Talk("What, you again? Oh well...");
         }
         else
         {
             Talk("You, who have challenged me...");
         }
     }
     if (attackProgress == 180)
     {
         SetupCrystals(arenaWidth / 6, true);
     }
     if (attackProgress >= 420)
     {
         Talk("Show me the power that has saved Terraria!");
         attackProgress = 0;
         stage++;
         npc.dontTakeDamage = false;
         if (Main.netMode == 2)
         {
             ModPacket netMessage = GetPacket(PuritySpiritMessageType.DontTakeDamage);
             netMessage.Write(false);
             netMessage.Send();
         }
     }
 }
        public static Vector2 GetLocalCursor(int id)
        {
            LocalCursor[id] = Main.MouseWorld;

            if (Main.netMode == NetmodeID.MultiplayerClient)
            {
                ModPacket packet = instance.GetPacket();
                packet.Write((byte)ModMessageType.UpdateLocalCursor); // Message type, you would need to create an enum for this
                packet.Write((byte)id);
                packet.WriteVector2(LocalCursor[id]);
                packet.Send();
            }
            return(LocalCursor[id]);
        }
        public override void SyncPlayer(int toWho, int fromWho, bool newPlayer)
        {
            ModPacket packet = mod.GetPacket();

            packet.Write((byte)PropHuntModMessageType.propSync);
            packet.Write(player.whoAmI);
            int playerX = player.GetModPlayer <PropHuntPlayer>().mouseX.GetValueOrDefault();
            int playerY = player.GetModPlayer <PropHuntPlayer>().mouseY.GetValueOrDefault();

            packet.Write(playerX);
            packet.Write(playerY);
            packet.Write(player.GetModPlayer <PropHuntPlayer>().isTransformed);
            packet.Send(toWho, fromWho);
        }
Beispiel #28
0
        public override void OnEnterWorld(Player player)
        {
            RecordTimers  = new List <int>(BossAssist.instance.setup.SortedBosses.Count);
            BrinkChecker  = new List <int>(BossAssist.instance.setup.SortedBosses.Count);
            MaxHealth     = new List <int>(BossAssist.instance.setup.SortedBosses.Count);
            DeathTracker  = new List <bool>(BossAssist.instance.setup.SortedBosses.Count);
            DodgeTimer    = new List <int>(BossAssist.instance.setup.SortedBosses.Count);
            AttackCounter = new List <int>(BossAssist.instance.setup.SortedBosses.Count);

            foreach (BossInfo boss in BossAssist.instance.setup.SortedBosses)
            {
                RecordTimers.Add(0);
                BrinkChecker.Add(0);
                MaxHealth.Add(0);
                DeathTracker.Add(false);
                DodgeTimer.Add(0);
                AttackCounter.Add(0);
            }

            if (Main.netMode == NetmodeID.MultiplayerClient)
            {
                // Essentially to get "BossAssist.ServerCollectedRecords[player.whoAmI] = AllBossRecords;"
                ModPacket packet = mod.GetPacket();
                packet.Write((byte)MessageType.SendRecordsToServer);
                for (int i = 0; i < BossAssist.instance.setup.SortedBosses.Count; i++)
                {
                    packet.Write(AllBossRecords[i].stat.kills);
                    packet.Write(AllBossRecords[i].stat.deaths);
                    packet.Write(AllBossRecords[i].stat.fightTime);
                    packet.Write(AllBossRecords[i].stat.fightTime2);
                    packet.Write(AllBossRecords[i].stat.brink2);
                    packet.Write(AllBossRecords[i].stat.brink);
                    packet.Write(AllBossRecords[i].stat.totalDodges);
                    packet.Write(AllBossRecords[i].stat.totalDodges2);
                    packet.Write(AllBossRecords[i].stat.dodgeTime);
                }
                packet.Send();
            }

            /*
             * if (isNewPlayer)
             * {
             * // This wont work in MP, but ill fix that later
             * CombatText.NewText(player.getRect(), Color.LightGreen, "Thanks for playing with Shepherd's mods!!", true);
             * isNewPlayer = false;
             * }
             */
            //MapAssist.shouldDraw = false;
            //MapAssist.tilePos = new Vector2(0, 0);
        }
Beispiel #29
0
        public static void NPCSpawnOnPlayer(Player player, int type)
        {
            if (Main.netMode != 1)
            {
                NPC.SpawnOnPlayer(player.whoAmI, type);
                return;
            }
            ModPacket packet = Entrogic.Instance.GetPacket();

            packet.Write((byte)EntrogicModMessageType.NPCSpawnOnPlayerAction);
            packet.Write((byte)player.whoAmI);
            packet.Write((short)type);
            packet.Send(-1, -1);
        }
Beispiel #30
0
        public void Send(int toWho, int fromWho, int x, int y)
        {
            //Main.NewText("Local player sending remove tombstone", 255, 100, 100);

            ModPacket packet = mod.GetPacket();

            if (Main.netMode == NetmodeID.Server)
            {
                packet.Write(fromWho);
            }
            packet.Write(x);
            packet.Write(y);
            packet.Send(toWho, fromWho);
        }