bool Mob::PassCharismaCheck(Mob* caster, uint16 spell_id) { /* Charm formula is correct based on over 50 hours of personal live parsing - Kayen Charisma ONLY effects the initial resist check when charm is cast with 10 CHA = -1 Resist mod up to 255 CHA (min ~ 75 CHA) Charisma DOES NOT extend charm durations. Base effect value of charm spells in the spell file DOES NOT effect duration OR resist rate (unclear if does anything) Charm has a lower limit of 5% chance to break per tick, regardless of resist modifiers / level difference. */ if(!caster) return false; if(spells[spell_id].ResistDiff <= -600) return true; float resist_check = 0; if(IsCharmSpell(spell_id)) { if (spells[spell_id].no_resist) //If charm spell has this set(-1), it can not break till end of duration. return true; //1: The mob has a default 25% chance of being allowed a resistance check against the charm. if (zone->random.Int(0, 99) > RuleI(Spells, CharmBreakCheckChance)) return true; if (RuleB(Spells, CharismaCharmDuration)) resist_check = ResistSpell(spells[spell_id].resisttype, spell_id, caster,false,0,true,true); else resist_check = ResistSpell(spells[spell_id].resisttype, spell_id, caster, false,0, false, true); //2: The mob makes a resistance check against the charm if (resist_check == 100) return true; else { if (caster->IsClient()) { //3: At maxed ability, Total Domination has a 50% chance of preventing the charm break that otherwise would have occurred. int16 TotalDominationBonus = caster->aabonuses.CharmBreakChance + caster->spellbonuses.CharmBreakChance + caster->itembonuses.CharmBreakChance; if (zone->random.Int(0, 99) < TotalDominationBonus) return true; } } } else { // Assume this is a harmony/pacify spell // If 'Lull' spell resists, do a second resist check with a charisma modifier AND regular resist checks. If resists agian you gain aggro. resist_check = ResistSpell(spells[spell_id].resisttype, spell_id, caster, false,0,true); if (resist_check == 100) return true; } return false; }
bool IsDebuffSpell(uint16 spell_id) { if(IsBeneficialSpell(spell_id) || IsEffectHitpointsSpell(spell_id) || IsStunSpell(spell_id) || IsMezSpell(spell_id) || IsCharmSpell(spell_id) || IsSlowSpell(spell_id) || IsEffectInSpell(spell_id, SE_Root) || IsEffectInSpell(spell_id, SE_CancelMagic) || IsEffectInSpell(spell_id, SE_MovementSpeed) || IsFearSpell(spell_id) || IsEffectInSpell(spell_id, SE_Calm)) return false; else return true; }
bool Mob::PassCharismaCheck(Mob* caster, Mob* spellTarget, uint16 spell_id) { if(!caster) return false; if(spells[spell_id].ResistDiff <= -600) return true; //Applies additional Charisma bonus to resist rate float resist_check = ResistSpell(spells[spell_id].resisttype, spell_id, caster,0,0,1); if(IsCharmSpell(spell_id)) { if (spells[spell_id].powerful_flag == -1) //If charm spell has this set(-1), it can not break till end of duration. return true; //1: The mob has a default 25% chance of being allowed a resistance check against the charm. if (MakeRandomInt(0, 100) > RuleI(Spells, CharmBreakCheckChance)) return true; //2: The mob makes a resistance check against the charm if (resist_check == 100) return true; else { if (caster->IsClient()) { //3: At maxed ability, Total Domination has a 50% chance of preventing the charm break that otherwise would have occurred. uint16 TotalDominationBonus = caster->aabonuses.CharmBreakChance + caster->spellbonuses.CharmBreakChance + caster->itembonuses.CharmBreakChance; if (MakeRandomInt(0, 100) < TotalDominationBonus) return true; } } } else { // Assume this is a harmony/pacify spell if (resist_check == 100) return true; } return false; }
int32 Client::GetActSpellDuration(uint16 spell_id, int32 duration) { if (spells[spell_id].not_extendable) return duration; int increase = 100; increase += GetFocusEffect(focusSpellDuration, spell_id); int tic_inc = 0; tic_inc = GetFocusEffect(focusSpellDurByTic, spell_id); // Only need this for clients, since the change was for bard songs, I assume we should keep non bard songs getting +1 // However if its bard or not and is mez, charm or fear, we need to add 1 so that client is in sync if (!(IsShortDurationBuff(spell_id) && IsBardSong(spell_id)) || IsFearSpell(spell_id) || IsCharmSpell(spell_id) || IsMezSpell(spell_id) || IsBlindSpell(spell_id)) tic_inc += 1; return (((duration * increase) / 100) + tic_inc); }