using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ServerCore; using ServerBase; using ServerCommon; using SESSION_ID = System.Int32; using WORLD_META_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 GameServer { public class UgcNpcInventoryAction : InventoryActionBase { public UgcNpcInventoryAction(UgcNpc owner) : base(owner) { } public override async Task onInit() { await Task.CompletedTask; var ugc_npc = getOwner() as UgcNpc; NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!"); var result = new Result(); result = await getBagInven().onInit(); if (result.isFail()) { return result; } getEquipInvens().TryAdd(InvenEquipType.Cloth, new ClothEquipInven(ugc_npc)); getEquipInvens().TryAdd(InvenEquipType.Tattoo, new TattooEquipInven(ugc_npc)); var equip_inven_initializers = new Initializers(); foreach (var each in getEquipInvens()) { equip_inven_initializers.appendInitializer(each.Value as IInitializer); } result = await equip_inven_initializers.init("UgcNpc EquipInvens"); if (result.isFail()) { return result; } return result; } public override void onClear() { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); // 삭제할 가방 인벤토리내의 아이템 목록을 초기화 한다. var bag_inven = getBagInven(); NullReferenceCheckHelper.throwIfNull(bag_inven, () => $"bag_inven is null !!! - {owner.toBasicString()}"); bag_inven.clearItemAll(); // 가방 인벤토리내의 Tab별 개수 정보 초기화 한다. bag_inven.resetItemCountInTabs(); // 삭제할 장착 인벤토리내의 아이템 목록을 초기화 한다. var to_clear_equip_invens = new List() { InvenEquipType.Cloth , InvenEquipType.Tattoo }; foreach (var inven_equip_type in to_clear_equip_invens) { if (true == getEquipInvens().TryGetValue(inven_equip_type, out var found_equip_inven)) { var tool_equip_inven = found_equip_inven as IWithInventoryAccessor; NullReferenceCheckHelper.throwIfNull(tool_equip_inven, () => $"tool_equip_inven is null !!! - {owner.toBasicString()}"); tool_equip_inven.clearItemAll(); } } // 능력치 속성 정보들도 초기화 한다. var ability_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicString()}" ); ability_action.clearAbility(); } public override Item onAllocItem() { var ugc_npc = getOwner() as UgcNpc; NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!"); return new UgcNpcItem(ugc_npc); } public Dictionary toItemAll4Client() { var ugc_npc = getOwner() as UgcNpc; NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!"); var server_logic = GameServerApp.getServerLogic(); var inventory_rule = server_logic.findRule(); NullReferenceCheckHelper.throwIfNull(inventory_rule, () => $"inventory_rule is null !!! - {ugc_npc.toBasicString()}"); var bag_inven = getBagInven(); NullReferenceCheckHelper.throwIfNull(bag_inven, () => $"bag_inven is null !!! - {ugc_npc.toBasicString()}"); var items = new Dictionary(); var has_items = bag_inven.getHasItemBases(); foreach (var item in has_items) { var item_ui = item.toItemData4Client(); NullReferenceCheckHelper.throwIfNull(item_ui, () => $"item_ui is null !!! - {ugc_npc.toBasicString()}"); var item_meta = item.getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {ugc_npc.toBasicString()}"); if(false == items.TryAdd(item_ui.ItemGuid, item_ui)) { var err_msg = $"Already added Item !!! : itemGuid:{item_ui.ItemGuid}, itemMetaId:{item_meta.ItemId} - {ugc_npc.toBasicString()}"; Log.getLogger().error(err_msg); continue; } } return items; } public Dictionary toTattooAll4Client() { var ugc_npc = getOwner() as UgcNpc; NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!"); var item_tattoo_action = ugc_npc.getEntityAction(); NullReferenceCheckHelper.throwIfNull(item_tattoo_action, () => $"item_tattoo_action is null !!! - {ugc_npc.toBasicString()}"); var tattoo_slots = new Dictionary(); var inven_tattoo = getEquipInvens()[InvenEquipType.Tattoo] as TattooEquipInven; NullReferenceCheckHelper.throwIfNull(inven_tattoo, () => $"inven_tattoo is null !!! - {ugc_npc.toBasicString()}"); var custom_defined_ui_action = ugc_npc.getEntityAction(); NullReferenceCheckHelper.throwIfNull(custom_defined_ui_action, () => $"custom_defined_ui_action is null !!! - {ugc_npc.toBasicString()}"); var tattoo_slot_types = InvenEquipType.Tattoo.toEquipableTattooSlotTypes(ugc_npc.getEntityType()); foreach (var tattoo_slot_type in tattoo_slot_types) { var tattoo_slot = new TattooSlotInfo(); tattoo_slot.ItemInfo = new(); if (false == custom_defined_ui_action.getTattooVisible(tattoo_slot_type, out var found_visible)) { found_visible = true; } tattoo_slot.IsVisible = found_visible == true ? 1 : 0; if(false == tattoo_slots.TryAdd((Int32)tattoo_slot_type, tattoo_slot)) { var err_msg = $"Already added Tattoo Item !!! : tattooSlotType:{tattoo_slot_type} - {ugc_npc.toBasicString()}"; Log.getLogger().error(err_msg); continue; } var found_tattoo = inven_tattoo.getData().findEntityBaseInSlotType(tattoo_slot_type) as Item; if (null == found_tattoo) { continue; } item_tattoo_action.fillupTattooSlotInfo(tattoo_slot_type, found_tattoo, ref tattoo_slot); } return tattoo_slots; } } }