update changes
[QuestHelper.git] / collect_monster.lua
blob5edac1e3250353623735cfe161e43eb4df8977e8
1 QuestHelper_File["collect_monster.lua"] = "Development Version"
2 QuestHelper_Loadtime["collect_monster.lua"] = GetTime()
4 local debug_output = false
5 if QuestHelper_File["collect_monster.lua"] == "Development Version" then debug_output = true end
7 local QHCM
9 local GetLoc
10 local Merger
11 local Patterns
13 local IsMonsterGUID
14 local GetMonsterUID
15 local GetMonsterType
17 local logon = GetTime() -- Because I'm incredibly paranoid, I'm waiting fifteen minutes after logon to assume they're not drunk.
18 local drunk_logon = true
19 local drunk_message = false
21 local function SystemMessage(arg, arg2, arg3)
22 if strfind(arg, Patterns["DRUNK_MESSAGE_SELF2"]) or strfind(arg, Patterns["DRUNK_MESSAGE_SELF3"]) or strfind(arg, Patterns["DRUNK_MESSAGE_SELF4"]) or strfind(arg, Patterns["DRUNK_MESSAGE_ITEM_SELF2"]) or strfind(arg, Patterns["DRUNK_MESSAGE_ITEM_SELF3"]) or strfind(arg, Patterns["DRUNK_MESSAGE_ITEM_SELF4"]) then
23 drunk_message = true
24 elseif strfind(arg, Patterns["DRUNK_MESSAGE_SELF1"]) or strfind(arg, Patterns["DRUNK_MESSAGE_ITEM_SELF1"]) then
25 drunk_message = false
26 end
27 end
29 local InteractDistances = {28, 11, 10, 0} -- There's actually a 4, but it's also 28 and it's kind of handy to be able to do it this way.
31 local recentlySeenCritters = {} -- We try not to repeatedly record critters frequently.
33 -- Kind of a nasty system here, built for efficiency and simplicity. All newly-seen critters go into Recent. When Recent reaches a certain size (100?) everything in NextTrash is deleted and NextTrash is replaced with Recent. Badabing, badaboom.
34 local recentlySeenCritters_NextTrash = {}
35 local recentlySeenCritters_Recent = {}
37 local function AccumulateFrequency(target, name, data)
38 local key = name .. "_" .. tostring(data)
39 target[key] = (target[key] or 0) + 1
40 end
42 local function MouseoverUnit()
43 if logon and logon + 60 * 15 < GetTime() then
44 logon = nil
45 drunk_logon = false
46 end
48 -- First off, we see if it's "interesting".
49 -- The original code for this filtered out critters. I don't, because critters are cute, and rare.
50 if UnitExists("mouseover") and UnitIsVisible("mouseover") and not UnitIsPlayer("mouseover") and not UnitPlayerControlled("mouseover") then
51 local guid = UnitGUID("mouseover")
53 if not IsMonsterGUID(guid) then return end -- pet that isn't controlled by a player? NPC pet? It's kind of unclear, but I'm getting some, so, FIXED
54 local creatureid = GetMonsterUID(guid)
56 if not recentlySeenCritters[creatureid] then
57 recentlySeenCritters_Recent[creatureid] = true
58 recentlySeenCritters[creatureid] = true
60 -- register the critter here
61 local cid = GetMonsterType(guid)
63 if not QHCM[cid] then QHCM[cid] = {} end
64 local critter = QHCM[cid]
66 AccumulateFrequency(critter, "name", UnitName("mouseover"))
67 AccumulateFrequency(critter, "reaction", UnitReaction("mouseover", "player"))
68 if not drunk_logon and not drunk_message then
69 AccumulateFrequency(critter, "level", UnitLevel("mouseover"))
70 end
72 local minrange = InteractDistances[1]
73 local maxrange = 255
74 -- Now we try to derive a bound for how far away it is
75 for i = #InteractDistances - 1, 1, -1 do
76 if CheckInteractDistance("mouseover", i) then
77 minrange = InteractDistances[i + 1]
78 maxrange = InteractDistances[i]
79 break
80 end
81 end
82 QuestHelper: Assert(minrange >= 0 and minrange < 256 and maxrange >= 0 and maxrange < 256)
83 Merger.Add(critter, GetLoc() .. strchar(minrange, maxrange))
85 if #recentlySeenCritters_Recent >= 100 then
86 for k, v in recentlySeenCritters_NextTrash do
87 recentlySeenCritters[v] = nil
88 end
90 recentlySeenCritters_NextTrash = recentlySeenCritters_Recent
91 recentlySeenCritters_Recent = {} -- BAM, garbage collection!
92 end
93 end
94 end
95 end
97 function QH_Collect_Monster_Init(QHCData, API)
98 if not QHCData.monster then QHCData.monster = {} end
99 QHCM = QHCData.monster
101 QH_Event("UPDATE_MOUSEOVER_UNIT", MouseoverUnit)
102 QH_Event("CHAT_MSG_SYSTEM", SystemMessage)
104 Patterns = API.Patterns
105 QuestHelper: Assert(Patterns)
107 API.Patterns_Register("DRUNK_MESSAGE_SELF1", "|c.*|r")
108 API.Patterns_Register("DRUNK_MESSAGE_SELF2", "|c.*|r")
109 API.Patterns_Register("DRUNK_MESSAGE_SELF3", "|c.*|r")
110 API.Patterns_Register("DRUNK_MESSAGE_SELF4", "|c.*|r")
111 API.Patterns_Register("DRUNK_MESSAGE_ITEM_SELF1", "|c.*|r")
112 API.Patterns_Register("DRUNK_MESSAGE_ITEM_SELF2", "|c.*|r")
113 API.Patterns_Register("DRUNK_MESSAGE_ITEM_SELF3", "|c.*|r")
114 API.Patterns_Register("DRUNK_MESSAGE_ITEM_SELF4", "|c.*|r")
116 GetLoc = API.Callback_LocationBolusCurrent
117 QuestHelper: Assert(GetLoc)
119 Merger = API.Utility_Merger
120 QuestHelper: Assert(Merger)
122 IsMonsterGUID = API.Utility_IsMonsterGUID
123 GetMonsterUID = API.Utility_GetMonsterUID
124 GetMonsterType = API.Utility_GetMonsterType
125 QuestHelper: Assert(IsMonsterGUID)
126 QuestHelper: Assert(GetMonsterUID)
127 QuestHelper: Assert(GetMonsterType)