mtpaint/init.lua

220 lines
6.6 KiB
Lua

paint = {}
paint.loopmax=50
paint.loops=0
minetest.register_alias("pencil", "mtpaint:pencil")
minetest.register_alias("fill", "mtpaint:fill")
minetest.register_alias("bucket", "mtpaint:fill")
minetest.register_alias("eraser", "mtpaint:eraser")
minetest.register_alias("gum", "mtpaint:eraser")
minetest.register_alias("picker", "mtpaint:picker")
minetest.register_alias("colorpicker", "mtpaint:picker")
minetest.register_alias("nodepicker", "mtpaint:picker")
--function
paint.has_air = function(pos)
print("check for air")
for i=-1,1,2 do
local p = {x=pos.x+i, y=pos.y, z=pos.z}
local n = minetest.env:get_node(p).name
print(n)
if minetest.registered_nodes[n].walkable == false then
return true
end
end
for i=-1,1,2 do
local p = {x=pos.x, y=pos.y+i, z=pos.z}
local n = minetest.env:get_node(p).name
print(n)
if minetest.registered_nodes[n].walkable == false then
return true
end
end
for i=-1,1,2 do
local p = {x=pos.x, y=pos.y, z=pos.z+i}
local n = minetest.env:get_node(p).name
print(n)
if minetest.registered_nodes[n].walkable == false then
return true
end
end
print("doesnothaveair")
return false
end
paint.replace = function(user, position, replace, replacer, full)
if not minetest.registered_nodes[replacer] then return end
if replace == replacer then return end
if paint.loops > 2000 then return end
local pos = position
if full == false then
if paint.has_air(pos) == false then return end
end
paint.loops = paint.loops + 1
local node = replacer
minetest.env:set_node(pos,{name=node})
for i=-1,1,2 do
local p = {x=pos.x+i, y=pos.y, z=pos.z}
local n = minetest.env:get_node(p).name
if n == replace then
minetest.env:set_node(pos,{name=node})
paint.replace(user,p, replace, replacer, full)
end
end
for i=-1,1,2 do
local p = {x=pos.x, y=pos.y+i, z=pos.z}
local n = minetest.env:get_node(p).name
if n == replace then
minetest.env:set_node(pos,{name=node})
paint.replace(user,p, replace, replacer, full)
end
end
for i=-1,1,2 do
local p = {x=pos.x, y=pos.y, z=pos.z+i}
local n = minetest.env:get_node(p).name
if n == replace then
minetest.env:set_node(pos,{name=node})
paint.replace(user,p, replace, replacer, full)
end
end
end
--tools
minetest.register_tool("mtpaint:eraser", {
description = "Eraser",
inventory_image = "paint_eraser.png",
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type == "node" then
minetest.env:remove_node(pointed_thing.under)
end
end,
})
minetest.register_tool("mtpaint:pencil", {
description = "Pencil",
inventory_image = "paint_pencil.png",
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type == "node" then
local node = user:get_inventory():get_stack("main", 1):get_name()
if user:get_player_control().sneak then
minetest.env:set_node(pointed_thing.under,{name=node})
else
minetest.env:set_node(pointed_thing.above,{name=node})
end
end
return
end,
on_place = function(self, user, pointed_thing)
if pointed_thing.type == "node" then
local node = user:get_inventory():get_stack("main", 2):get_name()
if user:get_player_control().sneak then
minetest.env:set_node(pointed_thing.under,{name=node})
else
minetest.env:set_node(pointed_thing.above,{name=node})
end
end
return
end,
})
minetest.register_tool("mtpaint:picker", {
description = "Picker",
inventory_image = "paint_picker.png",
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type == "node" then
local node = minetest.env:get_node(pointed_thing.under).name
if node == nil or node == "ignore" then return end
local oldnode = user:get_inventory():get_stack("main", 1):get_name()
local stack = ItemStack(oldnode)
local inv = user:get_inventory()
inv:set_stack("main", 1, node)
if inv:contains_item("main", oldnode) then
else
if inv:room_for_item("main", stack) then
inv:add_item("main", oldnode.." 1")
end
end
end
return
end,
on_place = function(self, user, pointed_thing)
if pointed_thing.type == "node" then
local node = minetest.env:get_node(pointed_thing.under).name
if node == nil or node == "ignore" then return end
local oldnode = user:get_inventory():get_stack("main", 2):get_name()
local stack = ItemStack(oldnode)
local inv = user:get_inventory()
inv:set_stack("main", 2, node)
if inv:contains_item("main", oldnode) then
else
if inv:room_for_item("main", stack) then
inv:add_item("main", oldnode.." 1")
end
end
end
return
end,
})
minetest.register_tool("mtpaint:fill", {
description = "Fill",
inventory_image = "paint_fill.png",
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type == "node" then
local pos = pointed_thing.under
local replace = minetest.env:get_node(pos).name
local replacer = user:get_inventory():get_stack("main", 1):get_name()
paint.loops = 0
if user:get_player_control().sneak then
paint.replace(user, pos, replace, replacer, true)
else
paint.replace(user, pos, replace, replacer, false)
end
end
return
end,
on_place = function(itemstack, user, pointed_thing)
if pointed_thing.type == "node" then
local pos = pointed_thing.under
local replace = minetest.env:get_node(pos).name
local replacer = user:get_inventory():get_stack("main", 2):get_name()
paint.loops = 0
if user:get_player_control().sneak then
paint.replace(user, pos, replace, replacer, true)
else
paint.replace(user, pos, replace, replacer, false)
end
end
return
end,
})
--[[WIP
minetest.register_tool("mtpaint:select_square", {
description = "Square selection",
inventory_image = "paint_select_square.png",
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.under then
minetest.env:remove_node(pointed_thing.under)
end
end,
})
minetest.register_tool("mtpaint:select_ellipse", {
description = "Ellipse selection",
inventory_image = "paint_select_ellipse.png",
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.under then
minetest.env:remove_node()
end
end,
})
]]--