﻿<?xml version="1.0" encoding="utf-16"?>
<EasyQuestProfile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <QuestsSorted>
    <QuestsSorted Action="Pulse" NameClass="WANTEDIseltheHammer" />
    <QuestsSorted Action="Pulse" NameClass="ReclaimingMorheimObj1" />
    <QuestsSorted Action="Pulse" NameClass="ReclaimingMorheimObj2" />
    <QuestsSorted Action="GoToStep" NameClass="0" />
  </QuestsSorted>
  <NpcQuest />
  <Npc />
  <Blackspots />
  <BlackGuids />
  <EasyQuests>
    <EasyQuest>
      <Name>WorldQuestInfo</Name>
      <QuestId />
      <QuestType>FullCSharpCode</QuestType>
      <QuestClass xsi:type="FullCSharpCodeEasyQuestClass">
        <Code>using System;
using System.Collections.Generic;
using System.Linq;
using robotManager.Helpful;
using wManager.Wow.Class;
using wManager.Wow.Enums;
using wManager.Wow.Helpers;

public class WorldQuestInfo : QuestClass
{
	public class WorldQuestData
	{
		public int ID;
		public string Name;
		public System.DateTime ExpireTime;
	}


    public WorldQuestInfo() // Don't forget to use good classe name
    {
        Name = "WorldQuestInfo";
    }

    static List&lt;WorldQuestData&gt; _cache = new List&lt;WorldQuestData&gt;();
    static internal bool _dirty = true;
    static internal bool _setup = false;

    static WorldQuestInfo()
    {
        Setup();
    }

    public static void Setup()
    {
        if (_setup)
            return;

        EventsLua.AttachEventLua(LuaEventsId.WORLD_MAP_UPDATE, m =&gt; WorldQuestMarkDirty());
        EventsLua.AttachEventLua(LuaEventsId.SUPER_TRACKED_QUEST_CHANGED, m =&gt; WorldQuestMarkDirty());
        EventsLua.AttachEventLua(LuaEventsId.WORLD_QUEST_COMPLETED_BY_SPELL, m =&gt; WorldQuestMarkDirty());

        UpdateWorldQuests();
        _setup = true;
    }

    public static void WorldQuestMarkDirty()
    {
        _dirty = true;
    }

    public static bool HasWorldQuest(int questid)
    {
        UpdateWorldQuests();

        var quest = _cache.FirstOrDefault(q =&gt; q.ID == questid);

        if (quest == null || quest.ExpireTime &lt;= System.DateTime.UtcNow)
            return false;
        return true;
    }

    public static void UpdateWorldQuests()
    {
        if (!_dirty)
            return;
        _cache = new List&lt;WorldQuestData&gt;();
        
        int BrokenIslesMapArea = 1007;

        var numZones = Lua.LuaDoString&lt;int&gt;(string.Format("return C_MapCanvas.GetNumZones({0});", BrokenIslesMapArea));

        for (int i = 1; i &lt; numZones; ++i)
        {
            var zoneID = Lua.LuaDoString&lt;int&gt;(string.Format("local zoneMapID, zoneName, zoneDepth, left, right, top, bottom = C_MapCanvas.GetZoneInfo({0}, {1}); return zoneMapID;", BrokenIslesMapArea, i));
            var zoneName = Lua.LuaDoString&lt;string&gt;(string.Format("local zoneMapID, zoneName, zoneDepth, left, right, top, bottom = C_MapCanvas.GetZoneInfo({0}, {1}); return zoneName;", BrokenIslesMapArea, i));
            var zoneDepth = Lua.LuaDoString&lt;int&gt;(string.Format("local zoneMapID, zoneName, zoneDepth, left, right, top, bottom = C_MapCanvas.GetZoneInfo({0}, {1}); return zoneDepth;", BrokenIslesMapArea, i));

            if (zoneDepth &gt; 1) //Do not look at subzones
            {
                Logging.WriteDebug(string.Format("[WorldQuestInfo] Ignoring {0} ({1}) as ZoneDepth &gt; 1 ({2})", zoneID, zoneName, zoneDepth));
                continue;
            }

            string toRun = string.Format(@"     local questids = '';

                    			                    local taskInfo = C_TaskQuest.GetQuestsForPlayerByMapID({0}, {1});

                                                    if taskInfo then
				                                                    for i, info in ipairs(taskInfo) do
					                                                    if HaveQuestData(info.questId) then
						                                                    if QuestMapFrame_IsQuestWorldQuest(info.questId) then
                                                                                    questids = questids .. info.questId .. '#LUASEPARATOR#';
							                                                    end
						                                                    end
					                                                    end
				                                                    end
                                                   return questids;
                                                ".Replace("#LUASEPARATOR#", Lua.ListSeparator), zoneID, BrokenIslesMapArea);

            var questids = Lua.LuaDoString&lt;List&lt;int&gt;&gt;(toRun);

            foreach (var questid in questids)
            {
                if (questid &lt;= 0)
                    continue;

                //TimeLeft is in minutes
                var TimeLeft = Lua.LuaDoString&lt;int&gt;(string.Format("return C_TaskQuest.GetQuestTimeLeftMinutes({0});", questid));
                var QuestInfo = Lua.LuaDoString&lt;string&gt;(string.Format("return C_TaskQuest.GetQuestInfoByQuestID({0});", questid));

                Logging.WriteDebug(string.Format("[WorldQuestInfo] WorldQuest {0} ({2}) active ({1}m left)", QuestInfo, TimeLeft, questid));

                var data = new WorldQuestData();
                data.ID = questid;
                data.Name = QuestInfo;
                data.ExpireTime = DateTime.UtcNow.AddMinutes(TimeLeft);
                _cache.Add(data);
            }
        }

        _dirty = false;
    }

    public static bool IsWorldQuest(int questid)
    {
        string lua = string.Format("local tagID, tagName, worldQuestType, rarity, isElite, tradeskillLineIndex = GetQuestTagInfo({0}); return worldQuestType;", questid);

        var ret = Lua.LuaDoString&lt;string&gt;(lua);

        if (string.IsNullOrWhiteSpace(ret) || ret == "nil")
            return false;
        return true;
    }
}</Code>
      </QuestClass>
      <ObjectiveCount1>0</ObjectiveCount1>
      <ObjectiveCount2>0</ObjectiveCount2>
      <ObjectiveCount3>0</ObjectiveCount3>
      <ObjectiveCount4>0</ObjectiveCount4>
      <ObjectiveCount5>0</ObjectiveCount5>
      <ObjectiveCount6>0</ObjectiveCount6>
      <ObjectiveCount7>0</ObjectiveCount7>
      <ObjectiveCount8>0</ObjectiveCount8>
      <ObjectiveCount9>0</ObjectiveCount9>
      <ObjectiveCount10>0</ObjectiveCount10>
      <AutoDetectObjectiveCount1>false</AutoDetectObjectiveCount1>
      <AutoDetectObjectiveCount2>false</AutoDetectObjectiveCount2>
      <AutoDetectObjectiveCount3>false</AutoDetectObjectiveCount3>
      <AutoDetectObjectiveCount4>false</AutoDetectObjectiveCount4>
      <AutoDetectObjectiveCount5>false</AutoDetectObjectiveCount5>
      <AutoDetectObjectiveCount6>false</AutoDetectObjectiveCount6>
      <AutoDetectObjectiveCount7>false</AutoDetectObjectiveCount7>
      <AutoDetectObjectiveCount8>false</AutoDetectObjectiveCount8>
      <AutoDetectObjectiveCount9>false</AutoDetectObjectiveCount9>
      <AutoDetectObjectiveCount10>false</AutoDetectObjectiveCount10>
      <CanCondition />
      <IsCompleteCondition />
      <RepeatableQuest>false</RepeatableQuest>
      <NotRequiredInQuestLog>false</NotRequiredInQuestLog>
      <PickUpQuestOnItem>false</PickUpQuestOnItem>
      <PickUpQuestOnItemID>0</PickUpQuestOnItemID>
      <Comment />
      <GossipOptionRewardItem>1</GossipOptionRewardItem>
      <RequiredQuest>0</RequiredQuest>
      <MaxLevel>999</MaxLevel>
      <MinLevel>0</MinLevel>
      <WoWClass>None</WoWClass>
    </EasyQuest>
    <EasyQuest>
      <Name>WANTED: Isel the Hammer</Name>
      <QuestId>
        <int>43452</int>
      </QuestId>
      <QuestType>KillAndLoot</QuestType>
      <QuestClass xsi:type="KillAndLootEasyQuestClass">
        <HotSpots>
          <Vector3 X="2281.308" Y="6186.235" Z="123.051" />
        </HotSpots>
        <EntryTarget>
          <int>43452</int>
        </EntryTarget>
        <IsGrinderNotQuest>false</IsGrinderNotQuest>
      </QuestClass>
      <ObjectiveCount1>1</ObjectiveCount1>
      <ObjectiveCount2>0</ObjectiveCount2>
      <ObjectiveCount3>0</ObjectiveCount3>
      <ObjectiveCount4>0</ObjectiveCount4>
      <ObjectiveCount5>0</ObjectiveCount5>
      <ObjectiveCount6>0</ObjectiveCount6>
      <ObjectiveCount7>0</ObjectiveCount7>
      <ObjectiveCount8>0</ObjectiveCount8>
      <ObjectiveCount9>0</ObjectiveCount9>
      <ObjectiveCount10>0</ObjectiveCount10>
      <AutoDetectObjectiveCount1>false</AutoDetectObjectiveCount1>
      <AutoDetectObjectiveCount2>false</AutoDetectObjectiveCount2>
      <AutoDetectObjectiveCount3>false</AutoDetectObjectiveCount3>
      <AutoDetectObjectiveCount4>false</AutoDetectObjectiveCount4>
      <AutoDetectObjectiveCount5>false</AutoDetectObjectiveCount5>
      <AutoDetectObjectiveCount6>false</AutoDetectObjectiveCount6>
      <AutoDetectObjectiveCount7>false</AutoDetectObjectiveCount7>
      <AutoDetectObjectiveCount8>false</AutoDetectObjectiveCount8>
      <AutoDetectObjectiveCount9>false</AutoDetectObjectiveCount9>
      <AutoDetectObjectiveCount10>false</AutoDetectObjectiveCount10>
      <CanCondition>return WorldQuestInfo.HasWorldQuest(43452);</CanCondition>
      <IsCompleteCondition>return !WorldQuestInfo.HasWorldQuest(43452);</IsCompleteCondition>
      <RepeatableQuest>true</RepeatableQuest>
      <NotRequiredInQuestLog>true</NotRequiredInQuestLog>
      <PickUpQuestOnItem>false</PickUpQuestOnItem>
      <PickUpQuestOnItemID>0</PickUpQuestOnItemID>
      <Comment />
      <GossipOptionRewardItem>1</GossipOptionRewardItem>
      <RequiredQuest>0</RequiredQuest>
      <MaxLevel>999</MaxLevel>
      <MinLevel>0</MinLevel>
      <WoWClass>None</WoWClass>
    </EasyQuest>
    <EasyQuest>
      <Name>Reclaiming Morheim Obj 1</Name>
      <QuestId>
        <int>42177</int>
      </QuestId>
      <QuestType>KillAndLoot</QuestType>
      <QuestClass xsi:type="KillAndLootEasyQuestClass">
        <HotSpots>
          <Vector3 X="2340.17" Y="6129.375" Z="125.7599" />
        </HotSpots>
        <EntryTarget>
          <int>98501</int>
          <int>110258</int>
          <int>98498</int>
          <int>98500</int>
          <int>98502</int>
        </EntryTarget>
        <IsGrinderNotQuest>false</IsGrinderNotQuest>
      </QuestClass>
      <ObjectiveCount1>8</ObjectiveCount1>
      <ObjectiveCount2>0</ObjectiveCount2>
      <ObjectiveCount3>0</ObjectiveCount3>
      <ObjectiveCount4>0</ObjectiveCount4>
      <ObjectiveCount5>0</ObjectiveCount5>
      <ObjectiveCount6>0</ObjectiveCount6>
      <ObjectiveCount7>0</ObjectiveCount7>
      <ObjectiveCount8>0</ObjectiveCount8>
      <ObjectiveCount9>0</ObjectiveCount9>
      <ObjectiveCount10>0</ObjectiveCount10>
      <AutoDetectObjectiveCount1>false</AutoDetectObjectiveCount1>
      <AutoDetectObjectiveCount2>false</AutoDetectObjectiveCount2>
      <AutoDetectObjectiveCount3>false</AutoDetectObjectiveCount3>
      <AutoDetectObjectiveCount4>false</AutoDetectObjectiveCount4>
      <AutoDetectObjectiveCount5>false</AutoDetectObjectiveCount5>
      <AutoDetectObjectiveCount6>false</AutoDetectObjectiveCount6>
      <AutoDetectObjectiveCount7>false</AutoDetectObjectiveCount7>
      <AutoDetectObjectiveCount8>false</AutoDetectObjectiveCount8>
      <AutoDetectObjectiveCount9>false</AutoDetectObjectiveCount9>
      <AutoDetectObjectiveCount10>false</AutoDetectObjectiveCount10>
      <CanCondition>return WorldQuestInfo.HasWorldQuest(42177);</CanCondition>
      <IsCompleteCondition>return !WorldQuestInfo.HasWorldQuest(42177);</IsCompleteCondition>
      <RepeatableQuest>true</RepeatableQuest>
      <NotRequiredInQuestLog>true</NotRequiredInQuestLog>
      <PickUpQuestOnItem>false</PickUpQuestOnItem>
      <PickUpQuestOnItemID>0</PickUpQuestOnItemID>
      <Comment />
      <GossipOptionRewardItem>1</GossipOptionRewardItem>
      <RequiredQuest>0</RequiredQuest>
      <MaxLevel>999</MaxLevel>
      <MinLevel>0</MinLevel>
      <WoWClass>None</WoWClass>
    </EasyQuest>
    <EasyQuest>
      <Name>Reclaiming Morheim Obj 2</Name>
      <QuestId>
        <int>42177</int>
      </QuestId>
      <QuestType>InteractWithNpc</QuestType>
      <QuestClass xsi:type="InteractWithNpcEasyQuestClass">
        <HotSpots>
          <Vector3 X="2359.543" Y="6139.098" Z="128.1657" />
        </HotSpots>
        <GossipOptionNpcInteractWith>1</GossipOptionNpcInteractWith>
        <Macro />
        <IgnoreIfDead>false</IgnoreIfDead>
        <EntryIdTarget>
          <int>98516</int>
          <int>98517</int>
          <int>98518</int>
        </EntryIdTarget>
        <Range>4.5</Range>
      </QuestClass>
      <ObjectiveCount1>0</ObjectiveCount1>
      <ObjectiveCount2>0</ObjectiveCount2>
      <ObjectiveCount3>3</ObjectiveCount3>
      <ObjectiveCount4>0</ObjectiveCount4>
      <ObjectiveCount5>0</ObjectiveCount5>
      <ObjectiveCount6>0</ObjectiveCount6>
      <ObjectiveCount7>0</ObjectiveCount7>
      <ObjectiveCount8>0</ObjectiveCount8>
      <ObjectiveCount9>0</ObjectiveCount9>
      <ObjectiveCount10>0</ObjectiveCount10>
      <AutoDetectObjectiveCount1>false</AutoDetectObjectiveCount1>
      <AutoDetectObjectiveCount2>false</AutoDetectObjectiveCount2>
      <AutoDetectObjectiveCount3>false</AutoDetectObjectiveCount3>
      <AutoDetectObjectiveCount4>false</AutoDetectObjectiveCount4>
      <AutoDetectObjectiveCount5>false</AutoDetectObjectiveCount5>
      <AutoDetectObjectiveCount6>false</AutoDetectObjectiveCount6>
      <AutoDetectObjectiveCount7>false</AutoDetectObjectiveCount7>
      <AutoDetectObjectiveCount8>false</AutoDetectObjectiveCount8>
      <AutoDetectObjectiveCount9>false</AutoDetectObjectiveCount9>
      <AutoDetectObjectiveCount10>false</AutoDetectObjectiveCount10>
      <CanCondition>return WorldQuestInfo.HasWorldQuest(42177);</CanCondition>
      <IsCompleteCondition>return !WorldQuestInfo.HasWorldQuest(42177);</IsCompleteCondition>
      <RepeatableQuest>true</RepeatableQuest>
      <NotRequiredInQuestLog>true</NotRequiredInQuestLog>
      <PickUpQuestOnItem>false</PickUpQuestOnItem>
      <PickUpQuestOnItemID>0</PickUpQuestOnItemID>
      <Comment />
      <GossipOptionRewardItem>1</GossipOptionRewardItem>
      <RequiredQuest>0</RequiredQuest>
      <MaxLevel>999</MaxLevel>
      <MinLevel>0</MinLevel>
      <WoWClass>None</WoWClass>
    </EasyQuest>
  </EasyQuests>
</EasyQuestProfile>