From e68b302f42c10cbc524f992404d20cb79aa9a0b9 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 26 Aug 2018 16:19:05 +1000 Subject: [PATCH] fix db storage for classjobs, improve switching between classes --- sql/characlass.sql | 2 +- sql/update.sql | 4 +- src/servers/sapphire_zone/Actor/Player.cpp | 6 ++ src/servers/sapphire_zone/Actor/Player.h | 2 + .../sapphire_zone/Actor/PlayerInventory.cpp | 65 +++++-------------- .../Network/Handlers/GMCommandHandlers.cpp | 2 +- 6 files changed, 28 insertions(+), 53 deletions(-) diff --git a/sql/characlass.sql b/sql/characlass.sql index a1966375..1dcbaad0 100644 --- a/sql/characlass.sql +++ b/sql/characlass.sql @@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS `characlass` ( `ClassIdx` int(3) DEFAULT '0', `Exp` int(10) DEFAULT '0', `Lvl` int(5) DEFAULT '0', - PRIMARY KEY (`CharacterId`) + INDEX `CharacterId` (`CharacterId`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- Dumping data for table sapphire.characlass: 0 rows diff --git a/sql/update.sql b/sql/update.sql index 239bb5a4..bd8873d2 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -48,4 +48,6 @@ ALTER TABLE `charainfo` CHANGE `Orchestrion` `Orchestrion` BINARY(40) NULL DEFAU 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`; -ALTER TABLE `charainfo` ADD COLUMN `Pose` INT(3) NULL DEFAULT '0' AFTER `EquipDisplayFlags`; \ No newline at end of file +ALTER TABLE `charainfo` ADD COLUMN `Pose` INT(3) NULL DEFAULT '0' AFTER `EquipDisplayFlags`; + +ALTER TABLE `characlass` DROP PRIMARY KEY, ADD INDEX `CharacterId` (`CharacterId`); \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index cffe9426..095b4990 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -704,6 +704,12 @@ uint8_t Core::Entity::Player::getLevelForClass( Common::ClassJob pClass ) const return static_cast< uint8_t >( m_classArray[classJobIndex] ); } +bool Core::Entity::Player::isClassJobUnlocked( Common::ClassJob classJob ) const +{ + // todo: need to properly check if a job is unlocked, at the moment we just check the class array which will return true for every job if the base class is unlocked + return getLevelForClass( classJob ) != 0; +} + uint32_t Core::Entity::Player::getExp() const { auto pExdData = g_fw.get< Data::ExdDataGenerated >(); diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 56cd1f88..02720bab 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -257,6 +257,8 @@ public: uint8_t getLevel() const override; /*! returns the level of the provided class / job */ uint8_t getLevelForClass( Common::ClassJob pClass ) const; + /*! returns if the classjob is unlocked */ + bool isClassJobUnlocked( Common::ClassJob classJob ) const; /*! returns the exp of the currently active class / job */ uint32_t getExp() const; /*! sets the exp of the currently active class / job */ diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index b86cfebe..1305fcf2 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -115,59 +115,24 @@ void Core::Entity::Player::sendItemLevel() queuePacket( boost::make_shared< ActorControlPacket142 >( getId(), SetItemLevel, getItemLevel(), 0 ) ); } -// TODO: This has to be redone and simplified void Core::Entity::Player::equipWeapon( ItemPtr pItem ) { - ClassJob currentClass = static_cast< ClassJob >( getClass() ); + auto exdData = g_fw.get< Core::Data::ExdDataGenerated >(); + if( !exdData ) + return; - switch( pItem->getCategory() ) - { - case ItemUICategory::PugilistsArm: - if( currentClass != ClassJob::Pugilist && - currentClass != ClassJob::Monk ) - setClassJob( ClassJob::Pugilist ); - break; - case ItemUICategory::GladiatorsArm: - if( currentClass != ClassJob::Gladiator && - currentClass != ClassJob::Paladin ) - setClassJob( ClassJob::Gladiator ); - break; - case ItemUICategory::MaraudersArm: - if( currentClass != ClassJob::Marauder && - currentClass != ClassJob::Warrior ) - setClassJob( ClassJob::Marauder ); - break; - case ItemUICategory::ArchersArm: - if( currentClass != ClassJob::Archer && - currentClass != ClassJob::Bard ) - setClassJob( ClassJob::Archer ); - break; - case ItemUICategory::LancersArm: - if( currentClass != ClassJob::Lancer && - currentClass != ClassJob::Dragoon ) - setClassJob( ClassJob::Lancer ); - break; - case ItemUICategory::OnehandedThaumaturgesArm: - case ItemUICategory::TwohandedThaumaturgesArm: - if( currentClass != ClassJob::Thaumaturge && - currentClass != ClassJob::Blackmage ) - setClassJob( ClassJob::Thaumaturge ); - break; - case ItemUICategory::OnehandedConjurersArm: - case ItemUICategory::TwohandedConjurersArm: - if( currentClass != ClassJob::Conjurer && - currentClass != ClassJob::Whitemage ) - setClassJob( ClassJob::Conjurer ); - break; - case ItemUICategory::ArcanistsGrimoire: - if( currentClass != ClassJob::Arcanist && - currentClass != ClassJob::Summoner && - currentClass != ClassJob::Scholar ) - setClassJob( ClassJob::Arcanist ); - break; - default: - break; - } + auto itemInfo = exdData->get< Core::Data::Item >( pItem->getId() ); + auto itemClassJob = itemInfo->classJobUse; + + auto currentClass = getClass(); + auto newClassJob = static_cast< ClassJob >( itemClassJob ); + + if( isClassJobUnlocked( newClassJob ) ) + return; + + // todo: check if soul crystal is equipped and use job instead + + setClassJob( newClassJob ); } // equip an item diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index bac41fb1..ab58ab39 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -113,7 +113,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R else { auto inRange = player.getInRangeActors(); - for( auto actor : inRange ) + for( auto& actor : inRange ) { if( actor->getId() == param3 ) targetActor = actor;