초기커밋

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,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;
}
}

View 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;
}
}
}

View File

@@ -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);
}
}
}