diff --git a/minetestforfun_game/mods/doors/README.txt b/minetestforfun_game/mods/doors/README.txt index 27f0507a..b1c1363e 100755 --- a/minetestforfun_game/mods/doors/README.txt +++ b/minetestforfun_game/mods/doors/README.txt @@ -1,12 +1,16 @@ 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) 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 @@ -40,8 +44,25 @@ following textures created by sofar (CC-BY-SA-3.0) doors_trapdoor_steel_side.png door_trapdoor_side.png + +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. + +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 -------------------------------------- @@ -49,3 +70,12 @@ 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 +Steel door sounds (open & close (CC-BY-3.0) by HazMatt + - http://www.freesound.org/people/HazMattt/sounds/187283/ + doors_steel_door_open.ogg + doors_steel_door_close.ogg diff --git a/minetestforfun_game/mods/doors/init.lua b/minetestforfun_game/mods/doors/init.lua index 4df14826..37d42f5e 100755 --- a/minetestforfun_game/mods/doors/init.lua +++ b/minetestforfun_game/mods/doors/init.lua @@ -1,483 +1,558 @@ + +--[[ + +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", + -- can't use airlike otherwise falling nodes will turn to entities + -- and will be forever stuck until door is removed. + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + -- has to be walkable for falling nodes to stop falling. + walkable = true, + pointable = false, + diggable = false, + buildable_to = false, + floodable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_blast = function() end, + tiles = {"doors_blank.png"}, + -- 1px transparent block inside door hinge near node top. + nodebox = { + type = "fixed", + fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, + }, + -- collision_box needed otherise selection box would be full node size + collision_box = { + type = "fixed", + fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, + }, +}) + +-- 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 def = minetest.registered_nodes[minetest.get_node(pos).name] + local name = def.door.name + + local state = meta:get_string("state") + if state == "" then + -- fix up lvm-placed right-hinged doors, default closed + if minetest.get_node(pos).name:sub(-2) == "_b" then + state = 2 + end + else + state = tonumber(state) end - if not def.sound_close_door then - def.sound_close_door = "doors_door_close" - end - if not def.sound_open_door then - def.sound_open_door = "doors_door_open" + 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 + return false + end + end end + 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 - minetest.register_craftitem(name, { + 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.swap_node(pos, { + name = name .. transform[state + 1][dir+1].v, + param2 = transform[state + 1][dir+1].param2 + }) + meta:set_int("state", state) + + 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) + if not name:find(":") then + name = "doors:" .. name + end + + -- replace old doors of this type automatically + 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 = name .. "_" .. new.type, param2 = p2}) + meta:set_int("state", new.state) + -- properly place doors:hidden at the right spot + local p3 = p2 + if new.state >= 2 then + p3 = (p3 + 3) % 4 + end + if new.state % 2 == 1 then + if new.state >= 2 then + p3 = (p3 + 1) % 4 + else + p3 = (p3 + 3) % 4 + end + end + -- 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", param2 = p3}) + end + }) + + minetest.register_craftitem(":" .. name, { description = def.description, inventory_image = def.inventory_image, on_place = function(itemstack, placer, pointed_thing) + local pos = nil + if not pointed_thing.type == "node" 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) + local node = minetest.get_node(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 - 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 - 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 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}) + if pdef and pdef.buildable_to then + pos = pointed_thing.under 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) + pos = pointed_thing.above + node = minetest.get_node(pos) + pdef = minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end end - if def.only_placer_can_open 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 + + 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 = { + { 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 = name .. "_b", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = (dir + 3) % 4}) + else + minetest.set_node(pos, {name = name .. "_a", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = dir}) + end + + 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 + + on_place_node(pos, minetest.get_node(pos), placer, node, itemstack, pointed_thing) + 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) + local can_dig = function(pos, digger) + if not def.protected then + return true 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 + if minetest.check_player_privs(digger, "protection_bypass") then return true end local meta = minetest.get_meta(pos) - local pn = player:get_player_name() - return meta:get_string("doors_owner") == pn + local name = "" + if digger then + name = digger:get_player_name() + end + return meta:get_string("doors_owner") == 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 = name + def.door = { + name = 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}) + nodeupdate({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 {name} + 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", + mesh = "door_a.obj", + tiles = def.tiles, + drawtype = "mesh", paramtype = "light", paramtype2 = "facedir", + sunlight_propagates = 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, + on_destruct = def.on_destruct, 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(":" .. name .. "_b", { + description = def.description, + visual = "mesh", + mesh = "door_b.obj", + tiles = def.tiles, + drawtype = "mesh", paramtype = "light", paramtype2 = "facedir", + sunlight_propagates = 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, + on_destruct = def.on_destruct, 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") - }) + if def.recipe then + minetest.register_craft({ + output = name, + recipe = def.recipe, + }) + end + _doors.registered_doors[name .. "_a"] = true + _doors.registered_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 }, + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + {"group:wood", "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 }, + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "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 }, + sounds = default.node_sound_glass_defaults(), + recipe = { + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + } }) -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("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"} - } +doors.register("door_obsidian_glass", { + tiles = { "doors_door_obsidian_glass.png" }, + description = "Obsidian Glass Door", + inventory_image = "doors_item_obsidian_glass.png", + groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 }, + 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"}, + }, }) -- From BFD: Cherry planks doors -doors.register_door("doors:door_cherry", { +doors.register("door_cherry", { + tiles = { "doors_door_cherry.png" }, description = "Cherry Door", inventory_image = "doors_wood_cherry.png", groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, - tiles_bottom = {"doors_wood_cherry_b.png", "default_wood_cherry_planks.png"}, - tiles_top = {"doors_wood_cherry_a.png", "default_wood_cherry_planks.png"}, sounds = default.node_sound_wood_defaults(), - sunlight = false, -}) - -minetest.register_craft({ - output = "doors:door_cherry", recipe = { {"default:cherry_plank", "default:cherry_plank"}, {"default:cherry_plank", "default:cherry_plank"}, {"default:cherry_plank", "default:cherry_plank"} } }) +minetest.register_alias("doors:door_wood_cherry", "doors:door_cherry") -- doors tin MFF -doors.register_door("doors:door_tin", { +doors.register("door_tin", { + tiles = { "doors_tin.png" }, description = "Tin Door", inventory_image = "doors_tin.png", groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1}, - tiles_bottom = {"doors_tin_b.png", "doors_grey2.png"}, - tiles_top = {"doors_tin_t.png", "doors_grey2.png"}, - only_placer_can_open = true, + protected = true, sounds = default.node_sound_stone_defaults(), sunlight = false, -}) - -minetest.register_craft({ - output = "doors:door_tin", recipe = { {"moreores:tin_ingot", "moreores:tin_ingot"}, {"moreores:tin_ingot", "moreores:tin_ingot"}, {"moreores:tin_ingot", "moreores:tin_ingot"} - } }) -- doors prison MFF -doors.register_door("doors:door_prison", { +doors.register("door_prison", { + tiles = { "doors_prison.png" }, description = "Prison Door", inventory_image = "doors_prison_inv.png", groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1}, - tiles_bottom = {"doors_prison_b.png", "doors_black.png"}, - tiles_top = {"doors_prison_t.png", "doors_black.png"}, - only_placer_can_open = true, + protected = true, sounds = default.node_sound_stone_defaults(), - sunlight = false, -}) - -minetest.register_craft({ - output = "doors:door_prison", recipe = { {"darkage:iron_stick", "darkage:iron_stick"}, {"darkage:iron_stick", "darkage:iron_stick"}, @@ -487,18 +562,12 @@ minetest.register_craft({ }) -- MFF gardengate white -doors.register_door("doors:door_gardengate_white", { +doors.register("doors:door_gardengate_white", { + tiles = { "doors_gardengate_white.png" }, description = "Garden Gate White Door", inventory_image = "doors_gardengate_white_inv.png", groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, - tiles_bottom = {"doors_gardengate_white_b.png", "doors_white.png"}, - tiles_top = {"doors_gardengate_white_t.png", "doors_invisible.png"}, sounds = default.node_sound_wood_defaults(), - sunlight = false, -}) - -minetest.register_craft({ - output = "doors:door_gardengate_white 2", recipe = { {"dye:white", "group:stick", ""}, {"group:stick", "group:stick", "group:stick"}, @@ -508,12 +577,61 @@ minetest.register_craft({ ----trapdoor---- +-- 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) + 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(name, def) +end + +----trapdoor---- + +function _doors.trapdoor_toggle(pos, clicker) + 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 + 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 or minetest.check_player_privs(player, "protection_bypass") then return true end local meta = minetest.get_meta(pos) @@ -521,18 +639,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 @@ -542,7 +650,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) @@ -551,6 +659,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) @@ -585,10 +713,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", @@ -596,9 +725,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", { @@ -607,11 +733,10 @@ 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, + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", 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({ @@ -651,5 +776,106 @@ minetest.register_craft({ } }) +----fence gate---- + +function doors.register_fencegate(name, def) + local fence = { + description = def.description, + drawtype = "mesh", + tiles = { def.texture }, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = name .. "_closed", + connect_sides = { "left", "right" }, + groups = def.groups, + sounds = def.sounds, + on_rightclick = function(pos, clicker) + local node = minetest.get_node(pos) + local node_def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2}) + minetest.sound_play(node_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}, + }, + } + + if not fence.sounds then + fence.sounds = default.node_sound_wood_defaults() + end + + fence.groups.fence = 1 + + local fence_closed = table.copy(fence) + fence_closed.mesh = "doors_fencegate_closed.obj" + fence_closed.gate = name .. "_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 = name .. "_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(":" .. name .. "_closed", fence_closed) + minetest.register_node(":" .. name .. "_open", fence_open) + + minetest.register_craft({ + output = name .. "_closed", + recipe = { + {"default:stick", def.material, "default:stick"}, + {"default:stick", def.material, "default:stick"} + } + }) +end + +doors.register_fencegate("doors:gate_wood", { + description = "Wooden Fence Gate", + texture = "default_wood.png", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_acacia_wood", { + description = "Acacia Fence Gate", + texture = "default_acacia_wood.png", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_junglewood", { + description = "Junglewood Fence Gate", + texture = "default_junglewood.png", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_pine_wood", { + description = "Pine Fence Gate", + texture = "default_pine_wood.png", + material = "default:pine_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_aspen_wood", { + description = "Aspen Fence Gate", + texture = "default_aspen_wood.png", + material = "default:aspen_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + -- door 3 nodes dofile(minetest.get_modpath("doors").."/doors3.lua") diff --git a/minetestforfun_game/mods/doors/models/door_a.obj b/minetestforfun_game/mods/doors/models/door_a.obj new file mode 100644 index 00000000..bd5127b5 --- /dev/null +++ b/minetestforfun_game/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/minetestforfun_game/mods/doors/models/door_b.obj b/minetestforfun_game/mods/doors/models/door_b.obj new file mode 100644 index 00000000..c5607b87 --- /dev/null +++ b/minetestforfun_game/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/minetestforfun_game/mods/doors/models/doors_fencegate_closed.obj b/minetestforfun_game/mods/doors/models/doors_fencegate_closed.obj new file mode 100644 index 00000000..0050f70e --- /dev/null +++ b/minetestforfun_game/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.500100 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500100 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500100 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500100 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500100 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500100 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500100 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500100 -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/minetestforfun_game/mods/doors/models/doors_fencegate_open.obj b/minetestforfun_game/mods/doors/models/doors_fencegate_open.obj new file mode 100644 index 00000000..3fb727f4 --- /dev/null +++ b/minetestforfun_game/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.500100 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500100 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500100 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500100 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500100 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500100 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500100 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500100 -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/minetestforfun_game/mods/doors/sounds/doors_fencegate_close.ogg b/minetestforfun_game/mods/doors/sounds/doors_fencegate_close.ogg new file mode 100644 index 00000000..d42590ff Binary files /dev/null and b/minetestforfun_game/mods/doors/sounds/doors_fencegate_close.ogg differ diff --git a/minetestforfun_game/mods/doors/sounds/doors_fencegate_open.ogg b/minetestforfun_game/mods/doors/sounds/doors_fencegate_open.ogg new file mode 100644 index 00000000..f6dfd1d9 Binary files /dev/null and b/minetestforfun_game/mods/doors/sounds/doors_fencegate_open.ogg differ diff --git a/minetestforfun_game/mods/doors/sounds/doors_steel_door_close.ogg b/minetestforfun_game/mods/doors/sounds/doors_steel_door_close.ogg new file mode 100644 index 00000000..aea7be67 Binary files /dev/null and b/minetestforfun_game/mods/doors/sounds/doors_steel_door_close.ogg differ diff --git a/minetestforfun_game/mods/doors/sounds/doors_steel_door_open.ogg b/minetestforfun_game/mods/doors/sounds/doors_steel_door_open.ogg new file mode 100644 index 00000000..de874770 Binary files /dev/null and b/minetestforfun_game/mods/doors/sounds/doors_steel_door_open.ogg differ diff --git a/minetestforfun_game/mods/doors/textures/doors_blank.png b/minetestforfun_game/mods/doors/textures/doors_blank.png new file mode 100644 index 00000000..1914264c Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_blank.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_door_cherry.png b/minetestforfun_game/mods/doors/textures/doors_door_cherry.png new file mode 100644 index 00000000..a39a7555 Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_door_cherry.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_door_glass.png b/minetestforfun_game/mods/doors/textures/doors_door_glass.png new file mode 100644 index 00000000..f597299b Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_door_glass.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_door_obsidian_glass.png b/minetestforfun_game/mods/doors/textures/doors_door_obsidian_glass.png new file mode 100644 index 00000000..107a5a1a Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_door_obsidian_glass.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_door_steel.png b/minetestforfun_game/mods/doors/textures/doors_door_steel.png new file mode 100644 index 00000000..f42f3350 Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_door_steel.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_door_wood.png b/minetestforfun_game/mods/doors/textures/doors_door_wood.png new file mode 100644 index 00000000..7b18203e Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_door_wood.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_gardengate_white.png b/minetestforfun_game/mods/doors/textures/doors_gardengate_white.png new file mode 100644 index 00000000..eab49fa2 Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_gardengate_white.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_item_glass.png b/minetestforfun_game/mods/doors/textures/doors_item_glass.png new file mode 100644 index 00000000..791a58ab Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_item_glass.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_item_obsidian_glass.png b/minetestforfun_game/mods/doors/textures/doors_item_obsidian_glass.png new file mode 100644 index 00000000..1026d437 Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_item_obsidian_glass.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_item_steel.png b/minetestforfun_game/mods/doors/textures/doors_item_steel.png new file mode 100644 index 00000000..dd99e136 Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_item_steel.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_item_wood.png b/minetestforfun_game/mods/doors/textures/doors_item_wood.png new file mode 100644 index 00000000..d3a62ab1 Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_item_wood.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_prison.png b/minetestforfun_game/mods/doors/textures/doors_prison.png new file mode 100644 index 00000000..166057fe Binary files /dev/null and b/minetestforfun_game/mods/doors/textures/doors_prison.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_tin.png b/minetestforfun_game/mods/doors/textures/doors_tin.png index ebeba72e..f949058e 100644 Binary files a/minetestforfun_game/mods/doors/textures/doors_tin.png and b/minetestforfun_game/mods/doors/textures/doors_tin.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_trapdoor.png b/minetestforfun_game/mods/doors/textures/doors_trapdoor.png index 8d002a9f..e92c8b2e 100644 Binary files a/minetestforfun_game/mods/doors/textures/doors_trapdoor.png and b/minetestforfun_game/mods/doors/textures/doors_trapdoor.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_trapdoor_side.png b/minetestforfun_game/mods/doors/textures/doors_trapdoor_side.png index 2a8d686f..c45d870d 100644 Binary files a/minetestforfun_game/mods/doors/textures/doors_trapdoor_side.png and b/minetestforfun_game/mods/doors/textures/doors_trapdoor_side.png differ diff --git a/minetestforfun_game/mods/doors/textures/doors_trapdoor_steel_side.png b/minetestforfun_game/mods/doors/textures/doors_trapdoor_steel_side.png index 68ad0df8..44c4344b 100644 Binary files a/minetestforfun_game/mods/doors/textures/doors_trapdoor_steel_side.png and b/minetestforfun_game/mods/doors/textures/doors_trapdoor_steel_side.png differ