76eb1ac4691cd1ef7edb5a5053d108f2613b04d4
[oweals/minetest_game.git] / mods / pbj_pup / init.lua
1
2 --[[
3
4   Minetest's official Peanut Butter & Jelly Pup mod
5
6 ]]--
7
8 local enable = minetest.setting_getbool("pbj_pup_enable")
9 if enable == false then
10         return
11 end
12
13 local function howl(ttl, player)
14         if not player then
15                 return
16         end
17         ttl = ttl - 15
18         if ttl < 0 then
19                 return
20         end
21
22         minetest.sound_play("pbj_pup_howl", {object = player, loop = false})
23         minetest.do_item_eat(5, nil, ItemStack("pbj_pup:pbj_pup"), player, nil)
24
25         minetest.after(15, howl, ttl, player)
26 end
27
28 --
29 -- nodes
30 --
31 minetest.register_node("pbj_pup:pbj_pup", {
32         description = "PB&J Pup",
33         tiles = {
34                 "pbj_pup_sides.png",
35                 "pbj_pup_jelly.png",
36                 "pbj_pup_sides.png",
37                 "pbj_pup_sides.png",
38                 "pbj_pup_back.png",
39                 "pbj_pup_front.png"
40         },
41         paramtype = "light",
42         light_source = default.LIGHT_MAX,
43         paramtype2 = "facedir",
44         groups = {cracky = 2},
45         is_ground_content = false,
46         legacy_facedir_simple = true,
47         sounds = default.node_sound_defaults(),
48         stack_max = 1,
49         on_use = function(itemstack, user, pointed_thing)
50                 howl(300, user)
51                 itemstack:take_item()
52                 return itemstack
53         end,
54 })
55
56 minetest.register_node("pbj_pup:pbj_pup_candies", {
57         description = "PB&J Pup Candies",
58         tiles = {{
59                 name = "pbj_pup_candies_animated.png",
60                 animation = {
61                         type = "vertical_frames",
62                         aspect_w = 16,
63                         aspect_h = 16,
64                         length = 1.6
65                 }
66         }},
67         paramtype = "light",
68         light_source = default.LIGHT_MAX,
69         paramtype2 = "facedir",
70         groups = {cracky = 2},
71         is_ground_content = false,
72         stack_max = 5,
73         sounds = default.node_sound_defaults(),
74         on_use = function(itemstack, user, pointed_thing)
75                 minetest.do_item_eat(5, nil, itemstack, user, pointed_thing)
76                 minetest.sound_play("pbj_pup_barks", {object = user, loop = false})
77                 itemstack:take_item()
78                 return itemstack
79         end,
80 })
81
82 --
83 -- mapgen
84 --
85 local gen = minetest.setting_getbool("pbj_pup_generate")
86 if gen == nil or gen then
87         local function place(pos, facedir, length)
88                 if facedir > 3 then
89                         facedir = 0
90                 end
91                 local tailvec = minetest.facedir_to_dir(facedir)
92                 local p = {x = pos.x, y = pos.y, z = pos.z}
93                 minetest.set_node(p, {name = "pbj_pup:pbj_pup", param2 = facedir})
94                 for i = 1, length do
95                         p.x = p.x + tailvec.x
96                         p.z = p.z + tailvec.z
97                         minetest.set_node(p, {name = "pbj_pup:pbj_pup_candies", param2 = facedir})
98                 end
99         end
100
101         local function generate(minp, maxp, seed)
102                 local height_min = -31000
103                 local height_max = -32
104                 if maxp.y < height_min or minp.y > height_max then
105                         return
106                 end
107                 local y_min = math.max(minp.y, height_min)
108                 local y_max = math.min(maxp.y, height_max)
109                 local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
110                 local pr = PseudoRandom(seed + 9324342)
111                 local max_num = math.floor(volume / (16 * 16 * 16))
112                 for i = 1, max_num do
113                         if pr:next(0, 1000) == 0 then
114                                 local x0 = pr:next(minp.x, maxp.x)
115                                 local y0 = pr:next(minp.y, maxp.y)
116                                 local z0 = pr:next(minp.z, maxp.z)
117                                 local p0 = {x = x0, y = y0, z = z0}
118                                 place(p0, pr:next(0, 3), pr:next(3, 15))
119                         end
120                 end
121         end
122
123         minetest.register_on_generated(generate)
124 end
125 --
126 -- compat
127 --
128
129 if minetest.setting_getbool("pbj_pup_alias_nyancat") then
130         minetest.register_alias("default:nyancat", "pbj_pup:pbj_pup")
131         minetest.register_alias("default:nyancat_rainbow","pbj_pup:pbj_pup_candies")
132         minetest.register_alias("nyancat", "pbj_pup:pbj_pup")
133         minetest.register_alias("nyancat_rainbow", "pbj_pup:pbj_pup_candies")
134         minetest.register_alias("nyancat:nyancat", "pbj_pup:pbj_pup")
135         minetest.register_alias("nyancat:nyancat_rainbow", "pbj_pup:pbj_pup_candies")
136 end