예제 #1
0
        //Spiced up version of Chest adapter inject
        private void InjectToRange(int player, SlotKind targetKind, Item item, bool stackable = true, int from = 0, int length = -1)
        {
            Item[] inventory = GetInventoryFromKind(player, targetKind);

            if (length == -1)
            {
                length = inventory.Length - from;
            }

            if (item.maxStack > 1 && stackable)
            {
                for (int i = from; i < length + from; i++)
                {
                    Item invItem = inventory[i];
                    if (item.IsTheSameAs(invItem) && invItem.stack < invItem.maxStack)
                    {
                        int spaceLeft = invItem.maxStack - invItem.stack;
                        if (spaceLeft >= item.stack)
                        {
                            invItem.stack += item.stack;
                            item.stack     = 0;
                            HandleSlotChange(player, targetKind, i);
                            return;
                        }
                        else
                        {
                            item.stack   -= spaceLeft;
                            invItem.stack = invItem.maxStack;
                            HandleSlotChange(player, targetKind, i);
                        }
                    }
                }
            }

            for (int i = from; i < length + from; i++)
            {
                if (inventory[i].IsAir)
                {
                    inventory[i] = item.Clone();
                    if (stackable)
                    {
                        item.stack = 0;
                        HandleSlotChange(player, targetKind, i);
                        return;
                    }
                    else
                    {
                        inventory[i].stack = 1;
                        item.stack--;
                        HandleSlotChange(player, targetKind, i);
                        if (item.stack < 1)
                        {
                            return;
                        }
                    }
                }
            }
        }
예제 #2
0
파일: Slot.cs 프로젝트: Aggror/Stride
 public Slot(SlotDirection direction, SlotKind kind, string name = null, SlotFlags flags = SlotFlags.None, string type = null, string value = null) : this()
 {
     Direction = direction;
     Kind      = kind;
     Name      = name;
     Flags     = flags;
     Type      = type;
     Value     = value;
 }
예제 #3
0
 protected SlotDefinition(SlotDirection direction, SlotKind kind, string name, string type, string value, SlotFlags flags)
 {
     Direction = direction;
     Kind      = kind;
     Name      = name;
     Type      = type;
     Value     = value;
     Flags     = flags;
 }
예제 #4
0
        public void HandlePacket(BinaryReader reader, int WhoAmI)
        {
            int      owner = reader.ReadInt32();
            SlotKind kind  = (SlotKind)reader.ReadByte();
            int      slot  = reader.ReadInt32();

            Item[] targetInventory = GetInventoryFromKind(owner, kind);
            ItemIO.Receive(targetInventory[slot], reader, true, true);
        }
예제 #5
0
 private void InjectToSpecificSlot(int player, SlotKind targetKind, int slot, Item item)
 {
     Item[] targetInventory = GetInventoryFromKind(player, targetKind);
     if (targetInventory[slot].IsAir)
     {
         targetInventory[slot]       = item.Clone();
         targetInventory[slot].stack = 1;
         item.stack--;
         HandleSlotChange(player, targetKind, slot);
     }
 }
예제 #6
0
        protected Slot FindSlot(SlotDirection direction, SlotKind kind, SlotFlags flags)
        {
            foreach (var slot in Slots)
            {
                if (slot.Direction == direction && slot.Kind == kind && (slot.Flags & flags) == flags)
                {
                    return(slot);
                }
            }

            return(null);
        }
예제 #7
0
        protected Slot FindSlot(SlotDirection direction, SlotKind kind, string name)
        {
            foreach (var slot in Slots)
            {
                if (slot.Direction == direction && slot.Kind == kind && slot.Name == name)
                {
                    return(slot);
                }
            }

            return(null);
        }
예제 #8
0
        private void HandleSlotChange(int owner, SlotKind kind, int slot)
        {
            if (Main.netMode == 2)
            {
                ModPacket packet = NetRouter.GetPacketTo(this, mod);
                packet.Write(owner);
                packet.Write((byte)kind);
                packet.Write(slot);

                Item[] targetInventory = GetInventoryFromKind(owner, kind);
                ItemIO.Send(targetInventory[slot], packet, true, true);

                packet.Send();
            }
            else if (Main.netMode == 0)
            {
                Recipe.FindRecipes();
            }
        }
예제 #9
0
        private Item[] GetInventoryFromKind(int player, SlotKind kind)
        {
            Player p = Main.player[player];

            switch (kind)
            {
            case SlotKind.Inventory: return(p.inventory);

            case SlotKind.Armor: return(p.armor);

            case SlotKind.Dye: return(p.dye);

            case SlotKind.MiscEquip: return(p.miscEquips);

            case SlotKind.MiscDye: return(p.miscDyes);

            default: return(null);
            }
        }
예제 #10
0
        private IEnumerable <Tuple <Item, object> > EnumerateRange(int player, SlotKind kind, int from = 0, int length = -1)
        {
            Item[] items = GetInventoryFromKind(player, kind);

            if (length == -1)
            {
                length = items.Length - from;
            }

            for (int i = from; i < length + from; i++)
            {
                if (!items[i].favorited)
                {
                    yield return(new Tuple <Item, object>(items[i], new PlayerSlot()
                    {
                        kind = kind, owner = player, slot = i
                    }));
                }
            }
        }