Compare commits
5 Commits
68d4f7b209
...
767eb58b95
Author | SHA1 | Date |
---|---|---|
Wuzzy | 767eb58b95 | |
Wuzzy | 3bcaab4da2 | |
Wuzzy | 27edb029ca | |
Wuzzy | cb1cee225c | |
Wuzzy | 288ec1a5da |
20
README.md
|
@ -2,7 +2,7 @@
|
|||
|
||||
Created by Wuzzy
|
||||
|
||||
Version: 3.2.0
|
||||
Version: 3.3.0
|
||||
Playable in Minetest 5.5.0 or later.
|
||||
|
||||
Learn how to use and play Minetest in a nice and cozy castle. Here you learn most of the basics of Minetest and how to play.
|
||||
|
@ -61,7 +61,7 @@ There's also a secret prize, can you win it?
|
|||
## Legalities
|
||||
This tutorial is free software. You can legally study, copy, share, transform, remix, distribute this to your liking, under certain conditions.
|
||||
|
||||
The mods “`tutorial`” and “supplemental” as well the tutorial world are original work by Wuzzy and fall under the MIT License.
|
||||
The mods “`tutorial`” and “`tutorial_supplemental`” as well the tutorial world are original work by Wuzzy and fall under the MIT License.
|
||||
The mod “`tutorial_mapgen`” (Tutorial World generator) is also original work by Wuzzy, same license, but it contains contributions.
|
||||
|
||||
Contributions:
|
||||
|
@ -71,15 +71,15 @@ Contributions:
|
|||
|
||||
Other mods are creation by other people, but heavily modified to fit the Tutorial's needs.
|
||||
|
||||
The mods “`default`” and “`creative`” falls under the GNU LGPLv2.1 for the code and the CC BY-SA 3.0 for artwork.
|
||||
The mod “`darkage`” falls under the MIT License.
|
||||
The mod “`mpd`” falls under the MIT License for the code and the CC BY 3.0 for the music.
|
||||
The mod “`castle`” falls under the MIT License (the author allowed me an exception).
|
||||
The mod “`arrow_signs`” falls under the CC BY-SA 3.0.
|
||||
The mod “`areas`” falls under the GNU LGPLv2.1 (or later).
|
||||
The mod “`cottages`” falls under the GNU GPLv2 (the author allowed me an exception).
|
||||
The mods “`tutorial_default`” and “`tutorial_creative`” falls under the GNU LGPLv2.1 for the code and the CC BY-SA 3.0 for artwork.
|
||||
The mod “`tutorial_darkage`” falls under the MIT License.
|
||||
The mod “`tutorial_music`” falls under the MIT License for the code and the CC BY 3.0 for the music.
|
||||
The mod “`tutorial_castle`” falls under the MIT License (the author allowed me an exception).
|
||||
The mod “`tutorial_arrow_signs`” falls under the CC BY-SA 3.0.
|
||||
The mod “`tutorial_areas`” falls under the GNU LGPLv2.1 (or later).
|
||||
The mod “`tutorial_cottages`” falls under the GNU GPLv2 (the author allowed me an exception).
|
||||
The mod “`show_wielded_item`” is licensed under the GNU LGPLv2 or later.
|
||||
The mod “`supplemental`” falls under the MIT License, with one exception:
|
||||
The mod “`tutorial_supplemental`” falls under the MIT License, with one exception:
|
||||
The texture `supplemental_loudspeaker.png` falls under the CC BY-SA 3.0 (from the developers of the Mesecons mod).
|
||||
Everything else falls under the MIT License.
|
||||
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
name = mpd
|
|
@ -1,3 +0,0 @@
|
|||
name = supplemental
|
||||
depends = tutorial_default, mpd
|
||||
optional_depends = intllib
|
|
@ -1181,9 +1181,13 @@ minetest.register_node("tutorial:itemspawner", {
|
|||
|
||||
local offset = minetest.string_to_pos(meta:get_string("offset"))
|
||||
local itemstring = meta:get_string("itemstring")
|
||||
local alias = minetest.registered_aliases[itemstring]
|
||||
local test_item = ItemStack(itemstring)
|
||||
local test_itemname = test_item:get_name()
|
||||
local alias = minetest.registered_aliases[test_itemname]
|
||||
local itemname
|
||||
if alias then
|
||||
itemstring = alias
|
||||
test_item:set_name(alias)
|
||||
itemstring = test_item:to_string()
|
||||
end
|
||||
local x, y, z = offset.x, offset.y, offset.z
|
||||
local spawnpos = {x=pos.x+x, y=pos.y+y, z=pos.z+z}
|
||||
|
@ -1191,7 +1195,9 @@ minetest.register_node("tutorial:itemspawner", {
|
|||
for o=1, #objs do
|
||||
local ent = objs[o]:get_luaentity()
|
||||
if ent then
|
||||
if ent.name == "__builtin:item" and ent.itemstring == itemstring then
|
||||
local ent_itemstack = ItemStack(ent.itemstring)
|
||||
local itemstack = ItemStack(itemstring)
|
||||
if ent.name == "__builtin:item" and ent_itemstack:get_name() == itemstack:get_name() then
|
||||
-- Remove node when item was spawned successfully.
|
||||
-- So it doesn't get in the way.
|
||||
minetest.remove_node(pos)
|
||||
|
|
|
@ -28,7 +28,7 @@ function default.get_hotbar_bg(x,y)
|
|||
end
|
||||
|
||||
local music = ""
|
||||
if minetest.get_modpath("mpd") then
|
||||
if minetest.get_modpath("tutorial_music") then
|
||||
music = "button[-0.1,0.7;3,1;togglemusic;"..minetest.formspec_escape(S("Toggle music")).."]"
|
||||
end
|
||||
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
name = tutorial_default
|
||||
optional_depends = intllib
|
||||
optional_depends = intllib, tutorial_music
|
||||
|
|
|
@ -1,46 +1,46 @@
|
|||
|
||||
mpd={}
|
||||
tutorial_music={}
|
||||
|
||||
--config
|
||||
mpd.pause_between_songs=7
|
||||
tutorial_music.pause_between_songs=7
|
||||
|
||||
--end config
|
||||
|
||||
mpd.modpath=minetest.get_modpath("mpd")
|
||||
if not mpd.modpath then
|
||||
error("mpd mod folder has to be named 'mpd'!")
|
||||
tutorial_music.modpath=minetest.get_modpath("tutorial_music")
|
||||
if not tutorial_music.modpath then
|
||||
error("mod folder has to be named 'tutorial_music'!")
|
||||
end
|
||||
--{name, length, gain~1}
|
||||
mpd.songs = {}
|
||||
local sfile, sfileerr=io.open(mpd.modpath.."/songs.txt")
|
||||
tutorial_music.songs = {}
|
||||
local sfile, sfileerr=io.open(tutorial_music.modpath.."/songs.txt")
|
||||
if not sfile then error("Error opening songs.txt: "..sfileerr) end
|
||||
for line in sfile:lines() do
|
||||
if line~="" and line[1]~="#" then
|
||||
local name, timeMinsStr, timeSecsStr, gainStr = string.match(line, "^(%S+)%s+(%d+):([%d%.]+)%s+([%d%.]+)$")
|
||||
local timeMins, timeSecs, gain = tonumber(timeMinsStr), tonumber(timeSecsStr), tonumber(gainStr)
|
||||
if name and timeMins and timeSecs and gain then
|
||||
mpd.songs[#mpd.songs+1]={name=name, length=timeMins*60+timeSecs, lengthhr=timeMinsStr..":"..timeSecsStr, gain=gain}
|
||||
tutorial_music.songs[#tutorial_music.songs+1]={name=name, length=timeMins*60+timeSecs, lengthhr=timeMinsStr..":"..timeSecsStr, gain=gain}
|
||||
else
|
||||
minetest.log("warning", "[mpd] Misformatted song entry in songs.txt: "..line)
|
||||
minetest.log("warning", "[tutorial_music] Misformatted song entry in songs.txt: "..line)
|
||||
end
|
||||
end
|
||||
end
|
||||
sfile:close()
|
||||
|
||||
if #mpd.songs==0 then
|
||||
print("[mpd]no songs registered, not doing anything")
|
||||
if #tutorial_music.songs==0 then
|
||||
minetest.log("error", "[tutorial_music] no songs registered, not doing anything")
|
||||
return
|
||||
end
|
||||
|
||||
mpd.storage = minetest.get_mod_storage()
|
||||
tutorial_music.storage = minetest.get_mod_storage()
|
||||
|
||||
mpd.handles={}
|
||||
tutorial_music.handles={}
|
||||
|
||||
mpd.playing=false
|
||||
mpd.id_playing=nil
|
||||
mpd.song_time_left=nil
|
||||
mpd.time_next=10 --sekunden
|
||||
mpd.id_last_played=nil
|
||||
tutorial_music.playing=false
|
||||
tutorial_music.id_playing=nil
|
||||
tutorial_music.song_time_left=nil
|
||||
tutorial_music.time_next=10 --sekunden
|
||||
tutorial_music.id_last_played=nil
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local meta = player:get_meta()
|
||||
|
@ -52,131 +52,131 @@ minetest.register_on_joinplayer(function(player)
|
|||
play = false
|
||||
end
|
||||
if play then
|
||||
mpd.next_song()
|
||||
tutorial_music.next_song()
|
||||
else
|
||||
mpd.stop_song()
|
||||
tutorial_music.stop_song()
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
if mpd.playing then
|
||||
if mpd.song_time_left<=0 then
|
||||
mpd.stop_song()
|
||||
mpd.time_next=mpd.pause_between_songs
|
||||
if tutorial_music.playing then
|
||||
if tutorial_music.song_time_left<=0 then
|
||||
tutorial_music.stop_song()
|
||||
tutorial_music.time_next=tutorial_music.pause_between_songs
|
||||
else
|
||||
mpd.song_time_left=mpd.song_time_left-dtime
|
||||
tutorial_music.song_time_left=tutorial_music.song_time_left-dtime
|
||||
end
|
||||
elseif mpd.time_next then
|
||||
if mpd.time_next<=0 then
|
||||
mpd.next_song()
|
||||
elseif tutorial_music.time_next then
|
||||
if tutorial_music.time_next<=0 then
|
||||
tutorial_music.next_song()
|
||||
else
|
||||
mpd.time_next=mpd.time_next-dtime
|
||||
tutorial_music.time_next=tutorial_music.time_next-dtime
|
||||
end
|
||||
end
|
||||
end)
|
||||
mpd.play_song=function(id)
|
||||
if mpd.playing then
|
||||
mpd.stop_song()
|
||||
tutorial_music.play_song=function(id)
|
||||
if tutorial_music.playing then
|
||||
tutorial_music.stop_song()
|
||||
end
|
||||
local song=mpd.songs[id]
|
||||
local song=tutorial_music.songs[id]
|
||||
if not song then return end
|
||||
for _,player in ipairs(minetest.get_connected_players()) do
|
||||
local pname=player:get_player_name()
|
||||
local pvolume=tonumber(mpd.storage:get_string("vol_"..pname))
|
||||
local pvolume=tonumber(tutorial_music.storage:get_string("vol_"..pname))
|
||||
if not pvolume then pvolume=1 end
|
||||
if pvolume>0 then
|
||||
local handle = minetest.sound_play(song.name, {to_player=pname, gain=song.gain*pvolume})
|
||||
if handle then
|
||||
mpd.handles[pname]=handle
|
||||
tutorial_music.handles[pname]=handle
|
||||
end
|
||||
end
|
||||
end
|
||||
mpd.playing=id
|
||||
tutorial_music.playing=id
|
||||
--adding 2 seconds as security
|
||||
mpd.song_time_left = song.length + 2
|
||||
tutorial_music.song_time_left = song.length + 2
|
||||
end
|
||||
mpd.stop_song=function()
|
||||
for pname, handle in pairs(mpd.handles) do
|
||||
tutorial_music.stop_song=function()
|
||||
for pname, handle in pairs(tutorial_music.handles) do
|
||||
minetest.sound_stop(handle)
|
||||
end
|
||||
mpd.id_last_played=mpd.playing
|
||||
mpd.playing=nil
|
||||
mpd.handles={}
|
||||
mpd.time_next=nil
|
||||
tutorial_music.id_last_played=tutorial_music.playing
|
||||
tutorial_music.playing=nil
|
||||
tutorial_music.handles={}
|
||||
tutorial_music.time_next=nil
|
||||
end
|
||||
|
||||
mpd.next_song=function()
|
||||
tutorial_music.next_song=function()
|
||||
local next
|
||||
repeat
|
||||
next=math.random(1,#mpd.songs)
|
||||
until #mpd.songs==1 or next~=mpd.id_last_played
|
||||
mpd.play_song(next)
|
||||
next=math.random(1,#tutorial_music.songs)
|
||||
until #tutorial_music.songs==1 or next~=tutorial_music.id_last_played
|
||||
tutorial_music.play_song(next)
|
||||
end
|
||||
|
||||
mpd.song_human_readable=function(id)
|
||||
local song=mpd.songs[id]
|
||||
tutorial_music.song_human_readable=function(id)
|
||||
local song=tutorial_music.songs[id]
|
||||
return id..": "..song.name.." ["..song.lengthhr.."]"
|
||||
end
|
||||
|
||||
minetest.register_privilege("mpd", "may control the music player daemon (mpd) mod")
|
||||
minetest.register_privilege("mpd", "May control the music")
|
||||
|
||||
minetest.register_chatcommand("mpd_stop", {
|
||||
minetest.register_chatcommand("music_stop", {
|
||||
params = "",
|
||||
description = "Stop the song currently playing",
|
||||
privs = {mpd=true},
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
player:get_meta():set_string("play_music", "0")
|
||||
mpd.stop_song()
|
||||
tutorial_music.stop_song()
|
||||
end,
|
||||
})
|
||||
minetest.register_chatcommand("mpd_list", {
|
||||
minetest.register_chatcommand("music_list", {
|
||||
params = "",
|
||||
description = "List all available songs and their IDs",
|
||||
privs = {mpd=true},
|
||||
func = function(name, param)
|
||||
for k,v in ipairs(mpd.songs) do
|
||||
minetest.chat_send_player(name, mpd.song_human_readable(k))
|
||||
for k,v in ipairs(tutorial_music.songs) do
|
||||
minetest.chat_send_player(name, tutorial_music.song_human_readable(k))
|
||||
end
|
||||
end,
|
||||
})
|
||||
minetest.register_chatcommand("mpd_play", {
|
||||
minetest.register_chatcommand("music_play", {
|
||||
params = "<id>",
|
||||
description = "Play the songs with the given ID (see ids with /mpd_list)",
|
||||
description = "Play the songs with the given ID (see IDs with /music_list)",
|
||||
privs = {mpd=true},
|
||||
func = function(name, param)
|
||||
id=tonumber(param)
|
||||
if id and id>0 and id<=#mpd.songs then
|
||||
if id and id>0 and id<=#tutorial_music.songs then
|
||||
local player = minetest.get_player_by_name(name)
|
||||
player:get_meta():set_string("play_music", "1")
|
||||
mpd.play_song(id)
|
||||
return true,"Playing: "..mpd.song_human_readable(id)
|
||||
tutorial_music.play_song(id)
|
||||
return true,"Playing: "..tutorial_music.song_human_readable(id)
|
||||
end
|
||||
return false, "Invalid song ID!"
|
||||
end,
|
||||
})
|
||||
minetest.register_chatcommand("mpd_what", {
|
||||
minetest.register_chatcommand("music_what", {
|
||||
params = "",
|
||||
description = "Display the currently played song.",
|
||||
privs = {mpd=true},
|
||||
func = function(name, param)
|
||||
if not mpd.playing then return true,"Nothing playing, "..math.floor(mpd.time_next or 0).." sec. left until next song." end
|
||||
return true,"Playing: "..mpd.song_human_readable(mpd.playing).."\nTime Left: "..math.floor(mpd.song_time_left or 0).." sec."
|
||||
if not tutorial_music.playing then return true,"Nothing playing, "..math.floor(tutorial_music.time_next or 0).." sec. left until next song." end
|
||||
return true,"Playing: "..tutorial_music.song_human_readable(tutorial_music.playing).."\nTime left: "..math.floor(tutorial_music.song_time_left or 0).." sec."
|
||||
end,
|
||||
})
|
||||
minetest.register_chatcommand("mpd_next", {
|
||||
minetest.register_chatcommand("music_next", {
|
||||
params = "[seconds]",
|
||||
description = "Start the next song, either immediately (no parameters) or after n seconds.",
|
||||
privs = {mpd=true},
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
player:get_meta():set_string("play_music", "1")
|
||||
mpd.stop_song()
|
||||
tutorial_music.stop_song()
|
||||
if param and tonumber(param) then
|
||||
mpd.time_next=tonumber(param)
|
||||
tutorial_music.time_next=tonumber(param)
|
||||
return true,"Next song in "..param.." seconds!"
|
||||
else
|
||||
mpd.next_song()
|
||||
tutorial_music.next_song()
|
||||
return true,"Next song started!"
|
||||
end
|
||||
end,
|
||||
|
@ -187,13 +187,13 @@ minetest.register_chatcommand("mvolume", {
|
|||
privs = {},
|
||||
func = function(pname, param)
|
||||
if not param or param=="" then
|
||||
local pvolume=tonumber(mpd.storage:get_string("vol_"..pname))
|
||||
local pvolume=tonumber(tutorial_music.storage:get_string("vol_"..pname))
|
||||
if not pvolume then pvolume=1 end
|
||||
if pvolume>0 then
|
||||
return true, "Your music volume is set to "..pvolume.."."
|
||||
else
|
||||
if mpd.handles[pname] then
|
||||
minetest.sound_stop(mpd.handles[pname])
|
||||
if tutorial_music.handles[pname] then
|
||||
minetest.sound_stop(tutorial_music.handles[pname])
|
||||
end
|
||||
return true, "Background music is disabled for you. Use '/mvolume 1' to enable it again."
|
||||
end
|
||||
|
@ -204,12 +204,12 @@ minetest.register_chatcommand("mvolume", {
|
|||
end
|
||||
pvolume = math.min(pvolume, 1)
|
||||
pvolume = math.max(pvolume, 0)
|
||||
mpd.storage:set_string("vol_"..pname, pvolume)
|
||||
tutorial_music.storage:set_string("vol_"..pname, pvolume)
|
||||
if pvolume>0 then
|
||||
return true, "Music volume set to "..pvolume..". Change will take effect when the next song starts."
|
||||
else
|
||||
if mpd.handles[pname] then
|
||||
minetest.sound_stop(mpd.handles[pname])
|
||||
if tutorial_music.handles[pname] then
|
||||
minetest.sound_stop(tutorial_music.handles[pname])
|
||||
end
|
||||
return true, "Disabled background music for you. Use /mvol to enable it again."
|
||||
end
|
||||
|
@ -218,11 +218,11 @@ minetest.register_chatcommand("mvolume", {
|
|||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if(fields.togglemusic) then
|
||||
if mpd.playing then
|
||||
mpd.stop_song()
|
||||
if tutorial_music.playing then
|
||||
tutorial_music.stop_song()
|
||||
player:get_meta():set_string("play_music", "0")
|
||||
else
|
||||
mpd.next_song()
|
||||
tutorial_music.next_song()
|
||||
player:get_meta():set_string("play_music", "1")
|
||||
end
|
||||
end
|
|
@ -0,0 +1 @@
|
|||
name = tutorial_music
|
|
@ -1,7 +1,9 @@
|
|||
|
||||
### mpd Mod for Minetest
|
||||
(c) 2017 orwell96
|
||||
Slightly modified for the Tutorial.
|
||||
### Tutorial music mod
|
||||
|
||||
Based on the MPD mod ((c) 2017 orwell96)
|
||||
|
||||
Modified for the Tutorial.
|
||||
|
||||
This mod is licensed under the MIT License.
|
||||
|
|
@ -6,7 +6,7 @@ else
|
|||
S = function ( s ) return s end
|
||||
end
|
||||
|
||||
minetest.register_node("supplemental:sticky", {
|
||||
minetest.register_node("tutorial_supplemental:sticky", {
|
||||
description = S("sticky stone brick"),
|
||||
tiles = {"default_stone_brick.png^supplemental_splat.png",
|
||||
"default_stone_brick.png", "default_stone_brick.png", "default_stone_brick.png",
|
||||
|
@ -15,7 +15,7 @@ minetest.register_node("supplemental:sticky", {
|
|||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
minetest.register_node("supplemental:bouncy", {
|
||||
minetest.register_node("tutorial_supplemental:bouncy", {
|
||||
description = S("bouncy block"),
|
||||
tiles = {"supplemental_bouncy.png"},
|
||||
groups = {creative_breakable=1, bouncy=70, fall_damage_add_percent=-100},
|
||||
|
@ -24,22 +24,22 @@ minetest.register_node("supplemental:bouncy", {
|
|||
|
||||
|
||||
|
||||
minetest.register_node("supplemental:conglomerate", {
|
||||
minetest.register_node("tutorial_supplemental:conglomerate", {
|
||||
description = S("conglomerate"),
|
||||
tiles = {"supplemental_conglomerate.png" },
|
||||
groups = {cracky=3},
|
||||
drop = { items = {
|
||||
{ items={"supplemental:rock"} },
|
||||
{ items={"supplemental:rock"}, rarity = 5 },
|
||||
{ items={"supplemental:rock"}, rarity = 5 },
|
||||
{ items={"supplemental:rock"}, rarity = 5 },
|
||||
{ items={"supplemental:rock"}, rarity = 5 },
|
||||
{ items={"tutorial_supplemental:rock"} },
|
||||
{ items={"tutorial_supplemental:rock"}, rarity = 5 },
|
||||
{ items={"tutorial_supplemental:rock"}, rarity = 5 },
|
||||
{ items={"tutorial_supplemental:rock"}, rarity = 5 },
|
||||
{ items={"tutorial_supplemental:rock"}, rarity = 5 },
|
||||
}
|
||||
},
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
minetest.register_node("supplemental:frame",{
|
||||
minetest.register_node("tutorial_supplemental:frame",{
|
||||
description = S("picture frame"),
|
||||
drawtype = "signlike",
|
||||
selection_box = { type = "wallmounted" },
|
||||
|
@ -55,7 +55,7 @@ minetest.register_node("supplemental:frame",{
|
|||
sounds = default.node_sound_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("supplemental:spikes", {
|
||||
minetest.register_node("tutorial_supplemental:spikes", {
|
||||
description = S("short spikes"),
|
||||
tiles = {"supplemental_spikes_small.png"},
|
||||
inventory_image = "supplemental_spikes_small.png",
|
||||
|
@ -76,7 +76,7 @@ minetest.register_node("supplemental:spikes", {
|
|||
}
|
||||
})
|
||||
|
||||
minetest.register_node("supplemental:spikes_large", {
|
||||
minetest.register_node("tutorial_supplemental:spikes_large", {
|
||||
description = S("long spikes"),
|
||||
tiles = {"supplemental_spikes_large.png"},
|
||||
inventory_image = "supplemental_spikes_large.png",
|
||||
|
@ -96,18 +96,18 @@ local set_loudspeaker_infotext = function(pos)
|
|||
meta:set_string("infotext", S("loudspeaker (rightclick to toggle music)"))
|
||||
end
|
||||
|
||||
minetest.register_node("supplemental:loudspeaker", {
|
||||
minetest.register_node("tutorial_supplemental:loudspeaker", {
|
||||
description = S("loudspeaker"),
|
||||
tiles = {"supplemental_loudspeaker.png"},
|
||||
groups = { creative_breakable = 1 },
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_construct = set_loudspeaker_infotext,
|
||||
on_rightclick = function(pos, node, clicker)
|
||||
if mpd.playing then
|
||||
mpd.stop_song()
|
||||
if tutorial_music.playing then
|
||||
tutorial_music.stop_song()
|
||||
clicker:get_meta():set_string("play_music", "0")
|
||||
else
|
||||
mpd.next_song()
|
||||
tutorial_music.next_song()
|
||||
clicker:get_meta():set_string("play_music", "1")
|
||||
end
|
||||
end,
|
||||
|
@ -115,50 +115,50 @@ minetest.register_node("supplemental:loudspeaker", {
|
|||
})
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = { "supplemental:loudspeaker" },
|
||||
nodenames = { "tutorial_supplemental:loudspeaker" },
|
||||
interval = 5,
|
||||
chance = 1,
|
||||
action = set_loudspeaker_infotext,
|
||||
})
|
||||
|
||||
minetest.register_craftitem("supplemental:rock", {
|
||||
minetest.register_craftitem("tutorial_supplemental:rock", {
|
||||
description = S("piece of rock"),
|
||||
inventory_image = "supplemental_rock.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("supplemental:wheat", {
|
||||
minetest.register_craftitem("tutorial_supplemental:wheat", {
|
||||
description = S("wheat"),
|
||||
inventory_image = "supplemental_wheat.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("supplemental:flour", {
|
||||
minetest.register_craftitem("tutorial_supplemental:flour", {
|
||||
description = S("flour"),
|
||||
inventory_image = "supplemental_flour.png",
|
||||
})
|
||||
-- Crafting example #2
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "supplemental:flour",
|
||||
recipe = {"supplemental:wheat", "supplemental:wheat", "supplemental:wheat", "supplemental:wheat"}
|
||||
output = "tutorial_supplemental:flour",
|
||||
recipe = {"tutorial_supplemental:wheat", "tutorial_supplemental:wheat", "tutorial_supplemental:wheat", "tutorial_supplemental:wheat"}
|
||||
})
|
||||
|
||||
-- Items for crafting examples #1, #4 and #5
|
||||
minetest.register_craftitem("supplemental:paper_white", {
|
||||
minetest.register_craftitem("tutorial_supplemental:paper_white", {
|
||||
description = S("white sheet of paper"),
|
||||
inventory_image = "default_paper.png",
|
||||
groups = { paper = 1 },
|
||||
})
|
||||
minetest.register_craftitem("supplemental:paper_orange", {
|
||||
minetest.register_craftitem("tutorial_supplemental:paper_orange", {
|
||||
description = S("orange sheet of paper"),
|
||||
inventory_image = "supplemental_paper_orange.png",
|
||||
groups = { paper = 1 },
|
||||
})
|
||||
minetest.register_craftitem("supplemental:paper_purple", {
|
||||
minetest.register_craftitem("tutorial_supplemental:paper_purple", {
|
||||
description = S("purple sheet of paper"),
|
||||
inventory_image = "supplemental_paper_purple.png",
|
||||
groups = { paper = 1 },
|
||||
})
|
||||
minetest.register_craftitem("supplemental:paper_green", {
|
||||
minetest.register_craftitem("tutorial_supplemental:paper_green", {
|
||||
description = S("green sheet of paper"),
|
||||
inventory_image = "supplemental_paper_green.png",
|
||||
groups = { paper = 1 },
|
||||
|
@ -176,7 +176,7 @@ minetest.register_craft({
|
|||
|
||||
-- 8 viscosity example liquids
|
||||
for v=0,7 do
|
||||
minetest.register_node("supplemental:liquid"..v, {
|
||||
minetest.register_node("tutorial_supplemental:liquid"..v, {
|
||||
description = string.format(S("flowing test liquid %i"), v),
|
||||
inventory_image = minetest.inventorycube("supplemental_testliquid"..v..".png"),
|
||||
drawtype = "flowingliquid",
|
||||
|
@ -202,14 +202,14 @@ for v=0,7 do
|
|||
drop = "",
|
||||
drowning = 1,
|
||||
liquidtype = "flowing",
|
||||
liquid_alternative_flowing = "supplemental:liquid"..v,
|
||||
liquid_alternative_source = "supplemental:liquidsource"..v,
|
||||
liquid_alternative_flowing = "tutorial_supplemental:liquid"..v,
|
||||
liquid_alternative_source = "tutorial_supplemental:liquidsource"..v,
|
||||
liquid_viscosity = v,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
sounds = default.node_sound_water_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("supplemental:liquidsource"..v, {
|
||||
minetest.register_node("tutorial_supplemental:liquidsource"..v, {
|
||||
description = string.format(S("test liquid source %i"), v),
|
||||
inventory_image = minetest.inventorycube("supplemental_testliquid"..v..".png"),
|
||||
drawtype = "liquid",
|
||||
|
@ -229,10 +229,30 @@ for v=0,7 do
|
|||
drop = "",
|
||||
drowning = 1,
|
||||
liquidtype = "source",
|
||||
liquid_alternative_flowing = "supplemental:liquid"..v,
|
||||
liquid_alternative_source = "supplemental:liquidsource"..v,
|
||||
liquid_alternative_flowing = "tutorial_supplemental:liquid"..v,
|
||||
liquid_alternative_source = "tutorial_supplemental:liquidsource"..v,
|
||||
liquid_viscosity = v,
|
||||
groups = {},
|
||||
sounds = default.node_sound_water_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_alias("supplemental:liquid"..v, "tutorial_supplemental:liquid"..v)
|
||||
minetest.register_alias("supplemental:liquidsource"..v, "tutorial_supplemental:liquidsource"..v)
|
||||
end
|
||||
|
||||
|
||||
minetest.register_alias("supplemental:sticky", "tutorial_supplemental:sticky")
|
||||
minetest.register_alias("supplemental:bouncy", "tutorial_supplemental:bouncy")
|
||||
minetest.register_alias("supplemental:conglomerate", "tutorial_supplemental:conglomerate")
|
||||
minetest.register_alias("supplemental:frame", "tutorial_supplemental:frame")
|
||||
minetest.register_alias("supplemental:spikes", "tutorial_supplemental:spikes")
|
||||
minetest.register_alias("supplemental:spikes_large", "tutorial_supplemental:spikes_large")
|
||||
minetest.register_alias("supplemental:loudspeaker", "tutorial_supplemental:loudspeaker")
|
||||
minetest.register_alias("supplemental:rock", "tutorial_supplemental:rock")
|
||||
minetest.register_alias("supplemental:wheat", "tutorial_supplemental:wheat")
|
||||
minetest.register_alias("supplemental:flour", "tutorial_supplemental:flour")
|
||||
minetest.register_alias("supplemental:paper_white", "tutorial_supplemental:paper_white")
|
||||
minetest.register_alias("supplemental:paper_orange", "tutorial_supplemental:paper_orange")
|
||||
minetest.register_alias("supplemental:paper_purple", "tutorial_supplemental:paper_purple")
|
||||
minetest.register_alias("supplemental:paper_green", "tutorial_supplemental:paper_green")
|
||||
minetest.register_alias("supplemental:book", "tutorial_supplemental:book")
|
|
@ -0,0 +1,3 @@
|
|||
name = tutorial_supplemental
|
||||
depends = tutorial_default, tutorial_music
|
||||
optional_depends = intllib
|
Before Width: | Height: | Size: 341 B After Width: | Height: | Size: 341 B |
Before Width: | Height: | Size: 621 B After Width: | Height: | Size: 621 B |
Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B |
Before Width: | Height: | Size: 227 B After Width: | Height: | Size: 227 B |
Before Width: | Height: | Size: 814 B After Width: | Height: | Size: 814 B |
Before Width: | Height: | Size: 391 B After Width: | Height: | Size: 391 B |
Before Width: | Height: | Size: 340 B After Width: | Height: | Size: 340 B |
Before Width: | Height: | Size: 375 B After Width: | Height: | Size: 375 B |
Before Width: | Height: | Size: 387 B After Width: | Height: | Size: 387 B |
Before Width: | Height: | Size: 376 B After Width: | Height: | Size: 376 B |
Before Width: | Height: | Size: 220 B After Width: | Height: | Size: 220 B |
Before Width: | Height: | Size: 842 B After Width: | Height: | Size: 842 B |
Before Width: | Height: | Size: 690 B After Width: | Height: | Size: 690 B |
Before Width: | Height: | Size: 706 B After Width: | Height: | Size: 706 B |
Before Width: | Height: | Size: 710 B After Width: | Height: | Size: 710 B |
Before Width: | Height: | Size: 484 B After Width: | Height: | Size: 484 B |
Before Width: | Height: | Size: 552 B After Width: | Height: | Size: 552 B |
Before Width: | Height: | Size: 511 B After Width: | Height: | Size: 511 B |
Before Width: | Height: | Size: 448 B After Width: | Height: | Size: 448 B |
Before Width: | Height: | Size: 492 B After Width: | Height: | Size: 492 B |
Before Width: | Height: | Size: 547 B After Width: | Height: | Size: 547 B |