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 m_rewards = new(); //List m_currency_invokers = new(); //List m_item_invokers = new(); //List m_currency_max_noties = new(); //private List obtained_reward = new(); private List m_rewarded_moneys = new(); private List 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 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 prepareReward() { var result = new Result(); return Task.FromResult(result); } public async Task 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(); 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(); (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(); 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 itemMaxCheck(List rewards) { Dictionary 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(); var bag_inven = inventory_action.getBagInven(); return await bag_inven.tryCheckTakableInBagInven(item_dictionary); } return new(); } public virtual Task 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 rewards) { m_rewards = rewards; } public List getRewardedItems() { return m_rewarded_items; } public List getRewardedMoneys() { return m_rewarded_moneys; } } }