초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
using ServerCommon;
using System.Collections.Concurrent;
using Amazon.DynamoDBv2.DocumentModel;
using static ClientToGameMessage.Types;
namespace GameServer
{
public interface IReward
{
Task<Result> prepareReward();
Task<Result> addReward();
Task<Result> finalizeReward();
void postRewardProcess();
//List<CurrencyMaxNoti> getCurrencyMaxNoties();
//List<Item> getRewardItems();
//List<ItemEntity> getItemEntities();
//List<ILogInvoker> getCurrencyLogInvokers();
//List<ILogInvoker> getItemLogInvokers();
//List<ILogInvoker> getItemDeleteInvokers();
}
}

View File

@@ -0,0 +1,174 @@
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;
}
}
}

View File

@@ -0,0 +1,40 @@
using GameServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameServer.Reward;
public class RewardClaim : RewardBase
{
private ClaimRewardReference m_claim_reward_ref;
public RewardClaim(Player player, string userGuid, ClaimRewardReference claimRewardReference) : base(player, userGuid, claimRewardReference.m_reward_data)
{
m_claim_reward_ref = claimRewardReference;
}
//=====================================================================================
// 보상전 처리해야되는 것들 처리
//=====================================================================================
public override Task<Result> prepareReward()
{
return Task.FromResult(new Result());
}
//=====================================================================================
// 보상처리 후 필요한 로직들 처리
//=====================================================================================
public override Task<Result> finalizeReward()
{
var result = new Result();
m_claim_reward_ref.m_rewared_money.AddRange(getRewardedMoneys());
m_claim_reward_ref.m_rewarded_items.AddRange(getRewardedItems());
return Task.FromResult(result);
}
}

View File

@@ -0,0 +1,130 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer;
public class RewardManager : Singleton<RewardManager>
{
//private static readonly RewardManager _instance = new();
//public static RewardManager Instance { get { return _instance; } }
//public RewardManager() { }
public async Task<Result> proceedRewardProcess(IReward rewardBase)
{
var result = await rewardBase.prepareReward();
if (result.isFail()) return result;
result = await rewardBase.addReward();
if (result.isFail()) return result;
result = await rewardBase.finalizeReward();
if (result.isFail()) return result;
return result;
}
public void postRewardProcess(IReward rewardBase)
{
rewardBase.postRewardProcess();
}
public (Result, MetaAssets.Reward?) makeRewardFromItemStr(string itemIdStr, string countStr)
{
var result = new Result();
string err_msg = string.Empty;
result = convertStrToItemId(itemIdStr, out int itemId);
if(result.isFail()) return (result, null);
result = convertStrToItemCount(countStr, out int count);
if (result.isFail()) return (result, null);
if (false == MetaData.Instance._ItemTable.TryGetValue(itemId, out ItemMetaData? itemData))
{
err_msg = $"Not found meta of Item !!! : ItemMetaId:{itemId}";
result.setFail(ServerErrorCode.CartMetaDataNotFound, err_msg);
Log.getLogger().error(err_msg);
return (result, null);
}
MetaAssets.Reward reward = ItemMetaHelper.convertFromItemIdToReward(itemData.ItemId, count);
return (result, reward);
}
public Result makeItemIdFromStr(string itemIdStr, string countStr, out int itemId, out int count)
{
var result = new Result();
itemId = 0;
count = 0;
result = convertStrToItemId(itemIdStr, out itemId);
if (result.isFail()) return result;
result = convertStrToItemCount(countStr, out count);
if (result.isFail()) return result;
return result;
}
private Result convertStrToItemId(string itemIdStr, out int itemId)
{
var result = new Result();
if (int.TryParse(itemIdStr, out itemId) == false)
{
var err_msg = $"convertStrToItemId {itemIdStr} is not number";
result.setFail(ServerErrorCode.ItemParsingFromStringToIntErorr, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
return result;
}
private Result convertStrToItemCount(string countStr, out int itemCount)
{
var result = new Result();
if (int.TryParse(countStr, out itemCount) == false)
{
var err_msg = $"convertStrToItemCount {countStr} is not number";
result.setFail(ServerErrorCode.ItemValueParsingFromStringToIntErorr, err_msg);
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public (Result, List<MetaAssets.RewardMetaData>?) makeRewardsInfo(string rewardGroupIdStr)
{
var result = new Result();
string err_msg = string.Empty;
if (int.TryParse(rewardGroupIdStr, out int rewardGroupId) == false)
{
err_msg = $"makeRewardInfo {rewardGroupIdStr} is not number";
result.setFail(ServerErrorCode.RewardGroupIdParsingFromStringToIntErorr, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
if (false == MetaData.Instance._RewardMetaTable.TryGetValue(rewardGroupId, out var rewardDatas))
{
err_msg = $"_RewardDataTable not exist info rewardGroupId = {rewardGroupId}";
result.setFail(ServerErrorCode.RewardInfoNotExist, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
return (result, rewardDatas);
}
}

View File

@@ -0,0 +1,90 @@
using Amazon.DynamoDBv2.DocumentModel;
using GameServer;
using Newtonsoft.Json;
using ServerCommon;
using ServerCore; using ServerBase;
namespace GameServer;
public class RewardQuest : RewardBase
{
QuestRewardHandler m_quest_reward_handler;
public RewardQuest(Player player, string userGuid, QuestRewardHandler questRewardRef) : base(player, userGuid)
{
m_quest_reward_handler = questRewardRef;
setRewardMetas(questRewardRef.m_rewards);
//m_res = res;
//m_quest_log_invoker = new QuestRewardBusinessLog(LogActionType.QuestMainReward, )
}
//=====================================================================================
// 보상전 처리해야되는 것들 처리, 여기선 퀘스트 삭제 처리하고, EndQuest 추가 처리
//=====================================================================================
public override Task<Result> prepareReward()
{
var result = new Result();
//기존 퀘스트 삭제 처리
var quest = m_quest_reward_handler.m_quest;
if (quest == null)
{
//정상 로직대로라면 퀘스트가 null일수가 없는데 일단 예외처리
var err_msg = $"questRewardRef quest is null. questRewardRef = {JsonConvert.SerializeObject(m_quest_reward_handler)}";
result.setFail(ServerErrorCode.QuestInvalidValue, err_msg);
Log.getLogger().error(result.toBasicString());
return Task.FromResult(result);
}
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!");
quest_attribute.deleteEntityAttribute();
//완료 퀘스트 생성
m_quest_reward_handler.m_end_quest = new EndQuest(getOwner(), getUserGuid(), m_quest_reward_handler.m_quest_id, m_quest_reward_handler.m_quest_revision);
var end_quest_attribute = m_quest_reward_handler.m_end_quest.getEntityAttribute<EndQuestAttribute>();
NullReferenceCheckHelper.throwIfNull(end_quest_attribute, () => $"end_quest_attribute is null !!!");
var end_quest_doc = new EndQuestDoc(getOwner().getUserGuid(), m_quest_reward_handler.m_quest_id, m_quest_reward_handler.m_quest_revision);
end_quest_attribute.syncOriginDocBaseWithNewDoc<EndQuestAttribute>(end_quest_doc);
var end_quest_attrib = end_quest_doc.getAttrib<EndQuestAttrib>();
NullReferenceCheckHelper.throwIfNull(end_quest_attrib, () => $"end_quest_attrib is null !!!");
end_quest_attrib.m_last_end_time = DateTimeHelper.Current;
end_quest_attrib.m_end_count = 1;
end_quest_attrib.m_quest_id = m_quest_reward_handler.m_quest_id;
end_quest_attribute.modifiedEntityAttribute(true);
if (m_quest_reward_handler.m_has_ugq_daily_reward)
{
var daily_reward_attribute = getOwner().getEntityAttribute<UgqDailyRewardCountAttribute>();
NullReferenceCheckHelper.throwIfNull(daily_reward_attribute, () => $"daily_reward_attribute is null !!!");
NullReferenceCheckHelper.throwIfNull(m_quest_reward_handler.m_ugq_game_data, () => $"m_quest_reward_handler.m_ugq_game_data is null !!!");
if (true == daily_reward_attribute.m_ugq_daily_reward_count.TryGetValue(m_quest_reward_handler.m_ugq_game_data.GradeType, out var cnt))
{
cnt++;
daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(m_quest_reward_handler.m_ugq_game_data.GradeType, cnt, (key, old) => cnt);
daily_reward_attribute.modifiedEntityAttribute(true);
}
}
return Task.FromResult(result);
}
//=====================================================================================
// 보상처리 후 필요한 로직들 처리
//=====================================================================================
public override Task<Result> finalizeReward()
{
var result = new Result();
m_quest_reward_handler.m_rewarded_money.AddRange(getRewardedMoneys());
m_quest_reward_handler.m_rewarded_items.AddRange(getRewardedItems());
return Task.FromResult(result);
}
}

View File

@@ -0,0 +1,40 @@
using GameServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameServer;
public class RewardQuestTask : RewardBase
{
QuestTaskUpdateHandler quest_task_update_handler;
public RewardQuestTask(Player player, QuestTaskUpdateHandler questTaskUpdateHandler) : base(player, player.getUserGuid())
{
quest_task_update_handler = questTaskUpdateHandler;
setRewardMetas(quest_task_update_handler.m_rewards);
}
//=====================================================================================
// 보상전 처리해야되는 것들 처리
//=====================================================================================
public override Task<Result> prepareReward()
{
var result = new Result();
return Task.FromResult(result);
}
//=====================================================================================
// 보상처리 후 필요한 로직들 처리
//=====================================================================================
public override Task<Result> finalizeReward()
{
var result = new Result();
quest_task_update_handler.m_rewarded_money.AddRange(getRewardedMoneys());
quest_task_update_handler.m_rewarded_items.AddRange(getRewardedItems());
return Task.FromResult(result);
}
}

View File

@@ -0,0 +1,42 @@
using GameServer;
using Nettention.Proud;
using ServerCommon;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameServer;
public class RewardRandomItemBox : RewardBase
{
protected RandomBoxItemReference m_random_box_item_ref = new();
public RewardRandomItemBox(Player player, string userGuid, RandomBoxItemReference itemRef) : base(player, userGuid, itemRef.m_rewards)
{
m_random_box_item_ref = itemRef;
}
//=====================================================================================
// 보상전 처리해야되는 것들 처리
//=====================================================================================
public override Task<Result> prepareReward()
{
return Task.FromResult(new Result());
}
//=====================================================================================
// 보상처리 후 필요한 로직들 처리
//=====================================================================================
public override Task<Result> finalizeReward()
{
var result = new Result();
//m_random_box_item_ref.m_rewarded_money.AddRange(getRewardedMoneys());
//m_random_box_item_ref.m_rewarded_items.AddRange(getRewardedItems());
return Task.FromResult(result);
}
}

View File

@@ -0,0 +1,36 @@
using GameServer;
using Nettention.Proud;
using ServerCommon;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameServer;
public class RewardSeasonPass : RewardBase
{
public RewardSeasonPass(Player player, string userGuid, List<MetaAssets.Reward> rewards) : base(player, userGuid, rewards)
{
}
//=====================================================================================
// 보상전 처리해야되는 것들 처리
//=====================================================================================
public override Task<Result> prepareReward()
{
return Task.FromResult(new Result());
}
//=====================================================================================
// 보상처리 후 필요한 로직들 처리
//=====================================================================================
public override Task<Result> finalizeReward()
{
var result = new Result();
return Task.FromResult(result);
}
}

View File

@@ -0,0 +1,36 @@
using GameServer;
using Nettention.Proud;
using ServerCommon;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameServer;
public class RewardUseProp : RewardBase
{
public RewardUseProp(Player player, string userGuid, List<MetaAssets.Reward> rewards) : base(player, userGuid, rewards)
{
}
//=====================================================================================
// 보상전 처리해야되는 것들 처리
//=====================================================================================
public override Task<Result> prepareReward()
{
return Task.FromResult(new Result());
}
//=====================================================================================
// 보상처리 후 필요한 로직들 처리
//=====================================================================================
public override Task<Result> finalizeReward()
{
var result = new Result();
return Task.FromResult(result);
}
}