diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 86b5f402..44590d6a 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -389,3 +389,20 @@ void Sapphire::Entity::BNpc::update( int64_t currTime ) } } } + +void Sapphire::Entity::BNpc::onActionHostile( Sapphire::Entity::CharaPtr pSource ) +{ + if( !hateListGetHighest() ) + aggro( pSource ); + + //if( !getClaimer() ) + // setOwner( pSource->getAsPlayer() ); +} + +void Sapphire::Entity::BNpc::onDeath() +{ + setTargetId( INVALID_GAME_OBJECT_ID ); + m_currentStance = Stance::Passive; + m_state = BNpcState::Dead; + hateListClear(); +} diff --git a/src/world/Actor/BNpc.h b/src/world/Actor/BNpc.h index 04a39164..db0fb1f9 100644 --- a/src/world/Actor/BNpc.h +++ b/src/world/Actor/BNpc.h @@ -79,6 +79,10 @@ namespace Sapphire::Entity void update( int64_t currTime ) override; + void onActionHostile( CharaPtr pSource ) override; + + void onDeath() override; + private: uint32_t m_bNpcBaseId; uint32_t m_bNpcNameId; diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index 3a42f836..65c59cf2 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -393,7 +393,7 @@ void Sapphire::Entity::Chara::autoAttack( CharaPtr pTarget ) if( ( tick - m_lastAttack ) > 2500 ) { - pTarget->onActionHostile( *this ); + pTarget->onActionHostile( getAsChara() ); m_lastAttack = tick; srand( static_cast< uint32_t >( tick ) ); @@ -461,7 +461,7 @@ void Sapphire::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionI sendToInRangeSet( effectPacket, true ); if( target.isAlive() ) - target.onActionHostile( *this ); + target.onActionHostile( getAsChara() ); target.takeDamage( static_cast< uint32_t >( param1 ) ); @@ -481,7 +481,7 @@ void Sapphire::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionI if( pHitActor->getAsChara()->isAlive() ) - pHitActor->getAsChara()->onActionHostile( *this ); + pHitActor->getAsChara()->onActionHostile( getAsChara() ); pHitActor->getAsChara()->takeDamage( static_cast< uint32_t >( param1 ) ); diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index 6d8d0748..94de7845 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -219,7 +219,7 @@ namespace Sapphire::Entity virtual void onDamageTaken( Chara& pSource ) {}; - virtual void onActionHostile( Chara& source ) {}; + virtual void onActionHostile( CharaPtr pSource ) {}; virtual void onActionFriendly( Chara& pSource ) {}; diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index aef8cbe2..9af7e25e 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -1515,7 +1515,7 @@ void Sapphire::Entity::Player::autoAttack( CharaPtr pTarget ) auto mainWeap = getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand ); - pTarget->onActionHostile( *this ); + pTarget->onActionHostile( getAsChara() ); //uint64_t tick = Util::getTimeMs(); //srand(static_cast< uint32_t >(tick)); diff --git a/src/world/Network/PacketWrappers/NpcSpawnPacket.h b/src/world/Network/PacketWrappers/NpcSpawnPacket.h index f487c50f..1c9567b0 100644 --- a/src/world/Network/PacketWrappers/NpcSpawnPacket.h +++ b/src/world/Network/PacketWrappers/NpcSpawnPacket.h @@ -44,12 +44,8 @@ namespace Sapphire::Network::Packets::Server m_data.pose = bnpc.getPose(); memcpy( m_data.look, bnpc.getLookArray(), sizeof( m_data.look ) ); - - auto models = bnpc.getModelArray(); memcpy( m_data.models, bnpc.getModelArray(), sizeof( m_data.models ) ); - memcpy( m_data.look, bnpc.getLookArray(), sizeof( m_data.look ) ); - m_data.pos.x = bnpc.getPos().x; m_data.pos.y = bnpc.getPos().y; m_data.pos.z = bnpc.getPos().z; @@ -61,10 +57,6 @@ namespace Sapphire::Network::Packets::Server m_data.aggressionMode = bnpc.getAggressionMode(); m_data.classJob = 0; - //m_data.voice = bnpc.getVoiceId(); - //m_data.currentMount = bnpc.getCurrentMount(); - - //m_data.onlineStatus = static_cast< uint8_t >( bnpc.getOnlineStatus() ); //m_data.u23 = 0x04; //m_data.u24 = 256; @@ -85,21 +77,10 @@ namespace Sapphire::Network::Packets::Server // 0x20 == spawn hidden to be displayed by the spawneffect control //m_data.displayFlags = bnpc.getDisplayFlags(); - /*if( bnpc.getZoningType() != Common::ZoneingType::None ) - { - m_data.displayFlags |= static_cast< uint16_t >( Common::DisplayFlags::Invisible ); - }*/ - //m_data.currentMount = bnpc.getCurrentMount(); //m_data.persistentEmote = bnpc.getPersistentEmote(); m_data.targetId = static_cast< uint64_t >( bnpc.getTargetId() ); - //m_data.type = 1; - //m_data.unknown_33 = 4; - //m_data.unknown_38 = 0x70; - //m_data.unknown_60 = 3; - //m_data.unknown_61 = 7; - uint64_t currentTimeMs = Sapphire::Util::getTimeMs();