using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_ENTITY_STATE_DANCE_END), typeof(EntityStateDanceEndPacketHandler), typeof(GameLoginListener))] public class EntityStateDanceEndPacketHandler : PacketRecvHandler { public override async Task onProcessPacket(ISession entityWithSession, IMessage recvMessage) { await Task.CompletedTask; var result = new Result(); var err_msg = string.Empty; var player = entityWithSession as Player; ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var game_msg = recvMessage as ClientToGame; ArgumentNullReferenceCheckHelper.throwIfNull(game_msg, () => $"game_msg is null !!! - {player.toBasicString()}"); var request = game_msg.Request.ReqEntityStateDanceEnd; ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}"); var player_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}"); var selected_character = player_action.getSelectedCharacter(); NullReferenceCheckHelper.throwIfNull(selected_character, () => $"selected_character is null !!! - {player.toBasicString()}"); var character_action = selected_character.getEntityAction(); NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {player.toBasicString()}"); var game_zone_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!"); //var server_logic = GameServerApp.getServerLogic(); var character_attribute = selected_character.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!"); var change_type = EntityStateType.None; character_action.setStateInfo(change_type, "", 0); send_C2GS_ACK_ENTITY_STATE_DANCE_END(player, result); /* 댄스 상태는 휘발성 상태로 판단하여 트랜잭션 처리하지 않고 메모리에서만 판단 추후 사이드 이펙트 있을경우를 대비해 당분간 코드는 주석으로 남겨놓음 25년 2월 이후 삭제 예정 24-12-03 var fn_change_entity_state_type = async delegate() { var character_attribute = selected_character.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!"); //현재 상태가 DANCE가 아닌데 패킷이 오면 예외 처리를 해줘야 되나? 말아야 되나? 일단 해주자. if (character_attribute.StateInfo.StateType != EntityStateType.Dancing) { err_msg = $"Current state is not dancing !!! current State : {character_attribute.StateInfo.StateType}, player : {player.toBasicString()}"; result.setFail(ServerErrorCode.EntityStateNotDancing, err_msg); send_C2GS_ACK_ENTITY_STATE_DANCE_END(player, result); } var change_type = EntityStateType.None; character_action.setStateInfo(change_type, "", 0); character_attribute.modifiedEntityAttribute(); var batch = new QueryBatchEx( player, LogActionType.DanceEntityStateEnd , server_logic.getDynamoDbClient() , true); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } //log 추가 batch.appendBusinessLog(new ChangeDanceEntityStateBusinessLog(EntityStateType.Dancing, change_type, "", 0)); result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { send_C2GS_ACK_ENTITY_STATE_DANCE_END(player, result); return result; } send_C2GS_ACK_ENTITY_STATE_DANCE_END(player, result); return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "ChangeEntityStateType", fn_change_entity_state_type); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}"; ServerCore.Log.getLogger().error(err_msg); return result; }*/ character_action.broadcastCharacterInfo(); var invokers = new List(); var log_action = new LogActionEx(LogActionType.DanceEntityStateEnd); invokers.Add(new ChangeDanceEntityStateBusinessLog(EntityStateType.Dancing, change_type, "", 0)); BusinessLogger.collectLogs(log_action, player, invokers); return result; } public static bool send_C2GS_ACK_ENTITY_STATE_DANCE_END(Player player, Result result) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.AckEntityStateDanceEnd = new(); if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet)) { return false; } return true; } }