diff --git a/src/servers/Server_Zone/ScriptManager.cpp b/src/servers/Server_Zone/ScriptManager.cpp index 78e3bf75..94293955 100644 --- a/src/servers/Server_Zone/ScriptManager.cpp +++ b/src/servers/Server_Zone/ScriptManager.cpp @@ -396,6 +396,69 @@ bool Core::Scripting::ScriptManager::onCastFinish( Entity::PlayerPtr pPlayer, En return true; } +bool Core::Scripting::ScriptManager::onStatusReceive( Entity::ActorPtr pActor, uint32_t effectId ) +{ + std::string eventName = "onReceive"; + + try + { + auto obj = m_pChaiHandler->eval( "statusDef_" + std::to_string( effectId ) ); + std::string objName = "statusDef_" + std::to_string( effectId ); + + pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName ); + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Actor&) > >( eventName ); + fn( obj, *pActor ); + } + catch( std::exception& e ) + { + pActor->getAsPlayer()->sendUrgent( e.what() ); + } + + return true; +} + +bool Core::Scripting::ScriptManager::onStatusTick( Entity::ActorPtr pActor, uint32_t effectId ) +{ + std::string eventName = "onTick"; + + try + { + auto obj = m_pChaiHandler->eval( "statusDef_" + std::to_string( effectId ) ); + std::string objName = "statusDef_" + std::to_string( effectId ); + + pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName ); + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Actor& ) > >( eventName ); + fn( obj, *pActor ); + } + catch( std::exception& e ) + { + pActor->getAsPlayer()->sendUrgent( e.what() ); + } + + return true; +} + +bool Core::Scripting::ScriptManager::onStatusTimeOut( Entity::ActorPtr pActor, uint32_t effectId ) +{ + std::string eventName = "onTimeOut"; + + try + { + auto obj = m_pChaiHandler->eval( "statusDef_" + std::to_string( effectId ) ); + std::string objName = "statusDef_" + std::to_string( effectId ); + + pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName ); + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Actor& ) > >( eventName ); + fn( obj, *pActor ); + } + catch( std::exception& e ) + { + pActor->getAsPlayer()->sendUrgent( e.what() ); + } + + return true; +} + bool Core::Scripting::ScriptManager::onZoneInit( ZonePtr pZone ) { std::string eventName = "onZoneInit_" + pZone->getInternalName(); diff --git a/src/servers/Server_Zone/ScriptManager.h b/src/servers/Server_Zone/ScriptManager.h index cd6b0e5c..b398d4a4 100644 --- a/src/servers/Server_Zone/ScriptManager.h +++ b/src/servers/Server_Zone/ScriptManager.h @@ -52,6 +52,10 @@ namespace Core bool onCastFinish( Entity::PlayerPtr pPlayer, Entity::ActorPtr pTarget, uint32_t actionId ); + bool onStatusReceive( Entity::ActorPtr pActor, uint32_t effectId ); + bool onStatusTick( Entity::ActorPtr pActor, uint32_t effectId ); + bool onStatusTimeOut( Entity::ActorPtr pActor, uint32_t effectId ); + bool onZoneInit( ZonePtr pZone ); bool onEventHandlerReturn( Entity::PlayerPtr pPlayer, uint32_t eventId, uint16_t subEvent, uint16_t param1, uint16_t param2, uint16_t param3 ); diff --git a/src/servers/Server_Zone/StatusEffect.cpp b/src/servers/Server_Zone/StatusEffect.cpp index 33576896..c4c0f765 100644 --- a/src/servers/Server_Zone/StatusEffect.cpp +++ b/src/servers/Server_Zone/StatusEffect.cpp @@ -10,6 +10,7 @@ #include "Actor.h" #include "StatusEffect.h" +#include "ScriptManager.h" extern Core::Logger g_log; extern Core::Data::ExdData g_exdData; @@ -17,6 +18,8 @@ extern Core::Data::ExdData g_exdData; using namespace Core::Common; using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; +extern Core::Scripting::ScriptManager g_scriptMgr; + Core::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::ActorPtr sourceActor, Entity::ActorPtr targetActor, uint32_t duration, uint32_t tickRate ) @@ -51,6 +54,7 @@ Core::StatusEffect::StatusEffect::~StatusEffect() void Core::StatusEffect::StatusEffect::onTick() { m_lastTick = Util::getTimeMs(); + g_scriptMgr.onStatusTick( m_targetActor, m_id ); } uint32_t Core::StatusEffect::StatusEffect::getSrcActorId() const @@ -86,11 +90,13 @@ void Core::StatusEffect::StatusEffect::applyStatus() //m_sourceActor->sendToInRangeSet( effectPacket, true ); g_log.debug( "StatusEffect applied: " + m_name ); + g_scriptMgr.onStatusReceive( m_targetActor, m_id ); } void Core::StatusEffect::StatusEffect::removeStatus() { g_log.debug( "StatusEffect removed: " + m_name ); + g_scriptMgr.onStatusTimeOut( m_targetActor, m_id ); } uint32_t Core::StatusEffect::StatusEffect::getId() const