From d6a6de6f77ac46c15cc99264becfa0ba859738f8 Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Thu, 20 Dec 2018 20:41:16 +1100
Subject: [PATCH 01/10] handle inventory packet sequencing properly for items &
containers
---
bin/sql/schema/schema.sql | 7 ++++---
src/world/Actor/Player.h | 4 ++++
src/world/Actor/PlayerInventory.cpp | 12 +++++++-----
src/world/Manager/HousingMgr.cpp | 8 ++++++++
src/world/Manager/InventoryMgr.cpp | 4 ++--
src/world/Manager/InventoryMgr.h | 3 +--
6 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/bin/sql/schema/schema.sql b/bin/sql/schema/schema.sql
index b87b2a9b..185d0225 100644
--- a/bin/sql/schema/schema.sql
+++ b/bin/sql/schema/schema.sql
@@ -530,9 +530,10 @@ CREATE TABLE `landset` (
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `houseiteminventory` (
- `landIdent` BIGINT(20) UNSIGNED NOT NULL,
- `containerId` INT(10) UNSIGNED NOT NULL,
- `itemId` INT(20) NOT NULL,
+ `LandIdent` BIGINT(20) UNSIGNED NOT NULL,
+ `ContainerId` INT(10) UNSIGNED NOT NULL,
+ `ItemId` INT(20) NOT NULL,
+ `SlotId` INT(10) UNSIGNED NOT NULL,
INDEX `landIdent` (`landIdent`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h
index 8532e21a..34ea3204 100644
--- a/src/world/Actor/Player.h
+++ b/src/world/Actor/Player.h
@@ -910,6 +910,8 @@ namespace Sapphire::Entity
bool isObtainable( uint32_t catalogId, uint8_t quantity );
+ uint32_t getNextInventorySequence();
+
void send();
uint8_t getFreeSlotsInBags();
@@ -939,6 +941,8 @@ namespace Sapphire::Entity
bool m_onEnterEventDone;
+ uint32_t m_inventorySequence;
+
private:
using InventoryMap = std::map< uint16_t, Sapphire::ItemContainerPtr >;
diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp
index 365bd622..67545381 100644
--- a/src/world/Actor/PlayerInventory.cpp
+++ b/src/world/Actor/PlayerInventory.cpp
@@ -357,14 +357,11 @@ void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t
void Sapphire::Entity::Player::sendInventory()
{
- InventoryMap::iterator it;
-
auto pInvMgr = g_fw.get< World::Manager::InventoryMgr >();
- uint32_t count = 0;
- for( it = m_storageMap.begin(); it != m_storageMap.end(); ++it, ++count )
+ for( auto it = m_storageMap.begin(); it != m_storageMap.end(); ++it )
{
- pInvMgr->sendInventoryContainer( *this, it->second, count );
+ pInvMgr->sendInventoryContainer( *this, it->second );
}
}
@@ -867,3 +864,8 @@ bool Sapphire::Entity::Player::collectHandInItems( std::vector< uint32_t > itemI
return true;
}
+
+uint32_t Sapphire::Entity::Player::getNextInventorySequence()
+{
+ return m_inventorySequence++;
+}
diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp
index 2a999e95..80fcbf8c 100644
--- a/src/world/Manager/HousingMgr.cpp
+++ b/src/world/Manager/HousingMgr.cpp
@@ -24,6 +24,7 @@
#include "Framework.h"
#include "ServerMgr.h"
#include "Territory/House.h"
+#include "InventoryMgr.h"
using namespace Sapphire::Common;
using namespace Sapphire::Network;
@@ -508,5 +509,12 @@ void Sapphire::World::Manager::HousingMgr::sendHousingInventory( Entity::Player&
if( targetLand->getOwnerId() != player.getId() )
return;
+ auto container = targetLand->getItemContainer( inventoryType );
+ if( !container )
+ return;
+
player.sendDebug( "got inventory for plot: " + targetLand->getHouse()->getHouseName() );
+
+ auto invMgr = g_fw.get< Manager::InventoryMgr >();
+ invMgr->sendInventoryContainer( player, container );
}
\ No newline at end of file
diff --git a/src/world/Manager/InventoryMgr.cpp b/src/world/Manager/InventoryMgr.cpp
index 8ce40ffe..6529d617 100644
--- a/src/world/Manager/InventoryMgr.cpp
+++ b/src/world/Manager/InventoryMgr.cpp
@@ -10,9 +10,9 @@
using namespace Sapphire::Network::Packets;
void Sapphire::World::Manager::InventoryMgr::sendInventoryContainer( Sapphire::Entity::Player& player,
- Sapphire::ItemContainerPtr container,
- uint32_t sequence )
+ Sapphire::ItemContainerPtr container )
{
+ auto sequence = player.getNextInventorySequence();
auto pMap = container->getItemMap();
for( auto itM = pMap.begin(); itM != pMap.end(); ++itM )
diff --git a/src/world/Manager/InventoryMgr.h b/src/world/Manager/InventoryMgr.h
index 55869850..26fae576 100644
--- a/src/world/Manager/InventoryMgr.h
+++ b/src/world/Manager/InventoryMgr.h
@@ -9,8 +9,7 @@ namespace Sapphire::World::Manager
class InventoryMgr
{
public:
- void sendInventoryContainer( Sapphire::Entity::Player& player, Sapphire::ItemContainerPtr container,
- uint32_t sequence = 0 );
+ void sendInventoryContainer( Sapphire::Entity::Player& player, Sapphire::ItemContainerPtr container );
};
}
From 8da5ae47dbf4a84c2f72a19e8d9aeac6cbb72580 Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Thu, 20 Dec 2018 21:52:18 +1100
Subject: [PATCH 02/10] correctly send exterior placed items/storeroom
inventories
---
src/common/Common.h | 32 ++++++++++++++++---
src/common/Network/CommonActorControl.h | 1 +
.../Network/Handlers/ClientTriggerHandler.cpp | 12 ++++---
src/world/Territory/Land.cpp | 21 +++++++++---
src/world/Territory/Land.h | 1 +
5 files changed, 54 insertions(+), 13 deletions(-)
diff --git a/src/common/Common.h b/src/common/Common.h
index 14de2012..796f01eb 100644
--- a/src/common/Common.h
+++ b/src/common/Common.h
@@ -222,10 +222,34 @@ namespace Sapphire::Common
FreeCompanyGil = 22000,
FreeCompanyCrystal = 22001,
- HousingExternalAppearance = 25000,
- HousingOutdoorItemStoreroom = 25001,
- HousingInternalAppearance = 25002,
- HousingIndoorItemStoreroom = 25003,
+ // housing interior containers
+ HousingInteriorAppearance = 25002,
+
+ // 50 in each container max
+ HousingInteriorPlacedItems1 = 25003,
+ HousingInteriorPlacedItems2 = 25004,
+ HousingInteriorPlacedItems3 = 25005,
+ HousingInteriorPlacedItems4 = 25006,
+ HousingInteriorPlacedItems5 = 25007,
+ HousingInteriorPlacedItems6 = 25008,
+
+ // 50 max per container?
+ HousingInteriorStoreroom1 = 27001,
+ HousingInteriorStoreroom2 = 27002,
+ HousingInteriorStoreroom3 = 27003,
+ HousingInteriorStoreroom4 = 27004,
+ HousingInteriorStoreroom5 = 27005,
+ HousingInteriorStoreroom6 = 27006,
+ HousingInteriorStoreroom7 = 27007,
+ HousingInteriorStoreroom8 = 27008,
+
+
+ // housing exterior containers
+ HousingOutdoorPlacedItems = 25001,
+ HousingOutdoorAppearance = 25000,
+ HousingOutdoorStoreroom = 27000,
+
+
};
enum ContainerType : uint16_t
diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h
index 1f55a52b..0f0eda35 100644
--- a/src/common/Network/CommonActorControl.h
+++ b/src/common/Network/CommonActorControl.h
@@ -304,6 +304,7 @@ enum ActorControlType : uint16_t
AchievementCritReq = 0x3E8,
AchievementList = 0x3E9,
+ SetEstateLightingLevel = 0x40B, // param1 = light level 0 - 5 maps to UI val 5-0
RequestHousingBuildPreset = 0x44C,
RequestEstateHallRemoval = 0x44F,
RequestBuildPreset = 0x450, // no idea what this is, it gets sent with BuildPresetHandler and has the plot id in param1
diff --git a/src/world/Network/Handlers/ClientTriggerHandler.cpp b/src/world/Network/Handlers/ClientTriggerHandler.cpp
index 40add015..de7528c2 100644
--- a/src/world/Network/Handlers/ClientTriggerHandler.cpp
+++ b/src/world/Network/Handlers/ClientTriggerHandler.cpp
@@ -423,16 +423,18 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX
}
case ClientTriggerType::RequestLandInventory:
{
- if( param2 != 1 )
- return;
-
uint8_t plot = ( param12 & 0xFF );
+
auto housingMgr = g_fw.get< HousingMgr >();
if( !housingMgr )
break;
- housingMgr->sendHousingInventory( player, Common::InventoryType::HousingOutdoorItemStoreroom, plot );
+ uint16_t inventoryType = Common::InventoryType::HousingOutdoorPlacedItems;
+ if( param2 == 1 )
+ inventoryType = Common::InventoryType::HousingOutdoorStoreroom;
+
+ housingMgr->sendHousingInventory( player, inventoryType, plot );
break;
}
@@ -446,7 +448,7 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX
if( !housingMgr )
break;
- housingMgr->sendHousingInventory( player, Common::InventoryType::HousingIndoorItemStoreroom, 255 );
+ // housingMgr->sendHousingInventory( player, Common::InventoryType::HousingInd, 255 );
break;
}
diff --git a/src/world/Territory/Land.cpp b/src/world/Territory/Land.cpp
index ee815597..5f7abd9d 100644
--- a/src/world/Territory/Land.cpp
+++ b/src/world/Territory/Land.cpp
@@ -122,10 +122,23 @@ void Sapphire::Land::init()
m_landInventoryMap[ type ] = make_ItemContainer( type, maxSize, "houseiteminventory", true, true );
};
- setupContainer( InventoryType::HousingExternalAppearance, 8 );
- setupContainer( InventoryType::HousingInternalAppearance, 8 );
- setupContainer( InventoryType::HousingOutdoorItemStoreroom, m_maxPlacedExternalItems );
- setupContainer( InventoryType::HousingIndoorItemStoreroom, m_maxPlacedInternalItems );
+ setupContainer( InventoryType::HousingOutdoorAppearance, 8 );
+ setupContainer( InventoryType::HousingOutdoorPlacedItems, m_maxPlacedExternalItems );
+ setupContainer( InventoryType::HousingOutdoorStoreroom, m_maxPlacedExternalItems );
+
+ setupContainer( InventoryType::HousingInteriorAppearance, 9 );
+
+ //uint64_t uId, uint32_t catalogId, uint64_t model1, uint64_t model2, bool isHq
+ auto item = make_Item( 0x1000, 6600, 0, 0, false );
+ item->setStackSize(1);
+
+ m_landInventoryMap[ InventoryType::HousingOutdoorPlacedItems ]->setItem( 0, item );
+ m_landInventoryMap[ InventoryType::HousingOutdoorStoreroom ]->setItem( 0, item );
+}
+
+void Sapphire::Land::loadItemContainerContents()
+{
+
}
uint32_t Sapphire::Land::convertItemIdToHousingItemId( uint32_t itemId )
diff --git a/src/world/Territory/Land.h b/src/world/Territory/Land.h
index 5aadbb94..a7b73192 100644
--- a/src/world/Territory/Land.h
+++ b/src/world/Territory/Land.h
@@ -62,6 +62,7 @@ namespace Sapphire
uint8_t getLandTag( uint8_t slot );
ItemContainerPtr getItemContainer( uint16_t inventoryType ) const;
+ void loadItemContainerContents();
private:
uint32_t convertItemIdToHousingItemId( uint32_t itemId );
From c54ceea6079528f0fffa872cb54e5a09932fdc57 Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Thu, 20 Dec 2018 21:54:03 +1100
Subject: [PATCH 03/10] fix lambda type and remove testing code
---
src/world/Manager/HousingMgr.cpp | 2 --
src/world/Territory/Land.cpp | 9 +--------
2 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp
index 80fcbf8c..539bd634 100644
--- a/src/world/Manager/HousingMgr.cpp
+++ b/src/world/Manager/HousingMgr.cpp
@@ -513,8 +513,6 @@ void Sapphire::World::Manager::HousingMgr::sendHousingInventory( Entity::Player&
if( !container )
return;
- player.sendDebug( "got inventory for plot: " + targetLand->getHouse()->getHouseName() );
-
auto invMgr = g_fw.get< Manager::InventoryMgr >();
invMgr->sendInventoryContainer( player, container );
}
\ No newline at end of file
diff --git a/src/world/Territory/Land.cpp b/src/world/Territory/Land.cpp
index 5f7abd9d..20035793 100644
--- a/src/world/Territory/Land.cpp
+++ b/src/world/Territory/Land.cpp
@@ -117,7 +117,7 @@ void Sapphire::Land::init()
}
// init item containers
- auto setupContainer = [ this ]( InventoryType type, uint8_t maxSize )
+ auto setupContainer = [ this ]( InventoryType type, uint16_t maxSize )
{
m_landInventoryMap[ type ] = make_ItemContainer( type, maxSize, "houseiteminventory", true, true );
};
@@ -127,13 +127,6 @@ void Sapphire::Land::init()
setupContainer( InventoryType::HousingOutdoorStoreroom, m_maxPlacedExternalItems );
setupContainer( InventoryType::HousingInteriorAppearance, 9 );
-
- //uint64_t uId, uint32_t catalogId, uint64_t model1, uint64_t model2, bool isHq
- auto item = make_Item( 0x1000, 6600, 0, 0, false );
- item->setStackSize(1);
-
- m_landInventoryMap[ InventoryType::HousingOutdoorPlacedItems ]->setItem( 0, item );
- m_landInventoryMap[ InventoryType::HousingOutdoorStoreroom ]->setItem( 0, item );
}
void Sapphire::Land::loadItemContainerContents()
From 361c4a0b6a6bcbd8f484f63470a4769dad339ea7 Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Thu, 20 Dec 2018 23:38:39 +1100
Subject: [PATCH 04/10] container count notes
---
src/common/Common.h | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/common/Common.h b/src/common/Common.h
index 796f01eb..96e46fc8 100644
--- a/src/common/Common.h
+++ b/src/common/Common.h
@@ -225,7 +225,7 @@ namespace Sapphire::Common
// housing interior containers
HousingInteriorAppearance = 25002,
- // 50 in each container max
+ // 50 in each container max, 300 slots max
HousingInteriorPlacedItems1 = 25003,
HousingInteriorPlacedItems2 = 25004,
HousingInteriorPlacedItems3 = 25005,
@@ -233,7 +233,9 @@ namespace Sapphire::Common
HousingInteriorPlacedItems5 = 25007,
HousingInteriorPlacedItems6 = 25008,
- // 50 max per container?
+ // 50 max per container, 400 slots max
+ // slot limit increased 'temporarily' for relocation for all estates
+ // see: https://na.finalfantasyxiv.com/lodestone/topics/detail/d781e0d538428aef93b8bed4b50dd62c3c50fc74
HousingInteriorStoreroom1 = 27001,
HousingInteriorStoreroom2 = 27002,
HousingInteriorStoreroom3 = 27003,
From 7dbbeea94ccadce28a166b4febe21b61e56809c9 Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Thu, 20 Dec 2018 23:57:01 +1100
Subject: [PATCH 05/10] maybe fix travis, fix ci link in readme
---
.travis.yml | 3 ++-
README.md | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 3df10328..c468e2ef 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -29,7 +29,8 @@ cache:
# Setup build matrix and dependencies
before_install:
- eval "${MATRIX_EVAL}"
- - gem install --no-ri --no-rdoc mtime_cache
+ - echo "gem: --no-document" >> ~/.gemrc
+ - gem install mtime_cache
- sudo add-apt-repository -y ppa:rexut/recoil
- sudo apt-get update
- sudo apt-get install -y libmysqlclient-dev
diff --git a/README.md b/README.md
index 1d441c47..582f4ebf 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
[](https://discord.gg/xxcdCER)
-[](https://travis-ci.org/SapphireMordred/Sapphire)
+[](https://travis-ci.org/SapphireServer/Sapphire)
[](https://ci.appveyor.com/project/SapphireMordred/Sapphire)
From 228af2d18561586a35d3a46497627542ae9b6616 Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Thu, 20 Dec 2018 23:59:13 +1100
Subject: [PATCH 06/10] remove old boost shit from travis
---
.travis.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index c468e2ef..91c97051 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -31,7 +31,6 @@ before_install:
- eval "${MATRIX_EVAL}"
- echo "gem: --no-document" >> ~/.gemrc
- gem install mtime_cache
- - sudo add-apt-repository -y ppa:rexut/recoil
- sudo apt-get update
- sudo apt-get install -y libmysqlclient-dev
From dc5a16512a6ae3faa58449e800a9b459fcc79804 Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Fri, 21 Dec 2018 00:00:05 +1100
Subject: [PATCH 07/10] maybe this works
---
.travis.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index 91c97051..70c3d8dd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -29,7 +29,7 @@ cache:
# Setup build matrix and dependencies
before_install:
- eval "${MATRIX_EVAL}"
- - echo "gem: --no-document" >> ~/.gemrc
+ - echo 'gem: --no-document' >> ~/.gemrc
- gem install mtime_cache
- sudo apt-get update
- sudo apt-get install -y libmysqlclient-dev
From 07fbc3f24519126d33bd79c8c247161d2b38c113 Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Fri, 21 Dec 2018 00:04:11 +1100
Subject: [PATCH 08/10] fucking ruby devs
---
.travis.yml | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 70c3d8dd..5e0ff6c4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,7 +13,6 @@ matrix:
apt:
sources:
- ubuntu-toolchain-r-test
- - llvm-toolchain-trusty-6.0
packages:
- clang-6.0
- g++-7
@@ -29,8 +28,7 @@ cache:
# Setup build matrix and dependencies
before_install:
- eval "${MATRIX_EVAL}"
- - echo 'gem: --no-document' >> ~/.gemrc
- - gem install mtime_cache
+ - gem install mtime_cache --no-ri --no-rdoc
- sudo apt-get update
- sudo apt-get install -y libmysqlclient-dev
From a9c0ce08c72d8bc41518803efc5fccf0c53bd21a Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Fri, 21 Dec 2018 00:06:36 +1100
Subject: [PATCH 09/10] don't attempt to install clang
---
.travis.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index 5e0ff6c4..3783642b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,7 +14,6 @@ matrix:
sources:
- ubuntu-toolchain-r-test
packages:
- - clang-6.0
- g++-7
env:
- MATRIX_EVAL="CC=gcc-7 && CXX=g++-7"
From 5a4e4ee58ddacd61d487aa8ba1b8bdf6f2e1e9cb Mon Sep 17 00:00:00 2001
From: NotAdam
Date: Fri, 21 Dec 2018 00:10:13 +1100
Subject: [PATCH 10/10] how about this
---
.travis.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index 3783642b..8ca1bc43 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -27,7 +27,7 @@ cache:
# Setup build matrix and dependencies
before_install:
- eval "${MATRIX_EVAL}"
- - gem install mtime_cache --no-ri --no-rdoc
+ - gem install mtime_cache --no-document
- sudo apt-get update
- sudo apt-get install -y libmysqlclient-dev