From f3a635f95274a703586596ce9d6ec2fc854c1347 Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Fri, 21 Sep 2018 01:59:45 +1000 Subject: [PATCH 1/7] Lobby now shows correct info for everything --- src/common/Database/ZoneDbConnection.cpp | 4 +- src/servers/sapphire_api/PlayerMinimal.cpp | 45 ++++++++++++++++++---- src/servers/sapphire_api/PlayerMinimal.h | 8 ++++ 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/common/Database/ZoneDbConnection.cpp b/src/common/Database/ZoneDbConnection.cpp index cf9d9e8c..0db28603 100644 --- a/src/common/Database/ZoneDbConnection.cpp +++ b/src/common/Database/ZoneDbConnection.cpp @@ -50,8 +50,8 @@ void Core::Db::ZoneDbConnection::doPrepareStatements() "CFPenaltyUntil = ?, Pose = ? WHERE CharacterId = ?;", CONNECTION_ASYNC ); - prepareStatement( CHARA_SEL_MINIMAL, "SELECT Name, Customize, ModelEquip, TerritoryId, GuardianDeity, " - "Class, ContentId, BirthDay, BirthMonth " + prepareStatement( CHARA_SEL_MINIMAL, "SELECT Name, Customize, ModelMainWeapon, ModelSubWeapon, ModelEquip, TerritoryId, GuardianDeity, " + "Class, ContentId, BirthDay, BirthMonth, EquipDisplayFlags " "FROM charainfo WHERE CharacterId = ?;", CONNECTION_SYNC ); prepareStatement( CHARA_INS, "INSERT INTO charainfo (AccountId, CharacterId, ContentId, Name, Hp, Mp, " diff --git a/src/servers/sapphire_api/PlayerMinimal.cpp b/src/servers/sapphire_api/PlayerMinimal.cpp index c79b2f28..9440a096 100644 --- a/src/servers/sapphire_api/PlayerMinimal.cpp +++ b/src/servers/sapphire_api/PlayerMinimal.cpp @@ -55,12 +55,16 @@ void PlayerMinimal::load( uint32_t charId ) auto modelEquip = res->getBlobVector( "ModelEquip" ); memcpy( ( char* ) m_modelEquip, modelEquip.data(), modelEquip.size() ); + m_modelMainWeapon = res->getUInt64( "ModelMainWeapon" ); + m_modelSubWeapon = res->getUInt64( "ModelSubWeapon" ); + m_equipDisplayFlags = res->getUInt8( "EquipDisplayFlags" ); + setBirthDay( res->getUInt8( "BirthDay" ), res->getUInt8( "BirthMonth" ) ); m_guardianDeity = res->getUInt8( "GuardianDeity" ); m_class = res->getUInt8( "Class" ); m_contentId = res->getUInt64( "ContentId" ); - m_zoneId = res->getUInt8( "TerritoryId" ); + m_zoneId = res->getUInt16( "TerritoryId" ); // SELECT ClassIdx, Exp, Lvl auto stmtClass = g_charaDb.getPreparedStatement( Db::ZoneDbStatements::CHARA_SEL_MINIMAL ); @@ -104,15 +108,20 @@ std::string PlayerMinimal::getModelString() + std::to_string( m_modelEquip[ 1 ] ) + "\",\"" + std::to_string( m_modelEquip[ 2 ] ) + "\",\"" + std::to_string( m_modelEquip[ 3 ] ) + "\",\"" - + std::to_string( m_modelEquip[ 4 ] ) + "\",\"5\",\"6\",\"7\",\"8\",\"9\""; + + std::to_string( m_modelEquip[ 4 ] ) + "\",\"" + + std::to_string( m_modelEquip[ 5 ] ) + "\",\"" + + std::to_string( m_modelEquip[ 6 ] ) + "\",\"" + + std::to_string( m_modelEquip[ 7 ] ) + "\",\"" + + std::to_string( m_modelEquip[ 8 ] ) + "\",\"" + + std::to_string( m_modelEquip[ 9 ] ) + "\""; return modelString; } std::string PlayerMinimal::getInfoJson() { std::string charDetails = "{\"content\":[\"" + std::string( getName() ) + "\"," + - //"[" + getClassString() + "]," + - "[\"0\",\"0\",\"0\",\"0\",\"0\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"]," + "[\"0\",\"0\",\"0\",\"0\",\"" + std::to_string( getClassLevel( m_class ) ) + + "\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"]," "\"0\",\"0\",\"0\",\"" + std::to_string( getBirthMonth() ) + "\",\"" + std::to_string( getBirthDay() ) + @@ -120,15 +129,37 @@ std::string PlayerMinimal::getInfoJson() "\",\"" + std::to_string( m_class ) + "\",\"0\",\"" + std::to_string( getZoneId() ) + "\",\"0\"," + - "[" + getLookString() + "]," + - "\"0\",\"0\"," + + "\"" + std::to_string( m_modelMainWeapon ) + "\",\"" + std::to_string( m_modelSubWeapon ) + "\"," + "[" + getModelString() + "]," + - "\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"\",\"0\",\"0\"]," + + "\"1\",\"0\",\"0\",\"0\",\"" + std::to_string( m_equipDisplayFlags ) + + "\",\"0\",\"\",\"0\",\"0\"]," + "\"classname\":\"ClientSelectData\",\"classid\":116}"; return charDetails; } +uint16_t PlayerMinimal::getClassLevel(uint8_t classId) +{ + + auto stmtClass = g_charaDb.getPreparedStatement( Db::ZoneDbStatements::CHARA_CLASS_SEL ); + stmtClass->setInt( 1, m_id ); + + auto resClass = g_charaDb.query( stmtClass ); + + while( resClass->next() ) + { + auto classIdx = resClass->getUInt16( 1 ); + auto lvl = resClass->getUInt8( 3 ); + + if( classIdx == classId ) { + m_classLevel = lvl; + break; + } + + } + return m_classLevel; +} + std::string PlayerMinimal::getClassString() { diff --git a/src/servers/sapphire_api/PlayerMinimal.h b/src/servers/sapphire_api/PlayerMinimal.h index d9105a8b..e6907f10 100644 --- a/src/servers/sapphire_api/PlayerMinimal.h +++ b/src/servers/sapphire_api/PlayerMinimal.h @@ -31,6 +31,8 @@ public: std::string getClassString(); + uint16_t getClassLevel( uint8_t classId ); + // return the id of the actor uint32_t getId() const { @@ -177,6 +179,7 @@ private: uint8_t m_birthMonth; uint8_t m_birthDay; uint8_t m_class; + uint8_t m_classLevel; uint8_t m_voice; @@ -184,10 +187,15 @@ private: uint16_t m_zoneId; + uint64_t m_modelMainWeapon; + uint64_t m_modelSubWeapon; + uint8_t m_equipDisplayFlags; + std::map< uint8_t, uint8_t > m_lookMap; std::map< uint8_t, uint16_t > m_classMap; uint8_t m_look[26]; + uint8_t m_gmRank; bool m_gmInvis; From d32cc45f0d002e8518b0f33eb320f6f59c1c9d7d Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Fri, 21 Sep 2018 02:02:51 +1000 Subject: [PATCH 2/7] Gm teri will now tele to the main aetheryte if there is one in the zone --- .../Network/Handlers/GMCommandHandlers.cpp | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 7a9a23f3..b1cefd56 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -455,10 +456,42 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R break; } - targetPlayer->setPos( targetPlayer->getPos() ); - targetPlayer->performZoning( param1, targetPlayer->getPos(), 0 ); + bool doTeleport = false; + uint16_t teleport; + + auto pExdData = g_fw.get< Data::ExdDataGenerated >(); + auto idList = pExdData->getAetheryteIdList(); + + for( auto i : idList ) + { + auto data = pExdData->get< Core::Data::Aetheryte >( i ); + + if( !data ) { + continue; + } + + if( data->territory == param1 ) { + if( data->isAetheryte ) { + { + doTeleport = true; + teleport = i; + break; + } + } + } + } + if( doTeleport ) + { + player.teleport( teleport ); + } + else + { + targetPlayer->setPos( targetPlayer->getPos() ); + targetPlayer->performZoning( param1, targetPlayer->getPos(), 0 ); + } + player.sendNotice( targetPlayer->getName() + " was warped to zone " + - std::to_string( param1 ) + " (" + pZone->getName() + ")" ); + std::to_string( param1 ) + " (" + pZone->getName() + ")" ); } break; } From ff186c7d0e4612350b7230d7df66459def794841 Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Fri, 21 Sep 2018 02:03:10 +1000 Subject: [PATCH 3/7] Discov ref should be a debug, not notice --- src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 798e3d9a..b7067259 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -365,7 +365,7 @@ void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packe if( !pQR->next() ) { - player.sendNotice( "Discovery ref pos ID: " + std::to_string( positionRef ) + " not found. " ); + player.sendDebug( "Discovery ref pos ID: " + std::to_string( positionRef ) + " not found. " ); return; } @@ -374,7 +374,7 @@ void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packe discoveryPacket->data().map_part_id = pQR->getUInt( 3 ); player.queuePacket( discoveryPacket ); - player.sendNotice( "Discovery ref pos ID: " + std::to_string( positionRef ) ); + player.sendDebug( "Discovery ref pos ID: " + std::to_string( positionRef ) ); player.discover( pQR->getUInt16( 2 ), pQR->getUInt16( 3 ) ); From 31333dea49e58032e74e20ad51a82a25f0ff7c01 Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Fri, 21 Sep 2018 02:06:00 +1000 Subject: [PATCH 4/7] I can already hear the screams of mordred shouting style --- .../sapphire_zone/Network/Handlers/GMCommandHandlers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index b1cefd56..ed02dd03 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -491,7 +491,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R } player.sendNotice( targetPlayer->getName() + " was warped to zone " + - std::to_string( param1 ) + " (" + pZone->getName() + ")" ); + std::to_string( param1 ) + " (" + pZone->getName() + ")" ); } break; } From 4da346bedd76a50d491c638359b0a906c7d983dd Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Fri, 21 Sep 2018 03:26:02 +1000 Subject: [PATCH 5/7] classLevel cleanup, now check EXD --- src/servers/sapphire_api/PlayerMinimal.cpp | 36 ++++++++-------------- src/servers/sapphire_api/PlayerMinimal.h | 2 +- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/servers/sapphire_api/PlayerMinimal.cpp b/src/servers/sapphire_api/PlayerMinimal.cpp index 9440a096..d117eea0 100644 --- a/src/servers/sapphire_api/PlayerMinimal.cpp +++ b/src/servers/sapphire_api/PlayerMinimal.cpp @@ -66,15 +66,21 @@ void PlayerMinimal::load( uint32_t charId ) m_contentId = res->getUInt64( "ContentId" ); m_zoneId = res->getUInt16( "TerritoryId" ); + res.reset(); + // SELECT ClassIdx, Exp, Lvl - auto stmtClass = g_charaDb.getPreparedStatement( Db::ZoneDbStatements::CHARA_SEL_MINIMAL ); + auto stmtClass = g_charaDb.getPreparedStatement( Db::ZoneDbStatements::CHARA_CLASS_SEL ); stmtClass->setInt( 1, m_id ); - auto resClass = g_charaDb.query( stmt ); + auto resClass = g_charaDb.query( stmtClass ); while( resClass->next() ) { - m_classMap[ resClass->getUInt( 1 ) ] = resClass->getUInt( 3 ); + auto classIdx = resClass->getUInt( 1 ); + auto lvl = resClass->getUInt( 3 ); + + m_classMap[ classIdx ] = lvl; + m_classLevel = getClassLevel(); } } @@ -120,7 +126,7 @@ std::string PlayerMinimal::getModelString() std::string PlayerMinimal::getInfoJson() { std::string charDetails = "{\"content\":[\"" + std::string( getName() ) + "\"," + - "[\"0\",\"0\",\"0\",\"0\",\"" + std::to_string( getClassLevel( m_class ) ) + + "[\"0\",\"0\",\"0\",\"0\",\"" + std::to_string( m_classLevel ) + "\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"]," "\"0\",\"0\",\"0\",\"" + std::to_string( getBirthMonth() ) + @@ -138,26 +144,10 @@ std::string PlayerMinimal::getInfoJson() return charDetails; } -uint16_t PlayerMinimal::getClassLevel(uint8_t classId) +uint8_t PlayerMinimal::getClassLevel() { - - auto stmtClass = g_charaDb.getPreparedStatement( Db::ZoneDbStatements::CHARA_CLASS_SEL ); - stmtClass->setInt( 1, m_id ); - - auto resClass = g_charaDb.query( stmtClass ); - - while( resClass->next() ) - { - auto classIdx = resClass->getUInt16( 1 ); - auto lvl = resClass->getUInt8( 3 ); - - if( classIdx == classId ) { - m_classLevel = lvl; - break; - } - - } - return m_classLevel; + uint8_t classJobIndex = g_exdDataGen.get< Core::Data::ClassJob >( static_cast< uint8_t >( m_class ) )->expArrayIndex; + return static_cast< uint8_t >( m_classMap[ classJobIndex ] ); } std::string PlayerMinimal::getClassString() diff --git a/src/servers/sapphire_api/PlayerMinimal.h b/src/servers/sapphire_api/PlayerMinimal.h index e6907f10..4bbe8036 100644 --- a/src/servers/sapphire_api/PlayerMinimal.h +++ b/src/servers/sapphire_api/PlayerMinimal.h @@ -31,7 +31,7 @@ public: std::string getClassString(); - uint16_t getClassLevel( uint8_t classId ); + uint8_t getClassLevel(); // return the id of the actor uint32_t getId() const From 87d099c6d8c74feb0ae87c608e35fd6ad0a1149e Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Fri, 21 Sep 2018 03:50:38 +1000 Subject: [PATCH 6/7] Style for mordred --- .../sapphire_zone/Network/Handlers/GMCommandHandlers.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index ed02dd03..f822a568 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -466,12 +466,15 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R { auto data = pExdData->get< Core::Data::Aetheryte >( i ); - if( !data ) { + if( !data ) + { continue; } - if( data->territory == param1 ) { - if( data->isAetheryte ) { + if( data->territory == param1 ) + { + if( data->isAetheryte ) + { { doTeleport = true; teleport = i; From a045dfc5c55174811ebad28f99c194ef85d923ec Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Fri, 21 Sep 2018 09:28:34 +1000 Subject: [PATCH 7/7] welcome back to moredreds coooode review! today we are going to be hunting for some extra brackets in the sewer! so come along for the ride --- .../sapphire_zone/Network/Handlers/GMCommandHandlers.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index f822a568..9b15a373 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -475,11 +475,9 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R { if( data->isAetheryte ) { - { - doTeleport = true; - teleport = i; - break; - } + doTeleport = true; + teleport = i; + break; } } }