diff --git a/common/spdat.h b/common/spdat.h index 575c8293d..4016821b4 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -163,6 +163,10 @@ #define SPELL_PACT_OF_HATE_RECOURSE 40375 #define SPELL_INCENDIARY_OOZE_BUFF 32513 #define SPELL_EYE_OF_ZOMM 323 +#define SPELL_MINOR_ILLUSION 287 +#define SPELL_ILLUSION_TREE 601 +#define SPELL_ILLUSION_FEMALE 1731 +#define SPELL_ILLUSION_MALE 1732 //spellgroup ids #define SPELLGROUP_FRENZIED_BURNOUT 2754 diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 2e4170c76..526be7058 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -652,55 +652,10 @@ void Client::CompleteConnect() for (int x1 = 0; x1 < EFFECT_COUNT; x1++) { switch (spell.effect_id[x1]) { - case SE_IllusionCopy: case SE_Illusion: { - if (spell.base_value[x1] == -1) { - if (gender == 1) - gender = 0; - else if (gender == 0) - gender = 1; - SendIllusionPacket(GetRace(), gender, 0xFF, 0xFF); - } - else if (spell.base_value[x1] == -2) // WTF IS THIS - { - if (GetRace() == 128 || GetRace() == 130 || GetRace() <= 12) - SendIllusionPacket(GetRace(), GetGender(), spell.limit_value[x1], spell.max_value[x1]); - } - else if (spell.max_value[x1] > 0) - { - SendIllusionPacket(spell.base_value[x1], 0xFF, spell.limit_value[x1], spell.max_value[x1]); - } - else - { - SendIllusionPacket(spell.base_value[x1], 0xFF, 0xFF, 0xFF); - } - switch (spell.base_value[x1]) { - case OGRE: - SendAppearancePacket(AT_Size, 9); - break; - case TROLL: - SendAppearancePacket(AT_Size, 8); - break; - case VAHSHIR: - case BARBARIAN: - SendAppearancePacket(AT_Size, 7); - break; - case HALF_ELF: - case WOOD_ELF: - case DARK_ELF: - case FROGLOK: - SendAppearancePacket(AT_Size, 5); - break; - case DWARF: - SendAppearancePacket(AT_Size, 4); - break; - case HALFLING: - case GNOME: - SendAppearancePacket(AT_Size, 3); - break; - default: - SendAppearancePacket(AT_Size, 6); - break; + if (buffs[j1].persistant_buff) { + Mob *caster = entity_list.GetMobID(buffs[j1].casterid); + ApplySpellEffectIllusion(spell.id, caster, j1, spell.base_value[x1], spell.limit_value[x1], spell.max_value[x1]); } break; } diff --git a/zone/mob.h b/zone/mob.h index 9d94fe311..48c46db37 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -356,6 +356,7 @@ public: void BeamDirectional(uint16 spell_id, int16 resist_adjust); void ConeDirectional(uint16 spell_id, int16 resist_adjust); void TryOnSpellFinished(Mob *caster, Mob *target, uint16 spell_id); + void ApplySpellEffectIllusion(int32 spell_id, Mob* caster, int buffslot, int base, int limit, int max); //Buff void BuffProcess(); diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 401d9de73..90f92a381 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -1397,114 +1397,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove #ifdef SPELL_EFFECT_SPAM snprintf(effect_desc, _EDLEN, "Illusion: race %d", effect_value); #endif - // Gender Illusions - if(spell.base_value[i] == -1) { - // Specific Gender Illusions - if(spell_id == 1732 || spell_id == 1731) { - int specific_gender = -1; - // Male - if(spell_id == 1732) - specific_gender = 0; - // Female - else if (spell_id == 1731) - specific_gender = 1; - if(specific_gender > -1) { - if(caster && caster->GetTarget()) { - SendIllusionPacket - ( - caster->GetTarget()->GetBaseRace(), - specific_gender, - caster->GetTarget()->GetTexture() - ); - } - } - } - // Change Gender Illusions - else { - if(caster && caster->GetTarget()) { - int opposite_gender = 0; - if(caster->GetTarget()->GetGender() == 0) - opposite_gender = 1; - - SendIllusionPacket - ( - caster->GetTarget()->GetRace(), - opposite_gender, - caster->GetTarget()->GetTexture() - ); - } - } - } - // Racial Illusions - else { - auto gender_id = ( - spell.max_value[i] > 0 && - ( - spell.max_value[i] != 3 || - spell.limit_value[i] == 0 - ) ? - (spell.max_value[i] - 1) : - Mob::GetDefaultGender(spell.base_value[i], GetGender()) - ); - - auto race_size = GetRaceGenderDefaultHeight( - spell.base_value[i], - gender_id - ); - - if (spell.base_value[i] != RACE_ELEMENTAL_75) { - if (spell.max_value[i] > 0) { - if (spell.limit_value[i] == 0) { - SendIllusionPacket( - spell.base_value[i], - gender_id - ); - } else { - if (spell.max_value[i] != 3) { - SendIllusionPacket( - spell.base_value[i], - gender_id, - spell.limit_value[i], - spell.max_value[i] - ); - } else { - SendIllusionPacket( - spell.base_value[i], - gender_id, - spell.limit_value[i], - spell.limit_value[i] - ); - } - } - } else { - SendIllusionPacket( - spell.base_value[i], - gender_id, - spell.limit_value[i], - spell.max_value[i] - ); - } - - } else { - SendIllusionPacket( - spell.base_value[i], - gender_id, - spell.limit_value[i] - ); - } - SendAppearancePacket(AT_Size, race_size); - } - - for (int x = EQ::textures::textureBegin; x <= EQ::textures::LastTintableTexture; x++) { - SendWearChange(x); - } - - if (caster == this && spell.id != 287 && spell.id != 601 && - (spellbonuses.IllusionPersistence || aabonuses.IllusionPersistence || - itembonuses.IllusionPersistence)) - buffs[buffslot].persistant_buff = 1; - else - buffs[buffslot].persistant_buff = 0; + ApplySpellEffectIllusion(spell_id, caster, buffslot, spells[spell_id].base_value[i], spells[spell_id].limit_value[i], spells[spell_id].max_value[i]); break; } @@ -8922,3 +8815,119 @@ void Mob::SetProcLimitTimer(int32 base_spell_id, uint32 proc_reuse_time, int pro } } +void Mob::ApplySpellEffectIllusion(int32 spell_id, Mob *caster, int buffslot, int base, int limit, int max) +{ + // Gender Illusions + if (base == -1) { + // Specific Gender Illusions + if (spell_id == SPELL_ILLUSION_MALE || spell_id == SPELL_ILLUSION_FEMALE) { + int specific_gender = -1; + // Male + if (spell_id == SPELL_ILLUSION_MALE) + specific_gender = 0; + // Female + else if (spell_id == SPELL_ILLUSION_FEMALE) + specific_gender = 1; + if (specific_gender > -1) { + if (caster && caster->GetTarget()) { + SendIllusionPacket + ( + caster->GetTarget()->GetBaseRace(), + specific_gender, + caster->GetTarget()->GetTexture() + ); + } + } + } + // Change Gender Illusions + else { + if (caster && caster->GetTarget()) { + int opposite_gender = 0; + if (caster->GetTarget()->GetGender() == 0) + opposite_gender = 1; + + SendIllusionPacket + ( + caster->GetTarget()->GetRace(), + opposite_gender, + caster->GetTarget()->GetTexture() + ); + } + } + } + // Racial Illusions + else { + auto gender_id = ( + max > 0 && + ( + max != 3 || + limit == 0 + ) ? + (max - 1) : + Mob::GetDefaultGender(base, GetGender()) + ); + + auto race_size = GetRaceGenderDefaultHeight( + base, + gender_id + ); + + if (base != RACE_ELEMENTAL_75) { + if (max > 0) { + if (limit == 0) { + SendIllusionPacket( + base, + gender_id + ); + } + else { + if (max != 3) { + SendIllusionPacket( + base, + gender_id, + limit, + max + ); + } + else { + SendIllusionPacket( + base, + gender_id, + limit, + limit + ); + } + } + } + else { + SendIllusionPacket( + base, + gender_id, + limit, + max + ); + } + + } + else { + SendIllusionPacket( + base, + gender_id, + limit + ); + } + SendAppearancePacket(AT_Size, race_size); + } + + for (int x = EQ::textures::textureBegin; x <= EQ::textures::LastTintableTexture; x++) { + SendWearChange(x); + } + + if (caster == this && spell_id != SPELL_MINOR_ILLUSION && spell_id != SPELL_ILLUSION_TREE && + (spellbonuses.IllusionPersistence || aabonuses.IllusionPersistence || itembonuses.IllusionPersistence)) { + buffs[buffslot].persistant_buff = 1; + } + else { + buffs[buffslot].persistant_buff = 0; + } +} diff --git a/zone/spells.cpp b/zone/spells.cpp index ea0f15c22..a23aec6a1 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -2930,7 +2930,7 @@ int Mob::CalcBuffDuration(Mob *caster, Mob *target, uint16 spell_id, int32 caste int res = CalcBuffDuration_formula(castlevel, formula, duration); if (caster == target && (target->aabonuses.IllusionPersistence || target->spellbonuses.IllusionPersistence || target->itembonuses.IllusionPersistence) && - spell_id != 287 && spell_id != 601 && IsEffectInSpell(spell_id, SE_Illusion)) + spell_id != SPELL_MINOR_ILLUSION && spell_id != SPELL_ILLUSION_TREE && IsEffectInSpell(spell_id, SE_Illusion)) res = 10000; // ~16h override