From 484657f10299fa7c977bbd64d3ee1214db7e38f0 Mon Sep 17 00:00:00 2001 From: collett Date: Fri, 24 Apr 2020 19:24:04 +0900 Subject: [PATCH] JobGauge definition --- src/common/Common.h | 212 +++++++++++++++++- src/world/Actor/Player.cpp | 25 +++ src/world/Actor/Player.h | 8 + src/world/Manager/DebugCommandMgr.cpp | 10 + src/world/Network/Handlers/PacketHandlers.cpp | 3 + 5 files changed, 252 insertions(+), 6 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 3e25a2dd..927b4f01 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -583,13 +583,19 @@ namespace Sapphire::Common TacticsPoints = 5, StatusEffect = 10, WARGauge = 22, -// DRKGauge = 25, -// AetherflowStack = 30, -// Status = 32, + DRKGauge = 25, + // AetherflowStack = 30, + // Status = 32, + SAMKenki = 39, + SAMSen = 40, PLDGauge = 41, -// RDMGaugeBoth = 74, -//// RDMGaugeBlack = 75, // not right? -// DRGGauge3Eyes = 76, + GNBAmmo = 55, + WHMBloodLily = 56, + WHMLily = 57, + SAMMeditation = 63, + // RDMGaugeBoth = 74, + //// RDMGaugeBlack = 75, // not right? + // DRGGauge3Eyes = 76, }; enum class AttackType : int8_t @@ -1027,6 +1033,200 @@ namespace Sapphire::Common Gatherer }; + enum class AstCardType : uint8_t + { + None = 0, + Balance = 1, + Bole = 2, + Arrow = 3, + Spear = 4, + Ewer = 5, + Spire = 6, + Lord = 0x70, + Lady = 0x80, + }; + + enum class AstSealType : uint8_t + { + None = 0, + Sun = 1, + Moon = 2, + Celestrial = 3, + }; + + enum class DrgState : uint8_t + { + None = 0, + BloodOfTheDragon = 1, + LifeOfTheDragon = 2, + }; + + enum class SamSen : uint8_t + { + None = 0, + Setsu = 1, + Getsu = 2, + Ka = 4, + }; + + enum class SchDismissedFairy : uint8_t + { + None = 0, + Eos = 6, + Selene = 7, + }; + + enum class SmnPet : uint8_t + { + None = 0, + Ifrit = 3, + Titan = 4, + Garuda = 5, + }; + + enum class SmnPetGlam : uint8_t + { + None = 0, + Emerald = 1, + Topaz = 2, + Ruby = 3, + }; + + enum class BrdSong : uint8_t + { + Mage = 5, + Army = 0x0A, + Wanderer = 0x0F, + }; + + union JobGauge + { + struct + { + uint8_t gauge_data[15]; + } _raw; + + struct + { + uint32_t unused; + AstCardType card; + AstSealType seals[3]; + } ast; + struct + { + uint16_t timeUntilNextPolyglot; + uint16_t elementTimer; + uint8_t elementStance; + uint8_t umbralhearts; + uint8_t polyglotStacks; + uint8_t enochainState; + } blm; + struct + { + uint16_t songTimer; + uint8_t songStacks; + uint8_t unused; + BrdSong song; + } brd; + struct + { + uint8_t feathers; + uint8_t esprit; + uint8_t stepOrder[4]; + uint8_t completeSteps; + } dnc; + struct + { + uint16_t dragonTimer; + DrgState dragonState; + uint8_t eyes; + } drg; + struct + { + uint8_t blood; + uint8_t unused; + uint16_t darksideTimer; + uint8_t darkArts; + uint8_t unused2; + uint16_t shadowTimer; + } drk; + struct + { + uint8_t ammo; + uint8_t unused; + uint16_t maxTimerDuration; + uint8_t ammoComboStep; + } gnb; + struct + { + uint16_t overheatTimer; + uint16_t robotTimer; + uint8_t heat; + uint8_t battery; + uint8_t lastRobotBatteryPower; + uint8_t activeTimerFlag; + } mch; + struct + { + uint8_t greasedLightningTimer; + uint8_t unused; + uint8_t greasedLightningStacks; + uint8_t chakra; + uint8_t greasedLightningTimerFreezed; + } mnk; + struct + { + uint32_t hutonTimer; + uint8_t tenChiJinMudrasUsed; + uint8_t ninki; + uint8_t hutonManualCasts; + } nin; + struct + { + uint8_t oathGauge; + } pld; + struct + { + uint8_t whiteGauge; + uint8_t blackGauge; + } rdm; + struct + { + uint16_t unused; + uint8_t unused2; + uint8_t kenki; + uint8_t meditationStacks; + SamSen sen; + } sam; + struct + { + uint16_t unused; + uint8_t aetherflowStacks; + uint8_t fairyGauge; + uint16_t seraphTimer; + SchDismissedFairy dismissedFairy; + } sch; + struct + { + uint16_t timer; + SmnPet returnSummon; + SmnPetGlam petGlam; + uint8_t stacks; + } smn; + + struct + { + uint8_t beastGauge; + } war; + struct + { + uint16_t unused; + uint16_t lilyTimer; + uint8_t lilies; + uint8_t bloodLilies; + } whm; + }; + using PlayerStateFlagList = std::vector< PlayerStateFlag >; } diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 6c5b0b88..07b12743 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -106,6 +106,8 @@ Sapphire::Entity::Player::Player() : m_objSpawnIndexAllocator.init( MAX_DISPLAYED_EOBJS ); m_actorSpawnIndexAllocator.init( MAX_DISPLAYED_ACTORS, true ); + + gaugeClear(); } Sapphire::Entity::Player::~Player() @@ -866,6 +868,9 @@ void Sapphire::Entity::Player::setClassJob( Common::ClassJob classJob ) sendToInRangeSet( makeActorControl( getId(), ClassJobChange, 0x04 ), true ); sendStatusUpdate(); + + gaugeClear(); + sendActorGauge(); } void Sapphire::Entity::Player::setLevel( uint8_t level ) @@ -2236,3 +2241,23 @@ bool Sapphire::Entity::Player::checkAction() return true; } + +void Sapphire::Entity::Player::gaugeClear() +{ + std::memset( &m_gauge, 0, sizeof( m_gauge ) ); +} + +void Sapphire::Entity::Player::sendActorGauge() +{ + auto pPacket = makeZonePacket< FFXIVIpcActorGauge >( getId() ); + pPacket->data().classJobId = static_cast< uint8_t >( getClass() ); + std::memcpy( pPacket->data().data, &m_gauge, 15 ); + + queuePacket( pPacket ); +} + +void Sapphire::Entity::Player::gaugeSetRaw( uint8_t* pData ) +{ + std::memcpy( &m_gauge, pData, 15 ); + sendActorGauge(); +} \ No newline at end of file diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index cd8fb307..72325649 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -974,6 +974,12 @@ namespace Sapphire::Entity Sapphire::ItemPtr dropInventoryItem( Common::InventoryType type, uint16_t slotId ); + // Job UI + ////////////////////////////////////////////////////////////////////////////////////////////////////// + void gaugeClear(); + void sendActorGauge(); + void gaugeSetRaw( uint8_t* pData ); + ////////////////////////////////////////////////////////////////////////////////////////////////////// Common::HuntingLogEntry& getHuntingLogEntry( uint8_t index ); @@ -1086,6 +1092,8 @@ namespace Sapphire::Entity bool m_bLoadingComplete; bool m_bAutoattack; + Common::JobGauge m_gauge; + Common::ZoneingType m_zoningType; uint32_t m_territoryId; diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 142c838c..612ab4f9 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -361,6 +361,16 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& } } } + else if( subCommand == "gauge" ) + { + uint8_t values[15]; + std::memset( values, 0, sizeof( values ) ); + sscanf( params.c_str(), "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", + &values[ 0 ], &values[ 1 ], &values[ 2 ], &values[ 3 ], &values[ 4 ], + &values[ 5 ], &values[ 6 ], &values[ 7 ], &values[ 8 ], &values[ 9 ], + &values[ 10 ], &values[ 11 ], &values[ 12 ], &values[ 13 ], &values[ 14 ] ); + player.gaugeSetRaw( values ); + } else if( subCommand == "visual" ) { int32_t id; diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 9346eb21..53584fd8 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -412,6 +412,9 @@ void Sapphire::Network::GameConnection::finishLoadingHandler( const Packets::FFX // spawn the player for himself player.spawn( player.getAsPlayer() ); + player.gaugeClear(); + player.sendActorGauge(); + // notify the zone of a change in position to force an "inRangeActor" update player.getCurrentTerritory()->updateActorPosition( player ); }