I have found this profile: https://www.thebuddyforum.com/honorbuddy-forum/honorbuddy-profiles/267654-world-quests-wip.html
Converted for WRobot: TestWorldQuest.xml (not tested)
Class 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 WorldQuestData
{
public int ID;
public string Name;
public System.DateTime ExpireTime;
}
public class WorldQuestInfo : QuestClass
{
public WorldQuestInfo()
{
Name = "WorldQuestInfo";
}
static List<WorldQuestData> _cache = new List<WorldQuestData>();
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 => WorldQuestMarkDirty());
EventsLua.AttachEventLua(LuaEventsId.SUPER_TRACKED_QUEST_CHANGED, m => WorldQuestMarkDirty());
EventsLua.AttachEventLua(LuaEventsId.WORLD_QUEST_COMPLETED_BY_SPELL, m => WorldQuestMarkDirty());
UpdateWorldQuests();
_setup = true;
}
public static void WorldQuestMarkDirty()
{
_dirty = true;
}
public static bool HasWorldQuest(int questid)
{
UpdateWorldQuests();
var quest = _cache.FirstOrDefault(q => q.ID == questid);
if (quest == null || quest.ExpireTime <= System.DateTime.UtcNow)
return false;
return true;
}
public static void UpdateWorldQuests()
{
if (!_dirty)
return;
_cache = new List<WorldQuestData>();
int BrokenIslesMapArea = 1007;
var numZones = Lua.LuaDoString<int>(string.Format("return C_MapCanvas.GetNumZones({0});", BrokenIslesMapArea));
for (int i = 1; i < numZones; ++i)
{
var zoneID = Lua.LuaDoString<int>(string.Format("local zoneMapID, zoneName, zoneDepth, left, right, top, bottom = C_MapCanvas.GetZoneInfo({0}, {1}); return zoneMapID;", BrokenIslesMapArea, i));
var zoneName = Lua.LuaDoString<string>(string.Format("local zoneMapID, zoneName, zoneDepth, left, right, top, bottom = C_MapCanvas.GetZoneInfo({0}, {1}); return zoneName;", BrokenIslesMapArea, i));
var zoneDepth = Lua.LuaDoString<int>(string.Format("local zoneMapID, zoneName, zoneDepth, left, right, top, bottom = C_MapCanvas.GetZoneInfo({0}, {1}); return zoneDepth;", BrokenIslesMapArea, i));
if (zoneDepth > 1) //Do not look at subzones
{
Logging.WriteDebug(string.Format("[WorldQuestInfo] Ignoring {0} ({1}) as ZoneDepth > 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<List<int>>(toRun);
foreach (var questid in questids)
{
if (questid <= 0)
continue;
//TimeLeft is in minutes
var TimeLeft = Lua.LuaDoString<int>(string.Format("return C_TaskQuest.GetQuestTimeLeftMinutes({0});", questid));
var QuestInfo = Lua.LuaDoString<string>(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<string>(lua);
if (string.IsNullOrWhiteSpace(ret) || ret == "nil")
return false;
return true;
}
}
Usage:
bool hasWorldQuest = WorldQuestInfo.HasWorldQuest(int QuestId);
bool isWorldQuest = WorldQuestInfo.IsWorldQuest(int questid);