From 8a9e0b027db39d2ecc3bf4636892f0c412bc9d7d Mon Sep 17 00:00:00 2001 From: Mordred <30826167+SapphireMordred@users.noreply.github.com> Date: Thu, 30 Aug 2018 11:39:39 +0200 Subject: [PATCH 01/13] Updated .editorconfig for 2 spaces --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 84678469..a67d46ec 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,7 +3,7 @@ root = true # find plugin for your editor here: http://editorconfig.org/#download [*.{cpp,h,chai,inc}] indent_style = space -indent_size = 3 +indent_size = 2 end_of_line = lf trim_trailing_whitespace = true indent_brace_style = Allman From 7655f4ca6355dcc10a1627e83a8140bee87b48ea Mon Sep 17 00:00:00 2001 From: Mordred <30826167+SapphireMordred@users.noreply.github.com> Date: Thu, 30 Aug 2018 13:31:33 +0200 Subject: [PATCH 02/13] Update CONTRIBUTING.md --- CONTRIBUTING.md | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index da0c7441..b50b5c62 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,7 +22,7 @@ When making a PR, please make sure that it follows our style guidelines and good ### Coding style -Indentations are Allman-style based, 3-space, no tabs. +Indentations are Allman-style based, 2-space, no tabs. Space between arguments in function calls, as well as for types. Example (shortened from ActionHandler.cpp): @@ -30,30 +30,30 @@ Example (shortened from ActionHandler.cpp): ```cpp switch( commandId ) { - case 0x01: // Toggle sheathe - { - if ( param11 == 1 ) - pPlayer->setStance( Entity::Chara::Stance::Active ); - else - { - pPlayer->setStance( Entity::Chara::Stance::Passive ); - pPlayer->setAutoattack( false ); - } + case 0x01: // Toggle sheathe + { + if ( param11 == 1 ) + pPlayer->setStance( Entity::Chara::Stance::Active ); + else + { + pPlayer->setStance( Entity::Chara::Stance::Passive ); + pPlayer->setAutoattack( false ); + } - pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), 0, param11, 1 ) ); + pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), 0, param11, 1 ) ); - break; - } - case 0x03: // Change target - { - uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 ); - pPlayer->changeTarget( targetId ); - break; - } - default: - { - break; - } + break; + } + case 0x03: // Change target + { + uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 ); + pPlayer->changeTarget( targetId ); + break; + } + default: + { + break; + } } ``` From 6d3896dc7296d2e39f276344910a6d084d6b2418 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Mon, 15 Oct 2018 21:38:39 +0300 Subject: [PATCH 03/13] Fixes disappearing soul crystals on re-logging. --- src/servers/sapphire_zone/Actor/PlayerSql.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 5b6abae1..1f98fa7b 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -608,7 +608,7 @@ bool Core::Entity::Player::loadInventory() { uint16_t storageId = res->getUInt16( 1 ); - for( uint32_t i = 1; i <= 13; i++ ) + for( uint32_t i = 1; i <= 14; i++ ) { uint64_t uItemId = res->getUInt64( i + 1 ); if( uItemId == 0 ) From 91d5ece4270ff08a2e08bcf3cc368bc03e6a544d Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Tue, 16 Oct 2018 20:06:30 +0300 Subject: [PATCH 04/13] Add ArmorySoulCrystal on new character creation. --- src/servers/sapphire_api/PlayerMinimal.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/servers/sapphire_api/PlayerMinimal.cpp b/src/servers/sapphire_api/PlayerMinimal.cpp index d117eea0..db375d03 100644 --- a/src/servers/sapphire_api/PlayerMinimal.cpp +++ b/src/servers/sapphire_api/PlayerMinimal.cpp @@ -319,6 +319,7 @@ void PlayerMinimal::saveAsNew() createInvDbContainer( InventoryType::ArmoryWrist ); createInvDbContainer( InventoryType::ArmoryRing ); createInvDbContainer( InventoryType::ArmoryMain ); + createInvDbContainer( InventoryType::ArmorySoulCrystal ); createInvDbContainer( InventoryType::Currency ); createInvDbContainer( InventoryType::Crystal ); From a503a6007fcaf9aa88597ab77778aad83c4b4dff Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Wed, 17 Oct 2018 23:25:41 +0300 Subject: [PATCH 05/13] Implements class change on weapon swap. --- .../sapphire_zone/Actor/PlayerInventory.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index a40ce99f..e8c51b73 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -122,16 +122,12 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem ) auto itemInfo = exdData->get< Core::Data::Item >( pItem->getId() ); auto itemClassJob = itemInfo->classJobUse; - - auto currentClass = getClass(); + auto classJobInfo = exdData->get< Core::Data::ClassJob >( (uint32_t)getClass() ); + auto currentParentClass = static_cast< ClassJob >(classJobInfo->classJobParent); auto newClassJob = static_cast< ClassJob >( itemClassJob ); - if( isClassJobUnlocked( newClassJob ) ) - return; - - // todo: check if soul crystal is equipped and use job instead - - setClassJob( newClassJob ); + if( ( isClassJobUnlocked( newClassJob ) ) && ( currentParentClass != newClassJob ) ) + setClassJob( newClassJob ); } // equip an item @@ -160,8 +156,7 @@ void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::It case MainHand: m_modelMainWeapon = model; m_modelSubWeapon = model2; - // TODO: add job change upon changing weapon if needed - // equipWeapon( pItem ); + equipWeapon( pItem ); break; case OffHand: From 3d5e794d6e32fc736ce9c82229218fab5f0379d7 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Thu, 18 Oct 2018 07:48:34 +0300 Subject: [PATCH 06/13] Code style. --- src/servers/sapphire_zone/Actor/PlayerInventory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index e8c51b73..80d62605 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -122,8 +122,8 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem ) auto itemInfo = exdData->get< Core::Data::Item >( pItem->getId() ); auto itemClassJob = itemInfo->classJobUse; - auto classJobInfo = exdData->get< Core::Data::ClassJob >( (uint32_t)getClass() ); - auto currentParentClass = static_cast< ClassJob >(classJobInfo->classJobParent); + auto classJobInfo = exdData->get< Core::Data::ClassJob >( ( uint32_t )getClass() ); + auto currentParentClass = static_cast< ClassJob >( classJobInfo->classJobParent ); auto newClassJob = static_cast< ClassJob >( itemClassJob ); if( ( isClassJobUnlocked( newClassJob ) ) && ( currentParentClass != newClassJob ) ) From 8588d549baa0184defe0d94f493a36b5212a07d9 Mon Sep 17 00:00:00 2001 From: Biscuit Date: Thu, 18 Oct 2018 20:46:55 +1100 Subject: [PATCH 07/13] ModelEquip Updates Turns out padding1 holds some extra stuff --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 5 ++++- .../sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index b4115dc4..6ea34e79 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -976,7 +976,10 @@ struct FFXIVIpcModelEquip : { /* 0000 */ uint64_t mainWeapon; /* 0008 */ uint64_t offWeapon; - /* 0010 */ uint32_t padding1; + /* 0010 */ uint8_t unk1; + /* 0011 */ uint8_t classJobId; + /* 0012 */ uint8_t level; + /* 0013 */ uint8_t unk2; /* 0014 */ uint32_t models[10]; /* 003C */ uint32_t padding2; }; diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h index fd2801fa..f0bb7ebe 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h @@ -28,6 +28,8 @@ private: { m_data.mainWeapon = player.getModelMainWeapon(); m_data.offWeapon = player.getModelSubWeapon(); + m_data.classJobId = static_cast< uint8_t >( player.getClass() ); + m_data.level = player.getLevel(); m_data.models[ Common::GearModelSlot::ModelHead ] = player.getModelForSlot( Common::GearModelSlot::ModelHead ); m_data.models[ Common::GearModelSlot::ModelBody ] = player.getModelForSlot( Common::GearModelSlot::ModelBody ); m_data.models[ Common::GearModelSlot::ModelHands ] = player.getModelForSlot( Common::GearModelSlot::ModelHands ); From 19f7bf82c97172feb62b3f27a095373ff1ea05a7 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Thu, 18 Oct 2018 20:59:04 +0300 Subject: [PATCH 08/13] Fixes logon crash when using weapon of another class. --- src/servers/sapphire_zone/Actor/Player.h | 4 ++-- .../sapphire_zone/Actor/PlayerInventory.cpp | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index fd5f4a65..ce984909 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -324,7 +324,7 @@ public: void unequipItem( Common::GearSetSlot equipSlotId, ItemPtr pItem ); /*! equip a weapon, possibly forcing a job change */ - void equipWeapon( ItemPtr pItem ); + void equipWeapon( ItemPtr pItem, bool updateClass ); /*! get player ilvl */ uint16_t getItemLevel() const; @@ -356,7 +356,7 @@ public: /*! return the current amount of crystals of type */ uint32_t getCrystal( uint8_t type ) const; - void updateModels( Common::GearSetSlot equipSlotId, const Core::ItemPtr& pItem ); + void updateModels( Common::GearSetSlot equipSlotId, const Core::ItemPtr& pItem, bool updateClass ); Common::GearModelSlot equipSlotToModelSlot( Common::GearSetSlot slot ); diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index 80d62605..bd7c1272 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -114,7 +114,7 @@ void Core::Entity::Player::sendItemLevel() queuePacket( makeActorControl142( getId(), SetItemLevel, getItemLevel(), 0 ) ); } -void Core::Entity::Player::equipWeapon( ItemPtr pItem ) +void Core::Entity::Player::equipWeapon( ItemPtr pItem, bool updateClass ) { auto exdData = g_fw.get< Core::Data::ExdDataGenerated >(); if( !exdData ) @@ -127,7 +127,12 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem ) auto newClassJob = static_cast< ClassJob >( itemClassJob ); if( ( isClassJobUnlocked( newClassJob ) ) && ( currentParentClass != newClassJob ) ) - setClassJob( newClassJob ); + { + if ( updateClass ) + setClassJob( newClassJob ); + else + return; + } } // equip an item @@ -135,18 +140,18 @@ void Core::Entity::Player::equipItem( Common::GearSetSlot equipSlotId, ItemPtr p { //g_framework.getLogger().debug( "Equipping into slot " + std::to_string( equipSlotId ) ); - - updateModels( equipSlotId, pItem ); - if( sendUpdate ) { + updateModels( equipSlotId, pItem, true ); this->sendModel(); m_itemLevel = calculateEquippedGearItemLevel(); sendItemLevel(); } + else + updateModels( equipSlotId, pItem, false ); } -void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::ItemPtr& pItem ) +void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::ItemPtr& pItem, bool updateClass ) { uint64_t model = pItem->getModelId1(); uint64_t model2 = pItem->getModelId2(); @@ -156,7 +161,7 @@ void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::It case MainHand: m_modelMainWeapon = model; m_modelSubWeapon = model2; - equipWeapon( pItem ); + equipWeapon( pItem, updateClass ); break; case OffHand: From 44980a74b9ce45e8fdb048ddf3c3a61ce3e99872 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Fri, 19 Oct 2018 16:48:18 +0300 Subject: [PATCH 09/13] Thanks Adam. Change c-style cast. --- src/servers/sapphire_zone/Actor/PlayerInventory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index bd7c1272..f8aef788 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -122,7 +122,7 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem, bool updateClass ) auto itemInfo = exdData->get< Core::Data::Item >( pItem->getId() ); auto itemClassJob = itemInfo->classJobUse; - auto classJobInfo = exdData->get< Core::Data::ClassJob >( ( uint32_t )getClass() ); + auto classJobInfo = exdData->get< Core::Data::ClassJob >( static_cast< uint32_t >( getClass() ) ); auto currentParentClass = static_cast< ClassJob >( classJobInfo->classJobParent ); auto newClassJob = static_cast< ClassJob >( itemClassJob ); From 679686e6ff02d569bdb530a3f3ae848c0fe3e48c Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Sat, 20 Oct 2018 13:56:01 +0300 Subject: [PATCH 10/13] Add level1 to setCLassJob. --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 4 ++-- src/servers/sapphire_zone/Actor/Player.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 0d92d010..8b65040d 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1000,8 +1000,8 @@ struct FFXIVIpcPlayerClassInfo : uint16_t classId; uint8_t unknown; uint8_t isSpecialist; - uint16_t level; // Locks actions, equipment, prob more - uint16_t level1; // Locks roles, prob more + uint16_t level; // Locks actions, equipment, prob more. Player's current level (synced). + uint16_t level1; // Locks roles, prob more. Player's actual unsynced level. uint32_t roleActions[10]; }; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 6efdf86a..c6a894e3 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -746,6 +746,7 @@ void Core::Entity::Player::setClassJob( Common::ClassJob classJob ) auto classInfoPacket = makeZonePacket< FFXIVIpcPlayerClassInfo >( getId() ); classInfoPacket->data().classId = static_cast< uint8_t >( getClass() ); + classInfoPacket->data().level1 = getLevel(); classInfoPacket->data().level = getLevel(); queuePacket( classInfoPacket ); @@ -1733,4 +1734,3 @@ bool Core::Entity::Player::isOnEnterEventDone() const { return m_onEnterEventDone; } - From 78b8de04b4795c56f8842f97b6b19111a3f8d036 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Sat, 20 Oct 2018 14:20:39 +0300 Subject: [PATCH 11/13] Add equipSoulCrystal & unequipSoulCrystal --- src/servers/sapphire_zone/Actor/Player.h | 6 ++++ .../sapphire_zone/Actor/PlayerInventory.cpp | 31 +++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index ce984909..bb17af0a 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -326,6 +326,12 @@ public: /*! equip a weapon, possibly forcing a job change */ void equipWeapon( ItemPtr pItem, bool updateClass ); + /*! equip a soul crystal, possibly forcing a job change*/ + void equipSoulCrystal( ItemPtr pItem, bool updateClass ); + + /*! unequip a soul crystal, returning to the base class*/ + void unequipSoulCrystal( ItemPtr pItem ); + /*! get player ilvl */ uint16_t getItemLevel() const; diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index f8aef788..521b11e4 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -135,6 +135,20 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem, bool updateClass ) } } +void Core::Entity::Player::equipSoulCrystal( ItemPtr pItem, bool updateJob ) +{ + auto exdData = g_fw.get< Core::Data::ExdDataGenerated >(); + if ( !exdData ) + return; + + auto itemInfo = exdData->get< Core::Data::Item >( pItem->getId() ); + auto itemClassJob = itemInfo->classJobUse; + auto newClassJob = static_cast< ClassJob >( itemClassJob ); + + if ( isClassJobUnlocked( newClassJob ) && updateJob ) + setClassJob( newClassJob ); +} + // equip an item void Core::Entity::Player::equipItem( Common::GearSetSlot equipSlotId, ItemPtr pItem, bool sendUpdate ) { @@ -169,8 +183,7 @@ void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::It break; case SoulCrystal: - // TODO: add Job change on equipping crystal - // change job + equipSoulCrystal( pItem, updateClass ); break; case Waist: @@ -228,6 +241,20 @@ void Core::Entity::Player::unequipItem( Common::GearSetSlot equipSlotId, ItemPtr m_itemLevel = calculateEquippedGearItemLevel(); sendItemLevel(); + + if ( equipSlotId == SoulCrystal ) + unequipSoulCrystal( pItem ); +} + +void Core::Entity::Player::unequipSoulCrystal( ItemPtr pItem ) +{ + auto exdData = g_fw.get< Core::Data::ExdDataGenerated >(); + if ( !exdData ) + return; + + auto currentClassJob = exdData->get< Core::Data::ClassJob >( static_cast< uint32_t >( getClass() ) ); + auto parentClass = static_cast< ClassJob >( currentClassJob->classJobParent ); + setClassJob ( parentClass ); } // TODO: these next functions are so similar that they could likely be simplified From da89793d56fc10102d609bc2281da1149f848afa Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Sat, 20 Oct 2018 14:36:56 +0300 Subject: [PATCH 12/13] No space --- src/servers/sapphire_zone/Actor/PlayerInventory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index 521b11e4..6589a9b1 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -254,7 +254,7 @@ void Core::Entity::Player::unequipSoulCrystal( ItemPtr pItem ) auto currentClassJob = exdData->get< Core::Data::ClassJob >( static_cast< uint32_t >( getClass() ) ); auto parentClass = static_cast< ClassJob >( currentClassJob->classJobParent ); - setClassJob ( parentClass ); + setClassJob( parentClass ); } // TODO: these next functions are so similar that they could likely be simplified From d728ecdaf4aea52172cb586e67b5329ba4e62e87 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Sat, 20 Oct 2018 15:39:20 +0300 Subject: [PATCH 13/13] These should be the only references. --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 4 ++-- src/servers/sapphire_zone/Actor/Player.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 8b65040d..c42be004 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1000,8 +1000,8 @@ struct FFXIVIpcPlayerClassInfo : uint16_t classId; uint8_t unknown; uint8_t isSpecialist; - uint16_t level; // Locks actions, equipment, prob more. Player's current level (synced). - uint16_t level1; // Locks roles, prob more. Player's actual unsynced level. + uint16_t syncedLevel; // Locks actions, equipment, prob more. Player's current level (synced). + uint16_t classLevel; // Locks roles, prob more. Player's actual unsynced level. uint32_t roleActions[10]; }; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index c6a894e3..e9b06529 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -746,8 +746,8 @@ void Core::Entity::Player::setClassJob( Common::ClassJob classJob ) auto classInfoPacket = makeZonePacket< FFXIVIpcPlayerClassInfo >( getId() ); classInfoPacket->data().classId = static_cast< uint8_t >( getClass() ); - classInfoPacket->data().level1 = getLevel(); - classInfoPacket->data().level = getLevel(); + classInfoPacket->data().classLevel = getLevel(); + classInfoPacket->data().syncedLevel = getLevel(); queuePacket( classInfoPacket ); sendToInRangeSet( makeActorControl142( getId(), ClassJobChange, 0x04 ), true ); @@ -1551,8 +1551,8 @@ void Core::Entity::Player::sendZonePackets() auto classInfoPacket = makeZonePacket< FFXIVIpcPlayerClassInfo >( getId() ); classInfoPacket->data().classId = static_cast< uint8_t >( getClass() ); classInfoPacket->data().unknown = 1; - classInfoPacket->data().level = getLevel(); - classInfoPacket->data().level1 = getLevel(); + classInfoPacket->data().syncedLevel = getLevel(); + classInfoPacket->data().classLevel = getLevel(); queuePacket( classInfoPacket ); m_itemLevel = calculateEquippedGearItemLevel();