Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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;
            }
        }