diff --git a/changelog.txt b/changelog.txt index 8ce0b286e..a81820495 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,13 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 01/27/2014 == +Kayen: Implemented SE_CriticalMend (chance to critical monk mend) +Kayen: Implemented SE_IncreaseChanceMemwipe (increases the chance to wipe hate with memory blurr) +Kayen: Implemented SE_FcStunTimeMod (modify stun duration from casted spells) +Kayen: Implemented SE_StunBashChance (increase chance to stun from bash) + +Required SQL: utils/sql/git/2014_01_27_CritcalMendAA.sql + == 01/26/2014 == Kayen: Revised 'dispel' type spell effects (ie cancel magic) to be consistent with live diff --git a/common/spdat.h b/common/spdat.h index 5f4d419af..b9b9ecec4 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -279,7 +279,7 @@ typedef enum { #define SE_SpellHateMod 130 // implemented #define SE_ReduceReagentCost 131 // implemented #define SE_ReduceManaCost 132 // implemented -#define SE_ApplyEffect2 133 // implemented - Apply additional spell to target +#define SE_FcStunTimeMod 133 // implemented - Modify duration of stuns. #define SE_LimitMaxLevel 134 // implemented #define SE_LimitResist 135 // implemented #define SE_LimitTarget 136 // implemented @@ -377,7 +377,7 @@ typedef enum { #define SE_ReduceFallDamage 228 // not implented as bonus - reduce the damage that you take from falling #define SE_PersistantCasting 229 // implemented #define SE_ExtendedShielding 230 // not used as bonus - increase range of /shield ability -//#define SE_StunBashChance 231 // not used *Unknown limit used in AA Overpowering Strikes (Decrease chance stun resist) +#define SE_StunBashChance 231 // implemented - increase chance to stun from bash. #define SE_DivineSave 232 // implemented (base1 == % chance on death to insta-res) (base2 == spell cast on save) #define SE_Metabolism 233 // *not implemented - (Crown of Feathers) Increase metabolism? #define SE_ReduceApplyPoisonTime 234 // not implemented as bonus - reduces the time to apply poison @@ -388,7 +388,7 @@ typedef enum { #define SE_FeignedCastOnChance 239 // *not implemented as bonus - ability gives you an increasing chance for your feigned deaths to not be revealed by spells cast upon you. //#define SE_StringUnbreakable 240 // not used [Likely related to above - you become immune to feign breaking on a resisted spell and have a good chance of feigning through a spell that successfully lands upon you.] #define SE_ImprovedReclaimEnergy 241 // not implemented as bonus - increase the amount of mana returned to you when reclaiming your pet. -#define SE_ChanceWipeHateList 242 // *not implemented - increases the chance to wipe hate with memory blurr +#define SE_IncreaseChanceMemwipe 242 // implemented - increases the chance to wipe hate with memory blurr #define SE_CharmBreakChance 243 // implemented - Total Domination #define SE_RootBreakChance 244 // implemented[AA] reduce the chance that your root will break. #define SE_TrapCircumvention 245 // *not implemented[AA] - decreases the chance that you will set off a trap when opening a chest @@ -421,7 +421,7 @@ typedef enum { #define SE_CastingLevel2 272 // implemented #define SE_CriticalDoTChance 273 // implemented #define SE_CriticalHealChance 274 // implemented -//#define SE_CriticalMend 275 // not used +#define SE_CriticalMend 275 // implemented[AA] - chance to critical monk mend #define SE_Ambidexterity 276 // implemented[AA] - increase chance to duel weild by adding bonus 'skill' #define SE_UnfailingDivinity 277 // implemented[AA] - ability grants your Death Pact-type spells a second chance to successfully heal their target, also can cause said spells to do a portion of their healing value even on a complete failure. #define SE_FinishingBlow 278 // implemented[AA] - chance to do massive damage under 10% HP (base1 = chance, base2 = damage) diff --git a/utils/sql/git/required/2014_01_27_CritcalMendAA.sql b/utils/sql/git/required/2014_01_27_CritcalMendAA.sql new file mode 100644 index 000000000..bc3907e9a --- /dev/null +++ b/utils/sql/git/required/2014_01_27_CritcalMendAA.sql @@ -0,0 +1,9 @@ +-- Critical Mend +INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('230', '1', '275', '10', '0'); +INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('230', '1', '275', '25', '0'); +INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('230', '1', '275', '50', '0'); +-- Mending of the Tranquil +INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('539', '1', '275', '15', '0'); +INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('539', '1', '275', '25', '0'); +INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('539', '1', '275', '35', '0'); + diff --git a/zone/attack.cpp b/zone/attack.cpp index b11bcb60d..a557c318f 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3562,7 +3562,9 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons // Clients can stun mobs under level 56 with their bash/kick when they get level 55 or greater. if( attacker->IsNPC() || (attacker->IsClient() && attacker->GetLevel() >= RuleI(Combat, ClientStunLevel) && GetLevel() < RuleI(Spells, BaseImmunityLevel)) ) { - if (MakeRandomInt(0,99) < (RuleI(Character, NPCBashKickStunChance)) || attacker->IsClient()) + int8 StunBashChanceBonus = spellbonuses.StunBashChance + itembonuses.StunBashChance + aabonuses.StunBashChance; + + if (MakeRandomInt(0,99) < ((RuleI(Character, NPCBashKickStunChance) + StunBashChanceBonus)) || attacker->IsClient()) { int stun_resist = itembonuses.StunResist+spellbonuses.StunResist; int frontal_stun_resist = itembonuses.FrontalStunResist+spellbonuses.FrontalStunResist; diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 66abe90b4..1425b34e7 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -1200,6 +1200,18 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) } break; } + + case SE_StunBashChance: + newbon->StunBashChance += base1; + break; + + case SE_IncreaseChanceMemwipe: + newbon->IncreaseChanceMemwipe += base1; + break; + + case SE_CriticalMend: + newbon->CriticalMend += base1; + break; } } } @@ -2416,6 +2428,18 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne newbon->TwoHandBluntBlock += effect_value; break; + case SE_StunBashChance: + newbon->StunBashChance += effect_value; + break; + + case SE_IncreaseChanceMemwipe: + newbon->IncreaseChanceMemwipe += effect_value; + break; + + case SE_CriticalMend: + newbon->CriticalMend += effect_value; + break; + case SE_SpellEffectResistChance: { for(int e = 0; e < MAX_RESISTABLE_EFFECTS*2; e+=2) @@ -2777,6 +2801,8 @@ uint8 Mob::IsFocusEffect(uint16 spell_id,int effect_index, bool AA,uint32 aa_eff return focusFcLimitUse; case SE_FcMute: return focusFcMute; + case SE_FcStunTimeMod: + return focusFcStunTimeMod; case SE_CriticalHealRate: return focusCriticalHealRate; case SE_AdditionalHeal2: @@ -3775,6 +3801,24 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_DivineAura: spellbonuses.DivineAura = false; break; + + case SE_StunBashChance: + spellbonuses.StunBashChance = effect_value; + itembonuses.StunBashChance = effect_value; + aabonuses.StunBashChance = effect_value; + break; + + case SE_IncreaseChanceMemwipe: + spellbonuses.IncreaseChanceMemwipe = effect_value; + itembonuses.IncreaseChanceMemwipe = effect_value; + aabonuses.IncreaseChanceMemwipe = effect_value; + break; + + case SE_CriticalMend: + spellbonuses.CriticalMend = effect_value; + itembonuses.CriticalMend = effect_value; + aabonuses.CriticalMend = effect_value; + break; } } diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 3de2e7f20..25e5e04f9 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -7610,19 +7610,8 @@ void Client::Handle_OP_Mend(const EQApplicationPacket *app) int mendhp = GetMaxHP() / 4; int currenthp = GetHP(); if (MakeRandomInt(0, 199) < (int)GetSkill(SkillMend)) { - int criticalchance = 0; - switch(GetAA(aaCriticalMend)){ - case 1: - criticalchance = 5; - break; - case 2: - criticalchance = 10; - break; - case 3: - criticalchance = 25; - break; - } - criticalchance += 5*GetAA(aaMendingoftheTranquil); + + int criticalchance = spellbonuses.CriticalMend + itembonuses.CriticalMend + aabonuses.CriticalMend; if(MakeRandomInt(0,99) < criticalchance){ mendhp *= 2; diff --git a/zone/common.h b/zone/common.h index a8685846f..46292828c 100644 --- a/zone/common.h +++ b/zone/common.h @@ -78,6 +78,7 @@ typedef enum { //focus types focusIncreaseNumHits, focusFcLimitUse, focusFcMute, + focusFcStunTimeMod, focusCriticalHealRate, focusAdditionalHeal2, focusAdditionalHeal, @@ -372,6 +373,9 @@ struct StatBonuses { int16 ShieldEquipHateMod; // Hate mod when shield equiped. int16 ShieldEquipDmgMod[2]; // Damage mod when shield equiped. 0 = damage modifier 1 = Unknown bool TriggerOnValueAmount; // Triggers off various different conditions, bool to check if client has effect. + int8 StunBashChance; // chance to stun with bash. + int8 IncreaseChanceMemwipe; // increases chance to memory wipe + int8 CriticalMend; // chance critical monk mend }; typedef struct diff --git a/zone/mob.cpp b/zone/mob.cpp index cf9073710..5079ce25e 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -3211,7 +3211,7 @@ void Mob::TryApplyEffect(Mob *target, uint32 spell_id) for(int i = 0; i < EFFECT_COUNT; i++) { - if (spells[spell_id].effectid[i] == SE_ApplyEffect || spells[spell_id].effectid[i] == SE_ApplyEffect2) + if (spells[spell_id].effectid[i] == SE_ApplyEffect) { if(MakeRandomInt(0, 100) <= spells[spell_id].base[i]) { diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 2f9da8352..9975c1661 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -804,6 +804,10 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) if (stun_resist <= 0 || MakeRandomInt(0,99) >= stun_resist) { mlog(COMBAT__HITS, "Stunned. We had %d percent resist chance.", stun_resist); + + if (caster->IsClient()) + effect_value += effect_value*caster->CastToClient()->GetFocusEffect(focusFcStunTimeMod, spell_id)/100; + Stun(effect_value); } else { if (IsClient()) @@ -1544,6 +1548,9 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) snprintf(effect_desc, _EDLEN, "Memory Blur: %d", effect_value); #endif int wipechance = spells[spell_id].base[i]; + int bonus = spellbonuses.IncreaseChanceMemwipe + itembonuses.IncreaseChanceMemwipe + aabonuses.IncreaseChanceMemwipe; + wipechance += wipechance*bonus/100; + if(MakeRandomInt(0, 100) < wipechance) { if(IsAIControlled()) @@ -2831,7 +2838,6 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) case SE_SpellVulnerability: case SE_SpellTrigger: case SE_ApplyEffect: - case SE_ApplyEffect2: case SE_Twincast: case SE_DelayDeath: case SE_InterruptCasting: @@ -2932,6 +2938,10 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) case SE_FcLimitUse: case SE_FcMute: case SE_FfLimitUseType: + case SE_FcStunTimeMod: + case SE_StunBashChance: + case SE_IncreaseChanceMemwipe: + case SE_CriticalMend: { break; } @@ -4425,6 +4435,14 @@ int16 Client::CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id) break; } + case SE_FcStunTimeMod: + { + if(type == focusFcStunTimeMod) + value = base1; + + break; + } + } } @@ -4949,6 +4967,14 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo break; } + case SE_FcStunTimeMod: + { + if(type == focusFcStunTimeMod) + value = focus_spell.base[i]; + + break; + } + #if EQDEBUG >= 6 //this spits up a lot of garbage when calculating spell focuses //since they have all kinds of extra effects on them.