From 930dbb509ed9b7655cc9be25ee25ac751c7c185b Mon Sep 17 00:00:00 2001 From: KayenEQ Date: Sat, 7 Aug 2021 12:38:05 -0400 Subject: [PATCH] updates --- zone/attack.cpp | 36 ++++++++++++++++++++++++++---------- zone/client.cpp | 13 ------------- zone/client.h | 1 - zone/client_packet.cpp | 38 ++++++++++++++++++++++---------------- zone/client_process.cpp | 33 ++++++++------------------------- zone/common.h | 14 -------------- zone/mob.cpp | 11 +++-------- zone/mob.h | 21 +++++++++------------ zone/perl_mob.cpp | 4 ++-- 9 files changed, 70 insertions(+), 101 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 8928db44c..aeb82d07b 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -5278,29 +5278,45 @@ 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)); - if (defender->shield_ability.shielder_id) { - hit.damage_done *= 0.50;//Don't round. + 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); } CheckNumHitsRemaining(NumHit::OutgoingHitSuccess); } -void Mob::DoShieldDamageOnShielder(Mob* shield_target, int shielder_damage_taken, EQ::skills::SkillType skillInUse) +void Mob::DoShieldDamageOnShielder(Mob* shielder_target, int hit_damage_done, EQ::skills::SkillType skillInUse) { - if (!shield_target) { + if (!shielder_target) { return; } - Mob *current_shielder = entity_list.GetMob(shield_target->shield_ability.shielder_id); + Mob *shielder = entity_list.GetMob(shielder_target->GetShielderID()); - if (!current_shielder) { + 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(max_shielder_distance)) { + //Clear variables Shield end + Shout("Clear variables shield end"); + shielder->SetShieldTargetID(0); + shielder_target->SetShielderID(0); + return; //Too far away, no message is given thoughh. + } + int mitigation = 75; - if (current_shielder->HasShieldEquiped() && current_shielder->IsClient()) { + if (shielder->HasShieldEquiped() && shielder->IsClient()) { EQ::ItemInstance* inst = CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary); @@ -5315,10 +5331,10 @@ void Mob::DoShieldDamageOnShielder(Mob* shield_target, int shielder_damage_taken mitigation = std::max(mitigation, 50); - shielder_damage_taken = shielder_damage_taken * mitigation / 100; + hit_damage_done = hit_damage_done * mitigation / 100; - current_shielder->Damage(this, shielder_damage_taken, SPELL_UNKNOWN, skillInUse, true, -1, false, m_specialattacks); - current_shielder->CheckNumHitsRemaining(NumHit::OutgoingHitSuccess); + shielder->Damage(this, hit_damage_done, SPELL_UNKNOWN, skillInUse, true, -1, false, m_specialattacks); + shielder->CheckNumHitsRemaining(NumHit::OutgoingHitSuccess); } void Mob::CommonBreakInvisibleFromCombat() diff --git a/zone/client.cpp b/zone/client.cpp index 29ab42c9e..9522c3489 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -138,7 +138,6 @@ Client::Client(EQStreamInterface* ieqs) linkdead_timer(RuleI(Zone,ClientLinkdeadMS)), dead_timer(2000), global_channel_timer(1000), - shield_timer(500), fishing_timer(8000), endupkeep_timer(1000), forget_timer(0), @@ -200,7 +199,6 @@ Client::Client(EQStreamInterface* ieqs) account_id = 0; admin = 0; lsaccountid = 0; - shield_target = nullptr; guild_id = GUILD_NONE; guildrank = 0; GuildBanker = false; @@ -236,7 +234,6 @@ Client::Client(EQStreamInterface* ieqs) pQueuedSaveWorkID = 0; position_update_same_count = 0; fishing_timer.Disable(); - shield_timer.Disable(); dead_timer.Disable(); camp_timer.Disable(); autosave_timer.Disable(); @@ -420,16 +417,6 @@ Client::~Client() { } } - if (shield_target) { - for (int y = 0; y < 2; y++) { - if (shield_target->shielder[y].shielder_id == GetID()) { - shield_target->shielder[y].shielder_id = 0; - shield_target->shielder[y].shielder_bonus = 0; - } - } - shield_target = nullptr; - } - if(GetTarget()) GetTarget()->IsTargeted(-1); diff --git a/zone/client.h b/zone/client.h index 1da699d9b..3236ab901 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1797,7 +1797,6 @@ private: Timer linkdead_timer; Timer dead_timer; Timer global_channel_timer; - Timer shield_timer; Timer fishing_timer; Timer endupkeep_timer; Timer forget_timer; // our 2 min everybody forgets you timer diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 5aec10749..a7ab97c2a 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -12810,9 +12810,10 @@ void Client::Handle_OP_Shielding(const EQApplicationPacket *app) } //TODO: Defensive makes it not cast? + //TODO: Bankers ect don't let you shjield 6826 You can not perform shielding while you are speaking with a banker, a merchant, or a guildmaster. - if (GetLevel() < 30) { - return; //Client gives message + if (GetLevel() < 30) { //Client gives message + return; } if (GetClass() != WARRIOR){ @@ -12821,7 +12822,10 @@ void Client::Handle_OP_Shielding(const EQApplicationPacket *app) Shielding_Struct* shield = (Shielding_Struct*)app->pBuffer; - shield_target = entity_list.GetMob(shield->target_id); + Mob* shield_target = entity_list.GetMob(shield->target_id); + + Shout("PACKET Shielder %i", shield_target->GetShielderID()); + Shout("PACKET Shield Target %i", GetShieldTargetID()); if (!shield_target) { return; @@ -12838,13 +12842,13 @@ void Client::Handle_OP_Shielding(const EQApplicationPacket *app) } //Does 'Shield Target' already have a 'Shielder' - if (shield_target->shield_ability.shielder_id = GetID()) { + if (shield_target->GetShielderID() == GetID()) { MessageString(Chat::White, ALREADY_SHIELDED); return; } - //Does 'Shielder' already have a 'Shield Target' already have a shielder - if (shield_ability.shielder_id = GetID()) { + //Does 'Shielder' already have a 'Shield Target' + if (GetShieldTargetID() == GetID()) { MessageString(Chat::White, ALREADY_SHIELDED); return; } @@ -12853,29 +12857,31 @@ void Client::Handle_OP_Shielding(const EQApplicationPacket *app) 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, 1); //Incase of negative effects limit it to range of 1 + max_shielder_distance = std::max(max_shielder_distance, 0); if (shield_target->CalculateDistance(GetX(), GetY(), GetZ()) > static_cast(max_shielder_distance)) { - return; //Too far away, no message is given thoughh. //TODO: Timer to enforce distance check + return; //Too far away, no message is given thoughh. } entity_list.MessageCloseString(this, false, 100, 0, START_SHIELDING, GetName(), shield_target->GetName()); //Apply to Shielder - shield_ability.shielder_id = GetID(); - shield_ability.shield_target_id = shield_target->GetID(); + //shield_ability.shield_target_id = shield_target->GetID(); //Apply to Shield Target - shield_target->shield_ability.shielder_id = GetID(); - shield_target->shield_ability.shield_target_id = shield_target->GetID(); + //shield_target->shield_ability.shielder_id = GetID(); + SetShieldTargetID(shield_target->GetID()); + shield_target->SetShielderID(GetID()); + + //Calculate AA for adding time SPA 255 extend shield duration int shield_duration = 12000; - + Shout("1 Duration %i", shield_duration); shield_duration += (aabonuses.ShieldDuration + itembonuses.ShieldDuration + spellbonuses.ShieldDuration) * 1000; - - shield_duration = std::max(shield_duration, 1000); //Incase of negative modifiers lets just make min duration 1 second. - + Shout("2 Duration %i", shield_duration); + shield_duration = std::max(shield_duration, 1); //Incase of negative modifiers lets just make min duration 1 ms. + Shout("3 Duration %i", shield_duration); shield_timer.Start(shield_duration); return; diff --git a/zone/client_process.cpp b/zone/client_process.cpp index d805be19a..e46493323 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -459,33 +459,16 @@ bool Client::Process() { if (gravity_timer.Check()) DoGravityEffect(); } + + if (shield_timer.Check()) { + Mob *current_shield_target = entity_list.GetMob(GetShieldTargetID()); - if (shield_timer.Check()) - { - if (shield_target) - { - if (!CombatRange(shield_target)) - { - entity_list.MessageCloseString( - this, false, 100, 0, - END_SHIELDING, GetCleanName(), shield_target->GetCleanName()); - for (int y = 0; y < 2; y++) - { - if (shield_target->shielder[y].shielder_id == GetID()) - { - shield_target->shielder[y].shielder_id = 0; - shield_target->shielder[y].shielder_bonus = 0; - } - } - shield_target = 0; - shield_timer.Disable(); - } - } - else - { - shield_target = 0; - shield_timer.Disable(); + if (current_shield_target) { + entity_list.MessageCloseString(this, false, 100, 0, END_SHIELDING, GetCleanName(), current_shield_target->GetCleanName()); } + shield_timer.Disable(); + SetShieldTargetID(0); + current_shield_target->SetShielderID(0); } SpellProcess(); diff --git a/zone/common.h b/zone/common.h index ed1e05e46..5b062e1f6 100644 --- a/zone/common.h +++ b/zone/common.h @@ -22,8 +22,6 @@ #define SEE_POSITION 0.5f //ratio of GetSize() where NPCs try to see for LOS #define CHECK_LOS_STEP 1.0f -#define MAX_SHIELDERS 2 //I dont know if this is based on a client limit - #define ARCHETYPE_HYBRID 1 #define ARCHETYPE_CASTER 2 #define ARCHETYPE_MELEE 3 @@ -679,18 +677,6 @@ typedef struct int level_override; } tProc; -struct Shielders_Struct { - - uint32 shielder_id; - uint16 shielder_bonus; -}; - -struct ShieldAbility_Struct{ - - uint32 shield_target_id; - uint32 shielder_id; -}; - typedef struct { uint16 increment; diff --git a/zone/mob.cpp b/zone/mob.cpp index cbf09646b..ed750eebb 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -260,7 +260,6 @@ Mob::Mob( MR = CR = FR = DR = PR = Corrup = PhR = 0; ExtraHaste = 0; bEnraged = false; - shield_target = nullptr; current_mana = 0; max_mana = 0; hp_regen = in_hp_regen; @@ -375,14 +374,10 @@ Mob::Mob( silenced = false; amnesiad = false; inWater = false; - int m; - for (m = 0; m < MAX_SHIELDERS; m++) { - shielder[m].shielder_id = 0; - shielder[m].shielder_bonus = 0; - } - shield_ability.shield_target_id = 0; - shield_ability.shielder_id = 0; + shield_timer.Disable(); + shield_target_id = 0; + shielder_id = 0; destructibleobject = false; wandertype = 0; diff --git a/zone/mob.h b/zone/mob.h index 1f96da116..40b19467c 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -1086,8 +1086,6 @@ public: void InstillDoubt(Mob *who); int16 GetResist(uint8 type) const; - Mob* GetShieldTarget() const { return shield_target; } - void SetShieldTarget(Mob* mob) { shield_target = mob; } bool HasActiveSong() const { return(bardsong != 0); } bool Charmed() const { return typeofpet == petCharmed; } static uint32 GetLevelHP(uint8 tlevel); @@ -1125,16 +1123,13 @@ public: bool IsMoved() { return moved; } void SetMoved(bool moveflag) { moved = moveflag; } - Shielders_Struct shielder[MAX_SHIELDERS]; - Trade* trade; - ShieldAbility_Struct shield_ability; - void DoShieldDamageOnShielder(Mob* shield_target, int shielder_damage_taken, EQ::skills::SkillType skillInUse); - inline int GetShielderID() { return shield_ability.shielder_id; } - inline int SetShielderID(int ent_id) { shield_ability.shielder_id = ent_id; } - inline int GetShieldTargetID() { return shield_ability.shield_target_id; } - inline int SetShieldTargetID(int ent_id) { shield_ability.shield_target_id = ent_id; } + void DoShieldDamageOnShielder(Mob* shield_target, int hit_damage_done, EQ::skills::SkillType skillInUse); + inline int GetShielderID() const { return shielder_id; } + inline void SetShielderID(int ent_id) { shielder_id = ent_id; } + inline int GetShieldTargetID() const { return shield_target_id; } + inline void SetShieldTargetID(int ent_id) { shield_target_id = ent_id; } inline glm::vec4 GetCurrentWayPoint() const { return m_CurrentWayPoint; } inline float GetCWPP() const { return(static_cast(cur_wp_pause)); } @@ -1435,6 +1430,10 @@ protected: Timer mana_timer; Timer focus_proc_limit_timer; + Timer shield_timer; + uint32 shield_target_id; + uint32 shielder_id; + //spell casting vars Timer spellend_timer; uint16 casting_spell_id; @@ -1481,8 +1480,6 @@ protected: uint8 aa_title; - Mob* shield_target; - int ExtraHaste; // for the #haste command bool mezzed; bool stunned; diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index 71fcb02a4..386ea3115 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -4188,7 +4188,7 @@ XS(XS_Mob_GetShieldTarget) { Mob *THIS; Mob *RETVAL; VALIDATE_THIS_IS_MOB; - RETVAL = THIS->GetShieldTarget(); + //RETVAL = THIS->GetShieldTarget(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); } @@ -4212,7 +4212,7 @@ XS(XS_Mob_SetShieldTarget) { if (mob == nullptr) Perl_croak(aTHX_ "mob is nullptr, avoiding crash."); - THIS->SetShieldTarget(mob); + //THIS->SetShieldTarget(mob); } XSRETURN_EMPTY; }