-
Notifications
You must be signed in to change notification settings - Fork 0
/
init.lua
188 lines (164 loc) · 4.71 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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
local burndelay = 8
local sorts = {
{"red", "Red"},
{"blue", "Blue"},
{"green", "Green"},
{"purple", "Purple"},
{"orange", "Orange"},
{"yellow", "Yellow"},
{"rainbow", "Rainbow"}
}
-- this abm needs to be a lbm, see https://github.com/minetest/minetest/pull/3677
minetest.register_abm({
nodenames = {"group:fireworks_flame"},
interval = 5,
chance = 1,
catch_up = false,
action = function(pos, node)
minetest.after(burndelay, function(pos, name)
if minetest.get_node(pos).name == name then
minetest.remove_node(pos)
end
end, pos, node.name)
end
})
for _,i in pairs(sorts) do
minetest.register_node("fireworks:firework_"..i[1], {
description = i[2].." Fireworks",
tiles = {"fireworks_firework_"..i[1]..".png"},
groups = {cracky=3, mesecon=2},
on_punch = function(pos)
fireworks_activate(pos, i[1])
end,
mesecons = {
effector = {
action_on = function(pos)
fireworks_activate(pos, i[1])
end
},
},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("fireworks:"..i[1], {
drawtype = "plantlike",
description = i[2],
tiles = {"fireworks_"..i[1]..".png"},
light_source = 14,
-- enabled sunlight_propagates reduces lag
sunlight_propagates = true,
walkable = false,
pointable = false,
diggable = false,
drop = "",
waving = 1,
visual_scale = 2^0.25,
paramtype2 = "degrotate",
groups = {not_in_creative_inventory=1, fireworks_flame=1},
})
end
minetest.register_craft({
output = "fireworks:firework_red 2",
recipe = {
{"default:wood", "default:wood", "default:wood"},
{"default:wood", "default:torch", "default:wood"},
{"default:wood", "default:wood", "default:wood"}
}
})
minetest.register_craft({
output = "fireworks:firework_blue 2",
recipe = {
{"fireworks:firework_red"}
}
})
minetest.register_craft({
output = "fireworks:firework_yellow 2",
recipe = {
{"fireworks:firework_blue"}
}
})
minetest.register_craft({
type = "shapeless",
output = "fireworks:firework_green 2",
recipe = {"fireworks:firework_blue", "fireworks:firework_yellow"},
})
minetest.register_craft({
type = "shapeless",
output = "fireworks:firework_purple 2",
recipe = {"fireworks:firework_red", "fireworks:firework_blue"},
})
minetest.register_craft({
type = "shapeless",
output = "fireworks:firework_orange 2",
recipe = {"fireworks:firework_red", "fireworks:firework_yellow"},
})
minetest.register_craft({
type = "shapeless",
output = "fireworks:firework_rainbow 5",
recipe =
{"fireworks:firework_red", "fireworks:firework_blue", "fireworks:firework_yellow", "fireworks:firework_orange", "fireworks:firework_green", "fireworks:firework_purple"}
})
--[[
local fireworks = {
handler = {},
{name="FireworkCombo44q5", length=14, gain=1}
}
local play_sound = function(list, number)
local gain = 1.0
local handler = minetest.sound_play(list[number].name, {gain=gain})
end]]
local function make_ps(r)
local tab = {}
local num = 1
local tmp = r*r
for x=-r,r do
for y=-r,r do
for z=-r,r do
if x*x+y*y+z*z <= tmp then
tab[num] = {x=x,y=y,z=z}
num = num+1
end
end
end
end
return tab
end
local fireworks_ps
local c_air = minetest.get_content_id("air")
local function show_fireworks(p, name)
fireworks_ps = fireworks_ps or make_ps(4)
local manip = minetest.get_voxel_manip()
local emerged_pos1, emerged_pos2 = manip:read_from_map(
vector.subtract(p, 4),
vector.add(p, 4)
)
local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2})
local nodes = manip:get_data()
local param2s = manip:get_param2_data()
local id = minetest.get_content_id("fireworks:"..name)
for _,i in pairs(fireworks_ps) do
local posi = vector.add(p, i)
local p_posi = area:indexp(posi)
if nodes[p_posi] == c_air then
nodes[p_posi] = id
param2s[p_posi] = math.random(0,179)
minetest.after(math.random()*burndelay, function(posi)
minetest.remove_node(posi)
minetest.sound_play("default_grass_footstep", {pos = posi, max_hear_distance = 50})
end, posi)
end
end
manip:set_data(nodes)
manip:set_param2_data(param2s)
manip:write_to_map()
manip:update_map()
end
function fireworks_activate(pos, name)
minetest.sound_play("default_sand_footstep", {pos = pos, max_hear_distance = 50})
minetest.after(0.2, function(pos, name)
local pos2 = vector.add(pos, {x=math.random(-10, 10), y=math.random(10, 30), z=math.random(-10, 10)})
minetest.sound_play("fireworks", {gain = 10, pos = pos2, max_hear_distance = 50})
show_fireworks(pos2, name)
end, pos, name)
minetest.remove_node(pos)
end
minetest.log("info", "[fireworks] Fireworks Mod Loaded!")