using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; 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; using static ClientToLoginMessage.Types; using MetaAssets; using Amazon.S3.Model; namespace GameServer { public class ItemUseAction : EntityActionBase { public delegate Task FnItemUseFunction([Optional] object[] toPassFunctionParams); private Dictionary<(MetaAssets.EItemLargeType, MetaAssets.EItemSmallType), FnItemUseFunction> m_trigger_funtions = new(); public ItemUseAction(Item owner) : base(owner) { } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); { var large_type = MetaAssets.EItemLargeType.EXPENDABLE; m_trigger_funtions.Add((large_type, MetaAssets.EItemSmallType.REGISTER_ITEM_SOCIAL_ACTION), onRegisterItemSocialAction); m_trigger_funtions.Add((large_type, MetaAssets.EItemSmallType.REGISTER_ITEM_INTERIOR), onRegisterItemInterior); m_trigger_funtions.Add((large_type, MetaAssets.EItemSmallType.BUFF_DRINK), onBuffDrink); m_trigger_funtions.Add((large_type, MetaAssets.EItemSmallType.RECIPE), onRegisterRecipe); m_trigger_funtions.Add((large_type, MetaAssets.EItemSmallType.QUEST_ASSIGN), onQuestAssign); m_trigger_funtions.Add((large_type, MetaAssets.EItemSmallType.QUEST_COOLTIME_RESET), onQuestMailSendInsteadOfCoolltimeReset); } { var large_type = MetaAssets.EItemLargeType.SET_BOX; m_trigger_funtions.Add((large_type, MetaAssets.EItemSmallType.SETBOX), onOpenSetItem); } return result; } public override void onClear() { return; } public async Task onUseItem() { var owner = getOwner() as Item; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var parent = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {owner.toBasicString()}"); var item_attribute = owner.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {parent.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; if (false == MetaData.Instance._ItemTable.TryGetValue((Int32)item_attribute.ItemMetaId, out var found_item_meta)) { err_msg = $"Not found Item Meta !!! : {owner.toBasicString()} - {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } result = await onTriggerFunction(); if (result.isFail()) { return result; } return result; } private async Task onTriggerFunction() { var owner = getOwner() as Item; 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 item_meta = owner.getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {parent.toBasicString()}"); if (false == m_trigger_funtions.TryGetValue((item_meta.TypeLarge, item_meta.TypeSmall), out var found_fucntion)) { err_msg = $"Not found Item Use Function !!! : largeType:{item_meta.TypeLarge}, smallType:{item_meta.TypeSmall}, {owner.toBasicString()} - {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemUseFunctionNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } result = await found_fucntion.Invoke(); if (result.isFail()) { return result; } return result; } protected async Task onRegisterItemSocialAction([Optional] object[] toPassFunctionParams) { var owner = getOwner() as Item; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var parent = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {owner.toBasicString()}"); var item_meta = owner.getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {parent.toBasicString()}"); var item_effect_meta_id = item_meta.Register_id; var social_action = parent.getEntityAction(); NullReferenceCheckHelper.throwIfNull(social_action, () => $"social_action is null !!! - {parent.toBasicString()}"); var result = await social_action.tryAddSocialActionFromMetaId(item_effect_meta_id); if(result.isFail()) { return result; } parent.addNotifyMessage(SocialActionNotifyHelper.makeNtfSocialActionAddPacket(item_effect_meta_id), false); return result; } protected async Task onRegisterItemInterior([Optional] object[] toPassFunctionParams) { await Task.CompletedTask; var result = new Result(); var err_msg = string.Empty; err_msg = $"Not Implemented !!!"; result.setFail(ServerErrorCode.NotImplemented, err_msg); Log.getLogger().error(result.toBasicString()); return result; } protected async Task onBuffDrink([Optional] object[] toPassFunctionParams) { await Task.CompletedTask; var owner = getOwner() as Item; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var parent = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {owner.toBasicString()}"); var item_meta = owner.getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {parent.toBasicString()}"); var item_effect_meta_id = item_meta.buff_id; var buff_action = parent.getEntityAction(); NullReferenceCheckHelper.throwIfNull(buff_action, () => $"buff_action is null !!! - {parent.toBasicString()}"); var result = new Result(); (result, var add_buff_attribute, var delete_buff_attribute) = buff_action.AddBuffProcess((META_ID)item_effect_meta_id); if (result.isFail()) { return result; } if(delete_buff_attribute != null) { parent.addNotifyMessage(BuffNotifyHelper.makeNotiDeleteBuffPacket(delete_buff_attribute, parent.getUserGuid()), true); } if (add_buff_attribute != null) { parent.addNotifyMessage(BuffNotifyHelper.makeNotiStartBuffPacket(add_buff_attribute, parent.getUserGuid()), true); } return result; } protected async Task onRegisterRecipe([Optional] object[] toPassFunctionParams) { var owner = getOwner() as Item; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var parent = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {owner.toBasicString()}"); var item_meta = owner.getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {parent.toBasicString()}"); var result = new Result(); var item_effect_meta_id = item_meta.Register_id; var craft_recipe_action = parent.getEntityAction(); NullReferenceCheckHelper.throwIfNull(craft_recipe_action, () => $"craft_recipe_action is null !!! - {parent.toBasicString()}"); result = await craft_recipe_action.RegisterRecipe((META_ID)item_effect_meta_id); if (result.isFail()) { return result; } var craft_recipe_meta_ids = craft_recipe_action.getRecipeMetaIds(); parent.addNotifyMessage(CraftNotifyHelper.makeAckCraftRecipePacket(craft_recipe_meta_ids), false); await QuestManager.It.QuestCheckWithoutTransaction(parent, new QuestCrafting(EQuestEventTargetType.CRAFTING, EQuestEventNameType.REGISTERED, item_effect_meta_id)); return result; } protected async Task onQuestAssign([Optional] object[] toPassFunctionParams) { Result result = new(); var owner = getOwner() as Item; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var parent = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {owner.toBasicString()}"); var item_meta = owner.getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {parent.toBasicString()}"); var quest_action = parent.getEntityAction(); result = await quest_action.questAssignableItemConditionCheck(item_meta); if (result.isFail()) return result; //퀘스트 할당 (result, var accept_quest_var) = await quest_action.questAssignByItem(item_meta); if (result.isFail() || null == accept_quest_var) return result; var assigned_quest = accept_quest_var.m_new_quest_nullable; NullReferenceCheckHelper.throwIfNull(assigned_quest, () => $"Quest is null !!! - item_id:{item_meta.ItemId}"); var assigned_quest_attribute = assigned_quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(assigned_quest_attribute, () => "QuestAttribute is null !!!"); var assigned_quest_id = assigned_quest_attribute.QuestId; quest_action.addNewQuest(assigned_quest_id, assigned_quest); parent.addNotifyMessage(await QuestNotifyHelper.makeQuestUpdateNotify(parent, assigned_quest_id, assigned_quest, true), false); return result; } protected async Task onQuestMailSendInsteadOfCoolltimeReset([Optional] object[] toPassFunctionParams) { Result result = new(); var owner = getOwner() as Item; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var parent = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {owner.toBasicString()}"); var item_meta = owner.getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {parent.toBasicString()}"); var quest_action = parent.getEntityAction(); (result, var assignable_mail_set) = await quest_action.resetQuestCoolTimeConditionCheck(); if (result.isFail()) return result; var assignable_quest_id = QuestManager.It.getAssignableQuestMailId(assignable_mail_set); var player = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - parent: {parent.toBasicString()}"); var check_value = QuestManager.It.questCheckUserAssignableQuestMaxCheck(player, assignable_mail_set);//여기 방어 처리 필요. var quest_mail_action = player.getEntityAction(); (result, var quest_mail, var quest_mail_log_invoker) = await quest_mail_action.sendQuestMail(assignable_quest_id); if (result.isFail()) { return result; } await quest_mail_action.addNewQuestMails(new List() { quest_mail }); await quest_mail_action.send_NTF_RECEIVED_QUEST_MAIL(player, new List() { assignable_quest_id }); return result; } protected async Task onOpenSetItem([Optional] object[] toPassFunctionParams) { Result result = new(); var owner = getOwner() as Item; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var parent = owner.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {owner.toBasicString()}"); var item_meta = owner.getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {parent.toBasicString()}"); if (false == MetaData.Instance._GachaMetaTable.TryGetValue(item_meta.GachaGroupId, out var gachaData)) { var err_msg = $"Not Exist GachaData gachaGroupId = {item_meta.GachaGroupId}"; result.setFail(ServerErrorCode.NotExistGachaData, err_msg); return result; } NullReferenceCheckHelper.throwIfNull(gachaData, () => $"gachaData is null !!! - {parent.toBasicString()}"); var inventory_action = parent.getEntityAction(); foreach (var gacha in gachaData.GachaList) { var reward = gacha.Reward; if (reward.Currency != null) { var money_action = parent.getEntityAction(); result = await money_action.changeMoney((CurrencyType)reward.Currency.Id, reward.Currency.Value); if (result.isFail()) { return result; } } if (reward.Item != null) { (result, var items) = await inventory_action.tryTakalbleToBag((META_ID)reward.Item.Id, (ushort)reward.Item.Count); if (result.isFail()) { return result; } } if (reward.SeasonPassExp != null) { var season_pass_action = parent.getEntityAction(); result = season_pass_action.IncreaseExp((UInt32)reward.SeasonPassExp.Value); if (result.isFail()) { return result; } } } return result; } } }