Update.
New queue_task and chain_task. bug fix in node_funcs. And add text to readme.
This commit is contained in:
parent
90ea9b9b60
commit
454d3812ed
88
README.md
88
README.md
@ -2,3 +2,91 @@
|
|||||||
mod for minetest
|
mod for minetest
|
||||||
|
|
||||||
This mod adds more functions and features to the minetest api.
|
This mod adds more functions and features to the minetest api.
|
||||||
|
|
||||||
|
extended_api
|
||||||
|
===========
|
||||||
|
|
||||||
|
extended_api is a minetest mod that extends the current minetest api.
|
||||||
|
It adds two new node events and contains async functions.
|
||||||
|
|
||||||
|
Usage Async
|
||||||
|
===========
|
||||||
|
1. create a async pool.
|
||||||
|
```lua
|
||||||
|
pool = minetest.Async.create_async_pool()
|
||||||
|
```
|
||||||
|
2. set the priority of the async pool to high.
|
||||||
|
```lua
|
||||||
|
minetest.Async.priority(pool,50,500)
|
||||||
|
```
|
||||||
|
3. iterate from 1 to 50 and log the value i.
|
||||||
|
```lua
|
||||||
|
minetest.Async.iterate(pool,1,50,function(i)
|
||||||
|
minetest.log(i)
|
||||||
|
end)
|
||||||
|
```
|
||||||
|
4. run throught each element in a table.
|
||||||
|
```lua
|
||||||
|
local array = {"start","text2","text3","text4","text5","end"}
|
||||||
|
minetest.Async.foreach(pool,array, function(k,v)
|
||||||
|
minetest.log(v)
|
||||||
|
end)
|
||||||
|
```
|
||||||
|
5. async do while loop.
|
||||||
|
```lua
|
||||||
|
local c = 50
|
||||||
|
minetest.Async.do_while(pool,function() return c>0 end, function()
|
||||||
|
minetest.log(c)
|
||||||
|
c = c - 1
|
||||||
|
end)
|
||||||
|
```
|
||||||
|
6. register a async globalstep. this one spams the chat with the word spam.
|
||||||
|
```lua
|
||||||
|
minetest.Async.register_globalstep(pool,function(dtime)
|
||||||
|
minetest.chat_send_all("spam")
|
||||||
|
end)
|
||||||
|
```
|
||||||
|
7. chain task runs a group of functions from a table.
|
||||||
|
```lua
|
||||||
|
minetest.Async.chain_task(pool,{
|
||||||
|
function(args)
|
||||||
|
args.count = 1
|
||||||
|
minetest.log(args.count)
|
||||||
|
return args
|
||||||
|
end,
|
||||||
|
function(args)
|
||||||
|
args.count = args.count + 1
|
||||||
|
minetest.log(args.count)
|
||||||
|
return args
|
||||||
|
end}
|
||||||
|
)
|
||||||
|
```
|
||||||
|
8. adds a single function to the task queue. This is a sort of waiting list.
|
||||||
|
```lua
|
||||||
|
minetest.Async.queue_task(pool,function()
|
||||||
|
minetest.log("Hello World!")
|
||||||
|
end)
|
||||||
|
```
|
||||||
|
Usage Node
|
||||||
|
===========
|
||||||
|
1. this covers both functions. I made this for a way to awake node timers without abms.
|
||||||
|
```lua
|
||||||
|
minetest.register_node("default:stone", {
|
||||||
|
description = "Stone",
|
||||||
|
tiles = {"default_stone.png"},
|
||||||
|
groups = {cracky = 3, stone = 1},
|
||||||
|
drop = 'default:cobble',
|
||||||
|
legacy_mineral = true,
|
||||||
|
sounds = default.node_sound_stone_defaults(),
|
||||||
|
on_construct_node_near_by = function(pos,other_pos,name)
|
||||||
|
if name == "tnt:tnt" then
|
||||||
|
minetest.chat_send_all("Do not place tnt near me thank you!")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
on_destruct_node_near_by = function(pos,other_pos,name)
|
||||||
|
if name == "default:dirt" then
|
||||||
|
minetest.chat_send_all("I hate dirt too!")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
```
|
43
api.txt
43
api.txt
@ -1,20 +1,39 @@
|
|||||||
-- node_funcs
|
-- node_funcs
|
||||||
-- Function happens when a node's constructer function is ran in a 3x3x3 near by.
|
-- Function happens when a node's constructer function is ran near by.
|
||||||
on_construct_node_near_by(pos,other_pos)
|
on_construct_node_near_by(pos,other_pos,name)
|
||||||
-- Function happens when a node's destructer function is ran 3x3x3 near by.
|
-- Function happens when a node's destructer function is ran near by.
|
||||||
on_destruct_node_near_by(pos,other_pos)
|
on_destruct_node_near_by(pos,other_pos,name)
|
||||||
-- async
|
-- async
|
||||||
--
|
-- Create's a async pool.
|
||||||
minetest.Async.create_async_pool() --- return pool
|
minetest.Async.create_async_pool() --- return pool
|
||||||
--
|
-- Set the priority of the given async pool.
|
||||||
|
-- resting is the delay between resuming threads.
|
||||||
|
-- maxtime is how long a thread will work before yield.
|
||||||
minetest.Async.priority(pool,resting,maxtime)
|
minetest.Async.priority(pool,resting,maxtime)
|
||||||
--
|
-- Async for loop.
|
||||||
|
-- from is the starting value for the loop.
|
||||||
|
-- to is the ending value to will break the loop.
|
||||||
|
-- func(i) is the function that is ran in the for loop. func can break the loop if it returns false.
|
||||||
|
-- callback() function is ran when the for loop ends. callback can be nil.
|
||||||
minetest.Async.iterate(pool,from,to,func,callback)
|
minetest.Async.iterate(pool,from,to,func,callback)
|
||||||
--
|
-- Async foreach loop.
|
||||||
|
-- array is the list to loop throught.
|
||||||
|
-- func(k,v) is the function that is ran in the foreach loop. func can break the loop if it returns false.
|
||||||
|
-- callback() function is ran when the foreach loop ends. callback can be nil.
|
||||||
minetest.Async.foreach(pool,array, func, callback)
|
minetest.Async.foreach(pool,array, func, callback)
|
||||||
--
|
-- Async do while loop.
|
||||||
|
-- condition_func() returns the condition.
|
||||||
|
-- func() is the function that is ran in the do while loop. func can break the loop if it returns false.
|
||||||
|
-- callback() function is ran when the do while loop ends. callback can be nil.
|
||||||
minetest.Async.do_while(pool,condition_func, func, callback)
|
minetest.Async.do_while(pool,condition_func, func, callback)
|
||||||
--
|
-- Async globalstep loop. this can never be shutdown like in the minetest version. happens every 0.05 seconds.
|
||||||
|
-- func(dtime) is the function that is ran in the globalstep.
|
||||||
minetest.Async.register_globalstep(pool,func)
|
minetest.Async.register_globalstep(pool,func)
|
||||||
--
|
-- Async chain task.
|
||||||
minetest.Async.queue_task(pool,tasks,callback)
|
-- tasks is a table of functions that ran in order.
|
||||||
|
-- callback() function is ran when the chain_task ends. callback can be nil.
|
||||||
|
minetest.Async.chain_task(pool,tasks,callback)
|
||||||
|
-- Async task queue.
|
||||||
|
-- func is a single function that gets added to the queue list.
|
||||||
|
-- callback() function is ran when the queue_task ends. callback can be nil.
|
||||||
|
minetest.Async.queue_task(pool,func,callback)
|
48
async.lua
48
async.lua
@ -1,7 +1,7 @@
|
|||||||
minetest.Async = {}
|
minetest.Async = {}
|
||||||
|
|
||||||
function minetest.Async.create_async_pool()
|
function minetest.Async.create_async_pool()
|
||||||
local pool = {threads = {},globalstep_threads = {},resting = 200,maxtime = 200,state = "suspended"}
|
local pool = {threads = {},globalstep_threads = {},task_queue = {},resting = 200,maxtime = 200,queue_threads = 8,state = "suspended"}
|
||||||
return pool
|
return pool
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -69,7 +69,10 @@ function minetest.Async.iterate(pool,from,to,func,callback)
|
|||||||
local last_time = minetest.get_us_time() * 1000
|
local last_time = minetest.get_us_time() * 1000
|
||||||
local maxtime = pool.maxtime
|
local maxtime = pool.maxtime
|
||||||
for i = from, to do
|
for i = from, to do
|
||||||
func(i)
|
local b = func(i)
|
||||||
|
if b and b == false then
|
||||||
|
break
|
||||||
|
end
|
||||||
if minetest.get_us_time() * 1000 > last_time + maxtime then
|
if minetest.get_us_time() * 1000 > last_time + maxtime then
|
||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
last_time = minetest.get_us_time() * 1000
|
last_time = minetest.get_us_time() * 1000
|
||||||
@ -87,7 +90,10 @@ function minetest.Async.foreach(pool,array, func, callback)
|
|||||||
local last_time = minetest.get_us_time() * 1000
|
local last_time = minetest.get_us_time() * 1000
|
||||||
local maxtime = pool.maxtime
|
local maxtime = pool.maxtime
|
||||||
for k,v in ipairs(array) do
|
for k,v in ipairs(array) do
|
||||||
func(k,v)
|
local b = func(k,v)
|
||||||
|
if b and b == false then
|
||||||
|
break
|
||||||
|
end
|
||||||
if minetest.get_us_time() * 1000 > last_time + maxtime then
|
if minetest.get_us_time() * 1000 > last_time + maxtime then
|
||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
last_time = minetest.get_us_time() * 1000
|
last_time = minetest.get_us_time() * 1000
|
||||||
@ -141,7 +147,7 @@ function minetest.Async.register_globalstep(pool,func)
|
|||||||
minetest.Async.schedule_globalstep_worker(pool)
|
minetest.Async.schedule_globalstep_worker(pool)
|
||||||
end
|
end
|
||||||
|
|
||||||
function minetest.Async.queue_task(pool,tasks,callback)
|
function minetest.Async.chain_task(pool,tasks,callback)
|
||||||
minetest.Async.create_worker(pool,function()
|
minetest.Async.create_worker(pool,function()
|
||||||
local pass_arg = {}
|
local pass_arg = {}
|
||||||
local last_time = minetest.get_us_time() * 1000
|
local last_time = minetest.get_us_time() * 1000
|
||||||
@ -162,3 +168,37 @@ function minetest.Async.queue_task(pool,tasks,callback)
|
|||||||
end)
|
end)
|
||||||
minetest.Async.schedule_worker(pool)
|
minetest.Async.schedule_worker(pool)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function minetest.Async.queue_task(pool,func,callback)
|
||||||
|
table.insert(pool.task_queue,{func = func,callback = callback})
|
||||||
|
if pool.queue_threads > 0 then
|
||||||
|
pool.queue_threads = pool.queue_threads - 1
|
||||||
|
minetest.Async.create_worker(pool,function()
|
||||||
|
local pass_arg = {}
|
||||||
|
local last_time = minetest.get_us_time() * 1000
|
||||||
|
local maxtime = pool.maxtime
|
||||||
|
while(true) do
|
||||||
|
local task_func = pool.task_queue[1]
|
||||||
|
if task_func and task_func.func then
|
||||||
|
table.remove(pool.task_queue,1)
|
||||||
|
pass_arg = {}
|
||||||
|
local p = task_func.func(pass_arg)
|
||||||
|
if p then
|
||||||
|
pass_arg = p
|
||||||
|
end
|
||||||
|
if task_func.callback then
|
||||||
|
task_func.callback(pass_arg)
|
||||||
|
end
|
||||||
|
if minetest.get_us_time() * 1000 > last_time + maxtime then
|
||||||
|
coroutine.yield()
|
||||||
|
last_time = minetest.get_us_time() * 1000
|
||||||
|
end
|
||||||
|
else
|
||||||
|
pool.queue_threads = pool.queue_threads + 1
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
minetest.Async.schedule_worker(pool)
|
||||||
|
end
|
||||||
|
end
|
@ -1,4 +1,3 @@
|
|||||||
-- on_construct_node_near_by(pos,constructed_pos)
|
|
||||||
local function on_construct_override(pos)
|
local function on_construct_override(pos)
|
||||||
local lpos = pos
|
local lpos = pos
|
||||||
local pos1 = {x=lpos.x-1,y=lpos.y-1,z=lpos.z-1}
|
local pos1 = {x=lpos.x-1,y=lpos.y-1,z=lpos.z-1}
|
||||||
@ -25,6 +24,10 @@ local function on_construct_override(pos)
|
|||||||
local n2z = pos2.z
|
local n2z = pos2.z
|
||||||
|
|
||||||
local data = vm:get_data()
|
local data = vm:get_data()
|
||||||
|
|
||||||
|
local m_vi = a:index(nx, ny, nz)
|
||||||
|
local myname = minetest.get_name_from_content_id(data[m_vi])
|
||||||
|
|
||||||
for z = n1z, n2z do
|
for z = n1z, n2z do
|
||||||
for y = n1y, n2y do
|
for y = n1y, n2y do
|
||||||
for x = n1x, n2x do
|
for x = n1x, n2x do
|
||||||
@ -33,7 +36,7 @@ local function on_construct_override(pos)
|
|||||||
local name = minetest.get_name_from_content_id(data[vi])
|
local name = minetest.get_name_from_content_id(data[vi])
|
||||||
local node = minetest.registered_nodes[name]
|
local node = minetest.registered_nodes[name]
|
||||||
if node.on_construct_node_near_by then
|
if node.on_construct_node_near_by then
|
||||||
node.on_construct_node_near_by({x=x,y=y,z=z},lpos)
|
node.on_construct_node_near_by({x=x,y=y,z=z},lpos,myname)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -67,6 +70,10 @@ local function on_construct_override2(pos)
|
|||||||
local n2z = pos2.z
|
local n2z = pos2.z
|
||||||
|
|
||||||
local data = vm:get_data()
|
local data = vm:get_data()
|
||||||
|
|
||||||
|
local m_vi = a:index(nx, ny, nz)
|
||||||
|
local myname = minetest.get_name_from_content_id(data[m_vi])
|
||||||
|
|
||||||
for z = n1z, n2z do
|
for z = n1z, n2z do
|
||||||
for y = n1y, n2y do
|
for y = n1y, n2y do
|
||||||
for x = n1x, n2x do
|
for x = n1x, n2x do
|
||||||
@ -75,7 +82,7 @@ local function on_construct_override2(pos)
|
|||||||
local node = minetest.registered_nodes[name]
|
local node = minetest.registered_nodes[name]
|
||||||
if x ~= nx or y ~= ny or z ~= nz then
|
if x ~= nx or y ~= ny or z ~= nz then
|
||||||
if node.on_construct_node_near_by then
|
if node.on_construct_node_near_by then
|
||||||
node.on_construct_node_near_by({x=x,y=y,z=z},lpos)
|
node.on_construct_node_near_by({x=x,y=y,z=z},lpos,myname)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
node.exa_old_on_construct(lpos)
|
node.exa_old_on_construct(lpos)
|
||||||
@ -86,7 +93,6 @@ local function on_construct_override2(pos)
|
|||||||
end
|
end
|
||||||
-- End
|
-- End
|
||||||
|
|
||||||
-- on_destruct_node_near_by(pos,destructed_pos)
|
|
||||||
local function on_destruct_override(pos)
|
local function on_destruct_override(pos)
|
||||||
local lpos = pos
|
local lpos = pos
|
||||||
local pos1 = {x=lpos.x-1,y=lpos.y-1,z=lpos.z-1}
|
local pos1 = {x=lpos.x-1,y=lpos.y-1,z=lpos.z-1}
|
||||||
@ -113,6 +119,10 @@ local function on_destruct_override(pos)
|
|||||||
local n2z = pos2.z
|
local n2z = pos2.z
|
||||||
|
|
||||||
local data = vm:get_data()
|
local data = vm:get_data()
|
||||||
|
|
||||||
|
local m_vi = a:index(nx, ny, nz)
|
||||||
|
local myname = minetest.get_name_from_content_id(data[m_vi])
|
||||||
|
|
||||||
for z = n1z, n2z do
|
for z = n1z, n2z do
|
||||||
for y = n1y, n2y do
|
for y = n1y, n2y do
|
||||||
for x = n1x, n2x do
|
for x = n1x, n2x do
|
||||||
@ -121,7 +131,7 @@ local function on_destruct_override(pos)
|
|||||||
local name = minetest.get_name_from_content_id(data[vi])
|
local name = minetest.get_name_from_content_id(data[vi])
|
||||||
local node = minetest.registered_nodes[name]
|
local node = minetest.registered_nodes[name]
|
||||||
if node.on_destruct_node_near_by then
|
if node.on_destruct_node_near_by then
|
||||||
node.on_destruct_node_near_by({x=x,y=y,z=z},lpos)
|
node.on_destruct_node_near_by({x=x,y=y,z=z},lpos,myname)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -155,6 +165,10 @@ local function on_destruct_override2(pos)
|
|||||||
local n2z = pos2.z
|
local n2z = pos2.z
|
||||||
|
|
||||||
local data = vm:get_data()
|
local data = vm:get_data()
|
||||||
|
|
||||||
|
local m_vi = a:index(nx, ny, nz)
|
||||||
|
local myname = minetest.get_name_from_content_id(data[m_vi])
|
||||||
|
|
||||||
for z = n1z, n2z do
|
for z = n1z, n2z do
|
||||||
for y = n1y, n2y do
|
for y = n1y, n2y do
|
||||||
for x = n1x, n2x do
|
for x = n1x, n2x do
|
||||||
@ -163,7 +177,7 @@ local function on_destruct_override2(pos)
|
|||||||
local node = minetest.registered_nodes[name]
|
local node = minetest.registered_nodes[name]
|
||||||
if x ~= nx or y ~= ny or z ~= nz then
|
if x ~= nx or y ~= ny or z ~= nz then
|
||||||
if node.on_destruct_node_near_by then
|
if node.on_destruct_node_near_by then
|
||||||
node.on_destruct_node_near_by({x=x,y=y,z=z},lpos)
|
node.on_destruct_node_near_by({x=x,y=y,z=z},lpos,myname)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
node.exa_old_on_destruct(lpos)
|
node.exa_old_on_destruct(lpos)
|
||||||
@ -179,7 +193,7 @@ function()
|
|||||||
for n, d in pairs(minetest.registered_nodes) do
|
for n, d in pairs(minetest.registered_nodes) do
|
||||||
local cn = {}
|
local cn = {}
|
||||||
for k,v in pairs(minetest.registered_nodes[n]) do cn[k] = v end
|
for k,v in pairs(minetest.registered_nodes[n]) do cn[k] = v end
|
||||||
-- on_construct_node_near_by(pos,other_pos)
|
-- on_construct_node_near_by(pos,other_pos,name)
|
||||||
local on_con = cn.on_construct
|
local on_con = cn.on_construct
|
||||||
if on_con then
|
if on_con then
|
||||||
cn.exa_old_on_construct = on_con
|
cn.exa_old_on_construct = on_con
|
||||||
@ -188,7 +202,7 @@ function()
|
|||||||
on_con = on_construct_override
|
on_con = on_construct_override
|
||||||
end
|
end
|
||||||
cn.on_construct = on_con
|
cn.on_construct = on_con
|
||||||
-- on_destruct_node_near_by(pos,other_pos)
|
-- on_destruct_node_near_by(pos,other_pos,name)
|
||||||
local on_dis = cn.on_destruct
|
local on_dis = cn.on_destruct
|
||||||
if on_dis then
|
if on_dis then
|
||||||
cn.exa_old_on_destruct = on_dis
|
cn.exa_old_on_destruct = on_dis
|
||||||
@ -196,7 +210,7 @@ function()
|
|||||||
else
|
else
|
||||||
on_dis = on_destruct_override
|
on_dis = on_destruct_override
|
||||||
end
|
end
|
||||||
cn.on_destruct = on_con
|
cn.on_destruct = on_dis
|
||||||
minetest.register_node(":"..n,cn)
|
minetest.register_node(":"..n,cn)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
Loading…
Reference in New Issue
Block a user