mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-01 16:37:45 +00:00
Beginning of splitting eventhandlers, pulling logic out of scriptmanager
This commit is contained in:
parent
f3d5bf5fa6
commit
2d8ea346a3
8 changed files with 83 additions and 56 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -100,6 +100,8 @@ public:
|
|||
DECLARE_HANDLER( inventoryModifyHandler );
|
||||
DECLARE_HANDLER( discoveryHandler );
|
||||
DECLARE_HANDLER( eventHandler );
|
||||
DECLARE_HANDLER( eventHandlerTalk );
|
||||
|
||||
DECLARE_HANDLER( logoutHandler );
|
||||
|
||||
DECLARE_HANDLER( cfDutyInfoRequest );
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include <common/Common.h>
|
||||
#include <common/Exd/ExdData.h>
|
||||
#include <common/Network/CommonNetwork.h>
|
||||
#include <common/Network/GamePacketNew.h>
|
||||
#include <common/Network/PacketContainer.h>
|
||||
|
@ -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 );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue