초기커밋
This commit is contained in:
179
GameServer/Contents/ItemFunction/Action/ItemBuyAction.cs
Normal file
179
GameServer/Contents/ItemFunction/Action/ItemBuyAction.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
374
GameServer/Contents/ItemFunction/Action/ItemUseAction.cs
Normal file
374
GameServer/Contents/ItemFunction/Action/ItemUseAction.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
46
GameServer/Contents/ItemFunction/Helper/ItemNotifyHelper.cs
Normal file
46
GameServer/Contents/ItemFunction/Helper/ItemNotifyHelper.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
374
GameServer/Contents/ItemFunction/ItemCheat.cs
Normal file
374
GameServer/Contents/ItemFunction/ItemCheat.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
324
GameServer/Contents/ItemFunction/ItemStressCheat.cs
Normal file
324
GameServer/Contents/ItemFunction/ItemStressCheat.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user