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

Reply
 
Thread Tools Display Modes
  #1  
Old 11-07-2010, 07:30 PM
Caryatis
Dragon
 
Join Date: May 2009
Location: Milky Way
Posts: 539
Default COMMITTED: DS Mitigation & SE_SpellDamageShield

This one might be slightly confusing as SpellShield was called SpellDamageShield so it also involves a little renaming to keep things consistent. Otherwise pretty straight forward, cast a spell and get damaged while DS mitigation reduces the ds in melee(wasnt sure if it applied to spell damage shields so atm it only affects the standard melee DS).

SQL:
Code:
Index: EQEmuServer/common/ruletypes.h
===================================================================
--- EQEmuServer/common/ruletypes.h	(revision 1715)
+++ EQEmuServer/common/ruletypes.h	(working copy)
@@ -60,6 +60,7 @@
 RULE_INT ( Character, ItemStunResistCap, 35)
 RULE_INT ( Character, ItemStrikethroughCap, 35)
 RULE_INT ( Character, ItemATKCap, 250)
+RULE_INT ( Character, ItemDSMitigationCap, 50)
 RULE_INT ( Character, SkillUpModifier, 100) //skill ups are at 100%
 RULE_BOOL ( Character, SharedBankPlat, false) //off by default to prevent duping for now
 RULE_BOOL ( Character, BindAnywhere, false)
Index: EQEmuServer/zone/attack.cpp
===================================================================
--- EQEmuServer/zone/attack.cpp	(revision 1715)
+++ EQEmuServer/zone/attack.cpp	(working copy)
@@ -2330,52 +2330,70 @@
 // a reverse ds causes damage to the wearer whenever it attack someone
 // given this, a reverse ds must be checked each time the wearer is attacking
 // and not when they're attacked
-void Mob::DamageShield(Mob* attacker) {
-	//a damage shield on a spell is a negative value but on an item it's a positive value so add the spell value and subtract the item value to get the end ds value
-	if(!attacker) return;
+//a damage shield on a spell is a negative value but on an item it's a positive value so add the spell value and subtract the item value to get the end ds value
+void Mob::DamageShield(Mob* attacker, bool spell_ds) {
 
-	int DS = spellbonuses.DamageShield;
-	int rev_ds = attacker->spellbonuses.ReverseDamageShield;
-
-	if(DS == 0 && rev_ds == 0)
+	if(!attacker || this == attacker) 
 		return;
 	
-	if(this == attacker) //I was crashing when I hit myself with melee with a DS on, not sure why but we shouldn't be reflecting damage onto ourselves anyway really.
+	int DS = 0;
+	int rev_ds = 0;
+	int16 spellid = 0;
+	
+	if(!spell_ds) 
+	{
+		DS = spellbonuses.DamageShield;
+		rev_ds = attacker->spellbonuses.ReverseDamageShield;
+		
+		if(spellbonuses.DamageShieldSpellID != 0 && spellbonuses.DamageShieldSpellID != SPELL_UNKNOWN)
+			spellid = spellbonuses.DamageShieldSpellID;
+	}
+	else {	
+		DS = spellbonuses.SpellDamageShield;
+		rev_ds = 0;
+		// This ID returns "you are burned", seemed most appropriate for spell DS
+		spellid = 2166;
+	}
+	
+	if(DS == 0 && rev_ds == 0)
 		return;
-	
+			
 	mlog(COMBAT__HITS, "Applying Damage Shield of value %d to %s", DS, attacker->GetName());
-	
-	int16 spellid = SPELL_UNKNOWN;
-	if(spellbonuses.DamageShieldSpellID != 0 && spellbonuses.DamageShieldSpellID != SPELL_UNKNOWN)
-		spellid = spellbonuses.DamageShieldSpellID;
+		
 	//invert DS... spells yield negative values for a true damage shield
 	if(DS < 0) {
-		if (IsClient())
-		{
-			int dsMod = 100;
-			switch (CastToClient()->GetAA(aaCoatofThistles))
-			{
-			case 1:
-				dsMod = 110;
-				break;
-			case 2:
-				dsMod = 115;
-				break;
-			case 3:
-				dsMod = 120;
-				break;
-			case 4:
-				dsMod = 125;
-				break;
-			case 5:
-				dsMod = 130;
-				break;
+		if(!spell_ds)	{
+			if(IsClient()) {
+				int dsMod = 100;
+				switch (CastToClient()->GetAA(aaCoatofThistles))
+				{
+				case 1:
+					dsMod = 110;
+					break;
+				case 2:
+					dsMod = 115;
+					break;
+				case 3:
+					dsMod = 120;
+					break;
+				case 4:
+					dsMod = 125;
+					break;
+				case 5:
+					dsMod = 130;
+					break;
+				}
+				DS = ((DS * dsMod) / 100);
 			}
-
-			DS = ((DS * dsMod) / 100);
+			DS -= itembonuses.DamageShield; //+Damage Shield should only work when you already have a DS spell
 		}
-		DS -= itembonuses.DamageShield; //+Damage Shield should only work when you already have a DS spell
-		attacker->Damage(this, -DS, spellid, ABJURE/*hackish*/, false);
+		if(!spell_ds) {
+			DS += attacker->itembonuses.DSMitigation;
+			attacker->Damage(this, -DS, spellid, ABJURE/*hackish*/, false);
+		}
+		else {
+			attacker->Damage(this, -DS, spellid, ABJURE/*hackish*/, false);
+		}
 		//we can assume there is a spell now
 		EQApplicationPacket* outapp = new EQApplicationPacket(OP_Damage, sizeof(CombatDamage_Struct));
 		CombatDamage_Struct* cds = (CombatDamage_Struct*)outapp->pBuffer;
@@ -2386,7 +2404,7 @@
 		cds->damage = DS;
 		entity_list.QueueCloseClients(this, outapp);
 		safe_delete(outapp);
-	} else {
+	} else if (DS > 0 && !spell_ds) {
 		//we are healing the attacker...
 		attacker->HealDamage(DS);
 		//TODO: send a packet???
@@ -2998,7 +3016,7 @@
 	else 
 	{
 		// Reduce damage by the Spell Shielding first so that the runes don't take the raw damage.
-		damage -= (damage * this->itembonuses.SpellDamageShield / 100);
+		damage -= (damage * this->itembonuses.SpellShield / 100);
 	
 		// Do runes now.
 		slot = GetBuffSlotFromType(SE_MitigateSpellDamage);
@@ -3153,7 +3171,7 @@
     // only apply DS if physical damage (no spell damage)
     // damage shield calls this function with spell_id set, so its unavoidable
 	if (attacker && damage > 0 && spell_id == SPELL_UNKNOWN && skill_used != ARCHERY && skill_used != THROWING) {
-		this->DamageShield(attacker);
+		this->DamageShield(attacker, 0);
 		uint32 buff_count = GetMaxTotalSlots();
 		for(uint32 bs = 0; bs < buff_count; bs++){
 			if((buffs[bs].spellid != SPELL_UNKNOWN) && buffs[bs].numhits > 0 && !IsDiscipline(buffs[bs].spellid)){
Index: EQEmuServer/zone/bonuses.cpp
===================================================================
--- EQEmuServer/zone/bonuses.cpp	(revision 1715)
+++ EQEmuServer/zone/bonuses.cpp	(working copy)
@@ -320,10 +320,10 @@
 			newbon->DamageShield += item->DamageShield;
 	}
 	if(item->SpellShield > 0) {
-		if((newbon->SpellDamageShield + item->SpellShield) > RuleI(Character, ItemSpellShieldingCap))
-			newbon->SpellDamageShield = RuleI(Character, ItemSpellShieldingCap);
+		if((newbon->SpellShield + item->SpellShield) > RuleI(Character, ItemSpellShieldingCap))
+			newbon->SpellShield = RuleI(Character, ItemSpellShieldingCap);
 		else
-			newbon->SpellDamageShield += item->SpellShield;
+			newbon->SpellShield += item->SpellShield;
 	}
 	if(item->Shielding > 0) {
 		if((newbon->MeleeMitigation + item->Shielding) > RuleI(Character, ItemShieldingCap))
@@ -367,6 +367,12 @@
 		else
 			newbon->DoTShielding += item->DotShielding;
 	}
+	if(item->DSMitigation > 0) {
+		if((newbon->DSMitigation + item->DSMitigation) > RuleI(Character, ItemDSMitigationCap))
+			newbon->DSMitigation = RuleI(Character, ItemDSMitigationCap);
+		else
+			newbon->DSMitigation += item->DSMitigation;
+	}
 	if (item->Worn.Effect>0 && (item->Worn.Type == ET_WornEffect)) { // latent effects
 		ApplySpellsBonuses(item->Worn.Effect, item->Worn.Level, newbon);
 	}
Index: EQEmuServer/zone/mob.h
===================================================================
--- EQEmuServer/zone/mob.h	(revision 1715)
+++ EQEmuServer/zone/mob.h	(working copy)
@@ -217,6 +217,7 @@
 	int		DamageShield; // this is damage done to mobs that attack this
 	DmgShieldType	DamageShieldType;
 	int		SpellDamageShield;
+	int		SpellShield;
 	int		ReverseDamageShield; // this is damage done to the mob when it attacks
 	uint16	ReverseDamageShieldSpellID;
 	DmgShieldType	ReverseDamageShieldType;
@@ -275,6 +276,7 @@
 
 	sint8 HundredHands;		//extra haste, stacks with all other haste  i
 	sint8 MeleeLifetap;
+	sint16 DSMitigation;
 	int XPRateMod;
 
 	sint8	Packrat;	//weight reduction for items, 1 point = 10%
@@ -539,7 +541,7 @@
 	void ApplyMeleeDamageBonus(int16 skill, sint32 &damage);
 	virtual void MeleeMitigation(Mob *attacker, sint32 &damage, sint32 minhit);
 
-	void	DamageShield(Mob* other);
+	void	DamageShield(Mob* other, bool spell_ds);
 	bool	FindBuff(int16 spellid);
 	bool	FindType(int8 type, bool bOffensive = false, int16 threshold = 100);
 	sint8	GetBuffSlotFromType(int16 type);
Index: EQEmuServer/zone/spells.cpp
===================================================================
--- EQEmuServer/zone/spells.cpp	(revision 1715)
+++ EQEmuServer/zone/spells.cpp	(working copy)
@@ -3128,6 +3128,9 @@
 			}
 		}
 
+	if(spelltar->spellbonuses.SpellDamageShield)
+		spelltar->DamageShield(this, 1);
+		
 	TryTriggerOnCast(spelltar, spell_id);
 	TrySpellTrigger(spelltar, spell_id);
 	TryApplyEffect(spelltar, spell_id);
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:38 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