public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int  playerId = readBuffer[num++];
            byte action   = readBuffer[num];

            if (playerId != whoAmI)
            {
                Main.players[whoAmI].Kick("SummonSkeletron Player Forgery.");
                return;
            }

            if (action == 1)
            {
                var player = Main.players[whoAmI];

                var ctx = new HookContext
                {
                    Connection = player.Connection,
                    Sender     = player,
                    Player     = player,
                };

                var args = new HookArgs.PlayerTriggeredEvent
                {
                    Type = WorldEventType.BOSS,
                    Name = "Skeletron",
                };

                HookPoints.PlayerTriggeredEvent.Invoke(ref ctx, ref args);

                if (ctx.CheckForKick() || ctx.Result == HookResult.IGNORE)
                {
                    return;
                }

                //ProgramLog.Users.Log ("{0} @ {1}: Skeletron summoned by {2}.", player.IPAddress, whoAmI, player.Name);
                //NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (player.Name, " has summoned Skeletron!"), 255, 255, 128, 150);
                NPC.SpawnSkeletron(player);
            }
            else if (action == 2)
            {
                NetMessage.SendData(51, -1, whoAmI, "", playerId, action, 0f, 0f, 0);
            }
        }
        internal void Apply(Player player = null)
        {
            foreach (var kv in changedTiles)
            {
                var k = kv.Key;
                var x = k >> 16;
                var y = k & 0xffff;
                var t = kv.Value;

                if (t >= 0)
                {
                    Main.tile.data[x, y] = tiles[t];
                }
            }

            foreach (var eff in sideEffects)
            {
                if (eff == null || eff.Cancel)
                {
                    continue;
                }

                switch (eff.EffectType)
                {
                case SideEffectType.ADD_WATER:
                {
                    Terraria_Server.Liquid.AddWater(null, null, eff.X, eff.Y);                              //Applying => Normal Tile References
                    break;
                }

                case SideEffectType.SMASH_SHADOW_ORB:
                {
                    WorldModify.shadowOrbSmashed = true;
                    WorldModify.shadowOrbCount++;

                    if (WorldModify.shadowOrbCount >= 3)
                    {
                        WorldModify.shadowOrbCount = 0;

                        var ctx = new HookContext
                        {
                            Connection = player.Connection,
                            Sender     = player,
                            Player     = player,
                        };

                        var args = new HookArgs.PlayerTriggeredEvent
                        {
                            X    = (int)(player.Position.X / 16),
                            Y    = (int)(player.Position.Y / 16),
                            Type = WorldEventType.BOSS,
                            Name = "Eater of Worlds",
                        };

                        HookPoints.PlayerTriggeredEvent.Invoke(ref ctx, ref args);

                        if (!ctx.CheckForKick() && ctx.Result != HookResult.IGNORE)
                        {
                            //ProgramLog.Users.Log ("{0} @ {1}: Eater of Worlds summoned by {2}.", player.IPAddress, player.whoAmi, player.Name);
                            //NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (player.Name, " has summoned the Eater of Worlds!"), 255, 255, 128, 150);
                            NPC.SpawnOnPlayer(player.whoAmi, (int)NPCType.N13_EATER_OF_WORLDS_HEAD);
                        }
                    }
                    else
                    {
                        string text = "A horrible chill goes down your spine...";
                        if (WorldModify.shadowOrbCount == 2)
                        {
                            text = "Screams echo around you...";
                        }
                        NetMessage.SendData(25, -1, -1, text, 255, 50f, 255f, 130f, 0);
                    }
                    break;
                }

                case SideEffectType.NEW_ITEM:
                {
                    Item.NewItem(eff.X, eff.Y, eff.Width, eff.Height, eff.Type, eff.Stack, eff.NoBroadcast);
                    break;
                }

                case SideEffectType.KILL_SIGN:
                {
                    Sign.KillSign(eff.X, eff.Y);
                    break;
                }

                case SideEffectType.DESTROY_CHEST:
                {
                    Chest.DestroyChest(eff.X, eff.Y);
                    break;
                }

                case SideEffectType.FALLING_BLOCK_PROJECTILE:
                {
                    int p    = Projectile.NewProjectile((float)(eff.X * 16 + 8), (float)(eff.Y * 16 + 8), 0f, 0.41f, eff.Type, 10, 0f, 255);
                    var proj = Main.projectile[p];
                    proj.Creator     = player;
                    proj.Velocity.Y  = 0.5f;
                    proj.Position.Y += 2f;
                    proj.ai[0]       = 1f;
                    NetMessage.SendTileSquare(-1, eff.X, eff.Y, 1);
                    break;
                }
                }
            }
        }