--------------------------------------------------------------------------------
function string.split(str, delim, include_empty, max_splits, sep_is_pattern)
delim = delim or ","
- max_splits = max_splits or -1
+ max_splits = max_splits or -2
local items = {}
- local pos, len, seplen = 1, #str, #delim
+ local pos, len = 1, #str
local plain = not sep_is_pattern
max_splits = max_splits + 1
repeat
return 0
end
+--------------------------------------------------------------------------------
+function math.factorial(x)
+ assert(x % 1 == 0 and x >= 0, "factorial expects a non-negative integer")
+ if x >= 171 then
+ -- 171! is greater than the biggest double, no need to calculate
+ return math.huge
+ end
+ local v = 1
+ for k = 2, x do
+ v = v * k
+ end
+ return v
+end
+
--------------------------------------------------------------------------------
function get_last_folder(text,count)
local parts = text:split(DIR_DELIM)
local dirs2 = {20, 23, 22, 21}
function core.rotate_and_place(itemstack, placer, pointed_thing,
- infinitestacks, orient_flags)
+ infinitestacks, orient_flags, prevent_after_place)
orient_flags = orient_flags or {}
local unode = core.get_node_or_nil(pointed_thing.under)
param2 = dirs1[fdir + 1]
elseif isceiling then
if orient_flags.force_facedir then
- cparam2 = 20
+ param2 = 20
else
param2 = dirs2[fdir + 1]
end
local old_itemstack = ItemStack(itemstack)
local new_itemstack, removed = core.item_place_node(
- itemstack, placer, pointed_thing, param2
+ itemstack, placer, pointed_thing, param2, prevent_after_place
)
return infinitestacks and old_itemstack or new_itemstack
end
local invert_wall = placer and placer:get_player_control().sneak or false
core.rotate_and_place(itemstack, placer, pointed_thing,
is_creative(name),
- {invert_wall = invert_wall})
+ {invert_wall = invert_wall}, true)
return itemstack
end
end
p.z = tonumber(p.z)
return p
end
- local p = {}
+ p = {}
p.x, p.y, p.z = string.match(value, "^%( *([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) *%)$")
if p.x and p.y and p.z then
p.x = tonumber(p.x)
end
return n
end
+
+
+function table.insert_all(t, other)
+ for i=1, #other do
+ t[#t + 1] = other[i]
+ end
+ return t
+end
+
+
--------------------------------------------------------------------------------
-- mainmenu only functions
--------------------------------------------------------------------------------
-- Returns the exact coordinate of a pointed surface
--------------------------------------------------------------------------------
function core.pointed_thing_to_face_pos(placer, pointed_thing)
+ -- Avoid crash in some situations when player is inside a node, causing
+ -- 'above' to equal 'under'.
+ if vector.equals(pointed_thing.above, pointed_thing.under) then
+ return pointed_thing.under
+ end
+
local eye_height = placer:get_properties().eye_height
local eye_offset_first = placer:get_eye_offset()
local node_pos = pointed_thing.under