Browse Source

Fix #550 - recast timers are accurate with UI and data, linked timers no longer indirectly impact recast time incorrectly, we do not call self spell on linked timer

Emagi 5 months ago
parent
commit
e83b8ea13d

+ 12 - 7
EQ2/source/WorldServer/Player.cpp

@@ -2556,11 +2556,14 @@ void Player::UnlockAllSpells(bool modify_recast, Spell* exception) {
 		if ((*itr)->in_use == false && 
 			 (((*itr)->spell_id != exception_spell_id || 
 			 (*itr)->timer > 0 && (*itr)->timer != exception->GetSpellData()->linked_timer)
-		&& (*itr)->type != SPELL_BOOK_TYPE_TRADESKILL))
+		&& (*itr)->type != SPELL_BOOK_TYPE_TRADESKILL)) {
 			AddSpellStatus((*itr), SPELL_STATUS_LOCK, modify_recast);
+			(*itr)->recast_available = 0;
+		}
 		else if((*itr)->in_remiss)
 		{
 			AddSpellStatus((*itr), SPELL_STATUS_LOCK);
+			(*itr)->recast_available = 0;
 			(*itr)->in_remiss = false;
 		}
 	}
@@ -2599,10 +2602,11 @@ void Player::UnlockSpell(Spell* spell) {
 		if (spell2->spell_id == spell->GetSpellID() || (spell->GetSpellData()->linked_timer > 0 && spell->GetSpellData()->linked_timer == spell2->timer))
 		{
 			spell2->in_use = false;
+			spell2->recast_available = 0;
 			if(all_spells_locked)
 				spell2->in_remiss = true;
 			else
-				AddSpellStatus(spell2, SPELL_STATUS_LOCK);
+				AddSpellStatus(spell2, SPELL_STATUS_LOCK, false);
 		}
 	}
 	MSpellsBook.releasewritelock(__FUNCTION__, __LINE__);
@@ -2660,12 +2664,12 @@ void Player::UnQueueSpell(Spell* spell) {
 	MSpellsBook.releasewritelock(__FUNCTION__, __LINE__);
 }
 
-vector<Spell*> Player::GetSpellBookSpellsByTimer(int32 timerID) {
+vector<Spell*> Player::GetSpellBookSpellsByTimer(Spell* spell, int32 timerID) {
 	vector<Spell*> ret;
 	vector<SpellBookEntry*>::iterator itr;
 	MSpellsBook.readlock(__FUNCTION__, __LINE__);
 	for (itr = spells.begin(); itr != spells.end(); itr++) {
-		if ((*itr)->timer == timerID)
+		if ((*itr)->timer == timerID && spell->GetSpellID() != (*itr)->spell_id && spell->GetSpellTier() != (*itr)->tier)
 			ret.push_back(master_spell_list.GetSpell((*itr)->spell_id, (*itr)->tier));
 	}
 	MSpellsBook.releasereadlock(__FUNCTION__, __LINE__);
@@ -2709,19 +2713,20 @@ void Player::SetSpellStatus(Spell* spell, int8 status){
 
 void Player::SetSpellEntryRecast(SpellBookEntry* spell, bool modify_recast, int16 recast) {
 	if (modify_recast) {
+		spell->recast = recast / 100;
 		Spell* spell_ = master_spell_list.GetSpell(spell->spell_id, spell->tier);
 		if(spell_) {
-				
 			float override_recast = 0.0f;
 			if(recast > 0) {
 				override_recast = static_cast<float>(recast);
 			}
 			int32 recast_time = spell_->CalculateRecastTimer(this, override_recast);
-			spell->recast = recast_time / 1000;
+			
+			spell->recast = recast_time / 100;
 			spell->recast_available = Timer::GetCurrentTime2() + recast_time;
 		}
 		else {
-			spell->recast_available = Timer::GetCurrentTime2() + (recast * 100);
+			spell->recast_available = Timer::GetCurrentTime2() + recast;
 		}
 	}
 }

+ 1 - 1
EQ2/source/WorldServer/Player.h

@@ -981,7 +981,7 @@ public:
 	void UnQueueSpell(Spell* spell);
 
 	///<summary>Get all the spells the player has with the given id</summary>
-	vector<Spell*> GetSpellBookSpellsByTimer(int32 timerID);
+	vector<Spell*> GetSpellBookSpellsByTimer(Spell* spell, int32 timerID);
 
 	PacketStruct* GetQuestJournalPacket(Quest* quest, int16 version, int32 crc, bool updated = true);
 

+ 7 - 6
EQ2/source/WorldServer/SpellProcess.cpp

@@ -299,7 +299,7 @@ bool SpellProcess::IsReady(Spell* spell, Entity* caster){
 	return ret;
 }
 void SpellProcess::CheckRecast(Spell* spell, Entity* caster, float timer_override, bool check_linked_timers) {
-	if(spell && caster && spell->GetSpellData()->recast > 0){
+	if(spell && caster && spell->GetSpellData()->recast > 0.0f){
 		RecastTimer* timer = new RecastTimer;
 		timer->caster = caster;
 		if(caster->IsPlayer())
@@ -307,8 +307,9 @@ void SpellProcess::CheckRecast(Spell* spell, Entity* caster, float timer_overrid
 		else
 			timer->client = 0;
 		timer->spell = spell;
-		int32 recast_time = spell->GetSpellData()->recast * 1000;
-		if(timer_override == 0) {
+		int32 recast_time = static_cast<int32>(spell->GetSpellData()->recast * 1000.0f);
+		
+		if(timer_override == 0.0f) {
 			recast_time = spell->CalculateRecastTimer(caster);
 			timer->timer = new Timer(recast_time);
 		}
@@ -333,14 +334,14 @@ void SpellProcess::CheckRecast(Spell* spell, Entity* caster, float timer_overrid
 				((Player*)caster)->UnlockSpell(spell);
 			}
 			else {
-				((Player*)caster)->LockSpell(spell, (int16)(recast_time / 100));
+				((Player*)caster)->LockSpell(spell, (int16)(recast_time));
 			}
 			if (check_linked_timers && spell->GetSpellData()->linked_timer > 0) {
-				vector<Spell*> linkedSpells = ((Player*)caster)->GetSpellBookSpellsByTimer(spell->GetSpellData()->linked_timer);
+				vector<Spell*> linkedSpells = ((Player*)caster)->GetSpellBookSpellsByTimer(spell, spell->GetSpellData()->linked_timer);
 				for (int8 i = 0; i < linkedSpells.size(); i++) {
 					Spell* spell2 = linkedSpells.at(i);
 					if (spell2)
-						CheckRecast(spell2, caster, timer_override, false);
+						CheckRecast(spell2, caster, static_cast<float>(recast_time), false);
 				}
 			}
 		}

+ 2 - 2
EQ2/source/WorldServer/Spells.cpp

@@ -2234,10 +2234,10 @@ void Spell::ModifyCastTime(Entity* caster){
 }
 
 int32 Spell::CalculateRecastTimer(Entity* caster, float override_timer) {
-	int32 original_recast = static_cast<int>(GetSpellData()->recast) * 1000;
+	int32 original_recast = static_cast<int32>(GetSpellData()->recast * 1000.0f);
 	
 	if(override_timer > 0.0f) {
-		original_recast = static_cast<int>(override_timer) * 1000;
+		original_recast = static_cast<int32>(override_timer);
 	}
 	
 	int32 recast_time = original_recast;