mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 05:21:29 +00:00
[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:
parent
eb2b4fd9e0
commit
550485ba33
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user