Initial commit

This commit is contained in:
Wuzzy 2022-11-05 21:12:14 +01:00
commit fa84f7c226
10 changed files with 318 additions and 0 deletions

30
README.md Normal file
View File

@ -0,0 +1,30 @@
## Get Item
This Minetest mod allows you to get easy access to all items of the game,
including items that players might not supposed to get (e.g. items
that are normally hidden from a Creative Mode inventory).
Players need to have the 'give' privilege to use this mod.
It works in all games.
## Usage
To use anything, you need to have the 'give' privilege.
If you have it, you can access items in 3 ways:
* Bag of Everything [`getitem:bag`]:
* An item. Use the 'punch' key to open the dialog
* Chest of Everything [`getitem:chest`]:
* A block. Place it anywhere, then press
the 'place' key while pointing on it
* Chat command `/getitem`: Type it into the chat
In the item window, you can drag out items at will into your
inventory. Put items into the trash slot to destroy them.
## Credits
Created by Wuzzy.
Licensed under the MIT License.

261
init.lua Normal file
View File

@ -0,0 +1,261 @@
local F = minetest.formspec_escape
local S = minetest.get_translator("getitem")
local detached_inventories = {}
local current_pages = {}
local SLOTS_W = 10
local SLOTS_H = 5
local SLOTS = SLOTS_W * SLOTS_H
local function allow_check(player, msg_disallowed)
if player and player:is_player() then
local name = player:get_player_name()
if minetest.check_player_privs(name, "give") then
return -1
else
minetest.chat_send_player(name, msg_disallowed)
minetest.close_formspec(name, "getitem:getitem")
return 0
end
else
return -1
end
end
-- Create detached inventories
local function add_detached_inventories(player)
local name = player:get_player_name()
local inv_items = minetest.create_detached_inventory("getitem_items_"..name, {
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
return 0
end,
allow_put = function(inv, listname, index, stack, player)
return 0
end,
allow_take = function(inv, listname, index, stack, player)
return allow_check(player, S("You can't take items ('give' privilege required)."))
end,
}, name)
local inv_trash = minetest.create_detached_inventory("getitem_trash_"..name, {
allow_take = function(inv, listname, index, stack, player)
return 0
end,
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
return 0
end,
allow_put = function(inv, listname, index, stack, player)
local ret = allow_check(player, S("You can't trash items ('give' privilege required)."))
if ret == -1 then
return stack:get_count()
else
return 0
end
end,
on_put = function(inv, listname, index, stack, player)
inv:set_list(listname, {})
end,
}, name)
inv_trash:set_size("main", 1)
detached_inventories[name] = { items = inv_items, trash = inv_trash }
end
local max_page = 1
local function get_formspec(page, name)
local start = 0 + (page-1)*SLOTS
if not name then
return ""
end
local player = minetest.get_player_by_name(name)
local playerinvsize = player:get_inventory():get_size("main")
local hotbarsize = player:hud_get_hotbar_itemcount()
local pinv_w, pinv_h, pinv_x
pinv_w = hotbarsize
pinv_h = math.ceil(playerinvsize / pinv_w)
pinv_w = math.min(pinv_w, 10)
pinv_h = math.min(pinv_w, 4)
pinv_x = 0
if pinv_w < 9 then
pinv_x = 1
end
local pagestr = ""
if max_page > 1 then
pagestr = "button[0,5;1,1;getitem_prev;"..F(S("<")).."]"..
"button[1,5;1,1;getitem_next;"..F(S(">")).."]"..
"label[2,5;"..F(S("Page: @1/@2", page, max_page)).."]"
end
return "size[10,10]"..
"list[detached:getitem_items_"..name..";main;0,0;"..SLOTS_W..","..SLOTS_H..";"..start.."]"..
"list[current_player;main;"..pinv_x..",6;"..pinv_w..","..pinv_h..";]" ..
"label[8,5;"..F(S("Trash:")).."]" ..
"list[detached:getitem_trash_"..name..";main;9,5;1,1]" ..
pagestr ..
"listring[detached:getitem_items_"..name..";main]"..
"listring[current_player;main]"..
"listring[detached:getitem_trash_"..name..";main]"
end
local show_formspec = function(name)
if not minetest.check_player_privs(name, "give") then
minetest.chat_send_player(name, S("You need to have the 'give' privilege to use this."))
minetest.close_formspec(name, "getitem:getitem")
return false
end
local page = current_pages[name]
local form = get_formspec(page, name)
minetest.show_formspec(name, "getitem:getitem", form)
return true
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == "getitem:getitem" then
local name = player:get_player_name()
if not minetest.check_player_privs(name, "give") then
minetest.chat_send_player(name, S("You need to have the 'give' privilege to use this."))
minetest.close_formspec(name, "getitem:getitem")
return
end
local page = current_pages[name]
local old_page = page
if fields.getitem_next then
page = page + 1
elseif fields.getitem_prev then
page = page - 1
else
return
end
if page < 1 then
page = 1
end
if page > max_page then
page = max_page
end
if page ~= old_page then
current_pages[name] = page
show_formspec(name)
end
end
end)
minetest.register_chatcommand("giveitem", {
description = S("Show a dialog to receive all items"),
param = "",
privs = { give = true },
func = function(name, param)
return show_formspec(name)
end,
})
minetest.register_tool("getitem:bag", {
description = S("Bag of Everything"),
_tt_help = S("Grants access to all items"),
inventory_image = "getitem_bag.png",
wield_image = "getitem_bag.png",
groups = { disable_repair = 1, not_in_creative_inventory = 1 },
on_use = function(itemstack, user)
if user and user:is_player() then
local name = user:get_player_name()
show_formspec(name)
end
end,
})
minetest.register_node("getitem:chest", {
description = S("Chest of Everything"),
_tt_help = S("Grants access to all items"),
tiles = {
"getitem_chest_top.png",
"getitem_chest_bottom.png",
"getitem_chest_side.png",
"getitem_chest_side.png",
"getitem_chest_side.png",
"getitem_chest_front.png",
},
paramtype2 = "facedir",
groups = { dig_immediate=2, not_in_creative_inventory = 1},
is_ground_content = false,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Chest of Everything"))
end,
on_rightclick = function(pos, node, clicker)
if clicker and clicker:is_player() then
local name = clicker:get_player_name()
show_formspec(name)
end
end,
})
local getitem_table
minetest.register_on_mods_loaded(function()
local items = {}
for itemstring,_ in pairs(minetest.registered_items) do
if itemstring ~= "" and itemstring ~= "unknown" and itemstring ~= "ignore" then
table.insert(items, itemstring)
end
end
--[[ Sort items in this order:
* Nodes
* Tools
* Craftitems
* items from this mod (come last) ]]
local function compare(item1, item2)
local def1 = minetest.registered_items[item1]
local def2 = minetest.registered_items[item2]
local tool1 = def1.type == "tool"
local tool2 = def2.type == "tool"
local craftitem1 = def1.type == "craft"
local craftitem2 = def2.type == "craft"
local node1 = def1.type == "node"
local node2 = def2.type == "node"
local nici1 = minetest.get_item_group(item1, "not_in_creative_inventory") == 1 or not def1.description
local nici2 = minetest.get_item_group(item2, "not_in_creative_inventory") == 1 or not def2.description
local getitem1 = string.sub(item1, 1, 8) == "getitem:"
local getitem2 = string.sub(item2, 1, 8) == "getitem:"
if getitem1 and not getitem2 then
return false
elseif not getitem1 and getitem2 then
return true
elseif node1 and not node2 then
return true
elseif not node1 and node2 then
return false
elseif tool1 and not tool2 then
return true
elseif not tool1 and tool2 then
return false
elseif craftitem1 and not craftitem2 then
return true
elseif not craftitem1 and craftitem2 then
return false
else
return item1 < item2
end
end
table.sort(items, compare)
max_page = math.ceil(#items / SLOTS)
getitem_table = items
end)
minetest.register_on_joinplayer(function(player)
add_detached_inventories(player)
local name = player:get_player_name()
local inv = detached_inventories[name].items
inv:set_size("main", #getitem_table)
inv:set_list("main", {})
for i=1, #getitem_table do
inv:add_item("main", getitem_table[i])
end
current_pages[name] = 1
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
current_pages[name] = nil
end)

12
locale/getitem.de.tr Normal file
View File

@ -0,0 +1,12 @@
# textdomain: getitem
You can't take items ('give' privilege required).=Sie können keine Gegenstände entnehmen („give“-Privileg benötigt).
You can't trash items ('give' privilege required).=Sie können keine Gegenstände entsorgen („give“-Privileg benötigt).
Trash:=Müll:
<=<
>=>
Page: @1/@2=Seite: @1/@2
You need to have the 'give' privilege to use this.=Sie benötigen das „give“-Privileg, um dies benutzen zu können.
Show a dialog to receive all items=Zeigt einen Dialog, aus dem man alle Gegenstände entnehmen kann.
Bag of Everything=Tasche mit Allem
Grants access to all items=Gewährt Zugriff zu allen Gegenständen
Chest of Everything=Truhe mit Allem

12
locale/template.txt Normal file
View File

@ -0,0 +1,12 @@
# textdomain: getitem
You can't take items ('give' privilege required).=
You can't trash items ('give' privilege required).=
Trash:=
<=
>=
Page: @1/@2=
You need to have the 'give' privilege to use this.=
Show a dialog to receive all items=
Bag of Everything=
Grants access to all items=
Chest of Everything=

3
mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = getitem
description = Allows you to get all items
optional_depends = tt

BIN
textures/getitem_bag.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 B