From 603604b28dab4cd73c275b5f5e40604af0f24ebe Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 19 Jan 2019 17:50:33 +1100 Subject: [PATCH 1/2] fix bnpcs not despawning, stop passive mobs from aggroing the player --- src/world/Actor/BNpc.cpp | 9 +++++++++ src/world/Actor/BNpc.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index d95e9056..ae698688 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -130,6 +130,11 @@ void Sapphire::Entity::BNpc::spawn( PlayerPtr pTarget ) pTarget->queuePacket( std::make_shared< NpcSpawnPacket >( *getAsBNpc(), *pTarget ) ); } +void Sapphire::Entity::BNpc::despawn( PlayerPtr pTarget ) +{ + pTarget->freePlayerSpawnId( getId() ); +} + Sapphire::Entity::BNpcState Sapphire::Entity::BNpc::getState() const { return m_state; @@ -306,6 +311,10 @@ void Sapphire::Entity::BNpc::update( int64_t currTime ) case BNpcState::Idle: { + // passive mobs should ignore players unless aggro'd + if( m_aggressionMode == 1 ) + return; + CharaPtr pClosestChara = getClosestChara(); if( pClosestChara && pClosestChara->isAlive() ) diff --git a/src/world/Actor/BNpc.h b/src/world/Actor/BNpc.h index 65bd166a..04a39164 100644 --- a/src/world/Actor/BNpc.h +++ b/src/world/Actor/BNpc.h @@ -44,6 +44,7 @@ namespace Sapphire::Entity virtual ~BNpc() override; void spawn( PlayerPtr pTarget ) override; + void despawn( PlayerPtr pTarget ) override; uint16_t getModelChara() const; uint8_t getLevel() const override; From 9712f94d00e1bc07201d88b40d38d4ac26a3fbc3 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 19 Jan 2019 19:28:12 +1100 Subject: [PATCH 2/2] cleanup spawn slot handling for bnpcs --- .../Network/PacketWrappers/NpcSpawnPacket.h | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/world/Network/PacketWrappers/NpcSpawnPacket.h b/src/world/Network/PacketWrappers/NpcSpawnPacket.h index ce6a0005..dc4f9402 100644 --- a/src/world/Network/PacketWrappers/NpcSpawnPacket.h +++ b/src/world/Network/PacketWrappers/NpcSpawnPacket.h @@ -76,17 +76,14 @@ namespace Sapphire::Network::Packets::Server m_data.bNPCName = bnpc.getBNpcNameId(); m_data.state = 1; - if( target.getId() == bnpc.getId() ) - { - m_data.spawnIndex = 0x00; - } - else - { - m_data.spawnIndex = target.getSpawnIdForActorId( bnpc.getId() ); - if( !target.isActorSpawnIdValid( m_data.spawnIndex ) ) - return; - } + assert( target.getId() != bnpc.getId() ); + + m_data.spawnIndex = target.getSpawnIdForActorId( bnpc.getId() ); + + if( !target.isActorSpawnIdValid( m_data.spawnIndex ) ) + return; + // 0x20 == spawn hidden to be displayed by the spawneffect control //m_data.displayFlags = bnpc.getDisplayFlags();