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