major updates

optimized
pet support
perl support
This commit is contained in:
KayenEQ
2021-08-09 23:03:21 -04:00
parent d1a260cb25
commit d3093c91ea
12 changed files with 254 additions and 110 deletions
+19 -24
View File
@@ -1691,6 +1691,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQ::skills::Skill
InterruptSpell();
SetPet(0);
SetHorseId(0);
ShieldAbilityClearVariables();
dead = true;
if (GetMerc()) {
@@ -2252,6 +2253,8 @@ bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQ::skills::SkillTy
Log(Logs::Detail, Logs::Attack, "%s Mobs currently Aggro %i", __FUNCTION__, zone->MobsAggroCount());
}
ShieldAbilityClearVariables();
SetHP(0);
SetPet(0);
@@ -5278,61 +5281,53 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac
hit.damage_done += (hit.damage_done * pct_damage_reduction / 100) + (defender->GetFcDamageAmtIncoming(this, 0, true, hit.skill));
Shout("Shielder ID [%i]", defender->GetShielderID());
if (defender->GetShielderID()) {
hit.damage_done = hit.damage_done * 50 / 100;//Don't round.
DoShieldDamageOnShielder(defender, hit.damage_done, hit.skill);
hit.damage_done -= hit.damage_done * defender->GetShieldTargetMitigation() / 100; //Default shielded takes 50 pct damage
}
CheckNumHitsRemaining(NumHit::OutgoingHitSuccess);
}
void Mob::DoShieldDamageOnShielder(Mob* shielder_target, int hit_damage_done, EQ::skills::SkillType skillInUse)
void Mob::DoShieldDamageOnShielder(Mob* shield_target, int hit_damage_done, EQ::skills::SkillType skillInUse)
{
if (!shielder_target) {
if (!shield_target) {
return;
}
Mob *shielder = entity_list.GetMob(shielder_target->GetShielderID());
Mob *shielder = entity_list.GetMob(shield_target->GetShielderID());
if (!shielder) {
return;
}
//AA to increase SPA 230 extended shielding
int max_shielder_distance = 15;
int distance_mod = aabonuses.ExtendedShielding + itembonuses.ExtendedShielding + spellbonuses.ExtendedShielding;
max_shielder_distance += max_shielder_distance * distance_mod / 100;
max_shielder_distance = std::max(max_shielder_distance, 0);
if (shielder_target->CalculateDistance(shielder->GetX(), shielder->GetY(), shielder->GetZ()) > static_cast<float>(max_shielder_distance)) {
//Clear variables Shield end
Shout("Clear variables shield end");
if (shield_target->CalculateDistance(shielder->GetX(), shielder->GetY(), shielder->GetZ()) > static_cast<float>(shielder->GetMaxShielderDistance())) {
shielder->SetShieldTargetID(0);
shielder_target->SetShielderID(0);
shielder->SetShielderMitigation(0);
shielder->SetShielerMaxDistance(0);
shielder->shield_timer.Disable();
shield_target->SetShielderID(0);
shield_target->SetShieldTargetMitigation(0);
return; //Too far away, no message is given thoughh.
}
int mitigation = 75;
int mitigation = shielder->GetShielderMitigation(); //Default shielder mitigates 25 pct of damage taken, this can be increased up to max 50 by equiping a shield item
if (shielder->HasShieldEquiped() && shielder->IsClient()) {
if (shielder->IsClient() && shielder->HasShieldEquiped()) {
EQ::ItemInstance* inst = CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary);
EQ::ItemInstance* inst = shielder->CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary);
if (inst) {
const EQ::ItemData* shield = inst->GetItem();
if (shield && shield->ItemType == EQ::item::ItemTypeShield) {
mitigation -= shield->AC * 0.50; //1% increase per 2 AC
mitigation += shield->AC * 50 / 100; //1% increase per 2 AC
std::min(50, mitigation);//50 pct max mitigation bonus from /shield
}
}
}
mitigation = std::max(mitigation, 50);
hit_damage_done = hit_damage_done * mitigation / 100;
hit_damage_done -= hit_damage_done * mitigation / 100;
shielder->Damage(this, hit_damage_done, SPELL_UNKNOWN, skillInUse, true, -1, false, m_specialattacks);
shielder->CheckNumHitsRemaining(NumHit::OutgoingHitSuccess);
}