mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 17:51:28 +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_PACT_OF_HATE_RECOURSE 40375
|
||||||
#define SPELL_INCENDIARY_OOZE_BUFF 32513
|
#define SPELL_INCENDIARY_OOZE_BUFF 32513
|
||||||
#define SPELL_EYE_OF_ZOMM 323
|
#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
|
//spellgroup ids
|
||||||
#define SPELLGROUP_FRENZIED_BURNOUT 2754
|
#define SPELLGROUP_FRENZIED_BURNOUT 2754
|
||||||
|
|||||||
@ -652,55 +652,10 @@ void Client::CompleteConnect()
|
|||||||
|
|
||||||
for (int x1 = 0; x1 < EFFECT_COUNT; x1++) {
|
for (int x1 = 0; x1 < EFFECT_COUNT; x1++) {
|
||||||
switch (spell.effect_id[x1]) {
|
switch (spell.effect_id[x1]) {
|
||||||
case SE_IllusionCopy:
|
|
||||||
case SE_Illusion: {
|
case SE_Illusion: {
|
||||||
if (spell.base_value[x1] == -1) {
|
if (buffs[j1].persistant_buff) {
|
||||||
if (gender == 1)
|
Mob *caster = entity_list.GetMobID(buffs[j1].casterid);
|
||||||
gender = 0;
|
ApplySpellEffectIllusion(spell.id, caster, j1, spell.base_value[x1], spell.limit_value[x1], spell.max_value[x1]);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -356,6 +356,7 @@ public:
|
|||||||
void BeamDirectional(uint16 spell_id, int16 resist_adjust);
|
void BeamDirectional(uint16 spell_id, int16 resist_adjust);
|
||||||
void ConeDirectional(uint16 spell_id, int16 resist_adjust);
|
void ConeDirectional(uint16 spell_id, int16 resist_adjust);
|
||||||
void TryOnSpellFinished(Mob *caster, Mob *target, uint16 spell_id);
|
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
|
//Buff
|
||||||
void BuffProcess();
|
void BuffProcess();
|
||||||
|
|||||||
@ -1397,114 +1397,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
|||||||
#ifdef SPELL_EFFECT_SPAM
|
#ifdef SPELL_EFFECT_SPAM
|
||||||
snprintf(effect_desc, _EDLEN, "Illusion: race %d", effect_value);
|
snprintf(effect_desc, _EDLEN, "Illusion: race %d", effect_value);
|
||||||
#endif
|
#endif
|
||||||
// Gender Illusions
|
ApplySpellEffectIllusion(spell_id, caster, buffslot, spells[spell_id].base_value[i], spells[spell_id].limit_value[i], spells[spell_id].max_value[i]);
|
||||||
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;
|
|
||||||
break;
|
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);
|
int res = CalcBuffDuration_formula(castlevel, formula, duration);
|
||||||
if (caster == target && (target->aabonuses.IllusionPersistence || target->spellbonuses.IllusionPersistence ||
|
if (caster == target && (target->aabonuses.IllusionPersistence || target->spellbonuses.IllusionPersistence ||
|
||||||
target->itembonuses.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
|
res = 10000; // ~16h override
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user