diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 03e00b15..b782515b 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -603,7 +603,7 @@ private: uint16_t m_itemLevel; InventoryPtr m_pInventory; - std::map< uint32_t, Event::EventHandlerPtr > m_eventMap; + std::map< uint32_t, Event::EventHandlerPtr > m_eventHandlerMap; std::map< uint32_t, uint8_t > m_playerIdToSpawnIdMap; // maps player to spawn id std::queue< uint8_t > m_freeSpawnIdQueue; // queue with spawn ids free to be assigned std::queue< uint8_t > m_freeHateSlotQueue; // queue with "hate slots" free to be assigned diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index c5bae3e2..571a3d4d 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -34,18 +34,18 @@ using namespace Core::Network::Packets::Server; void Core::Entity::Player::addEvent( Event::EventHandlerPtr pEvent ) { - m_eventMap[pEvent->getId()] = pEvent; + m_eventHandlerMap[pEvent->getId()] = pEvent; } std::map< uint32_t, Core::Event::EventHandlerPtr >& Core::Entity::Player::eventList() { - return m_eventMap; + return m_eventHandlerMap; } Core::Event::EventHandlerPtr Core::Entity::Player::getEvent( uint32_t eventId ) { - auto it = m_eventMap.find( eventId ); - if( it != m_eventMap.end() ) + auto it = m_eventHandlerMap.find( eventId ); + if( it != m_eventHandlerMap.end() ) return it->second; return Event::EventHandlerPtr( nullptr ); @@ -53,16 +53,16 @@ Core::Event::EventHandlerPtr Core::Entity::Player::getEvent( uint32_t eventId ) size_t Core::Entity::Player::getEventCount() { - return m_eventMap.size(); + return m_eventHandlerMap.size(); } void Core::Entity::Player::removeEvent( uint32_t eventId ) { - auto it = m_eventMap.find( eventId ); - if( it != m_eventMap.end() ) + auto it = m_eventHandlerMap.find( eventId ); + if( it != m_eventHandlerMap.end() ) { auto tmpEvent = it->second; - m_eventMap.erase( it ); + m_eventHandlerMap.erase( it ); } } @@ -79,7 +79,7 @@ void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId, Event::EventHandler::EventType eventType, uint8_t eventParam1, uint32_t eventParam2 ) { - Event::EventHandlerPtr newEvent( new Event::EventHandler( actorId, eventId, eventType, eventParam2 ) ); + Event::EventHandlerPtr newEvent( new Event::EventHandler( this, actorId, eventId, eventType, eventParam2 ) ); addEvent( newEvent ); setStateFlag( PlayerStateFlag::Occupied2 ); @@ -184,7 +184,7 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) { case Event::EventHandler::Nest: { - queuePacket( EventFinishPacket( getId(), pEvent->getId(), pEvent->getEventType(), pEvent->getEventParam3() ) ); + queuePacket( EventFinishPacket( getId(), pEvent->getId(), pEvent->getEventType(), pEvent->getEventParam() ) ); removeEvent( pEvent->getId() ); auto events = eventList(); @@ -195,7 +195,8 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) if( it.second->hasPlayedScene() == false ) { // TODO: not happy with this, this is also prone to break wit more than one remaining event in there - queuePacket( EventFinishPacket( getId(), it.second->getId(), it.second->getEventType(), it.second->getEventParam3() ) ); + queuePacket( EventFinishPacket( getId(), it.second->getId(), it.second->getEventType(), + it.second->getEventParam() ) ); removeEvent( it.second->getId() ); } } @@ -204,7 +205,7 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) } default: { - queuePacket( EventFinishPacket( getId(), pEvent->getId(), pEvent->getEventType(), pEvent->getEventParam3() ) ); + queuePacket( EventFinishPacket( getId(), pEvent->getId(), pEvent->getEventType(), pEvent->getEventParam() ) ); break; } } diff --git a/src/servers/sapphire_zone/Event/EventHandler.cpp b/src/servers/sapphire_zone/Event/EventHandler.cpp index f863c6e3..e4ab39cf 100644 --- a/src/servers/sapphire_zone/Event/EventHandler.cpp +++ b/src/servers/sapphire_zone/Event/EventHandler.cpp @@ -1,6 +1,7 @@ #include "EventHandler.h" -Core::Event::EventHandler::EventHandler( uint64_t actorId, uint32_t eventId, EventType eventType, uint32_t eventParam3 ) : +Core::Event::EventHandler::EventHandler( Entity::Player* pOwner, uint64_t actorId, uint32_t eventId, EventType eventType, uint32_t eventParam ) : + m_pOwner( pOwner ), m_actorId( actorId ), m_eventId( eventId ), m_eventType( eventType ), @@ -9,7 +10,7 @@ Core::Event::EventHandler::EventHandler( uint64_t actorId, uint32_t eventId, Eve m_entryId = static_cast< uint16_t >( eventId ); m_type = static_cast< uint16_t >( eventId >> 16 ); - m_eventParam3 = eventParam3; + m_eventParam = eventParam; m_callback = nullptr; } @@ -39,9 +40,9 @@ uint16_t Core::Event::EventHandler::getEntryId() const return m_entryId; } -uint32_t Core::Event::EventHandler::getEventParam3() const +uint32_t Core::Event::EventHandler::getEventParam() const { - return m_eventParam3; + return m_eventParam; } Core::Event::EventHandler::SceneReturnCallback Core::Event::EventHandler::getEventReturnCallback() const @@ -63,3 +64,14 @@ void Core::Event::EventHandler::setPlayedScene( bool playedScene ) { m_playedScene = playedScene; } + +bool Core::Event::EventHandler::hasNestedEvent() const +{ + return m_pNestedEvent != nullptr; +} + +void Core::Event::EventHandler::removeNestedEvent() +{ + + m_pNestedEvent.reset(); +} diff --git a/src/servers/sapphire_zone/Event/EventHandler.h b/src/servers/sapphire_zone/Event/EventHandler.h index 5720d6f9..aa90b3ac 100644 --- a/src/servers/sapphire_zone/Event/EventHandler.h +++ b/src/servers/sapphire_zone/Event/EventHandler.h @@ -39,6 +39,7 @@ namespace Core { { Quest = 0x0001, Warp = 0x0002, + Unknown = 0x0003, // Came up in the client with "Begin" unsure that means Shop = 0x0004, Aetheryte = 0x0005, GuildLeveAssignment = 0x0006, @@ -64,7 +65,7 @@ namespace Core { using SceneReturnCallback = std::function< void( Entity::Player&, uint32_t, uint16_t, uint16_t, uint16_t ) > ; - EventHandler( uint64_t actorId, uint32_t eventId, EventType eventType, uint32_t eventParam3 ); + EventHandler( Entity::Player* pOwner, uint64_t actorId, uint32_t eventId, EventType eventType, uint32_t eventParam ); ~EventHandler() {} @@ -78,7 +79,7 @@ namespace Core { uint8_t getEventType() const; - uint32_t getEventParam3() const; + uint32_t getEventParam() const; bool hasPlayedScene() const; @@ -88,15 +89,21 @@ namespace Core { void setEventReturnCallback( SceneReturnCallback callback ); + bool hasNestedEvent() const; + + void removeNestedEvent(); + protected: + Entity::Player* m_pOwner; uint64_t m_actorId; uint32_t m_eventId; uint16_t m_entryId; uint16_t m_type; uint8_t m_eventType; - uint32_t m_eventParam3; + uint32_t m_eventParam; + EventHandlerPtr m_pNestedEvent; bool m_playedScene; SceneReturnCallback m_callback; }; diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index 50acbf3f..a077d3a3 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -75,7 +75,7 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, setZoneHandler( ClientZoneIpcType::InventoryModifyHandler,"InventoryModifyHandler", &GameConnection::inventoryModifyHandler ); - setZoneHandler( ClientZoneIpcType::TalkEventHandler, "EventHandler", &GameConnection::eventHandler ); + setZoneHandler( ClientZoneIpcType::TalkEventHandler, "EventHandlerTalk", &GameConnection::eventHandlerTalk ); setZoneHandler( ClientZoneIpcType::EmoteEventHandler, "EventHandler", &GameConnection::eventHandler ); setZoneHandler( ClientZoneIpcType::WithinRangeEventHandler, "EventHandler", &GameConnection::eventHandler ); setZoneHandler( ClientZoneIpcType::OutOfRangeEventHandler, "EventHandler", &GameConnection::eventHandler ); diff --git a/src/servers/sapphire_zone/Network/GameConnection.h b/src/servers/sapphire_zone/Network/GameConnection.h index 2d283067..8d38896f 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.h +++ b/src/servers/sapphire_zone/Network/GameConnection.h @@ -100,6 +100,8 @@ public: DECLARE_HANDLER( inventoryModifyHandler ); DECLARE_HANDLER( discoveryHandler ); DECLARE_HANDLER( eventHandler ); + DECLARE_HANDLER( eventHandlerTalk ); + DECLARE_HANDLER( logoutHandler ); DECLARE_HANDLER( cfDutyInfoRequest ); diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 54875ca5..44ad1319 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -20,6 +21,7 @@ #include "Forwards.h" #include "Event/EventHelper.h" +extern Core::Data::ExdData g_exdData; extern Core::Scripting::ScriptManager g_scriptMgr; using namespace Core::Common; @@ -49,12 +51,7 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP case ClientZoneIpcType::TalkEventHandler: // Talk event { - uint64_t actorId = inPacket.getValAt< uint64_t >( 0x20 ); - uint32_t eventId = inPacket.getValAt< uint32_t >( 0x28 ); - if( !g_scriptMgr.onTalk( player, actorId, eventId ) ) - abortEventFunc( player, actorId, eventId ); - break; } case ClientZoneIpcType::EmoteEventHandler: // Emote event @@ -152,6 +149,44 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP } +void Core::Network::GameConnection::eventHandlerTalk( const Packets::GamePacket& inPacket, Entity::Player& player ) +{ + + auto actorId = inPacket.getValAt< uint64_t >( 0x20 ); + auto eventId = inPacket.getValAt< uint32_t >( 0x28 ); + auto eventType = static_cast< uint16_t >( eventId >> 16 ); + + std::string eventName = "onTalk"; + std::string objName = Event::getEventName( eventId ); + + player.sendDebug( "Actor: " + + std::to_string( actorId ) + " -> " + + std::to_string( Event::mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ) ) + + " \neventId: " + + std::to_string( eventId ) + + " (0x" + boost::str( boost::format( "%|08X|" ) + % static_cast< uint64_t >( eventId & 0xFFFFFFF ) ) + ")" ); + + + player.sendDebug( "Calling: " + objName + "." + eventName ); + player.eventStart( actorId, eventId, Event::EventHandler::Talk, 0, 0 ); + + if( !g_scriptMgr.onTalk( player, actorId, eventId ) ) + { + if ( eventType == Event::EventHandler::EventHandlerType::Quest ) + { + auto questInfo = g_exdData.getQuestInfo( eventId ); + if ( questInfo ) + { + player.sendUrgent( "Quest not implemented: " + questInfo->name + " (" + questInfo->name_intern + ")" ); + } + } + } + + player.checkEvent( eventId ); + +} + diff --git a/src/servers/sapphire_zone/Script/ScriptManager.cpp b/src/servers/sapphire_zone/Script/ScriptManager.cpp index ae5361c1..4e8bea37 100644 --- a/src/servers/sapphire_zone/Script/ScriptManager.cpp +++ b/src/servers/sapphire_zone/Script/ScriptManager.cpp @@ -143,16 +143,6 @@ bool Core::Scripting::ScriptManager::registerBnpcTemplate( std::string templateN bool Core::Scripting::ScriptManager::onTalk( Entity::Player& player, uint64_t actorId, uint32_t eventId ) { - std::string eventName = "onTalk"; - std::string objName = Event::getEventName( eventId ); - - player.sendDebug( "Actor: " + - std::to_string( actorId ) + " -> " + - std::to_string( Event::mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ) ) + - " \neventId: " + - std::to_string( eventId ) + - " (0x" + boost::str( boost::format( "%|08X|" ) - % static_cast< uint64_t >( eventId & 0xFFFFFFF ) ) + ")" ); uint16_t eventType = eventId >> 16; uint32_t scriptId = eventId; @@ -168,29 +158,9 @@ bool Core::Scripting::ScriptManager::onTalk( Entity::Player& player, uint64_t ac auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, scriptId ); if( script ) - { - player.sendDebug( "Calling: " + objName + "." + eventName ); - - player.eventStart( actorId, eventId, Event::EventHandler::Talk, 0, 0 ); - script->onTalk( eventId, player, actorId ); - - player.checkEvent( eventId ); - } else - { - if ( eventType == Event::EventHandler::EventHandlerType::Quest ) - { - auto questInfo = g_exdData.getQuestInfo( eventId ); - if ( questInfo ) - { - player.sendUrgent( "Quest not implemented: " + questInfo->name + " (" + questInfo->name_intern + ")" ); - - } - } - return false; - } return true; }