mirror of
https://github.com/EQEmu/Server.git
synced 2026-02-15 20:12:24 +00:00
Okay timers now work right, for real this time
This commit is contained in:
parent
33b6748c1b
commit
c445f63186
@ -1143,10 +1143,13 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) {
|
|||||||
SendAlternateAdvancementTimer(rank->spell_type, 0, 0);
|
SendAlternateAdvancementTimer(rank->spell_type, 0, 0);
|
||||||
ExpendAlternateAdvancementCharge(ability->id);
|
ExpendAlternateAdvancementCharge(ability->id);
|
||||||
} else {
|
} else {
|
||||||
if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, 1, nullptr, ability->id)) {
|
if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, nullptr, rank->id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CastToClient()->GetPTimers().Start(rank->spell_type + pTimerAAStart, cooldown);
|
||||||
|
SendAlternateAdvancementTimer(rank->spell_type, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) {
|
int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) {
|
||||||
|
|||||||
@ -790,7 +790,7 @@ bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot, int cast_time, in
|
|||||||
int16 res = resist_adjust;
|
int16 res = resist_adjust;
|
||||||
|
|
||||||
return self->CastSpell(spell_id, target_id, slot, cast_time, mana_cost, nullptr, static_cast<uint32>(item_slot),
|
return self->CastSpell(spell_id, target_id, slot, cast_time, mana_cost, nullptr, static_cast<uint32>(item_slot),
|
||||||
static_cast<uint32>(timer), static_cast<uint32>(timer_duration), 0, &res);
|
static_cast<uint32>(timer), static_cast<uint32>(timer_duration), &res);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target) {
|
bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target) {
|
||||||
|
|||||||
@ -307,7 +307,6 @@ Mob::Mob(const char* in_name,
|
|||||||
casting_spell_id = 0;
|
casting_spell_id = 0;
|
||||||
casting_spell_timer = 0;
|
casting_spell_timer = 0;
|
||||||
casting_spell_timer_duration = 0;
|
casting_spell_timer_duration = 0;
|
||||||
casting_spell_type = 0;
|
|
||||||
casting_spell_inventory_slot = 0;
|
casting_spell_inventory_slot = 0;
|
||||||
casting_spell_aa_id = 0;
|
casting_spell_aa_id = 0;
|
||||||
target = 0;
|
target = 0;
|
||||||
|
|||||||
@ -222,11 +222,11 @@ public:
|
|||||||
virtual void SpellProcess();
|
virtual void SpellProcess();
|
||||||
virtual bool CastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1,
|
virtual bool CastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1,
|
||||||
int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF,
|
int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF,
|
||||||
uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, uint32 type = 0, int16 *resist_adjust = nullptr,
|
uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, int16 *resist_adjust = nullptr,
|
||||||
uint32 aa_id = 0);
|
uint32 aa_id = 0);
|
||||||
virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot = 10, int32 casttime = -1,
|
virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot = 10, int32 casttime = -1,
|
||||||
int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF,
|
int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF,
|
||||||
uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, uint32 type = 0, int16 resist_adjust = 0,
|
uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, int16 resist_adjust = 0,
|
||||||
uint32 aa_id = 0);
|
uint32 aa_id = 0);
|
||||||
void CastedSpellFinished(uint16 spell_id, uint32 target_id, uint16 slot, uint16 mana_used,
|
void CastedSpellFinished(uint16 spell_id, uint32 target_id, uint16 slot, uint16 mana_used,
|
||||||
uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0);
|
uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0);
|
||||||
|
|||||||
@ -342,7 +342,7 @@ bool NPC::AIDoSpellCast(uint8 i, Mob* tar, int32 mana_cost, uint32* oDontDoAgain
|
|||||||
SetCurrentSpeed(0);
|
SetCurrentSpeed(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CastSpell(AIspells[i].spellid, tar->GetID(), 1, AIspells[i].manacost == -2 ? 0 : -1, mana_cost, oDontDoAgainBefore, -1, -1, 0, 0, &(AIspells[i].resist_adjust));
|
return CastSpell(AIspells[i].spellid, tar->GetID(), 1, AIspells[i].manacost == -2 ? 0 : -1, mana_cost, oDontDoAgainBefore, -1, -1, 0, &(AIspells[i].resist_adjust));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EntityList::AICheckCloseBeneficialSpells(NPC* caster, uint8 iChance, float iRange, uint16 iSpellTypes) {
|
bool EntityList::AICheckCloseBeneficialSpells(NPC* caster, uint8 iChance, float iRange, uint16 iSpellTypes) {
|
||||||
|
|||||||
@ -3998,9 +3998,9 @@ XS(XS_Mob_CastSpell)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (resist_adjust == 0)//If you do not pass resist adjust as nullptr it will ignore the spells default resist adjust
|
if (resist_adjust == 0)//If you do not pass resist adjust as nullptr it will ignore the spells default resist adjust
|
||||||
THIS->CastSpell(spell_id, target_id, slot, casttime, mana_cost, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0);
|
THIS->CastSpell(spell_id, target_id, slot, casttime, mana_cost, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0);
|
||||||
else
|
else
|
||||||
THIS->CastSpell(spell_id, target_id, slot, casttime, mana_cost, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0, &resist_adjust);
|
THIS->CastSpell(spell_id, target_id, slot, casttime, mana_cost, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, &resist_adjust);
|
||||||
}
|
}
|
||||||
XSRETURN_EMPTY;
|
XSRETURN_EMPTY;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -146,7 +146,7 @@ void NPC::SpellProcess()
|
|||||||
// to allow procs to work
|
// to allow procs to work
|
||||||
bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot,
|
bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot,
|
||||||
int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot,
|
int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot,
|
||||||
uint32 timer, uint32 timer_duration, uint32 type, int16 *resist_adjust,
|
uint32 timer, uint32 timer_duration, int16 *resist_adjust,
|
||||||
uint32 aa_id)
|
uint32 aa_id)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "CastSpell called for spell %s (%d) on entity %d, slot %d, time %d, mana %d, from item slot %d",
|
Log.Out(Logs::Detail, Logs::Spells, "CastSpell called for spell %s (%d) on entity %d, slot %d, time %d, mana %d, from item slot %d",
|
||||||
@ -319,11 +319,11 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot,
|
|||||||
|
|
||||||
if(resist_adjust)
|
if(resist_adjust)
|
||||||
{
|
{
|
||||||
return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, *resist_adjust, aa_id));
|
return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, *resist_adjust, aa_id));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, spells[spell_id].ResistDiff, aa_id));
|
return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, spells[spell_id].ResistDiff, aa_id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,7 +337,7 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot,
|
|||||||
//
|
//
|
||||||
bool Mob::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot,
|
bool Mob::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot,
|
||||||
int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish,
|
int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish,
|
||||||
uint32 item_slot, uint32 timer, uint32 timer_duration, uint32 type,
|
uint32 item_slot, uint32 timer, uint32 timer_duration,
|
||||||
int16 resist_adjust, uint32 aa_id)
|
int16 resist_adjust, uint32 aa_id)
|
||||||
{
|
{
|
||||||
Mob* pMob = nullptr;
|
Mob* pMob = nullptr;
|
||||||
@ -363,7 +363,6 @@ bool Mob::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot,
|
|||||||
casting_spell_timer_duration = timer_duration;
|
casting_spell_timer_duration = timer_duration;
|
||||||
}
|
}
|
||||||
casting_spell_aa_id = aa_id;
|
casting_spell_aa_id = aa_id;
|
||||||
casting_spell_type = type;
|
|
||||||
|
|
||||||
SaveSpellLoc();
|
SaveSpellLoc();
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Casting %d Started at (%.3f,%.3f,%.3f)", spell_id, m_SpellLocation.x, m_SpellLocation.y, m_SpellLocation.z);
|
Log.Out(Logs::Detail, Logs::Spells, "Casting %d Started at (%.3f,%.3f,%.3f)", spell_id, m_SpellLocation.x, m_SpellLocation.y, m_SpellLocation.z);
|
||||||
@ -785,7 +784,6 @@ void Mob::ZeroCastingVars()
|
|||||||
casting_spell_inventory_slot = 0;
|
casting_spell_inventory_slot = 0;
|
||||||
casting_spell_timer = 0;
|
casting_spell_timer = 0;
|
||||||
casting_spell_timer_duration = 0;
|
casting_spell_timer_duration = 0;
|
||||||
casting_spell_type = 0;
|
|
||||||
casting_spell_resist_adjust = 0;
|
casting_spell_resist_adjust = 0;
|
||||||
casting_spell_checks = false;
|
casting_spell_checks = false;
|
||||||
casting_spell_aa_id = 0;
|
casting_spell_aa_id = 0;
|
||||||
@ -819,6 +817,15 @@ void Mob::InterruptSpell(uint16 message, uint16 color, uint16 spellid)
|
|||||||
CastToNPC()->AI_Event_SpellCastFinished(false, casting_spell_slot);
|
CastToNPC()->AI_Event_SpellCastFinished(false, casting_spell_slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(casting_spell_aa_id && IsClient()) { //Rest AA Timer on failed cast
|
||||||
|
AA::Rank *rank = zone->GetAlternateAdvancementRank(casting_spell_aa_id);
|
||||||
|
if(rank) {
|
||||||
|
CastToClient()->SendAlternateAdvancementTimer(rank->spell_type, 0, 0x7fffffff);
|
||||||
|
CastToClient()->Message_StringID(15, ABILITY_FAILED);
|
||||||
|
CastToClient()->GetPTimers().Clear(&database, rank->spell_type + pTimerAAStart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ZeroCastingVars(); // resets all the state keeping stuff
|
ZeroCastingVars(); // resets all the state keeping stuff
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Spell %d has been interrupted.", spellid);
|
Log.Out(Logs::Detail, Logs::Spells, "Spell %d has been interrupted.", spellid);
|
||||||
@ -2075,7 +2082,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16
|
|||||||
else if(!SpellOnTarget(spell_id, spell_target, false, true, resist_adjust, false, level_override)) {
|
else if(!SpellOnTarget(spell_id, spell_target, false, true, resist_adjust, false, level_override)) {
|
||||||
if(IsBuffSpell(spell_id) && IsBeneficialSpell(spell_id)) {
|
if(IsBuffSpell(spell_id) && IsBeneficialSpell(spell_id)) {
|
||||||
// Prevent mana usage/timers being set for beneficial buffs
|
// Prevent mana usage/timers being set for beneficial buffs
|
||||||
if(casting_spell_type == 1)
|
if(casting_spell_aa_id)
|
||||||
InterruptSpell();
|
InterruptSpell();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2271,14 +2278,18 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16
|
|||||||
//set our reuse timer on long ass reuse_time spells...
|
//set our reuse timer on long ass reuse_time spells...
|
||||||
if(IsClient() && !isproc)
|
if(IsClient() && !isproc)
|
||||||
{
|
{
|
||||||
if(spell_id == casting_spell_id && casting_spell_timer != 0xFFFFFFFF)
|
if(casting_spell_aa_id) {
|
||||||
|
AA::Rank *rank = zone->GetAlternateAdvancementRank(casting_spell_aa_id);
|
||||||
|
|
||||||
|
if(rank && rank->base_ability) {
|
||||||
|
ExpendAlternateAdvancementCharge(rank->base_ability->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(spell_id == casting_spell_id && casting_spell_timer != 0xFFFFFFFF)
|
||||||
{
|
{
|
||||||
//aa new todo: aa expendable charges here
|
//aa new todo: aa expendable charges here
|
||||||
CastToClient()->GetPTimers().Start(casting_spell_timer, casting_spell_timer_duration);
|
CastToClient()->GetPTimers().Start(casting_spell_timer, casting_spell_timer_duration);
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting custom reuse timer %d to %d", spell_id, casting_spell_timer, casting_spell_timer_duration);
|
Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting custom reuse timer %d to %d", spell_id, casting_spell_timer, casting_spell_timer_duration);
|
||||||
if(casting_spell_aa_id) {
|
|
||||||
CastToClient()->SendAlternateAdvancementTimer(casting_spell_timer - pTimerAAStart, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if(spells[spell_id].recast_time > 1000 && !spells[spell_id].IsDisciplineBuff) {
|
else if(spells[spell_id].recast_time > 1000 && !spells[spell_id].IsDisciplineBuff) {
|
||||||
int recast = spells[spell_id].recast_time/1000;
|
int recast = spells[spell_id].recast_time/1000;
|
||||||
@ -2297,10 +2308,6 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16
|
|||||||
Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting long reuse timer to %d s (orig %d)", spell_id, recast, spells[spell_id].recast_time);
|
Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting long reuse timer to %d s (orig %d)", spell_id, recast, spells[spell_id].recast_time);
|
||||||
CastToClient()->GetPTimers().Start(pTimerSpellStart + spell_id, recast);
|
CastToClient()->GetPTimers().Start(pTimerSpellStart + spell_id, recast);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(casting_spell_aa_id) {
|
|
||||||
ExpendAlternateAdvancementCharge(casting_spell_aa_id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IsClient() && ((slot == USE_ITEM_SPELL_SLOT) || (slot == POTION_BELT_SPELL_SLOT) || (slot == TARGET_RING_SPELL_SLOT)))
|
if(IsClient() && ((slot == USE_ITEM_SPELL_SLOT) || (slot == POTION_BELT_SPELL_SLOT) || (slot == TARGET_RING_SPELL_SLOT)))
|
||||||
@ -3758,7 +3765,7 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r
|
|||||||
// if SpellEffect returned false there's a problem applying the
|
// if SpellEffect returned false there's a problem applying the
|
||||||
// spell. It's most likely a buff that can't stack.
|
// spell. It's most likely a buff that can't stack.
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Spell %d could not apply its effects %s -> %s\n", spell_id, GetName(), spelltar->GetName());
|
Log.Out(Logs::Detail, Logs::Spells, "Spell %d could not apply its effects %s -> %s\n", spell_id, GetName(), spelltar->GetName());
|
||||||
if(casting_spell_type != 1) // AA is handled differently
|
if(casting_spell_aa_id)
|
||||||
Message_StringID(MT_SpellFailure, SPELL_NO_HOLD);
|
Message_StringID(MT_SpellFailure, SPELL_NO_HOLD);
|
||||||
safe_delete(action_packet);
|
safe_delete(action_packet);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user