From 1c78fd346db7cd5bab4569d07ee2cb74e8e88047 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 20 Feb 2017 14:40:37 -0800 Subject: [PATCH 01/56] Sethome: Migrate sethome mod to player attributes. Migrates settings safely and evacuates the `homes` file entirely over time. --- mods/sethome/init.lua | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua index e0fc453d..13a33e57 100644 --- a/mods/sethome/init.lua +++ b/mods/sethome/init.lua @@ -5,9 +5,9 @@ local homes_file = minetest.get_worldpath() .. "/homes" local homepos = {} local function loadhomes() - local input, err = io.open(homes_file, "r") + local input = io.open(homes_file, "r") if not input then - return minetest.log("info", "Could not load player homes file: " .. err) + return -- no longer an error end -- Iterate over all stored positions in the format "x y z player" for each line @@ -24,11 +24,13 @@ sethome.set = function(name, pos) if not player or not pos then return false end + player:set_attribute("sethome:home", minetest.pos_to_string(pos)) + -- remove `name` from the old storage file local data = {} - local output, err = io.open(homes_file, "w") + local output = io.open(homes_file, "w") if output then - homepos[name] = pos + homepos[name] = nil for i, v in pairs(homepos) do table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i)) end @@ -36,12 +38,18 @@ sethome.set = function(name, pos) io.close(output) return true end - minetest.log("action", "Unable to write to player homes file: " .. err) - return false + return true -- if the file doesn't exist - don't return an error. end sethome.get = function(name) - local pos = homepos[name] + local player = minetest.get_player_by_name(name) + local pos = minetest.string_to_pos(player:get_attribute("sethome:home")) + if pos then + return pos + end + + -- fetch old entry from storage table + pos = homepos[name] if pos then return vector.new(pos) else @@ -50,9 +58,10 @@ sethome.get = function(name) end sethome.go = function(name) + local pos = sethome.get(name) local player = minetest.get_player_by_name(name) - if player and homepos[name] then - player:setpos(homepos[name]) + if player and pos then + player:setpos(pos) return true end return false From 780f991a8775befdbce1253f7a5f6dc1a73f19bf Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 11 Mar 2017 13:52:20 +0100 Subject: [PATCH 02/56] Sapling_on_place: Restore after_place_node() calls --- mods/default/trees.lua | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 5f4d3f1e..3e1bf102 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -457,19 +457,46 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, return itemstack end -- Check tree volume for protection - if not default.intersects_protection( + if default.intersects_protection( vector.add(pos, minp_relative), vector.add(pos, maxp_relative), player_name, interval) then - minetest.set_node(pos, {name = sapling_name}) - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() - end - else minetest.record_protection_violation(pos, player_name) -- Print extra information to explain minetest.chat_send_player(player_name, "Tree will intersect protection") + return itemstack + end + + minetest.log("action", player_name .. " places node " + .. sapling_name .. " at " .. minetest.pos_to_string(pos)) + + local take_item = not minetest.setting_getbool("creative_mode") + local newnode = {name = sapling_name} + local ndef = minetest.registered_nodes[sapling_name] + minetest.set_node(pos, newnode) + + -- Run callback + if ndef and ndef.after_place_node then + -- Deepcopy place_to and pointed_thing because callback can modify it + if ndef.after_place_node(table.copy(pos), placer, + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + if callback(table.copy(pos), table.copy(newnode), + placer, table.copy(node or {}), + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + if take_item then + itemstack:take_item() end return itemstack From 61d7c43c83bda9c88b9cc257432fb5133c06ee87 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 13 Mar 2017 19:56:08 -0700 Subject: [PATCH 03/56] Skeleton key: Change to use left-click (tool on_use) Instead of right click, the skeleton key is now a true `tool` in the sense that it's default left-click action is to create a key for the locked object. This is far better than the outcome of the patches we've done where the only way to create a key for a locked item was to use sneak+rightclick. Now keys are perhaps a bit more sensible, left for making keys, right for opening stuff with keys. Fixes #1625 --- mods/default/tools.lua | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 51854b93..1a08b918 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -383,22 +383,13 @@ minetest.register_tool("default:skeleton_key", { description = "Skeleton Key", inventory_image = "default_key_skeleton.png", groups = {key = 1}, - on_place = function(itemstack, placer, pointed_thing) - local under = pointed_thing.under - local node = minetest.get_node(under) - local def = minetest.registered_nodes[node.name] - if def and def.on_rightclick and - not (placer and placer:get_player_control().sneak) then - return def.on_rightclick(under, node, placer, itemstack, - pointed_thing) or itemstack - end - + on_use = function(itemstack, user, pointed_thing) if pointed_thing.type ~= "node" then return itemstack end local pos = pointed_thing.under - node = minetest.get_node(pos) + local node = minetest.get_node(pos) if not node then return itemstack @@ -413,7 +404,7 @@ minetest.register_tool("default:skeleton_key", { random(2^16) - 1, random(2^16) - 1, random(2^16) - 1, random(2^16) - 1) - local secret, _, _ = on_skeleton_key_use(pos, placer, newsecret) + local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) if secret then -- finish and return the new key @@ -421,7 +412,7 @@ minetest.register_tool("default:skeleton_key", { itemstack:add_item("default:key") local meta = itemstack:get_meta() meta:set_string("secret", secret) - meta:set_string("description", "Key to "..placer:get_player_name().."'s " + meta:set_string("description", "Key to "..user:get_player_name().."'s " ..minetest.registered_nodes[node.name].description) return itemstack end From bd4d2dff1c7ac097980a9d5131243741844e935a Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 15 Mar 2017 21:23:31 +0000 Subject: [PATCH 04/56] Farming: Add override for default:dirt_with_rainforest_litter --- mods/farming/nodes.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index 09ad36f5..c969d31b 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -22,6 +22,14 @@ minetest.override_item("default:dirt_with_dry_grass", { } }) +minetest.override_item("default:dirt_with_rainforest_litter", { + soil = { + base = "default:dirt_with_rainforest_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + minetest.register_node("farming:soil", { description = "Soil", tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, From 73e4666f280804b3f4c2c0571603d717d60a2203 Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Tue, 21 Feb 2017 19:43:34 +0100 Subject: [PATCH 05/56] Change doors to default.can_interact_with_node() --- mods/doors/init.lua | 73 ++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 50 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 0ed98b33..2b3d094a 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -6,6 +6,15 @@ local _doors = {} _doors.registered_doors = {} _doors.registered_trapdoors = {} +local function replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("doors_owner") + if owner and owner ~= "" then + meta:set_string("owner", owner) + meta:set_string("doors_owner", "") + end +end + -- returns an object to a door object or nil function doors.get(pos) local node_name = minetest.get_node(pos).name @@ -139,28 +148,10 @@ function _doors.door_toggle(pos, node, clicker) state = tonumber(state) end - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - -- is player wielding the right key? - local item = clicker:get_wielded_item() - local owner = meta:get_string("doors_owner") - if item:get_name() == "default:key" then - local key_meta = item:get_meta() - local secret = meta:get_string("key_lock_secret") + replace_old_owner_information(pos) - if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) - item:set_metadata("") - end - - if secret ~= key_meta:get_string("secret") then - return false - end - - elseif owner ~= "" then - if clicker:get_player_name() ~= owner then - return false - end - end + if not default.can_interact_with_node(clicker, pos) then + return false end -- until Lua-5.2 we have no bitwise operators :( @@ -211,11 +202,8 @@ local function on_place_node(place_to, newnode, end local function can_dig_door(pos, digger) - local digger_name = digger and digger:get_player_name() - if digger_name and minetest.get_player_privs(digger_name).protection_bypass then - return true - end - return minetest.get_meta(pos):get_string("doors_owner") == digger_name + replace_old_owner_information(pos) + return default.can_interact_with_node(digger, pos) end function doors.register(name, def) @@ -330,7 +318,7 @@ function doors.register(name, def) meta:set_int("state", state) if def.protected then - meta:set_string("doors_owner", pn) + meta:set_string("owner", pn) meta:set_string("infotext", "Owned by " .. pn) end @@ -394,8 +382,9 @@ function doors.register(name, def) door:toggle(player) end def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) local meta = minetest.get_meta(pos) - local owner = meta:get_string("doors_owner") + local owner = meta:get_string("owner") local pname = player:get_player_name() -- verify placer is owner of lockable door @@ -532,28 +521,11 @@ end function _doors.trapdoor_toggle(pos, node, clicker) node = node or minetest.get_node(pos) - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - -- is player wielding the right key? - local item = clicker:get_wielded_item() - local meta = minetest.get_meta(pos) - local owner = meta:get_string("doors_owner") - if item:get_name() == "default:key" then - local key_meta = item:get_meta() - local secret = meta:get_string("key_lock_secret") - if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) - end + replace_old_owner_information(pos) - if secret ~= key_meta:get_string("secret") then - return false - end - - elseif owner ~= "" then - if clicker:get_player_name() ~= owner then - return false - end - end + if not default.can_interact_with_node(clicker, pos) then + return false end local def = minetest.registered_nodes[node.name] @@ -595,7 +567,7 @@ function doors.register_trapdoor(name, def) def.after_place_node = function(pos, placer, itemstack, pointed_thing) local pn = placer:get_player_name() local meta = minetest.get_meta(pos) - meta:set_string("doors_owner", pn) + meta:set_string("owner", pn) meta:set_string("infotext", "Owned by "..pn) return minetest.setting_getbool("creative_mode") @@ -607,8 +579,9 @@ function doors.register_trapdoor(name, def) door:toggle(player) end def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) local meta = minetest.get_meta(pos) - local owner = meta:get_string("doors_owner") + local owner = meta:get_string("owner") local pname = player:get_player_name() -- verify placer is owner of lockable door From 68212967c0c321244eb3c6b79e333844e6dc7b44 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 12 Mar 2017 10:58:09 +0000 Subject: [PATCH 06/56] Biomes: Add and auto-select mgv7 floatland biomes A simple set of biomes for now: Ocean, coniferous forest, grassland, sandstone desert. Update biome lists for blob ores and decorations. Make sandstone desert filler 1 node deeper to match other deserts. --- mods/default/mapgen.lua | 160 ++++++++++++++++++++++++++++++++++------ mods/flowers/mapgen.lua | 6 +- 2 files changed, 142 insertions(+), 24 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 0fabb2ed..9e359a33 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -187,7 +187,8 @@ function default.register_blob_ores() "coniferous_forest_dunes", "coniferous_forest_ocean", "deciduous_forest", "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", - "rainforest", "rainforest_swamp", "rainforest_ocean", "underground"} + "rainforest", "rainforest_swamp", "rainforest_ocean", "underground", + "floatland_ocean", "floatland_grassland", "floatland_coniferous_forest"} }) -- Dirt @@ -211,7 +212,8 @@ function default.register_blob_ores() }, biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest", "deciduous_forest", "deciduous_forest_shore", "savanna", "savanna_shore", - "rainforest", "rainforest_swamp"} + "rainforest", "rainforest_swamp", "floatland_grassland", + "floatland_coniferous_forest"} }) -- Gravel @@ -239,7 +241,8 @@ function default.register_blob_ores() "coniferous_forest_dunes", "coniferous_forest_ocean", "deciduous_forest", "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", - "rainforest", "rainforest_swamp", "rainforest_ocean", "underground"} + "rainforest", "rainforest_swamp", "rainforest_ocean", "underground", + "floatland_ocean", "floatland_grassland", "floatland_coniferous_forest"} }) end @@ -491,7 +494,7 @@ end -- All mapgens except mgv6 -function default.register_biomes() +function default.register_biomes(upper_limit) -- Icesheet @@ -510,7 +513,7 @@ function default.register_biomes() node_riverbed = "default:gravel", depth_riverbed = 2, y_min = -8, - y_max = 31000, + y_max = upper_limit, heat_point = 0, humidity_point = 73, }) @@ -550,7 +553,7 @@ function default.register_biomes() node_riverbed = "default:gravel", depth_riverbed = 2, y_min = 2, - y_max = 31000, + y_max = upper_limit, heat_point = 0, humidity_point = 40, }) @@ -612,7 +615,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 2, - y_max = 31000, + y_max = upper_limit, heat_point = 25, humidity_point = 70, }) @@ -654,7 +657,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 5, - y_max = 31000, + y_max = upper_limit, heat_point = 20, humidity_point = 35, }) @@ -696,7 +699,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 6, - y_max = 31000, + y_max = upper_limit, heat_point = 50, humidity_point = 35, }) @@ -758,7 +761,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 6, - y_max = 31000, + y_max = upper_limit, heat_point = 45, humidity_point = 70, }) @@ -820,7 +823,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 1, - y_max = 31000, + y_max = upper_limit, heat_point = 60, humidity_point = 68, }) @@ -882,7 +885,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 5, - y_max = 31000, + y_max = upper_limit, heat_point = 92, humidity_point = 16, }) @@ -915,7 +918,7 @@ function default.register_biomes() node_top = "default:sand", depth_top = 1, node_filler = "default:sand", - depth_filler = 0, + depth_filler = 1, node_stone = "default:sandstone", --node_water_top = "", --depth_water_top = , @@ -924,7 +927,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 5, - y_max = 31000, + y_max = upper_limit, heat_point = 60, humidity_point = 0, }) @@ -966,7 +969,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 5, - y_max = 31000, + y_max = upper_limit, heat_point = 40, humidity_point = 0, }) @@ -1008,7 +1011,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 1, - y_max = 31000, + y_max = upper_limit, heat_point = 89, humidity_point = 42, }) @@ -1070,7 +1073,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 1, - y_max = 31000, + y_max = upper_limit, heat_point = 86, humidity_point = 65, }) @@ -1137,6 +1140,100 @@ function default.register_biomes() end +-- Biomes for floatlands + +function default.register_floatland_biomes(floatland_level, shadow_limit) + + -- Coniferous forest + + minetest.register_biome({ + name = "floatland_coniferous_forest", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 70, + }) + + -- Grassland + + minetest.register_biome({ + name = "floatland_grassland", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 35, + }) + + -- Sandstone desert + + minetest.register_biome({ + name = "floatland_sandstone_desert", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 1, + node_stone = "default:sandstone", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 0, + }) + + -- Floatland ocean / underground + + minetest.register_biome({ + name = "floatland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = shadow_limit, + y_max = floatland_level + 1, + heat_point = 50, + humidity_point = 50, + }) +end + + -- -- Register decorations -- @@ -1247,7 +1344,8 @@ local function register_grass_decoration(offset, scale, length) persist = 0.6 }, biomes = {"grassland", "grassland_dunes", "deciduous_forest", - "coniferous_forest", "coniferous_forest_dunes"}, + "coniferous_forest", "coniferous_forest_dunes", + "floatland_grassland", "floatland_coniferous_forest"}, y_min = 1, y_max = 31000, decoration = "default:grass_" .. length, @@ -1361,7 +1459,7 @@ function default.register_decorations() octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest"}, + biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_min = 2, y_max = 31000, schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", @@ -1549,7 +1647,8 @@ function default.register_decorations() octaves = 3, persist = 0.7, }, - biomes = {"snowy_grassland", "grassland", "deciduous_forest"}, + biomes = {"snowy_grassland", "grassland", "deciduous_forest", + "floatland_grassland"}, y_min = 1, y_max = 31000, schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", @@ -1655,9 +1754,18 @@ end -- --- Detect mapgen to select functions +-- Detect mapgen, flags and parameters to select functions -- +-- Get setting or default +local mgv7_spflags = minetest.get_mapgen_setting("mgv7_spflags") or + "mountains, ridges, nofloatlands" +local captures_float = string.match(mgv7_spflags, "floatlands") +local captures_nofloat = string.match(mgv7_spflags, "nofloatlands") + +local mgv7_floatland_level = minetest.get_mapgen_setting("mgv7_floatland_level") or 1280 +local mgv7_shadow_limit = minetest.get_mapgen_setting("mgv7_shadow_limit") or 1024 + minetest.clear_registered_biomes() minetest.clear_registered_ores() minetest.clear_registered_decorations() @@ -1667,8 +1775,16 @@ if mg_name == "v6" then default.register_mgv6_blob_ores() default.register_ores() default.register_mgv6_decorations() +elseif mg_name == "v7" and captures_float == "floatlands" and + captures_nofloat ~= "nofloatlands" then + -- Mgv7 with floatlands + default.register_biomes(mgv7_shadow_limit - 1) + default.register_floatland_biomes(mgv7_floatland_level, mgv7_shadow_limit) + default.register_blob_ores() + default.register_ores() + default.register_decorations() else - default.register_biomes() + default.register_biomes(31000) default.register_blob_ores() default.register_ores() default.register_decorations() diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index ec03c9b2..2b960907 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -94,7 +94,8 @@ local function register_flower(seed, name) octaves = 3, persist = 0.6 }, - biomes = {"grassland", "deciduous_forest", "coniferous_forest"}, + biomes = {"grassland", "deciduous_forest", "coniferous_forest", + "floatland_grassland", "floatland_coniferous_forest"}, y_min = 1, y_max = 31000, decoration = "flowers:"..name, @@ -114,7 +115,8 @@ local function register_mushroom(name) octaves = 3, persist = 0.66 }, - biomes = {"deciduous_forest", "coniferous_forest"}, + biomes = {"deciduous_forest", "coniferous_forest", + "floatland_coniferous_forest"}, y_min = 1, y_max = 31000, decoration = "flowers:"..name, From 07e11427cf86de4554834fe1ebbb72531611774b Mon Sep 17 00:00:00 2001 From: octacian Date: Wed, 15 Mar 2017 22:03:52 -0700 Subject: [PATCH 07/56] Keys: Fix crash when using unconfigured default:key Since meta secret field is blank on any keys (default:key) obtained using /give, the game will crash if you attempt to use one of these. This follows along the principle that the game should never have any reason to crash. --- mods/default/functions.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index eeac0c2a..bf3749a8 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -562,7 +562,12 @@ function default.can_interact_with_node(player, pos) local key_meta = item:get_meta() if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) + local key_oldmeta = item:get_metadata() + if key_oldmeta == "" or not minetest.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string("secret", minetest.parse_json(key_oldmeta).secret) item:set_metadata("") end From 02921baa7a5af3f6c2892cd1a63d1383f070cc76 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 17 Mar 2017 05:06:57 +0000 Subject: [PATCH 08/56] Junglegrass: Prevent seeding of dirt_with_grass Previously you could place junglegrass on dirt to convert that dirt to dirt_with_grass, but this is unsuitable now that rainforest has a surface of dirt_with_rainforest_litter. Remove junglegrass from the 'grass' group. --- mods/default/nodes.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 0523097c..c20a3a88 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1170,7 +1170,7 @@ minetest.register_node("default:junglegrass", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1}, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", From d2aae95c3915575f819a89d37f02bb63a5d0f72d Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 17 Mar 2017 05:17:57 +0000 Subject: [PATCH 09/56] Leafdecay: Change Aspen radius back to 3 Although the new aspen tree schematic only requires a radius of 2 the many existing aspen trees in a world require radius 3. --- mods/default/nodes.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c20a3a88..e410172f 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2203,7 +2203,7 @@ default.register_leafdecay({ default.register_leafdecay({ trunks = {"default:aspen_tree"}, leaves = {"default:aspen_leaves"}, - radius = 2, + radius = 3, }) default.register_leafdecay({ From 6a55e150aff0a6f77ed3104add013c03e810043c Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Sat, 18 Mar 2017 17:19:19 +0100 Subject: [PATCH 10/56] Doors: Fix wood/glass doors not opening or closing Some code was lost during a rebase of a recently merged commit (73e4666). --- mods/default/functions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index bf3749a8..8e9132d0 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -550,9 +550,9 @@ function default.can_interact_with_node(player, pos) end local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") - if player:get_player_name() == meta:get_string("owner") then - -- Owner can access the node to any time + if not owner or owner == "" or owner == player:get_player_name() then return true end From ecf160d93d678bdaefbbcb5177895e0733069eff Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 13 Mar 2017 12:35:45 -0700 Subject: [PATCH 11/56] Screwdriver: simplify logic, allow wallmounted rotation. - Allow rotation of wallmounted nodeboxes (signs) since they are now rotating properly. - Instead of testing `ndef` several times, do it once, correctly. - Simplify exception logic for nodes that have `on_rotate` set. - For simplicity, return itemstack, always. - Remove a useless nil check. --- mods/screwdriver/init.lua | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index f2596437..49544de3 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -93,38 +93,33 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) local node = minetest.get_node(pos) local ndef = minetest.registered_nodes[node.name] + if not ndef then + return itemstack + end -- can we rotate this paramtype2? local fn = screwdriver.rotate[ndef.paramtype2] if not fn then - return + return itemstack end local should_rotate = true local new_param2 = fn(pos, node, mode) -- Node provides a handler, so let the handler decide instead if the node can be rotated - if ndef and ndef.on_rotate then + if ndef.on_rotate then -- Copy pos and node because callback can modify it local result = ndef.on_rotate(vector.new(pos), {name = node.name, param1 = node.param1, param2 = node.param2}, user, mode, new_param2) if result == false then -- Disallow rotation - return + return itemstack elseif result == true then should_rotate = false end - else - if not ndef or - ndef.on_rotate == false or - (ndef.drawtype == "nodebox" and - (ndef.node_box and ndef.node_box.type ~= "fixed")) or - node.param2 == nil then - return - end - - if ndef.can_dig and not ndef.can_dig(pos, user) then - return - end + elseif ndef.on_rotate == false then + return itemstack + elseif ndef.can_dig and not ndef.can_dig(pos, user) then + return itemstack end if should_rotate then From 2a7403274511ba008d4a9427f9e676d21786f074 Mon Sep 17 00:00:00 2001 From: octacian Date: Mon, 13 Mar 2017 22:28:03 -0700 Subject: [PATCH 12/56] Books: Fix backwards compatibility issues Commit c68b8274fed183f30bd7609018766a261448b83d prevented books from being copied in the crafting grid, and made it so that old books, though seemingly successfully transferred to the new format, could not be written to as the old data still persisted. --- mods/default/craftitems.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index f002d709..aa8f56bd 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -71,6 +71,7 @@ local function book_on_use(itemstack, user) end minetest.show_formspec(player_name, "default:book", formspec) + return itemstack end minetest.register_on_player_receive_fields(function(player, formname, fields) @@ -133,11 +134,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end - local data_str = minetest.serialize(data) - stack:set_metadata(data_str) - book_on_use(stack, player) + stack:get_meta():from_table(data) + stack = book_on_use(stack, player) end + -- Update stack player:set_wielded_item(stack) end) @@ -178,9 +179,9 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv if not original then return end - local copymeta = original:get_metadata() + local copymeta = original:get_meta():to_table() -- copy of the book held by player's mouse cursor - itemstack:set_metadata(copymeta) + itemstack:get_meta():from_table(copymeta) -- put the book with metadata back in the craft grid craft_inv:set_stack("craft", index, original) end) From 86fd616f3c7ae820934dcd99f4c15342f4eda4ec Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 18 Mar 2017 17:54:03 +0000 Subject: [PATCH 13/56] Flora spread: Allow spread on rainforest litter. Other improvements Use the soil group more instead of checking for multiple node names. Remove 'neighbors' from ABM. Turn any flora to dry shrub if on a non-soil, except when on default:sand to avoid dune grasses being replaced. Search for "group:soil" when searching for a position for the new flora node, instead of searching for multiple node names, however do not spread flora onto desert sand, which is in the soil group. Remove default:dirt_with_snow from the soil group as it would be frozen soil. It can be dug and placed to turn it into dirt (consider this some extra work needed to make it cultivatable). --- mods/default/nodes.lua | 2 +- mods/flowers/init.lua | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index e410172f..c70f614b 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -434,7 +434,7 @@ minetest.register_node("default:dirt_with_snow", { tiles = {"default_snow.png", "default_dirt.png", {name = "default_dirt.png^default_snow_side.png", tileable_vertical = false}}, - groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1}, + groups = {crumbly = 3, spreading_dirt_type = 1, snowy = 1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.15}, diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index da82bb7c..c71bc29c 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -107,12 +107,11 @@ function flowers.flower_spread(pos, node) pos.y = pos.y - 1 local under = minetest.get_node(pos) pos.y = pos.y + 1 - if under.name == "default:desert_sand" then + if minetest.get_item_group(under.name, "soil") == 0 and + -- Do not replace sand dune grasses + under.name ~= "default:sand" then minetest.set_node(pos, {name = "default:dry_shrub"}) return - elseif under.name ~= "default:dirt_with_grass" and - under.name ~= "default:dirt_with_dry_grass" then - return end local light = minetest.get_node_light(pos) @@ -126,24 +125,26 @@ function flowers.flower_spread(pos, node) return end - local seedling = minetest.find_nodes_in_area_under_air(pos0, pos1, - {"default:dirt_with_grass", "default:dirt_with_dry_grass"}) - if #seedling > 0 then - seedling = seedling[math.random(#seedling)] - seedling.y = seedling.y + 1 - light = minetest.get_node_light(seedling) - if not light or light < 13 then + local soils = minetest.find_nodes_in_area_under_air( + pos0, pos1, "group:soil") + if #soils > 0 then + local seedling = soils[math.random(#soils)] + local seedling_above = + {x = seedling.x, y = seedling.y + 1, z = seedling.z} + light = minetest.get_node_light(seedling_above) + if not light or light < 13 or + -- Desert sand is in the soil group + minetest.get_node(seedling).name == "default:desert_sand" then return end - minetest.set_node(seedling, {name = node.name}) + + minetest.set_node(seedling_above, {name = node.name}) end end minetest.register_abm({ label = "Flower spread", nodenames = {"group:flora"}, - neighbors = {"default:dirt_with_grass", "default:dirt_with_dry_grass", - "default:desert_sand"}, interval = 13, chance = 96, action = function(...) From 91182d6a9ec56c88096c1bad653a85426892c54d Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 22 Mar 2017 17:51:29 +0000 Subject: [PATCH 14/56] Flora spread: Do not replace flora with dry shrub, only 'return' If there is no group:soil node found below, do not replace flora with dry shrub, this was breaking flower pots and other mods. Originally, flora would only turn to dry shrub if in desert sand. --- mods/flowers/init.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index c71bc29c..f5955d8c 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -107,10 +107,9 @@ function flowers.flower_spread(pos, node) pos.y = pos.y - 1 local under = minetest.get_node(pos) pos.y = pos.y + 1 - if minetest.get_item_group(under.name, "soil") == 0 and - -- Do not replace sand dune grasses - under.name ~= "default:sand" then - minetest.set_node(pos, {name = "default:dry_shrub"}) + if minetest.get_item_group(under.name, "soil") == 0 then + -- Do not replace with dry shrub here as + -- this breaks flower pots and other mods. return end From 9b45e7b3e92b12791c6d6bc88c28d42fc9bd0858 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 21 Mar 2017 22:34:42 -0700 Subject: [PATCH 15/56] PB&J Pup. Replace possibly trademarked artwork with royalty free and OK for commercial use artwork. The Pup appears by default but does not alias the Nyan Cat nodes away. For that you will have to enable the setting. A settingtypes.txt is provided to make that really easy. This allows people to get an out-of-tree mod and not have their Nyan nodes disappear. The mod can also be disabled entirely this way for those who don't want it. There's some eatser eggs in here as well. Instead of making the nodes burnable, they are edible, and make you bark and howl. And perhaps something else too. --- mods/nyancat/README.txt | 16 --- mods/nyancat/init.lua | 89 ------------ mods/nyancat/license.txt | 50 ------- mods/nyancat/textures/nyancat_back.png | Bin 186 -> 0 bytes mods/nyancat/textures/nyancat_front.png | Bin 204 -> 0 bytes mods/nyancat/textures/nyancat_rainbow.png | Bin 137 -> 0 bytes mods/nyancat/textures/nyancat_side.png | Bin 148 -> 0 bytes mods/{nyancat => pbj_pup}/depends.txt | 0 mods/pbj_pup/init.lua | 136 ++++++++++++++++++ mods/pbj_pup/license.md | 26 ++++ mods/pbj_pup/sounds/pbj_pup_barks.ogg | Bin 0 -> 17192 bytes mods/pbj_pup/sounds/pbj_pup_howl.ogg | Bin 0 -> 15155 bytes mods/pbj_pup/textures/pbj_pup_back.png | Bin 0 -> 301 bytes mods/pbj_pup/textures/pbj_pup_candies.png | Bin 0 -> 326 bytes .../textures/pbj_pup_candies_animated.png | Bin 0 -> 1584 bytes mods/pbj_pup/textures/pbj_pup_front.png | Bin 0 -> 347 bytes mods/pbj_pup/textures/pbj_pup_jelly.png | Bin 0 -> 248 bytes mods/pbj_pup/textures/pbj_pup_sides.png | Bin 0 -> 250 bytes settingtypes.txt | 10 ++ 19 files changed, 172 insertions(+), 155 deletions(-) delete mode 100644 mods/nyancat/README.txt delete mode 100644 mods/nyancat/init.lua delete mode 100644 mods/nyancat/license.txt delete mode 100644 mods/nyancat/textures/nyancat_back.png delete mode 100644 mods/nyancat/textures/nyancat_front.png delete mode 100644 mods/nyancat/textures/nyancat_rainbow.png delete mode 100644 mods/nyancat/textures/nyancat_side.png rename mods/{nyancat => pbj_pup}/depends.txt (100%) create mode 100644 mods/pbj_pup/init.lua create mode 100644 mods/pbj_pup/license.md create mode 100644 mods/pbj_pup/sounds/pbj_pup_barks.ogg create mode 100644 mods/pbj_pup/sounds/pbj_pup_howl.ogg create mode 100644 mods/pbj_pup/textures/pbj_pup_back.png create mode 100644 mods/pbj_pup/textures/pbj_pup_candies.png create mode 100644 mods/pbj_pup/textures/pbj_pup_candies_animated.png create mode 100644 mods/pbj_pup/textures/pbj_pup_front.png create mode 100644 mods/pbj_pup/textures/pbj_pup_jelly.png create mode 100644 mods/pbj_pup/textures/pbj_pup_sides.png diff --git a/mods/nyancat/README.txt b/mods/nyancat/README.txt deleted file mode 100644 index fadc1d23..00000000 --- a/mods/nyancat/README.txt +++ /dev/null @@ -1,16 +0,0 @@ -Minetest Game mod: nyancat -========================== -See license.txt for license information. - -Authors of source code ----------------------- -Originally by celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) - -Authors of media files ----------------------- -VanessaE (CC BY-SA 3.0): - nyancat_front.png - nyancat_back.png - nyancat_side.png - nyancat_rainbow.png diff --git a/mods/nyancat/init.lua b/mods/nyancat/init.lua deleted file mode 100644 index 7192beb8..00000000 --- a/mods/nyancat/init.lua +++ /dev/null @@ -1,89 +0,0 @@ -minetest.register_node("nyancat:nyancat", { - description = "Nyan Cat", - tiles = {"nyancat_side.png", "nyancat_side.png", "nyancat_side.png", - "nyancat_side.png", "nyancat_back.png", "nyancat_front.png"}, - paramtype = "light", - light_source = default.LIGHT_MAX, - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - legacy_facedir_simple = true, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("nyancat:nyancat_rainbow", { - description = "Nyan Cat Rainbow", - tiles = { - "nyancat_rainbow.png^[transformR90", - "nyancat_rainbow.png^[transformR90", - "nyancat_rainbow.png" - }, - paramtype = "light", - light_source = default.LIGHT_MAX, - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - sounds = default.node_sound_defaults(), -}) - -minetest.register_craft({ - type = "fuel", - recipe = "nyancat:nyancat", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "nyancat:nyancat_rainbow", - burntime = 1, -}) - -nyancat = {} - -function nyancat.place(pos, facedir, length) - if facedir > 3 then - facedir = 0 - end - local tailvec = minetest.facedir_to_dir(facedir) - local p = {x = pos.x, y = pos.y, z = pos.z} - minetest.set_node(p, {name = "nyancat:nyancat", param2 = facedir}) - for i = 1, length do - p.x = p.x + tailvec.x - p.z = p.z + tailvec.z - minetest.set_node(p, {name = "nyancat:nyancat_rainbow", param2 = facedir}) - end -end - -function nyancat.generate(minp, maxp, seed) - local height_min = -31000 - local height_max = -32 - if maxp.y < height_min or minp.y > height_max then - return - end - local y_min = math.max(minp.y, height_min) - local y_max = math.min(maxp.y, height_max) - local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) - local pr = PseudoRandom(seed + 9324342) - local max_num_nyancats = math.floor(volume / (16 * 16 * 16)) - for i = 1, max_num_nyancats do - if pr:next(0, 1000) == 0 then - local x0 = pr:next(minp.x, maxp.x) - local y0 = pr:next(minp.y, maxp.y) - local z0 = pr:next(minp.z, maxp.z) - local p0 = {x = x0, y = y0, z = z0} - nyancat.place(p0, pr:next(0, 3), pr:next(3, 15)) - end - end -end - -minetest.register_on_generated(function(minp, maxp, seed) - nyancat.generate(minp, maxp, seed) -end) - --- Legacy -minetest.register_alias("default:nyancat", "nyancat:nyancat") -minetest.register_alias("default:nyancat_rainbow", "nyancat:nyancat_rainbow") -minetest.register_alias("nyancat", "nyancat:nyancat") -minetest.register_alias("nyancat_rainbow", "nyancat:nyancat_rainbow") -default.make_nyancat = nyancat.place -default.generate_nyancats = nyancat.generate diff --git a/mods/nyancat/license.txt b/mods/nyancat/license.txt deleted file mode 100644 index 3aa38617..00000000 --- a/mods/nyancat/license.txt +++ /dev/null @@ -1,50 +0,0 @@ -License of source code ----------------------- - -GNU Lesser General Public License, version 2.1 -Copyright (C) 2011-2016 celeron55, Perttu Ahola -Copyright (C) 2012-2016 Various Minetest developers and contributors - -This program is free software; you can redistribute it and/or modify it under the terms -of the GNU Lesser General Public License as published by the Free Software Foundation; -either version 2.1 of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU Lesser General Public License for more details: -https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html - - -Licenses of media (textures) ----------------------------- - -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Copyright (C) 2012-2016 VanessaE - -You are free to: -Share — copy and redistribute the material in any medium or format. -Adapt — remix, transform, and build upon the material for any purpose, even commercially. -The licensor cannot revoke these freedoms as long as you follow the license terms. - -Under the following terms: - -Attribution — You must give appropriate credit, provide a link to the license, and -indicate if changes were made. You may do so in any reasonable manner, but not in any way -that suggests the licensor endorses you or your use. - -ShareAlike — If you remix, transform, or build upon the material, you must distribute -your contributions under the same license as the original. - -No additional restrictions — You may not apply legal terms or technological measures that -legally restrict others from doing anything the license permits. - -Notices: - -You do not have to comply with the license for elements of the material in the public -domain or where your use is permitted by an applicable exception or limitation. -No warranties are given. The license may not give you all of the permissions necessary -for your intended use. For example, other rights such as publicity, privacy, or moral -rights may limit how you use the material. - -For more details: -http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/nyancat/textures/nyancat_back.png b/mods/nyancat/textures/nyancat_back.png deleted file mode 100644 index e479ace8306c8f856da9f8f99f40924ef67a8a9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!T!2rAD;F1+5nr6MvvWg3Lx+3E zp`=4cQ;z=kUGl%-|Ns3B=jZR508|<7>EaktaVzzFAm0H64(1DfB?tcM+XzO+UgH;z z>k5pq5MEs0#8ACi;Thu+l@*S+M07WBZqjNI6K(2SlfhWd@s@@6;91dS3@_4TZ#<}U iv^i(q@!?PHf5y{VEFYHcy`liLg2B_(&t;ucLK6T4Jwjao diff --git a/mods/nyancat/textures/nyancat_front.png b/mods/nyancat/textures/nyancat_front.png deleted file mode 100644 index c9dd6a330ed87cfb410787d9038410c2f1576c54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!dVo)eD;F1+5no(lVq#KKQc+P+ zLqo%XhQhRz>~c$0z6YH;*7ce-_ratU0m>^y61`@b-pM#*%d#WU@qGUWA-Ct5>ZuVeVv2^x zMWp!x>~A|X>xczPUU|_J>#|_3p46r7_3!te3ujK5#;SY*XcvR0tDnm{r-UW||3Xcd diff --git a/mods/nyancat/textures/nyancat_rainbow.png b/mods/nyancat/textures/nyancat_rainbow.png deleted file mode 100644 index 685a22ccf53ab659eafcab0dd95e7b031cbdb0af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VWHR6k#Aej4~f#JUc!~X_` z|N9yK|7U0b@fjEn)B{-#4j|z`fj9oKbJqfONqM?BhHykDCp0j*2`F+TaX3lplq6{w bD=;$jy=D@~d2jgysEWbU)z4*}Q$iB}HhU8XVY1U~xGeL-8NP|$YI8_pS% ul^jJEaBkt?c1erqlG2>{|7FXz@8 3 then + facedir = 0 + end + local tailvec = minetest.facedir_to_dir(facedir) + local p = {x = pos.x, y = pos.y, z = pos.z} + minetest.set_node(p, {name = "pbj_pup:pbj_pup", param2 = facedir}) + for i = 1, length do + p.x = p.x + tailvec.x + p.z = p.z + tailvec.z + minetest.set_node(p, {name = "pbj_pup:pbj_pup_candies", param2 = facedir}) + end + end + + local function generate(minp, maxp, seed) + local height_min = -31000 + local height_max = -32 + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) + local pr = PseudoRandom(seed + 9324342) + local max_num = math.floor(volume / (16 * 16 * 16)) + for i = 1, max_num do + if pr:next(0, 1000) == 0 then + local x0 = pr:next(minp.x, maxp.x) + local y0 = pr:next(minp.y, maxp.y) + local z0 = pr:next(minp.z, maxp.z) + local p0 = {x = x0, y = y0, z = z0} + place(p0, pr:next(0, 3), pr:next(3, 15)) + end + end + end + + minetest.register_on_generated(generate) +end +-- +-- compat +-- + +if minetest.setting_getbool("pbj_pup_alias_nyancat") then + minetest.register_alias("default:nyancat", "pbj_pup:pbj_pup") + minetest.register_alias("default:nyancat_rainbow","pbj_pup:pbj_pup_candies") + minetest.register_alias("nyancat", "pbj_pup:pbj_pup") + minetest.register_alias("nyancat_rainbow", "pbj_pup:pbj_pup_candies") + minetest.register_alias("nyancat:nyancat", "pbj_pup:pbj_pup") + minetest.register_alias("nyancat:nyancat_rainbow", "pbj_pup:pbj_pup_candies") +end diff --git a/mods/pbj_pup/license.md b/mods/pbj_pup/license.md new file mode 100644 index 00000000..b5fcf3a2 --- /dev/null +++ b/mods/pbj_pup/license.md @@ -0,0 +1,26 @@ + +## PB&J Pup + +PB&J Pup is a parody on the "Nyan Cat" TM toasted poptart meme. + + +## License and Copyright + +(C) 2017 Vanessa Ezekowitz, Auke Kok, celeron55 + + * All Code: LGPL-2.1+ + * All Images: CC-BY-4.0 + + +## Sounds + + * `pbj_pup_barks.ogg`: + Artist: Tomlija + License: CC-BY-3.0 + Url: http://freesound.org/people/Tomlija/sounds/97392/ + + * `pbj_pup_howl.ogg`: + Copyright 2013 Iwan Gabovitch (qubodup) + License: CC-BY-3.0 + Url: http://freesound.org/people/qubodup/sounds/193394/ + diff --git a/mods/pbj_pup/sounds/pbj_pup_barks.ogg b/mods/pbj_pup/sounds/pbj_pup_barks.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bdd3440e04f455924ef935392eb0209d8a72477e GIT binary patch literal 17192 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 literal 0 HcmV?d00001 diff --git a/mods/pbj_pup/sounds/pbj_pup_howl.ogg b/mods/pbj_pup/sounds/pbj_pup_howl.ogg new file mode 100644 index 0000000000000000000000000000000000000000..15e93bc21e86ce168a0e868a9a88a793131890b4 GIT binary patch literal 15155 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 H{+s>}v~8ou literal 0 HcmV?d00001 diff --git a/mods/pbj_pup/textures/pbj_pup_back.png b/mods/pbj_pup/textures/pbj_pup_back.png new file mode 100644 index 0000000000000000000000000000000000000000..f72fc24620627b2c2fe6f96dae66034b90984d2e GIT binary patch literal 301 zcmV+|0n+}7P)+J08@$vEX_4P$T4H*Cc0FFsSK~xyiU5`mp z!$1%O)3OaJ#%Tj;7`FcZH#r~lJqJBFSqv_rawD#hU!=%y5_^L>vvRtjhDrJEiobndgmm3lzOSI9@J+!bf_ zGvo$Gc`Q7_ErcpwsbW$^2+KlW;Lsg+B00000NkvXXu0mjf3QvLt literal 0 HcmV?d00001 diff --git a/mods/pbj_pup/textures/pbj_pup_candies.png b/mods/pbj_pup/textures/pbj_pup_candies.png new file mode 100644 index 0000000000000000000000000000000000000000..185fa2d8e3da756f2c0246a69e6f1ae8d47de392 GIT binary patch literal 326 zcmV-M0lEH(P)Mg{MudIRLHJtF_?Rx3{;wlD)~<^vU$>%Jj+0%gfQY z9MRVR*4Eb70CCp<*Vjk@;I-i5;^OJP)$Z=@^YqE|$=~$J^z_%s`}_O+*P#8-k^hze z|HJ^k^MO(T005FnL_t&-8C}5(a)Lk*MbXz7P!p8TI73?bT%-G6V+P7fsys(^eM+bL zpZq)Z$uHgJ;x1C3W^TT@#!1X+29|*=#wa$&VIiC1Bv#9C6Ap&} zQn~vmMK*>of004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003* zP)t-s08`fhe)<5{t^nxS0RR61|E>qu00;jg2mh`PT-g?4+AB`tD^u<(Vb?3y*(>F) zG5-KE*DEsR06j^GJ#?%+|NmCy*%=h=&%>36E{N(`uD{=oeasNsB|8D^Q za{&LA0RNU3|CVw8r@sHSkN?B~|HN_s(g6R{lmFLo|JkGe-M;_t0RQhJ|L<}C{Q&>} z0RR76|Nn9S|EvH1uK)l4@eJlP00001VoOIvYf@#Um;e9-UP(kjR9M5Mm+OC1MG%Hx zR}&**3q(B?6%+#A$SFY+I9{sY4MI<1y`)NOy#Q6%|NlEPyF0tHC%vR0zkcYMGrODj z*|`O_@qulxyMIda;tO4{VZB`xWH9FKH(oi_1?=R%f}PBHW6(t(y=p>Eyu|oDs-D_$ zXLcVy4hCa+-ka@I7+kn8$c`N=54$P+$>okwO9+VnFd_O&K$sBlkp@EV z2fs~}xUDI&=-B=LA7~tV+mEITUFCs>rrN|O7!n_6Xs_3|Rzfs*kJ{etw6Z0oX|<0$ zHUeP-SrQN?bgKJW0&@D7SMe6UNIdjiH|p&{pQn+ zQX9Vh*51{ZJ-V^6;__b%YKKElQ9zs_0^!i^a!Lu1;myxMS@o3w8Bgu|98-N+&$T2w zg=jJJH1VF6b_k*;= zt@ipCi80NG#btb0zVLBCyhoj-OpKsjehR%0Z8aSm8ZWF6iXJ+KoS`%?y-tKuXonsc z<^eXG_i9D?u2(1CqFiy!uge0+q|koXBeMhMRWq?S!9nM2UPkqk12K;|FO z51D^NKV<%q`$tmm@Bg`LkRE#u@B4|51HwG4N|`$H2tY>H5uV3>4k3>Q4pv(R9B14- zgg60&c?dH9$UKBN|9Gbo(%t)u-ToY)?cL3z4aaWkfFQ*W17RNNeUIx=@F1}~hfsXM zt9LkD|A$xaqQlKYPLUeHdM@uCO&qHYIV`v^)^r93YSWQUD_kEewQ`{6I*{ml%R=SWXP+&kET^Uisk~q~CM9 zUwv@34a#>Zl;**zDYz&~?Qs1cDmq-fR-5{Mh6bNSTESr+F@|6>LTXd7z%~fY1G=r$ zn}@Uaa4zaM=Ch}dZzIk-+yPgs9_{hT9gl;S_z22>;UaaGrrOZ&k@3mo^NJ;cUmJu_ z@(30kFpdyJn)H8M`#$Io{U6oEpr1S7&g@t8WZoh5K7z8J^VI|m9Jb++^Qbd%j*ph_ i;wSg0PxccqeVzeo(|LLwNtf3E0000ZDBrbX#k6EOBZi%Z*os1djO<>004l1 zfPnz3jA0&)jg5|4ppO8)k9S*^XdszUu%Dlwqj4jus;aw!DZISAy}iA{d)mar#K*_S z=;-M2@$vQb_5T0>|NsA>HdNvO005gwL_t&-8CAj2Qo=wGMA2(7%&I_3jBXHY)WBr_ z{|lwcC(fbQogPh@`C02v&J4RrD35IFYprhtLkbN9{~Wvv5hiR0b|8dJ*V!FmBSZwP z*{uO71VqE8mBK}6=E?SU>l;!iIoJl<2T~|MuutQ7vRPk+&M*cyF~YYHWd-c_z^WjG t3(pVB^7ukALKFOEE=%SYOrqDF{tuUO59RfDvEBdx002ovPDHLkV1lYljQ;=t literal 0 HcmV?d00001 diff --git a/mods/pbj_pup/textures/pbj_pup_jelly.png b/mods/pbj_pup/textures/pbj_pup_jelly.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0c1ebf1b3ed11e4273fdc53780271da8d2c26e GIT binary patch literal 248 zcmVC3^s*j{v@pcUzM&w3$(`o-D+pG0DEZzQTIh!h71%($dt_)Z*ge=;-L{>+9_7 z?D6sO_4V}>MwD>?004AJL_t&-(_N3t5&}U812OchuHrlY|E(UFT}yM|5Yj1#(2pWC zY#*U)`!E!;3liE>$OS9FO5LrH0XQX)b)JcY9#+WC2G|W)AxWsmM4F*IOIKiNrxU$j yAm0i-y(942E`|Cc_Vq&9HA{y#-RzC4*onk9S+2bTOi$qNI2-r-MtgkXW>lS-!r$!KHZA)YRhQ;^X7v=H}+;=;-U~ z>+J08_4W1MumnN?004GLL_t&-(^Zd&4#F@DLqm^cGqAzt|NmBUs8q9h<;kfWk#dtr zX(SgObUj*;LgE8eyaG9}%2f^S0j%i0?7%ZY)nS4G{40}#?1-}KHykzDaBx+fU6CVR z`SE7p#PHj7&0sx}F{6(li0I7;e80)& Date: Thu, 23 Mar 2017 01:19:33 +0000 Subject: [PATCH 16/56] Flora spread: Re-enable dry shrub replacing flora in desert sand Flora is converted to dry shrub in desert sand and silver sand. No conversion in sand to preserve sand dune grasses. Dry shrubs do not spread so this conversion, used by players, is the only way to generate them. --- mods/flowers/init.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index f5955d8c..db7a4eb3 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -107,9 +107,16 @@ function flowers.flower_spread(pos, node) pos.y = pos.y - 1 local under = minetest.get_node(pos) pos.y = pos.y + 1 + -- Replace flora with dry shrub in desert sand and silver sand, + -- as this is the only way to generate them. + -- However, preserve grasses in sand dune biomes. + if minetest.get_item_group(under.name, "sand") == 1 and + under.name ~= "default:sand" then + minetest.set_node(pos, {name = "default:dry_shrub"}) + return + end + if minetest.get_item_group(under.name, "soil") == 0 then - -- Do not replace with dry shrub here as - -- this breaks flower pots and other mods. return end From 7c42c41170996cf477620cbbec97c2a46a397199 Mon Sep 17 00:00:00 2001 From: upsilon Date: Sat, 25 Mar 2017 17:18:17 +0100 Subject: [PATCH 17/56] doors: record protection violation if it cannot be dug --- mods/doors/init.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 2b3d094a..974e9d3d 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -203,7 +203,12 @@ end local function can_dig_door(pos, digger) replace_old_owner_information(pos) - return default.can_interact_with_node(digger, pos) + if default.can_interact_with_node(digger, pos) then + return true + else + minetest.record_protection_violation(pos, digger:get_player_name()) + return false + end end function doors.register(name, def) From b847888cb7b79787f424dec2c2ee1728cc2c0872 Mon Sep 17 00:00:00 2001 From: cx384 Date: Tue, 28 Mar 2017 19:18:59 +0200 Subject: [PATCH 18/56] doors: add groups to the door craftitem --- mods/doors/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 974e9d3d..4ab40111 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -254,6 +254,7 @@ function doors.register(name, def) minetest.register_craftitem(":" .. name, { description = def.description, inventory_image = def.inventory_image, + groups = def.groups, on_place = function(itemstack, placer, pointed_thing) local pos From 077316b4cd7558eda03e6d3df631ee3aa27bff11 Mon Sep 17 00:00:00 2001 From: zaoqi Date: Wed, 29 Mar 2017 21:02:26 +0200 Subject: [PATCH 19/56] Use creative.is_enabled_for for creative mode if possible (#1558) --- mods/beds/api.lua | 3 ++- mods/boats/init.lua | 6 ++++-- mods/bones/init.lua | 3 ++- mods/carts/cart_entity.lua | 6 ++++-- mods/creative/init.lua | 2 +- mods/default/player.lua | 3 ++- mods/default/trees.lua | 3 ++- mods/doors/init.lua | 4 ++-- mods/farming/api.lua | 6 ++++-- mods/fire/init.lua | 5 +++-- mods/flowers/init.lua | 3 ++- mods/screwdriver/init.lua | 3 ++- mods/stairs/init.lua | 6 ++++-- 13 files changed, 34 insertions(+), 19 deletions(-) diff --git a/mods/beds/api.lua b/mods/beds/api.lua index daa6d8e2..97dde43d 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -89,7 +89,8 @@ function beds.register_bed(name, def) minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end return itemstack diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 6e1565d4..4d8f4673 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -110,7 +110,8 @@ function boat.on_punch(self, puncher) if not self.driver then self.removed = true local inv = puncher:get_inventory() - if not minetest.setting_getbool("creative_mode") + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) or not inv:contains_item("main", "boats:boat") then local leftover = inv:add_item("main", "boats:boat") -- if no room in inventory add a replacement boat to the world @@ -244,7 +245,8 @@ minetest.register_craftitem("boats:boat", { boat = minetest.add_entity(pointed_thing.under, "boats:boat") if boat then boat:setyaw(placer:get_look_horizontal()) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end end diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 9542cab0..56f5fd04 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -167,7 +167,8 @@ minetest.register_on_dieplayer(function(player) end -- return if keep inventory set or in creative mode - if bones_mode == "keep" or minetest.setting_getbool("creative_mode") then + if bones_mode == "keep" or (creative and creative.is_enabled_for + and creative.is_enabled_for(player:get_player_name())) then return end diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index bf0a450d..4d44c873 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -92,7 +92,8 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, end -- Pick up cart local inv = puncher:get_inventory() - if not minetest.setting_getbool("creative_mode") + if not (creative and creative.is_enabled_for ++ and creative.is_enabled_for(puncher:get_player_name())) or not inv:contains_item("main", "carts:cart") then local leftover = inv:add_item("main", "carts:cart") -- If no room in inventory add a replacement cart to the world @@ -385,7 +386,8 @@ minetest.register_craftitem("carts:cart", { minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, {pos = pointed_thing.above}) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end return itemstack diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 7471e603..f9047189 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -8,7 +8,7 @@ end dofile(minetest.get_modpath("creative") .. "/inventory.lua") -if minetest.setting_getbool("creative_mode") then +if creative_mode_cache then -- Dig time is modified according to difference (leveldiff) between tool -- 'maxlevel' and node 'level'. Digtime is divided by the larger of -- leveldiff and 1. diff --git a/mods/default/player.lua b/mods/default/player.lua index fd7341f4..cd89a24c 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -96,7 +96,8 @@ minetest.register_on_joinplayer(function(player) player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) -- set GUI - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player:get_player_name())) then player:set_inventory_formspec(default.gui_survival_form) end player:hud_set_hotbar_image("gui_hotbar.png") diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 3e1bf102..0b829a75 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -471,7 +471,8 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, minetest.log("action", player_name .. " places node " .. sapling_name .. " at " .. minetest.pos_to_string(pos)) - local take_item = not minetest.setting_getbool("creative_mode") + local take_item = not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) local newnode = {name = sapling_name} local ndef = minetest.registered_nodes[sapling_name] minetest.set_node(pos, newnode) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 4ab40111..8ca26dac 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -328,7 +328,7 @@ function doors.register(name, def) meta:set_string("infotext", "Owned by " .. pn) end - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) then itemstack:take_item() end @@ -576,7 +576,7 @@ function doors.register_trapdoor(name, def) meta:set_string("owner", pn) meta:set_string("infotext", "Owned by "..pn) - return minetest.setting_getbool("creative_mode") + return (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) end def.on_blast = function() end diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 0ba756cc..35a77e9f 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -57,7 +57,8 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) gain = 0.5, }) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(user:get_player_name())) then -- wear tool local wdef = itemstack:get_definition() itemstack:add_wear(65535/(uses-1)) @@ -187,7 +188,8 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname) -- add the node and remove 1 item from the itemstack minetest.add_node(pt.above, {name = plantname, param2 = 1}) tick(pt.above) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end return itemstack diff --git a/mods/fire/init.lua b/mods/fire/init.lua index a846b289..a9ceb9ea 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -85,13 +85,13 @@ minetest.register_tool("fire:flint_and_steel", { "fire_flint_and_steel", {pos = sound_pos, gain = 0.5, max_hear_distance = 8} ) + local player_name = user:get_player_name() if pointed_thing.type == "node" then local node_under = minetest.get_node(pointed_thing.under).name local nodedef = minetest.registered_nodes[node_under] if not nodedef then return end - local player_name = user:get_player_name() if minetest.is_protected(pointed_thing.under, player_name) then minetest.chat_send_player(player_name, "This area is protected") return @@ -103,7 +103,8 @@ minetest.register_tool("fire:flint_and_steel", { minetest.set_node(pointed_thing.above, {name = "fire:basic_flame"}) end end - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then -- Wear tool local wdef = itemstack:get_definition() itemstack:add_wear(1000) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index db7a4eb3..cb5b2193 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -289,7 +289,8 @@ minetest.register_node("flowers:waterlily", { if not minetest.is_protected(pos, player_name) then minetest.set_node(pos, {name = "flowers:waterlily", param2 = math.random(0, 3)}) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then itemstack:take_item() end else diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 49544de3..2a53ae37 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -128,7 +128,8 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) minetest.check_for_falling(pos) end - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(user:get_player_name())) then itemstack:add_wear(65535 / ((uses or 200) - 1)) end diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 86dadf97..1379c8c0 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -150,6 +150,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, on_place = function(itemstack, placer, pointed_thing) local under = minetest.get_node(pointed_thing.under) local wield_item = itemstack:get_name() + local creative_enabled = (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) if under and wield_item == under.name then -- place slab using under node orientation @@ -171,7 +173,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, return end minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2}) - if not minetest.setting_getbool("creative_mode") then + if not creative_enabled then itemstack:take_item() end return itemstack @@ -187,7 +189,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, -- else attempt to place node with proper param2 minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2) - if not minetest.setting_getbool("creative_mode") then + if not creative_enabled then itemstack:take_item() end return itemstack From 2f46103ff8fc6f0e9bf2cf6dc507ccc5f4fb6ea8 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 29 Mar 2017 04:59:19 +0100 Subject: [PATCH 20/56] Glasslike_framed nodes: Add 'glasslikeliquidlevel' paramtype2 --- mods/default/nodes.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c70f614b..db679830 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2078,6 +2078,7 @@ minetest.register_node("default:glass", { drawtype = "glasslike_framed_optional", tiles = {"default_glass.png", "default_glass_detail.png"}, paramtype = "light", + paramtype2 = "glasslikeliquidlevel", sunlight_propagates = true, is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, @@ -2089,6 +2090,7 @@ minetest.register_node("default:obsidian_glass", { drawtype = "glasslike_framed_optional", tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, paramtype = "light", + paramtype2 = "glasslikeliquidlevel", is_ground_content = false, sunlight_propagates = true, sounds = default.node_sound_glass_defaults(), From 5fe831ed139d882b2838cbd75caa1f5a4d9674ad Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 30 Mar 2017 03:24:43 +0100 Subject: [PATCH 21/56] Carts: Remove '+' added in commit 077316b --- mods/carts/cart_entity.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 4d44c873..a19da648 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -93,7 +93,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, -- Pick up cart local inv = puncher:get_inventory() if not (creative and creative.is_enabled_for -+ and creative.is_enabled_for(puncher:get_player_name())) + and creative.is_enabled_for(puncher:get_player_name())) or not inv:contains_item("main", "carts:cart") then local leftover = inv:add_item("main", "carts:cart") -- If no room in inventory add a replacement cart to the world From b377aaa50d2f8ae1926c2319f17380f8e754f499 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 2 Apr 2017 10:01:01 +0200 Subject: [PATCH 22/56] doors: Fix craftitem not listed in inventory (#1683) Fixes bug caused by b847888 --- mods/doors/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 8ca26dac..39584446 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -254,7 +254,7 @@ function doors.register(name, def) minetest.register_craftitem(":" .. name, { description = def.description, inventory_image = def.inventory_image, - groups = def.groups, + groups = table.copy(def.groups), on_place = function(itemstack, placer, pointed_thing) local pos From acfd58cdebf4b5b99dcf5c32d50b65cab208a781 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 28 Mar 2017 05:37:45 +0100 Subject: [PATCH 23/56] Carts: Make rail recipes more generous As part of making vertical travel easier to reduce reliance on sneak ladders. Calculate using cubic pixels of steel. A steelblock is 16^3 = 4096 cubic pixels steel. 6 ingots is 6/9 steelblocks. A rail is a 2*2*16 pixel length of steel, 64 cubic pixels steel. 6 ingots produces 2*21 rails = 21 rail nodes. Choose 18 for an even number that is a multiple of ingot number. Replace the stick with 2 wood in the recipe to be closer to the amount of wood that would be needed for 20*4 sleepers. Replace 2 mese crystal fragments with 1 mese crystal to compensate for the larger number of nodes returned. The result is the recipe is much more generous with steel usage but slightly less generous with mese usage, keeping power rail cost reasonably high. Replace 2 coal lumps with 1 for a similar recipe to power rails. --- mods/carts/rails.lua | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mods/carts/rails.lua b/mods/carts/rails.lua index 5da4ac4d..066779d1 100644 --- a/mods/carts/rails.lua +++ b/mods/carts/rails.lua @@ -10,11 +10,11 @@ carts:register_rail("carts:rail", { }, {}) minetest.register_craft({ - output = "carts:rail 16", + output = "carts:rail 18", recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, {"default:steel_ingot", "", "default:steel_ingot"}, - {"default:steel_ingot", "group:stick", "default:steel_ingot"}, - {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, } }) @@ -31,11 +31,11 @@ carts:register_rail("carts:powerrail", { }, {acceleration = 5}) minetest.register_craft({ - output = "carts:powerrail 8", + output = "carts:powerrail 18", recipe = { - {"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"}, - {"default:steel_ingot", "group:stick", "default:steel_ingot"}, - {"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese_crystal", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, } }) @@ -50,10 +50,10 @@ carts:register_rail("carts:brakerail", { }, {acceleration = -3}) minetest.register_craft({ - output = "carts:brakerail 8", + output = "carts:brakerail 18", recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, - {"default:steel_ingot", "group:stick", "default:steel_ingot"}, - {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, } }) From 9e4f0d368969d2b80ac93cf64bc9fe4a5fad614f Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 30 Mar 2017 05:06:49 +0100 Subject: [PATCH 24/56] Leafdecay: Do not restart aready running timers --- mods/default/functions.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 8e9132d0..2268263e 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -330,8 +330,9 @@ local function leafdecay_after_destruct(pos, oldnode, def) for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), vector.add(pos, def.radius), def.leaves)) do local node = minetest.get_node(v) - if node.param2 == 0 then - minetest.get_node_timer(v):start(math.random(20, 120) / 10) + local timer = minetest.get_node_timer(v) + if node.param2 == 0 and not timer:is_started() then + timer:start(math.random(20, 120) / 10) end end end From fe021281e62504674f57a196e6dfba83bdd52847 Mon Sep 17 00:00:00 2001 From: LNJ Date: Sat, 8 Apr 2017 11:22:26 +0200 Subject: [PATCH 25/56] Textures: Replace aspen leaves texture with BlockMen's --- mods/default/README.txt | 2 +- mods/default/textures/default_aspen_leaves.png | Bin 761 -> 873 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index bec8821a..4e41479a 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -126,6 +126,7 @@ brunob.santos (CC BY-SA 4.0): default_desert_cobble.png BlockMen (CC BY-SA 3.0): + default_aspen_leaves.png default_wood.png default_clay_brick.png default_iron_ingot.png @@ -152,7 +153,6 @@ Wuzzy (CC BY-SA 3.0): sofar (CC BY-SA 3.0): default_book_written.png, based on default_book.png default_aspen_sapling - default_aspen_leaves default_aspen_tree default_aspen_tree_top, derived from default_pine_tree_top (by paramat) default_aspen_wood, derived from default_pine_wood (by paramat) diff --git a/mods/default/textures/default_aspen_leaves.png b/mods/default/textures/default_aspen_leaves.png index 17a708d1783819a4acdd09e730a2c1a9698dd686..73064237c4cce5b5dc8fa13283ef23ddd09350eb 100644 GIT binary patch delta 851 zcmV-Z1FZb{1?dKmBYyx1a7bBm000XU000XU0RWnu7ytkO1ZP1_K>z@;j(q!3lK=n! zAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ;-$_J4RCwBi zlTC=@7|l-B)wCcnKYBXPHLrg1}TV}0o}|_To^hi+J8lVC=P-mAzc+q>qbxn zkur)FaiQ2v-Lw?Ckcx^Mk%2B0TA@~F+GH|Gnq-=}levGn$3sII6!xC6lD_wK1|GQ$1N3d;?L zwRN9y%OJZa!gA9k9??+8&KAXUa(wl{j|$-A`G5WL#oNpO06O#Hgv>sk!*6QJkpf{zalHKgb?9R@-GslZH zOI6V4>U?p|;dvebsJ(qyjavlqxpd~b0GwQTPNUf2%Gw|Yn15NE)S_P?Ni)7)zasz+ zKrS9z^&PS-Vt(ZX1^9itLA$-h!_eH)>U1$)ftTJqq5#9~#}_8F0Jz2sw;w`IqfXMZT=snu!ibYWxdx*&op8CNg- z`nN*@P+OYRzRii_ggxO1#t*r8`kKtVaaaqYY(DheKfN$)yz&=Wd7ks+_&Dc2xGHn+ zO=*3n#oq7{V%x%IDGK!Bgwb+9mg&Gq02^y}WV9UMI1by*HUO7Cz9C^?XmlRXY;}lw zeMX87<$oZc*^clEip;M}skKEepZQ^6;ngX<@ZpVr5&HaV2lU|n$B2^-d7jhjXQbBR zG+JGfq&^(Hx3$fS3ln-`VM2FnCl)5u_$AJN^rMu6J%|YVDi!uu4-810Sv;h1zmK(+ zlJAqL;yDhUF^oUDk3Z^lqJGMEpWl_arD<))4_k2DfX($=;s6A`N1iD^UA`}4qXy%; z^kR$e30w6#U!1)uB{QHarb~vQXrQ+Aj8a=Zs=HF|I&yaTh`#*RQ+jOvpz=TX6W_x~ U5082tu>b%707*qoM6N<$g5be= Date: Fri, 7 Apr 2017 22:03:11 -0600 Subject: [PATCH 26/56] Screwdriver: Allow non-native rotations if supported by targeted node This also allows custom actions (such as using the screwdriver as a wrench). --- mods/screwdriver/init.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 2a53ae37..e76f0545 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -98,12 +98,17 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) end -- can we rotate this paramtype2? local fn = screwdriver.rotate[ndef.paramtype2] - if not fn then + if not fn and not ndef.on_rotate then return itemstack end local should_rotate = true - local new_param2 = fn(pos, node, mode) + local new_param2 + if fn then + new_param2 = fn(pos, node, mode) + else + new_param2 = node.param2 + end -- Node provides a handler, so let the handler decide instead if the node can be rotated if ndef.on_rotate then @@ -122,7 +127,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) return itemstack end - if should_rotate then + if should_rotate and new_param2 ~= node.param2 then node.param2 = new_param2 minetest.swap_node(pos, node) minetest.check_for_falling(pos) From e6d0d775e3533b7b91b292e13c800b9737e057fd Mon Sep 17 00:00:00 2001 From: MarkuBu Date: Tue, 11 Apr 2017 08:51:13 +0200 Subject: [PATCH 27/56] Stairs: Improve stair and slab rotation on placement Slabs are placed horizontal instead of vertical, even if they are placed on a wall. Slabs are rotated automatically if they are placed to another slab, no matter which material. Slabs are placed at the lower position if the placer points into the lower half of the pointed node and to the upper position if pointed to the upper half. Stairs are placed normal if the placer points to the lower half of the pointed node and rotated upside down if pointed to the upper half. --- mods/stairs/init.lua | 68 +++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 1379c8c0..835b2193 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -17,6 +17,30 @@ minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") local replace = minetest.setting_getbool("enable_stairs_replace_abm") +local function rotate_and_place(itemstack, placer, pointed_thing) + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) + end + + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + local fpos = finepos.y % 1 + + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) +end -- Register stairs. -- Node will be called stairs:stair_ @@ -52,30 +76,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, return itemstack end - local p0 = pointed_thing.under - local p1 = pointed_thing.above - local param2 = 0 - - local placer_pos = placer:getpos() - if placer_pos then - local dir = { - x = p1.x - placer_pos.x, - y = p1.y - placer_pos.y, - z = p1.z - placer_pos.z - } - param2 = minetest.dir_to_facedir(dir) - end - - if p0.y - 1 == p1.y then - param2 = param2 + 20 - if param2 == 21 then - param2 = 23 - elseif param2 == 23 then - param2 = 21 - end - end - - return minetest.item_place(itemstack, placer, pointed_thing, param2) + return rotate_and_place(itemstack, placer, pointed_thing) end, }) @@ -126,8 +127,6 @@ end -- Slab facedir to placement 6d matching table local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} --- Slab facedir when placing initial slab against other surface -local slab_trans_dir_place = {[0] = 0, 20, 12, 16, 4, 8} -- Register slabs. -- Node will be called stairs:slab_ @@ -153,7 +152,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local creative_enabled = (creative and creative.is_enabled_for and creative.is_enabled_for(placer:get_player_name())) - if under and wield_item == under.name then + if under and under.name:find("stairs:slab_") then -- place slab using under node orientation local dir = minetest.dir_to_facedir(vector.subtract( pointed_thing.above, pointed_thing.under), true) @@ -161,7 +160,9 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local p2 = under.param2 -- combine two slabs if possible - if slab_trans_dir[math.floor(p2 / 4)] == dir then + if slab_trans_dir[math.floor(p2 / 4)] == dir + and wield_item == under.name then + if not recipeitem then return itemstack end @@ -194,16 +195,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, end return itemstack else - -- place slab using look direction of player - local dir = minetest.dir_to_wallmounted(vector.subtract( - pointed_thing.above, pointed_thing.under), true) - - local rot = slab_trans_dir_place[dir] - if rot == 0 or rot == 20 then - rot = rot + minetest.dir_to_facedir(placer:get_look_dir()) - end - - return minetest.item_place(itemstack, placer, pointed_thing, rot) + return rotate_and_place(itemstack, placer, pointed_thing) end end, }) From e2b3ab768a35012e8ad910d5f0f9640156c4a47e Mon Sep 17 00:00:00 2001 From: Ekdohibs Date: Tue, 11 Apr 2017 16:28:26 +0200 Subject: [PATCH 28/56] Fix .luacheckrc (missing Settings class) --- .luacheckrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.luacheckrc b/.luacheckrc index fe87fdce..3c7ec693 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -8,6 +8,7 @@ read_globals = { "vector", "VoxelManip", "VoxelArea", "PseudoRandom", "ItemStack", + "Settings", "unpack", -- Silence "accessing undefined field copy of global table". table = { fields = { "copy" } } From d68d2c08ef1bef29b2d38520a26576cb301afe08 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 11 Apr 2017 02:45:34 +0100 Subject: [PATCH 29/56] PB&J Pup: Remove mod Also delete nyancat API documentation from game_api.txt. --- game_api.txt | 12 -- mods/pbj_pup/depends.txt | 1 - mods/pbj_pup/init.lua | 136 ------------------ mods/pbj_pup/license.md | 26 ---- mods/pbj_pup/sounds/pbj_pup_barks.ogg | Bin 17192 -> 0 bytes mods/pbj_pup/sounds/pbj_pup_howl.ogg | Bin 15155 -> 0 bytes mods/pbj_pup/textures/pbj_pup_back.png | Bin 301 -> 0 bytes mods/pbj_pup/textures/pbj_pup_candies.png | Bin 326 -> 0 bytes .../textures/pbj_pup_candies_animated.png | Bin 1584 -> 0 bytes mods/pbj_pup/textures/pbj_pup_front.png | Bin 347 -> 0 bytes mods/pbj_pup/textures/pbj_pup_jelly.png | Bin 248 -> 0 bytes mods/pbj_pup/textures/pbj_pup_sides.png | Bin 250 -> 0 bytes settingtypes.txt | 10 -- 13 files changed, 185 deletions(-) delete mode 100644 mods/pbj_pup/depends.txt delete mode 100644 mods/pbj_pup/init.lua delete mode 100644 mods/pbj_pup/license.md delete mode 100644 mods/pbj_pup/sounds/pbj_pup_barks.ogg delete mode 100644 mods/pbj_pup/sounds/pbj_pup_howl.ogg delete mode 100644 mods/pbj_pup/textures/pbj_pup_back.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_candies.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_candies_animated.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_front.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_jelly.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_sides.png diff --git a/game_api.txt b/game_api.txt index fa6225a0..d9b88f48 100644 --- a/game_api.txt +++ b/game_api.txt @@ -282,18 +282,6 @@ Give Initial Stuff API ^ str is a comma separated list of initial stuff ^ Adds items to the list of items to be given -Nyancat API ------------ - -`nyancat.place(pos, facedir, length)` - -^ Place a cat at `pos` facing `facedir` with tail length `length` - Only accepts facedir 0-3, if facedir > 3 then it will be interpreted as facedir = 0 - -`nyancat.generate(minp, maxp, seed)` - -^ Called by `minetest.register_on_generated`. To disable nyancat generation, - you can redefine nyancat.generate() to be an empty function TNT API ---------- diff --git a/mods/pbj_pup/depends.txt b/mods/pbj_pup/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mods/pbj_pup/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mods/pbj_pup/init.lua b/mods/pbj_pup/init.lua deleted file mode 100644 index 76eb1ac4..00000000 --- a/mods/pbj_pup/init.lua +++ /dev/null @@ -1,136 +0,0 @@ - ---[[ - - Minetest's official Peanut Butter & Jelly Pup mod - -]]-- - -local enable = minetest.setting_getbool("pbj_pup_enable") -if enable == false then - return -end - -local function howl(ttl, player) - if not player then - return - end - ttl = ttl - 15 - if ttl < 0 then - return - end - - minetest.sound_play("pbj_pup_howl", {object = player, loop = false}) - minetest.do_item_eat(5, nil, ItemStack("pbj_pup:pbj_pup"), player, nil) - - minetest.after(15, howl, ttl, player) -end - --- --- nodes --- -minetest.register_node("pbj_pup:pbj_pup", { - description = "PB&J Pup", - tiles = { - "pbj_pup_sides.png", - "pbj_pup_jelly.png", - "pbj_pup_sides.png", - "pbj_pup_sides.png", - "pbj_pup_back.png", - "pbj_pup_front.png" - }, - paramtype = "light", - light_source = default.LIGHT_MAX, - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - legacy_facedir_simple = true, - sounds = default.node_sound_defaults(), - stack_max = 1, - on_use = function(itemstack, user, pointed_thing) - howl(300, user) - itemstack:take_item() - return itemstack - end, -}) - -minetest.register_node("pbj_pup:pbj_pup_candies", { - description = "PB&J Pup Candies", - tiles = {{ - name = "pbj_pup_candies_animated.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1.6 - } - }}, - paramtype = "light", - light_source = default.LIGHT_MAX, - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - stack_max = 5, - sounds = default.node_sound_defaults(), - on_use = function(itemstack, user, pointed_thing) - minetest.do_item_eat(5, nil, itemstack, user, pointed_thing) - minetest.sound_play("pbj_pup_barks", {object = user, loop = false}) - itemstack:take_item() - return itemstack - end, -}) - --- --- mapgen --- -local gen = minetest.setting_getbool("pbj_pup_generate") -if gen == nil or gen then - local function place(pos, facedir, length) - if facedir > 3 then - facedir = 0 - end - local tailvec = minetest.facedir_to_dir(facedir) - local p = {x = pos.x, y = pos.y, z = pos.z} - minetest.set_node(p, {name = "pbj_pup:pbj_pup", param2 = facedir}) - for i = 1, length do - p.x = p.x + tailvec.x - p.z = p.z + tailvec.z - minetest.set_node(p, {name = "pbj_pup:pbj_pup_candies", param2 = facedir}) - end - end - - local function generate(minp, maxp, seed) - local height_min = -31000 - local height_max = -32 - if maxp.y < height_min or minp.y > height_max then - return - end - local y_min = math.max(minp.y, height_min) - local y_max = math.min(maxp.y, height_max) - local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) - local pr = PseudoRandom(seed + 9324342) - local max_num = math.floor(volume / (16 * 16 * 16)) - for i = 1, max_num do - if pr:next(0, 1000) == 0 then - local x0 = pr:next(minp.x, maxp.x) - local y0 = pr:next(minp.y, maxp.y) - local z0 = pr:next(minp.z, maxp.z) - local p0 = {x = x0, y = y0, z = z0} - place(p0, pr:next(0, 3), pr:next(3, 15)) - end - end - end - - minetest.register_on_generated(generate) -end --- --- compat --- - -if minetest.setting_getbool("pbj_pup_alias_nyancat") then - minetest.register_alias("default:nyancat", "pbj_pup:pbj_pup") - minetest.register_alias("default:nyancat_rainbow","pbj_pup:pbj_pup_candies") - minetest.register_alias("nyancat", "pbj_pup:pbj_pup") - minetest.register_alias("nyancat_rainbow", "pbj_pup:pbj_pup_candies") - minetest.register_alias("nyancat:nyancat", "pbj_pup:pbj_pup") - minetest.register_alias("nyancat:nyancat_rainbow", "pbj_pup:pbj_pup_candies") -end diff --git a/mods/pbj_pup/license.md b/mods/pbj_pup/license.md deleted file mode 100644 index b5fcf3a2..00000000 --- a/mods/pbj_pup/license.md +++ /dev/null @@ -1,26 +0,0 @@ - -## PB&J Pup - -PB&J Pup is a parody on the "Nyan Cat" TM toasted poptart meme. - - -## License and Copyright - -(C) 2017 Vanessa Ezekowitz, Auke Kok, celeron55 - - * All Code: LGPL-2.1+ - * All Images: CC-BY-4.0 - - -## Sounds - - * `pbj_pup_barks.ogg`: - Artist: Tomlija - License: CC-BY-3.0 - Url: http://freesound.org/people/Tomlija/sounds/97392/ - - * `pbj_pup_howl.ogg`: - Copyright 2013 Iwan Gabovitch (qubodup) - License: CC-BY-3.0 - Url: http://freesound.org/people/qubodup/sounds/193394/ - diff --git a/mods/pbj_pup/sounds/pbj_pup_barks.ogg b/mods/pbj_pup/sounds/pbj_pup_barks.ogg deleted file mode 100644 index bdd3440e04f455924ef935392eb0209d8a72477e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17192 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 diff --git a/mods/pbj_pup/sounds/pbj_pup_howl.ogg b/mods/pbj_pup/sounds/pbj_pup_howl.ogg deleted file mode 100644 index 15e93bc21e86ce168a0e868a9a88a793131890b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15155 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 H{+s>}v~8ou diff --git a/mods/pbj_pup/textures/pbj_pup_back.png b/mods/pbj_pup/textures/pbj_pup_back.png deleted file mode 100644 index f72fc24620627b2c2fe6f96dae66034b90984d2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmV+|0n+}7P)+J08@$vEX_4P$T4H*Cc0FFsSK~xyiU5`mp z!$1%O)3OaJ#%Tj;7`FcZH#r~lJqJBFSqv_rawD#hU!=%y5_^L>vvRtjhDrJEiobndgmm3lzOSI9@J+!bf_ zGvo$Gc`Q7_ErcpwsbW$^2+KlW;Lsg+B00000NkvXXu0mjf3QvLt diff --git a/mods/pbj_pup/textures/pbj_pup_candies.png b/mods/pbj_pup/textures/pbj_pup_candies.png deleted file mode 100644 index 185fa2d8e3da756f2c0246a69e6f1ae8d47de392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmV-M0lEH(P)Mg{MudIRLHJtF_?Rx3{;wlD)~<^vU$>%Jj+0%gfQY z9MRVR*4Eb70CCp<*Vjk@;I-i5;^OJP)$Z=@^YqE|$=~$J^z_%s`}_O+*P#8-k^hze z|HJ^k^MO(T005FnL_t&-8C}5(a)Lk*MbXz7P!p8TI73?bT%-G6V+P7fsys(^eM+bL zpZq)Z$uHgJ;x1C3W^TT@#!1X+29|*=#wa$&VIiC1Bv#9C6Ap&} zQn~vmMK*>of004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003* zP)t-s08`fhe)<5{t^nxS0RR61|E>qu00;jg2mh`PT-g?4+AB`tD^u<(Vb?3y*(>F) zG5-KE*DEsR06j^GJ#?%+|NmCy*%=h=&%>36E{N(`uD{=oeasNsB|8D^Q za{&LA0RNU3|CVw8r@sHSkN?B~|HN_s(g6R{lmFLo|JkGe-M;_t0RQhJ|L<}C{Q&>} z0RR76|Nn9S|EvH1uK)l4@eJlP00001VoOIvYf@#Um;e9-UP(kjR9M5Mm+OC1MG%Hx zR}&**3q(B?6%+#A$SFY+I9{sY4MI<1y`)NOy#Q6%|NlEPyF0tHC%vR0zkcYMGrODj z*|`O_@qulxyMIda;tO4{VZB`xWH9FKH(oi_1?=R%f}PBHW6(t(y=p>Eyu|oDs-D_$ zXLcVy4hCa+-ka@I7+kn8$c`N=54$P+$>okwO9+VnFd_O&K$sBlkp@EV z2fs~}xUDI&=-B=LA7~tV+mEITUFCs>rrN|O7!n_6Xs_3|Rzfs*kJ{etw6Z0oX|<0$ zHUeP-SrQN?bgKJW0&@D7SMe6UNIdjiH|p&{pQn+ zQX9Vh*51{ZJ-V^6;__b%YKKElQ9zs_0^!i^a!Lu1;myxMS@o3w8Bgu|98-N+&$T2w zg=jJJH1VF6b_k*;= zt@ipCi80NG#btb0zVLBCyhoj-OpKsjehR%0Z8aSm8ZWF6iXJ+KoS`%?y-tKuXonsc z<^eXG_i9D?u2(1CqFiy!uge0+q|koXBeMhMRWq?S!9nM2UPkqk12K;|FO z51D^NKV<%q`$tmm@Bg`LkRE#u@B4|51HwG4N|`$H2tY>H5uV3>4k3>Q4pv(R9B14- zgg60&c?dH9$UKBN|9Gbo(%t)u-ToY)?cL3z4aaWkfFQ*W17RNNeUIx=@F1}~hfsXM zt9LkD|A$xaqQlKYPLUeHdM@uCO&qHYIV`v^)^r93YSWQUD_kEewQ`{6I*{ml%R=SWXP+&kET^Uisk~q~CM9 zUwv@34a#>Zl;**zDYz&~?Qs1cDmq-fR-5{Mh6bNSTESr+F@|6>LTXd7z%~fY1G=r$ zn}@Uaa4zaM=Ch}dZzIk-+yPgs9_{hT9gl;S_z22>;UaaGrrOZ&k@3mo^NJ;cUmJu_ z@(30kFpdyJn)H8M`#$Io{U6oEpr1S7&g@t8WZoh5K7z8J^VI|m9Jb++^Qbd%j*ph_ i;wSg0PxccqeVzeo(|LLwNtf3E0000ZDBrbX#k6EOBZi%Z*os1djO<>004l1 zfPnz3jA0&)jg5|4ppO8)k9S*^XdszUu%Dlwqj4jus;aw!DZISAy}iA{d)mar#K*_S z=;-M2@$vQb_5T0>|NsA>HdNvO005gwL_t&-8CAj2Qo=wGMA2(7%&I_3jBXHY)WBr_ z{|lwcC(fbQogPh@`C02v&J4RrD35IFYprhtLkbN9{~Wvv5hiR0b|8dJ*V!FmBSZwP z*{uO71VqE8mBK}6=E?SU>l;!iIoJl<2T~|MuutQ7vRPk+&M*cyF~YYHWd-c_z^WjG t3(pVB^7ukALKFOEE=%SYOrqDF{tuUO59RfDvEBdx002ovPDHLkV1lYljQ;=t diff --git a/mods/pbj_pup/textures/pbj_pup_jelly.png b/mods/pbj_pup/textures/pbj_pup_jelly.png deleted file mode 100644 index ec0c1ebf1b3ed11e4273fdc53780271da8d2c26e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 zcmVC3^s*j{v@pcUzM&w3$(`o-D+pG0DEZzQTIh!h71%($dt_)Z*ge=;-L{>+9_7 z?D6sO_4V}>MwD>?004AJL_t&-(_N3t5&}U812OchuHrlY|E(UFT}yM|5Yj1#(2pWC zY#*U)`!E!;3liE>$OS9FO5LrH0XQX)b)JcY9#+WC2G|W)AxWsmM4F*IOIKiNrxU$j yAm0i-y(942E`|Cc_Vq&9HA{y#-RzC4*onk9S+2bTOi$qNI2-r-MtgkXW>lS-!r$!KHZA)YRhQ;^X7v=H}+;=;-U~ z>+J08_4W1MumnN?004GLL_t&-(^Zd&4#F@DLqm^cGqAzt|NmBUs8q9h<;kfWk#dtr zX(SgObUj*;LgE8eyaG9}%2f^S0j%i0?7%ZY)nS4G{40}#?1-}KHykzDaBx+fU6CVR z`SE7p#PHj7&0sx}F{6(li0I7;e80)& Date: Wed, 12 Apr 2017 09:25:21 +0100 Subject: [PATCH 30/56] Bushes: Add saplings Bush saplings grow in half the time of tree saplings. Bushes do not need 'from sapling' schematic variants because only the stem node is force-placed in the mapgen schematic, so only the sapling is force-replaced. Bush leaves drop saplings with a rarity that ensures at least 1 sapling per bush on average. --- game_api.txt | 10 +- mods/default/README.txt | 4 +- mods/default/crafting.lua | 12 +++ mods/default/nodes.lua | 86 ++++++++++++++++++ .../textures/default_acacia_bush_sapling.png | Bin 0 -> 151 bytes .../default/textures/default_bush_sapling.png | Bin 0 -> 165 bytes mods/default/trees.lua | 31 +++++++ 7 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 mods/default/textures/default_acacia_bush_sapling.png create mode 100644 mods/default/textures/default_bush_sapling.png diff --git a/game_api.txt b/game_api.txt index d9b88f48..8b6bf839 100644 --- a/game_api.txt +++ b/game_api.txt @@ -766,14 +766,20 @@ Trees * `default.grow_new_pine_tree(pos)` * Grows a new design pine tree at pos + * `default.grow_new_snowy_pine_tree(pos)` + * Grows a new design snowy pine tree at pos + * `default.grow_new_acacia_tree(pos)` * Grows a new design acacia tree at pos * `default.grow_new_aspen_tree(pos)` * Grows a new design aspen tree at pos - * `default.grow_new_snowy_pine_tree(pos)` - * Grows a new design snowy pine tree at pos + * `default.grow_bush(pos)` + * Grows a bush at pos + + * `default.grow_acacia_bush(pos)` + * Grows an acaia bush at pos Carts ----- diff --git a/mods/default/README.txt b/mods/default/README.txt index 4e41479a..fc6def98 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -17,6 +17,7 @@ Cisoun's texture pack (CC BY-SA 3.0): default_lava.png default_leaves.png default_sapling.png + default_bush_sapling.png default_stone.png default_tree.png default_tree_top.png @@ -90,6 +91,7 @@ paramat (CC BY-SA 3.0): default_acacia_leaves.png default_acacia_leaves_simple.png default_acacia_sapling.png + default_acacia_bush_sapling.png default_acacia_tree.png default_acacia_tree_top.png default_acacia_wood.png @@ -126,7 +128,7 @@ brunob.santos (CC BY-SA 4.0): default_desert_cobble.png BlockMen (CC BY-SA 3.0): - default_aspen_leaves.png + default_aspen_leaves.png -- Derived from Sofar's texture default_wood.png default_clay_brick.png default_iron_ingot.png diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 1eca8887..721f4132 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -966,6 +966,18 @@ minetest.register_craft({ burntime = 10, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:bush_sapling", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_bush_sapling", + burntime = 7, +}) + minetest.register_craft({ type = "fuel", recipe = "default:aspen_sapling", diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index db679830..b7309e12 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -140,8 +140,10 @@ default:dry_grass_5 default:bush_stem default:bush_leaves +default:bush_sapling default:acacia_bush_stem default:acacia_bush_leaves +default:acacia_bush_sapling Corals ------ @@ -1307,11 +1309,53 @@ minetest.register_node("default:bush_leaves", { tiles = {"default_leaves_simple.png"}, paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:bush_sapling"}, rarity = 5}, + {items = {"default:bush_leaves"}} + } + }, sounds = default.node_sound_leaves_defaults(), after_place_node = default.after_place_leaves, }) +minetest.register_node("default:bush_sapling", { + description = "Bush Sapling", + drawtype = "plantlike", + tiles = {"default_bush_sapling.png"}, + inventory_image = "default_bush_sapling.png", + wield_image = "default_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(1200, 2400)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + minetest.register_node("default:acacia_bush_stem", { description = "Acacia Bush Stem", drawtype = "plantlike", @@ -1336,11 +1380,53 @@ minetest.register_node("default:acacia_bush_leaves", { tiles = {"default_acacia_leaves_simple.png"}, paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:acacia_bush_sapling"}, rarity = 5}, + {items = {"default:acacia_bush_leaves"}} + } + }, sounds = default.node_sound_leaves_defaults(), after_place_node = default.after_place_leaves, }) +minetest.register_node("default:acacia_bush_sapling", { + description = "Acacia Bush Sapling", + drawtype = "plantlike", + tiles = {"default_acacia_bush_sapling.png"}, + inventory_image = "default_acacia_bush_sapling.png", + wield_image = "default_acacia_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 2 / 16, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(1200, 2400)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:acacia_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + -- -- Corals diff --git a/mods/default/textures/default_acacia_bush_sapling.png b/mods/default/textures/default_acacia_bush_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..940b3aacb8df878a5d49d274791cff1c396066f5 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWP0r8pbG3^J3&_hz@T$~{ zoUhk5?e`m?EMrNKUoeBivm0qZjD(XY_i3u<=T%O449&%cs6ley6r>mdK II;Vst06Lv3;{X5v literal 0 HcmV?d00001 diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 0b829a75..81c9831e 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -77,6 +77,14 @@ function default.grow_sapling(pos) minetest.log("action", "An aspen sapling grows into a tree at ".. minetest.pos_to_string(pos)) default.grow_new_aspen_tree(pos) + elseif node.name == "default:bush_sapling" then + minetest.log("action", "A bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_bush(pos) + elseif node.name == "default:acacia_bush_sapling" then + minetest.log("action", "An acacia bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_acacia_bush(pos) end end @@ -426,6 +434,29 @@ function default.grow_new_aspen_tree(pos) end +-- Bushes do not need 'from sapling' schematic variants because +-- only the stem node is force-placed in the schematic. + +-- Bush + +function default.grow_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Acacia bush + +function default.grow_acacia_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/acacia_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + -- -- Sapling 'on place' function to check protection of node and resulting tree volume -- From 98216810ef7779473c596d25c32406d00ed92bff Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Wed, 12 Apr 2017 22:27:58 +0200 Subject: [PATCH 31/56] nodebox -> node_box Seems like this was a typo --- mods/doors/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 39584446..a1bfc092 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -91,7 +91,7 @@ minetest.register_node("doors:hidden", { on_blast = function() end, tiles = {"doors_blank.png"}, -- 1px transparent block inside door hinge near node top. - nodebox = { + node_box = { type = "fixed", fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, }, From 701abc2d2f8a45b850adc25e748dac0adec0b1dc Mon Sep 17 00:00:00 2001 From: octacian Date: Wed, 15 Mar 2017 22:20:44 -0700 Subject: [PATCH 32/56] Keys: Allow skeleton keys to be stacked Allow skeleton keys to be stacked by converting them to craftitems and adding a few lines of code to add a new itemstack to the inventory with the new key or drop it at the player position if the inventory is full. --- mods/default/tools.lua | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 1a08b918..f105a8fb 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -379,7 +379,7 @@ minetest.register_tool("default:sword_diamond", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:skeleton_key", { +minetest.register_craftitem("default:skeleton_key", { description = "Skeleton Key", inventory_image = "default_key_skeleton.png", groups = {key = 1}, @@ -407,13 +407,25 @@ minetest.register_tool("default:skeleton_key", { local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) if secret then - -- finish and return the new key + -- update original itemstack itemstack:take_item() - itemstack:add_item("default:key") - local meta = itemstack:get_meta() + + -- finish and return the new key + local new_stack = ItemStack("default:key") + local meta = new_stack:get_meta() + local inv = minetest.get_inventory({type="player", name=user:get_player_name()}) meta:set_string("secret", secret) meta:set_string("description", "Key to "..user:get_player_name().."'s " ..minetest.registered_nodes[node.name].description) + + if itemstack:get_count() == 0 then + itemstack = new_stack + else + if inv:add_item("main", new_stack):get_count() > 0 then + minetest.add_item(user:getpos(), new_stack) + end + end + return itemstack end end From c54a7e882f161155641267e63dfb4365f94b4ac1 Mon Sep 17 00:00:00 2001 From: octacian Date: Wed, 15 Mar 2017 22:22:09 -0700 Subject: [PATCH 33/56] Keys: Move skeleton key to craftitems.lua Commit 73d61cbb103415c9a3970eaf2c48aeadabfff828 makes skeleton keys craftitems rather than tools, warranting the move from tools.lua to craftitems.lua. --- mods/default/craftitems.lua | 56 +++++++++++++++++++++++++++++++++++++ mods/default/tools.lua | 54 ----------------------------------- 2 files changed, 56 insertions(+), 54 deletions(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index aa8f56bd..a0db6554 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -186,6 +186,62 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv craft_inv:set_stack("craft", index, original) end) +minetest.register_craftitem("default:skeleton_key", { + description = "Skeleton Key", + inventory_image = "default_key_skeleton.png", + groups = {key = 1}, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + local node = minetest.get_node(pos) + + if not node then + return itemstack + end + + local on_skeleton_key_use = minetest.registered_nodes[node.name].on_skeleton_key_use + if not on_skeleton_key_use then + return itemstack + end + + -- make a new key secret in case the node callback needs it + local random = math.random + local newsecret = string.format( + "%04x%04x%04x%04x", + random(2^16) - 1, random(2^16) - 1, + random(2^16) - 1, random(2^16) - 1) + + local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) + + if secret then + local inv = minetest.get_inventory({type="player", name=user:get_player_name()}) + + -- update original itemstack + itemstack:take_item() + + -- finish and return the new key + local new_stack = ItemStack("default:key") + local meta = new_stack:get_meta() + meta:set_string("secret", secret) + meta:set_string("description", "Key to "..user:get_player_name().."'s " + ..minetest.registered_nodes[node.name].description) + + if itemstack:get_count() == 0 then + itemstack = new_stack + else + if inv:add_item("main", new_stack):get_count() > 0 then + minetest.add_item(user:getpos(), new_stack) + end -- else: added to inventory successfully + end + + return itemstack + end + end +}) + minetest.register_craftitem("default:coal_lump", { description = "Coal Lump", inventory_image = "default_coal_lump.png", diff --git a/mods/default/tools.lua b/mods/default/tools.lua index f105a8fb..45c779f1 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -379,60 +379,6 @@ minetest.register_tool("default:sword_diamond", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_craftitem("default:skeleton_key", { - description = "Skeleton Key", - inventory_image = "default_key_skeleton.png", - groups = {key = 1}, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - - local pos = pointed_thing.under - local node = minetest.get_node(pos) - - if not node then - return itemstack - end - - local on_skeleton_key_use = minetest.registered_nodes[node.name].on_skeleton_key_use - if on_skeleton_key_use then - -- make a new key secret in case the node callback needs it - local random = math.random - local newsecret = string.format( - "%04x%04x%04x%04x", - random(2^16) - 1, random(2^16) - 1, - random(2^16) - 1, random(2^16) - 1) - - local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) - - if secret then - -- update original itemstack - itemstack:take_item() - - -- finish and return the new key - local new_stack = ItemStack("default:key") - local meta = new_stack:get_meta() - local inv = minetest.get_inventory({type="player", name=user:get_player_name()}) - meta:set_string("secret", secret) - meta:set_string("description", "Key to "..user:get_player_name().."'s " - ..minetest.registered_nodes[node.name].description) - - if itemstack:get_count() == 0 then - itemstack = new_stack - else - if inv:add_item("main", new_stack):get_count() > 0 then - minetest.add_item(user:getpos(), new_stack) - end - end - - return itemstack - end - end - return nil - end -}) - minetest.register_tool("default:key", { description = "Key", inventory_image = "default_key.png", From 6335525757c68e8697c0db992d9774d3c7febd01 Mon Sep 17 00:00:00 2001 From: upsilon Date: Mon, 17 Apr 2017 12:56:27 +0200 Subject: [PATCH 34/56] Doors: Ignore permission check if player parameter is omitted As written in game_api.txt. --- mods/doors/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index a1bfc092..05aa3e2f 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -150,7 +150,7 @@ function _doors.door_toggle(pos, node, clicker) replace_old_owner_information(pos) - if not default.can_interact_with_node(clicker, pos) then + if clicker and not default.can_interact_with_node(clicker, pos) then return false end @@ -530,7 +530,7 @@ function _doors.trapdoor_toggle(pos, node, clicker) replace_old_owner_information(pos) - if not default.can_interact_with_node(clicker, pos) then + if clicker and not default.can_interact_with_node(clicker, pos) then return false end From 26686196383df71e5634ee4c5af479668d83ee7e Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 19 Apr 2017 02:48:00 +0100 Subject: [PATCH 35/56] Ores: Add tin ore, lump, ingot and block Use Calinou's textures from moreores mod. Craft bronze from tin and copper instead of steel and copper. Match ore density to the moreores mod but start ore at a depth of y = -32 to be part of the depth progression of other ores. --- mods/default/README.txt | 4 ++ mods/default/crafting.lua | 37 +++++++++++++++--- mods/default/craftitems.lua | 10 +++++ mods/default/mapgen.lua | 35 +++++++++++++++++ mods/default/nodes.lua | 22 +++++++++++ mods/default/textures/default_mineral_tin.png | Bin 0 -> 171 bytes mods/default/textures/default_tin_block.png | Bin 0 -> 274 bytes mods/default/textures/default_tin_ingot.png | Bin 0 -> 198 bytes mods/default/textures/default_tin_lump.png | Bin 0 -> 166 bytes 9 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 mods/default/textures/default_mineral_tin.png create mode 100644 mods/default/textures/default_tin_block.png create mode 100644 mods/default/textures/default_tin_ingot.png create mode 100644 mods/default/textures/default_tin_lump.png diff --git a/mods/default/README.txt b/mods/default/README.txt index fc6def98..3c104a00 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -53,6 +53,10 @@ Calinou (CC BY-SA 3.0): default_papyrus.png default_mineral_copper.png default_glass_detail.png + default_mineral_tin.png + default_tin_block.png + default_tin_ingot.png + default_tin_lump.png MirceaKitsune (CC BY-SA 3.0): character.x diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 721f4132..50ffb1ae 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -392,12 +392,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - type = "shapeless", - output = "default:bronze_ingot", - recipe = {"default:steel_ingot", "default:copper_ingot"}, -}) - minetest.register_craft({ output = 'default:coalblock', recipe = { @@ -446,6 +440,31 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "default:tinblock", + recipe = { + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:tin_ingot 9", + recipe = { + {"default:tinblock"}, + } +}) + +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + } +}) + minetest.register_craft({ output = 'default:bronzeblock', recipe = { @@ -849,6 +868,12 @@ minetest.register_craft({ recipe = "default:copper_lump", }) +minetest.register_craft({ + type = "cooking", + output = "default:tin_ingot", + recipe = "default:tin_lump", +}) + minetest.register_craft({ type = "cooking", output = "default:gold_ingot", diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index a0db6554..0c42fc37 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -258,6 +258,11 @@ minetest.register_craftitem("default:copper_lump", { inventory_image = "default_copper_lump.png", }) +minetest.register_craftitem("default:tin_lump", { + description = "Tin Lump", + inventory_image = "default_tin_lump.png", +}) + minetest.register_craftitem("default:mese_crystal", { description = "Mese Crystal", inventory_image = "default_mese_crystal.png", @@ -288,6 +293,11 @@ minetest.register_craftitem("default:copper_ingot", { inventory_image = "default_copper_ingot.png", }) +minetest.register_craftitem("default:tin_ingot", { + description = "Tin Ingot", + inventory_image = "default_tin_ingot.png", +}) + minetest.register_craftitem("default:bronze_ingot", { description = "Bronze Ingot", inventory_image = "default_bronze_ingot.png", diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 9e359a33..fff889fa 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -357,6 +357,41 @@ function default.register_ores() y_max = -64, }) + -- Tin + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 9, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 7, + clust_size = 3, + y_min = -31000, + y_max = -32, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 9, + clust_size = 3, + y_min = -31000, + y_max = -128, + }) + -- Gold minetest.register_ore({ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index b7309e12..facb28e0 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -107,6 +107,10 @@ default:steelblock default:stone_with_copper default:copperblock + +default:stone_with_tin +default:tinblock + default:bronzeblock default:stone_with_gold @@ -1046,6 +1050,24 @@ minetest.register_node("default:copperblock", { sounds = default.node_sound_metal_defaults(), }) + +minetest.register_node("default:stone_with_tin", { + description = "Tin Ore", + tiles = {"default_stone.png^default_mineral_tin.png"}, + groups = {cracky = 2}, + drop = "default:tin_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:tinblock", { + description = "Tin Block", + tiles = {"default_tin_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + minetest.register_node("default:bronzeblock", { description = "Bronze Block", tiles = {"default_bronze_block.png"}, diff --git a/mods/default/textures/default_mineral_tin.png b/mods/default/textures/default_mineral_tin.png new file mode 100644 index 0000000000000000000000000000000000000000..232d4b537c1d5e93736577096f23f8d558bb4387 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=6QZow{)0!nuoQjvhaK z{J^mThxT8;ar4BXlLwC<6JPN=8mNM?B*-tA!Qt7BG$6;?)5S4_<9f0KQxk{UVumSU z2~3?Zzopr04g>;umAu6 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_tin_block.png b/mods/default/textures/default_tin_block.png new file mode 100644 index 0000000000000000000000000000000000000000..72759b0456246db5be2a6938ac2a20a356ee006d GIT binary patch literal 274 zcmV+t0qy>YP)pB1c0GCNbK~xyiC5;IV#2^dso6wUy0yl>5$pl|UfpaXw8q0pr;FLZ#(jC;KVqf83l|Z4hSkS*}S$~_@5wT;$j4Y4% Y112E^EmuPPX#fBK07*qoM6N<$f_89pc>n+a literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_tin_ingot.png b/mods/default/textures/default_tin_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..eed536105bf934d6274d31c28e6e98360f1cc5c1 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=8W+;Rg>MoHc#ws^v?z zY~HwU@1BbClEn+=B_zb}*uJH%rYa*NZQA7izV7y#*&j9lH87S0`2{mLJiCzwmW!Mb3}ghdQ3VL?or4s5v>!f3EIPAcidff>ad9_G?U9XhA)aV=q$Xz`uq s%XrCQ>mjvZJ*N_G=|g9PQx5PmT*&2Jw`WP+Dxi@Jp00i_>zopr0IQlvvH$=8 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_tin_lump.png b/mods/default/textures/default_tin_lump.png new file mode 100644 index 0000000000000000000000000000000000000000..72bd339bf6247bebfc74f1a4385136509acd557d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=0%_F5I$Z%gU82=ggV2 zVZ(;QhYue(aNu;f!eXEtV@Z%-FoVOh8)-m}ji-xa2*>qg1wjL8X=e$yl`Gj27=ueo zT@9RlHA5pAP9%tM1qqcf7)7v5m1RBH<;ue9dVt4G(DBbRW`8nU4a^VeoYI Kb6Mw<&;$SvKr+h! literal 0 HcmV?d00001 From 24559d012e11fae3f6f32a5221b460f6999002b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Sat, 22 Apr 2017 14:34:51 +0200 Subject: [PATCH 36/56] Creative: Automatic item colorization for creative mode --- mods/creative/init.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index f9047189..bba9b34e 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -55,8 +55,7 @@ function minetest.handle_node_drops(pos, drops, digger) local inv = digger:get_inventory() if inv then for _, item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then + if not inv:contains_item("main", item, true) then inv:add_item("main", item) end end From 4d9fd7ad61fd9946e2ec7a09f1f107d4ef6ffedb Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 23 Apr 2017 03:48:12 +0100 Subject: [PATCH 37/56] Textures: Reduce contrast of snow ripples --- mods/default/textures/default_snow.png | Bin 4577 -> 522 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_snow.png b/mods/default/textures/default_snow.png index 4ac359381234d8d6cfe85244cf4413ea9b57e0de..fcbef0e5839e699d222479131c00cf058901d8fc 100644 GIT binary patch delta 497 zcmVr&BYyzfP)t-s%gfly&DhP(+0M_}&(GS=&)d(?+tAV6($e12)85n6 z-_+FL)YahB)#26F;@8*X*VyFO*yY&R<=ENg*xKgV+UDBY=i1xn+S};c+v(ff>D%1u z+}!Eh-Rj-l>D}Jz-rwuq-|XMt?BCz*-{9%r;O*bw?&0C;;D6!n;o z;o|S&;_%|*@#Ey};^gt<l_=&O~=k(|3@#yIC=jiq5 z==SL8_vz~N>+ALF?Dp*K_wDWX?e6#P?)mfd|NZ^{y`VmP0002$Nkl5U;YGV@Zi_y z&r&LvODBKGNDdct6mN) n>bMecJ1ze=A==Y-(uBz$E4C{e(UBy000000NkvXXu0mjfid#R7 literal 4577 zcmeHKX*65w8cyRn#vHu|rK(Pv7Bxh~SRqsmrLC!E)m9`y3=t8;(1A``QyuN8sv63n zR5_-iiq_C$u6d|vhy-aQL=ANmck4at+&}kEf7~B;t?u=F@7~|H-~H_Oeb%?${qEcL zwkIK?a-tv*2x4tzeik_I-5tULfISMAa0Gz_pGG;kQO;r_pd@mz4p{6YU#aG%L3~t357~L#hfOgqwTP33BW?dAe>ywiNg^TJHXVW=lCWRXU z2;T(lSjS{V%LLb>xwUspUu;%4b==%^yzF)`X1wPiNi#BLb4&X|MPqaCyPHz29~!wz zVf?hV)Tn*8E#rvGQFliM*b&u6wR(hu!Pe4`oVOJj*`Q?nWW zj7@1|q%GZk-rMPBvQ<{D?fV(Ln0R4qTs3?La--Z~U#pCzxAL}bxc&*m$O^Me zyHTO=&}5^z>dI$_z(syXRBTuZm_x@z4|(qJ(oUDPKuqkn4=3X+74Sm|8dhvknTz~Wu8p0}%2j$>;%UB_ zgjshVbcx6_dP#pm9lg@B`MtL~jWf_9*R4_{=E1!#4|}BI&UM3k z`_>(#7GBHoVZMFd;^H?G_a`wu9yTgI6rm=?Fn$!!%gtil&5h0l{niJ(%l3Fl+ z_D#ouytf+WXk;NAtg0N{A+0~_Q{v-L;tqC&{}?hWFQ0G`Tpj0VBR6QP;j$2JD>E_@GTK#=U)4CD%?L?FDSnxE&DC7HC9inW((y`{gv5DAe$a`c)yt`P;(EO* z@A+s%vEDulk8{pTWyzs6s-Kd4PzulA?se+-lyGsDJi;~XwUX20{pm5O;a@q}oPWzi z`U~5308v?vZ0Tn0X27DiosD_K5t zCF|uD^D*mm3I9#mH4nQ59eZ?$nVW^`&p{W_ga35-n(L53tf(M zQ)v&U9yvbu5}9#)P|5C6X0$86t~bqek-lu;uf5^9=u)rk-7Y84V5r&VYHxcVKF}f^ zZXxZX{?U+7@DW<9(EFHOF_5woX^Ffd@JPKIBLDMI7oc=|{nwgJAW^WpH5+}q9CG!z zxInbs8)0jC{yWqW$fV2y;tBM3JUej4Bf=}7E_Sd-!j8X;uz?_xo2~Qg>s+h+RwP$5 z8(t}?H^JhBG;c_CpLYz&27yHU3BdQk&E^aW8yuv8!3BHcHK;)(AP5l1$b?G5U<2?J zs5jo1Kt#h9>ziOu0uBvx)wR*IA(`R*2v$*KyknHD6E-RUYk-597>gQFQ2;>@o`Qi= zg93@6C@LEEl@|qE?=B-?(626(05r_a#vW=GOvXcXG;}mH;TBXvxE9P<6lz4q`Jm34 zTmD4>%+N4D3WbD1AR;0nG$OP$g2}!Jq=A6}LQ@N&r3D8(;GvO33Wf?Nh92If_&0|+ zJ`_s^lp_Qap}U+I@8B>B8U_RIL;oVjVgKePg^>flGUKoad>}puPo#t*kQzwDSAQH9 zWf@Ek!T`?`f-t^#1c~SiL+nP2_$yo>d&J-A@5b=IKfb@@n>79|*LS(TNr7*2{=U1u z%k@nPe3SF{-Sz(^m*{^QC_EA9nj(Pq2()wcIM7-#?aw$_w6^xOw)M5W?SK2nz#qF9 z{G)xay<@1ebELCtq^oItG9>HqIK~#q9fux%U(EG#Z;W`El|C=K~$U0(}=;`V^Z!#hae~I5o|i0{#LR z90r3k%~)hGmKZbq877y(1T3G)I1>3B0{oq4+Vk5 zBzMOiP)4RKuqZ^awy_YJ5)+aXgH%?4hJhunwYjO2>>#8&_CzyuFQ~7pf9On)f6;Gs z6(vgh`Y;OdfjT`ec6PF(eqQogenoyL-b`M85hHsXRfdl|>fjRlsZ2*OcDvm}x!Ik! zmS-xuve{9pD{Z+Hc*!KaMae(W!FM3$!G?1ZST4v1JS=ES{OMe+qK=_ikapqyA+-Qw z+20M1s7jPZ!G7B^ycX^-9ipR7I*>W3YpD67mfe7tKuz_Zw|l3wO5R<}AG&;~j(Sbj zZ}icoSN Date: Sun, 23 Apr 2017 04:09:46 +0100 Subject: [PATCH 38/56] Tin: Tune mapgen, bugfix, fix texture credits Previously i had matched ore density to moreores, but this density was too high and out of balance with MTGame, reduce density to be similar to copper ore. The 2 levels of underground ore were overlapping, fix. Textures are actually by kilbith, update credits. Also credit kilbith for bronze, copper, gold and steel blocks, credits had not been updated at the time. --- mods/default/README.txt | 18 ++++++++++-------- mods/default/license.txt | 1 + mods/default/mapgen.lua | 8 ++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 3c104a00..8d1357c8 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -53,10 +53,6 @@ Calinou (CC BY-SA 3.0): default_papyrus.png default_mineral_copper.png default_glass_detail.png - default_mineral_tin.png - default_tin_block.png - default_tin_ingot.png - default_tin_lump.png MirceaKitsune (CC BY-SA 3.0): character.x @@ -82,10 +78,6 @@ Splizard (CC BY-SA 3.0): Zeg9 (CC BY-SA 3.0): default_coal_block.png - default_steel_block.png - default_copper_block.png - default_bronze_block.png - default_gold_block.png paramat (CC BY-SA 3.0): wieldhand.png -- Copied from character.png by Jordach (CC BY-SA 3.0) @@ -216,6 +208,16 @@ kaeza (CC-BY-SA 3.0): default_desert_sandstone_brick.png default_desert_sandstone_block.png +kilbith (CC BY-SA 3.0): + default_steel_block.png + default_copper_block.png + default_bronze_block.png + default_gold_block.png + default_tin_block.png + default_mineral_tin.png + default_tin_ingot.png + default_tin_lump.png + Glass breaking sounds (CC BY 3.0): 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ 2: http://www.freesound.org/people/Tomlija/sounds/97669/ diff --git a/mods/default/license.txt b/mods/default/license.txt index 09e4225f..72af7284 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -43,6 +43,7 @@ Copyright (C) 2010-2016: Mito551 GreenXenith kaeza + kilbith You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index fff889fa..1305226a 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -364,7 +364,7 @@ function default.register_ores() ore = "default:stone_with_tin", wherein = "default:stone", clust_scarcity = 10 * 10 * 10, - clust_num_ores = 9, + clust_num_ores = 5, clust_size = 3, y_min = 1025, y_max = 31000, @@ -375,9 +375,9 @@ function default.register_ores() ore = "default:stone_with_tin", wherein = "default:stone", clust_scarcity = 13 * 13 * 13, - clust_num_ores = 7, + clust_num_ores = 4, clust_size = 3, - y_min = -31000, + y_min = -127, y_max = -32, }) @@ -386,7 +386,7 @@ function default.register_ores() ore = "default:stone_with_tin", wherein = "default:stone", clust_scarcity = 10 * 10 * 10, - clust_num_ores = 9, + clust_num_ores = 5, clust_size = 3, y_min = -31000, y_max = -128, From 2917562728927eda925d3e9ba17bd3cf945dae2a Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 26 Apr 2017 00:15:15 +0100 Subject: [PATCH 39/56] Fix owner not being checked on write to book --- mods/default/craftitems.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 0c42fc37..75ac5507 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -12,6 +12,7 @@ minetest.register_craftitem("default:paper", { groups = {flammable = 3}, }) + local lpp = 14 -- Lines per book's page local function book_on_use(itemstack, user) local player_name = user:get_player_name() @@ -93,6 +94,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) data = stack:get_meta():to_table().fields end + if data and data.owner and data.owner ~= player:get_player_name() then + return + end + if not data then data = {} end data.title = fields.title data.owner = player:get_player_name() From ae7206c0064cbb5c0e5434c19893d4bf3fa2b388 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 26 Apr 2017 20:19:59 -0700 Subject: [PATCH 40/56] Remove dye craft recipe conflict. We have enough gray recipes, but brown is more difficult. Fixes #1710 --- mods/dye/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index 87f31d12..80284576 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -81,7 +81,6 @@ local dye_recipes = { {"yellow", "red", "orange"}, {"yellow", "blue", "green"}, -- RYB complementary mixes - {"red", "green", "dark_grey"}, {"yellow", "violet", "dark_grey"}, {"blue", "orange", "dark_grey"}, -- CMY mixes - approximation From 67b13a5942783a52134572414680dc40a479bb30 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 28 Apr 2017 20:56:51 -0700 Subject: [PATCH 41/56] Fix books getting erased on page button use. Changing the book page caused the entire itemstack meta to get wiped due to improper calling of meta:from_table(). Fixes #1711 --- mods/default/craftitems.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 75ac5507..33cdd5f6 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -139,7 +139,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end - stack:get_meta():from_table(data) + stack:get_meta():from_table({fields = data}) stack = book_on_use(stack, player) end From 4ec0fd974bcda2f0ea59084cfd4421ab00c3d38f Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 28 Apr 2017 21:09:07 -0700 Subject: [PATCH 42/56] Doors: place sound when placing a door. Due to door items being the thing that's placed, we need to explicitly play a sound when placing a door. Fixes #1363 --- mods/doors/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 05aa3e2f..5189dec7 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -332,6 +332,8 @@ function doors.register(name, def) itemstack:take_item() end + minetest.sound_play(def.sounds.place, {pos = pos}) + on_place_node(pos, minetest.get_node(pos), placer, node, itemstack, pointed_thing) From 011ad78b42146725d93761473c7fd06698b2ca73 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 17 Jan 2016 15:32:50 -0800 Subject: [PATCH 43/56] Improve Chest appearance - opening chests. Adds a mesh model that appears when a chest is opened. The chest stays visibly open as long as the player keeps it open. When the player closes the formspec, the chest returns back to the closed shape. While opening and closing, a sound plays. A second person inspecting the chest will trigger a second sound open. However, only after the last player closes the chest, does the chest actually visually close and is the sound close played. This keeps mesh updates to a minimum. While it's possible that a server shutting down may cause chests to remain open, this does not affect the chests' working matter, and opening or closing them should fix them. Old chests are converted to the new style by LBM. I previously had them converted on open but this was unreliable, and LBMs don't have that problem. Open chests cannot be dug up. This prevents people from keeping a chest open and digging it out as well, since closing a chest would place a chest back (swap) at the spot. We could protect against this, but it still messes up the client and causes a lot of "missing node inventory" error messages otherwise. It's unlikely but possible that a player lagging out causes a chest to stay "open" and thus unremovable by digging, but there are other ways of dealing with that - a server restart fixes that issue. If the lid of the chest is obstructed, the sounds continue to play, but the lid isn't opened. Obstructed means that a node is present above the chest lid, however, we ignore several node types like signs, torches (not 3d) and wallmounted nodeboxes (typically signs) since they don't pose any major obstruction in almost any case, and are typically found above chests. Additionally, the selection box of the opened chest does not include the lid, and so one can still interact with e.g. a sign behind an open lid. Due to the fact that chests now have 7+ textures, we can no longer use materials (limit: 6) to texture the chest, and so there is now a single UV mapped image that applies both to open and closed chests. While this does mean texture pack makers need to create it, this is extremely simple and consists of a simple cut'n'paste over the template and should be really easy to do. Only one texture file is now then used for both open and closed chests. --- mods/default/README.txt | 13 + mods/default/models/chest_open.obj | 82 ++++ mods/default/models/cube.obj | 38 ++ mods/default/nodes.lua | 390 +++++++++++------- mods/default/sounds/default_chest_close.ogg | Bin 0 -> 10099 bytes mods/default/sounds/default_chest_open.ogg | Bin 0 -> 10578 bytes mods/default/textures/default_chest_front.png | Bin 423 -> 0 bytes mods/default/textures/default_chest_lock.png | Bin 469 -> 0 bytes mods/default/textures/default_chest_side.png | Bin 375 -> 0 bytes mods/default/textures/default_chest_top.png | Bin 422 -> 0 bytes mods/default/textures/default_chest_wood.png | Bin 0 -> 2320 bytes .../textures/default_chest_wood_locked.png | Bin 0 -> 2418 bytes 12 files changed, 372 insertions(+), 151 deletions(-) create mode 100644 mods/default/models/chest_open.obj create mode 100644 mods/default/models/cube.obj create mode 100644 mods/default/sounds/default_chest_close.ogg create mode 100644 mods/default/sounds/default_chest_open.ogg delete mode 100644 mods/default/textures/default_chest_front.png delete mode 100644 mods/default/textures/default_chest_lock.png delete mode 100644 mods/default/textures/default_chest_side.png delete mode 100644 mods/default/textures/default_chest_top.png create mode 100644 mods/default/textures/default_chest_wood.png create mode 100644 mods/default/textures/default_chest_wood_locked.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 8d1357c8..8e8541c9 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -154,6 +154,9 @@ sofar (CC BY-SA 3.0): default_aspen_tree default_aspen_tree_top, derived from default_pine_tree_top (by paramat) default_aspen_wood, derived from default_pine_wood (by paramat) + default_chest_wood, default_chest_wood_locked derived from default_chest_* textures by BlockMen + +sofar (WTFPL): default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel Neuromancer (CC BY-SA 2.0): @@ -285,3 +288,13 @@ https://www.freesound.org/people/AGFX/packs/1253/ blukotek (CC0 1.0) https://www.freesound.org/people/blukotek/sounds/251660/ default_dig_snappy.ogg + +Chests sounds added by sofar, derived of several files mixed together: + default_chest_open.ogg + default_chest_close.ogg + - http://www.freesound.org/people/Sevin7/sounds/269722/ CC0 + - http://www.freesound.org/people/Percy%20Duke/sounds/23448/ CC-BY-3.0 + - http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0 + - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0 + - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0 + diff --git a/mods/default/models/chest_open.obj b/mods/default/models/chest_open.obj new file mode 100644 index 00000000..a1dcce8d --- /dev/null +++ b/mods/default/models/chest_open.obj @@ -0,0 +1,82 @@ +# Blender v2.76 (sub 0) OBJ File: 'chest_open.blend' +# www.blender.org +mtllib chest_open.mtl +o Bottom_Cube.001 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.187500 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.187500 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.187500 -0.500000 +vt 0.750000 0.343750 +vt 0.500000 0.343750 +vt 0.500000 0.000000 +vt 0.750000 0.000000 +vt 0.250000 0.343750 +vt 0.250000 0.000000 +vt 0.000000 0.343750 +vt 0.000000 0.000000 +vt 0.750000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.500000 +vt 0.750000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/2/2 8/5/2 7/6/2 3/3/2 +f 8/5/3 6/7/3 5/8/3 7/6/3 +f 6/9/4 2/10/4 1/11/4 5/12/4 +f 1/13/5 3/14/5 7/15/5 5/16/5 +f 6/4/6 8/12/6 4/17/6 2/18/6 +o Top_Cube.002 +v -0.499900 0.187501 0.499900 +v -0.499900 0.408471 0.720970 +v -0.499900 0.894607 -0.207108 +v -0.499900 1.115578 0.013863 +v 0.499900 0.187501 0.499900 +v 0.499900 0.408471 0.720970 +v 0.499900 0.894607 -0.207108 +v 0.499900 1.115578 0.013863 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.343750 +vt 0.750000 0.343750 +vt 0.250000 0.500000 +vt 0.250000 0.343750 +vt 0.000000 0.500000 +vt 0.000000 0.343750 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.843750 +vt 0.750000 0.843750 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.707100 -0.707100 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.707100 0.707100 +vn 0.000000 -0.707100 -0.707100 +vn 0.000000 0.707100 0.707100 +usemtl None +s off +f 10/19/7 12/20/7 11/21/7 9/22/7 +f 12/20/8 16/23/8 15/24/8 11/21/8 +f 16/23/9 14/25/9 13/26/9 15/24/9 +f 14/27/10 10/28/10 9/29/10 13/30/10 +f 9/31/11 11/32/11 15/27/11 13/19/11 +f 14/33/12 16/23/12 12/20/12 10/28/12 diff --git a/mods/default/models/cube.obj b/mods/default/models/cube.obj new file mode 100644 index 00000000..7bbec5de --- /dev/null +++ b/mods/default/models/cube.obj @@ -0,0 +1,38 @@ +# Blender v2.76 (sub 0) OBJ File: 'chest_close.blend' +# www.blender.org +mtllib chest_close.mtl +o Cube_Cube.001 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 -0.000000 +vt 0.750000 0.000000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.000000 0.500000 +vt -0.000000 0.000000 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt -0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/2/2 8/5/2 7/6/2 3/3/2 +f 8/5/3 6/7/3 5/8/3 7/6/3 +f 6/9/4 2/10/4 1/2/4 5/1/4 +f 1/5/5 3/11/5 7/12/5 5/7/5 +f 6/11/6 8/5/6 4/2/6 2/10/6 diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index facb28e0..c410b213 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1766,188 +1766,276 @@ minetest.register_node("default:lava_flowing", { -- Tools / "Advanced" crafting / Non-"natural" -- -local chest_formspec = - "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "list[current_name;main;0,0.3;8,4;]" .. - "list[current_player;main;0,4.85;8,1;]" .. - "list[current_player;main;0,6.08;8,3;8]" .. - "listring[current_name;main]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,4.85) - -local function get_locked_chest_formspec(pos) +local function get_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = "size[8,9]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. - "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. + "list[nodemeta:" .. spos .. ";default:chest;0,0.3;8,4;]" .. "list[current_player;main;0,4.85;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. - "listring[nodemeta:" .. spos .. ";main]" .. + "listring[nodemeta:" .. spos .. ";default:chest]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) - return formspec + return formspec end -minetest.register_node("default:chest", { - description = "Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, - paramtype2 = "facedir", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), +local function chest_lid_obstructed(pos) + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local def = minetest.registered_nodes[minetest.get_node(above).name] + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def.drawtype == "airlike" or + def.drawtype == "signlike" or + def.drawtype == "torchlike" or + (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted") then + return false + end + return true +end - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", chest_formspec) - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - on_metadata_inventory_move = function(pos, from_list, from_index, +local open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:chest" then + return + end + if not fields.quit then + return + end + local pn = player:get_player_name() + + local pos = open_chests[pn].pos + local sound = open_chests[pn].sound + local swap = open_chests[pn].swap + local node = minetest.get_node(pos) + + open_chests[pn] = nil + for k, v in pairs(open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, + param2 = node.param2 }) + minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) + return true +end) + +function default.register_chest(name, d) + local def = table.copy(d) + def.drawtype = "mesh" + def.visual = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.legacy_facedir_simple = true + def.is_ground_content = false + + if def.protected then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("default:chest", 8*4) + end + def.after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by " .. + meta:get_string("owner") .. ")") + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("default:chest") and + default.can_interact_with_node(player, pos) + end + def.allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return count + end + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not default.can_interact_with_node(clicker, pos) then + return itemstack + end + + minetest.sound_play(def.sound_open, {gain = 0.3, + pos = pos, max_hear_distance = 10}) + if not chest_lid_obstructed(pos) then + minetest.swap_node(pos, + { name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", get_chest_formspec(pos)) + open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function() end + def.on_key_use = function(pos, player) + local secret = minetest.get_meta(pos):get_string("key_lock_secret") + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) + itemstack:set_metadata("") + end + + if secret ~= key_meta:get_string("secret") then + return + end + + minetest.show_formspec( + player:get_player_name(), + "default:chest_locked", + get_chest_formspec(pos) + ) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + minetest.record_protection_violation(pos, pn) + minetest.chat_send_player(pn, "You do not own this chest.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked chest", owner + end + else + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("default:chest", 8*4) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("default:chest") + end + def.on_rightclick = function(pos, node, clicker) + minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, + max_hear_distance = 10}) + if not chest_lid_obstructed(pos) then + minetest.swap_node(pos, { + name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", get_chest_formspec(pos)) + open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + end + + def.on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name() .. " moves stuff in chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. " moves " .. stack:get_name() .. " to chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. " takes " .. stack:get_name() .. " from chest at " .. minetest.pos_to_string(pos)) - end, - on_blast = function(pos) + end + def.on_blast = function(pos) local drops = {} default.get_inventory_drops(pos, "main", drops) drops[#drops+1] = "default:chest" minetest.remove_node(pos) return drops - end, -}) + end -minetest.register_node("default:chest_locked", { - description = "Locked Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, - paramtype2 = "facedir", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, - legacy_facedir_simple = true, - is_ground_content = false, + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = "chest_open.obj" + def_opened.drop = "default:" .. name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = "fixed", + fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, + } + def_opened.can_dig = function() + return false + end + + def_closed.mesh = "cube.obj" + + minetest.register_node("default:" .. name, def_closed) + minetest.register_node("default:" .. name .. "_open", def_opened) + + -- convert old chests to this new variant + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name, + nodenames = {"default:" .. name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + local inv = meta:get_inventory() + local list = inv:get_list("main") + inv:set_list("main", nil) + inv:set_size("default:chest", 8*4) + inv:set_list("default:chest", list) + end + }) +end + + +default.register_chest("chest", { + description = "Chest", + tiles = { "default_chest_wood.png" }, sounds = default.node_sound_wood_defaults(), - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Locked Chest (owned by " .. - meta:get_string("owner") .. ")") - end, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("owner", "") - local inv = meta:get_inventory() - inv:set_size("main", 8 * 4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") and default.can_interact_with_node(player, pos) - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, - to_list, to_index, count, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return count - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return stack:get_count() - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return stack:get_count() - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " moves " .. stack:get_name() .. - " to locked chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes " .. stack:get_name() .. - " from locked chest at " .. minetest.pos_to_string(pos)) - end, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if default.can_interact_with_node(clicker, pos) then - minetest.show_formspec( - clicker:get_player_name(), - "default:chest_locked", - get_locked_chest_formspec(pos) - ) - end - return itemstack - end, - on_blast = function() end, - on_key_use = function(pos, player) - local secret = minetest.get_meta(pos):get_string("key_lock_secret") - local itemstack = player:get_wielded_item() - local key_meta = itemstack:get_meta() - - if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) - itemstack:set_metadata("") - end - - if secret ~= key_meta:get_string("secret") then - return - end - - minetest.show_formspec( - player:get_player_name(), - "default:chest_locked", - get_locked_chest_formspec(pos) - ) - end, - on_skeleton_key_use = function(pos, player, newsecret) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - local name = player:get_player_name() - - -- verify placer is owner of lockable chest - if owner ~= name then - minetest.record_protection_violation(pos, name) - minetest.chat_send_player(name, "You do not own this chest.") - return nil - end - - local secret = meta:get_string("key_lock_secret") - if secret == "" then - secret = newsecret - meta:set_string("key_lock_secret", secret) - end - - return secret, "a locked chest", owner - end, + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, }) +default.register_chest("chest_locked", { + description = "Locked Chest", + tiles = { "default_chest_wood_locked.png" }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = true, +}) local bookshelf_formspec = "size[8,7;]" .. diff --git a/mods/default/sounds/default_chest_close.ogg b/mods/default/sounds/default_chest_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..53ff23d219cec9d3a10778cd797ff6cbde79bd13 GIT binary patch literal 10099 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 oI%2I^rHkG7UHiYQ^0NTEfZvX%Q literal 0 HcmV?d00001 diff --git a/mods/default/sounds/default_chest_open.ogg b/mods/default/sounds/default_chest_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c73c072c05d0b42e5e9ed50e3d7398dcc476fa16 GIT binary patch literal 10578 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 iVWAi&K4LJ(h4fd|)}Lf=h&H zLXT)Oby_pmu656)Y`~XZu7*#Kb4!G4MT>1goOVBpWiV}2FKSRK-QC@|u%qC!dc~Y& zzLs61d_{+CM1p2Nz__cUqocE{p6j=Mc6N54fmoDxPm^{|mw8KwZcBJ!K5tn$lWaGU zYBh#mEPz=jWJ@J{RU=tkP^|y}0JKR&K~xyiWzI#i!!Qs<(JxtGvCM3T^TSO0-&i_h z-{GmQuJfE_l-{oE`T}5=5$C4V3&q&H0!WvEqLgLXY__8{K&+!MG8kioLN@@6 zN>kDk@*aBGOD_RVl&R|knQ6>5Cjg{HdNti|CKb)I1AvErQM3I&FVvh>0Bdbfh?>Um zAmA$iTLe&1C`R-A2rxJ}fDLU}me>LiC%WV=gmA9K@ef4uc|E)2k#quJ)ECCe4HTG& R7=Qo(002ovPDHLkV1m!~wG03N diff --git a/mods/default/textures/default_chest_lock.png b/mods/default/textures/default_chest_lock.png deleted file mode 100644 index 73f46c7864e7878d4724cc166d9035291eee845f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmV;`0V@89P)3qathbYJkPalU4KY$ zo(v(wjJkwUVo50a8i}pw7PnfbP?unvz=vBQjzdT%^Y5WrZN2=?)vE9Nn^kk4O+BxW z&T6L^bts{$4D~S)P}eN%+kNse%wn2hF{)00000 LNkvXXu0mjfS`O4= diff --git a/mods/default/textures/default_chest_side.png b/mods/default/textures/default_chest_side.png deleted file mode 100644 index 44a65a43d3c3f2ba44bceb519a0696e1ba441800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmV--0f_#IP)n`5knO{RcJoOVB!a5-&MFKSRK;In$zuXoa@aHD)h zf@VK%ST=rFCF{3-pn+J3ZcC(oM}}W4WJ@JsV)uan0065=L_t&-(`C+A5`!=dMbXH@ z-MB%3P}BSV*B6mr?&lfJ= zdsUum4#6X1C?EZJP^f8bSOa-|wF`=iC+qn|{rj V3gJ4$MZo|7002ovPDHLkV1iD9pBn%G diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png deleted file mode 100644 index f1a5cb594f4ee6ef23813aeb68ddd38a472c4801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 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 Date: Sun, 13 Nov 2016 16:08:07 +0100 Subject: [PATCH 44/56] TNT: Gunpowder (and tnt.burn) will trigger the on_ignite of nodes The previous behaviour is kept as fallback for compatibility, for when the on_ignite is not defined in the node. --- game_api.txt | 6 ++++-- mods/tnt/init.lua | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/game_api.txt b/game_api.txt index 8b6bf839..887f394e 100644 --- a/game_api.txt +++ b/game_api.txt @@ -312,8 +312,10 @@ TNT API `tnt.burn(position, [nodename])` -^ Ignite TNT at position, nodename isn't required unless already known. - +^ Ignite node at position, triggering its `on_ignite` callback (see fire mod). +If no such callback exists, fallback to turn tnt group nodes to their +"_burning" variant. + nodename isn't required unless already known. To make dropping items from node inventories easier, you can use the following helper function from 'default': diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 9870f891..e5ad5b16 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -260,13 +260,15 @@ end function tnt.burn(pos, nodename) local name = nodename or minetest.get_node(pos).name - local group = minetest.get_item_group(name, "tnt") - if group > 0 then + local def = minetest.registered_nodes[name] + if not def then + return + elseif def.on_ignite then + def.on_ignite(pos) + elseif minetest.get_item_group(name, "tnt") > 0 then minetest.sound_play("tnt_ignite", {pos = pos}) minetest.set_node(pos, {name = name .. "_burning"}) minetest.get_node_timer(pos):start(1) - elseif name == "tnt:gunpowder" then - minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) end end From 519d166ce34d5516b0b20dd86ca0bf5ce5bf658c Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 27 Mar 2017 21:55:53 +0100 Subject: [PATCH 45/56] Stairs: Add snowblock and ice stairs and slabs --- mods/stairs/init.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 835b2193..a88ea014 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -587,3 +587,27 @@ stairs.register_stair_and_slab( "Gold Block Slab", default.node_sound_metal_defaults() ) + +stairs.register_stair_and_slab( + "ice", + "default:ice", + {cracky = 3, puts_out_fire = 1, cools_lava = 1}, + {"default_ice.png"}, + "Ice Stair", + "Ice Slab", + default.node_sound_glass_defaults() +) + +stairs.register_stair_and_slab( + "snowblock", + "default:snowblock", + {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, + {"default_snow.png"}, + "Snow Block Stair", + "Snow Block Slab", + default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.15}, + dug = {name = "default_snow_footstep", gain = 0.2}, + dig = {name = "default_snow_footstep", gain = 0.2} + }), +) From 6737952fbf290e995810cfcb0559c7514738d473 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 1 May 2017 21:23:44 +0200 Subject: [PATCH 46/56] Fix merging mistake (crash in "stairs") --- mods/stairs/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index a88ea014..0ce35218 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -609,5 +609,5 @@ stairs.register_stair_and_slab( footstep = {name = "default_snow_footstep", gain = 0.15}, dug = {name = "default_snow_footstep", gain = 0.2}, dig = {name = "default_snow_footstep", gain = 0.2} - }), + }) ) From 08706313f47075599106d04ad864866c0e50dd39 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Sun, 7 May 2017 17:25:53 +0100 Subject: [PATCH 47/56] Add option to disable lavacooling (#1726) --- minetest.conf.example | 3 +++ mods/default/functions.lua | 25 +++++++++++++------------ settingtypes.txt | 3 +++ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/minetest.conf.example b/minetest.conf.example index 3f20eb77..9393b1a5 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -27,6 +27,9 @@ # Enable flame sound. #flame_sound = true +# Whether lavacooling should be enabled. +#enable_lavacooling = true + # Whether the stuff in initial_stuff should be given to new players #give_initial_stuff = false #initial_stuff = default:pick_steel,default:axe_steel,default:shovel_steel,default:torch 99,default:cobble 99 diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 2268263e..936712ca 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -131,18 +131,19 @@ default.cool_lava = function(pos, node) {pos = pos, max_hear_distance = 16, gain = 0.25}) end -minetest.register_abm({ - label = "Lava cooling", - nodenames = {"default:lava_source", "default:lava_flowing"}, - neighbors = {"group:cools_lava", "group:water"}, - interval = 1, - chance = 2, - catch_up = false, - action = function(...) - default.cool_lava(...) - end, -}) - +if minetest.setting_getbool("enable_lavacooling") ~= false then + minetest.register_abm({ + label = "Lava cooling", + nodenames = {"default:lava_source", "default:lava_flowing"}, + neighbors = {"group:cools_lava", "group:water"}, + interval = 1, + chance = 2, + catch_up = false, + action = function(...) + default.cool_lava(...) + end, + }) +end -- -- optimized helper to put all items in an inventory into a drops list diff --git a/settingtypes.txt b/settingtypes.txt index eeea0bfc..855235c2 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -16,6 +16,9 @@ enable_fire (Fire) bool true # Enable flame sound. flame_sound (Flame sound) bool true +# Enable lavacooling. +enable_lavacooling (Lavacooling) bool true + # If enabled, steel tools, torches and cobblestone will be given to new # players. give_initial_stuff (Give initial items) bool false From a533434b58d836b90fd2435b64b0394e768f0304 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 7 May 2017 08:33:26 +0200 Subject: [PATCH 48/56] Chests: Keep old textures for mod compability Prevents generating ugly looking dummy images for mods that weren't updated yet. --- mods/default/README.txt | 8 ++++---- mods/default/textures/default_chest_front.png | Bin 0 -> 423 bytes mods/default/textures/default_chest_lock.png | Bin 0 -> 469 bytes mods/default/textures/default_chest_side.png | Bin 0 -> 375 bytes mods/default/textures/default_chest_top.png | Bin 0 -> 422 bytes 5 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 mods/default/textures/default_chest_front.png create mode 100644 mods/default/textures/default_chest_lock.png create mode 100644 mods/default/textures/default_chest_side.png create mode 100644 mods/default/textures/default_chest_top.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 8e8541c9..350c4b74 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -136,10 +136,10 @@ BlockMen (CC BY-SA 3.0): default_lava_source_animated.png default_lava_flowing_animated.png default_stick.png - default_chest_front.png - default_chest_lock.png - default_chest_side.png - default_chest_top.png + default_chest_front.png -- Texture kept for mod compability + default_chest_lock.png -- Texture kept for mod compability + default_chest_side.png -- Texture kept for mod compability + default_chest_top.png -- Texture kept for mod compability default_mineral_mese.png default_meselamp.png bubble.png diff --git a/mods/default/textures/default_chest_front.png b/mods/default/textures/default_chest_front.png new file mode 100644 index 0000000000000000000000000000000000000000..85227d8fd636ace9592070a2f7e86df531dc03a8 GIT binary patch literal 423 zcmV;Y0a*TtP)i&K4LJ(h4fd|)}Lf=h&H zLXT)Oby_pmu656)Y`~XZu7*#Kb4!G4MT>1goOVBpWiV}2FKSRK-QC@|u%qC!dc~Y& zzLs61d_{+CM1p2Nz__cUqocE{p6j=Mc6N54fmoDxPm^{|mw8KwZcBJ!K5tn$lWaGU zYBh#mEPz=jWJ@J{RU=tkP^|y}0JKR&K~xyiWzI#i!!Qs<(JxtGvCM3T^TSO0-&i_h z-{GmQuJfE_l-{oE`T}5=5$C4V3&q&H0!WvEqLgLXY__8{K&+!MG8kioLN@@6 zN>kDk@*aBGOD_RVl&R|knQ6>5Cjg{HdNti|CKb)I1AvErQM3I&FVvh>0Bdbfh?>Um zAmA$iTLe&1C`R-A2rxJ}fDLU}me>LiC%WV=gmA9K@ef4uc|E)2k#quJ)ECCe4HTG& R7=Qo(002ovPDHLkV1m!~wG03N literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_lock.png b/mods/default/textures/default_chest_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..73f46c7864e7878d4724cc166d9035291eee845f GIT binary patch literal 469 zcmV;`0V@89P)3qathbYJkPalU4KY$ zo(v(wjJkwUVo50a8i}pw7PnfbP?unvz=vBQjzdT%^Y5WrZN2=?)vE9Nn^kk4O+BxW z&T6L^bts{$4D~S)P}eN%+kNse%wn2hF{)00000 LNkvXXu0mjfS`O4= literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_side.png b/mods/default/textures/default_chest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..44a65a43d3c3f2ba44bceb519a0696e1ba441800 GIT binary patch literal 375 zcmV--0f_#IP)n`5knO{RcJoOVB!a5-&MFKSRK;In$zuXoa@aHD)h zf@VK%ST=rFCF{3-pn+J3ZcC(oM}}W4WJ@JsV)uan0065=L_t&-(`C+A5`!=dMbXH@ z-MB%3P}BSV*B6mr?&lfJ= zdsUum4#6X1C?EZJP^f8bSOa-|wF`=iC+qn|{rj V3gJ4$MZo|7002ovPDHLkV1iD9pBn%G literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a5cb594f4ee6ef23813aeb68ddd38a472c4801 GIT binary patch literal 422 zcmV;X0a^ZuP)nsh*fXFYILEX|{8#G7NJgI1=1NtAU-k#a-k;In$zuXoa@aJiCM zwU1VxfK#S~QIT*zdtp40Y&wEtIDB0)iDE8wS1oK%C}&9`>$iThkYbm5Q>TGSifA}x zPAvL-GKl~H0KZ8@K~xyiWzRpvO*Xn4gj!}X-yqMA^g3&c<+Tw>6G+$>&I~@9(`XF=Y0PBA6xtl!a Date: Sat, 6 May 2017 21:15:34 -0700 Subject: [PATCH 49/56] Fix nil deref issue with people hitting chests too often. --- mods/default/nodes.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c410b213..a1da9216 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1801,11 +1801,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "default:chest" then return end - if not fields.quit then + if not player or not fields.quit then return end local pn = player:get_player_name() + if not open_chests[pn] then + return + end + local pos = open_chests[pn].pos local sound = open_chests[pn].sound local swap = open_chests[pn].swap From c7d558c09ec5d5cd3b52849ad1c209c87124b6e8 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 6 May 2017 22:01:31 -0700 Subject: [PATCH 50/56] Chest open model: UV map fix. The back side had a UV mapping issue which caused the bottom rear part to "shrink" when opened. --- mods/default/models/chest_open.obj | 128 +++++++++++++++-------------- 1 file changed, 67 insertions(+), 61 deletions(-) diff --git a/mods/default/models/chest_open.obj b/mods/default/models/chest_open.obj index a1dcce8d..1bfed076 100644 --- a/mods/default/models/chest_open.obj +++ b/mods/default/models/chest_open.obj @@ -1,4 +1,4 @@ -# Blender v2.76 (sub 0) OBJ File: 'chest_open.blend' +# Blender v2.78 (sub 0) OBJ File: 'chest_open.blend' # www.blender.org mtllib chest_open.mtl o Bottom_Cube.001 @@ -10,30 +10,33 @@ v 0.500000 -0.500000 0.500000 v 0.500000 0.187500 0.500000 v 0.500000 -0.500000 -0.500000 v 0.500000 0.187500 -0.500000 -vt 0.750000 0.343750 -vt 0.500000 0.343750 -vt 0.500000 0.000000 -vt 0.750000 0.000000 -vt 0.250000 0.343750 -vt 0.250000 0.000000 -vt 0.000000 0.343750 -vt 0.000000 0.000000 -vt 0.750000 0.875000 -vt 0.500000 0.875000 -vt 0.500000 0.500000 -vt 0.750000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.000000 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 -1.000000 -vn 1.000000 0.000000 0.000000 -vn 0.000000 0.000000 1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.000000 1.000000 0.000000 +vt 0.7500 0.3438 +vt 0.5000 0.3438 +vt 0.5000 0.0000 +vt 0.7500 0.0000 +vt 0.2500 0.3438 +vt 0.2500 0.0000 +vt 0.0000 0.3438 +vt 0.0000 0.0000 +vt 0.7500 0.8438 +vt 0.5000 0.8438 +vt 0.5000 0.5000 +vt 0.7500 0.5000 +vt 0.2500 0.5000 +vt 0.2500 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.7500 -0.0000 +vt 0.7500 0.5000 +vt 1.0000 0.5000 +vt 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Bottom_Cube.001_None usemtl None s off f 2/1/1 4/2/1 3/3/1 1/4/1 @@ -41,42 +44,45 @@ f 4/2/2 8/5/2 7/6/2 3/3/2 f 8/5/3 6/7/3 5/8/3 7/6/3 f 6/9/4 2/10/4 1/11/4 5/12/4 f 1/13/5 3/14/5 7/15/5 5/16/5 -f 6/4/6 8/12/6 4/17/6 2/18/6 +f 6/17/6 8/18/6 4/19/6 2/20/6 o Top_Cube.002 -v -0.499900 0.187501 0.499900 -v -0.499900 0.408471 0.720970 -v -0.499900 0.894607 -0.207108 -v -0.499900 1.115578 0.013863 -v 0.499900 0.187501 0.499900 -v 0.499900 0.408471 0.720970 -v 0.499900 0.894607 -0.207108 -v 0.499900 1.115578 0.013863 -vt 0.750000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.343750 -vt 0.750000 0.343750 -vt 0.250000 0.500000 -vt 0.250000 0.343750 -vt 0.000000 0.500000 -vt 0.000000 0.343750 -vt 0.750000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 0.843750 -vt 0.750000 0.843750 -vt 1.000000 0.500000 -vt 1.000000 1.000000 -vt 0.250000 1.000000 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.707100 -0.707100 -vn 1.000000 0.000000 0.000000 -vn 0.000000 -0.707100 0.707100 -vn 0.000000 -0.707100 -0.707100 -vn 0.000000 0.707100 0.707100 +v -0.500000 0.187501 0.499999 +v -0.500000 0.408471 0.720970 +v -0.500000 0.894607 -0.207108 +v -0.500000 1.115578 0.013863 +v 0.500000 0.187501 0.499999 +v 0.500000 0.408471 0.720970 +v 0.500000 0.894607 -0.207108 +v 0.500000 1.115578 0.013863 +vt 0.7500 0.5000 +vt 0.5000 0.5000 +vt 0.5000 0.3438 +vt 0.7500 0.3438 +vt 0.2500 0.5000 +vt 0.2500 0.3438 +vt 0.0000 0.5000 +vt 0.0000 0.3438 +vt 0.7500 1.0000 +vt 0.5000 1.0000 +vt 0.5000 0.8438 +vt 0.7500 0.8438 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.7500 1.0000 +vt 0.7500 0.5000 +vt 0.2500 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +g Top_Cube.002_None usemtl None s off -f 10/19/7 12/20/7 11/21/7 9/22/7 -f 12/20/8 16/23/8 15/24/8 11/21/8 -f 16/23/9 14/25/9 13/26/9 15/24/9 -f 14/27/10 10/28/10 9/29/10 13/30/10 -f 9/31/11 11/32/11 15/27/11 13/19/11 -f 14/33/12 16/23/12 12/20/12 10/28/12 +f 10/21/7 12/22/7 11/23/7 9/24/7 +f 12/22/8 16/25/8 15/26/8 11/23/8 +f 16/25/9 14/27/9 13/28/9 15/26/9 +f 14/29/10 10/30/10 9/31/10 13/32/10 +f 9/33/11 11/34/11 15/35/11 13/36/11 +f 14/37/12 16/25/12 12/22/12 10/30/12 From 5bd44c21efb71fa6f0850ff2fe1e76af7ce42b3a Mon Sep 17 00:00:00 2001 From: cx384 Date: Sat, 13 May 2017 12:49:04 +0200 Subject: [PATCH 51/56] Change the selection_box of bush stems (#1733) This is needed because you can't place a node above a bush stem when you are pointing at the bush stem. --- mods/default/nodes.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index a1da9216..76e88afd 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1320,7 +1320,7 @@ minetest.register_node("default:bush_stem", { sounds = default.node_sound_wood_defaults(), selection_box = { type = "fixed", - fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.54, 7 / 16}, + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, }, }) @@ -1391,7 +1391,7 @@ minetest.register_node("default:acacia_bush_stem", { sounds = default.node_sound_wood_defaults(), selection_box = { type = "fixed", - fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.54, 7 / 16}, + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, }, }) From 63b3542d00805bf976fc809f2e8f092ea1f5c942 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Mon, 8 May 2017 12:47:53 +0100 Subject: [PATCH 52/56] Chests: Revert inventory name Revert the new 'default:game' inventory back to the old 'main' and use the lbm to restore the contents of the chest. Change the name of the conversion LBM to ensure it is run again on already converted chests. --- mods/default/nodes.lua | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 76e88afd..7fa8d2ca 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1773,10 +1773,10 @@ local function get_chest_formspec(pos) default.gui_bg .. default.gui_bg_img .. default.gui_slots .. - "list[nodemeta:" .. spos .. ";default:chest;0,0.3;8,4;]" .. + "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. "list[current_player;main;0,4.85;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. - "listring[nodemeta:" .. spos .. ";default:chest]" .. + "listring[nodemeta:" .. spos .. ";main]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) return formspec @@ -1842,7 +1842,7 @@ function default.register_chest(name, d) meta:set_string("infotext", "Locked Chest") meta:set_string("owner", "") local inv = meta:get_inventory() - inv:set_size("default:chest", 8*4) + inv:set_size("main", 8*4) end def.after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) @@ -1853,7 +1853,7 @@ function default.register_chest(name, d) def.can_dig = function(pos,player) local meta = minetest.get_meta(pos); local inv = meta:get_inventory() - return inv:is_empty("default:chest") and + return inv:is_empty("main") and default.can_interact_with_node(player, pos) end def.allow_metadata_inventory_move = function(pos, from_list, from_index, @@ -1939,12 +1939,12 @@ function default.register_chest(name, d) local meta = minetest.get_meta(pos) meta:set_string("infotext", "Chest") local inv = meta:get_inventory() - inv:set_size("default:chest", 8*4) + inv:set_size("main", 8*4) end def.can_dig = function(pos,player) local meta = minetest.get_meta(pos); local inv = meta:get_inventory() - return inv:is_empty("default:chest") + return inv:is_empty("main") end def.on_rightclick = function(pos, node, clicker) minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, @@ -2007,16 +2007,18 @@ function default.register_chest(name, d) -- convert old chests to this new variant minetest.register_lbm({ label = "update chests to opening chests", - name = "default:upgrade_" .. name, + name = "default:upgrade_" .. name .. "_v2", nodenames = {"default:" .. name}, action = function(pos, node) local meta = minetest.get_meta(pos) meta:set_string("formspec", nil) local inv = meta:get_inventory() - local list = inv:get_list("main") - inv:set_list("main", nil) - inv:set_size("default:chest", 8*4) - inv:set_list("default:chest", list) + local list = inv:get_list("default:chest") + if list then + inv:set_size("main", 8*4) + inv:set_list("main", list) + inv:set_list("default:chest", nil) + end end }) end From 758d5010b8a6555fc7faedfb06b3d7c0cf3d0c4a Mon Sep 17 00:00:00 2001 From: ezhh Date: Mon, 10 Apr 2017 02:23:00 +0100 Subject: [PATCH 53/56] Fire: Disable fire by default in multiplayer --- mods/fire/init.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index a9ceb9ea..2dbf5dfd 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -292,9 +292,14 @@ minetest.register_abm({ local fire_enabled = minetest.setting_getbool("enable_fire") if fire_enabled == nil then - -- New setting not specified, check for old setting. - -- If old setting is also not specified, 'not nil' is true. - fire_enabled = not minetest.setting_getbool("disable_fire") + -- enable_fire setting not specified, check for disable_fire + local fire_disabled = minetest.setting_getbool("disable_fire") + if fire_disabled == nil then + -- Neither setting specified, check whether singleplayer + fire_enabled = minetest.is_singleplayer() + else + fire_enabled = not fire_disabled + end end if not fire_enabled then From d104b9b10ffc2ee2dd16bd2f2a6aaa5296913ebc Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Mon, 8 May 2017 15:29:07 -0400 Subject: [PATCH 54/56] Chest: Redo new chests to use single-tile textures where possible This keeps the filenames the same, but adds a new "inside" double texture for the open chest. Use regular drawtype for closed chest and delete the "cube.obj" model. X-flip the right-side texture for the closed chest. --- mods/default/README.txt | 10 +- mods/default/models/chest_open.obj | 151 ++++++++---------- mods/default/models/cube.obj | 38 ----- mods/default/nodes.lua | 24 ++- .../default/textures/default_chest_inside.png | Bin 0 -> 102 bytes mods/default/textures/default_chest_top.png | Bin 422 -> 423 bytes mods/default/textures/default_chest_wood.png | Bin 2320 -> 0 bytes .../textures/default_chest_wood_locked.png | Bin 2418 -> 0 bytes 8 files changed, 97 insertions(+), 126 deletions(-) delete mode 100644 mods/default/models/cube.obj create mode 100644 mods/default/textures/default_chest_inside.png delete mode 100644 mods/default/textures/default_chest_wood.png delete mode 100644 mods/default/textures/default_chest_wood_locked.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 350c4b74..8af65a9c 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -136,10 +136,10 @@ BlockMen (CC BY-SA 3.0): default_lava_source_animated.png default_lava_flowing_animated.png default_stick.png - default_chest_front.png -- Texture kept for mod compability - default_chest_lock.png -- Texture kept for mod compability - default_chest_side.png -- Texture kept for mod compability - default_chest_top.png -- Texture kept for mod compability + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png default_mineral_mese.png default_meselamp.png bubble.png @@ -154,7 +154,7 @@ sofar (CC BY-SA 3.0): default_aspen_tree default_aspen_tree_top, derived from default_pine_tree_top (by paramat) default_aspen_wood, derived from default_pine_wood (by paramat) - default_chest_wood, default_chest_wood_locked derived from default_chest_* textures by BlockMen + default_chest_inside sofar (WTFPL): default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel diff --git a/mods/default/models/chest_open.obj b/mods/default/models/chest_open.obj index 1bfed076..72ba175a 100644 --- a/mods/default/models/chest_open.obj +++ b/mods/default/models/chest_open.obj @@ -1,88 +1,79 @@ -# Blender v2.78 (sub 0) OBJ File: 'chest_open.blend' +# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' # www.blender.org -mtllib chest_open.mtl -o Bottom_Cube.001 -v -0.500000 -0.500000 0.500000 -v -0.500000 0.187500 0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.187500 -0.500000 -v 0.500000 -0.500000 0.500000 -v 0.500000 0.187500 0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.187500 -0.500000 -vt 0.7500 0.3438 -vt 0.5000 0.3438 -vt 0.5000 0.0000 -vt 0.7500 0.0000 -vt 0.2500 0.3438 -vt 0.2500 0.0000 -vt 0.0000 0.3438 -vt 0.0000 0.0000 -vt 0.7500 0.8438 -vt 0.5000 0.8438 -vt 0.5000 0.5000 -vt 0.7500 0.5000 -vt 0.2500 0.5000 -vt 0.2500 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.5000 -vt 0.7500 -0.0000 -vt 0.7500 0.5000 -vt 1.0000 0.5000 -vt 1.0000 0.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 1.0000 0.0000 0.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -g Bottom_Cube.001_None -usemtl None -s off -f 2/1/1 4/2/1 3/3/1 1/4/1 -f 4/2/2 8/5/2 7/6/2 3/3/2 -f 8/5/3 6/7/3 5/8/3 7/6/3 -f 6/9/4 2/10/4 1/11/4 5/12/4 -f 1/13/5 3/14/5 7/15/5 5/16/5 -f 6/17/6 8/18/6 4/19/6 2/20/6 -o Top_Cube.002 -v -0.500000 0.187501 0.499999 +o Top_Cube.002_None_Top_Cube.002_None_bottom v -0.500000 0.408471 0.720970 -v -0.500000 0.894607 -0.207108 v -0.500000 1.115578 0.013863 -v 0.500000 0.187501 0.499999 -v 0.500000 0.408471 0.720970 -v 0.500000 0.894607 -0.207108 +v -0.500000 0.894607 -0.207108 +v -0.500000 0.187501 0.499999 v 0.500000 1.115578 0.013863 -vt 0.7500 0.5000 -vt 0.5000 0.5000 -vt 0.5000 0.3438 -vt 0.7500 0.3438 -vt 0.2500 0.5000 -vt 0.2500 0.3438 -vt 0.0000 0.5000 -vt 0.0000 0.3438 -vt 0.7500 1.0000 -vt 0.5000 1.0000 -vt 0.5000 0.8438 -vt 0.7500 0.8438 +v 0.500000 0.408471 0.720970 +v 0.500000 0.187501 0.499999 +v 0.500000 0.894607 -0.207108 +v -0.500000 0.187500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 0.0000 0.6875 +vt 1.0000 1.0000 +vt 0.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.6875 +vt 0.0000 0.6875 +vt 0.0000 0.0000 vt 1.0000 0.5000 vt 1.0000 1.0000 -vt 0.7500 1.0000 -vt 0.7500 0.5000 -vt 0.2500 1.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.7071 -0.7071 -vn 1.0000 0.0000 0.0000 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 -0.7071 -0.7071 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 vn 0.0000 0.7071 0.7071 -g Top_Cube.002_None -usemtl None +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 1.0000 -0.0000 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top s off -f 10/21/7 12/22/7 11/23/7 9/24/7 -f 12/22/8 16/25/8 15/26/8 11/23/8 -f 16/25/9 14/27/9 13/28/9 15/26/9 -f 14/29/10 10/30/10 9/31/10 13/32/10 -f 9/33/11 11/34/11 15/35/11 13/36/11 -f 14/37/12 16/25/12 12/22/12 10/30/12 +f 6/1/1 5/2/1 2/3/1 1/4/1 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom +f 11/5/2 10/6/2 14/7/2 13/8/2 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left +f 1/9/3 2/10/3 3/11/3 4/12/3 +f 5/13/4 6/1/4 7/14/4 8/15/4 +f 4/12/3 9/16/3 10/17/3 11/18/3 +f 12/19/4 7/14/4 13/8/4 14/20/4 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back +f 6/21/5 1/9/5 4/12/5 7/22/5 +f 7/22/6 4/12/6 11/18/6 13/23/6 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front +f 2/10/7 5/24/7 8/25/7 3/11/7 +f 9/16/8 12/26/8 14/27/8 10/17/8 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside +f 4/28/9 3/29/9 8/30/9 7/31/9 +f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/mods/default/models/cube.obj b/mods/default/models/cube.obj deleted file mode 100644 index 7bbec5de..00000000 --- a/mods/default/models/cube.obj +++ /dev/null @@ -1,38 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'chest_close.blend' -# www.blender.org -mtllib chest_close.mtl -o Cube_Cube.001 -v -0.500000 -0.500000 0.500000 -v -0.500000 0.500000 0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.500000 -0.500000 -v 0.500000 -0.500000 0.500000 -v 0.500000 0.500000 0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.500000 -0.500000 -vt 0.750000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 -0.000000 -vt 0.750000 0.000000 -vt 0.250000 0.500000 -vt 0.250000 0.000000 -vt 0.000000 0.500000 -vt -0.000000 0.000000 -vt 0.750000 1.000000 -vt 0.500000 1.000000 -vt 0.250000 1.000000 -vt -0.000000 1.000000 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 -1.000000 -vn 1.000000 0.000000 0.000000 -vn 0.000000 0.000000 1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.000000 1.000000 0.000000 -usemtl None -s off -f 2/1/1 4/2/1 3/3/1 1/4/1 -f 4/2/2 8/5/2 7/6/2 3/3/2 -f 8/5/3 6/7/3 5/8/3 7/6/3 -f 6/9/4 2/10/4 1/2/4 5/1/4 -f 1/5/5 3/11/5 7/12/5 5/7/5 -f 6/11/6 8/5/6 4/2/6 2/10/6 diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 7fa8d2ca..be87dde1 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1999,7 +1999,11 @@ function default.register_chest(name, d) return false end - def_closed.mesh = "cube.obj" + def_closed.mesh = nil + def_closed.drawtype = nil + def_closed.tiles[6] = def.tiles[5] -- swap textures around for "normal" + def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh + def_closed.tiles[3] = def.tiles[3].."^[transformFX" minetest.register_node("default:" .. name, def_closed) minetest.register_node("default:" .. name .. "_open", def_opened) @@ -2026,7 +2030,14 @@ end default.register_chest("chest", { description = "Chest", - tiles = { "default_chest_wood.png" }, + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + "default_chest_inside.png" + }, sounds = default.node_sound_wood_defaults(), sound_open = "default_chest_open", sound_close = "default_chest_close", @@ -2035,7 +2046,14 @@ default.register_chest("chest", { default.register_chest("chest_locked", { description = "Locked Chest", - tiles = { "default_chest_wood_locked.png" }, + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_lock.png", + "default_chest_inside.png" + }, sounds = default.node_sound_wood_defaults(), sound_open = "default_chest_open", sound_close = "default_chest_close", diff --git a/mods/default/textures/default_chest_inside.png b/mods/default/textures/default_chest_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..5f7b6b13270890618c6a6332eee1c6c721b91f1b GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!2~3yyw0Buq;x%9978NlCvUkPo}j=vVadU` z_{Ppg7lT!aA;@D3{h6xK;WWK5B?*(dP@O1TaS?83{1OQEB B9=-qo literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png index f1a5cb594f4ee6ef23813aeb68ddd38a472c4801..f4a92ee07edb9c3b6b8e33320082ca222656c252 100644 GIT binary patch delta 221 zcmV<303!dU1E&L!(tp57L_t&-(`C;`5`!=d1<=Ud#+VL)(9;{F-v4S5>u9BUqmjN= ztG_z=m!_$YS>xB6@`d2Dm~*QmZ>?0YN4Nl48>7ad?;mD^aEM~|wv^Hen7kt#nUg7N zMUo0Bt_bG@8*yu81rTQlrBUHlgXNs>_yV7_iU;~U#ufeyf9G9*?MPz z0o9fhvOO%pJc8w6uA(SPgh}E6085zG)JMpLyR~QMoRA4!l76q+<}R{XhQ$ XTl@{es#0}<00000NkvXXu0mjfU?gjW delta 220 zcmV<203-jW1EvFz(tp26L_t&-(`C;`5`!=d1<=Ud#x@-Sp``af>iw@4u|_M+8;$g} znAh1|+qOC7t!q}*8^N)JbF1TEsZ@ACxB^)kqqdv%`e{}O$2eghODU~^$p^xTd6}_J zq?wT7hHy!-5%*5k07;He85Qj`SkC#LPw>s^n2;z6L$lqy5LGhVm*|+2APUuVw%J=? zK(*zB?2ZU7AXowBD$BA$7$gn=u#{;{9YP`ey}Nktg-q#`^mpsWaVQ>rUliwj{`?_ z;040~73mOAI|Q2sp>LeibaO8IQuno1m4n)+_BnJ&TK7&IK#g`P^?qxuZ+*A--Oh^_ z&bEAs9|`c2A3et)beYZ?vX&Hn9ghyG`090j77)4Cen!o=269B&Z>>0+1 zqR4anKmic=3L4F#Xz-+i5EA7HT-Ref9Iz-XFTe5*02iLPpHb{n7CFA^@VaUGO?pD$ zxDwA5xKaY(%7EX${vH6YU%K``9sb1&XFCT33LZH%LY&zGz#4-#nk>tyYmF;ieB}W! zo2Qgz38>!CI8od`a0pJGU^GlRN7Wi@EJ}IAafBzme)ElO_~4WM9zTkG9zPY}`y+-& z@!H}C9#I(Hg@60Xr<;p_EX$GdB+W)<`M2{n;)>KI@GX zd5)ZnI58O$_yL~RIjd<~;xI({K7n)rh^6G?+jq#ayvLVC4g^fLM)!ure4i)` zsOq}6VT`418;mxjSq1>?%A#a48B^63tt-m1qAW|Mx#^93w!4pxBxPA)ti`Ll=-J<& z5`+Otc~}e9YMQ1&2+^k$z^iY3#H(+7^#3b@K@>CD8e(jBD8~^T989UJn!48HMcD(I zw#8TrMz5?Gjj;|*+cgwxHF=?_>+YMTY1rBt)3$!Ms4Lma1<=)jZ=FA}OfiFP!R<1R zG|y36354GyI*5_-oHC@`azyQf4awKMM<8O z6je!*d=76duIuu?f_D{gh7DveKawDx_A?StJiK2J9DBaVl+(fm0~!I zIjP29h<|npmoDGgj01M3GwvICG`68>G{!bqYca-PjHRwM+87++Af?NAoE$SUPJ;ej zUY2BefhQ$Oc}VFZrN(t#nnqxZMHB_Q(^U~m;)vm3fDjH@R*+={(v|puhwHjX_ip?w z%{EvBWy5?i#}#5(u}$B{O=HnoW3)kfk|d6ip5)g4Dguf|aypKd6+XjggYhJ$u}ILf z3?1g((Z_XNYP~u@ts9~sz8?e@R5ZHU4UYb|jY+!H>DHy8o8 z?(CwR94Wd57HNvH7U{Z3PaY}uT@*~GbFSY!=-*$zxkDrh#^YiC%~8yutwGYIiD@ji z?yPQbZ*PywR}7=k2%|NwlsL;`Y;>1?o|MFKgm7G%*0Q@l-JAo$pleSDvl(SsA%s9U z4n`X&E6Tc|F%@;K8IOkuA&wnVda|1%78%p&9Hl&j^a+$$MMY&s@Wu03Q?97EZD_5z%SK0&Yl1Lh zmR0>Aw6-3wE*~F8lE+U4C^cj>I>Z~SHu!-e3<5mqArEP;ZFuYQPLB_L!8e~ihj7I) zJt8j(s#5oJ0Kj~nQdJcn+}dCStjos_@h2u@eC791VB41QXxJTcX)~6RtGDlvl`E>8 zW;s&2_ohdD_vSwODJZO5MwK z%9F^!fF!Pg*=8KDE+1D)5l6@I4^DjE|MPDFc>JLWwXSKFgN?CzphwDqhWtjD?MO^KdJ}Z-d%<7?*5dkH|T9=S>9s~ZMAKSH3sQ< z%w{w8_BQyxz`A_=FdWlG%6yS_LdsGTJgNs|d4W(e$ zK~!ko?U~7s9aj~`e|78DTyN;-c<#iG69b7woH&3I1{v5PHh~o@{sAP!|H2kFSujYf zkdjCN77-+|OoDKbWhZeG5AodHenZXo-YORLx?Xo0q`-R!q)@A;Qhn#%d+r&&?>y`5 z>EjKb;YR}e;JeS#3v9;I8OA6oRa4g*r5k#I0O3%S6#!*X5riS*q~cG1`51t&pIK)Z zyX0Ah=eq#-o(r{Nme)AaLI{cL2yEM7*zYmR4ZnKnZ2(R`aezVOQREq(+u~JScbjyC zz_KNdEwH5oz?MF*ymk?Q*DhTBw+?^y^zqgKz6*~Y9w64&05Dpkv?5J2s!Cx?8_#tB zm`oFjq5#~^&@gs6(6jLO?_5Je%5bh^#grslnmw>tbF^7!0gAI}@m z--%ZS&vyueU=RMSckiq&0@5@?%Ke-;cz{%E019oW%91qC5th~7ic&}^xqE+uJezbz z@+?D+2J9OR@jV~MX`NL!4N(x_dLF*C0f?mJ!@KuL)2zc6c?S55)&`#%pX|Ud?SO07 zKgO!YT#iDdBe5)joG%FAxh`2=P?aUV?=$H2c>K|jKfKl6!sCw~rtjNqZjC950@w2h z1D~?0IvZLWnx;l8O_F9@yOS&;XgFjv8nX3ZLZ08jab2P)q%6t>-WZyuK`TX?W!$_q zS)Bts*FgwDl4c0e=BaH%RVj+RU^E(1RtBX?ilU?_3dWi4jNISYLWPo|DAC5?RBiNZ zZH@5*AJ=s-28>bEb&U|BODTX?U;lttU;p60R|NeqVzkyroAywaC3x^)OjTA?l_JZF z4p27@+8EGkVMQynv8bE2p%|mcaz$0O-_&)@+S-t&@!Cag$z~>iwhnyd)V_I&X-orl zn{gyrhU+-k(jg3evaBEseH6E)-@$cGK0Iojqe`-(Buz5<{g^n4cHMTj#?5K>ZvE&Ho;!84!>4&c zmKNk?K^%VqZw$6=^YWV?t}X&jKXH=d$M#c|C3#VxwP_1ZtvW|+cYtYfmn6v?n;K&bT5Gg6RFy($jU_Ckv>6WLT}Fnn z-@VIF{^EZb>r~R+FJLr z(xxLr+j+P1v2B}5Ee=qrn$Y(#jv)$zUEcv6iE($d*87uBhYXaBWvzf9enNC`~?|a?N zcd4Q^LWq?TA?vd)hXtSUN3KGTKmFuk`k_sc7kFMvT6AO4%&D~_Z5-LYx1DWLv%r7n z>?w>c7E;{QG)C{)Lo1Uj{2*kKmK_mVdLFQ>9`A=XCl3es-hf^&p0`GgQ5whdi2@hb zaXY-xnm=D&@c6(JeCeqZ2wUu$M`U?US*VT&08FO|Wm)px?G;AAvU&`kC+X%a?w`BL^djq999iZrz-9_?x$G^Y&jeE{7q~ zaj+~4Y44av_#SDRp{j}?2pElq47X}v^MAJs{Nm-;=OH`g(4j-T@XcrbV})$#8nCP$ zKl6oQR~xpUD_5>?^ypE}pFd9+hCKhw5z?$A^z822^A}q>{M_k-oz3kvvaG;pMWqyR z7|x}1yEkV}!p>jZTullrtH&QZ_6T2o@(6X)P*nx5y!k%s>+76*@kb2f2=C+z#9_eM zryuSxFTZhRA*QN^Z#{pkv)vJ+N|7Y(JR*#IqQLLw5$7)6T%7}!)#D#ryN;u`hp z{(wO*jD~CYu7?-+JTr!O-fa(X=7|#=f8^NSc|@QX z4SL-?Vw$8(rgzD*jE}CaPzx-p$D=S{ZEb)h1bLS5*a44se*bg6arTGwdLgg=?8lsb zY=lw@r4(6NFqtjzlO*NAc)WKWVGPC?%0hMHI@giNUXM7cfXQkcu&f?;q(iS4Qz_ly zkM8ri^xBI6eE!%z%BsT5iH%M*MOEx-gOll`tNhxSj)!QYQCfF;!?!X^8WFv%yE#w}2?^eF6jqV?f{-t?@+EH+qcEGZFd~;)qOP39U;T&(< zSliPjrS{ANOjC1rb1_fY*c$WEbvoN=nssZ+IVo$J2BS67ahOadY;Labe}QH7xaYfA zLXgZ7rn3Yo1k!PEcXW@cYX55Ue2;#=hvzM9`<_c(H;iWwsH&=yyjp803d*8H%^6}G zM+hNs9cOh8SXPhMrbbv6d0sFX&+t4K$ngUYDMS|yN^5M}rm6pN_-d`m<^$E8YgVPE kn6uJPUd;dJ0ZTrA2c9F9I4GPwU;qFB07*qoM6N<$f Date: Wed, 17 May 2017 20:56:39 +0200 Subject: [PATCH 55/56] Remove set_inventory_formspec in default, remove delay in sfinv --- mods/creative/inventory.lua | 10 ++++------ mods/default/player.lua | 5 ----- mods/sfinv/api.lua | 4 +--- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 1363e294..0e1d813e 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -33,16 +33,14 @@ function creative.init_creative_inventory(player) end, }, player_name) - creative.update_creative_inventory(player_name, minetest.registered_items) + return player_inventory[player_name] end function creative.update_creative_inventory(player_name, tab_content) local creative_list = {} + local inv = player_inventory[player_name] or + creative.init_creative_inventory(minetest.get_player_by_name(player_name)) local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) - local inv = player_inventory[player_name] - if not inv then - creative.init_creative_inventory(minetest.get_player_by_name(player_name)) - end for name, def in pairs(tab_content) do if not (def.groups.not_in_creative_inventory == 1) and @@ -161,7 +159,7 @@ function creative.register_tab(name, title, items) end minetest.register_on_joinplayer(function(player) - creative.init_creative_inventory(player) + creative.update_creative_inventory(player:get_player_name(), minetest.registered_items) end) creative.register_tab("all", "All", minetest.registered_items) diff --git a/mods/default/player.lua b/mods/default/player.lua index cd89a24c..0a2078d6 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -95,11 +95,6 @@ minetest.register_on_joinplayer(function(player) default.player_set_model(player, "character.b3d") player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) - -- set GUI - if not (creative and creative.is_enabled_for - and creative.is_enabled_for(player:get_player_name())) then - player:set_inventory_formspec(default.gui_survival_form) - end player:hud_set_hotbar_image("gui_hotbar.png") player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") end) diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index ff6433b9..bd6de1ed 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -129,9 +129,7 @@ end minetest.register_on_joinplayer(function(player) if sfinv.enabled then - minetest.after(0.5, function() - sfinv.set_player_inventory_formspec(player) - end) + sfinv.set_player_inventory_formspec(player) end end) From e523c3a2965afe76b9102b67992e15fafba1594a Mon Sep 17 00:00:00 2001 From: theFox6 Date: Sat, 20 May 2017 14:32:52 +0200 Subject: [PATCH 56/56] Default: Shorter and better ABMs (#1739) Action of some abm's call functions directly, instead of calling the function inside a function. --- mods/default/functions.lua | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 936712ca..6d93f428 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -139,9 +139,7 @@ if minetest.setting_getbool("enable_lavacooling") ~= false then interval = 1, chance = 2, catch_up = false, - action = function(...) - default.cool_lava(...) - end, + action = default.cool_lava, }) end @@ -224,9 +222,7 @@ minetest.register_abm({ neighbors = {"group:sand"}, interval = 12, chance = 83, - action = function(...) - default.grow_cactus(...) - end + action = default.grow_cactus }) minetest.register_abm({ @@ -235,9 +231,7 @@ minetest.register_abm({ neighbors = {"default:dirt", "default:dirt_with_grass"}, interval = 14, chance = 71, - action = function(...) - default.grow_papyrus(...) - end + action = default.grow_papyrus })