diff --git a/sql/update.sql b/sql/update.sql index 331b0598..239bb5a4 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -47,4 +47,5 @@ ALTER TABLE `charainfo` CHANGE `Mounts` `Mounts` BINARY(15) NULL DEFAULT NULL; ALTER TABLE `charainfo` CHANGE `Orchestrion` `Orchestrion` BINARY(40) NULL DEFAULT NULL; ALTER TABLE `charainfo` CHANGE `Minions` `Minions` BINARY(37) NULL DEFAULT NULL; ALTER TABLE `charainfo` CHANGE `QuestCompleteFlags` `QuestCompleteFlags` VARBINARY(396) NULL DEFAULT NULL; -ALTER TABLE `charainfo` ADD COLUMN `EquipDisplayFlags` INT(3) NULL DEFAULT '0' AFTER `GMRank`; \ No newline at end of file +ALTER TABLE `charainfo` ADD COLUMN `EquipDisplayFlags` INT(3) NULL DEFAULT '0' AFTER `GMRank`; +ALTER TABLE `charainfo` ADD COLUMN `Pose` INT(3) NULL DEFAULT '0' AFTER `EquipDisplayFlags`; \ No newline at end of file diff --git a/src/common/Database/CharaDbConnection.cpp b/src/common/Database/CharaDbConnection.cpp index 215f347c..d3dd29a2 100644 --- a/src/common/Database/CharaDbConnection.cpp +++ b/src/common/Database/CharaDbConnection.cpp @@ -29,7 +29,8 @@ void Core::Db::CharaDbConnection::doPrepareStatements() "FavoritePoint, RestPoint, StartTown, ActiveTitle, TitleList, Achievement, " "Aetheryte, HowTo, Minions, Mounts, Orchestrion, EquippedMannequin, ConfigFlags, " "QuestCompleteFlags, OpeningSequence, QuestTracking, GrandCompany, " - "GrandCompanyRank, Discovery, GMRank, EquipDisplayFlags, Unlocks, CFPenaltyUntil " + "GrandCompanyRank, Discovery, GMRank, EquipDisplayFlags, Unlocks, CFPenaltyUntil, " + "Pose " "FROM charainfo WHERE CharacterId = ?;", CONNECTION_SYNC ); @@ -44,7 +45,7 @@ void Core::Db::CharaDbConnection::doPrepareStatements() "ActiveTitle = ?, TitleList = ?, Achievement = ?, Aetheryte = ?, HowTo = ?, Minions = ?, Mounts = ?, Orchestrion = ?, " "EquippedMannequin = ?, ConfigFlags = ?, QuestCompleteFlags = ?, OpeningSequence = ?, " "QuestTracking = ?, GrandCompany = ?, GrandCompanyRank = ?, Discovery = ?, GMRank = ?, EquipDisplayFlags = ?, Unlocks = ?, " - "CFPenaltyUntil = ? WHERE CharacterId = ?;", CONNECTION_ASYNC ); + "CFPenaltyUntil = ?, Pose = ? WHERE CharacterId = ?;", CONNECTION_ASYNC ); prepareStatement( CHARA_SEL_MINIMAL, "SELECT Name, Customize, ModelEquip, TerritoryId, GuardianDeity, " diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 2c7073ec..adf894a2 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -277,6 +277,16 @@ bool Core::Entity::Player::isAutoattackOn() const return m_bAutoattack; } +uint8_t Core::Entity::Player::getPose() const +{ + return m_pose; +} + +void Core::Entity::Player::setPose( uint8_t pose ) +{ + m_pose = pose; +} + void Core::Entity::Player::sendStats() { diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 2a19b399..b03bb9dd 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -565,6 +565,9 @@ public: void setAutoattack( bool mode ); bool isAutoattackOn() const; + uint8_t getPose() const; + void setPose( uint8_t pose ); + // Content Finder handling ////////////////////////////////////////////////////////////////////////////////////////////////////// /*! Get an unix time when the player can register into content finder again. */ @@ -719,6 +722,7 @@ private: uint8_t m_mount; uint32_t m_emoteMode; + uint8_t m_pose; Util::SpawnIndexAllocator< uint8_t > m_objSpawnIndexAllocator; Util::SpawnIndexAllocator< uint8_t > m_actorSpawnIndexAllocator; diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 3177fbdc..070cd65f 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -151,6 +151,8 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession ) m_equipDisplayFlags = res->getUInt8( "EquipDisplayFlags" ); + m_pose = res->getUInt8( "Pose" ); + // Blobs auto howTo = res->getBlobVector( "HowTo" ); @@ -328,7 +330,7 @@ void Core::Entity::Player::updateSql() "ActiveTitle 36, TitleList 37, Achievement 38, Aetheryte 39, HowTo 40, Minions 41, Mounts 42, Orchestrion 43, " "EquippedMannequin 44, ConfigFlags 45, QuestCompleteFlags 46, OpeningSequence 47, " "QuestTracking 48, GrandCompany 49, GrandCompanyRank 50, Discovery 51, GMRank 52, Unlocks 53, " - "CFPenaltyUntil 54"*/ + "CFPenaltyUntil 54, Pose 55"*/ auto stmt = pDb->getPreparedStatement( Db::CharaDbStatements::CHARA_UP ); stmt->setInt( 1, getHp() ); @@ -438,7 +440,9 @@ void Core::Entity::Player::updateSql() stmt->setInt( 55, m_cfPenaltyUntil ); - stmt->setInt( 56, m_id ); + stmt->setInt( 56, m_pose ); + + stmt->setInt( 57, m_id ); pDb->execute( stmt ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 4c5fae88..b2a3322e 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -184,15 +184,22 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR break; } case ClientTriggerType::PoseChange: // change pose - { - break; - } case ClientTriggerType::PoseReapply: // reapply pose { + player.setPose( param12 ); + auto pSetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), + SetPose, + param11, param12 ); + player.sendToInRangeSet( pSetStatusPacket, true ); break; } case ClientTriggerType::PoseCancel: // cancel pose { + player.setPose( param12 ); + auto pSetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), + SetPose, + param11, param12 ); + player.sendToInRangeSet( pSetStatusPacket, true ); break; } case ClientTriggerType::Return: // return dead / accept raise