using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Amazon.Runtime.Internal.Transform; using ServerCore; using ServerBase; using SESSION_ID = System.Int32; using WORLD_ID = System.UInt32; using META_ID = System.UInt32; using ENTITY_GUID = System.String; using ACCOUNT_ID = System.String; using OWNER_GUID = System.String; using USER_GUID = System.String; using CHARACTER_GUID = System.String; using ITEM_GUID = System.String; namespace ServerCommon { public abstract class RuleBase { public HashSet EquipableItemLargeTypes { get; set; } = new(); public HashSet EquipableItemSmallTypes { get; set; } = new(); public EntityDynamoDbSortKeyType EntitySKType { get; set; } = EntityDynamoDbSortKeyType.None; public RuleBase() { } } public class BagRule : RuleBase { public InvenBagType InvenBagType { get; set; } = InvenBagType.None; public BagTabType UsableBagTabType { get; set; } = BagTabType.None; public BagRule() { } } public abstract class EquipRuleBase : RuleBase { public InvenEquipType InvenEquipType { get; set; } = InvenEquipType.None; public abstract Result onConfigure(InvenEquipType equipType); } public class ToolEquipRule : EquipRuleBase { public List UsableToolSlotTypes { get; set; } = new(); public ToolEquipRule() { } public override Result onConfigure(InvenEquipType equipType) { var result = new Result(); var err_msg = string.Empty; foreach (var item_large_type in equipType.toEquipableItemLargeTypes()) { if (false == EquipableItemLargeTypes.Add(item_large_type)) { err_msg = $"Failed to Add() EquipableItemLargeTypes !!!, duplicated EItemLargeType : EItemLargeType:{item_large_type} - InvenEquipType:{equipType}"; result.setFail(ServerErrorCode.ToolEquipRuleItemLargeTypeDuplicated, err_msg); Log.getLogger().error(result.toBasicString()); return result; } UsableToolSlotTypes = equipType.toEquipableToolSlotTypes(); } return result; } } public class ClothEquipRule : EquipRuleBase { public Dictionary> m_slots_by_cloth_slot_type = new(); public Dictionary> m_slots_by_item_type = new(); public ClothEquipRule() { } public override Result onConfigure(InvenEquipType equipType) { var result = new Result(); var err_msg = string.Empty; foreach (var item_large_type in equipType.toEquipableItemLargeTypes()) { if (false == EquipableItemLargeTypes.Add(item_large_type)) { err_msg = $"Failed to Add() EquipableItemLargeTypes !!!, duplicated EItemLargeType : EItemLargeType:{item_large_type} - InvenEquipType:{equipType}"; result.setFail(ServerErrorCode.ClothEquipRuleItemLargeTypeDuplicated, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var cloth_slot_types = EnumHelper.getValuesWithoutScopeAll(); foreach(var slot_type in cloth_slot_types) { if (false == m_slots_by_cloth_slot_type.TryGetValue(slot_type, out var found_item_small_types)) { found_item_small_types = new List(); m_slots_by_cloth_slot_type.Add(slot_type, found_item_small_types); } found_item_small_types = equipType.toEquipableItemSmallTypesWithClothSlotType(slot_type); foreach(var item_small_type in found_item_small_types) { if (false == m_slots_by_item_type.TryGetValue(item_small_type, out var found_slot_types)) { found_slot_types = new List(); m_slots_by_item_type.Add(item_small_type, found_slot_types); } if(false == found_slot_types.Exists(x => x == slot_type)) { found_slot_types.Add(slot_type); } EquipableItemSmallTypes.Add(item_small_type); } } } return result; } } public class TattooEquipRule : EquipRuleBase { public List UsableTattooSlotPosOfDefault { get; set; } = new(); public List UsableTattooSlotPosOfUgcNpc { get; set; } = new(); public TattooEquipRule() { } public override Result onConfigure(InvenEquipType equipType) { var result = new Result(); var err_msg = string.Empty; foreach (var item_large_type in equipType.toEquipableItemLargeTypes()) { if (false == EquipableItemLargeTypes.Add(item_large_type)) { err_msg = $"Failed to Add() EquipableItemLargeTypes !!!, duplicated EItemLargeType : EItemLargeType:{item_large_type} - InvenEquipType:{equipType}"; result.setFail(ServerErrorCode.TattooEquipRuleItemLargeTypeDuplicated, err_msg); Log.getLogger().error(result.toBasicString()); return result; } UsableTattooSlotPosOfDefault = equipType.toEquipableTattooSlotTypes(); UsableTattooSlotPosOfUgcNpc = equipType.toEquipableTattooSlotTypes(EntityType.UgcNpc); } return result; } public List getUsableTattooSlotPos(EntityType entityType) { if( EntityType.UgcNpc == entityType || EntityType.Beacon == entityType ) { return UsableTattooSlotPosOfUgcNpc; } return UsableTattooSlotPosOfDefault; } } public class InventoryRule : IRule { private readonly Dictionary m_bag_rules = new(); private readonly Dictionary> m_bag_rules_by_item_type = new(); private readonly Dictionary m_equip_rule_bases = new(); private readonly Dictionary> m_equip_rule_bases_by_item_type = new(); public InventoryRule() { } public async Task onInit() { var result = await configure(); if(result.isFail()) { return result; } return result; } public async Task configure() { var result = new Result(); var err_msg = string.Empty; var inven_bag_type_enums = EnumHelper.getValuesWithoutScopeAll(); foreach(var value in inven_bag_type_enums) { var bag_rule = new BagRule(); bag_rule.InvenBagType = value; foreach(var item_type in value.toEquipableItemLargeTypes()) { if(false == bag_rule.EquipableItemLargeTypes.Add(item_type)) { err_msg = $"Failed to Add() EquipableItemLargeTypes !!!, duplicated EItemLargeType : EItemLargeType:{item_type} - InvenBagType:{value}"; result.setFail(ServerErrorCode.BagRuleItemLargeTypeDuplicated, err_msg); Log.getLogger().error(result.toBasicString()); return result; } } bag_rule.UsableBagTabType = value.toUsableBagTabType(); m_bag_rules.Add(value, bag_rule); } var item_type_to_bag_types = EnumHelper.getValuesWithoutScopeAll(); foreach (var item_type in item_type_to_bag_types) { foreach(var eache in m_bag_rules) { if(false == eache.Value.EquipableItemLargeTypes.Contains(item_type)) { continue; } if(false == m_bag_rules_by_item_type.TryGetValue(item_type, out var found_bag_rules)) { found_bag_rules = new List(); m_bag_rules_by_item_type.Add(item_type, found_bag_rules); } found_bag_rules.Add(eache.Value); } } var inven_equip_type_enums = EnumHelper.getValuesWithoutScopeAll(); foreach (var value in inven_equip_type_enums) { var equip_rule_base = newEquipRuleBaseByInvenEquipType(value); if (equip_rule_base == null) continue; equip_rule_base.InvenEquipType = value; result = equip_rule_base.onConfigure(value); if(result.isFail()) { return result; } equip_rule_base.EntitySKType = value.toEntitySKType(); m_equip_rule_bases.Add(value, equip_rule_base); } var item_type_to_equip_types = EnumHelper.getValuesWithoutScopeAll(); foreach (var item_type in item_type_to_equip_types) { foreach (var eache in m_equip_rule_bases) { if (false == eache.Value.EquipableItemLargeTypes.Contains(item_type)) { continue; } if (false == m_equip_rule_bases_by_item_type.TryGetValue(item_type, out var found_equip_rule_bases)) { found_equip_rule_bases = new List(); m_equip_rule_bases_by_item_type.Add(item_type, found_equip_rule_bases); } found_equip_rule_bases.Add(eache.Value); } } return await Task.FromResult(result); } public EquipRuleBase? newEquipRuleBaseByInvenEquipType(InvenEquipType equipType) { switch(equipType) { case InvenEquipType.Tool: return new ToolEquipRule(); case InvenEquipType.Cloth: return new ClothEquipRule(); case InvenEquipType.Tattoo: return new TattooEquipRule(); default: var err_msg = $"Failed to newEquipRuleBaseByInvenEquipType() !!!, Invalid InvenEquipType : InvenEquipType:{equipType}"; Log.getLogger().error(err_msg); return null; } } public BagRule? getBagRuleByInvenBagType(InvenBagType bagType) { m_bag_rules.TryGetValue(bagType, out var found_bag_rules); return found_bag_rules; } public EquipRuleBase? getEquipRuleBaseByInvenEquipType(InvenEquipType equipType) { m_equip_rule_bases.TryGetValue(equipType, out var found_equip_rule_bases); return found_equip_rule_bases; } public List? getBagRulesByItemLargeType(MetaAssets.EItemLargeType itemType) { m_bag_rules_by_item_type.TryGetValue(itemType, out var found_bag_rules); return found_bag_rules; } public List? getEquipRuleBasesByItemLargeType(MetaAssets.EItemLargeType itemType) { m_equip_rule_bases_by_item_type.TryGetValue(itemType, out var found_equip_rule_bases); return found_equip_rule_bases; } public Dictionary getBagRules() => m_bag_rules; public Dictionary getEquipRuleBases() => m_equip_rule_bases; } }