mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-16 16:11:06 +01:00
Merge pull request 'Add Barrel' (#1977) from AFCMS/MineClone2:barrels into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/1977 Reviewed-by: cora <cora@noreply.git.minetest.land>
This commit is contained in:
commit
6bb6966752
14 changed files with 208 additions and 16 deletions
|
@ -357,6 +357,32 @@ function mcl_util.get_first_occupied_inventory_slot(inventory, listname)
|
|||
return mcl_util.get_eligible_transfer_item_slot(inventory, listname)
|
||||
end
|
||||
|
||||
local function drop_item_stack(pos, stack)
|
||||
if not stack or stack:is_empty() then return end
|
||||
local drop_offset = vector.new(math.random() - 0.5, 0, math.random() - 0.5)
|
||||
minetest.add_item(vector.add(pos, drop_offset), stack)
|
||||
end
|
||||
|
||||
function mcl_util.drop_items_from_meta_container(listname)
|
||||
return function(pos, oldnode, oldmetadata)
|
||||
if oldmetadata and oldmetadata.inventory then
|
||||
-- process in after_dig_node callback
|
||||
local main = oldmetadata.inventory.main
|
||||
if not main then return end
|
||||
for _, stack in pairs(main) do
|
||||
drop_item_stack(pos, stack)
|
||||
end
|
||||
else
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
for i = 1, inv:get_size("main") do
|
||||
drop_item_stack(pos, inv:get_stack("main", i))
|
||||
end
|
||||
meta:from_table()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Returns true if item (itemstring or ItemStack) can be used as a furnace fuel.
|
||||
-- Returns false otherwise
|
||||
function mcl_util.is_fuel(item)
|
||||
|
|
148
mods/ITEMS/mcl_barrels/init.lua
Normal file
148
mods/ITEMS/mcl_barrels/init.lua
Normal file
|
@ -0,0 +1,148 @@
|
|||
local S = minetest.get_translator("mcl_barrels")
|
||||
local F = minetest.formspec_escape
|
||||
local C = minetest.colorize
|
||||
|
||||
--TODO: fix barrel rotation placement
|
||||
|
||||
local open_barrels = {}
|
||||
|
||||
local drop_content = mcl_util.drop_items_from_meta_container("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 = S("27 inventory slots"),
|
||||
_doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."),
|
||||
_doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."),
|
||||
tiles = {"mcl_barrels_barrel_top.png^[transformR270", "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 = S("27 inventory slots"),
|
||||
_doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."),
|
||||
_doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."),
|
||||
_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)
|
||||
|
||||
--Minecraft Java Edition craft
|
||||
minetest.register_craft({
|
||||
output = "mcl_barrels:barrel_closed",
|
||||
recipe = {
|
||||
{"group:wood", "group:wood_slab", "group:wood"},
|
||||
{"group:wood", "", "group:wood"},
|
||||
{"group:wood", "group:wood_slab", "group:wood"},
|
||||
}
|
||||
})
|
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.de.tr
Normal file
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.de.tr
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain: mcl_barrels
|
||||
Barrel=
|
||||
Barrels are containers which provide 27 inventory slots.=
|
||||
To access its inventory, rightclick it. When broken, the items will drop out.=
|
||||
27 inventory slots=
|
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr
Normal file
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain: mcl_barrels
|
||||
Barrel=
|
||||
Barrels are containers which provide 27 inventory slots.=
|
||||
To access its inventory, rightclick it. When broken, the items will drop out.=
|
||||
27 inventory slots=
|
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.fr.tr
Normal file
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.fr.tr
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain: mcl_barrels
|
||||
Barrel=Tonneau
|
||||
Barrels are containers which provide 27 inventory slots.=Les tonneaux sont des conteneurs qui offrent 27 emplacements d'inventaire.
|
||||
To access its inventory, rightclick it. When broken, the items will drop out.=Pour accéder à son inventaire, faites un clic droit dessus. Une fois cassés, les articles tomberont.
|
||||
27 inventory slots=27 emplacements d'inventaire
|
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.pl.tr
Normal file
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.pl.tr
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain: mcl_barrels
|
||||
Barrel=
|
||||
Barrels are containers which provide 27 inventory slots.=
|
||||
To access its inventory, rightclick it. When broken, the items will drop out.=
|
||||
27 inventory slots=
|
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr
Normal file
5
mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain: mcl_barrels
|
||||
Barrel=
|
||||
Barrels are containers which provide 27 inventory slots.=
|
||||
To access its inventory, rightclick it. When broken, the items will drop out.=
|
||||
27 inventory slots=
|
5
mods/ITEMS/mcl_barrels/locale/template.txt
Normal file
5
mods/ITEMS/mcl_barrels/locale/template.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain: mcl_barrels
|
||||
Barrel=
|
||||
Barrels are containers which provide 27 inventory slots.=
|
||||
To access its inventory, rightclick it. When broken, the items will drop out.=
|
||||
27 inventory slots=
|
3
mods/ITEMS/mcl_barrels/mod.conf
Normal file
3
mods/ITEMS/mcl_barrels/mod.conf
Normal file
|
@ -0,0 +1,3 @@
|
|||
name = mcl_barrels
|
||||
depends = mcl_util, mcl_formspec, mcl_sounds
|
||||
author = AFCMS
|
BIN
mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_bottom.png
Executable file
BIN
mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_bottom.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 542 B |
BIN
mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_side.png
Executable file
BIN
mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_side.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 499 B |
BIN
mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_top.png
Executable file
BIN
mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_top.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 566 B |
BIN
mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_top_open.png
Executable file
BIN
mods/ITEMS/mcl_barrels/textures/mcl_barrels_barrel_top_open.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 421 B |
|
@ -291,22 +291,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile
|
|||
end
|
||||
end
|
||||
|
||||
local function drop_items_chest(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("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 drop_items_chest = mcl_util.drop_items_from_meta_container("main")
|
||||
|
||||
local function on_chest_blast(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
|
|
Loading…
Reference in a new issue