This commit is contained in:
IonicCheese 2025-12-09 18:45:44 -08:00
commit 08da37a1ad
107 changed files with 3133 additions and 1 deletions

View file

@ -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

View file

@ -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
})

Binary file not shown.

30
mods/mtg/beds/README.txt Normal file
View file

@ -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.

204
mods/mtg/beds/api.lua Normal file
View file

@ -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

109
mods/mtg/beds/beds.lua Normal file
View file

@ -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,
})

354
mods/mtg/beds/functions.lua Normal file
View file

@ -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)

31
mods/mtg/beds/init.lua Normal file
View file

@ -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")

61
mods/mtg/beds/license.txt Normal file
View file

@ -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/

View file

@ -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=Ставане от леглото

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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=ベッドから出ます

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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=Встать с кровати

View file

@ -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ľ

View file

@ -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

View file

@ -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=Встати з ліжка

View file

@ -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=离开床

View file

@ -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=離開床

View file

@ -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=

4
mods/mtg/beds/mod.conf Normal file
View file

@ -0,0 +1,4 @@
name = beds
description = Minetest Game mod: beds
depends = default, wool, spawn
optional_depends = player_monoids, pova

72
mods/mtg/beds/spawns.lua Normal file
View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

87
mods/mtg/doors/README.txt Normal file
View file

@ -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)

937
mods/mtg/doors/init.lua Normal file
View file

@ -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,
})

164
mods/mtg/doors/license.txt Normal file
View file

@ -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/

View file

@ -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=Врата за ограда от трепетликово дърво

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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=ポプラ材のフェンスゲート

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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=Осиновая калитка

View file

@ -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

View file

@ -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

View file

@ -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=Осикова хвіртка

View file

@ -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=白杨木栅栏门

View file

@ -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=白楊木柵欄門

View file

@ -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=

4
mods/mtg/doors/mod.conf Normal file
View file

@ -0,0 +1,4 @@
name = doors
description = Minetest Game mod: doors
depends = default
optional_depends = screwdriver

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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

View file

@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,013 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Some files were not shown because too many files have changed in this diff Show more