public override void AddToInventory(IInventory inventory, int quantity = 1)
        {
            if (data.Flags.HasFlag(LeveledItemFlags.CalculateForEachItem))
            {
                for (var i = 0; i < quantity; i++)
                {
                    var random = Random.Range(0, 100);
                    if (random < chanceNone)
                    {
                        continue;
                    }

                    var index    = Random.Range(0, items.Length);
                    var itemData = items[index].Item1;
                    inventory.AddItem(itemData, 1);
                }
            }
            else
            {
                var random = Random.Range(0, 100);
                if (random < chanceNone)
                {
                    return;
                }

                var index    = Random.Range(0, items.Length);
                var itemData = items[index].Item1;
                inventory.AddItem(itemData, quantity);
            }
        }
        //###################
        //##  I INVENTORY  ##
        //###################

        public override void RemoveItemFromSlot(int slotNo)
        {
            CollectableSO item = mInv.GetItemInSlot(slotNo);

            if (item != null)
            {
                bool succ = mPlayerInv.AddItem(item);
                if (succ)
                {
                    mInv.RemoveItem(slotNo);
                    SoundManager.Instance.PlaySound("Uninstall");
                }
            }
        }
Ejemplo n.º 3
0
    /// <summary>
    /// Handles outputting to things with the inventory interface.
    /// </summary>
    /// <param name="OUT_INV"></param>
    public void OutputToInventory(IInventory OUT_INV)
    {
        //If the inventory is completely full, then just return.
        if (OUT_INV.IsFull())
        {
            return;
        }
        else
        {
            //Get the item list with all its counts.
            List <ItemAmount> ITEM_LIST = INV.GetItemAmountList();

            //For each unique item, attempt to add its count.
            foreach (ItemAmount ITEM_INFO in ITEM_LIST)
            {
                //If attempting to add the items would be successful,
                if (OUT_INV.AttemptAddItem(ITEM_INFO.Item, ITEM_INFO.Amount))
                {
                    GenericEntity      OUT_INFO     = OUT_INV.GetEntity();
                    List <GenericItem> UNIQUE_ITEMS = INV.GetUniqueItemsList();
                    if (UNIQUE_ITEMS.Contains(ITEM_INFO.Item))
                    {
                        UNIQUE_ITEMS.Add(ITEM_INFO.Item);
                    }

                    //Check if it is valid for us to place these items into the given entity.
                    if (GameManager.Instance.isItemPlacementValid(UNIQUE_ITEMS, OUT_INV.GetEntity().FLAGS))
                    {
                        OUT_INV.AddItem(ITEM_INFO.Item, ITEM_INFO.Amount);
                        INV.ExtractItem(ITEM_INFO.Item, ITEM_INFO.Amount);
                    }
                }
            }
        }
    }
Ejemplo n.º 4
0
        protected virtual Boolean SwitchItems(ItemSlot p_targetSlot, ItemSlot p_originSlot, BaseItem p_originItem)
        {
            ItemContainer parent = p_originSlot.Parent;
            BaseItem      item   = p_targetSlot.Item;
            Boolean       flag   = parent.Inventory.IsItemPlaceableAt(item, p_originSlot.Index);
            Boolean       flag2  = m_inventory.IsItemPlaceableAt(p_originItem, p_targetSlot.Index);

            if (!flag || !flag2)
            {
                return(false);
            }
            if (!(parent.Inventory is CharacterInventoryController))
            {
                if (!Consumable.AreSameConsumables(p_originItem, item))
                {
                    parent.Inventory.AddItem(item, p_originSlot.Index);
                }
                m_inventory.AddItem(p_originItem, p_targetSlot.Index);
                return(true);
            }
            EquipCommand p_command = new EquipCommand(parent.Inventory, m_inventory, p_originItem, item, p_originSlot.Index, p_targetSlot.Index);

            if (LegacyLogic.Instance.UpdateManager.PartyTurnActor.CanDoCommand(p_command, LegacyLogic.Instance.WorldManager.Party.CurrentCharacter))
            {
                LegacyLogic.Instance.CommandManager.AddCommand(p_command);
                return(true);
            }
            return(false);
        }
Ejemplo n.º 5
0
 public void AddItem(CollectableSO item, int slotNo)
 {
     if (!mInv.AddItem(slotNo, item))
     {
         Debug.LogWarning("Item in slot no " + slotNo + " does already exist!!");
     }
 }
Ejemplo n.º 6
0
 public virtual void DepositInventory(IInventory receivingInventory)
 {
     foreach (var item in ItemInventory)
     {
         receivingInventory.AddItem(item, null);
         RemoveItem(item, null);
     }
 }
        public void InventoryAddItem_Test()
        {
            Item i      = new Item(0, "Icecream", "mango", true);
            var  result = _inventory.AddItem(i);

            Assert.IsNotNull(result);
            Assert.AreEqual(result.Name, "Icecream");
        }
Ejemplo n.º 8
0
        // Transfer item from this inventory to another
        public void TransferItem(ItemRecord item, int quantity, IInventory targetInventory)
        {
            RemoveItem(item, quantity);

            // Play the item sound
            item.PickupSound.PlaySound2D();

            // Transfer the item with the container's owner data
            targetInventory.AddItem(item, quantity);
        }
 //Adds this gameobject to inventory and disables this gameobject when player collides into it
 void OnTriggerEnter2D(Collider2D col)
 {
     if (col.gameObject.tag == "Player")
     {
         //Create item object to add to inventory
         Item tempItem = new Item(gameObject.name, typeOfItem.type);
         inventory.AddItem(tempItem);
         gameObject.SetActive(false);
     }
 }
Ejemplo n.º 10
0
    public virtual void putItem(Item item, IInventory inventoryToAdd, int?amount = null)
    {
        Item itemToPut = TryGetItem(item);

        if (itemToPut == null)
        {
            throw new InventoryException("Item to put not found in own inventory");
        }
        inventoryToAdd.AddItem(itemToPut, amount);
        RemoveItem(itemToPut, amount);
    }
Ejemplo n.º 11
0
    private static void HandleUnequipItem(GameSession session, PacketReader packet)
    {
        long       itemUid   = packet.ReadLong();
        Player     player    = session.Player;
        IInventory inventory = player.Inventory;

        // Unequip gear
        (ItemSlot itemSlot, Item item) = inventory.Equips.FirstOrDefault(x => x.Value.Uid == itemUid);
        if (item is not null)
        {
            if (!inventory.Equips.Remove(itemSlot, out Item unequipItem))
            {
                return;
            }

            unequipItem.Slot       = -1;
            unequipItem.IsEquipped = false;
            inventory.AddItem(session, unequipItem, false);
            session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(player.FieldPlayer, unequipItem));

            player.FieldPlayer.ComputeStats();
            return;
        }

        // Unequip cosmetics
        (ItemSlot itemSlot2, Item item2) = inventory.Cosmetics.FirstOrDefault(x => x.Value.Uid == itemUid);
        if (item2 is null)
        {
            return;
        }

        if (!inventory.Cosmetics.Remove(itemSlot2, out Item unequipItem2))
        {
            return;
        }

        unequipItem2.Slot       = -1;
        unequipItem2.IsEquipped = false;
        inventory.AddItem(session, unequipItem2, false);
        session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(player.FieldPlayer, unequipItem2));
    }
Ejemplo n.º 12
0
        public Player()
        {
            animationOn = new Animation("Resources/sprites/player.png", 64, 58);
            SetAnimation(animationOn);
            animationOn.Start();

            SetPhysics(true);

            moveLeft  = new Move(this, -3, 0);
            moveRight = new Move(this, 3, 0);

            jump = new Jump(this, 3);

            jumpLeft = new List <Command> {
            };
            jumpLeft.Add(jump);
            jumpLeft.Add(moveLeft);

            jumpRight = new List <Command> {
            };
            jumpRight.Add(jump);
            jumpRight.Add(moveRight);

            backpack = new Backpack(6);

            backpack.AddItem(new HealingPotion());
            backpack.AddItem(new HealingPotion());
            backpack.AddItem(new ManaPotion());
            backpack.AddItem(new ManaPotion());
            backpack.AddItem(new SpeedPotion());
            backpack.AddItem(new JumpPotion());
        }
Ejemplo n.º 13
0
 public void SetLocation(IInventory location)
 {
     if (location == null)
     {
         throw new ArgumentNullException("location");
     }
     if (location != _location)
     {
         _location?.RemoveItem(this);
         _location = location;
         _location.AddItem(this);
     }
 }
Ejemplo n.º 14
0
    public void Interact(InteractionType type, Interactor actor)
    {
        Transform  item      = actor.GetItem();
        IInventory prevMount = mount;

        if (mount != null)
        {
            mount.RemoveItem(transform);
        }
        mount = null;
        actor.AddItem(transform);
        if (item != null && prevMount != null)
        {
            prevMount.AddItem(item);
        }
    }
Ejemplo n.º 15
0
        protected override void ClassSpecificExecute()
        {
            if (actionType)
            {
                inventory.AddItem(itemData);
            }
            else
            {
                inventory.RemoveItem(itemData);
            }

            var data = new Dictionary <string, string>();

            data["id"]     = itemData.Id.ToString();
            data["action"] = actionType ? "add" : "remove";

            NetworkController.SendEvent(data);
        }
Ejemplo n.º 16
0
        public InventoryTransaction MoveInto(IInventory other)
        {
            if (other is null)
            {
                throw new ArgumentNullException(nameof(other), "Cannot move into a \"null\" inventory.");
            }

            if (storedItem == null)
            {
                return(InventoryTransaction.None);
            }

            var result = other.AddItem(storedItem);

            if (result.Status == TransactionStatus.Complete)
            {
                storedItem = null;
            }

            return(result);
        }
Ejemplo n.º 17
0
        public void AddItemsToInventory(IInventory p_inventory)
        {
            Boolean   flag = false;
            NpcEffect npcEffect;

            if (LegacyLogic.Instance.WorldManager.Party.HirelingHandler.HasEffect(ETargetCondition.HIRE_BONUSTRADEDISC, out npcEffect) && npcEffect.TargetEffect != ETargetCondition.NONE)
            {
                flag = true;
            }
            foreach (BaseItem baseItem in m_items)
            {
                if (flag)
                {
                    baseItem.PriceMultiplicator = 1f - npcEffect.EffectValue;
                }
                else
                {
                    baseItem.PriceMultiplicator = 1f;
                }
                p_inventory.AddItem(baseItem);
            }
        }
Ejemplo n.º 18
0
        private void OnTriggerEnter2D(Collider2D other)
        {
            ICollectable col = other.GetComponent <ICollectable>();

            if (col != null)
            {
                CollectableSO so = col.OnCollect();
                if (so == null)
                {
                    return;
                }
                if (mInventory.AddItem(so))
                {
                    mAudioSource.Play();
                    Destroy(other.gameObject);
                }
                else
                {
                    col.IsCollected = false;
                }
            }
        }
Ejemplo n.º 19
0
    public static bool GiveItemFromSelectBox(GameSession session, Item sourceItem, int index, out OpenBoxResult result)
    {
        result = OpenBoxResult.Success;

        SelectItemBox    box      = sourceItem.Function.SelectItemBox;
        ItemDropMetadata metadata = ItemDropMetadataStorage.GetItemDropMetadata(box.BoxId);

        if (metadata == null)
        {
            result = OpenBoxResult.UnableToOpen;
            return(false);
        }

        IInventory inventory = session.Player.Inventory;

        // Select boxes disregards group ID. Adding these all to a filtered list
        List <DropGroupContent> dropContentsList = new();

        foreach (DropGroup group in metadata.DropGroups)
        {
            foreach (DropGroupContent dropGroupContent in group.Contents)
            {
                if (dropGroupContent.SmartDropRate == 100)
                {
                    List <Job> recommendJobs = ItemMetadataStorage.GetRecommendJobs(dropGroupContent.ItemIds.First());
                    if (recommendJobs.Contains(session.Player.Job) || recommendJobs.Contains(Job.None))
                    {
                        dropContentsList.Add(dropGroupContent);
                    }

                    continue;
                }

                dropContentsList.Add(dropGroupContent);
            }
        }

        DropGroupContent dropContents = dropContentsList[index];
        int amount = Random.Shared.Next((int)dropContents.MinAmount, (int)dropContents.MaxAmount);

        foreach (int id in dropContents.ItemIds)
        {
            if (inventory.CanHold(id, amount))
            {
                continue;
            }

            result = OpenBoxResult.InventoryFull;
            return(false);
        }

        inventory.ConsumeItem(session, sourceItem.Uid, 1);

        foreach (int id in dropContents.ItemIds)
        {
            Item newItem = new(id, amount, dropContents.Rarity)
            {
                EnchantLevel = dropContents.EnchantLevel
            };
            newItem.Stats = new(newItem);
            if (inventory.CanHold(newItem))
            {
                inventory.AddItem(session, newItem, true);
                continue;
            }

            result = OpenBoxResult.InventoryFull;
            MailHelper.InventoryWasFull(newItem, session.Player.CharacterId);
        }

        return(true);
    }
Ejemplo n.º 20
0
 private void Start()
 {
     Instance  = this;
     Inventory = new JobCallInventory(this);
     Inventory.AddItem(new DirtBlockItem(50));
 }
    private static void HandleUpgradeGem(GameSession session, PacketReader packet)
    {
        long equipUid = packet.ReadLong();
        byte slot     = packet.ReadByte();
        long itemUid  = packet.ReadLong();

        ItemGemstoneUpgradeMetadata metadata;

        IInventory inventory = session.Player.Inventory;

        if (equipUid == 0) // this is a gemstone in the player's inventory
        {
            if (!inventory.HasItem(itemUid))
            {
                session.Send(ItemSocketSystemPacket.Notice((int)ItemSocketSystemNotice.ItemIsNotInYourInventory));
                return;
            }

            Item gem = inventory.GetByUid(itemUid);
            if (gem == null)
            {
                return;
            }

            metadata = ItemGemstoneUpgradeMetadataStorage.GetMetadata(gem.Id);
            if (metadata == null || metadata.NextItemId == 0)
            {
                return;
            }

            if (!CheckGemUpgradeIngredients(inventory, metadata))
            {
                return;
            }

            for (int i = 0; i < metadata.IngredientItems.Count; i++)
            {
                if (!ConsumeIngredients(session, inventory, metadata.IngredientAmounts[i], metadata.IngredientItems[i]))
                {
                    return;
                }
            }

            inventory.ConsumeItem(session, gem.Uid, 1);

            Item upgradeGem = new(metadata.NextItemId, rarity : gem.Rarity);
            inventory.AddItem(session, upgradeGem, true);
            session.Send(ItemSocketSystemPacket.UpgradeGem(equipUid, slot, upgradeGem));
            return;
        }

        // upgrade gem mounted on a equipment
        if (!inventory.HasItem(equipUid))
        {
            session.Send(ItemSocketSystemPacket.Notice((int)ItemSocketSystemNotice.ItemIsNotInYourInventory));
            return;
        }

        Gemstone gemstone = inventory.GetByUid(equipUid).Stats.GemSockets[slot].Gemstone;

        if (gemstone == null)
        {
            return;
        }

        metadata = ItemGemstoneUpgradeMetadataStorage.GetMetadata(gemstone.Id);
        if (metadata == null || metadata.NextItemId == 0)
        {
            return;
        }

        if (!CheckGemUpgradeIngredients(inventory, metadata))
        {
            return;
        }

        for (int i = 0; i < metadata.IngredientItems.Count; i++)
        {
            if (!ConsumeIngredients(session, inventory, metadata.IngredientAmounts[i], metadata.IngredientItems[i]))
            {
                return;
            }
        }

        Item newGem = new(metadata.NextItemId)
        {
            IsLocked   = gemstone.IsLocked,
            UnlockTime = gemstone.UnlockTime
        };

        Player owner = GameServer.PlayerManager.GetPlayerById(gemstone.OwnerId);

        if (owner != null)
        {
            newGem.OwnerCharacterId   = owner.CharacterId;
            newGem.OwnerCharacterName = owner.Name;
        }

        Gemstone upgradedGemstone = new()
        {
            Id         = metadata.NextItemId,
            IsLocked   = gemstone.IsLocked,
            UnlockTime = gemstone.UnlockTime,
            OwnerId    = gemstone.OwnerId,
            OwnerName  = gemstone.OwnerName
        };

        inventory.GetByUid(equipUid).Stats.GemSockets[slot].Gemstone = gemstone;
        session.Send(ItemSocketSystemPacket.UpgradeGem(equipUid, slot, newGem));
    }
Ejemplo n.º 22
0
 public bool AddItem(IGrabableItem item) => bodyPartImplementation.AddItem(item);
Ejemplo n.º 23
0
 public virtual void AddToInventory(IInventory inventory, int quantity = 1)
 {
     inventory.AddItem(this, quantity);
 }
 public int Create([FromBody] InventoryItem item)
 {
     return(objitem.AddItem(item));
 }
Ejemplo n.º 25
0
 public void Add(GameObject item)
 {
     inventory.AddItem(item);
     Instantiate(slot, slotsContainer.transform, false);
     UpdateSlots();
 }
Ejemplo n.º 26
0
        protected override void OnUseFinish()
        {
            if (ProgressCanceled)
            {
                LastCallback.SafeInvoke();
                return;
            }

            if (LastUseImmune)
            {
                //don't do anything if skill immunity was used
                return;
            }

            bool    removedItem    = false;
            bool    attachScript   = false;
            IWIBase finalItem      = null;
            string  scriptToAttach = string.Empty;

            if (State.HasBeenMastered && !string.IsNullOrEmpty(Extensions.AttachScriptOnUseUnmastered))
            {
                scriptToAttach = Extensions.AttachScriptOnUseMastered;
            }
            else if (!string.IsNullOrEmpty(Extensions.AttachScriptOnUseUnmastered))
            {
                scriptToAttach = Extensions.AttachScriptOnUseUnmastered;
            }

            //if we only target certain scripts for failure and this one doesn't have at least one of those scripts, treat it as a win
            if (Extensions.FailureTargetScripts.Count > 0)
            {
                if (MoveItemToInventory)
                {
                    if (!LastItemToMove.HasAtLeastOne(Extensions.FailureTargetScripts))
                    {
                        LastSkillResult = true;
                    }
                }
                else
                {
                    if (!LastFromStack.TopItem.HasAtLeastOne(Extensions.FailureTargetScripts))
                    {
                        LastSkillResult = true;
                    }
                }
            }

            try {
                WIStackError error = WIStackError.None;
                if (LastSkillResult)
                {
                    attachScript = Extensions.AttachScriptOnSuccess;
                    //we either add it based on inventory or else stacks
                    if (MoveItemToInventory)
                    {
                        Debug.Log("Adding to inventory, we were successful");
                        //convert it to a stack item BEFORE pushing it so we know we'll have the actual copy
                        finalItem = LastItemToMove.GetStackItem(WIMode.Unloaded);
                        StartCoroutine(LastInventory.AddItem(finalItem));
                        removedItem = true;
                    }
                    else
                    {
                        finalItem   = LastFromStack.TopItem;
                        removedItem = (Stacks.Pop.AndPush(LastFromStack, LastToStack, ref error));
                    }

                    if (State.HasBeenMastered)
                    {
                        GUIManager.PostSuccess(Extensions.GUIMessageOnSuccessMastered);
                    }
                    else
                    {
                        GUIManager.PostSuccess(Extensions.GUIMessageOnSuccessUnmastered);
                    }
                }
                else
                {
                    attachScript = Extensions.AttachScriptOnFail;
                    if (MoveItemToInventory)
                    {
                        //we're moving things into our inventory
                        if (Extensions.DestroyItemOnFail)
                        {
                            //Debug.Log("Destroying item on failure");
                            LastItemToMove.RemoveFromGame();
                            removedItem = true;
                            //don't attach a script because there's nothing to attach it to
                        }
                        else if (Extensions.SubstituteItemOnFail)
                        {
                            //Debug.Log("Adding substitution instead");
                            LastItemToMove.RemoveFromGame();
                            finalItem = Extensions.Substitution.ToStackItem();
                            StartCoroutine(LastInventory.AddItem(finalItem));
                            removedItem = true;
                        }
                        else if (Extensions.MoveItemOnFail)
                        {
                            Debug.Log("Failed, but still moving item - item null? " + (LastItemToMove == null).ToString());
                            finalItem = LastItemToMove.GetStackItem(WIMode.Unloaded);
                            StartCoroutine(LastInventory.AddItem(finalItem));
                            removedItem = true;
                        }
                    }
                    else
                    {
                        //we're moving things from stack to stack
                        if (Extensions.DestroyItemOnFail)
                        {
                            //just get rid of it
                            Stacks.Pop.AndToss(LastFromStack);
                            removedItem = true;
                        }
                        else if (Extensions.SubstituteItemOnFail)
                        {
                            //just get rid of it
                            Stacks.Pop.AndToss(LastFromStack);
                            removedItem = true;
                            //then put substitute item in other stack
                            //only attach a script if we actually push the item
                            finalItem   = Extensions.Substitution.ToStackItem();
                            removedItem = Stacks.Push.Item(LastToStack, finalItem, ref error);
                        }
                        else if (Extensions.MoveItemOnFail)
                        {
                            finalItem   = LastFromStack.TopItem;
                            removedItem = Stacks.Pop.AndPush(LastFromStack, LastToStack, ref error);
                        }
                    }

                    if (finalItem == null)
                    {
                        Debug.Log("Final item was null in remove item skill, not applying extensions");
                    }
                    else
                    {
                        if (Extensions.UnskilledRepPenaltyOnFail > 0 || Extensions.SkilledRepPenaltyOnFail > 0)
                        {
                            //only do this if we CAN suffer a rep loss
                            int globalRepLoss = 0;
                            int ownerRepLoss  = 0;
                            if (State.HasBeenMastered)
                            {
                                globalRepLoss = Mathf.Max(1, Mathf.FloorToInt(
                                                              (finalItem.BaseCurrencyValue * Globals.BaseCurrencyToReputationMultiplier) *
                                                              Mathf.Lerp(Extensions.UnskilledRepPenaltyOnFail, Extensions.SkilledRepPenaltyOnFail, State.NormalizedMasteryLevel) *
                                                              Extensions.MasterRepPenaltyOnFail));
                                ownerRepLoss = Mathf.Max(1, Mathf.FloorToInt(
                                                             (finalItem.BaseCurrencyValue * Globals.BaseCurrencyToReputationMultiplier) *
                                                             Mathf.Lerp(Extensions.UnskilledOwnerRepPenaltyOnFail, Extensions.SkilledOwnerRepPenaltyOnFail, State.NormalizedMasteryLevel) *
                                                             Extensions.MasterOwnerRepPenaltyOnFail));
                                GUIManager.PostDanger(Extensions.GUIMessageOnFailureMastered);
                            }
                            else
                            {
                                globalRepLoss = Mathf.Max(1, Mathf.FloorToInt(
                                                              (finalItem.BaseCurrencyValue * Globals.BaseCurrencyToReputationMultiplier) *
                                                              Mathf.Lerp(Extensions.UnskilledRepPenaltyOnFail, Extensions.SkilledRepPenaltyOnFail, State.NormalizedMasteryLevel)));
                                ownerRepLoss = Mathf.Max(1, Mathf.FloorToInt(
                                                             (finalItem.BaseCurrencyValue * Globals.BaseCurrencyToReputationMultiplier) *
                                                             Mathf.Lerp(Extensions.UnskilledOwnerRepPenaltyOnFail, Extensions.SkilledOwnerRepPenaltyOnFail, State.NormalizedMasteryLevel)));
                                GUIManager.PostDanger(Extensions.GUIMessageOnFailureUnmastered);
                            }
                            Profile.Get.CurrentGame.Character.Rep.LoseGlobalReputation(globalRepLoss);
                            //see if we've just stolen from a character
                            Character character = null;
                            if (LastSkillTarget != null && LastSkillTarget.IOIType == ItemOfInterestType.WorldItem && LastSkillTarget.worlditem.Is <Character>(out character))
                            {
                                Profile.Get.CurrentGame.Character.Rep.LosePersonalReputation(character.worlditem.FileName, character.worlditem.DisplayName, ownerRepLoss);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                Debug.LogWarning("Couldn't move item because: " + e.ToString());
            }

            if (attachScript && finalItem != null && !string.IsNullOrEmpty(scriptToAttach))
            {
                //Debug.Log("Attaching script " + scriptToAttach + " to final item");
                finalItem.Add(scriptToAttach);
            }

            if (removedItem)
            {
                if (LastSkillResult)
                {
                    MasterAudio.PlaySound(Extensions.SoundTypeOnSuccess, Extensions.SoundOnSuccess);
                }
                else
                {
                    MasterAudio.PlaySound(Extensions.SoundTypeOnFailure, Extensions.SoundOnFailure);
                }
            }

            LastCallback.SafeInvoke();
        }
Ejemplo n.º 27
0
    public static bool GiveItemFromOpenBox(GameSession session, Item item, out OpenBoxResult boxResult)
    {
        boxResult = OpenBoxResult.Success;

        OpenItemBox      box      = item.Function.OpenItemBox;
        ItemDropMetadata metadata = ItemDropMetadataStorage.GetItemDropMetadata(box.BoxId);

        if (metadata == null)
        {
            session.Send(NoticePacket.Notice("No items found", NoticeType.Chat));
            boxResult = OpenBoxResult.UnableToOpen;
            return(false);
        }

        if (box.AmountRequired > item.Amount)
        {
            boxResult = OpenBoxResult.UnableToOpen;
            return(false);
        }

        IInventory  inventory = session.Player.Inventory;
        List <Item> rewards   = new();

        // Receive one item from each drop group
        if (box.ReceiveOneItem)
        {
            foreach (DropGroup group in metadata.DropGroups)
            {
                bool receivedItem = false;

                // Randomize the contents
                IOrderedEnumerable <DropGroupContent> dropContent = group.Contents.OrderBy(_ => Random.Shared.Next());
                foreach (DropGroupContent content in dropContent)
                {
                    // If player has already received an item from this group, skip other contents
                    if (box.ReceiveOneItem && receivedItem)
                    {
                        continue;
                    }

                    List <Item> items = GetItemsFromDropGroup(content, session.Player, item);
                    foreach (Item newItem in items)
                    {
                        receivedItem = true;
                        rewards.Add(newItem);
                    }
                }
            }
        }
        else
        {
            // receive all items from each drop group
            foreach (DropGroup group in metadata.DropGroups)
            {
                foreach (DropGroupContent dropContent in group.Contents)
                {
                    List <Item> items = GetItemsFromDropGroup(dropContent, session.Player, item);
                    rewards.AddRange(items);
                }
            }
        }

        // Check if any inventory of the rewards is full
        if (rewards.Any(reward => inventory.GetFreeSlots(reward.InventoryTab) <= 0))
        {
            boxResult = OpenBoxResult.InventoryFull;
            return(false);
        }

        // Remove the box and required items
        if (box.RequiredItemId > 0)
        {
            Item requiredItem = inventory.GetByUid(box.RequiredItemId);
            if (requiredItem is null)
            {
                boxResult = OpenBoxResult.UnableToOpen;
                return(false);
            }

            inventory.ConsumeItem(session, requiredItem.Uid, 1);
        }

        inventory.ConsumeItem(session, item.Uid, box.AmountRequired);

        // give the rewards
        foreach (Item reward in rewards)
        {
            reward.Uid = DatabaseManager.Items.Insert(reward);

            if (inventory.CanHold(reward))
            {
                inventory.AddItem(session, reward, true);
                continue;
            }

            boxResult = OpenBoxResult.InventoryFull;
            MailHelper.InventoryWasFull(reward, session.Player.CharacterId);
        }

        return(true);
    }
Ejemplo n.º 28
0
    private static void HandleEquipItem(GameSession session, PacketReader packet)
    {
        long   itemUid      = packet.ReadLong();
        string equipSlotStr = packet.ReadUnicodeString();

        if (!Enum.TryParse(equipSlotStr, out ItemSlot equipSlot))
        {
            Logger.Warning("Unknown equip slot: {equipSlotStr}", equipSlotStr);
            return;
        }

        Player     player    = session.Player;
        IInventory inventory = player.Inventory;
        Item       item      = inventory.GetByUid(itemUid);

        if (item is null || !item.CanEquip(session))
        {
            return;
        }

        // Get correct equipped inventory
        Dictionary <ItemSlot, Item> equippedInventory = player.GetEquippedInventory(item.InventoryTab);

        if (equippedInventory == null)
        {
            Logger.Warning("equippedInventory was null: {inventoryTab}", item.InventoryTab);
            return;
        }

        if (item.TransferType == TransferType.BindOnEquip & !item.IsBound())
        {
            item.BindItem(session.Player);
        }

        // Remove the item from the users inventory
        inventory.RemoveItem(session, itemUid, out _);

        // Move previously equipped item back to inventory
        if (equippedInventory.Remove(equipSlot, out Item prevItem))
        {
            prevItem.Slot       = item.Slot;
            prevItem.IsEquipped = false;
            inventory.AddItem(session, prevItem, false);
            session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(player.FieldPlayer, prevItem));

            if (prevItem.InventoryTab == InventoryTab.Gear)
            {
                player.FieldPlayer.ComputeStats();
            }
        }

        // Handle unequipping pants when equipping dresses
        // Handle unequipping off-hand when equipping two-handed weapons
        if (item.IsDress || item.IsTwoHand)
        {
            if (equippedInventory.Remove(item.IsDress ? ItemSlot.PA : ItemSlot.LH, out Item prevItem2))
            {
                prevItem2.Slot = -1;
                if (prevItem == null)
                {
                    prevItem2.Slot = item.Slot;
                }

                prevItem2.IsEquipped = false;
                inventory.AddItem(session, prevItem2, false);
                session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(player.FieldPlayer, prevItem2));
            }
        }

        // Handle unequipping dresses when equipping pants
        // Handle unequipping two-handed main-hands when equipping off-hand weapons
        if (item.ItemSlot is ItemSlot.PA or ItemSlot.LH)
        {
            ItemSlot prevItemSlot = item.ItemSlot == ItemSlot.PA ? ItemSlot.CL : ItemSlot.RH;
            if (equippedInventory.ContainsKey(prevItemSlot))
            {
                if (equippedInventory[prevItemSlot] != null && equippedInventory[prevItemSlot].IsDress)
                {
                    if (equippedInventory.Remove(prevItemSlot, out Item prevItem2))
                    {
                        prevItem2.Slot       = item.Slot;
                        prevItem2.IsEquipped = false;
                        inventory.AddItem(session, prevItem2, false);
                        session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(player.FieldPlayer, prevItem2));
                    }
                }
            }
        }

        // Equip new item
        item.IsEquipped = true;
        item.ItemSlot   = equipSlot;
        equippedInventory[equipSlot] = item;
        session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(player.FieldPlayer, item, equipSlot));

        // Add stats if gear
        if (item.InventoryTab == InventoryTab.Gear)
        {
            player.FieldPlayer.ComputeStats();
        }
    }