[Spells] Fixed issue with permanent Illusions not being consistent when zoning. (#1876)

* start of work

* updates

* [Spells] Fixed issue with permanent Illusions not being consistent when zoning.
This commit is contained in:
KayenEQ 2021-12-10 12:21:19 -05:00 committed by GitHub
parent eb2b4fd9e0
commit 550485ba33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 126 additions and 157 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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();

View File

@ -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;
}
}

View File

@ -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