diff --git a/TODO.txt b/TODO.txt index 0fa1c13..6c9849c 100644 --- a/TODO.txt +++ b/TODO.txt @@ -10,3 +10,4 @@ TODO: -- Polish the game -- Rewrite the main mod from scratch with higher code standards -- A scoring system with leaderboards +-- Implement configurable teams diff --git a/mods/main/init.lua b/mods/main/init.lua index bca4619..c488af1 100644 --- a/mods/main/init.lua +++ b/mods/main/init.lua @@ -206,7 +206,9 @@ core.register_chatcommand("start", { local player_name = player:get_player_name() inv = player:get_inventory() inv:add_item("main", "ctf_ranged:ak47_loaded") - inv:add_item("main", "ctf_ranged:ammo 3") + inv:add_item("main", "ctf_ranged:remington870_loaded") + inv:add_item("main", "ctf_ranged:glock17_loaded") + inv:add_item("main", "ctf_ranged:ammo 50") player:set_properties({ pointable = true, -- allow players to be killable after the match starts }) diff --git a/mods/maps/maps/forest/map.mts b/mods/maps/maps/forest/map.mts index 9f52a1a..2627d04 100644 Binary files a/mods/maps/maps/forest/map.mts and b/mods/maps/maps/forest/map.mts differ diff --git a/mods/mtg/beds/README.txt b/mods/mtg/beds/README.txt new file mode 100644 index 0000000..5c452da --- /dev/null +++ b/mods/mtg/beds/README.txt @@ -0,0 +1,30 @@ +Minetest Game mod: beds +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by BlockMen (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +BlockMen (CC BY-SA 3.0) + All textures unless otherwise noted + +TumeniNodes (CC BY-SA 3.0) + beds_bed_under.png + +This mod adds a bed which allows players to skip the night. +To sleep, right click on the bed. If playing in singleplayer mode the night gets skipped +immediately. If playing multiplayer you get shown how many other players are in bed too, +if all players are sleeping the night gets skipped. The night skip can be forced if more +than half of the players are lying in bed and use this option. + +Another feature is a controlled respawning. If you have slept in bed (not just lying in +it) your respawn point is set to the beds location and you will respawn there after +death. +You can disable the respawn at beds by setting "enable_bed_respawn = false" in +minetest.conf. +You can disable the night skip feature by setting "enable_bed_night_skip = false" in +minetest.conf or by using the /set command in-game. diff --git a/mods/mtg/beds/api.lua b/mods/mtg/beds/api.lua new file mode 100644 index 0000000..2214465 --- /dev/null +++ b/mods/mtg/beds/api.lua @@ -0,0 +1,204 @@ +-- Removes a node without calling on on_destruct() +-- We use this to mess with bed nodes without causing unwanted recursion. +local function remove_no_destruct(pos) + minetest.swap_node(pos, {name = "air"}) + minetest.remove_node(pos) -- Now clear the meta + minetest.check_for_falling(pos) +end + +--- returns the position of the other bed half (or nil on failure) +local function get_other_bed_pos(pos, n) + local node = core.get_node(pos) + local dir = core.facedir_to_dir(node.param2) + if not dir then + return -- There are 255 possible param2 values. Ignore bad ones. + end + local other + if n == 2 then + other = vector.subtract(pos, dir) + elseif n == 1 then + other = vector.add(pos, dir) + else + return nil + end + + local onode = core.get_node(other) + if onode.param2 == node.param2 and core.get_item_group(onode.name, "bed") ~= 0 then + return other + end + return nil +end + +local function destruct_bed(pos, n) + local other = get_other_bed_pos(pos, n) + if other then + remove_no_destruct(other) + beds.remove_spawns_at(other) + end + beds.remove_spawns_at(pos) +end + +function beds.register_bed(name, def) + minetest.register_node(name .. "_bottom", { + description = def.description, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + drawtype = "nodebox", + tiles = def.tiles.bottom, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + stack_max = 1, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, + sounds = def.sounds or default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = def.nodebox.bottom, + }, + selection_box = { + type = "fixed", + fixed = def.selectionbox, + }, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + local pos + if udef and udef.buildable_to then + pos = under + else + pos = pointed_thing.above + end + + local player_name = placer and placer:get_player_name() or "" + + if minetest.is_protected(pos, player_name) and + not minetest.check_player_privs(player_name, "protection_bypass") then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + + local node_def = minetest.registered_nodes[minetest.get_node(pos).name] + if not node_def or not node_def.buildable_to then + return itemstack + end + + local dir = placer and placer:get_look_dir() and + minetest.dir_to_facedir(placer:get_look_dir()) or 0 + local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) + + if minetest.is_protected(botpos, player_name) and + not minetest.check_player_privs(player_name, "protection_bypass") then + minetest.record_protection_violation(botpos, player_name) + return itemstack + end + + local botdef = minetest.registered_nodes[minetest.get_node(botpos).name] + if not botdef or not botdef.buildable_to then + return itemstack + end + + minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) + minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack + end, + + on_destruct = function(pos) + destruct_bed(pos, 1) + end, + + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + beds.on_rightclick(pos, clicker) + return itemstack + end, + + on_rotate = function(pos, node, user, _, new_param2) + local dir = minetest.facedir_to_dir(node.param2) + if not dir then + return false + end + -- old position of the top node + local p = vector.add(pos, dir) + local node2 = minetest.get_node_or_nil(p) + if not node2 or minetest.get_item_group(node2.name, "bed") ~= 2 or + node.param2 ~= node2.param2 then + return false + end + if minetest.is_protected(p, user:get_player_name()) then + minetest.record_protection_violation(p, user:get_player_name()) + return false + end + if new_param2 % 32 > 3 then + return false + end + -- new position of the top node + local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) + local node3 = minetest.get_node_or_nil(newp) + local node_def = node3 and minetest.registered_nodes[node3.name] + if not node_def or not node_def.buildable_to then + return false + end + if minetest.is_protected(newp, user:get_player_name()) then + minetest.record_protection_violation(newp, user:get_player_name()) + return false + end + node.param2 = new_param2 + remove_no_destruct(p) + minetest.set_node(pos, node) + minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) + return true + end, + can_dig = function(pos, player) + return beds.can_dig(pos) + end, + }) + + minetest.register_node(name .. "_top", { + drawtype = "nodebox", + tiles = def.tiles.top, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2, + not_in_creative_inventory = 1}, + sounds = def.sounds or default.node_sound_wood_defaults(), + drop = "", + node_box = { + type = "fixed", + fixed = def.nodebox.top, + }, + selection_box = { + type = "fixed", + -- Small selection box to allow digging stray top nodes + fixed = {-0.3, -0.3, -0.3, 0.3, -0.1, 0.3}, + }, + on_destruct = function(pos) + destruct_bed(pos, 2) + end, + can_dig = function(pos, player) + local other = get_other_bed_pos(pos, 2) + return (not other) or beds.can_dig(other) + end, + }) + + minetest.register_alias(name, name .. "_bottom") + + minetest.register_craft({ + output = name, + recipe = def.recipe + }) +end diff --git a/mods/mtg/beds/beds.lua b/mods/mtg/beds/beds.lua new file mode 100644 index 0000000..e905107 --- /dev/null +++ b/mods/mtg/beds/beds.lua @@ -0,0 +1,109 @@ +-- beds/beds.lua + +-- support for MT game translation. +local S = beds.get_translator + +-- Fancy shaped bed + +beds.register_bed("beds:fancy_bed", { + description = S("Fancy Bed"), + inventory_image = "beds_bed_fancy.png", + wield_image = "beds_bed_fancy.png", + tiles = { + bottom = { + "beds_bed_top1.png", + "beds_bed_under.png", + "beds_bed_side1.png", + "beds_bed_side1.png^[transformFX", + "beds_bed_foot.png", + "beds_bed_foot.png", + }, + top = { + "beds_bed_top2.png", + "beds_bed_under.png", + "beds_bed_side2.png", + "beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.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}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:white", "wool:white", "wool:white"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +-- Simple shaped bed + +beds.register_bed("beds:bed", { + description = S("Simple Bed"), + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = { + "beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "beds_bed_side_bottom_r.png", + "beds_bed_side_bottom_r.png^[transformFX", + "blank.png", + "beds_bed_side_bottom.png" + }, + top = { + "beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "beds_bed_side_top_r.png", + "beds_bed_side_top_r.png^[transformFX", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:white", "wool:white", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + }, +}) + +-- 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") + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "beds:fancy_bed_bottom", + burntime = 13, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "beds:bed_bottom", + burntime = 12, +}) diff --git a/mods/mtg/beds/functions.lua b/mods/mtg/beds/functions.lua new file mode 100644 index 0000000..5fb5cd0 --- /dev/null +++ b/mods/mtg/beds/functions.lua @@ -0,0 +1,354 @@ +local pi = math.pi +local is_sp = minetest.is_singleplayer() +local enable_respawn = minetest.settings:get_bool("enable_bed_respawn") +if enable_respawn == nil then + enable_respawn = true +end + +-- Physics override management mods (shadow the global variable) +local player_monoids = core.get_modpath("player_monoids") and player_monoids +local pova = core.get_modpath("pova") and pova + +if player_monoids and not player_monoids.speed.checkout_branch then + -- This function exists since 2025-05-17 + core.log("warning", "[beds] player_monoids is too old, thus not supported.") + player_monoids = nil +end + +-- support for MT game translation. +local S = beds.get_translator + +-- Helper functions + +local function get_look_yaw(pos) + local rotation = minetest.get_node(pos).param2 + if rotation > 3 then + rotation = rotation % 4 -- Mask colorfacedir values + end + if rotation == 1 then + return pi / 2, rotation + elseif rotation == 3 then + return -pi / 2, rotation + elseif rotation == 0 then + return pi, rotation + else + return 0, rotation + end +end + +local function is_night_skip_enabled() + local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip") + if enable_night_skip == nil then + enable_night_skip = true + end + return enable_night_skip +end + +local function check_in_beds(players) + local in_bed = beds.player + if not players then + players = minetest.get_connected_players() + end + + for n, player in ipairs(players) do + local name = player:get_player_name() + if not in_bed[name] then + return false + end + end + + return #players > 0 +end + +local function set_physics_override(player, put_to_bed) + local IDENTIFIER = "beds:lie" + local OVERRIDES = {speed = 0, jump = 0, gravity = 0} + + local name = player:get_player_name() + local pdata = beds.player[name] + + if put_to_bed then -- Freeze player + if player_monoids then + for k, v in pairs(OVERRIDES) do + local monoid = player_monoids[k] + pdata["monoid_branch_" .. k] = monoid:get_active_branch(player) + -- Change the "context" of the physics overrides + local branch = monoid:checkout_branch(player, IDENTIFIER) + branch:add_change(player, v) + end + elseif pova then + pova.add_override(name, "force", OVERRIDES) + pova.do_override(player) + else + -- Directly use engine API. May conflict with other mods. + pdata.physics_override = player:get_physics_override() + player:set_physics_override(OVERRIDES) + end + else -- Unfreeze player + if player_monoids then + for k, _ in pairs(OVERRIDES) do + local monoid = player_monoids[k] + monoid:checkout_branch(player, pdata["monoid_branch_" .. k]) + monoid:get_branch(IDENTIFIER):delete(player) + end + elseif pova then + pova.del_override(name, "force") + pova.do_override(player) + else + -- Restore the changed fields + player:set_physics_override({ + speed = pdata.physics_override.speed, + jump = pdata.physics_override.jump, + gravity = pdata.physics_override.gravity + }) + end + end +end + +local function lay_down(player, pos, bed_pos, state, skip) + local name = player:get_player_name() + local hud_flags = player:hud_get_flags() + + if not player or not name then + return + end + + -- stand up + if state ~= nil and not state then + if not beds.player[name] then + -- player not in bed, do nothing + return false + end + beds.bed_position[name] = nil + -- skip here to prevent sending player specific changes (used for leaving players) + if skip then + return + end + player:set_pos(beds.pos[name]) + + -- physics, eye_offset, etc + set_physics_override(player, false) + beds.player[name] = nil + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_look_horizontal(math.random(1, 180) / 100) + player_api.player_attached[name] = false + hud_flags.wielditem = true + player_api.set_animation(player, "stand" , 30) + + -- lay down + else + + -- Check if bed is occupied + for _, other_pos in pairs(beds.bed_position) do + if vector.distance(bed_pos, other_pos) < 0.1 then + minetest.chat_send_player(name, S("This bed is already occupied!")) + return false + end + end + + -- Check if player is moving + if vector.length(player:get_velocity()) > 0.05 then + minetest.chat_send_player(name, S("You have to stop moving before going to bed!")) + return false + end + + -- Check if player is attached to an object + if player:get_attach() then + return false + end + + if beds.player[name] then + -- player already in bed, do nothing + return false + end + + beds.player[name] = {} + beds.pos[name] = pos + beds.bed_position[name] = bed_pos + + local yaw, param2 = get_look_yaw(bed_pos) + player:set_look_horizontal(yaw) + local dir = minetest.facedir_to_dir(param2) + -- p.y is just above the nodebox height of the 'Simple Bed' (the highest bed), + -- to avoid sinking down through the bed. + local p = { + x = bed_pos.x + dir.x / 2, + y = bed_pos.y + 0.07, + z = bed_pos.z + dir.z / 2 + } + set_physics_override(player, true) + player:set_pos(p) + player_api.player_attached[name] = true + hud_flags.wielditem = false + player_api.set_animation(player, "lay" , 0) + end + + player:hud_set_flags(hud_flags) +end + +local function get_player_in_bed_count() + local c = 0 + for _, _ in pairs(beds.player) do + c = c + 1 + end + return c +end + +local function update_formspecs(finished) + local ges = #minetest.get_connected_players() + local player_in_bed = get_player_in_bed_count() + local is_majority = (ges / 2) < player_in_bed + + local form_n + local esc = minetest.formspec_escape + if finished then + form_n = beds.formspec .. "label[2.7,9;" .. esc(S("Good morning.")) .. "]" + else + form_n = beds.formspec .. "label[2.2,9;" .. + esc(S("@1 of @2 players are in bed", player_in_bed, ges)) .. "]" + if is_majority and is_night_skip_enabled() then + form_n = form_n .. "button_exit[2,6;4,0.75;force;" .. + esc(S("Force night skip")) .. "]" + end + end + + for name,_ in pairs(beds.player) do + minetest.show_formspec(name, "beds_form", form_n) + end +end + + +-- Public functions + +function beds.kick_players() + for name, _ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + lay_down(player, nil, nil, false) + end +end + +function beds.skip_night() + minetest.set_timeofday(0.23) +end + +local update_scheduled = false +local function schedule_update() + if update_scheduled then + -- there already is an update scheduled; don't schedule more to prevent races + return + end + update_scheduled = true + minetest.after(2, function() + update_scheduled = false + if not is_sp then + update_formspecs(is_night_skip_enabled()) + end + if is_night_skip_enabled() then + -- skip the night and let all players stand up + beds.skip_night() + beds.kick_players() + end + end) +end + +function beds.on_rightclick(pos, player) + local name = player:get_player_name() + local ppos = player:get_pos() + local tod = minetest.get_timeofday() + + if tod > beds.day_interval.start and tod < beds.day_interval.finish then + if beds.player[name] then + lay_down(player, nil, nil, false) + end + minetest.chat_send_player(name, S("You can only sleep at night.")) + return + end + + -- move to bed + if not beds.player[name] then + lay_down(player, ppos, pos) + beds.set_spawns() -- save respawn positions when entering bed + else + lay_down(player, nil, nil, false) + end + + if not is_sp then + update_formspecs(false) + end + + if check_in_beds() then + schedule_update() + end +end + +function beds.can_dig(bed_pos) + -- Check all players in bed which one is at the expected position + for _, player_bed_pos in pairs(beds.bed_position) do + if vector.equals(bed_pos, player_bed_pos) then + return false + end + end + return true +end + +-- Callbacks +-- Only register respawn callback if respawn enabled +if enable_respawn then + -- Respawn player at bed if valid position is found + spawn.register_on_spawn(function(player, is_new) + local pos = beds.spawn[player:get_player_name()] + if pos then + player:set_pos(pos) + return true + end + end) +end + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + lay_down(player, nil, nil, false, true) + beds.player[name] = nil + if check_in_beds() then + schedule_update() + end +end) + +minetest.register_on_dieplayer(function(player) + local name = player:get_player_name() + local in_bed = beds.player + local pos = player:get_pos() + local yaw = get_look_yaw(pos) + + if in_bed[name] then + lay_down(player, nil, pos, false) + player:set_look_horizontal(yaw) + player:set_pos(pos) + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "beds_form" then + return + end + + -- Because "Force night skip" button is a button_exit, it will set fields.quit + -- and lay_down call will change value of player_in_bed, so it must be taken + -- earlier. + local last_player_in_bed = get_player_in_bed_count() + + if fields.quit or fields.leave then + lay_down(player, nil, nil, false) + update_formspecs(false) + end + + if fields.force then + local is_majority = (#minetest.get_connected_players() / 2) < last_player_in_bed + if is_majority and is_night_skip_enabled() then + update_formspecs(true) + beds.skip_night() + beds.kick_players() + else + update_formspecs(false) + end + end +end) diff --git a/mods/mtg/beds/init.lua b/mods/mtg/beds/init.lua new file mode 100644 index 0000000..14ced8b --- /dev/null +++ b/mods/mtg/beds/init.lua @@ -0,0 +1,31 @@ +-- beds/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("beds") +local esc = minetest.formspec_escape + +beds = {} +beds.player = {} +beds.bed_position = {} +beds.pos = {} +beds.spawn = {} +beds.get_translator = S + +beds.formspec = "size[8,11;true]" .. + "no_prepend[]" .. + "bgcolor[#080808BB;true]" .. + "button_exit[2,10;4,0.75;leave;" .. esc(S("Leave Bed")) .. "]" + +beds.day_interval = { + start = 0.2, + finish = 0.805, +} + +local modpath = minetest.get_modpath("beds") + +-- Load files + +dofile(modpath .. "/functions.lua") +dofile(modpath .. "/api.lua") +dofile(modpath .. "/beds.lua") +dofile(modpath .. "/spawns.lua") diff --git a/mods/mtg/beds/license.txt b/mods/mtg/beds/license.txt new file mode 100644 index 0000000..383047d --- /dev/null +++ b/mods/mtg/beds/license.txt @@ -0,0 +1,61 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2018 TumeniNodes + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/mtg/beds/locale/beds.bg.tr b/mods/mtg/beds/locale/beds.bg.tr new file mode 100644 index 0000000..ac34959 --- /dev/null +++ b/mods/mtg/beds/locale/beds.bg.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Модерно легло +Simple Bed=Обикновено легло +This bed is already occupied!=Това легло вече е заето! +You have to stop moving before going to bed!=За да легнете трябва да спрете да се движите! +Good morning.=Добро утро! +@1 of @2 players are in bed=@1 от @2 играчи са легнали +Force night skip=Прескачане на нощта +You can only sleep at night.=Може да спите само през нощта. +Leave Bed=Ставане от леглото diff --git a/mods/mtg/beds/locale/beds.da.tr b/mods/mtg/beds/locale/beds.da.tr new file mode 100644 index 0000000..22d3890 --- /dev/null +++ b/mods/mtg/beds/locale/beds.da.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Luksuriøs seng +Simple Bed=Simpel seng +This bed is already occupied!=Denne seng er allerede taget! +You have to stop moving before going to bed!=Du skal stoppe med at bevæge dig før du går i seng! +Good morning.=God morgen. +@1 of @2 players are in bed=@1 af @2 spillere er i seng +Force night skip=Tvungen natte-overspring +You can only sleep at night.=Du kan kun sove om natten. +Leave Bed=Stå ud af sengen diff --git a/mods/mtg/beds/locale/beds.de.tr b/mods/mtg/beds/locale/beds.de.tr new file mode 100644 index 0000000..3f2c959 --- /dev/null +++ b/mods/mtg/beds/locale/beds.de.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Schickes Bett +Simple Bed=Schlichtes Bett +This bed is already occupied!=Dieses Bett ist bereits belegt! +You have to stop moving before going to bed!=Sie müssen stehen bleiben, bevor Sie zu Bett gehen können! +Good morning.=Guten Morgen. +@1 of @2 players are in bed=@1 von @2 Spielern sind im Bett +Force night skip=Überspringen der Nacht erzwingen +You can only sleep at night.=Sie können nur nachts schlafen. +Leave Bed=Bett verlassen diff --git a/mods/mtg/beds/locale/beds.eo.tr b/mods/mtg/beds/locale/beds.eo.tr new file mode 100644 index 0000000..3a4ad2f --- /dev/null +++ b/mods/mtg/beds/locale/beds.eo.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Luksa lito +Simple Bed=Simpla lito +This bed is already occupied!=Tiu lito jam estas okupata! +You have to stop moving before going to bed!=Vi ĉesu moviĝi por enlitiĝi! +Good morning.=Bonan matenon. +@1 of @2 players are in bed=@1 el @2 ludantoj estas en lito +Force night skip=Devigi noktan salton +You can only sleep at night.=Vi povas dormi nur nokte. +Leave Bed=Ellitiĝi diff --git a/mods/mtg/beds/locale/beds.es.tr b/mods/mtg/beds/locale/beds.es.tr new file mode 100644 index 0000000..8ef0db7 --- /dev/null +++ b/mods/mtg/beds/locale/beds.es.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Cama de lujo +Simple Bed=Cama sencilla +This bed is already occupied!=Esta cama esta ocupada +You have to stop moving before going to bed!=Deja de moverte o no podras acostarte +Good morning.=Buenos días. +@1 of @2 players are in bed=@1 de @2 jugadores están durmiendo +Force night skip=Forzar hacer de dia +You can only sleep at night.=Sólo puedes dormir por la noche. +Leave Bed=Levantarse diff --git a/mods/mtg/beds/locale/beds.eu.tr b/mods/mtg/beds/locale/beds.eu.tr new file mode 100644 index 0000000..ef0e25e --- /dev/null +++ b/mods/mtg/beds/locale/beds.eu.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Luxuzko ohea +Simple Bed=Ohe arrunta +This bed is already occupied!=Ohe hau okupatuta dago +You have to stop moving before going to bed!=Utzi mugitzeari edo ezingo zara oheratu! +Good morning.=Egun on. +@1 of @2 players are in bed=@2 jokalaritik @1 lo daude +Force night skip=Behartu egunez egitera +You can only sleep at night.=Gauez bakarrik egin dezakezu lo. +Leave Bed=Jaiki diff --git a/mods/mtg/beds/locale/beds.fr.tr b/mods/mtg/beds/locale/beds.fr.tr new file mode 100644 index 0000000..43c06e3 --- /dev/null +++ b/mods/mtg/beds/locale/beds.fr.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Lit chic +Simple Bed=Lit simple +This bed is already occupied!=Ce lit est déjà occupé ! +You have to stop moving before going to bed!=Vous devez arrêter de bouger avant de vous coucher ! +Good morning.=Bonjour. +@1 of @2 players are in bed=@1 joueur(s) sur @2 sont au lit +Force night skip=Forcer le passage de la nuit +You can only sleep at night.=Vous ne pouvez dormir que la nuit. +Leave Bed=Se lever du lit diff --git a/mods/mtg/beds/locale/beds.hu.tr b/mods/mtg/beds/locale/beds.hu.tr new file mode 100644 index 0000000..074a475 --- /dev/null +++ b/mods/mtg/beds/locale/beds.hu.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Szép ágy +Simple Bed=Egyszerű ágy +This bed is already occupied!=Ez az ágy már foglalt! +You have to stop moving before going to bed!=Meg kell állnod, mielőtt lefeküdhetnél! +Good morning.=Jó reggelt. +@1 of @2 players are in bed=@2 játékosból @1 van ágyban +Force night skip=Éjszaka átugrása +You can only sleep at night.=Csak éjszaka aludhatsz. +Leave Bed=Ágy elhagyása diff --git a/mods/mtg/beds/locale/beds.id.tr b/mods/mtg/beds/locale/beds.id.tr new file mode 100644 index 0000000..d87c933 --- /dev/null +++ b/mods/mtg/beds/locale/beds.id.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Ranjang Mewah +Simple Bed=Ranjang Sederhana +This bed is already occupied!=Ranjang telah terisi! +You have to stop moving before going to bed!=Anda harus diam untuk tidur! +Good morning.=Selamat pagi. +@1 of @2 players are in bed=@1 dari @2 pemain sedang tidur +Force night skip=Paksa lewati malam +You can only sleep at night.=Anda hanya bisa tidur pada waktu malam. +Leave Bed=Tinggalkan Ranjang diff --git a/mods/mtg/beds/locale/beds.it.tr b/mods/mtg/beds/locale/beds.it.tr new file mode 100644 index 0000000..8f4e14e --- /dev/null +++ b/mods/mtg/beds/locale/beds.it.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Letto decorato +Simple Bed=Letto semplice +This bed is already occupied!= +You have to stop moving before going to bed!= +Good morning.= +@1 of @2 players are in bed= +Force night skip= +You can only sleep at night.= +Leave Bed=Alzati dal letto diff --git a/mods/mtg/beds/locale/beds.ja.tr b/mods/mtg/beds/locale/beds.ja.tr new file mode 100644 index 0000000..5034456 --- /dev/null +++ b/mods/mtg/beds/locale/beds.ja.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=ファンシーなベッド +Simple Bed=シンプルなベッド +This bed is already occupied!=ベッドはすでに使われています! +You have to stop moving before going to bed!=寝るときは動かないでください! +Good morning.=おはようございます。 +@1 of @2 players are in bed=ベッドに@1 / @2人います +Force night skip=強制的に夜をスキップします +You can only sleep at night.=夜しか寝れません。 +Leave Bed=ベッドから出ます diff --git a/mods/mtg/beds/locale/beds.jbo.tr b/mods/mtg/beds/locale/beds.jbo.tr new file mode 100644 index 0000000..a72f686 --- /dev/null +++ b/mods/mtg/beds/locale/beds.jbo.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=lo selja'i ckana +Simple Bed=lo sampu ckana +This bed is already occupied!=.i lo ti ckana cu canlu +You have to stop moving before going to bed!=lo nu do cando cu sarcu lo nu do sipna +Good morning.=.i .uise'inai cerni +@1 of @2 players are in bed=.i @1 cmima be lu'i @2 le pilno cu vreta lo ckana +Force night skip=bapli le nu co'u nicte +You can only sleep at night.=.i steci le ka nicte kei fa le ka do kakne le ka sipna ca pa ckaji be ce'u +Leave Bed=cliva lo ckana diff --git a/mods/mtg/beds/locale/beds.lv.tr b/mods/mtg/beds/locale/beds.lv.tr new file mode 100644 index 0000000..cea63ff --- /dev/null +++ b/mods/mtg/beds/locale/beds.lv.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Skaista gulta +Simple Bed=Gulta +This bed is already occupied!=Šī gulta jau ir aizņemta! +You have to stop moving before going to bed!=Jums jāapstājas lai gulētu! +Good morning.=Labrīt. +@1 of @2 players are in bed=@1 no @2 spēlētājiem guļ gultās +Force night skip=Izlaist nakti +You can only sleep at night.=Jūs variet gulēt tikai naktī. +Leave Bed=Celties no gultas diff --git a/mods/mtg/beds/locale/beds.ms.tr b/mods/mtg/beds/locale/beds.ms.tr new file mode 100644 index 0000000..b197b63 --- /dev/null +++ b/mods/mtg/beds/locale/beds.ms.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Katil Beragam +Simple Bed=Katil Biasa +This bed is already occupied!=Katil ini sudah diduduki! +You have to stop moving before going to bed!=Anda perlu berhenti bergerak sebelum tidur! +Good morning.=Selamat pagi. +@1 of @2 players are in bed=@1 daripada @2 pemain sedang tidur +Force night skip=Paksa langkau malam +You can only sleep at night.=Anda hanya boleh tidur pada waktu malam. +Leave Bed=Tinggalkan Katil diff --git a/mods/mtg/beds/locale/beds.pl.tr b/mods/mtg/beds/locale/beds.pl.tr new file mode 100644 index 0000000..2bc03c6 --- /dev/null +++ b/mods/mtg/beds/locale/beds.pl.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Fantazyjne łóżko +Simple Bed=Proste łóżko +This bed is already occupied!=To łóżko jest już zajęte! +You have to stop moving before going to bed!=Musisz się zatrzymać aby wejść do łóżka +Good morning.=Dzień dobry. +@1 of @2 players are in bed=@1 z @2 graczy śpią +Force night skip=Wymuś pominięcie nocy +You can only sleep at night.=Możesz spać tylko w nocy. +Leave Bed=Opuść łóżko diff --git a/mods/mtg/beds/locale/beds.pt_BR.tr b/mods/mtg/beds/locale/beds.pt_BR.tr new file mode 100644 index 0000000..47fb1b9 --- /dev/null +++ b/mods/mtg/beds/locale/beds.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Cama Bonita +Simple Bed=Cama Simples +This bed is already occupied!=Esta cama já está ocupada! +You have to stop moving before going to bed!=Você precisa parar de se mover antes de ir para cama! +Good morning.=Bom dia. +@1 of @2 players are in bed=@1 de @2 jogadores estão na cama +Force night skip=Forçar o amanhecer +You can only sleep at night.=Você só pode dormir à noite +Leave Bed=Sair da Cama diff --git a/mods/mtg/beds/locale/beds.ru.tr b/mods/mtg/beds/locale/beds.ru.tr new file mode 100644 index 0000000..7c1b536 --- /dev/null +++ b/mods/mtg/beds/locale/beds.ru.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Красивая кровать +Simple Bed=Простая кровать +This bed is already occupied!=Эта кровать уже занята! +You have to stop moving before going to bed!=Вам нужно перестать двигаться чтобы лечь! +Good morning.=Доброе утро. +@1 of @2 players are in bed=@1 из @2 игроков в кровати +Force night skip=Пропустить ночь +You can only sleep at night.=Вы можете спать только ночью. +Leave Bed=Встать с кровати diff --git a/mods/mtg/beds/locale/beds.sk.tr b/mods/mtg/beds/locale/beds.sk.tr new file mode 100644 index 0000000..5f31f0f --- /dev/null +++ b/mods/mtg/beds/locale/beds.sk.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Pekná posteľ +Simple Bed=Jednoduchá posteľ +This bed is already occupied!=Táto posteľ je už obsadená +You have to stop moving before going to bed!=Predtým ako si ľahneš do postele, sa musíš prestať pohybovať! +Good morning.=Dobré ráno. +@1 of @2 players are in bed=@1 z @2 hráčov sú v posteli +Force night skip=Nútene preskočiť noc +You can only sleep at night.=Môžeš spať len v noci. +Leave Bed=Opusti posteľ diff --git a/mods/mtg/beds/locale/beds.sv.tr b/mods/mtg/beds/locale/beds.sv.tr new file mode 100644 index 0000000..3b737b4 --- /dev/null +++ b/mods/mtg/beds/locale/beds.sv.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Fin säng +Simple Bed=Enkel säng +This bed is already occupied!=Den här sängen används redan! +You have to stop moving before going to bed!=Du måste stanna innan du kan lägga dig! +Good morning.=God morgon. +@1 of @2 players are in bed=@1 av @2 spelare försöker sova. +Force night skip=Tvinga att hoppa över natt +You can only sleep at night.=Du kan bara sova på natten. +Leave Bed=Lämna säng diff --git a/mods/mtg/beds/locale/beds.uk.tr b/mods/mtg/beds/locale/beds.uk.tr new file mode 100644 index 0000000..c9db693 --- /dev/null +++ b/mods/mtg/beds/locale/beds.uk.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Гарне ліжко +Simple Bed=Просте ліжко +This bed is already occupied!=Це ліжко вже зайняте! +You have to stop moving before going to bed!=Зупиніться перед тим як лягти! +Good morning.=Доброго ранку. +@1 of @2 players are in bed=@1 з @2 гравців(-я) у ліжку +Force night skip=Пропустити ніч +You can only sleep at night.=Ви можете спати лише вночі. +Leave Bed=Встати з ліжка diff --git a/mods/mtg/beds/locale/beds.zh_CN.tr b/mods/mtg/beds/locale/beds.zh_CN.tr new file mode 100644 index 0000000..7e6cfc7 --- /dev/null +++ b/mods/mtg/beds/locale/beds.zh_CN.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=花式床 +Simple Bed=简易床 +This bed is already occupied!=床上已有人! +You have to stop moving before going to bed!=上床前要停止移动! +Good morning.=早安! +@1 of @2 players are in bed=@2位玩家中的@1位在床上 +Force night skip=强制跳过夜晚 +You can only sleep at night.=你只能在晚上睡觉。 +Leave Bed=离开床 diff --git a/mods/mtg/beds/locale/beds.zh_TW.tr b/mods/mtg/beds/locale/beds.zh_TW.tr new file mode 100644 index 0000000..a0428b4 --- /dev/null +++ b/mods/mtg/beds/locale/beds.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=花式床 +Simple Bed=簡易床 +This bed is already occupied!=這個床已經被占據了! +You have to stop moving before going to bed!=你必須在上床前停止移動! +Good morning.=早安! +@1 of @2 players are in bed=@2位玩家中的@1位在床上 +Force night skip=強制跳過夜晚 +You can only sleep at night.=你只能在晚上睡覺。 +Leave Bed=離開床 diff --git a/mods/mtg/beds/locale/template.txt b/mods/mtg/beds/locale/template.txt new file mode 100644 index 0000000..a965787 --- /dev/null +++ b/mods/mtg/beds/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed= +Simple Bed= +This bed is already occupied!= +You have to stop moving before going to bed!= +Good morning.= +@1 of @2 players are in bed= +Force night skip= +You can only sleep at night.= +Leave Bed= diff --git a/mods/mtg/beds/mod.conf b/mods/mtg/beds/mod.conf new file mode 100644 index 0000000..9113230 --- /dev/null +++ b/mods/mtg/beds/mod.conf @@ -0,0 +1,4 @@ +name = beds +description = Minetest Game mod: beds +depends = default, wool, spawn +optional_depends = player_monoids, pova diff --git a/mods/mtg/beds/spawns.lua b/mods/mtg/beds/spawns.lua new file mode 100644 index 0000000..1a2ce81 --- /dev/null +++ b/mods/mtg/beds/spawns.lua @@ -0,0 +1,72 @@ +local world_path = minetest.get_worldpath() +local org_file = world_path .. "/beds_spawns" +local file = world_path .. "/beds_spawns" +local bkwd = false + +-- check for PA's beds mod spawns +local cf = io.open(world_path .. "/beds_player_spawns", "r") +if cf ~= nil then + io.close(cf) + file = world_path .. "/beds_player_spawns" + bkwd = true +end + +function beds.read_spawns() + local spawns = beds.spawn + local input = io.open(file, "r") + if input and not bkwd then + repeat + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + spawns[name:sub(2)] = {x = x, y = y, z = z} + until input:read(0) == nil + io.close(input) + elseif input and bkwd then + beds.spawn = minetest.deserialize(input:read("*all")) + input:close() + beds.save_spawns() + os.rename(file, file .. ".backup") + file = org_file + end +end + +beds.read_spawns() + +function beds.save_spawns() + if not beds.spawn then + return + end + local data = {} + local output = io.open(org_file, "w") + for k, v in pairs(beds.spawn) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, k)) + end + output:write(table.concat(data)) + io.close(output) +end + +function beds.set_spawns() + for name,_ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + local p = player:get_pos() + -- but don't change spawn location if borrowing a bed + if not minetest.is_protected(p, name) then + beds.spawn[name] = p + end + end + beds.save_spawns() +end + +function beds.remove_spawns_at(pos) + for name, p in pairs(beds.spawn) do + if vector.equals(vector.round(p), pos) then + beds.spawn[name] = nil + end + end + beds.save_spawns() +end diff --git a/mods/mtg/beds/textures/beds_bed.png b/mods/mtg/beds/textures/beds_bed.png new file mode 100644 index 0000000..d4b02e7 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed.png differ diff --git a/mods/mtg/beds/textures/beds_bed_fancy.png b/mods/mtg/beds/textures/beds_bed_fancy.png new file mode 100644 index 0000000..1c9fde9 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_fancy.png differ diff --git a/mods/mtg/beds/textures/beds_bed_foot.png b/mods/mtg/beds/textures/beds_bed_foot.png new file mode 100644 index 0000000..af510bb Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_foot.png differ diff --git a/mods/mtg/beds/textures/beds_bed_head.png b/mods/mtg/beds/textures/beds_bed_head.png new file mode 100644 index 0000000..b98b110 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_head.png differ diff --git a/mods/mtg/beds/textures/beds_bed_side1.png b/mods/mtg/beds/textures/beds_bed_side1.png new file mode 100644 index 0000000..8ded54f Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_side1.png differ diff --git a/mods/mtg/beds/textures/beds_bed_side2.png b/mods/mtg/beds/textures/beds_bed_side2.png new file mode 100644 index 0000000..a6bdb99 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_side2.png differ diff --git a/mods/mtg/beds/textures/beds_bed_side_bottom.png b/mods/mtg/beds/textures/beds_bed_side_bottom.png new file mode 100644 index 0000000..ed80f75 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_side_bottom.png differ diff --git a/mods/mtg/beds/textures/beds_bed_side_bottom_r.png b/mods/mtg/beds/textures/beds_bed_side_bottom_r.png new file mode 100644 index 0000000..2d86532 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_side_bottom_r.png differ diff --git a/mods/mtg/beds/textures/beds_bed_side_top.png b/mods/mtg/beds/textures/beds_bed_side_top.png new file mode 100644 index 0000000..04b2ba1 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_side_top.png differ diff --git a/mods/mtg/beds/textures/beds_bed_side_top_r.png b/mods/mtg/beds/textures/beds_bed_side_top_r.png new file mode 100644 index 0000000..c3c07b1 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_side_top_r.png differ diff --git a/mods/mtg/beds/textures/beds_bed_top1.png b/mods/mtg/beds/textures/beds_bed_top1.png new file mode 100644 index 0000000..2b3ae8d Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_top1.png differ diff --git a/mods/mtg/beds/textures/beds_bed_top2.png b/mods/mtg/beds/textures/beds_bed_top2.png new file mode 100644 index 0000000..b80353c Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_top2.png differ diff --git a/mods/mtg/beds/textures/beds_bed_top_bottom.png b/mods/mtg/beds/textures/beds_bed_top_bottom.png new file mode 100644 index 0000000..43dcc64 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_top_bottom.png differ diff --git a/mods/mtg/beds/textures/beds_bed_top_top.png b/mods/mtg/beds/textures/beds_bed_top_top.png new file mode 100644 index 0000000..9b3d08f Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_top_top.png differ diff --git a/mods/mtg/beds/textures/beds_bed_under.png b/mods/mtg/beds/textures/beds_bed_under.png new file mode 100644 index 0000000..1a67367 Binary files /dev/null and b/mods/mtg/beds/textures/beds_bed_under.png differ diff --git a/mods/mtg/doors/README.txt b/mods/mtg/doors/README.txt new file mode 100644 index 0000000..b1ad3b5 --- /dev/null +++ b/mods/mtg/doors/README.txt @@ -0,0 +1,87 @@ +Minetest Game mod: doors +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) + +Modified by BlockMen (MIT): Added sounds, glass doors (glass, obsidian glass) and trapdoor. + +Modified by sofar (sofar@foo-projects.org) (MIT): +Added Steel trapdoor. +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. + +Various Minetest Game developers and contributors (MIT) + + +Authors of media (textures) +--------------------------- +Following 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 + +Following textures created by BlockMen (CC BY-SA 3.0): + door_trapdoor.png + door_obsidian_glass_side.png + +Following textures created by celeron55 (CC BY-SA 3.0): + door_glass_a.png + door_glass_b.png + +Following textures created by PenguinDad (CC BY-SA 4.0): + door_glass.png + door_obsidian_glass.png + +Following textures created by sofar (CC-BY-SA-3.0): + doors_trapdoor_steel.png + +Following textures created by paramat (CC-BY-SA-3.0): + door_trapdoor_side.png + doors_trapdoor_steel_side.png + +Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): + door_obsidian_glass.png + +Glass door textures by Krock and paramat based on textures by VanessaE (CC BY-SA 3.0): + doors_door_glass.png + doors_item_glass.png + +All other textures (created by PilzAdam) (CC BY-SA 3.0): + +Door textures were converted to the new texture map by sofar, paramat and +red-001, under the same license as the originals. + + +Authors of media (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 + + +Authors of media (sounds) +------------------------- +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 1.0) +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 +doors_glass_door_open.ogg, doors_glass_door_close.ogg: + https://www.freesound.org/people/SkeetMasterFunk69/sounds/235546/ (CC0 1.0) diff --git a/mods/mtg/doors/init.lua b/mods/mtg/doors/init.lua new file mode 100644 index 0000000..d198f1e --- /dev/null +++ b/mods/mtg/doors/init.lua @@ -0,0 +1,937 @@ +-- doors/init.lua + +-- our API object +doors = {} + +doors.registered_doors = {} +doors.registered_trapdoors = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("doors") + + +local function replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("doors_owner") + if owner and owner ~= "" then + meta:set_string("owner", owner) + meta:set_string("doors_owner", "") + end +end + +local function is_doors_upper_node(pos) + return minetest.get_node(pos).name == "doors:hidden" +end + +-- returns an object to a door object or nil +function doors.get(pos) + local node_name = minetest.get_node(pos).name + if doors.registered_doors[node_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, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return doors.door_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return doors.door_toggle(self.pos, nil, player) + end, + state = function(self) + local state = minetest.get_meta(self.pos):get_int("state") + return state %2 == 1 + end + } + elseif doors.registered_trapdoors[node_name] then + -- A trapdoor + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return doors.trapdoor_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return doors.trapdoor_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return doors.trapdoor_toggle(self.pos, nil, player) + end, + state = function(self) + return minetest.get_node(self.pos).name:sub(-5) == "_open" + end + } + else + return nil + end +end + +-- 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 = S("Hidden Door Segment"), + inventory_image = "doors_hidden_segment.png^default_invisible_node_overlay.png", + wield_image = "doors_hidden_segment.png^default_invisible_node_overlay.png", + drawtype = "airlike", + 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, + -- 1px block inside door hinge near node top + 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 = "_c", param2 = 1}, + {v = "_c", param2 = 2}, + {v = "_c", param2 = 3}, + {v = "_c", param2 = 0}, + }, + { + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, + }, + { + {v = "_d", param2 = 3}, + {v = "_d", param2 = 0}, + {v = "_d", param2 = 1}, + {v = "_d", param2 = 2}, + }, +} + +function doors.door_toggle(pos, node, clicker) + local meta = minetest.get_meta(pos) + node = node or minetest.get_node(pos) + local def = minetest.registered_nodes[node.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 node.name:sub(-2) == "_b" then + state = 2 + else + state = 0 + end + else + state = tonumber(state) + end + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + -- until Lua-5.2 we have no bitwise operators :( + if state % 2 == 1 then + state = state - 1 + else + state = state + 1 + end + + local dir = node.param2 + + -- It's possible param2 is messed up, so, validate before using + -- the input data. This indicates something may have rotated + -- the door, even though that is not supported. + if not transform[state + 1] or not transform[state + 1][dir + 1] then + return false + end + + if state % 2 == 0 then + minetest.sound_play(def.door.sounds[1], + {pos = pos, gain = def.door.gains[1], max_hear_distance = 10}, true) + else + minetest.sound_play(def.door.sounds[2], + {pos = pos, gain = def.door.gains[2], max_hear_distance = 10}, true) + 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 + for _, callback in ipairs(minetest.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 + +local function can_dig_door(pos, digger) + replace_old_owner_information(pos) + return default.can_interact_with_node(digger, pos) +end + +function doors.register(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + -- replace old doors of this type automatically + minetest.register_lbm({ + name = ":doors:replace_" .. name:gsub(":", "_"), + nodenames = {name.."_b_1", name.."_b_2"}, + action = function(pos, node) + 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, + groups = table.copy(def.groups), + + on_place = function(itemstack, placer, pointed_thing) + local pos + + if pointed_thing.type ~= "node" then + return itemstack + end + + local doorname = itemstack:get_name() + local node = minetest.get_node(pointed_thing.under) + local pdef = minetest.registered_nodes[node.name] + if pdef and pdef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return pdef.on_rightclick(pointed_thing.under, + node, placer, itemstack, pointed_thing) + end + + if pdef and pdef.buildable_to then + pos = pointed_thing.under + else + 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 + + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local top_node = minetest.get_node_or_nil(above) + local topdef = top_node and minetest.registered_nodes[top_node.name] + + if not topdef or not topdef.buildable_to then + return itemstack + end + + local pn = placer and placer:get_player_name() or "" + if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then + return itemstack + end + + local dir = placer and minetest.dir_to_facedir(placer:get_look_dir()) or 0 + + 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 = doorname .. "_b", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = (dir + 3) % 4}) + else + minetest.set_node(pos, {name = doorname .. "_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 + meta:set_string("owner", pn) + meta:set_string("infotext", def.description .. "\n" .. S("Owned by @1", pn)) + end + + if not minetest.is_creative_enabled(pn) then + itemstack:take_item() + end + + minetest.sound_play(def.sounds.place, {pos = pos}, true) + + on_place_node(pos, minetest.get_node(pos), + placer, node, itemstack, pointed_thing) + + return itemstack + end + }) + def.inventory_image = nil + + if def.recipe then + minetest.register_craft({ + output = name, + recipe = def.recipe, + }) + end + def.recipe = nil + + 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 + + if not def.gain_open then + def.gain_open = 0.3 + end + + if not def.gain_close then + def.gain_close = 0.3 + 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}, + gains = {def.gain_close, def.gain_open}, + } + if not def.on_rightclick then + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + doors.door_toggle(pos, node, clicker) + return itemstack + end + end + def.after_dig_node = function(pos, node, meta, digger) + local above = pos:offset(0, 1, 0) + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + minetest.check_for_falling(above) + end + def.on_rotate = function(pos, node, user, mode, new_param2) + return false + end + + if def.protected then + def.can_dig = can_dig_door + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, S("You do not own this locked door.")) + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked door"), owner + end + def.node_dig_prediction = "" + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + local above = pos:offset(0, 1, 0) + -- hidden node doesn't get blasted away. + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + return {name} + end + end + + def.on_destruct = function(pos) + local above = pos:offset(0, 1, 0) + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + end + + def.drawtype = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.sunlight_propagates = true + def.walkable = true + def.is_ground_content = false + def.buildable_to = false + def.selection_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.collision_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.use_texture_alpha = def.use_texture_alpha or "clip" + + def.mesh = "door_a.b3d" + minetest.register_node(":" .. name .. "_a", table.copy(def)) + + def.mesh = "door_b.b3d" + minetest.register_node(":" .. name .. "_b", table.copy(def)) + + def.mesh = "door_b.b3d" + minetest.register_node(":" .. name .. "_c", table.copy(def)) + + def.mesh = "door_a.b3d" + minetest.register_node(":" .. name .. "_d", table.copy(def)) + + doors.registered_doors[name .. "_a"] = true + doors.registered_doors[name .. "_b"] = true + doors.registered_doors[name .. "_c"] = true + doors.registered_doors[name .. "_d"] = true +end + +doors.register("door_wood", { + tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, + description = S("Wooden Door"), + inventory_image = "doors_item_wood.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + 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 = S("Steel Door"), + inventory_image = "doors_item_steel.png", + protected = true, + groups = {node = 1, cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + gain_open = 0.2, + gain_close = 0.2, + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + } +}) + +doors.register("door_glass", { + tiles = {"doors_door_glass.png"}, + description = S("Glass Door"), + inventory_image = "doors_item_glass.png", + groups = {node = 1, cracky=3, oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + gain_open = 0.3, + gain_close = 0.25, + recipe = { + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + } +}) + +doors.register("door_obsidian_glass", { + tiles = {"doors_door_obsidian_glass.png"}, + description = S("Obsidian Glass Door"), + inventory_image = "doors_item_obsidian_glass.png", + groups = {node = 1, cracky=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + gain_open = 0.3, + gain_close = 0.25, + recipe = { + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default: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) + 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, node, clicker) + node = node or minetest.get_node(pos) + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + local def = minetest.registered_nodes[node.name] + + if string.sub(node.name, -5) == "_open" then + minetest.sound_play(def.sound_close, + {pos = pos, gain = def.gain_close, max_hear_distance = 10}, true) + 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 = def.gain_open, max_hear_distance = 10}, true) + minetest.swap_node(pos, {name = node.name .. "_open", + param1 = node.param1, param2 = node.param2}) + end +end + +function doors.register_trapdoor(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + local name_closed = name + local name_opened = name.."_open" + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + doors.trapdoor_toggle(pos, node, clicker) + return itemstack + end + + -- Common trapdoor configuration + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.is_ground_content = false + def.use_texture_alpha = def.use_texture_alpha or "clip" + + if def.protected then + def.can_dig = can_dig_door + def.after_place_node = function(pos, placer, itemstack, pointed_thing) + local pn = placer:get_player_name() + local meta = minetest.get_meta(pos) + meta:set_string("owner", pn) + meta:set_string("infotext", def.description .. "\n" .. S("Owned by @1", pn)) + + return minetest.is_creative_enabled(pn) + end + + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, S("You do not own this trapdoor.")) + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked trapdoor"), owner + end + def.node_dig_prediction = "" + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + 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 + + if not def.gain_open then + def.gain_open = 0.3 + end + + if not def.gain_close then + def.gain_close = 0.3 + end + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + if def.nodebox_closed and def.nodebox_opened then + def_closed.node_box = def.nodebox_closed + else + def_closed.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + end + def_closed.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + def_closed.tiles = { + def.tile_front, + def.tile_front .. '^[transformFY', + def.tile_side, + def.tile_side, + def.tile_side, + def.tile_side + } + + if def.nodebox_opened and def.nodebox_closed then + def_opened.node_box = def.nodebox_opened + else + def_opened.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + end + def_opened.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + def_opened.tiles = { + def.tile_side, + def.tile_side .. '^[transform2', + def.tile_side .. '^[transform3', + def.tile_side .. '^[transform1', + def.tile_front .. '^[transform46', + def.tile_front .. '^[transform6' + } + + def_opened.drop = name_closed + def_opened.groups.not_in_creative_inventory = 1 + + 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 = S("Wooden Trapdoor"), + inventory_image = "doors_trapdoor.png", + wield_image = "doors_trapdoor.png", + tile_front = "doors_trapdoor.png", + tile_side = "doors_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + +doors.register_trapdoor("doors:trapdoor_steel", { + description = S("Steel Trapdoor"), + inventory_image = "doors_trapdoor_steel.png", + wield_image = "doors_trapdoor_steel.png", + tile_front = "doors_trapdoor_steel.png", + tile_side = "doors_trapdoor_steel_side.png", + protected = true, + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + gain_open = 0.2, + gain_close = 0.2, + groups = {cracky = 1, level = 2, door = 1}, +}) + +minetest.register_craft({ + output = "doors:trapdoor 2", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + {"", "", ""}, + } +}) + +minetest.register_craft({ + output = "doors:trapdoor_steel", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + } +}) + + +----fence gate---- +local fence_collision_extra = minetest.settings:get_bool("enable_fence_tall") and 3/8 or 0 + +function doors.register_fencegate(name, def) + local fence = { + description = def.description, + drawtype = "mesh", + tiles = {}, + 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, node, clicker, itemstack, pointed_thing) + local node_def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, {name = node_def._gate, param2 = node.param2}) + minetest.sound_play(node_def._gate_sound, {pos = pos, gain = 0.15, + max_hear_distance = 8}, true) + return itemstack + end, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4} + }, + } + + + if type(def.texture) == "string" then + fence.tiles[1] = {name = def.texture, backface_culling = true} + elseif def.texture.backface_culling == nil then + fence.tiles[1] = table.copy(def.texture) + fence.tiles[1].backface_culling = true + else + fence.tiles[1] = def.texture + end + + 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._gate_sound = "doors_fencegate_open" + fence_closed.collision_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/8, 1/2, 1/2 + fence_collision_extra, 1/8} + } + + local fence_open = table.copy(fence) + fence_open.mesh = "doors_fencegate_open.obj" + fence_open._gate = name .. "_closed" + fence_open._gate_sound = "doors_fencegate_close" + fence_open.groups.not_in_creative_inventory = 1 + fence_open.collision_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/8, -3/8, 1/2 + fence_collision_extra, 1/8}, + {-1/2, -3/8, -1/2, -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 = { + {"group:stick", def.material, "group:stick"}, + {"group:stick", def.material, "group:stick"} + } + }) +end + +doors.register_fencegate("doors:gate_wood", { + description = S("Apple Wood 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 = S("Acacia Wood 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 = S("Jungle Wood 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 = S("Pine Wood Fence Gate"), + texture = "default_pine_wood.png", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + +doors.register_fencegate("doors:gate_aspen_wood", { + description = S("Aspen Wood Fence Gate"), + texture = "default_aspen_wood.png", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + + +----fuels---- + +minetest.register_craft({ + type = "fuel", + recipe = "doors:trapdoor", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:door_wood", + burntime = 14, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_wood_closed", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_acacia_wood_closed", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_junglewood_closed", + burntime = 9, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_pine_wood_closed", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_aspen_wood_closed", + burntime = 5, +}) diff --git a/mods/mtg/doors/license.txt b/mods/mtg/doors/license.txt new file mode 100644 index 0000000..97e60c2 --- /dev/null +++ b/mods/mtg/doors/license.txt @@ -0,0 +1,164 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar (sofar@foo-projects.org) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011-2016 Fernando Zapata +Copyright (C) 2014-2016 celeron55 +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar +Copyright (C) 2016 red-001 +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2014-2016 PenguinDad + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/4.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2014 CGEffex +Copyright (C) 2014 bennstir +Copyright (C) 2016 BarkersPinhead +Copyright (C) 2016 rivernile7 +Copyright (C) 2016 HazMatt + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +mhtaylor67 +SkeetMasterFunk69 + +No Copyright + +The person who associated a work with this deed has dedicated the work to the public +domain by waiving all of his or her rights to the work worldwide under copyright law, +including all related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all +without asking permission. See Other Information below. + +Other Information + +In no way are the patent or trademark rights of any person affected by CC0, nor are the +rights that other persons may have in the work or in how the work is used, such as +publicity or privacy rights. +Unless expressly stated otherwise, the person who associated a work with this deed makes +no warranties about the work, and disclaims liability for all uses of the work, to the +fullest extent permitted by applicable law. +When using or citing the work, you should not imply endorsement by the author or the +affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/mtg/doors/locale/doors.bg.tr b/mods/mtg/doors/locale/doors.bg.tr new file mode 100644 index 0000000..a799e47 --- /dev/null +++ b/mods/mtg/doors/locale/doors.bg.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Част от скрита врата +Owned by @1=Собственик е @1 +You do not own this locked door.=Не притежавате тази заключена врата. +a locked door=заключена врата +Wooden Door=Дървена врата +Steel Door=Стоманена врата +Glass Door=Стъклена врата +Obsidian Glass Door=Врата от обсидианово стъкло +You do not own this trapdoor.=Не притежавате този капак. +a locked trapdoor=заключен капак +Wooden Trapdoor=Дървен капак +Steel Trapdoor=Стоманен капак +Apple Wood Fence Gate=Врата за ограда от ябълково дърво +Acacia Wood Fence Gate=Врата за ограда от акациево дърво +Jungle Wood Fence Gate=Врата за ограда от джунглово дърво +Pine Wood Fence Gate=Врата за ограда от борово дърво +Aspen Wood Fence Gate=Врата за ограда от трепетликово дърво diff --git a/mods/mtg/doors/locale/doors.da.tr b/mods/mtg/doors/locale/doors.da.tr new file mode 100644 index 0000000..03d6770 --- /dev/null +++ b/mods/mtg/doors/locale/doors.da.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Gemt dørområde +Owned by @1=Ejet af @1 +You do not own this locked door.=Du ejer ikke denne låste dør. +a locked door=en låst dør +Wooden Door=Trædør +Steel Door=Ståldør +Glass Door=Glasdør +Obsidian Glass Door=Obsidianglasdør +You do not own this trapdoor.=Du ejer ikke denne lem. +a locked trapdoor=en låst lem +Wooden Trapdoor=Trålem +Steel Trapdoor=Stållem +Apple Wood Fence Gate=Æbletræshegnsport +Acacia Wood Fence Gate=Arkacietræshegnsport +Jungle Wood Fence Gate=Jungletræshegnsport +Pine Wood Fence Gate=Fyretræshegnsport +Aspen Wood Fence Gate=Aspetræshegnsport diff --git a/mods/mtg/doors/locale/doors.de.tr b/mods/mtg/doors/locale/doors.de.tr new file mode 100644 index 0000000..79707ce --- /dev/null +++ b/mods/mtg/doors/locale/doors.de.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Verborgenes Türsegment +Owned by @1=Eigentum von @1 +You do not own this locked door.=Diese abgeschlossene Tür gehört Ihnen nicht. +a locked door=eine abgeschlossene Tür +Wooden Door=Holztür +Steel Door=Stahltür +Glass Door=Glastür +Obsidian Glass Door=Obsidianglastür +You do not own this trapdoor.=Diese Falltür gehört Ihnen nicht. +a locked trapdoor=eine abgeschlossene Falltür +Wooden Trapdoor=Holzfalltür +Steel Trapdoor=Stahlfalltür +Apple Wood Fence Gate=Apfelholzzauntor +Acacia Wood Fence Gate=Akazienholzzauntor +Jungle Wood Fence Gate=Dschungelholzzauntor +Pine Wood Fence Gate=Kiefernholzzauntor +Aspen Wood Fence Gate=Espenholzzauntor diff --git a/mods/mtg/doors/locale/doors.eo.tr b/mods/mtg/doors/locale/doors.eo.tr new file mode 100644 index 0000000..e8e10dd --- /dev/null +++ b/mods/mtg/doors/locale/doors.eo.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Kaŝita porda segmento +Owned by @1=Posedita de @1 +You do not own this locked door.=Vi ne posedas ĉi tiun ŝlositan pordon. +a locked door=ŝlosita pordo +Wooden Door=Ligna pordo +Steel Door=Ŝtala pordo +Glass Door=Vitra pordo +Obsidian Glass Door=Obsidiana vitra pordo +You do not own this trapdoor.=Vi ne posedas ĉi tiun plankpordon. +a locked trapdoor=ŝlosita plankpordo +Wooden Trapdoor=Ligna plankpordo +Steel Trapdoor=Ŝtala plankpordo +Apple Wood Fence Gate=Poma ligna barila pordo +Acacia Wood Fence Gate=Akacia ligna barila pordo +Jungle Wood Fence Gate=Ĝangala ligna barila pordo +Pine Wood Fence Gate=Pina ligna barila pordo +Aspen Wood Fence Gate=Tremola ligna barila pordo diff --git a/mods/mtg/doors/locale/doors.es.tr b/mods/mtg/doors/locale/doors.es.tr new file mode 100644 index 0000000..677f2df --- /dev/null +++ b/mods/mtg/doors/locale/doors.es.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento de puerta oculta +Owned by @1=Propiedad de @1 +You do not own this locked door.=Esta puerta cerrada no te pertenece. +a locked door=una puerta cerrada +Wooden Door=Puerta de madera +Steel Door=Puerta de acero +Glass Door=Puerta de vidrio +Obsidian Glass Door=Puerta de vidrio de obsidiana +You do not own this trapdoor.=Esta trampilla no te pertenece. +a locked trapdoor=una trampilla cerrada +Wooden Trapdoor=Trampilla de madera +Steel Trapdoor=Trampilla de acero +Apple Wood Fence Gate=Puerta de cerca de manzano +Acacia Wood Fence Gate=Puerta de cerca de acacia +Jungle Wood Fence Gate=Puerta de cerca de madera tropical +Pine Wood Fence Gate=Puerta de cerca de pino +Aspen Wood Fence Gate=Puerta de cerca de álamo diff --git a/mods/mtg/doors/locale/doors.eu.tr b/mods/mtg/doors/locale/doors.eu.tr new file mode 100644 index 0000000..1c6eaf4 --- /dev/null +++ b/mods/mtg/doors/locale/doors.eu.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Ezkutuko atearen segmentua +Owned by @1=Jabea: @1 +You do not own this locked door.=Ate itxi hau ez da zurea. +a locked door=ate itxi bat +Wooden Door=Zurezko atea +Steel Door=Altzairuzko atea +Glass Door=Beirazko atea +Obsidian Glass Door=Obsidianazko beirazko atea +You do not own this trapdoor.=Tranpola hau ez da zurea. +a locked trapdoor=Tranpola itxi bat +Wooden Trapdoor=Zurezko tranpola +Steel Trapdoor=Altzairuzko tranpola +Apple Wood Fence Gate=Sagarrondo-inguruko atea +Acacia Wood Fence Gate=Akaziatik hurbil dagoen atea +Jungle Wood Fence Gate=Zur tropikaleko ate hurbila +Pine Wood Fence Gate=Pinu inguruko atea +Aspen Wood Fence Gate=Makalaren inguruko atea diff --git a/mods/mtg/doors/locale/doors.fr.tr b/mods/mtg/doors/locale/doors.fr.tr new file mode 100644 index 0000000..930f75c --- /dev/null +++ b/mods/mtg/doors/locale/doors.fr.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segment de porte cachée +Owned by @1=Possédée par @1 +You do not own this locked door.=Cette porte vérouillée ne vous appartient pas. +a locked door=une porte verouillée +Wooden Door=Porte en bois +Steel Door=Porte en acier +Glass Door=Porte en verre +Obsidian Glass Door=Porte en verre d'obsidienne +You do not own this trapdoor.=Vous ne possédez pas cette trappe. +a locked trapdoor=une trappe verouillée +Wooden Trapdoor=Trappe en bois +Steel Trapdoor=Trappe en acier +Apple Wood Fence Gate=Porte de clôture en bois de pommier +Acacia Wood Fence Gate=Porte de clôture en bois d'acacia +Jungle Wood Fence Gate=Porte de clôture en bois de la jungle +Pine Wood Fence Gate=Porte de clôture en bois de pin +Aspen Wood Fence Gate=Porte de clôture en bois de tremble diff --git a/mods/mtg/doors/locale/doors.hu.tr b/mods/mtg/doors/locale/doors.hu.tr new file mode 100644 index 0000000..ca60a3e --- /dev/null +++ b/mods/mtg/doors/locale/doors.hu.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Rejtett ajtó szegmens +Owned by @1=@1 tulajdona +You do not own this locked door.=Nem a tiéd ez a zárt ajtó. +a locked door=egy zárt ajtó +Wooden Door=Fa ajtó +Steel Door=Acél ajtó +Glass Door=Üveg ajtó +Obsidian Glass Door=Obszidiánüveg ajtó +You do not own this trapdoor.=Nem a tiéd ez a csapóajtó. +a locked trapdoor=egy zárt csapóajtó +Wooden Trapdoor=Fa csapóajtó +Steel Trapdoor=Acél csapóajtó +Apple Wood Fence Gate=Almafa kerítés kapu +Acacia Wood Fence Gate=Akáciafa kerítés kapu +Jungle Wood Fence Gate=Dzsungelfa kerítés kapu +Pine Wood Fence Gate=Fenyőfa kerítés kapu +Aspen Wood Fence Gate=Nyárfa kerítés kapu diff --git a/mods/mtg/doors/locale/doors.id.tr b/mods/mtg/doors/locale/doors.id.tr new file mode 100644 index 0000000..3b74904 --- /dev/null +++ b/mods/mtg/doors/locale/doors.id.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Bagian Pintu Tersembunyi +Owned by @1=Milik @1 +You do not own this locked door.=Anda bukan pemilik pintu terkunci ini. +a locked door=pintu terkunci +Wooden Door=Pintu Kayu +Steel Door=Pintu Baja +Glass Door=Pintu Kaca +Obsidian Glass Door=Pintu Kaca Obsidian +You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini. +a locked trapdoor=pintu kolong terkunci +Wooden Trapdoor=Pintu Kolong Kayu +Steel Trapdoor=Pintu Kolong Baja +Apple Wood Fence Gate=Gerbang Kayu Pohon Apel +Acacia Wood Fence Gate=Gerbang Kayu Akasia +Jungle Wood Fence Gate=Gerbang Kayu Pohon Rimba +Pine Wood Fence Gate=Gerbang Kayu Pinus +Aspen Wood Fence Gate=Gerbang Kayu Aspen diff --git a/mods/mtg/doors/locale/doors.it.tr b/mods/mtg/doors/locale/doors.it.tr new file mode 100644 index 0000000..ccd00d3 --- /dev/null +++ b/mods/mtg/doors/locale/doors.it.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento di porta nascosto +Owned by @1=Di proprietà di @1 +You do not own this locked door.=Non sei il proprietario di questa porta chiusa a chiave. +a locked door=una porta chiusa a chiave +Wooden Door=Porta di legno +Steel Door=Porta d'acciaio +Glass Door=Porta di vetro +Obsidian Glass Door=Porta di vetro d'ossidiana +You do not own this trapdoor.=Non sei il proprietario di questa botola. +a locked trapdoor=una botola chiusa a chiave +Wooden Trapdoor=Botola di legno +Steel Trapdoor=Botola d'acciaio +Apple Wood Fence Gate=Cancello della recinzione di legno di melo +Acacia Wood Fence Gate=Cancello della recinzione di legno d'acacia +Jungle Wood Fence Gate=Cancello della recinzione di legno della giungla +Pine Wood Fence Gate=Cancello della recinzione di legno di pino +Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo diff --git a/mods/mtg/doors/locale/doors.ja.tr b/mods/mtg/doors/locale/doors.ja.tr new file mode 100644 index 0000000..b173504 --- /dev/null +++ b/mods/mtg/doors/locale/doors.ja.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=隠しドアの区切り +Owned by @1=所有者 @1 +You do not own this locked door.=あなたはこのロックされたドアの所有者ではありません。 +a locked door=ロックされたドア +Wooden Door=木製のドア +Steel Door=鉄のドア +Glass Door=ガラスのドア +Obsidian Glass Door=黒曜石ガラスのドア +You do not own this trapdoor.=あなたはこのトラップドアの所有者ではありません。 +a locked trapdoor=ロックされたトラップドア +Wooden Trapdoor=木製のトラップドア +Steel Trapdoor=鉄のトラップドア +Apple Wood Fence Gate=リンゴ材のフェンスゲート +Acacia Wood Fence Gate=アカシア材のフェンスゲート +Jungle Wood Fence Gate=ジャングル材のフェンスゲート +Pine Wood Fence Gate=マツ材のフェンスゲート +Aspen Wood Fence Gate=ポプラ材のフェンスゲート diff --git a/mods/mtg/doors/locale/doors.jbo.tr b/mods/mtg/doors/locale/doors.jbo.tr new file mode 100644 index 0000000..f15854e --- /dev/null +++ b/mods/mtg/doors/locale/doors.jbo.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=lo se mipri pagbu be lo vrogai +Owned by @1=.i ti ponse zoi zo'i.@1.zo'i +You do not own this locked door.=.i do na ponse lo ti selstela vrogai +a locked door=lo selstela vrogai +Wooden Door=lo mudri vrogai +Steel Door=lo gasta vrogai +Glass Door=lo blaci vrogai +Obsidian Glass Door=lo je'erma'ablaci blaci vrogai +You do not own this trapdoor.=.i do na ponse lo ti selstela lolvrogai +a locked trapdoor=lo selstela lolvrogai +Wooden Trapdoor=lo mudri lolvrogai +Steel Trapdoor=lo gasta lolvrogai +Apple Wood Fence Gate=lo plisymudri garbimvrogai +Acacia Wood Fence Gate=lo atkaci,ia mudri garbimvrogai +Jungle Wood Fence Gate=lo glatimdemricfoi mudri garbimvrogai +Pine Wood Fence Gate=lo ku'urmudri garbimvrogai +Aspen Wood Fence Gate=lo mudrpopulu garbimvrogai diff --git a/mods/mtg/doors/locale/doors.lv.tr b/mods/mtg/doors/locale/doors.lv.tr new file mode 100644 index 0000000..624e440 --- /dev/null +++ b/mods/mtg/doors/locale/doors.lv.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Palsēptais durvju segments +Owned by @1=Saimnieks: @1 +You do not own this locked door.=Jums nepieder šīs aizslēgtās durvis. +a locked door=Aizslēgtas durvis +Wooden Door=Koka durvis +Steel Door=Tērauda durvis +Glass Door=Stikla durvis +Obsidian Glass Door=Obsidiānstikla durvis +You do not own this trapdoor.=Jums nepieder šī aizslēgtā lūka. +a locked trapdoor=Aizslēgta lūka +Wooden Trapdoor=Koka lūka +Steel Trapdoor=Tērauda lūka +Apple Wood Fence Gate=Ābolkoka žoga vārti +Acacia Wood Fence Gate=Akācijas žoga vārti +Jungle Wood Fence Gate=Džungļu koka žoga vārti +Pine Wood Fence Gate=Skujkoka žoga vārti +Aspen Wood Fence Gate=Apses žoga vārti diff --git a/mods/mtg/doors/locale/doors.ms.tr b/mods/mtg/doors/locale/doors.ms.tr new file mode 100644 index 0000000..93d6df2 --- /dev/null +++ b/mods/mtg/doors/locale/doors.ms.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmen Pintu Tersembunyi +Owned by @1=Milik @1 +You do not own this locked door.=Anda bukan pemilik pintu berkunci ini. +a locked door=pintu berkunci +Wooden Door=Pintu Kayu +Steel Door=Pintu Keluli +Glass Door=Pintu Kaca +Obsidian Glass Door=Pintu Kaca Obsidia +You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini. +a locked trapdoor=pintu kolong berkunci +Wooden Trapdoor=Pintu Kolong Kayu +Steel Trapdoor=Pintu Kolong Keluli +Apple Wood Fence Gate=Pintu Pagar Kayu Epal +Acacia Wood Fence Gate=Pintu Pagar Kayu Akasia +Jungle Wood Fence Gate=Pintu Pagar Kayu Hutan +Pine Wood Fence Gate=Pintu Pagar Kayu Pain +Aspen Wood Fence Gate=Pintu Pagar Kayu Aspen diff --git a/mods/mtg/doors/locale/doors.pl.tr b/mods/mtg/doors/locale/doors.pl.tr new file mode 100644 index 0000000..6aec285 --- /dev/null +++ b/mods/mtg/doors/locale/doors.pl.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Ukryty segment drzwi +Owned by @1=Właściciel: @1 +You do not own this locked door.=Nie jesteś właścicielem tych zablokowanych drzwi. +a locked door=zablokowane drzwi +Wooden Door=Drewniane drzwi +Steel Door=Stalowe drzwi +Glass Door=Szklane drzwi +Obsidian Glass Door=Drzwi z obsydianowego szkła +You do not own this trapdoor.=Nie jesteś właścicielem tego włazu. +a locked trapdoor=zablokowany właz +Wooden Trapdoor=Drewniany właz +Steel Trapdoor=Stalowy właz +Apple Wood Fence Gate=Furtka z jabłkowego drzewa +Acacia Wood Fence Gate=Furtka z akacjowego drzewa +Jungle Wood Fence Gate=Furtka z dżunglowego drzewa +Pine Wood Fence Gate=Furtka z sosnowego drzewa +Aspen Wood Fence Gate=Furtka z brzozowego drzewa diff --git a/mods/mtg/doors/locale/doors.pt_BR.tr b/mods/mtg/doors/locale/doors.pt_BR.tr new file mode 100644 index 0000000..8232442 --- /dev/null +++ b/mods/mtg/doors/locale/doors.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento de Porta Oculto +Owned by @1=Propriedade de @1 +You do not own this locked door.=Você não é dono desta porta trancada. +a locked door=uma porta trancada +Wooden Door=Porta de Madeira +Steel Door=Porta de Aço +Glass Door=Porta de Vidro +Obsidian Glass Door=Porta de Vidro de Obsidiana +You do not own this trapdoor.=Você não é dono deste alçapão. +a locked trapdoor=um alçapão trancado +Wooden Trapdoor=Alçapão de Madeira +Steel Trapdoor=Alçapão de Aço +Apple Wood Fence Gate=Portão de Cerca de Macieira +Acacia Wood Fence Gate=Portão de Cerca de Acácia +Jungle Wood Fence Gate=Portão de Cerca de Madeira da Selva +Pine Wood Fence Gate=Portão de Cerca de Pinheiro +Aspen Wood Fence Gate=Portão de Cerca de Álamo diff --git a/mods/mtg/doors/locale/doors.ru.tr b/mods/mtg/doors/locale/doors.ru.tr new file mode 100644 index 0000000..7b96762 --- /dev/null +++ b/mods/mtg/doors/locale/doors.ru.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Спрятанная часть двери +Owned by @1=Владелец: @1 +You do not own this locked door.=Вы не владелец этой запертой двери. +a locked door=запертая дверь +Wooden Door=Деревянная дверь +Steel Door=Стальная дверь +Glass Door=Стеклянная дверь +Obsidian Glass Door=Дверь из обсидианового стекла +You do not own this trapdoor.=Вы не владелец этого люка. +a locked trapdoor=запертый люк +Wooden Trapdoor=Деревянный люк +Steel Trapdoor=Стальной люк +Apple Wood Fence Gate=Яблоневая калитка +Acacia Wood Fence Gate=Акациевая калитка +Jungle Wood Fence Gate=Калитка из тропического дерева +Pine Wood Fence Gate=Сосновая калитка +Aspen Wood Fence Gate=Осиновая калитка diff --git a/mods/mtg/doors/locale/doors.sk.tr b/mods/mtg/doors/locale/doors.sk.tr new file mode 100644 index 0000000..e6943ac --- /dev/null +++ b/mods/mtg/doors/locale/doors.sk.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Skrytá časť dverí +Owned by @1=Vlastník - @1 +You do not own this locked door.=Nevlastníš tieto uzamknuté dvere. +a locked door=uzamknuté dvere +Wooden Door=Drevené dvere +Steel Door=Oceľové dvere +Glass Door=Sklenené dvere +Obsidian Glass Door=Obsidiánové sklenené dvere +You do not own this trapdoor.=Nevlastníš tieto padacie dvere. +a locked trapdoor=uzamknuté padacie dvere +Wooden Trapdoor=Drevené padacie dvere +Steel Trapdoor=Oceľové padacie dvere +Apple Wood Fence Gate=Drevený plot z jablone +Acacia Wood Fence Gate=Drevený plot z akácie +Jungle Wood Fence Gate=Drevený plot z džungľového dreva +Pine Wood Fence Gate=Drevený plot z borovice +Aspen Wood Fence Gate=Drevený plot z osiky diff --git a/mods/mtg/doors/locale/doors.sv.tr b/mods/mtg/doors/locale/doors.sv.tr new file mode 100644 index 0000000..9f31d9c --- /dev/null +++ b/mods/mtg/doors/locale/doors.sv.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Dolt dörrsegment +Owned by @1=Ägd av @1 +You do not own this locked door.=Du äger inte denna låsta dörr. +a locked door=en låst dörr +Wooden Door=Trädörr +Steel Door=Ståldörr +Glass Door=Glasdörr +Obsidian Glass Door=Obsidianglasdörr +You do not own this trapdoor.=Du äger inte denna fallucka +a locked trapdoor=en låst fallucka +Wooden Trapdoor=Träfallucka +Steel Trapdoor=Stålfallucka +Apple Wood Fence Gate=Äppleträfallucka +Acacia Wood Fence Gate=Akaciaträfallucka +Jungle Wood Fence Gate=Djungelträfallucka +Pine Wood Fence Gate=Tallträfallucka +Aspen Wood Fence Gate=Aspträfallucka diff --git a/mods/mtg/doors/locale/doors.uk.tr b/mods/mtg/doors/locale/doors.uk.tr new file mode 100644 index 0000000..fc07f39 --- /dev/null +++ b/mods/mtg/doors/locale/doors.uk.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Прихована частина дверей +Owned by @1=Власник: @1 +You do not own this locked door.=Ви — не власник цих замкнених дверей. +a locked door=замкнені двері +Wooden Door=Дерев'яні двері +Steel Door=Сталеві двері +Glass Door=Скляні двері +Obsidian Glass Door=Двері з обсидіанового скла +You do not own this trapdoor.=Ви — не власник цього люка. +a locked trapdoor=замкнений люк +Wooden Trapdoor=Дерев'яний люк +Steel Trapdoor=Сталевий люк +Apple Wood Fence Gate=Яблунева хвіртка +Acacia Wood Fence Gate=Акацієва хвіртка +Jungle Wood Fence Gate=Хвіртка з тропічного дерева +Pine Wood Fence Gate=Соснова хвіртка +Aspen Wood Fence Gate=Осикова хвіртка diff --git a/mods/mtg/doors/locale/doors.zh_CN.tr b/mods/mtg/doors/locale/doors.zh_CN.tr new file mode 100644 index 0000000..cf32996 --- /dev/null +++ b/mods/mtg/doors/locale/doors.zh_CN.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=隐藏门段 +Owned by @1=由@1所有 +You do not own this locked door.=这个门不属于你。 +a locked door=一扇已上锁的门 +Wooden Door=木门 +Steel Door=铁门 +Glass Door=玻璃门 +Obsidian Glass Door=黑曜石玻璃门 +You do not own this trapdoor.=这个活板门不属于你。 +a locked trapdoor=一扇已上锁的活板门 +Wooden Trapdoor=木活板门 +Steel Trapdoor=铁活板门 +Apple Wood Fence Gate=苹果木栅栏门 +Acacia Wood Fence Gate=相思木栅栏门 +Jungle Wood Fence Gate=丛林木栅栏门 +Pine Wood Fence Gate=松木栅栏门 +Aspen Wood Fence Gate=白杨木栅栏门 diff --git a/mods/mtg/doors/locale/doors.zh_TW.tr b/mods/mtg/doors/locale/doors.zh_TW.tr new file mode 100644 index 0000000..81e06fc --- /dev/null +++ b/mods/mtg/doors/locale/doors.zh_TW.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=隱藏門段 +Owned by @1=由@1擁有 +You do not own this locked door.=這個門不屬於你所有。 +a locked door=一扇已上鎖的門 +Wooden Door=木門 +Steel Door=鐵門 +Glass Door=玻璃門 +Obsidian Glass Door=黑曜石玻璃門 +You do not own this trapdoor.=這個活板門不屬於你所有。 +a locked trapdoor=一扇已上鎖的活板門 +Wooden Trapdoor=木活板門 +Steel Trapdoor=鐵活板門 +Apple Wood Fence Gate=蘋果木柵欄門 +Acacia Wood Fence Gate=相思木柵欄門 +Jungle Wood Fence Gate=叢林木柵欄門 +Pine Wood Fence Gate=松木柵欄門 +Aspen Wood Fence Gate=白楊木柵欄門 diff --git a/mods/mtg/doors/locale/template.txt b/mods/mtg/doors/locale/template.txt new file mode 100644 index 0000000..8b5c349 --- /dev/null +++ b/mods/mtg/doors/locale/template.txt @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment= +Owned by @1= +You do not own this locked door.= +a locked door= +Wooden Door= +Steel Door= +Glass Door= +Obsidian Glass Door= +You do not own this trapdoor.= +a locked trapdoor= +Wooden Trapdoor= +Steel Trapdoor= +Apple Wood Fence Gate= +Acacia Wood Fence Gate= +Jungle Wood Fence Gate= +Pine Wood Fence Gate= +Aspen Wood Fence Gate= diff --git a/mods/mtg/doors/mod.conf b/mods/mtg/doors/mod.conf new file mode 100644 index 0000000..de053c2 --- /dev/null +++ b/mods/mtg/doors/mod.conf @@ -0,0 +1,4 @@ +name = doors +description = Minetest Game mod: doors +depends = default +optional_depends = screwdriver diff --git a/mods/mtg/doors/models/door.blend b/mods/mtg/doors/models/door.blend new file mode 100644 index 0000000..56047b1 Binary files /dev/null and b/mods/mtg/doors/models/door.blend differ diff --git a/mods/mtg/doors/models/door_a.b3d b/mods/mtg/doors/models/door_a.b3d new file mode 100644 index 0000000..7f9249f Binary files /dev/null and b/mods/mtg/doors/models/door_a.b3d differ diff --git a/mods/mtg/doors/models/door_b.b3d b/mods/mtg/doors/models/door_b.b3d new file mode 100644 index 0000000..77a1a16 Binary files /dev/null and b/mods/mtg/doors/models/door_b.b3d differ diff --git a/mods/mtg/doors/models/doors_fencegate_closed.obj b/mods/mtg/doors/models/doors_fencegate_closed.obj new file mode 100644 index 0000000..0050f70 --- /dev/null +++ b/mods/mtg/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/mods/mtg/doors/models/doors_fencegate_open.obj b/mods/mtg/doors/models/doors_fencegate_open.obj new file mode 100644 index 0000000..3fb727f --- /dev/null +++ b/mods/mtg/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/mods/mtg/doors/sounds/doors_door_close.ogg b/mods/mtg/doors/sounds/doors_door_close.ogg new file mode 100644 index 0000000..fede4af Binary files /dev/null and b/mods/mtg/doors/sounds/doors_door_close.ogg differ diff --git a/mods/mtg/doors/sounds/doors_door_open.ogg b/mods/mtg/doors/sounds/doors_door_open.ogg new file mode 100644 index 0000000..9a4c4f1 Binary files /dev/null and b/mods/mtg/doors/sounds/doors_door_open.ogg differ diff --git a/mods/mtg/doors/sounds/doors_fencegate_close.ogg b/mods/mtg/doors/sounds/doors_fencegate_close.ogg new file mode 100644 index 0000000..d42590f Binary files /dev/null and b/mods/mtg/doors/sounds/doors_fencegate_close.ogg differ diff --git a/mods/mtg/doors/sounds/doors_fencegate_open.ogg b/mods/mtg/doors/sounds/doors_fencegate_open.ogg new file mode 100644 index 0000000..f6dfd1d Binary files /dev/null and b/mods/mtg/doors/sounds/doors_fencegate_open.ogg differ diff --git a/mods/mtg/doors/sounds/doors_glass_door_close.ogg b/mods/mtg/doors/sounds/doors_glass_door_close.ogg new file mode 100644 index 0000000..b3c1355 Binary files /dev/null and b/mods/mtg/doors/sounds/doors_glass_door_close.ogg differ diff --git a/mods/mtg/doors/sounds/doors_glass_door_open.ogg b/mods/mtg/doors/sounds/doors_glass_door_open.ogg new file mode 100644 index 0000000..66e6812 Binary files /dev/null and b/mods/mtg/doors/sounds/doors_glass_door_open.ogg differ diff --git a/mods/mtg/doors/sounds/doors_steel_door_close.ogg b/mods/mtg/doors/sounds/doors_steel_door_close.ogg new file mode 100644 index 0000000..aea7be6 Binary files /dev/null and b/mods/mtg/doors/sounds/doors_steel_door_close.ogg differ diff --git a/mods/mtg/doors/sounds/doors_steel_door_open.ogg b/mods/mtg/doors/sounds/doors_steel_door_open.ogg new file mode 100644 index 0000000..de87477 Binary files /dev/null and b/mods/mtg/doors/sounds/doors_steel_door_open.ogg differ diff --git a/mods/mtg/doors/textures/doors_door_glass.png b/mods/mtg/doors/textures/doors_door_glass.png new file mode 100644 index 0000000..ea6fdc1 Binary files /dev/null and b/mods/mtg/doors/textures/doors_door_glass.png differ diff --git a/mods/mtg/doors/textures/doors_door_obsidian_glass.png b/mods/mtg/doors/textures/doors_door_obsidian_glass.png new file mode 100644 index 0000000..fab25b3 Binary files /dev/null and b/mods/mtg/doors/textures/doors_door_obsidian_glass.png differ diff --git a/mods/mtg/doors/textures/doors_door_steel.png b/mods/mtg/doors/textures/doors_door_steel.png new file mode 100644 index 0000000..9e33ff1 Binary files /dev/null and b/mods/mtg/doors/textures/doors_door_steel.png differ diff --git a/mods/mtg/doors/textures/doors_door_wood.png b/mods/mtg/doors/textures/doors_door_wood.png new file mode 100644 index 0000000..c073faf Binary files /dev/null and b/mods/mtg/doors/textures/doors_door_wood.png differ diff --git a/mods/mtg/doors/textures/doors_hidden_segment.png b/mods/mtg/doors/textures/doors_hidden_segment.png new file mode 100644 index 0000000..b3b6f34 Binary files /dev/null and b/mods/mtg/doors/textures/doors_hidden_segment.png differ diff --git a/mods/mtg/doors/textures/doors_item_glass.png b/mods/mtg/doors/textures/doors_item_glass.png new file mode 100644 index 0000000..d883f6e Binary files /dev/null and b/mods/mtg/doors/textures/doors_item_glass.png differ diff --git a/mods/mtg/doors/textures/doors_item_obsidian_glass.png b/mods/mtg/doors/textures/doors_item_obsidian_glass.png new file mode 100644 index 0000000..8c7920c Binary files /dev/null and b/mods/mtg/doors/textures/doors_item_obsidian_glass.png differ diff --git a/mods/mtg/doors/textures/doors_item_steel.png b/mods/mtg/doors/textures/doors_item_steel.png new file mode 100644 index 0000000..dd99e13 Binary files /dev/null and b/mods/mtg/doors/textures/doors_item_steel.png differ diff --git a/mods/mtg/doors/textures/doors_item_wood.png b/mods/mtg/doors/textures/doors_item_wood.png new file mode 100644 index 0000000..d3a62ab Binary files /dev/null and b/mods/mtg/doors/textures/doors_item_wood.png differ diff --git a/mods/mtg/doors/textures/doors_trapdoor.png b/mods/mtg/doors/textures/doors_trapdoor.png new file mode 100644 index 0000000..e92c8b2 Binary files /dev/null and b/mods/mtg/doors/textures/doors_trapdoor.png differ diff --git a/mods/mtg/doors/textures/doors_trapdoor_side.png b/mods/mtg/doors/textures/doors_trapdoor_side.png new file mode 100644 index 0000000..55981ea Binary files /dev/null and b/mods/mtg/doors/textures/doors_trapdoor_side.png differ diff --git a/mods/mtg/doors/textures/doors_trapdoor_steel.png b/mods/mtg/doors/textures/doors_trapdoor_steel.png new file mode 100644 index 0000000..4ba507d Binary files /dev/null and b/mods/mtg/doors/textures/doors_trapdoor_steel.png differ diff --git a/mods/mtg/doors/textures/doors_trapdoor_steel_side.png b/mods/mtg/doors/textures/doors_trapdoor_steel_side.png new file mode 100644 index 0000000..e29c59e Binary files /dev/null and b/mods/mtg/doors/textures/doors_trapdoor_steel_side.png differ diff --git a/mods/mtg/spawn/README.txt b/mods/mtg/spawn/README.txt new file mode 100644 index 0000000..fc16c2a --- /dev/null +++ b/mods/mtg/spawn/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: spawn +======================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) diff --git a/mods/mtg/spawn/api.lua b/mods/mtg/spawn/api.lua new file mode 100644 index 0000000..bffe32a --- /dev/null +++ b/mods/mtg/spawn/api.lua @@ -0,0 +1,49 @@ +spawn = {} + +-- provide empty default implementations + +function spawn.get_default_pos() + return nil +end + +function spawn.add_suitable_biome(biome) +end + +-- Callback registration + +spawn.registered_on_spawn = {} + +function spawn.register_on_spawn(func) + table.insert(spawn.registered_on_spawn, func) +end + +-- Logic run on spawn + +local use_engine_spawn = minetest.settings:get("static_spawnpoint") or + minetest.settings:get_bool("engine_spawn") + +local function on_spawn(player, is_new) + -- Ask all callbacks first + for _, cb in ipairs(spawn.registered_on_spawn) do + if cb(player, is_new) then + return true + end + end + -- Fall back to default spawn + if not use_engine_spawn then + local pos = spawn.get_default_pos() + if pos then + player:set_pos(pos) + return true + end + end + return false +end + +minetest.register_on_newplayer(function(player) + on_spawn(player, true) +end) + +minetest.register_on_respawnplayer(function(player) + return on_spawn(player, false) +end) diff --git a/mods/mtg/spawn/init.lua b/mods/mtg/spawn/init.lua new file mode 100644 index 0000000..9cad5f9 --- /dev/null +++ b/mods/mtg/spawn/init.lua @@ -0,0 +1,127 @@ +-- Always load the API +---------------------- +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/api.lua") + +-- Disable biome-search implementation on unsuitable mapgens +------------------------------------------------------------ + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" or mg_name == "singlenode" then + return +end + + +-- Parameters +------------- + +-- Resolution of search grid in nodes. +local res = 64 +-- Number of points checked in the square search grid (edge * edge). +local checks = 128 * 128 +-- Starting point for biome checks. This also sets the y co-ordinate for all +-- points checked, so the suitable biomes must be active at this y. +local pos = {x = 0, y = 8, z = 0} + + +-- Table of suitable biomes and matching API function + +local biome_ids = {} + +function spawn.add_suitable_biome(biome) + local id = minetest.get_biome_id(biome) + assert(id ~= nil) + biome_ids[id] = true +end + +for _, name in ipairs({ + "taiga", "coniferous_forest", "deciduous_forest", "grassland", "savanna" +}) do + local id = minetest.get_biome_id(name) + if id then + biome_ids[id] = true + end +end + +-- End of parameters +-------------------- + +-- Direction table + +local dirs = { + vector.new(0, 0, 1), + vector.new(-1, 0, 0), + vector.new(0, 0, -1), + vector.new(1, 0, 0), +} + + +-- Initial variables + +local edge_len = 1 +local edge_dist = 0 +local dir_step = 0 +local dir_ind = 1 +local searched = false +local success = false +local spawn_pos = {} + + +-- Functions +------------ + +-- Get next position on square search spiral + +local function next_pos() + if edge_dist == edge_len then + edge_dist = 0 + dir_ind = dir_ind + 1 + if dir_ind == 5 then + dir_ind = 1 + end + dir_step = dir_step + 1 + edge_len = math.floor(dir_step / 2) + 1 + end + + local dir = dirs[dir_ind] + local move = vector.multiply(dir, res) + + edge_dist = edge_dist + 1 + + return vector.add(pos, move) +end + + +-- Spawn position search + +local function search() + local edge1, edge2 = core.get_mapgen_edges() + for iter = 1, checks do + local biome_data = minetest.get_biome_data(pos) + -- Sometimes biome_data is nil + if biome_data and biome_ids[biome_data.biome] then + local spawn_y = minetest.get_spawn_level(pos.x, pos.z) + if spawn_y then + spawn_pos = vector.new(pos.x, spawn_y, pos.z) + return true + end + end + + pos = next_pos() + -- Check for position being outside world edge + if pos.x < edge1.x or pos.z < edge1.z or pos.x > edge2.x or pos.z > edge2.z then + return false + end + end + + return false +end + + +function spawn.get_default_pos() + -- Search for spawn position once per server session + if not searched then + success = search() + searched = true + end + return success and spawn_pos +end diff --git a/mods/mtg/spawn/license.txt b/mods/mtg/spawn/license.txt new file mode 100644 index 0000000..a466aab --- /dev/null +++ b/mods/mtg/spawn/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/mtg/spawn/mod.conf b/mods/mtg/spawn/mod.conf new file mode 100644 index 0000000..7a09d4a --- /dev/null +++ b/mods/mtg/spawn/mod.conf @@ -0,0 +1,3 @@ +name = spawn +description = Minetest Game mod: spawn +depends = default