Files
2025-05-01 07:20:41 +09:00

175 lines
5.4 KiB
C#

using Amazon.DynamoDBv2.Model.Internal.MarshallTransformations;
using GameServer;
using MetaAssets;
using ServerCommon;
using ServerControlCenter;
using ServerCore; using ServerBase;
using META_ID = System.UInt32;
namespace GameServer
{
public abstract class RewardBase : IReward
{
private Player m_owner;
private string m_user_guid = string.Empty;
private List<MetaAssets.Reward> m_rewards = new();
//List<ILogInvoker> m_currency_invokers = new();
//List<ILogInvoker> m_item_invokers = new();
//List<CurrencyMaxNoti> m_currency_max_noties = new();
//private List<Money> obtained_reward = new();
private List<MetaAssets.Reward> m_rewarded_moneys = new();
private List<Item> m_rewarded_items = new();
public RewardBase(Player owner, string user_guid)
{
m_owner = owner;
m_user_guid = user_guid;
//m_currency_invokers = new();
//m_item_invokers = new();
//m_currency_max_noties = new();
//m_rewarda = rewards;
}
public RewardBase(Player owner, string user_guid, List<MetaAssets.Reward> rewards)
{
m_owner = owner;
m_user_guid = user_guid;
//m_currency_invokers = new();
//m_item_invokers = new();
//m_currency_max_noties = new();
m_rewards = rewards;
}
//=====================================================================================
// 보상전 처리해야되는 것들 처리
//=====================================================================================
public virtual Task<Result> prepareReward()
{
var result = new Result();
return Task.FromResult(result);
}
public async Task<Result> addReward()
{
//item인것만 모아서 tryCheckTakableInBagInven 한번 태운다
var result = await itemMaxCheck(m_rewards);
if (result.isFail()) return result;
foreach (var reward in m_rewards)
{
if (reward.Currency != null)
{
var money_action = m_owner.getEntityAction<MoneyAction>();
result = await money_action.changeMoney((CurrencyType)reward.Currency.Id, reward.Currency.Value);
if (result.isFail()) return result;
m_rewarded_moneys.Add(reward);
}
else if (reward.Item != null)
{
var inventory_action = m_owner.getEntityAction<InventoryActionBase>();
(result, var items) = await inventory_action.tryTakalbleToBag((META_ID)reward.Item.Id, (ushort)reward.Item.Count);
if (result.isFail()) return result;
m_rewarded_items.AddRange(items);
}
else if (reward.SeasonPassExp != null)
{
var season_pass_action = m_owner.getEntityAction<SeasonPassAction>();
result = season_pass_action.IncreaseExp((UInt32)reward.SeasonPassExp.Value);
if (result.isFail()) return result;
}
else
{
var err_msg = $"reward_data type InvalidType";
result.setFail(ServerErrorCode.RewardInvalidType, err_msg);
return result;
}
}
return result;
}
private async Task<Result> itemMaxCheck(List<MetaAssets.Reward> rewards)
{
Dictionary<META_ID, Int16> item_dictionary = new();
foreach (var reward in rewards)
{
if (reward.Item == null) continue;
var id = (META_ID)reward.Item.Id;
var item_cnt = (UInt16)reward.Item.Count;
if (false == item_dictionary.TryGetValue(id, out var cnt))
{
item_dictionary.TryAdd(id, (Int16)reward.Item.Count);
}
else
{
var sum = item_cnt + cnt;
item_dictionary[id] = (Int16)sum;
}
}
if (item_dictionary.Count > 0)
{
var inventory_action = m_owner.getEntityAction<InventoryActionBase>();
var bag_inven = inventory_action.getBagInven();
return await bag_inven.tryCheckTakableInBagInven(item_dictionary);
}
return new();
}
public virtual Task<Result> finalizeReward()
{
var result = new Result();
return Task.FromResult(result);
}
public void postRewardProcess()
{
//prepare();
//sendNoti();
}
public Player getOwner()
{
return m_owner;
}
public string getUserGuid()
{
return m_user_guid;
}
public void setRewardMetas(List<MetaAssets.Reward> rewards)
{
m_rewards = rewards;
}
public List<Item> getRewardedItems()
{
return m_rewarded_items;
}
public List<MetaAssets.Reward> getRewardedMoneys()
{
return m_rewarded_moneys;
}
}
}