public static bool CheckDualCompability(IEquipmentCarrier equipmentCarrier, Equipment equipment, PersonSlotSubScheme slot, int slotIndex) { var equipmentTags = equipment.Scheme.Tags ?? new string[0]; var hasRangedTag = equipmentTags.Any(x => x == PropTags.Equipment.Ranged); var hasWeaponTag = equipmentTags.Any(x => x == PropTags.Equipment.Weapon); if (hasRangedTag && hasWeaponTag) { // Проверяем наличие любого экипированного оружия. // Если находим, то выбрасываем исключение. // Учитываем, что предмет в целевом слоте заменяется. var targetSlotEquipment = equipmentCarrier[slotIndex]; var currentEquipments = equipmentCarrier.Where(x => x != null); var currentWeapons = from currentEquipment in currentEquipments where currentEquipment != targetSlotEquipment let currentEqupmentTags = currentEquipment.Scheme.Tags ?? new string[0] where currentEqupmentTags.Any(x => x == PropTags.Equipment.Weapon) select currentEquipment; var hasWeapon = currentWeapons.Any(); if (hasWeapon) { return(false); } } if (hasWeaponTag) { // проверяем наличие стрелкового оружия. // Если находим, то выбрасываем исключение. // Учитываем, что предмет в целевом слоте заменяется. var targetSlotEquipment = equipmentCarrier[slotIndex]; var currentEquipments = equipmentCarrier.Where(x => x != null); var currentWeapons = from currentEquipment in currentEquipments where currentEquipment != targetSlotEquipment let currentEqupmentTags = currentEquipment.Scheme.Tags ?? new string[0] let currentEqupmentHasWeapon = currentEqupmentTags.Any(x => x == PropTags.Equipment.Weapon) let currentEqupmentHasRanged = currentEqupmentTags.Any(x => x == PropTags.Equipment.Ranged) where currentEqupmentHasWeapon && currentEqupmentHasRanged select currentEquipment; var hasWeapon = currentWeapons.Any(); if (hasWeapon) { return(false); } } return(true); }
public static bool CheckShieldCompability(IEquipmentCarrier equipmentCarrier, Equipment equipment, PersonSlotSubScheme slot, int slotIndex) { var equipmentTags = equipment.Scheme.Tags ?? new string[0]; var hasShieldTag = equipmentTags.Any(x => x == PropTags.Equipment.Shield); if (hasShieldTag) { // Проверяем наличие других щитов. // Если в другой руке щит уже экипирован, то выбрасываем исключение. // Учитываем, что предмет в целевом слоте заменяется. var targetSlotEquipment = equipmentCarrier[slotIndex]; var currentEquipments = equipmentCarrier.Where(x => x != null); var currentSheilds = from currentEquipment in currentEquipments where currentEquipment != targetSlotEquipment let currentEqupmentTags = currentEquipment.Scheme.Tags ?? new string[0] where currentEqupmentTags.Any(x => x == PropTags.Equipment.Shield) select currentEquipment; var hasShields = currentSheilds.Any(); if (hasShields) { return(false); } } return(true); }