mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-02 22:42:26 +00:00
ExtraAttackOptions (for npc special attacks) additions.
melee_damage_bonus_flat //(+/-) damage percent applied to out going damage skilldmgtaken_bonus_flat //(+/-) mitigation percent applied to out going damage *Note: These have not been applied to any ingame functions set.
This commit is contained in:
parent
705295f4c4
commit
57b483f697
@ -1217,7 +1217,7 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b
|
|||||||
if (other->CheckHitChance(this, skillinuse, Hand, hit_chance_bonus)) {
|
if (other->CheckHitChance(this, skillinuse, Hand, hit_chance_bonus)) {
|
||||||
other->MeleeMitigation(this, damage, min_hit, opts);
|
other->MeleeMitigation(this, damage, min_hit, opts);
|
||||||
if (damage > 0)
|
if (damage > 0)
|
||||||
CommonOutgoingHitSuccess(other, damage, skillinuse);
|
CommonOutgoingHitSuccess(other, damage, skillinuse,opts);
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Final damage after all reductions: %d", damage);
|
Log.Out(Logs::Detail, Logs::Combat, "Final damage after all reductions: %d", damage);
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Attack missed. Damage set to 0.");
|
Log.Out(Logs::Detail, Logs::Combat, "Attack missed. Damage set to 0.");
|
||||||
@ -1746,7 +1746,7 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool
|
|||||||
if(other->IsClient() && other->CastToClient()->IsSitting()) {
|
if(other->IsClient() && other->CastToClient()->IsSitting()) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Client %s is sitting. Hitting for max damage (%d).", other->GetName(), (max_dmg+eleBane));
|
Log.Out(Logs::Detail, Logs::Combat, "Client %s is sitting. Hitting for max damage (%d).", other->GetName(), (max_dmg+eleBane));
|
||||||
damage = (max_dmg+eleBane);
|
damage = (max_dmg+eleBane);
|
||||||
damage += (itembonuses.HeroicSTR / 10) + (damage * other->GetSkillDmgTaken(skillinuse) / 100) + GetSkillDmgAmt(skillinuse);
|
damage += (itembonuses.HeroicSTR / 10) + (damage * other->GetSkillDmgTaken(skillinuse, opts) / 100) + GetSkillDmgAmt(skillinuse);
|
||||||
|
|
||||||
if(opts) {
|
if(opts) {
|
||||||
damage *= opts->damage_percent;
|
damage *= opts->damage_percent;
|
||||||
@ -1777,7 +1777,7 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool
|
|||||||
} else {
|
} else {
|
||||||
if (other->CheckHitChance(this, skillinuse, Hand, hit_chance_bonus)) {
|
if (other->CheckHitChance(this, skillinuse, Hand, hit_chance_bonus)) {
|
||||||
other->MeleeMitigation(this, damage, min_dmg+eleBane, opts);
|
other->MeleeMitigation(this, damage, min_dmg+eleBane, opts);
|
||||||
CommonOutgoingHitSuccess(other, damage, skillinuse);
|
CommonOutgoingHitSuccess(other, damage, skillinuse, opts);
|
||||||
} else {
|
} else {
|
||||||
damage = 0;
|
damage = 0;
|
||||||
}
|
}
|
||||||
@ -4055,7 +4055,7 @@ void Mob::DoRiposte(Mob *defender)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mob::ApplyMeleeDamageBonus(uint16 skill, int32 &damage){
|
void Mob::ApplyMeleeDamageBonus(uint16 skill, int32 &damage,ExtraAttackOptions *opts){
|
||||||
|
|
||||||
if(!RuleB(Combat, UseIntervalAC)){
|
if(!RuleB(Combat, UseIntervalAC)){
|
||||||
if(IsNPC()){ //across the board NPC damage bonuses.
|
if(IsNPC()){ //across the board NPC damage bonuses.
|
||||||
@ -4068,7 +4068,13 @@ void Mob::ApplyMeleeDamageBonus(uint16 skill, int32 &damage){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
damage += damage * GetMeleeDamageMod_SE(skill) / 100;
|
int dmgbonusmod = 0;
|
||||||
|
|
||||||
|
dmgbonusmod += GetMeleeDamageMod_SE(skill);
|
||||||
|
if (opts)
|
||||||
|
dmgbonusmod += opts->melee_damage_bonus_flat;
|
||||||
|
|
||||||
|
damage += damage * dmgbonusmod / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Mob::HasDied() {
|
bool Mob::HasDied() {
|
||||||
@ -4426,14 +4432,14 @@ int32 Mob::RuneAbsorb(int32 damage, uint16 type)
|
|||||||
return damage;
|
return damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mob::CommonOutgoingHitSuccess(Mob* defender, int32 &damage, SkillUseTypes skillInUse)
|
void Mob::CommonOutgoingHitSuccess(Mob* defender, int32 &damage, SkillUseTypes skillInUse, ExtraAttackOptions *opts)
|
||||||
{
|
{
|
||||||
if (!defender)
|
if (!defender)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ApplyMeleeDamageBonus(skillInUse, damage);
|
ApplyMeleeDamageBonus(skillInUse, damage, opts);
|
||||||
damage += (damage * defender->GetSkillDmgTaken(skillInUse) / 100) + (GetSkillDmgAmt(skillInUse) + defender->GetFcDamageAmtIncoming(this, 0, true, skillInUse));
|
damage += (damage * defender->GetSkillDmgTaken(skillInUse, opts) / 100) + (GetSkillDmgAmt(skillInUse) + defender->GetFcDamageAmtIncoming(this, 0, true, skillInUse));
|
||||||
TryCriticalHit(defender, skillInUse, damage);
|
TryCriticalHit(defender, skillInUse, damage,opts);
|
||||||
CheckNumHitsRemaining(NumHit::OutgoingHitSuccess);
|
CheckNumHitsRemaining(NumHit::OutgoingHitSuccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -614,7 +614,8 @@ struct ExtraAttackOptions {
|
|||||||
: damage_percent(1.0f), damage_flat(0),
|
: damage_percent(1.0f), damage_flat(0),
|
||||||
armor_pen_percent(0.0f), armor_pen_flat(0),
|
armor_pen_percent(0.0f), armor_pen_flat(0),
|
||||||
crit_percent(1.0f), crit_flat(0.0f),
|
crit_percent(1.0f), crit_flat(0.0f),
|
||||||
hate_percent(1.0f), hate_flat(0), hit_chance(0)
|
hate_percent(1.0f), hate_flat(0), hit_chance(0),
|
||||||
|
melee_damage_bonus_flat(0), skilldmgtaken_bonus_flat(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
float damage_percent;
|
float damage_percent;
|
||||||
@ -626,6 +627,9 @@ struct ExtraAttackOptions {
|
|||||||
float hate_percent;
|
float hate_percent;
|
||||||
int hate_flat;
|
int hate_flat;
|
||||||
int hit_chance;
|
int hit_chance;
|
||||||
|
int melee_damage_bonus_flat;
|
||||||
|
int skilldmgtaken_bonus_flat;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -3786,7 +3786,7 @@ int32 Mob::GetVulnerability(Mob* caster, uint32 spell_id, uint32 ticsremaining)
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 Mob::GetSkillDmgTaken(const SkillUseTypes skill_used)
|
int16 Mob::GetSkillDmgTaken(const SkillUseTypes skill_used, ExtraAttackOptions *opts)
|
||||||
{
|
{
|
||||||
int skilldmg_mod = 0;
|
int skilldmg_mod = 0;
|
||||||
|
|
||||||
@ -3796,6 +3796,9 @@ int16 Mob::GetSkillDmgTaken(const SkillUseTypes skill_used)
|
|||||||
|
|
||||||
skilldmg_mod += SkillDmgTaken_Mod[skill_used] + SkillDmgTaken_Mod[HIGHEST_SKILL+1];
|
skilldmg_mod += SkillDmgTaken_Mod[skill_used] + SkillDmgTaken_Mod[HIGHEST_SKILL+1];
|
||||||
|
|
||||||
|
if (opts)
|
||||||
|
skilldmg_mod += opts->skilldmgtaken_bonus_flat;
|
||||||
|
|
||||||
if(skilldmg_mod < -100)
|
if(skilldmg_mod < -100)
|
||||||
skilldmg_mod = -100;
|
skilldmg_mod = -100;
|
||||||
|
|
||||||
|
|||||||
@ -160,13 +160,13 @@ public:
|
|||||||
uint32 TryHeadShot(Mob* defender, SkillUseTypes skillInUse);
|
uint32 TryHeadShot(Mob* defender, SkillUseTypes skillInUse);
|
||||||
uint32 TryAssassinate(Mob* defender, SkillUseTypes skillInUse, uint16 ReuseTime);
|
uint32 TryAssassinate(Mob* defender, SkillUseTypes skillInUse, uint16 ReuseTime);
|
||||||
virtual void DoRiposte(Mob* defender);
|
virtual void DoRiposte(Mob* defender);
|
||||||
void ApplyMeleeDamageBonus(uint16 skill, int32 &damage);
|
void ApplyMeleeDamageBonus(uint16 skill, int32 &damage,ExtraAttackOptions *opts = nullptr);
|
||||||
virtual void MeleeMitigation(Mob *attacker, int32 &damage, int32 minhit, ExtraAttackOptions *opts = nullptr);
|
virtual void MeleeMitigation(Mob *attacker, int32 &damage, int32 minhit, ExtraAttackOptions *opts = nullptr);
|
||||||
virtual int32 GetMeleeMitDmg(Mob *attacker, int32 damage, int32 minhit, float mit_rating, float atk_rating);
|
virtual int32 GetMeleeMitDmg(Mob *attacker, int32 damage, int32 minhit, float mit_rating, float atk_rating);
|
||||||
bool CombatRange(Mob* other);
|
bool CombatRange(Mob* other);
|
||||||
virtual inline bool IsBerserk() { return false; } // only clients
|
virtual inline bool IsBerserk() { return false; } // only clients
|
||||||
void RogueEvade(Mob *other);
|
void RogueEvade(Mob *other);
|
||||||
void CommonOutgoingHitSuccess(Mob* defender, int32 &damage, SkillUseTypes skillInUse);
|
void CommonOutgoingHitSuccess(Mob* defender, int32 &damage, SkillUseTypes skillInUse,ExtraAttackOptions *opts = nullptr);
|
||||||
void BreakInvisibleSpells();
|
void BreakInvisibleSpells();
|
||||||
void CommonBreakInvisibleFromCombat();
|
void CommonBreakInvisibleFromCombat();
|
||||||
bool HasDied();
|
bool HasDied();
|
||||||
@ -645,7 +645,7 @@ public:
|
|||||||
int32 GetVulnerability(Mob* caster, uint32 spell_id, uint32 ticsremaining);
|
int32 GetVulnerability(Mob* caster, uint32 spell_id, uint32 ticsremaining);
|
||||||
int32 GetFcDamageAmtIncoming(Mob *caster, uint32 spell_id, bool use_skill = false, uint16 skill=0);
|
int32 GetFcDamageAmtIncoming(Mob *caster, uint32 spell_id, bool use_skill = false, uint16 skill=0);
|
||||||
int32 GetFocusIncoming(focusType type, int effect, Mob *caster, uint32 spell_id);
|
int32 GetFocusIncoming(focusType type, int effect, Mob *caster, uint32 spell_id);
|
||||||
int16 GetSkillDmgTaken(const SkillUseTypes skill_used);
|
int16 GetSkillDmgTaken(const SkillUseTypes skill_used,ExtraAttackOptions *opts=nullptr);
|
||||||
void DoKnockback(Mob *caster, uint32 pushback, uint32 pushup);
|
void DoKnockback(Mob *caster, uint32 pushback, uint32 pushup);
|
||||||
int16 CalcResistChanceBonus();
|
int16 CalcResistChanceBonus();
|
||||||
int16 CalcFearResistChance();
|
int16 CalcFearResistChance();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user