diff --git a/bin/config/settings_lobby.xml b/bin/config/settings_lobby.xml index 478b6014..dfcd4781 100644 --- a/bin/config/settings_lobby.xml +++ b/bin/config/settings_lobby.xml @@ -27,5 +27,7 @@ false + + 67 \ No newline at end of file diff --git a/bin/scripts/chai/global.inc b/bin/scripts/chai/global.inc index 4ec015ea..078ad80e 100644 --- a/bin/scripts/chai/global.inc +++ b/bin/scripts/chai/global.inc @@ -224,3 +224,10 @@ GLOBAL CURRENCY_MGP = 0X0B GLOBAL CURRENCY_TOMESTONELAW = 0X0C GLOBAL CURRENCY_TOMESTONEESO = 0X0D GLOBAL CURRENCY_TOMESTONELORE = 0X0E + +//////////////////////////////////////////////////////////// +// Skill handle types +//////////////////////////////////////////////////////////// +GLOBAL STD_DAMAGE = 0X00 +GLOBAL STD_HEAL = 0X01 +GLOBAL STD_DOT = 0X02 \ No newline at end of file diff --git a/bin/scripts/chai/skill/skillDef_120.chai b/bin/scripts/chai/skill/skillDef_120.chai new file mode 100644 index 00000000..8966d095 --- /dev/null +++ b/bin/scripts/chai/skill/skillDef_120.chai @@ -0,0 +1,18 @@ +// Skill Name: Sprint +// Skill ID: 3 + +class skillDef_120Def +{ + def skillDef_120Def() + { + + } + + def onFinish( player, target ) + { + player.handleScriptSkill( STD_HEAL, 120, 1000, 0, target ); + } + +}; + +GLOBAL skillDef_120 = skillDef_120Def(); diff --git a/bin/scripts/chai/skill/skillDef_121.chai b/bin/scripts/chai/skill/skillDef_121.chai new file mode 100644 index 00000000..1fb31f67 --- /dev/null +++ b/bin/scripts/chai/skill/skillDef_121.chai @@ -0,0 +1,18 @@ +// Skill Name: Sprint +// Skill ID: 3 + +class skillDef_121Def +{ + def skillDef_121Def() + { + + } + + def onFinish( player, target ) + { + target.addStatusEffectById(143, 20000, 0); + } + +}; + +GLOBAL skillDef_121 = skillDef_121Def(); diff --git a/bin/scripts/chai/skill/skillDef_127.chai b/bin/scripts/chai/skill/skillDef_127.chai new file mode 100644 index 00000000..7317c106 --- /dev/null +++ b/bin/scripts/chai/skill/skillDef_127.chai @@ -0,0 +1,18 @@ +// Skill Name: Sprint +// Skill ID: 3 + +class skillDef_127Def +{ + def skillDef_127Def() + { + + } + + def onFinish( player, target ) + { + player.handleScriptSkill( STD_DAMAGE, 127, 1000, 0, target ); + } + +}; + +GLOBAL skillDef_127 = skillDef_127Def(); diff --git a/bin/scripts/chai/status/statusDef_143.chai b/bin/scripts/chai/status/statusDef_143.chai new file mode 100644 index 00000000..e797ef37 --- /dev/null +++ b/bin/scripts/chai/status/statusDef_143.chai @@ -0,0 +1,19 @@ +// Status Name: Wind +// Status ID: 143 + +class statusDef_143Def +{ + def statusDef_143Def() + { + + } + + def onTick( actor, effect ) + { + print("tick"); + effect.registerTickEffect( 1, 30 ); + } + +}; + +GLOBAL statusDef_143 = statusDef_143Def(); diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h index 37520915..a8695923 100644 --- a/src/servers/Server_Common/Common.h +++ b/src/servers/Server_Common/Common.h @@ -545,6 +545,13 @@ namespace Core { }; + enum HandleSkillType : uint8_t + { + StdDamage, + StdHeal, + StdDot, + }; + enum struct PlayerStateFlag : uint8_t { NoCombat, @@ -695,6 +702,7 @@ namespace Core { StatusEffectGain = 0x14, StatusEffectLose = 0x15, + HPFloatingText = 0x17, UpdateRestedExp = 0x018, Unk2 = 0x19, diff --git a/src/servers/Server_Common/ServerPacketDef.h b/src/servers/Server_Common/ServerPacketDef.h index fdc51b4c..76772db2 100644 --- a/src/servers/Server_Common/ServerPacketDef.h +++ b/src/servers/Server_Common/ServerPacketDef.h @@ -410,7 +410,7 @@ struct FFXIVIpcUpdateHpMpTp : FFXIVIpcBasePacket /** * Structural representation of the packet sent by the server -* to update HP / MP / TP +* for battle actions */ struct effectEntry { diff --git a/src/servers/Server_Lobby/GameConnection.cpp b/src/servers/Server_Lobby/GameConnection.cpp index 0765a1ff..a515f7db 100644 --- a/src/servers/Server_Lobby/GameConnection.cpp +++ b/src/servers/Server_Lobby/GameConnection.cpp @@ -104,7 +104,7 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui serverListPacket.data().seq = 1; serverListPacket.data().offset = 0; serverListPacket.data().numServers = 1; - serverListPacket.data().server[0].id = 1; + serverListPacket.data().server[0].id = g_serverLobby.m_pConfig->getValue( "Settings.Parameters.WorldID", 1 ); serverListPacket.data().server[0].index = 0; serverListPacket.data().final = 1; sprintf( serverListPacket.data().server[0].name, "Sapphire" ); @@ -141,7 +141,7 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui auto& charEntry = charList[charIndex]; details.uniqueId = get<1>( charEntry ); details.contentId = get<2>( charEntry ); - details.serverId = 1; + details.serverId = g_serverLobby.m_pConfig->getValue( "Settings.Parameters.WorldID", 1 ); details.index = charIndex; strcpy( details.charDetailJson, get<3>( charEntry ).c_str() ); strcpy( details.nameChara, get<0>( charEntry ).c_str() ); diff --git a/src/servers/Server_Zone/ActionCast.cpp b/src/servers/Server_Zone/ActionCast.cpp index c6ddc46e..410697cd 100644 --- a/src/servers/Server_Zone/ActionCast.cpp +++ b/src/servers/Server_Zone/ActionCast.cpp @@ -75,22 +75,7 @@ void Core::Action::ActionCast::onFinish() pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); pPlayer->sendStateFlags(); - GamePacketNew< FFXIVIpcEffect > effectPacket( pPlayer->getId() ); - effectPacket.data().targetId = m_pTarget->getId(); - effectPacket.data().actionAnimationId = m_id; - effectPacket.data().unknown_2 = 0; -// effectPacket.data().unknown_3 = 1; - effectPacket.data().actionTextId = m_id; - effectPacket.data().numEffects = 1; - effectPacket.data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRotation() ); - effectPacket.data().effectTarget = m_pTarget->getId(); - effectPacket.data().effects[0].param1 = 30; - effectPacket.data().effects[0].unknown_1 = 3; - effectPacket.data().effects[0].unknown_2 = 1; - effectPacket.data().effects[0].unknown_3 = 7; - - pPlayer->sendToInRangeSet( effectPacket, true ); - m_pTarget->takeDamage( 30 ); + 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 6441abbb..9016ab41 100644 --- a/src/servers/Server_Zone/Actor.cpp +++ b/src/servers/Server_Zone/Actor.cpp @@ -337,6 +337,25 @@ void Core::Entity::Actor::takeDamage( uint32_t damage ) sendStatusUpdate( false ); } +/*! +Let an actor get healed and perform necessary steps +according to resulting hp, propagates new hp value to players +in range + +\param amount of hp to be healed +*/ +void Core::Entity::Actor::heal( uint32_t amount ) +{ + if( ( m_hp + amount ) > getMaxHp() ) + { + m_hp = getMaxHp(); + } + else + m_hp += amount; + + sendStatusUpdate( false ); +} + /*! Send an HpMpTp update to players in range ( and potentially to self ) TODO: poor naming, should be changed. Status is not HP. Also should be virtual diff --git a/src/servers/Server_Zone/Actor.h b/src/servers/Server_Zone/Actor.h index 95504553..8cab76b7 100644 --- a/src/servers/Server_Zone/Actor.h +++ b/src/servers/Server_Zone/Actor.h @@ -245,6 +245,7 @@ public: virtual uint8_t getLevel() const; virtual void sendStatusUpdate( bool toSelf = true ); virtual void takeDamage( uint32_t damage ); + virtual void heal( uint32_t amount ); virtual bool checkAction(); virtual void update( int64_t currTime ) {}; diff --git a/src/servers/Server_Zone/BattleNpc.cpp b/src/servers/Server_Zone/BattleNpc.cpp index 93956510..c1fae02f 100644 --- a/src/servers/Server_Zone/BattleNpc.cpp +++ b/src/servers/Server_Zone/BattleNpc.cpp @@ -15,6 +15,7 @@ #include "MoveActorPacket.h" #include "ActorControlPacket142.h" #include "ActorControlPacket143.h" +#include "StatusEffectContainer.h" using namespace Core::Common; using namespace Core::Network::Packets; @@ -84,6 +85,10 @@ Core::Entity::BattleNpc::BattleNpc( uint32_t modelId, uint32_t nameid, const Com } +void Core::Entity::BattleNpc::initStatusEffectContainer() +{ + m_pStatusEffectContainer = StatusEffect::StatusEffectContainerPtr( new StatusEffect::StatusEffectContainer( shared_from_this() ) ); +} // spawn this player for pTarget void Core::Entity::BattleNpc::spawn( Core::Entity::PlayerPtr pTarget ) @@ -482,7 +487,7 @@ void Core::Entity::BattleNpc::update( int64_t currTime ) return; } - //m_pStatusEffectContainer->update(); + m_pStatusEffectContainer->update(); float distance = Math::Util::distance( m_pos.x, m_pos.y, m_pos.z, m_posOrigin.x, m_posOrigin.y, m_posOrigin.z ); diff --git a/src/servers/Server_Zone/BattleNpc.h b/src/servers/Server_Zone/BattleNpc.h index 65224fdf..d13d082b 100644 --- a/src/servers/Server_Zone/BattleNpc.h +++ b/src/servers/Server_Zone/BattleNpc.h @@ -36,6 +36,8 @@ public: // const Common::FFXIVARR_POSITION3& spawnPos, // uint32_t type = 2, uint32_t behaviour = 1, uint32_t mobType = 0 ); + void initStatusEffectContainer(); + // send spawn packets to pTarget void spawn( PlayerPtr pTarget ) override; diff --git a/src/servers/Server_Zone/Cell.cpp b/src/servers/Server_Zone/Cell.cpp index 2d58a389..6810ef78 100644 --- a/src/servers/Server_Zone/Cell.cpp +++ b/src/servers/Server_Zone/Cell.cpp @@ -46,6 +46,7 @@ namespace Core { entry->setCurrentZone( m_pZone ); + entry->getAsBattleNpc()->initStatusEffectContainer(); m_pZone->pushActor( entry ); } diff --git a/src/servers/Server_Zone/Player.cpp b/src/servers/Server_Zone/Player.cpp index 5ccd7e85..e7088eea 100644 --- a/src/servers/Server_Zone/Player.cpp +++ b/src/servers/Server_Zone/Player.cpp @@ -1499,3 +1499,62 @@ void Core::Entity::Player::autoAttack( ActorPtr pTarget ) pTarget->takeDamage(damage); } + +void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId, uint64_t param1, uint64_t param2, Entity::Actor& pTarget ) +{ + sendDebug( std::to_string( pTarget.getId() ) ); + sendDebug( "Handle script skill type: " + std::to_string( type ) ); + + switch( type ) + { + + case Core::Common::HandleSkillType::StdDamage: + { + sendDebug( "STD_DAMAGE" ); + GamePacketNew< FFXIVIpcEffect > effectPacket( getId() ); + effectPacket.data().targetId = pTarget.getId(); + effectPacket.data().actionAnimationId = actionId; + effectPacket.data().unknown_2 = 0; + // effectPacket.data().unknown_3 = 1; + effectPacket.data().actionTextId = actionId; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRotation() ); + effectPacket.data().effectTarget = pTarget.getId(); + effectPacket.data().effects[0].param1 = param1; + effectPacket.data().effects[0].unknown_1 = 3; + effectPacket.data().effects[0].unknown_2 = 1; + effectPacket.data().effects[0].unknown_3 = 7; + + sendToInRangeSet( effectPacket, true ); + + pTarget.takeDamage( param1 ); + break; + } + + case Core::Common::HandleSkillType::StdHeal: + { + sendDebug( "STD_HEAL" ); + GamePacketNew< FFXIVIpcEffect > effectPacket( getId() ); + effectPacket.data().targetId = pTarget.getId(); + effectPacket.data().actionAnimationId = actionId; + effectPacket.data().unknown_2 = 0; + // effectPacket.data().unknown_3 = 1; + effectPacket.data().actionTextId = actionId; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRotation() ); + effectPacket.data().effectTarget = pTarget.getId(); + effectPacket.data().effects[0].param1 = param1; + effectPacket.data().effects[0].unknown_1 = 4; + effectPacket.data().effects[0].unknown_2 = 1; + effectPacket.data().effects[0].unknown_3 = 7; + + sendToInRangeSet( effectPacket, true ); + + pTarget.heal( param1 ); + break; + } + + default: + break; + } +} diff --git a/src/servers/Server_Zone/Player.h b/src/servers/Server_Zone/Player.h index ae5af385..8b3ccb6b 100644 --- a/src/servers/Server_Zone/Player.h +++ b/src/servers/Server_Zone/Player.h @@ -482,6 +482,8 @@ public: void setAutoattack( bool mode ); bool isAutoattackOn() const; + void handleScriptSkill( uint32_t type, uint32_t actionId, uint64_t param1, uint64_t param2, Entity::Actor& target ); + private: uint32_t m_lastWrite; uint32_t m_lastPing; diff --git a/src/servers/Server_Zone/ScriptManager.cpp b/src/servers/Server_Zone/ScriptManager.cpp index 94293955..429967ed 100644 --- a/src/servers/Server_Zone/ScriptManager.cpp +++ b/src/servers/Server_Zone/ScriptManager.cpp @@ -12,6 +12,7 @@ #include "Event.h" #include "EventHelper.h" #include "ScriptManager.h" +#include "StatusEffect.h" #include "ServerNoticePacket.h" @@ -405,34 +406,40 @@ bool Core::Scripting::ScriptManager::onStatusReceive( Entity::ActorPtr pActor, u auto obj = m_pChaiHandler->eval( "statusDef_" + std::to_string( effectId ) ); std::string objName = "statusDef_" + std::to_string( effectId ); - pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName ); + if( pActor->isPlayer() ) + 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() ); + if( pActor->isPlayer() ) + pActor->getAsPlayer()->sendUrgent( e.what() ); } return true; } -bool Core::Scripting::ScriptManager::onStatusTick( Entity::ActorPtr pActor, uint32_t effectId ) +bool Core::Scripting::ScriptManager::onStatusTick( Entity::ActorPtr pActor, Core::StatusEffect::StatusEffect& effect ) { std::string eventName = "onTick"; try { - auto obj = m_pChaiHandler->eval( "statusDef_" + std::to_string( effectId ) ); - std::string objName = "statusDef_" + std::to_string( effectId ); + auto obj = m_pChaiHandler->eval( "statusDef_" + std::to_string( effect.getId() ) ); + std::string objName = "statusDef_" + std::to_string( effect.getId() ); - pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName ); - auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Actor& ) > >( eventName ); - fn( obj, *pActor ); + if( pActor->isPlayer() ) + pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName ); + + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Actor&, Core::StatusEffect::StatusEffect& ) > >( eventName ); + fn( obj, *pActor, effect ); } catch( std::exception& e ) { - pActor->getAsPlayer()->sendUrgent( e.what() ); + if( pActor->isPlayer() ) + pActor->getAsPlayer()->sendUrgent( e.what() ); } return true; @@ -447,13 +454,16 @@ bool Core::Scripting::ScriptManager::onStatusTimeOut( Entity::ActorPtr pActor, u auto obj = m_pChaiHandler->eval( "statusDef_" + std::to_string( effectId ) ); std::string objName = "statusDef_" + std::to_string( effectId ); - pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName ); + if( pActor->isPlayer() ) + 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() ); + if( pActor->isPlayer() ) + pActor->getAsPlayer()->sendUrgent( e.what() ); } return true; diff --git a/src/servers/Server_Zone/ScriptManager.h b/src/servers/Server_Zone/ScriptManager.h index e4c322de..fe75e729 100644 --- a/src/servers/Server_Zone/ScriptManager.h +++ b/src/servers/Server_Zone/ScriptManager.h @@ -53,7 +53,7 @@ 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 onStatusTick( Entity::ActorPtr pActor, Core::StatusEffect::StatusEffect& effect ); bool onStatusTimeOut( Entity::ActorPtr pActor, uint32_t effectId ); bool onZoneInit( ZonePtr pZone ); diff --git a/src/servers/Server_Zone/ScriptManagerInit.cpp b/src/servers/Server_Zone/ScriptManagerInit.cpp index f4e56ba9..4a125ce0 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::takeDamage ), "takeDamage" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::forceZoneing ), "setZone" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getClassAsInt ), "getClass" ); @@ -65,6 +66,7 @@ int Core::Scripting::ScriptManager::init() m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestSeq ), "questGetSeq" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::hasQuest ), "hasQuest" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getZoneId ), "getZoneId" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::handleScriptSkill ), "handleScriptSkill" ); m_pChaiHandler->add( chaiscript::fun( &Core::Event::mapEventActorToRealActor ), "mapActor" ); @@ -158,6 +160,8 @@ int Core::Scripting::ScriptManager::init() m_pChaiHandler->add( chaiscript::user_type< Entity::BattleNpc >(), "BattleNpc" ); m_pChaiHandler->add( chaiscript::user_type< StatusEffect::StatusEffect >(), "StatusEffect" ); + m_pChaiHandler->add( chaiscript::fun( &StatusEffect::StatusEffect::registerTickEffect ), "registerTickEffect" ); + m_pChaiHandler->add( chaiscript::user_type< Zone >(), "Zone" ); m_pChaiHandler->add( chaiscript::fun( &Zone::getName ), "getName" ); diff --git a/src/servers/Server_Zone/StatusEffect.cpp b/src/servers/Server_Zone/StatusEffect.cpp index d78df38e..b6734f6d 100644 --- a/src/servers/Server_Zone/StatusEffect.cpp +++ b/src/servers/Server_Zone/StatusEffect.cpp @@ -50,11 +50,22 @@ Core::StatusEffect::StatusEffect::~StatusEffect() { } +void Core::StatusEffect::StatusEffect::registerTickEffect( uint8_t type, uint32_t param ) +{ + m_currTickEffect = std::make_pair( type, param ); +} + +std::pair< uint8_t, uint32_t> Core::StatusEffect::StatusEffect::getTickEffect() +{ + auto thisTick = m_currTickEffect; + m_currTickEffect = std::make_pair( 0, 0 ); + return thisTick; +} void Core::StatusEffect::StatusEffect::onTick() { m_lastTick = Util::getTimeMs(); - g_scriptMgr.onStatusTick( m_targetActor, m_id ); + g_scriptMgr.onStatusTick( m_targetActor, *this ); } uint32_t Core::StatusEffect::StatusEffect::getSrcActorId() const diff --git a/src/servers/Server_Zone/StatusEffect.h b/src/servers/Server_Zone/StatusEffect.h index 7cb4dea9..070bfb44 100644 --- a/src/servers/Server_Zone/StatusEffect.h +++ b/src/servers/Server_Zone/StatusEffect.h @@ -33,6 +33,8 @@ public: uint16_t getParam() const; void setLastTick( uint64_t lastTick ); void setParam( uint16_t param ); + void registerTickEffect( uint8_t type, uint32_t param ); + std::pair< uint8_t, uint32_t> getTickEffect(); const std::string& getName() const; private: @@ -45,6 +47,7 @@ private: uint64_t m_lastTick; uint16_t m_param; std::string m_name; + std::pair< uint8_t, uint32_t> m_currTickEffect; }; diff --git a/src/servers/Server_Zone/StatusEffectContainer.cpp b/src/servers/Server_Zone/StatusEffectContainer.cpp index 32193ab2..85a9a392 100644 --- a/src/servers/Server_Zone/StatusEffectContainer.cpp +++ b/src/servers/Server_Zone/StatusEffectContainer.cpp @@ -125,6 +125,9 @@ void Core::StatusEffect::StatusEffectContainer::update() { uint64_t currentTimeMs = Util::getTimeMs(); + uint64_t thisTickDmg = 0; + uint64_t thisTickHeal = 0; + for( auto effectIt : m_effectMap ) { uint8_t effectIndex = effectIt.first; @@ -147,7 +150,38 @@ void Core::StatusEffect::StatusEffectContainer::update() { effect->setLastTick( currentTimeMs ); effect->onTick(); + + auto thisEffect = effect->getTickEffect(); + + switch( thisEffect.first ) + { + + case 1: + { + thisTickDmg += thisEffect.second; + break; + } + + case 2: + { + thisTickHeal += thisEffect.second; + break; + } + + } } } + + if( thisTickDmg != 0 ) + { + m_pOwner->takeDamage( thisTickDmg ); + m_pOwner->sendToInRangeSet( ActorControlPacket142( m_pOwner->getId(), HPFloatingText, 0, 3, thisTickDmg ) ); + } + + if( thisTickHeal != 0 ) + { + m_pOwner->heal( thisTickDmg ); + m_pOwner->sendToInRangeSet( ActorControlPacket142( m_pOwner->getId(), HPFloatingText, 0, 4, thisTickHeal ) ); + } } diff --git a/src/servers/Server_Zone/StatusEffectContainer.h b/src/servers/Server_Zone/StatusEffectContainer.h index 5dd20550..6f4acb9c 100644 --- a/src/servers/Server_Zone/StatusEffectContainer.h +++ b/src/servers/Server_Zone/StatusEffectContainer.h @@ -36,6 +36,7 @@ private: std::queue< uint8_t > m_freeEffectSlotQueue; std::vector< StatusEffectPtr > m_effectList; + std::vector< std::pair< uint8_t, uint32_t> > m_tickEffectList; std::map< uint8_t, StatusEffectPtr > m_effectMap; };