mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 21:01:29 +00:00
Bards can now use instant cast AAs while singing (Fading Memories, Boastful Bellow)
AA reuse timers now start before the spell is cast and reset upon failure or canceling
This commit is contained in:
parent
fb0add070b
commit
353d7cede0
@ -1,6 +1,10 @@
|
||||
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
||||
-------------------------------------------------------
|
||||
|
||||
== 04/01/2013 ==
|
||||
demonstar55: AA reuse timers now start when you hit the button and are reset upon failure
|
||||
demonstar55: Instant Cast bard AAs can now be used while singing a song
|
||||
|
||||
== 03/30/2013 ==
|
||||
demonstar55: Fixed most of the pet talking, all use StringIDs now. Pet now informs you when it taunts.
|
||||
|
||||
|
||||
28
zone/AA.cpp
28
zone/AA.cpp
@ -257,7 +257,7 @@ void Client::ActivateAA(aaID activate){
|
||||
if(caa->action != aaActionNone) {
|
||||
if(caa->mana_cost > 0) {
|
||||
if(GetMana() < caa->mana_cost) {
|
||||
Message(0, "Not enough mana to use this skill.");
|
||||
Message_StringID(13, INSUFFICIENT_MANA);
|
||||
return;
|
||||
}
|
||||
SetMana(GetMana() - caa->mana_cost);
|
||||
@ -271,8 +271,7 @@ void Client::ActivateAA(aaID activate){
|
||||
p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime);
|
||||
}
|
||||
p_timers.Start(AATimerID + pTimerAAStart, timer_base);
|
||||
time_t timestamp = time(NULL);
|
||||
SendAATimer(AATimerID, static_cast<uint32>(timestamp), static_cast<uint32>(timestamp));
|
||||
SendAATimer(AATimerID, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -282,13 +281,30 @@ void Client::ActivateAA(aaID activate){
|
||||
if(caa->reuse_time > 0)
|
||||
{
|
||||
uint32 timer_base = CalcAAReuseTimer(caa);
|
||||
SendAATimer(AATimerID, 0, 0);
|
||||
p_timers.Start(AATimerID + pTimerAAStart, timer_base);
|
||||
if(activate == aaImprovedHarmTouch || activate == aaLeechTouch)
|
||||
{
|
||||
p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime);
|
||||
}
|
||||
|
||||
if(!CastSpell(caa->spell_id, target_id, 10, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, 1))
|
||||
return;
|
||||
// Bards can cast instant cast AAs while they are casting another song
|
||||
if (spells[caa->spell_id].cast_time == 0 && GetClass() == BARD && IsBardSong(casting_spell_id)) {
|
||||
if(!SpellFinished(caa->spell_id, entity_list.GetMob(target_id), 10, -1, -1, spells[caa->spell_id].ResistDiff, false)) {
|
||||
//Reset on failed cast
|
||||
SendAATimer(AATimerID, 0, 0xFFFFFF);
|
||||
Message_StringID(15,ABILITY_FAILED);
|
||||
p_timers.Clear(&database, AATimerID + pTimerAAStart);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if(!CastSpell(caa->spell_id, target_id, 10, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, 1)) {
|
||||
//Reset on failed cast
|
||||
SendAATimer(AATimerID, 0, 0xFFFFFF);
|
||||
Message_StringID(15,ABILITY_FAILED);
|
||||
p_timers.Clear(&database, AATimerID + pTimerAAStart);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
#define SPELL_DOES_NOT_WORK_PLANE 107 //This spell does not work on this plane.
|
||||
#define CANT_SEE_TARGET 108 //You cannot see your target.
|
||||
#define MGB_STRING 113 //The next group buff you cast will hit all targets in range.
|
||||
#define ABILITY_FAILED 116 //Your ability failed. Timer has been reset.
|
||||
#define ESCAPE 114 //You escape from combat, hiding yourself from view.
|
||||
#define TARGET_TOO_FAR 124 //Your target is too far away, get closer!
|
||||
#define PROC_TOOLOW 126 //Your will is not sufficient to command this weapon.
|
||||
|
||||
@ -707,23 +707,26 @@ void Mob::InterruptSpell(uint16 message, uint16 color, uint16 spellid)
|
||||
CastToNPC()->AI_Event_SpellCastFinished(false, casting_spell_slot);
|
||||
}
|
||||
|
||||
if(casting_spell_type == 1 && IsClient()) //Rest AA Timer on failed cast
|
||||
CastToClient()->GetPTimers().Clear(&database, casting_spell_timer);
|
||||
|
||||
if(casting_spell_type == 1 && IsClient()) { //Rest AA Timer on failed cast
|
||||
CastToClient()->SendAATimer(casting_spell_timer - pTimerAAStart, 0, 0xFFFFFF);
|
||||
CastToClient()->Message_StringID(15,ABILITY_FAILED);
|
||||
CastToClient()->GetPTimers().Clear(&database, casting_spell_timer);
|
||||
}
|
||||
|
||||
ZeroCastingVars(); // resets all the state keeping stuff
|
||||
|
||||
|
||||
mlog(SPELLS__CASTING, "Spell %d has been interrupted.", spellid);
|
||||
|
||||
|
||||
if(!spellid)
|
||||
return;
|
||||
|
||||
|
||||
if (bardsong || IsBardSong(casting_spell_id))
|
||||
_StopSong();
|
||||
|
||||
if(bard_song_mode) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if(!message)
|
||||
message = IsBardSong(spellid) ? SONG_ENDS_ABRUPTLY : INTERRUPT_SPELL;
|
||||
|
||||
@ -1971,11 +1974,6 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16
|
||||
{
|
||||
CastToClient()->GetPTimers().Start(casting_spell_timer, casting_spell_timer_duration);
|
||||
mlog(SPELLS__CASTING, "Spell %d: Setting custom reuse timer %d to %d", spell_id, casting_spell_timer, casting_spell_timer_duration);
|
||||
if(casting_spell_type == 1) //AA
|
||||
{
|
||||
time_t timestamp = time(NULL);
|
||||
CastToClient()->SendAATimer((casting_spell_timer - pTimerAAStart), timestamp, timestamp);
|
||||
}
|
||||
}
|
||||
else if(spells[spell_id].recast_time > 1000) {
|
||||
int recast = spells[spell_id].recast_time/1000;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user