forked from minetest/minetest
-
Notifications
You must be signed in to change notification settings - Fork 11
/
init.lua
163 lines (144 loc) · 5.52 KB
/
init.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
local S = minetest.get_translator("testitems")
--
-- Texture overlays for items
--
-- For the global overlay color test
local GLOBAL_COLOR_ARG = "orange"
-- Punch handler to set random color with "color" argument in item metadata
local overlay_on_use = function(itemstack, user, pointed_thing)
local meta = itemstack:get_meta()
local color = math.random(0x0, 0xFFFFFF)
local colorstr = string.format("#%06x", color)
meta:set_string("color", colorstr)
minetest.log("action", "[testitems] Color of "..itemstack:get_name().." changed to "..colorstr)
return itemstack
end
-- Place handler to clear item metadata color
local overlay_on_place = function(itemstack, user, pointed_thing)
local meta = itemstack:get_meta()
meta:set_string("color", "")
return itemstack
end
minetest.register_craftitem("testitems:overlay_meta", {
description = S("Texture Overlay Test Item, Meta Color") .. "\n" ..
S("Image must be a square with rainbow cross (inventory and wield)") .. "\n" ..
S("Item meta color must only change square color") .. "\n" ..
S("Punch: Set random color") .. "\n" ..
S("Place: Clear color"),
-- Base texture: A grayscale square (can be colorized)
inventory_image = "testitems_overlay_base.png",
wield_image = "testitems_overlay_base.png",
-- Overlay: A rainbow cross (NOT to be colorized!)
inventory_overlay = "testitems_overlay_overlay.png",
wield_overlay = "testitems_overlay_overlay.png",
on_use = overlay_on_use,
on_place = overlay_on_place,
on_secondary_use = overlay_on_place,
})
minetest.register_craftitem("testitems:overlay_global", {
description = S("Texture Overlay Test Item, Global Color") .. "\n" ..
S("Image must be an orange square with rainbow cross (inventory and wield)"),
-- Base texture: A grayscale square (to be colorized)
inventory_image = "testitems_overlay_base.png",
wield_image = "testitems_overlay_base.png",
-- Overlay: A rainbow cross (NOT to be colorized!)
inventory_overlay = "testitems_overlay_overlay.png",
wield_overlay = "testitems_overlay_overlay.png",
color = GLOBAL_COLOR_ARG,
})
--
-- Item callbacks
--
minetest.register_craftitem("testitems:callback_1", {
description = "Callback test item 1\n(Use/Drop + Sneak to switch to item 2)",
inventory_image = "testitems_callback_1.png",
wield_image = "testitems_callback_1.png",
on_secondary_use = function(itemstack, user, pointed_thing)
minetest.log("[testitems:callback_1 on_secondary_use] " .. itemstack:get_name())
local ctrl = user and user:get_player_control() or {}
if ctrl.sneak then
itemstack = ItemStack(itemstack)
itemstack:set_name("testitems:callback_2")
return itemstack
end
end,
on_drop = function(itemstack, dropper, pos)
minetest.log("[testitems:callback_1 on_drop] " .. itemstack:get_name())
local ctrl = dropper and dropper:get_player_control() or {}
if ctrl.sneak then
itemstack = ItemStack(itemstack)
itemstack:set_name("testitems:callback_2")
end
return minetest.item_drop(itemstack, dropper, pos)
end,
on_pickup = function(itemstack, picker, pointed_thing, ...)
minetest.log("[testitems:callback_1 on_pickup]")
assert(pointed_thing.ref:get_luaentity().name == "__builtin:item")
local ctrl = picker and picker:get_player_control() or {}
if ctrl.aux1 then
-- Debug message
minetest.log(dump({...}))
end
if ctrl.sneak then
-- Pick up one item of the other kind at once
local taken = itemstack:take_item()
taken:set_name("testitems:callback_2")
local leftover = minetest.item_pickup(taken, picker, pointed_thing, ...)
leftover:set_name("testitems:callback_1")
itemstack:add_item(leftover)
return itemstack
elseif ctrl.up then
-- Don't pick up
return
elseif ctrl.left then
-- Eat it
return minetest.do_item_eat(2, nil, itemstack, picker, pointed_thing)
else
-- Normal: pick up everything
return minetest.item_pickup(itemstack, picker, pointed_thing, ...)
end
end,
on_use = function(itemstack, user, pointed_thing)
minetest.log("[testitems:callback_1 on_use] " .. itemstack:get_name())
local ctrl = user and user:get_player_control() or {}
if ctrl.sneak then
itemstack = ItemStack(itemstack)
itemstack:set_name("testitems:callback_2")
return itemstack
end
end,
after_use = function(itemstack, user, node, digparams) -- never called
minetest.log("[testitems:callback_1 after_use]")
local ctrl = user and user:get_player_control() or {}
if ctrl.up then
itemstack = ItemStack(itemstack)
itemstack:set_name("testitems:callback_2")
return itemstack
end
end,
})
minetest.register_craftitem("testitems:callback_2", {
description = "Callback test item 2\n(Use to switch to item 1)",
inventory_image = "testitems_callback_2.png",
wield_image = "testitems_callback_2.png",
on_use = function(itemstack, user, pointed_thing)
minetest.log("[testitems:callback_2 on_use]")
itemstack = ItemStack(itemstack)
itemstack:set_name("testitems:callback_1")
return itemstack
end,
})
minetest.register_on_item_pickup(function(itemstack, picker, pointed_thing, time_from_last_punch, ...)
assert(not pointed_thing or pointed_thing.ref:get_luaentity().name == "__builtin:item")
local item_name = itemstack:get_name()
if item_name ~= "testitems:callback_1" and item_name ~= "testitems:callback_2" then
return
end
minetest.log("["..item_name.." register_on_item_pickup]")
local ctrl = picker and picker:get_player_control() or {}
if item_name == "testitems:callback_2" and not ctrl.sneak then
-- Same here. Pick up the other item type.
itemstack:set_name("testitems:callback_1")
return picker:get_inventory():add_item("main", itemstack)
end
end)