Files
2025-05-01 07:20:41 +09:00

166 lines
6.3 KiB
C#

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