From f600a9f645af40d22c8eb7c17aff89507b71816e Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 15 Jan 2016 18:50:32 -0800 Subject: [PATCH 01/48] New mesh door models, and extensive door API This patch replaces the default door nodes with a new mesh model and nodes. Two new models were added that are 2 blocks high. One for left-hinge and one for right-hinge doors. This allows us to make a single texture fit on both models. The alternative would have been 1 model and 2 unmapped textures, which is more work for mod developers. Doors work exactly like the old doors, including ownership, breaking doors, opening and closing. Under the hood, we can prevent the top part of the door from being obstructed by placing an invisible node. This prevents liquids from flowing through doors or people placing sand or other blocks in the top half. The door code automatically places and removes these as needed. Metadata is used to store door state, just like the old version. A doors API is added, it allows mods to use the API to open/close or toggle door states without worrying about sounds, permissions and other details. This is intended for e.g. mesecons. This API allows mods to manipulate or inspect doors for players or for themselves. In-game old door nodes are automatically converted using an ABM and preserve ownership and orientation and state. TNT blows up all doors and trapdoors except for the steel ones, who can survive a blast. We return an itemstack in on_blast(), which requires a TNT API patch which is also pending. We enable backface culling for most of these doors, as this gives the identical visual appearance that the old doors had. In the case of the glass door, there's a slight twist. The texture files used by the new doors have new names that do not conflict with previous texture file names to avoid texture pack conflicts. Thanks to red-001 for some of the conversion code, cleanups, and extra textures. --- game_api.txt | 50 +- mods/doors/README.txt | 17 +- mods/doors/init.lua | 766 +++++++++--------- mods/doors/models/door_a.obj | 40 + mods/doors/models/door_b.obj | 40 + mods/doors/textures/doors_brown.png | Bin 109 -> 0 bytes mods/doors/textures/doors_door_glass.png | Bin 0 -> 3064 bytes .../textures/doors_door_obsidian_glass.png | Bin 0 -> 2988 bytes mods/doors/textures/doors_door_steel.png | Bin 0 -> 1099 bytes mods/doors/textures/doors_door_wood.png | Bin 0 -> 1662 bytes mods/doors/textures/doors_glass_a.png | Bin 158 -> 0 bytes mods/doors/textures/doors_glass_b.png | Bin 158 -> 0 bytes mods/doors/textures/doors_glass_side.png | Bin 82 -> 0 bytes mods/doors/textures/doors_grey.png | Bin 105 -> 0 bytes .../{doors_glass.png => doors_item_glass.png} | Bin ...lass.png => doors_item_obsidian_glass.png} | Bin mods/doors/textures/doors_item_steel.png | Bin 0 -> 132 bytes .../{doors_wood.png => doors_item_wood.png} | Bin .../doors/textures/doors_obsidian_glass_a.png | Bin 128 -> 0 bytes .../doors/textures/doors_obsidian_glass_b.png | Bin 128 -> 0 bytes .../textures/doors_obsidian_glass_side.png | Bin 82 -> 0 bytes mods/doors/textures/doors_steel.png | Bin 132 -> 0 bytes mods/doors/textures/doors_steel_a.png | Bin 273 -> 0 bytes mods/doors/textures/doors_steel_b.png | Bin 260 -> 0 bytes mods/doors/textures/doors_wood_a.png | Bin 294 -> 0 bytes mods/doors/textures/doors_wood_b.png | Bin 291 -> 0 bytes 26 files changed, 513 insertions(+), 400 deletions(-) create mode 100644 mods/doors/models/door_a.obj create mode 100644 mods/doors/models/door_b.obj delete mode 100644 mods/doors/textures/doors_brown.png create mode 100644 mods/doors/textures/doors_door_glass.png create mode 100644 mods/doors/textures/doors_door_obsidian_glass.png create mode 100644 mods/doors/textures/doors_door_steel.png create mode 100644 mods/doors/textures/doors_door_wood.png delete mode 100644 mods/doors/textures/doors_glass_a.png delete mode 100644 mods/doors/textures/doors_glass_b.png delete mode 100644 mods/doors/textures/doors_glass_side.png delete mode 100644 mods/doors/textures/doors_grey.png rename mods/doors/textures/{doors_glass.png => doors_item_glass.png} (100%) rename mods/doors/textures/{doors_obsidian_glass.png => doors_item_obsidian_glass.png} (100%) create mode 100644 mods/doors/textures/doors_item_steel.png rename mods/doors/textures/{doors_wood.png => doors_item_wood.png} (100%) delete mode 100644 mods/doors/textures/doors_obsidian_glass_a.png delete mode 100644 mods/doors/textures/doors_obsidian_glass_b.png delete mode 100644 mods/doors/textures/doors_obsidian_glass_side.png delete mode 100644 mods/doors/textures/doors_steel.png delete mode 100644 mods/doors/textures/doors_steel_a.png delete mode 100644 mods/doors/textures/doors_steel_b.png delete mode 100644 mods/doors/textures/doors_wood_a.png delete mode 100644 mods/doors/textures/doors_wood_b.png diff --git a/game_api.txt b/game_api.txt index 774bd1d1..7395f3b4 100644 --- a/game_api.txt +++ b/game_api.txt @@ -71,43 +71,55 @@ doors.register_door(name, def) -> Registers new door doors.register_trapdoor(name, def) -^ name: "Trapdoor name" +^ name: "mod_door" ^ def: See [#Trapdoor definition] -> Registers new trapdoor +doors.get(pos) +^ pos = { x = .., y = .., z = ..} + -> Returns an ObjecRef to a door, or nil if the pos did not contain a door + + Methods: + :open(player) -- Open the door object, returns if door was opened + :close(player) -- Close the door object, returns if door was closed + :toggle(player) -- Toggle the door state, returns if state was toggled + :state() -- returns the door state, true = open, false = closed + + the "player" parameter can be omitted in all methods. If passed then + the usual permission checks will be performed to make sure the player + has the permissions needed to open this door. If omitted then no + permission checks are performed. + #Door definition ---------------- { description = "Door description", inventory_image = "mod_door_inv.png", - groups = {group = 1}, - tiles_bottom: [Tile definition], - ^ the tiles of the bottom part of the door {front, side} - tiles_top: [Tile definition], - ^ the tiles of the bottom part of the door {front, side} - node_box_bottom = regular nodebox, see [Node boxes], OPTIONAL, - node_box_top = regular nodebox, see [Node boxes], OPTIONAL, - selection_box_bottom = regular nodebox, see [Node boxes], OPTIONAL, - selection_box_top = regular nodebox, see [Node boxes], OPTIONAL, - sound_open_door = sound play for open door, OPTIONAL, - sound_close_door = sound play for close door, OPTIONAL, - only_placer_can_open = true/false, + groups = {choppy = 1}, + tiles = { "mod_door.png" }, + material = "default:wood", -- used to make a craft recipe + sounds = default.node_sound_wood_defaults(), -- optional + sound_open = sound play for open door, -- optional + sound_close = sound play for close door, -- optional + protected = false, ^ If true, only placer can open the door (locked for others) } #Trapdoor definition ---------------- { + description = "Trapdoor description", + inventory_image = "mod_trapdoor_inv.png", + groups = {choppy = 1}, tile_front = "doors_trapdoor.png", ^ the texture for the front and back of the trapdoor tile_side: "doors_trapdoor_side.png", ^ the tiles of the four side parts of the trapdoor - sound_open = sound to play when opening the trapdoor, OPTIONAL, - sound_close = sound to play when closing the trapdoor, OPTIONAL, - -> You can add any other node definition properties for minetest.register_node, - such as wield_image, inventory_image, sounds, groups, description, ... - Only node_box, selection_box, tiles, drop, drawtype, paramtype, paramtype2, on_rightclick - will be overwritten by the trapdoor registration function + sounds = default.node_sound_wood_defaults(), -- optional + sound_open = sound play for open door, -- optional + sound_close = sound play for close door, -- optional + protected = false, + ^ If true, only placer can open the door (locked for others) } Fence API diff --git a/mods/doors/README.txt b/mods/doors/README.txt index 27f0507a..02a1e9e3 100644 --- a/mods/doors/README.txt +++ b/mods/doors/README.txt @@ -1,12 +1,15 @@ Minetest Game mod: doors ======================== -version: 1.3 +version: 2.0 License of source code: ----------------------- Copyright (C) 2012 PilzAdam modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor) Steel trapdoor added by sofar. +Copyright (C) 2015 sofar@foo-projects.org +Re-implemented most of the door algorithms, added meshes, UV wrapped texture +Added doors API to facilitate coding mods accessing and operating doors. This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it @@ -40,8 +43,20 @@ following textures created by sofar (CC-BY-SA-3.0) doors_trapdoor_steel_side.png door_trapdoor_side.png +Door 3d models by sofar (CC-BY-SA-3.0) + door_a.obj + door_b.obj + +Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen: WTFPL + door_obsidian_glass.png + +Glass door textures by red-001 based on textures by celeron55: CC BY-SA 3.0 + door_glass.png All other textures (created by PilzAdam): WTFPL +Door textures were converted to the new texture map by sofar, paramat and +red-001, under the same license as the originals. + License of sounds -------------------------------------- diff --git a/mods/doors/init.lua b/mods/doors/init.lua index e942d466..2d6271e6 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -1,435 +1,436 @@ + +--[[ + +Copyright (C) 2012 PilzAdam + modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor) +Copyright (C) 2015 - Auke Kok + +--]] + +-- our API object doors = {} --- Registers a door -function doors.register_door(name, def) - def.groups.not_in_creative_inventory = 1 +-- private data +local _doors = {} +_doors.registered_doors = {} +_doors.registered_trapdoors = {} - local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}} +-- returns an object to a door object or nil +function doors.get(pos) + if _doors.registered_doors[minetest.get_node(pos).name] then + -- A normal upright door + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return _doors.door_toggle(self.pos, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return _doors.door_toggle(self.pos, player) + end, + toggle = function(self, player) + return _doors.door_toggle(self.pos, player) + end, + state = function(self) + local state = minetest.get_meta(self.pos):get_int("state") + return state %2 == 1 + end + } + elseif _doors.registered_trapdoors[minetest.get_node(pos).name] then + -- A trapdoor + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return _doors.trapdoor_toggle(self.pos, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return _doors.trapdoor_toggle(self.pos, player) + end, + toggle = function(self, player) + return _doors.trapdoor_toggle(self.pos, player) + end, + state = function(self) + local name = minetest.get_node(pos).name + return name:sub(-5) == "_open" + end + } + else + return nil + end +end - if not def.node_box_bottom then - def.node_box_bottom = box - end - if not def.node_box_top then - def.node_box_top = box - end - if not def.selection_box_bottom then - def.selection_box_bottom= box - end - if not def.selection_box_top then - def.selection_box_top = box +-- this hidden node is placed on top of the bottom, and prevents +-- nodes from being placed in the top half of the door. +minetest.register_node("doors:hidden", { + description = "Hidden Door Segment", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = false, + floodable = false, + drop = "", + groups = { not_in_creative_inventory = 1 }, + on_blast = function() end +}) + +-- table used to aid door opening/closing +local transform = { + { + { v = "_a", param2 = 3 }, + { v = "_a", param2 = 0 }, + { v = "_a", param2 = 1 }, + { v = "_a", param2 = 2 }, + }, + { + { v = "_b", param2 = 1 }, + { v = "_b", param2 = 2 }, + { v = "_b", param2 = 3 }, + { v = "_b", param2 = 0 }, + }, + { + { v = "_b", param2 = 1 }, + { v = "_b", param2 = 2 }, + { v = "_b", param2 = 3 }, + { v = "_b", param2 = 0 }, + }, + { + { v = "_a", param2 = 3 }, + { v = "_a", param2 = 0 }, + { v = "_a", param2 = 1 }, + { v = "_a", param2 = 2 }, + }, +} + +function _doors.door_toggle(pos, clicker) + local meta = minetest.get_meta(pos) + local state = meta:get_int("state") + local def = minetest.registered_nodes[minetest.get_node(pos).name] + local name = def.door.basename + + if clicker then + local owner = meta:get_string("doors_owner") + if owner ~= "" then + if clicker:get_player_name() ~= owner then + return false + end + end end - if not def.sound_close_door then - def.sound_close_door = "doors_door_close" + local old = state + -- until Lua-5.2 we have no bitwise operators :( + if state % 2 == 1 then + state = state - 1 + else + state = state + 1 end - if not def.sound_open_door then - def.sound_open_door = "doors_door_open" + + local dir = minetest.get_node(pos).param2 + if state % 2 == 0 then + minetest.sound_play(def.door.sounds[1], {pos = pos, gain = 0.3, max_hear_distance = 10}) + else + minetest.sound_play(def.door.sounds[2], {pos = pos, gain = 0.3, max_hear_distance = 10}) end - - - minetest.register_craftitem(name, { + + minetest.swap_node(pos, { + name = "doors:" .. name .. transform[state + 1][dir+1].v, + param2 = transform[state + 1][dir+1].param2 + }) + meta:set_int("state", state) + + return true +end + +function doors.register(name, def) + -- replace old doors of this type automatically + minetest.register_abm({ + nodenames = {"doors:"..name.."_b_1", "doors:"..name.."_b_2"}, + interval = 7.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local l = tonumber(node.name:sub(-1)) + local meta = minetest.get_meta(pos) + local h = meta:get_int("right") + 1 + local p2 = node.param2 + local replace = { + { { type = "a", state = 0 }, { type = "a", state = 3 } }, + { { type = "b", state = 1 }, { type = "b", state = 2 } } + } + local new = replace[l][h] + -- retain infotext and doors_owner fields + minetest.swap_node(pos, { name = "doors:" .. name .. "_" .. new.type, param2 = p2}) + meta:set_int("state", new.state) + -- wipe meta on top node as it's unused + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, { name = "doors:hidden" }) + end + }) + + minetest.register_craftitem("doors:" .. name, { description = def.description, inventory_image = def.inventory_image, on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.type == "node" then + local pos = pointed_thing.above + local node = minetest.get_node(pos) + + if not minetest.registered_nodes[node.name].buildable_to then return itemstack end - local ptu = pointed_thing.under - local nu = minetest.get_node(ptu) - if minetest.registered_nodes[nu.name].on_rightclick then - return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack) - end - - local pt = pointed_thing.above - local pt2 = {x=pt.x, y=pt.y, z=pt.z} - pt2.y = pt2.y+1 - if - not minetest.registered_nodes[minetest.get_node(pt).name].buildable_to or - not minetest.registered_nodes[minetest.get_node(pt2).name].buildable_to or - not placer or - not placer:is_player() - then + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + if not minetest.registered_nodes[minetest.get_node(above).name].buildable_to then return itemstack end - if minetest.is_protected(pt, placer:get_player_name()) or - minetest.is_protected(pt2, placer:get_player_name()) then - minetest.record_protection_violation(pt, placer:get_player_name()) - return itemstack - end + local dir = minetest.dir_to_facedir(placer:get_look_dir()) - local p2 = minetest.dir_to_facedir(placer:get_look_dir()) - local pt3 = {x=pt.x, y=pt.y, z=pt.z} - if p2 == 0 then - pt3.x = pt3.x-1 - elseif p2 == 1 then - pt3.z = pt3.z+1 - elseif p2 == 2 then - pt3.x = pt3.x+1 - elseif p2 == 3 then - pt3.z = pt3.z-1 - end - if minetest.get_item_group(minetest.get_node(pt3).name, "door") == 0 then - minetest.set_node(pt, {name=name.."_b_1", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) + local ref = { + { x = -1, y = 0, z = 0 }, + { x = 0, y = 0, z = 1 }, + { x = 1, y = 0, z = 0 }, + { x = 0, y = 0, z = -1 }, + } + + local aside = { + x = pos.x + ref[dir + 1].x, + y = pos.y + ref[dir + 1].y, + z = pos.z + ref[dir + 1].z, + } + + local state = 0 + if minetest.get_item_group(minetest.get_node(aside).name, "door") == 1 then + state = state + 2 + minetest.set_node(pos, {name = "doors:" .. name .. "_b", param2 = dir}) else - minetest.set_node(pt, {name=name.."_b_2", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_2", param2=p2}) - minetest.get_meta(pt):set_int("right", 1) - minetest.get_meta(pt2):set_int("right", 1) + minetest.set_node(pos, {name = "doors:" .. name .. "_a", param2 = dir}) end + minetest.set_node(above, { name = "doors:hidden" }) - if def.only_placer_can_open then + local meta = minetest.get_meta(pos) + meta:set_int("state", state) + + if def.protected then local pn = placer:get_player_name() - local meta = minetest.get_meta(pt) meta:set_string("doors_owner", pn) - meta:set_string("infotext", "Owned by "..pn) - meta = minetest.get_meta(pt2) - meta:set_string("doors_owner", pn) - meta:set_string("infotext", "Owned by "..pn) + meta:set_string("infotext", "Owned by " .. pn) end if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end + return itemstack - end, + end }) - local tt = def.tiles_top - local tb = def.tiles_bottom - - local function after_dig_node(pos, name, digger) - local node = minetest.get_node(pos) - if node.name == name then - minetest.node_dig(pos, node, digger) - end - end - - local function check_and_blast(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - minetest.remove_node(pos) - end - end - - local function make_on_blast(base_name, dir, door_type, other_door_type) - if def.only_placer_can_open then - return function() end - else - return function(pos, intensity) - check_and_blast(pos, base_name .. door_type) - pos.y = pos.y + dir - check_and_blast(pos, base_name .. other_door_type) - end - end - end - - local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) - pos.y = pos.y+dir - if minetest.get_node(pos).name ~= check_name then - return - end - local p2 = minetest.get_node(pos).param2 - p2 = params[p2+1] - - minetest.swap_node(pos, {name=replace_dir, param2=p2}) - - pos.y = pos.y-dir - minetest.swap_node(pos, {name=replace, param2=p2}) - - local snd_1 = def.sound_close_door - local snd_2 = def.sound_open_door - if params[1] == 3 then - snd_1 = def.sound_open_door - snd_2 = def.sound_close_door - end - - if minetest.get_meta(pos):get_int("right") ~= 0 then - minetest.sound_play(snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10}) - else - minetest.sound_play(snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10}) - end - end - - local function check_player_priv(pos, player) - if not def.only_placer_can_open then + local can_dig = function(pos, digger) + if not def.protected then return true end local meta = minetest.get_meta(pos) - local pn = player:get_player_name() - return meta:get_string("doors_owner") == pn + return meta:get_string("doors_owner") == digger:get_player_name() end - local function on_rotate(pos, node, dir, user, check_name, mode, new_param2) - if not check_player_priv(pos, user) then - return false - end - if mode ~= screwdriver.ROTATE_FACE then - return false - end - - pos.y = pos.y + dir - if not minetest.get_node(pos).name == check_name then - return false - end - if minetest.is_protected(pos, user:get_player_name()) then - minetest.record_protection_violation(pos, user:get_player_name()) - return false - end - - local node2 = minetest.get_node(pos) - node2.param2 = (node2.param2 + 1) % 4 - minetest.swap_node(pos, node2) - - pos.y = pos.y - dir - node.param2 = (node.param2 + 1) % 4 - minetest.swap_node(pos, node) - return true + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() end - minetest.register_node(name.."_b_1", { - tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"}, + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + def.groups.not_in_creative_inventory = 1 + def.groups.door = 1 + def.drop = "doors:" .. name + def.door = { + basename = name, + sounds = { def.sound_close, def.sound_open }, + } + + def.on_rightclick = function(pos, node, clicker) + _doors.door_toggle(pos, clicker) + end + def.after_dig_node = function(pos, node, meta, digger) + minetest.remove_node({ x = pos.x, y = pos.y + 1, z = pos.z}) + end + def.can_dig = function(pos, player) + return can_dig(pos, player) + end + def.on_rotate = function(pos, node, user, mode, new_param2) + return false + end + + if def.protected then + def.on_blast = function() end + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + -- hidden node doesn't get blasted away. + minetest.remove_node({ x = pos.x, y = pos.y + 1, z = pos.z}) + return { "doors:" .. name } + end + end + + minetest.register_node("doors:" .. name .. "_a", { + description = def.description, + visual = "mesh", + mesh = "door_a.obj", + tiles = def.tiles, + drawtype = "mesh", paramtype = "light", paramtype2 = "facedir", + sunlight_propagates = true, + use_texture_alpha = true, + walkable = true, is_ground_content = false, - drop = name, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, + buildable_to = false, + drop = def.drop, + groups = def.groups, + sounds = def.sounds, + door = def.door, + on_rightclick = def.on_rightclick, + after_dig_node = def.after_dig_node, + can_dig = def.can_dig, + on_rotate = def.on_rotate, + on_blast = def.on_blast, selection_box = { type = "fixed", - fixed = def.selection_box_bottom + fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} + }, + collision_box = { + type = "fixed", + fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} }, - groups = def.groups, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y+1 - after_dig_node(pos, name.."_t_1", digger) - end, - - on_rightclick = function(pos, node, clicker) - if check_player_priv(pos, clicker) then - on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) - end - end, - - on_rotate = function(pos, node, user, mode, new_param2) - return on_rotate(pos, node, 1, user, name.."_t_1", mode) - end, - - can_dig = check_player_priv, - sounds = def.sounds, - sunlight_propagates = def.sunlight, - on_blast = make_on_blast(name, 1, "_b_1", "_t_1") }) - minetest.register_node(name.."_t_1", { - tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"}, + minetest.register_node("doors:" .. name .. "_b", { + description = def.description, + visual = "mesh", + mesh = "door_b.obj", + tiles = def.tiles, + drawtype = "mesh", paramtype = "light", paramtype2 = "facedir", + sunlight_propagates = true, + use_texture_alpha = true, + walkable = true, is_ground_content = false, - drop = "", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_top - }, + buildable_to = false, + drop = def.drop, + groups = def.groups, + sounds = def.sounds, + door = def.door, + on_rightclick = def.on_rightclick, + after_dig_node = def.after_dig_node, + can_dig = def.can_dig, + on_rotate = def.on_rotate, + on_blast = def.on_blast, selection_box = { type = "fixed", - fixed = def.selection_box_top + fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} + }, + collision_box = { + type = "fixed", + fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} }, - groups = def.groups, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y-1 - after_dig_node(pos, name.."_b_1", digger) - end, - - on_rightclick = function(pos, node, clicker) - if check_player_priv(pos, clicker) then - on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0}) - end - end, - - on_rotate = function(pos, node, user, mode, new_param2) - return on_rotate(pos, node, -1, user, name.."_b_1", mode) - end, - - can_dig = check_player_priv, - sounds = def.sounds, - sunlight_propagates = def.sunlight, - on_blast = make_on_blast(name, -1, "_t_1", "_b_1") }) - minetest.register_node(name.."_b_2", { - tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]}, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - drop = name, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, - groups = def.groups, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y+1 - after_dig_node(pos, name.."_t_2", digger) - end, - - on_rightclick = function(pos, node, clicker) - if check_player_priv(pos, clicker) then - on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) - end - end, - - on_rotate = function(pos, node, user, mode, new_param2) - return on_rotate(pos, node, 1, user, name.."_t_2", mode) - end, - - can_dig = check_player_priv, - sounds = def.sounds, - sunlight_propagates = def.sunlight, - on_blast = make_on_blast(name, 1, "_b_2", "_t_2") - }) - - minetest.register_node(name.."_t_2", { - tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]}, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - drop = "", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_top - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_top - }, - groups = def.groups, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y-1 - after_dig_node(pos, name.."_b_2", digger) - end, - - on_rightclick = function(pos, node, clicker) - if check_player_priv(pos, clicker) then - on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2}) - end - end, - - on_rotate = function(pos, node, user, mode, new_param2) - return on_rotate(pos, node, -1, user, name.."_b_2", mode) - end, - - can_dig = check_player_priv, - sounds = def.sounds, - sunlight_propagates = def.sunlight, - on_blast = make_on_blast(name, -1, "_t_2", "_b_2") + minetest.register_craft({ + output = "doors:" .. name, + recipe = { + {def.material,def.material}; + {def.material,def.material}; + {def.material,def.material}; + } }) + _doors.registered_doors["doors:" .. name .. "_a"] = true + _doors.registered_doors["doors:" .. name .. "_b"] = true end -doors.register_door("doors:door_wood", { - description = "Wooden Door", - inventory_image = "doors_wood.png", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, - tiles_bottom = {"doors_wood_b.png", "doors_brown.png"}, - tiles_top = {"doors_wood_a.png", "doors_brown.png"}, - sounds = default.node_sound_wood_defaults(), - sunlight = false, +doors.register("door_wood", { + tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, + description = "Wooden Door", + inventory_image = "doors_item_wood.png", + groups = { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + material = "group:wood", }) -minetest.register_craft({ - output = "doors:door_wood", - recipe = { - {"group:wood", "group:wood"}, - {"group:wood", "group:wood"}, - {"group:wood", "group:wood"} - } +doors.register("door_steel", { + tiles = {{ name = "doors_door_steel.png", backface_culling = true }}, + description = "Steel Door", + inventory_image = "doors_item_steel.png", + protected = true, + groups = { snappy = 1, bendy = 2, cracky = 1, melty = 2, level = 2 }, + material = "default:steel_ingot", }) -doors.register_door("doors:door_steel", { - description = "Steel Door", - inventory_image = "doors_steel.png", - groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1}, - tiles_bottom = {"doors_steel_b.png", "doors_grey.png"}, - tiles_top = {"doors_steel_a.png", "doors_grey.png"}, - only_placer_can_open = true, - sounds = default.node_sound_wood_defaults(), - sunlight = false, +doors.register("door_glass", { + tiles = { "doors_door_glass.png"}, + description = "Glass Door", + inventory_image = "doors_item_glass.png", + groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 }, + material = "default:glass", + sounds = default.node_sound_glass_defaults(), }) -minetest.register_craft({ - output = "doors:door_steel", - recipe = { - {"default:steel_ingot", "default:steel_ingot"}, - {"default:steel_ingot", "default:steel_ingot"}, - {"default:steel_ingot", "default:steel_ingot"} - } +doors.register("door_obsidian_glass", { + tiles = { "doors_door_obsidian_glass.png" }, + description = "Glass Door", + inventory_image = "doors_item_obsidian_glass.png", + groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 }, + material = "default:obsidian_glass", + sounds = default.node_sound_glass_defaults(), }) -doors.register_door("doors:door_glass", { - description = "Glass Door", - inventory_image = "doors_glass.png", - groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1}, - tiles_bottom = {"doors_glass_b.png", "doors_glass_side.png"}, - tiles_top = {"doors_glass_a.png", "doors_glass_side.png"}, - sounds = default.node_sound_glass_defaults(), - sunlight = true, -}) - -minetest.register_craft({ - output = "doors:door_glass", - recipe = { - {"default:glass", "default:glass"}, - {"default:glass", "default:glass"}, - {"default:glass", "default:glass"} - } -}) - -doors.register_door("doors:door_obsidian_glass", { - description = "Obsidian Glass Door", - inventory_image = "doors_obsidian_glass.png", - groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1}, - tiles_bottom = {"doors_obsidian_glass_b.png", "doors_obsidian_glass_side.png"}, - tiles_top = {"doors_obsidian_glass_a.png", "doors_obsidian_glass_side.png"}, - sounds = default.node_sound_glass_defaults(), - sunlight = true, -}) - -minetest.register_craft({ - output = "doors:door_obsidian_glass", - recipe = { - {"default:obsidian_glass", "default:obsidian_glass"}, - {"default:obsidian_glass", "default:obsidian_glass"}, - {"default:obsidian_glass", "default:obsidian_glass"} - } -}) - - ----trapdoor---- +function _doors.trapdoor_toggle(pos, clicker) + if clicker then + local meta = minetest.get_meta(pos) + local owner = meta:get_string("doors_owner") + if owner ~= "" then + if clicker:get_player_name() ~= owner then + return false + end + end + end + + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + + if string.sub(node.name, -5) == "_open" then + minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.swap_node(pos, {name = string.sub(node.name, 1, string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) + else + minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.swap_node(pos, {name = node.name .. "_open", param1 = node.param1, param2 = node.param2}) + end +end + function doors.register_trapdoor(name, def) local name_closed = name local name_opened = name.."_open" local function check_player_priv(pos, player) - if not def.only_placer_can_open then + if not def.protected then return true end local meta = minetest.get_meta(pos) @@ -437,18 +438,8 @@ function doors.register_trapdoor(name, def) return meta:get_string("doors_owner") == pn end - def.on_rightclick = function (pos, node, clicker, itemstack, pointed_thing) - if not check_player_priv(pos, clicker) then - return - end - local newname = node.name == name_closed and name_opened or name_closed - local sound = false - if node.name == name_closed then sound = def.sound_open end - if node.name == name_opened then sound = def.sound_close end - if sound then - minetest.sound_play(sound, {pos = pos, gain = 0.3, max_hear_distance = 10}) - end - minetest.swap_node(pos, {name = newname, param1 = node.param1, param2 = node.param2}) + def.on_rightclick = function(pos, node, clicker) + _doors.trapdoor_toggle(pos, clicker) end -- Common trapdoor configuration @@ -458,7 +449,7 @@ function doors.register_trapdoor(name, def) def.is_ground_content = false def.can_dig = check_player_priv - if def.only_placer_can_open then + if def.protected then def.after_place_node = function(pos, placer, itemstack, pointed_thing) local pn = placer:get_player_name() local meta = minetest.get_meta(pos) @@ -467,6 +458,26 @@ function doors.register_trapdoor(name, def) return minetest.setting_getbool("creative_mode") end + + def.on_blast = function() end + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + minetest.remove_node({ x = pos.x, y = pos.y + 1, z = pos.z}) + return { name } + end + end + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" end local def_opened = table.copy(def) @@ -501,10 +512,11 @@ function doors.register_trapdoor(name, def) minetest.register_node(name_opened, def_opened) minetest.register_node(name_closed, def_closed) + + _doors.registered_trapdoors[name_opened] = true + _doors.registered_trapdoors[name_closed] = true end - - doors.register_trapdoor("doors:trapdoor", { description = "Trapdoor", inventory_image = "doors_trapdoor.png", @@ -512,9 +524,6 @@ doors.register_trapdoor("doors:trapdoor", { tile_front = "doors_trapdoor.png", tile_side = "doors_trapdoor_side.png", groups = {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=2, door=1}, - sounds = default.node_sound_wood_defaults(), - sound_open = "doors_door_open", - sound_close = "doors_door_close" }) doors.register_trapdoor("doors:trapdoor_steel", { @@ -523,11 +532,8 @@ doors.register_trapdoor("doors:trapdoor_steel", { wield_image = "doors_trapdoor_steel.png", tile_front = "doors_trapdoor_steel.png", tile_side = "doors_trapdoor_steel_side.png", - only_placer_can_open = true, + protected = true, groups = {snappy=1, bendy=2, cracky=1, melty=2, level=2, door=1}, - sounds = default.node_sound_wood_defaults(), - sound_open = "doors_door_open", - sound_close = "doors_door_close" }) minetest.register_craft({ diff --git a/mods/doors/models/door_a.obj b/mods/doors/models/door_a.obj new file mode 100644 index 00000000..bd5127b5 --- /dev/null +++ b/mods/doors/models/door_a.obj @@ -0,0 +1,40 @@ +# Blender v2.76 (sub 0) OBJ File: 'door_a.blend' +# www.blender.org +mtllib door_a.mtl +o Cube_Cube.001 +v 0.499000 -0.499000 -0.499000 +v 0.499000 1.499000 -0.499000 +v 0.499000 -0.499000 -0.375000 +v 0.499000 1.499000 -0.375000 +v -0.499000 -0.499000 -0.499000 +v -0.499000 1.499000 -0.499000 +v -0.499000 -0.499000 -0.375000 +v -0.499000 1.499000 -0.375000 +vt 0.842105 1.000000 +vt 0.894737 1.000000 +vt 0.894737 0.000000 +vt 0.842105 0.000000 +vt 0.421053 1.000000 +vt 0.421053 0.000000 +vt 0.947368 1.000000 +vt 0.947368 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.500000 +vt 0.947368 0.500000 +vt 1.000000 1.000000 +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/5/2 8/1/2 7/4/2 3/6/2 +f 8/2/3 6/7/3 5/8/3 7/3/3 +f 6/9/4 2/5/4 1/6/4 5/10/4 +f 1/11/5 3/12/5 7/7/5 5/13/5 +f 6/14/6 8/8/6 4/12/6 2/11/6 diff --git a/mods/doors/models/door_b.obj b/mods/doors/models/door_b.obj new file mode 100644 index 00000000..c5607b87 --- /dev/null +++ b/mods/doors/models/door_b.obj @@ -0,0 +1,40 @@ +# Blender v2.76 (sub 0) OBJ File: 'door_b.blend' +# www.blender.org +mtllib door_b.mtl +o Cube_Cube.001 +v -0.499000 -0.499000 -0.499000 +v -0.499000 1.499000 -0.499000 +v -0.499000 -0.499000 -0.375000 +v -0.499000 1.499000 -0.375000 +v 0.499000 -0.499000 -0.499000 +v 0.499000 1.499000 -0.499000 +v 0.499000 -0.499000 -0.375000 +v 0.499000 1.499000 -0.375000 +vt 0.842105 1.000000 +vt 0.842105 0.000000 +vt 0.894737 0.000000 +vt 0.894737 1.000000 +vt 0.421053 1.000000 +vt 0.421053 0.000000 +vt 0.947368 0.000000 +vt 0.947368 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.947368 0.500000 +vt 1.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 1/2/1 3/3/1 4/4/1 +f 4/5/2 3/6/2 7/2/2 8/1/2 +f 8/4/3 7/3/3 5/7/3 6/8/3 +f 6/9/4 5/10/4 1/6/4 2/5/4 +f 1/11/5 5/12/5 7/13/5 3/7/5 +f 6/8/6 2/13/6 4/12/6 8/14/6 diff --git a/mods/doors/textures/doors_brown.png b/mods/doors/textures/doors_brown.png deleted file mode 100644 index 8c8e3d898f41a2e9e859f2717d0a5729cec260b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{F!VDx;H*&N9DgFST5LY)72_H)tM*}e@LvcGj z(aqaii-A&-o-U3d9M_Wt5(*L$5(F5WSlKuX8a60OFbIEOG_;G)*$!01;OXk;vd$@? F2>>+r7bO4y diff --git a/mods/doors/textures/doors_door_glass.png b/mods/doors/textures/doors_door_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..f597299bdfaa2389d40c5179069ccd5685b937f9 GIT binary patch literal 3064 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 R{`>#{002ovPDHLkV1fb(6QckC literal 0 HcmV?d00001 diff --git a/mods/doors/textures/doors_door_wood.png b/mods/doors/textures/doors_door_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..7b18203eb37b72e44275281e4510e1e33b6290be GIT binary patch literal 1662 zcmV-^27&pBP)000I>NklgA6DB0fqwyP6Rvl z0|Fd6rO4eKfza;qVRB}=yIu~ur>A?TXJr>KsP3M+Rkv=Pd+sUq*~cFw+GaFlR?u3} zZ!tDQoR6dw36areG$^I9q5($dshuC#Utd0Fv8tI(vOzD-1?uHB0GTMfF{6w65C-qH zPh7n&0l0goAQOda|62ia%RIGjHkwV}<3EdvA~RdPSZhEOm#?a3*G8k2BBsP`?cRQY zHBDrux$y0)^2P`^cw5gI+Hf82=U8hfGK2GRs~0gEZ4Jg~zWnN&LF~Wy^usitU-0L@ zUktwg=GPykxO%}={2l;5D3-kc=sv&w!#@V&e)ZGibaZsg@BaAD!S`Q2ewcD=&_b0Q30;CnqNZ+5m8iOXgQA0FLfXu(QJr&|8`~KR@T_=y>qm z8qIuu&Vz#~UiNwN_0!Q!N$otYc2q9%@KRX*;;OVoo zZk!c^F^$u!%8`=a8Eq-60JW#AJb(Sy^8t!K|KxF+&o8#J_47|2C%3r5^_cSL=$POC z>8q{m8~gtApFBvb%0LSEkPxG`dMR>4N(L+2gqUZB+{)JXy@{m?mUpIE!()XdpV(0> z<(V15o*}mel^dpo9cTW`3Pg()KML*LPL5G(xWluv zGfq!WyW+hLK>6m9Z?2oHeE8mk;+?~epVq~EZF`ec&(ANKk~BNy?CcCH8t3Dn7o$O2 z!|DAQ)Gx6jy`6cE52sLFqW~G;$8^V(TZ5`!HpkiNAL|x77T=bnF&tgRI{^G}vKmnl+jf8XcVsqu7l5CAe?`nJ&PU#z z(8Fuv{*iNqa=Pu4k3ISqCGFMQlq_=s0hqCRzuh-m0(D>6B&ZFe;1! zf3d2OviA7O^P_{8Z~&P#l$Gi^mIkcvdmw)}dDD{Rq?e&Xk*L&W{6~)xwF^MSssb^7 zw;o#?UA}Jhn7+OKZJ0ktM0d`7+v>URY9Y3I>`o4_TaOi);Jje8#@-DAjCvWvBO798?4-PuJ3qE zpxMS?2(g{FH9iu%gL&q`T(2elJz+sj3?1BenN9 zA3L3{wL+=w)vOJKn7RxLG2wl{jnvhYQb#pbG^s5+i?W8>^qBJjUo{Subr`7B?`qyh z{-5T2B*f-|vZ_2{ZqZ{_3?>t-1Tt&7<5D;H%=X?@VKKq7*XprJVaWGrH+NZs>bk=D_R)m;D{>1tpHkheGS%^ZdpHb+|I zLeOe=R*D#W-QcQpe(Msg{RY4xG?GN?hOL^;=Mf!KFWdF;F)=_Hfc%c*|^m~V!C*X4CuG>*MqxGkH$-OWqzx}6+kJN4Lq0R|)a2UrsT+W-In07*qo IM6N<$f(<`F?*IS* literal 0 HcmV?d00001 diff --git a/mods/doors/textures/doors_glass_a.png b/mods/doors/textures/doors_glass_a.png deleted file mode 100644 index da2540287cfe24c451c14b424792ac431db80bda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=0r&JidSb!a01s>&fZOswwi7XK(SBJ86 cUI<`kNP8-Mb^dev*+3l(p00i_>zopr0H_KpvH$=8 literal 0 HcmV?d00001 diff --git a/mods/doors/textures/doors_wood.png b/mods/doors/textures/doors_item_wood.png similarity index 100% rename from mods/doors/textures/doors_wood.png rename to mods/doors/textures/doors_item_wood.png diff --git a/mods/doors/textures/doors_obsidian_glass_a.png b/mods/doors/textures/doors_obsidian_glass_a.png deleted file mode 100644 index d5ac83d09d4f978330381944e2ca09138254aebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t{_1H0eLk;Q!^h?AcwIe z$S;_|;n|HeAV<~H#W95AdNN1vEU8lu4jeeZp*}-G%0Y*vaYC*`*rAqHy@EL+3|_lA VShk1sB>^=sc)I$ztaD0e0sw#{AIty% diff --git a/mods/doors/textures/doors_obsidian_glass_b.png b/mods/doors/textures/doors_obsidian_glass_b.png deleted file mode 100644 index d5ac83d09d4f978330381944e2ca09138254aebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t{_1H0eLk;Q!^h?AcwIe z$S;_|;n|HeAV<~H#W95AdNN1vEU8lu4jeeZp*}-G%0Y*vaYC*`*rAqHy@EL+3|_lA VShk1sB>^=sc)I$ztaD0e0sw#{AIty% diff --git a/mods/doors/textures/doors_obsidian_glass_side.png b/mods/doors/textures/doors_obsidian_glass_side.png deleted file mode 100644 index aa4c63aac9cb88b6361fa5964c4892504eac3841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?jt^xuAZ#3u32XeVQT^vI= bt|un|*-Q+Kj}-S916d57u6{1-oD!MTNsI(6#ay?gui?Yn&W@|iPdwr}5l?%cV92M<1Y@L=c8orZ>nhYlT5Q&SV#Yf%W) z%vciS7tG-B>_!@p)8^^o7$R}mw?C5aumOjQVfRMa^*jG3a);y^$@{;^G!eS6X{q(& zgp3udf?ZhzMa7?39aX!1wl%`F41=Ba2;`Kd#IboMVb`|GFUf&SyiIZ1% zwwc9s9e(8Gb!KUT$v&kMBGUOA>ze*IZ4F6#*R89!$`2*S5B{<>lns+S<9fxy{YZ&(F`x%ge#R!X_prGcz+TE-pL5 zYnA{20EtONK~xyiHI0D|10e`QOGR#|)9wF%b~LwZVzl*9F!4R7!OT$Nso*8i*h(CD z(|zylx9q~?ZbDiOw8%?DD|;tBM-fgm31p8V%<)gm6ifvK3NX`%2v7`-U8U*zrGTg7 z#>?~RfC6d7M{8v>BQsYVEPC&Kt+{lCwpiA8xhSb)jB)9d^!NdQa0LjPaAQvZ0000< KMNUMnLSTZ7zjes~ diff --git a/mods/doors/textures/doors_wood_a.png b/mods/doors/textures/doors_wood_a.png deleted file mode 100644 index 86a747aa5ba39f399406f3cf07bb432d65878719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Yk*IPE0FdulgbFS$O^Yi4m3;l zQjT*|$_dnPHI_&UFp2jw$?#K;a+deCl1cPX@-mkWv6st_vNkj{bTAO}x0Z|YG*nYl zI~~4>A7~I`NswPKgTu2MX+TcDr;B5V#O2Wb+d_vGI9vqv8!}9mo%~;)Wmu+mwlX3$ zJ%XX=T+=-Vo+Q>ed#9HK_tZJ)omsb2zEd%Wk7rHrUcL#bE!%pyi=vKQDw*-KGO8(6 z;p<(uq_4q?nLD?dJxf0o`D3o)?Nj?Fm#uBsweN43k@B|vN7rn)sw$DQymQJ-!NsfG ms(X45UX~CSTzM&_hEePlo8kxMzq5c&WAJqKb6Mw<&;$UzR%Vz0 diff --git a/mods/doors/textures/doors_wood_b.png b/mods/doors/textures/doors_wood_b.png deleted file mode 100644 index 966509827e65cdfec58d15fb9f8182220b762dbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Q-Dv1YpRcGy02=2hjNmqa)!UU zyQx&XyHZksX{@WFkEKkYtz2%PW@?aGq?3GRm}P#5R;-Vai?M{7nwo>YSYDL1fq}tX zD?>4$X>&YX977~7yY`3k9X8-`&OA9O{gTDwf8n~V3~!t5d9o%Py7Jtn_?%|ri_YZR zX5xb1qkitySd(i1>X1mVOSM{cmPV4^szn@(yzR4#-8(J>>2K)f)1Pr?W51oz2d&*w zUE7vy-NkZQJooJD_#H1USxh)7@%S9C@pnTzdAp*1_C(nW&X@V_1%+!Cixo{d5vU}% l+Q;ok!S{R8hS|11m@1dE?X~Q Date: Tue, 9 Feb 2016 22:03:40 -0800 Subject: [PATCH 02/48] Convert furnace ABM to node timer Node timers are higher precision and a better guarantee of happening at regular intervals, whereas ABM's may be postponed, cancelled or missed if a player is too far. The largest benefit is that once the furnace is done cooking, no more ABM's are fired - the timer is stopped instead and no more events are created until items are put in the furnace. This patch is larger due to the migration of the timer function and indentation change as a result of the somewhat reduced complexity. I've tested with several furnaces and this works correctly and behavior is not affected, although people may find that their furnaces now work more regularly. If you place several furnaces next to eachother, you will still find all furnace timers firing exactly at the same time. This is a bug in core that should not coalesce node timers at second intervals. --- mods/default/furnace.lua | 300 ++++++++++++++++++++------------------- 1 file changed, 153 insertions(+), 147 deletions(-) diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 6d89aae1..aa2be212 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -90,6 +90,137 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player return stack:get_count() end +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist = inv:get_list("src") + local fuellist = inv:get_list("fuel") + local dstlist = inv:get_list("dst") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + local cookable = true + + if cooked.time == 0 then + cookable = false + end + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + 1 + + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + 1 + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = 0 + end + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + + fuel_totaltime = fuel.time + fuel_time = 0 + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + end + end + + -- + -- Update formspec, infotext and node + -- + local formspec = inactive_formspec + local item_state = "" + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + item_state = item_percent .. "%" + else + if srclist[1]:is_empty() then + item_state = "Empty" + else + item_state = "Not cookable" + end + end + + local fuel_state = "Empty" + local active = "inactive " + local result = false + + if fuel_time <= fuel_totaltime and fuel_totaltime ~= 0 then + active = "active " + local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = fuel_percent .. "%" + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_active") + -- make sure timer restarts automatically + result = true + else + if not fuellist[1]:is_empty() then + fuel_state = "0%" + end + swap_node(pos, "default:furnace") + -- stop timer on the inactive furnace + local timer = minetest.get_node_timer(pos) + timer:stop() + end + + local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")" + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + + return result +end + -- -- Node definitions -- @@ -106,9 +237,26 @@ minetest.register_node("default:furnace", { legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_stone_defaults(), - + can_dig = can_dig, - + + on_timer = furnace_node_timer, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('fuel', 1) + inv:set_size('dst', 4) + end, + + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether furnace can burn or not. + local timer = minetest.get_node_timer(pos) + timer:start(1.0) + end, + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, allow_metadata_inventory_take = allow_metadata_inventory_take, @@ -138,154 +286,12 @@ minetest.register_node("default:furnace_active", { legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_stone_defaults(), - + on_timer = furnace_node_timer, + can_dig = can_dig, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, allow_metadata_inventory_take = allow_metadata_inventory_take, }) --- --- ABM --- - -local function swap_node(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -minetest.register_abm({ - nodenames = {"default:furnace", "default:furnace_active"}, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - -- - -- Inizialize metadata - -- - local meta = minetest.get_meta(pos) - local fuel_time = meta:get_float("fuel_time") or 0 - local src_time = meta:get_float("src_time") or 0 - local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 - - -- - -- Inizialize inventory - -- - local inv = meta:get_inventory() - for listname, size in pairs({ - src = 1, - fuel = 1, - dst = 4, - }) do - if inv:get_size(listname) ~= size then - inv:set_size(listname, size) - end - end - local srclist = inv:get_list("src") - local fuellist = inv:get_list("fuel") - local dstlist = inv:get_list("dst") - - -- - -- Cooking - -- - - -- Check if we have cookable content - local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - local cookable = true - - if cooked.time == 0 then - cookable = false - end - - -- Check if we have enough fuel to burn - if fuel_time < fuel_totaltime then - -- The furnace is currently active and has enough fuel - fuel_time = fuel_time + 1 - - -- If there is a cookable item then check if it is ready yet - if cookable then - src_time = src_time + 1 - if src_time >= cooked.time then - -- Place result in dst list if possible - if inv:room_for_item("dst", cooked.item) then - inv:add_item("dst", cooked.item) - inv:set_stack("src", 1, aftercooked.items[1]) - src_time = 0 - end - end - end - else - -- Furnace ran out of fuel - if cookable then - -- We need to get new fuel - local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - - if fuel.time == 0 then - -- No valid fuel in fuel list - fuel_totaltime = 0 - fuel_time = 0 - src_time = 0 - else - -- Take fuel from fuel list - inv:set_stack("fuel", 1, afterfuel.items[1]) - - fuel_totaltime = fuel.time - fuel_time = 0 - - end - else - -- We don't need to get new fuel since there is no cookable item - fuel_totaltime = 0 - fuel_time = 0 - src_time = 0 - end - end - - -- - -- Update formspec, infotext and node - -- - local formspec = inactive_formspec - local item_state = "" - local item_percent = 0 - if cookable then - item_percent = math.floor(src_time / cooked.time * 100) - item_state = item_percent .. "%" - else - if srclist[1]:is_empty() then - item_state = "Empty" - else - item_state = "Not cookable" - end - end - - local fuel_state = "Empty" - local active = "inactive " - if fuel_time <= fuel_totaltime and fuel_totaltime ~= 0 then - active = "active " - local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) - fuel_state = fuel_percent .. "%" - formspec = active_formspec(fuel_percent, item_percent) - swap_node(pos, "default:furnace_active") - else - if not fuellist[1]:is_empty() then - fuel_state = "0%" - end - swap_node(pos, "default:furnace") - end - - local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")" - - -- - -- Set meta values - -- - meta:set_float("fuel_totaltime", fuel_totaltime) - meta:set_float("fuel_time", fuel_time) - meta:set_float("src_time", src_time) - meta:set_string("formspec", formspec) - meta:set_string("infotext", infotext) - end, -}) From 7a3cff552943b0ecdf57e43b7d8d9040bea6c0ac Mon Sep 17 00:00:00 2001 From: Rui Date: Thu, 11 Feb 2016 13:47:26 +0900 Subject: [PATCH 03/48] Remove minetest.inventorycube --- mods/default/nodes.lua | 8 -------- 1 file changed, 8 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c79d74df..27c719da 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1055,7 +1055,6 @@ end minetest.register_node("default:water_source", { description = "Water Source", - inventory_image = minetest.inventorycube("default_water.png"), drawtype = "liquid", tiles = { { @@ -1100,7 +1099,6 @@ minetest.register_node("default:water_source", { minetest.register_node("default:water_flowing", { description = "Flowing Water", - inventory_image = minetest.inventorycube("default_water.png"), drawtype = "flowingliquid", tiles = {"default_water.png"}, special_tiles = { @@ -1147,7 +1145,6 @@ minetest.register_node("default:water_flowing", { minetest.register_node("default:river_water_source", { description = "River Water Source", - inventory_image = minetest.inventorycube("default_river_water.png"), drawtype = "liquid", tiles = { { @@ -1193,7 +1190,6 @@ minetest.register_node("default:river_water_source", { minetest.register_node("default:river_water_flowing", { description = "Flowing River Water", - inventory_image = minetest.inventorycube("default_river_water.png"), drawtype = "flowingliquid", tiles = {"default_river_water.png"}, special_tiles = { @@ -1242,7 +1238,6 @@ minetest.register_node("default:river_water_flowing", { minetest.register_node("default:lava_source", { description = "Lava Source", - inventory_image = minetest.inventorycube("default_lava.png"), drawtype = "liquid", tiles = { { @@ -1289,7 +1284,6 @@ minetest.register_node("default:lava_source", { minetest.register_node("default:lava_flowing", { description = "Flowing Lava", - inventory_image = minetest.inventorycube("default_lava.png"), drawtype = "flowingliquid", tiles = {"default_lava.png"}, special_tiles = { @@ -1722,7 +1716,6 @@ minetest.register_node("default:glass", { description = "Glass", drawtype = "glasslike_framed_optional", tiles = {"default_glass.png", "default_glass_detail.png"}, - inventory_image = minetest.inventorycube("default_glass.png"), paramtype = "light", sunlight_propagates = true, is_ground_content = false, @@ -1734,7 +1727,6 @@ minetest.register_node("default:obsidian_glass", { description = "Obsidian Glass", drawtype = "glasslike_framed_optional", tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, - inventory_image = minetest.inventorycube("default_obsidian_glass.png"), paramtype = "light", is_ground_content = false, sunlight_propagates = true, From 04f01bc57fee73d407874c1c92d59fa9ba803e2c Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Sat, 13 Feb 2016 11:30:21 +0100 Subject: [PATCH 04/48] Doors: fix unability to register doors outside of doors mod --- mods/doors/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 2d6271e6..e96a7f53 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -178,7 +178,7 @@ function doors.register(name, def) end }) - minetest.register_craftitem("doors:" .. name, { + minetest.register_craftitem(":doors:" .. name, { description = def.description, inventory_image = def.inventory_image, @@ -288,7 +288,7 @@ function doors.register(name, def) end end - minetest.register_node("doors:" .. name .. "_a", { + minetest.register_node(":doors:" .. name .. "_a", { description = def.description, visual = "mesh", mesh = "door_a.obj", @@ -320,7 +320,7 @@ function doors.register(name, def) }, }) - minetest.register_node("doors:" .. name .. "_b", { + minetest.register_node(":doors:" .. name .. "_b", { description = def.description, visual = "mesh", mesh = "door_b.obj", From 7d2dfe41016c7c4b50d1afdab308efca00c20681 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 13 Feb 2016 08:33:58 +0000 Subject: [PATCH 05/48] Consolidate ABMs Spread ABM intervals evenly across 1 to 16 seconds 16s ensures no nodes are missed when player walks past Adjust chance values to compensate, for identical action rates Combine lavacooling ABMs into one, return to chance = 1 Grass growth: add 'neighbors = "air"' to avoid processing the thousands of underground dirt nodes Grass death: Reduce action rate to that of grass growth Fire: Use chance = 1 for flame extinguishing and flame removal when mod is disabled --- mods/default/functions.lua | 52 +++++++++++++++----------------------- mods/farming/api.lua | 4 +-- mods/fire/init.lua | 4 +-- mods/flowers/init.lua | 4 +-- mods/stairs/init.lua | 2 +- mods/tnt/init.lua | 2 +- 6 files changed, 28 insertions(+), 40 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 0137d912..3afaec88 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -88,37 +88,24 @@ end -- Lavacooling -- -default.cool_lava_source = function(pos) - minetest.set_node(pos, {name = "default:obsidian"}) - minetest.sound_play("default_cool_lava", - {pos = pos, max_hear_distance = 16, gain = 0.25}) -end - -default.cool_lava_flowing = function(pos) - minetest.set_node(pos, {name = "default:stone"}) +default.cool_lava = function(pos, node) + if node.name == "default:lava_source" then + minetest.set_node(pos, {name = "default:obsidian"}) + else -- Lava flowing + minetest.set_node(pos, {name = "default:stone"}) + end minetest.sound_play("default_cool_lava", {pos = pos, max_hear_distance = 16, gain = 0.25}) end minetest.register_abm({ - nodenames = {"default:lava_flowing"}, + nodenames = {"default:lava_source", "default:lava_flowing"}, neighbors = {"group:water"}, interval = 1, - chance = 2, + chance = 1, catch_up = false, action = function(...) - default.cool_lava_flowing(...) - end, -}) - -minetest.register_abm({ - nodenames = {"default:lava_source"}, - neighbors = {"group:water"}, - interval = 1, - chance = 2, - catch_up = false, - action = function(...) - default.cool_lava_source(...) + default.cool_lava(...) end, }) @@ -177,8 +164,8 @@ end minetest.register_abm({ nodenames = {"default:cactus"}, neighbors = {"group:sand"}, - interval = 50, - chance = 20, + interval = 12, + chance = 83, action = function(...) default.grow_cactus(...) end @@ -186,9 +173,9 @@ minetest.register_abm({ minetest.register_abm({ nodenames = {"default:papyrus"}, - neighbors = {"default:dirt", "default:dirt_with_grass", "default:sand"}, - interval = 50, - chance = 20, + neighbors = {"default:dirt", "default:dirt_with_grass"}, + interval = 14, + chance = 71, action = function(...) default.grow_papyrus(...) end @@ -358,8 +345,9 @@ minetest.register_abm({ minetest.register_abm({ nodenames = {"default:dirt"}, - interval = 2, - chance = 200, + neighbors = {"air"}, + interval = 6, + chance = 67, catch_up = false, action = function(pos, node) local above = {x = pos.x, y = pos.y + 1, z = pos.z} @@ -384,8 +372,8 @@ minetest.register_abm({ minetest.register_abm({ nodenames = {"default:dirt_with_grass", "default:dirt_with_dry_grass"}, - interval = 2, - chance = 20, + interval = 8, + chance = 50, catch_up = false, action = function(pos, node) local above = {x = pos.x, y = pos.y + 1, z = pos.z} @@ -407,7 +395,7 @@ minetest.register_abm({ minetest.register_abm({ nodenames = {"default:cobble"}, neighbors = {"group:water"}, - interval = 17, + interval = 16, chance = 200, catch_up = false, action = function(pos, node) diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 7123cbc1..a0c1992f 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -264,8 +264,8 @@ farming.register_plant = function(name, def) minetest.register_abm({ nodenames = {"group:" .. pname, "group:seed"}, neighbors = {"group:soil"}, - interval = 90, - chance = 2, + interval = 9, + chance = 20, action = function(pos, node) local plant_height = minetest.get_item_group(node.name, pname) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index fc55b8dd..a5566628 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -170,7 +170,7 @@ minetest.register_abm({ nodenames = {"fire:basic_flame", "fire:permanent_flame"}, neighbors = {"group:puts_out_fire"}, interval = 3, - chance = 2, + chance = 1, catch_up = false, action = function(p0, node, _, _) minetest.remove_node(p0) @@ -189,7 +189,7 @@ if minetest.setting_getbool("disable_fire") then minetest.register_abm({ nodenames = {"fire:basic_flame"}, interval = 7, - chance = 2, + chance = 1, catch_up = false, action = function(p0, node, _, _) minetest.remove_node(p0) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index dd8e031d..dd90f4c9 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -76,8 +76,8 @@ end minetest.register_abm({ nodenames = {"group:flora"}, neighbors = {"default:dirt_with_grass", "default:desert_sand"}, - interval = 50, - chance = 25, + interval = 13, + chance = 96, action = function(pos, node) pos.y = pos.y - 1 local under = minetest.get_node(pos) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index ea2933b6..7688d905 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -233,7 +233,7 @@ end if replace then minetest.register_abm({ nodenames = {"group:slabs_replace"}, - interval = 8, + interval = 16, chance = 1, action = function(pos, node) node.name = minetest.registered_nodes[node.name].replace_name diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 6a459655..e10ac2fe 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -376,7 +376,7 @@ minetest.register_node("tnt:gunpowder_burning", { minetest.register_abm({ nodenames = {"tnt:tnt", "tnt:gunpowder"}, neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"}, - interval = 1, + interval = 4, chance = 1, action = burn, }) From b47a5564720f7fddcdd9163c3b1847abd47f4c3d Mon Sep 17 00:00:00 2001 From: Craig Davison Date: Mon, 1 Feb 2016 17:16:20 +0000 Subject: [PATCH 06/48] Remove log_mods from TNT This option is not documented nor is it used with any other mod in Minetest Game so why should it be used in TNT? --- mods/tnt/init.lua | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index e10ac2fe..4e033c61 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -395,8 +395,3 @@ minetest.register_craft({ {"", "group:wood", ""} } }) - -if minetest.setting_get("log_mods") then - minetest.debug("[TNT] Loaded!") -end - From 36d18cb16163405234f92d17897b66d12487476a Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Tue, 9 Feb 2016 21:34:03 +0000 Subject: [PATCH 07/48] added timer to tnt:tnt_burning for explosions By adding the timer to the tnt:tnt_burning node it will help mods add the block and cause an explosion after 4 seconds instead of doing nothing like in it's current state. --- mods/tnt/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 4e033c61..981cc9ee 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -234,7 +234,6 @@ minetest.register_node("tnt:tnt", { if puncher:get_wielded_item():get_name() == "default:torch" then minetest.sound_play("tnt_ignite", {pos=pos}) minetest.set_node(pos, {name="tnt:tnt_burning"}) - minetest.get_node_timer(pos):start(4) end end, on_blast = function(pos, intensity) @@ -258,6 +257,9 @@ minetest.register_node("tnt:tnt_burning", { light_source = 5, drop = "", sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + minetest.get_node_timer(pos):start(4) + end, on_timer = boom, -- unaffected by explosions on_blast = function() end, From 8422f2ef52bd424cc04f43b7d32aa7b20bf30647 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 13 Feb 2016 09:45:42 -0800 Subject: [PATCH 08/48] Fix character.b3d animation issues. Both the standing and sitting animations had misplaced curve cusps that caused the end part of the animation to wiggle the feet slightly back and forward. I've fixed both animations parts and re-exported. Verified in-game with multiplayer that everything was indeed fixed. --- mods/default/models/character.b3d | Bin 86880 -> 86880 bytes mods/default/models/character.blend | Bin 628432 -> 724412 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/models/character.b3d b/mods/default/models/character.b3d index bc9d92735aa6bf688cfb55e4d552c347f453f3fe..f411f4713724d7a026e0e411c2d138c566527a0c 100644 GIT binary patch delta 30287 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 literal 86880 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∓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 diff --git a/mods/default/models/character.blend b/mods/default/models/character.blend index 34c562407a47a90ee4b6a25f2a8aea8c212bf6ea..6493f813d70fb4dd2107ec7d5fbf584bf083c275 100644 GIT binary patch literal 724412 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

n0l+(Y6z=uH18iw-25-@z5~{ln6oeZ@>kVz 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ðz~ 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 literal 628432 zcmeF43t$~po&P6onnt)nMbrW+QCO%7SSdmUZIiY@s0B(}q_CAVv?&d=Nj6Dq@h=*5 zRd&}$-3F+vO2x;r>*}I_7Q{9@+${@g#dYnvKCa+ueb>ioRkZ)#cRusGbMDPentN|l zT4&mu`OKViX6F3v`J8#&xpU_%IQxQmXD@17f9mNo7a6ujQS|KH&$qu(R2Tn^qOaL_ z@rsVFj%2!;(UP+lFKM(THofd)IhEJ42a;D)Q`0xIR~Cb;4PIQ z^nQo$f0%Z#aesgRzG_|vTO3O36Tbfkv;Wn+_bO8wuY+ki^MC(+!ol=@m#a(W|LAR? zT+9xZd71yCzxM}w|F3qO`9FFaI9OaSSC7p9(ck;b|AXf`Kz95;{JqTl&-~B!|D(5o za{JALWnSk0=~2r8?SB3{2%?j&-VYr_Zj2W_Wsz*$@c%l-^QivKYAPZWA{^k%=KmdkN)0g`~Ttlj6Y`k9M5%S`~TtZ<-z2?zS~jldt7Zft#drv z=$~R)2h09Hd;f>~y}$O9`M>}D|7d+f=6~gFZhvjE+Vsr-%HNC3|IGhv|6hF@IMDn5 z%>U}&dmR@X=Nxm#xk?_zw-A#JO8i#*e|>OS9yE;L-qri|CPTVng5yp+5W%!Hjo|v zSKjCRq4oh;|6kpE@#o1y_&L3^r2YOoO|Nf8v5A^qVr0viA-~W5BK4PT! z9Srj`|M%Yp4u}A_E-9}M^P3Zq^cfPS<^No+?qAAgY zfygo^!`w5MUEJ5v+qZ0fckjyf6|0xc>*%|>zq@DI+Rmlc%3@+9_w8ys~5c zsV|*A^VI1tnX&B3_O%^-g$!+)T(-7*W#6)u9jn^ct?Ac9$C|!nD^|Dnwy)^#=so3% zH62|meU;fbi$E5ECrJb@IX{Z>wk-=A`x`z@UomXUE;;{_&aU&@yM`rHFhhNk57SQl zR<7~mZ)^x(6O+U}AA5Ul%SYdy^SlGQZp=;j$~}iQ*^CLv%hP;(`<@$ftzX>O;L`(# zp4+hc@N*k9-g*dp{a2PZ_-kIvl9oFyv(|raNu8%mIagg~JgCnU^sVUa=%}Ig^-)u_ zdD8iD73-o&(T^uiiu>q+J(m==nKeey-lgxzEq(dQhTWH}Y?yiRJ95)r^^V-_HjZB( zS=uo5KROC!7GDrWs>dFy$JcGF?cVhXw%M1rc+re`O|R(;FCxs{DQ9$so_ z%KC=QPg~!Rx7XGq);Bc1@v8Xc>G6KXCJGzs2_ua4ejI6OTJAS&to1e8vP-jjKBalS zg~lpJ-obds=J}N7`Lw;h%xfnX=Tn;J({fZ!<7+4DZxm^HQ*EsJ>PJ?!ebcPoHj1~? z^K07kD&6z;7^|$uP5CrUROn?uI}}dZ>W#og=pVCTYwE)uX=5RUip8%HW%G)uaZIQ%vlkoKW=GpjQ%Ca zH?(FRMRvBt>@$tayDAG%P#Kej9Q7$?px^D8(@vC%6 z>9p55os&{sT!T7Wo@%1uXhv23_4rJ)n0S18K6-5~j;EG6@QJz6!0HFn#Sb+5biK`d zMw0OUq@#RCGX1nFahX@0clISS=Cv(c z($?SIy{50N`--bNR`ly&(=v}?sI~ls@%oyUXys#AUD+((``x~MdO!Dhvr2M3HOQ^D zqFAW@c^fNh&pS5d6dS{MD6PvCz3ci`d*T?zwU(b#;rhyL(r13ZZ{IsD;YB5}(0<+r zkA>==x0%Yi`JJ0`VcRHMm$;4iQbr%wT3!ue^fl~1b$$|yS0q{0Ml|?X?6FY&^ERzm z3~k($Q)~?5p?qEX`g^;t9+M@tmR~&PHTf0~AAcx`g{OE7Cix5-dn{D{yiF?>yWh1b zr`Q2>!^i7Jh{aQatR4&1KX3CDi?Cz?17ZPvV4YnUq-}(0?TUw~3&G%TS{&|~LESBG}DW}*N z#zSdc;{8aQg`VmZ4Z&f8(Z{V&jWU z>(aMk-I|{Mw(iQ_s9MX9N4t2&2(d^GpW~`}EL8uz%~33FziCrWv57O-pJ8?ByJqd$ zj{e?jJi~s*wU%F8+3Lz}&F>ONJkj?fjXuN19t+h!Z_|p!uFacrij84Bq;=uA)2@E5 z?pWD5w$8$qP;2?~ZGE*Jbw<$#pP;{(7fO-T&qp2$)jw}D6^rQRO*zFzs9~hKjMbG| z%g3>(QIsG2mRP)>Di!|5^-ZQc7OH>V<|$3*Fp5o*Wmqg;)6se5>i+8YBbAoFBwk-_ zE#sENk!@b7WPC_4?Xgh(^EST_CyR||D}7&sx{Rr5)LOpACJ|TTy@?~=_ev$>LxX9> zLf1KT?*6#VS1h)E?An~p>*H)XkB=^Uz>Caoxvu%>=Q6GS$Is)xl4Ka^Jl@lNImx)} zdHgOrOW0MCajcVE=V*wYA75Qnsgako@I9MydX2VhZ!5}|w~U3h5)?|`>ox6t+RJwI zw)c1U202E@TFYNxS3?(bO}D)#8uR6YqK(?MkMsB`MRSWMysfBxcw5o6Gqs&KXMD}) zBM+vfnwz8L@3ZNj-9OQ0>YAvAYmyz;txQIK&BxD^Jv~YG5pBiZfb^Qrkf;Ff<+u)jx0PO53w#Q!Z>9Xi;csXc7psE7FezY$Do8);l?`Sat|HQDZDOsgxq8ULBYLWw#y@b*ydTA=Emw>*l4 z_QQ&eVLYUDxx%*Q%HHmET`Su<*S23dMp0@lKc}$Prt`GcvGv%#^^ETwAr|GXbEy7# zE9Ol|vGJv)b+MMfp1!TSx3i>1r)sIKF7Qu!6Pv)-(QK5DU%mc2RnrL+33z z{(Rg<9t$0ts?3vd80}b8pHL6qX0O%ol+ori-o7cPK4gjQY{Yk3W|s7}_%r3O?3cg) z?P2rY(J-(*iu7VQ^w9GZsxd~w!{kAH64*7sc$mpSJ(owMIL|D0LJopg7ce(RD; z@BQ%eI%dD{72lraWi@`@quuw}@@A{N%G_@GH2*YP);p}c%4qs-TdtP%qNMz+ws|cx zHhgrbZ|9erRsIw2{oh&F{rHUS{r_~)cH4&S>n?l4>;(%yKI?riy<6Kb>s@!Qz4yd# zKQjBPt>4~e+fcX!@Vt+#X|Zi+S-EHXtgilxXE)t_j;(*uo$DJ`ZTr;rufJmJb0b^- z3s3uO&$|0Rv2$0;*WWkk{_p0Eb1+ed;v&CB?>cnP&k>DW~3WIQoyoH}SzIji%)?9V;&h<%j%+Ib@{e~R6s zGFdm6R5bWKU%JoB@A(?K_`m(x>eD zkG-aEx6fJa-lC~*y{fRz^7niVTS{RQ)DGh78@AkU*j(joH7;aG=6OD)dA^OxSIFBC z->KyJl;-(%8T&FfHZ;Wh3(u!C&)0P1`i6L!wobo`(DNzH^WAobUH>ht_XiWT&7Mzb zo^Ow_%Be0J8-AeXQOKt>&o}eVO*xfQ`iA6y)|aO=&o^MKa^x#sp3*$u4r7%g-%uQU zU!KxD-;}#HnYOHd~XKgxuk9>Jb^L$&3RZh7!Od8OrP+z5azTL(u zr}U*01~e+uY;2>rU3>e|w6;-smF{`-#wx4! z>TM^?t8~vhZL9fb(^{stpD?e|J#UY(%4(VA@+#f)ZZ%d}x#jIGT&~hRZ*;facVg4> zp3Bx6v@K(mn4kW0lo5r0q0~uhKnl(>)e1o7OVR zV`o_DXY%BpVV@+#f)Hhzkb5NUB+etl3wajvPmF{_W7^|$> zj(Z<2SLvR2$~McV{3GO5y60VLtg`Y#{fm~V!TSfLd)_U^Dyz0zF0ax(?`~t2)wY() zt8~w+eYwi&JuVktrF&j&o671vD~;K5OVcsIV>VXbH|5nJtEXue1Uy@@lzu)-L;%O^0 z+Th0l+;6P1y5HExI+o;kGQHpUT@6P^dW}4IohMnHO9x6;d^lLTn8LKjM=|mEC{gi> zGY$PDiN~|;cvZtrrknfc4cL40uK4K1=Ei%$DC$lwtoUb7ZzxG;8UB~}=+L&#?#H%q z{UNr*FHRh=m**)zR(s$`tvH>}DK$?^t$k2@mfK>~P9L+e+U!s zyiIJk%=PtC>xPn(AwL(|`m+rUdhNR7+Fa9JBez+l`+HKHZ*Z<{h7C!Zjowx=P3lO0 zpQTFJ5VzTZzq7K|W_=vD*U~mSweILhukwS}`NOtc)wy(_WctpOrdK-cZB{Yy_-Gl5 zSG=tFv-MXz=*z7ec+=bo(U%_3w4F&=O-T7rGM<%;z0LX;dpzBjlZ?%2yGP#2q@R~g zt^07@WP6q5OeQ@(nk=_Wl`da$_}u(ITEF^4x(^thgZ;u@OHkgtjkWN`e=06B=i((x zF1%o|ZjxWo-KG2ZEK>zTt>x!dv(l37`!%%KzrkR<%2&14WaY`|tw}8WzHm==w^YSq=P&Fy&)PniCqYAwIGeQnR0j+ITxXN7YrTRU}lei92!DHa}sa-Wx~ z{&~xzShVi7b4ZJgVLYUD>08~tvZ5w2F69?jwbo?glhGkTEHukwksP|lxx8Jd{&}0D zSoHkb&W9{EaR&R7#=`C}(Y-)p`ND)39*6P^t6FQY0fs-bdrj0|_~5Z9_j#%6pSO(4 zzWFzHjm2W)<$_pr+r4{s*UgHKz6!dGTFWoAwKgrRbgjPijK4ZUEJ{Bw)$xVupSQ7M zG4xxz=4G)ljEA%?ef_4c&mQx**7A$1T5Iv<-5@UiFr$+V9TXDrg$Eu2rFDRZqF_#_r@DV}Yg)1-s<7pi~WX1h{~jps^ZaYg&szIEp% z8P{5VPE~6y-iBPzE|lW^#i2nq#UgLhI_JIH#vY3xOQBpi@5#>TcfRd=y7tA~Ex`t> z&dY6D*9!c)LF->%)ev9rO0E~{+G==B{58qW_YGF=@Wb^936b*a1_NiVYS8Pprw``# z964BMN4{FEQ`fqb?&rlt`SS0aM_#{f@UJD)zNGSF-@f>|LH=V_)~*})xa@U<4U>+x zPe?|(ZlJXkEwf~`lpOzSU5bgvN2^r4qG({q?kb$iCbZ7EdUtf+!%J2crkP*-*SFoT z8)*6n%hC~N(>0XVInnF>zExvB=WS}S2@Mm>lln%B%_^ox{HtXuergk?!~RQ`mKc3n z?MF9|sEuv2aXC*9AAJ!|id0>o(YCvT^3EOHWh^KC8ojQ2`{z7Oz#-T8Ly?yO{ap3}!+n|P{~C>>O~bY3mfYO_z+0@TLtv2nSDm)VS3R{2LMJMH~% z9=5;Q--=cDc%NotmEUJ$%~Kz$*U)K$@%?zqEg<6GC-ZG&LtUhMO`aYTtm9T)h1UFM z#AL_qde&Vse_-0`2Ir*^sq`8;(6=G!eZK7%1J+#1)|;^@ zt6n}|^>S9doT-=ATW|Mzsg5x9f~glwybfn_5JGVH(%AD{j7ghAKvG1sr9!yj=9dteBa*ey1HX0UKQUJWyj5u+J?

I+dfx~&;~veQ(1i`mW<0D+a5dd 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 zBN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H z2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5) zg7FB(BN&hLeSG%_#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>Sy zU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv z7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E z#v>SyU_65H2*x8l%fdZ^@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84 z@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fh zJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8A zk6=84@d(Bv7>{5)g7HYtfpL#uJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB( zBN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H z2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5) zg7FB(BN&fhJc98E#v>SyU_8<@l-wg2k6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>Sy zU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv z7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E z#v>SyU_65H2*x8Ak6=84@d(Bv7?1S)G4}|@BN&fhJc98E#v>SyU_65H2*x8Ak6=84 z@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fh zJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8A zk6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v?tu&pm?i2*x8Ak6=84@d(Bv7>{5)g7FB( zBN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H z2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5) zg7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@kr0TbdO*>g7FB(BN&fhJc98E#v>Sy zU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv z7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E z#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJkm2`-6I%}U_65H2*x8Ak6=84 z@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fh zJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8A zk6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8AkMz7{_Xx%#7>{5)g7FB( zBN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H z2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5) zg7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BR#9!J%aHF#v>Sy zU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv z7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E z#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65Hi0Ay*@vQRr zng4jid_02j2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84 z@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fh zJc98E#v>SyU_65H2*x8Ak6=84@d(Bv7>{5)g7FB(BN&fhJc98E#v>SyU_65H2*x8A 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 From 363b95c0037997eae92fac75a15d1d28be2f6e04 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 13 Feb 2016 10:03:23 -0800 Subject: [PATCH 09/48] Doors: Allow arbitrary recipe to be passed, even nil This allows mod makers to register their own recipies, including none, to register doors. --- game_api.txt | 2 +- mods/doors/init.lua | 38 ++++++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/game_api.txt b/game_api.txt index 7395f3b4..a765aee6 100644 --- a/game_api.txt +++ b/game_api.txt @@ -97,7 +97,7 @@ doors.get(pos) inventory_image = "mod_door_inv.png", groups = {choppy = 1}, tiles = { "mod_door.png" }, - material = "default:wood", -- used to make a craft recipe + recipe = craftrecipe, sounds = default.node_sound_wood_defaults(), -- optional sound_open = sound play for open door, -- optional sound_close = sound play for close door, -- optional diff --git a/mods/doors/init.lua b/mods/doors/init.lua index e96a7f53..925c94e8 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -352,14 +352,12 @@ function doors.register(name, def) }, }) - minetest.register_craft({ - output = "doors:" .. name, - recipe = { - {def.material,def.material}; - {def.material,def.material}; - {def.material,def.material}; - } - }) + if def.recipe then + minetest.register_craft({ + output = "doors:" .. name, + recipe = def.recipe, + }) + end _doors.registered_doors["doors:" .. name .. "_a"] = true _doors.registered_doors["doors:" .. name .. "_b"] = true @@ -370,7 +368,11 @@ doors.register("door_wood", { description = "Wooden Door", inventory_image = "doors_item_wood.png", groups = { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, - material = "group:wood", + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + } }) doors.register("door_steel", { @@ -379,7 +381,11 @@ doors.register("door_steel", { inventory_image = "doors_item_steel.png", protected = true, groups = { snappy = 1, bendy = 2, cracky = 1, melty = 2, level = 2 }, - material = "default:steel_ingot", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + } }) doors.register("door_glass", { @@ -387,8 +393,12 @@ doors.register("door_glass", { description = "Glass Door", inventory_image = "doors_item_glass.png", groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 }, - material = "default:glass", sounds = default.node_sound_glass_defaults(), + recipe = { + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + } }) doors.register("door_obsidian_glass", { @@ -396,8 +406,12 @@ doors.register("door_obsidian_glass", { description = "Glass Door", inventory_image = "doors_item_obsidian_glass.png", groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 }, - material = "default:obsidian_glass", sounds = default.node_sound_glass_defaults(), + recipe = { + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + }, }) ----trapdoor---- From 5569950b26507704f603fc2e43b3cae26825c511 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 31 Jan 2016 19:29:01 -0800 Subject: [PATCH 10/48] New gravel texture. Issue #811 - new gravel texture needed. This texture was Gambits' PixelBOX gravel light texture. Gambit posted that his texture pack is WTFPL: - https://forum.minetest.net/viewtopic.php?f=4&t=4990&start=50#p141196 I've made significant modifications to this texture: - slightly rotated and rolled some sections of pixels - minor burn/dodge some pixels to keep high contrast - removed lineair repeating effects - etc. Attribution is added back to Gambit. Thanks. --- mods/default/README.txt | 3 +++ mods/default/textures/default_gravel.png | Bin 201 -> 3570 bytes 2 files changed, 3 insertions(+) diff --git a/mods/default/README.txt b/mods/default/README.txt index c190cee0..e51b8747 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -156,6 +156,9 @@ sofar (CC BY-SA 3.0): default_aspen_tree_top, derived from default_pine_tree_top (by paramat) default_aspen_wood, derived from default_pine_wood (by paramat) +sofar (WTFPL): + default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel + Neuromancer (CC BY-SA 2.0): default_cobble.png, based on texture by Brane praefect default_mossycobble.png, based on texture by Brane praefect diff --git a/mods/default/textures/default_gravel.png b/mods/default/textures/default_gravel.png index ad48fa463b8fc5d92082c7eed8ccf24356c6fddf..25a78b648cb8ec757679124772b0382c6804d022 100644 GIT binary patch literal 3570 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 From 1ab0fc12a73fb80448657782894fec062094358e Mon Sep 17 00:00:00 2001 From: MT-Modder Date: Sat, 13 Feb 2016 17:19:38 -0500 Subject: [PATCH 11/48] Add background image to book formspec --- mods/default/craftitems.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 406943e2..bb8c445c 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -21,6 +21,7 @@ local function book_on_use(itemstack, user, pointed_thing) local formspec if owner == player_name then formspec = "size[8,8]"..default.gui_bg.. + default.gui_bg_img.. "field[0.5,1;7.5,0;title;Title:;".. minetest.formspec_escape(title).."]".. "textarea[0.5,1.5;7.5,7;text;Contents:;".. @@ -28,6 +29,7 @@ local function book_on_use(itemstack, user, pointed_thing) "button_exit[2.5,7.5;3,1;save;Save]" else formspec = "size[8,8]"..default.gui_bg.. + default.gui_bg_img.. "label[0.5,0.5;by "..owner.."]".. "label[0.5,0;"..minetest.formspec_escape(title).."]".. "tableoptions[background=#00000000;highlight=#00000000;border=false]".. From bbf17c9ecabe3e6f8782d1faf91c34ece361026b Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 13 Feb 2016 20:00:37 -0800 Subject: [PATCH 12/48] Allow building doors on buildable_to nodes. This code never allowed placing a door on e.g. a grass plant. The code to handle this isn't that complex. With this code, doors can be placed on flowers and on normal node surfaces without issues. --- mods/doors/init.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 925c94e8..b1a04cc7 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -183,8 +183,15 @@ function doors.register(name, def) inventory_image = def.inventory_image, on_place = function(itemstack, placer, pointed_thing) - local pos = pointed_thing.above - local node = minetest.get_node(pos) + local pos = nil + + local node = minetest.get_node(pointed_thing.under) + if minetest.registered_nodes[node.name].buildable_to then + pos = pointed_thing.under + else + pos = pointed_thing.above + node = minetest.get_node(pos) + end if not minetest.registered_nodes[node.name].buildable_to then return itemstack From 2cc6640edffd96fcef16fe76901a1de7ab3326f0 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 13 Feb 2016 20:27:03 -0800 Subject: [PATCH 13/48] Open doors when right-clicking a door with a door. And similarly, if we wield a door and right click any node that has an on_rightclick() handler, call the handler instead. Just to be on the safe side, assure that none of this code runs when right-clicking an entity or player, which would likely crash the server. Fold in PR #831 as well - prevent server crash on door place on unknown blocks, by @tenplus1. --- mods/doors/init.lua | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index b1a04cc7..f6808974 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -185,16 +185,26 @@ function doors.register(name, def) on_place = function(itemstack, placer, pointed_thing) local pos = nil + if not pointed_thing.type == "node" then + return itemstack + end + local node = minetest.get_node(pointed_thing.under) - if minetest.registered_nodes[node.name].buildable_to then + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, + node, placer, itemstack) + end + + if def and def.buildable_to then pos = pointed_thing.under else pos = pointed_thing.above node = minetest.get_node(pos) - end - - if not minetest.registered_nodes[node.name].buildable_to then - return itemstack + def = minetest.registered_nodes[node.name] + if not def or not def.buildable_to then + return itemstack + end end local above = { x = pos.x, y = pos.y + 1, z = pos.z } From ed9fd475de2db49a9a5a8568e75a97c790936967 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 14 Feb 2016 12:21:51 -0800 Subject: [PATCH 14/48] Call on_place_node() callbacks after placing door. Other mods may depend on knowing whether doors are placed to setup additional attributes or perform node manipulations. This is something e.g. mesecons does to connect circuits to doors. This was tested with mesecons. Placing a door next to a mesecon wire will make the wire automatically connect, which was otherwise not happening. --- mods/doors/init.lua | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index f6808974..5a27459c 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -154,6 +154,25 @@ function _doors.door_toggle(pos, clicker) return true end + +local function on_place_node(place_to, newnode, placer, oldnode, itemstack, pointed_thing) + -- Run script hook + local _, callback + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} + local newnode_copy = {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} + local oldnode_copy = {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} + local pointed_thing_copy = { + type = pointed_thing.type, + above = vector.new(pointed_thing.above), + under = vector.new(pointed_thing.under), + ref = pointed_thing.ref, + } + callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) + end +end + function doors.register(name, def) -- replace old doors of this type automatically minetest.register_abm({ @@ -249,6 +268,8 @@ function doors.register(name, def) itemstack:take_item() end + on_place_node(pos, minetest.get_node(pos), placer, node, itemstack, pointed_thing) + return itemstack end }) From 3fcb7821d78aef7c647a7e2687ff1a6328eb108b Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Thu, 14 Jan 2016 21:22:21 -0800 Subject: [PATCH 15/48] Move character.png to textures. This file is obviously out of place, as the engine does not load textures, ever, out of a models folder. --- mods/default/{models => textures}/character.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename mods/default/{models => textures}/character.png (100%) diff --git a/mods/default/models/character.png b/mods/default/textures/character.png similarity index 100% rename from mods/default/models/character.png rename to mods/default/textures/character.png From 73d998ccdf73d2193b5e83f791ebbd422e2dedaf Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 18 Jan 2016 13:35:21 -0800 Subject: [PATCH 16/48] Lower snow footstep and dig sound level. These sounds were perceived to be too loud in the game. I've lowered them significantly but they remain plenty audible. The dig sounds were very loud as well so I toned them down as well. --- mods/default/nodes.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 27c719da..d00e67ac 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -324,11 +324,10 @@ minetest.register_node("default:dirt_with_snow", { groups = {crumbly = 3, soil = 1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.25}, + footstep = {name = "default_snow_footstep", gain = 0.15}, }), }) - minetest.register_node("default:sand", { description = "Sand", tiles = {"default_sand.png"}, @@ -380,8 +379,9 @@ minetest.register_node("default:snow", { }, groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1}, sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.25}, - dug = {name = "default_snow_footstep", gain = 0.75}, + footstep = {name = "default_snow_footstep", gain = 0.15}, + dug = {name = "default_snow_footstep", gain = 0.2}, + dig = {name = "default_snow_footstep", gain = 0.2} }), on_construct = function(pos) @@ -397,12 +397,12 @@ minetest.register_node("default:snowblock", { tiles = {"default_snow.png"}, groups = {crumbly = 3, puts_out_fire = 1}, sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.25}, - dug = {name = "default_snow_footstep", gain = 0.75}, + footstep = {name = "default_snow_footstep", gain = 0.15}, + dug = {name = "default_snow_footstep", gain = 0.2}, + dig = {name = "default_snow_footstep", gain = 0.2} }), }) - minetest.register_node("default:ice", { description = "Ice", tiles = {"default_ice.png"}, From 4c9944b263d31a8511a252f758e1bedf28559f7a Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Sat, 20 Feb 2016 13:24:29 +0100 Subject: [PATCH 17/48] Creative: Rename fields with correct naming convention to avoid possible conflicts --- mods/creative/init.lua | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index bac75e01..01163707 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -113,15 +113,15 @@ creative.set_creative_formspec = function(player, start_i, pagenum, tab_id) tableoptions[background=#00000000;highlight=#00000000;border=false] button[5.4,3.2;0.8,0.9;creative_prev;<] button[7.25,3.2;0.8,0.9;creative_next;>] - button[2.1,3.4;0.8,0.5;search;?] - button[2.75,3.4;0.8,0.5;clear;X] - tooltip[search;Search] - tooltip[clear;Reset] + button[2.1,3.4;0.8,0.5;creative_search;?] + button[2.75,3.4;0.8,0.5;creative_clear;X] + tooltip[creative_search;Search] + tooltip[creative_clear;Reset] listring[current_player;main] ]] .. - "field[0.3,3.5;2.2,1;filter;;".. filter .."]".. + "field[0.3,3.5;2.2,1;creative_filter;;".. filter .."]".. "listring[detached:creative_".. player_name ..";main]".. - "tabheader[0,0;tabs;Crafting,All,Nodes,Tools,Items;".. tostring(tab_id) ..";true;false]".. + "tabheader[0,0;creative_tabs;Crafting,All,Nodes,Tools,Items;".. tostring(tab_id) ..";true;false]".. "list[detached:creative_".. player_name ..";main;0,0;8,3;".. tostring(start_i) .."]".. "table[6.05,3.35;1.15,0.5;pagenum;#FFFF00,".. tostring(pagenum) ..",#FFFFFF,/ ".. tostring(pagemax) .."]".. default.get_hotbar_bg(0,4.7).. @@ -139,7 +139,7 @@ creative.set_crafting_formspec = function(player) list[detached:creative_trash;main;0,2.75;1,1;] image[0.06,2.85;0.8,0.8;creative_trash_icon.png] image[5,1.75;1,1;gui_furnace_arrow_bg.png^[transformR270] - tabheader[0,0;tabs;Crafting,All,Nodes,Tools,Items;1;true;false] + tabheader[0,0;creative_tabs;Crafting,All,Nodes,Tools,Items;1;true;false] listring[current_player;main] listring[current_player;craft] ]] .. @@ -158,15 +158,15 @@ minetest.register_on_joinplayer(function(player) end) minetest.register_on_player_receive_fields(function(player, formname, fields) - if not minetest.setting_getbool("creative_mode") then + if formname ~= "" or not minetest.setting_getbool("creative_mode") then return end - -- Figure out current page from formspec + local player_name = player:get_player_name() local formspec = player:get_inventory_formspec() - local filter = formspec:match("filter;;([%w_:]+)") or "" - local start_i = formspec:match("list%[detached:creative_".. player_name ..";.*;(%d+)%]") - local tab_id = tonumber(formspec:match("tabheader%[.*;(%d+)%;.*%]")) + local filter = formspec:match("creative_filter;;([%w_:]+)") or "" + local start_i = formspec:match("list%[.-".. player_name ..";.-;(%d+)%]") + local tab_id = tonumber(formspec:match("tabheader%[.-;(%d+)%;")) local inv_size = player_inventory[player_name].size start_i = tonumber(start_i) or 0 @@ -174,20 +174,22 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if tab_id == 1 then creative.set_crafting_formspec(player) end - elseif fields.tabs then - if tonumber(fields.tabs) == 1 then + elseif fields.creative_tabs then + local tab = tonumber(fields.creative_tabs) + if tab == 1 then creative.set_crafting_formspec(player) else - creative.update_creative_inventory(player_name, filter, tonumber(fields.tabs)) - creative.set_creative_formspec(player, 0, 1, tonumber(fields.tabs)) + creative.update_creative_inventory(player_name, filter, tab) + creative.set_creative_formspec(player, 0, 1, tab) end - elseif fields.clear then + elseif fields.creative_clear then player_inventory[player_name].filter = "" creative.update_creative_inventory(player_name, nil, tab_id) creative.set_creative_formspec(player, 0, 1, tab_id) - elseif fields.search then - player_inventory[player_name].filter = fields.filter:lower() - creative.update_creative_inventory(player_name, fields.filter:lower(), tab_id) + elseif fields.creative_search then + local lowstr = fields.creative_filter:lower() + player_inventory[player_name].filter = lowstr + creative.update_creative_inventory(player_name, lowstr, tab_id) creative.set_creative_formspec(player, 0, 1, tab_id) else if fields.creative_prev then From 6b055ae18ad6af800bd953886547477b0ac3c1eb Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 20 Feb 2016 00:41:22 -0800 Subject: [PATCH 18/48] Fix broken door protection. A previous fix overwrote the `def` variable during registration, causing protected doors no longer to be placed with protection. --- mods/doors/init.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 5a27459c..c0f35536 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -209,19 +209,19 @@ function doors.register(name, def) end local node = minetest.get_node(pointed_thing.under) - local def = minetest.registered_nodes[node.name] - if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, + local pdef = minetest.registered_nodes[node.name] + if pdef and pdef.on_rightclick then + return pdef.on_rightclick(pointed_thing.under, node, placer, itemstack) end - if def and def.buildable_to then + if pdef and pdef.buildable_to then pos = pointed_thing.under else pos = pointed_thing.above node = minetest.get_node(pos) - def = minetest.registered_nodes[node.name] - if not def or not def.buildable_to then + pdef = minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then return itemstack end end From 777088481bc234cfdda24d3cb4668d1ceaae2492 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 19 Feb 2016 23:32:43 -0800 Subject: [PATCH 19/48] Fallback doors.register_door() code. This function maps doors.register_door to the new API as far as reasonable. We can't map the texture, so we fall back to a default texture. An error message is printed if mod writers did not provide the needed new tiles field for the door. The created doors are functional and a full replacement. Old doors are replaced with the new ones through an ABM. --- mods/doors/init.lua | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index c0f35536..b1a96a33 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -452,6 +452,59 @@ doors.register("door_obsidian_glass", { }, }) +-- Capture mods using the old API as best as possible. +function doors.register_door(name, def) + if def.only_placer_can_open then + def.protected = true + end + def.only_placer_can_open = nil + + local i = name:find(":") + local modname = name:sub(1, i - 1) + local doorname = modname .. "_" .. name:sub(i + 1, -1) + if not def.tiles then + if def.protected then + def.tiles = {{name = "doors_door_steel.png", backface_culling = true}} + else + def.tiles = {{name = "doors_door_wood.png", backface_culling = true}} + end + minetest.log("warning", modname .. " registered door \"" .. name .. "\" " .. + "using deprecated API method \"doors.register_door()\" but " .. + "did not provide the \"tiles\" parameter. A fallback tiledef " .. + "will be used instead.") + end + + doors.register(doorname, def) + + -- these help replace items present and conversion + minetest.register_alias(name, "doors:" .. doorname) + minetest.register_alias(name .. "_t_1", "doors:hidden") + minetest.register_alias(name .. "_t_2", "doors:hidden") + + minetest.register_abm({ + nodenames = {name .. "_b_1", name .. "_b_2"}, + interval = 7.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local l = tonumber(node.name:sub(-1)) + local meta = minetest.get_meta(pos) + local h = meta:get_int("right") + 1 + local p2 = node.param2 + local replace = { + {{type = "a", state = 0}, {type = "a", state = 3}}, + {{type = "b", state = 1}, {type = "b", state = 2}} + } + local new = replace[l][h] + + -- retain infotext and doors_owner fields + minetest.swap_node(pos, {name = "doors:" .. doorname .. "_" .. new.type, param2 = p2}) + meta:set_int("state", new.state) + -- wipe meta on top node as it's unused + minetest.set_node({x = pos.sx, y = pos.y + 1, z = pos.z}, {name = "doors:hidden"}) + end + }) +end + ----trapdoor---- function _doors.trapdoor_toggle(pos, clicker) From 2c355a8642fbc0b94dd45831c3464337ab64ce42 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 20 Feb 2016 20:03:09 -0800 Subject: [PATCH 20/48] Allow mod namespace for door registrations. This is an adapted version of #861 - by oleastre Most mods had been calling `doors.register_door() with a door name that included the "modname:" prefix, and we should continue to allow mods to do so, without registering the nodenames created in the "doors:" namespace. The default case is to use the "modname:" prefix verbatim. If mods or code calls this function without a prefix, then "doors:" is automatically used. Now that the namespace is corrected, the copy replacement ABM is no longer needed. --- mods/doors/init.lua | 67 ++++++++++++++------------------------------- 1 file changed, 21 insertions(+), 46 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index b1a96a33..67cb296b 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -119,7 +119,7 @@ function _doors.door_toggle(pos, clicker) local meta = minetest.get_meta(pos) local state = meta:get_int("state") local def = minetest.registered_nodes[minetest.get_node(pos).name] - local name = def.door.basename + local name = def.door.name if clicker then local owner = meta:get_string("doors_owner") @@ -146,7 +146,7 @@ function _doors.door_toggle(pos, clicker) end minetest.swap_node(pos, { - name = "doors:" .. name .. transform[state + 1][dir+1].v, + name = name .. transform[state + 1][dir+1].v, param2 = transform[state + 1][dir+1].param2 }) meta:set_int("state", state) @@ -174,9 +174,13 @@ local function on_place_node(place_to, newnode, placer, oldnode, itemstack, poin end function doors.register(name, def) + if not name:find(":") then + name = "doors:" .. name + end + -- replace old doors of this type automatically minetest.register_abm({ - nodenames = {"doors:"..name.."_b_1", "doors:"..name.."_b_2"}, + nodenames = {name.."_b_1", name.."_b_2"}, interval = 7.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) @@ -190,14 +194,14 @@ function doors.register(name, def) } local new = replace[l][h] -- retain infotext and doors_owner fields - minetest.swap_node(pos, { name = "doors:" .. name .. "_" .. new.type, param2 = p2}) + minetest.swap_node(pos, {name = name .. "_" .. new.type, param2 = p2}) meta:set_int("state", new.state) -- wipe meta on top node as it's unused minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, { name = "doors:hidden" }) end }) - minetest.register_craftitem(":doors:" .. name, { + minetest.register_craftitem(":" .. name, { description = def.description, inventory_image = def.inventory_image, @@ -249,9 +253,9 @@ function doors.register(name, def) local state = 0 if minetest.get_item_group(minetest.get_node(aside).name, "door") == 1 then state = state + 2 - minetest.set_node(pos, {name = "doors:" .. name .. "_b", param2 = dir}) + minetest.set_node(pos, {name = name .. "_b", param2 = dir}) else - minetest.set_node(pos, {name = "doors:" .. name .. "_a", param2 = dir}) + minetest.set_node(pos, {name = name .. "_a", param2 = dir}) end minetest.set_node(above, { name = "doors:hidden" }) @@ -296,9 +300,9 @@ function doors.register(name, def) def.groups.not_in_creative_inventory = 1 def.groups.door = 1 - def.drop = "doors:" .. name + def.drop = name def.door = { - basename = name, + name = name, sounds = { def.sound_close, def.sound_open }, } @@ -321,12 +325,12 @@ function doors.register(name, def) def.on_blast = function(pos, intensity) minetest.remove_node(pos) -- hidden node doesn't get blasted away. - minetest.remove_node({ x = pos.x, y = pos.y + 1, z = pos.z}) - return { "doors:" .. name } + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + return {name} end end - minetest.register_node(":doors:" .. name .. "_a", { + minetest.register_node(":" .. name .. "_a", { description = def.description, visual = "mesh", mesh = "door_a.obj", @@ -358,7 +362,7 @@ function doors.register(name, def) }, }) - minetest.register_node(":doors:" .. name .. "_b", { + minetest.register_node(":" .. name .. "_b", { description = def.description, visual = "mesh", mesh = "door_b.obj", @@ -392,13 +396,13 @@ function doors.register(name, def) if def.recipe then minetest.register_craft({ - output = "doors:" .. name, + output = name, recipe = def.recipe, }) end - _doors.registered_doors["doors:" .. name .. "_a"] = true - _doors.registered_doors["doors:" .. name .. "_b"] = true + _doors.registered_doors[name .. "_a"] = true + _doors.registered_doors[name .. "_b"] = true end doors.register("door_wood", { @@ -461,7 +465,6 @@ function doors.register_door(name, def) local i = name:find(":") local modname = name:sub(1, i - 1) - local doorname = modname .. "_" .. name:sub(i + 1, -1) if not def.tiles then if def.protected then def.tiles = {{name = "doors_door_steel.png", backface_culling = true}} @@ -474,35 +477,7 @@ function doors.register_door(name, def) "will be used instead.") end - doors.register(doorname, def) - - -- these help replace items present and conversion - minetest.register_alias(name, "doors:" .. doorname) - minetest.register_alias(name .. "_t_1", "doors:hidden") - minetest.register_alias(name .. "_t_2", "doors:hidden") - - minetest.register_abm({ - nodenames = {name .. "_b_1", name .. "_b_2"}, - interval = 7.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local l = tonumber(node.name:sub(-1)) - local meta = minetest.get_meta(pos) - local h = meta:get_int("right") + 1 - local p2 = node.param2 - local replace = { - {{type = "a", state = 0}, {type = "a", state = 3}}, - {{type = "b", state = 1}, {type = "b", state = 2}} - } - local new = replace[l][h] - - -- retain infotext and doors_owner fields - minetest.swap_node(pos, {name = "doors:" .. doorname .. "_" .. new.type, param2 = p2}) - meta:set_int("state", new.state) - -- wipe meta on top node as it's unused - minetest.set_node({x = pos.sx, y = pos.y + 1, z = pos.z}, {name = "doors:hidden"}) - end - }) + doors.register(name, def) end ----trapdoor---- From ea2a7d3b1fe4b0ea49527c0d68fdea4eada6ec5e Mon Sep 17 00:00:00 2001 From: MT-Modder Date: Mon, 22 Feb 2016 12:19:41 -0500 Subject: [PATCH 21/48] Remove dig_up() from cactus. Digging a cactus leaves the branches hanging. With this change it will no longer happen. --- mods/default/nodes.lua | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index d00e67ac..1e39be99 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -879,10 +879,6 @@ minetest.register_node("default:cactus", { groups = {snappy = 1, choppy = 3, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node, - - after_dig_node = function(pos, node, metadata, digger) - default.dig_up(pos, node, digger) - end, }) minetest.register_node("default:papyrus", { From 3a55e19055871bb403eb306cbaa87836b66ef60c Mon Sep 17 00:00:00 2001 From: MT-Modder Date: Mon, 22 Feb 2016 18:28:43 -0500 Subject: [PATCH 22/48] Control leaf decay with sneak. As requested by @paramat. Leaves are preserved by default and only decay when using place + sneak. --- mods/default/functions.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 3afaec88..29506c40 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -257,9 +257,11 @@ minetest.register_globalstep(function(dtime) end) default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) - node.param2 = 1 - minetest.set_node(pos, node) + if placer and not placer:get_player_control().sneak then + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) + end end minetest.register_abm({ From 42cc6d2c311d4b70f328d3e31554bf90dd9fc45e Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 2 Jan 2016 12:04:31 +0000 Subject: [PATCH 23/48] Add item name to chest log messages --- mods/default/nodes.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 1e39be99..3b70c2b4 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1445,11 +1445,13 @@ minetest.register_node("default:chest", { end, on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. - " moves stuff to chest at " .. minetest.pos_to_string(pos)) + " moves " .. stack:get_name() .. + " to 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 stuff from chest at " .. minetest.pos_to_string(pos)) + " takes " .. stack:get_name() .. + " from chest at " .. minetest.pos_to_string(pos)) end, }) @@ -1505,11 +1507,13 @@ minetest.register_node("default:chest_locked", { end, on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. - " moves stuff to locked chest at " .. minetest.pos_to_string(pos)) + " 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 stuff from locked chest at " .. minetest.pos_to_string(pos)) + " takes " .. stack:get_name() .. + " from locked chest at " .. minetest.pos_to_string(pos)) end, on_rightclick = function(pos, node, clicker) local meta = minetest.get_meta(pos) From 6493e5fefb62b41c0641c565563665c6b74f069f Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 22 Feb 2016 20:38:00 +0000 Subject: [PATCH 24/48] Default/mapgen: Make forest clearings larger and more common In mgv5/v7/flat/fractal/valleys Add missing noise parameters to pine logs for density to vary in relation to pine tree density --- mods/default/mapgen.lua | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 05d7b2b9..17bb8984 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -991,8 +991,8 @@ function default.register_decorations() place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = 0.04, - scale = 0.02, + offset = 0.036, + scale = 0.022, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, @@ -1010,8 +1010,8 @@ function default.register_decorations() place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = 0.002, - scale = 0.001, + offset = 0.0018, + scale = 0.0011, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, @@ -1086,8 +1086,8 @@ function default.register_decorations() place_on = {"default:dirt_with_snow", "default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = 0.04, - scale = 0.02, + offset = 0.036, + scale = 0.022, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, @@ -1104,7 +1104,14 @@ function default.register_decorations() deco_type = "schematic", place_on = {"default:dirt_with_snow", "default:dirt_with_grass"}, sidelen = 80, - fill_ratio = 0.003, + noise_params = { + offset = 0.0018, + scale = 0.0011, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, biomes = {"taiga", "coniferous_forest"}, y_min = 1, y_max = 31000, @@ -1186,7 +1193,7 @@ function default.register_decorations() sidelen = 16, noise_params = { offset = 0.0, - scale = -0.03, + scale = -0.015, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, @@ -1206,7 +1213,7 @@ function default.register_decorations() sidelen = 16, noise_params = { offset = 0.0, - scale = -0.0015, + scale = -0.0008, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, From 62dbf293011424ca4f9cb7b154f560506965f7e2 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 24 Feb 2016 23:41:05 +0000 Subject: [PATCH 25/48] Default/mapgen: Remove unnecessary spaces from log decorations --- mods/default/mapgen.lua | 94 ++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 17bb8984..3424a557 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1021,17 +1021,17 @@ function default.register_decorations() y_min = 1, y_max = 31000, schematic = { - size = { x = 3, y = 3, z = 1}, + size = {x = 3, y = 3, z = 1}, data = { - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "default:tree", param2 = 12, prob = 191 }, - { name = "default:tree", param2 = 12 }, - { name = "default:tree", param2 = 12, prob = 127 }, - { name = "air", prob = 0 }, - { name = "flowers:mushroom_brown", prob = 63 }, - { name = "air", prob = 0 }, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "default:tree", param2 = 12, prob = 191}, + {name = "default:tree", param2 = 12}, + {name = "default:tree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, }, }, flags = "place_center_x", @@ -1062,17 +1062,17 @@ function default.register_decorations() y_min = 1, y_max = 31000, schematic = { - size = { x = 3, y = 3, z = 1}, + size = {x = 3, y = 3, z = 1}, data = { - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "default:jungletree", param2 = 12, prob = 191 }, - { name = "default:jungletree", param2 = 12 }, - { name = "default:jungletree", param2 = 12, prob = 127 }, - { name = "air", prob = 0 }, - { name = "flowers:mushroom_brown", prob = 127 }, - { name = "air", prob = 0 }, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "default:jungletree", param2 = 12, prob = 191}, + {name = "default:jungletree", param2 = 12}, + {name = "default:jungletree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_brown", prob = 127}, + {name = "air", prob = 0}, }, }, flags = "place_center_x", @@ -1116,17 +1116,17 @@ function default.register_decorations() y_min = 1, y_max = 31000, schematic = { - size = { x = 3, y = 3, z = 1}, + size = {x = 3, y = 3, z = 1}, data = { - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "default:pine_tree", param2 = 12, prob = 191 }, - { name = "default:pine_tree", param2 = 12 }, - { name = "default:pine_tree", param2 = 12, prob = 127 }, - { name = "air", prob = 0 }, - { name = "flowers:mushroom_red", prob = 63 }, - { name = "air", prob = 0 }, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "default:pine_tree", param2 = 12, prob = 191}, + {name = "default:pine_tree", param2 = 12}, + {name = "default:pine_tree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_red", prob = 63}, + {name = "air", prob = 0}, }, }, flags = "place_center_x", @@ -1171,14 +1171,14 @@ function default.register_decorations() y_min = 1, y_max = 31000, schematic = { - size = { x = 3, y = 2, z = 1}, + size = {x = 3, y = 2, z = 1}, data = { - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "default:acacia_tree", param2 = 12, prob = 191 }, - { name = "default:acacia_tree", param2 = 12 }, - { name = "default:acacia_tree", param2 = 12, prob = 127 }, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "default:acacia_tree", param2 = 12, prob = 191}, + {name = "default:acacia_tree", param2 = 12}, + {name = "default:acacia_tree", param2 = 12, prob = 127}, }, }, flags = "place_center_x", @@ -1223,17 +1223,17 @@ function default.register_decorations() y_min = 1, y_max = 31000, schematic = { - size = { x = 3, y = 3, z = 1}, + size = {x = 3, y = 3, z = 1}, data = { - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "air", prob = 0 }, - { name = "default:aspen_tree", param2 = 12 }, - { name = "default:aspen_tree", param2 = 12 }, - { name = "default:aspen_tree", param2 = 12, prob = 127 }, - { name = "flowers:mushroom_red", prob = 63 }, - { name = "flowers:mushroom_brown", prob = 63 }, - { name = "air", prob = 0 }, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "default:aspen_tree", param2 = 12}, + {name = "default:aspen_tree", param2 = 12}, + {name = "default:aspen_tree", param2 = 12, prob = 127}, + {name = "flowers:mushroom_red", prob = 63}, + {name = "flowers:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, }, }, flags = "place_center_x", From 5d28040915f9b23aad008553b51a9db5b2bee4dd Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 25 Feb 2016 00:29:35 +0000 Subject: [PATCH 26/48] Default: Add 'snowy pine tree from sapling' schematic Add function to detect nearby snow to enable snow on sapling-grown pine trees Correct 'place schematic' rotation parameters to "0" or "random" --- .../snowy_pine_tree_from_sapling.mts | Bin 0 -> 232 bytes mods/default/trees.lua | 106 ++++++++++++------ 2 files changed, 71 insertions(+), 35 deletions(-) create mode 100644 mods/default/schematics/snowy_pine_tree_from_sapling.mts diff --git a/mods/default/schematics/snowy_pine_tree_from_sapling.mts b/mods/default/schematics/snowy_pine_tree_from_sapling.mts new file mode 100644 index 0000000000000000000000000000000000000000..0692049adbe71447ee7aebb6c7178aa1d9935335 GIT binary patch literal 232 zcmeYb3HD`RVPIw8XJDP02|u zX5fK|7U$)cGYGS*|B& zYEPHV6kt$1(Uo~LseeHkf5-HMAKRif`&~=^d&O+txweqwvFW-?-QI=8lm?`VhVy)~ RQa7D^wcmUr^AAbuBmnEaWmo_J literal 0 HcmV?d00001 diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 48718e5d..c93fdabc 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -1,10 +1,10 @@ +local random = math.random + -- -- Grow trees from saplings -- --- 'Can grow' function - -local random = math.random +-- 'can grow' function function default.can_grow(pos) local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) @@ -24,6 +24,39 @@ function default.can_grow(pos) end +-- 'is snow nearby' function + +local function is_snow_nearby(pos) + local x, y, z = pos.x, pos.y, pos.z + local c_snow = minetest.get_content_id("default:snow") + local c_snowblock = minetest.get_content_id("default:snowblock") + local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 1, y = y - 1, z = z - 1}, + {x = x + 1, y = y + 1, z = z + 1} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + for yy = y - 1, y + 1 do + for zz = z - 1, z + 1 do + local vi = a:index(x - 1, yy, zz) + for xx = x - 1, x + 1 do + local nodid = data[vi] + if nodid == c_snow or nodid == c_snowblock or nodid == c_dirtsnow then + return true + end + vi = vi + 1 + end + end + end + + return false +end + + -- Sapling ABM minetest.register_abm({ @@ -57,8 +90,11 @@ minetest.register_abm({ elseif node.name == "default:pine_sapling" then minetest.log("action", "A pine sapling grows into a tree at ".. minetest.pos_to_string(pos)) + local snow = is_snow_nearby(pos) if mapgen == "v6" then - default.grow_pine_tree(pos) + default.grow_pine_tree(pos, snow) + elseif snow then + default.grow_new_snowy_pine_tree(pos) else default.grow_new_pine_tree(pos) end @@ -199,7 +235,8 @@ function default.grow_jungle_tree(pos, bad) local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) local data = vm:get_data() - add_trunk_and_leaves(data, a, pos, c_jungletree, c_jungleleaves, height, 3, 30, false) + add_trunk_and_leaves(data, a, pos, c_jungletree, c_jungleleaves, + height, 3, 30, false) -- Roots for z_dist = -1, 1 do @@ -240,7 +277,7 @@ local function add_snow(data, vi, c_air, c_ignore, c_snow) end end -function default.grow_pine_tree(pos) +function default.grow_pine_tree(pos, snow) local x, y, z = pos.x, pos.y, pos.z local maxy = y + random(9, 13) -- Trunk top @@ -249,32 +286,15 @@ function default.grow_pine_tree(pos) local c_pine_tree = minetest.get_content_id("default:pine_tree") local c_pine_needles = minetest.get_content_id("default:pine_needles") local c_snow = minetest.get_content_id("default:snow") - local c_snowblock = minetest.get_content_id("default:snowblock") - local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow") local vm = minetest.get_voxel_manip() local minp, maxp = vm:read_from_map( - {x = x - 3, y = y - 1, z = z - 3}, + {x = x - 3, y = y, z = z - 3}, {x = x + 3, y = maxy + 3, z = z + 3} ) local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) local data = vm:get_data() - -- Scan for snow nodes near sapling to enable snow on branches - local snow = false - for yy = y - 1, y + 1 do - for zz = z - 1, z + 1 do - local vi = a:index(x - 1, yy, zz) - for xx = x - 1, x + 1 do - local nodid = data[vi] - if nodid == c_snow or nodid == c_snowblock or nodid == c_dirtsnow then - snow = true - end - vi = vi + 1 - end - end - end - -- Upper branches layer local dev = 3 for yy = maxy - 1, maxy + 1 do @@ -350,7 +370,8 @@ function default.grow_pine_tree(pos) end -- Trunk - data[a:index(x, y, z)] = c_pine_tree -- Force-place lowest trunk node to replace sapling + -- Force-place lowest trunk node to replace sapling + data[a:index(x, y, z)] = c_pine_tree for yy = y + 1, maxy do local vi = a:index(x, yy, z) local node_id = data[vi] @@ -369,42 +390,57 @@ end -- New apple tree function default.grow_new_apple_tree(pos) - local path = minetest.get_modpath("default") .. "/schematics/apple_tree_from_sapling.mts" + local path = minetest.get_modpath("default") .. + "/schematics/apple_tree_from_sapling.mts" minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, - path, 0, nil, false) + path, "0", nil, false) end -- New jungle tree function default.grow_new_jungle_tree(pos) - local path = minetest.get_modpath("default") .. "/schematics/jungle_tree_from_sapling.mts" + local path = minetest.get_modpath("default") .. + "/schematics/jungle_tree_from_sapling.mts" minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, - path, 0, nil, false) + path, "0", nil, false) end -- New pine tree function default.grow_new_pine_tree(pos) - local path = minetest.get_modpath("default") .. "/schematics/pine_tree_from_sapling.mts" + local path = minetest.get_modpath("default") .. + "/schematics/pine_tree_from_sapling.mts" minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, - path, 0, nil, false) + path, "0", nil, false) +end + + +-- New snowy pine tree + +function default.grow_new_snowy_pine_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/snowy_pine_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) end -- New acacia tree function default.grow_new_acacia_tree(pos) - local path = minetest.get_modpath("default") .. "/schematics/acacia_tree_from_sapling.mts" + local path = minetest.get_modpath("default") .. + "/schematics/acacia_tree_from_sapling.mts" minetest.place_schematic({x = pos.x - 4, y = pos.y - 1, z = pos.z - 4}, - path, random, nil, false) + path, "random", nil, false) end -- New aspen tree function default.grow_new_aspen_tree(pos) - local path = minetest.get_modpath("default") .. "/schematics/aspen_tree_from_sapling.mts" + local path = minetest.get_modpath("default") .. + "/schematics/aspen_tree_from_sapling.mts" minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, - path, 0, nil, false) + path, "0", nil, false) end From 00a0d9a5d4bda9a3a33d1992218c3e8094559730 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 29 Feb 2016 08:35:36 -0800 Subject: [PATCH 27/48] Doors: Prevent placement in protected areas. https://forum.minetest.net/viewtopic.php?f=42&t=1523&start=500#p208773 Currently, doors can be placed inside others' protected areas. We need to check protection for both bottom and top halves. --- mods/doors/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 67cb296b..72196e68 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -235,6 +235,11 @@ function doors.register(name, def) return itemstack end + local pn = placer:get_player_name() + if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then + return itemstack + end + local dir = minetest.dir_to_facedir(placer:get_look_dir()) local ref = { From 3a98245f62aeabdd1bc4ac5a83441cf6aec3cf88 Mon Sep 17 00:00:00 2001 From: red-001 Date: Mon, 1 Feb 2016 19:27:17 +0000 Subject: [PATCH 28/48] Document `share_bones_time_early` --- minetest.conf.example | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/minetest.conf.example b/minetest.conf.example index 11b4835f..ac5b8f68 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -9,6 +9,11 @@ # 0 to disable #share_bones_time = 1200 +# How much earlier the bones of a dead player can be looted by +# everyone if the player dies in a protected area they don't own. +# 0 to disable. By default it is "share_bones_time" divide by four. +#share_bones_time_early = 300 + # Whether standard fire should be disabled ('basic flame' nodes will disappear) # 'permanent flame' nodes will remain with either setting #disable_fire = false From 0410b5e0ca6d0f2ff58171b3f1a88e7f5996060d Mon Sep 17 00:00:00 2001 From: MT-Modder Date: Thu, 25 Feb 2016 18:05:23 -0500 Subject: [PATCH 29/48] Allow non-players to dig bones. --- mods/bones/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 899ac809..c86deccd 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -43,7 +43,11 @@ minetest.register_node("bones:bones", { can_dig = function(pos, player) local inv = minetest.get_meta(pos):get_inventory() - return is_owner(pos, player:get_player_name()) and inv:is_empty("main") + local name = "" + if player then + name = player:get_player_name() + end + return is_owner(pos, name) and inv:is_empty("main") end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) From ac843f8fe72bd90a0ee50ab3a9592f1ab271742f Mon Sep 17 00:00:00 2001 From: MT-Modder Date: Thu, 25 Feb 2016 18:12:49 -0500 Subject: [PATCH 30/48] Allow non-players to dig locked chests. --- 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 3b70c2b4..e4239d3b 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1410,7 +1410,11 @@ local function get_locked_chest_formspec(pos) end local function has_locked_chest_privilege(meta, player) - if player:get_player_name() ~= meta:get_string("owner") then + local name = "" + if player then + name = player:get_player_name() + end + if name ~= meta:get_string("owner") then return false end return true From 29252c6fb2f767172e2d637b6ca784958ddbc392 Mon Sep 17 00:00:00 2001 From: MT-Modder Date: Thu, 25 Feb 2016 18:16:39 -0500 Subject: [PATCH 31/48] Allow non-players to dig steel doors. --- mods/doors/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 72196e68..01778284 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -288,7 +288,11 @@ function doors.register(name, def) return true end local meta = minetest.get_meta(pos) - return meta:get_string("doors_owner") == digger:get_player_name() + local name = "" + if digger then + name = digger:get_player_name() + end + return meta:get_string("doors_owner") == name end if not def.sounds then From aa254e28354ded1a09916905eeb0ede2bf76450d Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Wed, 2 Mar 2016 21:26:16 +0000 Subject: [PATCH 32/48] Fix book formspec to word-wrap lines Books still don't wrap long lines of text properly so until this has been sorted out I suggest reverting back to a previous working formspec which lets players read books properly until a fix is found (and maybe scrollbars added to texarea's). Also adding a recipe to blank written books. --- mods/default/craftitems.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index bb8c445c..c096f7fd 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -32,8 +32,8 @@ local function book_on_use(itemstack, user, pointed_thing) default.gui_bg_img.. "label[0.5,0.5;by "..owner.."]".. "label[0.5,0;"..minetest.formspec_escape(title).."]".. - "tableoptions[background=#00000000;highlight=#00000000;border=false]".. - "table[0.5,1.5;7.5,7;;"..minetest.formspec_escape(text):gsub("\n", ",")..";1]" + "textarea[0.5,1.5;7.5,7;text;;".. + minetest.formspec_escape(text).."]" end minetest.show_formspec(user:get_player_name(), "default:book", formspec) end From 6c6cc2159aaf678068c8d771282ec5614b50f84a Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 3 Mar 2016 03:41:50 +0000 Subject: [PATCH 33/48] Default/craftitems: Fix whitespace and code style issues --- mods/default/craftitems.lua | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index c096f7fd..09ebeccf 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -3,7 +3,7 @@ minetest.register_craftitem("default:stick", { description = "Stick", inventory_image = "default_stick.png", - groups = {stick=1}, + groups = {stick = 1}, }) minetest.register_craftitem("default:paper", { @@ -20,20 +20,20 @@ local function book_on_use(itemstack, user, pointed_thing) end local formspec if owner == player_name then - formspec = "size[8,8]"..default.gui_bg.. - default.gui_bg_img.. - "field[0.5,1;7.5,0;title;Title:;".. - minetest.formspec_escape(title).."]".. - "textarea[0.5,1.5;7.5,7;text;Contents:;".. - minetest.formspec_escape(text).."]".. + formspec = "size[8,8]" .. default.gui_bg .. + default.gui_bg_img .. + "field[0.5,1;7.5,0;title;Title:;" .. + minetest.formspec_escape(title) .. "]" .. + "textarea[0.5,1.5;7.5,7;text;Contents:;" .. + minetest.formspec_escape(text) .. "]" .. "button_exit[2.5,7.5;3,1;save;Save]" else - formspec = "size[8,8]"..default.gui_bg.. - default.gui_bg_img.. - "label[0.5,0.5;by "..owner.."]".. - "label[0.5,0;"..minetest.formspec_escape(title).."]".. - "textarea[0.5,1.5;7.5,7;text;;".. - minetest.formspec_escape(text).."]" + formspec = "size[8,8]" .. default.gui_bg .. + default.gui_bg_img .. + "label[0.5,0.5;by " .. owner .. "]" .. + "label[0.5,0;" .. minetest.formspec_escape(title) .. "]" .. + "textarea[0.5,1.5;7.5,7;text;;" .. + minetest.formspec_escape(text) .. "]" end minetest.show_formspec(user:get_player_name(), "default:book", formspec) end @@ -78,14 +78,14 @@ end) minetest.register_craftitem("default:book", { description = "Book", inventory_image = "default_book.png", - groups = {book=1}, + groups = {book = 1}, on_use = book_on_use, }) minetest.register_craftitem("default:book_written", { description = "Book With Text", inventory_image = "default_book_written.png", - groups = {book=1, not_in_creative_inventory=1}, + groups = {book = 1, not_in_creative_inventory = 1}, stack_max = 1, on_use = book_on_use, }) @@ -93,7 +93,7 @@ minetest.register_craftitem("default:book_written", { minetest.register_craft({ type = "shapeless", output = "default:book_written", - recipe = { "default:book", "default:book_written" } + recipe = {"default:book", "default:book_written"} }) minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) From 68f5740dcc5ae16f6506f773894768f7d19c60e8 Mon Sep 17 00:00:00 2001 From: red-001 Date: Thu, 3 Mar 2016 17:40:24 +0000 Subject: [PATCH 34/48] Fix markdown formating in `game_api.txt`. --- game_api.txt | 535 +++++++++++++++++++++++++++------------------------ 1 file changed, 281 insertions(+), 254 deletions(-) diff --git a/game_api.txt b/game_api.txt index a765aee6..4ee23f09 100644 --- a/game_api.txt +++ b/game_api.txt @@ -4,18 +4,21 @@ GitHub Repo: https://github.com/minetest/minetest_game Introduction ------------ + The Minetest Game subgame offers multiple new possibilities in addition to the Minetest engine's built-in API, allowing you to add new plants to farming mod, buckets for new liquids, new stairs and custom panes. For information on the Minetest API, visit https://github.com/minetest/minetest/blob/master/doc/lua_api.txt Please note: - [XYZ] refers to a section the Minetest API - [#ABC] refers to a section in this document - ^ Explanation for line above + + * [XYZ] refers to a section the Minetest API + * [#ABC] refers to a section in this document Bucket API ---------- + The bucket API allows registering new types of buckets for non-default liquids. + bucket.register_liquid( "default:lava_source", -- name of the source node "default:lava_flowing", -- name of the flowing node @@ -27,59 +30,61 @@ The bucket API allows registering new types of buckets for non-default liquids. Beds API -------- + beds.register_bed( - "beds:bed", -- Bed name - def: See [#Bed definition] -- Bed definition + "beds:bed", -- Bed name + def -- See [#Bed definition] ) - beds.read_spawns() -- returns a table containing players respawn positions - beds.kick_players() -- forces all players to leave bed - beds.skip_night() -- sets world time to morning and saves respawn position of all players currently sleeping + * `beds.read_spawns() ` Returns a table containing players respawn positions + * `beds.kick_players()` Forces all players to leave bed + * `beds.skip_night()` Sets world time to morning and saves respawn position of all players currently sleeping + +###Bed definition -#Bed definition ---------------- -{ - description = "Simple Bed", - inventory_image = "beds_bed.png", - wield_image = "beds_bed.png", - tiles = { - bottom = {[Tile definition], - ^ the tiles of the bottom part of the bed - }, - top = {[Tile definition], - ^ the tiles of the bottom part of the bed - } - }, - nodebox = { - bottom = regular nodebox, see [Node boxes], -- bottm part of bed - top = regular nodebox, see [Node boxes], -- top part of bed - }, - selectionbox = regular nodebox, see [Node boxes], -- for both nodeboxes - recipe = { -- Craft recipe - {"group:wool", "group:wool", "group:wool"}, - {"group:wood", "group:wood", "group:wood"} + { + description = "Simple Bed", + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = {'Tile definition'}, -- the tiles of the bottom part of the bed. + top = {Tile definition} -- the tiles of the bottom part of the bed. + }, + nodebox = { + bottom = 'regular nodebox', -- bottom part of bed (see [Node boxes]) + top = 'regular nodebox', -- top part of bed (see [Node boxes]) + }, + selectionbox = 'regular nodebox', -- for both nodeboxes (see [Node boxes]) + recipe = { -- Craft recipe + {"group:wool", "group:wool", "group:wool"}, + {"group:wood", "group:wood", "group:wood"} + } } -} Doors API --------- + The doors mod allows modders to register custom doors and trapdoors. -doors.register_door(name, def) -^ name: "Door name" -^ def: See [#Door definition] - -> Registers new door +`doors.register_door(name, def)` -doors.register_trapdoor(name, def) -^ name: "mod_door" -^ def: See [#Trapdoor definition] - -> Registers new trapdoor + * Registers new door + * `name` Name for door + * `def` See [#Door definition] -doors.get(pos) -^ pos = { x = .., y = .., z = ..} - -> Returns an ObjecRef to a door, or nil if the pos did not contain a door +`doors.register_trapdoor(name, def)` - Methods: + * Registers new trapdoor + * `name` Name for trapdoor + * `def` See [#Trapdoor definition] + +`doors.get(pos)` + + * `pos` A position as a table, e.g `{x = 1, y = 1, z = 1}` + * Returns an ObjecRef to a door, or nil if the position does not contain a door + + ###Methods + :open(player) -- Open the door object, returns if door was opened :close(player) -- Close the door object, returns if door was closed :toggle(player) -- Toggle the door state, returns if state was toggled @@ -90,164 +95,166 @@ doors.get(pos) has the permissions needed to open this door. If omitted then no permission checks are performed. -#Door definition ----------------- -{ +###Door definition + description = "Door description", inventory_image = "mod_door_inv.png", - groups = {choppy = 1}, - tiles = { "mod_door.png" }, + groups = {choppy = 2}, + tiles = {"mod_door.png"}, -- UV map. recipe = craftrecipe, sounds = default.node_sound_wood_defaults(), -- optional sound_open = sound play for open door, -- optional sound_close = sound play for close door, -- optional - protected = false, - ^ If true, only placer can open the door (locked for others) -} + protected = false, -- If true, only placer can open the door (locked for others) + +###Trapdoor definition -#Trapdoor definition ----------------- -{ description = "Trapdoor description", inventory_image = "mod_trapdoor_inv.png", - groups = {choppy = 1}, - tile_front = "doors_trapdoor.png", - ^ the texture for the front and back of the trapdoor - tile_side: "doors_trapdoor_side.png", - ^ the tiles of the four side parts of the trapdoor + groups = {choppy = 2}, + tile_front = "doors_trapdoor.png", -- the texture for the front and back of the trapdoor + tile_side = "doors_trapdoor_side.png", -- the tiles of the four side parts of the trapdoor sounds = default.node_sound_wood_defaults(), -- optional sound_open = sound play for open door, -- optional sound_close = sound play for close door, -- optional - protected = false, - ^ If true, only placer can open the door (locked for others) -} + protected = false, -- If true, only placer can open the door (locked for others) Fence API --------- Allows creation of new fences with "fencelike" drawtype. -default.register_fence(name, item definition) - ^ Registers a new fence. Custom fields texture and material are required, as - ^ are name and description. The rest is optional. You can pass most normal - ^ nodedef fields here except drawtype. The fence group will always be added - ^ for this node. +`default.register_fence(name, item definition)` + + Registers a new fence. Custom fields texture and material are required, as + are name and description. The rest is optional. You can pass most normal + nodedef fields here except drawtype. The fence group will always be added + for this node. + +###fence definition -#fence definition name = "default:fence_wood", description = "Wooden Fence", texture = "default_wood.png", material = "default:wood", - groups = {choppy=2, oddly_breakable_by_hand = 2, flammable = 2}, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), Farming API ----------- + The farming API allows you to easily register plants and hoes. -farming.register_hoe(name, hoe definition) - -> Register a new hoe, see [#hoe definition] +`farming.register_hoe(name, hoe definition)` + * Register a new hoe, see [#hoe definition] -farming.register_plant(name, Plant definition) - -> Register a new growing plant, see [#Plant definition] +`farming.register_plant(name, Plant definition)` + * Register a new growing plant, see [#Plant definition] -#Hoe Definition ---------------- -{ - description = "", -- Description for tooltip - inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image - max_uses = 30, -- Uses until destroyed - material = "", -- Material for recipes - recipe = { -- Craft recipe, if material isn't used - {"air", "air", "air"}, - {"", "group:stick"}, - {"", "group:stick"}, +###Hoe Definition + + + { + description = "", -- Description for tooltip + inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image + max_uses = 30, -- Uses until destroyed + material = "", -- Material for recipes + recipe = { -- Craft recipe, if material isn't used + {"air", "air", "air"}, + {"", "group:stick"}, + {"", "group:stick"}, + } } -} -#Plant definition ------------------ -{ - description = "", -- Description of seed item - inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image - steps = 8, -- How many steps the plant has to grow, until it can be harvested - ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber) - minlight = 13, -- Minimum light to grow - maxlight = default.LIGHT_MAX -- Maximum light to grow -} +###Plant definition + + { + description = "", -- Description of seed item + inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image + steps = 8, -- How many steps the plant has to grow, until it can be harvested + -- ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber) + minlight = 13, -- Minimum light to grow + maxlight = default.LIGHT_MAX -- Maximum light to grow + } Screwdriver API --------------- + The screwdriver API allows you to control a node's behaviour when a screwdriver is used on it. -To use it, add the on_screwdriver function to the node definition. -on_rotate(pos, node, user, mode, new_param2) -^ pos: position of the node that the screwdriver is being used on -^ node: that node -^ user: the player who used the screwdriver -^ mode: screwdriver.ROTATE_FACE or screwdriver.ROTATE_AXIS -^ new_param2: the new value of param2 that would have been set if on_rotate wasn't there -^ return value: false to disallow rotation, nil to keep default behaviour, true to allow +To use it, add the `on_screwdriver` function to the node definition. + +`on_rotate(pos, node, user, mode, new_param2)` + + * `pos` Position of the node that the screwdriver is being used on + * `node` that node + * `user` The player who used the screwdriver + * `mode` screwdriver.ROTATE_FACE or screwdriver.ROTATE_AXIS + * `new_param2` the new value of param2 that would have been set if on_rotate wasn't there + * return value: false to disallow rotation, nil to keep default behaviour, true to allow it but to indicate that changed have already been made (so the screwdriver will wear out) -^ use on_rotate = screwdriver.disallow to always disallow rotation -^ use on_rotate = screwdriver.rotate_simple to allow only face rotation + * use `on_rotate = screwdriver.disallow` to always disallow rotation + * use `on_rotate = screwdriver.rotate_simple` to allow only face rotation Stairs API ---------- + The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those delivered with Minetest Game, to keep them compatible with other mods. -stairs.register_stair(subname, recipeitem, groups, images, description, sounds) - -> Registers a stair. - -> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" - -> recipeitem: Item used in the craft recipe, e.g. "default:cobble" - -> groups: see [Known damage and digging time defining groups] - -> images: see [Tile definition] - -> description: used for the description field in the stair's definition - -> sounds: see [#Default sounds] +`stairs.register_stair(subname, recipeitem, groups, images, description, sounds)` -stairs.register_slab(subname, recipeitem, groups, images, description, sounds) - -> Registers a slabs - -> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" - -> recipeitem: Item used in the craft recipe, e.g. "default:cobble" - -> groups: see [Known damage and digging time defining groups] - -> images: see [Tile definition] - -> description: used for the description field in the stair's definition - -> sounds: see [#Default sounds] + * Registers a stair. + * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" + * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble" + * `groups`: see [Known damage and digging time defining groups] + * `images`: see [Tile definition] + * `description`: used for the description field in the stair's definition + * `sounds`: see [#Default sounds] -stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds) - -> A wrapper for stairs.register_stair and stairs.register_slab - -> Uses almost the same arguments as stairs.register_stair - -> desc_stair: Description for stair node - -> desc_slab: Description for slab node +`stairs.register_slab(subname, recipeitem, groups, images, description, sounds)` + + * Registers a slabs + * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" + * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble" + * `groups`: see [Known damage and digging time defining groups] + * `images`: see [Tile definition] + * `description`: used for the description field in the stair's definition + * `sounds`: see [#Default sounds] + +`stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)` + + * A wrapper for stairs.register_stair and stairs.register_slab + * Uses almost the same arguments as stairs.register_stair + * `desc_stair`: Description for stair node + * `desc_slab`: Description for slab node Xpanes API ---------- + Creates panes that automatically connect to each other -xpanes.register_pane(subname, def) - -> subname: used for nodename. Result: "xpanes:subname" and "xpanes:subname_{2..15}" - -> def: See [#Pane definition] +`xpanes.register_pane(subname, def)` -#Pane definition ----------------- -{ - textures = {"texture_Bottom_top", "texture_left_right", "texture_front_back"}, - ^ More tiles aren't supported - groups = {group = rating}, - ^ Uses the known node groups, see [Known damage and digging time defining groups] - sounds = SoundSpec, - ^ See [#Default sounds] - recipe = {{"","","","","","","","",""}}, - ^ Recipe field only -} + * `subname`: used for nodename. Result: "xpanes:subname" and "xpanes:subname_{2..15}" + * `def`: See [#Pane definition] + +###Pane definition + + { + textures = {"texture_Bottom_top", "texture_left_right", "texture_front_back"}, -- More tiles aren't supported + groups = {group = rating}, -- Uses the known node groups, see [Known damage and digging time defining groups] + sounds = SoundSpec, -- See [#Default sounds] + recipe = {{"","","","","","","","",""}}, -- Recipe field only + } Raillike definitions -------------------- + The following nodes use the group `connect_to_raillike` and will only connect to raillike nodes within this group and the same group value. Use `minetest.raillike_group()` to get the group value. | Node type | Raillike group name -+-----------------------+-------------------- +|-----------------------|--------------------- | default:rail | "rail" | tnt:gunpowder | "gunpowder" | tnt:gunpowder_burning | "gunpowder" @@ -260,168 +267,188 @@ of your node. Default sounds -------------- + Sounds inside the default table can be used within the sounds field of node definitions. -default.node_sound_defaults() -default.node_sound_stone_defaults() -default.node_sound_dirt_defaults() -default.node_sound_sand_defaults() -default.node_sound_wood_defaults() -default.node_sound_leaves_defaults() -default.node_sound_glass_defaults() + * `default.node_sound_defaults()` + * `default.node_sound_stone_defaults()` + * `default.node_sound_dirt_defaults()` + * `default.node_sound_sand_defaults()` + * `default.node_sound_wood_defaults()` + * `default.node_sound_leaves_defaults()` + * `default.node_sound_glass_defaults()` Default constants ----------------- -default.LIGHT_MAX -^ The maximum light level (see [Node definition] light_source) + +`default.LIGHT_MAX` The maximum light level (see [Node definition] light_source) Player API ---------- + The player API can register player models and update the player's appearence -default.player_register_model(name, def) -^ Register a new model to be used by players. - -> name: model filename such as "character.x", "foo.b3d", etc. - -> def: See [#Model definition] +`default.player_register_model(name, def)` -default.registered_player_models[name] -^ Get a model's definition - -> see [#Model definition] + * Register a new model to be used by players. + * name: model filename such as "character.x", "foo.b3d", etc. + * def: See [#Model definition] -default.player_set_model(player, model_name) -^ Change a player's model - -> player: PlayerRef - -> model_name: model registered with player_register_model() +`default.registered_player_models[name]` -default.player_set_animation(player, anim_name [, speed]) -^ Applies an animation to a player - -> anim_name: name of the animation. - -> speed: frames per second. If nil, default from the model is used + * Get a model's definition + * see [#Model definition] -default.player_set_textures(player, textures) -^ Sets player textures - -> player: PlayerRef - -> textures: array of textures - ^ If is nil, the default textures from the model def are used +`default.player_set_model(player, model_name)` + + * Change a player's model + * `player`: PlayerRef + * `model_name`: model registered with player_register_model() + +`default.player_set_animation(player, anim_name [, speed])` + + * Applies an animation to a player + * anim_name: name of the animation. + * speed: frames per second. If nil, default from the model is used + +`default.player_set_textures(player, textures)` + + * Sets player textures + * `player`: PlayerRef + * `textures`: array of textures, If `textures` is nil, the default textures from the model def are used default.player_get_animation(player) -^ Returns a table containing fields "model", "textures" and "animation". -^ Any of the fields of the returned table may be nil. - -> player: PlayerRef -Model Definition ----------------- -{ - animation_speed = 30, -- Default animation speed, in FPS. - textures = {"character.png", }, -- Default array of textures. - visual_size = {x = 1, y = 1}, -- Used to scale the model. - animations = { - -- = {x = , y = }, - foo = {x = 0, y = 19}, - bar = {x = 20, y = 39}, + * Returns a table containing fields `model`, `textures` and `animation`. + * Any of the fields of the returned table may be nil. + * player: PlayerRef + +###Model Definition + + { + animation_speed = 30, -- Default animation speed, in FPS. + textures = {"character.png", }, -- Default array of textures. + visual_size = {x = 1, y = 1}, -- Used to scale the model. + animations = { + -- = {x = , y = }, + foo = {x = 0, y = 19}, + bar = {x = 20, y = 39}, -- ... - }, -} + }, + } Leafdecay --------- -To enable leaf decay for a node, add it to the "leafdecay" group. -The rating of the group determines how far from a node in the group "tree" +To enable leaf decay for a node, add it to the `leafdecay` group. + +The rating of the group determines how far from a node in the group `tree` the node can be without decaying. -If param2 of the node is ~= 0, the node will always be preserved. Thus, if -the player places a node of that kind, you will want to set param2=1 or so. +If `param2` of the node is ~= 0, the node will always be preserved. Thus, if +the player places a node of that kind, you will want to set `param2 = 1` or so. -The function default.after_place_leaves can be set as after_place_node of a node +The function `default.after_place_leaves` can be set as `after_place_node of a node` to set param2 to 1 if the player places the node (should not be used for nodes that use param2 otherwise (e.g. facedir)). -If the node is in the leafdecay_drop group then it will always be dropped as an +If the node is in the `leafdecay_drop` group then it will always be dropped as an item. Dyes ---- + To make recipes that will work with any dye ever made by anybody, define them based on groups. You can select any group of groups, based on your need for amount of colors. -#Color groups -------------- -Base color groups: -- basecolor_white -- basecolor_grey -- basecolor_black -- basecolor_red -- basecolor_yellow -- basecolor_green -- basecolor_cyan -- basecolor_blue -- basecolor_magenta +###Color groups -Extended color groups (* = equal to a base color): -* excolor_white -- excolor_lightgrey -* excolor_grey -- excolor_darkgrey -* excolor_black -* excolor_red -- excolor_orange -* excolor_yellow -- excolor_lime -* excolor_green -- excolor_aqua -* excolor_cyan -- excolor_sky_blue -* excolor_blue -- excolor_violet -* excolor_magenta -- excolor_red_violet +Base color groups: + + * `basecolor_white` + * `basecolor_grey` + * `basecolor_black` + * `basecolor_red` + * `basecolor_yellow` + * `basecolor_green` + * `basecolor_cyan` + * `basecolor_blue` + * `basecolor_magenta` + +Extended color groups ( * means also base color ) + + * `excolor_white` * + * `excolor_lightgrey` + * `excolor_grey` * + * `excolor_darkgrey` + * `excolor_black` * + * `excolor_red` * + * `excolor_orange` + * `excolor_yellow` * + * `excolor_lime` + * `excolor_green` * + * `excolor_aqua` + * `excolor_cyan` * + * `excolor_sky_blue` + * `excolor_blue` * + * `excolor_violet` + * `excolor_magenta` * + * `excolor_red_violet` The whole unifieddyes palette as groups: -- unicolor_ + + * `unicolor_` + For the following, no white/grey/black is allowed: -- unicolor_medium_ -- unicolor_dark_ -- unicolor_light_ -- unicolor__s50 -- unicolor_medium__s50 -- unicolor_dark__s50 + + * `unicolor_medium_` + * `unicolor_dark_` + * `unicolor_light_` + * `unicolor__s50` + * `unicolor_medium__s50` + * `unicolor_dark__s50` Example of one shapeless recipe using a color group: -minetest.register_craft({ - type = "shapeless", - output = ':item_yellow', - recipe = {':item_no_color', 'group:basecolor_yellow'}, -}) -#Color lists ------------- -dye.basecolors -^ Array containing the names of available base colors + minetest.register_craft({ + type = "shapeless", + output = ':item_yellow', + recipe = {':item_no_color', 'group:basecolor_yellow'}, + }) -dye.excolors -^ Array containing the names of the available extended colors +###Color lists + + * `dye.basecolors` are an array containing the names of available base colors + + * `dye.excolors` are an array containing the names of the available extended colors Trees ----- -default.grow_tree(pos, is_apple_tree) -^ Grows a mgv6 tree or apple tree at pos -default.grow_jungle_tree(pos) -^ Grows a mgv6 jungletree at pos + * `default.grow_tree(pos, is_apple_tree)` + * Grows a mgv6 tree or apple tree at pos -default.grow_pine_tree(pos) -^ Grows a mgv6 pinetree at pos + * `default.grow_jungle_tree(pos)` + * Grows a mgv6 jungletree at pos -default.grow_new_apple_tree(pos) -^ Grows a new design apple tree at pos + * `default.grow_pine_tree(pos)` + * Grows a mgv6 pinetree at pos -default.grow_new_jungle_tree(pos) -^ Grows a new design jungle tree at pos + * `default.grow_new_apple_tree(pos)` + * Grows a new design apple tree at pos -default.grow_new_pine_tree(pos) -^ Grows a new design pine tree at pos + * `default.grow_new_jungle_tree(pos)` + * Grows a new design jungle tree at pos -default.grow_new_acacia_tree(pos) -^ Grows a new design acacia tree at pos + * `default.grow_new_pine_tree(pos)` + * Grows a new design 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 \ No newline at end of file From 7f317871d48bd261faa16bbe2cfc87e551d2ae6e Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Thu, 3 Mar 2016 10:52:45 +0100 Subject: [PATCH 35/48] Add steel ladder --- mods/default/README.txt | 1 + mods/default/aliases.lua | 5 ++- mods/default/crafting.lua | 11 +++++- mods/default/nodes.lua | 35 +++++++++++++++--- .../default/textures/default_ladder_steel.png | Bin 0 -> 3223 bytes ...ult_ladder.png => default_ladder_wood.png} | Bin mods/xpanes/init.lua | 2 +- 7 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 mods/default/textures/default_ladder_steel.png rename mods/default/textures/{default_ladder.png => default_ladder_wood.png} (100%) diff --git a/mods/default/README.txt b/mods/default/README.txt index e51b8747..e33bf633 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -177,6 +177,7 @@ Gambit (WTFPL): default_grass_*.png default_paper.png default_diamond_block.png + default_ladder_steel.png asl97 (WTFPL): default_ice.png diff --git a/mods/default/aliases.lua b/mods/default/aliases.lua index 64e6ebba..487d20d5 100644 --- a/mods/default/aliases.lua +++ b/mods/default/aliases.lua @@ -23,7 +23,7 @@ minetest.register_alias("bookshelf", "default:bookshelf") minetest.register_alias("glass", "default:glass") minetest.register_alias("wooden_fence", "default:fence_wood") minetest.register_alias("rail", "default:rail") -minetest.register_alias("ladder", "default:ladder") +minetest.register_alias("ladder", "default:ladder_wood") minetest.register_alias("wood", "default:wood") minetest.register_alias("mese", "default:mese") minetest.register_alias("cloud", "default:cloud") @@ -74,3 +74,6 @@ minetest.register_alias("default:mese_block", "default:mese") -- Aliases for corrected pine node names minetest.register_alias("default:pinetree", "default:pine_tree") minetest.register_alias("default:pinewood", "default:pine_wood") + +minetest.register_alias("default:ladder", "default:ladder_wood") + diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 27f69035..92864b1d 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -539,7 +539,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = 'default:ladder', + output = 'default:ladder_wood 3', recipe = { {'group:stick', '', 'group:stick'}, {'group:stick', 'group:stick', 'group:stick'}, @@ -547,6 +547,15 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = 'default:ladder_steel 15', + recipe = { + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', '', 'default:steel_ingot'}, + } +}) + minetest.register_craft({ output = 'default:mese', recipe = { diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index e4239d3b..61feec26 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -148,7 +148,8 @@ default:bookshelf default:sign_wall -default:ladder +default:ladder_wood +default:ladder_steel default:fence_wood default:fence_acacia_wood @@ -1653,12 +1654,12 @@ minetest.register_node("default:sign_wall", { }) -minetest.register_node("default:ladder", { - description = "Ladder", +minetest.register_node("default:ladder_wood", { + description = "Wooden Ladder", drawtype = "signlike", - tiles = {"default_ladder.png"}, - inventory_image = "default_ladder.png", - wield_image = "default_ladder.png", + tiles = {"default_ladder_wood.png"}, + inventory_image = "default_ladder_wood.png", + wield_image = "default_ladder_wood.png", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, @@ -1676,6 +1677,28 @@ minetest.register_node("default:ladder", { sounds = default.node_sound_wood_defaults(), }) +minetest.register_node("default:ladder_steel", { + description = "Steel Ladder", + drawtype = "signlike", + tiles = {"default_ladder_steel.png"}, + inventory_image = "default_ladder_steel.png", + wield_image = "default_ladder_steel.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {cracky = 2}, + sounds = default.node_sound_defaults(), +}) + default.register_fence("default:fence_wood", { description = "Wooden Fence", texture = "default_wood.png", diff --git a/mods/default/textures/default_ladder_steel.png b/mods/default/textures/default_ladder_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc6dfde641502892f0993cb21d9239ccbc804e3 GIT binary patch literal 3223 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 JPDHLkV1hA4Addh5 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_ladder.png b/mods/default/textures/default_ladder_wood.png similarity index 100% rename from mods/default/textures/default_ladder.png rename to mods/default/textures/default_ladder_wood.png diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index ebd1566f..9189912e 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -173,7 +173,7 @@ xpanes.register_pane("bar", { textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_space.png"}, inventory_image = "xpanes_bar.png", wield_image = "xpanes_bar.png", - groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1}, + groups = {cracky=2, pane=1}, sounds = default.node_sound_stone_defaults(), recipe = { {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, From f80fafbcfbca43bbb271b521fad5370cb064d788 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 28 Feb 2016 18:28:53 +0000 Subject: [PATCH 36/48] Default: New jungletree_top texture --- mods/default/README.txt | 24 +++++++++--------- .../textures/default_jungletree_top.png | Bin 834 -> 823 bytes 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index e33bf633..4d33d390 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -59,7 +59,6 @@ VanessaE (WTFPL): default_desert_sand.png default_desert_stone.png default_sand.png - default_jungletree_top.png Calinou (CC BY-SA): default_brick.png @@ -100,28 +99,29 @@ Zeg9 (CC BY-SA 3.0): default_gold_block.png paramat (CC BY-SA 3.0): - wieldhand.png, derived from character.png by Jordach (CC BY-SA 3.0) + wieldhand.png copied from character.png by Jordach (CC BY-SA 3.0) default_pinetree.png default_pinetree_top.png default_pinewood.png - default_sandstone_brick.png - default_obsidian_brick.png - default_river_water.png - default_river_water_source_animated.png - default_river_water_flowing_animated.png default_acacia_leaves.png default_acacia_sapling.png default_acacia_tree.png default_acacia_tree_top.png default_acacia_wood.png + default_junglewood.png + default_jungletree_top.png + default_sandstone_brick.png + default_obsidian_brick.png + default_stone_brick.png + default_desert_stone_brick.png + default_river_water.png + default_river_water_source_animated.png + default_river_water_flowing_animated.png default_dry_grass.png default_dry_grass_side.png default_dry_grass_*.png - default_junglewood.png, derived from a texture by BlockMen (CC BY-SA 3.0) - default_grass.png, derived from a texture by Philipbenr (CC BY-SA 3.0) - default_grass_side.png, derived from a texture by Philipbenr (CC BY-SA 3.0) - default_stone_brick.png, derived from a texture by Cisoun (WTFPL) - default_desert_stone_brick.png, derived from a texture by VanessaE (WTFPL) + default_grass.png + default_grass_side.png brunob.santos (CC BY-SA 4.0): default_desert_cobble.png diff --git a/mods/default/textures/default_jungletree_top.png b/mods/default/textures/default_jungletree_top.png index 62cd78141ab8195c71d497c2a8468726251db3df..4844682bdc4c73b48e81dbb7897a7294868bc4cb 100644 GIT binary patch delta 811 zcmV+`1JwM&2Db)~8Gix*005AYXf^-<010qNS#tmY3ljhU3ljkVnw%H_000McNliru z-~$8zEi(GASIPhY0@g`HK~yNuCCEW&R7V&9;QybQH}f{xU7M^zR}hL=B3iMf6h%>M zgb+$Y)0EKQY9z&**o4{!l|oPL!Ha?xOALz2>eAYjG|-lWM1M&YjEZ6l;z4o=HNlvy z`(Bdw=DnHuJ@h+%*w@vxe$)CO)XS(JJ)Q}*UaTfjnEJ|JSX_!@yK%#som+}VC$qD) zb#G?G%v{vpduU{`TrNNC{&>fM<}E0sSC_XY5mHGZul_N0zViFwQp?FNJ8z6#7RBPK z%H%JDfgZI~#KG{`j-__OfO(D;vVgLZ-l;V;z zjsyU+FVlgcQx}KE$L~I1PoK?~+O~gn@B{!@p!vW8Ie)!E;j*m;_C?j`gc!ls-N(P^ z*cWOoe4o42*n}cYLW53-K&)QP03eKPumaK$aBv8KX0e*ELSr^v3ACkb9n05&$Iu#@ zex6hVn`oD$jw2Zh){sroC`?(bMP z^HfGCj(-gvNd}Q7#vtQkp&mUXM6`|^fg!LaSy)^WjSUh20KojemW)AbtxhOPY0Vql zS=5^HKA?p-wtRC_;Z+d#A8o(!>s{rcuaGfNf=Pwh43i9F0;TZmh2z)%x;Iy?@y^fQ z`FZp)8vX6DPlt!^&%biofU#gKqy}nBjv<`;seiX}`=3k06MNr%i?{B0d*AjA7e=O% zKp#7_XX5WCf-?cY8F(IM>)DS3y_K5}uZ&C{F10ND_d?`zs%>{^8RWUa3FV2i-+xX* zahEdAc`nbCUmlyfHuj*e^kLiX&ZB?!V_#R(%v@9~t`bV#`FHl|vw7d=g~n{G<4n$L pY$T95rQX}RuAWprr>37wzXtbgazyU>9Si^f002ovPDHLkV1i)Jh}i%D delta 822 zcmV-61Ihfi2EqoA8Gi-<001BJ|6u?C0|`k)K~y*q9h1v$<5U>Of5$m-;#``fNt-h1 zj3UHDh0(wQX2F6=Y*`>AR_wS)?AWnkHxjSFO8_sxhRYMcR045P)sBW1nx+#w4Zg&7 zZ2pNQ+s8iV`_BJ%%;z6JDxEB&;??->``>wTc1yi(vDV?GzJKMtcVEZYl4z9?#S!r` zCAdxa>E~-c``}FsP=5K*J3RR(;9<8;d&lKs5z*>;?6rDWug=ADpPR*VH8muw71PTb z_FI;nohnuhSjIUoS56oVM})UaR{nxu3dwGTyetT!l63)9t!_5!^leO-O}IL{!hZ7p zL%bwq|NbHK`G0@-(*-Ln-rT28*Qg#_10$?)30acR>sZ3tfNy>{!5&S9WTypA#SqQ{ z1_vFSD5a6E$lLnw7}C^Gln&LZL%2xM2X}^p4S1YR+hrE6SZ4*LDYxP|>6&hP7uTtg zXAV(Vuw3Lqv8Li|s5qDnCtVtiffPc|plf%)TL`(SV^eNM6NwHRg zs*0+Hl^oeNn9aqh*JC!DQ*VLmiT~Pgy9~H|Hl@~XQKl*uax0ppqYVXPG-&YlYXd6t zf3F_jJ-EyK<_tdouZcW|P>;)-oY{56!Ja`<;596TsP6S!H2X&kx+(UT^MuJHU?kX$ zp`hREaesZ`)9BSDY(gQbt%gS&3bHJbeiE^uR%>x*JjA-;fCuSh+wi;MjGc3pEU>RW7*S0l#z)8E>8dC~ z!6T60nbMfmGO}__qMc)%N-MOvP2@_(*FTxh#V~IY^l$ zF)t^7PWkQGEfr~=i9`1F|n0YWuts~n6|t^fc407*qoM6N<$g0CW( AbN~PV From aa676ab87863a8d42050d56355db1b25e07ce4bd Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Sun, 6 Mar 2016 12:16:33 +0100 Subject: [PATCH 37/48] Add steel sign + Update wooden sign texture --- mods/default/README.txt | 2 +- mods/default/aliases.lua | 3 +- mods/default/crafting.lua | 11 ++- mods/default/nodes.lua | 92 ++++++++++-------- mods/default/textures/default_sign.png | Bin 442 -> 0 bytes mods/default/textures/default_sign_steel.png | Bin 0 -> 3173 bytes mods/default/textures/default_sign_wall.png | Bin 416 -> 0 bytes .../textures/default_sign_wall_steel.png | Bin 0 -> 3187 bytes .../textures/default_sign_wall_wood.png | Bin 0 -> 3391 bytes mods/default/textures/default_sign_wood.png | Bin 0 -> 3406 bytes 10 files changed, 65 insertions(+), 43 deletions(-) delete mode 100644 mods/default/textures/default_sign.png create mode 100644 mods/default/textures/default_sign_steel.png delete mode 100644 mods/default/textures/default_sign_wall.png create mode 100644 mods/default/textures/default_sign_wall_steel.png create mode 100644 mods/default/textures/default_sign_wall_wood.png create mode 100644 mods/default/textures/default_sign_wood.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 4d33d390..048b4c0a 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -27,7 +27,6 @@ Cisoun's WTFPL texture pack: default_lava.png default_leaves.png default_sapling.png - default_sign_wall.png default_stone.png default_tree.png default_tree_top.png @@ -178,6 +177,7 @@ Gambit (WTFPL): default_paper.png default_diamond_block.png default_ladder_steel.png + default_sign_wall_wood.png asl97 (WTFPL): default_ice.png diff --git a/mods/default/aliases.lua b/mods/default/aliases.lua index 487d20d5..63fe59b2 100644 --- a/mods/default/aliases.lua +++ b/mods/default/aliases.lua @@ -32,7 +32,7 @@ minetest.register_alias("water_source", "default:water_source") minetest.register_alias("lava_flowing", "default:lava_flowing") minetest.register_alias("lava_source", "default:lava_source") minetest.register_alias("torch", "default:torch") -minetest.register_alias("sign_wall", "default:sign_wall") +minetest.register_alias("sign_wall", "default:sign_wall_wood") minetest.register_alias("furnace", "default:furnace") minetest.register_alias("chest", "default:chest") minetest.register_alias("locked_chest", "default:chest_locked") @@ -76,4 +76,5 @@ minetest.register_alias("default:pinetree", "default:pine_tree") minetest.register_alias("default:pinewood", "default:pine_wood") minetest.register_alias("default:ladder", "default:ladder_wood") +minetest.register_alias("default:sign_wall", "default:sign_wall_wood") diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 92864b1d..5ab8c538 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -43,7 +43,16 @@ minetest.register_craft({ }) minetest.register_craft({ - output = 'default:sign_wall', + output = 'default:sign_wall_steel 3', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:sign_wall_wood 3', recipe = { {'group:wood', 'group:wood', 'group:wood'}, {'group:wood', 'group:wood', 'group:wood'}, diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 61feec26..9006f137 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -146,7 +146,8 @@ default:chest_locked default:bookshelf -default:sign_wall +default:sign_wall_wood +default:sign_wall_steel default:ladder_wood default:ladder_steel @@ -1610,49 +1611,60 @@ minetest.register_node("default:bookshelf", { end, }) +local function register_sign(material, desc, def) + minetest.register_node("default:sign_wall_" .. material, { + description = desc .. " Sign", + drawtype = "nodebox", + tiles = {"default_sign_wall_" .. material .. ".png"}, + inventory_image = "default_sign_" .. material .. ".png", + wield_image = "default_sign_" .. material .. ".png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = def.groups, + legacy_wallmounted = true, + sounds = def.sounds, -minetest.register_node("default:sign_wall", { - description = "Sign", - drawtype = "nodebox", - tiles = {"default_sign.png"}, - inventory_image = "default_sign_wall.png", - wield_image = "default_sign_wall.png", - paramtype = "light", - paramtype2 = "wallmounted", - sunlight_propagates = true, - is_ground_content = false, - walkable = false, - node_box = { - type = "wallmounted", - wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, - wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, - wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, - }, - groups = {choppy = 2, dig_immediate = 2, attached_node = 1}, - legacy_wallmounted = true, - sounds = default.node_sound_defaults(), + on_construct = function(pos) + --local n = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + local player_name = sender:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (player_name or "") .. " wrote \"" .. + fields.text .. "\" to sign at " .. minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"' .. fields.text .. '"') + end, + }) +end - on_construct = function(pos) - --local n = minetest.get_node(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", "field[text;;${text}]") - meta:set_string("infotext", "\"\"") - end, - on_receive_fields = function(pos, formname, fields, sender) - --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) - if minetest.is_protected(pos, sender:get_player_name()) then - minetest.record_protection_violation(pos, sender:get_player_name()) - return - end - local meta = minetest.get_meta(pos) - if not fields.text then return end - minetest.log("action", (sender:get_player_name() or "") .. " wrote \"" .. - fields.text .. "\" to sign at " .. minetest.pos_to_string(pos)) - meta:set_string("text", fields.text) - meta:set_string("infotext", '"' .. fields.text .. '"') - end, +register_sign("wood", "Wooden", { + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, attached_node = 1, flammable = 2} }) +register_sign("steel", "Steel", { + sounds = default.node_sound_defaults(), + groups = {cracky = 2, attached_node = 1} +}) minetest.register_node("default:ladder_wood", { description = "Wooden Ladder", diff --git a/mods/default/textures/default_sign.png b/mods/default/textures/default_sign.png deleted file mode 100644 index 912a37239a282c4064faae5d466b6e90e9b57b38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 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 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_sign_wall.png b/mods/default/textures/default_sign_wall.png deleted file mode 100644 index 56a7d2e3452664c97bbe57680db9880bde331cc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 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 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_sign_wall_wood.png b/mods/default/textures/default_sign_wall_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..f25a67a82ae7f619a4a3a5cc296954538e915129 GIT binary patch literal 3391 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 k4+Z|BU}E+ Date: Tue, 8 Mar 2016 03:14:29 +0000 Subject: [PATCH 38/48] Beds: Fix code style issues --- mods/beds/api.lua | 5 +- mods/beds/beds.lua | 112 ++++++++++++++++++++-------------------- mods/beds/functions.lua | 33 ++++++------ mods/beds/init.lua | 17 +++--- mods/beds/spawns.lua | 2 +- 5 files changed, 86 insertions(+), 83 deletions(-) diff --git a/mods/beds/api.lua b/mods/beds/api.lua index 6b72814d..0c27c4e3 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -19,6 +19,7 @@ function beds.register_bed(name, def) type = "fixed", fixed = def.selectionbox, }, + after_place_node = function(pos, placer, itemstack) local n = minetest.get_node_or_nil(pos) if not n or not n.param2 then @@ -36,6 +37,7 @@ function beds.register_bed(name, def) minetest.set_node(p, {name = n.name:gsub("%_bottom", "_top"), param2 = n.param2}) return false end, + on_destruct = function(pos) local n = minetest.get_node_or_nil(pos) if not n then return end @@ -46,9 +48,11 @@ function beds.register_bed(name, def) minetest.remove_node(p) end end, + on_rightclick = function(pos, node, clicker) beds.on_rightclick(pos, clicker) end, + on_rotate = function(pos, node, user, mode, new_param2) local dir = minetest.facedir_to_dir(node.param2) local p = vector.add(pos, dir) @@ -99,7 +103,6 @@ function beds.register_bed(name, def) minetest.register_alias(name, name .. "_bottom") - -- register recipe minetest.register_craft({ output = name, recipe = def.recipe diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua index 43bf98ed..5f31f136 100644 --- a/mods/beds/beds.lua +++ b/mods/beds/beds.lua @@ -1,44 +1,45 @@ --- fancy shaped bed +-- Fancy shaped bed + beds.register_bed("beds:fancy_bed", { description = "Fancy Bed", inventory_image = "beds_bed_fancy.png", wield_image = "beds_bed_fancy.png", tiles = { - bottom = { - "beds_bed_top1.png", - "default_wood.png", - "beds_bed_side1.png", - "beds_bed_side1.png^[transformFX", - "default_wood.png", - "beds_bed_foot.png", - }, - top = { - "beds_bed_top2.png", - "default_wood.png", - "beds_bed_side2.png", - "beds_bed_side2.png^[transformFX", - "beds_bed_head.png", - "default_wood.png", - } + bottom = { + "beds_bed_top1.png", + "default_wood.png", + "beds_bed_side1.png", + "beds_bed_side1.png^[transformFX", + "default_wood.png", + "beds_bed_foot.png", + }, + top = { + "beds_bed_top2.png", + "default_wood.png", + "beds_bed_side2.png", + "beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "default_wood.png", + } }, nodebox = { - bottom = { - {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, - {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, - {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, - {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, - {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, - {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, - }, - top = { - {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, - {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, - {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, - {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, - {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, - {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, - {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, - } + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } }, selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, recipe = { @@ -48,41 +49,42 @@ beds.register_bed("beds:fancy_bed", { }, }) --- simple shaped bed +-- Simple shaped bed + beds.register_bed("beds:bed", { description = "Simple Bed", inventory_image = "beds_bed.png", wield_image = "beds_bed.png", tiles = { - bottom = { - "beds_bed_top_bottom.png^[transformR90", - "default_wood.png", - "beds_bed_side_bottom_r.png", - "beds_bed_side_bottom_r.png^[transformfx", - "beds_transparent.png", - "beds_bed_side_bottom.png" - }, - top = { - "beds_bed_top_top.png^[transformR90", - "default_wood.png", - "beds_bed_side_top_r.png", - "beds_bed_side_top_r.png^[transformfx", - "beds_bed_side_top.png", - "beds_transparent.png", - } + bottom = { + "beds_bed_top_bottom.png^[transformR90", + "default_wood.png", + "beds_bed_side_bottom_r.png", + "beds_bed_side_bottom_r.png^[transformfx", + "beds_transparent.png", + "beds_bed_side_bottom.png" + }, + top = { + "beds_bed_top_top.png^[transformR90", + "default_wood.png", + "beds_bed_side_top_r.png", + "beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "beds_transparent.png", + } }, nodebox = { - bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, - top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, }, selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, recipe = { {"wool:red", "wool:red", "wool:white"}, {"group:wood", "group:wood", "group:wood"} }, - }) --- aliases for PA's beds mod +-- Aliases for PilzAdam's beds mod + minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom") minetest.register_alias("beds:bed_top_red", "beds:bed_top") diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 5b2f5406..afc8e15a 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -6,15 +6,14 @@ if enable_respawn == nil then enable_respawn = true end - --- helper functions +-- Helper functions local function get_look_yaw(pos) local n = minetest.get_node(pos) if n.param2 == 1 then - return pi/2, n.param2 + return pi / 2, n.param2 elseif n.param2 == 3 then - return -pi/2, n.param2 + return -pi / 2, n.param2 elseif n.param2 == 0 then return pi, n.param2 else @@ -70,8 +69,8 @@ local function lay_down(player, pos, bed_pos, state, skip) end -- physics, eye_offset, etc - player:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) - player:set_look_yaw(math.random(1, 180)/100) + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_look_yaw(math.random(1, 180) / 100) default.player_attached[name] = false player:set_physics_override(1, 1, 1) hud_flags.wielditem = true @@ -84,11 +83,11 @@ local function lay_down(player, pos, bed_pos, state, skip) player_in_bed = player_in_bed + 1 -- physics, eye_offset, etc - player:set_eye_offset({x=0,y=-13,z=0}, {x=0,y=0,z=0}) + player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0}) local yaw, param2 = get_look_yaw(bed_pos) player:set_look_yaw(yaw) local dir = minetest.facedir_to_dir(param2) - local p = {x=bed_pos.x+dir.x/2,y=bed_pos.y,z=bed_pos.z+dir.z/2} + local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} player:set_physics_override(0, 0, 0) player:setpos(p) default.player_attached[name] = true @@ -102,17 +101,15 @@ end local function update_formspecs(finished) local ges = #minetest.get_connected_players() local form_n = "" - local is_majority = (ges/2) < player_in_bed + local is_majority = (ges / 2) < player_in_bed if finished then - form_n = beds.formspec .. - "label[2.7,11; Good morning.]" + form_n = beds.formspec .. "label[2.7,11; Good morning.]" else - form_n = beds.formspec .. - "label[2.2,11;"..tostring(player_in_bed).." of "..tostring(ges).." players are in bed]" + form_n = beds.formspec .. "label[2.2,11;" .. tostring(player_in_bed) .. + " of " .. tostring(ges) .. " players are in bed]" if is_majority and is_night_skip_enabled() then - form_n = form_n .. - "button_exit[2,8;4,0.75;force;Force night skip]" + form_n = form_n .. "button_exit[2,8;4,0.75;force;Force night skip]" end end @@ -122,10 +119,10 @@ local function update_formspecs(finished) end --- public functions +-- Public functions function beds.kick_players() - for name,_ in pairs(beds.player) do + for name, _ in pairs(beds.player) do local player = minetest.get_player_by_name(name) lay_down(player, nil, nil, false) end @@ -175,7 +172,7 @@ function beds.on_rightclick(pos, player) end --- callbacks +-- Callbacks minetest.register_on_joinplayer(function(player) beds.read_spawns() diff --git a/mods/beds/init.lua b/mods/beds/init.lua index 09982c24..8b258901 100644 --- a/mods/beds/init.lua +++ b/mods/beds/init.lua @@ -3,14 +3,15 @@ beds.player = {} beds.pos = {} beds.spawn = {} -beds.formspec = "size[8,15;true]".. - "bgcolor[#080808BB; true]".. - "button_exit[2,12;4,0.75;leave;Leave Bed]" +beds.formspec = "size[8,15;true]" .. + "bgcolor[#080808BB; true]" .. + "button_exit[2,12;4,0.75;leave;Leave Bed]" local modpath = minetest.get_modpath("beds") --- load files -dofile(modpath.."/functions.lua") -dofile(modpath.."/api.lua") -dofile(modpath.."/beds.lua") -dofile(modpath.."/spawns.lua") +-- Load files + +dofile(modpath .. "/functions.lua") +dofile(modpath .. "/api.lua") +dofile(modpath .. "/beds.lua") +dofile(modpath .. "/spawns.lua") diff --git a/mods/beds/spawns.lua b/mods/beds/spawns.lua index 6e087f82..14ec75bf 100644 --- a/mods/beds/spawns.lua +++ b/mods/beds/spawns.lua @@ -43,7 +43,7 @@ function beds.save_spawns() end local output = io.open(org_file, "w") for i, v in pairs(beds.spawn) do - output:write(v.x.." "..v.y.." "..v.z.." "..i.."\n") + output:write(v.x .. " " .. v.y .. " " .. v.z .. " " .. i .. "\n") end io.close(output) end From a5ad30748de460b0309b106370cc953e4ccfefe5 Mon Sep 17 00:00:00 2001 From: red-001 Date: Wed, 20 Jan 2016 22:18:03 +0000 Subject: [PATCH 39/48] Add an on_burn callback. --- game_api.txt | 10 +++++++++- mods/fire/init.lua | 10 ++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/game_api.txt b/game_api.txt index 4ee23f09..6944d580 100644 --- a/game_api.txt +++ b/game_api.txt @@ -176,6 +176,14 @@ The farming API allows you to easily register plants and hoes. maxlight = default.LIGHT_MAX -- Maximum light to grow } +Fire API +-------- + +`on_burn(pos)` + + * Called when fire attempts to remove a burning node. + * `pos` Position of the burning node. + Screwdriver API --------------- @@ -451,4 +459,4 @@ Trees * Grows a new design aspen tree at pos * `default.grow_new_snowy_pine_tree(pos)` - * Grows a new design snowy pine tree at pos \ No newline at end of file + * Grows a new design snowy pine tree at pos diff --git a/mods/fire/init.lua b/mods/fire/init.lua index a5566628..28f68e98 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -235,8 +235,14 @@ else -- remove flammable nodes around flame local p = minetest.find_node_near(p0, 1, {"group:flammable"}) if p then - minetest.remove_node(p) - nodeupdate(p) + local node = minetest.get_node(p) + local def = minetest.registered_nodes[node.name] + if def.on_burn then + def.on_burn(p) + else + minetest.remove_node(p) + nodeupdate(p) + end end end end, From 676822d28659732d620506c25836bbdd06ceba23 Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Wed, 9 Mar 2016 11:08:41 +0100 Subject: [PATCH 40/48] Change steel ladder sounds + fix/add missing recipes --- mods/default/crafting.lua | 28 ++++++++++++++++++++++++++-- mods/default/nodes.lua | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 5ab8c538..34292a41 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -766,7 +766,31 @@ minetest.register_craft({ minetest.register_craft({ type = "fuel", - recipe = "default:ladder", + recipe = "default:fence_acacia_wood", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_junglewood", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_pine_wood", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_aspen_wood", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:ladder_wood", burntime = 5, }) @@ -790,7 +814,7 @@ minetest.register_craft({ minetest.register_craft({ type = "fuel", - recipe = "default:sign_wall", + recipe = "default:sign_wall_wood", burntime = 10, }) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 9006f137..6ebf1a6a 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1708,7 +1708,7 @@ minetest.register_node("default:ladder_steel", { --wall_side = = }, groups = {cracky = 2}, - sounds = default.node_sound_defaults(), + sounds = default.node_sound_stone_defaults(), }) default.register_fence("default:fence_wood", { From d979293f1448882e3a2eb0f7a3ecbaaf6b189d36 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 14 Dec 2015 21:49:20 -0800 Subject: [PATCH 41/48] Convert fences to NDT_CONNECTED. This changes the drawtype of fences to NDT_CONNECTED nodebox drawtype. These nodes are drawn by the client with the needed connections on the fly as the scene is drawn. There is no logic needed by mods to modify the nodes. These fences connect to (1) other fences, (2) planks and (3) tree trunks, but nothing else. They do not connect to stone, dirt, wool, etc. This is done by the "connects_to" parameter, which takes groups and node names. Due to the way textures are wrapped, we can make these nodes look a lot better by giving them a special tile. This change requires minetest/minetest#3503. --- mods/default/functions.lua | 23 +++++++++++++----- mods/default/nodes.lua | 10 ++++---- .../textures/default_fence_acacia_wood.png | Bin 0 -> 232 bytes .../textures/default_fence_aspen_wood.png | Bin 0 -> 450 bytes .../textures/default_fence_junglewood.png | Bin 0 -> 231 bytes .../textures/default_fence_pine_wood.png | Bin 0 -> 233 bytes mods/default/textures/default_fence_wood.png | Bin 0 -> 230 bytes 7 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 mods/default/textures/default_fence_acacia_wood.png create mode 100644 mods/default/textures/default_fence_aspen_wood.png create mode 100644 mods/default/textures/default_fence_junglewood.png create mode 100644 mods/default/textures/default_fence_pine_wood.png create mode 100644 mods/default/textures/default_fence_wood.png diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 29506c40..a85009bf 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -213,16 +213,27 @@ function default.register_fence(name, def) -- Allow almost everything to be overridden local default_fields = { paramtype = "light", - drawtype = "fencelike", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}}, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16,3/16,-1/2,1/16,5/16,-1/8}, + {-1/16,-5/16,-1/2,1/16,-3/16,-1/8}}, + connect_left = {{-1/2,3/16,-1/16,-1/8,5/16,1/16}, + {-1/2,-5/16,-1/16,-1/8,-3/16,1/16}}, + connect_back = {{-1/16,3/16,1/8,1/16,5/16,1/2}, + {-1/16,-5/16,1/8,1/16,-3/16,1/2}}, + connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16}, + {1/8,-5/16,-1/16,1/2,-3/16,1/16}}, + }, + connects_to = {"group:fence", "group:wood", "group:tree"}, inventory_image = fence_texture, wield_image = fence_texture, - tiles = { def.texture }, + tiles = {def.texture}, sunlight_propagates = true, is_ground_content = false, - selection_box = { - type = "fixed", - fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, - }, groups = {}, } for k, v in pairs(default_fields) do diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 6ebf1a6a..7b03383d 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1713,7 +1713,7 @@ minetest.register_node("default:ladder_steel", { default.register_fence("default:fence_wood", { description = "Wooden Fence", - texture = "default_wood.png", + texture = "default_fence_wood.png", material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() @@ -1721,7 +1721,7 @@ default.register_fence("default:fence_wood", { default.register_fence("default:fence_acacia_wood", { description = "Acacia Fence", - texture = "default_acacia_wood.png", + texture = "default_fence_acacia_wood.png", material = "default:acacia_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() @@ -1729,7 +1729,7 @@ default.register_fence("default:fence_acacia_wood", { default.register_fence("default:fence_junglewood", { description = "Junglewood Fence", - texture = "default_junglewood.png", + texture = "default_fence_junglewood.png", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() @@ -1737,7 +1737,7 @@ default.register_fence("default:fence_junglewood", { default.register_fence("default:fence_pine_wood", { description = "Pine Fence", - texture = "default_pine_wood.png", + texture = "default_fence_pine_wood.png", material = "default:pine_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() @@ -1745,7 +1745,7 @@ default.register_fence("default:fence_pine_wood", { default.register_fence("default:fence_aspen_wood", { description = "Aspen Fence", - texture = "default_aspen_wood.png", + texture = "default_fence_aspen_wood.png", material = "default:aspen_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() diff --git a/mods/default/textures/default_fence_acacia_wood.png b/mods/default/textures/default_fence_acacia_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..3b973f34fbaf1d6d9351fe4e24b3da9e614ff666 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnYjZ>9K){rdHk(p>FJJmvd zx|8-yC+#^-TAMxe_xc*|@He{o`^IIU;wDcQ#}JO|qNfeH4mpUhT!>tgG&R(|qW`_v zNzNmeN+-x1a9*-?OZ=1Ny&SJK|K8@|`OLN_^lpu3i^TQZ7mT9Q^weFS?JW6{88U70 zOw-TzOdmfj-w--+#paBn^%fKO&7HDbbWn& z>~rq5xcz!#aWHH4;v<4UQs@N$I!jTrL&C{1)w*OCGJm{71S1e_Lg!BaB=ajz603xV zAGd8CU`^8zsM#R^E1jbbK7o*aQ;Z@Y1z>tK$2O(UyI8t~nw@$X<8a0hTEc!TZBr6X zj#>Zt?Kd`?4N?4|T?ZqY`k5$JgQQYtDXTp99zYI26f1}de^}1 z%cRaybe497Z!;l;?G@|nVc0}B2fY>v>-9S%^Q&P3H);QaF*QNZ4Ov;}Rzj>2%0mBh zV7Kp8sVP@ad^|b#`eT(K7kA$VZ`>u&*%E6Se*OIJeOl=pxv!>M+J*m(Wubc{pU=MZ s`tLp1)^AMhzic}X%EwjFef4ep1?f_*GKfbTk^lez07*qoM6N<$f|}jMmH+?% literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fence_junglewood.png b/mods/default/textures/default_fence_junglewood.png new file mode 100644 index 0000000000000000000000000000000000000000..c390941ce54ff75c8b4c2b4ffcbbe4fc040f8088 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnYl@?%-6Jk^qXE9Y~H&f-b z)Znwy;nv?13a2N9MFk!yUWuCMzbcVBms zaK>vZj+c8~ysTe$JowiAWd5bQX$dpTAL!nG=B(7AbNd4GGM(72wj;$aBbFbG=zDkX zO#XEr-TTe@Z633)CYk=5GsTA?B}}mKI7Xa3%Q_ZmbBZJtqYQFvls=l+>`)4-BUj5CiVJH_AX>9fI(u=7R`@MS$ z!tQvx>?+<>x_oZsB-f8G(q1W^C^v|j{JD6ugz~9ntXI0h gRn$^wUH(M--J3)mdKI;Vst02}LGZ2$lO literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fence_wood.png b/mods/default/textures/default_fence_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..1e76430d2f54f3b259598fb396df4aaf8b30b39e GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnYZOyb<*60=PtXh{~5M-~s zu+F0~*?4ZHYiG7?vbR=yw(ZwzhqeM0H+Z@@hHzXL?Kb2(w_*wCU=;m z*XQ-k{~ai%)VSJcr}BNjhrXKIR?Td@5te)P$>Od29Stwu86PUVs<^v& Date: Fri, 26 Feb 2016 07:30:38 -0800 Subject: [PATCH 42/48] Add a simple, but stylish fence gate. This fence gate builds on NDT_CONNECTED by assuming fence nodes will automatically connect to it's sides properly. The fence gate will open and close just like doors, with sounds, but it only opens one way. The gate sticks out quite a bit and can be bumped into, so the fence may be used as some sort of path switch. The fence gate offers no form of protection and can be opened and closed by anyone. This is done on purpose - the fencegate isn't meant to provide protection from players, as fences can be trivially jumped over. Instead, these fences should be used for protecting crops from hungry sheep, or keeping rabbits in their pen, or just decoration. Mods can also modify the mod to add protection, of course. A recipe is added to make these. It's 4 sticks and 2 wood (any) as follows: stick wood stick stick wood stick The collision box of the open gate is such that if two gates are connected but mirrored (making an M shape) then you can walk a large entity that's larger than 1.0 wide through the opening. The gate of an opened fence can also be stood upon or bumped into. I've mixed together some sounds to provide a somewhat light sound experience, one that one would expect from a small gate latching open and close. This change requires #873, otherwise it doesn't connect to fences. --- mods/doors/README.txt | 20 +++- mods/doors/init.lua | 59 ++++++++++ mods/doors/models/doors_fencegate_closed.obj | 106 ++++++++++++++++++ mods/doors/models/doors_fencegate_open.obj | 112 +++++++++++++++++++ mods/doors/sounds/doors_fencegate_close.ogg | Bin 0 -> 10032 bytes mods/doors/sounds/doors_fencegate_open.ogg | Bin 0 -> 8942 bytes 6 files changed, 293 insertions(+), 4 deletions(-) create mode 100644 mods/doors/models/doors_fencegate_closed.obj create mode 100644 mods/doors/models/doors_fencegate_open.obj create mode 100644 mods/doors/sounds/doors_fencegate_close.ogg create mode 100644 mods/doors/sounds/doors_fencegate_open.ogg diff --git a/mods/doors/README.txt b/mods/doors/README.txt index 02a1e9e3..deff667c 100644 --- a/mods/doors/README.txt +++ b/mods/doors/README.txt @@ -7,9 +7,10 @@ License of source code: Copyright (C) 2012 PilzAdam modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor) Steel trapdoor added by sofar. -Copyright (C) 2015 sofar@foo-projects.org +Copyright (C) 2016 sofar@foo-projects.org Re-implemented most of the door algorithms, added meshes, UV wrapped texture Added doors API to facilitate coding mods accessing and operating doors. +Added Fence Gate model, code, and sounds This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it @@ -43,9 +44,6 @@ following textures created by sofar (CC-BY-SA-3.0) doors_trapdoor_steel_side.png door_trapdoor_side.png -Door 3d models by sofar (CC-BY-SA-3.0) - door_a.obj - door_b.obj Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen: WTFPL door_obsidian_glass.png @@ -57,6 +55,14 @@ All other textures (created by PilzAdam): WTFPL Door textures were converted to the new texture map by sofar, paramat and red-001, under the same license as the originals. +Models: +-------------------------------------- +Door 3d models by sofar (CC-BY-SA-3.0) + - door_a.obj + - door_b.obj +Fence gate models by sofar (CC-BY-SA-3.0) + - fencegate_open.obj + - fencegate_closed.obj License of sounds -------------------------------------- @@ -64,3 +70,9 @@ Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen door_open.ogg Closing-Sound created by bennstir (CC BY 3.0) door_close.ogg +fencegate_open.ogg: + http://www.freesound.org/people/mhtaylor67/sounds/126041/ - CC0 +fencegate_close.ogg: + http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - CC-BY-3.0 + http://www.freesound.org/people/rivernile7/sounds/249573/ - CC-BY-3.0 + diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 01778284..32d2845c 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -642,3 +642,62 @@ minetest.register_craft({ } }) + +----fence gate---- + +local fence = { + description = "Fence Gate", + drawtype = "mesh", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = "doors:gate_closed", + connect_sides = { "left", "right" }, + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, + flammable = 2, fence = 1}, + on_rightclick = function(pos, clicker) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, {name = def.gate, param2 = node.param2}) + minetest.sound_play(def.sound, {pos = pos, gain = 0.3, + max_hear_distance = 8}) + end, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4}, + }, +} + +local fence_closed = table.copy(fence) +fence_closed.mesh = "doors_fencegate_closed.obj" +fence_closed.gate = "doors:gate_open" +fence_closed.sound = "doors_fencegate_open" +fence_closed.collision_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4}, +} + +local fence_open = table.copy(fence) +fence_open.mesh = "doors_fencegate_open.obj" +fence_open.gate = "doors:gate_closed" +fence_open.sound = "doors_fencegate_close" +fence_open.groups.not_in_creative_inventory = 1 +fence_open.collision_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4}, + {-5/8, -3/8, -14/16, -3/8, 3/8, 0}}, +} + +minetest.register_node("doors:gate_closed", fence_closed) +minetest.register_node("doors:gate_open", fence_open) + +minetest.register_craft({ + output = "doors:gate_closed", + recipe = { + {"default:stick", "group:wood", "default:stick"}, + {"default:stick", "group:wood", "default:stick"}, + }, +}) + diff --git a/mods/doors/models/doors_fencegate_closed.obj b/mods/doors/models/doors_fencegate_closed.obj new file mode 100644 index 00000000..60eb4d74 --- /dev/null +++ b/mods/doors/models/doors_fencegate_closed.obj @@ -0,0 +1,106 @@ +# Blender v2.76 (sub 0) OBJ File: 'gate_closed.blend' +# www.blender.org +mtllib gate_closed.mtl +o Cube_Cube.001 +v -0.625000 -0.500000 0.125000 +v -0.625000 0.500000 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500000 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500000 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500000 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500000 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500000 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500000 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500000 -0.125000 +v -0.375000 0.187500 0.062500 +v -0.375000 0.312500 0.062500 +v -0.375000 0.187500 -0.062500 +v -0.375000 0.312500 -0.062500 +v 0.375000 0.187500 0.062500 +v 0.375000 0.312500 0.062500 +v 0.375000 0.187500 -0.062500 +v 0.375000 0.312500 -0.062500 +v -0.374831 0.187348 0.062500 +v -0.156342 0.187363 0.062500 +v -0.374831 0.187348 -0.062500 +v -0.156342 0.187363 -0.062500 +v 0.374981 -0.343683 0.062500 +v 0.375065 -0.187304 0.062500 +v 0.374981 -0.343683 -0.062500 +v 0.375065 -0.187304 -0.062500 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt -0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt -0.000000 0.687500 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.687500 +vt 0.813740 0.249033 +vt 0.201557 0.249293 +vt 0.120995 0.125498 +vt 0.987404 0.125469 +vt 0.125000 0.375000 +vt 0.812500 0.375000 +vt 0.937500 0.500000 +vt 0.062500 0.500000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.312500 0.437500 +vt 0.312500 0.312500 +vt 1.000000 0.312500 +vt 1.000000 0.437500 +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 +vn -0.578000 -0.816100 0.000000 +vn 0.576200 0.817300 0.000000 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/4/2 8/5/2 7/6/2 3/1/2 +f 8/7/3 6/8/3 5/9/3 7/10/3 +f 6/2/4 2/9/4 1/8/4 5/3/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/6/6 8/1/6 4/13/6 2/14/6 +f 10/1/1 12/2/1 11/3/1 9/4/1 +f 12/2/2 16/9/2 15/8/2 11/3/2 +f 16/7/3 14/8/3 13/9/3 15/10/3 +f 14/4/4 10/5/4 9/6/4 13/1/4 +f 9/12/5 11/11/5 15/15/5 13/16/5 +f 14/14/6 16/13/6 12/17/6 10/18/6 +f 20/2/2 24/3/2 23/19/2 19/20/2 +f 22/1/4 18/4/4 17/21/4 21/22/4 +f 17/23/5 19/24/5 23/25/5 21/26/5 +f 22/21/6 24/5/6 20/6/6 18/22/6 +f 28/27/2 32/28/2 31/29/2 27/30/2 +f 30/31/4 26/32/4 25/33/4 29/34/4 +f 25/35/7 27/10/7 31/7/7 29/36/7 +f 30/37/8 32/38/8 28/39/8 26/40/8 diff --git a/mods/doors/models/doors_fencegate_open.obj b/mods/doors/models/doors_fencegate_open.obj new file mode 100644 index 00000000..6c6a9cf4 --- /dev/null +++ b/mods/doors/models/doors_fencegate_open.obj @@ -0,0 +1,112 @@ +# Blender v2.76 (sub 0) OBJ File: 'gate_open.blend' +# www.blender.org +mtllib gate_open.mtl +o Cube_Cube.001 +v -0.625000 -0.500000 0.125000 +v -0.625000 0.500000 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500000 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500000 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500000 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500000 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500000 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500000 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500000 -0.125000 +v 0.434859 0.187500 -0.872359 +v 0.434859 0.312500 -0.872359 +v 0.559859 0.187500 -0.872359 +v 0.559859 0.312500 -0.872359 +v 0.434859 0.187500 -0.122359 +v 0.434859 0.312500 -0.122359 +v 0.559859 0.187500 -0.122359 +v 0.559859 0.312500 -0.122359 +v 0.434859 0.187348 -0.872190 +v 0.434859 0.187363 -0.653701 +v 0.559859 0.187348 -0.872190 +v 0.559859 0.187363 -0.653701 +v 0.434859 -0.343683 -0.122379 +v 0.434859 -0.187304 -0.122294 +v 0.559859 -0.343683 -0.122379 +v 0.559859 -0.187304 -0.122294 +v 0.499560 -0.442900 0.005495 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt -0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt -0.000000 0.687500 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.687500 +vt 0.813740 0.249033 +vt 0.201557 0.249293 +vt 0.120995 0.125498 +vt 0.987404 0.125469 +vt 0.125000 0.375000 +vt 0.812500 0.375000 +vt 0.937500 0.500000 +vt 0.062500 0.500000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.312500 0.437500 +vt 0.312500 0.312500 +vt 1.000000 0.312500 +vt 1.000000 0.437500 +vt 0.312500 0.625000 +vt 0.312500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.625000 +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 +vn 0.000000 -0.816100 -0.578000 +vn 0.000000 0.817300 0.576200 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/4/2 8/5/2 7/6/2 3/1/2 +f 8/7/3 6/8/3 5/9/3 7/10/3 +f 6/2/4 2/9/4 1/8/4 5/3/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/6/6 8/1/6 4/13/6 2/14/6 +f 10/1/1 12/2/1 11/3/1 9/4/1 +f 12/2/2 16/9/2 15/8/2 11/3/2 +f 16/7/3 14/8/3 13/9/3 15/10/3 +f 14/4/4 10/5/4 9/6/4 13/1/4 +f 9/12/5 11/11/5 15/15/5 13/16/5 +f 14/14/6 16/13/6 12/17/6 10/18/6 +f 20/2/3 24/3/3 23/19/3 19/20/3 +f 22/1/1 18/4/1 17/21/1 21/22/1 +f 17/23/5 19/24/5 23/25/5 21/26/5 +f 22/21/6 24/5/6 20/6/6 18/22/6 +f 28/27/3 32/28/3 31/29/3 27/30/3 +f 30/31/1 26/32/1 25/33/1 29/34/1 +f 25/35/7 27/10/7 31/7/7 29/36/7 +f 30/37/8 32/38/8 28/39/8 26/40/8 +f 17/41/2 18/42/2 20/43/2 19/44/2 diff --git a/mods/doors/sounds/doors_fencegate_close.ogg b/mods/doors/sounds/doors_fencegate_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d42590ffb1417852a5d3549b4ca337f9e7119339 GIT binary patch literal 10032 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 O0Eh=DnBoC8$o~L@cublA literal 0 HcmV?d00001 diff --git a/mods/doors/sounds/doors_fencegate_open.ogg b/mods/doors/sounds/doors_fencegate_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f6dfd1d9778240796820c052213903889e7e2896 GIT binary patch literal 8942 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 literal 0 HcmV?d00001 From f8f7502e3253d50e4e0829fdd6e2ad7aab2e4cd3 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 11 Jan 2016 21:53:38 -0800 Subject: [PATCH 43/48] Basic stone walls, using NDT_CONNECTED. These basic connected wall nodes automatically connect to neigboring stone blocks, other wall blocks and anything that's "cracky". The do not connect to wood (fences will do that). The walls are generated using a new walls.register() API. Documentation on the API is included in game_api.txt. This change requires minetest/minetest#3503. Walls are added for all cobble stone materials. They generally look best and are the natural use cases for these materials. --- game_api.txt | 11 ++++++++ mods/walls/depends.txt | 1 + mods/walls/init.lua | 61 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 mods/walls/depends.txt create mode 100644 mods/walls/init.lua diff --git a/game_api.txt b/game_api.txt index 6944d580..a32f8d5c 100644 --- a/game_api.txt +++ b/game_api.txt @@ -139,6 +139,17 @@ Allows creation of new fences with "fencelike" drawtype. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), +#Walls API +--------- +The walls API allows easy addition of stone auto-connecting wall nodes. + +walls.register(name, desc, texture, mat, sounds) +^ name = "walls:stone_wall". Node name. +^ desc = "A Stone wall" +^ texture = "default_stone.png" +^ mat = "default:stone". Used to auto-generate crafting recipe. +^ sounds = sounds: see [#Default sounds] + Farming API ----------- diff --git a/mods/walls/depends.txt b/mods/walls/depends.txt new file mode 100644 index 00000000..4ad96d51 --- /dev/null +++ b/mods/walls/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/walls/init.lua b/mods/walls/init.lua new file mode 100644 index 00000000..e3c1d68f --- /dev/null +++ b/mods/walls/init.lua @@ -0,0 +1,61 @@ + +--[[ + +Walls mod for Minetest + +Copyright (C) 2015 Auke Kok + +This program is free software. It comes without any warranty, to +the extent permitted by applicable law. You can redistribute it +and/or modify it under the terms of the Do What The Fuck You Want +To Public License, Version 2, as published by Sam Hocevar. See +http://sam.zoy.org/wtfpl/COPYING for more details. + +--]] + +walls = {} + +walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sounds) + -- inventory node, and pole-type wall start item + minetest.register_node(wall_name, { + description = wall_desc, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}}, + -- connect_bottom = + connect_front = {{-3/16, -1/2, -1/2, 3/16, 3/8, -1/4}}, + connect_left = {{-1/2, -1/2, -3/16, -1/4, 3/8, 3/16}}, + connect_back = {{-3/16, -1/2, 1/4, 3/16, 3/8, 1/2}}, + connect_right = {{ 1/4, -1/2, -3/16, 1/2, 3/8, 3/16}}, + }, + connects_to = { "group:cracky", "group:wall", "group:stone" }, + paramtype = "light", + is_ground_content = false, + tiles = { wall_texture, }, + walkable = true, + groups = { cracky = 3, wall = 1, stone = 2 }, + sounds = wall_sounds, + }) + + -- crafting recipe + minetest.register_craft({ + output = wall_name .. " 6", + recipe = { + { '', '', '' }, + { wall_mat, wall_mat, wall_mat}, + { wall_mat, wall_mat, wall_mat}, + } + }) + +end + +walls.register("walls:cobble", "Cobblestone Wall", "default_cobble.png", + "default:cobble", default.node_sound_stone_defaults()) + +walls.register("walls:mossycobble", "Mossy Cobblestone Wall", "default_mossycobble.png", + "default:mossycobble", default.node_sound_stone_defaults()) + +walls.register("walls:desertcobble", "Desert Cobblestone Wall", "default_desert_cobble.png", + "default:desert_cobble", default.node_sound_stone_defaults()) + From 2fb40be4098cd6964b5247a7227c79be9576331a Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 20 Jan 2016 14:29:48 +0000 Subject: [PATCH 44/48] Add "protection_bypass" priv. The access privilege allows players that have it to bypass protection on locked doors/trapdoors, chests and bones. The priv also allows bypassing any minetest.is_protected() check, including digging nodes and placing them. It is meant for world moderators to clean up and fix map issues. Original patch by red-001. Split up and rebased/rewritten by sofar. This patch requires https://github.com/minetest/minetest/pull/3800 --- mods/bones/init.lua | 2 +- mods/default/nodes.lua | 3 +++ mods/doors/init.lua | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index c86deccd..71f8f1cb 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -5,7 +5,7 @@ bones = {} local function is_owner(pos, name) local owner = minetest.get_meta(pos):get_string("owner") - if owner == "" or owner == name then + if owner == "" or owner == name or minetest.check_player_privs(placer, "protection_bypass") then return true end return false diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 7b03383d..a7fd43fa 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1414,6 +1414,9 @@ end local function has_locked_chest_privilege(meta, player) local name = "" if player then + if minetest.check_player_privs(player, "protection_bypass") then + return true + end name = player:get_player_name() end if name ~= meta:get_string("owner") then diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 32d2845c..e5962bd3 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -121,7 +121,7 @@ function _doors.door_toggle(pos, clicker) local def = minetest.registered_nodes[minetest.get_node(pos).name] local name = def.door.name - if clicker then + if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then local owner = meta:get_string("doors_owner") if owner ~= "" then if clicker:get_player_name() ~= owner then @@ -492,7 +492,7 @@ end ----trapdoor---- function _doors.trapdoor_toggle(pos, clicker) - if clicker then + if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then local meta = minetest.get_meta(pos) local owner = meta:get_string("doors_owner") if owner ~= "" then @@ -519,7 +519,7 @@ function doors.register_trapdoor(name, def) local name_opened = name.."_open" local function check_player_priv(pos, player) - if not def.protected then + if not def.protected or minetest.check_player_privs(player, "protection_bypass") then return true end local meta = minetest.get_meta(pos) From 9c887e0b322df8bf886ab6df27c39e09be1b97d6 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 8 Mar 2016 00:41:22 +0000 Subject: [PATCH 45/48] Dye: Make pink dye mixable Correct 2 inconsistent mixes Clean up code style and vertically align mix table Remove dyelocal and simplify table names --- mods/dye/init.lua | 99 ++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index d7d18f7a..0a951758 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -1,39 +1,37 @@ --- minetest/dye/init.lua - -- Other mods can use these for looping through available colors + dye = {} dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} --- Local stuff -local dyelocal = {} +-- This collection of colors is partly a historic thing, partly something else --- This collection of colors is partly a historic thing, partly something else. -dyelocal.dyes = { - {"white", "White dye", {dye=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, - {"grey", "Grey dye", {dye=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, - {"dark_grey", "Dark grey dye", {dye=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, - {"black", "Black dye", {dye=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, - {"violet", "Violet dye", {dye=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, - {"blue", "Blue dye", {dye=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, - {"cyan", "Cyan dye", {dye=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, - {"dark_green", "Dark green dye",{dye=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, - {"green", "Green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, - {"yellow", "Yellow dye", {dye=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "Brown dye", {dye=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, - {"orange", "Orange dye", {dye=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, - {"red", "Red dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, - {"magenta", "Magenta dye", {dye=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, - {"pink", "Pink dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, +local dyes = { + {"white", "White dye", {dye=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, + {"grey", "Grey dye", {dye=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, + {"dark_grey", "Dark grey dye", {dye=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, + {"black", "Black dye", {dye=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, + {"violet", "Violet dye", {dye=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, + {"blue", "Blue dye", {dye=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, + {"cyan", "Cyan dye", {dye=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, + {"dark_green", "Dark green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, + {"green", "Green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, + {"yellow", "Yellow dye", {dye=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, + {"brown", "Brown dye", {dye=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, + {"orange", "Orange dye", {dye=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, + {"red", "Red dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, + {"magenta", "Magenta dye", {dye=1, basecolor_magenta=1, excolor_red_violet=1, unicolor_red_violet=1}}, + {"pink", "Pink dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, } -- Define items -for _, row in ipairs(dyelocal.dyes) do + +for _, row in ipairs(dyes) do local name = row[1] local description = row[2] local groups = row[3] - local item_name = "dye:"..name - local item_image = "dye_"..name..".png" + local item_name = "dye:" .. name + local item_image = "dye_" .. name .. ".png" minetest.register_craftitem(item_name, { inventory_image = item_image, description = description, @@ -41,11 +39,13 @@ for _, row in ipairs(dyelocal.dyes) do }) minetest.register_craft({ type = "shapeless", - output = item_name.." 4", - recipe = {"group:flower,color_"..name}, + output = item_name .. " 4", + recipe = {"group:flower,color_" .. name}, }) end --- manually add coal->black dye + +-- Manually add coal->black dye + minetest.register_craft({ type = "shapeless", output = "dye:black 4", @@ -55,33 +55,34 @@ minetest.register_craft({ -- Mix recipes -- Just mix everything to everything somehow sanely -dyelocal.mixbases = {"magenta", "red", "orange", "brown", "yellow", "green", "dark_green", "cyan", "blue", "violet", "black", "dark_grey", "grey", "white"} +local mixbases = {"pink", "magenta", "red", "orange", "brown", "yellow", "green", "dark_green", "cyan", "blue", "violet", "black", "dark_grey", "grey", "white"} -dyelocal.mixes = { - -- magenta, red, orange, brown, yellow, green, dark_green, cyan, blue, violet, black, dark_grey, grey, white - white = {"pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "violet", "grey", "grey", "white", "white"}, - grey = {"pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "pink", "dark_grey","grey", "grey"}, - dark_grey={"brown","brown", "brown", "brown", "brown","dark_green","dark_green","blue","blue","violet","black", "black"}, - black = {"black", "black", "black", "black", "black", "black", "black", "black", "black", "black", "black"}, - violet= {"magenta","magenta","red", "brown", "red", "cyan", "brown", "blue", "violet","violet"}, - blue = {"violet", "magenta","brown","brown","dark_green","cyan","cyan", "cyan", "blue"}, - cyan = {"blue","brown","dark_green","dark_grey","green","cyan","dark_green","cyan"}, - dark_green={"brown","brown","brown", "brown", "green", "green", "dark_green"}, - green = {"brown", "yellow","yellow","dark_green","green","green"}, - yellow= {"red", "orange", "yellow","orange", "yellow"}, - brown = {"brown", "brown","orange", "brown"}, - orange= {"red", "orange","orange"}, - red = {"magenta","red"}, - magenta={"magenta"}, +local mixes = { + -- pink, magenta, red, orange, brown, yellow, green, dark_green, cyan, blue, violet, black, dark_grey, grey, white + white = {"pink", "pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "violet","grey", "grey", "grey","white"}, + grey = {"pink", "pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "violet","dark_grey","grey", "grey"}, + dark_grey = {"brown", "brown", "brown", "brown", "brown", "brown", "dark_green","dark_green","blue", "blue", "violet","black", "dark_grey"}, + black = {"black", "black", "black", "black", "black", "black", "black", "black", "black","black", "black", "black"}, + violet = {"magenta","magenta","magenta","red", "brown", "red", "cyan", "brown", "blue", "violet","violet"}, + blue = {"violet", "violet", "magenta","brown", "brown", "dark_green","cyan", "cyan", "cyan", "blue"}, + cyan = {"brown", "blue", "brown", "dark_green","dark_grey", "green", "cyan", "dark_green","cyan"}, + dark_green = {"brown", "brown", "brown", "brown", "brown", "green", "green", "dark_green"}, + green = {"yellow", "brown", "yellow", "yellow", "dark_green","green", "green"}, + yellow = {"orange", "red", "orange", "yellow", "orange", "yellow"}, + brown = {"brown", "brown", "brown", "orange", "brown"}, + orange = {"orange", "red", "orange", "orange"}, + red = {"pink", "magenta","red"}, + magenta = {"magenta","magenta"}, + pink = {"pink"}, } -for one,results in pairs(dyelocal.mixes) do - for i,result in ipairs(results) do - local another = dyelocal.mixbases[i] +for one, results in pairs(mixes) do + for i, result in ipairs(results) do + local another = mixbases[i] minetest.register_craft({ type = "shapeless", - output = 'dye:'..result..' 2', - recipe = {'dye:'..one, 'dye:'..another}, + output = 'dye:' .. result .. ' 2', + recipe = {'dye:' .. one, 'dye:' .. another}, }) end end From 079b79603179c648e03fb78cf96e05496c5e409f Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 8 Mar 2016 02:40:45 +0000 Subject: [PATCH 46/48] Dye: Add global table of dye names and descriptions --- mods/dye/init.lua | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index 0a951758..d414d77c 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -2,7 +2,28 @@ dye = {} dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} -dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} +dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", + "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} + +-- Make dye names and descriptions available globally + +dye.dyes = { + {"white", "White"}, + {"grey", "Grey"}, + {"dark_grey", "Dark grey"}, + {"black", "Black"}, + {"violet", "Violet"}, + {"blue", "Blue"}, + {"cyan", "Cyan"}, + {"dark_green", "Dark green"}, + {"green", "Green"}, + {"yellow", "Yellow"}, + {"brown", "Brown"}, + {"orange", "Orange"}, + {"red", "Red"}, + {"magenta", "Magenta"}, + {"pink", "Pink"}, +} -- This collection of colors is partly a historic thing, partly something else From 20053d6b52f3f500a0a96a20cbf0a08c439c4142 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Fri, 11 Mar 2016 21:45:09 +0000 Subject: [PATCH 47/48] Fix bug rotating unknown node This fixes a bug what crashes game when rotating an unknown node. --- mods/screwdriver/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 34b4b4a8..6b82d042 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -36,7 +36,7 @@ local function screwdriver_handler(itemstack, user, pointed_thing, mode) local node = minetest.get_node(pos) local ndef = minetest.registered_nodes[node.name] -- verify node is facedir (expected to be rotatable) - if ndef.paramtype2 ~= "facedir" then + if not ndef or ndef.paramtype2 ~= "facedir" then return end -- Compute param2 From dfee51c21e1131c9c80fc7382b000954962f8b49 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 11 Mar 2016 22:11:39 -0800 Subject: [PATCH 48/48] Clean up door tops if fire destroys bottom. Fixes #909. Door tops are never flammable. This doesn't guard yet against a voxelmanip removing the top node, but that is less of an issue since if a voxelmanip removes the top, then the bottom part remains functional and visibly intact. If the voxelmanip removes the bottom part, but not the top, then this patch makes it clean up the top just fine. --- mods/doors/init.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index e5962bd3..9300e6ff 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -339,6 +339,10 @@ function doors.register(name, def) end end + def.on_destruct = function(pos) + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + end + minetest.register_node(":" .. name .. "_a", { description = def.description, visual = "mesh", @@ -361,6 +365,7 @@ function doors.register(name, def) can_dig = def.can_dig, on_rotate = def.on_rotate, on_blast = def.on_blast, + on_destruct = def.on_destruct, selection_box = { type = "fixed", fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} @@ -393,6 +398,7 @@ function doors.register(name, def) can_dig = def.can_dig, on_rotate = def.on_rotate, on_blast = def.on_blast, + on_destruct = def.on_destruct, selection_box = { type = "fixed", fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16}