166 lines
6.3 KiB
C#
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;
|
|
}
|
|
}
|