From 9f4648efa8e857ddbea16aa60890cf4bff133ba6 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 27 Dec 2018 00:36:47 +1100 Subject: [PATCH] add internal housing item placement --- src/common/Network/PacketDef/Ipcs.h | 1 + .../Network/PacketDef/Zone/ServerZoneDef.h | 13 ++++++++++ src/world/Manager/HousingMgr.cpp | 14 ++++------- .../Network/Handlers/ClientTriggerHandler.cpp | 2 ++ .../Housing/HousingInteriorTerritory.cpp | 24 +++++++++++-------- .../Housing/HousingInteriorTerritory.h | 2 +- 6 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 0273dc17..c4c82786 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -201,6 +201,7 @@ namespace Sapphire::Network::Packets HousingShowEstateGuestAccess = 0x022A, // updated 4.4 HousingObjectInitialize = 0x022C, // updated 4.4 + HousingInternalObjectSpawn = 0x22D, // updated 4.4 HousingWardInfo = 0x022F, // updated 4.4 YardObjectMove = 0x0230, // updated 4.4 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 75ea7041..2f039202 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1711,6 +1711,19 @@ struct FFXIVIpcHousingObjectInitialize : FFXIVIpcBasePacket< HousingObjectInitia uint32_t unknown4; //unused }; +struct FFXIVIpcHousingInternalObjectSpawn : FFXIVIpcBasePacket< HousingInternalObjectSpawn > +{ + uint16_t containerId; + uint8_t containerOffset; + uint8_t pad1; + + uint16_t itemId; + uint8_t unk2; + uint8_t pad2; + uint16_t rotation; + Common::FFXIVARR_POSITION3_U16 pos; +}; + struct FFXIVIpcHousingIndoorInitialize : FFXIVIpcBasePacket< HousingIndoorInitialize > { uint16_t u1; diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 0f481cd2..34737379 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -934,18 +934,14 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceHousingItem( Sapphire::Entity isOutside = true; } // otherwise, inside a house. landId is 0 when inside a plot - else if( landId == 0 ) + else if( auto zone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( player.getCurrentZone() ) ) { - auto zone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( player.getCurrentZone() ); - if( !zone ) - return; - // todo: this whole process is retarded and needs to be fixed // perhaps maintain a list of estates by ident inside housingmgr? auto ident = zone->getLandIdent(); auto landSet = toLandSetId( ident.territoryTypeId, ident.wardNum ); - land = getHousingZoneByLandSetId( landSet )->getLand( landId ); + land = getHousingZoneByLandSetId( landSet )->getLand( ident.landId ); } // wtf? else @@ -994,8 +990,8 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceHousingItem( Sapphire::Entity } else { - player.sendUrgent( "you can't place internal items (yet)" ); - return; + if( !placeInteriorItem( player, item ) ) + player.sendUrgent( "An internal error occurred when placing the item." ); } } @@ -1082,7 +1078,7 @@ bool Sapphire::World::Manager::HousingMgr::placeInteriorItem( Entity::Player& pl auto zone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( player.getCurrentZone() ); assert( zone ); - zone->spawnYardObject( containerIdx, freeSlot, item ); + zone->spawnYardObject( containerIdx, freeSlot, containerId, item ); return true; } diff --git a/src/world/Network/Handlers/ClientTriggerHandler.cpp b/src/world/Network/Handlers/ClientTriggerHandler.cpp index 157739eb..092c47a0 100644 --- a/src/world/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/world/Network/Handlers/ClientTriggerHandler.cpp @@ -448,6 +448,8 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX if( !housingMgr ) break; + + // housingMgr->sendHousingInventory( player, Common::InventoryType::HousingInd, 255 ); break; diff --git a/src/world/Territory/Housing/HousingInteriorTerritory.cpp b/src/world/Territory/Housing/HousingInteriorTerritory.cpp index a99daaed..bba2adaf 100644 --- a/src/world/Territory/Housing/HousingInteriorTerritory.cpp +++ b/src/world/Territory/Housing/HousingInteriorTerritory.cpp @@ -160,6 +160,7 @@ void Sapphire::World::Territory::Housing::HousingInteriorTerritory::updateYardOb void Sapphire::World::Territory::Housing::HousingInteriorTerritory::spawnYardObject( uint8_t containerIdx, uint16_t slot, + uint16_t containerType, Inventory::HousingItemPtr item ) { auto housingMgr = g_fw.get< Manager::HousingMgr >(); @@ -169,14 +170,17 @@ void Sapphire::World::Territory::Housing::HousingInteriorTerritory::spawnYardObj m_yardObjects[ offset ] = obj; -// for( const auto& player : m_playerMap ) -// { -// auto packet = makeZonePacket< Server::FFXIVIpcYardObjectSpawn >( player.second->getId() ); -// -// packet->data().landSetId = 0; -// packet->data().objectArray = static_cast< uint8_t >( offset ); -// packet->data().object = obj; -// -// player.second->queuePacket( packet ); -// } + for( const auto& player : m_playerMap ) + { + auto objectSpawnPkt = makeZonePacket< Server::FFXIVIpcHousingInternalObjectSpawn >( player.second->getId() ); + + objectSpawnPkt->data().containerId = containerType; + objectSpawnPkt->data().containerOffset = slot; + + objectSpawnPkt->data().itemId = item->getAdditionalData() & 0xFFFF; + objectSpawnPkt->data().rotation = item->getRot(); + objectSpawnPkt->data().pos = item->getPos(); + + player.second->queuePacket( objectSpawnPkt ); + } } \ No newline at end of file diff --git a/src/world/Territory/Housing/HousingInteriorTerritory.h b/src/world/Territory/Housing/HousingInteriorTerritory.h index 12bcc233..07c69040 100644 --- a/src/world/Territory/Housing/HousingInteriorTerritory.h +++ b/src/world/Territory/Housing/HousingInteriorTerritory.h @@ -25,7 +25,7 @@ namespace Sapphire::World::Territory::Housing const Common::LandIdent getLandIdent() const; void updateYardObjects(); - void spawnYardObject( uint8_t containerIdx, uint16_t slot, Inventory::HousingItemPtr item ); + void spawnYardObject( uint8_t containerIdx, uint16_t slot, uint16_t containerType, Inventory::HousingItemPtr item ); private: Common::LandIdent m_landIdent;