public void UpdateCharmAI() { if (IsCharmed()) { UnitAI newAI = null; if (IsPlayer()) { Unit charmer = GetCharmer(); if (charmer != null) { // first, we check if the creature's own AI specifies an override playerai for its owned players Creature creatureCharmer = charmer.ToCreature(); if (creatureCharmer != null) { CreatureAI charmerAI = creatureCharmer.GetAI(); if (charmerAI != null) { newAI = charmerAI.GetAIForCharmedPlayer(ToPlayer()); } } else { Log.outError(LogFilter.Misc, $"Attempt to assign charm AI to player {GetGUID()} who is charmed by non-creature {GetCharmerGUID()}."); } } if (newAI == null) // otherwise, we default to the generic one { newAI = new SimpleCharmedPlayerAI(ToPlayer()); } } else { Cypher.Assert(IsCreature()); if (IsPossessed() || IsVehicle()) { newAI = new PossessedAI(ToCreature()); } else { newAI = new PetAI(ToCreature()); } } Cypher.Assert(newAI != null); SetAI(newAI); newAI.OnCharmed(true); } else { RestoreDisabledAI(); // Hack: this is required because we want to call OnCharmed(true) on the restored AI RefreshAI(); UnitAI ai = GetAI(); if (ai != null) { ai.OnCharmed(true); } } }
public void UpdateCharmAI() { switch (GetTypeId()) { case TypeId.Unit: if (i_disabledAI != null) // disabled AI must be primary AI { if (!IsCharmed()) { i_AI = i_disabledAI; i_disabledAI = null; if (IsTypeId(TypeId.Unit)) { ToCreature().GetAI().OnCharmed(false); } } } else { if (IsCharmed()) { i_disabledAI = i_AI; if (isPossessed() || IsVehicle()) { i_AI = new PossessedAI(ToCreature()); } else { i_AI = new PetAI(ToCreature()); } } } break; case TypeId.Player: { if (IsCharmed()) // if we are currently being charmed, then we should apply charm AI { i_disabledAI = i_AI; UnitAI newAI = null; // first, we check if the creature's own AI specifies an override playerai for its owned players Unit charmer = GetCharmer(); if (charmer) { Creature creatureCharmer = charmer.ToCreature(); if (creatureCharmer) { PlayerAI charmAI = creatureCharmer.IsAIEnabled ? creatureCharmer.GetAI().GetAIForCharmedPlayer(ToPlayer()) : null; if (charmAI != null) { newAI = charmAI; } } else { Log.outError(LogFilter.Misc, "Attempt to assign charm AI to player {0} who is charmed by non-creature {1}.", GetGUID().ToString(), GetCharmerGUID().ToString()); } } if (newAI == null) // otherwise, we default to the generic one { newAI = new SimpleCharmedPlayerAI(ToPlayer()); } i_AI = newAI; newAI.OnCharmed(true); } else { if (i_AI != null) { // we allow the charmed PlayerAI to clean up i_AI.OnCharmed(false); } else { Log.outError(LogFilter.Misc, "Attempt to remove charm AI from player {0} who doesn't currently have charm AI.", GetGUID().ToString()); } // and restore our previous PlayerAI (if we had one) i_AI = i_disabledAI; i_disabledAI = null; // IsAIEnabled gets handled in the caller } break; } default: Log.outError(LogFilter.Misc, "Attempt to update charm AI for unit {0}, which is neither player nor creature.", GetGUID().ToString()); break; } }