From 5311c6ec964e9eab74ea176b551e0101448c36b0 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Mon, 19 Nov 2012 18:11:22 +0100 Subject: [PATCH] Replace the doors mod --- mods/doors/README.txt | 42 +-- mods/doors/init.lua | 469 +++++++++++++++----------- mods/doors/textures/door_brown.png | Bin 0 -> 109 bytes mods/doors/textures/door_grey.png | Bin 0 -> 109 bytes mods/doors/textures/door_steel.png | Bin 0 -> 230 bytes mods/doors/textures/door_steel_a.png | Bin 0 -> 223 bytes mods/doors/textures/door_steel_b.png | Bin 0 -> 206 bytes mods/doors/textures/door_wood_a_r.png | Bin 249 -> 0 bytes mods/doors/textures/door_wood_b_r.png | Bin 216 -> 0 bytes 9 files changed, 286 insertions(+), 225 deletions(-) create mode 100644 mods/doors/textures/door_brown.png create mode 100644 mods/doors/textures/door_grey.png create mode 100644 mods/doors/textures/door_steel.png create mode 100644 mods/doors/textures/door_steel_a.png create mode 100644 mods/doors/textures/door_steel_b.png delete mode 100644 mods/doors/textures/door_wood_a_r.png delete mode 100644 mods/doors/textures/door_wood_b_r.png diff --git a/mods/doors/README.txt b/mods/doors/README.txt index 074c30f..f1d6ab2 100644 --- a/mods/doors/README.txt +++ b/mods/doors/README.txt @@ -1,43 +1,23 @@ Minetest 0.4 mod: doors -======================== +======================= License of source code: ----------------------- -Original license text: --- (c) 2011 Fernando Zapata --- Code licensed under GNU GPLv3 --- Content licensed under CC BY-SA 3.0 --- 2012-01-08 11:03:57 +Copyright (C) 2012 PilzAdam -There has been unsuccesful attempts to contact the original author. Thus, -based on the intentions of the author, it is assumed that this code is -distributable and modifiable under LGPLv2+later, under which Minetest is -distributed. - -Modifications: - Copyright (C) 2012 celeron55, Perttu Ahola - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -http://www.gnu.org/licenses/lgpl-2.1.html +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. License of media (textures and sounds) -------------------------------------- -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -http://creativecommons.org/licenses/by-sa/3.0/ - -Authors of media files ------------------------ -Everything not listed in here: -Copyright (C) 2010-2012 celeron55, Perttu Ahola - -From the original zlpdoors mod by Fernando Zapata: +Textures created by Fernando Zapata (CC BY-SA 3.0): + door_wood.png door_wood_a.png door_wood_a_r.png door_wood_b.png door_wood_b_r.png - door_wood.png - + +All other textures (created by PilzAdam): WTFPL diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 24349cb..4c0460b 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -1,205 +1,286 @@ --- Minetest 0.4 mod: doors --- See README.txt for licensing and other information. --------------------------------------------------------------------------------- +doors = {} -local WALLMX = 3 -local WALLMZ = 5 -local WALLPX = 2 -local WALLPZ = 4 +-- Registers a door +-- name: The name of the door +-- def: a table with the folowing fields: +-- description +-- inventory_image +-- groups +-- tiles_bottom: the tiles of the bottom part of the door {front, side} +-- tiles_top: the tiles of the bottom part of the door {front, side} +-- If the following fields are not defined the default values are used +-- node_box_bottom +-- node_box_top +-- selection_box_bottom +-- selection_box_top +-- only_placer_can_open: if true only the player who placed the door can +-- open it +function doors:register_door(name, def) + def.groups.not_in_creative_inventory = 1 + + local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}} + + 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 + end + + minetest.register_craftitem(name, { + description = def.description, + inventory_image = def.inventory_image, + + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return 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.env:get_node(pt).name].buildable_to or + not minetest.registered_nodes[minetest.env:get_node(pt2).name].buildable_to or + not placer or + not placer:is_player() + then + return itemstack + end + + 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 not string.find(minetest.env:get_node(pt3).name, name.."_b_") then + minetest.env:set_node(pt, {name=name.."_b_1", param2=p2}) + minetest.env:set_node(pt2, {name=name.."_t_1", param2=p2}) + else + minetest.env:set_node(pt, {name=name.."_b_2", param2=p2}) + minetest.env:set_node(pt2, {name=name.."_t_2", param2=p2}) + end + + if def.only_placer_can_open then + local pn = placer:get_player_name() + local meta = minetest.env:get_meta(pt) + meta:set_string("doors_owner", pn) + meta:set_string("infotext", "Owned by "..pn) + meta = minetest.env:get_meta(pt2) + meta:set_string("doors_owner", pn) + meta:set_string("infotext", "Owned by "..pn) + end + + itemstack:take_item() + return itemstack + end, + }) + + local tt = def.tiles_top + local tb = def.tiles_bottom + + local function after_dig_node(pos, name) + if minetest.env:get_node(pos).name == name then + minetest.env:remove_node(pos) + end + end + + local function on_punch(pos, dir, check_name, replace, replace_dir, params) + pos.y = pos.y+dir + if not minetest.env:get_node(pos).name == check_name then + return + end + local p2 = minetest.env:get_node(pos).param2 + p2 = params[p2+1] + + local meta = minetest.env:get_meta(pos):to_table() + minetest.env:set_node(pos, {name=replace_dir, param2=p2}) + minetest.env:get_meta(pos):from_table(meta) + + pos.y = pos.y-dir + meta = minetest.env:get_meta(pos):to_table() + minetest.env:set_node(pos, {name=replace, param2=p2}) + minetest.env:get_meta(pos):from_table(meta) + end + + local function check_player_priv(pos, player) + if not def.only_placer_can_open then + return true + end + local meta = minetest.env:get_meta(pos) + local pn = player:get_player_name() + return meta:get_string("doors_owner") == pn + end + + minetest.register_node(name.."_b_1", { + tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"}, + paramtype = "light", + paramtype2 = "facedir", + 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_1") + end, + + on_punch = function(pos, node, puncher) + if check_player_priv(pos, puncher) then + on_punch(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + end + end, + + can_dig = check_player_priv, + }) + + minetest.register_node(name.."_t_1", { + tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"}, + paramtype = "light", + paramtype2 = "facedir", + drop = name, + 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_1") + end, + + on_punch = function(pos, node, puncher) + if check_player_priv(pos, puncher) then + on_punch(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0}) + end + end, + + can_dig = check_player_priv, + }) + + minetest.register_node(name.."_b_2", { + tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]}, + paramtype = "light", + paramtype2 = "facedir", + 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") + end, + + on_punch = function(pos, node, puncher) + if check_player_priv(pos, puncher) then + on_punch(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + end + end, + + can_dig = check_player_priv, + }) + + minetest.register_node(name.."_t_2", { + tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]}, + paramtype = "light", + paramtype2 = "facedir", + drop = name, + 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") + end, + + on_punch = function(pos, node, puncher) + if check_player_priv(pos, puncher) then + on_punch(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2}) + end + end, + + can_dig = check_player_priv, + }) + +end --------------------------------------------------------------------------------- - -minetest.register_alias('door', 'doors:door_wood') -minetest.register_alias('door_wood', 'doors:door_wood') - -minetest.register_node( 'doors:door_wood', { - description = 'Wooden Door', - drawtype = 'signlike', - tiles = { 'door_wood.png' }, - inventory_image = 'door_wood.png', - wield_image = 'door_wood.png', - paramtype2 = 'wallmounted', - selection_box = { type = 'wallmounted' }, - groups = { choppy=2, dig_immediate=2 }, -}) - -minetest.register_craft( { - output = 'doors:door_wood', - recipe = { - { 'default:wood', 'default:wood' }, - { 'default:wood', 'default:wood' }, - { 'default:wood', 'default:wood' }, - }, +doors:register_door("doors:door_wood", { + description = "Wooden Door", + inventory_image = "door_wood.png", + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, + tiles_bottom = {"door_wood_b.png", "door_brown.png"}, + tiles_top = {"door_wood_a.png", "door_brown.png"}, }) minetest.register_craft({ - type = 'fuel', - recipe = 'doors:door_wood', - burntime = 30, + output = "doors:door_wood", + recipe = { + {"default:wood", "default:wood"}, + {"default:wood", "default:wood"}, + {"default:wood", "default:wood"} + } }) -minetest.register_node( 'doors:door_wood_a_c', { - Description = 'Top Closed Door', - drawtype = 'signlike', - tiles = { 'door_wood_a.png' }, - inventory_image = 'door_wood_a.png', - paramtype = 'light', - paramtype2 = 'wallmounted', - walkable = true, - selection_box = { type = "wallmounted", }, - groups = { choppy=2, dig_immediate=2 }, - legacy_wallmounted = true, - drop = 'doors:door_wood', +doors:register_door("doors:door_steel", { + description = "Steel Door", + inventory_image = "door_steel.png", + groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1}, + tiles_bottom = {"door_steel_b.png", "door_grey.png"}, + tiles_top = {"door_steel_a.png", "door_grey.png"}, + only_placer_can_open = true, }) -minetest.register_node( 'doors:door_wood_b_c', { - Description = 'Bottom Closed Door', - drawtype = 'signlike', - tiles = { 'door_wood_b.png' }, - inventory_image = 'door_wood_b.png', - paramtype = 'light', - paramtype2 = 'wallmounted', - walkable = true, - selection_box = { type = "wallmounted", }, - groups = { choppy=2, dig_immediate=2 }, - legacy_wallmounted = true, - drop = 'doors:door_wood', +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"} + } }) -minetest.register_node( 'doors:door_wood_a_o', { - Description = 'Top Open Door', - drawtype = 'signlike', - tiles = { 'door_wood_a_r.png' }, - inventory_image = 'door_wood_a_r.png', - paramtype = 'light', - paramtype2 = 'wallmounted', - walkable = false, - selection_box = { type = "wallmounted", }, - groups = { choppy=2, dig_immediate=2 }, - legacy_wallmounted = true, - drop = 'doors:door_wood', -}) - -minetest.register_node( 'doors:door_wood_b_o', { - Description = 'Bottom Open Door', - drawtype = 'signlike', - tiles = { 'door_wood_b_r.png' }, - inventory_image = 'door_wood_b_r.png', - paramtype = 'light', - paramtype2 = 'wallmounted', - walkable = false, - selection_box = { type = "wallmounted", }, - groups = { choppy=2, dig_immediate=2 }, - legacy_wallmounted = true, - drop = 'doors:door_wood', -}) - --------------------------------------------------------------------------------- - -local round = function( n ) - if n >= 0 then - return math.floor( n + 0.5 ) - else - return math.ceil( n - 0.5 ) - end -end - -local on_door_placed = function( pos, node, placer ) - if node.name ~= 'doors:door_wood' then return end - - local upos = { x = pos.x, y = pos.y - 1, z = pos.z } - local apos = { x = pos.x, y = pos.y + 1, z = pos.z } - local und = minetest.env:get_node( upos ) - local abv = minetest.env:get_node( apos ) - - local dir = placer:get_look_dir() - - if round( dir.x ) == 1 then - newparam = WALLMX - elseif round( dir.x ) == -1 then - newparam = WALLPX - elseif round( dir.z ) == 1 then - newparam = WALLMZ - elseif round( dir.z ) == -1 then - newparam = WALLPZ - end - - if und.name == 'air' then - minetest.env:add_node( pos, { name = 'doors:door_wood_a_c', param2 = newparam } ) - minetest.env:add_node( upos, { name = 'doors:door_wood_b_c', param2 = newparam } ) - elseif abv.name == 'air' then - minetest.env:add_node( pos, { name = 'doors:door_wood_b_c', param2 = newparam } ) - minetest.env:add_node( apos, { name = 'doors:door_wood_a_c', param2 = newparam } ) - else - minetest.env:remove_node( pos ) - placer:get_inventory():add_item( "main", 'doors:door_wood' ) - minetest.chat_send_player( placer:get_player_name(), 'not enough space' ) - end -end - -local on_door_punched = function( pos, node, puncher ) - if string.find( node.name, 'doors:door_wood' ) == nil then return end - - local upos = { x = pos.x, y = pos.y - 1, z = pos.z } - local apos = { x = pos.x, y = pos.y + 1, z = pos.z } - - if string.find( node.name, '_c', -2 ) ~= nil then - if node.param2 == WALLPX then - newparam = WALLMZ - elseif node.param2 == WALLMZ then - newparam = WALLMX - elseif node.param2 == WALLMX then - newparam = WALLPZ - elseif node.param2 == WALLPZ then - newparam = WALLPX - end - elseif string.find( node.name, '_o', -2 ) ~= nil then - if node.param2 == WALLMZ then - newparam = WALLPX - elseif node.param2 == WALLMX then - newparam = WALLMZ - elseif node.param2 == WALLPZ then - newparam = WALLMX - elseif node.param2 == WALLPX then - newparam = WALLPZ - end - end - - if ( node.name == 'doors:door_wood_a_c' ) then - minetest.env:add_node( pos, { name = 'doors:door_wood_a_o', param2 = newparam } ) - minetest.env:add_node( upos, { name = 'doors:door_wood_b_o', param2 = newparam } ) - - elseif ( node.name == 'doors:door_wood_b_c' ) then - minetest.env:add_node( pos, { name = 'doors:door_wood_b_o', param2 = newparam } ) - minetest.env:add_node( apos, { name = 'doors:door_wood_a_o', param2 = newparam } ) - - elseif ( node.name == 'doors:door_wood_a_o' ) then - minetest.env:add_node( pos, { name = 'doors:door_wood_a_c', param2 = newparam } ) - minetest.env:add_node( upos, { name = 'doors:door_wood_b_c', param2 = newparam } ) - - elseif ( node.name == 'doors:door_wood_b_o' ) then - minetest.env:add_node( pos, { name = 'doors:door_wood_b_c', param2 = newparam } ) - minetest.env:add_node( apos, { name = 'doors:door_wood_a_c', param2 = newparam } ) - - end -end - -local on_door_digged = function( pos, node, digger ) - local upos = { x = pos.x, y = pos.y - 1, z = pos.z } - local apos = { x = pos.x, y = pos.y + 1, z = pos.z } - - if ( node.name == 'doors:door_wood_a_c' ) or ( node.name == 'doors:door_wood_a_o' ) then - minetest.env:remove_node( upos ) - elseif ( node.name == 'doors:door_wood_b_c' ) or ( node.name == 'doors:door_wood_b_o' ) then - minetest.env:remove_node( apos ) - end -end - --------------------------------------------------------------------------------- - -minetest.register_on_placenode( on_door_placed ) -minetest.register_on_punchnode( on_door_punched ) -minetest.register_on_dignode( on_door_digged ) - --------------------------------------------------------------------------------- - +minetest.register_alias("doors:door_wood_a_c", "doors:door_wood_t_1") +minetest.register_alias("doors:door_wood_a_o", "doors:door_wood_t_1") +minetest.register_alias("doors:door_wood_b_c", "doors:door_wood_b_1") +minetest.register_alias("doors:door_wood_b_o", "doors:door_wood_b_1") diff --git a/mods/doors/textures/door_brown.png b/mods/doors/textures/door_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..02173db5f3547cd0d4c93542a638aa86c7a6f158 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0y~yU|H=O_B-5s0vsl%bKXibFfj0Vx;Tb#Tuzopr02aa*Jpcdz literal 0 HcmV?d00001 diff --git a/mods/doors/textures/door_grey.png b/mods/doors/textures/door_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..aa01458c3718fac08003a3042338fc9a85f60118 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0y~yU|H=O_B-5s0vv|B*(9ehFfj0Vx;Tb#Tu+YJk|D^ze1Y*f^NMGM3=9kmp00i_ I>zopr00PYx=Kufz literal 0 HcmV?d00001 diff --git a/mods/doors/textures/door_steel.png b/mods/doors/textures/door_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..27e40302ab24e0fbae9f447e5cad0722ee20a247 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Npn;F3H092giF zI14-?iy0WWg+Z8+Vb&Z81_lQ95>H=O_B-5s0vsYAn9g2iU|=Zrba4!^IQ=$wBkutP zo?@+ir}XC>6r6KV->!MC{-sVYSJsP4+p4@=p4?CoG*QTuXi#zD2r9m=J*)M#?G-&u z)zA05L$6Pgk8lZh?77IWU`o-^`8pF!LZ{wif4_0Ts_l7;FWLz`nX_C}C;A6x*_(s2 dy;&NB?cN#&YZ)zwWME)m@O1TaS?83{1OSEHO+Wwu literal 0 HcmV?d00001 diff --git a/mods/doors/textures/door_steel_a.png b/mods/doors/textures/door_steel_a.png new file mode 100644 index 0000000000000000000000000000000000000000..49604ce27f5d6beb61946575d7e7419ee88d9812 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^PDR@bRtZDhvz^ zoCO|{#S9GG!XV7ZFl&wk0|NtliKnkC`yFmR0d}LM(?cFIFfinJx;TbdoKCi>`tqWl zjf;VsnVI?U-QDFUFa3FRl)Hn`fKSuG$%*M9lZ1x0cCyPedE2Tl|1U0f-`I6H=Ijv% zMTrXLhzoz)dH=O_B-5s0_==Z?xx=v7#N~GT^vI!PQSgpQLw>* z!{y@Dok}ORuh;I2(`cTfXL9MGNr1^-aihci35J``-o03T+%fc{o6CaG>Fc7_g?5~f zIB{5A<>5Pq22uO72YBx2O?>jbp<~YTNWKtx&D)G~A4`5Ok9S|iz`(%Z>FVdQ&MBb@ E07BVDBme*a literal 0 HcmV?d00001 diff --git a/mods/doors/textures/door_wood_a_r.png b/mods/doors/textures/door_wood_a_r.png deleted file mode 100644 index 9315b75ad9fe9039ca407cbfc40ed4ec33ccd3b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`&N| z?e4dxa0o2HU3NZ5R22vI=oYUop)eNNK8mbsQ5CkRp%`K{C#N&j?X4AJz451sMpXaynVm1(r0hx zrT^sjeUe-KWAS$ZGhyb|ga^C{j^CxtTz@Q*I@)kJ{9bZsi*JpIScV|?r%Q`?`tK$C tf9}60{F2Ej;c26LLD`OG8Dr!tJ3@!oa}5;OXk;vd$@?2>{R3Qi1>g diff --git a/mods/doors/textures/door_wood_b_r.png b/mods/doors/textures/door_wood_b_r.png deleted file mode 100644 index 9c53aa410599bb156bc5df9b25c42a2a72dc7809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL7>k44ofy`glX=O&z`&N| z?e4@o!AlM@KPT~89m)SL54_{5#8Nkawf1lcl;J7G}g^cHp zvp!+@Z&P*tz<~n?jyNbuTs5#T*`RP-l~d};QddPo|0!%qL2@z-46&)AeGfPG8!|93 OFnGH9xvX