doors
|
@ -19,3 +19,13 @@
|
|||
- Author: InspectorJ
|
||||
- License: This work is licensed under the Attribution License.
|
||||
- Site: https://freesound.org/people/InspectorJ/sounds/412068/
|
||||
|
||||
## door_open.ogg
|
||||
- Author: amholma
|
||||
- License: This work is licensed under the Creative Commons 0 License.
|
||||
- Site: https://freesound.org/people/amholma/sounds/344360/
|
||||
|
||||
## door_close.ogg
|
||||
- Author: BergsteinProd
|
||||
- License: This work is licensed under the Attribution License.
|
||||
- Site: https://freesound.org/people/BergsteinProd/sounds/577009/
|
||||
|
|
|
@ -250,16 +250,16 @@ end
|
|||
|
||||
local function place_bed(bed_name, placer, pointed_thing)
|
||||
local above_pos = pointed_thing.above
|
||||
local placer_dir = vector.round(placer:get_look_dir())
|
||||
local bed_dir = helper.dir_to_compass(placer:get_look_dir())
|
||||
--minetest.chat_send_all("placer dir: "..minetest.pos_to_string(placer_dir))
|
||||
if (placer_dir.x == 0) and (placer_dir.z == 0) then
|
||||
return
|
||||
end
|
||||
local behind_pos = vector.offset(above_pos, placer_dir.x, 0.0, placer_dir.z)
|
||||
local behind_pos = vector.offset(above_pos, bed_dir.x, bed_dir.y, bed_dir.z)
|
||||
local node_behind = minetest.get_node_or_nil(behind_pos)
|
||||
if node_behind and helper.get_nodedef_field(node_behind.name, "drawtype") == "airlike" then
|
||||
local dir = minetest.dir_to_facedir(placer:get_look_dir()) or 0
|
||||
minetest.set_node(above_pos, {name = bed_name, param2 = dir})
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -284,7 +284,9 @@ function bedz.register_bed(name, def)
|
|||
fixed = def.selectionbox,
|
||||
},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
place_bed(bed_name, placer, pointed_thing)
|
||||
if place_bed(bed_name, placer, pointed_thing) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||
|
|
|
@ -82,7 +82,9 @@ minetest.register_on_mods_loaded(function()
|
|||
local items = {}
|
||||
for itemstring,_ in pairs(minetest.registered_items) do
|
||||
if itemstring ~= "" and itemstring ~= "unknown" and itemstring ~= "ignore" then
|
||||
table.insert(items, itemstring)
|
||||
if minetest.get_item_group(itemstring, "not_in_creative_inventory") == 0 then
|
||||
table.insert(items, itemstring)
|
||||
end
|
||||
end
|
||||
end
|
||||
--[[ Sort items in this order:
|
||||
|
|
|
@ -0,0 +1,209 @@
|
|||
S, modname = ...
|
||||
|
||||
minetest.register_node("door:invisible_top", {
|
||||
drawtype = "nodebox",
|
||||
paramtype2 = "facedir",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{0.4375, -0.5, 0, 0.5, -0.5, 0.0625},
|
||||
},
|
||||
},
|
||||
tiles = {"blank.png"},
|
||||
use_texture_alpha = true,
|
||||
is_ground_content = false,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
})
|
||||
|
||||
local function destroy_inv_top(pos)
|
||||
local above_pos = vector.new(pos.x, pos.y+1, pos.z)
|
||||
minetest.set_node(above_pos, {name = "air"})
|
||||
end
|
||||
|
||||
local function is_door_on_right(pos, door_dir)
|
||||
local up_vector = vector.new(0, 1, 0)
|
||||
local right_vector = vector.cross(up_vector, door_dir)
|
||||
--local left_vector = - right_vector
|
||||
local right_pos = vector.add(pos, right_vector)
|
||||
if helper.in_group(right_pos, "door") then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local function place_door(door_name, placer, pointed_thing)
|
||||
local pos = pointed_thing.above
|
||||
local door_dir = helper.dir_to_compass(placer:get_look_dir())
|
||||
--minetest.chat_send_all(tostring(door_dir))
|
||||
if helper.node_is_air(pos) then
|
||||
local above_pos = vector.new(pos.x, pos.y+1, pos.z)
|
||||
if helper.node_is_air(above_pos) then
|
||||
local dir = placer:get_look_dir()
|
||||
local rotation
|
||||
if is_door_on_right(pos, door_dir) then
|
||||
dir = -dir
|
||||
rotation = "left"
|
||||
else
|
||||
rotation = "right"
|
||||
end
|
||||
local facedir = minetest.dir_to_facedir(dir) or 0
|
||||
minetest.set_node(pos, {name = door_name, param2 = facedir})
|
||||
minetest.set_node(above_pos, {name = "door:invisible_top", param2 = facedir})
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("door:dir", vector.to_string(door_dir))
|
||||
meta:set_string("door:rotation", rotation)
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local function open_door(pos, node, clicker, door_name)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local open_dir_str = meta:get_string("door:dir")
|
||||
local open_dir = minetest.string_to_pos(open_dir_str)
|
||||
if not open_dir then
|
||||
open_dir = vector.round(clicker:get_look_dir())
|
||||
end
|
||||
local node_open_pos = vector.add(pos, open_dir)
|
||||
local node_open = minetest.get_node_or_nil(node_open_pos)
|
||||
if node_open and (
|
||||
helper.get_nodedef_field(node_open.name, "buildable_to") or
|
||||
helper.node_is_air(node_open_pos)
|
||||
) then
|
||||
if helper.node_is_air(node_open_pos, "above") then
|
||||
local facedir = minetest.dir_to_facedir(open_dir)
|
||||
local door_name_opened = door_name.."_opened"
|
||||
local rotation = meta:get_string("door:rotation")
|
||||
if rotation == "left" then
|
||||
door_name_opened = door_name_opened.."_left"
|
||||
end
|
||||
minetest.set_node(pos, {name = door_name_opened, param2 = facedir})
|
||||
sound.play("pos", pos, "door_open")
|
||||
local above_pos = vector.new(pos.x, pos.y+1, pos.z)
|
||||
minetest.set_node(above_pos, {name = "door:invisible_top", param2 = facedir})
|
||||
meta = minetest.get_meta(pos)
|
||||
meta:set_int("door:facedir", node.param2)
|
||||
meta:set_string("door:dir", open_dir_str)
|
||||
meta:set_string("door:rotation", rotation)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function close_door(pos, door_name)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local facedir = meta:get_int("door:facedir")
|
||||
local dir = meta:get_string("door:dir")
|
||||
local rotation = meta:get_string("door:rotation")
|
||||
minetest.set_node(pos, {name = door_name, param2 = facedir})
|
||||
sound.play("pos", pos, "door_close")
|
||||
local above_pos = vector.new(pos.x, pos.y+1, pos.z)
|
||||
minetest.set_node(above_pos, {name = "door:invisible_top", param2 = facedir})
|
||||
meta = minetest.get_meta(pos)
|
||||
meta:set_string("door:dir", dir)
|
||||
meta:set_string("door:rotation", rotation)
|
||||
end
|
||||
|
||||
function door.register_door(name, def)
|
||||
|
||||
local door_name = modname..":"..name
|
||||
|
||||
minetest.register_node(door_name, {
|
||||
description = S("@1 Door", S(def.description)),
|
||||
inventory_image = def.inventory_image or "",
|
||||
wield_image = def.wield_image or def.inventory_image or "",
|
||||
drawtype = "mesh",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
mesh = "door.b3d",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.0625, 0.5, 1.5, 0.0625},
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.0625, 0.5, 1.5, 0.0625},
|
||||
},
|
||||
},
|
||||
tiles = def.tiles,
|
||||
use_texture_alpha = true,
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, door = 1},
|
||||
stack_max = 1,
|
||||
buildable_to = false,
|
||||
sounds = sound.wood(),
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
if place_door(door_name, placer, pointed_thing) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
|
||||
on_destruct = function(pos)
|
||||
destroy_inv_top(pos)
|
||||
end,
|
||||
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||
open_door(pos, node, clicker, door_name)
|
||||
end,
|
||||
})
|
||||
|
||||
for i=0,1 do
|
||||
local mesh, fixed, door_name_opened
|
||||
if i == 0 then
|
||||
mesh = "door_opened.b3d"
|
||||
fixed = {0.375, -0.5, 0, 0.5, 1.5, 1.0}
|
||||
door_name_opened = door_name.."_opened"
|
||||
else
|
||||
mesh = "door_opened_left.b3d"
|
||||
fixed = {-0.5, -0.5, 0, -0.375, 1.5, 1.0}
|
||||
door_name_opened = door_name.."_opened_left"
|
||||
end
|
||||
|
||||
minetest.register_node(door_name_opened, {
|
||||
description = def.description,
|
||||
drawtype = "mesh",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
mesh = mesh,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
fixed,
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
fixed,
|
||||
},
|
||||
},
|
||||
drop = door_name,
|
||||
tiles = def.tiles,
|
||||
walkable = true,
|
||||
use_texture_alpha = true,
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, door = 1, not_in_creative_inventory = 1},
|
||||
stack_max = 1,
|
||||
buildable_to = false,
|
||||
sounds = sound.wood(),
|
||||
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||
close_door(pos, door_name)
|
||||
end,
|
||||
|
||||
on_destruct = function(pos)
|
||||
destroy_inv_top(pos)
|
||||
end
|
||||
|
||||
})
|
||||
end
|
||||
end
|
|
@ -0,0 +1,5 @@
|
|||
door.register_door("apple_tree", {
|
||||
description = "Apple Tree",
|
||||
tiles = {"door_apple_tree.png"},
|
||||
inventory_image = "door_apple_tree_inv.png",
|
||||
})
|
|
@ -0,0 +1,8 @@
|
|||
door = {}
|
||||
|
||||
local modname = minetest.get_current_modname()
|
||||
local modpath = minetest.get_modpath(modname)
|
||||
local S = minetest.get_translator(modname)
|
||||
|
||||
assert(loadfile(modpath .. "/api.lua"))(S, modname)
|
||||
assert(loadfile(modpath .. "/doors.lua"))()
|
|
@ -0,0 +1,3 @@
|
|||
# textdomain: door
|
||||
@1 Door=Puerta de @1
|
||||
Apple Tree=manzano
|
|
@ -0,0 +1,19 @@
|
|||
mtllib door.mtl
|
||||
o converted_out
|
||||
v 0.5 -0.5 -0.0625
|
||||
v 0.5 -0.5 0.0625
|
||||
v 0.5 1.5 0.0625
|
||||
v 0.5 1.5 -0.0625
|
||||
v -0.5 -0.5 -0.0625
|
||||
v -0.5 -0.5 0.0625
|
||||
v -0.5 1.5 0.0625
|
||||
v -0.5 1.5 -0.0625
|
||||
usemtl none
|
||||
s off
|
||||
g nodebox3
|
||||
f 1 2 3 4
|
||||
f 5 6 7 8
|
||||
f 1 4 8 5
|
||||
f 2 3 7 6
|
||||
f 1 2 6 5
|
||||
f 4 3 7 8
|
|
@ -0,0 +1,19 @@
|
|||
mtllib door_opened.mtl
|
||||
o converted_out
|
||||
v -0.375 -0.5 0
|
||||
v -0.375 -0.5 1
|
||||
v -0.375 1.5 1
|
||||
v -0.375 1.5 0
|
||||
v -0.5 -0.5 0
|
||||
v -0.5 -0.5 1
|
||||
v -0.5 1.5 1
|
||||
v -0.5 1.5 0
|
||||
usemtl none
|
||||
s off
|
||||
g nodebox3
|
||||
f 1 2 3 4
|
||||
f 5 6 7 8
|
||||
f 1 4 8 5
|
||||
f 2 3 7 6
|
||||
f 1 2 6 5
|
||||
f 4 3 7 8
|
After Width: | Height: | Size: 726 B |
After Width: | Height: | Size: 710 B |
|
@ -112,7 +112,7 @@ function farmz.register_plant(name, def)
|
|||
if i == 1 then
|
||||
_plant_name = product_name.."_plant"
|
||||
texture = modname.."_"..name.."_plant.png"
|
||||
description = def.description.." "..S("Plant")
|
||||
description = S("@1 Plant", S(def.description))
|
||||
if not def.drop then
|
||||
local drop_number = def.drop_number or 1
|
||||
drop = product_name.." "..drop_number
|
||||
|
@ -122,7 +122,7 @@ function farmz.register_plant(name, def)
|
|||
else
|
||||
_plant_name = product_name.."_sprout"
|
||||
texture = modname.."_"..name.."_sprout.png"
|
||||
description = def.description.." "..S("Plant").." ".."("..S("Sprout")..")"
|
||||
description = S("@1 Plant", S(def.description)).." ".."("..S("Sprout")..")"
|
||||
drop = ""
|
||||
end
|
||||
|
||||
|
@ -174,7 +174,7 @@ function farmz.register_plant(name, def)
|
|||
local seed_texture = modname.."_"..name.."_seed.png"
|
||||
|
||||
minetest.register_craftitem(seed_name, {
|
||||
description = def.description.." ".."("..S("Seed")..")",
|
||||
description = S("@1 Seed", S(def.description)),
|
||||
inventory_image = seed_texture,
|
||||
groups = {seed = 1},
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
|
@ -198,7 +198,7 @@ function farmz.register_plant(name, def)
|
|||
})
|
||||
|
||||
minetest.register_node(seed_name_soil, {
|
||||
description = def.description.." ".."("..S("Seed Soil")..")",
|
||||
description = S(def.description).." ".."("..S("Seed Soil")..")",
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# textdomain: farmz
|
||||
Bread=Pan
|
||||
Flour=Harina
|
||||
Plant=Planta
|
||||
@1 Plant=Planta de @1
|
||||
Plowed Soil=Tierra arada
|
||||
Seed=Semilla
|
||||
@1 Seed=Semilla de @1
|
||||
Seed Soil=Cultivo con semillas
|
||||
Sprout=brote
|
||||
Steel Hoe=Azada de hierro
|
||||
|
|
|
@ -40,6 +40,43 @@ function helper.what_hour(timeofday)
|
|||
end
|
||||
end
|
||||
|
||||
--Air
|
||||
|
||||
function helper.node_is_air(pos, offset)
|
||||
if offset then
|
||||
if offset == "above" then
|
||||
pos = vector.new(pos.x, pos.y+1, pos.z)
|
||||
end
|
||||
end
|
||||
local node = minetest.get_node_or_nil(pos)
|
||||
if node and helper.get_nodedef_field(node.name, "drawtype") == "airlike" then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
--Direction
|
||||
|
||||
function helper.dir_to_compass(dir)
|
||||
local angle = math.round(math.deg(math.atan2(dir.z, dir.x)))
|
||||
local compass_vector, compass_dir
|
||||
if angle >= -45 and angle <= 45 then --East
|
||||
compass_vector = vector.new(1, 0, 0)
|
||||
compass_dir = "east"
|
||||
elseif angle > 45 and angle <= 135 then -- North
|
||||
compass_vector = vector.new(0, 0, 1)
|
||||
compass_dir = "north"
|
||||
elseif angle < -45 and angle >= -135 then -- South
|
||||
compass_vector = vector.new(0, 0, -1)
|
||||
compass_dir = "south"
|
||||
else --West
|
||||
compass_vector = vector.new(-1, 0, 0)
|
||||
compass_dir = "west"
|
||||
end
|
||||
return compass_vector, compass_dir
|
||||
end
|
||||
|
||||
-- Nodeboxes
|
||||
|
||||
helper.nodebox.flat = {
|
||||
|
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.4 KiB |
|
@ -20,6 +20,7 @@ assert(loadfile(modpath .. "/metals.lua"))(S)
|
|||
assert(loadfile(modpath .. "/mese.lua"))(S)
|
||||
assert(loadfile(modpath .. "/lava.lua"))(S)
|
||||
assert(loadfile(modpath .. "/ore.lua"))(S)
|
||||
assert(loadfile(modpath .. "/roofs.lua"))(S, modname)
|
||||
assert(loadfile(modpath .. "/sand.lua"))(S)
|
||||
assert(loadfile(modpath .. "/stone.lua"))(S)
|
||||
assert(loadfile(modpath .. "/water.lua"))(S)
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
local S, modname = ...
|
||||
|
||||
function nodez.register_roof(name, def)
|
||||
minetest.register_node(modname..":"..name.."_slope", {
|
||||
description = def.description.." ".."Slope",
|
||||
drawtype= "mesh",
|
||||
mesh = "nodez_roof_slope.b3d",
|
||||
tiles = def.tiles,
|
||||
use_texture_alpha = true,
|
||||
is_ground_content = false,
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 3, stone = 1},
|
||||
sounds = sound.stone(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node(modname..":"..name.."_corner", {
|
||||
description = def.description.." ".."Corner",
|
||||
drawtype= "mesh",
|
||||
mesh = "nodez_roof_corner.b3d",
|
||||
tiles = def.tiles,
|
||||
use_texture_alpha = true,
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, stone = 1},
|
||||
sounds = sound.stone(),
|
||||
})
|
||||
|
||||
minetest.register_node(modname..":"..name.."_flat", {
|
||||
description = def.description.." ".."Flat",
|
||||
tiles = def.flat_tiles,
|
||||
is_ground_content = false,
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 3, stone = 1},
|
||||
sounds = sound.stone(),
|
||||
})
|
||||
|
||||
end
|
||||
|
||||
nodez.register_roof("red_roof", {
|
||||
description = "Red Roof",
|
||||
tiles = {"nodez_roman_roof.png"},
|
||||
flat_tiles = {"nodez_red_gables.png", "nodez_adobe.png"}
|
||||
})
|
After Width: | Height: | Size: 543 B |
After Width: | Height: | Size: 615 B |
After Width: | Height: | Size: 761 B |
After Width: | Height: | Size: 629 B |