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

Reply
 
Thread Tools Display Modes
  #1  
Old 09-29-2009, 05:18 PM
Shin Noir's Avatar
Shin Noir
Legendary Member
 
Join Date: Apr 2002
Location: Seattle, WA
Posts: 506
Default SE_SpellVulnerability half fix (druid epic uses)

Ok, still up, who knows why.. This spell effect is used it seems primarily on druid epic, it makes the target more weak to damage. Malasinese uses it too (lvl 76/77 spell?) and some NPCs use it. I say "half fix" because I think that in the case of the NPC's they are supposed to boost/decrease dmg on all spell types, and not just instant detrimental spells.

I ran into an issue, and wrote a new function to solve it. This function is Mob::FindTypeValue(), and what this function does is it will return spelldata values from a mob that match the spell effect type specified. This is so if a mob has spell vulnerability on a debuff, it will look for it and return the value mod. I need to fix the loop to ensure it's returning the highest value if multiples of this SE is on it. Probably a few other debugs here or there. :P

I also am not entirely sure this excludes heals, I didn't test this very well, but heals weren't affected the little bit I did which kind of boggled me.

I left my printf console debug lines in there for anyone who wants to test, but commented out for now.
Code:
Index: mob.h
===================================================================
--- mob.h	(revision 998)
+++ mob.h	(working copy)
@@ -495,6 +495,7 @@
 	void	DamageShield(Mob* other);
 	bool	FindBuff(int16 spellid);
 	bool	FindType(int8 type, bool bOffensive = false, int16 threshold = 100);
+	sint32	FindTypeValue(int8 type, int8 stat); //Shin: Added for finding mob raw spell data.
 	sint8	GetBuffSlotFromType(int8 type);
 	int		CountDispellableBuffs();
 	bool	HasBuffIcon(Mob* caster, Mob* target, int16 spell_id);
Index: spdat.h
===================================================================
--- spdat.h	(revision 998)
+++ spdat.h	(working copy)
@@ -401,7 +401,7 @@
 //#define SE_Unknown293				293	//not used
 #define SE_CriticalSpellChance		294 //not implemented
 //#define SE_Unknown295				295	//not used
-#define SE_SpellVulnerability		296	//not implemented, base % increase in incoming spell damage
+#define SE_SpellVulnerability		296	//Shin: Minor fix to detrimental spells only, base % increase in incoming spell damage
 #define SE_Empathy					297 //some kind of damage focus effect, maybe defensive?
 #define SE_ChangeHeight				298	//not implemented
 #define SE_WakeTheDead				299
Index: spell_effects.cpp
===================================================================
--- spell_effects.cpp	(revision 998)
+++ spell_effects.cpp	(working copy)
@@ -173,7 +173,10 @@
 				{
 					// take partial damage into account
 					dmg = (sint32) (dmg * partial / 100);
-
+					//printf("Dmg before: %d", dmg);
+					//Shin: See if target has vulnerability debuff (or can be a invul buff if negative).
+					if (FindTypeValue(SE_SpellVulnerability,0)!=0) dmg += (dmg*FindTypeValue(SE_SpellVulnerability,0)/100);
+					//printf("Dmg After: %d did we find it? %d", dmg, FindTypeValue(SE_SpellVulnerability,0));
 					//handles AAs and what not...
 					if(caster)
 						dmg = caster->GetActSpellDamage(spell_id, dmg);
@@ -2752,6 +2755,7 @@
 			case SE_LimitMinLevel:
 			case SE_LimitCastTime:
 			case SE_NoCombatSkills:
+			case SE_SpellVulnerability: //Shin: This is a debuff handled SE.
 			{
 				break;
 			}
Index: spells.cpp
===================================================================
--- spells.cpp	(revision 998)
+++ spells.cpp	(working copy)
@@ -4165,6 +4165,22 @@
 	return false;
 }
 
+//Shin: FindTypeValue is used to return spell data. stat supports 3 values, 0: base, 1: base2, 3: max
+sint32 Mob::FindTypeValue(int8 type, int8 stat) {
+	for (int i = 0; i < BUFF_COUNT; i++) {
+		if (buffs[i].spellid != SPELL_UNKNOWN) {
+			for (int j = 0; j < EFFECT_COUNT; j++) {
+				    if (spells[buffs[i].spellid].effectid[j] == type )
+						printf("Found value data.");
+						if (stat == 0) return spells[buffs[i].spellid].base[j];
+						if (stat == 1) return spells[buffs[i].spellid].base2[j]; 
+						if (stat == 2) return spells[buffs[i].spellid].max[j];
+			}
+		}
+	}
+	return 0;
+}
+
 bool Mob::AddProcToWeapon(int16 spell_id, bool bPerma, int16 iChance) {
 	if(spell_id == SPELL_UNKNOWN)
 		return(false);
__________________

~Shin Noir
DungeonEQ.com
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 11:49 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