Grab Minetest Game 0.4.15 stairs mod

This commit is contained in:
Wuzzy 2017-01-16 12:46:51 +01:00
parent 495303a520
commit 3b8b24ab5f
4 changed files with 373 additions and 191 deletions

View file

@ -1,26 +1,16 @@
Minetest 0.4 mod: stairs Minetest Game mod: stairs
========================= =========================
See license.txt for license information.
License of source code: Authors of source code
----------------------- ----------------------
Copyright (C) 2011-2012 Kahrl <kahrl@gmx.net> Originally by Kahrl <kahrl@gmx.net> (LGPL 2.1) and
Copyright (C) 2011-2012 celeron55, Perttu Ahola <celeron55@gmail.com> celeron55, Perttu Ahola <celeron55@gmail.com> (LGPL 2.1)
Various Minetest developers and contributors (LGPL 2.1)
This program is free software; you can redistribute it and/or modify Authors of media (models)
it under the terms of the GNU Lesser General Public License as published by -------------------------
the Free Software Foundation; either version 2 of the License, or Jean-Patrick G. (kilbith) <jeanpatrick.guerrero@gmail.com> (CC BY-SA 3.0):
(at your option) any later version. stairs_stair.obj
http://www.gnu.org/licenses/lgpl-2.1.html
License of media (sounds)
--------------------------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
http://creativecommons.org/licenses/by-sa/3.0/
Authors of media files
-----------------------
Everything not listed in here:
Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com>

View file

@ -1,20 +1,40 @@
-- Minetest 0.4 mod: stairs -- Minetest 0.4 mod: stairs
-- See README.txt for licensing and other information. -- See README.txt for licensing and other information.
local init = os.clock()
-- Global namespace for functions
stairs = {} stairs = {}
-- Get setting for replace ABM
local replace = minetest.setting_getbool("enable_stairs_replace_abm")
-- Register stairs.
-- Node will be called stairs:stair_<subname> -- Node will be called stairs:stair_<subname>
function stairs.register_stair(subname, recipeitem, groups, images, description, sounds) function stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
groups.stair = 1
minetest.register_node(":stairs:stair_" .. subname, { minetest.register_node(":stairs:stair_" .. subname, {
description = description, description = description,
drawtype = "nodebox", drawtype = "mesh",
mesh = "stairs_stair.obj",
tiles = images, tiles = images,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
groups = groups, groups = groups,
sounds = sounds, sounds = sounds,
node_box = { 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},
},
},
collision_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-0.5, -0.5, -0.5, 0.5, 0, 0.5}, {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
@ -25,98 +45,95 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
if pointed_thing.type ~= "node" then if pointed_thing.type ~= "node" then
return itemstack return itemstack
end end
local p0 = pointed_thing.under local p0 = pointed_thing.under
local p1 = pointed_thing.above local p1 = pointed_thing.above
if p0.y-1 == p1.y then local param2 = 0
local fakestack = ItemStack("stairs:stair_" .. subname.."upside_down")
local ret = minetest.item_place(fakestack, placer, pointed_thing) local placer_pos = placer:getpos()
if ret:is_empty() then if placer_pos then
itemstack:take_item() local dir = {
return itemstack x = p1.x - placer_pos.x,
y = p1.y - placer_pos.y,
z = p1.z - placer_pos.z
}
param2 = minetest.dir_to_facedir(dir)
end
if p0.y - 1 == p1.y then
param2 = param2 + 20
if param2 == 21 then
param2 = 23
elseif param2 == 23 then
param2 = 21
end end
end end
local futurpos = pointed_thing.under
local frontstair = {x=futurpos.x-1, y=futurpos.y+1, z=futurpos.z} return minetest.item_place(itemstack, placer, pointed_thing, param2)
local leftstair = {x=futurpos.x, y=futurpos.y+1, z=futurpos.z+1}
print( minetest.get_node(frontstair).name)
if minetest.get_node(frontstair).name == "stairs:stair_"..subname.."" and minetest.get_node(leftstair).name == "stairs:stair_"..subname.."" then
local fakestack = ItemStack("stairs:stair_" .. subname.."_corner_1")
local ret = minetest.item_place(fakestack, placer, pointed_thing)
if ret:is_empty() then
itemstack:take_item()
return itemstack
end
end
-- Otherwise place regularly
return minetest.item_place(itemstack, placer, pointed_thing)
end, end,
}) })
minetest.register_node(":stairs:stair_" .. subname.."upside_down", { -- for replace ABM
drop = "stairs:stair_" .. subname, if replace then
drawtype = "nodebox", minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
tiles = images, replace_name = "stairs:stair_" .. subname,
paramtype = "light", groups = {slabs_replace = 1},
paramtype2 = "facedir", })
is_ground_content = false, end
groups = groups,
sounds = sounds, if recipeitem then
node_box = { minetest.register_craft({
type = "fixed", output = 'stairs:stair_' .. subname .. ' 8',
fixed = { recipe = {
{-0.5, 0, -0.5, 0.5, 0.5, 0.5}, {recipeitem, "", ""},
{-0.5, -0.5, 0, 0.5, 0, 0.5}, {recipeitem, recipeitem, ""},
{recipeitem, recipeitem, recipeitem},
}, },
}, })
})
minetest.register_node(":stairs:stair_" .. subname.."_corner_1", { -- Flipped recipe for the silly minecrafters
drop = "stairs:stair_" .. subname, minetest.register_craft({
drawtype = "nodebox", output = 'stairs:stair_' .. subname .. ' 8',
tiles = images, recipe = {
paramtype = "light", {"", "", recipeitem},
paramtype2 = "facedir", {"", recipeitem, recipeitem},
is_ground_content = false, {recipeitem, recipeitem, recipeitem},
groups = groups,
sounds = sounds,
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
{-0.5, -0, -0, 0, 0.5, 0.5},
}, },
}, })
})
minetest.register_craft({ -- Fuel
output = 'stairs:stair_' .. subname .. ' 4', local baseburntime = minetest.get_craft_result({
recipe = { method = "fuel",
{recipeitem, "", ""}, width = 1,
{recipeitem, recipeitem, ""}, items = {recipeitem}
{recipeitem, recipeitem, recipeitem}, }).time
}, if baseburntime > 0 then
}) minetest.register_craft({
type = "fuel",
-- Flipped recipe for the silly minecrafters recipe = 'stairs:stair_' .. subname,
minetest.register_craft({ burntime = math.floor(baseburntime * 0.75),
output = 'stairs:stair_' .. subname .. ' 4', })
recipe = { end
{"", "", recipeitem}, end
{"", recipeitem, recipeitem},
{recipeitem, recipeitem, recipeitem},
},
})
end end
-- Slab facedir to placement 6d matching table
local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
-- Slab facedir when placing initial slab against other surface
local slab_trans_dir_place = {[0] = 0, 20, 12, 16, 4, 8}
-- Register slabs.
-- Node will be called stairs:slab_<subname> -- Node will be called stairs:slab_<subname>
function stairs.register_slab(subname, recipeitem, groups, images, description, sounds) function stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
groups.slab = 1
minetest.register_node(":stairs:slab_" .. subname, { minetest.register_node(":stairs:slab_" .. subname, {
description = description, description = description,
drawtype = "nodebox", drawtype = "nodebox",
tiles = images, tiles = images,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
groups = groups, groups = groups,
sounds = sounds, sounds = sounds,
@ -125,116 +142,130 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
}, },
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then local under = minetest.get_node(pointed_thing.under)
return itemstack local wield_item = itemstack:get_name()
end
-- If it's being placed on an another similar one, replace it with if under and wield_item == under.name then
-- a full block -- place slab using under node orientation
local slabpos = nil local dir = minetest.dir_to_facedir(vector.subtract(
local slabnode = nil pointed_thing.above, pointed_thing.under), true)
local p0 = pointed_thing.under
local p1 = pointed_thing.above local p2 = under.param2
local n0 = minetest.get_node(p0)
if n0.name == "stairs:slab_" .. subname and -- combine two slabs if possible
p0.y+1 == p1.y then if slab_trans_dir[math.floor(p2 / 4)] == dir then
slabpos = p0 if not recipeitem then
slabnode = n0 return itemstack
end end
if slabpos then local player_name = placer:get_player_name()
-- Remove the slab at slabpos if minetest.is_protected(pointed_thing.under, player_name) and not
minetest.remove_node(slabpos) minetest.check_player_privs(placer, "protection_bypass") then
-- Make a fake stack of a single item and try to place it minetest.record_protection_violation(pointed_thing.under,
local fakestack = ItemStack(recipeitem) player_name)
pointed_thing.above = slabpos return
fakestack = minetest.item_place(fakestack, placer, pointed_thing) end
-- If the item was taken from the fake stack, decrement original minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2})
if not fakestack or fakestack:is_empty() then if not minetest.setting_getbool("creative_mode") then
itemstack:take_item(1) itemstack:take_item()
-- Else put old node back
else
minetest.set_node(slabpos, slabnode)
end
return itemstack
end
-- Upside down slabs
if p0.y-1 == p1.y then
-- Turn into full block if pointing at a existing slab
if n0.name == "stairs:slab_" .. subname.."upside_down" then
-- Remove the slab at the position of the slab
minetest.remove_node(p0)
-- Make a fake stack of a single item and try to place it
local fakestack = ItemStack(recipeitem)
pointed_thing.above = p0
fakestack = minetest.item_place(fakestack, placer, pointed_thing)
-- If the item was taken from the fake stack, decrement original
if not fakestack or fakestack:is_empty() then
itemstack:take_item(1)
-- Else put old node back
else
minetest.set_node(p0, n0)
end end
return itemstack return itemstack
end end
-- Place upside down slab -- Placing a slab on an upside down slab should make it right-side up.
local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down") if p2 >= 20 and dir == 8 then
local ret = minetest.item_place(fakestack, placer, pointed_thing) p2 = p2 - 20
if ret:is_empty() then -- same for the opposite case: slab below normal slab
itemstack:take_item() elseif p2 <= 3 and dir == 4 then
return itemstack p2 = p2 + 20
end end
end
-- else attempt to place node with proper param2
-- If pointing at the side of a upside down slab minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
if n0.name == "stairs:slab_" .. subname.."upside_down" and if not minetest.setting_getbool("creative_mode") then
p0.y+1 ~= p1.y then
-- Place upside down slab
local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down")
local ret = minetest.item_place(fakestack, placer, pointed_thing)
if ret:is_empty() then
itemstack:take_item() itemstack:take_item()
return itemstack
end end
return itemstack
else
-- place slab using look direction of player
local dir = minetest.dir_to_wallmounted(vector.subtract(
pointed_thing.above, pointed_thing.under), true)
local rot = slab_trans_dir_place[dir]
if rot == 0 or rot == 20 then
rot = rot + minetest.dir_to_facedir(placer:get_look_dir())
end
return minetest.item_place(itemstack, placer, pointed_thing, rot)
end end
-- Otherwise place regularly
return minetest.item_place(itemstack, placer, pointed_thing)
end, end,
}) })
minetest.register_node(":stairs:slab_" .. subname.."upside_down", {
drop = "stairs:slab_"..subname,
drawtype = "nodebox",
tiles = images,
paramtype = "light",
stack_max = 64,
paramtype2 = "facedir",
on_place = minetest.rotate_node,
is_ground_content = false,
groups = groups,
sounds = sounds,
node_box = {
type = "fixed",
fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5},
},
})
minetest.register_craft({ -- for replace ABM
output = 'stairs:slab_' .. subname .. ' 6', if replace then
recipe = { minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
{recipeitem, recipeitem, recipeitem}, replace_name = "stairs:slab_".. subname,
}, groups = {slabs_replace = 1},
})
end
if recipeitem then
minetest.register_craft({
output = 'stairs:slab_' .. subname .. ' 6',
recipe = {
{recipeitem, recipeitem, recipeitem},
},
})
-- Fuel
local baseburntime = minetest.get_craft_result({
method = "fuel",
width = 1,
items = {recipeitem}
}).time
if baseburntime > 0 then
minetest.register_craft({
type = "fuel",
recipe = 'stairs:slab_' .. subname,
burntime = math.floor(baseburntime * 0.5),
})
end
end
end
-- Optionally replace old "upside_down" nodes with new param2 versions.
-- Disabled by default.
if replace then
minetest.register_abm({
label = "Slab replace",
nodenames = {"group:slabs_replace"},
interval = 16,
chance = 1,
action = function(pos, node)
node.name = minetest.registered_nodes[node.name].replace_name
node.param2 = node.param2 + 20
if node.param2 == 21 then
node.param2 = 23
elseif node.param2 == 23 then
node.param2 = 21
end
minetest.set_node(pos, node)
end,
}) })
end end
-- Stair/slab registration function.
-- Nodes will be called stairs:{stair,slab}_<subname> -- Nodes will be called stairs:{stair,slab}_<subname>
function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)
function stairs.register_stair_and_slab(subname, recipeitem,
groups, images, desc_stair, desc_slab, sounds)
stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds) stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)
stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds) stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds)
end end
stairs.register_stair("wood", "default:wood", stairs.register_stair("wood", "default:wood",
{snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood_stairs=1}, {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood_stairs=1},
{"default_wood.png"}, {"default_wood.png"},
@ -404,6 +435,3 @@ minetest.register_craft({
recipe = "group:wood_slab", recipe = "group:wood_slab",
burntime = 15, burntime = 15,
}) })
local time_to_load= os.clock() - init
print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load))

51
mods/stairs/license.txt Normal file
View file

@ -0,0 +1,51 @@
License of source code
----------------------
GNU Lesser General Public License, version 2.1
Copyright (C) 2011-2016 Kahrl <kahrl@gmx.net>
Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55@gmail.com>
Copyright (C) 2012-2016 Various Minetest developers and contributors
This program is free software; you can redistribute it and/or modify it under the terms
of the GNU Lesser General Public License as published by the Free Software Foundation;
either version 2.1 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details:
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
Licenses of media (models)
--------------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) <jeanpatrick.guerrero@gmail.com>
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,113 @@
# Blender v2.72 (sub 0) OBJ File: ''
# www.blender.org
mtllib stairs.mtl
o stairs_top
v -0.500000 0.000000 -0.500000
v -0.500000 0.000000 0.000000
v 0.500000 0.000000 0.000000
v 0.500000 0.000000 -0.500000
v -0.500000 0.500000 0.000000
v 0.500000 0.500000 0.000000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 0.500000
vt 0.000000 0.500000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.000000 1.000000 0.000000
g stairs_top
usemtl None
s off
f 4/1/1 1/2/1 2/3/1 3/4/1
f 7/5/1 8/6/1 6/4/1 5/3/1
o stairs_bottom
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vn 0.000000 -1.000000 -0.000000
g stairs_bottom
usemtl None
s off
f 11/7/2 9/8/2 10/9/2 12/10/2
o stairs_right
v -0.500000 0.000000 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.000000 0.000000
v -0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.000000
v -0.500000 0.500000 0.500000
vt 0.000000 0.500000
vt 0.000000 0.000000
vt 0.500000 0.500000
vt 1.000000 1.000000
vt 0.500000 1.000000
vt 1.000000 0.000000
vn -1.000000 0.000000 0.000000
g stairs_right
usemtl None
s off
f 13/11/3 14/12/3 15/13/3
f 15/13/3 18/14/3 17/15/3
f 14/12/3 16/16/3 18/14/3
o stairs_left
v 0.500000 0.000000 0.000000
v 0.500000 -0.500000 -0.500000
v 0.500000 0.000000 -0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.000000
v 0.500000 0.500000 0.500000
vt 0.500000 0.500000
vt 1.000000 0.000000
vt 1.000000 0.500000
vt 0.500000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vn 1.000000 0.000000 0.000000
g stairs_left
usemtl None
s off
f 19/17/4 20/18/4 21/19/4
f 19/17/4 23/20/4 24/21/4
f 20/18/4 24/21/4 22/22/4
o stairs_back
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vn 0.000000 -0.000000 1.000000
g stairs_back
usemtl None
s off
f 26/23/5 28/24/5 27/25/5 25/26/5
o stairs_front
v -0.500000 0.000000 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.000000 0.000000
v 0.500000 0.000000 0.000000
v 0.500000 -0.500000 -0.500000
v 0.500000 0.000000 -0.500000
v -0.500000 0.500000 0.000000
v 0.500000 0.500000 0.000000
vt 1.000000 0.000000
vt 1.000000 0.500000
vt 0.000000 0.500000
vt 0.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.000000 0.000000 -1.000000
g stairs_front
usemtl None
s off
f 30/27/6 29/28/6 34/29/6 33/30/6
f 31/28/6 35/31/6 36/32/6 32/29/6