1 -- minetest/creative/init.lua
5 if (minetest
.get_modpath("intllib")) then
6 dofile(minetest
.get_modpath("intllib").."/intllib.lua")
7 S
= intllib
.Getter(minetest
.get_current_modname())
9 return minetest
.formspec_escape(S(s
))
12 S
= function ( s
) return s
end
13 F
= function ( s
) return minetest
.formspec_escape(s
) end
16 creative_inventory
= {}
17 creative_inventory
.creative_inventory_size
= 0
19 -- Create detached creative inventory after loading all mods
20 minetest
.after(0, function()
21 local inv
= minetest
.create_detached_inventory("creative", {
22 allow_move
= function(inv
, from_list
, from_index
, to_list
, to_index
, count
, player
)
23 if minetest
.setting_getbool("creative_mode") then
29 allow_put
= function(inv
, listname
, index
, stack
, player
)
32 allow_take
= function(inv
, listname
, index
, stack
, player
)
33 if minetest
.setting_getbool("creative_mode") then
39 on_move
= function(inv
, from_list
, from_index
, to_list
, to_index
, count
, player
)
41 on_put
= function(inv
, listname
, index
, stack
, player
)
43 on_take
= function(inv
, listname
, index
, stack
, player
)
44 --print(player:get_player_name().." takes item from creative inventory; listname="..dump(listname)..", index="..dump(index)..", stack="..dump(stack))
46 minetest
.log("action", player
:get_player_name().." takes "..dump(stack
:get_name()).." from creative inventory")
47 --print("stack:get_name()="..dump(stack:get_name())..", stack:get_count()="..dump(stack:get_count()))
51 local creative_list
= {}
52 for name
,def
in pairs(minetest
.registered_items
) do
53 if (not def
.groups
.not_in_creative_inventory
or def
.groups
.not_in_creative_inventory
== 0)
54 and def
.description
and def
.description
~= "" then
55 table.insert(creative_list
, name
)
58 table.sort(creative_list
)
59 inv
:set_size("main", #creative_list
)
60 for _
,itemstring
in ipairs(creative_list
) do
61 inv
:add_item("main", ItemStack(itemstring
))
63 creative_inventory
.creative_inventory_size
= #creative_list
64 --print("creative inventory size: "..dump(creative_inventory.creative_inventory_size))
67 -- Create the trash field
68 local trash
= minetest
.create_detached_inventory("creative_trash", {
69 -- Allow the stack to be placed and remove it in on_put()
70 -- This allows the creative inventory to restore the stack
71 allow_put
= function(inv
, listname
, index
, stack
, player
)
72 if minetest
.setting_getbool("creative_mode") then
73 return stack
:get_count()
78 on_put
= function(inv
, listname
, index
, stack
, player
)
79 inv
:set_stack(listname
, index
, "")
82 trash
:set_size("main", 1)
85 creative_inventory
.set_creative_formspec
= function(player
, start_i
, pagenum
)
86 pagenum
= math
.floor(pagenum
)
87 local pagemax
= math
.floor((creative_inventory
.creative_inventory_size
-1) / (6*4) + 1)
88 player
:set_inventory_formspec(
90 --"image[6,0.6;1,2;player.png]"..
94 "list[current_player;main;5,3.5;8,1;]"..
95 "list[current_player;main;5,4.75;8,3;8]"..
96 "list[current_player;craft;8,0;3,3;]"..
97 "list[current_player;craftpreview;12,1;1,1;]"..
98 "list[detached:creative;main;0.3,0.5;4,6;"..tostring(start_i
).."]"..
99 "label[2.0,6.55;"..tostring(pagenum
).."/"..tostring(pagemax
).."]"..
100 "button[0.3,6.5;1.6,1;creative_prev;<<]"..
101 "button[2.7,6.5;1.6,1;creative_next;>>]"..
102 "label[5,1.5;"..F("Trash:").."]"..
103 "list[detached:creative_trash;main;5,2;1,1;]"..
104 default
.get_hotbar_bg(5,3.5)
107 minetest
.register_on_joinplayer(function(player
)
108 -- If in creative mode, modify player's inventory forms
109 if not minetest
.setting_getbool("creative_mode") then
112 creative_inventory
.set_creative_formspec(player
, 0, 1)
114 minetest
.register_on_player_receive_fields(function(player
, formname
, fields
)
115 if not minetest
.setting_getbool("creative_mode") then
118 -- Figure out current page from formspec
119 local current_page
= 0
120 local formspec
= player
:get_inventory_formspec()
121 local start_i
= string.match(formspec
, "list%[detached:creative;main;[%d.]+,[%d.]+;[%d.]+,[%d.]+;(%d+)%]")
122 start_i
= tonumber(start_i
) or 0
124 if fields
.creative_prev
then
125 start_i
= start_i
- 4*6
127 if fields
.creative_next
then
128 start_i
= start_i
+ 4*6
132 start_i
= start_i
+ 4*6
134 if start_i
>= creative_inventory
.creative_inventory_size
then
135 start_i
= start_i
- 4*6
138 if start_i
< 0 or start_i
>= creative_inventory
.creative_inventory_size
then
142 creative_inventory
.set_creative_formspec(player
, start_i
, start_i
/ (6*4) + 1)
145 if minetest
.setting_getbool("creative_mode") then
147 minetest
.register_item(":", {
149 wield_image
= "wieldhand.png",
150 wield_scale
= {x
=1,y
=1,z
=2.5},
152 tool_capabilities
= {
153 full_punch_interval
= 0.5,
156 crumbly
= {times
={[1]=digtime
, [2]=digtime
, [3]=digtime
}, uses
=0, maxlevel
=3},
157 cracky
= {times
={[1]=digtime
, [2]=digtime
, [3]=digtime
}, uses
=0, maxlevel
=3},
158 snappy
= {times
={[1]=digtime
, [2]=digtime
, [3]=digtime
}, uses
=0, maxlevel
=3},
159 choppy
= {times
={[1]=digtime
, [2]=digtime
, [3]=digtime
}, uses
=0, maxlevel
=3},
160 oddly_breakable_by_hand
= {times
={[1]=digtime
, [2]=digtime
, [3]=digtime
}, uses
=0, maxlevel
=3},
162 damage_groups
= {fleshy
= 10},
166 minetest
.register_on_placenode(function(pos
, newnode
, placer
, oldnode
, itemstack
)
170 function minetest
.handle_node_drops(pos
, drops
, digger
)
171 if not digger
or not digger
:is_player() then
174 local inv
= digger
:get_inventory()
176 for _
,item
in ipairs(drops
) do
177 item
= ItemStack(item
):get_name()
178 if not inv
:contains_item("main", item
) then
179 inv
:add_item("main", item
)