diff --git a/src/servers/Server_Zone/ActionCast.cpp b/src/servers/Server_Zone/ActionCast.cpp index 0e1a37e1..c6ddc46e 100644 --- a/src/servers/Server_Zone/ActionCast.cpp +++ b/src/servers/Server_Zone/ActionCast.cpp @@ -9,6 +9,7 @@ #include "ActorControlPacket142.h" #include "ActorControlPacket143.h" #include "Player.h" +#include "ScriptManager.h" using namespace Core::Common; using namespace Core::Network; @@ -17,6 +18,7 @@ using namespace Core::Network::Packets::Server; extern Core::Data::ExdData g_exdData; extern Core::Logger g_log; +extern Core::Scripting::ScriptManager g_scriptMgr; Core::Action::ActionCast::ActionCast() { @@ -89,6 +91,8 @@ void Core::Action::ActionCast::onFinish() pPlayer->sendToInRangeSet( effectPacket, true ); m_pTarget->takeDamage( 30 ); + + g_scriptMgr.onCastFinish( pPlayer, m_pTarget, m_id ); } void Core::Action::ActionCast::onInterrupt() diff --git a/src/servers/Server_Zone/Actor.cpp b/src/servers/Server_Zone/Actor.cpp index 82b0cb7a..3df54641 100644 --- a/src/servers/Server_Zone/Actor.cpp +++ b/src/servers/Server_Zone/Actor.cpp @@ -62,9 +62,14 @@ bool Core::Entity::Actor::isMob() const } /*! \return list of actors currently in range */ -std::set< Core::Entity::ActorPtr > Core::Entity::Actor::getInRangeActors() const +std::set< Core::Entity::ActorPtr > Core::Entity::Actor::getInRangeActors( bool includeSelf ) { - return m_inRangeActors; + auto tempInRange = m_inRangeActors; + + if( includeSelf ) + tempInRange.insert( shared_from_this() ); + + return tempInRange; } /*! \return current stance of the actors */ diff --git a/src/servers/Server_Zone/Actor.h b/src/servers/Server_Zone/Actor.h index aa6dc39b..1e2c2374 100644 --- a/src/servers/Server_Zone/Actor.h +++ b/src/servers/Server_Zone/Actor.h @@ -181,7 +181,7 @@ public: bool isMob() const; - std::set< ActorPtr > getInRangeActors() const; + std::set< ActorPtr > getInRangeActors( bool includeSelf = false ); bool face( const Common::FFXIVARR_POSITION3& p ); diff --git a/src/servers/Server_Zone/PacketHandlers2.cpp b/src/servers/Server_Zone/PacketHandlers2.cpp index 08ecf302..ad5e4eff 100644 --- a/src/servers/Server_Zone/PacketHandlers2.cpp +++ b/src/servers/Server_Zone/PacketHandlers2.cpp @@ -62,7 +62,7 @@ void Core::Network::GameConnection::skillHandler( Core::Network::Packets::GamePa { std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action ); pPlayer->sendDebug( "---------------------------------------" ); - pPlayer->sendDebug( "ActionHandler ( " + actionIdStr + " | " + g_exdData.m_actionInfoMap[action].name + " )" ); + pPlayer->sendDebug( "ActionHandler ( " + actionIdStr + " | " + g_exdData.m_actionInfoMap[action].name + " | " + std::to_string( targetId ) + " )" ); if( action == 5 ) { @@ -76,7 +76,7 @@ void Core::Network::GameConnection::skillHandler( Core::Network::Packets::GamePa { Core::Entity::ActorPtr targetActor; - auto inRange = pPlayer->getInRangeActors(); + auto inRange = pPlayer->getInRangeActors( true ); for( auto actor : inRange ) { if( actor->getId() == targetId ) diff --git a/src/servers/Server_Zone/ScriptManager.cpp b/src/servers/Server_Zone/ScriptManager.cpp index 4a05c549..3ca317a2 100644 --- a/src/servers/Server_Zone/ScriptManager.cpp +++ b/src/servers/Server_Zone/ScriptManager.cpp @@ -375,6 +375,27 @@ bool Core::Scripting::ScriptManager::onMobKill( Entity::PlayerPtr pPlayer, uint1 return true; } +bool Core::Scripting::ScriptManager::onCastFinish( Entity::PlayerPtr pPlayer, Entity::ActorPtr pTarget, uint32_t actionId ) +{ + std::string eventName = "onFinish"; + + try + { + auto obj = m_pChaiHandler->eval( "skillDef_" + std::to_string( actionId ) ); + std::string objName = "skillDef_" + std::to_string( actionId ); + + pPlayer->sendDebug( "Calling: " + objName + "." + eventName ); + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Player& ) > >( eventName ); + fn( obj, *pPlayer ); + } + catch( std::exception& e ) + { + pPlayer->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 83673fc2..cd6b0e5c 100644 --- a/src/servers/Server_Zone/ScriptManager.h +++ b/src/servers/Server_Zone/ScriptManager.h @@ -50,6 +50,8 @@ namespace Core bool onMobKill( Entity::PlayerPtr pPlayer, uint16_t nameId ); + bool onCastFinish( Entity::PlayerPtr pPlayer, Entity::ActorPtr pTarget, uint32_t actionId ); + bool onZoneInit( ZonePtr pZone ); bool onEventHandlerReturn( Entity::PlayerPtr pPlayer, uint32_t eventId, uint16_t subEvent, uint16_t param1, uint16_t param2, uint16_t param3 );