From 333ec303bd1c16e9f115841688338b92bc8911a2 Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Sun, 22 Apr 2018 00:49:32 +1000 Subject: [PATCH 001/199] Fixed making new zones --- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index b6ee10f4..8e5cee2a 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -161,8 +161,9 @@ Core::ZonePtr Core::TerritoryMgr::createTerritoryInstance( uint32_t territoryTyp auto pZone = make_Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name ); pZone->init(); - m_territoryInstanceMap[pZone->getTerritoryId()][pZone->getGuId()] = pZone; m_instanceIdToZonePtrMap[pZone->getGuId()] = pZone; + m_territoryInstanceMap[pZone->getTerritoryId()][pZone->getGuId()] = pZone; + m_zoneSet.insert( { pZone } ); return pZone; } From a9c3f6794473f8fa2f8cab5527baacc71c863b30 Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Sun, 22 Apr 2018 00:50:04 +1000 Subject: [PATCH 002/199] Added Zone GuId to gm teri_info and fixed spacing --- .../sapphire_zone/Network/Handlers/GMCommandHandlers.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 7f1d99d0..9ceeebef 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -467,10 +467,11 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac auto pCurrentZone = player.getCurrentZone(); player.sendNotice( "ZoneId: " + std::to_string( player.getZoneId() ) + "\nName: " + pCurrentZone->getName() + "\nInternalName: " + - pCurrentZone->getInternalName() + "\nPopCount: " + + pCurrentZone->getInternalName() + "\nGuId: " + + std::to_string( pCurrentZone->getGuId() ) + "\nPopCount: " + std::to_string( pCurrentZone->getPopCount() ) + - "\nCurrentWeather:" + std::to_string( static_cast< uint8_t >( pCurrentZone->getCurrentWeather() ) ) + - "\nNextWeather:" + std::to_string( static_cast< uint8_t >( pCurrentZone->getNextWeather() ) ) ); + "\nCurrentWeather: " + std::to_string( static_cast< uint8_t >( pCurrentZone->getCurrentWeather() ) ) + + "\nNextWeather: " + std::to_string( static_cast< uint8_t >( pCurrentZone->getNextWeather() ) ) ); break; } case GmCommand::Jump: From c38ab3a445627110996e85f8475e0197f5715911 Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Sun, 22 Apr 2018 01:13:37 +1000 Subject: [PATCH 003/199] Now erase zone from the set and removed count like talked about --- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 8e5cee2a..5083d6b8 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -206,8 +206,8 @@ bool Core::TerritoryMgr::removeTerritoryInstance( uint32_t instanceId ) m_instanceIdToZonePtrMap.erase( pZone->getGuId() ); - if( m_instanceZoneSet.count( pZone ) ) - m_instanceZoneSet.erase( pZone ); + m_instanceZoneSet.erase( pZone ); + m_zoneSet.erase( pZone ); if( isInstanceContentTerritory( pZone->getTerritoryId() ) ) { From ff6eeef68aacf5b83fb6d4c85b05f69256caa0f9 Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Sun, 22 Apr 2018 18:21:22 +1000 Subject: [PATCH 004/199] GM Raise uses the new zoneinpacket system --- .../sapphire_zone/Network/Handlers/GMCommandHandlers.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 9ceeebef..2c88206e 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -538,10 +538,8 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac targetPlayer->resetHp(); targetPlayer->resetMp(); targetPlayer->setStatus( Entity::Chara::ActorStatus::Idle ); + targetPlayer->sendZoneInPackets( 0x01, 0x01, 0, 113, true ); - targetPlayer->sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true ); - targetPlayer->sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatus, - static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle ) ), true ); player.sendNotice( "Raised " + targetPlayer->getName() ); break; } From 990a8e231f5ece3405b5c59f3067633ee8997eee Mon Sep 17 00:00:00 2001 From: Biscuit Boy Date: Sun, 22 Apr 2018 18:22:45 +1000 Subject: [PATCH 005/199] [GM] chat now looks for the onlinestatus instead --- .../sapphire_zone/Network/Handlers/PacketHandlers.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 76fb6a99..70c4c86b 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -515,7 +515,7 @@ void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPa { case ChatType::Say: { - if (player.getGmRank() > 0) + if (player.getOnlineStatus() == OnlineStatus::GameMaster || player.getOnlineStatus() == OnlineStatus::GameMaster1 || player.getOnlineStatus() == OnlineStatus::GameMaster2 ) chatPacket.data().chatType = ChatType::GMSay; player.getCurrentZone()->queueOutPacketForRange( player, 50, chatPacket ); @@ -523,7 +523,7 @@ void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPa } case ChatType::Yell: { - if( player.getGmRank() > 0 ) + if( player.getOnlineStatus() == OnlineStatus::GameMaster || player.getOnlineStatus() == OnlineStatus::GameMaster1 || player.getOnlineStatus() == OnlineStatus::GameMaster2 ) chatPacket.data().chatType = ChatType::GMYell; player.getCurrentZone()->queueOutPacketForRange( player, 6000, chatPacket ); @@ -531,7 +531,7 @@ void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPa } case ChatType::Shout: { - if( player.getGmRank() > 0 ) + if( player.getOnlineStatus() == OnlineStatus::GameMaster || player.getOnlineStatus() == OnlineStatus::GameMaster1 || player.getOnlineStatus() == OnlineStatus::GameMaster2 ) chatPacket.data().chatType = ChatType::GMShout; player.getCurrentZone()->queueOutPacketForRange( player, 6000, chatPacket ); From faebcc8290cc79a210085d1c9e75f660b049250d Mon Sep 17 00:00:00 2001 From: Dantestyle Date: Mon, 14 May 2018 04:55:58 +0200 Subject: [PATCH 006/199] ManSea002 now work properly --- src/servers/Scripts/quest/ManSea002.cpp | 25 +- .../quest/subquest/limsa/SubSea001.cpp | 250 ++++++++++++++++++ 2 files changed, 264 insertions(+), 11 deletions(-) create mode 100644 src/servers/Scripts/quest/subquest/limsa/SubSea001.cpp diff --git a/src/servers/Scripts/quest/ManSea002.cpp b/src/servers/Scripts/quest/ManSea002.cpp index 9817969a..e8ae6aec 100644 --- a/src/servers/Scripts/quest/ManSea002.cpp +++ b/src/servers/Scripts/quest/ManSea002.cpp @@ -35,23 +35,26 @@ private: void Scene00000( Entity::Player& player ) { - auto callback = [&]( Entity::Player& player, const Event::SceneResult& result ) + player.playScene(getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result) { if( result.param2 == 1 ) // accept quest - Scene00050( player ); - }; - - player.playScene( getId(), 0, HIDE_HOTBAR, 0, 0, callback ); + Scene00001( player ); + } ); } void Scene00001( Entity::Player& player ) { - auto callback = [&]( Entity::Player& player, const Event::SceneResult& result ) + player.playScene( getId(), 1, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, + [&](Entity::Player& player, const Event::SceneResult& result) { + // on quest accept + player.updateQuest(getId(), 1); + player.setQuestUI8CH(getId(), 1); // receive key item - }; - - player.playScene( getId(), 1, NONE, callback ); + //player.forceZoneing(128); // teleport to real limsa + //player.playSceneChain(getId(), 2, NONE, bindScene( &ManSea002::Scene00050 ) ); + } ); } void Scene00002( Entity::Player& player ) @@ -128,12 +131,12 @@ private: { auto callback = [&]( Entity::Player& player, const Event::SceneResult& result ) { - // on quest accept + /*// on quest accept player.updateQuest( getId(), 1 ); player.setQuestUI8CH( getId(), 1 ); // receive key item // teleport to real limsa - player.forceZoneing( 128 ); + player.forceZoneing( 128 );*/ }; player.playScene( getId(), 50, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0, 0, callback ); diff --git a/src/servers/Scripts/quest/subquest/limsa/SubSea001.cpp b/src/servers/Scripts/quest/subquest/limsa/SubSea001.cpp new file mode 100644 index 00000000..51dea5cd --- /dev/null +++ b/src/servers/Scripts/quest/subquest/limsa/SubSea001.cpp @@ -0,0 +1,250 @@ +#include diff --git a/bin/web/login.html b/bin/web/login.html index 24a0d591..a6687cf7 100644 --- a/bin/web/login.html +++ b/bin/web/login.html @@ -18,11 +18,11 @@ xhr.onreadystatechange = function() { if (xhr.readyState == 4) { - try{ + try { var response = readBody(xhr); var parsed = JSON.parse(response); window.external.Boot(parsed.sId, parsed.lobbyHost, parsed.frontierHost); - }catch(err){ + } catch(err) { document.getElementById("Error").innerHTML = "Login failed."; } } @@ -54,7 +54,7 @@ Join us on Discord! - + Our Github repository diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index e6b7af5b..42aaae59 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -252,7 +252,7 @@ namespace Core { EmoteReq = 0x1F4, EmoteCancel = 0x1F6, - PersistantEmoteCancel = 0x1F7, + PersistentEmoteCancel = 0x1F7, PoseChange = 0x1F9, PoseReapply = 0x1FA, PoseCancel = 0x1FB, diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index dedc5058..f402873c 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -381,7 +381,7 @@ struct FFXIVIpcPlayerSpawn : FFXIVIpcBasePacket uint16_t activeMinion; uint8_t spawnIndex; uint8_t state; - uint8_t persistantEmote; + uint8_t persistentEmote; uint8_t modelType; // modelType -> eventSystemDefine uint8_t subtype; uint8_t voice; diff --git a/src/servers/sapphire_lobby/GameConnection.cpp b/src/servers/sapphire_lobby/GameConnection.cpp index 8b853b96..798bf8ec 100644 --- a/src/servers/sapphire_lobby/GameConnection.cpp +++ b/src/servers/sapphire_lobby/GameConnection.cpp @@ -132,7 +132,7 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui serverListPacket->data().server[0].index = 0; serverListPacket->data().final = 1; strcpy( serverListPacket->data().server[0].name, - g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); + g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); pRP.addPacket( serverListPacket ); auto retainerListPacket = makeLobbyPacket< FFXIVIpcRetainerList >( tmpId ); @@ -233,7 +233,7 @@ void Core::Network::GameConnection::enterWorld( FFXIVARR_PACKET_RAW& packet, uin enterWorldPacket->data().contentId = lookupId; enterWorldPacket->data().seq = sequence; strcpy( enterWorldPacket->data().host, - g_serverLobby.getConfig()->getValue< std::string >( "GlobalNetwork.ZoneHost" ).c_str() ); + g_serverLobby.getConfig()->getValue< std::string >( "GlobalNetwork.ZoneHost" ).c_str() ); enterWorldPacket->data().port = g_serverLobby.getConfig()->getValue< uint16_t >( "GlobalNetwork.ZonePort" ); enterWorldPacket->data().charId = logInCharId; memcpy( enterWorldPacket->data().sid, m_pSession->getSessionId(), 66 ); @@ -313,7 +313,7 @@ bool Core::Network::GameConnection::createOrModifyChar( FFXIVARR_PACKET_RAW& pac charCreatePacket->data().content_id = newContentId; strcpy( charCreatePacket->data().name, name.c_str() ); strcpy( charCreatePacket->data().world, - g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); + g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); charCreatePacket->data().type = 1; charCreatePacket->data().seq = sequence; charCreatePacket->data().unknown = 1; @@ -336,7 +336,7 @@ bool Core::Network::GameConnection::createOrModifyChar( FFXIVARR_PACKET_RAW& pac charCreatePacket->data().content_id = newContentId; strcpy( charCreatePacket->data().name, name.c_str() ); strcpy( charCreatePacket->data().world, - g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); + g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); charCreatePacket->data().type = 2; charCreatePacket->data().seq = sequence; charCreatePacket->data().unknown = 1; @@ -489,7 +489,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: m_bEncryptionInitialized = true; auto pe1 = boost::make_shared< FFXIVRawPacket >( 0x0A, 0x290, 0, 0 ); - *reinterpret_cast< uint32_t* >(&pe1->data()[0]) = 0xE0003C2A; + *reinterpret_cast< uint32_t* >( &pe1->data()[0] ) = 0xE0003C2A; BlowFish blowfish; blowfish.initialize( m_encKey, 0x10 ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 3054a8e2..eb1ef7a1 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -67,6 +67,7 @@ Core::Entity::Player::Player() : m_bAutoattack( false ), m_markedForRemoval( false ), m_mount( 0 ), + m_emote( 0 ), m_directorInitialized( false ), m_onEnterEventDone( false ) { @@ -1381,6 +1382,16 @@ uint8_t Core::Entity::Player::getCurrentMount() const return m_mount; } +void Core::Entity::Player::setPersistentEmote( uint32_t emoteId ) +{ + m_emote = emoteId; +} + +uint32_t Core::Entity::Player::getPersistentEmote() const +{ + return m_emote; +} + void Core::Entity::Player::autoAttack( CharaPtr pTarget ) { diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index a842958f..3354d966 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -387,6 +387,10 @@ public: void dismount(); /*! get the current mount */ uint8_t getCurrentMount() const; + /*! set current persistent emote */ + void setPersistentEmote( uint32_t emoteId ); + /*! get current persistent emote */ + uint32_t getPersistentEmote() const; void calculateStats() override; void sendStats(); @@ -714,6 +718,7 @@ private: uint32_t m_cfPenaltyUntil; // unix time uint8_t m_mount; + uint32_t m_emote; Util::SpawnIndexAllocator< uint8_t > m_objSpawnIndexAllocator; Util::SpawnIndexAllocator< uint8_t > m_actorSpawnIndexAllocator; diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index c48adc71..aae34235 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -144,6 +144,23 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR uint32_t emoteId = param11; bool isSilent = param2 == 1; + auto pExdData = g_fw.get< Data::ExdDataGenerated >(); + auto emoteData = pExdData->get< Data::Emote >( emoteId ); + + if( !emoteData ) + return; + + // TODO: This is wrong!! EmoteCategory does not define whether an emote is persistent or not. + // What defines an emote as persistent is EmoteData != 0 + bool isPersistent = emoteData->emoteCategory == static_cast< uint8_t >( EmoteCategory::Persistent ); + + if( isPersistent ) + { + player.setStance( Entity::Chara::Stance::Passive ); + player.setAutoattack( false ); + player.setPersistentEmote( emoteId ); + } + player.emote( emoteId, targetId, isSilent ); break; } @@ -152,13 +169,14 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR player.emoteInterrupt(); break; } - case ClientTriggerType::PersistantEmoteCancel: // cancel persistant emote + case ClientTriggerType::PersistentEmoteCancel: // cancel persistent emote { + player.setPersistentEmote( 0 ); player.emoteInterrupt(); - auto SetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), + auto pSetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), SetStatus, static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle ) ); - player.sendToInRangeSet( SetStatusPacket ); + player.sendToInRangeSet( pSetStatusPacket ); break; } case ClientTriggerType::PoseChange: // change pose diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index 4694ea22..91c78825 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -118,6 +118,7 @@ namespace Server { } m_data.currentMount = player.getCurrentMount(); + m_data.persistentEmote = player.getPersistentEmote(); m_data.targetId = player.getTargetId(); //m_data.type = 1; diff --git a/src/tools/exd_struct_gen/ex.json b/src/tools/exd_struct_gen/ex.json index 8dd7ef24..6f27ec8c 100644 --- a/src/tools/exd_struct_gen/ex.json +++ b/src/tools/exd_struct_gen/ex.json @@ -3551,6 +3551,18 @@ { "name": "Name" }, + { + "index": 1, + "type": "repeat", + "count": 7, + "definition": { + "name": "ActionTimeline", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + } + }, { "index": 11, "name": "EmoteCategory", @@ -3559,6 +3571,14 @@ "target": "EmoteCategory" } }, + { + "index": 12, + "name": "EmoteMode", + "converter": { + "type": "link", + "target": "EmoteMode" + } + }, { "index": 18, "name": "TextCommand", @@ -3589,6 +3609,10 @@ "type": "link", "target": "LogMessage" } + }, + { + "index": 22, + "name": "UnlockLink" } ] }, From afbb247e1c5eeec309b433369e6f9cc6dc42797a Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 9 Jul 2018 21:48:42 +0200 Subject: [PATCH 101/199] Persistent emotes now show properly to other players on spawn --- src/common/Exd/ExdDataGenerated.cpp | 8 +++++++ src/common/Exd/ExdDataGenerated.h | 22 +++++++++++++++++++ src/servers/sapphire_zone/Actor/Chara.h | 4 +++- .../Network/Handlers/ClientTriggerHandler.cpp | 10 +++++---- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index 1f2c8315..c891d997 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -1425,12 +1425,19 @@ Core::Data::Emote::Emote( uint32_t row_id, Core::Data::ExdDataGenerated* exdData auto row = exdData->m_EmoteDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); emoteCategory = exdData->getField< uint8_t >( row, 11 ); + emoteMode = exdData->getField< uint8_t >( row, 12 ); textCommand = exdData->getField< int32_t >( row, 18 ); icon = exdData->getField< uint16_t >( row, 19 ); logMessageTargeted = exdData->getField< uint16_t >( row, 20 ); logMessageUntargeted = exdData->getField< uint16_t >( row, 21 ); } +Core::Data::EmoteMode::EmoteMode( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EmoteDat.get_row( row_id ); + +} + Core::Data::EmoteCategory::EmoteCategory( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_EmoteCategoryDat.get_row( row_id ); @@ -4553,6 +4560,7 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_DpsChallengeTransientDat = setupDatAccess( "DpsChallengeTransient", xiv::exd::Language::none ); m_EmoteDat = setupDatAccess( "Emote", xiv::exd::Language::en ); m_EmoteCategoryDat = setupDatAccess( "EmoteCategory", xiv::exd::Language::en ); + m_EmoteModeDat = setupDatAccess( "EmoteMode", xiv::exd::Language::none ); m_ENpcBaseDat = setupDatAccess( "ENpcBase", xiv::exd::Language::none ); m_ENpcResidentDat = setupDatAccess( "ENpcResident", xiv::exd::Language::en ); m_EObjDat = setupDatAccess( "EObj", xiv::exd::Language::none ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index c2a5ccb2..41453f3a 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -1603,6 +1603,7 @@ struct Emote uint16_t icon; uint16_t logMessageTargeted; uint16_t logMessageUntargeted; + uint8_t emoteMode; Emote( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -1614,6 +1615,19 @@ struct EmoteCategory EmoteCategory( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; + +struct EmoteMode +{ + std::string name; + uint8_t emoteCategory; + int32_t textCommand; + uint16_t icon; + uint16_t logMessageTargeted; + uint16_t logMessageUntargeted; + + EmoteMode( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct ENpcBase { std::vector< uint32_t > eNpcData; @@ -4133,6 +4147,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_DpsChallengeTransientDat; xiv::exd::Exd m_EmoteDat; xiv::exd::Exd m_EmoteCategoryDat; + xiv::exd::Exd m_EmoteModeDat; xiv::exd::Exd m_ENpcBaseDat; xiv::exd::Exd m_ENpcResidentDat; xiv::exd::Exd m_EObjDat; @@ -4861,6 +4876,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_DpsChallengeOfficerIdList; std::set< uint32_t > m_DpsChallengeTransientIdList; std::set< uint32_t > m_EmoteIdList; + std::set< uint32_t > m_EmoteModeIdList; std::set< uint32_t > m_EmoteCategoryIdList; std::set< uint32_t > m_ENpcBaseIdList; std::set< uint32_t > m_ENpcResidentIdList; @@ -5823,6 +5839,12 @@ const std::set< uint32_t >& getEmoteIdList() loadIdList( m_EmoteDat, m_EmoteIdList ); return m_EmoteIdList; } +const std::set< uint32_t >& getEmoteModeIdList() +{ + if( m_EmoteModeIdList.size() == 0 ) + loadIdList( m_EmoteModeDat, m_EmoteModeIdList ); + return m_EmoteModeIdList; +} const std::set< uint32_t >& getEmoteCategoryIdList() { if( m_EmoteCategoryIdList.size() == 0 ) diff --git a/src/servers/sapphire_zone/Actor/Chara.h b/src/servers/sapphire_zone/Actor/Chara.h index 25005000..63abfe8b 100644 --- a/src/servers/sapphire_zone/Actor/Chara.h +++ b/src/servers/sapphire_zone/Actor/Chara.h @@ -46,7 +46,9 @@ public: Crafting = 0x05, Gathering = 0x06, Melding = 0x07, - SMachine = 0x08 + SMachine = 0x08, + Carry = 0x09, + EmoteMode = 0x0B }; /*! ModelType as found in eventsystemdefine.exd */ diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index aae34235..1a6e8820 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -150,15 +150,17 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR if( !emoteData ) return; - // TODO: This is wrong!! EmoteCategory does not define whether an emote is persistent or not. - // What defines an emote as persistent is EmoteData != 0 - bool isPersistent = emoteData->emoteCategory == static_cast< uint8_t >( EmoteCategory::Persistent ); + bool isPersistent = emoteData->emoteMode != 0; if( isPersistent ) { player.setStance( Entity::Chara::Stance::Passive ); player.setAutoattack( false ); - player.setPersistentEmote( emoteId ); + player.setPersistentEmote( emoteData->emoteMode ); + player.setStatus( Entity::Chara::ActorStatus::EmoteMode ); + player.sendToInRangeSet( + boost::make_shared< ActorControlPacket142 >( player.getId(), ActorControlType::SetStatus, + static_cast< uint8_t >( Entity::Chara::ActorStatus::EmoteMode ) ), true ); } player.emote( emoteId, targetId, isSilent ); From 3dcb7c3629d0558d09f18c8ba488297e256a3d57 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 9 Jul 2018 22:34:56 +0200 Subject: [PATCH 102/199] #329 Fixed relogging while persistent emote is on ( restting state to idle ) --- src/servers/sapphire_zone/Actor/PlayerSql.cpp | 4 ++++ .../sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp | 1 + 2 files changed, 5 insertions(+) diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 1a325350..404f60dc 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -125,6 +125,10 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession ) m_birthDay = res->getUInt8( "BirthDay" ); m_birthMonth = res->getUInt8( "BirthMonth" ); m_status = static_cast< ActorStatus >( res->getUInt( "Status" ) ); + + if( m_status == Entity::Chara::ActorStatus::EmoteMode ) + m_status = Entity::Chara::ActorStatus::Idle; + m_class = static_cast< ClassJob >( res->getUInt( "Class" ) ); m_homePoint = res->getUInt8( "Homepoint" ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 1a6e8820..52aefcdf 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -175,6 +175,7 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR { player.setPersistentEmote( 0 ); player.emoteInterrupt(); + player.setStatus( Entity::Chara::ActorStatus::Idle ); auto pSetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), SetStatus, static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle ) ); From ca5db2cae3fa9cc74c2256e0b7f14087b30df665 Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Mon, 9 Jul 2018 21:53:23 +0100 Subject: [PATCH 103/199] changed player.setQuestBitFlag functions to allow unsetting the bit --- .../sapphire_zone/Actor/PlayerQuest.cpp | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerQuest.cpp b/src/servers/sapphire_zone/Actor/PlayerQuest.cpp index 4e7b8a9a..7c8a10f9 100644 --- a/src/servers/sapphire_zone/Actor/PlayerQuest.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerQuest.cpp @@ -767,9 +767,10 @@ void Core::Entity::Player::setQuestBitFlag8( uint16_t questId, uint8_t index, bo { boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; - uint8_t flag = val ? 1 : 0; - - pNewQuest->a.BitFlag8 |= ( val << index ); + if( val ) + pNewQuest->a.BitFlag8 |= ( 1 << index ); + else + pNewQuest->a.BitFlag8 &= ~( 1 << index ); updateQuest( questId, pNewQuest->c.sequence ); } @@ -783,9 +784,10 @@ void Core::Entity::Player::setQuestBitFlag16( uint16_t questId, uint8_t index, b { boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; - uint8_t flag = val ? 1 : 0; - - pNewQuest->a.BitFlag16 |= ( val << index ); + if( val ) + pNewQuest->a.BitFlag16 |= ( 1 << index ); + else + pNewQuest->a.BitFlag16 &= ~( 1 << index ); updateQuest( questId, pNewQuest->c.sequence ); } @@ -799,13 +801,15 @@ void Core::Entity::Player::setQuestBitFlag24( uint16_t questId, uint8_t index, b { boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; - uint8_t flag = val ? 1 : 0; - - pNewQuest->a.BitFlag24 |= ( val << index ); + if( val ) + pNewQuest->a.BitFlag24 |= ( 1 << index ); + else + pNewQuest->a.BitFlag24 &= ~( 1 << index ); updateQuest( questId, pNewQuest->c.sequence ); } } + void Core::Entity::Player::setQuestBitFlag32( uint16_t questId, uint8_t index, bool val ) { int8_t idx = getQuestIndex( questId ); @@ -814,9 +818,10 @@ void Core::Entity::Player::setQuestBitFlag32( uint16_t questId, uint8_t index, b { boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; - uint8_t flag = val ? 1 : 0; - - pNewQuest->a.BitFlag32 |= ( val << index ); + if( val ) + pNewQuest->a.BitFlag32 |= ( 1 << index ); + else + pNewQuest->a.BitFlag32 &= ~( 1 << index ); updateQuest( questId, pNewQuest->c.sequence ); } @@ -830,9 +835,10 @@ void Core::Entity::Player::setQuestBitFlag40( uint16_t questId, uint8_t index, b { boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; - uint8_t flag = val ? 1 : 0; - - pNewQuest->a.BitFlag40 |= ( val << index ); + if( val ) + pNewQuest->a.BitFlag40 |= ( 1 << index ); + else + pNewQuest->a.BitFlag40 &= ~( 1 << index ); updateQuest( questId, pNewQuest->c.sequence ); } @@ -846,16 +852,16 @@ void Core::Entity::Player::setQuestBitFlag48( uint16_t questId, uint8_t index, b { boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; - uint8_t flag = val ? 1 : 0; - - pNewQuest->a.BitFlag48 |= ( val << index ); + if( val ) + pNewQuest->a.BitFlag48 |= ( 1 << index ); + else + pNewQuest->a.BitFlag48 &= ~( 1 << index ); updateQuest( questId, pNewQuest->c.sequence ); } } - uint8_t Core::Entity::Player::getQuestSeq( uint16_t questId ) { int8_t idx = getQuestIndex( questId ); @@ -1027,7 +1033,7 @@ bool Core::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optional auto pExdData = g_fw.get< Data::ExdDataGenerated >(); uint32_t playerLevel = getLevel(); auto questInfo = pExdData->get< Core::Data::Quest >( questId ); - + if( !questInfo ) return false; @@ -1062,7 +1068,7 @@ bool Core::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optional auto itemId = questInfo->itemReward1.at( optionalChoice ); addItem( -1, itemId, questInfo->itemCountReward1.at( optionalChoice ) ); } - + if( gilReward > 0 ) addCurrency( 1, gilReward ); From 66fd8ba7fe0f4a2a7f5b50c306dbf45397d06644 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 10 Jul 2018 20:22:46 +1000 Subject: [PATCH 104/199] fixed inter-instance gm calling, fixes #341 as a note, calling someone into an instance has been disabled --- .../Network/Handlers/GMCommandHandlers.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index b68be510..23687b2d 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -551,8 +551,14 @@ void Core::Network::GameConnection::gm2Handler( const Packets::FFXIVARR_PACKET_R } case GmCommand::Call: { - if( targetPlayer->getZoneId() != player.getZoneId() ) - targetPlayer->setZone( player.getZoneId() ); + // We shouldn't be able to call a player into an instance, only call them out of one + if( player.getCurrentInstance() ) + { + player.sendUrgent("You are unable to call a player while bound to a battle instance."); + return; + } + + targetPlayer->setInstance( player.getCurrentZone() ); targetPlayer->changePosition( player.getPos().x, player.getPos().y, player.getPos().z, player.getRot() ); player.sendNotice( "Calling " + targetPlayer->getName() ); From 7ee20730fa62315d5b957a741cefca9414b77f92 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 10 Jul 2018 20:25:08 +1000 Subject: [PATCH 105/199] 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 23687b2d..4a583bc6 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -554,7 +554,7 @@ void Core::Network::GameConnection::gm2Handler( const Packets::FFXIVARR_PACKET_R // We shouldn't be able to call a player into an instance, only call them out of one if( player.getCurrentInstance() ) { - player.sendUrgent("You are unable to call a player while bound to a battle instance."); + player.sendUrgent( "You are unable to call a player while bound to a battle instance." ); return; } From 467bcf41630f32b97235675ba97d4bda06dc60c4 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 11 Jul 2018 18:07:48 +1000 Subject: [PATCH 106/199] persist emotes now persist through logout/login --- src/servers/sapphire_zone/Actor/Player.cpp | 6 +++--- src/servers/sapphire_zone/Actor/Player.h | 2 +- src/servers/sapphire_zone/Actor/PlayerSql.cpp | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index eb1ef7a1..2c7073ec 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -67,7 +67,7 @@ Core::Entity::Player::Player() : m_bAutoattack( false ), m_markedForRemoval( false ), m_mount( 0 ), - m_emote( 0 ), + m_emoteMode( 0 ), m_directorInitialized( false ), m_onEnterEventDone( false ) { @@ -1384,12 +1384,12 @@ uint8_t Core::Entity::Player::getCurrentMount() const void Core::Entity::Player::setPersistentEmote( uint32_t emoteId ) { - m_emote = emoteId; + m_emoteMode = emoteId; } uint32_t Core::Entity::Player::getPersistentEmote() const { - return m_emote; + return m_emoteMode; } void Core::Entity::Player::autoAttack( CharaPtr pTarget ) diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 3354d966..2a19b399 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -718,7 +718,7 @@ private: uint32_t m_cfPenaltyUntil; // unix time uint8_t m_mount; - uint32_t m_emote; + uint32_t m_emoteMode; Util::SpawnIndexAllocator< uint8_t > m_objSpawnIndexAllocator; Util::SpawnIndexAllocator< uint8_t > m_actorSpawnIndexAllocator; diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 404f60dc..3177fbdc 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -125,9 +125,9 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession ) m_birthDay = res->getUInt8( "BirthDay" ); m_birthMonth = res->getUInt8( "BirthMonth" ); m_status = static_cast< ActorStatus >( res->getUInt( "Status" ) ); + m_emoteMode = res->getUInt( "EmoteModeType" ); - if( m_status == Entity::Chara::ActorStatus::EmoteMode ) - m_status = Entity::Chara::ActorStatus::Idle; + m_activeTitle = res->getUInt16( "ActiveTitle" ); m_class = static_cast< ClassJob >( res->getUInt( "Class" ) ); m_homePoint = res->getUInt8( "Homepoint" ); @@ -352,7 +352,7 @@ void Core::Entity::Player::updateSql() memcpy( modelVec.data(), m_modelEquip, sizeof( m_modelEquip ) ); stmt->setBinary( 13, modelVec ); - stmt->setInt( 14, 0 ); // EmodeModeType + stmt->setInt( 14, m_emoteMode ); // EmodeModeType stmt->setInt( 15, 0 ); // Language stmt->setInt( 16, static_cast< uint32_t >( m_bNewGame ) ); @@ -379,7 +379,7 @@ void Core::Entity::Player::updateSql() stmt->setBinary( 34, { 0, 0, 0 } ); // FavoritePoint stmt->setInt( 35, 0 ); // RestPoint - stmt->setInt( 36, 0 ); // ActiveTitle + stmt->setInt( 36, m_activeTitle ); // ActiveTitle std::vector< uint8_t > titleListVec( sizeof ( m_titleList ) ); stmt->setBinary( 37, titleListVec ); From c4f35b075329c455c25327fa8344807563dc048f Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 11 Jul 2018 20:42:49 +1000 Subject: [PATCH 107/199] sit now works correctly when doing /sit while sitting --- src/common/Exd/ExdDataGenerated.cpp | 1 + src/common/Exd/ExdDataGenerated.h | 1 + .../sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index c891d997..2f7b3af1 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -1426,6 +1426,7 @@ Core::Data::Emote::Emote( uint32_t row_id, Core::Data::ExdDataGenerated* exdData name = exdData->getField< std::string >( row, 0 ); emoteCategory = exdData->getField< uint8_t >( row, 11 ); emoteMode = exdData->getField< uint8_t >( row, 12 ); + hasCancelEmote = exdData->getField< bool >( row, 15 ); textCommand = exdData->getField< int32_t >( row, 18 ); icon = exdData->getField< uint16_t >( row, 19 ); logMessageTargeted = exdData->getField< uint16_t >( row, 20 ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index 41453f3a..a4a516bc 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -1604,6 +1604,7 @@ struct Emote uint16_t logMessageTargeted; uint16_t logMessageUntargeted; uint8_t emoteMode; + bool hasCancelEmote; Emote( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 52aefcdf..4c5fae88 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -158,9 +158,10 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR player.setAutoattack( false ); player.setPersistentEmote( emoteData->emoteMode ); player.setStatus( Entity::Chara::ActorStatus::EmoteMode ); + player.sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( player.getId(), ActorControlType::SetStatus, - static_cast< uint8_t >( Entity::Chara::ActorStatus::EmoteMode ) ), true ); + static_cast< uint8_t >( Entity::Chara::ActorStatus::EmoteMode ), emoteData->hasCancelEmote ? 1 : 0 ), true ); } player.emote( emoteId, targetId, isSilent ); From c12c0b1d997578f0225e739fe651878863774f83 Mon Sep 17 00:00:00 2001 From: Mordred Date: Wed, 11 Jul 2018 23:52:24 +0200 Subject: [PATCH 108/199] Groundwork for pose, still needs to be added to spawn / initui --- sql/update.sql | 3 ++- src/common/Database/CharaDbConnection.cpp | 5 +++-- src/servers/sapphire_zone/Actor/Player.cpp | 10 ++++++++++ src/servers/sapphire_zone/Actor/Player.h | 4 ++++ src/servers/sapphire_zone/Actor/PlayerSql.cpp | 8 ++++++-- .../Network/Handlers/ClientTriggerHandler.cpp | 13 ++++++++++--- 6 files changed, 35 insertions(+), 8 deletions(-) diff --git a/sql/update.sql b/sql/update.sql index 331b0598..239bb5a4 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -47,4 +47,5 @@ ALTER TABLE `charainfo` CHANGE `Mounts` `Mounts` BINARY(15) NULL DEFAULT NULL; ALTER TABLE `charainfo` CHANGE `Orchestrion` `Orchestrion` BINARY(40) NULL DEFAULT NULL; 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`; \ No newline at end of file +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 diff --git a/src/common/Database/CharaDbConnection.cpp b/src/common/Database/CharaDbConnection.cpp index 215f347c..d3dd29a2 100644 --- a/src/common/Database/CharaDbConnection.cpp +++ b/src/common/Database/CharaDbConnection.cpp @@ -29,7 +29,8 @@ void Core::Db::CharaDbConnection::doPrepareStatements() "FavoritePoint, RestPoint, StartTown, ActiveTitle, TitleList, Achievement, " "Aetheryte, HowTo, Minions, Mounts, Orchestrion, EquippedMannequin, ConfigFlags, " "QuestCompleteFlags, OpeningSequence, QuestTracking, GrandCompany, " - "GrandCompanyRank, Discovery, GMRank, EquipDisplayFlags, Unlocks, CFPenaltyUntil " + "GrandCompanyRank, Discovery, GMRank, EquipDisplayFlags, Unlocks, CFPenaltyUntil, " + "Pose " "FROM charainfo WHERE CharacterId = ?;", CONNECTION_SYNC ); @@ -44,7 +45,7 @@ void Core::Db::CharaDbConnection::doPrepareStatements() "ActiveTitle = ?, TitleList = ?, Achievement = ?, Aetheryte = ?, HowTo = ?, Minions = ?, Mounts = ?, Orchestrion = ?, " "EquippedMannequin = ?, ConfigFlags = ?, QuestCompleteFlags = ?, OpeningSequence = ?, " "QuestTracking = ?, GrandCompany = ?, GrandCompanyRank = ?, Discovery = ?, GMRank = ?, EquipDisplayFlags = ?, Unlocks = ?, " - "CFPenaltyUntil = ? WHERE CharacterId = ?;", CONNECTION_ASYNC ); + "CFPenaltyUntil = ?, Pose = ? WHERE CharacterId = ?;", CONNECTION_ASYNC ); prepareStatement( CHARA_SEL_MINIMAL, "SELECT Name, Customize, ModelEquip, TerritoryId, GuardianDeity, " diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 2c7073ec..adf894a2 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -277,6 +277,16 @@ bool Core::Entity::Player::isAutoattackOn() const return m_bAutoattack; } +uint8_t Core::Entity::Player::getPose() const +{ + return m_pose; +} + +void Core::Entity::Player::setPose( uint8_t pose ) +{ + m_pose = pose; +} + void Core::Entity::Player::sendStats() { diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 2a19b399..b03bb9dd 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -565,6 +565,9 @@ public: void setAutoattack( bool mode ); bool isAutoattackOn() const; + uint8_t getPose() const; + void setPose( uint8_t pose ); + // Content Finder handling ////////////////////////////////////////////////////////////////////////////////////////////////////// /*! Get an unix time when the player can register into content finder again. */ @@ -719,6 +722,7 @@ private: uint8_t m_mount; uint32_t m_emoteMode; + uint8_t m_pose; Util::SpawnIndexAllocator< uint8_t > m_objSpawnIndexAllocator; Util::SpawnIndexAllocator< uint8_t > m_actorSpawnIndexAllocator; diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 3177fbdc..070cd65f 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -151,6 +151,8 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession ) m_equipDisplayFlags = res->getUInt8( "EquipDisplayFlags" ); + m_pose = res->getUInt8( "Pose" ); + // Blobs auto howTo = res->getBlobVector( "HowTo" ); @@ -328,7 +330,7 @@ void Core::Entity::Player::updateSql() "ActiveTitle 36, TitleList 37, Achievement 38, Aetheryte 39, HowTo 40, Minions 41, Mounts 42, Orchestrion 43, " "EquippedMannequin 44, ConfigFlags 45, QuestCompleteFlags 46, OpeningSequence 47, " "QuestTracking 48, GrandCompany 49, GrandCompanyRank 50, Discovery 51, GMRank 52, Unlocks 53, " - "CFPenaltyUntil 54"*/ + "CFPenaltyUntil 54, Pose 55"*/ auto stmt = pDb->getPreparedStatement( Db::CharaDbStatements::CHARA_UP ); stmt->setInt( 1, getHp() ); @@ -438,7 +440,9 @@ void Core::Entity::Player::updateSql() stmt->setInt( 55, m_cfPenaltyUntil ); - stmt->setInt( 56, m_id ); + stmt->setInt( 56, m_pose ); + + stmt->setInt( 57, m_id ); pDb->execute( stmt ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 4c5fae88..b2a3322e 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -184,15 +184,22 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR break; } case ClientTriggerType::PoseChange: // change pose - { - break; - } case ClientTriggerType::PoseReapply: // reapply pose { + player.setPose( param12 ); + auto pSetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), + SetPose, + param11, param12 ); + player.sendToInRangeSet( pSetStatusPacket, true ); break; } case ClientTriggerType::PoseCancel: // cancel pose { + player.setPose( param12 ); + auto pSetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), + SetPose, + param11, param12 ); + player.sendToInRangeSet( pSetStatusPacket, true ); break; } case ClientTriggerType::Return: // return dead / accept raise From db9e2faf55d45926da9d60c1053e42541025db6e Mon Sep 17 00:00:00 2001 From: Dantestyle Date: Thu, 12 Jul 2018 01:39:16 +0200 Subject: [PATCH 109/199] more EventHelper on chat, I like them --- src/servers/sapphire_zone/Event/EventHelper.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Event/EventHelper.cpp b/src/servers/sapphire_zone/Event/EventHelper.cpp index 1b4c34b6..e4e13cdf 100644 --- a/src/servers/sapphire_zone/Event/EventHelper.cpp +++ b/src/servers/sapphire_zone/Event/EventHelper.cpp @@ -70,7 +70,18 @@ std::string Core::Event::getEventName( uint32_t eventId ) case Event::EventHandler::EventHandlerType::Warp: { - return "ChocoboTaxi"; + auto warpInfo = pExdData->get< Core::Data::Warp >( eventId ); + if( warpInfo ) + return "WarpTaxi"; + return unknown + "ChocoboWarp"; //who know + } + case Event::EventHandler::EventHandlerType::Shop: + { + auto shopInfo = pExdData->get< Core::Data::GilShop >( eventId ); + std::string name = shopInfo->name; + + if( shopInfo ) + return "GilShop - " + name; } default: { From 5eb846118d544a36e858dc39f71829479e9471aa Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 12 Jul 2018 20:42:28 +1000 Subject: [PATCH 110/199] fix emotes which require a weapon to be unholstered --- src/common/Exd/ExdDataGenerated.cpp | 1 + src/common/Exd/ExdDataGenerated.h | 1 + src/common/Network/CommonActorControl.h | 3 ++- src/servers/sapphire_zone/Actor/Chara.cpp | 2 +- .../sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp | 6 ++++++ 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index 2f7b3af1..b058341e 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -1427,6 +1427,7 @@ Core::Data::Emote::Emote( uint32_t row_id, Core::Data::ExdDataGenerated* exdData emoteCategory = exdData->getField< uint8_t >( row, 11 ); emoteMode = exdData->getField< uint8_t >( row, 12 ); hasCancelEmote = exdData->getField< bool >( row, 15 ); + drawsWeapon = exdData->getField< bool >( row, 16 ); textCommand = exdData->getField< int32_t >( row, 18 ); icon = exdData->getField< uint16_t >( row, 19 ); logMessageTargeted = exdData->getField< uint16_t >( row, 20 ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index a4a516bc..c0f9d8e4 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -1605,6 +1605,7 @@ struct Emote uint16_t logMessageUntargeted; uint8_t emoteMode; bool hasCancelEmote; + bool drawsWeapon; Emote( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 42aaae59..61163967 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -17,7 +17,8 @@ namespace Core { enum ActorControlType : uint16_t { - ToggleWeapon = 0x01, + ToggleWeapon = 0x00, + ToggleAutoAttack = 0x01, SetStatus = 0x02, CastStart = 0x03, ToggleAggro = 0x04, diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index 4fbc8716..9f78525b 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -257,7 +257,7 @@ void Core::Entity::Chara::setStance( Stance stance ) { m_currentStance = stance; - FFXIVPacketBasePtr packet = boost::make_shared< ActorControlPacket142 >( m_id, ToggleAggro, stance, 1 ); + FFXIVPacketBasePtr packet = boost::make_shared< ActorControlPacket142 >( m_id, ToggleWeapon, stance, 0 ); sendToInRangeSet( packet ); } diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index b2a3322e..27271528 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -165,6 +165,12 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR } player.emote( emoteId, targetId, isSilent ); + + if( emoteData->drawsWeapon ) + { + player.setStance( Entity::Chara::Stance::Active ); + } + break; } case ClientTriggerType::EmoteCancel: // emote From b856356ce7055f411a29b40fa92e4c1aed069a5d Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 12 Jul 2018 20:55:46 +1000 Subject: [PATCH 111/199] fix sitting animating incorrectly for other clients, fixes #329 --- src/common/Network/CommonActorControl.h | 1 - .../sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 61163967..4749dc2d 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -18,7 +18,6 @@ namespace Core { enum ActorControlType : uint16_t { ToggleWeapon = 0x00, - ToggleAutoAttack = 0x01, SetStatus = 0x02, CastStart = 0x03, ToggleAggro = 0x04, diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 27271528..e6a9a32d 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -150,6 +150,8 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR if( !emoteData ) return; + player.emote( emoteId, targetId, isSilent ); + bool isPersistent = emoteData->emoteMode != 0; if( isPersistent ) @@ -164,8 +166,6 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR static_cast< uint8_t >( Entity::Chara::ActorStatus::EmoteMode ), emoteData->hasCancelEmote ? 1 : 0 ), true ); } - player.emote( emoteId, targetId, isSilent ); - if( emoteData->drawsWeapon ) { player.setStance( Entity::Chara::Stance::Active ); From 43087573792982d2480ecfc238e000f9d73f66de Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 12 Jul 2018 20:01:38 +0200 Subject: [PATCH 112/199] fixes #122 - Searchmessages wont be overwritten anymore --- src/servers/sapphire_zone/Actor/PlayerSql.cpp | 6 +++--- .../Network/PacketWrappers/PlayerSpawnPacket.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 070cd65f..94224bf2 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -307,11 +307,11 @@ bool Core::Entity::Player::loadSearchInfo() if( !res->next() ) return false; - m_searchSelectClass = res->getUInt8( 1 ); - m_searchSelectRegion = res->getUInt8( 2 ); + m_searchSelectClass = res->getUInt8( 2 ); + m_searchSelectRegion = res->getUInt8( 3 ); // todo: internally use an std::string instead of a char[] - auto searchMessage = res->getString( 3 ); + auto searchMessage = res->getString( 4 ); std::copy( searchMessage.begin(), searchMessage.end(), m_searchMessage ); return true; diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index 91c78825..3194099c 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -46,7 +46,7 @@ namespace Server { //m_data.tPMax = 3000; m_data.level = player.getLevel(); m_data.gmRank = player.getGmRank(); - m_data.pose = 0; + m_data.pose = player.getPose(); memcpy( m_data.look, player.getLookArray(), 26 ); From 510fc101bb4d61db9ef1659dee005cffddabc35f Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 12 Jul 2018 23:39:14 +0200 Subject: [PATCH 113/199] Updated InitUI, still alot of it scrambled after last update --- .../Network/PacketDef/Zone/ServerZoneDef.h | 44 +++++-------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index f402873c..7ca5cf0d 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -662,7 +662,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char companionFavoFeed; unsigned char companionUnk2E; unsigned char companionTimePassed[4]; - unsigned short unknown38[11]; + unsigned char unknown38[22]; unsigned int exp[25]; unsigned char unknown564[16]; unsigned int pvpFrontlineOverall1st; @@ -671,10 +671,11 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char relicBookCompletion1[4]; unsigned short levels[25]; unsigned short levelsPadding; - unsigned char unknown__[16]; + unsigned short unknown__[8]; unsigned short fishingRecordsFish[26]; unsigned short fishingRecordsFishWeight[26]; - unsigned char unknownMask554[44]; + unsigned short beastExp[11]; + unsigned char unknownMask554[22]; unsigned char companion_name[21]; unsigned char companionDefRank; unsigned char companionAttRank; @@ -691,36 +692,17 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char chocoboTaxiMask[8]; unsigned char contentClearMask[111]; unsigned char contentClearPadding; - unsigned short unknown428[8]; + unsigned char unknown428[16]; unsigned char companionBardingMask[8]; unsigned char companionEquippedHead; unsigned char companionEquippedBody; + unsigned char fishingGuideMask[89]; + unsigned char fishingSpotVisited[25]; unsigned char companionEquippedFeet; unsigned char companionUnk4[4]; unsigned char companion_fields[11]; - unsigned char fishingGuideMask[89]; - unsigned char fishingSpotVisited[25]; - unsigned char unknownMask4Padding; - unsigned char rankAmalJaa; - unsigned char rankSylph; - unsigned char rankKobold; - unsigned char rankSahagin; - unsigned char rankIxal; - unsigned char rankVanu; - unsigned char rankVath; - unsigned char rankMoogle; - unsigned char rankKojin; - unsigned char rankAnata; - unsigned short expAmalJaa; - unsigned short expSylph; - unsigned short expKobold; - unsigned short expSahagin; - unsigned short expIxal; - unsigned short expVanu; - unsigned short expVath; - unsigned short expMoogle; - unsigned short expKojin; - unsigned short expAnata; + unsigned char unknownMask4Padding[4]; + unsigned char beastRank[11]; unsigned char unknown596[10]; unsigned short unknown5A0[5]; unsigned char unknownMask59E[5]; @@ -734,9 +716,9 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char relicBookCompletion2[8]; unsigned char sightseeingMask[26]; unsigned short unknown_XXX; - unsigned char unknown61E; - unsigned char unknown61F[32]; - unsigned char unknown63F[22]; + unsigned char unknown61E[20]; + unsigned char unknown61F[29]; + unsigned char unknown63F[5]; unsigned char tripleTriadCards[28]; unsigned char unknown671[11]; unsigned char unknownMask67C[22]; @@ -752,8 +734,6 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unlockedTrials[7]; unsigned char unlockedPvp[5]; unsigned char unknownMask72D[28]; - // unsigned char unknownMask749[18]; - //unsigned char unknown749[13]; }; From 1ea41582567115bdc8be18478a39a13996ddb136 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sat, 14 Jul 2018 00:11:28 +0200 Subject: [PATCH 114/199] More initui adjustments --- .../Network/PacketDef/Zone/ServerZoneDef.h | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 7ca5cf0d..8d9e9045 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -635,9 +635,11 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unknown82; unsigned char unknown83; unsigned char unknown84[4]; - unsigned char unknown88[10]; + unsigned short unknown50; + unsigned char unknown52[8]; unsigned short playerCommendations; - unsigned char unknown94[22]; + unsigned short unknown5C; + unsigned char unknown94[20]; unsigned short unknown18; unsigned char maxLevel; unsigned char expansion; @@ -671,11 +673,16 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char relicBookCompletion1[4]; unsigned short levels[25]; unsigned short levelsPadding; - unsigned short unknown__[8]; + unsigned short unknown15C[8]; unsigned short fishingRecordsFish[26]; unsigned short fishingRecordsFishWeight[26]; unsigned short beastExp[11]; - unsigned char unknownMask554[22]; + unsigned short unknown1EA; + unsigned short unknown1EC; + unsigned short unknown1EE; + unsigned short unknown1F0; + unsigned short unknown1F2; + unsigned char unknownMask554[12]; unsigned char companion_name[21]; unsigned char companionDefRank; unsigned char companionAttRank; @@ -691,22 +698,18 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char minions[38]; unsigned char chocoboTaxiMask[8]; unsigned char contentClearMask[111]; - unsigned char contentClearPadding; - unsigned char unknown428[16]; - unsigned char companionBardingMask[8]; - unsigned char companionEquippedHead; - unsigned char companionEquippedBody; + unsigned char companion_fields[12]; + unsigned char unknown519[4]; + unsigned char unknownMask51D[11]; unsigned char fishingGuideMask[89]; unsigned char fishingSpotVisited[25]; - unsigned char companionEquippedFeet; - unsigned char companionUnk4[4]; - unsigned char companion_fields[11]; - unsigned char unknownMask4Padding[4]; + unsigned char unknown59A[15]; + unsigned char unknown5AF[5]; + unsigned char unknown5AE[11]; unsigned char beastRank[11]; - unsigned char unknown596[10]; - unsigned short unknown5A0[5]; + unsigned char unknown5A0; unsigned char unknownMask59E[5]; - unsigned char unknown5A3[18]; + unsigned char unknown5CA[16]; unsigned char unknownMask5C1[28]; unsigned char unknown_03411; unsigned int unknownDword5E0; @@ -716,11 +719,9 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char relicBookCompletion2[8]; unsigned char sightseeingMask[26]; unsigned short unknown_XXX; - unsigned char unknown61E[20]; - unsigned char unknown61F[29]; - unsigned char unknown63F[5]; - unsigned char tripleTriadCards[28]; - unsigned char unknown671[11]; + unsigned char unknown61E[48]; + unsigned char tripleTriadCards[29]; + unsigned char unknown61F[25]; unsigned char unknownMask67C[22]; unsigned char unknown692[3]; unsigned char orchestrionMask[40]; @@ -734,6 +735,9 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unlockedTrials[7]; unsigned char unlockedPvp[5]; unsigned char unknownMask72D[28]; + unsigned char companionBardingMask[9]; + unsigned char companionEquippedHead; + unsigned char companionEquippedBody; }; From ccd581682af20fd9f61e62627b5032552a50af74 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sat, 14 Jul 2018 13:49:30 +0200 Subject: [PATCH 115/199] More InitUI adjustments --- .../Network/PacketDef/Zone/ServerZoneDef.h | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 8d9e9045..38dbac83 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -617,33 +617,30 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned int charId; unsigned int restedExp; unsigned int companionCurrentExp; - unsigned int unknown3C; + unsigned int unknown1C; unsigned int fishCaught; unsigned int useBaitCatalogId; unsigned int pvpWolfFoldMatches; unsigned short pvpWolfFoldWeeklyMatches; unsigned short pvpWolfFoldWeeklyVictories; unsigned short pvpStats[6]; - unsigned short unknown74; - unsigned short pvpStats1; + unsigned int unknown3C; unsigned char frontlineCampaigns[4]; unsigned short frontlineCampaignsWeekly; unsigned char currentRelic; unsigned char currentBook; - unsigned char masterCrafterMask; - unsigned char unknown81; - unsigned char unknown82; - unsigned char unknown83; - unsigned char unknown84[4]; + float companionTimePassed; + unsigned int unknown4C; unsigned short unknown50; unsigned char unknown52[8]; unsigned short playerCommendations; unsigned short unknown5C; - unsigned char unknown94[20]; - unsigned short unknown18; + unsigned short unknown5E; + unsigned short unknown60[9]; + unsigned short unknown72; unsigned char maxLevel; unsigned char expansion; - unsigned char unknown; + unsigned char unknown76; unsigned char race; unsigned char tribe; unsigned char gender; @@ -654,7 +651,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char namedayDay; unsigned char cityState; unsigned char homepoint; - unsigned char unknown26; + unsigned char unknown81; unsigned char petHotBar; unsigned char companionRank; unsigned char companionStars; @@ -662,9 +659,9 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char companionUnk2B; unsigned char companionColor; unsigned char companionFavoFeed; - unsigned char companionUnk2E; - unsigned char companionTimePassed[4]; - unsigned char unknown38[22]; + unsigned char unknown89; + unsigned char unknown8A[4]; + unsigned char unknown8E[22]; unsigned int exp[25]; unsigned char unknown564[16]; unsigned int pvpFrontlineOverall1st; @@ -682,7 +679,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned short unknown1EE; unsigned short unknown1F0; unsigned short unknown1F2; - unsigned char unknownMask554[12]; + unsigned char unknownMask1F8[12]; unsigned char companion_name[21]; unsigned char companionDefRank; unsigned char companionAttRank; @@ -704,15 +701,14 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char fishingGuideMask[89]; unsigned char fishingSpotVisited[25]; unsigned char unknown59A[15]; - unsigned char unknown5AF[5]; + unsigned char unknown5A9[5]; unsigned char unknown5AE[11]; unsigned char beastRank[11]; - unsigned char unknown5A0; - unsigned char unknownMask59E[5]; - unsigned char unknown5CA[16]; - unsigned char unknownMask5C1[28]; + unsigned char unknownMask5C4[5]; + unsigned char unknown5C9[20]; + unsigned char unknownMask5DD[28]; unsigned char unknown_03411; - unsigned int unknownDword5E0; + unsigned char unknown_034111; unsigned short pvpFrontlineWeekly1st; unsigned short pvpFrontlineWeekly2nd; unsigned short pvpFrontlineWeekly3rd; @@ -721,13 +717,14 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned short unknown_XXX; unsigned char unknown61E[48]; unsigned char tripleTriadCards[29]; - unsigned char unknown61F[25]; - unsigned char unknownMask67C[22]; - unsigned char unknown692[3]; + unsigned char unknownMask68C[11]; + unsigned char unknown67E[25]; unsigned char orchestrionMask[40]; + unsigned char unknownMask6BF[11]; + unsigned char unknown692[3]; unsigned char hallOfNoviceCompleteMask[3]; unsigned char unknownMask6C0[11]; - unsigned char unknownMask6CB[16]; + unsigned char unknownMask6DB[16]; unsigned char unknown6DB[14]; unsigned char unlockedRaids[28]; unsigned char unlockedDungeons[18]; From b15cd4948a35c7999207053ff24ae74a5e0074b0 Mon Sep 17 00:00:00 2001 From: Maru Date: Sat, 14 Jul 2018 19:32:50 -0300 Subject: [PATCH 116/199] InitUI pose def + set val; --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 4 +++- src/servers/sapphire_zone/Actor/Player.cpp | 1 + .../sapphire_zone/Network/PacketWrappers/InitUIPacket.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 38dbac83..7dc55ed3 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -704,7 +704,9 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unknown5A9[5]; unsigned char unknown5AE[11]; unsigned char beastRank[11]; - unsigned char unknownMask5C4[5]; + unsigned char pose; + unsigned char weaponPose; + unsigned char unknownMask5C4[3]; unsigned char unknown5C9[20]; unsigned char unknownMask5DD[28]; unsigned char unknown_03411; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index adf894a2..9d86cc43 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -68,6 +68,7 @@ Core::Entity::Player::Player() : m_markedForRemoval( false ), m_mount( 0 ), m_emoteMode( 0 ), + m_pose( 0 ), m_directorInitialized( false ), m_onEnterEventDone( false ) { diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/InitUIPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/InitUIPacket.h index 14ac8bf2..14650c55 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/InitUIPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/InitUIPacket.h @@ -47,6 +47,7 @@ private: //m_data.gcRank = GCRank::None; m_data.homepoint = player.getHomepoint(); + m_data.pose = player.getPose(); memset( &m_data.name[0], 0, sizeof( m_data.name ) ); From 87f9610d208b96d48198f522ffbd8dbfbfa5599b Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 15 Jul 2018 23:58:18 +0200 Subject: [PATCH 117/199] Yet again more InitUI --- .../Network/PacketDef/Zone/ServerZoneDef.h | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 7dc55ed3..58aad6ec 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -620,19 +620,19 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned int unknown1C; unsigned int fishCaught; unsigned int useBaitCatalogId; - unsigned int pvpWolfFoldMatches; - unsigned short pvpWolfFoldWeeklyMatches; - unsigned short pvpWolfFoldWeeklyVictories; - unsigned short pvpStats[6]; + unsigned int unknown28; + unsigned short unknown2C; + unsigned short unknown3; + unsigned int unknown30; + unsigned int unknownTimestamp34; + unsigned int unknownTimestamp38; unsigned int unknown3C; - unsigned char frontlineCampaigns[4]; - unsigned short frontlineCampaignsWeekly; - unsigned char currentRelic; - unsigned char currentBook; + unsigned int unknown40; + unsigned int unknown44; float companionTimePassed; unsigned int unknown4C; unsigned short unknown50; - unsigned char unknown52[8]; + unsigned short unknown52[4]; unsigned short playerCommendations; unsigned short unknown5C; unsigned short unknown5E; @@ -661,25 +661,23 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char companionFavoFeed; unsigned char unknown89; unsigned char unknown8A[4]; - unsigned char unknown8E[22]; + unsigned char hasRelicBook; + unsigned char relicBookId; + unsigned char unknown8E[20]; unsigned int exp[25]; - unsigned char unknown564[16]; + unsigned int unknown108[4]; unsigned int pvpFrontlineOverall1st; unsigned int pvpFrontlineOverall2nd; unsigned int pvpFrontlineOverall3rd; - unsigned char relicBookCompletion1[4]; + unsigned int unknownTimestamp124; unsigned short levels[25]; unsigned short levelsPadding; unsigned short unknown15C[8]; unsigned short fishingRecordsFish[26]; unsigned short fishingRecordsFishWeight[26]; unsigned short beastExp[11]; - unsigned short unknown1EA; - unsigned short unknown1EC; - unsigned short unknown1EE; - unsigned short unknown1F0; - unsigned short unknown1F2; - unsigned char unknownMask1F8[12]; + unsigned short unknown1EA[5]; + unsigned char unknownMask1F4[12]; unsigned char companion_name[21]; unsigned char companionDefRank; unsigned char companionAttRank; @@ -709,21 +707,15 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unknownMask5C4[3]; unsigned char unknown5C9[20]; unsigned char unknownMask5DD[28]; - unsigned char unknown_03411; - unsigned char unknown_034111; - unsigned short pvpFrontlineWeekly1st; - unsigned short pvpFrontlineWeekly2nd; - unsigned short pvpFrontlineWeekly3rd; - unsigned char relicBookCompletion2[8]; + unsigned char relicCompletion[12]; unsigned char sightseeingMask[26]; - unsigned short unknown_XXX; - unsigned char unknown61E[48]; + unsigned char huntingMarkMask[55]; unsigned char tripleTriadCards[29]; - unsigned char unknownMask68C[11]; + unsigned char unknownMask673[11]; unsigned char unknown67E[25]; unsigned char orchestrionMask[40]; - unsigned char unknownMask6BF[11]; - unsigned char unknown692[3]; + unsigned char unknown6BF[3]; + unsigned char unknownMask6C2[11]; unsigned char hallOfNoviceCompleteMask[3]; unsigned char unknownMask6C0[11]; unsigned char unknownMask6DB[16]; From 9aeba7a0b3304ca291aebb170f821caac628a1e8 Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Sun, 15 Jul 2018 23:59:15 +0200 Subject: [PATCH 118/199] init housing setup --- src/common/Network/PacketDef/Ipcs.h | 4 + .../Network/PacketDef/Zone/ServerZoneDef.h | 52 ++++++++++ src/servers/sapphire_zone/Forwards.h | 1 + .../sapphire_zone/Zone/HousingZone.cpp | 94 +++++++++++++++++++ src/servers/sapphire_zone/Zone/HousingZone.h | 30 ++++++ .../sapphire_zone/Zone/TerritoryMgr.cpp | 58 ++++++++++++ src/servers/sapphire_zone/Zone/TerritoryMgr.h | 5 + 7 files changed, 244 insertions(+) create mode 100644 src/servers/sapphire_zone/Zone/HousingZone.cpp create mode 100644 src/servers/sapphire_zone/Zone/HousingZone.h diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index deaea6a2..d8010c37 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -169,6 +169,10 @@ namespace Packets { EquipDisplayFlags = 0x0210, // updated 4.3 + WardInfo = 0x0224, // updated 4.3 + WardHousingPermission = 0x022D, // updated 4.3 + WardYardInfo = 0x022F, // updated 4.3 + DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui PerformNote = 0x0286, // updated 4.3 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 7dc55ed3..bc707e46 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1306,6 +1306,58 @@ struct FFXIVIpcPerformNote : FFXIVIpcBasePacket uint8_t data[32]; }; +struct FFXIVIpcWardInfo : FFXIVIpcBasePacket +{ + uint16_t pad0; + uint16_t wardNum; // set 1 for "Mist, Ward 2" + uint16_t zoneId; + uint16_t worldId; + uint8_t pad1; + uint8_t SubInstance; // (default : 1/2) + uint8_t pad3; + uint8_t pad4; + uint8_t pad5; + uint8_t pad6; + uint8_t pad7; + uint8_t pad8; + struct { + uint8_t HouseSize; //1 = small, 2 = middle, 3 = big; 1 + uint8_t HouseState; //1 = for sell, 2 = sold, 3 = hasOwner, 0x0A = House sharing; 2 + uint8_t iconColor; //HouseState has to be 3; 1 = Private, 2 = FC House; 4 + uint8_t iconIconAdd; //Heart Icon = 2; 6 + uint32_t pad9; //can be 0 (default) maybe fcId; 8 + uint32_t fcIcon; //can be 0 (default); 12 + uint32_t fcIconColor; //can be 0 (default); 16 + uint16_t houseRoofId; //18 + uint16_t houseFacadeId;//20 + uint16_t houseWindowId;//22 + uint16_t houseDoorId;//24 + uint8_t gardenData[4];//28 + uint16_t gardenSignId; //For fcIcon; 30 + uint16_t gardenFenceId; //32 + uint8_t color[8]; //40 + } landSet[30]; +}; + +struct FFXIVIpcWardYardInfo : FFXIVIpcBasePacket +{ + /* consistency check? */ + uint32_t pad1; //always 0xFFFFFFFF + uint32_t pad2; //always 0xFFFFFFFF + uint8_t pad3; //always 0xFF + /* --- */ + uint8_t packetNum; + uint16_t packetTotal; + struct + { + uint32_t itemId; + uint16_t itemRotation; + uint16_t pos_1; + uint16_t pos_2; + uint16_t pos_3; + } object[100]; +}; + struct FFXIVIpcMSQTrackerProgress : FFXIVIpcBasePacket { uint32_t id; diff --git a/src/servers/sapphire_zone/Forwards.h b/src/servers/sapphire_zone/Forwards.h index 6335aeb7..b81d6dee 100644 --- a/src/servers/sapphire_zone/Forwards.h +++ b/src/servers/sapphire_zone/Forwards.h @@ -20,6 +20,7 @@ namespace Core { TYPE_FORWARD( Cell ); TYPE_FORWARD( Zone ); + TYPE_FORWARD( HousingZone ); TYPE_FORWARD( InstanceContent ); TYPE_FORWARD( Item ); TYPE_FORWARD( ItemContainer ); diff --git a/src/servers/sapphire_zone/Zone/HousingZone.cpp b/src/servers/sapphire_zone/Zone/HousingZone.cpp new file mode 100644 index 00000000..72dbd57e --- /dev/null +++ b/src/servers/sapphire_zone/Zone/HousingZone.cpp @@ -0,0 +1,94 @@ +#include +#include +#include +#include + +#include +#include + +#include "Actor/Player.h" + +#include "Forwards.h" +#include "HousingZone.h" +#include "Framework.h" + +extern Core::Framework g_fw; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::HousingZone::HousingZone(uint8_t wardNum, + uint16_t territoryId, + uint32_t guId, + const std::string& internalName, + const std::string& contentName) + : Zone(territoryId, guId, internalName, contentName), + m_wardNum( wardNum ) +{ + +} + +bool Core::HousingZone::init() +{ + uint32_t LandSetId; + + for ( LandSetId = 0; LandSetId < 60; LandSetId++ ) + { + //TODO: load house information here + } + + return true; +} + +Core::HousingZone::~HousingZone() +{ + +} + +void Core::HousingZone::onPlayerZoneIn(Entity::Player& player) +{ + auto pLog = g_fw.get< Logger >(); + pLog->debug( "HousingZone::onPlayerZoneIn: Zone#" + std::to_string(getGuId()) + "|" + + + ", Entity#" + std::to_string( player.getId() ) ); + + uint32_t landSetId; + uint32_t yardPacketNum; + + auto wardInfoPackage = makeZonePacket< FFXIVIpcWardInfo >( player.getId() ); + auto wardYardInfoPackage = makeZonePacket< FFXIVIpcWardYardInfo >(player.getId()); + + wardInfoPackage->data().wardNum = m_wardNum; + wardInfoPackage->data().zoneId = player.getZoneId(); + //TODO: get current WorldId + wardInfoPackage->data().worldId = 67; + //TODO: handle Subdivision + wardInfoPackage->data().SubInstance = 1; + + for (landSetId = 0; landSetId < 30 ; landSetId++) + { + wardInfoPackage->data().landSet[landSetId].HouseSize = 1; + wardInfoPackage->data().landSet[landSetId].HouseState = 1; + } + + wardYardInfoPackage->data().pad1 = 0xFFFFFFFF; + wardYardInfoPackage->data().pad2 = 0xFFFFFFFF; + wardYardInfoPackage->data().pad3 = 0xFF; + wardYardInfoPackage->data().packetTotal = 8; + + player.queuePacket( wardInfoPackage ); + + for (yardPacketNum = 0; yardPacketNum < wardYardInfoPackage->data().packetTotal; yardPacketNum++) + { + //Add Objects here + wardYardInfoPackage->data().packetNum = yardPacketNum; + + player.queuePacket( wardYardInfoPackage ); + } + +} + +uint8_t Core::HousingZone::getWardNum() const +{ + return m_wardNum; +} diff --git a/src/servers/sapphire_zone/Zone/HousingZone.h b/src/servers/sapphire_zone/Zone/HousingZone.h new file mode 100644 index 00000000..feae3534 --- /dev/null +++ b/src/servers/sapphire_zone/Zone/HousingZone.h @@ -0,0 +1,30 @@ +#ifndef SAPPHIRE_HOUSINGZONE_H +#define SAPPHIRE_HOUSINGZONE_H + +#include "Zone.h" +#include "Forwards.h" + +namespace Core +{ + class HousingZone : public Zone + { + public: + HousingZone( uint8_t wardNum, + uint16_t territoryId, + uint32_t guId, + const std::string& internalName, + const std::string& contentName ); + virtual ~HousingZone(); + + bool init() override; + void onPlayerZoneIn(Entity::Player& player) override; + + /* returns current ward number for this zone */ + uint8_t getWardNum() const; + private: + uint8_t m_wardNum; + + }; + +} +#endif //SAPPHIRE_HOUSINGZONE_H diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 6ec35837..4b767fb1 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -7,6 +7,7 @@ #include "Actor/Player.h" #include "Zone.h" +#include "HousingZone.h" #include "ZonePosition.h" #include "InstanceContent.h" #include "TerritoryMgr.h" @@ -45,6 +46,7 @@ bool Core::TerritoryMgr::init() loadTerritoryPositionMap(); createDefaultTerritories(); + createHosuingTerritories(); return true; } @@ -140,6 +142,52 @@ bool Core::TerritoryMgr::createDefaultTerritories() return true; } +bool Core::TerritoryMgr::createHosuingTerritories() +{ + //separate housing zones from default + auto pExdData = g_fw.get< Data::ExdDataGenerated >(); + auto pLog = g_fw.get< Logger >(); + for ( const auto& territory : m_territoryTypeDetailCacheMap ) + { + auto territoryId = territory.first; + auto territoryInfo = territory.second; + uint32_t wardNum; + + if ( territoryInfo->name.empty() ) + continue; + + auto pPlaceName = pExdData->get< Core::Data::PlaceName >( territoryInfo->placeName ); + + if (!pPlaceName || pPlaceName->name.empty() || !isHousingTerritory( territoryId ) ) + continue; + + for ( wardNum = 0; wardNum < 18; wardNum++ ) + { + + uint32_t guid = getNextInstanceId(); + pLog->info(std::to_string( territoryId ) + + "\t" + std::to_string( guid ) + + "\t" + std::to_string( territoryInfo->territoryIntendedUse ) + + "\t" + ( territoryInfo->name.length() <= 4 ? territoryInfo->name + "\t" : territoryInfo->name ) + + "\t" + "HOUSING" + + "\t" + pPlaceName->name + + "#" + std::to_string( wardNum ) ); + + auto pHousingZone = make_HousingZone( wardNum, territoryId, guid, territoryInfo->name, pPlaceName->name ); + pHousingZone->init(); + + InstanceIdToZonePtrMap instanceMap; + instanceMap[guid] = pHousingZone; + m_instanceIdToZonePtrMap[guid] = pHousingZone; + m_territoryIdToInstanceGuidMap[territoryId][guid] = pHousingZone; + m_zoneSet.insert( { pHousingZone } ); + } + + } + + return true; +} + Core::ZonePtr Core::TerritoryMgr::createTerritoryInstance( uint32_t territoryTypeId ) { if( !isValidTerritory( territoryTypeId ) ) @@ -264,6 +312,16 @@ bool Core::TerritoryMgr::isDefaultTerritory( uint32_t territoryTypeId ) const } +bool Core::TerritoryMgr::isHousingTerritory(uint32_t territoryTypeId) const +{ + auto pTeri = getTerritoryDetail( territoryTypeId ); + + if (!pTeri) + return false; + + return pTeri->territoryIntendedUse == TerritoryIntendedUse::HousingArea; +} + Core::ZonePositionPtr Core::TerritoryMgr::getTerritoryPosition( uint32_t territoryPositionId ) const { auto it = m_territoryPositionMap.find( territoryPositionId ); diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index 32d5532d..228b3517 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -66,6 +66,8 @@ namespace Core bool createDefaultTerritories(); + bool createHosuingTerritories(); + /*! caches TerritoryType details into m_territoryTypeMap */ void loadTerritoryTypeDetailCache(); @@ -88,6 +90,9 @@ namespace Core /*! returns true if the territoryType is a default non-instanced zone */ bool isDefaultTerritory( uint32_t territoryTypeId ) const; + /*! returns true if the territoryType is a housing zone */ + bool isHousingTerritory(uint32_t territoryTypeId) const; + /*! creates a new instance for a given territoryTypeId */ ZonePtr createTerritoryInstance( uint32_t territoryTypeId ); From d31a33732cd39a8777e67a592c3317a37499eb5c Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Mon, 16 Jul 2018 11:58:25 +0200 Subject: [PATCH 119/199] fixed style --- .../Network/PacketDef/Zone/ServerZoneDef.h | 38 +++++++++---------- .../sapphire_zone/Zone/HousingZone.cpp | 38 +++++++++---------- src/servers/sapphire_zone/Zone/HousingZone.h | 17 ++++----- .../sapphire_zone/Zone/TerritoryMgr.cpp | 11 +++--- src/servers/sapphire_zone/Zone/TerritoryMgr.h | 6 +-- 5 files changed, 54 insertions(+), 56 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index bc707e46..5a8091bf 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1308,24 +1308,24 @@ struct FFXIVIpcPerformNote : FFXIVIpcBasePacket struct FFXIVIpcWardInfo : FFXIVIpcBasePacket { - uint16_t pad0; + uint16_t unknown0; uint16_t wardNum; // set 1 for "Mist, Ward 2" uint16_t zoneId; uint16_t worldId; - uint8_t pad1; - uint8_t SubInstance; // (default : 1/2) - uint8_t pad3; - uint8_t pad4; - uint8_t pad5; - uint8_t pad6; - uint8_t pad7; - uint8_t pad8; + uint8_t unknown1; + uint8_t subInstance; // (default : 1/2) + uint8_t unknown3; + uint8_t unknown4; + uint8_t unknown5; + uint8_t unknown6; + uint8_t unknown7; + uint8_t unknown8; struct { - uint8_t HouseSize; //1 = small, 2 = middle, 3 = big; 1 - uint8_t HouseState; //1 = for sell, 2 = sold, 3 = hasOwner, 0x0A = House sharing; 2 + uint8_t houseSize; //1 = small, 2 = middle, 3 = big; 1 + uint8_t houseState; //1 = for sell, 2 = sold, 3 = hasOwner, 0x0A = House sharing; 2 uint8_t iconColor; //HouseState has to be 3; 1 = Private, 2 = FC House; 4 - uint8_t iconIconAdd; //Heart Icon = 2; 6 - uint32_t pad9; //can be 0 (default) maybe fcId; 8 + uint8_t iconAddIcon; //Heart Icon = 2; 6 + uint32_t unknown9; //can be 0 (default) maybe fcId; 8 uint32_t fcIcon; //can be 0 (default); 12 uint32_t fcIconColor; //can be 0 (default); 16 uint16_t houseRoofId; //18 @@ -1342,9 +1342,9 @@ struct FFXIVIpcWardInfo : FFXIVIpcBasePacket struct FFXIVIpcWardYardInfo : FFXIVIpcBasePacket { /* consistency check? */ - uint32_t pad1; //always 0xFFFFFFFF - uint32_t pad2; //always 0xFFFFFFFF - uint8_t pad3; //always 0xFF + uint32_t unknown1; //always 0xFFFFFFFF + uint32_t unknown2; //always 0xFFFFFFFF + uint8_t unknown3; //always 0xFF /* --- */ uint8_t packetNum; uint16_t packetTotal; @@ -1352,9 +1352,9 @@ struct FFXIVIpcWardYardInfo : FFXIVIpcBasePacket { uint32_t itemId; uint16_t itemRotation; - uint16_t pos_1; - uint16_t pos_2; - uint16_t pos_3; + uint16_t pos_x; + uint16_t pos_y; + uint16_t pos_z; } object[100]; }; diff --git a/src/servers/sapphire_zone/Zone/HousingZone.cpp b/src/servers/sapphire_zone/Zone/HousingZone.cpp index 72dbd57e..840eba66 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.cpp +++ b/src/servers/sapphire_zone/Zone/HousingZone.cpp @@ -18,22 +18,22 @@ using namespace Core::Common; using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; -Core::HousingZone::HousingZone(uint8_t wardNum, - uint16_t territoryId, - uint32_t guId, - const std::string& internalName, - const std::string& contentName) - : Zone(territoryId, guId, internalName, contentName), - m_wardNum( wardNum ) +Core::HousingZone::HousingZone( uint8_t wardNum, + uint16_t territoryId, + uint32_t guId, + const std::string& internalName, + const std::string& contentName ) + : Zone( territoryId, guId, internalName, contentName ), + m_wardNum( wardNum ) { } bool Core::HousingZone::init() { - uint32_t LandSetId; + uint32_t landSetId; - for ( LandSetId = 0; LandSetId < 60; LandSetId++ ) + for( landSetId = 0; landSetId < 60; landSetId++ ) { //TODO: load house information here } @@ -46,7 +46,7 @@ Core::HousingZone::~HousingZone() } -void Core::HousingZone::onPlayerZoneIn(Entity::Player& player) +void Core::HousingZone::onPlayerZoneIn( Entity::Player& player ) { auto pLog = g_fw.get< Logger >(); pLog->debug( "HousingZone::onPlayerZoneIn: Zone#" + std::to_string(getGuId()) + "|" + @@ -56,29 +56,29 @@ void Core::HousingZone::onPlayerZoneIn(Entity::Player& player) uint32_t yardPacketNum; auto wardInfoPackage = makeZonePacket< FFXIVIpcWardInfo >( player.getId() ); - auto wardYardInfoPackage = makeZonePacket< FFXIVIpcWardYardInfo >(player.getId()); + auto wardYardInfoPackage = makeZonePacket< FFXIVIpcWardYardInfo >( player.getId() ); wardInfoPackage->data().wardNum = m_wardNum; wardInfoPackage->data().zoneId = player.getZoneId(); //TODO: get current WorldId wardInfoPackage->data().worldId = 67; //TODO: handle Subdivision - wardInfoPackage->data().SubInstance = 1; + wardInfoPackage->data().subInstance = 1; - for (landSetId = 0; landSetId < 30 ; landSetId++) + for( landSetId = 0; landSetId < 30 ; landSetId++ ) { - wardInfoPackage->data().landSet[landSetId].HouseSize = 1; - wardInfoPackage->data().landSet[landSetId].HouseState = 1; + wardInfoPackage->data().landSet[landSetId].houseSize = 1; + wardInfoPackage->data().landSet[landSetId].houseState = 1; } - wardYardInfoPackage->data().pad1 = 0xFFFFFFFF; - wardYardInfoPackage->data().pad2 = 0xFFFFFFFF; - wardYardInfoPackage->data().pad3 = 0xFF; + wardYardInfoPackage->data().unknown1 = 0xFFFFFFFF; + wardYardInfoPackage->data().unknown2 = 0xFFFFFFFF; + wardYardInfoPackage->data().unknown3 = 0xFF; wardYardInfoPackage->data().packetTotal = 8; player.queuePacket( wardInfoPackage ); - for (yardPacketNum = 0; yardPacketNum < wardYardInfoPackage->data().packetTotal; yardPacketNum++) + for( yardPacketNum = 0; yardPacketNum < wardYardInfoPackage->data().packetTotal; yardPacketNum++ ) { //Add Objects here wardYardInfoPackage->data().packetNum = yardPacketNum; diff --git a/src/servers/sapphire_zone/Zone/HousingZone.h b/src/servers/sapphire_zone/Zone/HousingZone.h index feae3534..2158b356 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.h +++ b/src/servers/sapphire_zone/Zone/HousingZone.h @@ -6,24 +6,23 @@ namespace Core { - class HousingZone : public Zone +class HousingZone : public Zone { public: HousingZone( uint8_t wardNum, - uint16_t territoryId, - uint32_t guId, - const std::string& internalName, - const std::string& contentName ); + uint16_t territoryId, + uint32_t guId, + const std::string& internalName, + const std::string& contentName ); virtual ~HousingZone(); bool init() override; void onPlayerZoneIn(Entity::Player& player) override; - /* returns current ward number for this zone */ - uint8_t getWardNum() const; + /* returns current ward number for this zone */ + uint8_t getWardNum() const; private: - uint8_t m_wardNum; - + uint8_t m_wardNum; }; } diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 4b767fb1..7db6484d 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -147,25 +147,24 @@ bool Core::TerritoryMgr::createHosuingTerritories() //separate housing zones from default auto pExdData = g_fw.get< Data::ExdDataGenerated >(); auto pLog = g_fw.get< Logger >(); - for ( const auto& territory : m_territoryTypeDetailCacheMap ) + for( const auto& territory : m_territoryTypeDetailCacheMap ) { auto territoryId = territory.first; auto territoryInfo = territory.second; uint32_t wardNum; - if ( territoryInfo->name.empty() ) + if( territoryInfo->name.empty() ) continue; auto pPlaceName = pExdData->get< Core::Data::PlaceName >( territoryInfo->placeName ); - if (!pPlaceName || pPlaceName->name.empty() || !isHousingTerritory( territoryId ) ) + if( !pPlaceName || pPlaceName->name.empty() || !isHousingTerritory( territoryId ) ) continue; - for ( wardNum = 0; wardNum < 18; wardNum++ ) + for( wardNum = 0; wardNum < 18; wardNum++ ) { - uint32_t guid = getNextInstanceId(); - pLog->info(std::to_string( territoryId ) + + pLog->info( std::to_string( territoryId ) + "\t" + std::to_string( guid ) + "\t" + std::to_string( territoryInfo->territoryIntendedUse ) + "\t" + ( territoryInfo->name.length() <= 4 ? territoryInfo->name + "\t" : territoryInfo->name ) + diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index 228b3517..49961953 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -66,7 +66,7 @@ namespace Core bool createDefaultTerritories(); - bool createHosuingTerritories(); + bool createHosuingTerritories(); /*! caches TerritoryType details into m_territoryTypeMap */ void loadTerritoryTypeDetailCache(); @@ -90,8 +90,8 @@ namespace Core /*! returns true if the territoryType is a default non-instanced zone */ bool isDefaultTerritory( uint32_t territoryTypeId ) const; - /*! returns true if the territoryType is a housing zone */ - bool isHousingTerritory(uint32_t territoryTypeId) const; + /*! returns true if the territoryType is a housing zone */ + bool isHousingTerritory(uint32_t territoryTypeId) const; /*! creates a new instance for a given territoryTypeId */ ZonePtr createTerritoryInstance( uint32_t territoryTypeId ); From 627a816f6e1f14c4a6f2bc48f4198de16e24133e Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Mon, 16 Jul 2018 12:05:51 +0200 Subject: [PATCH 120/199] fixed style #2 --- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 7db6484d..ab0939ad 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -315,7 +315,7 @@ bool Core::TerritoryMgr::isHousingTerritory(uint32_t territoryTypeId) const { auto pTeri = getTerritoryDetail( territoryTypeId ); - if (!pTeri) + if( !pTeri ) return false; return pTeri->territoryIntendedUse == TerritoryIntendedUse::HousingArea; From d5b7520e227431f29957aba9030b82139abe7087 Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Mon, 16 Jul 2018 12:37:04 +0200 Subject: [PATCH 121/199] fixed style #3 --- .../sapphire_zone/Zone/HousingZone.cpp | 43 ++++++++++--------- src/servers/sapphire_zone/Zone/HousingZone.h | 2 +- src/servers/sapphire_zone/Zone/TerritoryMgr.h | 2 +- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/HousingZone.cpp b/src/servers/sapphire_zone/Zone/HousingZone.cpp index 840eba66..db6dc972 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.cpp +++ b/src/servers/sapphire_zone/Zone/HousingZone.cpp @@ -22,8 +22,8 @@ Core::HousingZone::HousingZone( uint8_t wardNum, uint16_t territoryId, uint32_t guId, const std::string& internalName, - const std::string& contentName ) - : Zone( territoryId, guId, internalName, contentName ), + const std::string& contentName ) : + Zone( territoryId, guId, internalName, contentName ), m_wardNum( wardNum ) { @@ -49,41 +49,42 @@ Core::HousingZone::~HousingZone() void Core::HousingZone::onPlayerZoneIn( Entity::Player& player ) { auto pLog = g_fw.get< Logger >(); - pLog->debug( "HousingZone::onPlayerZoneIn: Zone#" + std::to_string(getGuId()) + "|" + + pLog->debug( "HousingZone::onPlayerZoneIn: Zone#" + std::to_string( getGuId() ) + "|" + + ", Entity#" + std::to_string( player.getId() ) ); uint32_t landSetId; uint32_t yardPacketNum; + uint32_t yardPacketTotal = 8; - auto wardInfoPackage = makeZonePacket< FFXIVIpcWardInfo >( player.getId() ); - auto wardYardInfoPackage = makeZonePacket< FFXIVIpcWardYardInfo >( player.getId() ); + auto wardInfoPacket = makeZonePacket< FFXIVIpcWardInfo >( player.getId() ); - wardInfoPackage->data().wardNum = m_wardNum; - wardInfoPackage->data().zoneId = player.getZoneId(); + wardInfoPacket->data().wardNum = m_wardNum; + wardInfoPacket->data().zoneId = player.getZoneId(); //TODO: get current WorldId - wardInfoPackage->data().worldId = 67; + wardInfoPacket->data().worldId = 67; //TODO: handle Subdivision - wardInfoPackage->data().subInstance = 1; + wardInfoPacket->data().subInstance = 1; for( landSetId = 0; landSetId < 30 ; landSetId++ ) { - wardInfoPackage->data().landSet[landSetId].houseSize = 1; - wardInfoPackage->data().landSet[landSetId].houseState = 1; + wardInfoPacket->data().landSet[landSetId].houseSize = 1; + wardInfoPacket->data().landSet[landSetId].houseState = 1; } - wardYardInfoPackage->data().unknown1 = 0xFFFFFFFF; - wardYardInfoPackage->data().unknown2 = 0xFFFFFFFF; - wardYardInfoPackage->data().unknown3 = 0xFF; - wardYardInfoPackage->data().packetTotal = 8; + player.queuePacket( wardInfoPacket ); - player.queuePacket( wardInfoPackage ); - - for( yardPacketNum = 0; yardPacketNum < wardYardInfoPackage->data().packetTotal; yardPacketNum++ ) + for( yardPacketNum = 0; yardPacketNum < yardPacketTotal; yardPacketNum++ ) { - //Add Objects here - wardYardInfoPackage->data().packetNum = yardPacketNum; + auto wardYardInfoPacket = makeZonePacket< FFXIVIpcWardYardInfo >( player.getId() ); + wardYardInfoPacket->data().unknown1 = 0xFFFFFFFF; + wardYardInfoPacket->data().unknown2 = 0xFFFFFFFF; + wardYardInfoPacket->data().unknown3 = 0xFF; + wardYardInfoPacket->data().packetNum = yardPacketNum; + wardYardInfoPacket->data().packetTotal = yardPacketTotal; - player.queuePacket( wardYardInfoPackage ); + //TODO: Add Objects here + + player.queuePacket( wardYardInfoPacket ); } } diff --git a/src/servers/sapphire_zone/Zone/HousingZone.h b/src/servers/sapphire_zone/Zone/HousingZone.h index 2158b356..146ad8e2 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.h +++ b/src/servers/sapphire_zone/Zone/HousingZone.h @@ -17,7 +17,7 @@ class HousingZone : public Zone virtual ~HousingZone(); bool init() override; - void onPlayerZoneIn(Entity::Player& player) override; + void onPlayerZoneIn( Entity::Player& player ) override; /* returns current ward number for this zone */ uint8_t getWardNum() const; diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index 49961953..dc72bc6b 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -91,7 +91,7 @@ namespace Core bool isDefaultTerritory( uint32_t territoryTypeId ) const; /*! returns true if the territoryType is a housing zone */ - bool isHousingTerritory(uint32_t territoryTypeId) const; + bool isHousingTerritory( uint32_t territoryTypeId ) const; /*! creates a new instance for a given territoryTypeId */ ZonePtr createTerritoryInstance( uint32_t territoryTypeId ); From e4aeaaae8b3000b563085322a33e629b14de9065 Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Mon, 16 Jul 2018 13:54:03 +0200 Subject: [PATCH 122/199] added wardMaxNum --- src/servers/sapphire_zone/Zone/HousingZone.h | 2 ++ src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Zone/HousingZone.h b/src/servers/sapphire_zone/Zone/HousingZone.h index 146ad8e2..428c50c9 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.h +++ b/src/servers/sapphire_zone/Zone/HousingZone.h @@ -21,6 +21,8 @@ class HousingZone : public Zone /* returns current ward number for this zone */ uint8_t getWardNum() const; + + const uint32_t m_wardMaxNum = 18; private: uint8_t m_wardNum; }; diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index ab0939ad..8de3479e 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -152,6 +152,7 @@ bool Core::TerritoryMgr::createHosuingTerritories() auto territoryId = territory.first; auto territoryInfo = territory.second; uint32_t wardNum; + uint32_t wardMaxNum = 1; if( territoryInfo->name.empty() ) continue; @@ -161,7 +162,7 @@ bool Core::TerritoryMgr::createHosuingTerritories() if( !pPlaceName || pPlaceName->name.empty() || !isHousingTerritory( territoryId ) ) continue; - for( wardNum = 0; wardNum < 18; wardNum++ ) + for( wardNum = 0; wardNum < wardMaxNum; wardNum++ ) { uint32_t guid = getNextInstanceId(); pLog->info( std::to_string( territoryId ) + @@ -174,6 +175,7 @@ bool Core::TerritoryMgr::createHosuingTerritories() auto pHousingZone = make_HousingZone( wardNum, territoryId, guid, territoryInfo->name, pPlaceName->name ); pHousingZone->init(); + wardMaxNum = pHousingZone->m_wardMaxNum; InstanceIdToZonePtrMap instanceMap; instanceMap[guid] = pHousingZone; From 500b194762cfc7fa5b0cbb891d4a2fcd167646c8 Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Mon, 16 Jul 2018 16:13:39 +0200 Subject: [PATCH 123/199] fixed style #4 --- CMakeSettings.json | 1 - src/servers/sapphire_zone/Zone/HousingZone.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index 90e895cd..dbd0d067 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -18,7 +18,6 @@ { "name": "x86-Release", "generator": "Visual Studio 14 2015", - "configurationType": "Release", "buildRoot": "${env.USERPROFILE}\\CMakeBuild\\${workspaceHash}\\build\\${name}", "cmakeCommandArgs": "", "buildCommandArgs": "-m -v:minimal", diff --git a/src/servers/sapphire_zone/Zone/HousingZone.h b/src/servers/sapphire_zone/Zone/HousingZone.h index 428c50c9..9eef143a 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.h +++ b/src/servers/sapphire_zone/Zone/HousingZone.h @@ -21,8 +21,8 @@ class HousingZone : public Zone /* returns current ward number for this zone */ uint8_t getWardNum() const; - const uint32_t m_wardMaxNum = 18; + private: uint8_t m_wardNum; }; From 2054a87cf756a4311bc2def2798cd70852ce7037 Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Mon, 16 Jul 2018 16:21:01 +0200 Subject: [PATCH 124/199] Revert "fixed style #4" This reverts commit 500b194762cfc7fa5b0cbb891d4a2fcd167646c8. --- CMakeSettings.json | 1 + src/servers/sapphire_zone/Zone/HousingZone.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index dbd0d067..90e895cd 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -18,6 +18,7 @@ { "name": "x86-Release", "generator": "Visual Studio 14 2015", + "configurationType": "Release", "buildRoot": "${env.USERPROFILE}\\CMakeBuild\\${workspaceHash}\\build\\${name}", "cmakeCommandArgs": "", "buildCommandArgs": "-m -v:minimal", diff --git a/src/servers/sapphire_zone/Zone/HousingZone.h b/src/servers/sapphire_zone/Zone/HousingZone.h index 9eef143a..428c50c9 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.h +++ b/src/servers/sapphire_zone/Zone/HousingZone.h @@ -21,8 +21,8 @@ class HousingZone : public Zone /* returns current ward number for this zone */ uint8_t getWardNum() const; - const uint32_t m_wardMaxNum = 18; + const uint32_t m_wardMaxNum = 18; private: uint8_t m_wardNum; }; From 28d6c8fe61f1deea5d4b12f44448d0af36f3c7f0 Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Mon, 16 Jul 2018 17:51:17 +0200 Subject: [PATCH 125/199] removed hosuing - created housing --- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 2 +- src/servers/sapphire_zone/Zone/TerritoryMgr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 8de3479e..1269bcca 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -142,7 +142,7 @@ bool Core::TerritoryMgr::createDefaultTerritories() return true; } -bool Core::TerritoryMgr::createHosuingTerritories() +bool Core::TerritoryMgr::createHousingTerritories() { //separate housing zones from default auto pExdData = g_fw.get< Data::ExdDataGenerated >(); diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index dc72bc6b..adafa145 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -66,7 +66,7 @@ namespace Core bool createDefaultTerritories(); - bool createHosuingTerritories(); + bool createHousingTerritories(); /*! caches TerritoryType details into m_territoryTypeMap */ void loadTerritoryTypeDetailCache(); From 3158df44a73f186d71ef613606f8588a510676a0 Mon Sep 17 00:00:00 2001 From: AriAvery <41122212+AriAvery@users.noreply.github.com> Date: Mon, 16 Jul 2018 17:58:42 +0200 Subject: [PATCH 126/199] less hosuing --- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 1269bcca..a24033fa 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -46,7 +46,7 @@ bool Core::TerritoryMgr::init() loadTerritoryPositionMap(); createDefaultTerritories(); - createHosuingTerritories(); + createHousingTerritories(); return true; } From 34aa349d1108a1c3295acb2c0c9fe2eae4c9775e Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 16 Jul 2018 18:48:25 +0200 Subject: [PATCH 127/199] More InitUI fixing --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index d213cd28..d58c36bd 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -663,7 +663,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unknown8A[4]; unsigned char hasRelicBook; unsigned char relicBookId; - unsigned char unknown8E[20]; + unsigned char unknown90[20]; unsigned int exp[25]; unsigned int unknown108[4]; unsigned int pvpFrontlineOverall1st; @@ -693,7 +693,10 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char minions[38]; unsigned char chocoboTaxiMask[8]; unsigned char contentClearMask[111]; - unsigned char companion_fields[12]; + unsigned char companionBardingMask[9]; + unsigned char companionEquippedHead; + unsigned char companionEquippedBody; + unsigned char companionEquippedLegs; unsigned char unknown519[4]; unsigned char unknownMask51D[11]; unsigned char fishingGuideMask[89]; @@ -705,7 +708,9 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char pose; unsigned char weaponPose; unsigned char unknownMask5C4[3]; - unsigned char unknown5C9[20]; + unsigned char unknown5C9[2]; + unsigned char challengeLogComplete[9]; + unsigned char unknown5CB[9]; unsigned char unknownMask5DD[28]; unsigned char relicCompletion[12]; unsigned char sightseeingMask[26]; @@ -727,8 +732,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unlockedPvp[5]; unsigned char unknownMask72D[28]; unsigned char companionBardingMask[9]; - unsigned char companionEquippedHead; - unsigned char companionEquippedBody; + unsigned char unknown764[14]; }; From 441332fbc951dbbbdeb81fbc38501326b6a4f718 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 16 Jul 2018 18:50:04 +0200 Subject: [PATCH 128/199] Erm, that did not happen --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index d58c36bd..e55af20b 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -731,8 +731,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unlockedTrials[7]; unsigned char unlockedPvp[5]; unsigned char unknownMask72D[28]; - unsigned char companionBardingMask[9]; - unsigned char unknown764[14]; + unsigned char unknown764[23]; }; From 629369b5d5583dce76c5596677f7eb2c8672b10a Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 17 Jul 2018 00:36:10 +0200 Subject: [PATCH 129/199] Another chunk of initui data mapped --- .../Network/PacketDef/Zone/ServerZoneDef.h | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index e55af20b..2c3b5a20 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -623,7 +623,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned int unknown28; unsigned short unknown2C; unsigned short unknown3; - unsigned int unknown30; + unsigned int pvpFrontlineOverallCampaigns; unsigned int unknownTimestamp34; unsigned int unknownTimestamp38; unsigned int unknown3C; @@ -636,7 +636,9 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned short playerCommendations; unsigned short unknown5C; unsigned short unknown5E; - unsigned short unknown60[9]; + unsigned short pvpFrontlineWeeklyCampaigns; + unsigned short enhancedAnimaGlassProgress; + unsigned short unknown64[7]; unsigned short unknown72; unsigned char maxLevel; unsigned char expansion; @@ -663,21 +665,23 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unknown8A[4]; unsigned char hasRelicBook; unsigned char relicBookId; - unsigned char unknown90[20]; + unsigned char unknown90[4]; + unsigned char craftingMasterMask; + unsigned char unknown95[10]; + unsigned char unknown9F[2]; + unsigned char unknownA1[3]; unsigned int exp[25]; unsigned int unknown108[4]; - unsigned int pvpFrontlineOverall1st; - unsigned int pvpFrontlineOverall2nd; - unsigned int pvpFrontlineOverall3rd; - unsigned int unknownTimestamp124; + unsigned int pvpFrontlineOverallRanks[3]; + unsigned int exploratoryMissionNextTimestamp; unsigned short levels[25]; - unsigned short levelsPadding; - unsigned short unknown15C[8]; + unsigned short unknown15C[9]; unsigned short fishingRecordsFish[26]; unsigned short fishingRecordsFishWeight[26]; unsigned short beastExp[11]; unsigned short unknown1EA[5]; - unsigned char unknownMask1F4[12]; + unsigned short pvpFrontlineWeeklyRanks[3]; + unsigned short unknownMask1FA[3]; unsigned char companion_name[21]; unsigned char companionDefRank; unsigned char companionAttRank; @@ -703,35 +707,37 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char fishingSpotVisited[25]; unsigned char unknown59A[15]; unsigned char unknown5A9[5]; - unsigned char unknown5AE[11]; unsigned char beastRank[11]; + unsigned char unknown5B9[11]; unsigned char pose; unsigned char weaponPose; unsigned char unknownMask5C4[3]; unsigned char unknown5C9[2]; unsigned char challengeLogComplete[9]; - unsigned char unknown5CB[9]; + unsigned char unknown5D4[9]; unsigned char unknownMask5DD[28]; unsigned char relicCompletion[12]; unsigned char sightseeingMask[26]; unsigned char huntingMarkMask[55]; unsigned char tripleTriadCards[29]; - unsigned char unknownMask673[11]; - unsigned char unknown67E[25]; + unsigned char unknownMask673[10]; + unsigned char unknown67D; + unsigned char unknown67E[22]; + unsigned char unknown694[3]; unsigned char orchestrionMask[40]; - unsigned char unknown6BF[3]; - unsigned char unknownMask6C2[11]; unsigned char hallOfNoviceCompleteMask[3]; + unsigned char unknownMask6C2[11]; + unsigned char unknown6CD[3]; unsigned char unknownMask6C0[11]; - unsigned char unknownMask6DB[16]; - unsigned char unknown6DB[14]; + unsigned char unknownMask6DB[13]; unsigned char unlockedRaids[28]; unsigned char unlockedDungeons[18]; unsigned char unlockedGuildhests[10]; unsigned char unlockedTrials[7]; unsigned char unlockedPvp[5]; - unsigned char unknownMask72D[28]; - unsigned char unknown764[23]; + unsigned char unknownMask72C[28]; + unsigned char unknownMask748[18]; + unsigned char unknown75A[22]; }; From df44cb9ca1b0a30c41e1a447216c0bdaa330f7d4 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 17 Jul 2018 01:04:59 +0200 Subject: [PATCH 130/199] Added aetherCurrent mapping and classified some pvp fields --- .../Network/PacketDef/Zone/ServerZoneDef.h | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 2c3b5a20..e435ff30 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -621,7 +621,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned int fishCaught; unsigned int useBaitCatalogId; unsigned int unknown28; - unsigned short unknown2C; + unsigned short unknownPvp2C; unsigned short unknown3; unsigned int pvpFrontlineOverallCampaigns; unsigned int unknownTimestamp34; @@ -632,14 +632,15 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket float companionTimePassed; unsigned int unknown4C; unsigned short unknown50; - unsigned short unknown52[4]; + unsigned short unknownPvp52[4]; unsigned short playerCommendations; unsigned short unknown5C; unsigned short unknown5E; unsigned short pvpFrontlineWeeklyCampaigns; unsigned short enhancedAnimaGlassProgress; - unsigned short unknown64[7]; - unsigned short unknown72; + unsigned short unknown64[4]; + unsigned short unknownPvp6A[3]; + unsigned short unknownPvp72; unsigned char maxLevel; unsigned char expansion; unsigned char unknown76; @@ -658,7 +659,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char companionRank; unsigned char companionStars; unsigned char companionSp; - unsigned char companionUnk2B; + unsigned char companionUnk86; unsigned char companionColor; unsigned char companionFavoFeed; unsigned char unknown89; @@ -671,7 +672,9 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unknown9F[2]; unsigned char unknownA1[3]; unsigned int exp[25]; - unsigned int unknown108[4]; + unsigned int unknown108; + unsigned int pvpTotalExp; + unsigned int unknownPvp110[2]; unsigned int pvpFrontlineOverallRanks[3]; unsigned int exploratoryMissionNextTimestamp; unsigned short levels[25]; @@ -682,7 +685,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned short unknown1EA[5]; unsigned short pvpFrontlineWeeklyRanks[3]; unsigned short unknownMask1FA[3]; - unsigned char companion_name[21]; + unsigned char companionName[21]; unsigned char companionDefRank; unsigned char companionAttRank; unsigned char companionHealRank; @@ -706,7 +709,8 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char fishingGuideMask[89]; unsigned char fishingSpotVisited[25]; unsigned char unknown59A[15]; - unsigned char unknown5A9[5]; + unsigned char unknown5A9[2]; + unsigned char unknownPvp5AB[3]; unsigned char beastRank[11]; unsigned char unknown5B9[11]; unsigned char pose; @@ -722,7 +726,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char tripleTriadCards[29]; unsigned char unknownMask673[10]; unsigned char unknown67D; - unsigned char unknown67E[22]; + unsigned char aetherCurrentMask[22]; unsigned char unknown694[3]; unsigned char orchestrionMask[40]; unsigned char hallOfNoviceCompleteMask[3]; From 86fbbd1ae051585c25d39095971e585c73e06f7a Mon Sep 17 00:00:00 2001 From: Mordred <30826167+SapphireMordred@users.noreply.github.com> Date: Tue, 17 Jul 2018 12:11:59 +0200 Subject: [PATCH 131/199] Update ServerZoneDef.h --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index e435ff30..6fba880b 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -739,9 +739,11 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unlockedGuildhests[10]; unsigned char unlockedTrials[7]; unsigned char unlockedPvp[5]; - unsigned char unknownMask72C[28]; - unsigned char unknownMask748[18]; - unsigned char unknown75A[22]; + unsigned char clearedRaids[28]; + unsigned char clearedDungeons[18]; + unsigned char clearedGuildhests[10]; + unsigned char clearedTrials[7]; + unsigned char clearedPvp[5]; }; From ab8ca8feac2214b4f5931e8970bbd88a9487c5ff Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 17 Jul 2018 20:55:05 +1000 Subject: [PATCH 132/199] anima completion & camera mode clienttrigger --- src/common/Network/CommonActorControl.h | 1 + src/common/Network/PacketDef/Zone/ServerZoneDef.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 4749dc2d..6d600ab2 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -241,6 +241,7 @@ namespace Core { AllotAttribute = 0x135, ClearWaymarks = 0x13A, + CameraMode = 0x13B, // param12, 1 = camera mode enable, 0 = disable HuntingLogDetails = 0x194, diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 6fba880b..b919d4a2 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -730,7 +730,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char unknown694[3]; unsigned char orchestrionMask[40]; unsigned char hallOfNoviceCompleteMask[3]; - unsigned char unknownMask6C2[11]; + unsigned char animaCompletion[11]; unsigned char unknown6CD[3]; unsigned char unknownMask6C0[11]; unsigned char unknownMask6DB[13]; From dd0a29d8985c32a31846257d14d781b64ad47d9c Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 17 Jul 2018 21:47:26 +1000 Subject: [PATCH 133/199] inutui :sweat_drops: --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index b919d4a2..b96b80e7 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -699,7 +699,7 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char howto[33]; unsigned char minions[38]; unsigned char chocoboTaxiMask[8]; - unsigned char contentClearMask[111]; + unsigned char watchedCutscenes[111]; unsigned char companionBardingMask[9]; unsigned char companionEquippedHead; unsigned char companionEquippedBody; From 1cf1b8c161a44c86bf192bc2200bebfae7db0403 Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Tue, 17 Jul 2018 13:10:42 +0100 Subject: [PATCH 134/199] added some pvp initui fields --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index b96b80e7..6382bb56 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -638,9 +638,11 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned short unknown5E; unsigned short pvpFrontlineWeeklyCampaigns; unsigned short enhancedAnimaGlassProgress; - unsigned short unknown64[4]; - unsigned short unknownPvp6A[3]; - unsigned short unknownPvp72; + unsigned short unknown64[4]; // needs confirmation, probably pvp total/weeklies + unsigned short pvpRivalWingsTotalMatches; + unsigned short pvpRivalWingsTotalVictories; + unsigned short pvpRivalWingsWeeklyMatches; // needs confirmation + unsigned short pvpRivalWingsWeeklyVictories; // needs confirmation unsigned char maxLevel; unsigned char expansion; unsigned char unknown76; @@ -674,7 +676,8 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned int exp[25]; unsigned int unknown108; unsigned int pvpTotalExp; - unsigned int unknownPvp110[2]; + unsigned int unknownPvp110; + unsigned int pvpExp; unsigned int pvpFrontlineOverallRanks[3]; unsigned int exploratoryMissionNextTimestamp; unsigned short levels[25]; @@ -710,7 +713,8 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket unsigned char fishingSpotVisited[25]; unsigned char unknown59A[15]; unsigned char unknown5A9[2]; - unsigned char unknownPvp5AB[3]; + unsigned char unknownPvp5AB[2]; + unsigned char pvpLevel; unsigned char beastRank[11]; unsigned char unknown5B9[11]; unsigned char pose; From 8ac7191502d7cbd2789da31f0a17c1f4ca20ada6 Mon Sep 17 00:00:00 2001 From: Mordred <30826167+SapphireMordred@users.noreply.github.com> Date: Tue, 17 Jul 2018 16:11:09 +0200 Subject: [PATCH 135/199] Update EventHelper.cpp --- src/servers/sapphire_zone/Event/EventHelper.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Event/EventHelper.cpp b/src/servers/sapphire_zone/Event/EventHelper.cpp index e4e13cdf..63eb538d 100644 --- a/src/servers/sapphire_zone/Event/EventHelper.cpp +++ b/src/servers/sapphire_zone/Event/EventHelper.cpp @@ -81,7 +81,8 @@ std::string Core::Event::getEventName( uint32_t eventId ) std::string name = shopInfo->name; if( shopInfo ) - return "GilShop - " + name; + return name; + return unknown + "GilShop"; } default: { From d96c86853b300cafda61c1307c0efeee73922cd1 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 17 Jul 2018 22:39:04 +0200 Subject: [PATCH 136/199] Changed director trigger/function names --- src/common/Network/CommonActorControl.h | 2 +- .../sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp | 4 ++-- src/servers/sapphire_zone/Zone/InstanceContent.cpp | 2 +- src/servers/sapphire_zone/Zone/InstanceContent.h | 2 +- src/servers/sapphire_zone/Zone/Zone.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 6d600ab2..41f1cb07 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -265,7 +265,7 @@ namespace Core { DirectorInitFinish = 0x321, - SomeDirectorEvent = 0x328, // unsure what exactly triggers it, starts director when returning to instance though + DirectorSync = 0x328, // unsure what exactly triggers it, starts director when returning to instance though EnterTerritoryEventFinished = 0x330, RequestInstanceLeave = 0x333, // df menu button diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index e6a9a32d..bcad5346 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -245,9 +245,9 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR player.getCurrentZone()->onInitDirector( player ); break; } - case ClientTriggerType::SomeDirectorEvent: // Director init finish + case ClientTriggerType::DirectorSync: // Director init finish { - player.getCurrentZone()->onSomeDirectorEvent( player ); + player.getCurrentZone()->onDirectorSync( player ); break; } case ClientTriggerType::EnterTerritoryEventFinished:// this may still be something else. I think i have seen it elsewhere diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index c6c626a8..c920b6b3 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -175,7 +175,7 @@ void Core::InstanceContent::onInitDirector( Entity::Player& player ) player.setDirectorInitialized( true ); } -void Core::InstanceContent::onSomeDirectorEvent( Entity::Player& player ) +void Core::InstanceContent::onDirectorSync( Entity::Player& player ) { player.queuePacket( boost::make_shared< ActorControlPacket143 >( player.getId(), DirectorUpdate, 0x00110001, 0x80000000, 1 ) ); } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index d55fcd82..39c68d4b 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -35,7 +35,7 @@ public: void onLeaveTerritory( Entity::Player& player ) override; void onFinishLoading( Entity::Player& player ) override; void onInitDirector( Entity::Player& player ) override; - void onSomeDirectorEvent( Entity::Player& player ) override; + void onDirectorSync( Entity::Player& player ) override; void onUpdate( uint32_t currTime ) override; void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override; diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index f632651f..6595618f 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -77,7 +77,7 @@ public: virtual void onPlayerZoneIn( Entity::Player &player ); virtual void onFinishLoading( Entity::Player& player ); virtual void onInitDirector( Entity::Player& player ); - virtual void onSomeDirectorEvent( Entity::Player& player ) {}; + virtual void onDirectorSync( Entity::Player& player ) {}; virtual void onLeaveTerritory( Entity::Player& player ); virtual void onUpdate( uint32_t currTime ); virtual void onRegisterEObj( Entity::EventObjectPtr object ) {}; From dbf0ce5284c0401ad8d7ada98c2b071b29a5d119 Mon Sep 17 00:00:00 2001 From: Mordred Date: Fri, 20 Jul 2018 22:39:10 +0200 Subject: [PATCH 137/199] First step of inventory cleanup, moving defs to common --- src/common/Common.h | 51 +++++++ .../Network/PacketDef/Zone/ServerZoneDef.h | 29 ++-- .../sapphire_zone/Action/ActionMount.cpp | 4 +- .../sapphire_zone/Action/ActionTeleport.cpp | 6 +- .../sapphire_zone/Action/EventItemAction.cpp | 2 +- src/servers/sapphire_zone/Actor/Chara.cpp | 14 +- src/servers/sapphire_zone/Actor/Player.cpp | 28 ++-- src/servers/sapphire_zone/Actor/Player.h | 8 +- .../sapphire_zone/Actor/PlayerInventory.cpp | 38 ++--- .../DebugCommand/DebugCommandHandler.cpp | 2 +- .../sapphire_zone/Inventory/Inventory.cpp | 4 +- .../sapphire_zone/Inventory/Inventory.h | 137 ++---------------- .../Network/PacketWrappers/ModelEquipPacket.h | 10 +- .../PacketWrappers/PlayerSpawnPacket.h | 12 +- 14 files changed, 143 insertions(+), 202 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 6f8acead..d826fe96 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -114,6 +114,57 @@ namespace Common { FreeCompanyCrystal = 22001 }; + enum ContainerType : uint16_t + { + Unknown = 0, + Bag = 1, + GearSet = 2, + CurrencyCrystal = 3, + Armory = 4 + }; + + + enum CurrencyType : uint8_t + { + Gil = 0x01, + StormSeal = 0x02, + SerpentSeal = 0x03, + FlameSeal = 0x04, + TomestonePhilo = 0x05, + TomestoneMytho = 0x06, + WolfMark = 0x07, + TomestoneSold = 0x08, + AlliedSeal = 0x09, + TomestonePoet = 0x0A, + Mgp = 0x0B, + TomestoneLaw = 0x0C, + TomestoneEso = 0x0D, + TomestoneLore = 0x0E + }; + + enum CrystalType : uint8_t + { + FireShard = 0x01, + IceShard = 0x02, + WindShard = 0x03, + EarthShard = 0x04, + LightningShard = 0x05, + WaterShard = 0x06, + + FireCrystal = 0x07, + IceCrystal = 0x08, + WindCrystal = 0x09, + EarthCrystal = 0x0A, + LightningCrystal = 0x0B, + WaterCrystal = 0x0C, + + FireCluster = 0x0D, + IceCluster = 0x0E, + WindCluster = 0x0F, + EarthCluster = 0x10, + LightningCluster = 0x11, + WaterCluster = 0x12 + }; enum struct ZoneingType : uint8_t { diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 6382bb56..ddbd4b00 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -303,11 +303,11 @@ struct effectEntry { Common::ActionEffectType effectType; Common::ActionHitSeverityType hitSeverity; - uint8_t unknown_3; + uint8_t param; int8_t bonusPercent; - int16_t value; uint8_t valueMultiplier; // This multiplies whatever value is in the 'value' param by 10. Possibly a workaround for big numbers - uint8_t unknown_6; + uint8_t flags; + int16_t value; }; struct FFXIVIpcEffect : FFXIVIpcBasePacket @@ -318,17 +318,26 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket uint32_t unknown_2; uint32_t unknown_5; uint32_t unknown_6; - uint32_t effectTargetId; + uint16_t unknown_7; uint16_t rotation; uint16_t actionTextId; - uint8_t unknown_61; - uint8_t unknown_62; - uint8_t unknown_10; + uint16_t unknown_8; + + uint8_t unknown_9; uint8_t numEffects; - uint32_t u11; + + uint16_t unknown_10; + uint32_t unknown_11; + uint16_t unknown_12; + effectEntry effects[8]; - uint32_t effectTarget; - uint64_t unknown_8; + + uint32_t unknown_13; + uint16_t unknown_14; + + uint32_t effectTargetId; + + uint64_t unknown_15; }; diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index 2859d97a..ea06c069 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -78,11 +78,11 @@ void Core::Action::ActionMount::onFinish() effectPacket->data().targetId = pPlayer->getId(); effectPacket->data().actionAnimationId = m_id; // Affects displaying action name next to number in floating text - effectPacket->data().unknown_62 = 13; + //effectPacket->data().unknown_62 = 13; effectPacket->data().actionTextId = 4; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRot() ); - effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; + //effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; effectPacket->data().effects[0].effectType = ActionEffectType::Mount; effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage; effectPacket->data().effects[0].value = m_id; diff --git a/src/servers/sapphire_zone/Action/ActionTeleport.cpp b/src/servers/sapphire_zone/Action/ActionTeleport.cpp index 18220605..277aec5b 100644 --- a/src/servers/sapphire_zone/Action/ActionTeleport.cpp +++ b/src/servers/sapphire_zone/Action/ActionTeleport.cpp @@ -68,13 +68,13 @@ void Core::Action::ActionTeleport::onFinish() auto pPlayer = m_pSource->getAsPlayer(); // check we can finish teleporting - if( pPlayer->getCurrency( Inventory::CurrencyType::Gil ) < m_cost ) + if( pPlayer->getCurrency( Common::CurrencyType::Gil ) < m_cost ) { onInterrupt(); return; } - pPlayer->removeCurrency( Inventory::CurrencyType::Gil, m_cost ); + pPlayer->removeCurrency( Common::CurrencyType::Gil, m_cost ); pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); @@ -92,7 +92,7 @@ void Core::Action::ActionTeleport::onFinish() effectPacket->data().unknown_5 = 1; effectPacket->data().numEffects = 1; effectPacket->data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRot() + 3.1415926 ) ) / 3.1415926 ); - effectPacket->data().effectTarget = pPlayer->getId(); + effectPacket->data().effectTargetId = pPlayer->getId(); pPlayer->sendToInRangeSet( effectPacket, true ); pPlayer->teleport( m_targetAetheryte ); diff --git a/src/servers/sapphire_zone/Action/EventItemAction.cpp b/src/servers/sapphire_zone/Action/EventItemAction.cpp index 9805834a..a6c68208 100644 --- a/src/servers/sapphire_zone/Action/EventItemAction.cpp +++ b/src/servers/sapphire_zone/Action/EventItemAction.cpp @@ -77,7 +77,7 @@ void Core::Action::EventItemAction::onFinish() effectPacket->data().unknown_5 = 2; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRot() ); - effectPacket->data().effectTarget = static_cast< uint32_t >( m_additional ); + effectPacket->data().effectTargetId = static_cast< uint32_t >( m_additional ); m_pSource->getAsPlayer()->unsetStateFlag( Common::PlayerStateFlag::Casting ); m_pSource->sendToInRangeSet( effectPacket, true ); diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index 9f78525b..7ebcf50a 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -407,11 +407,11 @@ void Core::Entity::Chara::autoAttack( CharaPtr pTarget ) ipcEffect->data().actionTextId = 0x366; ipcEffect->data().numEffects = 1; ipcEffect->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - ipcEffect->data().effectTarget = pTarget->getId(); + ipcEffect->data().effectTargetId = pTarget->getId(); ipcEffect->data().effects[0].value = damage; ipcEffect->data().effects[0].effectType = ActionEffectType::Damage; ipcEffect->data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); - ipcEffect->data().effects[0].unknown_3 = 7; + //ipcEffect->data().effects[0].unknown_3 = 7; sendToInRangeSet( ipcEffect ); @@ -447,12 +447,12 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); effectPacket->data().targetId = target.getId(); effectPacket->data().actionAnimationId = actionId; - effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text + //effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text effectPacket->data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation effectPacket->data().actionTextId = actionId; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTarget = target.getId(); + effectPacket->data().effectTargetId = target.getId(); // Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step switch( type ) @@ -463,7 +463,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u effectPacket->data().effects[0].value = static_cast< uint16_t >( param1 ); effectPacket->data().effects[0].effectType = ActionEffectType::Damage; effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::NormalDamage; - effectPacket->data().effects[0].unknown_3 = 7; + //effectPacket->data().effects[0].unknown_3 = 7; if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 ) { @@ -488,7 +488,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( const auto& pHitActor : actorsCollided ) { effectPacket->data().targetId = pHitActor->getId(); - effectPacket->data().effectTarget = pHitActor->getId(); + effectPacket->data().effectTargetId = pHitActor->getId(); // todo: send to range of what? ourselves? when mob script hits this is going to be lacking sendToInRangeSet( effectPacket, true ); @@ -541,7 +541,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( auto pHitActor : actorsCollided ) { effectPacket->data().targetId = target.getId(); - effectPacket->data().effectTarget = pHitActor->getId(); + effectPacket->data().effectTargetId = pHitActor->getId(); sendToInRangeSet( effectPacket, true ); pHitActor->getAsChara()->heal( calculatedHeal ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 9d86cc43..27cf2775 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -769,12 +769,12 @@ void Core::Entity::Player::sendModel() sendToInRangeSet( boost::make_shared< ModelEquipPacket >( *getAsPlayer() ), true ); } -uint32_t Core::Entity::Player::getModelForSlot( Inventory::EquipSlot slot ) +uint32_t Core::Entity::Player::getModelForSlot( Common::EquipSlot slot ) { return m_modelEquip[slot]; } -void Core::Entity::Player::setModelForSlot( Inventory::EquipSlot slot, uint32_t val ) +void Core::Entity::Player::setModelForSlot( Common::EquipSlot slot, uint32_t val ) { m_modelEquip[slot] = val; } @@ -1023,7 +1023,7 @@ void Core::Entity::Player::update( int64_t currTime ) { if( m_targetId && m_currentStance == Entity::Chara::Stance::Active && isAutoattackOn() ) { - auto mainWeap = m_pInventory->getItemAt( Inventory::GearSet0, Inventory::EquipSlot::MainHand ); + auto mainWeap = m_pInventory->getItemAt( Common::GearSet0, Common::EquipSlot::MainHand ); // @TODO i dislike this, iterating over all in range actors when you already know the id of the actor you need... for( auto actor : m_inRangeActor ) @@ -1406,8 +1406,8 @@ uint32_t Core::Entity::Player::getPersistentEmote() const void Core::Entity::Player::autoAttack( CharaPtr pTarget ) { - auto mainWeap = m_pInventory->getItemAt( Inventory::GearSet0, - Inventory::EquipSlot::MainHand ); + auto mainWeap = m_pInventory->getItemAt( Common::GearSet0, + Common::EquipSlot::MainHand ); pTarget->onActionHostile( *this ); //uint64_t tick = Util::getTimeMs(); @@ -1423,16 +1423,16 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) effectPacket->data().actionAnimationId = 8; // effectPacket.data().unknown_2 = variation; effectPacket->data().numEffects = 1; - effectPacket->data().unknown_61 = 1; - effectPacket->data().unknown_62 = 1; + //effectPacket->data().unknown_61 = 1; + //effectPacket->data().unknown_62 = 1; effectPacket->data().actionTextId = 8; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().effectTargetId = pTarget->getId(); - effectPacket->data().effectTarget = pTarget->getId(); + //effectPacket->data().effectTarget = pTarget->getId(); effectPacket->data().effects[0].value = damage; effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - effectPacket->data().effects[0].unknown_3 = 7; + //effectPacket->data().effects[0].unknown_3 = 7; sendToInRangeSet(effectPacket, true); } @@ -1444,15 +1444,15 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) effectPacket->data().actionAnimationId = 7; // effectPacket.data().unknown_2 = variation; effectPacket->data().numEffects = 1; - effectPacket->data().unknown_61 = 1; - effectPacket->data().unknown_62 = 1; + //effectPacket->data().unknown_61 = 1; + //effectPacket->data().unknown_62 = 1; effectPacket->data().actionTextId = 7; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTarget = pTarget->getId(); + effectPacket->data().effectTargetId = pTarget->getId(); effectPacket->data().effects[0].value = damage; effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - effectPacket->data().effects[0].unknown_3 = 71; + //effectPacket->data().effects[0].unknown_3 = 71; sendToInRangeSet(effectPacket, true); } @@ -1701,7 +1701,7 @@ void Core::Entity::Player::teleportQuery( uint16_t aetheryteId ) // cap at 999 gil cost = cost > uint16_t{999} ? uint16_t{999} : cost; - bool insufficientGil = getCurrency( Inventory::CurrencyType::Gil ) < cost; + bool insufficientGil = getCurrency( Common::CurrencyType::Gil ) < cost; // TODO: figure out what param1 really does queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), TeleportStart, insufficientGil ? 2 : 0, aetheryteId ) ); diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index b03bb9dd..33dc78f5 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -223,9 +223,9 @@ public: /*! add an item to a given container */ bool addItem( uint16_t containerId, uint16_t catalogId, uint32_t quantity ); /*! equip an item to a specified slot */ - void equipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem, bool sendModel ); + void equipItem( Common::EquipSlot equipSlotId, ItemPtr pItem, bool sendModel ); /*! remove an item from an equipment slot */ - void unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem ); + void unequipItem( Common::EquipSlot equipSlotId, ItemPtr pItem ); /*! equip a weapon, possibly forcing a job change */ void equipWeapon( ItemPtr pItem ); /*! get player ilvl */ @@ -243,9 +243,9 @@ public: /*! return a const pointer to the model array */ const uint32_t* getModelArray() const; /*! return the equipment model in a specified equipment slot */ - uint32_t getModelForSlot( Inventory::EquipSlot slot ); + uint32_t getModelForSlot( Common::EquipSlot slot ); /*! set the equipment model in a specified equipment slot */ - void setModelForSlot( Inventory::EquipSlot slot, uint32_t val ); + void setModelForSlot( Common::EquipSlot slot, uint32_t val ); /*! return the current amount of currency of type */ uint32_t getCurrency( uint8_t type ) const; /*! add amount to the currency of type */ diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index 595eb762..4e4a6eaa 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -86,7 +86,7 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem ) } // equip an item -void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem, bool sendUpdate ) +void Core::Entity::Player::equipItem( Common::EquipSlot equipSlotId, ItemPtr pItem, bool sendUpdate ) { //g_framework.getLogger().debug( "Equipping into slot " + std::to_string( equipSlotId ) ); @@ -96,18 +96,18 @@ void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, ItemPtr switch( equipSlotId ) { - case Inventory::EquipSlot::MainHand: + case Common::EquipSlot::MainHand: m_modelMainWeapon = model; m_modelSubWeapon = model2; // TODO: add job change upon changing weapon if needed // equipWeapon( pItem ); break; - case Inventory::EquipSlot::OffHand: + case Common::EquipSlot::OffHand: m_modelSubWeapon = model; break; - case Inventory::EquipSlot::SoulCrystal: + case Common::EquipSlot::SoulCrystal: // TODO: add Job change on equipping crystal // change job break; @@ -126,7 +126,7 @@ void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, ItemPtr } } -void Core::Entity::Player::unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem ) +void Core::Entity::Player::unequipItem( Common::EquipSlot equipSlotId, ItemPtr pItem ) { m_modelEquip[static_cast< uint8_t >( equipSlotId )] = 0; sendModel(); @@ -137,19 +137,19 @@ void Core::Entity::Player::unequipItem( Inventory::EquipSlot equipSlotId, ItemPt uint32_t Core::Entity::Player::getCurrency( uint8_t type ) const { - return m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + return m_pInventory->getCurrency( static_cast< Common::CurrencyType >( type ) ); } // TODO: these next functions are so similar that they could likely be simplified void Core::Entity::Player::addCurrency( uint8_t type, uint32_t amount ) { - if( !m_pInventory->addCurrency( static_cast< Inventory::CurrencyType >( type ), amount ) ) + if( !m_pInventory->addCurrency( static_cast< Common::CurrencyType >( type ), amount ) ) return; auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); - invUpPacket->data().containerId = Inventory::InventoryType::Currency; + invUpPacket->data().containerId = Common::InventoryType::Currency; invUpPacket->data().catalogId = 1; - invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Common::CurrencyType >( type ) ); invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); @@ -157,13 +157,13 @@ void Core::Entity::Player::addCurrency( uint8_t type, uint32_t amount ) void Core::Entity::Player::removeCurrency( uint8_t type, uint32_t amount ) { - if( !m_pInventory->removeCurrency( static_cast< Inventory::CurrencyType >( type ), amount ) ) + if( !m_pInventory->removeCurrency( static_cast< Common::CurrencyType >( type ), amount ) ) return; auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); - invUpPacket->data().containerId = Inventory::InventoryType::Currency; + invUpPacket->data().containerId = Common::InventoryType::Currency; invUpPacket->data().catalogId = 1; - invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Common::CurrencyType >( type ) ); invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); @@ -172,18 +172,18 @@ void Core::Entity::Player::removeCurrency( uint8_t type, uint32_t amount ) uint32_t Core::Entity::Player::getCrystal( uint8_t type ) const { - return m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + return m_pInventory->getCrystal( static_cast< Common::CrystalType >( type ) ); } void Core::Entity::Player::addCrystal( uint8_t type, uint32_t amount ) { - if( !m_pInventory->addCrystal( static_cast< Inventory::CrystalType >( type ), amount ) ) + if( !m_pInventory->addCrystal( static_cast< Common::CrystalType >( type ), amount ) ) return; auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); - invUpPacket->data().containerId = Inventory::InventoryType::Crystal; + invUpPacket->data().containerId = Common::InventoryType::Crystal; invUpPacket->data().catalogId = static_cast< uint8_t >( type ) + 1; - invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Common::CrystalType >( type ) ); invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); @@ -194,13 +194,13 @@ void Core::Entity::Player::addCrystal( uint8_t type, uint32_t amount ) void Core::Entity::Player::removeCrystal( uint8_t type, uint32_t amount ) { - if( !m_pInventory->removeCrystal( static_cast< Inventory::CrystalType >( type ), amount ) ) + if( !m_pInventory->removeCrystal( static_cast< Common::CrystalType >( type ), amount ) ) return; auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); - invUpPacket->data().containerId = Inventory::InventoryType::Crystal; + invUpPacket->data().containerId = Common::InventoryType::Crystal; invUpPacket->data().catalogId = static_cast< uint8_t >( type ) + 1; - invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Common::CrystalType >( type ) ); invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 6b18689e..f80a0926 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -268,7 +268,7 @@ void Core::DebugCommandHandler::set( char * data, Entity::Player& player, boost: uint32_t val; sscanf( params.c_str(), "%d %d", &slot, &val ); - player.setModelForSlot( static_cast< Inventory::EquipSlot >( slot ), val ); + player.setModelForSlot( static_cast< Common::EquipSlot >( slot ), val ); player.sendModel(); player.sendDebug( "Model updated" ); } diff --git a/src/servers/sapphire_zone/Inventory/Inventory.cpp b/src/servers/sapphire_zone/Inventory/Inventory.cpp index 9875a444..61a8a82e 100644 --- a/src/servers/sapphire_zone/Inventory/Inventory.cpp +++ b/src/servers/sapphire_zone/Inventory/Inventory.cpp @@ -983,7 +983,7 @@ uint8_t Core::Inventory::getFreeSlotsInBags() } -Core::Inventory::ContainerType Core::Inventory::getContainerType( uint32_t containerId ) +Core::Common::ContainerType Core::Inventory::getContainerType( uint32_t containerId ) { if( containerId < 5 ) { @@ -1003,7 +1003,7 @@ Core::Inventory::ContainerType Core::Inventory::getContainerType( uint32_t conta } else { - return Unknown; + return Common::Unknown; } } diff --git a/src/servers/sapphire_zone/Inventory/Inventory.h b/src/servers/sapphire_zone/Inventory/Inventory.h index 082fbc2d..daaa188c 100644 --- a/src/servers/sapphire_zone/Inventory/Inventory.h +++ b/src/servers/sapphire_zone/Inventory/Inventory.h @@ -16,125 +16,6 @@ public: Inventory( Entity::Player* pOwner ); ~Inventory(); - enum ContainerType : uint16_t - { - Unknown = 0, - Bag = 1, - GearSet = 2, - CurrencyCrystal = 3, - Armory = 4 - }; - - enum InventoryType : uint16_t - { - Bag0 = 0, - Bag1 = 1, - Bag2 = 2, - Bag3 = 3, - - GearSet0 = 1000, - GearSet1 = 1001, - - Currency = 2000, - Crystal = 2001, - //UNKNOWN_0 = 2003, - KeyItem = 2004, - DamagedGear = 2007, - //UNKNOWN_1 = 2008, - - ArmoryOff = 3200, - ArmoryHead = 3201, - ArmoryBody = 3202, - ArmoryHand = 3203, - ArmoryWaist = 3204, - ArmoryLegs = 3205, - ArmoryFeet = 3206, - ArmotyNeck = 3207, - ArmoryEar = 3208, - ArmoryWrist = 3209, - ArmoryRing = 3300, - - ArmorySoulCrystal = 3400, - ArmoryMain = 3500, - - RetainerBag0 = 10000, - RetainerBag1 = 10001, - RetainerBag2 = 10002, - RetainerBag3 = 10003, - RetainerBag4 = 10004, - RetainerBag5 = 10005, - RetainerBag6 = 10006, - RetainerEquippedGear = 11000, - RetainerGil = 12000, - RetainerCrystal = 12001, - RetainerMarket = 12002, - - FreeCompanyBag0 = 20000, - FreeCompanyBag1 = 20001, - FreeCompanyBag2 = 20002, - FreeCompanyGil = 22000, - FreeCompanyCrystal = 22001 - }; - - enum CurrencyType : uint8_t - { - Gil = 0x01, - StormSeal = 0x02, - SerpentSeal = 0x03, - FlameSeal = 0x04, - TomestonePhilo = 0x05, - TomestoneMytho = 0x06, - WolfMark = 0x07, - TomestoneSold = 0x08, - AlliedSeal = 0x09, - TomestonePoet = 0x0A, - Mgp = 0x0B, - TomestoneLaw = 0x0C, - TomestoneEso = 0x0D, - TomestoneLore = 0x0E - }; - - enum CrystalType : uint8_t - { - FireShard = 0x01, - IceShard = 0x02, - WindShard = 0x03, - EarthShard = 0x04, - LightningShard = 0x05, - WaterShard = 0x06, - - FireCrystal = 0x07, - IceCrystal = 0x08, - WindCrystal = 0x09, - EarthCrystal = 0x0A, - LightningCrystal = 0x0B, - WaterCrystal = 0x0C, - - FireCluster = 0x0D, - IceCluster = 0x0E, - WindCluster = 0x0F, - EarthCluster = 0x10, - LightningCluster = 0x11, - WaterCluster = 0x12 - }; - - enum EquipSlot : uint8_t - { - MainHand = 0, - OffHand = 1, - Head = 2, - Body = 3, - Hands = 4, - Waist = 5, - Legs = 6, - Feet = 7, - Neck = 8, - Ear = 9, - Wrist = 10, - Ring1 = 11, - Ring2 = 12, - SoulCrystal = 13, - }; using InvSlotPair = std::pair< uint16_t, int8_t >; typedef std::vector< InvSlotPair > InvSlotPairVec; @@ -160,15 +41,15 @@ public: /*! calculate and return player ilvl based off equipped gear */ uint16_t calculateEquippedGearItemLevel(); /*! return the current amount of currency of type */ - uint32_t getCurrency( CurrencyType type ); + uint32_t getCurrency( Common::CurrencyType type ); /*! add amount to the current of type */ - bool addCurrency( CurrencyType type, uint32_t amount ); + bool addCurrency( Common::CurrencyType type, uint32_t amount ); /*! remove amount from the currency of type */ - bool removeCurrency( CurrencyType type, uint32_t amount ); + bool removeCurrency( Common::CurrencyType type, uint32_t amount ); void updateCurrencyDb(); - void updateBagDb( InventoryType type ); - void updateMannequinDb( InventoryType type ); + void updateBagDb( Common::InventoryType type ); + void updateMannequinDb( Common::InventoryType type ); void updateItemDb( ItemPtr pItem ) const; void deleteItemDb( ItemPtr pItem ) const; @@ -177,11 +58,11 @@ public: uint16_t getArmoryToEquipSlot( uint8_t slotId ); /*! return the crystal amount of currency of type */ - uint32_t getCrystal( CrystalType type ); + uint32_t getCrystal( Common::CrystalType type ); /*! add amount to the crystal of type */ - bool addCrystal( CrystalType type, uint32_t amount ); + bool addCrystal( Common::CrystalType type, uint32_t amount ); /*! remove amount from the crystals of type */ - bool removeCrystal( CrystalType type, uint32_t amount ); + bool removeCrystal( Common::CrystalType type, uint32_t amount ); bool isObtainable( uint32_t catalogId, uint8_t quantity ); void updateCrystalDb(); @@ -192,7 +73,7 @@ public: uint8_t getFreeSlotsInBags(); - ContainerType getContainerType( uint32_t containerId ); + Common::ContainerType getContainerType( uint32_t containerId ); uint32_t getNextUId(); diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h index 41cd107a..6d52668e 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h @@ -28,11 +28,11 @@ private: { m_data.mainWeapon = player.getModelMainWeapon(); m_data.offWeapon = player.getModelSubWeapon(); - m_data.models[0] = player.getModelForSlot( Inventory::EquipSlot::Head ); - m_data.models[1] = player.getModelForSlot( Inventory::EquipSlot::Body ); - m_data.models[2] = player.getModelForSlot( Inventory::EquipSlot::Hands ); - m_data.models[3] = player.getModelForSlot( Inventory::EquipSlot::Legs ); - m_data.models[4] = player.getModelForSlot( Inventory::EquipSlot::Feet ); + m_data.models[0] = player.getModelForSlot( Common::EquipSlot::Head ); + m_data.models[1] = player.getModelForSlot( Common::EquipSlot::Body ); + m_data.models[2] = player.getModelForSlot( Common::EquipSlot::Hands ); + m_data.models[3] = player.getModelForSlot( Common::EquipSlot::Legs ); + m_data.models[4] = player.getModelForSlot( Common::EquipSlot::Feet ); }; }; diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index 3194099c..760a1c2b 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -50,16 +50,16 @@ namespace Server { memcpy( m_data.look, player.getLookArray(), 26 ); - auto item = player.getInventory()->getItemAt( Inventory::GearSet0, Inventory::EquipSlot::MainHand ); + auto item = player.getInventory()->getItemAt( Common::GearSet0, Common::EquipSlot::MainHand ); if( item ) m_data.mainWeaponModel = item->getModelId1(); m_data.secWeaponModel = player.getModelSubWeapon(); - m_data.models[0] = player.getModelForSlot( Inventory::EquipSlot::Head ); - m_data.models[1] = player.getModelForSlot( Inventory::EquipSlot::Body ); - m_data.models[2] = player.getModelForSlot( Inventory::EquipSlot::Hands ); - m_data.models[3] = player.getModelForSlot( Inventory::EquipSlot::Legs ); - m_data.models[4] = player.getModelForSlot( Inventory::EquipSlot::Feet ); + m_data.models[0] = player.getModelForSlot( Common::EquipSlot::Head ); + m_data.models[1] = player.getModelForSlot( Common::EquipSlot::Body ); + m_data.models[2] = player.getModelForSlot( Common::EquipSlot::Hands ); + m_data.models[3] = player.getModelForSlot( Common::EquipSlot::Legs ); + m_data.models[4] = player.getModelForSlot( Common::EquipSlot::Feet ); strcpy( m_data.name, player.getName().c_str() ); m_data.pos.x = player.getPos().x; From 3131d36ea612e3d08a8d63827b1279c747da8c68 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 21 Jul 2018 15:39:58 +1000 Subject: [PATCH 138/199] update effect struct, knockback effect type --- src/common/Common.h | 1 + .../Network/PacketDef/Zone/ServerZoneDef.h | 49 +++++++++++-------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index d826fe96..7a72418b 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -409,6 +409,7 @@ namespace Common { TpLoss = 12, TpGain = 13, GpGain = 14, + Knockback = 33, Mount = 38 }; diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index ddbd4b00..2bc4e0ce 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -304,7 +304,7 @@ struct effectEntry Common::ActionEffectType effectType; Common::ActionHitSeverityType hitSeverity; uint8_t param; - int8_t bonusPercent; + int8_t bonusPercent; // shows an additional percentage in the battle log, will not change the damage number sent & shown uint8_t valueMultiplier; // This multiplies whatever value is in the 'value' param by 10. Possibly a workaround for big numbers uint8_t flags; int16_t value; @@ -312,32 +312,41 @@ struct effectEntry struct FFXIVIpcEffect : FFXIVIpcBasePacket { - uint32_t targetId; - uint32_t unknown_1; - uint32_t actionAnimationId; - uint32_t unknown_2; - uint32_t unknown_5; - uint32_t unknown_6; - uint16_t unknown_7; - uint16_t rotation; - uint16_t actionTextId; - uint16_t unknown_8; + uint64_t animationTargetId; // who the animation targets + uint32_t actionId; // what the casting player casts, shown in battle log/ui - uint8_t unknown_9; - uint8_t numEffects; + uint32_t globalEffectCounter; // seems to only increment on retail? + float animationLockTime; // maybe? doesn't seem to do anything - uint16_t unknown_10; - uint32_t unknown_11; - uint16_t unknown_12; + uint32_t someTargetId; // always 00 00 00 E0, 0x0E000000 is the internal def for INVALID TARGET ID + + uint16_t hiddenAnimation; // if 0, always shows animation, otherwise hides it. counts up by 1 for each animation skipped on a caster + + int16_t rotation; + + uint16_t actionAnimationId; // the animation that is played by the casting character + uint8_t unknown1E; // can be 0,1,2 - maybe other values? - doesn't do anything? + + /* effectDisplayType + * 0 = only show damage/heal amount + * 1 = show damage/heal amount + name + * 2 = show damage/heal amount + name but name is from item.exd, name id is actionId + */ + uint8_t effectDisplayType; + + uint8_t unknown20; // is read by handler, runs code which gets the LODWORD of animationLockTime (wtf?) + uint8_t numEffects; // ignores effects if 0, otherwise parses all of them + + uint32_t padding_22[2]; effectEntry effects[8]; - uint32_t unknown_13; - uint16_t unknown_14; + uint16_t padding_6A[3]; - uint32_t effectTargetId; + uint32_t effectTargetId; // who the effect targets + uint32_t effectFlags; // nonzero = effects do nothing, no battle log, no ui text - only shows animations - uint64_t unknown_15; + uint32_t padding_78; }; From 9d7896043c8ad32495e107474dbb7b53d7f457f8 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 21 Jul 2018 15:54:37 +1000 Subject: [PATCH 139/199] fix builds with new effect packet --- .../sapphire_zone/Action/ActionMount.cpp | 6 +++--- .../sapphire_zone/Action/ActionTeleport.cpp | 7 +++---- .../sapphire_zone/Action/EventItemAction.cpp | 8 +++---- src/servers/sapphire_zone/Actor/Chara.cpp | 21 ++++++++----------- src/servers/sapphire_zone/Actor/Player.cpp | 12 +++++------ 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index ea06c069..912e0c84 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -73,13 +73,13 @@ void Core::Action::ActionMount::onFinish() pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = pPlayer->getId(); + effectPacket->data().animationTargetId = pPlayer->getId(); effectPacket->data().actionAnimationId = m_id; // Affects displaying action name next to number in floating text //effectPacket->data().unknown_62 = 13; - effectPacket->data().actionTextId = 4; + effectPacket->data().actionAnimationId = 4; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRot() ); //effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; diff --git a/src/servers/sapphire_zone/Action/ActionTeleport.cpp b/src/servers/sapphire_zone/Action/ActionTeleport.cpp index 277aec5b..81a204c4 100644 --- a/src/servers/sapphire_zone/Action/ActionTeleport.cpp +++ b/src/servers/sapphire_zone/Action/ActionTeleport.cpp @@ -84,12 +84,11 @@ void Core::Action::ActionTeleport::onFinish() pPlayer->setZoningType( ZoneingType::Teleport ); - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = pPlayer->getId(); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + effectPacket->data().animationTargetId = pPlayer->getId(); effectPacket->data().actionAnimationId = 5; //effectPacket.data().unknown_3 = 1; - effectPacket->data().actionTextId = 5; - effectPacket->data().unknown_5 = 1; + effectPacket->data().actionAnimationId = 5; effectPacket->data().numEffects = 1; effectPacket->data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRot() + 3.1415926 ) ) / 3.1415926 ); effectPacket->data().effectTargetId = pPlayer->getId(); diff --git a/src/servers/sapphire_zone/Action/EventItemAction.cpp b/src/servers/sapphire_zone/Action/EventItemAction.cpp index a6c68208..8fa6323d 100644 --- a/src/servers/sapphire_zone/Action/EventItemAction.cpp +++ b/src/servers/sapphire_zone/Action/EventItemAction.cpp @@ -69,12 +69,10 @@ void Core::Action::EventItemAction::onFinish() try { - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( m_pSource->getId() ); - effectPacket->data().targetId = static_cast< uint32_t >( m_additional ); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( m_pSource->getId() ); + effectPacket->data().animationTargetId = static_cast< uint32_t >( m_additional ); effectPacket->data().actionAnimationId = 1; -// effectPacket.data().unknown_3 = 3; - effectPacket->data().actionTextId = m_id; - effectPacket->data().unknown_5 = 2; + effectPacket->data().actionId = m_id; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRot() ); effectPacket->data().effectTargetId = static_cast< uint32_t >( m_additional ); diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index 7ebcf50a..a2e6be7d 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -399,19 +399,16 @@ void Core::Entity::Chara::autoAttack( CharaPtr pTarget ) uint16_t damage = static_cast< uint16_t >( 10 + rand() % 12 ); uint32_t variation = static_cast< uint32_t >( 0 + rand() % 4 ); - auto ipcEffect = makeZonePacket< FFXIVIpcEffect >( getId() ); - ipcEffect->data().targetId = pTarget->getId(); + auto ipcEffect = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + ipcEffect->data().animationTargetId = pTarget->getId(); ipcEffect->data().actionAnimationId = 0x366; - ipcEffect->data().unknown_2 = variation; -// effectPacket->data().unknown_3 = 1; - ipcEffect->data().actionTextId = 0x366; + ipcEffect->data().actionId = 0x366; ipcEffect->data().numEffects = 1; ipcEffect->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); ipcEffect->data().effectTargetId = pTarget->getId(); ipcEffect->data().effects[0].value = damage; ipcEffect->data().effects[0].effectType = ActionEffectType::Damage; ipcEffect->data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); - //ipcEffect->data().effects[0].unknown_3 = 7; sendToInRangeSet( ipcEffect ); @@ -444,12 +441,12 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u // Prepare packet. This is seemingly common for all packets in the action handler. - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = target.getId(); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + effectPacket->data().animationTargetId = target.getId(); effectPacket->data().actionAnimationId = actionId; //effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text - effectPacket->data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation - effectPacket->data().actionTextId = actionId; + //effectPacket->data().globalEffectCounter = 1; // This seems to have an effect on the "double-cast finish" animation + effectPacket->data().actionId = actionId; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().effectTargetId = target.getId(); @@ -487,7 +484,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( const auto& pHitActor : actorsCollided ) { - effectPacket->data().targetId = pHitActor->getId(); + effectPacket->data().animationTargetId = pHitActor->getId(); effectPacket->data().effectTargetId = pHitActor->getId(); // todo: send to range of what? ourselves? when mob script hits this is going to be lacking @@ -540,7 +537,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( auto pHitActor : actorsCollided ) { - effectPacket->data().targetId = target.getId(); + effectPacket->data().animationTargetId = target.getId(); effectPacket->data().effectTargetId = pHitActor->getId(); sendToInRangeSet( effectPacket, true ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 27cf2775..80356f77 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1418,14 +1418,14 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer ) { - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = pTarget->getId(); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + effectPacket->data().animationTargetId = pTarget->getId(); effectPacket->data().actionAnimationId = 8; // effectPacket.data().unknown_2 = variation; effectPacket->data().numEffects = 1; //effectPacket->data().unknown_61 = 1; //effectPacket->data().unknown_62 = 1; - effectPacket->data().actionTextId = 8; + effectPacket->data().actionId = 8; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().effectTargetId = pTarget->getId(); //effectPacket->data().effectTarget = pTarget->getId(); @@ -1439,14 +1439,14 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) else { - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = pTarget->getId(); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + effectPacket->data().animationTargetId = pTarget->getId(); effectPacket->data().actionAnimationId = 7; // effectPacket.data().unknown_2 = variation; effectPacket->data().numEffects = 1; //effectPacket->data().unknown_61 = 1; //effectPacket->data().unknown_62 = 1; - effectPacket->data().actionTextId = 7; + effectPacket->data().actionId = 7; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().effectTargetId = pTarget->getId(); effectPacket->data().effects[0].value = damage; From c84beee30a2002c324b604208435eb8addb7350e Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 21 Jul 2018 23:32:10 +1000 Subject: [PATCH 140/199] replace old inline generation of effects packet with a wrapper --- src/common/Common.h | 7 ++ .../Network/PacketDef/Zone/ServerZoneDef.h | 15 ++--- .../sapphire_zone/Action/ActionMount.cpp | 21 +++--- .../sapphire_zone/Action/ActionTeleport.cpp | 17 ++--- .../sapphire_zone/Action/EventItemAction.cpp | 11 ++-- src/servers/sapphire_zone/Actor/Chara.cpp | 61 ++++++++--------- src/servers/sapphire_zone/Actor/Player.cpp | 54 +++++++-------- .../Network/PacketWrappers/EffectPacket.h | 65 +++++++++++++++++++ 8 files changed, 146 insertions(+), 105 deletions(-) create mode 100644 src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h diff --git a/src/common/Common.h b/src/common/Common.h index 7a72418b..39fbc393 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -423,6 +423,13 @@ namespace Common { CritDirectHitDamage = 3 }; + enum ActionEffectDisplayType : uint8_t + { + HideActionName = 0, + ShowActionName = 1, + ShowItemName = 2, + }; + enum class ActionCollisionType : uint8_t { None, diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 2bc4e0ce..3787e1c2 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -299,7 +299,7 @@ struct FFXIVIpcUpdateHpMpTp : FFXIVIpcBasePacket * Structural representation of the packet sent by the server * for battle actions */ -struct effectEntry +struct EffectEntry { Common::ActionEffectType effectType; Common::ActionHitSeverityType hitSeverity; @@ -322,24 +322,19 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket uint16_t hiddenAnimation; // if 0, always shows animation, otherwise hides it. counts up by 1 for each animation skipped on a caster - int16_t rotation; + uint16_t rotation; uint16_t actionAnimationId; // the animation that is played by the casting character uint8_t unknown1E; // can be 0,1,2 - maybe other values? - doesn't do anything? - /* effectDisplayType - * 0 = only show damage/heal amount - * 1 = show damage/heal amount + name - * 2 = show damage/heal amount + name but name is from item.exd, name id is actionId - */ - uint8_t effectDisplayType; + Common::ActionEffectDisplayType effectDisplayType; uint8_t unknown20; // is read by handler, runs code which gets the LODWORD of animationLockTime (wtf?) - uint8_t numEffects; // ignores effects if 0, otherwise parses all of them + uint8_t effectCount; // ignores effects if 0, otherwise parses all of them uint32_t padding_22[2]; - effectEntry effects[8]; + EffectEntry effects[8]; uint16_t padding_6A[3]; diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index 912e0c84..2b1ec0da 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" @@ -73,19 +74,15 @@ void Core::Action::ActionMount::onFinish() pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pPlayer->getId(), 4 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( pPlayer->getRot() ) ); - effectPacket->data().animationTargetId = pPlayer->getId(); - effectPacket->data().actionAnimationId = m_id; - // Affects displaying action name next to number in floating text - //effectPacket->data().unknown_62 = 13; - effectPacket->data().actionAnimationId = 4; - effectPacket->data().numEffects = 1; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRot() ); - //effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; - effectPacket->data().effects[0].effectType = ActionEffectType::Mount; - effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage; - effectPacket->data().effects[0].value = m_id; + Server::EffectEntry effectEntry{}; + effectEntry.effectType = ActionEffectType::Mount; + effectEntry.hitSeverity = ActionHitSeverityType::CritDamage; + effectEntry.value = m_id; + + effectPacket->addEffect( effectEntry ); pPlayer->sendToInRangeSet( effectPacket, true ); diff --git a/src/servers/sapphire_zone/Action/ActionTeleport.cpp b/src/servers/sapphire_zone/Action/ActionTeleport.cpp index 81a204c4..257bc27d 100644 --- a/src/servers/sapphire_zone/Action/ActionTeleport.cpp +++ b/src/servers/sapphire_zone/Action/ActionTeleport.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" @@ -84,19 +86,12 @@ void Core::Action::ActionTeleport::onFinish() pPlayer->setZoningType( ZoneingType::Teleport ); - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().animationTargetId = pPlayer->getId(); - effectPacket->data().actionAnimationId = 5; - //effectPacket.data().unknown_3 = 1; - effectPacket->data().actionAnimationId = 5; - effectPacket->data().numEffects = 1; - effectPacket->data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRot() + 3.1415926 ) ) / 3.1415926 ); - effectPacket->data().effectTargetId = pPlayer->getId(); + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pPlayer->getId(), 5 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( pPlayer->getRot() ) ); + + pPlayer->sendToInRangeSet( effectPacket, true ); - pPlayer->teleport( m_targetAetheryte ); - - } void Core::Action::ActionTeleport::onInterrupt() diff --git a/src/servers/sapphire_zone/Action/EventItemAction.cpp b/src/servers/sapphire_zone/Action/EventItemAction.cpp index 8fa6323d..f1ac74e3 100644 --- a/src/servers/sapphire_zone/Action/EventItemAction.cpp +++ b/src/servers/sapphire_zone/Action/EventItemAction.cpp @@ -7,6 +7,7 @@ #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" +#include "Network/PacketWrappers/EffectPacket.h" #include "Actor/Player.h" @@ -69,13 +70,9 @@ void Core::Action::EventItemAction::onFinish() try { - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( m_pSource->getId() ); - effectPacket->data().animationTargetId = static_cast< uint32_t >( m_additional ); - effectPacket->data().actionAnimationId = 1; - effectPacket->data().actionId = m_id; - effectPacket->data().numEffects = 1; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRot() ); - effectPacket->data().effectTargetId = static_cast< uint32_t >( m_additional ); + auto effectPacket = boost::make_shared< Server::EffectPacket >( m_pSource->getId(), m_additional, m_id ); + effectPacket->setAnimationId( 1 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( m_pSource->getRot() ) ); m_pSource->getAsPlayer()->unsetStateFlag( Common::PlayerStateFlag::Casting ); m_pSource->sendToInRangeSet( effectPacket, true ); diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index a2e6be7d..b0b22153 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "Forwards.h" #include "Action/Action.h" @@ -399,21 +400,20 @@ void Core::Entity::Chara::autoAttack( CharaPtr pTarget ) uint16_t damage = static_cast< uint16_t >( 10 + rand() % 12 ); uint32_t variation = static_cast< uint32_t >( 0 + rand() % 4 ); - auto ipcEffect = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - ipcEffect->data().animationTargetId = pTarget->getId(); - ipcEffect->data().actionAnimationId = 0x366; - ipcEffect->data().actionId = 0x366; - ipcEffect->data().numEffects = 1; - ipcEffect->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - ipcEffect->data().effectTargetId = pTarget->getId(); - ipcEffect->data().effects[0].value = damage; - ipcEffect->data().effects[0].effectType = ActionEffectType::Damage; - ipcEffect->data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 0x336 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( getRot() ) ); - sendToInRangeSet( ipcEffect ); + Server::EffectEntry effectEntry{ }; + effectEntry.value = damage; + effectEntry.effectType = ActionEffectType::Damage; + effectEntry.hitSeverity = static_cast< ActionHitSeverityType >( variation ); + + effectPacket->addEffect( effectEntry ); + + sendToInRangeSet( effectPacket ); if( isPlayer() ) - getAsPlayer()->queuePacket( ipcEffect ); + getAsPlayer()->queuePacket( effectPacket ); pTarget->takeDamage( damage ); } @@ -440,16 +440,8 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u // Todo: Effect packet generator. 90% of this is basically setting params and it's basically unreadable. // Prepare packet. This is seemingly common for all packets in the action handler. - - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().animationTargetId = target.getId(); - effectPacket->data().actionAnimationId = actionId; - //effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text - //effectPacket->data().globalEffectCounter = 1; // This seems to have an effect on the "double-cast finish" animation - effectPacket->data().actionId = actionId; - effectPacket->data().numEffects = 1; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTargetId = target.getId(); + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), target.getId(), actionId ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( getRot() ) ); // Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step switch( type ) @@ -457,10 +449,12 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u case ActionEffectType::Damage: { - effectPacket->data().effects[0].value = static_cast< uint16_t >( param1 ); - effectPacket->data().effects[0].effectType = ActionEffectType::Damage; - effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::NormalDamage; - //effectPacket->data().effects[0].unknown_3 = 7; + Server::EffectEntry effectEntry{}; + effectEntry.value = static_cast< uint16_t >( param1 ); + effectEntry.effectType = ActionEffectType::Damage; + effectEntry.hitSeverity = ActionHitSeverityType::NormalDamage; + + effectPacket->addEffect( effectEntry ); if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 ) { @@ -484,8 +478,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( const auto& pHitActor : actorsCollided ) { - effectPacket->data().animationTargetId = pHitActor->getId(); - effectPacket->data().effectTargetId = pHitActor->getId(); + effectPacket->setTargetActor( pHitActor->getId() ); // todo: send to range of what? ourselves? when mob script hits this is going to be lacking sendToInRangeSet( effectPacket, true ); @@ -515,9 +508,12 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u { uint32_t calculatedHeal = Math::CalcBattle::calculateHealValue( getAsPlayer(), static_cast< uint32_t >( param1 ) ); - effectPacket->data().effects[0].value = calculatedHeal; - effectPacket->data().effects[0].effectType = ActionEffectType::Heal; - effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::NormalHeal; + Server::EffectEntry effectEntry{}; + effectEntry.value = calculatedHeal; + effectEntry.effectType = ActionEffectType::Heal; + effectEntry.hitSeverity = ActionHitSeverityType::NormalHeal; + + effectPacket->addEffect( effectEntry ); if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 ) { @@ -537,8 +533,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( auto pHitActor : actorsCollided ) { - effectPacket->data().animationTargetId = target.getId(); - effectPacket->data().effectTargetId = pHitActor->getId(); + effectPacket->setTargetActor( pHitActor->getId() ); sendToInRangeSet( effectPacket, true ); pHitActor->getAsChara()->heal( calculatedHeal ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 80356f77..0d1dccb3 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "Session.h" #include "Player.h" @@ -1418,46 +1419,35 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer ) { - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().animationTargetId = pTarget->getId(); - effectPacket->data().actionAnimationId = 8; - // effectPacket.data().unknown_2 = variation; - effectPacket->data().numEffects = 1; - //effectPacket->data().unknown_61 = 1; - //effectPacket->data().unknown_62 = 1; - effectPacket->data().actionId = 8; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTargetId = pTarget->getId(); - //effectPacket->data().effectTarget = pTarget->getId(); - effectPacket->data().effects[0].value = damage; - effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; - effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - //effectPacket->data().effects[0].unknown_3 = 7; + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 8 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( getRot() ) ); - sendToInRangeSet(effectPacket, true); + Server::EffectEntry entry; + entry.value = damage; + entry.effectType = Common::ActionEffectType::Damage; + entry.hitSeverity = Common::ActionHitSeverityType::NormalDamage; + + effectPacket->addEffect( entry ); + + sendToInRangeSet( effectPacket, true ); } else { + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 7 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( getRot() ) ); - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().animationTargetId = pTarget->getId(); - effectPacket->data().actionAnimationId = 7; - // effectPacket.data().unknown_2 = variation; - effectPacket->data().numEffects = 1; - //effectPacket->data().unknown_61 = 1; - //effectPacket->data().unknown_62 = 1; - effectPacket->data().actionId = 7; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTargetId = pTarget->getId(); - effectPacket->data().effects[0].value = damage; - effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; - effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - //effectPacket->data().effects[0].unknown_3 = 71; + Server::EffectEntry entry; + entry.value = damage; + entry.effectType = Common::ActionEffectType::Damage; + entry.hitSeverity = Common::ActionHitSeverityType::NormalDamage; + + effectPacket->addEffect( entry ); + + sendToInRangeSet( effectPacket, true ); - sendToInRangeSet(effectPacket, true); } - pTarget->takeDamage(damage); + pTarget->takeDamage( damage ); } diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h new file mode 100644 index 00000000..afafdffc --- /dev/null +++ b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h @@ -0,0 +1,65 @@ +#ifndef SAPPHIRE_EFFECTPACKET_H +#define SAPPHIRE_EFFECTPACKET_H + +#include +#include +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +class EffectPacket : + public ZoneChannelPacket< FFXIVIpcEffect > +{ +public: + EffectPacket( uint64_t sourceId, uint32_t targetId, uint32_t actionId ) : + ZoneChannelPacket< FFXIVIpcEffect >( sourceId, targetId ) + { + m_data.actionId = actionId; + m_data.actionAnimationId = static_cast< uint16_t >( actionId ); + + m_data.animationTargetId = targetId; + m_data.effectTargetId = targetId; + + m_data.effectDisplayType = Common::ActionEffectDisplayType::ShowActionName; + } + + void addEffect( const Server::EffectEntry& effect ) + { + assert( m_data.effectCount <= 8 ); + + std::memcpy( &m_data.effects[m_data.effectCount++], &effect, sizeof( Server::EffectEntry ) ); + } + + void setAnimationId( const uint16_t animationId ) + { + m_data.actionAnimationId = animationId; + } + + void setEffectFlags( const uint32_t effectFlags ) + { + m_data.effectFlags = effectFlags; + } + + void setRotation( const uint16_t rotation ) + { + m_data.rotation = rotation; + } + + void setTargetActor( const uint32_t targetId ) + { + m_data.animationTargetId = targetId; + m_data.effectTargetId = targetId; + + FFXIVPacketBase::setTargetActor( targetId ); + } +}; + +} +} +} +} + +#endif //SAPPHIRE_EFFECTPACKET_H From 2665e55a17bf33a6d73fd8c2f9592dc198204864 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 21 Jul 2018 23:48:14 +1000 Subject: [PATCH 141/199] aoeeffect8/16/24/32 packet defs/opcodes --- src/common/Network/PacketDef/Ipcs.h | 4 ++ .../Network/PacketDef/Zone/ServerZoneDef.h | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index d8010c37..4de2bb9d 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -97,6 +97,10 @@ namespace Packets { StatusEffectList = 0x014E, // updated 4.3 Effect = 0x0151, // updated 4.3 + AoeEffect8 = 0x0154, // updated 4.3 + AoeEffect16 = 0x0155, // updated 4.3 + AoeEffect24 = 0x0156, // updated 4.3 + AoeEffect32 = 0x0157, // updated 4.3 PersistantEffect = 0x0158, // updated 4.3 GCAffiliation = 0xCCFC, // OUTDATED diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 3787e1c2..e1f875c9 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -344,6 +344,46 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket uint32_t padding_78; }; +template< int size > +struct FFXIVIpcAoeEffect +{ + uint64_t animationTargetId; + uint32_t actionId; + + uint32_t globalEffectCounter; + float animationLockTime; + + uint32_t someTargetId; + + uint16_t hiddenAnimation; + + uint16_t rotation; + + uint16_t actionAnimationId; + uint8_t unknown1E; + + Common::ActionEffectDisplayType effectDisplayType; + + uint8_t unknown20; + uint8_t effectCount; + + uint32_t padding_22[2]; + + EffectEntry effects[size]; + + uint16_t padding_6A[3]; + + uint32_t effectTargetId[size]; + uint32_t effectFlags; + + uint32_t padding_78; +}; + +struct FFXIVIpcAoeEffect8 : FFXIVIpcBasePacket< AoeEffect8 >, FFXIVIpcAoeEffect< 8 > {}; +struct FFXIVIpcAoeEffect16 : FFXIVIpcBasePacket< AoeEffect16 >, FFXIVIpcAoeEffect< 16 > {}; +struct FFXIVIpcAoeEffect24 : FFXIVIpcBasePacket< AoeEffect24 >, FFXIVIpcAoeEffect< 24 > {}; +struct FFXIVIpcAoeEffect32 : FFXIVIpcBasePacket< AoeEffect32 >, FFXIVIpcAoeEffect< 32 > {}; + /** * Structural representation of the packet sent by the server From 68b08de1ded9e197d6418a4e47e92de435d6e20b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 16:54:01 +1000 Subject: [PATCH 142/199] housing placard script, gridania mb script, opcodes --- src/common/Network/PacketDef/Ipcs.h | 3 +++ .../Scripts/common/CmnDefHousingSignboard.cpp | 19 +++++++++++++++++++ .../common/CmnDefMarketBoardGridania.cpp | 19 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 src/servers/Scripts/common/CmnDefHousingSignboard.cpp create mode 100644 src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 4de2bb9d..1acc4dbd 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -228,8 +228,11 @@ namespace Packets { LinkshellListHandler = 0x00F4, // updated 4.3 + SearchMarketboard = 0x0103, // updated 4.3 + FcInfoReqHandler = 0x011A, // updated 4.2 + ReqMarketWishList = 0x012C, // updated 4.3 ReqJoinNoviceNetwork = 0x0129, // updated 4.2 diff --git a/src/servers/Scripts/common/CmnDefHousingSignboard.cpp b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp new file mode 100644 index 00000000..bb922cbd --- /dev/null +++ b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp @@ -0,0 +1,19 @@ +#include +#include + +class CmnDefHousingSignboard : public EventScript +{ +public: + CmnDefHousingSignboard() : EventScript( 721031 ) + {} + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, 0x2000, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; \ No newline at end of file diff --git a/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp b/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp new file mode 100644 index 00000000..3f0eec55 --- /dev/null +++ b/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp @@ -0,0 +1,19 @@ +#include +#include + +class CmnDefMarketBoardGridania : public EventScript +{ +public: + CmnDefMarketBoardGridania() : EventScript( 0xB0027 ) + {} + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, 0x2000, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; \ No newline at end of file From 893ebd3454d4182347462f8724d724363ed5787b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 16:54:23 +1000 Subject: [PATCH 143/199] move common effect struct members into a shared struct for single target/aoe --- .../Network/PacketDef/Zone/ServerZoneDef.h | 30 +++++-------------- .../Network/PacketWrappers/EffectPacket.h | 18 +++++------ 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index e1f875c9..98eeda5c 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -310,7 +310,7 @@ struct EffectEntry int16_t value; }; -struct FFXIVIpcEffect : FFXIVIpcBasePacket +struct EffectHeader { uint64_t animationTargetId; // who the animation targets uint32_t actionId; // what the casting player casts, shown in battle log/ui @@ -333,6 +333,11 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket uint8_t effectCount; // ignores effects if 0, otherwise parses all of them uint32_t padding_22[2]; +}; + +struct FFXIVIpcEffect : FFXIVIpcBasePacket +{ + EffectHeader header; EffectEntry effects[8]; @@ -347,33 +352,14 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket template< int size > struct FFXIVIpcAoeEffect { - uint64_t animationTargetId; - uint32_t actionId; - - uint32_t globalEffectCounter; - float animationLockTime; - - uint32_t someTargetId; - - uint16_t hiddenAnimation; - - uint16_t rotation; - - uint16_t actionAnimationId; - uint8_t unknown1E; - - Common::ActionEffectDisplayType effectDisplayType; - - uint8_t unknown20; - uint8_t effectCount; - - uint32_t padding_22[2]; + EffectHeader header; EffectEntry effects[size]; uint16_t padding_6A[3]; uint32_t effectTargetId[size]; + Common::FFXIVARR_POSITION3 position; uint32_t effectFlags; uint32_t padding_78; diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h index afafdffc..548aa83c 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h @@ -17,25 +17,25 @@ public: EffectPacket( uint64_t sourceId, uint32_t targetId, uint32_t actionId ) : ZoneChannelPacket< FFXIVIpcEffect >( sourceId, targetId ) { - m_data.actionId = actionId; - m_data.actionAnimationId = static_cast< uint16_t >( actionId ); + m_data.header.actionId = actionId; + m_data.header.actionAnimationId = static_cast< uint16_t >( actionId ); - m_data.animationTargetId = targetId; + m_data.header.animationTargetId = targetId; m_data.effectTargetId = targetId; - m_data.effectDisplayType = Common::ActionEffectDisplayType::ShowActionName; + m_data.header.effectDisplayType = Common::ActionEffectDisplayType::ShowActionName; } void addEffect( const Server::EffectEntry& effect ) { - assert( m_data.effectCount <= 8 ); + assert( m_data.header.effectCount <= 8 ); - std::memcpy( &m_data.effects[m_data.effectCount++], &effect, sizeof( Server::EffectEntry ) ); + std::memcpy( &m_data.effects[m_data.header.effectCount++], &effect, sizeof( Server::EffectEntry ) ); } void setAnimationId( const uint16_t animationId ) { - m_data.actionAnimationId = animationId; + m_data.header.actionAnimationId = animationId; } void setEffectFlags( const uint32_t effectFlags ) @@ -45,12 +45,12 @@ public: void setRotation( const uint16_t rotation ) { - m_data.rotation = rotation; + m_data.header.rotation = rotation; } void setTargetActor( const uint32_t targetId ) { - m_data.animationTargetId = targetId; + m_data.header.animationTargetId = targetId; m_data.effectTargetId = targetId; FFXIVPacketBase::setTargetActor( targetId ); From 394988fbb0b7648575b93fdbfcbe7cdd97ce2a1b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 17:02:09 +1000 Subject: [PATCH 144/199] scripts cleanup, npc repair script and hunt board --- .../Scripts/common/CmnDefCutSceneReplay.cpp | 2 +- .../Scripts/common/CmnDefHousingSignboard.cpp | 2 +- src/servers/Scripts/common/CmnDefInnBed.cpp | 2 +- .../common/CmnDefMarketBoardGridania.cpp | 2 +- .../Scripts/common/CmnDefNpcRepair.cpp | 19 +++++++++++++++++++ .../Scripts/common/ComDefMobHuntBoard.cpp | 19 +++++++++++++++++++ .../Scripts/common/HouFurOrchestrion.cpp | 2 +- 7 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 src/servers/Scripts/common/CmnDefNpcRepair.cpp create mode 100644 src/servers/Scripts/common/ComDefMobHuntBoard.cpp diff --git a/src/servers/Scripts/common/CmnDefCutSceneReplay.cpp b/src/servers/Scripts/common/CmnDefCutSceneReplay.cpp index fdd742e1..137c5a02 100644 --- a/src/servers/Scripts/common/CmnDefCutSceneReplay.cpp +++ b/src/servers/Scripts/common/CmnDefCutSceneReplay.cpp @@ -17,7 +17,7 @@ public: } }; - player.playScene( getId(), 0, 0x2000, 0, 1, callback ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1, callback ); } void Scene00001( Entity::Player& player, uint16_t returnScene ) diff --git a/src/servers/Scripts/common/CmnDefHousingSignboard.cpp b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp index bb922cbd..cced1ec6 100644 --- a/src/servers/Scripts/common/CmnDefHousingSignboard.cpp +++ b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp @@ -9,7 +9,7 @@ public: void Scene00000( Entity::Player& player ) { - player.playScene( getId(), 0, 0x2000, 0, 1 ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override diff --git a/src/servers/Scripts/common/CmnDefInnBed.cpp b/src/servers/Scripts/common/CmnDefInnBed.cpp index 2b524502..8c09c3c3 100644 --- a/src/servers/Scripts/common/CmnDefInnBed.cpp +++ b/src/servers/Scripts/common/CmnDefInnBed.cpp @@ -16,7 +16,7 @@ public: Scene00001( player, result.param2 ); }; - player.playScene( getId(), 0, 0x2000, 0, 1, callback ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1, callback ); } // lay down diff --git a/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp b/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp index 3f0eec55..292bdaa9 100644 --- a/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp +++ b/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp @@ -9,7 +9,7 @@ public: void Scene00000( Entity::Player& player ) { - player.playScene( getId(), 0, 0x2000, 0, 1 ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override diff --git a/src/servers/Scripts/common/CmnDefNpcRepair.cpp b/src/servers/Scripts/common/CmnDefNpcRepair.cpp new file mode 100644 index 00000000..18be6f72 --- /dev/null +++ b/src/servers/Scripts/common/CmnDefNpcRepair.cpp @@ -0,0 +1,19 @@ +#include +#include + +class CmnDefNpcRepair : public EventScript +{ +public: + CmnDefNpcRepair() : EventScript( 0xB0013 ) + {} + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; \ No newline at end of file diff --git a/src/servers/Scripts/common/ComDefMobHuntBoard.cpp b/src/servers/Scripts/common/ComDefMobHuntBoard.cpp new file mode 100644 index 00000000..1c0281a5 --- /dev/null +++ b/src/servers/Scripts/common/ComDefMobHuntBoard.cpp @@ -0,0 +1,19 @@ +#include +#include + +class ComDefMobHuntBoard : public EventScript +{ +public: + ComDefMobHuntBoard() : EventScript( 0xB00CA ) + {} + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; \ No newline at end of file diff --git a/src/servers/Scripts/common/HouFurOrchestrion.cpp b/src/servers/Scripts/common/HouFurOrchestrion.cpp index 7ceeea71..514f86a9 100644 --- a/src/servers/Scripts/common/HouFurOrchestrion.cpp +++ b/src/servers/Scripts/common/HouFurOrchestrion.cpp @@ -9,7 +9,7 @@ public: void Scene00000( Entity::Player& player ) { - player.playScene( getId(), 0, 0x2000, 0, 1 ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override From d68fa6d19256ab46c670b649500074f5b9d98370 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 19:10:52 +1000 Subject: [PATCH 145/199] remove const constraint --- .../sapphire_zone/Network/PacketWrappers/EffectPacket.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h index 548aa83c..8e45fc23 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h @@ -33,17 +33,17 @@ public: std::memcpy( &m_data.effects[m_data.header.effectCount++], &effect, sizeof( Server::EffectEntry ) ); } - void setAnimationId( const uint16_t animationId ) + void setAnimationId( uint16_t animationId ) { m_data.header.actionAnimationId = animationId; } - void setEffectFlags( const uint32_t effectFlags ) + void setEffectFlags( uint32_t effectFlags ) { m_data.effectFlags = effectFlags; } - void setRotation( const uint16_t rotation ) + void setRotation( uint16_t rotation ) { m_data.header.rotation = rotation; } From bf726c2a48cc816cb4a969b050e6f7d1c20497a2 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 22:05:09 +1000 Subject: [PATCH 146/199] consistent indentation --- src/common/Network/PacketDef/Ipcs.h | 317 ++++++++++++++-------------- 1 file changed, 159 insertions(+), 158 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 1acc4dbd..662c2fba 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -14,13 +14,13 @@ namespace Packets { */ enum ServerLobbyIpcType : uint16_t { - LobbyError = 0x0002, - LobbyServiceAccountList = 0x000C, - LobbyCharList = 0x000D, - LobbyCharCreate = 0x000E, - LobbyEnterWorld = 0x000F, - LobbyServerList = 0x0015, - LobbyRetainerList = 0x0017, + LobbyError = 0x0002, + LobbyServiceAccountList = 0x000C, + LobbyCharList = 0x000D, + LobbyCharCreate = 0x000E, + LobbyEnterWorld = 0x000F, + LobbyServerList = 0x0015, + LobbyRetainerList = 0x0017, }; @@ -29,12 +29,12 @@ namespace Packets { */ enum ClientLobbyIpcType : uint16_t { - ReqCharList = 0x0003, - ReqEnterWorld = 0x0004, - ReqServiceAccountList = 0x0005, + ReqCharList = 0x0003, + ReqEnterWorld = 0x0004, + ReqServiceAccountList = 0x0005, - ReqCharDelete = 0x000A, - ReqCharCreate = 0x000B, + ReqCharDelete = 0x000A, + ReqCharCreate = 0x000B, }; //////////////////////////////////////////////////////////////////////////////// @@ -46,149 +46,150 @@ namespace Packets { { // static opcode ( the ones that rarely, if ever, change ) - Ping = 0x0065, - Init = 0x0066, + Ping = 0x0065, + Init = 0x0066, - ActorFreeSpawn = 0x0191, - InitZone = 0x019A, + ActorFreeSpawn = 0x0191, + InitZone = 0x019A, - AddStatusEffect = 0x0141, - ActorControl142 = 0x0142, - ActorControl143 = 0x0143, - ActorControl144 = 0x0144, - UpdateHpMpTp = 0x0145, + AddStatusEffect = 0x0141, + ActorControl142 = 0x0142, + ActorControl143 = 0x0143, + ActorControl144 = 0x0144, + UpdateHpMpTp = 0x0145, /////////////////////////////////////////////////// - ChatBanned = 0x006B, - Logout = 0x0077, // updated 4.3 - CFNotify = 0x0078, - CFMemberStatus = 0x0079, - CFDutyInfo = 0x007A, - CFPlayerInNeed = 0x007F, + ChatBanned = 0x006B, + Logout = 0x0077, // updated 4.3 + CFNotify = 0x0078, + CFMemberStatus = 0x0079, + CFDutyInfo = 0x007A, + CFPlayerInNeed = 0x007F, - SocialRequestError = 0x00AD, + SocialRequestError = 0x00AD, - CFRegistered = 0x00B8, // updated 4.1 - SocialRequestResponse = 0x00BB, // updated 4.1 - CancelAllianceForming = 0x00C6, // updated 4.2 + CFRegistered = 0x00B8, // updated 4.1 + SocialRequestResponse = 0x00BB, // updated 4.1 + CancelAllianceForming = 0x00C6, // updated 4.2 - Playtime = 0x00F5, // updated 4.3 - Chat = 0x00F7, // updated 4.3 - SocialList = 0x00FD, // updated 4.3 + Playtime = 0x00F5, // updated 4.3 + Chat = 0x00F7, // updated 4.3 + SocialList = 0x00FD, // updated 4.3 - UpdateSearchInfo = 0x0100, // updated 4.3 - InitSearchInfo = 0x0101, // updated 4.3 + UpdateSearchInfo = 0x0100, // updated 4.3 + InitSearchInfo = 0x0101, // updated 4.3 - ServerNotice = 0x0106, // updated 4.3 - SetOnlineStatus = 0x0107, // updated 4.3 + ServerNotice = 0x0106, // updated 4.3 + SetOnlineStatus = 0x0107, // updated 4.3 - CountdownInitiate = 0x0111, // updated 4.3 - CountdownCancel = 0x0112, // updated 4.3 + CountdownInitiate = 0x0111, // updated 4.3 + CountdownCancel = 0x0112, // updated 4.3 - BlackList = 0x0115, // updated 4.3 + BlackList = 0x0115, // updated 4.3 - LogMessage = 0x00D0, + LogMessage = 0x00D0, - LinkshellList = 0x011C, // updated 4.3 - CharaFreeCompanyTag = 0x013B, // updated 4.3 - FreeCompanyBoardMsg = 0x013C, // updated 4.3 - FreeCompanyInfo = 0x013D, // updated 4.3 + LinkshellList = 0x011C, // updated 4.3 + CharaFreeCompanyTag = 0x013B, // updated 4.3 + FreeCompanyBoardMsg = 0x013C, // updated 4.3 + FreeCompanyInfo = 0x013D, // updated 4.3 - StatusEffectList = 0x014E, // updated 4.3 - Effect = 0x0151, // updated 4.3 - AoeEffect8 = 0x0154, // updated 4.3 - AoeEffect16 = 0x0155, // updated 4.3 - AoeEffect24 = 0x0156, // updated 4.3 - AoeEffect32 = 0x0157, // updated 4.3 - PersistantEffect = 0x0158, // updated 4.3 + StatusEffectList = 0x014E, // updated 4.3 + Effect = 0x0151, // updated 4.3 + AoeEffect8 = 0x0154, // updated 4.3 + AoeEffect16 = 0x0155, // updated 4.3 + AoeEffect24 = 0x0156, // updated 4.3 + AoeEffect32 = 0x0157, // updated 4.3 + PersistantEffect = 0x0158, // updated 4.3 - GCAffiliation = 0xCCFC, // OUTDATED + GCAffiliation = 0xCCFC, // OUTDATED - PlayerSpawn = 0x0172, // updated 4.3 - NpcSpawn = 0x0173, // updated 4.3 - ActorMove = 0x0174, // updated 4.3 - ActorSetPos = 0x0176, // updated 4.3 + PlayerSpawn = 0x0172, // updated 4.3 + NpcSpawn = 0x0173, // updated 4.3 + ActorMove = 0x0174, // updated 4.3 + ActorSetPos = 0x0176, // updated 4.3 - ActorCast = 0x0178, // updated 4.3 + ActorCast = 0x0178, // updated 4.3 - PartyList = 0x017A, // updated 4.3 - HateList = 0x017B, // updated 4.3 + PartyList = 0x017A, // updated 4.3 + HateList = 0x017B, // updated 4.3 - ObjectSpawn = 0x017D, // updated 4.3 - ObjectDespawn = 0x017E, // updated 4.3 + ObjectSpawn = 0x017D, // updated 4.3 + ObjectDespawn = 0x017E, // updated 4.3 - SetLevelSync = 0x017F, // updated 4.3 - SilentSetClassJob = 0x0180, // updated 4.3 - seems to be the case, not sure if it's actually used for anything + SetLevelSync = 0x017F, // updated 4.3 + SilentSetClassJob = 0x0180, // updated 4.3 - seems to be the case, not sure if it's actually used for anything - InitUI = 0x0181, // updated 4.3 - PlayerStats = 0x0182, // updated 4.3 - ActorOwner = 0x0183, // updated 4.3 ? - PlayerStateFlags = 0x0184, // updated 4.3 - PlayerClassInfo = 0x0185, // updated 4.3 - ModelEquip = 0x0186, // updated 4.3 + InitUI = 0x0181, // updated 4.3 + PlayerStats = 0x0182, // updated 4.3 + ActorOwner = 0x0183, // updated 4.3 ? + PlayerStateFlags = 0x0184, // updated 4.3 + PlayerClassInfo = 0x0185, // updated 4.3 + ModelEquip = 0x0186, // updated 4.3 - UpdateClassInfo = 0x018A, // updated 4.3 + UpdateClassInfo = 0x018A, // updated 4.3 - ItemInfo = 0x0190, // updated 4.3 - ContainerInfo = 0x0192, // updated 4.3 - InventoryTransactionFinish = 0x0193, // updated 4.3 - InventoryTransaction = 0x0194, // updated 4.3 - InventoryActionAck = 0x0197, // updated 4.3 - CurrencyCrystalInfo = 0xFFFF, // updated 4.3 - wrong opcode + ItemInfo = 0x0190, // updated 4.3 + ContainerInfo = 0x0192, // updated 4.3 + InventoryTransactionFinish = 0x0193, // updated 4.3 + InventoryTransaction = 0x0194, // updated 4.3 + InventoryActionAck = 0x0197, // updated 4.3 + CurrencyCrystalInfo = 0xFFFF, // updated 4.3 - wrong opcode - UpdateInventorySlot = 0x0198, // updated 4.3 + UpdateInventorySlot = 0x0198, // updated 4.3 - EventPlay = 0x01A6, // updated 4.3 - DirectorPlayScene = 0x01AA, // updated 4.3 + EventPlay = 0x01A6, // updated 4.3 + EventOpenGilShop = 0x01AD, // updated 4.3 + DirectorPlayScene = 0x01AA, // updated 4.3 - EventStart = 0x01AF, // updated 4.3 - EventFinish = 0x01B0, // updated 4.3 + EventStart = 0x01AF, // updated 4.3 + EventFinish = 0x01B0, // updated 4.3 - EventLinkshell = 0x1169, + EventLinkshell = 0x1169, - QuestActiveList = 0x01C3, // updated 4.3 - QuestUpdate = 0x01C4, // updated 4.3 - QuestCompleteList = 0x01C5, // updated 4.3 + QuestActiveList = 0x01C3, // updated 4.3 + QuestUpdate = 0x01C4, // updated 4.3 + QuestCompleteList = 0x01C5, // updated 4.3 - QuestFinish = 0x01C6, // updated 4.3 - MSQTrackerComplete = 0x01C7, // updated 4.3 - MSQTrackerProgress = 0x01C8, // updated 4.3 + QuestFinish = 0x01C6, // updated 4.3 + MSQTrackerComplete = 0x01C7, // updated 4.3 + MSQTrackerProgress = 0x01C8, // updated 4.3 - QuestMessage = 0x01CE, // updated 4.3 + QuestMessage = 0x01CE, // updated 4.3 - QuestTracker = 0x01D3, // updated 4.3 + QuestTracker = 0x01D3, // updated 4.3 - Mount = 0x01E3, // updated 4.3 + Mount = 0x01E3, // updated 4.3 - DirectorVars = 0x01E5, // updated 4.3 + DirectorVars = 0x01E5, // updated 4.3 - CFAvailableContents = 0x01FD, // updated 4.2 + CFAvailableContents = 0x01FD, // updated 4.2 - WeatherChange = 0x0200, // updated 4.3 - PlayerTitleList = 0x0201, // updated 4.3 - Discovery = 0x0202, // updated 4.3 + WeatherChange = 0x0200, // updated 4.3 + PlayerTitleList = 0x0201, // updated 4.3 + Discovery = 0x0202, // updated 4.3 - EorzeaTimeOffset = 0x0204, // updated 4.3 + EorzeaTimeOffset = 0x0204, // updated 4.3 - EquipDisplayFlags = 0x0210, // updated 4.3 + EquipDisplayFlags = 0x0210, // updated 4.3 - WardInfo = 0x0224, // updated 4.3 - WardHousingPermission = 0x022D, // updated 4.3 - WardYardInfo = 0x022F, // updated 4.3 + WardInfo = 0x0224, // updated 4.3 + WardHousingPermission = 0x022D, // updated 4.3 + WardYardInfo = 0x022F, // updated 4.3 - DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui - PerformNote = 0x0286, // updated 4.3 + DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui + PerformNote = 0x0286, // updated 4.3 - PrepareZoning = 0x0291, // updated 4.3 - ActorGauge = 0x0292, // updated 4.3 + PrepareZoning = 0x0291, // updated 4.3 + ActorGauge = 0x0292, // updated 4.3 // Unknown IPC types that still need to be sent // TODO: figure all these out properly - IPCTYPE_UNK_320 = 0x024C, // updated 4.3 - IPCTYPE_UNK_322 = 0x024E, // updated 4.3 + IPCTYPE_UNK_320 = 0x024C, // updated 4.3 + IPCTYPE_UNK_322 = 0x024E, // updated 4.3 }; @@ -198,78 +199,78 @@ namespace Packets { enum ClientZoneIpcType : uint16_t { - PingHandler = 0x0065, // unchanged 4.3 - InitHandler = 0x0066, // unchanged 4.3 + PingHandler = 0x0065, // unchanged 4.3 + InitHandler = 0x0066, // unchanged 4.3 - FinishLoadingHandler = 0x0069, // unchanged 4.3 + FinishLoadingHandler = 0x0069, // unchanged 4.3 - CFCommenceHandler = 0x006F, + CFCommenceHandler = 0x006F, - CFRegisterDuty = 0x0071, - CFRegisterRoulette = 0x0072, - PlayTimeHandler = 0x0073, // unchanged 4.3 - LogoutHandler = 0x0074, // unchanged 4.3 + CFRegisterDuty = 0x0071, + CFRegisterRoulette = 0x0072, + PlayTimeHandler = 0x0073, // unchanged 4.3 + LogoutHandler = 0x0074, // unchanged 4.3 - CFDutyInfoHandler = 0x0078, // updated 4.2 + CFDutyInfoHandler = 0x0078, // updated 4.2 - SocialReqSendHandler = 0x00AE, // updated 4.1 - CreateCrossWorldLS = 0x00AF, // updated 4.3 + SocialReqSendHandler = 0x00AE, // updated 4.1 + CreateCrossWorldLS = 0x00AF, // updated 4.3 - ChatHandler = 0x00D3, // updated 4.3 + ChatHandler = 0x00D3, // updated 4.3 - SocialListHandler = 0x00DB, // updated 4.3 - ReqSearchInfoHandler = 0x00E0, // updated 4.3 - SetSearchInfoHandler = 0x00DE, // updated 4.3 + SocialListHandler = 0x00DB, // updated 4.3 + ReqSearchInfoHandler = 0x00E0, // updated 4.3 + SetSearchInfoHandler = 0x00DE, // updated 4.3 - BlackListHandler = 0x00EC, // updated 4.3 - PlayerSearchHandler = 0x00E2, // updated 4.2 + BlackListHandler = 0x00EC, // updated 4.3 + PlayerSearchHandler = 0x00E2, // updated 4.2 - LinkshellListHandler = 0x00F4, // updated 4.3 + LinkshellListHandler = 0x00F4, // updated 4.3 - SearchMarketboard = 0x0103, // updated 4.3 + SearchMarketboard = 0x0103, // updated 4.3 - FcInfoReqHandler = 0x011A, // updated 4.2 + FcInfoReqHandler = 0x011A, // updated 4.2 - ReqMarketWishList = 0x012C, // updated 4.3 + ReqMarketWishList = 0x012C, // updated 4.3 - ReqJoinNoviceNetwork = 0x0129, // updated 4.2 + ReqJoinNoviceNetwork = 0x0129, // updated 4.2 - ReqCountdownInitiate = 0x0138, // updated 4.3 - ReqCountdownCancel = 0x0139, // updated 4.3 - ClearWaymarks = 0x013A, // updated 4.3 + ReqCountdownInitiate = 0x0138, // updated 4.3 + ReqCountdownCancel = 0x0139, // updated 4.3 + ClearWaymarks = 0x013A, // updated 4.3 - ZoneLineHandler = 0x013C, // updated 4.3 - ClientTrigger = 0x013D, // updated 4.3 - DiscoveryHandler = 0x013E, // updated 4.3 + ZoneLineHandler = 0x013C, // updated 4.3 + ClientTrigger = 0x013D, // updated 4.3 + DiscoveryHandler = 0x013E, // updated 4.3 - AddWaymark = 0x013F, // updated 4.3 + AddWaymark = 0x013F, // updated 4.3 - SkillHandler = 0x0140, // updated 4.3 - GMCommand1 = 0x0141, // updated 4.3 - GMCommand2 = 0x0142, // updated 4.3 + SkillHandler = 0x0140, // updated 4.3 + GMCommand1 = 0x0141, // updated 4.3 + GMCommand2 = 0x0142, // updated 4.3 - UpdatePositionHandler = 0x0144, // updated 4.3 - UpdatePositionInstance = 0x0183, // updated 4.3 + UpdatePositionHandler = 0x0144, // updated 4.3 + UpdatePositionInstance = 0x0183, // updated 4.3 - InventoryModifyHandler = 0x014B, // updated 4.3 + InventoryModifyHandler = 0x014B, // updated 4.3 - TalkEventHandler = 0x0154, // updated 4.3 - EmoteEventHandler = 0x0155, // updated 4.3 - WithinRangeEventHandler = 0x0156, // updated 4.3 - OutOfRangeEventHandler = 0x0157, // updated 4.3 - EnterTeriEventHandler = 0x0158, // updated 4.3 + TalkEventHandler = 0x0154, // updated 4.3 + EmoteEventHandler = 0x0155, // updated 4.3 + WithinRangeEventHandler = 0x0156, // updated 4.3 + OutOfRangeEventHandler = 0x0157, // updated 4.3 + EnterTeriEventHandler = 0x0158, // updated 4.3 - ReturnEventHandler = 0x015D, // updated 4.3 - TradeReturnEventHandler = 0x015E, // updated 4.3 + ReturnEventHandler = 0x015D, // updated 4.3 + TradeReturnEventHandler = 0x015E, // updated 4.3 - LinkshellEventHandler = 0x0150, // updated 4.1 ?? - LinkshellEventHandler1 = 0x0151, // updated 4.1 ?? + LinkshellEventHandler = 0x0150, // updated 4.1 ?? + LinkshellEventHandler1 = 0x0151, // updated 4.1 ?? - PerformNoteHandler = 0x029B, // updated 4.3 + PerformNoteHandler = 0x029B, // updated 4.3 - ReqEquipDisplayFlagsChange = 0x0178, // updated 4.3 + ReqEquipDisplayFlagsChange = 0x0178, // updated 4.3 }; @@ -281,8 +282,8 @@ namespace Packets { */ enum ServerChatIpcType : uint16_t { - Tell = 0x0064, // updated for sb - TellErrNotFound = 0x0066, + Tell = 0x0064, // updated for sb + TellErrNotFound = 0x0066, }; /** @@ -290,7 +291,7 @@ namespace Packets { */ enum ClientChatIpcType : uint16_t { - TellReq = 0x0064, + TellReq = 0x0064, }; From 18a1ab79d6a2831ddc9314d247b7e7ee260e90f0 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 22:11:03 +1000 Subject: [PATCH 147/199] extremely broken gilshop implementation --- .../Network/PacketDef/Zone/ServerZoneDef.h | 11 ++++++++++ src/servers/Scripts/common/GilShop.cpp | 19 ++++++++++++++++++ src/servers/sapphire_zone/Actor/Player.h | 2 ++ .../sapphire_zone/Actor/PlayerEvent.cpp | 20 +++++++++++++++++++ .../sapphire_zone/Script/ScriptMgr.cpp | 4 ++++ 5 files changed, 56 insertions(+) create mode 100644 src/servers/Scripts/common/GilShop.cpp diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 98eeda5c..6524d7fc 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1093,6 +1093,17 @@ struct FFXIVIpcEventFinish : FFXIVIpcBasePacket /* 000C */ uint32_t padding1; }; +struct FFXIVIpcEventOpenGilShop : FFXIVIpcBasePacket +{ + uint64_t actorId; + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t sceneFlags; + + uint32_t unknown_wtf[0x101]; +}; + /** * Structural representation of the packet sent by the server diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp new file mode 100644 index 00000000..c72256fe --- /dev/null +++ b/src/servers/Scripts/common/GilShop.cpp @@ -0,0 +1,19 @@ +#include +#include + +class GilShop : public EventScript +{ +public: + GilShop() : EventScript( 0x00041 ) + {} + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto callback = [actorId]( Entity::Player& player, const Event::SceneResult& result ) + { + player.playGilShop( actorId, result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA ); + }; + + player.playScene( eventId, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, 0, 2, callback ); + } +}; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 33dc78f5..276610c2 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -58,6 +58,8 @@ public: /*! play a subevent */ void playScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); + void playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ); + void directorPlayScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam3, uint32_t eventParam4, uint32_t eventParam5 = 0 ); /*! play a subevent */ diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 243474e0..1d877b10 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -133,6 +133,26 @@ void Core::Entity::Player::playScene( uint32_t eventId, uint32_t scene, playScene( eventId, scene, flags, eventParam2, eventParam3, 0, eventCallback ); } +void Core::Entity::Player::playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ) +{ + auto pEvent = getEvent( eventId ); + if( !pEvent ) + { + auto pLog = g_fw.get< Logger >(); + pLog->error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); + return; + } + + auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventOpenGilShop >( getId() ); + openGilShopPacket->data().eventId = eventId; + openGilShopPacket->data().sceneFlags = flags; + openGilShopPacket->data().actorId = actorId; + + openGilShopPacket->data().scene = 10; + + queuePacket( openGilShopPacket ); +} + Core::Event::EventHandlerPtr Core::Entity::Player::bootstrapSceneEvent( uint32_t eventId, uint32_t flags ) { if( flags & 0x02 ) diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index 78424df8..fe87b6a4 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -182,6 +182,10 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI if( !aetherInfo->isAetheryte ) scriptId = EVENTSCRIPT_AETHERNET_ID; } + else if( eventType == Event::EventHandler::EventHandlerType::Shop ) + { + scriptId = 0x00041; + } auto script = m_nativeScriptMgr->getScript< EventScript >( scriptId ); if( !script ) From 9ab7d5c68a001c757c8de6a50251112e1dd4ed59 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 23:20:12 +1000 Subject: [PATCH 148/199] somewhat working gilshops --- .../Network/PacketDef/Zone/ClientZoneDef.h | 2 ++ src/servers/Scripts/common/GilShop.cpp | 32 +++++++++++++++---- src/servers/sapphire_zone/Actor/Player.h | 3 +- .../sapphire_zone/Actor/PlayerEvent.cpp | 13 ++++---- .../sapphire_zone/Event/EventHandler.h | 1 + .../Network/Handlers/EventHandlers.cpp | 2 ++ 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 6963493b..8ebca6f9 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -65,6 +65,8 @@ struct FFXIVIpcEventHandlerReturn : FFXIVIpcBasePacket< ReturnEventHandler > /* 0008 */ uint16_t param2; /* 000A */ char pad_000A[2]; /* 000C */ uint16_t param3; + /* 000E */ char pad_000E[2]; + /* 0010 */ uint16_t tradeQuantity; }; struct FFXIVIpcEnterTerritoryHandler : FFXIVIpcBasePacket< EnterTeriEventHandler > diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp index c72256fe..bcf67844 100644 --- a/src/servers/Scripts/common/GilShop.cpp +++ b/src/servers/Scripts/common/GilShop.cpp @@ -7,13 +7,33 @@ public: GilShop() : EventScript( 0x00041 ) {} + constexpr static auto SCENE_FLAGS = HIDE_HOTBAR | NO_DEFAULT_CAMERA; + + static void shopInteractionCallback( Entity::Player& player, const Event::SceneResult& result ) + { + // item purchase + if( result.param1 == 768 ) + { + //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); + + player.sendDebug("got tradeQuantity: " + std::to_string( result.tradeQuantity ) ); + player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); + return; + } + + // exit + player.playScene( result.eventId, 255, SCENE_FLAGS ); + } + + static void shopCallback( Entity::Player& player, const Event::SceneResult& result ) + { + //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); + + player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); + } + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto callback = [actorId]( Entity::Player& player, const Event::SceneResult& result ) - { - player.playGilShop( actorId, result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA ); - }; - - player.playScene( eventId, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, 0, 2, callback ); + player.playScene( eventId, 0, SCENE_FLAGS, 0, 2, shopCallback ); } }; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 276610c2..1ea9aec1 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -58,7 +58,8 @@ public: /*! play a subevent */ void playScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); - void playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ); + void playGilShop( uint32_t eventId, uint32_t flags, + Event::EventHandler::SceneReturnCallback eventCallback ); void directorPlayScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam3, uint32_t eventParam4, uint32_t eventParam5 = 0 ); diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 1d877b10..d8cbf1f7 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -133,20 +133,19 @@ void Core::Entity::Player::playScene( uint32_t eventId, uint32_t scene, playScene( eventId, scene, flags, eventParam2, eventParam3, 0, eventCallback ); } -void Core::Entity::Player::playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ) +void Core::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, + Event::EventHandler::SceneReturnCallback eventCallback ) { - auto pEvent = getEvent( eventId ); + auto pEvent = bootstrapSceneEvent( eventId, flags ); if( !pEvent ) - { - auto pLog = g_fw.get< Logger >(); - pLog->error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); return; - } + + pEvent->setEventReturnCallback( eventCallback ); auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventOpenGilShop >( getId() ); openGilShopPacket->data().eventId = eventId; openGilShopPacket->data().sceneFlags = flags; - openGilShopPacket->data().actorId = actorId; + openGilShopPacket->data().actorId = getId(); openGilShopPacket->data().scene = 10; diff --git a/src/servers/sapphire_zone/Event/EventHandler.h b/src/servers/sapphire_zone/Event/EventHandler.h index 87a29c8d..c6e94105 100644 --- a/src/servers/sapphire_zone/Event/EventHandler.h +++ b/src/servers/sapphire_zone/Event/EventHandler.h @@ -12,6 +12,7 @@ namespace Core { uint16_t param1; uint16_t param2; uint16_t param3; + uint16_t tradeQuantity; }; class EventHandler diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 801ab2b7..27a165bd 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -203,6 +203,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ const auto& param1 = packet.data().param1; const auto& param2 = packet.data().param2; const auto& param3 = packet.data().param3; + const auto& tradeQuantity = packet.data().tradeQuantity; std::string eventName = Event::getEventName( eventId ); @@ -228,6 +229,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ result.param1 = param1; result.param2 = param2; result.param3 = param3; + result.tradeQuantity = tradeQuantity; eventCallback( player, result ); } // we might have a scene chain callback instead so check for that too From b8871519fef83cbadf984642e408d160441f9247 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 23:32:16 +1000 Subject: [PATCH 149/199] minor refactoring --- src/common/Network/PacketDef/Zone/ClientZoneDef.h | 2 +- src/servers/Scripts/common/GilShop.cpp | 2 +- src/servers/sapphire_zone/Event/EventHandler.h | 2 +- src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 8ebca6f9..3b77195f 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -66,7 +66,7 @@ struct FFXIVIpcEventHandlerReturn : FFXIVIpcBasePacket< ReturnEventHandler > /* 000A */ char pad_000A[2]; /* 000C */ uint16_t param3; /* 000E */ char pad_000E[2]; - /* 0010 */ uint16_t tradeQuantity; + /* 0010 */ uint16_t param4; }; struct FFXIVIpcEnterTerritoryHandler : FFXIVIpcBasePacket< EnterTeriEventHandler > diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp index bcf67844..f496074d 100644 --- a/src/servers/Scripts/common/GilShop.cpp +++ b/src/servers/Scripts/common/GilShop.cpp @@ -16,7 +16,7 @@ public: { //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); - player.sendDebug("got tradeQuantity: " + std::to_string( result.tradeQuantity ) ); + player.sendDebug("got tradeQuantity: " + std::to_string( result.param4 ) ); player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); return; } diff --git a/src/servers/sapphire_zone/Event/EventHandler.h b/src/servers/sapphire_zone/Event/EventHandler.h index c6e94105..8821d6c5 100644 --- a/src/servers/sapphire_zone/Event/EventHandler.h +++ b/src/servers/sapphire_zone/Event/EventHandler.h @@ -12,7 +12,7 @@ namespace Core { uint16_t param1; uint16_t param2; uint16_t param3; - uint16_t tradeQuantity; + uint16_t param4; }; class EventHandler diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 27a165bd..69d2dd57 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -203,7 +203,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ const auto& param1 = packet.data().param1; const auto& param2 = packet.data().param2; const auto& param3 = packet.data().param3; - const auto& tradeQuantity = packet.data().tradeQuantity; + const auto& param4 = packet.data().param4; std::string eventName = Event::getEventName( eventId ); @@ -229,7 +229,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ result.param1 = param1; result.param2 = param2; result.param3 = param3; - result.tradeQuantity = tradeQuantity; + result.param4 = param4; eventCallback( player, result ); } // we might have a scene chain callback instead so check for that too From 5ac4573bd317a19e05eeb4391a388d3e7eb8d4f9 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Mon, 23 Jul 2018 00:05:44 +1000 Subject: [PATCH 150/199] gilshops now work using the proper packet --- src/servers/Scripts/common/GilShop.cpp | 33 ++++++++++++------- .../sapphire_zone/Actor/PlayerEvent.cpp | 2 ++ .../sapphire_zone/Script/ScriptMgr.cpp | 3 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp index f496074d..8ff007f4 100644 --- a/src/servers/Scripts/common/GilShop.cpp +++ b/src/servers/Scripts/common/GilShop.cpp @@ -4,20 +4,36 @@ class GilShop : public EventScript { public: - GilShop() : EventScript( 0x00041 ) + GilShop() : EventScript( 0x00040001 ) {} constexpr static auto SCENE_FLAGS = HIDE_HOTBAR | NO_DEFAULT_CAMERA; + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + player.playScene( eventId, 0, SCENE_FLAGS, 0, 2, shopCallback ); + } + +private: static void shopInteractionCallback( Entity::Player& player, const Event::SceneResult& result ) { // item purchase if( result.param1 == 768 ) { - //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); + // buy + if( result.param2 == 1 ) + { - player.sendDebug("got tradeQuantity: " + std::to_string( result.param4 ) ); - player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); + } + + // sell + else if( result.param2 == 2 ) + { + + } + + player.sendDebug( "got tradeQuantity: " + std::to_string( result.param4 ) ); + player.playGilShop( result.eventId, SCENE_FLAGS, shopInteractionCallback ); return; } @@ -27,13 +43,6 @@ public: static void shopCallback( Entity::Player& player, const Event::SceneResult& result ) { - //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); - - player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); - } - - void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override - { - player.playScene( eventId, 0, SCENE_FLAGS, 0, 2, shopCallback ); + player.playGilShop( result.eventId, SCENE_FLAGS, shopInteractionCallback ); } }; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index d8cbf1f7..61d7e06c 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -140,7 +140,9 @@ void Core::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, if( !pEvent ) return; + pEvent->setPlayedScene( true ); pEvent->setEventReturnCallback( eventCallback ); + pEvent->setSceneChainCallback( nullptr ); auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventOpenGilShop >( getId() ); openGilShopPacket->data().eventId = eventId; diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index fe87b6a4..f9ca9890 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -174,6 +174,7 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI uint16_t eventType = eventId >> 16; uint32_t scriptId = eventId; + // todo: replace this shit with something more flexible allowing for handlers for an entire type without a bunch of if statements // aethernet/aetherytes need to be handled separately if( eventType == Event::EventHandler::EventHandlerType::Aetheryte ) { @@ -184,7 +185,7 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI } else if( eventType == Event::EventHandler::EventHandlerType::Shop ) { - scriptId = 0x00041; + scriptId = 0x00040001; } auto script = m_nativeScriptMgr->getScript< EventScript >( scriptId ); From 31915f9feeeab391cd14a54245f95c7d957f1068 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 24 Jul 2018 22:22:19 +1000 Subject: [PATCH 151/199] doxygen doco generation + some documentation for script system --- .gitignore | 5 +- doxygen/Doxyfile | 2494 +++++++++++++++++ doxygen/extra_stylesheet.css | 0 doxygen/logo.png | Bin 0 -> 5996 bytes src/common/Network/CommonActorControl.h | 5 + .../sapphire_zone/Script/NativeScriptApi.h | 74 + .../sapphire_zone/Script/ScriptLoader.cpp | 3 - .../sapphire_zone/Script/ScriptLoader.h | 51 +- 8 files changed, 2626 insertions(+), 6 deletions(-) create mode 100644 doxygen/Doxyfile create mode 100644 doxygen/extra_stylesheet.css create mode 100644 doxygen/logo.png diff --git a/.gitignore b/.gitignore index 7bb065de..5e4101df 100644 --- a/.gitignore +++ b/.gitignore @@ -120,4 +120,7 @@ cotire/ *_cotire.cmake *objects.txt -*exports.def \ No newline at end of file +*exports.def + +# doxygen output folder +doxygen/generated/ \ No newline at end of file diff --git a/doxygen/Doxyfile b/doxygen/Doxyfile new file mode 100644 index 00000000..21be557f --- /dev/null +++ b/doxygen/Doxyfile @@ -0,0 +1,2494 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Sapphire" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "A FINAL FANTASY XIV Server Emulator" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = logo.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = YES + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 3 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = ../src/servers ../src/common + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = ../src/servers/Scripts + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = generated/ + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = extra_stylesheet.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /