From e8c7634e8f5dbecfe0d51891a0bba9beedde3584 Mon Sep 17 00:00:00 2001 From: amibu Date: Thu, 10 Aug 2017 22:06:05 +0200 Subject: [PATCH] Fix insta skills --- src/servers/Server_Common/ExdData.cpp | 7 +++++++ src/servers/Server_Zone/PacketHandlers2.cpp | 19 +++++++++---------- src/servers/Server_Zone/Player.cpp | 19 +++++++++++++++++++ src/servers/Server_Zone/Player.h | 6 ++++++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/servers/Server_Common/ExdData.cpp b/src/servers/Server_Common/ExdData.cpp index 8cc1e6e8..f4b110ef 100644 --- a/src/servers/Server_Common/ExdData.cpp +++ b/src/servers/Server_Common/ExdData.cpp @@ -346,6 +346,13 @@ bool Core::Data::ExdData::loadActionInfo() uint16_t points_cost = getField< uint16_t >( fields, 31 );//29 bool is_instant = getField< bool >( fields, 35 ); + + uint8_t typeshift = 0x6; + uint8_t mask = 1 << typeshift; + is_instant &= mask; + bool final = ( is_instant & mask ) == mask; + is_instant = final; + uint16_t cast_time = getField< uint16_t >( fields, 36 ); uint16_t recast_time = getField< uint16_t >( fields, 37 ); diff --git a/src/servers/Server_Zone/PacketHandlers2.cpp b/src/servers/Server_Zone/PacketHandlers2.cpp index ad5e4eff..ad337325 100644 --- a/src/servers/Server_Zone/PacketHandlers2.cpp +++ b/src/servers/Server_Zone/PacketHandlers2.cpp @@ -74,21 +74,20 @@ void Core::Network::GameConnection::skillHandler( Core::Network::Packets::GamePa } else { - Core::Entity::ActorPtr targetActor; - - auto inRange = pPlayer->getInRangeActors( true ); - for( auto actor : inRange ) + Core::Entity::ActorPtr targetActor = pPlayer; + if( targetId != pPlayer->getId() ) { - if( actor->getId() == targetId ) - { - targetActor = actor; - } + targetActor = pPlayer->lookupTargetById( targetId ); } - if( targetActor ) + if( pPlayer->actionHasCastTime( action ) ) + { + g_scriptMgr.onCastFinish( pPlayer, targetActor, action ); + } + else { Action::ActionCastPtr pActionCast( new Action::ActionCast( pPlayer, targetActor, action ) ); - pPlayer->setCurrentAction(pActionCast); + pPlayer->setCurrentAction( pActionCast ); pPlayer->sendDebug( "setCurrentAction()" ); pPlayer->getCurrentAction()->onStart(); } diff --git a/src/servers/Server_Zone/Player.cpp b/src/servers/Server_Zone/Player.cpp index 6a45489d..80458392 100644 --- a/src/servers/Server_Zone/Player.cpp +++ b/src/servers/Server_Zone/Player.cpp @@ -923,6 +923,20 @@ void Core::Entity::Player::despawn( Core::Entity::ActorPtr pTarget ) pPlayer->queuePacket( ActorControlPacket143( getId(), DespawnZoneScreenMsg, 0x04, getId(), 0x01 ) ); } +Core::Entity::ActorPtr Core::Entity::Player::lookupTargetById( uint64_t targetId ) +{ + Core::Entity::ActorPtr targetActor; + auto inRange = getInRangeActors( true ); + for( auto actor : inRange ) + { + if( actor->getId() == targetId ) + { + targetActor = actor; + } + } + return targetActor; +} + void Core::Entity::Player::setLastPing( uint32_t ping ) { m_lastPing = ping; @@ -972,6 +986,11 @@ const uint8_t * Core::Entity::Player::getStateFlags() const return m_stateFlags; } +bool Core::Entity::Player::actionHasCastTime( uint32_t actionId ) //TODO: Add logic for special cases +{ + return g_exdData.m_actionInfoMap[actionId].is_instant; +} + bool Core::Entity::Player::hasStateFlag( Core::Common::PlayerStateFlag flag ) const { int iFlag = static_cast< uint32_t >( flag ); diff --git a/src/servers/Server_Zone/Player.h b/src/servers/Server_Zone/Player.h index fd8f53e1..1f7d5688 100644 --- a/src/servers/Server_Zone/Player.h +++ b/src/servers/Server_Zone/Player.h @@ -452,6 +452,8 @@ public: void sendUrgent( const std::string& message ); void sendDebug( const std::string& message ); + // Player Battle Handling + ////////////////////////////////////////////////////////////////////////////////////////////////////// void onMobAggro( BattleNpcPtr pBNpc ); void onMobDeaggro( BattleNpcPtr pBNpc ); @@ -463,6 +465,10 @@ public: void sendHateList(); + bool actionHasCastTime( uint32_t actionId ); + + Core::Entity::ActorPtr lookupTargetById( uint64_t targetId ); + bool isLogin() const; void setIsLogin( bool bIsLogin );