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 ItemTattooAction : EntityActionBase { public ItemTattooAction(EntityBase owner) : base(owner) { } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); return result; } public override void onClear() { return; } public async Task tryRegisterItemTattoo(ITEM_GUID itemGuid, Int32 toEquipSlotIndex) { var result = new Result(); var err_msg = string.Empty; var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); (result, _) = await tryUnequipTattooByTattooSlotType((TattooSlotType)toEquipSlotIndex, false); if(result.isFail()) { return result; } var found_item = inventory_action.tryGetItemByItemGuid(itemGuid); if(null == found_item) { err_msg = $"Failed to tryGetItemByItemGuid !!! : itemGuid:{itemGuid} : {owner.toBasicString()}"; result.setFail(ServerErrorCode.ItemNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } result = await inventory_action.tryTakableToEquip(found_item, (Int16)toEquipSlotIndex); if(result.isFail()) { return result; } return result; } public async Task<(Result, Item?)> tryUnequipTattooByTattooSlotType( TattooSlotType tattooSlotType , bool isFailOnItemNotFound = true ) { var result = new Result(); var err_msg = string.Empty; var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); if (false == InvenEquipType.Tattoo.isEquipableTattooSlotType(tattooSlotType, owner.getEntityType())) { err_msg = $"Not found TattooSlotType !!! : slotType:{tattooSlotType} - {owner.toBasicString()}"; result.setFail(ServerErrorCode.TattooEquipRuleTattooSlotTypeNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); (var get_item_result, var found_item) = await inventory_action.tryGetEquipItemByInvenEquipType( InvenEquipType.Tattoo, tattooSlotType , isFailOnItemNotFound ); if (null == found_item) { if (get_item_result.isFail()) { return (get_item_result, null); } return (result, null); } (result, var updated_item) = await inventory_action.tryTakableOutFromEquip(found_item); if (result.isFail()) { return (result, null); } return (result, updated_item); } public async Task tryUnregisterItemTattoo(Int16 toUnequipSlotIndex, ITEM_GUID itemGuid) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var result = new Result(); var err_msg = string.Empty; var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); var found_item = inventory_action.tryGetItemByItemGuid(itemGuid); if(null == found_item) { err_msg = $"Failed to tryGetItemByItemGuid !!! : itemGuid:{itemGuid} : {owner.toBasicString()}"; result.setFail(ServerErrorCode.ItemNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var item_attribute = found_item.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}"); if (item_attribute.EquipedPos != toUnequipSlotIndex) { err_msg = $"Not match ItemTattoo quiped slot pos !!! : currPos:{item_attribute.EquipedPos} == reqUnequipPos:{toUnequipSlotIndex}, {found_item.toBasicString()} : {owner.toBasicString()}"; result.setFail(ServerErrorCode.EquipSlotNotMatch, err_msg); Log.getLogger().error(result.toBasicString()); return result; } (result, var updated_item) = await inventory_action.tryTakableOutFromEquip(found_item); if(result.isFail()) { return result; } return result; } public async Task<(Result, bool, List?)> tryLevelUpItemTattoo(ITEM_GUID itemGuid) { await Task.CompletedTask; var result = new Result(); var err_msg = string.Empty; var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); var found_item = inventory_action.tryGetItemByItemGuid(itemGuid); if (null == found_item) { err_msg = $"Failed to tryGetItemByItemGuid !!! : itemGuid:{itemGuid} : {owner.toBasicString()}"; result.setFail(ServerErrorCode.ItemTattooNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, false, null); } var item_action = found_item.getEntityAction(); NullReferenceCheckHelper.throwIfNull(item_action, () => $"item_action is null !!! - {owner.toBasicString()}"); (result, var is_level_up, var updated_items) = await item_action.tryLevelUpByTattoo(); if (result.isFail()) { return (result, false, null); } return (result, is_level_up, updated_items); } public async Task<(Result, List?)> tryChangeAttriubte(ITEM_GUID itemGuid, Int16 targetAttributeId) { await Task.CompletedTask; var result = new Result(); var err_msg = string.Empty; var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); var found_item = inventory_action.tryGetItemByItemGuid(itemGuid); if (null == found_item) { err_msg = $"Failed to tryGetItemByItemGuid !!! : itemGuid:{itemGuid} : {owner.toBasicString()}"; result.setFail(ServerErrorCode.ItemTattooNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } var item_action = found_item.getEntityAction(); NullReferenceCheckHelper.throwIfNull(item_action, () => $"item_action is null !!! - {owner.toBasicString()}"); var item_attribute = found_item.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}"); if(targetAttributeId < 0 || item_attribute.Attributes.Count <= targetAttributeId) { err_msg = $"Invalid ItemAttributeIdType : 0 <= targetAttributeId:{targetAttributeId} < {item_attribute.Attributes.Count} , {found_item.toBasicString()} : {owner.toBasicString()}"; result.setFail(ServerErrorCode.ItemAttributeIdTypeInvalid, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } (result, var updated_items) = await item_action.tryChangeAttributeByTattoo(targetAttributeId); if (result.isFail()) { return (result, null); } return (result, updated_items); } public async Task trySaveVisibleTattooSlot(Int16 slotIndex, bool isVisible) { await Task.CompletedTask; var result = new Result(); var err_msg = string.Empty; var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); if(false == InvenEquipType.Tattoo.isEquipableTattooSlotType((TattooSlotType)slotIndex, owner.getEntityType())) { err_msg = $"Not found TattooSlotType !!! : slotType:{slotIndex} - {owner.toBasicString()}"; result.setFail(ServerErrorCode.TattooEquipRuleTattooSlotTypeNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var custom_defined_ui_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(custom_defined_ui_action, () => $"custom_defined_ui_action is null !!! - {owner.toBasicString()}"); var tattoo_slot = (TattooSlotType)slotIndex; result = await custom_defined_ui_action.setTattooVisible(tattoo_slot, isVisible); if(result.isFail()) { return result; } return result; } public void fillupTattooSlotInfo(TattooSlotType slotType, Item tattooItem, ref TattooSlotInfo slotInfo) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var item_attribute = tattooItem.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}"); slotInfo.ItemInfo.ItemId = (Int32)(item_attribute.ItemMetaId); slotInfo.ItemInfo.Level = item_attribute.Level; slotInfo.ItemInfo.Attributeids.AddRange(item_attribute.Attributes.ConvertAll(x => x.castTo())); } public Result send_S2C_NTF_ITEM_TATTOOS() { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var parent = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {owner.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; var game_zone_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {owner.toBasicString()}"); var curr_join_map = game_zone_action.getLinkedToMap(); if (null == curr_join_map) { err_msg = $"Not in GameZone !!! : {owner.toBasicString()}"; result.setFail(ServerErrorCode.GameZoneNotJoin, err_msg); Log.getLogger().error(result.toBasicString()); return result; } ClientToGame clientToGameNoti = new(); clientToGameNoti.Message = new(); clientToGameNoti.Message.ChangeTattooNoti = new(); var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); clientToGameNoti.Message.ChangeTattooNoti.AccountGuid = owner.onGetGuidOfOwnerEntityType(); clientToGameNoti.Message.ChangeTattooNoti.TattooInfoList.AddRange(inventory_action.toTattooInven4Client()); curr_join_map.Broadcast(parent, clientToGameNoti); return result; } } }