diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index 2e1ad688..0940c40f 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -93,6 +93,7 @@ enum ClientTrigger SomeDirectorEvent = 0x328, // unsure what exactly triggers it, starts director when returning to instance though EnterTerritoryEventFinished = 0x330, + RequestInstanceLeave = 0x330, // df menu button AchievementCritReq = 0x3E8, AchievementList = 0x3E9, @@ -107,174 +108,174 @@ enum ClientTrigger void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& inPacket, Entity::Player& player ) { - auto pLog = g_fw.get< Logger >(); - uint16_t commandId = inPacket.getValAt< uint16_t >( 0x20 ); - uint64_t param1 = inPacket.getValAt< uint64_t >( 0x24 ); - uint32_t param11 = inPacket.getValAt< uint32_t >( 0x24 ); - uint32_t param12 = inPacket.getValAt< uint32_t >( 0x28 ); - uint32_t param2 = inPacket.getValAt< uint32_t >( 0x2C ); - uint64_t param3 = inPacket.getValAt< uint64_t >( 0x38 ); + auto pLog = g_fw.get< Logger >(); + uint16_t commandId = inPacket.getValAt< uint16_t >( 0x20 ); + uint64_t param1 = inPacket.getValAt< uint64_t >( 0x24 ); + uint32_t param11 = inPacket.getValAt< uint32_t >( 0x24 ); + uint32_t param12 = inPacket.getValAt< uint32_t >( 0x28 ); + uint32_t param2 = inPacket.getValAt< uint32_t >( 0x2C ); + uint64_t param3 = inPacket.getValAt< uint64_t >( 0x38 ); - pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " + - boost::str( boost::format( "%|04X|" ) % ( uint32_t ) ( commandId & 0xFFFF ) ) + - "\nparam1: " + boost::str( boost::format( "%|016X|" ) % ( uint64_t ) ( param1 & 0xFFFFFFFFFFFFFFF ) ) + - "\nparam2: " + boost::str( boost::format( "%|08X|" ) % ( uint32_t ) ( param2 & 0xFFFFFFFF ) ) + - "\nparam3: " + boost::str( boost::format( "%|016X|" ) % ( uint64_t ) ( param3 & 0xFFFFFFFFFFFFFFF ) ) - ); + pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " + + boost::str( boost::format( "%|04X|" ) % ( uint32_t ) ( commandId & 0xFFFF ) ) + + "\nparam1: " + boost::str( boost::format( "%|016X|" ) % ( uint64_t ) ( param1 & 0xFFFFFFFFFFFFFFF ) ) + + "\nparam2: " + boost::str( boost::format( "%|08X|" ) % ( uint32_t ) ( param2 & 0xFFFFFFFF ) ) + + "\nparam3: " + boost::str( boost::format( "%|016X|" ) % ( uint64_t ) ( param3 & 0xFFFFFFFFFFFFFFF ) ) + ); - //g_log.Log(LoggingSeverity::debug, "[" + std::to_string(m_pSession->getId()) + "] " + pInPacket->toString()); + //g_log.Log(LoggingSeverity::debug, "[" + std::to_string(m_pSession->getId()) + "] " + pInPacket->toString()); - switch( commandId ) - { - case ClientTrigger::ToggleSeathe: // Toggle sheathe - { - if ( param11 == 1 ) - player.setStance( Entity::Chara::Stance::Active ); - else - { - player.setStance( Entity::Chara::Stance::Passive ); - player.setAutoattack( false ); - } + switch( commandId ) + { + case ClientTrigger::ToggleSeathe: // Toggle sheathe + { + if ( param11 == 1 ) + player.setStance( Entity::Chara::Stance::Active ); + else + { + player.setStance( Entity::Chara::Stance::Passive ); + player.setAutoattack( false ); + } - player.sendToInRangeSet( ActorControlPacket142( player.getId(), 0, param11, 1 ) ); + player.sendToInRangeSet( ActorControlPacket142( player.getId(), 0, param11, 1 ) ); - break; - } - case ClientTrigger::ToggleAutoAttack: // Toggle auto-attack - { - if ( param11 == 1 ) - { - player.setAutoattack( true ); - player.setStance( Entity::Chara::Stance::Active ); - } - else - player.setAutoattack( false ); - - player.sendToInRangeSet( ActorControlPacket142( player.getId(), 1, param11, 1 ) ); - - break; - } - case ClientTrigger::ChangeTarget: // Change target - { - - uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 ); - player.changeTarget( targetId ); - break; - } - case ClientTrigger::Dismount: - { - player.dismount(); - break; - } - case ClientTrigger::RemoveStatusEffect: // Remove status (clicking it off) - { - // todo: check if status can be removed by client from exd - player.removeSingleStatusEffectById( static_cast< uint32_t >( param1 ) ); - break; - } - case ClientTrigger::CastCancel: // Cancel cast - { - if( player.getCurrentAction() ) - player.getCurrentAction()->setInterrupted(); - break; - } - case ClientTrigger::MarkPlayer: // Mark player - { - break; - } - case ClientTrigger::SetTitle: // Set player title - { - player.setTitle( static_cast< uint16_t >( param1 ) ); - break; - } - case ClientTrigger::TitleList: // Get title list - { - player.sendTitleList(); - break; - } - case ClientTrigger::UpdatedSeenHowTos: // Update howtos seen - { - uint32_t howToId = param11; - player.updateHowtosSeen( howToId ); - break; - } - case ClientTrigger::Emote: // emote - { - uint64_t targetId = player.getTargetId(); - uint32_t emoteId = inPacket.getValAt< uint32_t >( 0x24 ); - - player.emote( emoteId, targetId ); - break; - } - case ClientTrigger::PersistantEmoteCancel: // cancel persistant emote - { - break; - } - case ClientTrigger::PoseChange: // change pose - { - break; - } - case ClientTrigger::PoseReapply: // reapply pose - { - break; - } - case ClientTrigger::PoseCancel: // cancel pose - { - break; - } - case ClientTrigger::Return: // return dead / accept raise - { - switch ( static_cast < ResurrectType >( param1 ) ) - { - case ResurrectType::RaiseSpell: - // todo: handle raise case (set position to raiser, apply weakness status, set hp/mp/tp as well as packet) - player.returnToHomepoint(); - break; - case ResurrectType::Return: - player.returnToHomepoint(); - break; - default: - break; - } - - } - case ClientTrigger::FinishZoning: // Finish zoning - { - player.finishZoning(); - break; - } - - case ClientTrigger::Teleport: // Teleport - { - - player.teleportQuery( param11 ); - break; - } - case ClientTrigger::DyeItem: // Dye item - { - break; - } - case ClientTrigger::DirectorInitFinish: // Director init finish - { - player.getCurrentZone()->onInitDirector( player ); - break; - } - case ClientTrigger::SomeDirectorEvent: // Director init finish - { - player.getCurrentZone()->onSomeDirectorEvent( player ); break; - } - case ClientTrigger::EnterTerritoryEventFinished:// this may still be something else. I think i have seen it elsewhere - { - player.setOnEnterEventDone( true ); - break; - } - default: - { - pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " + - boost::str( boost::format( "%|04X|" ) % (uint32_t) ( commandId & 0xFFFF ) ) ); - break; - } - } + } + case ClientTrigger::ToggleAutoAttack: // Toggle auto-attack + { + if ( param11 == 1 ) + { + player.setAutoattack( true ); + player.setStance( Entity::Chara::Stance::Active ); + } + else + player.setAutoattack( false ); + + player.sendToInRangeSet( ActorControlPacket142( player.getId(), 1, param11, 1 ) ); + + break; + } + case ClientTrigger::ChangeTarget: // Change target + { + + uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 ); + player.changeTarget( targetId ); + break; + } + case ClientTrigger::Dismount: + { + player.dismount(); + break; + } + case ClientTrigger::RemoveStatusEffect: // Remove status (clicking it off) + { + // todo: check if status can be removed by client from exd + player.removeSingleStatusEffectById( static_cast< uint32_t >( param1 ) ); + break; + } + case ClientTrigger::CastCancel: // Cancel cast + { + if( player.getCurrentAction() ) + player.getCurrentAction()->setInterrupted(); + break; + } + case ClientTrigger::MarkPlayer: // Mark player + { + break; + } + case ClientTrigger::SetTitle: // Set player title + { + player.setTitle( static_cast< uint16_t >( param1 ) ); + break; + } + case ClientTrigger::TitleList: // Get title list + { + player.sendTitleList(); + break; + } + case ClientTrigger::UpdatedSeenHowTos: // Update howtos seen + { + uint32_t howToId = param11; + player.updateHowtosSeen( howToId ); + break; + } + case ClientTrigger::Emote: // emote + { + uint64_t targetId = player.getTargetId(); + uint32_t emoteId = inPacket.getValAt< uint32_t >( 0x24 ); + + player.emote( emoteId, targetId ); + break; + } + case ClientTrigger::PersistantEmoteCancel: // cancel persistant emote + { + break; + } + case ClientTrigger::PoseChange: // change pose + { + break; + } + case ClientTrigger::PoseReapply: // reapply pose + { + break; + } + case ClientTrigger::PoseCancel: // cancel pose + { + break; + } + case ClientTrigger::Return: // return dead / accept raise + { + switch ( static_cast < ResurrectType >( param1 ) ) + { + case ResurrectType::RaiseSpell: + // todo: handle raise case (set position to raiser, apply weakness status, set hp/mp/tp as well as packet) + player.returnToHomepoint(); + break; + case ResurrectType::Return: + player.returnToHomepoint(); + break; + default: + break; + } + + } + case ClientTrigger::FinishZoning: // Finish zoning + { + player.finishZoning(); + break; + } + + case ClientTrigger::Teleport: // Teleport + { + + player.teleportQuery( param11 ); + break; + } + case ClientTrigger::DyeItem: // Dye item + { + break; + } + case ClientTrigger::DirectorInitFinish: // Director init finish + { + player.getCurrentZone()->onInitDirector( player ); + break; + } + case ClientTrigger::SomeDirectorEvent: // Director init finish + { + player.getCurrentZone()->onSomeDirectorEvent( player ); + break; + } + case ClientTrigger::EnterTerritoryEventFinished:// this may still be something else. I think i have seen it elsewhere + { + player.setOnEnterEventDone( true ); + break; + } + default: + { + pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " + + boost::str( boost::format( "%|04X|" ) % (uint32_t) ( commandId & 0xFFFF ) ) ); + break; + } + } }