초기커밋
This commit is contained in:
179
GameServer/Contents/ItemFunction/Action/ItemBuyAction.cs
Normal file
179
GameServer/Contents/ItemFunction/Action/ItemBuyAction.cs
Normal file
@@ -0,0 +1,179 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using META_ID = System.UInt32;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public class ItemBuyAction : EntityActionBase
|
||||
{
|
||||
public List<GameServer.Item>? BuyItems => m_buy_items;
|
||||
private List<GameServer.Item>? m_buy_items { get; set; }
|
||||
|
||||
public ItemBuyAction(Player owner) : base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public async Task<Result> tryBuyItem(META_ID item_id, int buy_count)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var discount = checkPurchaseDiscountType((int)item_id);
|
||||
|
||||
// 1. item data 체크
|
||||
(result, var item_data) = checkBuyItemConditions((int)item_id, buy_count);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
// 2. 구매 처리
|
||||
(result, var spent_currency_type, var spent_currency) = await processForItem(item_data!, buy_count, discount.discount_rate);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
// 3. 재화 차감
|
||||
result = await processSpent(spent_currency_type, spent_currency);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
result = await updateItemFirstPurchaseHistory(discount.discount_type, (int)item_id);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<(Result result, CurrencyType spent_currency_type, double spent_currency)> processForItem(
|
||||
MetaAssets.ItemMetaData item_data, int buy_count, int discountRate)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
var player = getOwner() as Player;
|
||||
|
||||
var inventory_action = player?.getEntityAction<InventoryActionBase>();
|
||||
if (null == inventory_action)
|
||||
{
|
||||
err_msg = $"Fail to get Inventory Action : {nameof(InventoryActionBase)}.";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, CurrencyType.None, 0);
|
||||
}
|
||||
|
||||
(result, var changed_items) = await inventory_action.tryTakalbleToBag((META_ID)item_data.ItemId, (ushort)buy_count);
|
||||
if (result.isFail()) return (result, CurrencyType.None, 0);
|
||||
|
||||
m_buy_items ??= new();
|
||||
m_buy_items.AddRange(changed_items);
|
||||
|
||||
var check_currency_type = ShopHelper.checkCurrencyTypeFromCurrencyId(item_data.Buy_id);
|
||||
if (check_currency_type.result.isFail()) return (check_currency_type.result, CurrencyType.None, 0);
|
||||
|
||||
var price = await ShopHelper.checkCaliumCurrency(check_currency_type.currencyType, item_data.BuyPrice, discountRate);
|
||||
|
||||
return (result, check_currency_type.currencyType, buy_count * price);
|
||||
}
|
||||
|
||||
private async Task<Result> processSpent(CurrencyType spent_currency_type, double spent_currency)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var money_action = getOwner().getEntityAction<MoneyAction>();
|
||||
if (null == money_action)
|
||||
{
|
||||
var err_msg = $"Fail to get Money Action : {nameof(MoneyAction)}.";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
result = await money_action.changeMoney(spent_currency_type, -1 * spent_currency);
|
||||
return result;
|
||||
}
|
||||
|
||||
(DiscountType discount_type, int discount_rate) checkPurchaseDiscountType(int itemMetaId)
|
||||
{
|
||||
var discount_type = DiscountType.None;
|
||||
int discount_rate = 0;
|
||||
|
||||
var player = getOwner().getRootParent() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!");
|
||||
|
||||
var item_first_purchase_history_agent_action = player.getEntityAction<ItemFirstPurchaseHistoryAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(item_first_purchase_history_agent_action, () => $"ItemFirstPurchaseHistoryAgentAction is null !!! - {player.toBasicString()}");
|
||||
|
||||
if (!MetaData.Instance._ItemTable.TryGetValue(itemMetaId, out var item_meta_data))
|
||||
return (discount_type, discount_rate);
|
||||
|
||||
if (item_first_purchase_history_agent_action.isItemFirstPurchase(item_meta_data.ItemId))
|
||||
{
|
||||
discount_type = DiscountType.ItemFirstPurchase;
|
||||
discount_rate = item_meta_data.Buy_Discount_Rate;
|
||||
}
|
||||
|
||||
return (discount_type, discount_rate);
|
||||
}
|
||||
|
||||
(Result result, MetaAssets.ItemMetaData? item_data) checkBuyItemConditions(int itemMetaId, int buyItemCount)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
(result, var item_data) = ShopHelper.checkItemIdFromTableData(itemMetaId);
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
var player = getOwner().getRootParent() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!");
|
||||
|
||||
result = player.checkItemFirstPurchaseItemCount((int)itemMetaId, buyItemCount);
|
||||
if (result.isFail())
|
||||
{
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
return (result, item_data);
|
||||
}
|
||||
|
||||
async Task<Result> updateItemFirstPurchaseHistory(DiscountType discountType, int itemMetaId)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var player = getOwner().getRootParent();
|
||||
|
||||
if (discountType != DiscountType.ItemFirstPurchase)
|
||||
return result;
|
||||
|
||||
var item_first_purchase_history_agent_action = player.getEntityAction<ItemFirstPurchaseHistoryAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(item_first_purchase_history_agent_action, () => $"ItemFirstPurchaseHistoryAgentAction is null !!! - {player.toBasicString()}");
|
||||
|
||||
result = await item_first_purchase_history_agent_action.tryAddItemFirstPurchaseHistoryFromMetaId(itemMetaId);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
374
GameServer/Contents/ItemFunction/Action/ItemUseAction.cs
Normal file
374
GameServer/Contents/ItemFunction/Action/ItemUseAction.cs
Normal file
@@ -0,0 +1,374 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
using Amazon.Runtime.Internal;
|
||||
using Nettention.Proud;
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class RandomBoxItemReference
|
||||
{
|
||||
public SelectedGacha? m_gacha_data { get; set; } = null;
|
||||
public ushort m_num { get; set; } = 1;
|
||||
public string m_item_guid { get; set; } = string.Empty;
|
||||
public List<MetaAssets.Reward> m_rewards { get; set; } = new ();
|
||||
|
||||
public Item? m_deleted_item_nullable { get; set; } = null;
|
||||
|
||||
//public List<MetaAssets.Reward> m_rewarded_money { get; set; } = new();
|
||||
//public List<Item> m_rewarded_items { get; set; } = new();
|
||||
|
||||
public CommonResult m_common_result { get; set; } = new();
|
||||
}
|
||||
|
||||
public class RandomBoxItemUseAction : EntityActionBase
|
||||
{
|
||||
public RandomBoxItemUseAction(EntityBase owner) : base(owner)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> getGachaReward(RandomBoxItemReference randomBoxItemRef)
|
||||
{
|
||||
var owner = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
IReward reward_proc = new RewardRandomItemBox(owner, owner.getUserGuid(), randomBoxItemRef);
|
||||
var result = await RewardManager.It.proceedRewardProcess(reward_proc);
|
||||
reward_proc.postRewardProcess();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> deleteRandomBox(RandomBoxItemReference randomBoxItemRef)
|
||||
{
|
||||
var item_guid = randomBoxItemRef.m_item_guid;
|
||||
var num = randomBoxItemRef.m_num;
|
||||
var owner = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
var inventory_action = owner.getEntityAction<InventoryActionBase>();
|
||||
|
||||
(var result, var removed_item) = await inventory_action.tryDeleteItemByGuid(item_guid, num);
|
||||
if (result.isFail())
|
||||
{
|
||||
var err_msg = $"Failed to tryDeleteItemByGuid() !!! : {result.toBasicString()} - {owner.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
randomBoxItemRef.m_deleted_item_nullable = removed_item;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Result conditionCheck(ref RandomBoxItemReference randomBoxItemRef)
|
||||
{
|
||||
var owner = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
var inventory_action = owner.getEntityAction<InventoryActionBase>();
|
||||
|
||||
var result = new Result();
|
||||
var item_guid = randomBoxItemRef.m_item_guid;
|
||||
|
||||
var item = inventory_action.tryGetItemByItemGuid(item_guid);
|
||||
if (item is null)
|
||||
{
|
||||
var err_msg = $"Failed to tryGetItemByItemGuid !!! : itemGuid:{item_guid} : {this.getTypeName()}";
|
||||
result.setFail(ServerErrorCode.ItemNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return result;
|
||||
}
|
||||
|
||||
var item_meta = item.getItemMeta();
|
||||
if (item_meta is null)
|
||||
{
|
||||
var err_msg = $"Not found meta of Item !!! : temMetaId:{item_guid}";
|
||||
result.setFail(ServerErrorCode.ItemNotFound, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (false == item_meta.canRewardFromItem())
|
||||
{
|
||||
var err_msg = $"RandomBoxItemDataInvalid itemId({item_meta.ItemId})";
|
||||
result.setFail(ServerErrorCode.RandomBoxItemDataInvalid, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
randomBoxItemRef.m_gacha_data = gachaData;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public void useRandomBoxItem()
|
||||
{
|
||||
string err_msg = $"need code implement !!!!";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user