[Bug Fix] Charm Break Invisibility Fix. (#1855)

- Invisibility vs. Undead and Invisibility vs. Animals were not breaking charm.
- Add Invisibility enumerator.
- Add special identifier for Invisibility vs. Undead and Invisibility vs. Animals.
This commit is contained in:
Kinglykrab 2021-12-01 12:01:19 -05:00 committed by GitHub
parent bc0795bb48
commit 9a0c98397e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 9 deletions

View File

@ -371,4 +371,10 @@ enum AccountStatus : uint8 {
Max = 255
};
enum Invisibility : uint8 {
Visible,
Invisible,
Special = 255
};
#endif /*COMMON_EMU_CONSTANTS_H*/

View File

@ -3465,7 +3465,7 @@ uint8 Client::SlotConvert2(uint8 slot){
void Client::Escape()
{
entity_list.RemoveFromTargets(this, true);
SetInvisible(1);
SetInvisible(Invisibility::Invisible);
MessageString(Chat::Skills, ESCAPE);
}

View File

@ -575,13 +575,16 @@ uint32 Mob::GetAppearanceValue(EmuAppearance iAppearance) {
void Mob::SetInvisible(uint8 state)
{
invisible = state;
SendAppearancePacket(AT_Invis, invisible);
if (state != Invisibility::Special) {
invisible = state;
SendAppearancePacket(AT_Invis, invisible);
}
// Invis and hide breaks charms
auto formerpet = GetPet();
if (formerpet && formerpet->GetPetType() == petCharmed && (invisible || hidden || improved_hidden || invisible_animals || invisible_undead)) {
if (RuleB(Pets, LivelikeBreakCharmOnInvis) || IsInvisible(formerpet)) {
formerpet->BuffFadeByEffect(SE_Charm);
auto pet = GetPet();
if (pet && pet->GetPetType() == petCharmed && (invisible || hidden || improved_hidden || invisible_animals || invisible_undead)) {
if (RuleB(Pets, LivelikeBreakCharmOnInvis) || IsInvisible(pet)) {
pet->BuffFadeByEffect(SE_Charm);
}
LogRules("Pets:LivelikeBreakCharmOnInvis for [{}] | Invis [{}] - Hidden [{}] - Shroud of Stealth [{}] - IVA [{}] - IVU [{}]", GetCleanName(), invisible, hidden, improved_hidden, invisible_animals, invisible_undead);

View File

@ -593,6 +593,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
snprintf(effect_desc, _EDLEN, "Invisibility to Animals");
#endif
invisible_animals = true;
SetInvisible(Invisibility::Special);
break;
}
@ -603,6 +604,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
snprintf(effect_desc, _EDLEN, "Invisibility to Undead");
#endif
invisible_undead = true;
SetInvisible(Invisibility::Special);
break;
}
case SE_SeeInvis:
@ -2291,7 +2293,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
else
{
entity_list.RemoveFromTargets(caster);
SetInvisible(1);
SetInvisible(Invisibility::Invisible);
}
}
break;
@ -4190,7 +4192,7 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses)
case SE_Invisibility2:
case SE_Invisibility:
{
SetInvisible(0);
SetInvisible(Invisibility::Visible);
break;
}