From 6561cf566e42a605c4799b4bf23d0d8810f317ea Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 20 Aug 2017 02:24:19 +0200 Subject: [PATCH] #34 - Implemented tracking of opnening sequence, firstlogin may be obsolete now --- bin/scripts/chai/opening/OpeningGridania.chai | 6 +-- bin/scripts/chai/opening/OpeningLimsa.chai | 18 ++++---- bin/scripts/chai/opening/OpeningUldah.chai | 6 +-- bin/scripts/chai/quest/ManFst001.chai | 2 +- sql/update.sql | 43 ++++++++----------- src/servers/Server_Common/Common.h | 2 +- src/servers/Server_Zone/Actor/Player.cpp | 11 +++++ src/servers/Server_Zone/Actor/Player.h | 6 +++ src/servers/Server_Zone/Actor/PlayerSql.cpp | 10 ++++- .../Server_Zone/Script/ScriptManagerInit.cpp | 3 +- 10 files changed, 64 insertions(+), 43 deletions(-) diff --git a/bin/scripts/chai/opening/OpeningGridania.chai b/bin/scripts/chai/opening/OpeningGridania.chai index 9dac7aed..fbaf1005 100644 --- a/bin/scripts/chai/opening/OpeningGridania.chai +++ b/bin/scripts/chai/opening/OpeningGridania.chai @@ -37,7 +37,7 @@ class OpeningGridaniaDef player.eventPlay( this.id, 0, 0x2001, 0, 1, fun( player, eventId, param1, param2, param3 ) { - player.setFirstLogin( false ); + player.setOpeningSequence( 1 ); OpeningGridania.Scene00001( player ); } ); } @@ -62,7 +62,7 @@ class OpeningGridaniaDef player.eventPlay( this.id, 40, 1, 2, 1, fun( player, eventId, param1, param2, param3 ) { - if( player.hasQuest( ManFst001.id ) ) + if( player.getOpeningSequence() == 2 ) { // update the instance boundaries OpeningGridania.Scene00030( player ); @@ -74,7 +74,7 @@ class OpeningGridaniaDef def onEnterTerritory( eventId, player, param1, param2) { - if( player.isFirstLogin() == true ) + if( player.getOpeningSequence() == 0 ) { this.Scene00000( player ); } diff --git a/bin/scripts/chai/opening/OpeningLimsa.chai b/bin/scripts/chai/opening/OpeningLimsa.chai index d97977dc..ebae5446 100644 --- a/bin/scripts/chai/opening/OpeningLimsa.chai +++ b/bin/scripts/chai/opening/OpeningLimsa.chai @@ -47,7 +47,7 @@ class OpeningLimsaLominsaDef player.eventPlay( this.id, 0, 0x04AC05, 0, 1, fun( player, eventId, param1, param2, param3 ) { - player.setFirstLogin( false ); + player.setOpeningSequence( 1 ); OpeningLimsaLominsa.Scene00001( player ); } ); } @@ -73,7 +73,7 @@ class OpeningLimsaLominsaDef fun( player, eventId, param1, param2, param3 ) { player.eventFinish( eventId, UNLOCK ); - if( player.hasQuest( ManSea001.id ) ) + if( player.getOpeningSequence() == 2 ) { // update the instance boundaries OpeningLimsaLominsa.Scene00030( player ); @@ -85,14 +85,14 @@ class OpeningLimsaLominsaDef def onEnterTerritory( eventId, player, param1, param2) { - // if( player.isFirstLogin() == true ) - // { + if( player.getOpeningSequence() == 0 ) + { this.Scene00000( player ); - // } - //else - // { - // this.Scene00040( player ); - // } + } + else + { + this.Scene00040( player ); + } } def onWithinRange( eventId, player, param1, x, y, z) diff --git a/bin/scripts/chai/opening/OpeningUldah.chai b/bin/scripts/chai/opening/OpeningUldah.chai index da6b24be..6c19e6c4 100644 --- a/bin/scripts/chai/opening/OpeningUldah.chai +++ b/bin/scripts/chai/opening/OpeningUldah.chai @@ -38,7 +38,7 @@ class OpeningUldahDef player.eventPlay( this.id, 0, 0x2001, 0, 1, fun( player, eventId, param1, param2, param3 ) { - player.setFirstLogin( false ); + player.setOpeningSequence( 1 ); OpeningUldah.Scene00001( player ); } ); } @@ -63,7 +63,7 @@ class OpeningUldahDef player.eventPlay( this.id, 40, 1, 2, 1, fun( player, eventId, param1, param2, param3 ) { - if( player.hasQuest( ManWil001.id ) ) + if( player.getOpeningSequence() == 2 ) { // update the instance boundaries OpeningUldah.Scene00030( player ); @@ -75,7 +75,7 @@ class OpeningUldahDef def onEnterTerritory( eventId, player, param1, param2) { - if( player.isFirstLogin() == true ) + if( player.getOpeningSequence() == 0 ) { this.Scene00000( player ); } diff --git a/bin/scripts/chai/quest/ManFst001.chai b/bin/scripts/chai/quest/ManFst001.chai index d8ea1ebf..29d9f0e7 100644 --- a/bin/scripts/chai/quest/ManFst001.chai +++ b/bin/scripts/chai/quest/ManFst001.chai @@ -52,6 +52,7 @@ class ManFst001Def { if( param2 == 1 ) // accept quest { + player.setOpeningSequence( 2 ); ManFst001.Scene00001( player ); } }); @@ -115,7 +116,6 @@ class ManFst001Def this.Scene00004( player ); } - // Script content to be added here.... } }; diff --git a/sql/update.sql b/sql/update.sql index 3f748514..e4909448 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -1,27 +1,22 @@ -RENAME TABLE `dbaccounts` TO `accounts`; -RENAME TABLE `dbbattlenpc` TO `battlenpc`; -RENAME TABLE `dbchara` TO `charabase`; -RENAME TABLE `dbcharapcclass` TO `characlass`; -RENAME TABLE `dbcharapc` TO `charadetail`; -RENAME TABLE `dbcharaitems` TO `charaglobalitem`; -RENAME TABLE `dbcharainfoblacklist` TO `charainfoblacklist`; -RENAME TABLE `dbcharainfofriendlist` TO `charainfofriendlist`; -RENAME TABLE `dbcharainfolinkshell` TO `charainfolinkshell`; -RENAME TABLE `dbcharainfoprofile` TO `charainfosearch`; -RENAME TABLE `dbcharaitemcrystal` TO `charaitemcrystal`; -RENAME TABLE `dbcharaitemcurrency` TO `charaitemcurrency`; -RENAME TABLE `dbcharaitemmannequin` TO `charaitemgearset`; -RENAME TABLE `dbcharaitembaggage` TO `charaiteminventory`; -RENAME TABLE `dbcharaquest` TO `charaquest`; -RENAME TABLE `dbdiscoveryref` TO `discoveryinfo`; -RENAME TABLE `dbinfolinkshell` TO `infolinkshell`; -RENAME TABLE `dbuniqueiddata` TO `uniqueiddata`; -RENAME TABLE `dbzonemapping` TO `zonemapping`; -RENAME TABLE `dbzonepositions` TO `zonepositions`; -RENAME TABLE `dbzoneservers` TO `zoneservers`; +ALTER TABLE `charaiteminventory` ADD `container_25` INT(20) NOT NULL AFTER `container_24`, + ADD `container_26` INT(20) NOT NULL AFTER `container_25`, + ADD `container_27` INT(20) NOT NULL AFTER `container_26`, + ADD `container_28` INT(20) NOT NULL AFTER `container_27`, + ADD `container_29` INT(20) NOT NULL AFTER `container_28`, + ADD `container_30` INT(20) NOT NULL AFTER `container_29`, + ADD `container_31` INT(20) NOT NULL AFTER `container_30`, + ADD `container_32` INT(20) NOT NULL AFTER `container_31`, + ADD `container_33` INT(20) NOT NULL AFTER `container_32`, + ADD `container_34` INT(20) NOT NULL AFTER `container_33`; -ALTER TABLE `charaiteminventory` ADD `container_25` INT(20) NOT NULL AFTER `container_24`, ADD `container_26` INT(20) NOT NULL AFTER `container_25`, ADD `container_27` INT(20) NOT NULL AFTER `container_26`, ADD `container_28` INT(20) NOT NULL AFTER `container_27`, ADD `container_29` INT(20) NOT NULL AFTER `container_28`, ADD `container_30` INT(20) NOT NULL AFTER `container_29`, ADD `container_31` INT(20) NOT NULL AFTER `container_30`, ADD `container_32` INT(20) NOT NULL AFTER `container_31`, ADD `container_33` INT(20) NOT NULL AFTER `container_32`, ADD `container_34` INT(20) NOT NULL AFTER `container_33`; +ALTER TABLE `characlass` ADD `Lv_24` INT(5) NOT NULL DEFAULT '0' AFTER `Exp_23`, + ADD `Exp_24` INT(10) NOT NULL DEFAULT '0' AFTER `Lv_24`, + ADD `Lv_25` INT(5) NOT NULL DEFAULT '0' AFTER `Exp_24`, + ADD `Exp_25` INT(19) NOT NULL DEFAULT '0' AFTER `Lv_25`; -ALTER TABLE `characlass` ADD `Lv_24` INT(5) NOT NULL DEFAULT '0' AFTER `Exp_23`, ADD `Exp_24` INT(10) NOT NULL DEFAULT '0' AFTER `Lv_24`, ADD `Lv_25` INT(5) NOT NULL DEFAULT '0' AFTER `Exp_24`, ADD `Exp_25` INT(19) NOT NULL DEFAULT '0' AFTER `Lv_25`; +ALTER TABLE `charadetail` CHANGE `Aetheryte` `Aetheryte` BINARY(16) NULL DEFAULT NULL, + CHANGE `HowTo` `HowTo` BINARY(33) NULL DEFAULT NULL, + CHANGE `Minions` `Minions` BINARY(33) NULL DEFAULT NULL, + CHANGE `Mounts` `Mounts` BINARY(13) NULL DEFAULT NULL; -ALTER TABLE `charadetail` CHANGE `Aetheryte` `Aetheryte` BINARY(16) NULL DEFAULT NULL, CHANGE `HowTo` `HowTo` BINARY(33) NULL DEFAULT NULL, CHANGE `Minions` `Minions` BINARY(33) NULL DEFAULT NULL, CHANGE `Mounts` `Mounts` BINARY(13) NULL DEFAULT NULL; \ No newline at end of file +ALTER TABLE `charadetail` CHANGE `OpeningSequence` `OpeningSequence` INT(3) NULL DEFAULT '0'; \ No newline at end of file diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h index d5f6ff50..92798cff 100644 --- a/src/servers/Server_Common/Common.h +++ b/src/servers/Server_Common/Common.h @@ -285,7 +285,7 @@ namespace Core { HpMp = 0x00000800, QuestTracker = 0x00001000, NewGame = 0x00002000, - // 0x4000 is missing here + OpeningSeq = 0x00004000, Unlocks = 0x00008000, PlayTime = 0x00010000, NewAdventurer = 0x00020000, diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index f5b65b49..a5cc53ff 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -1605,3 +1605,14 @@ void Core::Entity::Player::setCFPenaltyMinutes( uint32_t minutes ) auto currentTimestamp = Core::Util::getTimeSeconds(); setCFPenaltyTimestamp(static_cast< uint32_t >( currentTimestamp + minutes * 60 )); } + +uint8_t Core::Entity::Player::getOpeningSequence() const +{ + return m_openingSequence; +} + +void Core::Entity::Player::setOpeningSequence( uint8_t seq ) +{ + setSyncFlag( OpeningSeq ); + m_openingSequence = seq; +} \ No newline at end of file diff --git a/src/servers/Server_Zone/Actor/Player.h b/src/servers/Server_Zone/Actor/Player.h index c86fc3d2..91ad4b86 100644 --- a/src/servers/Server_Zone/Actor/Player.h +++ b/src/servers/Server_Zone/Actor/Player.h @@ -124,6 +124,10 @@ public: void updateQuestsCompleted( uint32_t questId ); /*! remove a quest from the completed quest mask */ void removeQuestsCompleted( uint32_t questId ); + /*! get the curent opening sequence */ + uint8_t getOpeningSequence() const; + /*! set te current opening sequence */ + void setOpeningSequence( uint8_t seq ); bool giveQuestRewards( uint32_t questId, uint32_t optionalChoice ); @@ -573,6 +577,8 @@ private: uint8_t m_aetheryte[16]; uint8_t m_unlocks[64]; + uint8_t m_openingSequence; + InventoryPtr m_pInventory; std::map< uint32_t, Event::EventPtr > m_eventMap; std::map< uint32_t, uint8_t > m_playerIdToSpawnIdMap; // maps player to spawn id diff --git a/src/servers/Server_Zone/Actor/PlayerSql.cpp b/src/servers/Server_Zone/Actor/PlayerSql.cpp index e904dead..9cfc0610 100644 --- a/src/servers/Server_Zone/Actor/PlayerSql.cpp +++ b/src/servers/Server_Zone/Actor/PlayerSql.cpp @@ -79,7 +79,8 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) "c.IsNewAdventurer, " "cd.GrandCompany, " "cd.GrandCompanyRank, " - "cd.CFPenaltyUntil " + "cd.CFPenaltyUntil, " + "cd.OpeningSequence " "FROM charabase AS c " " INNER JOIN charadetail AS cd " " ON c.CharacterId = cd.CharacterId " @@ -170,6 +171,8 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) m_cfPenaltyUntil = field[35].getUInt32(); + m_openingSequence = field[36].getUInt32(); + m_pCell = nullptr; if( !loadActiveQuests() || !loadClassData() || !loadSearchInfo() ) @@ -353,6 +356,11 @@ void Core::Entity::Player::createUpdateSql() charaDetailSet.insert( " Status = " + std::to_string( static_cast< uint8_t >( getStatus() ) ) ); } + if( m_updateFlags & PlayerSyncFlags::OpeningSeq ) + { + charaDetailSet.insert( " OpeningSequence = " + std::to_string( static_cast< uint8_t >( getOpeningSequence() ) ) ); + } + if( m_updateFlags & PlayerSyncFlags::Quests ) { charaDetailSet.insert( " QuestCompleteFlags = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_questCompleteFlags ), 200 ) ) + "')" ); diff --git a/src/servers/Server_Zone/Script/ScriptManagerInit.cpp b/src/servers/Server_Zone/Script/ScriptManagerInit.cpp index c66565d1..5faadab2 100644 --- a/src/servers/Server_Zone/Script/ScriptManagerInit.cpp +++ b/src/servers/Server_Zone/Script/ScriptManagerInit.cpp @@ -69,7 +69,8 @@ int Core::Scripting::ScriptManager::init() m_pChaiHandler->add( chaiscript::fun( &Entity::Player::hasQuest ), "hasQuest" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getZoneId ), "getZoneId" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::handleScriptSkill ), "handleScriptSkill" ); - + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getOpeningSequence ), "getOpeningSequence" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setOpeningSequence ), "setOpeningSequence" ); m_pChaiHandler->add( chaiscript::fun( &Core::Event::mapEventActorToRealActor ), "mapActor" );