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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); } }
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); } }
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); }