From c445f631869648dfad0bc716ef5a706f8a4ee3df Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 16 Jun 2015 23:41:46 -0700 Subject: [PATCH] Okay timers now work right, for real this time --- zone/aa.cpp | 5 ++++- zone/lua_mob.cpp | 2 +- zone/mob.cpp | 1 - zone/mob.h | 4 ++-- zone/mob_ai.cpp | 2 +- zone/perl_mob.cpp | 4 ++-- zone/spells.cpp | 39 +++++++++++++++++++++++---------------- 7 files changed, 33 insertions(+), 24 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index a99a81ada..21e1de1b2 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1143,10 +1143,13 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { SendAlternateAdvancementTimer(rank->spell_type, 0, 0); ExpendAlternateAdvancementCharge(ability->id); } 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; } } + + CastToClient()->GetPTimers().Start(rank->spell_type + pTimerAAStart, cooldown); + SendAlternateAdvancementTimer(rank->spell_type, 0, 0); } int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) { diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index f4d7d64cb..11124d50f 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -790,7 +790,7 @@ bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot, int cast_time, in int16 res = resist_adjust; return self->CastSpell(spell_id, target_id, slot, cast_time, mana_cost, nullptr, static_cast(item_slot), - static_cast(timer), static_cast(timer_duration), 0, &res); + static_cast(timer), static_cast(timer_duration), &res); } bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target) { diff --git a/zone/mob.cpp b/zone/mob.cpp index 35b0d62d2..4eb87f7ad 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -307,7 +307,6 @@ Mob::Mob(const char* in_name, casting_spell_id = 0; casting_spell_timer = 0; casting_spell_timer_duration = 0; - casting_spell_type = 0; casting_spell_inventory_slot = 0; casting_spell_aa_id = 0; target = 0; diff --git a/zone/mob.h b/zone/mob.h index 959c5e543..20ec928e7 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -222,11 +222,11 @@ public: virtual void SpellProcess(); 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, - 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); 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, - 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); void CastedSpellFinished(uint16 spell_id, uint32 target_id, uint16 slot, uint16 mana_used, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0); diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 650ba350c..fb6714087 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -342,7 +342,7 @@ bool NPC::AIDoSpellCast(uint8 i, Mob* tar, int32 mana_cost, uint32* oDontDoAgain 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) { diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index f5ef80a4c..80ca97484 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -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 - 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 - 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; } diff --git a/zone/spells.cpp b/zone/spells.cpp index 5002e8104..310e2bd01 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -146,7 +146,7 @@ void NPC::SpellProcess() // to allow procs to work bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 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) { 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) { - 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 { - 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, 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) { 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_aa_id = aa_id; - casting_spell_type = type; 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); @@ -785,7 +784,6 @@ void Mob::ZeroCastingVars() casting_spell_inventory_slot = 0; casting_spell_timer = 0; casting_spell_timer_duration = 0; - casting_spell_type = 0; casting_spell_resist_adjust = 0; casting_spell_checks = false; 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); } + 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 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)) { if(IsBuffSpell(spell_id) && IsBeneficialSpell(spell_id)) { // Prevent mana usage/timers being set for beneficial buffs - if(casting_spell_type == 1) + if(casting_spell_aa_id) InterruptSpell(); 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... 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 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); - 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) { 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); 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))) @@ -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 // 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()); - if(casting_spell_type != 1) // AA is handled differently + if(casting_spell_aa_id) Message_StringID(MT_SpellFailure, SPELL_NO_HOLD); safe_delete(action_packet); return false;