Example #1
0
        void OnInventoryItemReceived(ref HookContext ctx, ref HookArgs.InventoryItemReceived args)
        {
#if TDSMSever
            if (Server.ItemRejections.Count > 0)
            {
                if (args.Item != null)
                {
                    if (Server.ItemRejections.Contains(args.Item.name) || Server.ItemRejections.Contains(args.Item.type.ToString()))
                    {
                        if (!String.IsNullOrEmpty(args.Item.name))
                        {
                            ctx.SetKick(args.Item.name + " is not allowed on this server.");
                        }
                        else
                        {
                            ctx.SetKick("Item type " + args.Item.type.ToString() + " is not allowed on this server.");
                        }
                    }
                }
            }
#endif
        }
        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 (INVENTORY_DATA forgery).");
                return;
            }

            var player = Main.players[whoAmI];

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

            var args = new HookArgs.InventoryItemReceived
            {
                InventorySlot = readBuffer[num++],
                Amount        = readBuffer[num++],
                Prefix        = readBuffer[num++],
                NetID         = BitConverter.ToInt16(readBuffer, num),
                //Name = Networking.StringCache.FindOrMake (new ArraySegment<Byte> (readBuffer, num, length - 4)),
            };

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

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

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

            var itemName      = args.Name;
            var inventorySlot = args.InventorySlot;
            var stack         = args.Amount;

            //if (args.NetID < 0) return; // FIXME

            var item = Item.netDefaults(args.NetID);

            item.SetPrefix(args.Prefix);
            item.Stack = stack;

            if (inventorySlot < Player.MAX_INVENTORY)
            {
                player.inventory[inventorySlot] = item;
            }
            else
            {
                player.armor[inventorySlot - Player.MAX_INVENTORY] = item;
            }

            if (ctx.Result != HookResult.CONTINUE)
            {
                if (Server.RejectedItemsContains(item.Name) ||
                    Server.RejectedItemsContains(item.Type.ToString()))
                {
                    player.Kick(((item.Name.Length > 0) ? item.Name : item.Type.ToString()) + " is not allowed on this server.");
                }
            }

            NetMessage.SendData(5, -1, whoAmI, item.Name, playerIndex, (float)inventorySlot, args.Prefix);
        }
Example #3
0
        public override void Process(int whoAmI, byte[] readBuffer, int length, int num)
        {
            int playerIndex = ReadByte(readBuffer);

            if (playerIndex != whoAmI && Entry.EnableCheatProtection)
            {
                Terraria.Netplay.Clients[whoAmI].Kick("Cheating detected (INVENTORY_DATA forgery).");
                return;
            }

            //TODO Implement the item banning

            if (playerIndex == Main.myPlayer && !Main.ServerSideCharacter)
            {
                return;
            }

            var player = Main.player[whoAmI];

            var ctx = new HookContext
            {
                Connection = (Terraria.Netplay.Clients[whoAmI] as ServerSlot).conn,
                Sender     = player,
                Player     = player
            };

            var args = new HookArgs.InventoryItemReceived
            {
                InventorySlot = (int)ReadByte(readBuffer),
                Amount        = (int)ReadInt16(readBuffer),
                Prefix        = (int)ReadByte(readBuffer),
                NetID         = (int)ReadInt16(readBuffer),
                //Name = Networking.StringCache.FindOrMake (new ArraySegment<Byte> (readBuffer, num, length - 4)),
            };

            args.SetItem();

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

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

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

            lock (player)
            {
                if (args.InventorySlot < 59)
                {
                    player.inventory[args.InventorySlot] = new Item();
                    player.inventory[args.InventorySlot].netDefaults(args.NetID);
                    player.inventory[args.InventorySlot].stack = args.Amount;
                    player.inventory[args.InventorySlot].Prefix(args.Prefix);
                    if (playerIndex == Main.myPlayer && args.InventorySlot == 58)
                    {
                        Main.mouseItem = player.inventory[args.InventorySlot].Clone();
                    }
                }
                else
                {
                    if (args.InventorySlot >= 75 && args.InventorySlot <= 82)
                    {
                        int num7 = args.InventorySlot - 58 - 17;
                        player.dye[num7] = new Item();
                        player.dye[num7].netDefaults(args.NetID);
                        player.dye[num7].stack = args.Amount;
                        player.dye[num7].Prefix(args.Prefix);
                    }
                    else
                    {
                        int num8 = args.InventorySlot - 58 - 1;
                        player.armor[num8] = new Item();
                        player.armor[num8].netDefaults(args.NetID);
                        player.armor[num8].stack = args.Amount;
                        player.armor[num8].Prefix(args.Prefix);
                    }
                }

                if (playerIndex == whoAmI)
                {
                    NewNetMessage.SendData((int)Packet.INVENTORY_DATA, -1, whoAmI, String.Empty, playerIndex, (float)args.InventorySlot, (float)args.Prefix, 0f, 0);
                }
                return;
            }
        }