Barrels/init.lua

321 lines
9.0 KiB
Lua

minetest.register_alias("barrels_checker", "barrels:barrels_checker")
minetest.register_craftitem("barrels:barrels_checker", {
description = "Barrels Checker",
inventory_image = "barrels_barrel_checker.png",
stack_max = 1,
})
minetest.register_craft({
output = 'barrels:barrels_checker',
recipe = {
{'barrels:barrel', 'technic:control_logic_unit', ''},
{'', '', ''},
{'', '', ''},
},
additional_wear = -1
})
minetest.register_entity("barrels:item_put",{
hp_max = 1,
visual="wielditem",
visual_size={x=.30,y=.30},
collisionbox = {0,0,0,0,0,0},
physical=false,
textures={"air"}
})
local facedir = {}
facedir[0] = {x=0,y=0,z=1.2} --
facedir[1] = {x=1.2,y=0,z=0} --
facedir[2] = {x=0,y=0,z=-1.2} --
facedir[3] = {x=-1.2,y=0,z=0} --
local remove_item = function(pos)
objs = minetest.env:get_objects_inside_radius(pos, .6)
if objs then
for _, obj in ipairs(objs) do
if obj and obj:get_luaentity() and obj:get_luaentity().name == "barrels:item_put" then
obj:remove()
end
end
end
end
local update_item = function(pos, node)
remove_item(pos)
local meta = minetest.env:get_meta(pos)
if meta:get_string("item") ~= "" then
posad = facedir[node.param2]
pos.x = pos.x + posad.x*7/16
pos.y = pos.y + posad.y*7/16
pos.z = pos.z + posad.z*7/16
local e = minetest.env:add_entity(pos,"barrels:item_put")
local name = ItemStack(meta:get_string("item")):get_name()
e:set_properties({textures={name}})
local yaw = math.pi*2 - node.param2 * math.pi/2
e:setyaw(yaw)
end
end
minetest.register_alias("barrel","barrels:barrel")
minetest.register_craft({
output = 'barrels:barrel 2',
recipe = {
{'group:tree','group:tree', 'group:tree'},
{'group:tree', 'technic:lead_ingot', 'group:tree'},
{'group:tree', 'group:tree', 'group:tree'},
}
})
minetest.register_node("barrels:barrel", {
description = "Barrel",
tiles = {"barrels_barrel_side.png"},
paramtype2 = "facedir",
groups = {cracky=2, tubedevice=1,tubedevice_receiver=1,mesecon=2},
tube={
insert_object=function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos)
if stack:get_name() == meta:get_string("item") then
meta:set_int("item_amount",meta:get_int("item_amount")+stack:get_count())
stack:clear()
return stack
end
if meta:get_int("item_amount") == 0 then
meta:set_int("item_amount",meta:get_int("item_amount")+stack:get_count())
meta:set_string("item",stack:get_name())
update_item(pos,node)
stack:clear()
return stack
end
end,
can_insert=function(pos,node,stack,direction)
if direction.y ~= 0 then
return false
end
local meta=minetest.env:get_meta(pos)
if stack:get_name() == meta:get_string("item") then
return true
end
if meta:get_int("item_amount") == 0 then
return true
end
return false
end,
connect_sides={left=1,right=1,front=1,back=1},
},
mesecons={
effector={
action_on=function(pos,node)
local meta=minetest.get_meta(pos)
local item=meta:get_string("item")
local amount=meta:get_int("item_amount")
if amount==0 then
return
end
local itemstack=ItemStack(item)
local maxstack=itemstack:get_stack_max()
local dropcount=math.min(amount,maxstack)
minetest.add_item({x=pos.x,y=pos.y+1,z=pos.z},item..' '..dropcount)
meta:set_int("item_amount",amount-maxstack)
if meta:get_int("item_amount")==0 then
meta:set_string("item","")
update_item(pos,node)
end
end
},
},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
local item = ""
local item_amount = 0
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
if not(meta:get_string("item") == "")then
return false
end
return true
end,
on_rightclick = function(pos, node, player, itemstack)
local keys = {}
local itemp = itemstack
local meta = minetest.env:get_meta(pos);
if itemstack:get_stack_max() > 1 then
if meta:get_string("item") == itemstack:get_name() then
meta:set_int("item_amount",meta:get_int("item_amount")+itemstack:get_count())
minetest.debug(meta:get_int("item_amount"))
itemstack:clear()
end
if meta:get_string("item") == "" then
meta:set_string("item",itemp:get_name() )
meta:set_int("item_amount",meta:get_int("item_amount")+itemstack:get_count())
minetest.debug(meta:get_int("item_amount"))
itemstack:clear()
update_item(pos,node)
end
end
if itemstack:get_name() == "barrels:barrels_checker" then
local items_amount = meta:get_int("item_amount")
minetest.chat_send_player(player:get_player_name(),items_amount.." "..meta:get_string("item"),true)
end
end,
})
minetest.register_on_punchnode(function(pos, node, puncher)
if node.name == "barrels:barrel" then
local keys = {}
keys = puncher:get_player_control()
local meta = minetest.env:get_meta(pos);
local amount = meta:get_int("item_amount")
local stack1 = meta:get_string("item")
local itemstack = ItemStack(stack1)
local maxstack = itemstack:get_stack_max()
if keys["sneak"] == false then
maxstack = 1
end
local dumpamount = math.min(maxstack,amount)
local stack2 = stack1.." "..dumpamount
local items = meta:get_int("item_amount")
local inv=puncher:get_inventory()
local room1 = inv:room_for_item("main",stack2)
if room1 == true then
inv:add_item("main",stack2)
else
minetest.add_item(puncher:getpos(),stack2)
end
meta:set_int("item_amount",amount-dumpamount)
if meta:get_int("item_amount")==0 then
meta:set_string("item","")
update_item(pos,node)
end
end
end)
minetest.register_alias("locked_barrel","barrels:locked_barrel")
minetest.register_craft({
output = 'barrels:locked_barrel 2',
recipe = {
{'group:tree','group:tree', 'group:tree'},
{'group:tree', 'technic:stainless_steel_ingot', 'group:tree'},
{'group:tree', 'group:tree', 'group:tree'},
}
})
minetest.register_node("barrels:locked_barrel", {
description = "Locked Barrel",
tiles = {"barrels_locked_barrel_side.png"},
paramtype2 = "facedir",
groups = {cracky=2,},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
local item = ""
local item_amount = 0
end,
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("owner",placer:get_player_name())
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
if not(meta:get_string("item") == "")then
return false
end
return true
end,
on_rightclick = function(pos, node, player, itemstack)
local keys = {}
local itemp = itemstack
local meta = minetest.env:get_meta(pos);
if player:get_player_name() == meta:get_string("owner") then
if itemstack:get_stack_max() > 1 then
if meta:get_string("item") == itemstack:get_name() then
meta:set_int("item_amount",meta:get_int("item_amount")+itemstack:get_count())
minetest.debug(meta:get_int("item_amount"))
itemstack:clear()
end
if meta:get_string("item") == "" then
meta:set_string("item",itemp:get_name() )
meta:set_int("item_amount",meta:get_int("item_amount")+itemstack:get_count())
minetest.debug(meta:get_int("item_amount"))
itemstack:clear()
update_item(pos,node)
end
end
if itemstack:get_name() == "barrels:barrels_checker" then
local items_amount = meta:get_int("item_amount")
minetest.chat_send_player(player:get_player_name(),items_amount.." "..meta:get_string("item"),true)
end
end
end,
})
minetest.register_on_punchnode(function(pos, node, puncher)
if node.name == "barrels:locked_barrel" then
local keys = {}
keys = puncher:get_player_control()
local meta = minetest.env:get_meta(pos);
local stack1 = meta:get_string("item")
minetest.debug(puncher:get_player_name())
minetest.debug(meta:get_string("owner"))
if puncher:get_player_name() == meta:get_string("owner") then
local stack2 = stack1.." 99"
local items = meta:get_int("item_amount")
if keys["sneak"] == true then
if meta:get_int("item_amount") >= 99 then
minetest.env:add_item(puncher:getpos(),stack2)
meta:set_int("item_amount",meta:get_int("item_amount")-99)
if meta:get_int("item_amount") < 1 then
meta:set_string("item","")
meta:set_int("item_amount",0)
update_item(pos,node)
end
return
end
if meta:get_int("item_amount") < 99 then
if meta:get_int("item_amount") > 0 then
local stack2 = stack1.." "..items
minetest.env:add_item(puncher:getpos(),stack2)
meta:set_int("item_amount",meta:get_int("item_amount")-meta:get_int("item_amount"))
if meta:get_int("item_amount") < 1 then
meta:set_string("item","")
meta:set_int("item_amount",0)
update_item(pos,node)
end
end
return
end
end
if keys["sneak"] == false then
minetest.env:add_item(puncher:getpos(),stack1)
meta:set_int("item_amount",meta:get_int("item_amount")-1)
if meta:get_int("item_amount") < 1 then
meta:set_string("item","")
meta:set_int("item_amount",0)
update_item(pos,node)
end
return
end
end
end
end)
minetest.register_abm({
nodenames = {"barrels:barrel","barrels:locked_barrel"},
interval = 1.0,
chance = 2,
action = function(pos, node, active_object_count, active_object_count_wider)
update_item(pos,node)
end,
})