Browse Source

Hot fix to address spell resisting and can no longer recast

Emagi 5 months ago
parent
commit
d123ce8904
2 changed files with 25 additions and 9 deletions
  1. 8 3
      EQ2/source/WorldServer/Player.cpp
  2. 17 6
      EQ2/source/WorldServer/SpellProcess.cpp

+ 8 - 3
EQ2/source/WorldServer/Player.cpp

@@ -2573,6 +2573,7 @@ void Player::UnlockAllSpells(bool modify_recast, Spell* exception) {
 void Player::LockSpell(Spell* spell, int16 recast) {
 	vector<SpellBookEntry*>::iterator itr;
 	SpellBookEntry* spell2;
+	
 	MSpellsBook.writelock(__FUNCTION__, __LINE__);
 	for (itr = spells.begin(); itr != spells.end(); itr++) {
 		spell2 = *itr;
@@ -2708,12 +2709,16 @@ void Player::SetSpellStatus(Spell* spell, int8 status){
 
 void Player::SetSpellEntryRecast(SpellBookEntry* spell, bool modify_recast, int16 recast) {
 	if (modify_recast) {
-		spell->recast = recast;
-		float override_recast = static_cast<float>(recast);
 		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_available = Timer::GetCurrentTime2() + (recast_time / 10);
+			spell->recast = recast_time / 1000;
+			spell->recast_available = Timer::GetCurrentTime2() + recast_time;
 		}
 		else {
 			spell->recast_available = Timer::GetCurrentTime2() + (recast * 100);

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

@@ -317,13 +317,24 @@ void SpellProcess::CheckRecast(Spell* spell, Entity* caster, float timer_overrid
 			timer->timer = new Timer(recast_time);
 		}
 		
-		timer->type_group_spell_id = spell->GetSpellData()->type_group_spell_id;
-		timer->linked_timer = spell->GetSpellData()->linked_timer;
-		timer->spell_id = spell->GetSpellID();
+		if(recast_time < 1) {
+			safe_delete(timer->timer);
+			safe_delete(timer);
+		}
+		else {
+			timer->type_group_spell_id = spell->GetSpellData()->type_group_spell_id;
+			timer->linked_timer = spell->GetSpellData()->linked_timer;
+			timer->spell_id = spell->GetSpellID();
 
-		recast_timers.Add(timer);
+			recast_timers.Add(timer);
+		}
 		if(caster->IsPlayer()){
-			((Player*)caster)->LockSpell(spell, (int16)(recast_time / 100));
+			if(recast_time < 1) {
+				((Player*)caster)->UnlockSpell(spell);
+			}
+			else {
+				((Player*)caster)->LockSpell(spell, (int16)(recast_time / 100));
+			}
 			if (check_linked_timers && spell->GetSpellData()->linked_timer > 0) {
 				vector<Spell*> linkedSpells = ((Player*)caster)->GetSpellBookSpellsByTimer(spell->GetSpellData()->linked_timer);
 				for (int8 i = 0; i < linkedSpells.size(); i++) {
@@ -659,7 +670,7 @@ void SpellProcess::SendFinishedCast(LuaSpell* spell, Client* client){
 			CheckRecast(spell->spell, client->GetPlayer());
 		else if(spell->caster && spell->caster->IsPlayer())
 		{
-			((Player*)spell->caster)->LockSpell(spell->spell, (int16)(spell->spell->CalculateRecastTimer(spell->caster) / 100));
+			((Player*)spell->caster)->LockSpell(spell->spell, (int16)(spell->spell->CalculateRecastTimer(spell->caster)));
 		}
 		PacketStruct* packet = configReader.getStruct("WS_FinishCastSpell", client->GetVersion());
 		if(packet){