Codebase list minetest-mod-skyblock / 8acfc70
Update upstream source from tag 'upstream/0.2.4' Update to upstream version '0.2.4' with Debian dir 93cdd30533ee6398fbc5894e291fb1673f72a706 Julien Puydt 5 years ago
18 changed file(s) with 217 addition(s) and 121 deletion(s). Raw diff Collapse all Expand all
22 [![home](https://img.shields.io/badge/skyblock-home-blue.svg?style=flat-square)](https://cornernote.github.io/minetest-skyblock/)
33 [![chat](https://img.shields.io/badge/gitter-join%20chat-blue.svg?style=flat-square)](https://gitter.im/cornernote/minetest-skyblock)
44 [![download](https://img.shields.io/github/tag/cornernote/minetest-skyblock.svg?style=flat-square&label=release)](https://github.com/cornernote/minetest-skyblock/releases)
5 [![forum](https://img.shields.io/badge/minetest-game-green.svg?style=flat-square)](https://forum.minetest.net/viewtopic.php?id=2799)
5 [![forum](https://img.shields.io/badge/minetest-mod-green.svg?style=flat-square)](https://forum.minetest.net/viewtopic.php?id=2799)
6 [![bower](https://img.shields.io/badge/bower-mod-green.svg?style=flat-square)](https://minetest-bower.herokuapp.com/mods/skyblock)
67 [![license](https://img.shields.io/badge/license-GPL3-brightgreen.svg?style=flat-square)](https://github.com/cornernote/minetest-skyblock/blob/master/LICENSE.md)
8
9
10 ![SkyBlock](https://cloud.githubusercontent.com/assets/51875/9219481/4c7248b6-411a-11e5-81f1-5e4726a1fa99.png)
711
812
913 ## Description
1721 * [Chat](https://gitter.im/cornernote/minetest-skyblock)
1822 * [Download](https://github.com/cornernote/minetest-skyblock/releases)
1923 * [Forum](https://forum.minetest.net/viewtopic.php?id=2799)
24 * [Bower](https://minetest-bower.herokuapp.com/mods/skyblock)
2025 * [License](https://github.com/cornernote/minetest-skyblock/blob/master/LICENSE.md)
22 "homepage": "https://cornernote.github.io/minetest-skyblock/",
33 "description": "Build a world starting from a small island in the sky.",
44 "keywords": [
5 "skyblock"
5 "skyblock",
6 "quest",
7 "fun",
8 "feat",
9 "island"
610 ],
711 "screenshots": [
8 "https://cloud.githubusercontent.com/assets/51875/9104936/32308738-3c51-11e5-987e-ae805a724a01.png"
12 "https://cloud.githubusercontent.com/assets/51875/9104936/32308738-3c51-11e5-987e-ae805a724a01.png",
13 "https://cloud.githubusercontent.com/assets/51875/9005792/697893a6-37c0-11e5-9a23-f20f93c2325b.png",
14 "https://cloud.githubusercontent.com/assets/51875/9005796/6d8d6b24-37c0-11e5-9c14-b7bb8d66e6e3.png",
15 "https://cloud.githubusercontent.com/assets/51875/9005798/71a68088-37c0-11e5-8f1a-02d1cdd983dc.png"
916 ],
1017 "authors": [
1118 "cornernote"
3232 return true
3333 end)
3434
35 -- register globalstep after the server starts
36 minetest.after(0.1, function()
37 local spawn_timer = 0
38 local spawn_throttle = 1
39
40 -- handle globalstep
41 minetest.register_globalstep(function(dtime)
42 spawn_timer = spawn_timer + dtime
43
44 -- only check once per throttle time
45 if spawn_timer > spawn_throttle then
46 for _,player in ipairs(minetest.get_connected_players()) do
47 local pos = player:getpos()
48 -- hit the bottom
49 if pos.y < skyblock.world_bottom then
50 local spawn = skyblock.get_spawn(player:get_player_name())
51 if minetest.env:get_node(spawn).name == 'skyblock:quest' then
52 player:set_hp(0)
53 else
54 skyblock.spawn_player(player)
55 end
56 end
35 local spawn_throttle = 1
36 local function spawn_tick()
37 for _,player in ipairs(minetest.get_connected_players()) do
38 local pos = player:getpos()
39 -- hit the bottom
40 if pos.y < skyblock.world_bottom then
41 local spawn = skyblock.get_spawn(player:get_player_name())
42 if minetest.env:get_node(spawn).name == 'skyblock:quest' then
43 player:set_hp(0)
44 else
45 skyblock.spawn_player(player)
5746 end
5847 end
59
60 -- reset the spawn_timer
61 if spawn_timer > spawn_throttle then
62 spawn_timer = 0
63 end
64
65 end)
48 end
49 minetest.after(spawn_throttle, spawn_tick)
50 end
51 -- register globalstep after the server starts
52 minetest.after(0.1, spawn_tick)
6653
67 end)
54 -- get content ids
55 local id_cloud = minetest.get_content_id('default:cloud')
56 local id_bottom = minetest.get_content_id(skyblock.world_bottom_node)
6857
6958 -- register map generation
7059 minetest.register_on_generated(function(minp, maxp, seed)
9180 -- add cloud floor
9281 local cloud_y = skyblock.world_bottom-2
9382 if minp.y<=cloud_y and maxp.y>=cloud_y then
94 local id_cloud = minetest.get_content_id('default:cloud')
9583 for x=minp.x,maxp.x do
9684 for z=minp.z,maxp.z do
9785 data[area:index(x,cloud_y,z)] = id_cloud
10189
10290 -- add world_bottom_node
10391 if skyblock.world_bottom_node ~= 'air' then
104 local id_bottom = minetest.get_content_id(skyblock.world_bottom_node)
10592 local y_start = math.max(cloud_y+1,minp.y)
10693 local y_end = math.min(skyblock.start_height,maxp.y)
10794 for x=minp.x,maxp.x do
123110
124111 -- store the voxelmanip data
125112 vm:set_data(data)
126 vm:calc_lighting(emin,emax)
113 -- vm:calc_lighting(emin,emax)
127114 vm:write_to_map(data)
128 vm:update_liquids()
115 -- vm:update_liquids()
116 data = nil
129117 end)
130118
131119
135123 minetest.env:remove_node(pos)
136124 return true -- give back item
137125 end
138 end)
126 end)
3030
3131 -- How far down (in nodes) before a player dies and is respawned
3232 skyblock.world_bottom = tonumber(minetest.setting_get('skyblock.world_bottom')) or -8
33
34 -- Difference (in nodes) between islands starting heights
35 skyblock.height_difference = tonumber(minetest.setting_get('skyblock.height_difference')) or 8
3336
3437 -- Node to use for the world bottom
3538 skyblock.world_bottom_node = minetest.setting_get('skyblock.world_bottom') or 'air' -- 'air' || 'default:water_source' || 'default:lava_source'
269272 local function load_start_positions()
270273 local input = io.open(filename..'.start_positions', 'r')
271274
272 -- create start_positions file if needed
275 -- create start_positions file if needed
273276 if not input then
274277 skyblock.log('generate start positions')
275278 local output = io.open(filename..'.start_positions', 'w')
276279 local pos
277280 for i,v in ripairs(spiralt(skyblock.world_width)) do -- get positions using spiral
278 pos = {x=v.x*skyblock.start_gap, y=skyblock.start_height, z=v.z*skyblock.start_gap}
281 pos = {x=v.x*skyblock.start_gap, y=math.random(skyblock.start_height-skyblock.height_difference, skyblock.start_height+skyblock.height_difference), z=v.z*skyblock.start_gap}
279282 output:write(pos.x..' '..pos.y..' '..pos.z..'\n')
280283 end
281284 io.close(output)
+0
-47
skyblock/textures/README.alphabet.txt less more
0 [Mod] Alphabet [alphabet]
1
2 Homepage: http://minetest.net/forum/viewtopic.php?id=2312
3 License: GNU GPL
4
5 Contributors:
6 cactuz_pl
7
8 Description:
9 This simple mod adds blocks with letters (A-Z, a-z) numbers and symbols.
10
11 To select letter place dirt in place marked in green, place it in the order that corresponds to this letter in Braille.
12 http://en.wikipedia.org/wiki/Braille
13
14 Then place wood in red box - for upper case, or in yellow box - for lower case.
15 To select number place dirt in green box (in Braille, A for 1, B for 2 ... J for 0) and put wood in blue box.
16 To select symbol place dirt in green box and cobble in blue box.
17 A for !
18 B for @
19 C for #
20 D for $
21 E for %
22 F for ^
23 G for &
24 H for *
25 I for (
26 J for )
27 K for '
28 L for \
29 M for :
30 N for ,
31 O for =
32 P for -
33 Q for +
34 R for ?
35 S for "
36 T for /
37 U for _
38 V for . (dot)
39 Example: (for plus)
40 (dirt,dirt, ---)
41 (dirt,dirt, ---)
42 (dirt,---, cobble)
43 Space (white block):
44 (dirt,dirt, ---)
45 (dirt,dirt, ---)
46 (dirt,dirt, ---)
0 # Texture Information and Credits
1
2 * The `skyblock_*.png` were taken from [Minetest Alphabet Mod](http://minetest.net/forum/viewtopic.php?id=2312).
3 * The `checkbox_*.png` was taken from [LPC Pennomi's UI Elements](https://opengameart.org/content/lpc-pennomis-ui-elements)
4 * The interfaces `craft.png`, `goals.png`, `inventory.png`, `rewards.png` were created by cornernote, based on colors from from [LPC Pennomi's UI Elements](https://opengameart.org/content/lpc-pennomis-ui-elements).
66 wool
77 xpanes
88 protector
9 unified_inventory?
9 farming
10 unified_inventory?
3030 local player_name = player:get_player_name()
3131 -- empty inventory
3232 skyblock.levels.empty_inventory(player)
33 -- reset feats
34 skyblock.feats.reset(player_name)
35 -- init level1
36 skyblock.levels[1].init(player_name)
33
34 -- back to beginning
35 if skyblock.levels.restart_on_die then
36 skyblock.feats.reset(player_name)
37 else
38 skyblock.feats.reset_level(player_name)
39 end
40
41 -- back to start of this level
42
3743 end)
3844
3945 -- player receive fields
6060 -- instant grow sapling if there is room
6161 minetest.override_item('default:sapling', {
6262 after_place_node = function(pos)
63 -- check if node under belongs to the soil group
64 pos.y = pos.y - 1
65 local node_under = minetest.get_node(pos)
66 pos.y = pos.y + 1
67 if minetest.get_item_group(node_under.name, "soil") == 0 then
68 return
69 end
70
6371 -- check if we have space to make a tree
6472 for dy=1,4 do
6573 pos.y = pos.y+dy
1010 local group_placeholder = {}
1111 group_placeholder['group:wood'] = 'default:wood'
1212 group_placeholder['group:tree'] = 'default:tree'
13 group_placeholder['group:flora'] = 'flowers:tulip'
1314 group_placeholder['group:stick'] = 'default:stick'
1415 group_placeholder['group:stone'] = 'default:cobble' -- 'default:stone' point people to the cheaper cobble
1516 group_placeholder['group:sand'] = 'default:sand'
1819 group_placeholder['group:wool'] = 'wool:white'
1920
2021 -- handle the standard dye color groups
21 if( dyelocal and dyelocal.dyes ) then
22 for i,d in ipairs( dyelocal.dyes ) do
23 for k,v in pairs(d[3]) do
24 if( k ~= 'dye' ) then
25 group_placeholder['group:dye,'..k ] = 'dye:'..d[1]
22 minetest.after(0.5, function()
23 for index, entry in pairs(minetest.registered_items) do
24 if index:find("dye:") then
25 for k,v in pairs(entry.groups) do
26 if( k ~= 'dye' ) then
27 group_placeholder['group:dye,'..k ] = index
28 end
2629 end
2730 end
2831 end
29 end
32 end)
3033
3134 -- render an image button for a formspec
3235 skyblock.craft_guide.image_button_link = function(stack_string)
8992 receipe_nr = 1
9093 end
9194 if res and receipe_nr > 1 then
92 formspec = formspec..'button[3.8,5.5;1,0.5;skyblock_craft_guide_prev_receipe;prev]'
95 formspec = formspec..'button[3.0,5.5;1,0.5;skyblock_craft_guide_prev_receipe;prev]'
9396 end
9497 if( res and receipe_nr < #res ) then
9598 formspec = formspec..'button[4.0,5.5;1,0.5;skyblock_craft_guide_next_receipe;next]'
149152 return
150153 end
151154 end
152 end)
155 end)
2626 function skyblock.feats.set_level(player_name, level)
2727 if skyblock.levels[level] then
2828 skyblock.feats.set(0, player_name, 'level', level)
29 players_feat[player_name][level] = {}
2930 skyblock.levels[level].init(player_name)
31 skyblock.feats.update(player_name)
3032 return true
3133 end
3234 end
3739 players_feat[player_name] = {}
3840 skyblock.feats.save(players_feat[player_name], player_name)
3941 skyblock.feats.update(player_name)
42 skyblock.levels[1].init(player_name)
43 end
44
45 -- reset level
46 function skyblock.feats.reset_level(player_name)
47 skyblock.log('skyblock.feats.reset_level('..player_name..')')
48 local level = skyblock.feats.get_level(player_name)
49 players_feat[player_name][level] = {}
50 skyblock.feats.save(players_feat[player_name], player_name)
51 skyblock.feats.update(player_name)
52 skyblock.levels[level].init(player_name)
4053 end
4154
4255 -- update feats
5164 if info.count==info.total then
5265 --minetest.chat_send_player(player_name, 'You completed level '..level)
5366 minetest.chat_send_all(player_name..' completed level '..level)
67 for _, ref in pairs(minetest.get_connected_players()) do
68 if not (ref:get_player_name() == player_name) then
69 minetest.sound_play("skyblock_finish_other", {
70 to_player = ref:get_player_name(),
71 gain = 1.0,
72 })
73 else
74 minetest.sound_play("skyblock_finish_level_player", {
75 to_player = player_name,
76 gain = 1.0,
77 })
78 end
79 end
5480 minetest.log('action', player_name..' completed level '..level)
5581
5682 skyblock.feats.add(0,info.player_name,'level')
95121 local rewarded = skyblock.levels[level].reward_feat(player_name,feat)
96122 if rewarded then
97123 minetest.chat_send_all(player_name..' completed the quest "'..feat..'" on level '..level)
124 minetest.sound_play("skyblock_finish_quest", {
125 to_player = player_name,
126 gain = 1.0,
127 })
98128 minetest.log('action', player_name..' completed the quest "'..feat..'" on level '..level)
99129 end
100130 end
110140 local rewarded = skyblock.levels[level].reward_feat(player_name,feat)
111141 if rewarded then
112142 minetest.chat_send_all(player_name..' completed the quest "'..feat..'" on level '..level)
143 minetest.sound_play("skyblock_finish_quest", {
144 to_player = player_name,
145 gain = 1.0,
146 })
113147 minetest.log('action', player_name..' completed the quest "'..feat..'" on level '..level)
114148 end
115149 end
191225 for _,v in ipairs({'doors:door_wood','doors:door_glass','doors:door_steel','doors:door_obsidian_glass'}) do
192226 on_place(v,1);
193227 end
194 for _,v in ipairs({'default:cactus', 'farming:seed_wheat', 'farming:seed_cotton'}) do
228 for _,v in ipairs({
229 'default:cactus',
230 'farming:seed_wheat',
231 'farming:seed_cotton',
232 'default:sign_wall',
233 'default:sign_wall_wood',
234 'default:apple'}) do
195235 on_place(v,0);
196236 end
197237
231271 if pointed_thing.type ~= 'node' then
232272 return
233273 end
234 -- Check if pointing to a liquid source
235 local n = minetest.env:get_node(pointed_thing.under)
274 -- Check if protected
275 if minetest.is_protected(pointed_thing.under, user:get_player_name()) then
276 return
277 end
278 -- Get the Node and Registered Item
279 local n = minetest.get_node_or_nil(pointed_thing.under)
280 local ndef
281 if n then
282 ndef = minetest.registered_items[n.name]
283 end
284 -- Call on_rightclick if the pointed node defines it
285 if ndef and ndef.on_rightclick and user and not user:get_player_control().sneak then
286 return ndef.on_rightclick(pointed_thing.under, n, user, itemstack) or itemstack
287 end
288 -- Check if pointing to a liquid source
236289 local liquid = bucket.liquids[n.name]
237290 if liquid ~= nil and liquid.source == n.name and liquid.itemname ~= nil then
238291
255308 if pointed_thing.type ~= 'node' then
256309 return
257310 end
258 -- Check if pointing to a liquid
259 local n = minetest.env:get_node(pointed_thing.under)
311 -- Check if protected
312 if minetest.is_protected(pointed_thing.under, user:get_player_name()) then
313 return
314 end
315 -- Get the Node and Registered Item
316 local n = minetest.get_node_or_nil(pointed_thing.under)
317 local ndef
318 if n then
319 ndef = minetest.registered_items[n.name]
320 end
321 -- Call on_rightclick if the pointed node defines it
322 if ndef and ndef.on_rightclick and user and not user:get_player_control().sneak then
323 return ndef.on_rightclick(pointed_thing.under, n, user, itemstack) or itemstack
324 end
325 -- Check if pointing to a liquid
260326 if bucket.liquids[n.name] == nil then
261327 -- Not a liquid
262328
263329 -- begin anti-grief change
264330 local player_name = user:get_player_name()
265331 local spawn = skyblock.get_spawn(player_name)
266 local range = skyblock.start_gap/3 -- how far from spawn you can use water
332 local range = tonumber(minetest.setting_get("bucket_use_range")) or false -- how far from spawn you can use water
267333 local pos = pointed_thing.under
268 if spawn==nil
334 if range and (spawn==nil
269335 or (pos.x-spawn.x > range or pos.x-spawn.x < range*-1)
270336 or (pos.y-spawn.y > range/2 or pos.y-spawn.y < range*-1/2)
271 or (pos.z-spawn.z > range or pos.z-spawn.z < range*-1) then
337 or (pos.z-spawn.z > range or pos.z-spawn.z < range*-1)) then
272338 minetest.chat_send_player(player_name, 'Cannot use bucket so far from your home.')
273339 return
274340 end
297363 if pointed_thing.type ~= 'node' then
298364 return
299365 end
366 -- Check if protected
367 if minetest.is_protected(pointed_thing.under, user:get_player_name()) then
368 return
369 end
370 -- Get the Node and Registered Item
371 local n = minetest.get_node_or_nil(pointed_thing.under)
372 local ndef
373 if n then
374 ndef = minetest.registered_items[n.name]
375 end
376 -- Call on_rightclick if the pointed node defines it
377 if ndef and ndef.on_rightclick and user and not user:get_player_control().sneak then
378 return ndef.on_rightclick(pointed_thing.under, n, user, itemstack) or itemstack
379 end
300380 -- Check if pointing to a liquid
301 local n = minetest.env:get_node(pointed_thing.under)
302381 if bucket.liquids[n.name] == nil then
303382 -- Not a liquid
304383
305384 -- begin anti-grief change
306385 local player_name = user:get_player_name()
307386 local spawn = skyblock.get_spawn(player_name)
308 local range = skyblock.start_gap/3 -- how far from spawn you can use lava
387 local range = tonumber(minetest.setting_get("bucket_use_range")) or false -- how far from spawn you can use lava
309388 local pos = pointed_thing.under
310 if spawn==nil or (pos.x-spawn.x > range or pos.x-spawn.x < range*-1) or (pos.z-spawn.z > range or pos.z-spawn.z < range*-1) then
389 if range and (spawn==nil
390 or (pos.x-spawn.x > range or pos.x-spawn.x < range*-1)
391 or (pos.z-spawn.z > range or pos.z-spawn.z < range*-1)) then
311392 --if (pos.y-spawn.y > range/2 or pos.y-spawn.y < range*-1/2) then
312393 minetest.chat_send_player(player_name, 'Cannot use bucket so far from your home.')
313394 return
331412 on_place = bucket_lava_on_use,
332413 on_use = bucket_lava_on_use,
333414 })
415
416 -- add protection to hoes
417 for _, material in pairs({"wood", "stone", "steel", "bronze", "mese", "diamond"}) do
418 local old_use = minetest.registered_items["farming:hoe_" .. material].on_use
419 minetest.override_item("farming:hoe_" .. material, {
420 on_use = function(itemstack, user, pointed_thing)
421 if not minetest.is_protected(pointed_thing.above, user:get_player_name()) then
422 old_use(itemstack, user, pointed_thing)
423 end
424 end
425 })
426 end
334427
335428 -- make directory
336429 local function mkdir(path)
9292 },
9393 {
9494 name = 'craft and place a Sign',
95 hint = 'default:sign_wall',
95 hint = 'default:sign_wall_wood',
9696 feat = 'place_sign',
9797 count = 1,
9898 reward = 'default:pick_steel',
99 placenode = {'default:sign_wall'},
99 placenode = {'default:sign_wall_wood'},
100100 },
101101 {
102102 name = 'craft and place a Door',
4444 },
4545 {
4646 name = 'place 10 Ladders',
47 hint = 'default:ladder',
47 hint = 'default:ladder_wood',
4848 feat = 'place_ladder',
4949 count = 10,
5050 reward = 'default:desert_cobble 50',
51 placenode = {'default:ladder'},
51 placenode = {'default:ladder_wood', 'default:ladder_steel'},
5252 },
5353 {
5454 name = 'place 20 Wood Fences',
8383 placenode = {'default:cobble'},
8484 },
8585 {
86 name = 'dig 4 Coal Lumps',
86 name = 'dig 2 Coal Lumps',
8787 hint = 'default:stone_with_coal',
8888 feat = 'dig_stone_with_coal',
8989 count = 2,
9999 placenode = {'default:torch'},
100100 },
101101 {
102 name = 'dig 8 Iron Lumps',
102 name = 'dig 4 Iron Lumps',
103103 hint = 'default:stone_with_iron',
104104 feat = 'dig_stone_with_iron',
105105 count = 4,
161161 -- add water after dig_stone_with_iron
162162 if rewarded and feat == 'dig_stone_with_iron' then
163163 local pos = skyblock.get_spawn(player_name)
164 minetest.env:add_node({x=pos.x,y=pos.y+1,z=pos.z}, {name='default:water_source'})
164 local y_up = 1
165 while 1 == 1 do
166 local node = minetest.get_node({x=pos.x, y=pos.y+y_up, z=pos.z}).name
167 if node ~= "air" then
168 if node ~= "ignore" then
169 break
170 else
171 -- Err, place at player's pos...
172 pos = minetest.get_player_by_name(player_name):getpos()
173 y_up = -1 -- Will get back to 0
174 end
175 y_up = y_up + 1
176 else
177 break
178 end
179 end
180 minetest.add_node({x=pos.x,y=pos.y+y_up,z=pos.z}, {name='default:water_source'})
165181 return true
166182 end
167183
8383 placenode = {'default:sand'},
8484 },
8585 {
86 name = 'dig 8 Copper lumps',
86 name = 'dig 4 Copper lumps',
8787 hint = 'default:stone_with_copper',
8888 feat = 'dig_stone_with_copper',
8989 count = 4,
9999 placenode = {'xpanes:bar'},
100100 },
101101 {
102 name = 'dig 8 Mese Crystals',
102 name = 'dig 4 Mese Crystals',
103103 hint = 'default:stone_with_mese',
104104 feat = 'dig_stone_with_mese',
105105 count = 4,
212212 -- track bucket lava feats
213213 skyblock.levels[level].bucket_lava_on_use = function(player_name, pointed_thing)
214214 skyblock.levels.bucket_lava_on_use(level, player_name, pointed_thing)
215 end
215 end
99
1010
1111 skyblock.levels = {}
12
13 --
14 -- CONFIG OPTIONS
15 --
16
17 -- true to restart from level1, false to restart from current level
18 skyblock.levels.restart_on_die = minetest.setting_getbool('skyblock.levels.restart_on_die')
19
1220
1321 --
1422 -- Functions