public override bool OnTrigger(Player player, AreaTriggerRecord areaTrigger, bool entered)
        {
            if (player.IsInCombat())
            {
                SpellInfo spell = Global.SpellMgr.GetSpellInfo(TeleporterSpells.FROZEN_THRONE_TELEPORT);
                if (spell != null)
                {
                    ObjectGuid castId = ObjectGuid.Create(HighGuid.Cast, SpellCastSource.Normal, player.GetMapId(), spell.Id, player.GetMap().GenerateLowGuid(HighGuid.Cast));
                    Spell.SendCastResult(player, spell, 0, castId, SpellCastResult.AffectingCombat);
                }
                return(true);
            }
            InstanceScript instance = player.GetInstanceScript();

            if (instance != null)
            {
                if (instance.GetBossState(Bosses.ProfessorPutricide) == EncounterState.Done &&
                    instance.GetBossState(Bosses.BloodQueenLanaThel) == EncounterState.Done &&
                    instance.GetBossState(Bosses.Sindragosa) == EncounterState.Done &&
                    instance.GetBossState(Bosses.TheLichKing) != EncounterState.InProgress)
                {
                    player.CastSpell(player, TeleporterSpells.FROZEN_THRONE_TELEPORT, true);
                }
            }

            return(true);
        }
Exemplo n.º 2
0
        void HandleScript(uint effIndex)
        {
            Unit caster = GetCaster();

            if (caster)
            {
                InstanceScript instance = caster.GetInstanceScript();
                if (instance != null)
                {
                    Unit toyPile = Global.ObjAccessor.GetUnit(caster, instance.GetGuidData(InstanceData.ToyPile0 + RandomHelper.URand(0, 3)));
                    if (toyPile)
                    {
                        caster.CastSpell(toyPile, SpellIds.EnergyOrb, true);

                        // This should probably be incorporated in a dummy effect handler, but I've had trouble getting the correct target
                        // Weighed randomization (approximation)
                        uint[] spells = { SpellIds.RechargeScrapbot, SpellIds.RechargeScrapbot, SpellIds.RechargeScrapbot, SpellIds.RechargePummeler, SpellIds.RechargeBoombot };

                        for (byte i = 0; i < 5; ++i)
                        {
                            uint spellId = spells[RandomHelper.IRand(0, 4)];
                            toyPile.CastSpell(toyPile, spellId, true, null, null, instance.GetGuidData(BossIds.Xt002));
                        }
                    }
                }

                Creature creatureBase = caster.GetVehicleCreatureBase();
                if (creatureBase)
                {
                    creatureBase.GetAI().Talk(Texts.Summon);
                }
            }
        }
Exemplo n.º 3
0
        public override bool OnGossipHello(Player player, Creature creature)
        {
            InstanceScript instance = creature.GetInstanceScript();

            if (instance != null &&
                ((instance.GetData((uint)Data.BOSS_GRAND_CHAMPIONS) == (uint)EncounterState.Done &&
                  instance.GetData((uint)Data.BOSS_BLACK_KNIGHT) == (uint)EncounterState.Done &&
                  instance.GetData((uint)Data.BOSS_ARGENT_CHALLENGE_E) == (uint)EncounterState.Done) ||
                 instance.GetData((uint)Data.BOSS_ARGENT_CHALLENGE_P) == (uint)EncounterState.Done))
            {
                return(false);
            }

            if (instance != null &&
                instance.GetData((uint)Data.BOSS_GRAND_CHAMPIONS) == (uint)EncounterState.NotStarted &&
                instance.GetData((uint)Data.BOSS_ARGENT_CHALLENGE_E) == (uint)EncounterState.NotStarted &&
                instance.GetData((uint)Data.BOSS_ARGENT_CHALLENGE_P) == (uint)EncounterState.NotStarted &&
                instance.GetData((uint)Data.BOSS_BLACK_KNIGHT) == (uint)EncounterState.NotStarted)
            {
                player.ADD_GOSSIP_ITEM(GossipOptionIcon.Chat, TrialOfTheChampionConst.GOSSIP_START_EVENT1, eTradeskill.GossipSenderMain, eTradeskill.GossipActionInfoDef + 1);
            }
            else if (instance != null)
            {
                player.ADD_GOSSIP_ITEM(GossipOptionIcon.Chat, TrialOfTheChampionConst.GOSSIP_START_EVENT2, eTradeskill.GossipSenderMain, eTradeskill.GossipActionInfoDef + 1);
            }

            player.SEND_GOSSIP_MENU(player.GetGossipTextId(creature), creature.GetGUID());

            return(true);
        }
Exemplo n.º 4
0
    public void SpawnInstance()
    {
        GameObject instance = GameObject.Instantiate(instPrefab, instParent);

        /* Vector3 v3 = new Vector3(
         *  Random.Range(0, Camera.main.pixelWidth),
         *  Random.Range(0, Camera.main.pixelHeight),
         *  6); */
        //v3 = Camera.main.ScreenToWorldPoint(v3);
        Vector3 v3 = new Vector3(
            notesInfo.notes[sampleWaitTimeIndex].SpawnPosition.x,
            notesInfo.notes[sampleWaitTimeIndex].SpawnPosition.y,
            6);

        v3.z = 0;
        instance.transform.localPosition = v3;
        instance.name = instPrefab.name;

        InstanceScript instScript = instance.AddComponent <InstanceScript>();

        instScript.spawn        = spawn;
        instScript.player       = player;
        instScript.terminateObj = terminateObj;
        instScript.speed        = speed;
        instScript.m_timeSample = (int)nextSpawnTimeSample;
    }
Exemplo n.º 5
0
        public override bool OnGossipHello(Player player, GameObject go)
        {
            InstanceScript instance = go.GetInstanceScript();

            if (instance == null)
            {
                return(false);
            }

            Creature PrinceTaldaram = ObjectAccessor.GetCreature(go, instance.GetGuidData(DataTypes.PrinceTaldaram));

            if (PrinceTaldaram && PrinceTaldaram.IsAlive())
            {
                go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable);
                go.SetGoState(GameObjectState.Active);

                switch (go.GetEntry())
                {
                case GameObjectIds.Sphere1:
                    instance.SetData(DataTypes.Sphere1, (uint)EncounterState.InProgress);
                    PrinceTaldaram.GetAI().Talk(TextIds.Say1);
                    break;

                case GameObjectIds.Sphere2:
                    instance.SetData(DataTypes.Sphere2, (uint)EncounterState.InProgress);
                    PrinceTaldaram.GetAI().Talk(TextIds.Say1);
                    break;
                }

                PrinceTaldaram.GetAI <boss_prince_taldaram.boss_prince_taldaramAI>().CheckSpheres();
            }
            return(true);
        }
Exemplo n.º 6
0
        void HandlePeriodic(AuraEffect eff)
        {
            Unit caster = GetCaster();

            if (!caster)
            {
                return;
            }
            InstanceScript instance = caster.GetInstanceScript();

            if (instance == null)
            {
                return;
            }
            if (instance.GetBossState(ANDataTypes.Hadronox) == EncounterState.Done)
            {
                GetAura().Remove();
            }
            else
            {
                if (caster.GetPositionZ() >= 750.0f)
                {
                    caster.CastSpell(caster, _topSpellId, true);
                }
                else
                {
                    caster.CastSpell(caster, _bottomSpellId, true);
                }
            }
        }
Exemplo n.º 7
0
        public override bool OnTrigger(Player player, AreaTriggerRecord areaTrigger, bool entered)
        {
            if (!entered)
            {
                return(true);
            }

            InstanceScript instance = player.GetInstanceScript();

            if (instance != null)
            {
                if (instance.GetData(DataTypes.CavernActive) != 0)
                {
                    return(true);
                }

                instance.SetData(DataTypes.CavernActive, 1);

                Creature tyrannus = ObjectAccessor.GetCreature(player, instance.GetGuidData(DataTypes.TyrannusEvent));
                if (tyrannus)
                {
                    tyrannus.GetAI().Talk(TextIds.SayTyrannusCavernEntrance);
                }
            }
            return(true);
        }
Exemplo n.º 8
0
        bool GrandChampionsOutVehicle(Creature creature)
        {
            InstanceScript instance = creature.GetInstanceScript();

            if (instance == null)
            {
                return(false);
            }

            Creature pGrandChampion1 = ObjectAccessor.GetCreature(creature, instance.GetGuidData((uint)Data64.DATA_GRAND_CHAMPION_1));
            Creature pGrandChampion2 = ObjectAccessor.GetCreature(creature, instance.GetGuidData((uint)Data64.DATA_GRAND_CHAMPION_2));
            Creature pGrandChampion3 = ObjectAccessor.GetCreature(creature, instance.GetGuidData((uint)Data64.DATA_GRAND_CHAMPION_3));

            if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3)
            {
                if (pGrandChampion1.m_movementInfo.transport.guid.IsEmpty() &&
                    pGrandChampion2.m_movementInfo.transport.guid.IsEmpty() &&
                    pGrandChampion3.m_movementInfo.transport.guid.IsEmpty())
                {
                    return(true);
                }
            }

            return(false);
        }
Exemplo n.º 9
0
        public override bool OnCheck(Player player, Unit target)
        {
            if (!target)
            {
                return(false);
            }

            InstanceScript instance = target.GetInstanceScript();

            if (instance == null)
            {
                return(false);
            }

            foreach (uint watcherData in new[] { ANDataTypes.WatcherGashra, ANDataTypes.WatcherNarjil, ANDataTypes.WatcherSilthik })
            {
                Creature watcher = instance.GetCreature(watcherData);
                if (watcher)
                {
                    if (watcher.IsAlive())
                    {
                        continue;
                    }
                }
                return(false);
            }

            return(true);
        }
Exemplo n.º 10
0
        void ResetAreaTriggerDone(Player player, AreaTriggerRecord trigger)
        {
            InstanceScript instance = player.GetInstanceScript();

            if (instance != null)
            {
                ResetAreaTriggerDone(instance, trigger.Id);
            }
        }
Exemplo n.º 11
0
 void Awake()
 {
     //オブジェクトを登録
     contl = GameObject.Find("FighterComtrol");
     if (contl != null)
     {
         //スクリプトを取得
         InScript = contl.GetComponent <InstanceScript>();
     }
 }
Exemplo n.º 12
0
 void Awake()
 {
     if (!isTest)
     {
         contl            = GameObject.Find("FighterComtrol");
         InScript         = contl.GetComponent <InstanceScript>();
         playSEScript     = GetComponent <PlaySEScript>();
         hpDirectorScript = GetComponent <HPDirectorScript>();
     }
 }
Exemplo n.º 13
0
        void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
        {
            InstanceScript instance = eventInfo.GetActor().GetInstanceScript();

            if (instance == null)
            {
                return;
            }

            instance.DoCastSpellOnPlayers(SpellIds.AchievementCreditNerfScrapbots);
        }
Exemplo n.º 14
0
        public void Reward()
        {
            // 3. Reward killer (and group, if necessary).
            if (_group)
            {
                // 3.1. If killer is in group, reward group.
                _RewardGroup();
            }
            else
            {
                // 3.2. Reward single killer (not group case).
                // 3.2.1. Initialize initial XP amount based on killer's level.
                _InitXP(_killer);
                // To avoid unnecessary calculations and calls,
                // proceed only if XP is not ZERO or player is not on Battleground
                // (Battlegroundrewards only XP, that's why).
                if (!_isBattleground || _xp != 0)
                {
                    // 3.2.2. Reward killer.
                    _RewardPlayer(_killer, false);
                }
            }

            // 5. Credit instance encounter.
            // 6. Update guild achievements.
            // 7. Credit scenario criterias
            Creature victim = _victim.ToCreature();

            if (victim != null)
            {
                if (victim.IsDungeonBoss())
                {
                    InstanceScript instance = _victim.GetInstanceScript();
                    if (instance != null)
                    {
                        instance.UpdateEncounterStateForKilledCreature(_victim.GetEntry(), _victim);
                    }
                }

                uint guildId = victim.GetMap().GetOwnerGuildId();
                var  guild   = Global.GuildMgr.GetGuildById(guildId);
                if (guild != null)
                {
                    guild.UpdateCriteria(CriteriaTypes.KillCreature, victim.GetEntry(), 1, 0, victim, _killer);
                }

                Scenario scenario = victim.GetScenario();
                if (scenario != null)
                {
                    scenario.UpdateCriteria(CriteriaTypes.KillCreature, victim.GetEntry(), 1, 0, victim, _killer);
                }
            }
        }
Exemplo n.º 15
0
        public BossAI(Creature creature, uint bossId) : base(creature)
        {
            instance = creature.GetInstanceScript();
            summons  = new SummonList(creature);
            _bossId  = bossId;

            if (instance != null)
            {
                SetBoundary(instance.GetBossBoundary(bossId));
            }

            _scheduler.SetValidator(() => !me.HasUnitState(UnitState.Casting));
        }
Exemplo n.º 16
0
        public void SendRaidInfo()
        {
            InstanceInfoPkt instanceInfo = new InstanceInfoPkt();

            long now = Time.UnixTime;

            for (byte i = 0; i < (int)Difficulty.Max; ++i)
            {
                foreach (var pair in m_boundInstances[i])
                {
                    InstanceBind bind = pair.Value;
                    if (bind.perm)
                    {
                        InstanceSave save = pair.Value.save;

                        InstanceLockInfos lockInfos;

                        lockInfos.InstanceID   = save.GetInstanceId();
                        lockInfos.MapID        = save.GetMapId();
                        lockInfos.DifficultyID = (uint)save.GetDifficultyID();
                        if (bind.extendState != BindExtensionState.Extended)
                        {
                            lockInfos.TimeRemaining = (int)(save.GetResetTime() - now);
                        }
                        else
                        {
                            lockInfos.TimeRemaining = (int)(Global.InstanceSaveMgr.GetSubsequentResetTime(save.GetMapId(), save.GetDifficultyID(), save.GetResetTime()) - now);
                        }

                        lockInfos.CompletedMask = 0;
                        Map map = Global.MapMgr.FindMap(save.GetMapId(), save.GetInstanceId());
                        if (map != null)
                        {
                            InstanceScript instanceScript = ((InstanceMap)map).GetInstanceScript();
                            if (instanceScript != null)
                            {
                                lockInfos.CompletedMask = instanceScript.GetCompletedEncounterMask();
                            }
                        }

                        lockInfos.Locked   = bind.extendState != BindExtensionState.Expired;
                        lockInfos.Extended = bind.extendState == BindExtensionState.Extended;

                        instanceInfo.LockList.Add(lockInfos);
                    }
                }
            }

            SendPacket(instanceInfo);
        }
Exemplo n.º 17
0
        public override bool OnGossipHello(Player player, GameObject go)
        {
            go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable);
            go.SetGoState(GameObjectState.Active);

            InstanceScript instance = go.GetInstanceScript();

            if (instance != null)
            {
                instance.SetData(GDDataTypes.StatueActivate, go.GetEntry());
                return(true);
            }

            return(false);
        }
Exemplo n.º 18
0
        public void SendRaidInfo()
        {
            InstanceInfoPkt instanceInfo = new();

            long now = GameTime.GetGameTime();

            foreach (var difficultyDic in m_boundInstances.Values)
            {
                foreach (var instanceBind in difficultyDic.Values)
                {
                    if (instanceBind.perm)
                    {
                        InstanceSave save = instanceBind.save;

                        InstanceLock lockInfos;
                        lockInfos.InstanceID   = save.GetInstanceId();
                        lockInfos.MapID        = save.GetMapId();
                        lockInfos.DifficultyID = (uint)save.GetDifficultyID();
                        if (instanceBind.extendState != BindExtensionState.Extended)
                        {
                            lockInfos.TimeRemaining = (int)(save.GetResetTime() - now);
                        }
                        else
                        {
                            lockInfos.TimeRemaining = (int)(Global.InstanceSaveMgr.GetSubsequentResetTime(save.GetMapId(), save.GetDifficultyID(), save.GetResetTime()) - now);
                        }

                        lockInfos.CompletedMask = 0;
                        Map map = Global.MapMgr.FindMap(save.GetMapId(), save.GetInstanceId());
                        if (map != null)
                        {
                            InstanceScript instanceScript = ((InstanceMap)map).GetInstanceScript();
                            if (instanceScript != null)
                            {
                                lockInfos.CompletedMask = instanceScript.GetCompletedEncounterMask();
                            }
                        }

                        lockInfos.Locked   = instanceBind.extendState != BindExtensionState.Expired;
                        lockInfos.Extended = instanceBind.extendState == BindExtensionState.Extended;

                        instanceInfo.LockList.Add(lockInfos);
                    }
                }
            }

            SendPacket(instanceInfo);
        }
Exemplo n.º 19
0
        public override bool OnGossipHello(Player player, GameObject go)
        {
            InstanceScript instance = go.GetInstanceScript();

            Creature pKeristrasza = ObjectAccessor.GetCreature(go, instance.GetGuidData(DataTypes.Keristrasza));

            if (pKeristrasza && pKeristrasza.IsAlive())
            {
                // maybe these are hacks :(
                go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable);
                go.SetGoState(GameObjectState.Active);

                ((boss_keristrasza.boss_keristraszaAI)pKeristrasza.GetAI()).CheckContainmentSpheres(true);
            }
            return(true);
        }
Exemplo n.º 20
0
        public override bool OnTrigger(Player player, AreaTriggerRecord trigger, bool entered)
        {
            uint           triggerId = trigger.Id;
            InstanceScript instance  = player.GetInstanceScript();

            if (instance != null)
            {
                if (instance.IsAreaTriggerDone(triggerId))
                {
                    return(true);
                }
                else
                {
                    instance.MarkAreaTriggerDone(triggerId);
                }
            }
            return(_OnTrigger(player, trigger, entered));
        }
Exemplo n.º 21
0
        public override bool OnTrigger(Player player, AreaTriggerRecord areaTrigger, bool entered)
        {
            InstanceScript instance = player.GetInstanceScript();

            if (instance != null)
            {
                if (instance.GetBossState(Bosses.LadyDeathwhisper) != EncounterState.Done)
                {
                    Creature ladyDeathwhisper = ObjectAccessor.GetCreature(player, instance.GetGuidData(Bosses.LadyDeathwhisper));
                    if (ladyDeathwhisper)
                    {
                        ladyDeathwhisper.GetAI().DoAction(0);
                    }
                }
            }

            return(true);
        }
Exemplo n.º 22
0
            public override void UpdateAI(uint diff)
            {
                if (!_hasTrappedUnit)
                {
                    return;
                }

                _events.Update(diff);

                if (_events.ExecuteEvent() == Misc.EventFailBoned)
                {
                    InstanceScript instance = me.GetInstanceScript();
                    if (instance != null)
                    {
                        instance.SetData(DataTypes.BonedAchievement, 0);
                    }
                }
            }
Exemplo n.º 23
0
        void OnApply(AuraEffect aurEff, AuraEffectHandleModes mode)
        {
            Unit caster = GetCaster();

            if (caster)
            {
                InstanceScript instance = caster.GetInstanceScript();
                if (instance != null)
                {
                    if (instance.GetData(DataTypes.NorthrendBeasts) == NorthrendBeasts.SnakesInProgress || instance.GetData(DataTypes.NorthrendBeasts) == NorthrendBeasts.SnakesSpecial)
                    {
                        return;
                    }
                }
            }

            Remove();
        }
Exemplo n.º 24
0
        public override bool OnTrigger(Player player, AreaTriggerRecord areaTrigger, bool entered)
        {
            if (!entered)
            {
                return(true);
            }

            InstanceScript instance = player.GetInstanceScript();

            if (instance != null)
            {
                instance.SetData(DataTypes.CavernActive, 0);

                if (instance.GetData(DataTypes.IceShardsHit) == 0)
                {
                    instance.DoUpdateCriteria(CriteriaTypes.BeSpellTarget, SpellIds.AchievDontLookUpCredit, 0, player);
                }
            }

            return(true);
        }
Exemplo n.º 25
0
    public void initialSpawn()
    {
        Quaternion rotation = Quaternion.Euler(0, 0, 0);

        if (randomRotation)
        {
            float random = Random.Range(0f, 360f);
            int   zRot;
            if (random <= 90)
            {
                zRot = 0;
            }
            else if (random <= 180)
            {
                zRot = 90;
            }
            else if (random <= 270)
            {
                zRot = 180;
            }
            else
            {
                zRot = 270;
            }
            rotation = Quaternion.Euler(0, 0, zRot);
        }

        while (spawnDistance <= Vector3.Distance(startPos, endPos))        // Gradually spawn the lasers further and further away until spawndistance reaches the max point the laser can move to
        {
            spawnDistance += moveSpeed * Time.fixedDeltaTime * 1000 + startDelay;
            Vector3    spawnPoint = startPos + dir * spawnDistance;      // Get the point 'x' units in the direction it should move towards
            GameObject wall       = (GameObject)Instantiate(prefab, spawnPoint, rotation);
            script               = wall.AddComponent <InstanceScript>(); // This script will handle the actual movement of the prefab, we pass on the target location to that script
            script.xMove         = xMove;
            script.yMove         = yMove;
            script.zMove         = zMove;
            script.moveSpeed     = moveSpeed;
            script.startMovement = true;
        }
    }
Exemplo n.º 26
0
        public override void JustSummoned(Creature summon)
        {
            InstanceScript instance = me.GetInstanceScript();

            if (instance != null)
            {
                ObjectGuid guid = instance.GetGuidData(DTKDataTypes.Novos);
                if (!guid.IsEmpty())
                {
                    Creature novos = ObjectAccessor.GetCreature(me, guid);
                    if (novos)
                    {
                        novos.GetAI().JustSummoned(summon);
                    }
                }
            }

            if (summon)
            {
                summon.GetMotionMaster().MovePath(summon.GetEntry() * 100, false);
            }
        }
Exemplo n.º 27
0
        public override void SummonedCreatureDies(Creature summon, Unit killer)
        {
            if (_crystalHandlerCount < 4)
            {
                return;
            }

            InstanceScript instance = me.GetInstanceScript();

            if (instance != null)
            {
                ObjectGuid guid = instance.GetGuidData(DTKDataTypes.Novos);
                if (!guid.IsEmpty())
                {
                    Creature novos = ObjectAccessor.GetCreature(me, guid);
                    if (novos)
                    {
                        novos.GetAI().DoAction(DTKDataTypes.ActionCrystalHandlerDied);
                    }
                }
            }
        }
Exemplo n.º 28
0
    IEnumerator SpawnInterval()
    {
        Quaternion rotation = Quaternion.Euler(0, 0, 0);

        if (randomRotation)
        {
            float random = Random.Range(0f, 360f);
            int   zRot;
            if (random <= 90)
            {
                zRot = 0;
            }
            else if (random <= 180)
            {
                zRot = 90;
            }
            else if (random <= 270)
            {
                zRot = 180;
            }
            else
            {
                zRot = 270;
            }
            rotation = Quaternion.Euler(0, 0, zRot);
        }
        GameObject wall = (GameObject)Instantiate(prefab, new Vector3(xInit, yInit, zInit), rotation);

        script               = wall.AddComponent <InstanceScript>(); // This script will handle the actual movement of the prefab, we pass on the target location to that script
        script.xMove         = xMove;
        script.yMove         = yMove;
        script.zMove         = zMove;
        script.moveSpeed     = moveSpeed;
        script.startMovement = true;
        yield return(new WaitForSeconds(interval));

        StartCoroutine(SpawnInterval());
    }
Exemplo n.º 29
0
        public void SaveToDB()
        {
            // save instance data too
            string data = "";
            uint   completedEncounters = 0;

            Map map = Global.MapMgr.FindMap(GetMapId(), m_instanceid);

            if (map != null)
            {
                Cypher.Assert(map.IsDungeon());
                InstanceScript instanceScript = ((InstanceMap)map).GetInstanceScript();
                if (instanceScript != null)
                {
                    data = instanceScript.GetSaveData();
                    completedEncounters = instanceScript.GetCompletedEncounterMask();
                    m_entranceId        = instanceScript.GetEntranceLocation();
                }

                InstanceScenario scenario = map.ToInstanceMap().GetInstanceScenario();
                if (scenario != null)
                {
                    scenario.SaveToDB();
                }
            }

            PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_INSTANCE_SAVE);

            stmt.AddValue(0, m_instanceid);
            stmt.AddValue(1, GetMapId());
            stmt.AddValue(2, GetResetTimeForDB());
            stmt.AddValue(3, (uint)GetDifficultyID());
            stmt.AddValue(4, completedEncounters);
            stmt.AddValue(5, data);
            stmt.AddValue(6, m_entranceId);
            DB.Characters.Execute(stmt);
        }
Exemplo n.º 30
0
        public bool Meets(ConditionSourceInfo sourceInfo)
        {
            Cypher.Assert(ConditionTarget < SharedConst.MaxConditionTargets);
            WorldObject obj = sourceInfo.mConditionTargets[ConditionTarget];

            // object not present, return false
            if (obj == null)
            {
                Log.outDebug(LogFilter.Condition, "Condition object not found for condition (Entry: {0} Type: {1} Group: {2})", SourceEntry, SourceType, SourceGroup);
                return(false);
            }
            bool condMeets = false;

            Player player = obj.ToPlayer();
            Unit   unit   = obj.ToUnit();

            switch (ConditionType)
            {
            case ConditionTypes.None:
                condMeets = true;                                        // empty condition, always met
                break;

            case ConditionTypes.Aura:
                if (unit != null)
                {
                    condMeets = unit.HasAuraEffect(ConditionValue1, (byte)ConditionValue2);
                }
                break;

            case ConditionTypes.Item:
                if (player != null)
                {
                    // don't allow 0 items (it's checked during table load)
                    Cypher.Assert(ConditionValue2 != 0);
                    bool checkBank = ConditionValue3 != 0 ? true : false;
                    condMeets = player.HasItemCount(ConditionValue1, ConditionValue2, checkBank);
                }
                break;

            case ConditionTypes.ItemEquipped:
                if (player != null)
                {
                    condMeets = player.HasItemOrGemWithIdEquipped(ConditionValue1, 1);
                }
                break;

            case ConditionTypes.Zoneid:
                condMeets = obj.GetZoneId() == ConditionValue1;
                break;

            case ConditionTypes.ReputationRank:
                if (player != null)
                {
                    var faction = CliDB.FactionStorage.LookupByKey(ConditionValue1);
                    if (faction != null)
                    {
                        condMeets = Convert.ToBoolean(ConditionValue2 & (1 << (int)player.GetReputationMgr().GetRank(faction)));
                    }
                }
                break;

            case ConditionTypes.Achievement:
                if (player != null)
                {
                    condMeets = player.HasAchieved(ConditionValue1);
                }
                break;

            case ConditionTypes.Team:
                if (player != null)
                {
                    condMeets = (uint)player.GetTeam() == ConditionValue1;
                }
                break;

            case ConditionTypes.Class:
                if (unit != null)
                {
                    condMeets = Convert.ToBoolean(unit.GetClassMask() & ConditionValue1);
                }
                break;

            case ConditionTypes.Race:
                if (unit != null)
                {
                    condMeets = Convert.ToBoolean(SharedConst.GetMaskForRace(unit.GetRace()) & ConditionValue1);
                }
                break;

            case ConditionTypes.Gender:
                if (player != null)
                {
                    condMeets = player.GetGender() == (Gender)ConditionValue1;
                }
                break;

            case ConditionTypes.Skill:
                if (player != null)
                {
                    condMeets = player.HasSkill((SkillType)ConditionValue1) && player.GetBaseSkillValue((SkillType)ConditionValue1) >= ConditionValue2;
                }
                break;

            case ConditionTypes.QuestRewarded:
                if (player != null)
                {
                    condMeets = player.GetQuestRewardStatus(ConditionValue1);
                }
                break;

            case ConditionTypes.QuestTaken:
                if (player != null)
                {
                    QuestStatus status = player.GetQuestStatus(ConditionValue1);
                    condMeets = (status == QuestStatus.Incomplete);
                }
                break;

            case ConditionTypes.QuestComplete:
                if (player != null)
                {
                    QuestStatus status = player.GetQuestStatus(ConditionValue1);
                    condMeets = (status == QuestStatus.Complete && !player.GetQuestRewardStatus(ConditionValue1));
                }
                break;

            case ConditionTypes.QuestNone:
                if (player != null)
                {
                    QuestStatus status = player.GetQuestStatus(ConditionValue1);
                    condMeets = (status == QuestStatus.None);
                }
                break;

            case ConditionTypes.ActiveEvent:
                condMeets = Global.GameEventMgr.IsActiveEvent((ushort)ConditionValue1);
                break;

            case ConditionTypes.InstanceInfo:
            {
                var map = obj.GetMap();
                if (map.IsDungeon())
                {
                    InstanceScript instance = ((InstanceMap)map).GetInstanceScript();
                    if (instance != null)
                    {
                        switch ((InstanceInfo)ConditionValue3)
                        {
                        case InstanceInfo.Data:
                            condMeets = instance.GetData(ConditionValue1) == ConditionValue2;
                            break;

                        case InstanceInfo.Data64:
                            condMeets = instance.GetData64(ConditionValue1) == ConditionValue2;
                            break;

                        case InstanceInfo.BossState:
                            condMeets = instance.GetBossState(ConditionValue1) == (EncounterState)ConditionValue2;
                            break;
                        }
                    }
                }
                break;
            }

            case ConditionTypes.Mapid:
                condMeets = obj.GetMapId() == ConditionValue1;
                break;

            case ConditionTypes.Areaid:
                condMeets = obj.GetAreaId() == ConditionValue1;
                break;

            case ConditionTypes.Spell:
                if (player != null)
                {
                    condMeets = player.HasSpell(ConditionValue1);
                }
                break;

            case ConditionTypes.Level:
                if (unit != null)
                {
                    condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue2, unit.GetLevel(), ConditionValue1);
                }
                break;

            case ConditionTypes.DrunkenState:
                if (player != null)
                {
                    condMeets = (uint)Player.GetDrunkenstateByValue(player.GetDrunkValue()) >= ConditionValue1;
                }
                break;

            case ConditionTypes.NearCreature:
                condMeets = obj.FindNearestCreature(ConditionValue1, ConditionValue2, ConditionValue3 == 0 ? true : false) != null;
                break;

            case ConditionTypes.NearGameobject:
                condMeets = obj.FindNearestGameObject(ConditionValue1, ConditionValue2) != null;
                break;

            case ConditionTypes.ObjectEntryGuid:
                if ((uint)obj.GetTypeId() == ConditionValue1)
                {
                    condMeets = ConditionValue2 == 0 || (obj.GetEntry() == ConditionValue2);

                    if (ConditionValue3 != 0)
                    {
                        switch (obj.GetTypeId())
                        {
                        case TypeId.Unit:
                            condMeets &= obj.ToCreature().GetSpawnId() == ConditionValue3;
                            break;

                        case TypeId.GameObject:
                            condMeets &= obj.ToGameObject().GetSpawnId() == ConditionValue3;
                            break;
                        }
                    }
                }
                break;

            case ConditionTypes.TypeMask:
                condMeets = Convert.ToBoolean((TypeMask)ConditionValue1 & obj.ObjectTypeMask);
                break;

            case ConditionTypes.RelationTo:
            {
                WorldObject toObject = sourceInfo.mConditionTargets[ConditionValue1];
                if (toObject != null)
                {
                    Unit toUnit = toObject.ToUnit();
                    if (toUnit != null && unit != null)
                    {
                        switch ((RelationType)ConditionValue2)
                        {
                        case RelationType.Self:
                            condMeets = unit == toUnit;
                            break;

                        case RelationType.InParty:
                            condMeets = unit.IsInPartyWith(toUnit);
                            break;

                        case RelationType.InRaidOrParty:
                            condMeets = unit.IsInRaidWith(toUnit);
                            break;

                        case RelationType.OwnedBy:
                            condMeets = unit.GetOwnerGUID() == toUnit.GetGUID();
                            break;

                        case RelationType.PassengerOf:
                            condMeets = unit.IsOnVehicle(toUnit);
                            break;

                        case RelationType.CreatedBy:
                            condMeets = unit.GetCreatorGUID() == toUnit.GetGUID();
                            break;
                        }
                    }
                }
                break;
            }

            case ConditionTypes.ReactionTo:
            {
                WorldObject toObject = sourceInfo.mConditionTargets[ConditionValue1];
                if (toObject != null)
                {
                    Unit toUnit = toObject.ToUnit();
                    if (toUnit != null && unit != null)
                    {
                        condMeets = Convert.ToBoolean((1 << (int)unit.GetReactionTo(toUnit)) & ConditionValue2);
                    }
                }
                break;
            }

            case ConditionTypes.DistanceTo:
            {
                WorldObject toObject = sourceInfo.mConditionTargets[ConditionValue1];
                if (toObject != null)
                {
                    condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue3, obj.GetDistance(toObject), ConditionValue2);
                }
                break;
            }

            case ConditionTypes.Alive:
                if (unit != null)
                {
                    condMeets = unit.IsAlive();
                }
                break;

            case ConditionTypes.HpVal:
                if (unit != null)
                {
                    condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue2, unit.GetHealth(), ConditionValue1);
                }
                break;

            case ConditionTypes.HpPct:
                if (unit != null)
                {
                    condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue2, unit.GetHealthPct(), ConditionValue1);
                }
                break;

            case ConditionTypes.WorldState:
                condMeets = (ConditionValue2 == Global.WorldMgr.GetWorldState((WorldStates)ConditionValue1));
                break;

            case ConditionTypes.PhaseId:
                condMeets = obj.GetPhaseShift().HasPhase(ConditionValue1);
                break;

            case ConditionTypes.Title:
                if (player != null)
                {
                    condMeets = player.HasTitle(ConditionValue1);
                }
                break;

            case ConditionTypes.UnitState:
                if (unit != null)
                {
                    condMeets = unit.HasUnitState((UnitState)ConditionValue1);
                }
                break;

            case ConditionTypes.CreatureType:
            {
                Creature creature = obj.ToCreature();
                if (creature)
                {
                    condMeets = (uint)creature.GetCreatureTemplate().CreatureType == ConditionValue1;
                }
                break;
            }

            case ConditionTypes.RealmAchievement:
            {
                AchievementRecord achievement = CliDB.AchievementStorage.LookupByKey(ConditionValue1);
                if (achievement != null && Global.AchievementMgr.IsRealmCompleted(achievement))
                {
                    condMeets = true;
                }
                break;
            }

            case ConditionTypes.InWater:
                if (unit)
                {
                    condMeets = unit.IsInWater();
                }
                break;

            case ConditionTypes.TerrainSwap:
                condMeets = obj.GetPhaseShift().HasVisibleMapId(ConditionValue1);
                break;

            case ConditionTypes.StandState:
            {
                if (unit)
                {
                    if (ConditionValue1 == 0)
                    {
                        condMeets = (unit.GetStandState() == (UnitStandStateType)ConditionValue2);
                    }
                    else if (ConditionValue2 == 0)
                    {
                        condMeets = unit.IsStandState();
                    }
                    else if (ConditionValue2 == 1)
                    {
                        condMeets = unit.IsSitState();
                    }
                }
                break;
            }

            case ConditionTypes.DailyQuestDone:
            {
                if (player)
                {
                    condMeets = player.IsDailyQuestDone(ConditionValue1);
                }
                break;
            }

            case ConditionTypes.Charmed:
            {
                if (unit)
                {
                    condMeets = unit.IsCharmed();
                }
                break;
            }

            case ConditionTypes.PetType:
            {
                if (player)
                {
                    Pet pet = player.GetPet();
                    if (pet)
                    {
                        condMeets = (((1 << (int)pet.GetPetType()) & ConditionValue1) != 0);
                    }
                }
                break;
            }

            case ConditionTypes.Taxi:
            {
                if (player)
                {
                    condMeets = player.IsInFlight();
                }
                break;
            }

            case ConditionTypes.Queststate:
            {
                if (player)
                {
                    if (
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.None)) && (player.GetQuestStatus(ConditionValue1) == QuestStatus.None)) ||
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.Complete)) && (player.GetQuestStatus(ConditionValue1) == QuestStatus.Complete)) ||
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.Incomplete)) && (player.GetQuestStatus(ConditionValue1) == QuestStatus.Incomplete)) ||
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.Failed)) && (player.GetQuestStatus(ConditionValue1) == QuestStatus.Failed)) ||
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.Rewarded)) && player.GetQuestRewardStatus(ConditionValue1))
                        )
                    {
                        condMeets = true;
                    }
                }
                break;
            }

            case ConditionTypes.ObjectiveComplete:
            {
                if (player)
                {
                    QuestObjective questObj = Global.ObjectMgr.GetQuestObjective(ConditionValue1);
                    if (questObj == null)
                    {
                        break;
                    }

                    condMeets = (!player.GetQuestRewardStatus(questObj.QuestID) && player.IsQuestObjectiveComplete(questObj));
                }
                break;
            }

            case ConditionTypes.DifficultyId:
            {
                condMeets = (uint)obj.GetMap().GetDifficultyID() == ConditionValue1;
                break;
            }

            default:
                condMeets = false;
                break;
            }

            if (NegativeCondition)
            {
                condMeets = !condMeets;
            }

            if (!condMeets)
            {
                sourceInfo.mLastFailedCondition = this;
            }

            bool script = Global.ScriptMgr.OnConditionCheck(this, sourceInfo); // Returns true by default.

            return(condMeets && script);
        }