OCD/mods/polymer/init.lua

350 lines
12 KiB
Lua

polymer = {}
polymer.registered_nodes = {}
polymer.node_amount = 0
polymer.extrude_amount = 0
local resolution = 12
local place_ori = nil
local place_one = nil
local place_two = nil
local node_num = 0
local node_box = {}
local node_box_string = {}
local node_current = 0
polymer.extruder_formspec =
"size[8,9]"..
"list[current_name;models;0,0;8,4;]"..
"button[2.5,4;1,1;polymer_prev;<]"..
"list[current_name;input;3.5,4;1,1;]"..
"button[4.5,4;1,1;polymer_next;>]"..
"list[current_player;main;0,5;8,4;]"
polymer.setformspec = function(inv, page)
local count = 0
for i=(page-1)*8*4+1,(page)*8*4, 1 do
count = count + 1
if polymer.registered_nodes[i] == nil then
inv:set_stack("models", count, "")
else
inv:set_stack("models", count, polymer.registered_nodes[i].." "..polymer.extrude_amount)
if count >= (8*4) or polymer.registered_nodes[i] == nil then return end
end
end
end,
minetest.register_node("polymer:extruder", {
tiles = {"polymer_model.png"},
drawtype = "node",
description = "Polymer Extruder",
groups = {not_in_creative_inventory=1, snappy = 3,flammable=2, attached_node=1},
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("input")
end,
on_construct = function(pos, node)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("models", 8*4)
inv:set_size("input", 1)
inv:set_size("select", 1)
inv:set_size("output", 1)
meta:set_string("formspec", polymer.extruder_formspec)
meta:set_int("page", 1)
polymer.setformspec(inv, 1)
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local page = meta:get_int("page")
if fields.polymer_prev and page > 1 then
polymer.setformspec(inv, page - 1)
meta:set_int("page", page - 1)
end
if fields.polymer_next and polymer.node_amount-(page)*4*8 > 0 then
polymer.setformspec(inv, page + 1)
meta:set_int("page", page + 1)
end
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if listname == "models" then return 0 end
if listname == "input" then
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local node_stack = inv:get_stack("input", 1)
print(node_stack:get_count())
if node_stack:get_count() ~= 0 and node_stack:get_name() ~= stack:get_name() then return 0 end
return stack:get_count()
end
return 0
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
if listname == "input" then
--print(minetest.get_item_group(minetest.get_node(pos).name, "polymer"))
--minetest.get_node_group(self.node.name, "polymer")
print(minetest.get_node_group(minetest.get_node(pos).name, "polymer"))
if minetest.get_node_group(stack:get_name(), "polymer") == 0 then
local player_name=player:get_player_name()
minetest.chat_send_player(player_name,"[polymer] only works with plastic nodes")
return
else
end
--if minetest.get_node_group(, "polymer") ~= 0 then return end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
polymer.extrude_amount = inv:get_stack("input", 1):get_count()
local page = meta:get_int("page")
polymer.setformspec(inv, page)
end
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
if listname == "input" then
local meta = minetest.get_meta(pos)
local page = meta:get_int("page")
local inv = meta:get_inventory()
polymer.extrude_amount = inv:get_stack("input", 1):get_count()
polymer.setformspec(inv, page)
end
if listname == "models" then
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local take = stack:get_count()
print(take)
local input_stack = inv:get_stack("input", 1)
polymer.extrude_amount = (input_stack:get_count() - take)
local page = meta:get_int("page")
local name = input_stack:get_name()
inv:set_stack("input", 1 ,name.." "..polymer.extrude_amount)
print(stack:get_name())
polymer.setformspec(inv, page)
end
end,
})
minetest.register_node("polymer:spawn", {
tiles = {"polymer_model.png"},
drawtype = "node",
description = "Polymer Designer",
groups = {not_in_creative_inventory=1, snappy = 3,flammable=2, attached_node=1},
on_receive_fields = function(pos, formname, fields, clicker)
--print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
local meta = minetest.get_meta(pos)
resolution = fields.text or ""
meta:set_string("infotext", '"'..fields.text..'"')
place_one = nil
place_two = nil
place_ori = pos
node_num = 0
for x=-resolution, resolution*2+1, 1 do
for y=-1, resolution*2+1, 1 do
for z=-resolution, resolution*2+1, 1 do
if ( x == 0 and y == 0 and z == 0 ) then
local a = 0
else
minetest.remove_node({x=pos.x+x,y=pos.y+y,z=pos.z+z})
end
if (x==-resolution or y==-1 or z==-resolution or x==resolution*2+1 or y==resolution*2+1 or z==resolution*2+1 ) then
minetest.add_node({x=pos.x+x,y=pos.y+y,z=pos.z+z}, {name = "polymer:wall"})
end
end
end
end
local player_name=clicker:get_player_name()
minetest.chat_send_player(player_name,"[polymer] New "..resolution.." project started")
for x=1, resolution, 1 do
for y=1, resolution, 1 do
for z=1, resolution, 1 do
local pos = {x=pos.x+x,y=pos.y+y,z=pos.z+z}
minetest.set_node(pos, {name = "polymer:grid"})
local meta = minetest.get_meta(pos)
end
end
end
end,
on_construct = function(pos, node)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Left click to save | Right click for new project")
meta:set_string("formspec", "field[text;;12]")
for x=-resolution, resolution*2+1, 1 do
for y=-1, resolution*2+1, 1 do
for z=-resolution, resolution*2+1, 1 do
if ( x == 0 and y == 0 and z == 0 ) then
local a = 0
else
minetest.remove_node({x=pos.x+x,y=pos.y+y,z=pos.z+z})
end
if (x==-resolution or y==-1 or z==-resolution or x==resolution*2+1 or y==resolution*2+1 or z==resolution*2+1 ) then
minetest.add_node({x=pos.x+x,y=pos.y+y,z=pos.z+z}, {name = "polymer:wall"})
end
end
end
end
place_ori = pos
for x=1, resolution, 1 do
for y=1, resolution, 1 do
for z=1, resolution, 1 do
local pos = {x=pos.x+x,y=pos.y+y,z=pos.z+z}
minetest.set_node(pos, {name = "polymer:grid"})
local meta = minetest.get_meta(pos)
end
end
end
end,
on_destruct = function(pos, node, digger)
for x=1, resolution, 1 do
for y=1, resolution, 1 do
for z=1, resolution, 1 do
minetest.remove_node({x=pos.x+x,y=pos.y+y,z=pos.z+z})
end
end
end
local place_one = nil
local place_two = nil
end,
on_punch = function(pos, node, puncher)
local player_name=puncher:get_player_name()
if node_num == 0 then
minetest.chat_send_player(player_name,"[polymer] You have to draw before you can save.")
return
end
local table_string = ""
for i=1, node_num, 1 do
minetest.chat_send_player(player_name,node_box_string[i])
table_string = table_string..node_box_string[i]
end
minetest.chat_send_player(player_name,"[polymer] Saved project to mod folder")
local file = minetest.get_modpath("polymer").."/nodeboxes"
local f = io.open(file, "r")
local contents = f:read("*all")
f = io.open(file, "w")
f:write(contents.."{"..table_string.."},\n")
f:close()
file = minetest.get_modpath("polymer").."/code"
local f = io.open(file, "r")
local code = f:read("*all")
file = minetest.get_modpath("polymer").."/nodeboxes.lua"
f = io.open(file, "w")
f:write("local node_boxes ={ "..contents.."{"..table_string.."},}\n"..code)
f:close()
end,
})
minetest.register_node("polymer:grid", {--register wild plant
drawtype = "glasslike_framed",
paramtype = "light",
groups = {dig_immediate=3,not_in_creative_inventory=1},
light_source = 12,
drop = "polymer:paint",
tiles = {"polymer_wire.png"},
sunlight_propagates = true,
buildable_to = true,
pointable = true,
walkable = false,
climbable = true,
})
minetest.register_node("polymer:wall", {--register wild plant
drawtype = "node",
paramtype = "light",
groups = {indestructable=1},
light_source = 12,
tiles = {"polymer_wall.png"},
--pointable = false,
})
minetest.register_node("polymer:draw", {
paramtype = "light",
groups = {dig_immediate=3,not_in_creative_inventory=1},
tiles = {"wool_red.png"},
pointable = true,
climbable = true,
buildable_to = true,
walkable = false,
after_dig_node = function(pos)
place_one = nil
place_two = nil
end,
after_place_node = function(pos, player)
local player_name=player:get_player_name()
if place_one == nil then
if place_ori == nil then
minetest.chat_send_player(player_name,"[polymer] Select a nodebox designer block")
return
end
place_one = pos
minetest.chat_send_player(player_name,"[polymer] position 1 set")
elseif place_two == nil then
place_two = pos
local min_x = math.min(place_one.x, place_two.x)
local min_y = math.min(place_one.y, place_two.y)
local min_z = math.min(place_one.z, place_two.z)
local max_x = math.max(place_one.x, place_two.x)
local max_y = math.max(place_one.y, place_two.y)
local max_z = math.max(place_one.z, place_two.z)
node_num = node_num + 1
node_box[node_num] = {{x=min_x, y=min_y, z=min_z},{x=max_x, y=max_y, z=max_z}}
node_box_string[node_num] = "{"..(min_x-place_ori.x-(resolution/2+1)).."/"..resolution..", "..(min_y-place_ori.y-(resolution/2+1)).."/"..resolution..", "..(min_z-place_ori.z-(resolution/2+1)).."/"..resolution..", "..(max_x-place_ori.x-(resolution/2)).."/"..resolution..", "..(max_y-place_ori.y-(resolution/2)).."/"..resolution..", "..(max_z-place_ori.z-(resolution/2)).."/"..resolution.."},"
minetest.chat_send_player(player_name,"[polymer] position 2 set "..node_box_string[node_num])
place_one = nil
place_two = nil
for x=min_x, max_x, 1 do
for y=min_y, max_y, 1 do
for z=min_z, max_z, 1 do
--categorized[x.."-"..y.."-"..z] = nil
minetest.add_node({x=x,y=y,z=z}, {name="polymer:paint"})
end
end
end
end
end,
})
minetest.register_node("polymer:paint", {
paramtype = "light",
groups = {dig_immediate=3,not_in_creative_inventory=1},
tiles = {"wool_blue.png"},
pointable = true,
walkable = false,
climbable = true,
})
local file = minetest.get_modpath("polymer").."/nodeboxes"
local f = io.open(file, "r")
local contents = f:read("*all")
file = minetest.get_modpath("polymer").."/code"
f = io.open(file, "r")
local code = f:read("*all")
file = minetest.get_modpath("polymer").."/nodeboxes.lua"
f = io.open(file, "w")
f:write("local node_boxes ={ "..contents.."}\n"..code)
f:close()
dofile(minetest.get_modpath("polymer").."/nodeboxes.lua")
--crafts
minetest.register_craft({
output = 'polymer:draw',
recipe = {
{'polymer:paint'},
}
})
minetest.register_craft({
output = 'polymer:paint',
recipe = {
{'polymer:draw'},
}
})
minetest.register_craftitem("polymer:polymers", {
description = "Polymer",
inventory_image = "farming_cake_mix_pumpkin.png",
})
minetest.register_craft({
type = "cooking",
output = "polymer:polymers",
recipe = "farming:wheat_harvested",
cooktime = 10
})