1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-25 19:17:45 +00:00

some sam stuff

This commit is contained in:
collett 2020-04-11 04:29:50 +09:00
parent e265ce98e9
commit b55e44c0db
8 changed files with 91 additions and 4 deletions

View file

@ -586,6 +586,7 @@ namespace Sapphire::Common
DRKGauge = 25,
// AetherflowStack = 30,
// Status = 32,
SAMKenki = 39,
PLDGauge = 41,
GNBAmmo = 55,
WHMBloodLily = 56,
@ -1049,6 +1050,7 @@ namespace Sapphire::Common
InstantCast = 13,
BlockParryRateBonus = 14,
MPRestorePerGCD = 15,
AlwaysCombo = 16,
};
enum class ActionTypeFilter : int32_t

View file

@ -54,7 +54,8 @@ Action::Action::Action( Entity::CharaPtr caster, uint32_t actionId, uint16_t seq
m_sequence( sequence ),
m_isAutoAttack( false ),
m_disableGenericHandler( false ),
m_started( false )
m_started( false ),
m_shouldAlwaysCombo( false )
{
}
@ -799,6 +800,9 @@ void Action::Action::setAdditionalData( uint32_t data )
bool Action::Action::isCorrectCombo() const
{
if( m_shouldAlwaysCombo )
return true;
auto lastActionId = m_pSource->getLastComboActionId();
if( lastActionId == 0 )
@ -814,6 +818,11 @@ bool Action::Action::isComboAction() const
return m_actionData->actionCombo != 0;
}
void Sapphire::World::Action::Action::setAlwaysCombo()
{
m_shouldAlwaysCombo = true;
}
bool Action::Action::primaryCostCheck( bool subtractCosts )
{
switch( m_primaryCostType )
@ -969,6 +978,23 @@ bool Action::Action::primaryCostCheck( bool subtractCosts )
return false;
}
case Common::ActionPrimaryCostType::SAMKenki:
{
auto pPlayer = m_pSource->getAsPlayer();
if( pPlayer )
{
auto kenki = pPlayer->gaugeSamGetKenki();
if( kenki >= m_primaryCost )
{
if( subtractCosts )
pPlayer->gaugeSamSetKenki( kenki - m_primaryCost );
return true;
}
}
return false;
}
// free casts, likely just pure ogcds
case Common::ActionPrimaryCostType::None:
{

View file

@ -52,6 +52,8 @@ namespace Sapphire::World::Action
bool isComboAction() const;
void setAlwaysCombo();
void setAutoAttack();
void disableGenericHandler();
@ -202,6 +204,7 @@ namespace Sapphire::World::Action
bool m_isAutoAttack;
bool m_disableGenericHandler;
bool m_started;
bool m_shouldAlwaysCombo;
Common::ActionInterruptType m_interruptType;

View file

@ -878,8 +878,8 @@ ActionLut::Lut ActionLut::m_actionLut =
{ 7480, { 100, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
//Meikyo Shisui, 明鏡止水
//applies to self: Meikyo Shisui, 明鏡止水, duration 15000, param 0
{ 7499, { 0, 0, 0, 0, 1233, 15000, 0, 0, 0, 0, 0, 0, 0 } },
//applies to self: Meikyo Shisui, 明鏡止水, duration 15000, param 3
{ 7499, { 0, 0, 0, 0, 1233, 15000, 3, 0, 0, 0, 0, 0, 0 } },
//Hissatsu: Kaiten, 必殺剣・回天
//applies to self: Kaiten, 必殺剣・回天, duration 10000, param 0
@ -3538,4 +3538,6 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable =
{ 1972, { 15, 2, 7392, 7391, 0 } },
{ 1233, { 16, 3, 0, 0, 0 } },
};

View file

@ -2448,3 +2448,17 @@ uint8_t Sapphire::Entity::Player::gaugeGnbGetComboStep()
{
return m_gauge.gnb.ammoComboStep;
}
void Sapphire::Entity::Player::gaugeSamSetKenki( uint8_t value )
{
assert( value >= 0 && value <= 100 );
auto oldValue = gaugeSamGetKenki();
m_gauge.sam.kenki = value;
if( oldValue != value )
sendActorGauge();
}
uint8_t Sapphire::Entity::Player::gaugeSamGetKenki()
{
return m_gauge.sam.kenki;
}

View file

@ -1006,6 +1006,9 @@ namespace Sapphire::Entity
void gaugeGnbSetComboStep( uint8_t value );
uint8_t gaugeGnbGetComboStep();
void gaugeSamSetKenki( uint8_t value );
uint8_t gaugeSamGetKenki();
//////////////////////////////////////////////////////////////////////////////////////////////////////
Common::HuntingLogEntry& getHuntingLogEntry( uint8_t index );

View file

@ -525,7 +525,7 @@ float CalcStats::autoAttack( const Sapphire::Entity::Chara& chara )
}
else
{
weaponDamage = chara.getLevel() * 10;
weaponDamage = chara.getLevel() * 3;
}
auto level = chara.getLevel();

View file

@ -299,6 +299,12 @@ void Sapphire::StatusEffect::StatusEffect::onBeforeActionStart( Sapphire::World:
}
if( m_effectEntry.effectValue1 > 0 )
{
// if stacks equal to remaining uses, assume it is synced
if( m_effectEntry.effectValue1 == m_param )
{
m_param--;
m_targetActor->sendStatusEffectUpdate();
}
m_effectEntry.effectValue1--;
if( m_effectEntry.effectValue1 == 0 )
{
@ -308,6 +314,37 @@ void Sapphire::StatusEffect::StatusEffect::onBeforeActionStart( Sapphire::World:
}
break;
}
case Common::StatusEffectType::AlwaysCombo:
{
if( action->isGCD() )
{
// value1: remaining uses
// value2-4: affected action ids, or all actions if value2 is 0
if( m_effectEntry.effectValue2 != 0 )
{
if( action->getId() != m_effectEntry.effectValue2 &&
action->getId() != m_effectEntry.effectValue3 &&
action->getId() != m_effectEntry.effectValue4 )
break;
}
if( m_effectEntry.effectValue1 > 0 )
{
// if stacks equal to remaining uses, assume it is synced
if( m_effectEntry.effectValue1 == m_param )
{
m_param--;
m_targetActor->sendStatusEffectUpdate();
}
m_effectEntry.effectValue1--;
if( m_effectEntry.effectValue1 == 0 )
{
markToRemove();
}
action->setAlwaysCombo();
}
break;
}
}
}
}