diff --git a/bin/scripts/chai/skill/skillDef_119.chai b/bin/scripts/chai/skill/skillDef_119.chai new file mode 100644 index 00000000..dcf945b2 --- /dev/null +++ b/bin/scripts/chai/skill/skillDef_119.chai @@ -0,0 +1,18 @@ +// Skill Name: Stone +// Skill ID: 119 + +class skillDef_119Def +{ + def skillDef_119Def() + { + + } + + def onFinish( player, target ) + { + player.handleScriptSkill( STD_DAMAGE, 119, 30, 0, target ); + } + +}; + +GLOBAL skillDef_119 = skillDef_119Def(); diff --git a/bin/scripts/chai/skill/skillDef_121.chai b/bin/scripts/chai/skill/skillDef_121.chai index 1fb31f67..8fb8dd3d 100644 --- a/bin/scripts/chai/skill/skillDef_121.chai +++ b/bin/scripts/chai/skill/skillDef_121.chai @@ -10,7 +10,8 @@ class skillDef_121Def def onFinish( player, target ) { - target.addStatusEffectById(143, 20000, 0); + player.handleScriptSkill( STD_DAMAGE, 121, 5, 0, target ); + target.addStatusEffectByIdIfNotExist(143, 20000, 0); } }; diff --git a/src/servers/Server_Common/ExdData.cpp b/src/servers/Server_Common/ExdData.cpp index 97795eff..965f1cc8 100644 --- a/src/servers/Server_Common/ExdData.cpp +++ b/src/servers/Server_Common/ExdData.cpp @@ -345,13 +345,13 @@ bool Core::Data::ExdData::loadActionInfo() uint8_t points_type = getField< uint8_t >( fields, 30 );//28 uint16_t points_cost = getField< uint16_t >( fields, 31 );//29 - bool is_instant = getField< bool >( fields, 35 ); + uint32_t instantval = 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; + instantval &= mask; + bool final = ( instantval & mask ) == mask; + bool 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/ActionCast.cpp b/src/servers/Server_Zone/ActionCast.cpp index 410697cd..98a78290 100644 --- a/src/servers/Server_Zone/ActionCast.cpp +++ b/src/servers/Server_Zone/ActionCast.cpp @@ -70,13 +70,9 @@ void Core::Action::ActionCast::onFinish() auto pPlayer = m_pSource->getAsPlayer(); pPlayer->sendDebug( "onFinish()" ); - m_pTarget->onActionHostile( pPlayer->shared_from_this() ); - pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); pPlayer->sendStateFlags(); - - g_scriptMgr.onCastFinish( pPlayer, m_pTarget, m_id ); } diff --git a/src/servers/Server_Zone/Actor.cpp b/src/servers/Server_Zone/Actor.cpp index 9016ab41..efcf3d6e 100644 --- a/src/servers/Server_Zone/Actor.cpp +++ b/src/servers/Server_Zone/Actor.cpp @@ -631,3 +631,14 @@ void Core::Entity::Actor::addStatusEffectById( int32_t id, int32_t duration, uin addStatusEffect( effect ); } +/*! \param StatusEffectPtr to be applied to the actor */ +void Core::Entity::Actor::addStatusEffectByIdIfNotExist( int32_t id, int32_t duration, uint16_t param ) +{ + if( !m_pStatusEffectContainer->hasStatusEffect( id ) ) + { + StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, shared_from_this(), shared_from_this(), duration, 3000 ) ); + effect->setParam( param ); + addStatusEffect( effect ); + } +} + diff --git a/src/servers/Server_Zone/Actor.h b/src/servers/Server_Zone/Actor.h index 8cab76b7..6c7d1df9 100644 --- a/src/servers/Server_Zone/Actor.h +++ b/src/servers/Server_Zone/Actor.h @@ -293,6 +293,9 @@ public: // add a status effect by id void addStatusEffectById( int32_t id, int32_t duration, uint16_t param = 0 ); + // add a status effect by id if it doesn't exist + void addStatusEffectByIdIfNotExist( int32_t id, int32_t duration, uint16_t param = 0 ); + // TODO: Why did i even declare them publicly here?! std::set< ActorPtr > m_inRangeActors; std::set< PlayerPtr > m_inRangePlayers; diff --git a/src/servers/Server_Zone/GameCommandHandler.cpp b/src/servers/Server_Zone/GameCommandHandler.cpp index 37aa0224..a82848fa 100644 --- a/src/servers/Server_Zone/GameCommandHandler.cpp +++ b/src/servers/Server_Zone/GameCommandHandler.cpp @@ -257,7 +257,27 @@ void Core::GameCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlayer else pPlayer->setClassJob( static_cast ( id ) ); } + else if( subCommand == "no" ) + { + int32_t id; + sscanf( params.c_str(), "%d", &id ); + + + + uint8_t typeshift = 0x6; + uint8_t mask = 1 << typeshift; + id &= mask; + bool final = ( id & mask ) == mask; + pPlayer->sendDebug( std::to_string(final) ); + } + else if( subCommand == "aaah" ) + { + int32_t id; + + sscanf( params.c_str(), "%d", &id ); + pPlayer->sendDebug( std::to_string( pPlayer->actionHasCastTime( id ) ) ); + } } diff --git a/src/servers/Server_Zone/PacketHandlers2.cpp b/src/servers/Server_Zone/PacketHandlers2.cpp index ad337325..609638d8 100644 --- a/src/servers/Server_Zone/PacketHandlers2.cpp +++ b/src/servers/Server_Zone/PacketHandlers2.cpp @@ -80,7 +80,7 @@ void Core::Network::GameConnection::skillHandler( Core::Network::Packets::GamePa targetActor = pPlayer->lookupTargetById( targetId ); } - if( pPlayer->actionHasCastTime( action ) ) + if( !pPlayer->actionHasCastTime( action ) ) { g_scriptMgr.onCastFinish( pPlayer, targetActor, action ); } diff --git a/src/servers/Server_Zone/Player.cpp b/src/servers/Server_Zone/Player.cpp index e7088eea..a71a5ddb 100644 --- a/src/servers/Server_Zone/Player.cpp +++ b/src/servers/Server_Zone/Player.cpp @@ -988,7 +988,13 @@ const uint8_t * Core::Entity::Player::getStateFlags() const bool Core::Entity::Player::actionHasCastTime( uint32_t actionId ) //TODO: Add logic for special cases { - return g_exdData.m_actionInfoMap[actionId].is_instant; + if( g_exdData.m_actionInfoMap[actionId].is_instant ) + return false; + + if( g_exdData.m_actionInfoMap[actionId].cast_time == 0 ) + return false; + + return true; } bool Core::Entity::Player::hasStateFlag( Core::Common::PlayerStateFlag flag ) const @@ -1528,6 +1534,7 @@ void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId, sendToInRangeSet( effectPacket, true ); pTarget.takeDamage( param1 ); + pTarget.onActionHostile( shared_from_this() ); break; } diff --git a/src/servers/Server_Zone/ScriptManagerInit.cpp b/src/servers/Server_Zone/ScriptManagerInit.cpp index 4a125ce0..ca374640 100644 --- a/src/servers/Server_Zone/ScriptManagerInit.cpp +++ b/src/servers/Server_Zone/ScriptManagerInit.cpp @@ -35,6 +35,7 @@ int Core::Scripting::ScriptManager::init() m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getTargetId ), "getTargetId" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::addStatusEffect ), "addStatusEffect" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::addStatusEffectById ), "addStatusEffectById" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::addStatusEffectByIdIfNotExist ), "addStatusEffectByIdIfNotExist" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::takeDamage ), "takeDamage" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::forceZoneing ), "setZone" ); diff --git a/src/servers/Server_Zone/StatusEffectContainer.cpp b/src/servers/Server_Zone/StatusEffectContainer.cpp index 85a9a392..5ecdfbe1 100644 --- a/src/servers/Server_Zone/StatusEffectContainer.cpp +++ b/src/servers/Server_Zone/StatusEffectContainer.cpp @@ -185,3 +185,16 @@ void Core::StatusEffect::StatusEffectContainer::update() m_pOwner->sendToInRangeSet( ActorControlPacket142( m_pOwner->getId(), HPFloatingText, 0, 4, thisTickHeal ) ); } } + +bool Core::StatusEffect::StatusEffectContainer::hasStatusEffect( uint32_t id ) +{ + for( auto effectIt : m_effectMap ) + { + if( effectIt.second->getId() == id ) + { + return true; + } + } + + return false; +} \ No newline at end of file diff --git a/src/servers/Server_Zone/StatusEffectContainer.h b/src/servers/Server_Zone/StatusEffectContainer.h index 6f4acb9c..824becc9 100644 --- a/src/servers/Server_Zone/StatusEffectContainer.h +++ b/src/servers/Server_Zone/StatusEffectContainer.h @@ -23,6 +23,8 @@ public: void removeStatusEffect( uint8_t effectSlotId ); void update(); + bool hasStatusEffect( uint32_t id ); + int8_t getFreeSlot(); void freeSlot( uint8_t slotId );