123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- local S = minetest.get_translator("kotatsu_table")
- kotatsu_table = {}
- kotatsu_table.toggle_sitting = function(npos, _, player)
- local meta = minetest.get_meta(npos)
- local tablepos = minetest.string_to_pos(meta:get_string("p"))
- if not tablepos then minetest.remove_node(npos); return end
- local name = player:get_player_name()
- if default.player_attached[name] then
- player:set_pos(vector.add(player:get_pos(), {x=0,y=1,z=0}))
- default.player_attached[name] = false
- player:set_physics_override(1, 1, 1)
- player:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0})
- default.player_set_animation(player, "stand", 30)
- else
- local v = player:get_player_velocity()
- if v.x ~= 0 or v.y ~= 0 or v.z ~= 0 then return end
- local ppos = player:get_pos()
- ppos.x = ppos.x - tablepos.x
- ppos.y = tablepos.y - 0.5
- ppos.z = ppos.z - tablepos.z
- local inside = ppos.x > -1.25 and ppos.x < 1.25 and
- ppos.z > -1.25 and ppos.z < 1.25
- if inside then
- if math.abs(ppos.x) > math.abs(ppos.z) then
- ppos.x = (ppos.x > 0) and 1.25 or -1.25
- else
- ppos.z = (ppos.z > 0) and 1.25 or -1.25
- end
- else
- ppos.x = math.max(-1.25, math.min(1.25, ppos.x))
- ppos.z = math.max(-1.25, math.min(1.25, ppos.z))
- end
- ppos.x = ppos.x + tablepos.x
- ppos.z = ppos.z + tablepos.z
- player:set_pos(ppos)
- player:set_physics_override(0, 0, 0)
- default.player_attached[name] = true
- player:set_eye_offset({x=0, y=-5, z=0}, {x=0, y=0, z=0})
- default.player_set_animation(player, "sit", 30)
- end
- end
- kotatsu_table.tabletop_nodebox = {
- type="fixed",
- fixed = {
- {-0.8,0.25,-0.8,0.8,0.3,0.8},
- }
- }
- kotatsu_table.blanket_nodebox = {
- type="fixed",
- fixed = {
- {0.125,-0.125,0.125,1.875,0.25,1.875},
- {-0.125,-0.375,-0.125,2.125,-0.125,2.125},
- {-0.5,-0.5,-0.5,2.5,-0.375,2.5},
- }
- }
- kotatsu_table.blanket_side_nodebox = {
- type="fixed",
- fixed = {
- {-0.5,-0.125,0.125,0.5,0.25,0.5},
- {-0.5,-0.375,-0.125,0.5,-0.125,0.5},
- {-0.5,-0.5,-0.5,0.5,-0.375,0.5},
- }
- }
- kotatsu_table.blanket_corner_nodebox = {
- type="fixed",
- fixed = {
- {0.125,-0.125,0.125,0.5,0.25,0.5},
- {-0.125,-0.375,-0.125,0.5,-0.125,0.5},
- {-0.5,-0.5,-0.5,0.5,-0.375,0.5},
- }
- }
- kotatsu_table.pos_check = {
- {offset={x=-1,y=0,z=0},ext="_side",param2=1},
- {offset={x=1,y=0,z=0},ext="_side",param2=3},
- {offset={x=0,y=0,z=-1},ext="_side",param2=0},
- {offset={x=0,y=0,z=1},ext="_side",param2=2},
- {offset={x=1,y=0,z=1},ext="_corner",param2=2},
- {offset={x=-1,y=0,z=1},ext="_corner",param2=1},
- {offset={x=1,y=0,z=-1},ext="_corner",param2=3},
- {offset={x=-1,y=0,z=-1},ext="_corner",param2=0}
- }
- kotatsu_table.register_table = function(name, desc, base, tiles, top, top_tiles, inv_image)
- base = base or "wool:white" --Seriously, though, don't omit base...
- tiles = tiles or (minetest.registered_nodes[base] or {tiles={"wool_white.png"}}).tiles
- top = top or "group:wood"
- top_tiles = top_tiles or (minetest.registered_nodes[top] or {tiles={"default_wood.png"}}).tiles
- inv_image = inv_image or "(kotatsu_base.png^[mask:"..tiles[1]..")^(kotatsu_top.png^[mask:"..top_tiles[1]..")"
- local kotatsu = name or ("kotatsu_table:table_"..string.gsub(base, ":", "_"))
- desc = desc or S("@1 Kotatsu Table", (minetest.registered_nodes[base] or {description="Terribly Programmed"}).description or "Very Terribly Programmed")
-
- minetest.register_node(kotatsu.."_side", {
- description = S("@1 (Blanket Side; you hacker, you)", desc),
- paramtype = "light",
- walkable = false,
- drawtype = "nodebox",
- paramtype = "light",
- paramtype2 = "facedir",
- tiles = tiles,
- drop = "",
- node_box = kotatsu_table.blanket_side_nodebox,
- diggable=false,
- on_rightclick = kotatsu_table.toggle_sitting,
- groups={not_in_creative_inventory=1,immovable=2},
- on_blast = function() end,
- })
-
- minetest.register_node(kotatsu.."_corner", {
- description = S("@1 (Blanket Corner; you hacker, you)", desc),
- paramtype = "light",
- walkable = false,
- drawtype = "nodebox",
- paramtype = "light",
- paramtype2 = "facedir",
- tiles = tiles,
- drop = "",
- node_box = kotatsu_table.blanket_corner_nodebox,
- diggable=false,
- on_rightclick = kotatsu_table.toggle_sitting,
- groups={not_in_creative_inventory=1,immovable=2},
- on_blast = function() end,
- })
-
- minetest.register_node(kotatsu, {
- description = desc,
- inventory_image = inv_image,
- wield_image = inv_image,
- drawtype = "nodebox",
- tiles = top_tiles,
- node_box = kotatsu_table.tabletop_nodebox,
- groups={choppy=3,oddly_breakable_by_hand=2,immovable=2},
- on_construct = function(pos)
- local npos
- for _,p in ipairs(kotatsu_table.pos_check) do
- npos = vector.add(p.offset, pos)
- local n = minetest.get_node_or_nil(npos)
- if not n or not (minetest.registered_nodes[n.name] or {}).buildable_to then
- minetest.remove_node(pos)
- minetest.add_item(pos, kotatsu)
- return
- end
- end
- for _,p in ipairs(kotatsu_table.pos_check) do -- Check passed, now build
- npos = vector.add(p.offset, pos)
- minetest.set_node(npos, {name=kotatsu..p.ext,param2=p.param2})
- minetest.after(0, function(np)minetest.get_meta(np):set_string("p", minetest.pos_to_string(pos))end, npos)
- end
- end,
- on_destruct = function(pos)
- local npos
- for _,p in ipairs(kotatsu_table.pos_check) do
- npos = vector.add(p.offset, pos)
- local n = minetest.get_node(npos)
- if n.name == kotatsu..p.ext and n.param2 == p.param2 then
- minetest.remove_node(npos)
- end
- end
- end,
- })
-
- minetest.register_craft({
- output=kotatsu,
- recipe={
- {top,top,top},
- {base,"default:mese_crystal",base},
- {base,"",base},
- },
- })
- end
- kotatsu_table.wool_dyes = {
- {"white", S("White Kotatsu Table")},
- {"grey", S("Grey Kotatsu Table")},
- {"black", S("Black Kotatsu Table")},
- {"red", S("Red Kotatsu Table")},
- {"yellow", S("Yellow Kotatsu Table")},
- {"green", S("Green Kotatsu Table")},
- {"cyan", S("Cyan Kotatsu Table")},
- {"blue", S("Blue Kotatsu Table")},
- {"magenta", S("Magenta Kotatsu Table")},
- {"orange", S("Orange Kotatsu Table")},
- {"violet", S("Violet Kotatsu Table")},
- {"brown", S("Brown Kotatsu Table")},
- {"pink", S("Pink Kotatsu Table")},
- {"dark_grey", S("Dark Grey Kotatsu Table")},
- {"dark_green", S("Dark Green Kotatsu Table")},
- }
- for _,d in pairs(kotatsu_table.wool_dyes) do
- kotatsu_table.register_table(nil, d[2], "wool:"..d[1])
- end
|