@@ -437,8 +437,14 @@ void Chara::takeDamage( uint32_t damage, bool broadcastUpdate )
437437 break ;
438438 }
439439 }
440- else
440+ else if ( m_invincibilityType != InvincibilityIgnoreDamage )
441+ {
441442 m_hp -= damage;
443+ }
444+ else
445+ {
446+ damage = 0 ;
447+ }
442448
443449 if ( broadcastUpdate )
444450 {
@@ -548,6 +554,10 @@ void Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEffect )
548554 pEffect->setSlot ( nextSlot );
549555 m_statusEffectMap[ nextSlot ] = pEffect;
550556 pEffect->applyStatus ();
557+
558+ Network::Util::Packet::sendActorControl ( getInRangePlayerIds ( isPlayer () ), getId (), StatusEffectGain,
559+ pEffect->getId () );
560+ Network::Util::Packet::sendHudParam ( *this );
551561}
552562
553563/* ! \param StatusEffectPtr to be applied to the actor */
@@ -596,13 +606,13 @@ void Chara::replaceSingleStatusEffect( uint32_t slotId, StatusEffect::StatusEffe
596606 pStatus->applyStatus ();
597607}
598608
599- void Chara::replaceSingleStatusEffectById ( uint32_t id )
609+ void Chara::replaceSingleStatusEffectById ( uint32_t id, StatusEffect::StatusEffectPtr pStatus )
600610{
601611 for ( const auto & effectIt : m_statusEffectMap )
602612 {
603613 if ( effectIt.second ->getId () == id )
604614 {
605- removeStatusEffect ( effectIt.first , false );
615+ replaceSingleStatusEffect ( effectIt.first , pStatus );
606616 break ;
607617 }
608618 }
@@ -1063,16 +1073,25 @@ void Chara::knockback( const FFXIVARR_POSITION3& origin, float distance, bool ig
10631073 }
10641074 setPos ( navPos );
10651075 // speed needs to be reset properly here
1066- pNav->updateAgentPosition ( getAgentId (), getPos (), getRadius (), 1 );
1076+ setAgentId ( pNav->updateAgentPosition ( getAgentId (), getPos (), getRadius (), pNav-> getAgentSpeed ( getAgentId () ) ) );
10671077 }
10681078 else
10691079 {
10701080 setPos ( kbPos );
10711081 }
10721082 pTeri->updateActorPosition ( *this );
1083+
1084+ auto pTransferPacket = makeZonePacket< FFXIVIpcTransfer >( getId () );
1085+ pTransferPacket->data ().dir = Common::Util::floatToUInt16Rot ( getRot () );
1086+ pTransferPacket->data ().pos [ 0 ] = Common::Util::floatToUInt16 ( kbPos.x );
1087+ pTransferPacket->data ().pos [ 1 ] = Common::Util::floatToUInt16 ( kbPos.y );
1088+ pTransferPacket->data ().pos [ 2 ] = Common::Util::floatToUInt16 ( kbPos.z );
1089+ pTransferPacket->data ().duration = 1 .0f ;
1090+
10731091 // todo: send the correct knockback packet to player
10741092 server ().queueForPlayers ( getInRangePlayerIds (),
1075- std::make_shared< MoveActorPacket >( *this , getRotUInt8 (), 2 , 0 , 0 , 0x5A / 4 ) );
1093+ pTransferPacket );
1094+
10761095}
10771096
10781097void Chara::createAreaObject ( uint32_t actionId, uint32_t actionPotency, uint32_t vfxId, float scale,
0 commit comments