merge upstream / solve conflicts
commit
2f0de6f8a3
|
@ -8,5 +8,8 @@ read_globals = {
|
||||||
"stairs", "doors", "xpanes",
|
"stairs", "doors", "xpanes",
|
||||||
"xdecor", "xbg",
|
"xdecor", "xbg",
|
||||||
table = {fields = {"copy"}},
|
table = {fields = {"copy"}},
|
||||||
|
string = {fields = {"split"}},
|
||||||
"unpack",
|
"unpack",
|
||||||
|
"stairsplus",
|
||||||
|
"mesecon"
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,3 +9,4 @@ xpanes
|
||||||
fire?
|
fire?
|
||||||
oresplus?
|
oresplus?
|
||||||
moreblocks?
|
moreblocks?
|
||||||
|
mesecons_doors?
|
||||||
|
|
|
@ -19,24 +19,29 @@ function xdecor.sit(pos, node, clicker, pointed_thing)
|
||||||
if default.player_attached[player_name] then
|
if default.player_attached[player_name] then
|
||||||
pos.y = pos.y - 0.5
|
pos.y = pos.y - 0.5
|
||||||
clicker:setpos(pos)
|
clicker:setpos(pos)
|
||||||
clicker:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0})
|
clicker:set_eye_offset(vector.new(), vector.new())
|
||||||
clicker:set_physics_override(1, 1, 1)
|
clicker:set_physics_override({speed = 1, jump = 1, gravity = 1})
|
||||||
default.player_attached[player_name] = false
|
default.player_attached[player_name] = false
|
||||||
default.player_set_animation(clicker, "stand", 30)
|
default.player_set_animation(clicker, "stand", 30)
|
||||||
|
|
||||||
elseif not default.player_attached[player_name] and node.param2 <= 3 and
|
elseif not default.player_attached[player_name] and node.param2 <= 3 and
|
||||||
not ctrl.sneak and vector.equals(vel, {x=0,y=0,z=0}) then
|
not ctrl.sneak and vector.equals(vel, vector.new()) then
|
||||||
|
|
||||||
clicker:set_eye_offset({x=0, y=-7, z=2}, {x=0, y=0, z=0})
|
clicker:set_eye_offset({x = 0, y = -7, z = 2}, vector.new())
|
||||||
clicker:set_physics_override(0, 0, 0)
|
clicker:set_physics_override({speed = 0, jump = 0, gravity = 1})
|
||||||
clicker:setpos(pos)
|
clicker:setpos(pos)
|
||||||
default.player_attached[player_name] = true
|
default.player_attached[player_name] = true
|
||||||
default.player_set_animation(clicker, "sit", 30)
|
default.player_set_animation(clicker, "sit", 30)
|
||||||
|
|
||||||
if node.param2 == 0 then clicker:set_look_yaw(3.15)
|
if node.param2 == 0 then
|
||||||
elseif node.param2 == 1 then clicker:set_look_yaw(7.9)
|
clicker:set_look_yaw(3.15)
|
||||||
elseif node.param2 == 2 then clicker:set_look_yaw(6.28)
|
elseif node.param2 == 1 then
|
||||||
elseif node.param2 == 3 then clicker:set_look_yaw(4.75) end
|
clicker:set_look_yaw(7.9)
|
||||||
|
elseif node.param2 == 2 then
|
||||||
|
clicker:set_look_yaw(6.28)
|
||||||
|
elseif node.param2 == 3 then
|
||||||
|
clicker:set_look_yaw(4.75)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -47,6 +52,7 @@ function xdecor.sit_dig(pos, digger)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -2,21 +2,31 @@
|
||||||
function xdecor.maxn(T)
|
function xdecor.maxn(T)
|
||||||
local n = 0
|
local n = 0
|
||||||
for k in pairs(T) do
|
for k in pairs(T) do
|
||||||
if k > n then n = k end
|
if k > n then
|
||||||
|
n = k
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return n
|
return n
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Returns the length of an hash table.
|
-- Returns the length of an hash table.
|
||||||
function xdecor.tablelen(T)
|
function xdecor.tablelen(T)
|
||||||
local n = 0
|
local n = 0
|
||||||
for _ in pairs(T) do n = n + 1 end
|
|
||||||
|
for _ in pairs(T) do
|
||||||
|
n = n + 1
|
||||||
|
end
|
||||||
|
|
||||||
return n
|
return n
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons).
|
-- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons).
|
||||||
function xdecor.tablecopy(T)
|
function xdecor.tablecopy(T)
|
||||||
if type(T) ~= "table" then return T end -- No need to copy.
|
if type(T) ~= "table" then
|
||||||
|
return T -- No need to copy.
|
||||||
|
end
|
||||||
|
|
||||||
local new = {}
|
local new = {}
|
||||||
|
|
||||||
for k, v in pairs(T) do
|
for k, v in pairs(T) do
|
||||||
|
@ -26,6 +36,7 @@ function xdecor.tablecopy(T)
|
||||||
new[k] = v
|
new[k] = v
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return new
|
return new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
xdecor.box = {
|
xdecor.box = {
|
||||||
slab_y = function(height, shift)
|
slab_y = function(height, shift)
|
||||||
return {-0.5, -0.5 + (shift or 0), -0.5, 0.5, -0.5 + height +
|
return {
|
||||||
(shift or 0), 0.5}
|
-0.5,
|
||||||
|
-0.5 + (shift or 0),
|
||||||
|
-0.5,
|
||||||
|
0.5,
|
||||||
|
-0.5 + height + (shift or 0),
|
||||||
|
0.5
|
||||||
|
}
|
||||||
end,
|
end,
|
||||||
slab_z = function(depth)
|
slab_z = function(depth)
|
||||||
return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5}
|
return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5}
|
||||||
|
@ -16,12 +22,14 @@ xdecor.box = {
|
||||||
|
|
||||||
xdecor.nodebox = {
|
xdecor.nodebox = {
|
||||||
regular = {type = "regular"},
|
regular = {type = "regular"},
|
||||||
null = {type="fixed", fixed={0,0,0,0,0,0}}
|
null = {
|
||||||
|
type = "fixed", fixed = {0,0,0,0,0,0}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xdecor.pixelbox = function(size, boxes)
|
xdecor.pixelbox = function(size, boxes)
|
||||||
local fixed = {}
|
local fixed = {}
|
||||||
for _, box in pairs(boxes) do
|
for _, box in ipairs(boxes) do
|
||||||
-- `unpack` has been changed to `table.unpack` in newest Lua versions.
|
-- `unpack` has been changed to `table.unpack` in newest Lua versions.
|
||||||
local x, y, z, w, h, l = unpack(box)
|
local x, y, z, w, h, l = unpack(box)
|
||||||
fixed[#fixed + 1] = {
|
fixed[#fixed + 1] = {
|
||||||
|
@ -33,10 +41,12 @@ xdecor.pixelbox = function(size, boxes)
|
||||||
((z + l) / size) - 0.5
|
((z + l) / size) - 0.5
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
return {type = "fixed", fixed = fixed}
|
return {type = "fixed", fixed = fixed}
|
||||||
end
|
end
|
||||||
|
|
||||||
local mt = {}
|
local mt = {}
|
||||||
|
|
||||||
mt.__index = function(table, key)
|
mt.__index = function(table, key)
|
||||||
local ref = xdecor.box[key]
|
local ref = xdecor.box[key]
|
||||||
local ref_type = type(ref)
|
local ref_type = type(ref)
|
||||||
|
@ -55,4 +65,3 @@ mt.__index = function(table, key)
|
||||||
end
|
end
|
||||||
|
|
||||||
setmetatable(xdecor.nodebox, mt)
|
setmetatable(xdecor.nodebox, mt)
|
||||||
|
|
||||||
|
|
|
@ -6,30 +6,30 @@ local default_inventory_formspecs = {
|
||||||
list[context;main;0,0;8,1;]
|
list[context;main;0,0;8,1;]
|
||||||
list[current_player;main;0,2;8,4;]
|
list[current_player;main;0,2;8,4;]
|
||||||
listring[current_player;main]
|
listring[current_player;main]
|
||||||
listring[context;main] ]]
|
listring[context;main] ]] ..
|
||||||
..default.get_hotbar_bg(0,2),
|
default.get_hotbar_bg(0,2),
|
||||||
|
|
||||||
["16"] = [[ size[8,7]
|
["16"] = [[ size[8,7]
|
||||||
list[context;main;0,0;8,2;]
|
list[context;main;0,0;8,2;]
|
||||||
list[current_player;main;0,3;8,4;]
|
list[current_player;main;0,3;8,4;]
|
||||||
listring[current_player;main]
|
listring[current_player;main]
|
||||||
listring[context;main] ]]
|
listring[context;main] ]] ..
|
||||||
..default.get_hotbar_bg(0,3),
|
default.get_hotbar_bg(0,3),
|
||||||
|
|
||||||
["24"] = [[ size[8,8]
|
["24"] = [[ size[8,8]
|
||||||
list[context;main;0,0;8,3;]
|
list[context;main;0,0;8,3;]
|
||||||
list[current_player;main;0,4;8,4;]
|
list[current_player;main;0,4;8,4;]
|
||||||
listring[current_player;main]
|
listring[current_player;main]
|
||||||
listring[context;main]" ]]
|
listring[context;main]" ]] ..
|
||||||
..default.get_hotbar_bg(0,4),
|
default.get_hotbar_bg(0,4),
|
||||||
|
|
||||||
["32"] = [[ size[8,9]
|
["32"] = [[ size[8,9]
|
||||||
list[context;main;0,0.3;8,4;]
|
list[context;main;0,0.3;8,4;]
|
||||||
list[current_player;main;0,4.85;8,1;]
|
list[current_player;main;0,4.85;8,1;]
|
||||||
list[current_player;main;0,6.08;8,3;8]
|
list[current_player;main;0,6.08;8,3;8]
|
||||||
listring[current_player;main]
|
listring[current_player;main]
|
||||||
listring[context;main] ]]
|
listring[context;main] ]] ..
|
||||||
..default.get_hotbar_bg(0,4.85)
|
default.get_hotbar_bg(0,4.85)
|
||||||
}
|
}
|
||||||
|
|
||||||
local function get_formspec_by_size(size)
|
local function get_formspec_by_size(size)
|
||||||
|
@ -42,9 +42,9 @@ local default_can_dig = function(pos)
|
||||||
return inv:is_empty("main")
|
return inv:is_empty("main")
|
||||||
end
|
end
|
||||||
|
|
||||||
function xdecor.register(name, def)
|
|
||||||
local function xdecor_stairs_alternative(nodename, def)
|
local function xdecor_stairs_alternative(nodename, def)
|
||||||
local mod, name = nodename:match("(.*):(.*)")
|
local mod, name = nodename:match("(.*):(.*)")
|
||||||
|
|
||||||
for groupname, value in pairs(def.groups) do
|
for groupname, value in pairs(def.groups) do
|
||||||
if groupname ~= "cracky" and groupname ~= "choppy" and
|
if groupname ~= "cracky" and groupname ~= "choppy" and
|
||||||
groupname ~= "flammable" and groupname ~= "crumbly" and
|
groupname ~= "flammable" and groupname ~= "crumbly" and
|
||||||
|
@ -76,6 +76,7 @@ function xdecor.register(name, def)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function xdecor.register(name, def)
|
||||||
def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox")
|
def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox")
|
||||||
def.sounds = def.sounds or default.node_sound_defaults()
|
def.sounds = def.sounds or default.node_sound_defaults()
|
||||||
|
|
||||||
|
@ -108,11 +109,14 @@ function xdecor.register(name, def)
|
||||||
|
|
||||||
local size = inventory.size or default_inventory_size
|
local size = inventory.size or default_inventory_size
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
|
|
||||||
inv:set_size("main", size)
|
inv:set_size("main", size)
|
||||||
meta:set_string("formspec", (inventory.formspec or
|
meta:set_string("formspec",
|
||||||
get_formspec_by_size(size))..xbg)
|
(inventory.formspec or get_formspec_by_size(size)) .. xbg)
|
||||||
end
|
end
|
||||||
|
|
||||||
def.can_dig = def.can_dig or default_can_dig
|
def.can_dig = def.can_dig or default_can_dig
|
||||||
|
|
||||||
elseif infotext and not def.on_construct then
|
elseif infotext and not def.on_construct then
|
||||||
def.on_construct = function(pos)
|
def.on_construct = function(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
|
|
18
init.lua
18
init.lua
|
@ -1,18 +1,5 @@
|
||||||
--local t = os.clock()
|
--local t = os.clock()
|
||||||
|
|
||||||
local mver_major, mver_minor, mver_patch = 0, 4, 16 -- Minetest 0.4.16 minimum.
|
|
||||||
|
|
||||||
local client_version = minetest.get_version().string
|
|
||||||
local major, minor, patch = client_version:match("(%d+).(%d+).(%d+)")
|
|
||||||
|
|
||||||
if (major and minor and patch) and
|
|
||||||
((tonumber(major) < mver_major) or
|
|
||||||
(mver_major == tonumber(major) and tonumber(minor) < mver_minor) or
|
|
||||||
(mver_minor == tonumber(minor) and tonumber(patch) < mver_patch)) then
|
|
||||||
minetest.log("error", "[xdecor] Your Minetest client is too old to run this mod. Disabling.")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
xdecor = {}
|
xdecor = {}
|
||||||
local modpath = minetest.get_modpath("xdecor")
|
local modpath = minetest.get_modpath("xdecor")
|
||||||
|
|
||||||
|
@ -21,7 +8,6 @@ dofile(modpath.."/handlers/helpers.lua")
|
||||||
dofile(modpath .. "/handlers/nodeboxes.lua")
|
dofile(modpath .. "/handlers/nodeboxes.lua")
|
||||||
dofile(modpath .. "/handlers/registration.lua")
|
dofile(modpath .. "/handlers/registration.lua")
|
||||||
|
|
||||||
dofile(modpath.."/src/alias.lua")
|
|
||||||
dofile(modpath .. "/src/nodes.lua")
|
dofile(modpath .. "/src/nodes.lua")
|
||||||
dofile(modpath .. "/src/recipes.lua")
|
dofile(modpath .. "/src/recipes.lua")
|
||||||
|
|
||||||
|
@ -34,10 +20,10 @@ local subpart = {
|
||||||
"mailbox",
|
"mailbox",
|
||||||
"mechanisms",
|
"mechanisms",
|
||||||
"rope",
|
"rope",
|
||||||
"workbench"
|
"workbench",
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, name in pairs(subpart) do
|
for _, name in ipairs(subpart) do
|
||||||
local enable = minetest.settings:get_bool("enable_xdecor_" .. name)
|
local enable = minetest.settings:get_bool("enable_xdecor_" .. name)
|
||||||
if enable or enable == nil then
|
if enable or enable == nil then
|
||||||
dofile(modpath .. "/src/" .. name .. ".lua")
|
dofile(modpath .. "/src/" .. name .. ".lua")
|
||||||
|
|
693
src/chess.lua
693
src/chess.lua
|
@ -2,9 +2,15 @@ local realchess = {}
|
||||||
screwdriver = screwdriver or {}
|
screwdriver = screwdriver or {}
|
||||||
|
|
||||||
local function index_to_xy(idx)
|
local function index_to_xy(idx)
|
||||||
|
if not idx then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
idx = idx - 1
|
idx = idx - 1
|
||||||
|
|
||||||
local x = idx % 8
|
local x = idx % 8
|
||||||
local y = (idx - x) / 8
|
local y = (idx - x) / 8
|
||||||
|
|
||||||
return x, y
|
return x, y
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -19,14 +25,6 @@ end
|
||||||
local chat_prefix = minetest.colorize("#FFFF00", "[Chess] ")
|
local chat_prefix = minetest.colorize("#FFFF00", "[Chess] ")
|
||||||
local letters = {'A','B','C','D','E','F','G','H'}
|
local letters = {'A','B','C','D','E','F','G','H'}
|
||||||
|
|
||||||
local rowDirs = {-1, -1, -1, 0, 0, 1, 1, 1}
|
|
||||||
local colDirs = {-1, 0, 1, -1, 1, -1, 0, 1}
|
|
||||||
|
|
||||||
local bishopThreats = {true, false, true, false, false, true, false, true}
|
|
||||||
local rookThreats = {false, true, false, true, true, false, true, false}
|
|
||||||
local queenThreats = {true, true, true, true, true, true, true, true}
|
|
||||||
local kingThreats = {true, true, true, true, true, true, true, true}
|
|
||||||
|
|
||||||
local function board_to_table(inv)
|
local function board_to_table(inv)
|
||||||
local t = {}
|
local t = {}
|
||||||
for i = 1, 64 do
|
for i = 1, 64 do
|
||||||
|
@ -36,6 +34,431 @@ local function board_to_table(inv)
|
||||||
return t
|
return t
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local piece_values = {
|
||||||
|
pawn = 10,
|
||||||
|
knight = 30,
|
||||||
|
bishop = 30,
|
||||||
|
rook = 50,
|
||||||
|
queen = 90,
|
||||||
|
king = 900
|
||||||
|
}
|
||||||
|
|
||||||
|
local function get_possible_moves(board, from_idx)
|
||||||
|
local piece, color = board[from_idx]:match(":(%w+)_(%w+)")
|
||||||
|
if not piece then return end
|
||||||
|
local moves = {}
|
||||||
|
local from_x, from_y = index_to_xy(from_idx)
|
||||||
|
|
||||||
|
for i = 1, 64 do
|
||||||
|
local stack_name = board[i]
|
||||||
|
if stack_name:find((color == "black" and "white" or "black")) or
|
||||||
|
stack_name == "" then
|
||||||
|
moves[i] = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for to_idx in pairs(moves) do
|
||||||
|
local pieceTo = board[to_idx]
|
||||||
|
local to_x, to_y = index_to_xy(to_idx)
|
||||||
|
|
||||||
|
-- PAWN
|
||||||
|
if piece == "pawn" then
|
||||||
|
if color == "white" then
|
||||||
|
local pawnWhiteMove = board[xy_to_index(from_x, from_y - 1)]
|
||||||
|
-- white pawns can go up only
|
||||||
|
if from_y - 1 == to_y then
|
||||||
|
if from_x == to_x then
|
||||||
|
if pieceTo ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
elseif from_x - 1 == to_x or from_x + 1 == to_x then
|
||||||
|
if not pieceTo:find("black") then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
elseif from_y - 2 == to_y then
|
||||||
|
if pieceTo ~= "" or from_y < 6 or pawnWhiteMove ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
if x not changed
|
||||||
|
ensure that destination cell is empty
|
||||||
|
elseif x changed one unit left or right
|
||||||
|
ensure the pawn is killing opponent piece
|
||||||
|
else
|
||||||
|
move is not legal - abort
|
||||||
|
]]
|
||||||
|
|
||||||
|
if from_x == to_x then
|
||||||
|
if pieceTo ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
elseif from_x - 1 == to_x or from_x + 1 == to_x then
|
||||||
|
if not pieceTo:find("black") then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif color == "black" then
|
||||||
|
local pawnBlackMove = board[xy_to_index(from_x, from_y + 1)]
|
||||||
|
-- black pawns can go down only
|
||||||
|
if from_y + 1 == to_y then
|
||||||
|
if from_x == to_x then
|
||||||
|
if pieceTo ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
elseif from_x - 1 == to_x or from_x + 1 == to_x then
|
||||||
|
if not pieceTo:find("white") then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
elseif from_y + 2 == to_y then
|
||||||
|
if pieceTo ~= "" or from_y > 1 or pawnBlackMove ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
if x not changed
|
||||||
|
ensure that destination cell is empty
|
||||||
|
elseif x changed one unit left or right
|
||||||
|
ensure the pawn is killing opponent piece
|
||||||
|
else
|
||||||
|
move is not legal - abort
|
||||||
|
]]
|
||||||
|
|
||||||
|
if from_x == to_x then
|
||||||
|
if pieceTo ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
elseif from_x - 1 == to_x or from_x + 1 == to_x then
|
||||||
|
if not pieceTo:find("white") then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ROOK
|
||||||
|
elseif piece == "rook" then
|
||||||
|
if from_x == to_x then
|
||||||
|
-- Moving vertically
|
||||||
|
if from_y < to_y then
|
||||||
|
-- Moving down
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = from_y + 1, to_y - 1 do
|
||||||
|
if board[xy_to_index(from_x, i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Mocing up
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = to_y + 1, from_y - 1 do
|
||||||
|
if board[xy_to_index(from_x, i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif from_y == to_y then
|
||||||
|
-- Mocing horizontally
|
||||||
|
if from_x < to_x then
|
||||||
|
-- mocing right
|
||||||
|
-- ensure that no piece disturbs the way
|
||||||
|
for i = from_x + 1, to_x - 1 do
|
||||||
|
if board[xy_to_index(i, from_y)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Mocing left
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = to_x + 1, from_x - 1 do
|
||||||
|
if board[xy_to_index(i, from_y)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Attempt to move arbitrarily -> abort
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- KNIGHT
|
||||||
|
elseif piece == "knight" then
|
||||||
|
-- Get relative pos
|
||||||
|
local dx = from_x - to_x
|
||||||
|
local dy = from_y - to_y
|
||||||
|
|
||||||
|
-- Get absolute values
|
||||||
|
if dx < 0 then
|
||||||
|
dx = -dx
|
||||||
|
end
|
||||||
|
|
||||||
|
if dy < 0 then
|
||||||
|
dy = -dy
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Sort x and y
|
||||||
|
if dx > dy then
|
||||||
|
dx, dy = dy, dx
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Ensure that dx == 1 and dy == 2
|
||||||
|
if dx ~= 1 or dy ~= 2 then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
-- Just ensure that destination cell does not contain friend piece
|
||||||
|
-- ^ It was done already thus everything ok
|
||||||
|
|
||||||
|
-- BISHOP
|
||||||
|
elseif piece == "bishop" then
|
||||||
|
-- Get relative pos
|
||||||
|
local dx = from_x - to_x
|
||||||
|
local dy = from_y - to_y
|
||||||
|
|
||||||
|
-- Get absolute values
|
||||||
|
if dx < 0 then
|
||||||
|
dx = -dx
|
||||||
|
end
|
||||||
|
|
||||||
|
if dy < 0 then
|
||||||
|
dy = -dy
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Ensure dx and dy are equal
|
||||||
|
if dx ~= dy then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if from_x < to_x then
|
||||||
|
if from_y < to_y then
|
||||||
|
-- Moving right-down
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x + i, from_y + i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Moving right-up
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x + i, from_y - i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if from_y < to_y then
|
||||||
|
-- Moving left-down
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x - i, from_y + i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Moving left-up
|
||||||
|
-- ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x - i, from_y - i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- QUEEN
|
||||||
|
elseif piece == "queen" then
|
||||||
|
local dx = from_x - to_x
|
||||||
|
local dy = from_y - to_y
|
||||||
|
|
||||||
|
-- Get absolute values
|
||||||
|
if dx < 0 then
|
||||||
|
dx = -dx
|
||||||
|
end
|
||||||
|
|
||||||
|
if dy < 0 then
|
||||||
|
dy = -dy
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Ensure valid relative move
|
||||||
|
if dx ~= 0 and dy ~= 0 and dx ~= dy then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if from_x == to_x then
|
||||||
|
-- Moving vertically
|
||||||
|
if from_y < to_y then
|
||||||
|
-- Moving down
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = from_y + 1, to_y - 1 do
|
||||||
|
if board[xy_to_index(from_x, i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Mocing up
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = to_y + 1, from_y - 1 do
|
||||||
|
if board[xy_to_index(from_x, i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif from_x < to_x then
|
||||||
|
if from_y == to_y then
|
||||||
|
-- Goes right
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x + i, from_y)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif from_y < to_y then
|
||||||
|
-- Goes right-down
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x + i, from_y + i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Goes right-up
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x + i, from_y - i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if from_y == to_y then
|
||||||
|
-- Mocing horizontally
|
||||||
|
if from_x < to_x then
|
||||||
|
-- mocing right
|
||||||
|
-- ensure that no piece disturbs the way
|
||||||
|
for i = from_x + 1, to_x - 1 do
|
||||||
|
if board[xy_to_index(i, from_y)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Mocing left
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = to_x + 1, from_x - 1 do
|
||||||
|
if board[xy_to_index(i, from_y)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif from_y < to_y then
|
||||||
|
-- Goes left-down
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x - i, from_y + i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Goes left-up
|
||||||
|
-- Ensure that no piece disturbs the way
|
||||||
|
for i = 1, dx - 1 do
|
||||||
|
if board[xy_to_index(from_x - i, from_y - i)] ~= "" then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- KING
|
||||||
|
elseif piece == "king" then
|
||||||
|
local dx = from_x - to_x
|
||||||
|
local dy = from_y - to_y
|
||||||
|
|
||||||
|
if dx < 0 then
|
||||||
|
dx = -dx
|
||||||
|
end
|
||||||
|
|
||||||
|
if dy < 0 then
|
||||||
|
dy = -dy
|
||||||
|
end
|
||||||
|
|
||||||
|
if dx > 1 or dy > 1 then
|
||||||
|
moves[to_idx] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not next(moves) then return end
|
||||||
|
|
||||||
|
for i in pairs(moves) do
|
||||||
|
local stack_name = board[tonumber(i)]
|
||||||
|
if stack_name ~= "" then
|
||||||
|
for p, value in pairs(piece_values) do
|
||||||
|
if stack_name:find(p) then
|
||||||
|
moves[i] = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return moves
|
||||||
|
end
|
||||||
|
|
||||||
|
local function best_move(moves)
|
||||||
|
local value, choices = 0, {}
|
||||||
|
|
||||||
|
for from, _ in pairs(moves) do
|
||||||
|
for to, val in pairs(_) do
|
||||||
|
if val > value then
|
||||||
|
value = val
|
||||||
|
choices = {{
|
||||||
|
from = from,
|
||||||
|
to = to
|
||||||
|
}}
|
||||||
|
elseif val == value then
|
||||||
|
choices[#choices + 1] = {
|
||||||
|
from = from,
|
||||||
|
to = to
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local random = math.random(1, #choices)
|
||||||
|
local choice_from, choice_to = choices[random].from, choices[random].to
|
||||||
|
|
||||||
|
return tonumber(choice_from), choice_to
|
||||||
|
end
|
||||||
|
|
||||||
|
local rowDirs = {-1, -1, -1, 0, 0, 1, 1, 1}
|
||||||
|
local colDirs = {-1, 0, 1, -1, 1, -1, 0, 1}
|
||||||
|
|
||||||
|
local rowDirsKnight = { 2, 1, 2, 1, -2, -1, -2, -1}
|
||||||
|
local colDirsKnight = {-1, -2, 1, 2, 1, 2, -1, -2}
|
||||||
|
|
||||||
|
local bishopThreats = {true, false, true, false, false, true, false, true}
|
||||||
|
local rookThreats = {false, true, false, true, true, false, true, false}
|
||||||
|
local queenThreats = {true, true, true, true, true, true, true, true}
|
||||||
|
local kingThreats = {true, true, true, true, true, true, true, true}
|
||||||
|
|
||||||
local function attacked(color, idx, board)
|
local function attacked(color, idx, board)
|
||||||
local threatDetected = false
|
local threatDetected = false
|
||||||
local kill = color == "white"
|
local kill = color == "white"
|
||||||
|
@ -78,6 +501,21 @@ local function attacked(color, idx, board)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local colK, rowK = index_to_xy(idx)
|
||||||
|
colK, rowK = colK + 1, rowK + 1
|
||||||
|
rowK = rowK + rowDirsKnight[dir]
|
||||||
|
colK = colK + colDirsKnight[dir]
|
||||||
|
|
||||||
|
if rowK >= 1 and rowK <= 8 and colK >= 1 and colK <= 8 then
|
||||||
|
local square = get_square(rowK, colK)
|
||||||
|
local square_name = board[square]
|
||||||
|
local piece, pieceColor = square_name:match(":(%w+)_(%w+)")
|
||||||
|
|
||||||
|
if piece and pieceColor ~= color and piece == "knight" then
|
||||||
|
threatDetected = true
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -147,6 +585,14 @@ for i = 1, #pieces do
|
||||||
end
|
end
|
||||||
pieces_str = pieces_str .. "69=mailbox_blank16.png"
|
pieces_str = pieces_str .. "69=mailbox_blank16.png"
|
||||||
|
|
||||||
|
local fs_init = [[
|
||||||
|
size[4,1.2;]
|
||||||
|
no_prepend[]
|
||||||
|
label[0,0;Select a mode:]
|
||||||
|
button[0,0.5;2,1;single;Singleplayer]
|
||||||
|
button[2,0.5;2,1;multi;Multiplayer]
|
||||||
|
]]
|
||||||
|
|
||||||
local fs = [[
|
local fs = [[
|
||||||
size[14.7,10;]
|
size[14.7,10;]
|
||||||
no_prepend[]
|
no_prepend[]
|
||||||
|
@ -159,7 +605,34 @@ local fs = [[
|
||||||
]] .. "tablecolumns[image," .. pieces_str ..
|
]] .. "tablecolumns[image," .. pieces_str ..
|
||||||
";text;color;text;color;text;image," .. pieces_str .. "]"
|
";text;color;text;color;text;image," .. pieces_str .. "]"
|
||||||
|
|
||||||
local function get_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_x, to_x, from_y, to_y)
|
local function update_formspec(meta)
|
||||||
|
local black_king_attacked = meta:get_string("blackAttacked") == "true"
|
||||||
|
local white_king_attacked = meta:get_string("whiteAttacked") == "true"
|
||||||
|
|
||||||
|
local playerWhite = meta:get_string("playerWhite")
|
||||||
|
local playerBlack = meta:get_string("playerBlack")
|
||||||
|
|
||||||
|
local moves = meta:get_string("moves")
|
||||||
|
local eaten_img = meta:get_string("eaten_img")
|
||||||
|
local lastMove = meta:get_string("lastMove")
|
||||||
|
local turnBlack = minetest.colorize("#000001", (lastMove == "white" and playerBlack ~= "") and
|
||||||
|
playerBlack .. "..." or playerBlack)
|
||||||
|
local turnWhite = minetest.colorize("#000001", (lastMove == "black" and playerWhite ~= "") and
|
||||||
|
playerWhite .. "..." or playerWhite)
|
||||||
|
local check_s = minetest.colorize("#FF0000", "\\[check\\]")
|
||||||
|
|
||||||
|
local formspec = fs ..
|
||||||
|
"label[1.9,0.3;" .. turnBlack .. (black_king_attacked and " " .. check_s or "") .. "]" ..
|
||||||
|
"label[1.9,9.15;" .. turnWhite .. (white_king_attacked and " " .. check_s or "") .. "]" ..
|
||||||
|
"table[8.9,1.05;5.07,3.75;moves;" .. moves:sub(1,-2) .. ";1]" ..
|
||||||
|
eaten_img
|
||||||
|
|
||||||
|
meta:set_string("formspec", formspec)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_idx, to_idx)
|
||||||
|
local from_x, from_y = index_to_xy(from_idx)
|
||||||
|
local to_x, to_y = index_to_xy(to_idx)
|
||||||
local moves = meta:get_string("moves")
|
local moves = meta:get_string("moves")
|
||||||
local pieceFrom_s = pieceFrom:match(":(%w+_%w+)")
|
local pieceFrom_s = pieceFrom:match(":(%w+_%w+)")
|
||||||
local pieceFrom_si_id = pieces_str:match("(%d+)=" .. pieceFrom_s)
|
local pieceFrom_si_id = pieces_str:match("(%d+)=" .. pieceFrom_s)
|
||||||
|
@ -202,7 +675,7 @@ local function get_eaten_list(meta, pieceTo, pieceTo_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
eaten_img = eaten_img ..
|
eaten_img = eaten_img ..
|
||||||
"image[" .. ((X + (is_white and 11.7 or 8.8)) - (X * 0.45)) .. "," ..
|
"image[" .. ((X + (is_white and 11.67 or 8.8)) - (X * 0.45)) .. "," ..
|
||||||
((Y + 5.56) - (Y * 0.2)) .. ";1,1;" .. eaten_t[i] .. ".png]"
|
((Y + 5.56) - (Y * 0.2)) .. ";1,1;" .. eaten_t[i] .. ".png]"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -213,7 +686,7 @@ function realchess.init(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
|
|
||||||
meta:set_string("formspec", fs)
|
meta:set_string("formspec", fs_init)
|
||||||
meta:set_string("infotext", "Chess Board")
|
meta:set_string("infotext", "Chess Board")
|
||||||
meta:set_string("playerBlack", "")
|
meta:set_string("playerBlack", "")
|
||||||
meta:set_string("playerWhite", "")
|
meta:set_string("playerWhite", "")
|
||||||
|
@ -229,6 +702,7 @@ function realchess.init(pos)
|
||||||
|
|
||||||
meta:set_string("moves", "")
|
meta:set_string("moves", "")
|
||||||
meta:set_string("eaten", "")
|
meta:set_string("eaten", "")
|
||||||
|
meta:set_string("mode", "")
|
||||||
|
|
||||||
inv:set_list("board", pieces)
|
inv:set_list("board", pieces)
|
||||||
inv:set_size("board", 64)
|
inv:set_size("board", 64)
|
||||||
|
@ -483,7 +957,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Moving right-down
|
-- Moving right-down
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x + i, from_y + i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x + i, from_y + i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -491,7 +966,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Moving right-up
|
-- Moving right-up
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x + i, from_y - i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x + i, from_y - i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -501,7 +977,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Moving left-down
|
-- Moving left-down
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x - i, from_y + i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x - i, from_y + i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -509,7 +986,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Moving left-up
|
-- Moving left-up
|
||||||
-- ensure that no piece disturbs the way
|
-- ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x - i, from_y - i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x - i, from_y - i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -535,7 +1013,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Goes down
|
-- Goes down
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x, from_y + i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x, from_y + i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -543,7 +1022,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Goes up
|
-- Goes up
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x, from_y - i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x, from_y - i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -553,7 +1033,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Goes right
|
-- Goes right
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x + i, from_y)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x + i, from_y)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -561,7 +1042,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Goes right-down
|
-- Goes right-down
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x + i, from_y + i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x + i, from_y + i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -569,7 +1051,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Goes right-up
|
-- Goes right-up
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x + i, from_y - i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x + i, from_y - i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -579,7 +1062,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Goes left
|
-- Goes left
|
||||||
-- Ensure that no piece disturbs the way and destination cell does
|
-- Ensure that no piece disturbs the way and destination cell does
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x - i, from_y)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x - i, from_y)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -587,7 +1071,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Goes left-down
|
-- Goes left-down
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x - i, from_y + i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x - i, from_y + i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -595,7 +1080,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
-- Goes left-up
|
-- Goes left-up
|
||||||
-- Ensure that no piece disturbs the way
|
-- Ensure that no piece disturbs the way
|
||||||
for i = 1, dx - 1 do
|
for i = 1, dx - 1 do
|
||||||
if inv:get_stack(from_list, xy_to_index(from_x - i, from_y - i)):get_name() ~= "" then
|
if inv:get_stack(
|
||||||
|
from_list, xy_to_index(from_x - i, from_y - i)):get_name() ~= "" then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -620,6 +1106,7 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
inv:set_stack(from_list, 57, "")
|
inv:set_stack(from_list, 57, "")
|
||||||
inv:set_stack(from_list, 59, "realchess:rook_white_1")
|
inv:set_stack(from_list, 59, "realchess:rook_white_1")
|
||||||
check = false
|
check = false
|
||||||
|
@ -634,6 +1121,7 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
inv:set_stack(from_list, 62, "realchess:rook_white_2")
|
inv:set_stack(from_list, 62, "realchess:rook_white_2")
|
||||||
inv:set_stack(from_list, 64, "")
|
inv:set_stack(from_list, 64, "")
|
||||||
check = false
|
check = false
|
||||||
|
@ -705,11 +1193,15 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
board[from_index] = ""
|
board[from_index] = ""
|
||||||
|
|
||||||
local black_king_idx, white_king_idx = locate_kings(board)
|
local black_king_idx, white_king_idx = locate_kings(board)
|
||||||
|
if not black_king_idx or not white_king_idx then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
local blackAttacked = attacked("black", black_king_idx, board)
|
local blackAttacked = attacked("black", black_king_idx, board)
|
||||||
local whiteAttacked = attacked("white", white_king_idx, board)
|
local whiteAttacked = attacked("white", white_king_idx, board)
|
||||||
|
|
||||||
if blackAttacked then
|
if blackAttacked then
|
||||||
if thisMove == "black" and meta:get_string("blackAttacked") == "true" then
|
if thisMove == "black" then
|
||||||
|
--[(*)[ and meta:get_string("blackAttacked") == "true" ]] then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
meta:set_string("blackAttacked", "true")
|
meta:set_string("blackAttacked", "true")
|
||||||
|
@ -719,7 +1211,8 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
end
|
end
|
||||||
|
|
||||||
if whiteAttacked then
|
if whiteAttacked then
|
||||||
if thisMove == "white" and meta:get_string("whiteAttacked") == "true" then
|
if thisMove == "white" then
|
||||||
|
--[(*)[ and meta:get_string("whiteAttacked") == "true" ]] then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
meta:set_string("whiteAttacked", "true")
|
meta:set_string("whiteAttacked", "true")
|
||||||
|
@ -728,47 +1221,139 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
|
||||||
meta:set_string("whiteAttacked", "")
|
meta:set_string("whiteAttacked", "")
|
||||||
end
|
end
|
||||||
|
|
||||||
lastMove = thisMove
|
--(*) Allow a piece to move and put its king in check. Maybe not in the chess rules though?
|
||||||
|
|
||||||
|
lastMove = thisMove
|
||||||
meta:set_string("lastMove", lastMove)
|
meta:set_string("lastMove", lastMove)
|
||||||
meta:set_int("lastMoveTime", minetest.get_gametime())
|
meta:set_int("lastMoveTime", minetest.get_gametime())
|
||||||
|
|
||||||
|
if meta:get_string("playerWhite") == "" then
|
||||||
meta:set_string("playerWhite", playerWhite)
|
meta:set_string("playerWhite", playerWhite)
|
||||||
|
elseif meta:get_string("playerBlack") == "" then
|
||||||
meta:set_string("playerBlack", playerBlack)
|
meta:set_string("playerBlack", playerBlack)
|
||||||
|
end
|
||||||
|
|
||||||
local pieceTo_s = pieceTo ~= "" and pieceTo:match(":(%w+_%w+)") or ""
|
local pieceTo_s = pieceTo ~= "" and pieceTo:match(":(%w+_%w+)") or ""
|
||||||
get_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_x, to_x, from_y, to_y)
|
get_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_index, to_index)
|
||||||
get_eaten_list(meta, pieceTo, pieceTo_s)
|
get_eaten_list(meta, pieceTo, pieceTo_s)
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function ai_move(inv, meta)
|
||||||
|
local board_t = board_to_table(inv)
|
||||||
|
local lastMove = meta:get_string("lastMove")
|
||||||
|
|
||||||
|
if lastMove == "white" then
|
||||||
|
update_formspec(meta)
|
||||||
|
local moves = {}
|
||||||
|
|
||||||
|
for i = 1, 64 do
|
||||||
|
local possibleMoves = get_possible_moves(board_t, i)
|
||||||
|
local stack_name = inv:get_stack("board", i):get_name()
|
||||||
|
|
||||||
|
if stack_name:find("black") then
|
||||||
|
moves[tostring(i)] = possibleMoves
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local choice_from, choice_to = best_move(moves)
|
||||||
|
|
||||||
|
local pieceFrom = inv:get_stack("board", choice_from):get_name()
|
||||||
|
local pieceTo = inv:get_stack("board", choice_to):get_name()
|
||||||
|
local pieceTo_s = pieceTo ~= "" and pieceTo:match(":(%w+_%w+)") or ""
|
||||||
|
|
||||||
|
local board = board_to_table(inv)
|
||||||
|
local black_king_idx = locate_kings(board)
|
||||||
|
local blackAttacked = attacked("black", black_king_idx, board)
|
||||||
|
local kingSafe = true
|
||||||
|
local bestMoveSaveFrom, bestMoveSaveTo
|
||||||
|
|
||||||
|
if blackAttacked then
|
||||||
|
kingSafe = false
|
||||||
|
meta:set_string("blackAttacked", "true")
|
||||||
|
local save_moves = {}
|
||||||
|
|
||||||
|
for from_idx, _ in pairs(moves) do
|
||||||
|
for to_idx, value in pairs(_) do
|
||||||
|
from_idx = tonumber(from_idx)
|
||||||
|
local from_idx_bak, to_idx_bak = board[from_idx], board[to_idx]
|
||||||
|
board[to_idx] = board[from_idx]
|
||||||
|
board[from_idx] = ""
|
||||||
|
black_king_idx = locate_kings(board)
|
||||||
|
|
||||||
|
if black_king_idx then
|
||||||
|
blackAttacked = attacked("black", black_king_idx, board)
|
||||||
|
if not blackAttacked then
|
||||||
|
save_moves[from_idx] = save_moves[from_idx] or {}
|
||||||
|
save_moves[from_idx][to_idx] = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
board[from_idx], board[to_idx] = from_idx_bak, to_idx_bak
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if next(save_moves) then
|
||||||
|
bestMoveSaveFrom, bestMoveSaveTo = best_move(save_moves)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.after(1.0, function()
|
||||||
|
local lastMoveTime = meta:get_int("lastMoveTime")
|
||||||
|
if lastMoveTime > 0 then
|
||||||
|
if not kingSafe then
|
||||||
|
if bestMoveSaveTo then
|
||||||
|
inv:set_stack("board", bestMoveSaveTo, board[bestMoveSaveFrom])
|
||||||
|
inv:set_stack("board", bestMoveSaveFrom, "")
|
||||||
|
meta:set_string("blackAttacked", "")
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if pieceFrom:find("pawn") and choice_to >= 57 and choice_to <= 64 then
|
||||||
|
inv:set_stack("board", choice_to, "realchess:queen_black")
|
||||||
|
else
|
||||||
|
inv:set_stack("board", choice_to, pieceFrom)
|
||||||
|
end
|
||||||
|
|
||||||
|
inv:set_stack("board", choice_from, "")
|
||||||
|
end
|
||||||
|
|
||||||
|
board = board_to_table(inv)
|
||||||
|
local _, white_king_idx = locate_kings(board)
|
||||||
|
local whiteAttacked = attacked("white", white_king_idx, board)
|
||||||
|
|
||||||
|
if whiteAttacked then
|
||||||
|
meta:set_string("whiteAttacked", "true")
|
||||||
|
end
|
||||||
|
|
||||||
|
if meta:get_string("playerBlack") == "" then
|
||||||
|
meta:set_string("playerBlack", "Dumb AI")
|
||||||
|
end
|
||||||
|
|
||||||
|
meta:set_string("lastMove", "black")
|
||||||
|
meta:set_int("lastMoveTime", minetest.get_gametime())
|
||||||
|
|
||||||
|
get_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, choice_from, choice_to)
|
||||||
|
get_eaten_list(meta, pieceTo, pieceTo_s)
|
||||||
|
|
||||||
|
update_formspec(meta)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
update_formspec(meta)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function realchess.on_move(pos, from_list, from_index)
|
function realchess.on_move(pos, from_list, from_index)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
inv:set_stack(from_list, from_index, '')
|
inv:set_stack(from_list, from_index, "")
|
||||||
|
|
||||||
local black_king_attacked = meta:get_string("blackAttacked") == "true"
|
if meta:get_string("mode") == "single" then
|
||||||
local white_king_attacked = meta:get_string("whiteAttacked") == "true"
|
ai_move(inv, meta)
|
||||||
|
end
|
||||||
local playerWhite = meta:get_string("playerWhite")
|
|
||||||
local playerBlack = meta:get_string("playerBlack")
|
|
||||||
|
|
||||||
local moves = meta:get_string("moves")
|
|
||||||
local eaten_img = meta:get_string("eaten_img")
|
|
||||||
local lastMove = meta:get_string("lastMove")
|
|
||||||
local turnBlack = minetest.colorize("#000001", (lastMove == "white" and playerBlack ~= "") and
|
|
||||||
playerBlack .. "..." or playerBlack)
|
|
||||||
local turnWhite = minetest.colorize("#000001", (lastMove == "black" and playerWhite ~= "") and
|
|
||||||
playerWhite .. "..." or playerWhite)
|
|
||||||
local check_s = minetest.colorize("#FF0000", "\\[check\\]")
|
|
||||||
|
|
||||||
local formspec = fs ..
|
|
||||||
"label[1.9,0.3;" .. turnBlack .. (black_king_attacked and " " .. check_s or "") .. "]" ..
|
|
||||||
"label[1.9,9.15;" .. turnWhite .. (white_king_attacked and " " .. check_s or "") .. "]" ..
|
|
||||||
"table[8.9,1.05;5.07,3.75;moves;" .. moves:sub(1,-2) .. ";1]" ..
|
|
||||||
eaten_img
|
|
||||||
|
|
||||||
meta:set_string("formspec", formspec)
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
@ -794,12 +1379,18 @@ function realchess.fields(pos, _, fields, sender)
|
||||||
local lastMoveTime = meta:get_int("lastMoveTime")
|
local lastMoveTime = meta:get_int("lastMoveTime")
|
||||||
if fields.quit then return end
|
if fields.quit then return end
|
||||||
|
|
||||||
|
if fields.single or fields.multi then
|
||||||
|
meta:set_string("mode", (fields.single and "single" or "multi"))
|
||||||
|
update_formspec(meta)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- Timeout is 5 min. by default for resetting the game (non-players only)
|
-- Timeout is 5 min. by default for resetting the game (non-players only)
|
||||||
if fields.new then
|
if fields.new then
|
||||||
if (playerWhite == playerName or playerBlack == playerName) then
|
if (playerWhite == playerName or playerBlack == playerName) then
|
||||||
realchess.init(pos)
|
realchess.init(pos)
|
||||||
|
|
||||||
elseif lastMoveTime ~= 0 then
|
elseif lastMoveTime > 0 then
|
||||||
if minetest.get_gametime() >= timeout_limit and
|
if minetest.get_gametime() >= timeout_limit and
|
||||||
(playerWhite ~= playerName or playerBlack ~= playerName) then
|
(playerWhite ~= playerName or playerBlack ~= playerName) then
|
||||||
realchess.init(pos)
|
realchess.init(pos)
|
||||||
|
|
|
@ -17,7 +17,9 @@ cauldron.cbox = {
|
||||||
|
|
||||||
function cauldron.stop_sound(pos)
|
function cauldron.stop_sound(pos)
|
||||||
local spos = minetest.hash_node_position(pos)
|
local spos = minetest.hash_node_position(pos)
|
||||||
if sounds[spos] then minetest.sound_stop(sounds[spos]) end
|
if sounds[spos] then
|
||||||
|
minetest.sound_stop(sounds[spos])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function cauldron.idle_construct(pos)
|
function cauldron.idle_construct(pos)
|
||||||
|
@ -29,7 +31,10 @@ end
|
||||||
function cauldron.boiling_construct(pos)
|
function cauldron.boiling_construct(pos)
|
||||||
local spos = minetest.hash_node_position(pos)
|
local spos = minetest.hash_node_position(pos)
|
||||||
sounds[spos] = minetest.sound_play("xdecor_boiling_water", {
|
sounds[spos] = minetest.sound_play("xdecor_boiling_water", {
|
||||||
pos=pos, max_hear_distance=5, gain=0.8, loop=true
|
pos = pos,
|
||||||
|
max_hear_distance = 5,
|
||||||
|
gain = 0.8,
|
||||||
|
loop = true
|
||||||
})
|
})
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
|
@ -58,10 +63,12 @@ function cauldron.filling(pos, node, clicker, itemstack)
|
||||||
itemstack:replace("bucket:bucket_water")
|
itemstack:replace("bucket:bucket_water")
|
||||||
end
|
end
|
||||||
minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
|
minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
|
||||||
|
|
||||||
elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then
|
elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then
|
||||||
minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
|
minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
|
||||||
itemstack:replace("bucket:bucket_empty")
|
itemstack:replace("bucket:bucket_empty")
|
||||||
end
|
end
|
||||||
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -82,13 +89,17 @@ local function eatable(itemstring)
|
||||||
local item = itemstring:match("[%w_:]+")
|
local item = itemstring:match("[%w_:]+")
|
||||||
local on_use_def = minetest.registered_items[item].on_use
|
local on_use_def = minetest.registered_items[item].on_use
|
||||||
if not on_use_def then return end
|
if not on_use_def then return end
|
||||||
|
|
||||||
return string.format("%q", string.dump(on_use_def)):find("item_eat")
|
return string.format("%q", string.dump(on_use_def)):find("item_eat")
|
||||||
end
|
end
|
||||||
|
|
||||||
function cauldron.boiling_timer(pos)
|
function cauldron.boiling_timer(pos)
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
local objs = minetest.get_objects_inside_radius(pos, 0.5)
|
local objs = minetest.get_objects_inside_radius(pos, 0.5)
|
||||||
if not next(objs) then return true end
|
|
||||||
|
if not next(objs) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
local ingredients = {}
|
local ingredients = {}
|
||||||
for _, obj in pairs(objs) do
|
for _, obj in pairs(objs) do
|
||||||
|
@ -96,31 +107,38 @@ function cauldron.boiling_timer(pos)
|
||||||
local itemstring = obj:get_luaentity().itemstring
|
local itemstring = obj:get_luaentity().itemstring
|
||||||
local food = itemstring:match(":([%w_]+)")
|
local food = itemstring:match(":([%w_]+)")
|
||||||
|
|
||||||
for _, ingredient in pairs(ingredients_list) do
|
for _, ingredient in ipairs(ingredients_list) do
|
||||||
if food and (eatable(itemstring) or food:find(ingredient)) then
|
if food and (eatable(itemstring) or food:find(ingredient)) then
|
||||||
ingredients[#ingredients+1] = food break
|
ingredients[#ingredients + 1] = food
|
||||||
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if #ingredients >= 2 then
|
if #ingredients >= 2 then
|
||||||
for _, obj in pairs(objs) do obj:remove() end
|
for _, obj in pairs(objs) do
|
||||||
|
obj:remove()
|
||||||
|
end
|
||||||
|
|
||||||
minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2})
|
minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2})
|
||||||
end
|
end
|
||||||
|
|
||||||
local node_under = {x = pos.x, y = pos.y - 1, z = pos.z}
|
local node_under = {x = pos.x, y = pos.y - 1, z = pos.z}
|
||||||
|
|
||||||
if not minetest.get_node(node_under).name:find("fire") then
|
if not minetest.get_node(node_under).name:find("fire") then
|
||||||
minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
|
minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
function cauldron.take_soup(pos, node, clicker, itemstack)
|
function cauldron.take_soup(pos, node, clicker, itemstack)
|
||||||
local inv = clicker:get_inventory()
|
local inv = clicker:get_inventory()
|
||||||
local wield_item = clicker:get_wielded_item()
|
local wield_item = clicker:get_wielded_item()
|
||||||
|
local item_name = wield_item:get_name()
|
||||||
|
|
||||||
if wield_item:get_name() == "xdecor:bowl" then
|
if item_name == "xdecor:bowl" or item_name == "farming:bowl" then
|
||||||
if wield_item:get_count() > 1 then
|
if wield_item:get_count() > 1 then
|
||||||
if inv:room_for_item("main", "xdecor:bowl_soup 1") then
|
if inv:room_for_item("main", "xdecor:bowl_soup 1") then
|
||||||
itemstack:take_item()
|
itemstack:take_item()
|
||||||
|
@ -136,6 +154,7 @@ function cauldron.take_soup(pos, node, clicker, itemstack)
|
||||||
|
|
||||||
minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
|
minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
|
||||||
end
|
end
|
||||||
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -145,11 +164,11 @@ xdecor.register("cauldron_empty", {
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"},
|
tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"},
|
||||||
infotext = "Cauldron (empty)",
|
infotext = "Cauldron (empty)",
|
||||||
|
collision_box = xdecor.pixelbox(16, cauldron.cbox),
|
||||||
|
on_rightclick = cauldron.filling,
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
cauldron.stop_sound(pos)
|
cauldron.stop_sound(pos)
|
||||||
end,
|
end,
|
||||||
on_rightclick = cauldron.filling,
|
|
||||||
collision_box = xdecor.pixelbox(16, cauldron.cbox)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
xdecor.register("cauldron_idle", {
|
xdecor.register("cauldron_idle", {
|
||||||
|
@ -161,7 +180,7 @@ xdecor.register("cauldron_idle", {
|
||||||
collision_box = xdecor.pixelbox(16, cauldron.cbox),
|
collision_box = xdecor.pixelbox(16, cauldron.cbox),
|
||||||
on_rightclick = cauldron.filling,
|
on_rightclick = cauldron.filling,
|
||||||
on_construct = cauldron.idle_construct,
|
on_construct = cauldron.idle_construct,
|
||||||
on_timer = cauldron.idle_timer
|
on_timer = cauldron.idle_timer,
|
||||||
})
|
})
|
||||||
|
|
||||||
xdecor.register("cauldron_boiling", {
|
xdecor.register("cauldron_boiling", {
|
||||||
|
@ -170,16 +189,20 @@ xdecor.register("cauldron_boiling", {
|
||||||
drop = "xdecor:cauldron_empty",
|
drop = "xdecor:cauldron_empty",
|
||||||
infotext = "Cauldron (active) - Drop foods inside to make a soup",
|
infotext = "Cauldron (active) - Drop foods inside to make a soup",
|
||||||
damage_per_second = 2,
|
damage_per_second = 2,
|
||||||
tiles = {{name="xdecor_cauldron_top_anim_boiling_water.png",
|
tiles = {
|
||||||
animation={type="vertical_frames", length=3.0}},
|
{
|
||||||
"xdecor_cauldron_sides.png"},
|
name = "xdecor_cauldron_top_anim_boiling_water.png",
|
||||||
|
animation = {type = "vertical_frames", length = 3.0}
|
||||||
|
},
|
||||||
|
"xdecor_cauldron_sides.png"
|
||||||
|
},
|
||||||
collision_box = xdecor.pixelbox(16, cauldron.cbox),
|
collision_box = xdecor.pixelbox(16, cauldron.cbox),
|
||||||
on_rightclick = cauldron.filling,
|
on_rightclick = cauldron.filling,
|
||||||
on_construct = cauldron.boiling_construct,
|
on_construct = cauldron.boiling_construct,
|
||||||
|
on_timer = cauldron.boiling_timer,
|
||||||
on_destruct = function(pos)
|
on_destruct = function(pos)
|
||||||
cauldron.stop_sound(pos)
|
cauldron.stop_sound(pos)
|
||||||
end,
|
end,
|
||||||
on_timer = cauldron.boiling_timer
|
|
||||||
})
|
})
|
||||||
|
|
||||||
xdecor.register("cauldron_soup", {
|
xdecor.register("cauldron_soup", {
|
||||||
|
@ -188,14 +211,18 @@ xdecor.register("cauldron_soup", {
|
||||||
drop = "xdecor:cauldron_empty",
|
drop = "xdecor:cauldron_empty",
|
||||||
infotext = "Cauldron (active) - Use a bowl to eat the soup",
|
infotext = "Cauldron (active) - Use a bowl to eat the soup",
|
||||||
damage_per_second = 2,
|
damage_per_second = 2,
|
||||||
tiles = {{name="xdecor_cauldron_top_anim_soup.png",
|
tiles = {
|
||||||
animation={type="vertical_frames", length=3.0}},
|
{
|
||||||
"xdecor_cauldron_sides.png"},
|
name = "xdecor_cauldron_top_anim_soup.png",
|
||||||
|
animation = {type = "vertical_frames", length = 3.0}
|
||||||
|
},
|
||||||
|
"xdecor_cauldron_sides.png"
|
||||||
|
},
|
||||||
collision_box = xdecor.pixelbox(16, cauldron.cbox),
|
collision_box = xdecor.pixelbox(16, cauldron.cbox),
|
||||||
on_rightclick = cauldron.take_soup,
|
on_rightclick = cauldron.take_soup,
|
||||||
on_destruct = function(pos)
|
on_destruct = function(pos)
|
||||||
cauldron.stop_sound(pos)
|
cauldron.stop_sound(pos)
|
||||||
end
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Craft items
|
-- Craft items
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
screwdriver = screwdriver or {}
|
screwdriver = screwdriver or {}
|
||||||
local ceil, abs, random = math.ceil, math.abs, math.random
|
local ceil, abs, random = math.ceil, math.abs, math.random
|
||||||
|
local reg_tools = minetest.registered_tools
|
||||||
|
|
||||||
-- Cost in Mese crystal(s) for enchanting.
|
-- Cost in Mese crystal(s) for enchanting.
|
||||||
local mese_cost = 1
|
local mese_cost = 1
|
||||||
|
@ -11,13 +12,17 @@ local enchanting = {
|
||||||
damages = 1, -- Sharpness
|
damages = 1, -- Sharpness
|
||||||
}
|
}
|
||||||
|
|
||||||
local function cap(S) return S:gsub("^%l", string.upper) end
|
local function cap(S) return
|
||||||
|
S:gsub("^%l", string.upper)
|
||||||
|
end
|
||||||
|
|
||||||
local function to_percent(orig_value, final_value)
|
local function to_percent(orig_value, final_value)
|
||||||
return abs(ceil(((final_value - orig_value) / orig_value) * 100))
|
return abs(ceil(((final_value - orig_value) / orig_value) * 100))
|
||||||
end
|
end
|
||||||
|
|
||||||
function enchanting:get_tooltip(enchant, orig_caps, fleshy)
|
function enchanting:get_tooltip(enchant, orig_caps, fleshy)
|
||||||
local bonus = {durable = 0, efficiency = 0, damages = 0}
|
local bonus = {durable = 0, efficiency = 0, damages = 0}
|
||||||
|
|
||||||
if orig_caps then
|
if orig_caps then
|
||||||
bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses)
|
bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses)
|
||||||
local sum_caps_times = 0
|
local sum_caps_times = 0
|
||||||
|
@ -28,6 +33,7 @@ function enchanting:get_tooltip(enchant, orig_caps, fleshy)
|
||||||
bonus.efficiency = to_percent(average_caps_time, average_caps_time -
|
bonus.efficiency = to_percent(average_caps_time, average_caps_time -
|
||||||
enchanting.times)
|
enchanting.times)
|
||||||
end
|
end
|
||||||
|
|
||||||
if fleshy then
|
if fleshy then
|
||||||
bonus.damages = to_percent(fleshy, fleshy + enchanting.damages)
|
bonus.damages = to_percent(fleshy, fleshy + enchanting.damages)
|
||||||
end
|
end
|
||||||
|
@ -37,14 +43,15 @@ function enchanting:get_tooltip(enchant, orig_caps, fleshy)
|
||||||
fast = {"#74ff49", " (+" .. bonus.efficiency .. "%)"},
|
fast = {"#74ff49", " (+" .. bonus.efficiency .. "%)"},
|
||||||
sharp = {"#ffff00", " (+" .. bonus.damages .. "%)"},
|
sharp = {"#ffff00", " (+" .. bonus.damages .. "%)"},
|
||||||
}
|
}
|
||||||
|
|
||||||
return minetest.colorize and minetest.colorize(specs[enchant][1],
|
return minetest.colorize and minetest.colorize(specs[enchant][1],
|
||||||
"\n" .. cap(enchant) .. specs[enchant][2]) or
|
"\n" .. cap(enchant) .. specs[enchant][2]) or
|
||||||
"\n" .. cap(enchant) .. specs[enchant][2]
|
"\n" .. cap(enchant) .. specs[enchant][2]
|
||||||
end
|
end
|
||||||
|
|
||||||
local enchant_buttons = {
|
local enchant_buttons = {
|
||||||
[[ image_button[3.9,0.85;4,0.92;bg_btn.png;fast;Efficiency]
|
"image_button[3.9,0.85;4,0.92;bg_btn.png;fast;Efficiency]" ..
|
||||||
image_button[3.9,1.77;4,1.12;bg_btn.png;durable;Durability] ]],
|
"image_button[3.9,1.77;4,1.12;bg_btn.png;durable;Durability]",
|
||||||
"image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;Sharpness]",
|
"image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;Sharpness]",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,8 +70,8 @@ function enchanting.formspec(pos, num)
|
||||||
image[2,2.9;1,1;mese_layout.png]
|
image[2,2.9;1,1;mese_layout.png]
|
||||||
tooltip[sharp;Your weapon inflicts more damages]
|
tooltip[sharp;Your weapon inflicts more damages]
|
||||||
tooltip[durable;Your tool last longer]
|
tooltip[durable;Your tool last longer]
|
||||||
tooltip[fast;Your tool digs faster] ]]
|
tooltip[fast;Your tool digs faster] ]] ..
|
||||||
..default.gui_slots..default.get_hotbar_bg(0.5,4.5)
|
default.gui_slots .. default.get_hotbar_bg(0.5,4.5)
|
||||||
|
|
||||||
formspec = formspec .. (enchant_buttons[num] or "")
|
formspec = formspec .. (enchant_buttons[num] or "")
|
||||||
meta:set_string("formspec", formspec)
|
meta:set_string("formspec", formspec)
|
||||||
|
@ -78,7 +85,7 @@ function enchanting.on_put(pos, listname, _, stack)
|
||||||
"sword",
|
"sword",
|
||||||
}
|
}
|
||||||
|
|
||||||
for idx, tools in pairs(tool_groups) do
|
for idx, tools in ipairs(tool_groups) do
|
||||||
if tools:find(stackname:match(":(%w+)")) then
|
if tools:find(stackname:match(":(%w+)")) then
|
||||||
enchanting.formspec(pos, idx)
|
enchanting.formspec(pos, idx)
|
||||||
end
|
end
|
||||||
|
@ -95,9 +102,12 @@ function enchanting.fields(pos, _, fields, sender)
|
||||||
local mod, name = tool:get_name():match("(.*):(.*)")
|
local mod, name = tool:get_name():match("(.*):(.*)")
|
||||||
local enchanted_tool = (mod or "") .. ":enchanted_" .. (name or "") .. "_" .. next(fields)
|
local enchanted_tool = (mod or "") .. ":enchanted_" .. (name or "") .. "_" .. next(fields)
|
||||||
|
|
||||||
if mese:get_count() >= mese_cost and minetest.registered_tools[enchanted_tool] then
|
if mese:get_count() >= mese_cost and reg_tools[enchanted_tool] then
|
||||||
minetest.sound_play("xdecor_enchanting", {
|
minetest.sound_play("xdecor_enchanting", {
|
||||||
to_player=sender:get_player_name(), gain=0.8})
|
to_player = sender:get_player_name(),
|
||||||
|
gain = 0.8
|
||||||
|
})
|
||||||
|
|
||||||
tool:replace(enchanted_tool)
|
tool:replace(enchanted_tool)
|
||||||
tool:add_wear(orig_wear)
|
tool:add_wear(orig_wear)
|
||||||
mese:take_item(mese_cost)
|
mese:take_item(mese_cost)
|
||||||
|
@ -112,11 +122,13 @@ function enchanting.dig(pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function allowed(tool)
|
local function allowed(tool)
|
||||||
if not tool then return false end
|
if not tool then return end
|
||||||
for item in pairs(minetest.registered_tools) do
|
|
||||||
if item:find("enchanted_"..tool) then return true end
|
for item in pairs(reg_tools) do
|
||||||
|
if item:find("enchanted_" .. tool) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function enchanting.put(_, listname, _, stack)
|
function enchanting.put(_, listname, _, stack)
|
||||||
|
@ -126,17 +138,20 @@ function enchanting.put(_, listname, _, stack)
|
||||||
elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then
|
elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then
|
||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
function enchanting.on_take(pos, listname)
|
function enchanting.on_take(pos, listname)
|
||||||
if listname == "tool" then enchanting.formspec(pos, nil) end
|
if listname == "tool" then
|
||||||
|
enchanting.formspec(pos)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function enchanting.construct(pos)
|
function enchanting.construct(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
meta:set_string("infotext", "Enchantment Table")
|
meta:set_string("infotext", "Enchantment Table")
|
||||||
enchanting.formspec(pos, nil)
|
enchanting.formspec(pos)
|
||||||
|
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
inv:set_size("tool", 1)
|
inv:set_size("tool", 1)
|
||||||
|
@ -165,8 +180,11 @@ function enchanting.timer(pos)
|
||||||
|
|
||||||
local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
|
local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
|
||||||
local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
|
local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
|
||||||
|
|
||||||
local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf")
|
local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf")
|
||||||
if #bookshelves == 0 then return true end
|
if #bookshelves == 0 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
local bookshelf_pos = bookshelves[random(1, #bookshelves)]
|
local bookshelf_pos = bookshelves[random(1, #bookshelves)]
|
||||||
local x = pos.x - bookshelf_pos.x
|
local x = pos.x - bookshelf_pos.x
|
||||||
|
@ -184,14 +202,17 @@ function enchanting.timer(pos)
|
||||||
texture = "xdecor_glyph" .. random(1,18) .. ".png"
|
texture = "xdecor_glyph" .. random(1,18) .. ".png"
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
xdecor.register("enchantment_table", {
|
xdecor.register("enchantment_table", {
|
||||||
description = "Enchantment Table",
|
description = "Enchantment Table",
|
||||||
tiles = {"xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png",
|
tiles = {
|
||||||
|
"xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png",
|
||||||
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png",
|
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png",
|
||||||
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png"},
|
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png"
|
||||||
|
},
|
||||||
groups = {cracky = 1, level = 1},
|
groups = {cracky = 1, level = 1},
|
||||||
light_source = 6,
|
light_source = 6,
|
||||||
sounds = default.node_sound_stone_defaults(),
|
sounds = default.node_sound_stone_defaults(),
|
||||||
|
@ -204,7 +225,9 @@ xdecor.register("enchantment_table", {
|
||||||
on_metadata_inventory_put = enchanting.on_put,
|
on_metadata_inventory_put = enchanting.on_put,
|
||||||
on_metadata_inventory_take = enchanting.on_take,
|
on_metadata_inventory_take = enchanting.on_take,
|
||||||
allow_metadata_inventory_put = enchanting.put,
|
allow_metadata_inventory_put = enchanting.put,
|
||||||
allow_metadata_inventory_move = function() return 0 end
|
allow_metadata_inventory_move = function()
|
||||||
|
return 0
|
||||||
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_entity("xdecor:book_open", {
|
minetest.register_entity("xdecor:book_open", {
|
||||||
|
@ -227,7 +250,7 @@ function enchanting:register_tools(mod, def)
|
||||||
for tool in pairs(def.tools) do
|
for tool in pairs(def.tools) do
|
||||||
for material in def.materials:gmatch("[%w_]+") do
|
for material in def.materials:gmatch("[%w_]+") do
|
||||||
for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do
|
for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do
|
||||||
local original_tool = minetest.registered_tools[mod..":"..tool.."_"..material]
|
local original_tool = reg_tools[mod .. ":" .. tool .. "_" .. material]
|
||||||
if not original_tool then break end
|
if not original_tool then break end
|
||||||
local original_toolcaps = original_tool.tool_capabilities
|
local original_toolcaps = original_tool.tool_capabilities
|
||||||
|
|
||||||
|
|
30
src/hive.lua
30
src/hive.lua
|
@ -12,8 +12,8 @@ function hive.construct(pos)
|
||||||
list[context;honey;5,0;1,1;]
|
list[context;honey;5,0;1,1;]
|
||||||
list[current_player;main;0,1.35;8,4;]
|
list[current_player;main;0,1.35;8,4;]
|
||||||
listring[current_player;main]
|
listring[current_player;main]
|
||||||
listring[context;honey] ]]
|
listring[context;honey] ]] ..
|
||||||
..xbg..default.get_hotbar_bg(0,1.35)
|
xbg .. default.get_hotbar_bg(0,1.35)
|
||||||
|
|
||||||
meta:set_string("formspec", formspec)
|
meta:set_string("formspec", formspec)
|
||||||
meta:set_string("infotext", "Artificial Hive")
|
meta:set_string("infotext", "Artificial Hive")
|
||||||
|
@ -25,7 +25,9 @@ end
|
||||||
|
|
||||||
function hive.timer(pos)
|
function hive.timer(pos)
|
||||||
local time = (minetest.get_timeofday() or 0) * 24000
|
local time = (minetest.get_timeofday() or 0) * 24000
|
||||||
if time < 5500 or time > 18500 then return true end
|
if time < 5500 or time > 18500 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
local inv = minetest.get_meta(pos):get_inventory()
|
local inv = minetest.get_meta(pos):get_inventory()
|
||||||
local honeystack = inv:get_stack("honey", 1)
|
local honeystack = inv:get_stack("honey", 1)
|
||||||
|
@ -40,8 +42,10 @@ function hive.timer(pos)
|
||||||
inv:add_item("honey", "mobs:honey")
|
inv:add_item("honey", "mobs:honey")
|
||||||
elseif honey == honey_max then
|
elseif honey == honey_max then
|
||||||
local timer = minetest.get_node_timer(pos)
|
local timer = minetest.get_node_timer(pos)
|
||||||
timer:stop() return true
|
timer:stop()
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -53,11 +57,12 @@ xdecor.register("hive", {
|
||||||
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1},
|
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1},
|
||||||
on_construct = hive.construct,
|
on_construct = hive.construct,
|
||||||
on_timer = hive.timer,
|
on_timer = hive.timer,
|
||||||
|
|
||||||
can_dig = function(pos)
|
can_dig = function(pos)
|
||||||
local inv = minetest.get_meta(pos):get_inventory()
|
local inv = minetest.get_meta(pos):get_inventory()
|
||||||
return inv:is_empty("honey")
|
return inv:is_empty("honey")
|
||||||
end,
|
end,
|
||||||
on_punch = function(pos, node, puncher)
|
on_punch = function(pos, player, puncher)
|
||||||
if math.random(1, 4) == 1 then
|
if math.random(1, 4) == 1 then
|
||||||
minetest.add_entity(pos, "mobs_animal:bee_angry")
|
minetest.add_entity(pos, "mobs_animal:bee_angry")
|
||||||
end
|
end
|
||||||
|
@ -66,7 +71,11 @@ xdecor.register("hive", {
|
||||||
minetest.add_entity(pos, "mobs_animal:bee_angry")
|
minetest.add_entity(pos, "mobs_animal:bee_angry")
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
allow_metadata_inventory_put = function() return 0 end,
|
|
||||||
|
allow_metadata_inventory_put = function()
|
||||||
|
return 0
|
||||||
|
end,
|
||||||
|
|
||||||
on_metadata_inventory_take = function(pos, _, _, stack)
|
on_metadata_inventory_take = function(pos, _, _, stack)
|
||||||
if stack:get_count() == honey_max then
|
if stack:get_count() == honey_max then
|
||||||
local timer = minetest.get_node_timer(pos)
|
local timer = minetest.get_node_timer(pos)
|
||||||
|
@ -81,8 +90,13 @@ minetest.register_craftitem("xdecor:honey", {
|
||||||
description = "Honey",
|
description = "Honey",
|
||||||
inventory_image = "xdecor_honey.png",
|
inventory_image = "xdecor_honey.png",
|
||||||
wield_image = "xdecor_honey.png",
|
wield_image = "xdecor_honey.png",
|
||||||
groups = {food_honey = 1, food_sugar = 1, flammable = 2, not_in_creative_inventory=1},
|
on_use = minetest.item_eat(2),
|
||||||
on_use = minetest.item_eat(2)
|
groups = {
|
||||||
|
food_honey = 1,
|
||||||
|
food_sugar = 1,
|
||||||
|
flammable = 2,
|
||||||
|
not_in_creative_inventory = 1,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Recipes
|
-- Recipes
|
||||||
|
|
|
@ -6,15 +6,18 @@ local function remove_item(pos, node)
|
||||||
if not objs then return end
|
if not objs then return end
|
||||||
|
|
||||||
for _, obj in pairs(objs) do
|
for _, obj in pairs(objs) do
|
||||||
if obj and obj:get_luaentity() and
|
local ent = obj:get_luaentity()
|
||||||
obj:get_luaentity().name == "xdecor:f_item" then
|
if obj and ent and ent.name == "xdecor:f_item" then
|
||||||
obj:remove() break
|
obj:remove() break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local facedir = {
|
local facedir = {
|
||||||
[0] = {x=0, y=0, z=1}, {x=1, y=0, z=0}, {x=0, y=0, z=-1}, {x=-1, y=0, z=0}
|
[0] = {x = 0, y = 0, z = 1},
|
||||||
|
{x = 1, y = 0, z = 0},
|
||||||
|
{x = 0, y = 0, z = -1},
|
||||||
|
{x = -1, y = 0, z = 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
local function update_item(pos, node)
|
local function update_item(pos, node)
|
||||||
|
@ -29,8 +32,8 @@ local function update_item(pos, node)
|
||||||
tmp.texture = ItemStack(itemstring):get_name()
|
tmp.texture = ItemStack(itemstring):get_name()
|
||||||
|
|
||||||
local entity = minetest.add_entity(pos, "xdecor:f_item")
|
local entity = minetest.add_entity(pos, "xdecor:f_item")
|
||||||
local yaw = math.pi*2 - node.param2 * math.pi/2
|
local yaw = (math.pi * 2) - node.param2 * (math.pi / 2)
|
||||||
entity:setyaw(yaw)
|
entity:set_yaw(yaw)
|
||||||
|
|
||||||
local timer = minetest.get_node_timer(pos)
|
local timer = minetest.get_node_timer(pos)
|
||||||
timer:start(15.0)
|
timer:start(15.0)
|
||||||
|
@ -64,6 +67,7 @@ function itemframe.timer(pos)
|
||||||
if num == 0 and meta:get_string("item") ~= "" then
|
if num == 0 and meta:get_string("item") ~= "" then
|
||||||
update_item(pos, node)
|
update_item(pos, node)
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -91,9 +95,10 @@ function itemframe.punch(pos, node, puncher)
|
||||||
local owner = meta:get_string("owner")
|
local owner = meta:get_string("owner")
|
||||||
local admin = minetest.check_player_privs(player_name, "protection_bypass")
|
local admin = minetest.check_player_privs(player_name, "protection_bypass")
|
||||||
|
|
||||||
if not admin and player_name ~= owner then return end
|
if admin and player_name == owner then
|
||||||
drop_item(pos, node)
|
drop_item(pos, node)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function itemframe.dig(pos, player)
|
function itemframe.dig(pos, player)
|
||||||
if not player then return end
|
if not player then return end
|
||||||
|
@ -113,8 +118,10 @@ xdecor.register("itemframe", {
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
inventory_image = "xdecor_itemframe.png",
|
inventory_image = "xdecor_itemframe.png",
|
||||||
node_box = xdecor.nodebox.slab_z(0.9375),
|
node_box = xdecor.nodebox.slab_z(0.9375),
|
||||||
tiles = {"xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
|
tiles = {
|
||||||
"xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"},
|
"xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
|
||||||
|
"xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"
|
||||||
|
},
|
||||||
after_place_node = itemframe.after_place,
|
after_place_node = itemframe.after_place,
|
||||||
on_timer = itemframe.timer,
|
on_timer = itemframe.timer,
|
||||||
on_rightclick = itemframe.rightclick,
|
on_rightclick = itemframe.rightclick,
|
||||||
|
@ -130,7 +137,7 @@ minetest.register_entity("xdecor:f_item", {
|
||||||
physical = false,
|
physical = false,
|
||||||
textures = {"air"},
|
textures = {"air"},
|
||||||
on_activate = function(self, staticdata)
|
on_activate = function(self, staticdata)
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:get_pos()
|
||||||
if minetest.get_node(pos).name ~= "xdecor:itemframe" then
|
if minetest.get_node(pos).name ~= "xdecor:itemframe" then
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
end
|
end
|
||||||
|
@ -148,13 +155,16 @@ minetest.register_entity("xdecor:f_item", {
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if self.texture then
|
if self.texture then
|
||||||
self.object:set_properties({textures={self.texture}})
|
self.object:set_properties({
|
||||||
|
textures = {self.texture}
|
||||||
|
})
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
get_staticdata = function(self)
|
get_staticdata = function(self)
|
||||||
if self.nodename and self.texture then
|
if self.nodename and self.texture then
|
||||||
return self.nodename .. ";" .. self.texture
|
return self.nodename .. ";" .. self.texture
|
||||||
end
|
end
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
})
|
})
|
|
@ -2,17 +2,25 @@ local mailbox = {}
|
||||||
screwdriver = screwdriver or {}
|
screwdriver = screwdriver or {}
|
||||||
|
|
||||||
local function get_img(img)
|
local function get_img(img)
|
||||||
|
if not img then return end
|
||||||
local img_name = img:match("(.*)%.png")
|
local img_name = img:match("(.*)%.png")
|
||||||
if img_name then return img_name..".png" end
|
|
||||||
|
if img_name then
|
||||||
|
return img_name .. ".png"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function img_col(stack)
|
local function img_col(stack)
|
||||||
local def = minetest.registered_items[stack]
|
local def = minetest.registered_items[stack]
|
||||||
if not def then return "" end
|
if not def then
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
|
||||||
if def.inventory_image ~= "" then
|
if def.inventory_image ~= "" then
|
||||||
local img = get_img(def.inventory_image)
|
local img = get_img(def.inventory_image)
|
||||||
if img then return img end
|
if img then
|
||||||
|
return img
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if def.tiles then
|
if def.tiles then
|
||||||
|
@ -22,7 +30,10 @@ local function img_col(stack)
|
||||||
elseif type(tile) == "string" then
|
elseif type(tile) == "string" then
|
||||||
img = get_img(tile)
|
img = get_img(tile)
|
||||||
end
|
end
|
||||||
if img then return img end
|
|
||||||
|
if img then
|
||||||
|
return img
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
@ -44,6 +55,7 @@ function mailbox:formspec(pos, owner, is_owner)
|
||||||
|
|
||||||
giver = giver .. "#FFFF00," .. giver_name .. "," .. i ..
|
giver = giver .. "#FFFF00," .. giver_name .. "," .. i ..
|
||||||
",#FFFFFF,x " .. stack_count .. ","
|
",#FFFFFF,x " .. stack_count .. ","
|
||||||
|
|
||||||
img = img .. i .. "=" ..
|
img = img .. i .. "=" ..
|
||||||
img_col(stack_name) .. "^\\[resize:16x16,"
|
img_col(stack_name) .. "^\\[resize:16x16,"
|
||||||
end
|
end
|
||||||
|
@ -62,8 +74,9 @@ function mailbox:formspec(pos, owner, is_owner)
|
||||||
"listring[nodemeta:" .. spos .. ";mailbox]" ..
|
"listring[nodemeta:" .. spos .. ";mailbox]" ..
|
||||||
xbg .. default.get_hotbar_bg(0.75, 5.25)
|
xbg .. default.get_hotbar_bg(0.75, 5.25)
|
||||||
end
|
end
|
||||||
return [[ size[8,5]
|
|
||||||
list[current_player;main;0,1.25;8,4;] ]]..
|
return "size[8,5]" ..
|
||||||
|
"list[current_player;main;0,1.25;8,4;]" ..
|
||||||
"label[0,0;Send your goods to\n" ..
|
"label[0,0;Send your goods to\n" ..
|
||||||
(minetest.colorize and
|
(minetest.colorize and
|
||||||
minetest.colorize("#FFFF00", owner) or owner) .. "]" ..
|
minetest.colorize("#FFFF00", owner) or owner) .. "]" ..
|
||||||
|
@ -97,8 +110,9 @@ function mailbox.rightclick(pos, node, clicker, itemstack, pointed_thing)
|
||||||
local player = clicker:get_player_name()
|
local player = clicker:get_player_name()
|
||||||
local owner = meta:get_string("owner")
|
local owner = meta:get_string("owner")
|
||||||
|
|
||||||
minetest.show_formspec(player, "xdecor:mailbox", mailbox:formspec(pos,
|
minetest.show_formspec(player, "xdecor:mailbox",
|
||||||
owner, (player == owner)))
|
mailbox:formspec(pos, owner, (player == owner)))
|
||||||
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -112,6 +126,7 @@ function mailbox.put(pos, listname, _, stack, player)
|
||||||
"The mailbox is full")
|
"The mailbox is full")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -139,6 +154,7 @@ function mailbox.allow_take(pos, listname, index, stack, player)
|
||||||
if player:get_player_name() ~= meta:get_string("owner") then
|
if player:get_player_name() ~= meta:get_string("owner") then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ end
|
||||||
function plate.timer(pos)
|
function plate.timer(pos)
|
||||||
local objs = minetest.get_objects_inside_radius(pos, 0.8)
|
local objs = minetest.get_objects_inside_radius(pos, 0.8)
|
||||||
if not next(objs) or not doors.get then return true end
|
if not next(objs) or not doors.get then return true end
|
||||||
|
|
||||||
local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
|
local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
|
||||||
local maxp = {x = pos.x + 2, y = pos.y, z = pos.z + 2}
|
local maxp = {x = pos.x + 2, y = pos.y, z = pos.z + 2}
|
||||||
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
|
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
|
||||||
|
@ -47,43 +48,44 @@ function plate.timer(pos)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
--function plate.register(material, desc, def)
|
--[[function plate.register(material, desc, def)
|
||||||
-- xdecor.register("pressure_"..material.."_off", {
|
xdecor.register("pressure_" .. material .. "_off", {
|
||||||
-- description = desc.." Pressure Plate",
|
description = desc .. " Pressure Plate",
|
||||||
-- tiles = {"xdecor_pressure_"..material..".png"},
|
tiles = {"xdecor_pressure_" .. material .. ".png"},
|
||||||
-- drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
-- node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
|
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
|
||||||
-- groups = def.groups,
|
groups = def.groups,
|
||||||
-- sounds = def.sounds,
|
sounds = def.sounds,
|
||||||
-- sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
-- on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
-- on_construct = plate.construct,
|
on_construct = plate.construct,
|
||||||
-- on_timer = plate.timer
|
on_timer = plate.timer
|
||||||
-- })
|
})
|
||||||
-- xdecor.register("pressure_"..material.."_on", {
|
xdecor.register("pressure_" .. material .. "_on", {
|
||||||
-- tiles = {"xdecor_pressure_"..material..".png"},
|
tiles = {"xdecor_pressure_" .. material .. ".png"},
|
||||||
-- drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
-- node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
|
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
|
||||||
-- groups = def.groups,
|
groups = def.groups,
|
||||||
-- sounds = def.sounds,
|
sounds = def.sounds,
|
||||||
-- drop = "xdecor:pressure_"..material.."_off",
|
drop = "xdecor:pressure_" .. material .. "_off",
|
||||||
-- sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
-- on_rotate = screwdriver.rotate_simple
|
on_rotate = screwdriver.rotate_simple
|
||||||
-- })
|
})
|
||||||
--end
|
end
|
||||||
|
|
||||||
--plate.register("wood", "Wooden", {
|
plate.register("wood", "Wooden", {
|
||||||
-- sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
-- groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2}
|
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}
|
||||||
--})
|
})
|
||||||
|
|
||||||
--plate.register("stone", "Stone", {
|
plate.register("stone", "Stone", {
|
||||||
-- sounds = default.node_sound_stone_defaults(),
|
sounds = default.node_sound_stone_defaults(),
|
||||||
-- groups = {cracky=3, oddly_breakable_by_hand=2}
|
groups = {cracky = 3, oddly_breakable_by_hand = 2}
|
||||||
--})
|
})]]
|
||||||
|
|
||||||
xdecor.register("lever_off", {
|
xdecor.register("lever_off", {
|
||||||
description = "Lever",
|
description = "Lever",
|
||||||
|
@ -94,6 +96,7 @@ xdecor.register("lever_off", {
|
||||||
sounds = default.node_sound_stone_defaults(),
|
sounds = default.node_sound_stone_defaults(),
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
|
|
||||||
on_rightclick = function(pos, node, clicker, itemstack)
|
on_rightclick = function(pos, node, clicker, itemstack)
|
||||||
if not doors.get then return itemstack end
|
if not doors.get then return itemstack end
|
||||||
local minp = {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}
|
local minp = {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}
|
||||||
|
@ -103,6 +106,7 @@ xdecor.register("lever_off", {
|
||||||
for i = 1, #doors do
|
for i = 1, #doors do
|
||||||
door_toggle(pos, doors[i], clicker)
|
door_toggle(pos, doors[i], clicker)
|
||||||
end
|
end
|
||||||
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
187
src/nodes.lua
187
src/nodes.lua
|
@ -17,32 +17,40 @@ end
|
||||||
|
|
||||||
register_pane("bamboo_frame", "Bamboo Frame", {
|
register_pane("bamboo_frame", "Bamboo Frame", {
|
||||||
groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2},
|
groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2},
|
||||||
recipe = {{"default:papyrus", "default:papyrus", "default:papyrus"},
|
recipe = {
|
||||||
|
{"default:papyrus", "default:papyrus", "default:papyrus"},
|
||||||
{"default:papyrus", "farming:cotton", "default:papyrus"},
|
{"default:papyrus", "farming:cotton", "default:papyrus"},
|
||||||
{"default:papyrus", "default:papyrus", "default:papyrus"}}
|
{"default:papyrus", "default:papyrus", "default:papyrus"}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
register_pane("chainlink", "Chainlink", {
|
register_pane("chainlink", "Chainlink", {
|
||||||
groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1},
|
groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1},
|
||||||
recipe = {{"default:steel_ingot", "", "default:steel_ingot"},
|
recipe = {
|
||||||
|
{"default:steel_ingot", "", "default:steel_ingot"},
|
||||||
{"", "default:steel_ingot", ""},
|
{"", "default:steel_ingot", ""},
|
||||||
{"default:steel_ingot", "", "default:steel_ingot"}}
|
{"default:steel_ingot", "", "default:steel_ingot"}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
register_pane("rusty_bar", "Rusty Iron Bars", {
|
register_pane("rusty_bar", "Rusty Iron Bars", {
|
||||||
sounds = default.node_sound_stone_defaults(),
|
sounds = default.node_sound_stone_defaults(),
|
||||||
groups = {cracky = 2, pane = 1},
|
groups = {cracky = 2, pane = 1},
|
||||||
recipe = {{"", "default:dirt", ""},
|
recipe = {
|
||||||
|
{"", "default:dirt", ""},
|
||||||
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
|
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
|
||||||
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}}
|
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
register_pane("wood_frame", "Wood Frame", {
|
register_pane("wood_frame", "Wood Frame", {
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
groups = {choppy = 2, pane = 1, flammable = 2},
|
groups = {choppy = 2, pane = 1, flammable = 2},
|
||||||
recipe = {{"group:wood", "group:stick", "group:wood"},
|
recipe = {
|
||||||
|
{"group:wood", "group:stick", "group:wood"},
|
||||||
{"group:stick", "group:stick", "group:stick"},
|
{"group:stick", "group:stick", "group:stick"},
|
||||||
{"group:wood", "group:stick", "group:wood"}}
|
{"group:wood", "group:stick", "group:wood"}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
xdecor.register("baricade", {
|
xdecor.register("baricade", {
|
||||||
|
@ -81,30 +89,42 @@ end
|
||||||
|
|
||||||
register_storage("cabinet", "Wooden Cabinet", {
|
register_storage("cabinet", "Wooden Cabinet", {
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
|
tiles = {
|
||||||
"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
|
"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
|
||||||
"xdecor_cabinet_sides.png", "xdecor_cabinet_front.png"}
|
"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
|
||||||
|
"xdecor_cabinet_sides.png", "xdecor_cabinet_front.png"
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
register_storage("cabinet_half", "Half Wooden Cabinet", {
|
register_storage("cabinet_half", "Half Wooden Cabinet", {
|
||||||
inv_size = 8,
|
inv_size = 8,
|
||||||
node_box = xdecor.nodebox.slab_y(0.5, 0.5),
|
node_box = xdecor.nodebox.slab_y(0.5, 0.5),
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
|
tiles = {
|
||||||
|
"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
|
||||||
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png",
|
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png",
|
||||||
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"}
|
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if minetest.get_modpath("moreblocks") then
|
||||||
|
minetest.register_alias("xdecor:empty_shelf", "moreblocks:empty_shelf")
|
||||||
|
else
|
||||||
register_storage("empty_shelf", "Empty Shelf", {
|
register_storage("empty_shelf", "Empty Shelf", {
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
|
tiles = {
|
||||||
"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"}
|
"default_wood.png", "default_wood.png", "default_wood.png",
|
||||||
|
"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
end
|
||||||
|
|
||||||
register_storage("multishelf", "Multi Shelf", {
|
register_storage("multishelf", "Multi Shelf", {
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
|
tiles = {
|
||||||
"default_wood.png", "default_wood.png^xdecor_multishelf.png"},
|
"default_wood.png", "default_wood.png", "default_wood.png",
|
||||||
|
"default_wood.png", "default_wood.png^xdecor_multishelf.png"
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
xdecor.register("candle", {
|
xdecor.register("candle", {
|
||||||
|
@ -116,12 +136,19 @@ xdecor.register("candle", {
|
||||||
paramtype2 = "wallmounted",
|
paramtype2 = "wallmounted",
|
||||||
walkable = false,
|
walkable = false,
|
||||||
groups = {dig_immediate = 3, attached_node = 1},
|
groups = {dig_immediate = 3, attached_node = 1},
|
||||||
tiles = {{name = "xdecor_candle_floor.png",
|
tiles = {
|
||||||
animation = {type="vertical_frames", length=1.5}},
|
{
|
||||||
{name = "xdecor_candle_floor.png",
|
name = "xdecor_candle_floor.png",
|
||||||
animation = {type="vertical_frames", length=1.5}},
|
animation = {type="vertical_frames", length = 1.5}
|
||||||
{name = "xdecor_candle_wall.png",
|
},
|
||||||
animation = {type="vertical_frames", length=1.5}}
|
{
|
||||||
|
name = "xdecor_candle_floor.png",
|
||||||
|
animation = {type="vertical_frames", length = 1.5}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "xdecor_candle_wall.png",
|
||||||
|
animation = {type="vertical_frames", length = 1.5}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "wallmounted",
|
type = "wallmounted",
|
||||||
|
@ -138,9 +165,12 @@ xdecor.register("chair", {
|
||||||
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
|
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
node_box = xdecor.pixelbox(16, {
|
node_box = xdecor.pixelbox(16, {
|
||||||
{3, 0, 11, 2, 16, 2}, {11, 0, 11, 2, 16, 2},
|
{3, 0, 11, 2, 16, 2},
|
||||||
{5, 9, 11.5, 6, 6, 1}, {3, 0, 3, 2, 6, 2},
|
{11, 0, 11, 2, 16, 2},
|
||||||
{11, 0, 3, 2, 6, 2}, {3, 6, 3, 10, 2, 8}
|
{5, 9, 11.5, 6, 6, 1},
|
||||||
|
{3, 0, 3, 2, 6, 2},
|
||||||
|
{11, 0, 3, 2, 6, 2},
|
||||||
|
{3, 6, 3, 10, 2, 8}
|
||||||
}),
|
}),
|
||||||
can_dig = xdecor.sit_dig,
|
can_dig = xdecor.sit_dig,
|
||||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||||
|
@ -171,7 +201,7 @@ local curtain_colors = {
|
||||||
"red",
|
"red",
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, c in pairs(curtain_colors) do
|
for _, c in ipairs(curtain_colors) do
|
||||||
xdecor.register("curtain_" .. c, {
|
xdecor.register("curtain_" .. c, {
|
||||||
description = c:gsub("^%l", string.upper) .. " Curtain",
|
description = c:gsub("^%l", string.upper) .. " Curtain",
|
||||||
walkable = false,
|
walkable = false,
|
||||||
|
@ -207,8 +237,10 @@ for _, c in pairs(curtain_colors) do
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "xdecor:curtain_" .. c .. " 4",
|
output = "xdecor:curtain_" .. c .. " 4",
|
||||||
recipe = {{"", "wool:"..c, ""},
|
recipe = {
|
||||||
{"", "wool:"..c, ""}}
|
{"", "wool:" .. c, ""},
|
||||||
|
{"", "wool:" .. c, ""}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -240,38 +272,67 @@ local xdecor_doors = {
|
||||||
japanese = {
|
japanese = {
|
||||||
{"group:wood", "default:paper"},
|
{"group:wood", "default:paper"},
|
||||||
{"default:paper", "group:wood"},
|
{"default:paper", "group:wood"},
|
||||||
{"group:wood", "default:paper"} },
|
{"group:wood", "default:paper"}
|
||||||
|
},
|
||||||
prison = {
|
prison = {
|
||||||
{"xpanes:bar_flat", "xpanes:bar_flat",},
|
{"xpanes:bar_flat", "xpanes:bar_flat",},
|
||||||
{"xpanes:bar_flat", "xpanes:bar_flat",},
|
{"xpanes:bar_flat", "xpanes:bar_flat",},
|
||||||
{"xpanes:bar_flat", "xpanes:bar_flat"} },
|
{"xpanes:bar_flat", "xpanes:bar_flat"}
|
||||||
|
},
|
||||||
rusty_prison = {
|
rusty_prison = {
|
||||||
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
|
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
|
||||||
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
|
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
|
||||||
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"} },
|
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"}
|
||||||
|
},
|
||||||
screen = {
|
screen = {
|
||||||
{"group:wood", "group:wood"},
|
{"group:wood", "group:wood"},
|
||||||
{"xpanes:chainlink_flat", "xpanes:chainlink_flat"},
|
{"xpanes:chainlink_flat", "xpanes:chainlink_flat"},
|
||||||
{"group:wood", "group:wood"} },
|
{"group:wood", "group:wood"}
|
||||||
|
},
|
||||||
slide = {
|
slide = {
|
||||||
{"default:paper", "default:paper"},
|
{"default:paper", "default:paper"},
|
||||||
{"default:paper", "default:paper"},
|
{"default:paper", "default:paper"},
|
||||||
{"group:wood", "group:wood"} },
|
{"group:wood", "group:wood"}
|
||||||
|
},
|
||||||
woodglass = {
|
woodglass = {
|
||||||
{"default:glass", "default:glass"},
|
{"default:glass", "default:glass"},
|
||||||
{"group:wood", "group:wood"},
|
{"group:wood", "group:wood"},
|
||||||
{"group:wood", "group:wood"} }
|
{"group:wood", "group:wood"}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local mesecons_register
|
||||||
|
|
||||||
|
if minetest.global_exists("mesecon") then
|
||||||
|
mesecons_register = { effector = {
|
||||||
|
action_on = function(pos, node)
|
||||||
|
local door = doors.get(pos)
|
||||||
|
if door then
|
||||||
|
door:open()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
action_off = function(pos, node)
|
||||||
|
local door = doors.get(pos)
|
||||||
|
if door then
|
||||||
|
door:close()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
rules = mesecon.rules.pplate
|
||||||
|
}}
|
||||||
|
end
|
||||||
|
|
||||||
for name, recipe in pairs(xdecor_doors) do
|
for name, recipe in pairs(xdecor_doors) do
|
||||||
if not doors.register then break end
|
if not doors.register then break end
|
||||||
doors.register(name .. "_door", {
|
doors.register(name .. "_door", {
|
||||||
tiles = {{name = "xdecor_"..name.."_door.png", backface_culling=true}},
|
tiles = {
|
||||||
|
{name = "xdecor_" .. name .. "_door.png", backface_culling = true}
|
||||||
|
},
|
||||||
description = name:gsub("%f[%w]%l", string.upper):gsub("_", " ") .. " Door",
|
description = name:gsub("%f[%w]%l", string.upper):gsub("_", " ") .. " Door",
|
||||||
inventory_image = "xdecor_" .. name .. "_door_inv.png",
|
inventory_image = "xdecor_" .. name .. "_door_inv.png",
|
||||||
protected = door_access(name),
|
protected = door_access(name),
|
||||||
groups = {choppy = 2, cracky = 2, oddly_breakable_by_hand = 1, door = 1},
|
groups = {choppy = 2, cracky = 2, oddly_breakable_by_hand = 1, door = 1},
|
||||||
recipe = recipe
|
recipe = recipe,
|
||||||
|
mesecons = mesecons_register,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
minetest.register_alias("xdecor:prison_rust_door", "doors:rusty_prison_door")
|
minetest.register_alias("xdecor:prison_rust_door", "doors:rusty_prison_door")
|
||||||
|
@ -282,9 +343,11 @@ minetest.register_alias("xdecor:prison_rust_door_b_2", "doors:rusty_prison_door_
|
||||||
|
|
||||||
xdecor.register("enderchest", {
|
xdecor.register("enderchest", {
|
||||||
description = "Ender Chest",
|
description = "Ender Chest",
|
||||||
tiles = {"xdecor_enderchest_top.png", "xdecor_enderchest_top.png",
|
tiles = {
|
||||||
|
"xdecor_enderchest_top.png", "xdecor_enderchest_top.png",
|
||||||
"xdecor_enderchest_side.png", "xdecor_enderchest_side.png",
|
"xdecor_enderchest_side.png", "xdecor_enderchest_side.png",
|
||||||
"xdecor_enderchest_side.png", "xdecor_enderchest_front.png"},
|
"xdecor_enderchest_side.png", "xdecor_enderchest_front.png"
|
||||||
|
},
|
||||||
groups = {cracky = 1, choppy = 1},
|
groups = {cracky = 1, choppy = 1},
|
||||||
sounds = default.node_sound_stone_defaults(),
|
sounds = default.node_sound_stone_defaults(),
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
|
@ -296,6 +359,7 @@ xdecor.register("enderchest", {
|
||||||
listring[current_player;enderchest]
|
listring[current_player;enderchest]
|
||||||
listring[current_player;main] ]]
|
listring[current_player;main] ]]
|
||||||
.. xbg .. default.get_hotbar_bg(0,5))
|
.. xbg .. default.get_hotbar_bg(0,5))
|
||||||
|
|
||||||
meta:set_string("infotext", "Ender Chest")
|
meta:set_string("infotext", "Ender Chest")
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -328,11 +392,16 @@ xdecor.register("lantern", {
|
||||||
paramtype2 = "wallmounted",
|
paramtype2 = "wallmounted",
|
||||||
walkable = false,
|
walkable = false,
|
||||||
groups = {snappy = 3, attached_node = 1},
|
groups = {snappy = 3, attached_node = 1},
|
||||||
tiles = {{name="xdecor_lantern.png", animation={type="vertical_frames", length=1.5}}},
|
tiles = {
|
||||||
|
{
|
||||||
|
name = "xdecor_lantern.png",
|
||||||
|
animation = {type="vertical_frames", length = 1.5}
|
||||||
|
}
|
||||||
|
},
|
||||||
selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}})
|
selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}})
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, l in pairs({"iron", "wooden"}) do
|
for _, l in ipairs({"iron", "wooden"}) do
|
||||||
xdecor.register(l .. "_lightbox", {
|
xdecor.register(l .. "_lightbox", {
|
||||||
description = l:gsub("^%l", string.upper) .. " Light Box",
|
description = l:gsub("^%l", string.upper) .. " Light Box",
|
||||||
tiles = {"xdecor_" .. l .. "_lightbox.png"},
|
tiles = {"xdecor_" .. l .. "_lightbox.png"},
|
||||||
|
@ -342,7 +411,7 @@ for _, l in pairs({"iron", "wooden"}) do
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium",
|
for _, f in ipairs({"dandelion_white", "dandelion_yellow", "geranium",
|
||||||
"rose", "tulip", "viola"}) do
|
"rose", "tulip", "viola"}) do
|
||||||
xdecor.register("potted_" .. f, {
|
xdecor.register("potted_" .. f, {
|
||||||
description = "Potted " .. f:gsub("%f[%w]%l", string.upper):gsub("_", " "),
|
description = "Potted " .. f:gsub("%f[%w]%l", string.upper):gsub("_", " "),
|
||||||
|
@ -357,8 +426,10 @@ for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium",
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "xdecor:potted_" .. f,
|
output = "xdecor:potted_" .. f,
|
||||||
recipe = {{"default:clay_brick", "flowers:"..f,
|
recipe = {
|
||||||
"default:clay_brick"}, {"", "default:clay_brick", ""}}
|
{"default:clay_brick", "flowers:" .. f, "default:clay_brick"},
|
||||||
|
{"", "default:clay_brick", ""}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -384,10 +455,12 @@ xdecor.register("painting_1", {
|
||||||
local num = math.random(4)
|
local num = math.random(4)
|
||||||
local leftover = minetest.item_place_node(
|
local leftover = minetest.item_place_node(
|
||||||
ItemStack("xdecor:painting_" .. num), placer, pointed_thing)
|
ItemStack("xdecor:painting_" .. num), placer, pointed_thing)
|
||||||
|
|
||||||
if leftover:get_count() == 0 and
|
if leftover:get_count() == 0 and
|
||||||
not minetest.setting_getbool("creative_mode") then
|
not minetest.setting_getbool("creative_mode") then
|
||||||
itemstack:take_item()
|
itemstack:take_item()
|
||||||
end
|
end
|
||||||
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -398,8 +471,13 @@ for i = 2, 4 do
|
||||||
paramtype2 = "wallmounted",
|
paramtype2 = "wallmounted",
|
||||||
drop = "xdecor:painting_1",
|
drop = "xdecor:painting_1",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2,
|
groups = {
|
||||||
attached_node=1, not_in_creative_inventory=1},
|
choppy = 3,
|
||||||
|
oddly_breakable_by_hand = 2,
|
||||||
|
flammable = 2,
|
||||||
|
attached_node = 1,
|
||||||
|
not_in_creative_inventory = 1
|
||||||
|
},
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
node_box = painting_box
|
node_box = painting_box
|
||||||
})
|
})
|
||||||
|
@ -436,10 +514,12 @@ register_hard_node("hard_clay", "Hardened Clay")
|
||||||
register_hard_node("moonbrick", "Moon Brick")
|
register_hard_node("moonbrick", "Moon Brick")
|
||||||
register_hard_node("stone_tile", "Stone Tile")
|
register_hard_node("stone_tile", "Stone Tile")
|
||||||
register_hard_node("stone_rune", "Runestone")
|
register_hard_node("stone_rune", "Runestone")
|
||||||
|
|
||||||
register_hard_node("packed_ice", "Packed Ice", {
|
register_hard_node("packed_ice", "Packed Ice", {
|
||||||
groups = {cracky = 1, puts_out_fire = 1, slippery = 3},
|
groups = {cracky = 1, puts_out_fire = 1, slippery = 3},
|
||||||
sounds = default.node_sound_glass_defaults()
|
sounds = default.node_sound_glass_defaults()
|
||||||
})
|
})
|
||||||
|
|
||||||
register_hard_node("wood_tile", "Wooden Tile", {
|
register_hard_node("wood_tile", "Wooden Tile", {
|
||||||
groups = {choppy = 1, wood = 1, flammable = 2},
|
groups = {choppy = 1, wood = 1, flammable = 2},
|
||||||
sounds = default.node_sound_wood_defaults()
|
sounds = default.node_sound_wood_defaults()
|
||||||
|
@ -469,7 +549,12 @@ xdecor.register("trampoline", {
|
||||||
tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"},
|
tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"},
|
||||||
groups = {cracky = 3, oddly_breakable_by_hand = 1, fall_damage_add_percent = -80, bouncy = 90},
|
groups = {cracky = 3, oddly_breakable_by_hand = 1, fall_damage_add_percent = -80, bouncy = 90},
|
||||||
node_box = xdecor.nodebox.slab_y(0.5),
|
node_box = xdecor.nodebox.slab_y(0.5),
|
||||||
sounds = {footstep = {name="xdecor_bouncy", gain=0.8}}
|
sounds = {
|
||||||
|
footstep = {
|
||||||
|
name = "xdecor_bouncy",
|
||||||
|
gain = 0.8
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
xdecor.register("tv", {
|
xdecor.register("tv", {
|
||||||
|
@ -477,12 +562,16 @@ xdecor.register("tv", {
|
||||||
light_source = 11,
|
light_source = 11,
|
||||||
groups = {cracky = 3, oddly_breakable_by_hand = 2},
|
groups = {cracky = 3, oddly_breakable_by_hand = 2},
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
tiles = {"xdecor_television_left.png^[transformR270",
|
tiles = {
|
||||||
|
"xdecor_television_left.png^[transformR270",
|
||||||
"xdecor_television_left.png^[transformR90",
|
"xdecor_television_left.png^[transformR90",
|
||||||
"xdecor_television_left.png^[transformFX",
|
"xdecor_television_left.png^[transformFX",
|
||||||
"xdecor_television_left.png", "xdecor_television_back.png",
|
"xdecor_television_left.png", "xdecor_television_back.png",
|
||||||
{name="xdecor_television_front_animated.png",
|
{
|
||||||
animation = {type="vertical_frames", length=80.0}} }
|
name = "xdecor_television_front_animated.png",
|
||||||
|
animation = {type = "vertical_frames", length = 80.0}
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
xdecor.register("woodframed_glass", {
|
xdecor.register("woodframed_glass", {
|
||||||
|
|
|
@ -95,6 +95,7 @@ minetest.register_craft({
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if not minetest.get_modpath("moreblocks") then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "xdecor:empty_shelf",
|
output = "xdecor:empty_shelf",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
@ -103,6 +104,7 @@ minetest.register_craft({
|
||||||
{"group:wood", "group:wood", "group:wood"}
|
{"group:wood", "group:wood", "group:wood"}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "xdecor:enderchest",
|
output = "xdecor:enderchest",
|
||||||
|
@ -201,7 +203,7 @@ minetest.register_craft({
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "xdecor:painting_1",
|
output = "xdecor:painting_1",
|
||||||
recipe = {
|
recipe = {
|
||||||
{"default:sign_wall_wood", "dye:blue"}
|
{"default:sign_wall_wood", "group:dye"}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ function rope.place(itemstack, placer, pointed_thing)
|
||||||
local pos = pointed_thing.above
|
local pos = pointed_thing.above
|
||||||
local oldnode = minetest.get_node(pos)
|
local oldnode = minetest.get_node(pos)
|
||||||
local stackname = itemstack:get_name()
|
local stackname = itemstack:get_name()
|
||||||
|
|
||||||
if minetest.is_protected(pos, placer:get_player_name()) then
|
if minetest.is_protected(pos, placer:get_player_name()) then
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
@ -18,6 +19,7 @@ function rope.place(itemstack, placer, pointed_thing)
|
||||||
oldnode = minetest.get_node(pos)
|
oldnode = minetest.get_node(pos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -31,8 +33,10 @@ function rope.remove(pos, oldnode, digger, rope_name)
|
||||||
below.y = below.y - 1
|
below.y = below.y - 1
|
||||||
num = num + 1
|
num = num + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if num == 0 then return end
|
if num == 0 then return end
|
||||||
digger_inv:add_item("main", rope_name.." "..num)
|
digger_inv:add_item("main", rope_name.." "..num)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -47,8 +51,10 @@ xdecor.register("rope", {
|
||||||
wield_image = "xdecor_rope_inv.png",
|
wield_image = "xdecor_rope_inv.png",
|
||||||
selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}),
|
selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}),
|
||||||
on_place = rope.place,
|
on_place = rope.place,
|
||||||
|
|
||||||
on_punch = function(pos, node, puncher, pointed_thing)
|
on_punch = function(pos, node, puncher, pointed_thing)
|
||||||
local player_name = puncher:get_player_name()
|
local player_name = puncher:get_player_name()
|
||||||
|
|
||||||
if not minetest.is_protected(pos, player_name) or
|
if not minetest.is_protected(pos, player_name) or
|
||||||
minetest.get_player_privs(player_name).protection_bypass then
|
minetest.get_player_privs(player_name).protection_bypass then
|
||||||
rope.remove(pos, node, puncher, "xdecor:rope")
|
rope.remove(pos, node, puncher, "xdecor:rope")
|
||||||
|
|
|
@ -23,6 +23,7 @@ setmetatable(nodes, {
|
||||||
for i = 1, #t2 do
|
for i = 1, #t2 do
|
||||||
t1[#t1 + 1] = t2[i]
|
t1[#t1 + 1] = t2[i]
|
||||||
end
|
end
|
||||||
|
|
||||||
return t1
|
return t1
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -44,21 +45,20 @@ workbench.defs = {
|
||||||
{ 0, 8, 8, 16, 8, 8 }},
|
{ 0, 8, 8, 16, 8, 8 }},
|
||||||
{"halfstair", 2, { 0, 0, 0, 8, 8, 16 },
|
{"halfstair", 2, { 0, 0, 0, 8, 8, 16 },
|
||||||
{ 0, 8, 8, 8, 8, 8 }},
|
{ 0, 8, 8, 8, 8, 8 }},
|
||||||
{"outerstair", 1, { 0, 0, 0, 16, 8, 16 },
|
{"stair_outer", 1, nil },
|
||||||
{ 0, 8, 8, 8, 8, 8 }},
|
|
||||||
{"stair", 1, nil },
|
{"stair", 1, nil },
|
||||||
{"innerstair", 1, { 0, 0, 0, 16, 8, 16 },
|
{"stair_inner", 1, nil }
|
||||||
{ 0, 8, 8, 16, 8, 8 },
|
|
||||||
{ 0, 8, 0, 8, 8, 8 }}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local repairable_tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"}
|
||||||
|
|
||||||
-- Tools allowed to be repaired
|
-- Tools allowed to be repaired
|
||||||
function workbench:repairable(stack)
|
function workbench:repairable(stack)
|
||||||
local tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"}
|
for _, t in ipairs(repairable_tools) do
|
||||||
for _, t in pairs(tools) do
|
if stack:find(t) then
|
||||||
if stack:find(t) then return true end
|
return true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function workbench:get_output(inv, input, name)
|
function workbench:get_output(inv, input, name)
|
||||||
|
@ -67,6 +67,7 @@ function workbench:get_output(inv, input, name)
|
||||||
local nbox = self.defs[i]
|
local nbox = self.defs[i]
|
||||||
local count = min(nbox[2] * input:get_count(), input:get_stack_max())
|
local count = min(nbox[2] * input:get_count(), input:get_stack_max())
|
||||||
local item = name .. "_" .. nbox[1]
|
local item = name .. "_" .. nbox[1]
|
||||||
|
|
||||||
item = nbox[3] and item or "stairs:" .. nbox[1] .. "_" .. name:match(":(.*)")
|
item = nbox[3] and item or "stairs:" .. nbox[1] .. "_" .. name:match(":(.*)")
|
||||||
output[#output + 1] = item .. " " .. count
|
output[#output + 1] = item .. " " .. count
|
||||||
end
|
end
|
||||||
|
@ -74,9 +75,8 @@ function workbench:get_output(inv, input, name)
|
||||||
inv:set_list("forms", output)
|
inv:set_list("forms", output)
|
||||||
end
|
end
|
||||||
|
|
||||||
local formspecs = {
|
local main_fs = [[
|
||||||
-- Main formspec
|
label[0.9,1.23;Cut]
|
||||||
[[ label[0.9,1.23;Cut]
|
|
||||||
label[0.9,2.23;Repair]
|
label[0.9,2.23;Repair]
|
||||||
box[-0.05,1;2.05,0.9;#555555]
|
box[-0.05,1;2.05,0.9;#555555]
|
||||||
box[-0.05,2;2.05,0.9;#555555]
|
box[-0.05,2;2.05,0.9;#555555]
|
||||||
|
@ -97,19 +97,34 @@ local formspecs = {
|
||||||
listring[current_player;main]
|
listring[current_player;main]
|
||||||
listring[context;forms]
|
listring[context;forms]
|
||||||
listring[current_player;main]
|
listring[current_player;main]
|
||||||
listring[context;input] ]],
|
listring[context;input]
|
||||||
-- Crafting formspec
|
]]
|
||||||
[[ image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]
|
|
||||||
|
local crafting_fs = [[
|
||||||
|
image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]
|
||||||
button[0,0;1.5,1;back;< Back]
|
button[0,0;1.5,1;back;< Back]
|
||||||
list[current_player;craft;2,0;3,3;]
|
list[current_player;craft;2,0;3,3;]
|
||||||
list[current_player;craftpreview;6,1;1,1;]
|
list[current_player;craftpreview;6,1;1,1;]
|
||||||
listring[current_player;main]
|
listring[current_player;main]
|
||||||
listring[current_player;craft] ]],
|
listring[current_player;craft]
|
||||||
-- Storage formspec
|
]]
|
||||||
[[ list[context;storage;0,1;8,2;]
|
|
||||||
|
local storage_fs = [[
|
||||||
|
list[context;storage;0,1;8,2;]
|
||||||
button[0,0;1.5,1;back;< Back]
|
button[0,0;1.5,1;back;< Back]
|
||||||
listring[context;storage]
|
listring[context;storage]
|
||||||
listring[current_player;main] ]]
|
listring[current_player;main]
|
||||||
|
]]
|
||||||
|
|
||||||
|
local formspecs = {
|
||||||
|
-- Main formspec
|
||||||
|
main_fs,
|
||||||
|
|
||||||
|
-- Crafting formspec
|
||||||
|
crafting_fs,
|
||||||
|
|
||||||
|
-- Storage formspec
|
||||||
|
storage_fs,
|
||||||
}
|
}
|
||||||
|
|
||||||
function workbench:set_formspec(meta, id)
|
function workbench:set_formspec(meta, id)
|
||||||
|
@ -134,11 +149,11 @@ end
|
||||||
|
|
||||||
function workbench.fields(pos, _, fields)
|
function workbench.fields(pos, _, fields)
|
||||||
if fields.quit then return end
|
if fields.quit then return end
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local id = fields.back and 1 or
|
local id = fields.back and 1 or fields.craft and 2 or fields.storage and 3
|
||||||
fields.craft and 2 or
|
|
||||||
fields.storage and 3
|
|
||||||
if not id then return end
|
if not id then return end
|
||||||
|
|
||||||
workbench:set_formspec(meta, id)
|
workbench:set_formspec(meta, id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -159,12 +174,13 @@ function workbench.timer(pos)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Tool's wearing range: 0-65535 | 0 = new condition
|
-- Tool's wearing range: 0-65535; 0 = new condition
|
||||||
tool:add_wear(-500)
|
tool:add_wear(-500)
|
||||||
hammer:add_wear(700)
|
hammer:add_wear(700)
|
||||||
|
|
||||||
inv:set_stack("tool", 1, tool)
|
inv:set_stack("tool", 1, tool)
|
||||||
inv:set_stack("hammer", 1, hammer)
|
inv:set_stack("hammer", 1, hammer)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -177,6 +193,7 @@ function workbench.put(_, listname, _, stack)
|
||||||
listname == "storage" then
|
listname == "storage" then
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end
|
end
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -226,9 +243,11 @@ xdecor.register("workbench", {
|
||||||
description = "Work Bench",
|
description = "Work Bench",
|
||||||
groups = {cracky = 2, choppy = 2, oddly_breakable_by_hand = 1},
|
groups = {cracky = 2, choppy = 2, oddly_breakable_by_hand = 1},
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
tiles = {"xdecor_workbench_top.png", "xdecor_workbench_top.png",
|
tiles = {
|
||||||
|
"xdecor_workbench_top.png","xdecor_workbench_top.png",
|
||||||
"xdecor_workbench_sides.png", "xdecor_workbench_sides.png",
|
"xdecor_workbench_sides.png", "xdecor_workbench_sides.png",
|
||||||
"xdecor_workbench_front.png", "xdecor_workbench_front.png"},
|
"xdecor_workbench_front.png", "xdecor_workbench_front.png"
|
||||||
|
},
|
||||||
on_rotate = screwdriver.rotate_simple,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
can_dig = workbench.dig,
|
can_dig = workbench.dig,
|
||||||
on_timer = workbench.timer,
|
on_timer = workbench.timer,
|
||||||
|
@ -240,12 +259,13 @@ xdecor.register("workbench", {
|
||||||
allow_metadata_inventory_move = workbench.move
|
allow_metadata_inventory_move = workbench.move
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, d in pairs(workbench.defs) do
|
for _, d in ipairs(workbench.defs) do
|
||||||
for i = 1, #nodes do
|
for i = 1, #nodes do
|
||||||
local node = nodes[i]
|
local node = nodes[i]
|
||||||
|
local mod_name, item_name = node:match("^(.-):(.*)")
|
||||||
local def = registered_nodes[node]
|
local def = registered_nodes[node]
|
||||||
|
|
||||||
if d[3] then
|
if item_name and d[3] then
|
||||||
local groups = {}
|
local groups = {}
|
||||||
local tiles
|
local tiles
|
||||||
groups.not_in_creative_inventory = 1
|
groups.not_in_creative_inventory = 1
|
||||||
|
@ -266,8 +286,8 @@ for i=1, #nodes do
|
||||||
tiles = {def.tile_images[1]}
|
tiles = {def.tile_images[1]}
|
||||||
end
|
end
|
||||||
|
|
||||||
if not registered_nodes["stairs:slab_"..node:match(":(.*)")] then
|
if not registered_nodes["stairs:slab_" .. item_name] then
|
||||||
stairs.register_stair_and_slab(node:match(":(.*)"), node,
|
stairs.register_stair_and_slab(item_name, node,
|
||||||
groups, tiles, def.description .. " Stair",
|
groups, tiles, def.description .. " Stair",
|
||||||
def.description .. " Slab", def.sounds)
|
def.description .. " Slab", def.sounds)
|
||||||
end
|
end
|
||||||
|
@ -285,6 +305,16 @@ for i=1, #nodes do
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
on_place = minetest.rotate_node
|
on_place = minetest.rotate_node
|
||||||
})
|
})
|
||||||
|
|
||||||
|
elseif item_name and mod_name then
|
||||||
|
minetest.register_alias_force(
|
||||||
|
("%s:%s_innerstair"):format(mod_name, item_name),
|
||||||
|
("stairs:stair_inner_%s"):format(item_name)
|
||||||
|
)
|
||||||
|
minetest.register_alias_force(
|
||||||
|
("%s:%s_outerstair"):format(mod_name, item_name),
|
||||||
|
("stairs:stair_outer_%s"):format(item_name)
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -295,7 +325,9 @@ minetest.register_tool("xdecor:hammer", {
|
||||||
description = "Hammer",
|
description = "Hammer",
|
||||||
inventory_image = "xdecor_hammer.png",
|
inventory_image = "xdecor_hammer.png",
|
||||||
wield_image = "xdecor_hammer.png",
|
wield_image = "xdecor_hammer.png",
|
||||||
on_use = function() do return end end
|
on_use = function() do
|
||||||
|
return end
|
||||||
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Recipes
|
-- Recipes
|
||||||
|
|
Loading…
Reference in New Issue