초기커밋

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

View File

@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Google.Protobuf.WellKnownTypes;
using ServerCore; using ServerBase;
using ServerCommon;
using static ClientToGameMessage.Types;
using ITEM_GUID = System.String;
namespace GameServer
{
public static class ItemNotifyHelper
{
public static bool send_S2C_NTF_ITEM_DELETE(Player player, ITEM_GUID deletedItemGuid, ushort deletedCount)
{
var ntf_packet = new ClientToGame();
ntf_packet.Message = new ClientToGameMessage();
var ntf_msg = new GS2C_NTF_ITEM_DELETE();
ntf_packet.Message.NtfItemDelete = ntf_msg;
ntf_msg.DeletedItemGuid = deletedItemGuid;
ntf_msg.DeletedCount = deletedCount;
if (false == GameServerApp.getServerLogic().onSendPacket(player, ntf_packet))
{
return false;
}
return true;
}
}
}

View File

@@ -0,0 +1,374 @@
using Amazon.S3.Model;
using ServerCore; using ServerBase;
using ServerCommon;
using static ClientToGameReq.Types;
using META_ID = System.UInt32;
using Amazon.DynamoDBv2.Model;
namespace GameServer;
[ChatCommandAttribute("additem", typeof(ChatCommandAddItem), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandAddItem : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
Log.getLogger().info($"Call additem !!! - {player.toBasicString()}");
if (args.Length < 2)
return;
if (int.TryParse(args[0], out int itemId) == false || int.TryParse(args[1], out int count) == false)
return;
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var fn_item_add = async delegate ()
{
var result = new Result();
var err_msg = string.Empty;
ClientToGame clientToGame = new();
clientToGame.Response = new();
clientToGame.Response.AddItemRes = new();
var inventory_action = player.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !! - {player.toBasicString()}");
(result, var add_or_updated_items) = await inventory_action.tryTakalbleToBag((uint)itemId, (ushort)count);
if (result.isFail())
{
err_msg = $"Failed to tryTakalbleToBag() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithItemRequest>(player, LogActionType.CheatCommandItem
, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
MetaData.Instance._ItemTable.TryGetValue((int)itemId, out var itemMetaData);
NullReferenceCheckHelper.throwIfNull(itemMetaData, () => $"item meta data is null !! - item id : {itemId}");
(result, _, var bag_tab_type) = inventory_action.toBagTypeAndTabType(itemMetaData);
clientToGame.Response.AddItemRes.Index = (int)bag_tab_type + 1;
foreach (var item in add_or_updated_items)
{
clientToGame.Response.AddItemRes.Item.Add(item.toItemData4Client());
}
player.sendPacket(clientToGame);
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemAdd", fn_item_add);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
}
await QuestManager.It.QuestCheck(player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.BOUGHT, itemId));
}
}
[ChatCommandAttribute("updateitem", typeof(ChatCommandUpdateItem), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandUpdateItem : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
Log.getLogger().info($"Call additem !!! - {player.toBasicString()}");
if (args.Length < 2)
return;
if ( int.TryParse(args[0], out int item_meta_id) == false
|| int.TryParse(args[1], out int to_change_count) == false )
{
return;
}
var result = new Result();
var err_msg = string.Empty;
if (to_change_count <= 0)
{
err_msg = $"Invalid Item Count : 0 < toChangeCount:{to_change_count}, itemMetaId:{item_meta_id} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var server_logic = GameServerApp.getServerLogic();
var db_client = server_logic.getDynamoDbClient();
var fn_update_item = async delegate ()
{
var result = new Result();
var err_msg = string.Empty;
var packet = new ClientToGame();
packet.Response = new ClientToGameRes();
var ack_msg = new ClientToGameRes.Types.AddItemRes();
packet.Response.AddItemRes = ack_msg;
var inventory_action = player.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !! - {player.toBasicString()}");
if (!MetaData.Instance._ItemTable.TryGetValue((int)item_meta_id, out var found_item_meta_data))
{
err_msg = $"Not found meta of Item !!! : itemMetaId:{item_meta_id} - {player.toBasicString()}";
result.setFail(ServerErrorCode.ItemMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var found_items = inventory_action.tryGetItemAllByItemMetaId((META_ID)item_meta_id);
if(0 >= found_items.Count)
{
err_msg = $"Not found Item : itemMetaId:{item_meta_id} - {player.toBasicString()}";
result.setFail(ServerErrorCode.ItemNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var target_item = found_items[0];
var item_attribute = target_item.getEntityAttribute<UserItemAttribute>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !! - {player.toBasicString()}");
item_attribute.ItemStackCount = (UInt16)Math.Min(found_item_meta_data.StackMaxCount, to_change_count);
item_attribute.modifiedEntityAttribute();
var batch = new QueryBatchEx<QueryRunnerWithItemRequest>( player, LogActionType.CheatCommandItem
, server_logic.getDynamoDbClient()
);
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
batch.addQuery(new QueryFinal());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
player.sendPacket(packet);
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemUpdate", fn_update_item);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
}
}
}
[ChatCommandAttribute("delitem", typeof(ChatCommandDelItem), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandDelItem : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
Log.getLogger().info($"Call delitem !!! - {player.toBasicString()}");
if (args.Length < 2)
return;
if (int.TryParse(args[0], out int itemId) == false || int.TryParse(args[1], out int count) == false)
return;
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var fn_item_delete = async delegate ()
{
var result = new Result();
var err_msg = string.Empty;
ClientToGame clientToGame = new();
clientToGame.Response = new();
clientToGame.Response.RemoveItemsRes = new();
var inventory_action = player.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"InventoryActionBase is null !!! - {player.toBasicString()}");
(result, var deleted_items) = await inventory_action.tryDeleteItemByMetaId((META_ID)itemId, (ushort)count);
if (result.isFail())
{
err_msg = $"Failed to tryDeleteItemByMetaId() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.CheatCommandItem
, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
MetaData.Instance._ItemTable.TryGetValue((int)itemId, out var itemMetaData);
NullReferenceCheckHelper.throwIfNull(itemMetaData, () => $"itemMetaData is null !! - item id:{itemId}");
(result, _, var bag_tab_type) = inventory_action.toBagTypeAndTabType(itemMetaData);
clientToGame.Response.RemoveItemsRes.Index = (int)bag_tab_type + 1;
foreach (var item in deleted_items)
{
clientToGame.Response.RemoveItemsRes.Item.Add(item.toItemData4Client());
}
player.sendPacket(clientToGame);
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemDelete", fn_item_delete);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
}
}
}
[ChatCommandAttribute("megaphone", typeof(ChatCommandMegaPhone), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandMegaPhone : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
await Task.CompletedTask;
Log.getLogger().info($"HandleMegaPhone");
if (args.Length < 1)
{
Log.getLogger().error($"Invalid Argument");
return;
}
var server_logic = GameServerApp.getServerLogic();
var receivers = server_logic.getPlayerManager().getUsers();
foreach (var receiver in receivers)
{
ChatNotifyHelper.send_S2C_NTF_CHAT(receiver.Value, ChatType.Channel, player.getUserNickname(), receiver.Value.getUserNickname(), PlayerStateType.None, args[0]);
}
}
}
[ChatCommandAttribute("leveluptattoo", typeof(ChatCommandLevelUpTattoo), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandLevelUpTattoo : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
Log.getLogger().info($"Call leveluptattoo !!! - {player.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
if (args.Length < 1)
{
err_msg = $"Not enough argument !!! : argCount:{args.Length} == 1 - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var param = args[0];
if (true == param.isNullOrWhiteSpace())
{
err_msg = $"Arg 1 is Empty !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if(false == int.TryParse(param, out var slot_no))
{
err_msg = $"Failed to TryParse() !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var tatoo_slot_type = (TattooSlotType)slot_no;
var user_inventory_action = player.getEntityAction<UserInventoryAction>();
NullReferenceCheckHelper.throwIfNull(user_inventory_action, () => $"user_inventory_action is null !!! - {player.toBasicString()}");
user_inventory_action.getEquipInvens().TryGetValue(InvenEquipType.Tattoo, out var found_equip_inven);
NullReferenceCheckHelper.throwIfNull(found_equip_inven, () => $"found_equip_inven is null !!! - {player.toBasicString()}");
var tattoo_inven = found_equip_inven as TattooEquipInven;
NullReferenceCheckHelper.throwIfNull(tattoo_inven, () => $"tattoo_inven is null !!! - {player.toBasicString()}");
var tattoo_inven_data = tattoo_inven.getData();
NullReferenceCheckHelper.throwIfNull(tattoo_inven_data, () => $"tattoo_inven_data is null !!! - {player.toBasicString()}");
var found_tattoo = tattoo_inven_data.findEntityBaseInSlotType(tatoo_slot_type);
if(null == found_tattoo)
{
err_msg = $"Not found Tattoo !!! : tattooSlotType:{tatoo_slot_type} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var item_attribute = found_tattoo.getOriginEntityAttribute<ItemAttributeBase>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {player.toBasicString()}");
var tattoo_item_guid = item_attribute.ItemGuid;
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}");
var session = player as IEntityWithSession;
NullReferenceCheckHelper.throwIfNull(session, () => $"session is null !!! - {player.toBasicString()}");
//=====================================================================================
// 패킷 구성
//=====================================================================================
var packet = new ClientToGame();
packet.Request = new ClientToGameReq();
var request = new LevelUpTattooReq();
packet.Request.LevelUpTattooReq = request;
request.ItemGuid = tattoo_item_guid;
result = await server_logic.onCallProtocolHandler(session, packet);
if (result.isFail())
{
err_msg = $"Failed to onCallProtocolHandler() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
}
}

View File

@@ -0,0 +1,324 @@
using System.Collections.Generic;
using System;
using Amazon.S3.Model;
using ServerCore; using ServerBase;
using ServerCommon;
using MetaAssets;
using static ClientToGameReq.Types;
using META_ID = System.UInt32;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace GameServer;
[ChatCommandAttribute("additembyrandom", typeof(ChatCommandAddItemByRandom), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandAddItemByRandom : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
Log.getLogger().info($"Call additembyrandom !!! - {player.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
if (args.Length < 1)
{
err_msg = $"Not enough argument !!! : argCount:{args.Length} == 2 - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if (int.TryParse(args[0], out int count) == false)
{
err_msg = $"Invalid argument !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if(count > 1000)
{
err_msg = $"Invalid item random creation count limit over !!! : 1000 >= {count} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var inventory_action_base = player.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action_base, () => $"inventory_action_base is null !! - {player.toBasicString()}");
inventory_action_base.writeLog();
var server_logic = GameServerApp.getServerLogic();
var total_items = new Dictionary<META_ID, List<Item>>();
var fn_item_add_by_random = async delegate ()
{
var result = new Result();
var err_msg = string.Empty;
var picked_item_metas = new List<ItemMetaData>();
// 1. random 으로 n개의 ItemMetaData 정보를 얻는다.
var item_meta_count_random = new Random();
var random_picked_item_meta_datas = MetaData.Instance._ItemTable
.OrderBy(x => item_meta_count_random.Next())
.Take(count)
.ToList();
var batch_count = 100;
var total_count = random_picked_item_meta_datas.Count;
// 2. 추출된 ItemMetaData 정보를 참조하여 모든 아이템을 지급을 시도 한다.
for (int i = 0; i < total_count; i += batch_count)
{
// 2.1. 현재 배치 처리할 범위 계산 및 지급할 ItemMetaData를 구성 한다.
int current_batch_count = Math.Min(batch_count, total_count - i);
var current_item_meta_datas = random_picked_item_meta_datas.GetRange(i, current_batch_count);
err_msg = $"Start batch ItemMeta TakeIn !!! - at index {i} with {current_batch_count} items - {player.toBasicString()}";
Log.getLogger().info(err_msg);
// 2.2. 선택된 구간의 ItemMetaData의 아이텝 지급을 시도 한다.
foreach (var each in current_item_meta_datas)
{
var item_count_random = new Random();
var item_meta_id = each.Key;
var item_meta_data = each.Value;
int to_add_count = item_count_random.Next(1, item_meta_data.StackMaxCount); // 1 이상 StackMaxCount이하의 숫자 -> 즉, 1부터 StackMaxCount까지
err_msg = $"Begin - tryTakalbleToBag() : ItemMetaId:{item_meta_id}, toAddCount:{to_add_count} - {player.toBasicString()}";
Log.getLogger().info(err_msg);
(result, var add_or_updated_items) = await inventory_action_base.tryTakalbleToBag((META_ID)item_meta_id, (ushort)to_add_count);
if (result.isFail())
{
err_msg = $"Failed to tryTakalbleToBag() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
err_msg = $"End - tryTakalbleToBag() : ItemMetaId:{item_meta_id}, toAddCount:{to_add_count} - {player.toBasicString()}";
Log.getLogger().info(err_msg);
inventory_action_base.writeLog();
total_items[(META_ID)item_meta_id] = add_or_updated_items;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.CheatCommandItem
, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
err_msg = $"End batch ItemMeta TakeIn !!! - at index {i} with {current_batch_count} items - {player.toBasicString()}";
Log.getLogger().info(err_msg);
}
foreach (var each in total_items)
{
var item_meta_id = each.Key;
var added_or_updated_items = each.Value;
ClientToGame clientToGame = new();
clientToGame.Response = new();
clientToGame.Response.AddItemRes = new();
if(false == MetaData.Instance._ItemTable.TryGetValue((int)item_meta_id, out var itemMetaData) || null == itemMetaData)
{
continue;
}
(result, _, var bag_tab_type) = inventory_action_base.toBagTypeAndTabType(itemMetaData);
clientToGame.Response.AddItemRes.Index = (int)bag_tab_type + 1;
foreach (var item in added_or_updated_items)
{
clientToGame.Response.AddItemRes.Item.Add(item.toItemData4Client());
}
player.sendPacket(clientToGame);
}
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemAddByRandom", fn_item_add_by_random);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
}
inventory_action_base.writeLog();
foreach (var each in total_items)
{
var item_meta_id = each.Key;
await QuestManager.It.QuestCheck(player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.BOUGHT, (int)item_meta_id));
}
}
}
[ChatCommandAttribute("delitembyrandom", typeof(ChatCommandDelItemByRandom), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandDelItemByRandom : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
Log.getLogger().info($"Call delitembyrandom !!! - {player.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
if (args.Length < 1)
{
err_msg = $"Not enough argument !!! : argCount:{args.Length} == 2 - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if (int.TryParse(args[0], out int count) == false)
{
err_msg = $"Invalid argument !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if (count > 1000)
{
err_msg = $"Invalid item random delete count limit over !!! : 1000 >= {count} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var inventory_action_base = player.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action_base, () => $"inventory_action_base is null !! - {player.toBasicString()}");
inventory_action_base.writeLog();
var server_logic = GameServerApp.getServerLogic();
var total_items = new Dictionary<META_ID, List<Item>>();
var fn_item_delete_by_random = async delegate ()
{
var result = new Result();
var err_msg = string.Empty;
var picked_item_metas = new List<ItemMetaData>();
// 1. random 으로 n개의 ItemMetaData 정보를 얻는다.
var item_meta_count_random = new Random();
var random_picked_item_meta_datas = MetaData.Instance._ItemTable
.OrderBy(x => item_meta_count_random.Next())
.Take(count)
.ToList();
var batch_count = 100;
var total_count = random_picked_item_meta_datas.Count;
// 2. 추출된 ItemMetaData 정보를 참조하여 모든 아이템을 삭제를 시도 한다.
for (int i = 0; i < total_count; i += batch_count)
{
// 2.1. 현재 배치 처리할 범위 계산 및 지급할 ItemMetaData를 구성 한다.
int current_batch_count = Math.Min(batch_count, total_count - i);
var current_item_meta_datas = random_picked_item_meta_datas.GetRange(i, current_batch_count);
err_msg = $"Start batch ItemMeta TakeOut !!! - at index {i} with {current_batch_count} items - {player.toBasicString()}";
Log.getLogger().info(err_msg);
// 2.2. 선택된 ItemMetaData의 아이텝 삭제를 시도 한다.
foreach (var each in current_item_meta_datas)
{
var item_count_random = new Random();
var item_meta_id = each.Key;
var item_meta_data = each.Value;
var has_count = inventory_action_base.getItemCountAllByMetaId((META_ID)item_meta_id);
var max_random = has_count > item_meta_data.StackMaxCount ? has_count : item_meta_data.StackMaxCount;
var to_delete_count = item_count_random.Next(1, max_random); // 1 이상 max_random 이하의 숫자 -> 즉, 1부터 max_random까지
err_msg = $"Begin - tryDeleteItemByMetaId() : ItemMetaId:{item_meta_id}, toDeleteCount:{to_delete_count} - {player.toBasicString()}";
Log.getLogger().info(err_msg);
(result, var deleted_items) = await inventory_action_base.tryDeleteItemByMetaId((META_ID)item_meta_id, (ushort)to_delete_count);
if (result.isFail())
{
err_msg = $"Failed to tryDeleteItemByMetaId() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
err_msg = $"End - tryDeleteItemByMetaId() : ItemMetaId:{item_meta_id}, toAddCount:{to_delete_count} - {player.toBasicString()}";
Log.getLogger().info(err_msg);
inventory_action_base.writeLog();
total_items[(META_ID)item_meta_id] = deleted_items;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.CheatCommandItem
, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
err_msg = $"End batch ItemMeta TakeOut !!! - at index {i} with {current_batch_count} items - {player.toBasicString()}";
Log.getLogger().info(err_msg);
}
foreach (var each in total_items)
{
var item_meta_id = each.Key;
var deleted_items = each.Value;
ClientToGame clientToGame = new();
clientToGame.Response = new();
clientToGame.Response.RemoveItemsRes = new();
if (false == MetaData.Instance._ItemTable.TryGetValue((int)item_meta_id, out var itemMetaData) || null == itemMetaData) continue;
(result, _, var bag_tab_type) = inventory_action_base.toBagTypeAndTabType(itemMetaData);
clientToGame.Response.AddItemRes.Index = (int)bag_tab_type + 1;
foreach (var item in deleted_items)
{
clientToGame.Response.RemoveItemsRes.Item.Add(item.toItemData4Client());
}
player.sendPacket(clientToGame);
}
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemDeleteByRandom", fn_item_delete_by_random);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
}
inventory_action_base.writeLog();
}
}

View File

@@ -0,0 +1,147 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameReq.Types;
using static ClientToGameRes.Types;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.BuyItemReq), typeof(BuyItemPacketHandler), typeof(GameLoginListener))]
public class BuyItemPacketHandler : PacketRecvHandler
{
private static void send_S2C_ACK_BUY_ITEM(Player player, Result result)
{
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!! - {player.toBasicString()}");
var ack_packet = new ClientToGame
{
Response = new ClientToGameRes
{
ErrorCode = result.ErrorCode,
BuyItemRes = new ClientToGameRes.Types.BuyItemRes()
}
};
var item_buy_action = player.getEntityAction<ItemBuyAction>();
NullReferenceCheckHelper.throwIfNull(item_buy_action, () => $"item_buy_action is null !!! - {player.toBasicString()}");
if (result.isSuccess())
{
// 구매 아이템 리스트 획득
var buy_items = item_buy_action.BuyItems;
if (null != buy_items)
{
foreach (var item in buy_items.Select(info => info.toItemData4Client()))
{
ack_packet.Response.BuyItemRes.Item.Add(item);
}
}
// char info 획득
var account_attribute = player.getOriginEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var level_attribute = player.getOriginEntityAttribute<LevelAttribute>();
NullReferenceCheckHelper.throwIfNull(level_attribute, () => $"level_attribute is null !!! - {player.toBasicString()}");
var money_attribute = player.getOriginEntityAttribute<MoneyAttribute>();
NullReferenceCheckHelper.throwIfNull(money_attribute, () => $"money_attribute is null !!! - {player.toBasicString()}");
var nickname_attribute = player.getOriginEntityAttribute<NicknameAttribute>();
NullReferenceCheckHelper.throwIfNull(nickname_attribute, () => $"nickname_attribute is null !!! - {player.toBasicString()}");
var char_info = new CharInfo
{
Level = (int)level_attribute.Level,
Exp = (int)level_attribute.Exp,
Gold = money_attribute.Gold,
Sapphire = money_attribute.Sapphire,
Calium = money_attribute.Calium,
Ruby = money_attribute.Ruby,
Usergroup = account_attribute.AuthAdminLevelType.ToString(),
Operator = (int)account_attribute.AuthAdminLevelType,
DisplayName = nickname_attribute.Nickname,
LanguageInfo = (int)account_attribute.LanguageType,
IsIntroComplete = 1
};
ack_packet.Response.BuyItemRes.CurrencyInfo = char_info;
}
GameServerApp.getServerLogic().onSendPacket(player, ack_packet);
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
{
var result = new Result();
string err_msg;
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.BuyItemReq;
NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}");
var fn_item_buy = async delegate ()
{
var result = new Result();
var item_buy_action = player.getEntityAction<ItemBuyAction>();
NullReferenceCheckHelper.throwIfNull(item_buy_action, () => $"item_buy_action is null !!! - {player.toBasicString()}");
result = await item_buy_action.tryBuyItem((uint)request.ItemId, request.Count);
if (result.isFail())
{
err_msg = $"Failed to tryBuyItem() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
send_S2C_ACK_BUY_ITEM(player, result);
return result;
}
// 3. DB 갱신
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.ItemBuy
, GameServerApp.getServerLogic().getDynamoDbClient()
, true);
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
send_S2C_ACK_BUY_ITEM(player, result);
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "ItemBuy", fn_item_buy);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
await QuestManager.It.QuestCheck(player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.BOUGHT, request.ItemId));
return result;
}
}

View File

@@ -0,0 +1,156 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameReq.Types;
using static ClientToGameRes.Types;
using ITEM_GUID = System.String;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(RemoveItemReq), typeof(ItemDeletePacketHandler), typeof(GameLoginListener))]
public class ItemDeletePacketHandler : PacketRecvHandler
{
public override async Task onProcessPacketException( ISession entityWithSession, IMessage recvMessage
, Result errorResult)
{
await Task.CompletedTask;
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
send_S2C_ACK_ITEM_DELETE(player, errorResult);
}
public static bool send_S2C_ACK_ITEM_DELETE(Player owner, Result result, Item? removedItem = null)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.RemoveItemRes = new RemoveItemRes();
if(result.isSuccess())
{
ArgumentNullReferenceCheckHelper.throwIfNull(removedItem, () => $"removedItem is null !!! - {owner.toBasicString()}");
var item_attribute = removedItem.getOriginEntityAttribute<ItemAttributeBase>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}");
ack_packet.Response.RemoveItemRes.ItemGuid = item_attribute.ItemGuid;
ack_packet.Response.RemoveItemRes.Count = item_attribute.ItemStackCount;
}
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
{
return false;
}
return true;
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
{
var result = new Result();
var err_msg = string.Empty;
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var recv_msg = recvMessage as ClientToGame;
ArgumentNullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.RemoveItemReq;
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
(result, Item? removed_item) = await tryDeleteItemWithTransactionRunner( player, request.ItemGuid, (ushort)request.Count
, LogActionType.ItemDestroyByUser );
if(result.isFail())
{
send_S2C_ACK_ITEM_DELETE(player, result);
return result;
}
NullReferenceCheckHelper.throwIfNull(removed_item, () => $"removed_item is null !!! - {player.toBasicString()}");
send_S2C_ACK_ITEM_DELETE(player, result, removed_item);
return result;
}
public static async Task<(Result, Item?)> tryDeleteItemWithTransactionRunner( Player player
, ITEM_GUID toDeleteItemGuid, ushort toDeletedCount
, LogActionType logActionType )
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
Item? removed_item = null;
var fn_item_delete = async delegate ()
{
var result = new Result();
var inventory_action = player.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory action is null !!! - {player.toBasicString()}");
(result, removed_item) = await inventory_action.tryDeleteItemByGuid(toDeleteItemGuid, toDeletedCount);
if (result.isFail())
{
err_msg = $"Failed to tryDeleteItemByGuid() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, logActionType
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "ItemDelete", fn_item_delete);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null);
}
if (removed_item != null)
{
var item_meta = removed_item.getItemMeta();
if(null == item_meta)
{
err_msg = $"Not found ItemMeta !!!, in tryDeleteItemWithTransactionRunner() !!! : ItemGuid:{toDeleteItemGuid}, count:{toDeletedCount} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
await QuestManager.It.QuestCheck(player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.DELETED, item_meta.ItemId));
}
}
return (result, removed_item);
}
}

View File

@@ -0,0 +1,165 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameReq.Types;
using static ClientToGameRes.Types;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(UseItemReq), typeof(ItemUsePacketHandler), typeof(GameLoginListener))]
public class ItemUsePacketHandler : PacketRecvHandler
{
public static bool send_S2C_ACK_ITEM_USE(Player owner, Result result, Item? updatedItem = null)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.UseItemRes = new UseItemRes();
if (result.isSuccess())
{
ArgumentNullReferenceCheckHelper.throwIfNull(updatedItem, () => $"updatedItem is null !!! - {owner.toBasicString()}");
var item_attribute_base = updatedItem.getEntityAttribute<ItemAttributeBase>();
NullReferenceCheckHelper.throwIfNull(item_attribute_base, () => $"item_attribute_base is null !!! - {owner.toBasicString()}");
ack_packet.Response.UseItemRes.ItemGuid = item_attribute_base.ItemGuid;
ack_packet.Response.UseItemRes.Count = item_attribute_base.ItemStackCount;
var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents);
if (null == found_transaction_runner)
{
var err_msg = $"Not found TransactionRunner !!! : {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
ack_packet.Response.UseItemRes.CommonResult = found_transaction_runner.getCommonResult();
}
}
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
{
return false;
}
return true;
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
{
var result = new Result();
var err_msg = string.Empty;
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var recv_msg = recvMessage as ClientToGame;
ArgumentNullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.UseItemReq;
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
var inventory_action = player.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {player.toBasicString()} ");
MetaAssets.ItemMetaData? item_meta = null;
var fn_item_use = async delegate ()
{
var result = new Result();
(result, var used_item) = await inventory_action.tryUseItemByGuid(request.ItemGuid, (ushort)request.Count);
if (result.isFail() || null == used_item)
{
err_msg = $"Failed to tryUseItemByGuid() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
send_S2C_ACK_ITEM_USE(player, result);
return result;
}
item_meta = used_item.getItemMeta();
NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {player.toBasicString()} ");
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.ItemUse
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
var invokers = MakeItemUseIogInvoker(item_meta, request.Count);
batch.appendBusinessLogs(invokers);
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
player.sendNotifyMessage();
send_S2C_ACK_ITEM_USE(player, result, used_item);
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "ItemUse", fn_item_use);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {player.toBasicString()} ");
if (item_meta.TypeLarge == EItemLargeType.EXPENDABLE)
{
if (item_meta.TypeSmall == EItemSmallType.REGISTER_ITEM_SOCIAL_ACTION || item_meta.TypeSmall == EItemSmallType.REGISTER_ITEM_INTERIOR)
{
await QuestManager.It.QuestCheck(player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.REGISTERED, item_meta.ItemId));
}
}
return result;
}
public List<ILogInvoker> MakeItemUseIogInvoker(ItemMetaData item_meta_data, int count)
{
var result = new Result();
var err_msg = string.Empty;
var invokers = new List<ILogInvoker>();
switch(item_meta_data.TypeSmall)
{
case EItemSmallType.REGISTER_ITEM_SOCIAL_ACTION:
{
var social_action_log_info = SocialActionBusinessLogHelper.toSocialActionLogInfo(item_meta_data.Register_id);
var social_action_business_log = new SocialActionBusinessLog(social_action_log_info);
invokers.Add(social_action_business_log);
}
break;
case EItemSmallType.RECIPE:
var task_log_data = CraftBusinessLogHelper.toCraftRecipeLogInfo(item_meta_data.Register_id);
invokers.Add(new CraftRecipeBusinessLog(task_log_data));
break;
default:
return invokers;
}
return invokers;
}
}

View File

@@ -0,0 +1,139 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameReq.Types;
using static ClientToGameRes.Types;
using ITEM_GUID = System.String;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.UseMegaPhoneItemReq), typeof(UseMegaPhoneItemPacketHandler), typeof(GameLoginListener))]
public class UseMegaPhoneItemPacketHandler : PacketRecvHandler
{
public static bool send_S2C_ACK_USE_MEGAPHONE_ITEM(Player player, Result result, ITEM_GUID used_item_guid, Int32 left_count)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.UseMegaPhoneItemRes = new();
ack_packet.Response.UseMegaPhoneItemRes.ItemGuid = used_item_guid;
ack_packet.Response.UseMegaPhoneItemRes.Count = left_count;
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
{
return false;
}
return true;
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
{
var player = entityWithSession as Player;
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var req_msg = recvMessage as ClientToGame;
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
var request = req_msg.Request.UseMegaPhoneItemReq;
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var inventory_action = player.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {player.toBasicString()}");
var item = inventory_action.tryGetItemByItemGuid(request.ItemGuid);
if(item == null)
{
err_msg = $"Failed to find item : {request.ItemGuid}";
result.setFail(ServerErrorCode.ItemNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var item_data = item.getItemMeta();
if (item_data == null)
{
err_msg = $"Failed to find item meta : {request.ItemGuid}";
result.setFail(ServerErrorCode.ItemMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
if (item_data.TypeLarge != MetaAssets.EItemLargeType.EXPENDABLE || item_data.TypeSmall != MetaAssets.EItemSmallType.MEGAPHONE)
{
err_msg = $"Invalid ItemType. TypeLarge : {item_data.TypeLarge}, TypeSmall : {item_data.TypeSmall} {request.ItemGuid}";
result.setFail(ServerErrorCode.ItemInvalidItemType, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var fn_use_mega_phone = async delegate ()
{
var result = new Result();
(result, Item? removed_item) = await inventory_action.tryDeleteItemByGuid(request.ItemGuid, 1);
if (result.isFail())
{
err_msg = $"Failed to tryDeleteItemByGuid() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
send_S2C_ACK_USE_MEGAPHONE_ITEM(player, result, "", 0);
return result;
}
NullReferenceCheckHelper.throwIfNull(removed_item, () => $"removed_item is null !!! - {player.toBasicString()}");
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.ItemUse
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
var removed_item_attribute = removed_item.getEntityAttribute<ItemAttributeBase>();
NullReferenceCheckHelper.throwIfNull(removed_item_attribute, () => $"removed_item_attribute is null !!! - {player.toBasicString()}");
send_S2C_ACK_USE_MEGAPHONE_ITEM(player, result, removed_item_attribute.ItemGuid, removed_item_attribute.ItemStackCount);
var receivers = server_logic.getPlayerManager().getUsers();
foreach (var receiver in receivers)
{
ChatNotifyHelper.send_S2C_NTF_CHAT(receiver.Value, ChatType.Channel, player.getUserNickname(), receiver.Value.getUserNickname(), PlayerStateType.None, request.Message);
}
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UseMegaPhone", fn_use_mega_phone);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
}

View File

@@ -0,0 +1,158 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameReq.Types;
using static ClientToGameRes.Types;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(UseRandomBoxItemReq), typeof(UseRandomBoxItemPacketHandler), typeof(GameLoginListener))]
internal class UseRandomBoxItemPacketHandler : PacketRecvHandler
{
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
{
var player = session as Player;
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var req_msg = recvMessage as ClientToGame;
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
var request = req_msg.Request.UseRandomBoxItemReq;
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
var result = new Result();
var item_guid = request.ItemGuid;
#pragma warning disable CS0219 // 변수가 할당되었지만 해당 값이 사용되지 않았습니다.
ushort num = 1;
#pragma warning restore CS0219 // 변수가 할당되었지만 해당 값이 사용되지 않았습니다.
var server_logic = GameServerApp.getServerLogic();
ArgumentNullException.ThrowIfNull(server_logic);
var random_box_action = player.getEntityAction<RandomBoxItemUseAction>();
NullReferenceCheckHelper.throwIfNull(random_box_action, () => $"random_box_action is null !!! - {player.toBasicString()}");
RandomBoxItemReference random_box_item_ref = new();
random_box_item_ref.m_item_guid = item_guid;
result = random_box_action.conditionCheck(ref random_box_item_ref);
if (result.isFail())
{
send_S2C_ACK_RANDOM_BOX_ITEM_FAIL(player, result);
return result;
}
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "RandomBoxItemUse", delegateRandomBoxItemUse);
if (result.isFail())
{
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
send_S2C_ACK_RANDOM_BOX_ITEM_FAIL(player, result);
return result;
}
send_S2C_ACK_RANDOM_BOX_ITEM(player, result, random_box_item_ref);
return result;
async Task<Result> delegateRandomBoxItemUse() => await randomBoxItemUse(player, random_box_item_ref);
}
private async Task<Result> randomBoxItemUse(Player player, RandomBoxItemReference randomBoxItemRef)
{
var result = new Result();
var random_box_action = player.getEntityAction<RandomBoxItemUseAction>();
NullReferenceCheckHelper.throwIfNull(random_box_action, () => $"random_box_action is null !!! - {player.toBasicString()}");
result = await random_box_action.deleteRandomBox(randomBoxItemRef);
if (result.isFail()) return result;
var gacha_data = randomBoxItemRef.m_gacha_data;
ArgumentNullReferenceCheckHelper.throwIfNull(gacha_data, () => $"gacha_data is null !!! - {player.toBasicString()}");
var gacha = gacha_data.getRandomReward();
randomBoxItemRef.m_rewards.Add(gacha.Reward);
result = await random_box_action.getGachaReward(randomBoxItemRef);
if (result.isFail()) return result;
var server_logic = GameServerApp.getServerLogic();
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.ItemRandomBoxUse, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
var deleted_item = randomBoxItemRef.m_deleted_item_nullable;
ArgumentNullReferenceCheckHelper.throwIfNull(deleted_item, () => $"deleted_item is null !!! - {player.toBasicString()}");
var item_meta = deleted_item.getItemMeta();
ArgumentNullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {player.toBasicString()}");
var info = new RandomBoxItemUseInfo(randomBoxItemRef.m_item_guid, item_meta.ItemId, 1, gacha);
var invoker = new RandomBoxItemUseBusinessLog(info);
batch.appendBusinessLog(invoker);
result = await QueryHelper.sendQueryAndBusinessLog(batch);
var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
var common_result = found_transaction_runner.getCommonResult();
randomBoxItemRef.m_common_result = common_result;
return result;
}
public static bool send_S2C_ACK_RANDOM_BOX_ITEM_FAIL(Player owner, Result result)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.UseRandomBoxItemRes = new();
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
return true;
}
public static bool send_S2C_ACK_RANDOM_BOX_ITEM(Player owner, Result result, RandomBoxItemReference random_box_item_ref)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.UseRandomBoxItemRes = new();
ack_packet.Response.UseRandomBoxItemRes.CommonResult = random_box_item_ref.m_common_result;
//var rewarded_items = random_box_item_ref.m_rewarded_items;
//var rewarded_money = random_box_item_ref.m_rewarded_money;
//var items = RewardManager.Instance.convertItemAndMoneyToItem(rewarded_items, rewarded_money);
//ack_packet.Response.UseRandomBoxItemRes.Items.AddRange(items);
//var deleted_refactoring_items = new List<Item>();
//if (null != random_box_item_ref.m_deleted_item_nullable)
//{
// deleted_refactoring_items.Add(random_box_item_ref.m_deleted_item_nullable);
//}
//var deleted_items = RewardManager.Instance.convertItemAndMoneyToItem(deleted_refactoring_items, new());
//ack_packet.Response.UseRandomBoxItemRes.Items.AddRange(deleted_items);
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
return true;
}
}