1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-26 06:27:45 +00:00

JobGauge definition

This commit is contained in:
collett 2020-04-24 19:24:04 +09:00
parent ed88ad81c1
commit 484657f102
5 changed files with 252 additions and 6 deletions

View file

@ -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 >;
}

View file

@ -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();
}

View file

@ -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;

View file

@ -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;

View file

@ -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 );
}