PDA

View Full Version : DoT Fixes + PvP Archery Mitigation fix.


EverHood
07-19-2006, 04:40 PM
In the current code base, dots are slipping into the hp regeneration cycle so your hps are reduced once during the damage tick of the dot and once during your regen cycle resulting in double the damage per tick for any given dot.

Dot damage is being shown as non melee damage in the fashion nukes are. Also damage messages are being sent to the caster for self dots such as the necromancer lich line.

DoT damage was not being considered PvP when cast on self.

While ensuring the 66% pvp damage was being done properly I noticed it was including archery which according to an archived live patch is supposed to do %80 damage in pvp situations not 66%.

The following diff fixes all the above issues. Necros can lich and not be spammed nor eaten at twice the normal rate and players won't be taking double damage from dots cast on them by NPCs etc etc. Also you will now see the correct style message when your dot damage cast on others is being reported: Target has taken X damage from your SpellName.

Oh, I also cleaned up the names used when lifetaps hit mobs while I was in there :)

--- E:\EQEmu833\zone\StringIDs.h Thu Apr 21 15:42:18 2005
+++ C:\EQEmuSP\Source\0.7.0\zone\StringIDs.h Wed Jul 19 17:38:11 2006
@@ -83,6 +83,7 @@
#define FINISHING_BLOW 1009 //%1 scores a Finishing Blow!!
#define OTHER_HIT_NONMELEE 434 //%1 was hit by non-melee for %2 points of damage.
#define YOU_HIT_NONMELEE 12481 //You were hit by non-melee for %1 damage.
+#define OTHER_HIT_DOT 9072 // %1 has taken %2 damage from your %3.
#define BEAM_SMILE 12501 //%1 beams a smile at %2
#define FACTION_WORST 469 //Your faction standing with %1 could not possibly get any worse.
#define FACTION_WORSE 470 //Your faction standing with %1 got worse.
--- E:\EQEmu833\zone\attack.cpp Sun Jul 09 12:50:58 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\attack.cpp Wed Jul 19 18:49:04 2006
@@ -975,8 +975,14 @@
spell_id = SPELL_UNKNOWN;

// cut all PVP spell damage to 2/3 -solar
- if(other && other->IsClient() && this != other && damage > 0)
- damage = (damage * 67) / 100;
+ // EverHood - Blasting ourselfs is considered PvP to
+ int PvPMitigation = 100;
+ if(other && other->IsClient() && damage > 0)
+ if(attack_skill == ARCHERY)
+ PvPMitigation = 80;
+ else
+ PvPMitigation = 67;
+ damage = (damage * PvPMitigation) / 100;

//do a majority of the work...
CommonDamage(other, damage, spell_id, attack_skill, avoidable, buffslot, iBuffTic);
@@ -2079,7 +2085,7 @@
} else {
mlog(COMBAT__HITS, "Generating hate %d towards %s", hate, attacker->GetName());
// now add done damage to the hate list
- AddToHateList(attacker, hate, damage, true, false, iBuffTic);
+ AddToHateList(attacker, hate, damage, true, false, !iBuffTic);
}
}

@@ -2095,7 +2101,7 @@

//we used to do a message to the client, but its gone now.
// emote goes with every one ... even npcs
- entity_list.MessageClose(this, true, 300, MT_Emote, "%s beams a smile at %s", attacker->GetName(), this->GetName() );
+ entity_list.MessageClose(this, true, 300, MT_Emote, "%s beams a smile at %s", attacker->GetCleanName(), this->GetCleanName() );
}

// if we got a pet, thats not already fighting something send it into battle
@@ -2103,7 +2109,7 @@
Mob *pet = GetPet();
if (pet && !pet->IsEngaged() && attacker != this) {
mlog(PETS__AGGRO, "Sending pet %s into battle due to attack.", pet->GetName());
- pet->AddToHateList(attacker, 1, 0,true,false,iBuffTic);
+ pet->AddToHateList(attacker, 1, 0,true,false,!iBuffTic);
pet->SetTarget(attacker);
Message_StringID(10, PET_ATTACKING, pet->GetCleanName(), attacker->GetCleanName());
}
@@ -2282,6 +2288,13 @@
}

safe_delete(outapp);
+ }else{
+ // Everhood - So we can see our dot dmg like live shows it.
+ if(attacker && attacker != this && attacker->IsClient()) {
+ if ((spell_id != SPELL_UNKNOWN || (attack_skill>200 && attack_skill<250)) && damage>0) {
+ attacker->Message_StringID(MT_DoTDamage,OTHER_HIT_DOT,GetCle anName(),itoa(damage),spells[spell_id].name);
+ }
+ }
} //end packet sending

}
--- E:\EQEmu833\zone\bonuses.cpp Mon Apr 17 06:59:14 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\bonuses.cpp Tue Jul 18 20:24:01 2006
@@ -354,7 +354,8 @@
{
if(IsBeneficialSpell(spell_id) && effect_value < 0)
break;
-
+ // Everhood - dmg dots were sneaking through.
+ if(effect_value>0)
newbon->HPRegen += effect_value;
break;
}
--- E:\EQEmu833\zone\spell_effects.cpp Sun Jul 16 23:09:44 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\spell_effects.cpp Wed Jul 19 18:50:16 2006
@@ -2198,7 +2198,8 @@

if(effect_value < 0) {
effect_value = -effect_value;
- Damage(caster, effect_value, spell_id, SPELL_ATTACK_SKILL, false, i, false);
+ // Everhood - DoTs spamed cuz this was false
+ Damage(caster, effect_value, spell_id, SPELL_ATTACK_SKILL, false, i, true);
} else if(effect_value > 0) {
//healing spell...
if(caster)
@@ -2213,6 +2214,8 @@
effect_value = CalcSpellEffectValue(spell_id, i, caster_level);

//is this affected by stuff like GetActSpellHealing??
+ //EverHood - DoTs were sneaking through.
+ if(effect_value>0)
HealDamage(effect_value);
break;
}

fathernitwit
07-23-2006, 01:49 PM
I noticed that you did a few inversions on the ibufftic variable throughout the patch, and I have to disagree with them, and did not put them in, grab my changes and lte me know if it fails to work.

I also did not apply the two changes to prevent heals from acting as dots, as I am skeptical of their nescesity. Please provide me with example spells that you think are causing a problem there so I can analyze further.

I added filtering to your dot messages.

also, as I have requested in the past, please do not use unbracked bodys (no {}'s) with multi-line if statements (like the first delta in attack.cpp)

fathernitwit
07-23-2006, 01:58 PM
actually, now that I think about it... the crap in bonuses.cpp is just that... crap... it does not belong there at all, since its already taken care of in the buff tic code... so its gone.

my "show me the spell" question still applies for the SE_HealOverTime spell effect in the buff tic code...