コード例 #1
0
        public bool HasRequiredContainedItems(bool addMessage)
        {
            List <RelatedItem> requiredContained = requiredItems.FindAll(ri => ri.Type == RelatedItem.RelationType.Contained);

            if (!requiredContained.Any())
            {
                return(true);
            }

            Item[] containedItems = item.ContainedItems;
            if (containedItems == null || !containedItems.Any())
            {
                return(false);
            }

            foreach (RelatedItem ri in requiredContained)
            {
                Item containedItem = Array.Find(containedItems, x => x != null && x.Condition > 0.0f && ri.MatchesItem(x));
                if (containedItem == null)
                {
#if CLIENT
                    if (addMessage && !string.IsNullOrEmpty(ri.Msg))
                    {
                        GUI.AddMessage(ri.Msg, Color.Red);
                    }
#endif
                    return(false);
                }
            }

            return(true);
        }
コード例 #2
0
ファイル: ItemComponent.cs プロジェクト: yuandev/Barotrauma
        public bool HasRequiredContainedItems(Character user, bool addMessage, string msg = null)
        {
            if (!requiredItems.ContainsKey(RelatedItem.RelationType.Contained))
            {
                return(true);
            }
            if (item.OwnInventory == null)
            {
                return(false);
            }

            foreach (RelatedItem ri in requiredItems[RelatedItem.RelationType.Contained])
            {
                if (!ri.CheckRequirements(user, item))
                {
#if CLIENT
                    msg = msg ?? ri.Msg;
                    if (addMessage && !string.IsNullOrEmpty(msg))
                    {
                        GUI.AddMessage(msg, Color.Red);
                    }
#endif
                    return(false);
                }
            }

            return(true);
        }
コード例 #3
0
        public bool HasRequiredContainedItems(bool addMessage)
        {
            if (!requiredItems.ContainsKey(RelatedItem.RelationType.Contained))
            {
                return(true);
            }
            if (item.OwnInventory == null)
            {
                return(false);
            }

            foreach (RelatedItem ri in requiredItems[RelatedItem.RelationType.Contained])
            {
                if (!item.OwnInventory.Items.Any(it => it != null && it.Condition > 0.0f && ri.MatchesItem(it)))
                {
#if CLIENT
                    if (addMessage && !string.IsNullOrEmpty(ri.Msg))
                    {
                        GUI.AddMessage(ri.Msg, Color.Red);
                    }
#endif
                    return(false);
                }
            }

            return(true);
        }
コード例 #4
0
        public bool HasRequiredItems(Character character, bool addMessage)
        {
            if (!requiredItems.Any())
            {
                return(true);
            }
            if (character.Inventory == null)
            {
                return(false);
            }

            foreach (RelatedItem ri in requiredItems)
            {
                if (!ri.Type.HasFlag(RelatedItem.RelationType.Equipped) && !ri.Type.HasFlag(RelatedItem.RelationType.Picked))
                {
                    continue;
                }

                bool hasItem = false;
                if (ri.Type.HasFlag(RelatedItem.RelationType.Equipped))
                {
                    if (character.SelectedItems.FirstOrDefault(it => it != null && it.Condition > 0.0f && ri.MatchesItem(it)) != null)
                    {
                        hasItem = true;
                    }
                }
                if (!hasItem && ri.Type.HasFlag(RelatedItem.RelationType.Picked))
                {
                    if (character.Inventory.Items.FirstOrDefault(x => x != null && x.Condition > 0.0f && ri.MatchesItem(x)) != null)
                    {
                        hasItem = true;
                    }
                }
                if (!hasItem)
                {
#if CLIENT
                    if (addMessage && !string.IsNullOrEmpty(ri.Msg))
                    {
                        GUI.AddMessage(ri.Msg, Color.Red);
                    }
#endif
                    return(false);
                }
            }

            return(true);
        }
コード例 #5
0
        public virtual bool HasRequiredItems(Character character, bool addMessage)
        {
            if (!requiredItems.Any())
            {
                return(true);
            }
            if (character.Inventory == null)
            {
                return(false);
            }

            if (requiredItems.ContainsKey(RelatedItem.RelationType.Equipped))
            {
                foreach (RelatedItem ri in requiredItems[RelatedItem.RelationType.Equipped])
                {
                    if (character.SelectedItems.FirstOrDefault(it => it != null && it.Condition > 0.0f && ri.MatchesItem(it)) == null)
                    {
#if CLIENT
                        if (addMessage && !string.IsNullOrEmpty(ri.Msg))
                        {
                            GUI.AddMessage(ri.Msg, Color.Red);
                        }
#endif
                        return(false);
                    }
                }
            }
            if (requiredItems.ContainsKey(RelatedItem.RelationType.Picked))
            {
                foreach (RelatedItem ri in requiredItems[RelatedItem.RelationType.Picked])
                {
                    if (character.Inventory.Items.FirstOrDefault(it => it != null && it.Condition > 0.0f && ri.MatchesItem(it)) == null)
                    {
#if CLIENT
                        if (addMessage && !string.IsNullOrEmpty(ri.Msg))
                        {
                            GUI.AddMessage(ri.Msg, Color.Red);
                        }
#endif
                        return(false);
                    }
                }
            }

            return(true);
        }
コード例 #6
0
        public override bool Select(Character character)
        {
            if (!isBroken)
            {
                bool hasRequiredItems = HasRequiredItems(character, false);
                if (requiredItems.None() || hasRequiredItems && hasValidIdCard)
                {
                    float originalPickingTime = PickingTime;
                    PickingTime = 0;
                    ToggleState(ActionType.OnUse);
                    PickingTime = originalPickingTime;
                }
#if CLIENT
                else if (hasRequiredItems && character != null && character == Character.Controlled)
                {
                    GUI.AddMessage(accessDeniedTxt, Color.Red);
                }
#endif
            }
            return(false);
        }
コード例 #7
0
        public override bool Select(Character character)
        {
            if (!isBroken)
            {
                bool hasRequiredItems = HasRequiredItems(character, false);
                if (requiredItems.None() || hasRequiredItems && hasValidIdCard)
                {
                    float originalPickingTime = PickingTime;
                    PickingTime = 0;
                    ForceOpen(ActionType.OnUse);
                    PickingTime = originalPickingTime;
                }
                else if (hasRequiredItems)
                {
#if CLIENT
                    GUI.AddMessage(accessDeniedTxt, Color.Red);
#endif
                }
            }
            return(item.Condition <= RepairThreshold);
        }
コード例 #8
0
        public override bool Select(Character character)
        {
            if (isBroken)
            {
                return(true);
            }
            bool hasRequiredItems = HasRequiredItems(character, false);

            if (HasAccess(character))
            {
                float originalPickingTime = PickingTime;
                PickingTime = 0;
                ToggleState(ActionType.OnUse, character);
                PickingTime = originalPickingTime;
            }
#if CLIENT
            else if (hasRequiredItems && character != null && character == Character.Controlled)
            {
                GUI.AddMessage(accessDeniedTxt, GUI.Style.Red);
            }
#endif
            return(false);
        }
コード例 #9
0
ファイル: ItemComponent.cs プロジェクト: yuandev/Barotrauma
        public virtual bool HasRequiredItems(Character character, bool addMessage, string msg = null)
        {
            if (requiredItems.None())
            {
                return(true);
            }
            if (!character.IsPlayer && character.Params.AI != null && character.Params.AI.Infiltrate)
            {
                return(true);
            }
            if (character.Inventory == null)
            {
                return(false);
            }
            bool hasRequiredItems = false;
            bool canContinue      = true;

            if (requiredItems.ContainsKey(RelatedItem.RelationType.Equipped))
            {
                foreach (RelatedItem ri in requiredItems[RelatedItem.RelationType.Equipped])
                {
                    canContinue = CheckItems(ri, character.HeldItems);
                    if (!canContinue)
                    {
                        break;
                    }
                }
            }
            if (canContinue)
            {
                if (requiredItems.ContainsKey(RelatedItem.RelationType.Picked))
                {
                    foreach (RelatedItem ri in requiredItems[RelatedItem.RelationType.Picked])
                    {
                        if (!CheckItems(ri, character.Inventory.AllItems))
                        {
                            break;
                        }
                    }
                }
            }

#if CLIENT
            if (!hasRequiredItems && addMessage && !string.IsNullOrEmpty(msg))
            {
                GUI.AddMessage(msg, Color.Red);
            }
#endif
            return(hasRequiredItems);

            bool CheckItems(RelatedItem relatedItem, IEnumerable <Item> itemList)
            {
                bool Predicate(Item it) => it != null && it.Condition > 0.0f && relatedItem.MatchesItem(it);

                bool shouldBreak = false;
                bool inEditor    = false;

#if CLIENT
                inEditor = Screen.Selected == GameMain.SubEditorScreen;
#endif
                if (relatedItem.IgnoreInEditor && inEditor)
                {
                    hasRequiredItems = true;
                }
                else if (relatedItem.IsOptional)
                {
                    if (!hasRequiredItems)
                    {
                        hasRequiredItems = itemList.Any(Predicate);
                    }
                }
                else
                {
                    hasRequiredItems = itemList.Any(Predicate);
                    if (!hasRequiredItems)
                    {
                        shouldBreak = true;
                    }
                }
                if (!hasRequiredItems)
                {
                    if (msg == null && !string.IsNullOrEmpty(relatedItem.Msg))
                    {
                        msg = relatedItem.Msg;
                    }
                }
                return(!shouldBreak);
            }
        }
コード例 #10
0
        public virtual bool HasRequiredItems(Character character, bool addMessage, string msg = null)
        {
            if (requiredItems.None())
            {
                return(true);
            }
            if (character.Inventory == null)
            {
                return(false);
            }
            bool hasRequiredItems = false;
            bool canContinue      = true;

            if (requiredItems.ContainsKey(RelatedItem.RelationType.Equipped))
            {
                foreach (RelatedItem ri in requiredItems[RelatedItem.RelationType.Equipped])
                {
                    canContinue = CheckItems(ri, character.HeldItems);
                    if (!canContinue)
                    {
                        break;
                    }
                }
            }
            if (canContinue)
            {
                if (requiredItems.ContainsKey(RelatedItem.RelationType.Picked))
                {
                    foreach (RelatedItem ri in requiredItems[RelatedItem.RelationType.Picked])
                    {
                        if (!CheckItems(ri, character.Inventory.AllItems))
                        {
                            break;
                        }
                    }
                }
            }

#if CLIENT
            if (!hasRequiredItems && addMessage && !string.IsNullOrEmpty(msg))
            {
                GUI.AddMessage(msg, Color.Red);
            }
#endif
            return(hasRequiredItems);

            bool CheckItems(RelatedItem relatedItem, IEnumerable <Item> itemList)
            {
                bool Predicate(Item it)
                {
                    if (it == null || it.Condition <= 0.0f || !relatedItem.MatchesItem(it))
                    {
                        return(false);
                    }
                    if (item.Submarine != null)
                    {
                        var idCard = it.GetComponent <IdCard>();
                        if (idCard != null)
                        {
                            //id cards don't work in enemy subs (except on items that only require the default "idcard" tag)
                            if (idCard.TeamID != CharacterTeamType.None && idCard.TeamID != item.Submarine.TeamID && relatedItem.Identifiers.Any(id => id != "idcard"))
                            {
                                return(false);
                            }
                            else if (idCard.SubmarineSpecificID != 0 && item.Submarine.SubmarineSpecificIDTag != idCard.SubmarineSpecificID)
                            {
                                return(false);
                            }
                        }
                    }
                    return(true);
                };
                bool shouldBreak = false;
                bool inEditor    = false;

#if CLIENT
                inEditor = Screen.Selected == GameMain.SubEditorScreen;
#endif
                if (relatedItem.IgnoreInEditor && inEditor)
                {
                    hasRequiredItems = true;
                }
                else if (relatedItem.IsOptional)
                {
                    if (!hasRequiredItems)
                    {
                        hasRequiredItems = itemList.Any(Predicate);
                    }
                }
                else
                {
                    hasRequiredItems = itemList.Any(Predicate);
                    if (!hasRequiredItems)
                    {
                        shouldBreak = true;
                    }
                }
                if (!hasRequiredItems)
                {
                    if (msg == null && !string.IsNullOrEmpty(relatedItem.Msg))
                    {
                        msg = relatedItem.Msg;
                    }
                }
                return(!shouldBreak);
            }
        }
コード例 #11
0
        public override bool Use(float deltaTime, Character character = null)
        {
            if (!attachable || item.body == null)
            {
                return(character == null || (character.IsKeyDown(InputType.Aim) && characterUsable));
            }
            if (character != null)
            {
                if (!characterUsable && !attachable)
                {
                    return(false);
                }
                if (!character.IsKeyDown(InputType.Aim))
                {
                    return(false);
                }
                if (!CanBeAttached(character))
                {
                    return(false);
                }

                if (LimitedAttachable)
                {
                    if (character?.Info == null)
                    {
                        DebugConsole.AddWarning("Character without CharacterInfo attempting to attach a limited attachable item!");
                        return(false);
                    }
                    Vector2   attachPos    = GetAttachPosition(character, useWorldCoordinates: true);
                    Structure attachTarget = Structure.GetAttachTarget(attachPos);

                    int maxAttachableCount     = (int)character.Info.GetSavedStatValue(StatTypes.MaxAttachableCount, item.Prefab.Identifier);
                    int currentlyAttachedCount = Item.ItemList.Count(
                        i => i.Submarine == attachTarget?.Submarine && i.GetComponent <Holdable>() is Holdable holdable && holdable.Attached && i.Prefab.Identifier == item.prefab.Identifier);
                    if (currentlyAttachedCount >= maxAttachableCount)
                    {
#if CLIENT
                        GUI.AddMessage($"{TextManager.Get("itemmsgtotalnumberlimited")} ({currentlyAttachedCount}/{maxAttachableCount})", Color.Red);
#endif
                        return(false);
                    }
                }

                if (GameMain.NetworkMember != null)
                {
                    if (character != Character.Controlled)
                    {
                        return(false);
                    }
                    else if (GameMain.NetworkMember.IsServer)
                    {
                        return(false);
                    }
                    else
                    {
#if CLIENT
                        Vector2 attachPos = ConvertUnits.ToSimUnits(GetAttachPosition(character));
                        GameMain.Client.CreateEntityEvent(item, new object[]
                        {
                            NetEntityEvent.Type.ComponentState,
                            item.GetComponentIndex(this),
                            attachPos
                        });
#endif
                    }
                    return(false);
                }
                else
                {
                    item.Drop(character);
                    item.SetTransform(ConvertUnits.ToSimUnits(GetAttachPosition(character)), 0.0f, findNewHull: false);
                }
                AttachToWall();
            }
            return(true);
        }