The idea being, give table pattern and raw materials, and it would make from pattern.
Code: Select all
minetest.register_node("workers:builder", {
description = "Benjo The Builder",
tile_images = worker_images("benjo"),
stack_max = 1,
paramtype2 = "facedir",
groups = {oddly_breakable_by_hand=2,flammable=1,worker=1},
legacy_facedir_simple = true,
after_place_node = function(pos,player)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[8,6;]"..
"list[current_player;main;0,2;8,4;]"..
"list[current_name;plan;2,0;1,1;]"..
"list[current_name;material;5,0;1,1;]"..
"image[6,0;1,1;default_brick.png]")
local inv = meta:get_inventory()
inv:set_size("plan", 1)
inv:set_size("material", 1)
meta:set_string("infotext", "I can build simple structures, Master")
meta:set_string("master",player:get_player_name())
meta:set_int("start_work",0)
minetest.chat_send_player(player:get_player_name(), "Benjo: Hello, Master.")
end,
on_punch = function(pos, node, player)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
local master = meta:get_string("master")
if player:get_player_name() ~= master then
defend(player,master,"Benjo")
return
end
if inv:is_empty("plan") or inv:is_empty("material") then return end
if meta:get_int("start_work") == 0 then --if Benjo hasn't moved yet
meta:set_int("start_work",1)
minetest.chat_send_player(master, "Benjo: Right away, Master.")
end
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos)
local master = meta:get_string("master")
local inv = meta:get_inventory()
if not (inv:is_empty("plan")) and not (inv:is_empty("material")) then
minetest.chat_send_player(master, "Benjo: I cannot leave yet, Master. There are items in my inventory.")
return false
end
minetest.chat_send_player(master, "Benjo: Pleasure to work for you, Master.")
return true
end,
})
Code: Select all
--[[
A simple crafter for Minetest
Made by pandaro
License: GPLv3
a block and a entity
thanks to:
cornernote for inspiration code
PilzAdam for any suggestions
"all" patience
]]--
-- expose api
crafter = {}
-- table of non playing characters
crafter.npc = {}
crafter.chest={}
--definition of crafter chest
minetest.register_node("crafter:crafter_chest", {
description = "crafter chest",
tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
"default_chest_side.png", "default_chest_side.png", "villager_crafter_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct=function(pos)
local k = pos.x..","..pos.y..","..pos.z
crafter.npc[k] =minetest.env:add_entity({x=pos.x,y=pos.y+1.5,z=pos.z},"crafter:crafter")--add crafter
crafter.chest[k] =minetest.env:get_meta(pos)--give metainf
crafter.chest[k]:set_string("formspec",
"size[12,12]"..
"list[current_name;necessary;0,0;2,4;]"..
"list[current_name;crafting_table;3,0;3,3;]"..
"list[current_name;crafted;7,0;2,4;]"..
"list[current_player;main;0,5;8,4;]")
crafter.chest[k]:set_string("infotext", "crafter chest")
local inv = crafter.chest[k]:get_inventory()--give inventory
inv:set_size("necessary", 2*4)
inv:set_size("crafting_table", 3*3)
inv:set_size("crafted",2*4)
crafter.npc[k]:get_luaentity().code=k--give a name
crafter.npc[k]:get_luaentity().cesto=pos--give a reference to the chest
crafter.npc[k]:get_luaentity().zione="crafter"
crafter.npc[k]:get_luaentity().inv=inv
crafter.npc[k]:get_luaentity()
nodeupdate(pos)
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from chest at "..minetest.pos_to_string(pos))
end
})
--Definition of crafter
minetest.register_entity("crafter:crafter",{
hp_max = 5,
physical = true,
weight = 5,
collisionbox = {-0.4, -1, -0.4, 0.4, 1, 0.4},
visual = "upright_sprite",
visual_size = {x=1, y=2},
textures = {"villager_crafter_npc_sprite_front.png", "villager_crafter_npc_sprite_back.png"},
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = true,
makes_footstep_sound = false,
automatic_rotate = false,
get_staticdata = function(self)--save necessary informations
return minetest.serialize({
code = self.code,
cesto=self.cesto,
zione=self.zione,
})
end,
on_activate=function(self,staticdata)--load necessary informations
local data = minetest.deserialize(staticdata)
if data and data.code then
local k = data.code
crafter.npc[k] = self.object
self.code = data.code
self.cesto = data.cesto
self.zione = data.zione
crafter.npc[self.code]:get_luaentity()
crafter.chest[self.code]= (minetest.env:get_meta(self.cesto))
self.inv=crafter.inv(self)
end
end,
on_step=function(self,dtime)
if math.random(1,100)==1 then
crafter.crafting(self,{{name="default:cobble",count=2},{name="default:stick",count=1}},{name="default:sword_stone",count=1})
crafter.crafting(self,{{name="default:wood",count=2},{name="default:stick",count=1}},{name="default:sword_wood",count=1})
crafter.crafting(self,{{name="default:steel_ingot",count=2},{name="default:stick",count=1}},{name="default:sword_steel",count=1})
end
end,
})
crafter.inv=function(self)
local inv=crafter.chest[self.code]:get_inventory()
return inv
end
crafter.crafting=function(self,needed,output)
local canbuild=1
for i,v in pairs (needed) do
if self.inv:contains_item("necessary",v) then
else
canbuild=0
break
end
end
if canbuild==1 then
for i,v in pairs (needed) do
self.inv:remove_item("necessary",v)
end
self.inv:add_item("crafted",output)
end
end
-- log that we started
minetest.log("action", "[MOD]"..minetest.get_current_modname().." -- loaded from "..minetest.get_modpath(minetest.get_current_modname()))