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;
};