117 lines
2.8 KiB
Lua
117 lines
2.8 KiB
Lua
--local MATCH_CACHE = {}
|
|
|
|
local tracker = {
|
|
["add"] = {},
|
|
["remove"] = {},
|
|
--["globals"] = {}
|
|
}
|
|
|
|
local matchTracker = {
|
|
["add"] = {},
|
|
["remove"] = {},
|
|
--["globals"] = {}
|
|
}
|
|
|
|
local tickGroups = {}
|
|
|
|
--call from all the entity creation/place/build events
|
|
function trackEntityAddition(entity, glbl)
|
|
--local glbl = getGlobal(entity.name)
|
|
local func = tracker["add"][entity.name]
|
|
if func then
|
|
func(glbl, entity, entity.force)
|
|
else
|
|
for k,func in pairs(matchTracker["add"]) do
|
|
if string.find(entity.name, k, 1, true) then
|
|
func(glbl, entity, entity.force)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--call from all the entity removal/died/mined events
|
|
function trackEntityRemoval(entity, glbl)
|
|
--local glbl = getGlobal(entity.name)
|
|
local func = tracker["remove"][entity.name]
|
|
if func then
|
|
func(glbl, entity, entity.force)
|
|
else
|
|
for k,func in pairs(matchTracker["remove"]) do
|
|
if string.find(entity.name, k, 1, true) then
|
|
func(glbl, entity, entity.force)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--call from onTick
|
|
function runTickHooks(glbl, tick)
|
|
for _,func in pairs(tickGroups) do
|
|
func(glbl, tick)
|
|
end
|
|
end
|
|
|
|
--[[
|
|
local function getOrCreateTickGroup(id, glbl)
|
|
if not tickGroups[id] then
|
|
tickGroups[id] = {id = id, getGlobal = glbl, calls = {}}
|
|
end
|
|
return tickGroups[id]
|
|
end
|
|
|
|
function getGlobal(name)
|
|
local func = tracker["globals"][name]
|
|
if not func then
|
|
for k,func2 in pairs(matchTracker["globals"]) do
|
|
game.print("Checking for '" .. k .. "' in '" .. name .. "'")
|
|
if string.find(name, k, 1, true) then
|
|
func = func2
|
|
end
|
|
end
|
|
end
|
|
if func then
|
|
return func()
|
|
else
|
|
game.print("Entity '" .. name .. "' with no remove hook?")
|
|
end
|
|
end
|
|
--]]
|
|
|
|
function addTracker(name, add, _remove, tick--[[, globalID, glbl--]])
|
|
log("Registering entity tracker for '" .. name .. "'")
|
|
--local hook = getOrCreateTickGroup(globalID, glbl)
|
|
--table.insert(hook.calls, tick)
|
|
tracker["add"][name] = add
|
|
tracker["remove"][name] = _remove
|
|
table.insert(tickGroups, tick)
|
|
--tracker["globals"][name] = glbl
|
|
end
|
|
|
|
--[[
|
|
function buildMatchCache()
|
|
for n,proto in pairs(game.entity_prototypes) do
|
|
for k,entry in pairs(MATCH_CACHE) do
|
|
if string.find(n, k, 1, true) then
|
|
addTracker(n, entry.onAdd, entry.onRemove, entry.onTick)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function addMatcherTracker(name, add, _remove, tick)
|
|
MATCH_CACHE[name] = {name = name, onAdd = add, onRemove = _remove, onTick = tick}
|
|
end
|
|
--]]
|
|
|
|
function addMatcherTracker(name, add, _remove, tick--[[, globalID, glbl--]])
|
|
log("Registering string-search entity tracker for '" .. name .. "'")
|
|
--local hook = getOrCreateTickGroup(globalID, glbl)
|
|
--table.insert(hook.calls, tick)
|
|
matchTracker["add"][name] = add
|
|
matchTracker["remove"][name] = _remove
|
|
table.insert(tickGroups, tick)
|
|
--matchTracker["globals"][name] = glbl
|
|
end
|
|
|
|
|
|
--remote.add_interface("entitytracker", {addTracker = addTracker, addMatcherTracker = addMatcherTracker}) |