1
Fork 0
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:
Mordred 2018-01-14 23:54:26 +01:00
parent f3d5bf5fa6
commit 2d8ea346a3
8 changed files with 83 additions and 56 deletions

View file

@ -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

View file

@ -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;
}
}

View file

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

View file

@ -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;
};

View file

@ -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 );

View file

@ -100,6 +100,8 @@ public:
DECLARE_HANDLER( inventoryModifyHandler );
DECLARE_HANDLER( discoveryHandler );
DECLARE_HANDLER( eventHandler );
DECLARE_HANDLER( eventHandlerTalk );
DECLARE_HANDLER( logoutHandler );
DECLARE_HANDLER( cfDutyInfoRequest );

View file

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

View file

@ -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;
}