Example #1
0
        public static void OnUnkownPacketSend(ref HookContext ctx, ref HookArgs.UnkownSendPacket args)
        {
            switch (args.PacketId)
            {
                case (int)Packets.CLIENT_MOD_GOD:
                    {
                        NetMessageExtension msg = new NetMessageExtension();

                        if (args.RemoteClient != -1)
                        {
                            var player = Main.players[args.RemoteClient];

                            if (player.HasClientMod)
                            {
                                if (Server.AllowTDCMRPG)
                                {
                                    Server.notifyOps(
                                        String.Format("Failed attempt to {0} God Mode on an RPG Server.", true, (args.Number == 1) ? "give" : "remove"));
                                    return;
                                }

                                Server.notifyOps(
                                    String.Format("{0} {1} God Mode.", true, player.Name, (args.Number == 1) ? "has" : "doesn't have"));

                                msg.GodTDCMClient(args.Number == 1);
                                args.Message = msg;
                                ctx.SetResult(HookResult.IGNORE); //Let TDSM know it's to ignore returning.
                            }
                        }
                        break;
                    }

            }
        }
        public override void Process(ClientConnection conn, byte[] readBuffer, int length, int num)
        {
            var data = Encoding.ASCII.GetString (readBuffer, num, length - 1);
            var lines = data.Split ('\n');

            foreach (var line in lines)
            {
                if (line == "tdcm1")
                {
                    //player.HasClientMod = true;
                    ProgramLog.Log ("{0} is a TDCM protocol version 1 client.", conn.RemoteAddress);
                }
                else if (line == "tdsmcomp1")
                {
                    conn.CompressionVersion = 1;
                    ProgramLog.Log ("{0} supports TDSM compression version 1.", conn.RemoteAddress);
                }
            }

            var ctx = new HookContext
            {
                Connection = conn,
            };

            var args = new HookArgs.DisconnectReceived
            {
                Content = data,
                Lines   = lines,
            };

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

            ctx.CheckForKick ();
        }
        public ClientConnection(Socket socket, int slot) : base(socket)
        {
            //var buf = NetMessage.buffer[id];
            //socket.SendBufferSize = 128000;
            connectedAt = time.Elapsed;

            if (slot >= 0)
            {
                AssignSlot(slot);
            }

            socket.LingerState = new LingerOption(true, 10);

            var ctx = new Terraria_Server.Plugins.HookContext
            {
                Connection = this,
            };

            var args = new Terraria_Server.Plugins.HookArgs.NewConnection();

            Terraria_Server.Plugins.HookPoints.NewConnection.Invoke(ref ctx, ref args);

            if (ctx.CheckForKick())
            {
                return;
            }

            lock (All)
            {
                indexInAll = All.Count;
                All.Add(this);
            }

            StartReceiving(new byte [4192]);
        }
        public ClientConnection(Socket socket, int slot)
            : base(socket)
        {
            //var buf = NetMessage.buffer[id];
            //socket.SendBufferSize = 128000;
            connectedAt = time.Elapsed;

            if (slot >= 0) AssignSlot (slot);

            socket.LingerState = new LingerOption (true, 10);

            var ctx = new Terraria_Server.Plugins.HookContext
            {
                Connection = this,
            };

            var args = new Terraria_Server.Plugins.HookArgs.NewConnection ();

            Terraria_Server.Plugins.HookPoints.NewConnection.Invoke (ref ctx, ref args);

            if (ctx.CheckForKick ())
                return;

            lock (All)
            {
                indexInAll = All.Count;
                All.Add (this);
            }

            StartReceiving (new byte [4192]);
        }
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int playerId = readBuffer[num++]; //TODO: maybe check for forgery
            byte action = readBuffer[num];
            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();
            }
            else if (action == 2)
            {
                NetMessage.SendData (51, -1, whoAmI, "", playerId, action, 0f, 0f, 0);
            }
        }
        public override void Process(ClientConnection conn, byte[] readBuffer, int length, int num)
        {
            if (conn.State == SlotState.ACCEPTED)
            {
                SlotManager.Schedule (conn, conn.DesiredQueue);
                return;
            }

            int whoAmI = conn.SlotIndex;

            if (NetPlay.slots[whoAmI].state == SlotState.ASSIGNING_SLOT)
            {
                NetPlay.slots[whoAmI].state = SlotState.SENDING_WORLD;
            }

            var ctx = new HookContext() { Connection = conn, Player = conn.Player };
            var args = new HookArgs.WorldRequestMessage()
            {
                SpawnX = Main.spawnTileX,
                SpawnY = Main.spawnTileY
            };
            HookPoints.WorldRequestMessage.Invoke(ref ctx, ref args);

            //NetMessage.SendData(7, whoAmI);
            var msg = NetMessage.PrepareThreadInstance();
            msg.WorldData(args.SpawnX, args.SpawnY);
            msg.Send(whoAmI);
        }
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            short identity = BitConverter.ToInt16(readBuffer, num);
            num += 2;
            byte owner = readBuffer[num];

            owner = (byte)whoAmI;

            int index = Projectile.FindExisting(identity, owner);
            if (index == 1000) return;

            var player = Main.players[whoAmI];

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

            var args = new HookArgs.KillProjectileReceived
            {
                Id = identity,
                Owner = owner,
                Index = (short)index,
            };

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

            if (ctx.CheckForKick())
            {
                return;
            }

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

            if (ctx.Result == HookResult.RECTIFY)
            {
                var msg = NetMessage.PrepareThreadInstance();
                msg.Projectile(Main.projectile[index]);
                msg.Send(whoAmI);
                return;
            }

            var projectile = Main.projectile[index];

            if (projectile.Owner == owner && projectile.identity == identity)
            {
                projectile.Kill(null, null);
                projectile.Reset();
                NetMessage.SendData(29, -1, whoAmI, "", (int)identity, (float)owner);
            }
        }
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int x = BitConverter.ToInt32(readBuffer, num);
            num += 4;
            int y = BitConverter.ToInt32(readBuffer, num);
            num += 4;

            var player = Main.players[whoAmI];

            if (Math.Abs(player.Position.X / 16 - x) >= 7 || Math.Abs(player.Position.Y / 16 - y) >= 7)
            {
                return;
            }

            int chestIndex = Chest.FindChest(x, y);

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

            var args = new HookArgs.ChestOpenReceived
            {
                X = x,
                Y = y,
                ChestIndex = (short)chestIndex,
            };

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

            if (ctx.CheckForKick())
            {
                return;
            }

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

            if (ctx.Result == HookResult.DEFAULT && chestIndex > -1)
            {
                var user = Chest.UsingChest(chestIndex);
                if (user >= 0 && user != whoAmI) return;

                for (int i = 0; i < Chest.MAX_ITEMS; i++)
                {
                    NetMessage.SendData(32, whoAmI, -1, "", chestIndex, (float)i);
                }
                NetMessage.SendData(33, whoAmI, -1, "", chestIndex);
                Main.players[whoAmI].chest = chestIndex;
                return;
            }
        }
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int playerIndex = readBuffer[num];

            if (playerIndex != whoAmI)
            {
                NetPlay.slots[whoAmI].Kick ("Cheating detected (PLAYER_PVP_CHANGE forgery).");
                return;
            }

            var pvp = readBuffer[num + 1] == 1;
            var player = Main.players[whoAmI];

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

            var args = new HookArgs.PvpSettingReceived
            {
                PvpFlag = pvp,
            };

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

            if (ctx.CheckForKick ())
            {
                return;
            }

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

            if (ctx.Result == HookResult.RECTIFY)
            {
                NetMessage.SendData(30, whoAmI, -1, "", whoAmI);
                return;
            }

            player.hostile = pvp;

            string message = (player.hostile) ? " has enabled PvP!" : " has disabled PvP!";

            NetMessage.SendData(30, -1, whoAmI, "", whoAmI);
            NetMessage.SendData(25, -1, -1, player.Name + message, 255, (float)Main.teamColor[player.team].R, (float)Main.teamColor[player.team].G, (float)Main.teamColor[player.team].B);
        }
Example #10
0
 void OnServerStateChange(ref HookContext ctx, ref HookArgs.ServerStateChange args)
 {
     if (args.ServerChangeState == ServerState.LOADED)
     {
         ProgramLog.Plugin.Log("Starting fishy mod...");
         fishy = new Fishy();
         ProgramLog.Plugin.Log("Fishy mod Started.");
     }
     else if (args.ServerChangeState == ServerState.STOPPING || args.ServerChangeState == ServerState.RESTARTING)
     {
         ProgramLog.Plugin.Log("Stopping fishy mod...");
         fishy.Stop();
         ProgramLog.Plugin.Log("Fishy mod Stopped.");
     }
 }
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int start = num - 1;
            int playerIndex = readBuffer[num++];

            if (playerIndex != whoAmI)
            {
                NetPlay.slots[whoAmI].Kick ("Cheating detected (KILL_PLAYER forgery).");
                return;
            }

            var player = Main.players[whoAmI];

            var ctx = new HookContext
            {
                Connection = NetPlay.slots[whoAmI].conn,
                Sender = player,
                Player = player,
            };

            var args = new HookArgs.ObituaryReceived
            {
                Direction = (int)readBuffer[num++] - 1,
                Damage = BitConverter.ToInt16 (readBuffer, num++),
                PvpFlag = readBuffer[++num]
            };
            string obituary;
            if (!ParseString(readBuffer, num + 1, length - num - 1 + start, out obituary))
            {
                NetPlay.slots[whoAmI].Kick("Invalid characters in obituary message.");
                return;
            }
            args.Obituary = obituary;

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

            if (ctx.CheckForKick ())
                return;

            if (ctx.Result == HookResult.IGNORE)
                return;

            ProgramLog.Death.Log ("{0} @ {1}: [Death] {2}{3}", player.IPAddress, whoAmI, player.Name ?? "<null>", args.Obituary);

            player.KillMe (args.Damage, args.Direction, args.PvpFlag == 1, args.Obituary);

            NetMessage.SendData(44, -1, whoAmI, args.Obituary, whoAmI, args.Direction, args.Damage, args.PvpFlag);
        }
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int x = BitConverter.ToInt32(readBuffer, num);
            num += 4;
            int y = BitConverter.ToInt32(readBuffer, num);

            if (Main.tile.At(x, y).Type != 21)
                return;

            var player = Main.players[whoAmI];

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

            var args = new HookArgs.ChestBreakReceived
            {
                X = x, Y = y,
            };

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

            if (ctx.CheckForKick ())
            {
                return;
            }

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

            if (ctx.Result == HookResult.RECTIFY)
            {
                NetMessage.SendTileSquare(whoAmI, x, y, 3);
                return;
            }

            WorldModify.KillTile(x, y, false, false, false, player);
            if (!Main.tile.At(x, y).Active || Main.tile.At(x, y).Type != 21)
            {
                NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)y);
            }
        }
        //TODO: redesign signs
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int start = num - 1;
            short signIndex = BitConverter.ToInt16(readBuffer, num);
            num += 2;
            int x = BitConverter.ToInt32(readBuffer, num);
            num += 4;
            int y = BitConverter.ToInt32(readBuffer, num);
            num += 4;

            short existing = (short)Sign.ReadSign (x, y);
            if (existing >= 0)
                signIndex = existing;

            string SignText;
            if (!ParseString(readBuffer, num, length - num + start, out SignText))
                return; // invalid characters

            var player = Main.players[whoAmI];

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

            var args = new HookArgs.SignTextSet
            {
                X = x, Y = y,
                SignIndex = signIndex,
                Text = SignText,
                OldSign = Main.sign[signIndex],
            };

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

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

            if (Main.sign[signIndex] == null) Main.sign[signIndex] = new Sign ();
            Main.sign[signIndex].x = args.X;
            Main.sign[signIndex].y = args.Y;
            Sign.TextSign (signIndex, args.Text);
        }
        public static void LoadPlugins()
        {
            ProgramLog.Log(Languages.Startup_LoadingPlugins);
            Terraria_Server.Plugins.PluginManager.Initialize(Statics.PluginPath, Statics.LibrariesPath);

            var ctx = new HookContext()
            {
                Sender = ConsoleSender = new ConsoleSender()
            };

            var eArgs = new HookArgs.ServerStateChange()
            {
                ServerChangeState = ServerState.INITIALIZING
            };

            HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs);
            PluginManager.LoadPlugins();
            ProgramLog.Log(Languages.Startup_PluginsLoaded + ' ' + PluginManager.PluginCount);
        }
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int x = BitConverter.ToInt32(readBuffer, num);
            num += 4;
            int y = BitConverter.ToInt32(readBuffer, num);
            num += 4;

            int signIndex = Sign.ReadSign(x, y);

            var player = Main.players[whoAmI];

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

            var args = new HookArgs.SignTextGet
            {
                X = x, Y = y,
                SignIndex = (short)signIndex,
                Text = (signIndex >= 0 && Main.sign[signIndex] != null) ? Main.sign[signIndex].text : null,
            };

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

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

            if (args.Text != null)
            {
                var msg = NetMessage.PrepareThreadInstance ();
                msg.WriteSign (signIndex, x, y, args.Text);
                msg.Send (whoAmI);
            }
        }
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            if (readBuffer[num++] != whoAmI)
            {
                NetPlay.slots[whoAmI].Kick ("Cheating detected (PLAYER_STATE_UPDATE forgery).");
                return;
            }

            var player = Main.players[whoAmI];

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

            var args = new HookArgs.StateUpdateReceived ();

            args.Parse (readBuffer, num);

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

            if (ctx.CheckForKick ())
                return;

            player.oldVelocity = player.Velocity;
            args.ApplyParams (player);
            args.ApplyKeys (player);
            player.fallStart = (int)(player.Position.Y / 16f);

            if (NetPlay.slots[whoAmI].state == SlotState.PLAYING)
            {
                NetMessage.SendData(13, -1, whoAmI, "", whoAmI);
            }
        }
        /// <summary>
        /// Hurts player
        /// </summary>
        /// <param name="aggressor">Sender who hurt the Player</param>
        /// <param name="Damage">Damage to do</param>
        /// <param name="hitDirection">Direction of attack</param>
        /// <param name="pvp">Whether attack is PvP</param>
        /// <param name="quiet">Whether to announce</param>
        /// <param name="deathText">Text to display upon death</param>
        /// <param name="crit">Whether the hit is critical</param>
        /// <returns>Damage done</returns>
        public double Hurt(ISender aggressor, int Damage, int hitDirection, bool pvp = false, bool quiet = false, string deathText = " was slain...", bool crit = false)
        {
            if (this.immune) return 0.0;

            var proj = aggressor as Projectile;
            var plr = aggressor as Player;

            var ctx = new HookContext
            {
                Sender = aggressor,
                Player = proj != null ? (proj.Creator as Player) : plr,
            };

            ctx.Connection = ctx.Player != null ? ctx.Player.Connection : null;

            var args = new HookArgs.PlayerHurt
            {
                Victim = this,
                Damage = Damage,
                HitDirection = hitDirection,
                Pvp = pvp,
                Quiet = quiet,
                Obituary = deathText,
                Critical = crit,
            };

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

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

            if (ctx.Result == HookResult.RECTIFY)
            {
                var conn = ctx.Connection;
                if (conn != null)
                {
                    var msg = NetMessage.PrepareThreadInstance ();
                    msg.PlayerHealthUpdate (whoAmi);
                    msg.Send (conn);
                }
                return 0.0;
            }

            NetMessage.SendData (26, -1, plr != null ? plr.whoAmi : -1, args.Obituary, whoAmi, args.HitDirection, args.Damage, args.Pvp ? 1 : 0, args.Critical ? 1 : 0);

            return HurtInternal (args.Damage, args.HitDirection, args.Pvp, args.Quiet, args.Obituary, args.Critical);
        }
 void OnPluginsLoaded(ref HookContext ctx, ref HookArgs.PluginsLoaded args)
 {
     LoadPerms();
 }
 void onPlayerJoin(ref HookContext ctx, ref HookArgs.PlayerEnteringGame args)
 {
     //ctx.Player.A = AccessLevel.OP;
 }
 void OnSignEdit(ref HookContext ctx, ref HookArgs.SignTextSet args)
 {
     foreach (Region rgn in regionManager.Regions)
         {
             if (rgn.HasPoint(new Vector2(args.X, args.Y)))
             {
                 if (ctx.Sender is Player)
                 {
                     if (IsRestrictedForUser(ctx.Player, rgn, DoorChange))
                     {
                         ctx.SetResult(HookResult.IGNORE);
                         ctx.Player.sendMessage("You cannot edit this area!", ChatColor.Red);
                         return;
                     }
                 }
             }
         }
 }
 void OnServerStateChange(ref HookContext ctx, ref HookArgs.ServerStateChange args)
 {
     if (args.ServerChangeState == ServerState.LOADED)
             regionManager.LoadRegions();
 }
        void OnProjectileReceived(ref HookContext ctx, ref HookArgs.ProjectileReceived args)
        {
            Vector2 Position = new Vector2(args.X, args.Y);

                foreach (Region rgn in regionManager.Regions)
                {
                    if (rgn.HasPoint(Position / 16))
                    {
                        if (rgn.ProjectileList.Contains("*") ||
                            rgn.ProjectileList.Contains(args.Type.ToString()))// ||
                            //rgn.ProjectileList.Contains(args.Projectile.Name.ToLower().Replace(" ", "")))
                        {
                            if (IsRestrictedForUser(ctx.Player, rgn, ProjectileUse))
                            {
                                ctx.SetResult(HookResult.ERASE);
                                ctx.Player.sendMessage("You cannot edit this area!", ChatColor.Red);
                                return;
                            }
                        }
                    }
                }
        }
 void OnPluginsLoaded(ref HookContext ctx, ref HookArgs.PluginsLoaded args)
 {
     UsingPermissions = IsRunningPermissions();
         if (UsingPermissions)
             Log("Using Permissions.");
         else
             Log("No Permissions Found\nUsing Internal User System");
 }
        void OnPlayerWorldAlteration(ref HookContext ctx, ref HookArgs.PlayerWorldAlteration args)
        {
            Vector2 Position = new Vector2(args.X, args.Y);

                if (args.TileWasPlaced && args.Type == SelectorItem && selection.isInSelectionlist(ctx.Player) && ctx.Player.Op)
                {
                    ctx.SetResult(HookResult.RECTIFY);
                    SelectorPos = !SelectorPos;

                    Vector2[] mousePoints = selection.GetSelection(ctx.Player);

                    if (!SelectorPos)
                        mousePoints[0] = Position;
                    else
                        mousePoints[1] = Position;

                    selection.SetSelection(ctx.Player, mousePoints);

                    ctx.Player.sendMessage(String.Format("You have selected block at {0},{1}, {2} position",
                        Position.X, Position.Y, (!SelectorPos) ? "First" : "Second"), ChatColor.Green);
                    return;
                }

                foreach (Region rgn in regionManager.Regions)
                {
                    if (rgn.HasPoint(Position))
                    {
                        if (IsRestrictedForUser(ctx.Player, rgn, ((args.TileWasRemoved || args.WallWasRemoved) ? TileBreak : TilePlace)))
                        {
                            ctx.SetResult(WorldAlter);
                            ctx.Player.sendMessage("You cannot edit this area!", ChatColor.Red);
                            return;
                        }
                    }
                }
        }
 void OnPlayerEnteredGame(ref HookContext ctx, ref HookArgs.PlayerEnteredGame args)
 {
     /* If a player left without finishing the region, Clear it or the next player can use it. */
         if (selection.isInSelectionlist(ctx.Player))
             selection.RemovePlayer(ctx.Player);
 }
        void OnLiquidFlowReceived(ref HookContext ctx, ref HookArgs.LiquidFlowReceived args)
        {
            Vector2 Position = new Vector2(args.X, args.Y);

                foreach (Region rgn in regionManager.Regions)
                {
                    if (rgn.HasPoint(Position))
                    {
                        if (IsRestrictedForUser(ctx.Player, rgn, LiquidFlow))
                        {
                            ctx.SetResult(HookResult.ERASE);
                            ctx.Player.sendMessage("You cannot edit this area!", ChatColor.Red);
                            return;
                        }
                    }
                }
        }
 void OnDoorStateChange(ref HookContext ctx, ref HookArgs.DoorStateChanged args)
 {
     foreach (Region rgn in regionManager.Regions)
         {
             if (rgn.HasPoint(new Vector2(args.X, args.Y)))
             {
                 if (ctx.Sender is Player)
                 {
                     Player player = ctx.Sender as Player;
                     if (IsRestrictedForUser(player, rgn, DoorChange))
                     {
                         ctx.SetResult(HookResult.RECTIFY);
                         player.sendMessage("You cannot edit this area!", ChatColor.Red);
                         return;
                     }
                 }
                 else if (ctx.Sender is NPC)
                 {
                     if (rgn.RestrictedNPCs)
                     {
                         ctx.SetResult(HookResult.RECTIFY); //[TODO] look into RECIFYing for NPC's, They don't need to be resent, only cancelled, IGRNORE?
                         return;
                     }
                 }
             }
         }
 }
 void OnChestOpen(ref HookContext ctx, ref HookArgs.ChestOpenReceived args)
 {
     foreach (Region rgn in regionManager.Regions)
         {
             if (rgn.HasPoint(new Vector2(args.X, args.Y)))
             {
                 if (ctx.Sender is Player)
                 {
                     if (IsRestrictedForUser(ctx.Player, rgn, DoorChange))
                     {
                         ctx.SetResult(HookResult.RECTIFY);
                         ctx.Player.sendMessage("You cannot edit this object!", ChatColor.Red);
                         return;
                     }
                 }
             }
         }
 }
        public void ItemCheck(int i)
        {
            int dmg = this.inventory[this.selectedItemIndex].damage;
            if (dmg > 0)
            {
                if (this.inventory[this.selectedItemIndex].Melee)
                {
                    dmg = (int)((float)dmg * this.meleeDamage);
                }
                else
                {
                    if (this.inventory[this.selectedItemIndex].Ranged)
                    {
                        dmg = (int)((float)dmg * this.rangedDamage);
                    }
                    else
                    {
                        if (this.inventory[this.selectedItemIndex].Magic)
                        {
                            dmg = (int)((float)dmg * this.magicDamage);
                        }
                    }
                }
            }

            Item selectedItem = inventory[selectedItemIndex];
            if (selectedItem.AutoReuse && !this.noItems)
            {
                releaseUseItem = true;
                if (itemAnimation == 1 && selectedItem.Stack > 0)
                {
                    itemAnimation = 0;
                }
            }

            if (controlUseItem && itemAnimation == 0 && releaseUseItem && selectedItem.UseStyle > 0)
            {
                bool flag = true;
                if (this.noItems)
                {
                    flag = false;
                }
                if (selectedItem.Shoot == ProjectileType.BOOMERANG_ENCHANTED || selectedItem.Shoot == ProjectileType.FLAMARANG || selectedItem.Shoot == ProjectileType.CHAKRUM_THORN)
                {
                    for (int j = 0; j < Main.maxProjectiles; j++)
                    {
                        if (Main.projectile[j].Active && Main.projectile[j].Owner == Main.myPlayer && Main.projectile[j].type == selectedItem.Shoot)
                        {
                            flag = false;
                        }
                    }
                }
                if (selectedItem.Shoot == ProjectileType.HOOK || selectedItem.Shoot == ProjectileType.WHIP_IVY)
                {
                    for (int k = 0; k < 1000; k++)
                    {
                        if (Main.projectile[k].Active && Main.projectile[k].Owner == Main.myPlayer && Main.projectile[k].type == selectedItem.Shoot && Main.projectile[k].ai[0] != 2f)
                        {
                            flag = false;
                        }
                    }
                }
                if (selectedItem.Potion && flag)
                {
                    if (this.potionDelay <= 0)
                    {
                        potionDelay = Item.POTION_DELAY;
                        this.AddBuff(21, this.potionDelay, true);
                    }
                    else
                    {
                        flag = false;
                    }
                }

                if (selectedItem.Mana > 0 && flag)
                {
                    if (selectedItem.Type != 127 || !spaceGun)
                    {
                        if (statMana >= (int)((float)selectedItem.Mana * manaCost))
                        {
                            statMana -= (int)((float)selectedItem.Mana * manaCost);
                        }
                        else
                        {
                            flag = false;
                        }
                    }
                }

                if (selectedItem.Type == 43 && Main.dayTime)
                {
                    flag = false;
                }
                if (selectedItem.Type == 70 && !this.zoneEvil)
                {
                    flag = false;
                }

                if (flag)
                {
                    if (selectedItem.UseAmmo > 0)
                    {
                        flag = false;
                        for (int l = 0; l < 44; l++)
                        {
                            if (l < 4 && this.ammo[l].Ammo == selectedItem.UseAmmo && this.ammo[l].Stack > 0)
                            {
                                flag = true;
                                break;
                            }
                            if (this.inventory[l].Ammo == selectedItem.UseAmmo && this.inventory[l].Stack > 0)
                            {
                                flag = true;
                                break;
                            }
                        }
                    }
                }

                if (flag)
                {
                    if (grappling[0] > -1)
                    {
                        if (controlRight)
                        {
                            direction = 1;
                        }
                        else if (controlLeft)
                        {
                            direction = -1;
                        }
                    }

                    channel = selectedItem.Channel;
                    attackCD = 0;

                    if (selectedItem.Melee)
                    {
                        this.itemAnimation = (int)((float)selectedItem.UseAnimation * this.meleeSpeed);
                        this.itemAnimationMax = (int)((float)selectedItem.UseAnimation * this.meleeSpeed);
                    }
                    else
                    {
                        this.itemAnimation = selectedItem.UseAnimation;
                        this.itemAnimationMax = selectedItem.UseAnimation;
                    }
                }

                if (flag && selectedItem.Shoot == ProjectileType.ORB_OF_LIGHT)
                {
                    for (int j = 0; j < 1000; j++)
                    {
                        if (Main.projectile[j].Active && Main.projectile[j].Owner == i && Main.projectile[j].type == selectedItem.Shoot)
                        {
                            Main.projectile[j].Kill();
                        }
                    }
                }
            }

            if (!this.controlUseItem)
            {
                this.channel = false;
            }

            if (this.itemAnimation > 0)
            {
                if (selectedItem.Mana > 0)
                {
                    this.manaRegenDelay = (int)this.maxRegenDelay;
                }

                if (Main.dedServ)
                {
                    itemHeight = selectedItem.Height;
                    itemWidth = selectedItem.Width;
                }
                itemAnimation--;
            }
            else if (selectedItem.HoldStyle == 1)
            {
                if (Main.dedServ)
                {
                    this.itemLocation.X = this.Position.X + (float)this.Width * 0.5f + 20f * (float)this.direction;
                }
                this.itemLocation.Y = this.Position.Y + 24f;
                this.itemRotation = 0f;
                if (this.gravDir == -1f)
                {
                    this.itemRotation = -this.itemRotation;
                    this.itemLocation.Y = this.Position.Y + (float)this.Height + (this.Position.Y - this.itemLocation.Y);
                }
            }
            else if (selectedItem.HoldStyle == 2)
            {
                this.itemLocation.X = this.Position.X + (float)this.Width * 0.5f + (float)(6 * this.direction);
                this.itemLocation.Y = this.Position.Y + 16f;
                this.itemRotation = 0.79f * (float)(-(float)this.direction);
                if (this.gravDir == -1f)
                {
                    this.itemRotation = -this.itemRotation;
                    this.itemLocation.Y = this.Position.Y + (float)this.Height + (this.Position.Y - this.itemLocation.Y);
                }
            }

            releaseUseItem = !controlUseItem;

            if (this.itemTime > 0)
            {
                this.itemTime--;
            }
            if (i == Main.myPlayer)
            {
                if (selectedItem.Shoot > 0 && itemAnimation > 0 && itemTime == 0)
                {
                    ProjectileType shoot = selectedItem.Shoot;
                    float shootSpeed = selectedItem.ShootSpeed;

                    if (selectedItem.Melee && shoot != ProjectileType.BALL_O_HURT && shoot != ProjectileType.BLUE_MOON && shoot != ProjectileType.SUNFURY)
                    {
                        shootSpeed /= this.meleeSpeed;
                    }

                    bool flag2 = false;
                    int damage = dmg;
                    float knockBack = selectedItem.KnockBack;
                    if (shoot == ProjectileType.HOOK || shoot == ProjectileType.WHIP_IVY)
                    {
                        grappling[0] = -1;
                        grapCount = 0;
                        for (int j = 0; j < Main.maxProjectiles; j++)
                        {
                            if (Main.projectile[j].Active && Main.projectile[j].Owner == i)
                            {
                                if (Main.projectile[j].type == ProjectileType.HOOK)
                                {
                                    Main.projectile[j].Kill();
                                }
                            }
                        }
                    }

                    if (selectedItem.UseAmmo > 0)
                    {
                        Item item = null;
                        bool flag3 = false;
                        for (int num12 = 0; num12 < 4; num12++)
                        {
                            if (this.ammo[num12].Ammo == selectedItem.UseAmmo && this.ammo[num12].Stack > 0)
                            {
                                item = this.ammo[num12];
                                flag2 = true;
                                flag3 = true;
                                break;
                            }
                        }
                        if (!flag3)
                        {
                            for (int num13 = 0; num13 < 44; num13++)
                            {
                                if (this.inventory[num13].Ammo == selectedItem.UseAmmo && this.inventory[num13].Stack > 0)
                                {
                                    item = this.inventory[num13];
                                    flag2 = true;
                                    break;
                                }
                            }
                        }
                        if (flag2)
                        {
                            if (item != null && item.Shoot != 0)
                            {
                                shoot = item.Shoot;
                            }
                            shootSpeed += item.ShootSpeed;
                            if (item.Ranged)
                            {
                                damage += (int)((float)item.Damage * this.rangedDamage);
                            }
                            else
                            {
                                damage += item.damage;
                            }

                            if (selectedItem.UseAmmo == ProjectileType.ARROW_WOODEN && this.archery)
                            {
                                if (shootSpeed < 20f)
                                {
                                    shootSpeed *= 1.2f;
                                    if (shootSpeed > 20f)
                                    {
                                        shootSpeed = 20f;
                                    }
                                }
                                damage = (int)((double)((float)damage) * 1.2);
                            }
                            if (item != null) knockBack += item.KnockBack;
                            bool flag4 = false;
                            if (selectedItem.Type == 98 && Main.rand.Next(3) == 0)
                            {
                                flag4 = true;
                            }
                            if (this.ammoCost80 && Main.rand.Next(5) == 0)
                            {
                                flag4 = true;
                            }
                            if (!flag4 && item != null)
                            {
                                item.Stack--;
                                if (item.Stack <= 0)
                                {
                                    item.Active = false;
                                    item.Name = "";
                                    item.Type = 0;
                                }
                            }
                        }
                    }
                    else
                    {
                        flag2 = true;
                    }

                    if (flag2)
                    {
                        if (damage == 1 && selectedItem.Type == 120)
                        {
                            damage = 2;
                        }

                        // client-code snipped here
                    }
                    else if (selectedItem.UseStyle == 5)
                    {
                        itemRotation = 0f;
                        //NetMessage.SendData(41, -1, -1, "", this.whoAmi);
                    }
                }

            // client code depending on tileTargetX/Y
            //                if (selectedItem.Type >= 205 && selectedItem.Type <= 207)
            //                {
            //                    if (Position.X / 16f - (float)Player.tileRangeX - (float)selectedItem.TileBoost <= (float)Player.tileTargetX
            //                        && (Position.X + (float)Width) / 16f + (float)Player.tileRangeX + (float)selectedItem.TileBoost - 1f >= (float)Player.tileTargetX
            //                        && Position.Y / 16f - (float)Player.tileRangeY - (float)selectedItem.TileBoost <= (float)Player.tileTargetY
            //                        && (this.Position.Y + (float)this.Height) / 16f + (float)Player.tileRangeY + (float)selectedItem.TileBoost - 2f >= (float)Player.tileTargetY)
            //                    {
            //                        showItemIcon = true;
            //
            //                        if (itemTime == 0 && itemAnimation > 0 && controlUseItem)
            //                        {
            //                            if (selectedItem.Type == 205)
            //                            {
            //                                bool lava = Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava;
            //                                int num10 = 0;
            //                                for (int x = Player.tileTargetX - 1; x <= Player.tileTargetX + 1; x++)
            //                                {
            //                                    for (int y = Player.tileTargetY - 1; y <= Player.tileTargetY + 1; y++)
            //                                    {
            //                                        if (Main.tile.At(x, y).Lava == lava)
            //                                        {
            //                                            num10 += (int)Main.tile.At(x, y).Liquid;
            //                                        }
            //                                    }
            //                                }
            //
            //                                if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid > 0 && num10 > 100)
            //                                {
            //                                    bool lava2 = Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava;
            //                                    if (!Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava)
            //                                    {
            //                                        selectedItem = Registries.Item.Create(206);
            //                                    }
            //                                    else
            //                                    {
            //                                        selectedItem = Registries.Item.Create(207);
            //                                    }
            //                                    inventory[selectedItemIndex] = selectedItem;
            //
            //                                    itemTime = selectedItem.UseTime;
            //                                    int num11 = (int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid;
            //                                    Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLiquid (0);
            //                                    Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLava (false);
            //                                    WorldModify.SquareTileFrame(Player.tileTargetX, Player.tileTargetY, false);
            //
            //                                    Liquid.AddWater(Player.tileTargetX, Player.tileTargetY);
            //
            //                                    for (int x = Player.tileTargetX - 1; x <= Player.tileTargetX + 1; x++)
            //                                    {
            //                                        for (int y = Player.tileTargetY - 1; y <= Player.tileTargetY + 1; y++)
            //                                        {
            //                                            if (num11 < 256 && Main.tile.At(x, y).Lava == lava)
            //                                            {
            //                                                int num12 = (int)Main.tile.At(x, y).Liquid;
            //
            //                                                if (num12 + num11 > 255)
            //                                                {
            //                                                    num12 = 255 - num11;
            //                                                }
            //
            //                                                num11 += num12;
            //                                                TileRef expr_20A0 = Main.tile.At(x, y);
            //                                                expr_20A0.SetLiquid ((byte) (expr_20A0.Liquid - (byte)num12));
            //                                                Main.tile.At(x, y).SetLava (lava2);
            //
            //                                                if (Main.tile.At(x, y).Liquid == 0)
            //                                                {
            //                                                    Main.tile.At(x, y).SetLava (false);
            //                                                }
            //
            //                                                WorldModify.SquareTileFrame(x, y, false);
            //
            //                                                Liquid.AddWater(x, y);
            //                                            }
            //                                        }
            //                                    }
            //                                }
            //                            }
            //                            else if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid < 200)
            //                            {
            //                                if (!Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active || !Main.tileSolid[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type] || !Main.tileSolidTop[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type])
            //                                {
            //                                    if (selectedItem.Type == 207)
            //                                    {
            //                                        if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid == 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava)
            //                                        {
            //                                            Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLava (true);
            //                                            Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLiquid (255);
            //                                            WorldModify.SquareTileFrame(Player.tileTargetX, Player.tileTargetY, true);
            //                                            selectedItem = Registries.Item.Create(205);
            //                                            inventory[selectedItemIndex] = selectedItem;
            //                                            this.itemTime = selectedItem.UseTime;
            //                                        }
            //                                    }
            //                                    else if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid == 0 || !Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava)
            //                                    {
            //                                        Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLava (false);
            //                                        Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLiquid (255);
            //                                        WorldModify.SquareTileFrame(Player.tileTargetX, Player.tileTargetY, true);
            //                                        selectedItem = Registries.Item.Create(205);
            //                                        inventory[selectedItemIndex] = selectedItem;
            //                                        this.itemTime = selectedItem.UseTime;
            //                                    }
            //                                }
            //                            }
            //                        }
            //                    }
            //                }
            //
            //                if (selectedItem.Pick > 0 || selectedItem.Axe > 0 || selectedItem.Hammer > 0)
            //                {
            //                    if (Position.X / 16f - (float)Player.tileRangeX - (float)selectedItem.TileBoost <= (float)Player.tileTargetX
            //                        && (Position.X + (float)Width) / 16f + (float)Player.tileRangeX + (float)selectedItem.TileBoost - 1f >= (float)Player.tileTargetX
            //                        && Position.Y / 16f - (float)Player.tileRangeY - (float)selectedItem.TileBoost <= (float)Player.tileTargetY
            //                        && (Position.Y + (float)Height) / 16f + (float)Player.tileRangeY + (float)selectedItem.TileBoost - 2f >= (float)Player.tileTargetY)
            //                    {
            //                        showItemIcon = true;
            //                        if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active)
            //                        {
            //                            if (itemTime == 0 && itemAnimation > 0 && controlUseItem)
            //                            {
            //
            //                                if (hitTileX != Player.tileTargetX || hitTileY != Player.tileTargetY)
            //                                {
            //                                    hitTile = 0;
            //                                    hitTileX = Player.tileTargetX;
            //                                    hitTileY = Player.tileTargetY;
            //                                }
            //                                if (Main.tileNoFail[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type])
            //                                {
            //                                    hitTile = 100;
            //                                }
            //                                if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type != 27)
            //                                {
            //                                    if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 4 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 10 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 11 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 12 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 13 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 14 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 15 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 16 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 17 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 18 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 19 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 21 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 26 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 28 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 29 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 31 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 33 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 34 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 35 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 36 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 42 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 48 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 49 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 50 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 54 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 55 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 77 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 78 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 79)
            //                                    {
            //                                        if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 48)
            //                                        {
            //                                            hitTile += selectedItem.Hammer / 3;
            //                                        }
            //                                        else
            //                                        {
            //                                            hitTile += selectedItem.Hammer;
            //                                        }
            //
            //                                        if ((double)Player.tileTargetY > Main.rockLayer
            //                                            && Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 77
            //                                            && selectedItem.Hammer < 60)
            //                                        {
            //                                            hitTile = 0;
            //                                        }
            //
            //                                        if (selectedItem.Hammer > 0)
            //                                        {
            //                                            if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 26)
            //                                            {
            //                                                Hurt(this.statLife / 2, -direction, false, false);
            //                                                WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, true, false, false);
            //                                            }
            //                                            else if (hitTile >= 100)
            //                                            {
            //                                                hitTile = 0;
            //                                                WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, false, false, false);
            //                                            }
            //                                            else
            //                                            {
            //                                                WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, true, false, false);
            //                                            }
            //
            //                                            itemTime = inventory[this.selectedItemIndex].UseTime;
            //                                        }
            //                                    }
            //                                    else
            //                                    {
            //                                        if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 5
            //                                            || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 30
            //                                            || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 72)
            //                                        {
            //                                            if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 30)
            //                                            {
            //                                                hitTile += selectedItem.Axe * 5;
            //                                            }
            //                                            else
            //                                            {
            //                                                hitTile += selectedItem.Axe;
            //                                            }
            //                                            if (selectedItem.Axe > 0)
            //                                            {
            //                                                if (hitTile >= 100)
            //                                                {
            //                                                    hitTile = 0;
            //                                                    WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, false, false, false);
            //                                                }
            //                                                else
            //                                                {
            //                                                    WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, true, false, false);
            //                                                }
            //                                                this.itemTime = selectedItem.UseTime;
            //                                            }
            //                                        }
            //                                        else
            //                                        {
            //                                            if (selectedItem.Pick > 0)
            //                                            {
            //                                                if (Main.tileDungeon[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type] || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 37 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 25 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 58)
            //                                                {
            //                                                    hitTile += selectedItem.Pick / 2;
            //                                                }
            //                                                else
            //                                                {
            //                                                    hitTile += selectedItem.Pick;
            //                                                }
            //                                                if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 25 && selectedItem.Pick < 65)
            //                                                {
            //                                                    hitTile = 0;
            //                                                }
            //                                                else
            //                                                {
            //                                                    if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 37 && selectedItem.Pick < 55)
            //                                                    {
            //                                                        hitTile = 0;
            //                                                    }
            //                                                    else
            //                                                    {
            //                                                        if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 56 && selectedItem.Pick < 65)
            //                                                        {
            //                                                            hitTile = 0;
            //                                                        }
            //                                                        else
            //                                                        {
            //                                                            if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 58 && selectedItem.Pick < 65)
            //                                                            {
            //                                                                hitTile = 0;
            //                                                            }
            //                                                            else
            //                                                            {
            //                                                                if (Main.tileDungeon[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type] && selectedItem.Pick < 65)
            //                                                                {
            //                                                                    if ((double)Player.tileTargetX < (double)Main.maxTilesX * 0.25 || (double)Player.tileTargetX > (double)Main.maxTilesX * 0.75)
            //                                                                    {
            //                                                                        hitTile = 0;
            //                                                                    }
            //                                                                }
            //                                                            }
            //                                                        }
            //                                                    }
            //                                                }
            //                                                if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 40 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 53 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 59)
            //                                                {
            //                                                    hitTile += selectedItem.Pick;
            //                                                }
            //                                                if (hitTile >= 100)
            //                                                {
            //                                                    hitTile = 0;
            //                                                    WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, false, false, false);
            //                                                }
            //                                                else
            //                                                {
            //                                                    WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, true, false, false);
            //                                                }
            //                                                this.itemTime = selectedItem.UseTime;
            //                                            }
            //                                        }
            //                                    }
            //                                }
            //                            }
            //                        }
            //                        if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall > 0)
            //                        {
            //                            if (this.itemTime == 0 && this.itemAnimation > 0 && this.controlUseItem)
            //                            {
            //                                if (selectedItem.Hammer > 0)
            //                                {
            //                                    bool flag3 = true;
            //                                    if (!Main.wallHouse[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall])
            //                                    {
            //                                        flag3 = false;
            //                                        for (int k = Player.tileTargetX - 1; k < Player.tileTargetX + 2; k++)
            //                                        {
            //                                            for (int l = Player.tileTargetY - 1; l < Player.tileTargetY + 2; l++)
            //                                            {
            //                                                if (Main.tile.At(k, l).Wall != Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall)
            //                                                {
            //                                                    flag3 = true;
            //                                                    break;
            //                                                }
            //                                            }
            //                                        }
            //                                    }
            //                                    if (flag3)
            //                                    {
            //                                        if (hitTileX != Player.tileTargetX || hitTileY != Player.tileTargetY)
            //                                        {
            //                                            hitTile = 0;
            //                                            hitTileX = Player.tileTargetX;
            //                                            hitTileY = Player.tileTargetY;
            //                                        }
            //                                        hitTile += selectedItem.Hammer;
            //                                        if (hitTile >= 100)
            //                                        {
            //                                            hitTile = 0;
            //                                            WorldModify.KillWall(Player.tileTargetX, Player.tileTargetY, false);
            //                                        }
            //                                        else
            //                                        {
            //                                            WorldModify.KillWall(Player.tileTargetX, Player.tileTargetY, true);
            //                                        }
            //                                        this.itemTime = selectedItem.UseTime;
            //                                    }
            //                                }
            //                            }
            //                        }
            //                    }
            //                }
                if (selectedItem.Type == 29 && this.itemAnimation > 0 && this.statLifeMax < 400 && this.itemTime == 0)
                {
                    if (this.itemTime == 0)
                    {
                        this.itemTime = selectedItem.UseTime;
                        this.statLifeMax += 20;
                        this.statLife += 20;
                        if (Main.myPlayer == this.whoAmi)
                        {
                            this.HealEffect(20);
                        }
                    }
                }
                if (selectedItem.Type == 109 && this.itemAnimation > 0 && this.statManaMax < 200 && this.itemTime == 0)
                {
                    if (this.itemTime == 0)
                    {
                        this.itemTime = selectedItem.UseTime;
                        this.statManaMax += 20;
                        this.statMana += 20;
                        if (Main.myPlayer == this.whoAmi)
                        {
                            this.ManaEffect(20);
                        }
                    }
                }
            // client code (tileTargetX/Y), not updated
            //                if (selectedItem.CreateTile >= 0)
            //                {
            //                    if (this.Position.X / 16f - (float)Player.tileRangeX - (float)selectedItem.TileBoost <= (float)Player.tileTargetX && (this.Position.X + (float)this.Width) / 16f + (float)Player.tileRangeX + (float)selectedItem.TileBoost - 1f >= (float)Player.tileTargetX && this.Position.Y / 16f - (float)Player.tileRangeY - (float)selectedItem.TileBoost <= (float)Player.tileTargetY && (this.Position.Y + (float)this.Height) / 16f + (float)Player.tileRangeY + (float)selectedItem.TileBoost - 2f >= (float)Player.tileTargetY)
            //                    {
            //                        this.showItemIcon = true;
            //                        if (!Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active || selectedItem.CreateTile == 23 || selectedItem.CreateTile == 2 || selectedItem.CreateTile == 60 || selectedItem.CreateTile == 70)
            //                        {
            //                            if (this.itemTime == 0 && this.itemAnimation > 0 && this.controlUseItem)
            //                            {
            //                                bool flag4 = false;
            //                                if (selectedItem.CreateTile == 23 || selectedItem.CreateTile == 2)
            //                                {
            //                                    if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active && Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 0)
            //                                    {
            //                                        flag4 = true;
            //                                    }
            //                                }
            //                                else
            //                                {
            //                                    if (selectedItem.CreateTile == 60 || selectedItem.CreateTile == 70)
            //                                    {
            //                                        if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active && Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 59)
            //                                        {
            //                                            flag4 = true;
            //                                        }
            //                                    }
            //                                    else
            //                                    {
            //                                        if (selectedItem.CreateTile == 4)
            //                                        {
            //                                            int num13 = (int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type;
            //                                            int num14 = (int)Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Type;
            //                                            int num15 = (int)Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Type;
            //                                            int num16 = (int)Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY - 1).Type;
            //                                            int num17 = (int)Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY - 1).Type;
            //                                            int num18 = (int)Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY - 1).Type;
            //                                            int num19 = (int)Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY + 1).Type;
            //                                            if (!Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active)
            //                                            {
            //                                                num13 = -1;
            //                                            }
            //                                            if (!Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Active)
            //                                            {
            //                                                num14 = -1;
            //                                            }
            //                                            if (!Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Active)
            //                                            {
            //                                                num15 = -1;
            //                                            }
            //                                            if (!Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY - 1).Active)
            //                                            {
            //                                                num16 = -1;
            //                                            }
            //                                            if (!Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY - 1).Active)
            //                                            {
            //                                                num17 = -1;
            //                                            }
            //                                            if (!Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY + 1).Active)
            //                                            {
            //                                                num18 = -1;
            //                                            }
            //                                            if (!Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY + 1).Active)
            //                                            {
            //                                                num19 = -1;
            //                                            }
            //                                            if (num13 >= 0 && Main.tileSolid[num13] && !Main.tileNoAttach[num13])
            //                                            {
            //                                                flag4 = true;
            //                                            }
            //                                            else
            //                                            {
            //                                                if ((num14 >= 0 && Main.tileSolid[num14] && !Main.tileNoAttach[num14]) || (num14 == 5 && num16 == 5 && num18 == 5))
            //                                                {
            //                                                    flag4 = true;
            //                                                }
            //                                                else
            //                                                {
            //                                                    if ((num15 >= 0 && Main.tileSolid[num15] && !Main.tileNoAttach[num15]) || (num15 == 5 && num17 == 5 && num19 == 5))
            //                                                    {
            //                                                        flag4 = true;
            //                                                    }
            //                                                }
            //                                            }
            //                                        }
            //                                        else
            //                                        {
            //                                            if (selectedItem.CreateTile == 78)
            //                                            {
            //                                                if (Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active && (Main.tileSolid[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type] || Main.tileTable[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type]))
            //                                                {
            //                                                    flag4 = true;
            //                                                }
            //                                            }
            //                                            else
            //                                            {
            //                                                if (selectedItem.CreateTile == 13 || selectedItem.CreateTile == 29 || selectedItem.CreateTile == 33 || selectedItem.CreateTile == 49)
            //                                                {
            //                                                    if (Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active && Main.tileTable[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type])
            //                                                    {
            //                                                        flag4 = true;
            //                                                    }
            //                                                }
            //                                                else
            //                                                {
            //                                                    if (selectedItem.CreateTile == 51)
            //                                                    {
            //                                                        if (Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Active || Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Wall > 0 || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Active || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Wall > 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Wall > 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Active || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Wall > 0)
            //                                                        {
            //                                                            flag4 = true;
            //                                                        }
            //                                                    }
            //                                                    else
            //                                                    {
            //                                                        if ((Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Active && Main.tileSolid[(int)Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Type]) || Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Wall > 0 || (Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Active && Main.tileSolid[(int)Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Type]) || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Wall > 0 || (Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active && Main.tileSolid[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type]) || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Wall > 0 || (Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Active && Main.tileSolid[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Type]) || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Wall > 0)
            //                                                        {
            //                                                            flag4 = true;
            //                                                        }
            //                                                    }
            //                                                }
            //                                            }
            //                                        }
            //                                    }
            //                                }
            //                                if (flag4)
            //                                {
            //                                    if (WorldModify.PlaceTile(Player.tileTargetX, Player.tileTargetY, selectedItem.CreateTile, false, false, this.whoAmi))
            //                                    {
            //                                        this.itemTime = selectedItem.UseTime;
            //                                        if (selectedItem.CreateTile == 15)
            //                                        {
            //                                            if (this.direction == 1)
            //                                            {
            //                                                TileRef expr_40C8 = Main.tile.At(Player.tileTargetX, Player.tileTargetY);
            //                                                expr_40C8.SetFrameX ((short) (expr_40C8.FrameX + 18));
            //                                                TileRef expr_40ED = Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1);
            //                                                expr_40ED.SetFrameX ((short) (expr_40ED.FrameX + 18));
            //                                            }
            //                                        }
            //                                    }
            //                                }
            //                            }
            //                        }
            //                    }
            //                }
            //                if (selectedItem.CreateWall >= 0)
            //                {
            //                    if (this.Position.X / 16f - (float)Player.tileRangeX - (float)selectedItem.TileBoost <= (float)Player.tileTargetX && (this.Position.X + (float)this.Width) / 16f + (float)Player.tileRangeX + (float)selectedItem.TileBoost - 1f >= (float)Player.tileTargetX && this.Position.Y / 16f - (float)Player.tileRangeY - (float)selectedItem.TileBoost <= (float)Player.tileTargetY && (this.Position.Y + (float)this.Height) / 16f + (float)Player.tileRangeY + (float)selectedItem.TileBoost - 2f >= (float)Player.tileTargetY)
            //                    {
            //                        this.showItemIcon = true;
            //                        if (this.itemTime == 0 && this.itemAnimation > 0 && this.controlUseItem)
            //                        {
            //                            if (Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Active || Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Wall > 0 || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Active || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Wall > 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Wall > 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Active || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Wall > 0)
            //                            {
            //                                if ((int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall != selectedItem.CreateWall)
            //                                {
            //                                    WorldModify.PlaceWall(Player.tileTargetX, Player.tileTargetY, selectedItem.CreateWall, false);
            //                                    if ((int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall == selectedItem.CreateWall)
            //                                    {
            //                                        this.itemTime = selectedItem.UseTime;
            //                                    }
            //                                }
            //                            }
            //                        }
            //                    }
            //                }
            }
            if (selectedItem.Damage >= 0 && selectedItem.Type > 0 && !selectedItem.NoMelee)
            {
                if (this.itemAnimation > 0)
                {
                    bool flag5 = false;
                    Rectangle rectangle = new Rectangle((int)this.itemLocation.X, (int)this.itemLocation.Y, 32, 32);
                    rectangle.Width = (int)((float)rectangle.Width * selectedItem.Scale);
                    rectangle.Height = (int)((float)rectangle.Height * selectedItem.Scale);
                    if (this.direction == -1)
                    {
                        rectangle.X -= rectangle.Width;
                    }
                    if (this.gravDir == 1f)
                    {
                        rectangle.Y -= rectangle.Height;
                    }
                    rectangle.Y -= rectangle.Height;
                    if (selectedItem.UseStyle == 1)
                    {
                        if ((double)this.itemAnimation < (double)this.itemAnimationMax * 0.333)
                        {
                            if (this.direction == -1)
                            {
                                rectangle.X -= (int)((double)rectangle.Width * 1.4 - (double)rectangle.Width);
                            }
                            rectangle.Width = (int)((double)rectangle.Width * 1.4);
                            rectangle.Y += (int)((double)rectangle.Height * 0.5 * (double)this.gravDir);
                            rectangle.Height = (int)((double)rectangle.Height * 1.1);
                        }
                        else
                        {
                            if ((double)this.itemAnimation >= (double)this.itemAnimationMax * 0.666)
                            {
                                if (this.direction == 1)
                                {
                                    rectangle.X -= (int)((double)rectangle.Width * 1.2);
                                }
                                rectangle.Width *= 2;
                                rectangle.Y -= (int)(((double)rectangle.Height * 1.4 - (double)rectangle.Height) * (double)this.gravDir);
                                rectangle.Height = (int)((double)rectangle.Height * 1.4);
                            }
                        }
                    }
                    else
                    {
                        if (selectedItem.UseStyle == 3)
                        {
                            if ((double)this.itemAnimation > (double)this.itemAnimationMax * 0.666)
                            {
                                flag5 = true;
                            }
                            else
                            {
                                if (this.direction == -1)
                                {
                                    rectangle.X -= (int)((double)rectangle.Width * 1.4 - (double)rectangle.Width);
                                }
                                rectangle.Width = (int)((double)rectangle.Width * 1.4);
                                rectangle.Y += (int)((double)rectangle.Height * 0.6);
                                rectangle.Height = (int)((double)rectangle.Height * 0.6);
                            }
                        }
                    }
                    if (!flag5)
                    {
            #if CLIENT_CODE
                        if (Main.myPlayer == i)
                        {
                            int dmgg = (int) (selectedItem.Damage * this.meleeDamage);
                            int num21 = rectangle.X / 16;
                            int num22 = (rectangle.X + rectangle.Width) / 16 + 1;
                            int num23 = rectangle.Y / 16;
                            int num24 = (rectangle.Y + rectangle.Height) / 16 + 1;
                            for (int k = num21; k < num22; k++)
                            {
                                for (int l = num23; l < num24; l++)
                                {
                                    if (Main.tile.At(k, l).Type == 3 || Main.tile.At(k, l).Type == 24 || Main.tile.At(k, l).Type == 28 || Main.tile.At(k, l).Type == 32 || Main.tile.At(k, l).Type == 51 || Main.tile.At(k, l).Type == 52 || Main.tile.At(k, l).Type == 61 || Main.tile.At(k, l).Type == 62 || Main.tile.At(k, l).Type == 69 || Main.tile.At(k, l).Type == 71 || Main.tile.At(k, l).Type == 73 || Main.tile.At(k, l).Type == 74)
                                    {
                                        WorldModify.KillTile(k, l, false, false, false);
                                    }
                                }
                            }
                            for (int j = 0; j < NPC.MAX_NPCS; j++)
                            {
                                var npc = Main.npcs[j];
                                if (npc.Active && npc.immune[i] == 0 && this.attackCD == 0 && !npc.friendly)
                                {
                                    Rectangle value = new Rectangle((int)npc.Position.X, (int)npc.Position.Y, npc.Width, npc.Height);
                                    if (rectangle.Intersects(value))
                                    {
                                        if (npc.noTileCollide || Collision.CanHit(this.Position, this.Width, this.Height, npc.Position, npc.Width, npc.Height))
                                        {
                                            bool crit = false;
                                            if (Main.rand.Next(1, 101) <= this.meleeCrit)
                                            {
                                                crit = true;
                                            }
                                            int dmggg = Main.DamageVar(dmgg);
                                            this.StatusNPC (selectedItem.Type, npc);
                                            npc.StrikeNPC (dmggg, selectedItem.KnockBack, this.direction, crit);
                                            npc.immune[i] = (ushort) this.itemAnimation;
                                            this.attackCD = (int)((double)this.itemAnimationMax * 0.33);
                                        }
                                    }
                                }
                            }
                            if (this.hostile)
                            {
                                for (int j = 0; j < 255; j++)
                                {
                                    var player = Main.players[j];
                                    if (j != i && player.Active && player.hostile && !player.immune && !player.dead)
                                    {
                                        if (this.team == 0 || this.team != player.team)
                                        {
                                            Rectangle value2 = new Rectangle((int)player.Position.X, (int)player.Position.Y, player.Width, player.Height);
                                            if (rectangle.Intersects(value2))
                                            {
                                                bool crit = false;
                                                if (Main.rand.Next(1, 101) <= 10)
                                                {
                                                    crit = true;
                                                }
                                                int dmggg = Main.DamageVar(dmgg);
                                                this.StatusPvP (selectedItem.Type, player);
                                                if (Collision.CanHit(this.Position, this.Width, this.Height, player.Position, player.Width, player.Height))
                                                {
                                                    player.Hurt (dmggg, this.direction, true, false, "", crit);
                                                    NetMessage.SendData(26, -1, -1, "", j, (float)this.direction, (float)selectedItem.Damage, 1f, crit ? 1 : 0);
                                                    this.attackCD = (int)((double)this.itemAnimationMax * 0.33);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
            #endif //CLIENT_CODE
                    }
                }
            }
            if (this.itemTime == 0 && this.itemAnimation > 0)
            {
                if (selectedItem.HealLife > 0)
                {
                    this.statLife += selectedItem.HealLife;
                    this.itemTime = selectedItem.UseTime;
                    if (Main.myPlayer == this.whoAmi)
                    {
                        this.HealEffect(selectedItem.HealLife);
                    }
                }
                if (selectedItem.HealMana > 0)
                {
                    this.statMana += selectedItem.HealMana;
                    this.itemTime = selectedItem.UseTime;
                    if (Main.myPlayer == this.whoAmi)
                    {
                        this.ManaEffect(selectedItem.HealMana);
                    }
                }
                if (selectedItem.BuffType > 0)
                {
                    if (this.whoAmi == Main.myPlayer)
                    {
                        this.AddBuff (selectedItem.BuffType, selectedItem.BuffTime, true);
                    }
                    this.itemTime = selectedItem.UseTime;
                }
            }
            if (this.itemTime == 0 && this.itemAnimation > 0 && selectedItem.Type == 361)
            {
                this.itemTime = selectedItem.UseTime;
                if (Main.invasionType == 0)
                {
                    var ctx = new HookContext
                    {
                        Connection = Connection,
                        Sender = this,
                        Player = this,
                    };

                    var args = new HookArgs.PlayerTriggeredEvent
                    {
                        Type = WorldEventType.INVASION,
                    };

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

                    if (ctx.CheckForKick ())
                        return;
                    else if (ctx.Result != HookResult.IGNORE)
                    {
                        ProgramLog.Users.Log ("{0} @ {1}: Invasion triggered by {2}.", IPAddress, whoAmi, Name);
                        NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (Name, " has summoned an invasion!"), 255, 255, 128, 150);
                        Main.invasionDelay = 0;
                        Main.StartInvasion();
                    }
                }
            }
            if (this.itemTime == 0 && this.itemAnimation > 0 && (selectedItem.Type == 43 || selectedItem.Type == 70))
            {
                this.itemTime = selectedItem.UseTime;
                bool flag6 = false;
                int num25 = 4;
                if (selectedItem.Type == 43)
                {
                    num25 = 4;
                }
                else
                {
                    if (selectedItem.Type == 70)
                    {
                        num25 = 13;
                    }
                }
                for (int j = 0; j < 1000; j++)
                {
                    if (Main.npcs[j].Active && Main.npcs[j].Type == num25)
                    {
                        flag6 = true;
                        break;
                    }
                }
                if (flag6)
                {
            #if CLIENT_CODE
                    if (Main.myPlayer == this.whoAmi)
                    {
                        this.Hurt(this.statLife * (this.statDefense + 1), -this.direction, false, false);
                    }
            #endif //CLIENT_CODE
                }
                else if ( (selectedItem.Type == 43 && !Main.dayTime) || (selectedItem.Type == 70 && zoneEvil) )
                {
                    var ctx = new HookContext
                    {
                        Connection = Connection,
                        Sender = this,
                        Player = this,
                    };

                    var args = new HookArgs.PlayerTriggeredEvent
                    {
                        X = (int) (Position.X/16),
                        Y = (int) (Position.Y/16),
                        Type = WorldEventType.BOSS,
                        Name = selectedItem.Type == 43 ? "Eye of Cthulhu" : "Eater of Worlds",
                    };

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

                    if (ctx.CheckForKick ())
                        return;
                    else if (ctx.Result != HookResult.IGNORE)
                    {
                        if (selectedItem.Type == 43)
                        {
                            ProgramLog.Users.Log ("{0} @ {1}: Eye of Cthulhu summoned by {2}.", IPAddress, whoAmi, Name);
                            NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (Name, " has summoned the Eye of Cthulhu!"), 255, 255, 128, 150);
                            NPC.SpawnOnPlayer(Main.players[i], i, 4);
                        }
                        else if (selectedItem.Type == 70)
                        {
                            ProgramLog.Users.Log ("{0} @ {1}: Eater of Worlds summoned by {2}.", IPAddress, whoAmi, Name);
                            NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (Name, " has summoned the Eater of Worlds!"), 255, 255, 128, 150);
                            NPC.SpawnOnPlayer(Main.players[i], i, 13);
                        }
                    }
                }
            }

            if (selectedItem.Type == 50 && this.itemAnimation > 0)
            {
                if (this.itemTime == 0)
                {
                    this.itemTime = selectedItem.UseTime;
                }
                else
                {
                    if (this.itemTime == selectedItem.UseTime / 2)
                    {
                        this.grappling[0] = -1;
                        this.grapCount = 0;
                        for (int j = 0; j < 1000; j++)
                        {
                            if (Main.projectile[j].Active && Main.projectile[j].Owner == i)
                            {
                                if (Main.projectile[j].aiStyle == 7)
                                {
                                    Main.projectile[j].Kill();
                                }
                            }
                        }
                        this.Spawn();
                    }
                }
            }
            if (i == Main.myPlayer)
            {
                if (this.itemTime == selectedItem.UseTime && selectedItem.Consumable)
                {
                    bool flag11 = true;
                    if (selectedItem.Ranged && this.ammoCost80 && Main.rand.Next(5) == 0)
                    {
                        flag11 = false;
                    }
                    if (flag11)
                    {
                        selectedItem.Stack--;
                        if (selectedItem.Stack <= 0)
                        {
                            this.itemTime = this.itemAnimation;
                        }
                    }
                }
                if (selectedItem.Stack <= 0 && this.itemAnimation == 0)
                {
                    inventory[selectedItemIndex] = new Item();
                }
            }
        }
        internal bool Teleport(int tx, int ty, bool retrying)
        {
            if (Main.players[whoAmi] != this)
            {
                ProgramLog.Error.Log ("Attempt to teleport inactive player {0}.", Name ?? IPAddress);
                return false;
            }

            if (!retrying && System.Threading.Interlocked.CompareExchange (ref this.teleportInProgress, 1, 0) != 0)
            {
                ProgramLog.Error.Log ("Teleportation of player {0} already in progress.", Name ?? IPAddress);
                return false;
            }

            if (tx < 0 || ty < 0 || tx >= Main.maxTilesX || ty >= Main.maxTilesY)
            {
                ProgramLog.Error.Log ("Attempt to teleport player {0} to invalid location: {1}, {2}.", Name ?? IPAddress, tx, ty);
                return false;
            }

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

            var args = new HookArgs.PlayerTeleport
            {
                ToLocation = new Vector2(tx, ty)
            };

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

            if (ctx.Result == HookResult.IGNORE)
                return false;

            bool changeSpawn = false;

            int ox = Main.spawnTileX;
            int oy = Main.spawnTileY;
            if (SpawnX >= 0 && SpawnY >= 0)
            {
                changeSpawn = true;
                ox = SpawnX;
                oy = SpawnY;
            }
            else if (OldSpawnX >= 0 && OldSpawnY >= 0)
            {
                changeSpawn = true;
                ox = OldSpawnX;
                oy = OldSpawnY;
            }

            var slot = NetPlay.slots[whoAmi];
            int sx = tx / 200;
            int sy = ty / 150;

            // send up to 9 sections around the player
            int fromX = Math.Max (0, sx - 1);
            int fromY = Math.Max (0, sy - 1);
            int toX = Math.Min (sx + 1, Main.maxTilesX/200-1);
            int toY = Math.Min (sy + 1, Main.maxTilesY/150-1);

            int sections = 0;

            for (int x = fromX; x <= toX; x++)
            {
                for (int y = fromY; y <= toY; y++)
                {
                    if (! slot.tileSection[x, y])
                    {
                        sections += 1;
                    }
                }
            }

            var msg = NetMessage.PrepareThreadInstance ();

            if (sections > 0)
            {
                msg.SendTileLoading (sections * 150, "Teleporting...");
                msg.Send (whoAmi);
                msg.Clear ();

                for (int x = fromX; x <= toX; x++)
                {
                    for (int y = fromY; y <= toY; y++)
                    {
                        if (! slot.tileSection[x, y])
                        {
                            NetMessage.SendSection (whoAmi, x, y);
                        }
                    }
                }

                msg.SendTileConfirm (fromX, fromY, toX, toY);
                msg.Send (whoAmi);
                msg.Clear ();
            }

            // kill players' hooks and vines
            foreach (var proj in Main.projectile)
            {
                if (proj.Active && proj.Owner == whoAmi
                    && (proj.type == ProjectileType.HOOK || proj.type == ProjectileType.WHIP_IVY))
                {
                    proj.Active = false;
                    proj.type = ProjectileType.UNKNOWN;
                    msg.Projectile (proj);
                }
            }
            msg.Broadcast ();
            msg.Clear ();

            int left = 0;
            int right = -1;
            if (changeSpawn && oy > 1)
            {
                // invalidate player's bed temporarily
                // we used to kill a tile under the bed, but that could cause
                // side-effects, like killing objects hanging from the ceiling below

                left = Math.Max (0, ox - 4);
                right = Math.Min (ox + 4, Main.maxTilesX);

                while (left < Main.maxTilesX && Main.tile.At (left, oy - 1).Type != 79) left += 1;
                while (right > 0 && Main.tile.At (right, oy - 1).Type != 79) right -= 1;

                for (int x = left; x <= right; x++)
                {
                    var data = Main.tile.At (x, oy - 1).Data;
                    data.Active = false;
                    msg.SingleTileSquare (x, oy - 1, data);
                    data = Main.tile.At (x, oy - 2).Data;
                    data.Active = false;
                    msg.SingleTileSquare (x, oy - 2, data);
                }
            }

            // change the global spawn point
            msg.WorldData (tx, ty);

            // trigger respawn
            TeleSpawnX = tx;
            TeleSpawnY = ty;
            msg.ReceivingPlayerJoined (whoAmi);

            // fix holes at target location
            int fx = Math.Max (0, Math.Min (Main.maxTilesX - 8, tx - 4));
            int fy = Math.Max (0, Math.Min (Main.maxTilesY - 8, ty - 4));
            msg.TileSquare (7, fx, fy);

            //			msg.Send (whoAmi);
            //			msg.Clear ();

            if (changeSpawn && oy > 1)
            {
                // restore player's bed
                msg.TileSquare (1, ox, oy);

                if (right - left >= 0 && oy >= 2)
                    msg.TileSquare (right - left + 1, left, oy - 2);
            }

            // restore the global spawn point
            msg.WorldData ();

            msg.Send (whoAmi);

            return true;
        }
Example #31
0
        void OnServerStateChange(ref HookContext ctx, ref HookArgs.ServerStateChange args)
        {
            if (args.ServerChangeState == ServerState.LOADED)
                {
                    //imports all the region files into the mysql table
                    //on the first time the plugin is loaded with mysql enabled
                    if (!imported && mysqlenabled)
                    {
                        int numimported = regionManager.import();
                        mysql.setValue("regionfiles-imported", "True");
                        mysql.Save(false);
                        ProgramLog.Plugin.Log("Imported {0} Regions.", numimported);
                    }

                    regionManager.LoadRegions();
                }
        }