add barrel

This commit is contained in:
AFCMS 2022-01-20 09:22:17 +01:00 committed by cora
parent 0886f16618
commit eeb288dca7
15 changed files with 170 additions and 17 deletions

View File

@ -357,6 +357,25 @@ function mcl_util.get_first_occupied_inventory_slot(inventory, listname)
return mcl_util.get_eligible_transfer_item_slot(inventory, listname) return mcl_util.get_eligible_transfer_item_slot(inventory, listname)
end end
function mcl_util.drop_items_container_get(listname)
return function(pos, oldnode, oldmetadata)
local meta = minetest.get_meta(pos)
local meta2 = meta:to_table()
if oldmetadata then
meta:from_table(oldmetadata)
end
local inv = meta:get_inventory()
for i = 1, inv:get_size(listname) do
local stack = inv:get_stack(listname, i)
if not stack:is_empty() then
local p = vector.add(pos, vector.new(math.random(0, 10)/10 - 0.5, 0, math.random(0, 10)/10 - 0.5))
minetest.add_item(p, stack)
end
end
meta:from_table(meta2)
end
end
-- Returns true if item (itemstring or ItemStack) can be used as a furnace fuel. -- Returns true if item (itemstring or ItemStack) can be used as a furnace fuel.
-- Returns false otherwise -- Returns false otherwise
function mcl_util.is_fuel(item) function mcl_util.is_fuel(item)

View File

@ -0,0 +1,141 @@
local S = minetest.get_translator("mcl_barrels")
local F = minetest.formspec_escape
local C = minetest.colorize
--TODO: add craft
--TODO: add french translation
--TODO: complete ingame help and tooltips
--TODO: fix barrel rotation placement
local open_barrels = {}
local drop_content = mcl_util.drop_items_container_get("main")
local function on_blast(pos)
local node = minetest.get_node(pos)
drop_content(pos, node)
minetest.remove_node(pos)
end
local function barrel_open(pos, node, clicker)
local name = minetest.get_meta(pos):get_string("name")
if name == "" then
name = S("Barrel")
end
local playername = clicker:get_player_name()
minetest.show_formspec(playername,
"mcl_barrels:barrel_"..pos.x.."_"..pos.y.."_"..pos.z,
table.concat({
"size[9,8.75]",
"label[0,0;"..F(C("#313131", name)).."]",
"list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]",
mcl_formspec.get_itemslot_bg(0, 0.5, 9, 3),
"label[0,4.0;"..F(C("#313131", S("Inventory"))).."]",
"list[current_player;main;0,4.5;9,3;9]",
mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3),
"list[current_player;main;0,7.74;9,1;]",
mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1),
"listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]",
"listring[current_player;main]",
})
)
minetest.swap_node(pos, { name = "mcl_barrels:barrel_open", param2 = node.param2 })
open_barrels[playername] = pos
end
local function close_forms(pos)
local players = minetest.get_connected_players()
local formname = "mcl_barrels:barrel_"..pos.x.."_"..pos.y.."_"..pos.z
for p = 1, #players do
if vector.distance(players[p]:get_pos(), pos) <= 30 then
minetest.close_formspec(players[p]:get_player_name(), formname)
end
end
end
local function update_after_close(pos)
local node = minetest.get_node_or_nil(pos)
if not node then return end
if node.name == "mcl_barrels:barrel_open" then
minetest.swap_node(pos, {name = "mcl_barrels:barrel_closed", param2 = node.param2})
end
end
local function close_barrel(player)
local name = player:get_player_name()
local open = open_barrels[name]
if open == nil then
return
end
update_after_close(open)
open_barrels[name] = nil
end
minetest.register_node("mcl_barrels:barrel_closed", {
description = S("Barrel"),
--_tt_help = tt_help,
--_doc_items_longdesc = longdesc,
--_doc_items_usagehelp = usagehelp,
tiles = {"mcl_barrels_barrel_top.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"},
paramtype = "light",
paramtype2 = "facedir",
--on_place = mcl_util.rotate_axis,
on_place = function(itemstack, placer, pointed_thing)
minetest.rotate_and_place(itemstack, placer, pointed_thing, minetest.is_creative_enabled(placer:get_player_name()), {}, false)
return itemstack
end,
stack_max = 64,
sounds = mcl_sounds.node_sound_wood_defaults(),
groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1},
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("main", 9*3)
end,
after_place_node = function(pos, placer, itemstack, pointed_thing)
minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name"))
end,
after_dig_node = drop_content,
on_blast = on_blast,
on_rightclick = barrel_open,
on_destruct = close_forms,
_mcl_blast_resistance = 2.5,
_mcl_hardness = 2.5,
})
minetest.register_node("mcl_barrels:barrel_open", {
description = S("Barrel Open"),
--_tt_help = tt_help,
--_doc_items_longdesc = longdesc,
--_doc_items_usagehelp = usagehelp,
_doc_items_create_entry = false,
tiles = {"mcl_barrels_barrel_top_open.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"},
paramtype = "light",
paramtype2 = "facedir",
drop = "mcl_barrels:barrel_closed",
stack_max = 64,
sounds = mcl_sounds.node_sound_wood_defaults(),
groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1, not_in_creative_inventory = 1},
after_dig_node = drop_content,
on_blast = on_blast,
on_rightclick = barrel_open,
on_destruct = close_forms,
_mcl_blast_resistance = 2.5,
_mcl_hardness = 2.5,
})
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname:find("mcl_barrels:") == 1 and fields.quit then
close_barrel(player)
end
end)
minetest.register_on_leaveplayer(function(player)
close_barrel(player)
end)

View File

@ -0,0 +1 @@
# textdomain: mcl_barrels

View File

@ -0,0 +1 @@
# textdomain: mcl_barrels

View File

@ -0,0 +1 @@
# textdomain: mcl_barrels

View File

@ -0,0 +1 @@
# textdomain: mcl_barrels

View File

@ -0,0 +1 @@
# textdomain: mcl_barrels

View File

@ -0,0 +1 @@
# textdomain: mcl_barrels

View File

@ -0,0 +1,3 @@
name = mcl_barrels
depends = mcl_util, mcl_formspec, mcl_sounds
author = AFCMS

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

View File

@ -291,22 +291,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile
end end
end end
local function drop_items_chest(pos, oldnode, oldmetadata) local drop_items_chest = mcl_util.drop_items_container_get("main")
local meta = minetest.get_meta(pos)
local meta2 = meta:to_table()
if oldmetadata then
meta:from_table(oldmetadata)
end
local inv = meta:get_inventory()
for i=1,inv:get_size("main") do
local stack = inv:get_stack("main", i)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
meta:from_table(meta2)
end
local function on_chest_blast(pos) local function on_chest_blast(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)

View File

@ -16,7 +16,6 @@ local function register_tree_trunk(subname, description_trunk, description_bark,
_doc_items_hidden = false, _doc_items_hidden = false,
tiles = {tile_inner, tile_inner, tile_bark}, tiles = {tile_inner, tile_inner, tile_bark},
paramtype2 = "facedir", paramtype2 = "facedir",
on_place = mcl_util.rotate_axis,
stack_max = 64, stack_max = 64,
groups = {handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, groups = {handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5},
sounds = mcl_sounds.node_sound_wood_defaults(), sounds = mcl_sounds.node_sound_wood_defaults(),