375 lines
16 KiB
C#
375 lines
16 KiB
C#
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<Result> 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<Result> 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<Result> 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<ItemAttributeBase>();
|
|
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<Result> 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<Result> 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<SocialActionLoadAction>();
|
|
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<Result> 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<Result> 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<BuffAction>();
|
|
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<Result> 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<CraftRecipeAction>();
|
|
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<Result> 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<QuestAction>();
|
|
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<QuestAttribute>();
|
|
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<Result> 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<QuestAction>();
|
|
(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<QuestMailAction>();
|
|
(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<ServerCommon.QuestMail>() { quest_mail });
|
|
await quest_mail_action.send_NTF_RECEIVED_QUEST_MAIL(player, new List<UInt32>() { assignable_quest_id });
|
|
|
|
return result;
|
|
}
|
|
|
|
protected async Task<Result> 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<InventoryActionBase>();
|
|
|
|
foreach (var gacha in gachaData.GachaList)
|
|
{
|
|
var reward = gacha.Reward;
|
|
|
|
if (reward.Currency != null)
|
|
{
|
|
var money_action = parent.getEntityAction<MoneyAction>();
|
|
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<SeasonPassAction>();
|
|
result = season_pass_action.IncreaseExp((UInt32)reward.SeasonPassExp.Value);
|
|
if (result.isFail())
|
|
{
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
|
|
}
|