From 1552268daef42db1ba6a849ebe53cdc8bec7d078 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 1/6] 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 87478ea5411909582bbc41f43fe1cdf65ea31ba1 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 2/6] 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 7297c92348e55753aa39012c4abce8d09144d9b9 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 3/6] 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 81399e2af2e9d76377b2208daaf88c306a7871cf 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 4/6] 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 b173efef762224767e334dfda7b495e6668347ce 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 5/6] 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 6be4bb36b0b75c474aee7ba5ecce07c9fc242878 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 6/6] 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();