Go Back   EQEmulator Home > EQEmulator Forums > Development > Development::Server Code Submissions

Reply
 
Thread Tools Display Modes
  #1  
Old 02-01-2013, 11:15 PM
demonstar55
Demi-God
 
Join Date: Apr 2008
Location: MA
Posts: 1,164
Default AA redux'd timers

The clients weren't being told about the redux in the reuse time, this should fix it. I tried to go about it not editing Spell functions, but that wasn't working. Some of the math seems backwards, at least by what we call things. (if anyone wants to do something that resets the AA, SendAATimer(ability, 0, reusetimer) resets it)
EDIT: I'm going to change this, found a way to make it more live like, just need to confirm it works.

Code:
Index: EQEmuServer/zone/AA.cpp
===================================================================
--- EQEmuServer/zone/AA.cpp	(revision 2476)
+++ EQEmuServer/zone/AA.cpp	(working copy)
@@ -290,8 +290,8 @@
 				p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime);

 			}

 

-			if(!CastSpell(caa->spell_id, target_id, 10, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, 1))

-					return;

+			if(!CastSpell(caa->spell_id, target_id, 10, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, caa->reuse_time, 1))

+				return;

 		}

 		else

 		{

Index: EQEmuServer/zone/mob.h
===================================================================
--- EQEmuServer/zone/mob.h	(revision 2476)
+++ EQEmuServer/zone/mob.h	(working copy)
@@ -880,8 +880,8 @@
 	

 	//TODO: put these ridiculous options in a damned struct or something

 

-	virtual bool CastSpell(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 = NULL);

-	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);

+	virtual bool CastSpell(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 norm_timer_duration = 0, uint32 type = 0, int16 *resist_adjust = NULL);

+	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 norm_timer_duration = 0, uint32 type = 0, int16 resist_adjust = 0);

 	void CastedSpellFinished(uint16 spell_id, uint32 target_id, uint16 slot, uint16 mana_used, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0);

 	bool SpellFinished(uint16 spell_id, Mob *target, uint16 slot = 10, uint16 mana_used = 0, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0, bool isproc = false);

 	virtual bool SpellOnTarget(uint16 spell_id, Mob* spelltar, bool reflect = false, bool use_resist_adjust = false, int16 resist_adjust = 0, bool isproc = false);

@@ -1427,6 +1427,7 @@
 	uint32 casting_spell_inventory_slot;

 	uint32 casting_spell_timer;

 	uint32 casting_spell_timer_duration;

+	uint32 casting_spell_norm_timer_duration;

 	uint32 casting_spell_type;

 	int16 casting_spell_resist_adjust;

 	uint16 bardsong;
===================================================================
--- EQEmuServer/zone/spells.cpp	(revision 2476)
+++ EQEmuServer/zone/spells.cpp	(working copy)
@@ -170,7 +170,7 @@
 // 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, uint32 norm_timer_duration, uint32 type, int16 *resist_adjust)

 {

 	_ZP(Mob_CastSpell);

 	

@@ -304,11 +304,11 @@
 

 	if(resist_adjust)

 	{

-		return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, *resist_adjust));

+		return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, norm_timer_duration, type, *resist_adjust));

 	}

 	else

 	{

-		return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, spells[spell_id].ResistDiff));

+		return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, norm_timer_duration, type, spells[spell_id].ResistDiff));

 	}

 }

 

@@ -322,7 +322,7 @@
 //

 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, uint32 norm_timer_duration, uint32 type,

 					int16 resist_adjust)

 {

 	_ZP(Mob_DoCastSpell);

@@ -349,6 +349,7 @@
 	{

 		casting_spell_timer = timer;

 		casting_spell_timer_duration = timer_duration;

+		casting_spell_norm_timer_duration = norm_timer_duration;

 	}

 	casting_spell_type = type;

 

@@ -682,6 +683,7 @@
 	casting_spell_inventory_slot = 0;

 	casting_spell_timer = 0;

 	casting_spell_timer_duration = 0;

+	casting_spell_norm_timer_duration = 0;

 	casting_spell_type = 0;

 	casting_spell_resist_adjust = 0;

 	delaytimer = false;

@@ -1981,7 +1983,7 @@
 			if(casting_spell_type == 1) //AA

 			{

 				time_t timestamp = time(NULL);

-				CastToClient()->SendAATimer((casting_spell_timer - pTimerAAStart), timestamp, timestamp);

+				CastToClient()->SendAATimer((casting_spell_timer - pTimerAAStart), timestamp, timestamp+(casting_spell_norm_timer_duration-casting_spell_timer_duration));

 			}

 		}

 		else if(spells[spell_id].recast_time > 1000) {

Index: EQEmuServer/zone/MobAI.cpp
===================================================================
--- EQEmuServer/zone/MobAI.cpp	(revision 2476)
+++ EQEmuServer/zone/MobAI.cpp	(working copy)
@@ -341,7 +341,7 @@
 		SetMoving(false);

 	}

 	

-	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, 0, 0, &(AIspells[i].resist_adjust));

 }

 

 bool EntityList::AICheckCloseBeneficialSpells(NPC* caster, uint8 iChance, float iRange, uint16 iSpellTypes) {
Reply With Quote
  #2  
Old 02-02-2013, 01:36 AM
demonstar55
Demi-God
 
Join Date: Apr 2008
Location: MA
Posts: 1,164
Default

Hmm, well, it appears a few AAs (long reuse ones like Divine Bestow Aura and Purify Soul get modded already and this just makes the appeared timer less, need to look into it more) This now works more live like where the timer starts when you click and is reset if you fail.

Code:
Index: EQEmuServer/zone/AA.cpp
===================================================================
--- EQEmuServer/zone/AA.cpp	(revision 2476)
+++ EQEmuServer/zone/AA.cpp	(working copy)
@@ -289,9 +289,14 @@
 			{
 				p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime);
 			}
+            //AA timers start before cast, resets on failures
+            //SendAATime's begin and end appear weird, doesn't need timestamp, difference seems important
+            //for redux'd timers it appears to want how much to shave off, reuse time will clear it
+            SendAATimer(AATimerID, 0, caa->reuse_time-timer_base);
+            p_timers.Start(AATimerID + pTimerAAStart, timer_base);
 
-			if(!CastSpell(caa->spell_id, target_id, 10, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, 1))
-					return;
+			if(!CastSpell(caa->spell_id, target_id, 10, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, caa->reuse_time, 1))
+				return;
 		}
 		else
 		{
Index: EQEmuServer/zone/mob.h
===================================================================
--- EQEmuServer/zone/mob.h	(revision 2476)
+++ EQEmuServer/zone/mob.h	(working copy)
@@ -880,8 +880,8 @@
 	
 	//TODO: put these ridiculous options in a damned struct or something
 
-	virtual bool CastSpell(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 = NULL);
-	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);
+	virtual bool CastSpell(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 norm_timer_duration = 0, uint32 type = 0, int16 *resist_adjust = NULL);
+	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 norm_timer_duration = 0, uint32 type = 0, int16 resist_adjust = 0);
 	void CastedSpellFinished(uint16 spell_id, uint32 target_id, uint16 slot, uint16 mana_used, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0);
 	bool SpellFinished(uint16 spell_id, Mob *target, uint16 slot = 10, uint16 mana_used = 0, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0, bool isproc = false);
 	virtual bool SpellOnTarget(uint16 spell_id, Mob* spelltar, bool reflect = false, bool use_resist_adjust = false, int16 resist_adjust = 0, bool isproc = false);
@@ -1427,6 +1427,7 @@
 	uint32 casting_spell_inventory_slot;
 	uint32 casting_spell_timer;
 	uint32 casting_spell_timer_duration;
+	uint32 casting_spell_norm_timer_duration;
 	uint32 casting_spell_type;
 	int16 casting_spell_resist_adjust;
 	uint16 bardsong;
Index: EQEmuServer/zone/StringIDs.h
===================================================================
--- EQEmuServer/zone/StringIDs.h	(revision 2476)
+++ EQEmuServer/zone/StringIDs.h	(working copy)
@@ -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 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.
 #define PROC_PETTOOLOW				127		//Your pet's will is not sufficient to command its weapon.
Index: EQEmuServer/zone/spells.cpp
===================================================================
--- EQEmuServer/zone/spells.cpp	(revision 2476)
+++ EQEmuServer/zone/spells.cpp	(working copy)
@@ -170,7 +170,7 @@
 // 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, uint32 norm_timer_duration, uint32 type, int16 *resist_adjust)
 {
 	_ZP(Mob_CastSpell);
 	
@@ -304,11 +304,11 @@
 
 	if(resist_adjust)
 	{
-		return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, *resist_adjust));
+		return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, norm_timer_duration, type, *resist_adjust));
 	}
 	else
 	{
-		return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, spells[spell_id].ResistDiff));
+		return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, norm_timer_duration, type, spells[spell_id].ResistDiff));
 	}
 }
 
@@ -322,7 +322,7 @@
 //
 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, uint32 norm_timer_duration, uint32 type,
 					int16 resist_adjust)
 {
 	_ZP(Mob_DoCastSpell);
@@ -349,6 +349,7 @@
 	{
 		casting_spell_timer = timer;
 		casting_spell_timer_duration = timer_duration;
+		casting_spell_norm_timer_duration = norm_timer_duration;
 	}
 	casting_spell_type = type;
 
@@ -682,6 +683,7 @@
 	casting_spell_inventory_slot = 0;
 	casting_spell_timer = 0;
 	casting_spell_timer_duration = 0;
+	casting_spell_norm_timer_duration = 0;
 	casting_spell_type = 0;
 	casting_spell_resist_adjust = 0;
 	delaytimer = false;
@@ -715,7 +717,11 @@
 	}
     
 	if(casting_spell_type == 1 && IsClient()) //Rest AA Timer on failed cast
+    {
+        CastToClient()->SendAATimer((casting_spell_timer - pTimerAAStart), 0, casting_spell_norm_timer_duration);
+        CastToClient()->Message_StringID(15,ABILITY_FAILED); // MT confirmed on live
 		CastToClient()->GetPTimers().Clear(&database, casting_spell_timer);
+    }
 	
 	ZeroCastingVars();	// resets all the state keeping stuff
 	
@@ -1976,12 +1982,14 @@
 	{
 		if(spell_id == casting_spell_id && casting_spell_timer != 0xFFFFFFFF)
 		{
-			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) {
+                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);
+				//CastToClient()->SendAATimer((casting_spell_timer - pTimerAAStart), timestamp, timestamp+(casting_spell_norm_timer_duration-casting_spell_timer_duration));
 			}
 		}
 		else if(spells[spell_id].recast_time > 1000) {
Index: EQEmuServer/zone/MobAI.cpp
===================================================================
--- EQEmuServer/zone/MobAI.cpp	(revision 2476)
+++ EQEmuServer/zone/MobAI.cpp	(working copy)
@@ -341,7 +341,7 @@
 		SetMoving(false);
 	}
 	
-	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, 0, 0, &(AIspells[i].resist_adjust));
 }
 
 bool EntityList::AICheckCloseBeneficialSpells(NPC* caster, uint8 iChance, float iRange, uint16 iSpellTypes) {
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 03:47 AM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3