965e8589c9
I implemented a QuestHelper_GetTime function for the next time Blizzard decides to fiddle with the time functions. It returns debugprofilestop() / 1000, to exactly match the precision of GetTime(). I also re-removed references to Cartographer from the rollback.
282 lignes
7,7 Kio
Lua
282 lignes
7,7 Kio
Lua
|
|
local GetTime = QuestHelper_GetTime
|
|
|
|
QuestHelper_File["quest.lua"] = "4.0.1.$svnversion$"
|
|
QuestHelper_Loadtime["quest.lua"] = GetTime()
|
|
|
|
do return end
|
|
|
|
local function QuestKnown(self)
|
|
if not self.target and not self.destination then
|
|
if self.o.finish then
|
|
self.target = self.qh:GetObjective("monster", self.o.finish)
|
|
elseif self.fb.finish then
|
|
self.target = self.qh:GetObjective("monster", self.fb.finish)
|
|
elseif self.o.pos then
|
|
self.destination = self.o.pos
|
|
elseif self.fb.pos then
|
|
self.destination = self.fb.pos
|
|
end
|
|
end
|
|
return (self.target or self.destination) and self:DefaultKnown() and (self.destination or self.target:Known())
|
|
end
|
|
|
|
local function QuestAppendPositions(self, objective, weight, why, restrict)
|
|
why2 = why and why.."\n" or ""
|
|
|
|
if self.target then
|
|
self.target:AppendPositions(self, 1, why2..QHFormat("OBJECTIVE_TALK", self.o.finish or self.fb.finish), restrict)
|
|
elseif self.destination then
|
|
for i, p in ipairs(self.destination) do
|
|
if not restrict or not self.qh:Disallowed(p[1]) then
|
|
self:AddLoc(p[1], p[2], p[3], p[4], p[5])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
QuestHelper.default_objective_quest_param =
|
|
{
|
|
Known = QuestKnown,
|
|
AppendPositions = QuestAppendPositions
|
|
}
|
|
|
|
for key, value in pairs(QuestHelper.default_objective_param) do
|
|
if not QuestHelper.default_objective_quest_param[key] then
|
|
QuestHelper.default_objective_quest_param[key] = value
|
|
end
|
|
end
|
|
|
|
QuestHelper.default_objective_quest_meta = { __index = QuestHelper.default_objective_quest_param }
|
|
|
|
function QuestHelper:GetQuest(name, level, hash)
|
|
if not level then
|
|
if QuestHelper_Quests_Local[self.faction] then
|
|
for l, quest_list in ipairs(QuestHelper_Quests_Local[self.faction]) do
|
|
if quest_list[name] then
|
|
level = l
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
if not level and
|
|
QuestHelper_StaticData[self.locale] and
|
|
QuestHelper_StaticData[self.locale].quest[self.faction] then
|
|
for l, quest_list in ipairs(QuestHelper_StaticData[self.locale].quest[self.faction]) do
|
|
if quest_list[name] then
|
|
level = l
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
if not level then
|
|
error("Don't know of a quest named '"..name.."' for your faction.")
|
|
end
|
|
|
|
self:TextOut("Determined the quest level of '"..name.."' to be "..level..".")
|
|
end
|
|
|
|
local bracket = self.quest_objects[level]
|
|
|
|
if not bracket then
|
|
bracket = {}
|
|
self.quest_objects[level] = bracket
|
|
end
|
|
|
|
local bracket2 = bracket[name]
|
|
|
|
if not bracket2 then
|
|
bracket2 = {}
|
|
bracket[name] = bracket2
|
|
end
|
|
|
|
local quest_object = bracket2[hash or -1]
|
|
|
|
if not quest_object then
|
|
quest_object = self:NewObjectiveObject()
|
|
quest_object.icon_id = 7
|
|
quest_object.icon_bg = 15
|
|
setmetatable(quest_object, QuestHelper.default_objective_quest_meta)
|
|
|
|
quest_object.cat = "quest"
|
|
quest_object.obj = level.."/"..(hash or "").."/"..name
|
|
|
|
bracket2[hash or -1] = quest_object
|
|
|
|
local fbracket = QuestHelper_Quests_Local[self.faction]
|
|
|
|
if not fbracket then
|
|
fbracket = {}
|
|
QuestHelper_Quests_Local[self.faction] = fbracket
|
|
end
|
|
|
|
bracket = fbracket[level]
|
|
|
|
if not bracket then
|
|
bracket = {}
|
|
fbracket[level] = bracket
|
|
end
|
|
|
|
quest_object.o = bracket[name]
|
|
|
|
if not quest_object.o then
|
|
if hash then
|
|
quest_object.o = {hash=hash}
|
|
bracket[name] = quest_object.o
|
|
else -- Not going to actually save the quest without a hash.
|
|
quest_object.o = {}
|
|
end
|
|
end
|
|
|
|
local l = QuestHelper_StaticData[self.locale]
|
|
|
|
if l then
|
|
fbracket = l.quest[self.faction]
|
|
if fbracket then
|
|
bracket = fbracket[level]
|
|
if bracket then
|
|
quest_object.fb = bracket[name]
|
|
end
|
|
end
|
|
end
|
|
if not quest_object.fb then
|
|
quest_object.fb = {}
|
|
end
|
|
|
|
if quest_object.o.hash and quest_object.o.hash ~= hash then
|
|
if not quest_object.o.alt then quest_object.o.alt = {} end
|
|
local real_quest_data = quest_object.o.alt[hash]
|
|
if not real_quest_data then
|
|
real_quest_data = {hash=hash}
|
|
quest_object.o.alt[hash] = real_quest_data
|
|
end
|
|
quest_object.o = real_quest_data
|
|
elseif not quest_object.o.hash then
|
|
-- Not setting the hash now, as we might not actually have the correct quest loaded.
|
|
-- When we can verify our data is correct, we'll assign a value.
|
|
quest_object.need_hash = true
|
|
end
|
|
|
|
if hash and quest_object.fb.hash and quest_object.fb.hash ~= hash then
|
|
quest_object.fb = quest_object.fb.alt and quest_object.fb.alt[hash]
|
|
if not quest_object.fb then
|
|
quest_object.fb = {}
|
|
end
|
|
end
|
|
|
|
-- TODO: If we have some other source of information (like LightHeaded) add its data to quest_object.fb
|
|
|
|
end
|
|
|
|
return quest_object
|
|
end
|
|
|
|
function QuestHelper:PurgeItemFromQuest(quest, item_name, item_object)
|
|
if quest.alt then
|
|
for hash, alt_quest in pairs(quest.alt) do
|
|
self:PurgeItemFromQuest(alt_quest, item_name, item_object)
|
|
end
|
|
end
|
|
|
|
if quest.item then
|
|
local item_data = quest.item[item_name]
|
|
if item_data then
|
|
quest.item[item_name] = nil
|
|
if not next(quest.item, nil) then quest.item = nil end
|
|
|
|
if item_data.pos then
|
|
for i, pos in ipairs(item_data.pos) do
|
|
self:AppendObjectivePosition(item_object, unpack(pos))
|
|
end
|
|
else
|
|
if item_data.drop then
|
|
for monster, count in pairs(item_data.drop) do
|
|
self:AppendObjectiveDrop(item_object, monster, count)
|
|
end
|
|
end
|
|
|
|
if item_data.contained then
|
|
for item, count in pairs(item_data.contained) do
|
|
self:AppendItemObjectiveContained(item_object, item, count)
|
|
end
|
|
end
|
|
end
|
|
|
|
if item_object.bad_pos then
|
|
for i, pos in ipairs(item_object.bad_pos) do
|
|
self:AppendObjectivePosition(item_object, unpack(pos))
|
|
end
|
|
item_object.bad_pos = nil
|
|
elseif item_object.bad_drop then
|
|
for monster, count in pairs(item_object.bad_drop) do
|
|
self:AppendObjectiveDrop(item_object, monster, count)
|
|
end
|
|
item_object.bad_drop = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function QuestHelper:PurgeQuestItem(item_name, item_object)
|
|
for faction, level_list in pairs(QuestHelper_Quests_Local) do
|
|
for level, quest_list in pairs(level_list) do
|
|
for quest_name, quest in pairs(quest_list) do
|
|
self:PurgeItemFromQuest(quest, item_name, item_object)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function QuestHelper:AppendQuestPosition(quest, item_name, i, x, y, w)
|
|
local item_list = quest.o.item
|
|
|
|
if not item_list then
|
|
item_list = {}
|
|
quest.o.item = item_list
|
|
end
|
|
|
|
local item = item_list[item_name]
|
|
|
|
if not item then
|
|
item = {}
|
|
item_list[item_name] = item
|
|
end
|
|
|
|
local pos = item.pos
|
|
if not pos then
|
|
if item.drop then
|
|
return -- If it's dropped by a monster, don't record the position we got the item at.
|
|
end
|
|
item.pos = self:AppendPosition({}, i, x, y, w)
|
|
else
|
|
self:AppendPosition(pos, i, x, y, w)
|
|
end
|
|
end
|
|
|
|
function QuestHelper:AppendQuestDrop(quest, item_name, monster_name, count)
|
|
local item_list = quest.o.item
|
|
|
|
if not item_list then
|
|
item_list = {}
|
|
quest.o.item = item_list
|
|
end
|
|
|
|
local item = item_list[item_name]
|
|
|
|
if not item then
|
|
item = {}
|
|
item_list[item_name] = item
|
|
end
|
|
|
|
local drop = item.drop
|
|
|
|
if drop then
|
|
drop[monster_name] = (drop[monster_name] or 0) + (count or 1)
|
|
else
|
|
item.drop = {[monster_name] = count or 1}
|
|
item.pos = nil -- If we know monsters drop the item, don't record the position we got the item at.
|
|
end
|
|
end
|
|
|