callbacks.lua

main 198 lines · 6.4 KB Raw
Alex Alex Commit Client Upload Part 2 19/10/2026 00:06
1local context = G.botContext
2
3-- callback(callbackType, callback)
4context.callback = function(callbackType, callback)
5 if not context._callbacks[callbackType] then
6 return error("Wrong callback type: " .. callbackType)
7 end
8 if callbackType == "onAddThing" or callbackType == "onRemoveThing" then
9 g_game.enableTileThingLuaCallback(true)
10 end
11
12 local desc = "lua"
13 local info = debug.getinfo(2, "Sl")
14 if info then
15 desc = info.short_src .. ":" .. info.currentline
16 end
17
18 local callbackData = {}
19 table.insert(context._callbacks[callbackType], function(...)
20 if not callbackData.delay or callbackData.delay < context.now then
21 local prevExecution = context._currentExecution
22 context._currentExecution = callbackData
23 local start = g_clock.realMillis()
24 callback(...)
25 local executionTime = g_clock.realMillis() - start
26 if executionTime > 100 then
27 context.warning("Slow " .. callbackType .. " (" .. executionTime .. "ms): " .. desc)
28 end
29 context._currentExecution = prevExecution
30 end
31 end)
32 local cb = context._callbacks[callbackType]
33 return {
34 remove = function()
35 local index = nil
36 for i, cb2 in ipairs(context._callbacks[callbackType]) do
37 if cb == cb2 then
38 index = i
39 end
40 end
41 if index then
42 table.remove(context._callbacks[callbackType], index)
43 end
44 end
45 }
46end
47
48-- onKeyDown(callback) -- callback = function(keys)
49context.onKeyDown = function(callback)
50 return context.callback("onKeyDown", callback)
51end
52
53-- onKeyPress(callback) -- callback = function(keys)
54context.onKeyPress = function(callback)
55 return context.callback("onKeyPress", callback)
56end
57
58-- onKeyUp(callback) -- callback = function(keys)
59context.onKeyUp = function(callback)
60 return context.callback("onKeyUp", callback)
61end
62
63-- onTalk(callback) -- callback = function(name, level, mode, text, channelId, pos)
64context.onTalk = function(callback)
65 return context.callback("onTalk", callback)
66end
67
68-- onTextMessage(callback) -- callback = function(mode, text)
69context.onTextMessage = function(callback)
70 return context.callback("onTextMessage", callback)
71end
72
73-- onAddThing(callback) -- callback = function(tile, thing)
74context.onAddThing = function(callback)
75 return context.callback("onAddThing", callback)
76end
77
78-- onRemoveThing(callback) -- callback = function(tile, thing)
79context.onRemoveThing = function(callback)
80 return context.callback("onRemoveThing", callback)
81end
82
83-- onCreatureAppear(callback) -- callback = function(creature)
84context.onCreatureAppear = function(callback)
85 return context.callback("onCreatureAppear", callback)
86end
87
88-- onCreatureDisappear(callback) -- callback = function(creature)
89context.onCreatureDisappear = function(callback)
90 return context.callback("onCreatureDisappear", callback)
91end
92
93-- onCreaturePositionChange(callback) -- callback = function(creature, newPos, oldPos)
94context.onCreaturePositionChange = function(callback)
95 return context.callback("onCreaturePositionChange", callback)
96end
97
98-- onCreatureHealthPercentChange(callback) -- callback = function(creature, healthPercent)
99context.onCreatureHealthPercentChange = function(callback)
100 return context.callback("onCreatureHealthPercentChange", callback)
101end
102
103-- onUse(callback) -- callback = function(pos, itemId, stackPos, subType)
104context.onUse = function(callback)
105 return context.callback("onUse", callback)
106end
107
108-- onUseWith(callback) -- callback = function(pos, itemId, target, subType)
109context.onUseWith = function(callback)
110 return context.callback("onUseWith", callback)
111end
112
113-- onContainerOpen -- callback = function(container, previousContainer)
114context.onContainerOpen = function(callback)
115 return context.callback("onContainerOpen", callback)
116end
117
118-- onContainerClose -- callback = function(container)
119context.onContainerClose = function(callback)
120 return context.callback("onContainerClose", callback)
121end
122
123-- onContainerUpdateItem -- callback = function(container, slot, item)
124context.onContainerUpdateItem = function(callback)
125 return context.callback("onContainerUpdateItem", callback)
126end
127
128-- onMissle -- callback = function(missle)
129context.onMissle = function(callback)
130 return context.callback("onMissle", callback)
131end
132
133-- onAnimatedText -- callback = function(thing, text)
134context.onAnimatedText = function(callback)
135 return context.callback("onAnimatedText", callback)
136end
137
138-- onStaticText -- callback = function(thing, text)
139context.onStaticText = function(callback)
140 return context.callback("onStaticText", callback)
141end
142
143-- onChannelList -- callback = function(channels)
144context.onChannelList = function(callback)
145 return context.callback("onChannelList", callback)
146end
147
148-- onOpenChannel -- callback = function(channelId, name)
149context.onOpenChannel = function(callback)
150 return context.callback("onOpenChannel", callback)
151end
152
153-- onCloseChannel -- callback = function(channelId)
154context.onCloseChannel = function(callback)
155 return context.callback("onCloseChannel", callback)
156end
157
158-- onChannelEvent -- callback = function(channelId, name, event)
159context.onChannelEvent = function(callback)
160 return context.callback("onChannelEvent", callback)
161end
162
163-- onTurn -- callback = function(creature, direction)
164context.onTurn = function(callback)
165 return context.callback("onTurn", callback)
166end
167
168
169-- CUSTOM CALLBACKS
170
171-- listen(name, callback) -- callback = function(text, channelId, pos)
172context.listen = function(name, callback)
173 if not name then return context.error("listen: invalid name") end
174 name = name:lower()
175 return context.onTalk(function(name2, level, mode, text, channelId, pos)
176 if name == name2:lower() then
177 callback(text, channelId, pos)
178 end
179 end)
180end
181
182-- onPlayerPositionChange(callback) -- callback = function(newPos, oldPos)
183context.onPlayerPositionChange = function(callback)
184 return context.onCreaturePositionChange(function(creature, newPos, oldPos)
185 if creature == context.player then
186 callback(newPos, oldPos)
187 end
188 end)
189end
190
191-- onPlayerHealthChange(callback) -- callback = function(healthPercent)
192context.onPlayerHealthChange = function(callback)
193 return context.onCreatureHealthPercentChange(function(creature, healthPercent)
194 if creature == context.player then
195 callback(healthPercent)
196 end
197 end)
198end
Top