diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index fc4a1da2..76322136 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -104,6 +104,7 @@ namespace Packets { ActorCast = 0x0162, // updated 4.2 HateList = 0x0165, // updated 4.2 ObjectSpawn = 0x0167, // updated 4.2 + ObjectDespawn = 0x0168, // updated 4.2 UpdateClassInfo = 0x0169, // updated 4.2 InitUI = 0x016B, // updated 4.2 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 8684985d..59ebd4ab 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -414,8 +414,7 @@ struct FFXIVIpcPlayerSpawn : FFXIVIpcBasePacket */ struct FFXIVIpcNpcSpawn : FFXIVIpcBasePacket { - uint16_t title; - uint16_t u1b; + uint32_t mapLinkId; // needs to be existing in the map, mob will snap to it uint8_t u2b; uint8_t u2ab; uint8_t gmRank; @@ -1339,6 +1338,12 @@ struct FFXIVIpcObjectSpawn : FFXIVIpcBasePacket int16_t unknown; }; +struct FFXIVIpcObjectDespawn : FFXIVIpcBasePacket +{ + uint8_t spawnIndex; + uint8_t padding[7]; +}; + } /* Server */ } /* Packets */ diff --git a/src/servers/sapphire_zone/Actor/EventObject.cpp b/src/servers/sapphire_zone/Actor/EventObject.cpp index ef4d784a..abc5c92e 100644 --- a/src/servers/sapphire_zone/Actor/EventObject.cpp +++ b/src/servers/sapphire_zone/Actor/EventObject.cpp @@ -120,7 +120,7 @@ void Core::Entity::EventObject::despawn( Core::Entity::PlayerPtr pTarget ) { g_log.debug( "despawn eobj: " + std::to_string( getId() ) ); - pTarget->freeObjSpawnIndexForActorId( getId( )); + pTarget->freeObjSpawnIndexForActorId( getId( ) ); } const std::string& Core::Entity::EventObject::getName() const diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 0e2b299a..85090868 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1655,7 +1655,11 @@ void Core::Entity::Player::resetObjSpawnIndex() void Core::Entity::Player::freeObjSpawnIndexForActorId( uint32_t actorId ) { - m_objSpawnIndexAllocator.freeUsedSpawnIndex( actorId ); + auto spawnId = m_objSpawnIndexAllocator.freeUsedSpawnIndex( actorId ); + + ZoneChannelPacket< FFXIVIpcObjectDespawn > freeObjectSpawnPacket( getId() ); + freeObjectSpawnPacket.data().spawnIndex = spawnId; + queuePacket( freeObjectSpawnPacket ); } bool Core::Entity::Player::isObjSpawnIndexValid( uint8_t index )