mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-25 20:11:06 +01:00
update the village spawner and command
This commit is contained in:
parent
d3d99b402d
commit
ab11df59d5
19 changed files with 2100 additions and 116 deletions
|
@ -25,7 +25,8 @@ Mods Credit :
|
||||||
See README.txt in each mod directory for information about other authors.
|
See README.txt in each mod directory for information about other authors.
|
||||||
|
|
||||||
Credit for Support :
|
Credit for Support :
|
||||||
Tox82, MinetestForFun & Calinou for help
|
Tox82, MinetestForFun & Calinou for help in dev
|
||||||
|
GravGun & Obani for Help in Build struct
|
||||||
Celeron55 for creating Minetest
|
Celeron55 for creating Minetest
|
||||||
Bob Lennon because it's a pyro-barbare
|
Bob Lennon because it's a pyro-barbare
|
||||||
|
|
||||||
|
|
|
@ -135,7 +135,7 @@ worldedit.allocate = function(originpos, value)
|
||||||
end
|
end
|
||||||
elseif version == 3 then --previous list format
|
elseif version == 3 then --previous list format
|
||||||
for x, y, z, name, param1, param2 in value:gmatch("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do --match node entries
|
for x, y, z, name, param1, param2 in value:gmatch("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do --match node entries
|
||||||
x, y, z = originx + tonumber(x), originy + tonumber(y), originz + tonumber(z)
|
local x, y, z = originx + tonumber(x), originy + tonumber(y), originz + tonumber(z)
|
||||||
if x < pos1x then pos1x = x end
|
if x < pos1x then pos1x = x end
|
||||||
if y < pos1y then pos1y = y end
|
if y < pos1y then pos1y = y end
|
||||||
if z < pos1z then pos1z = z end
|
if z < pos1z then pos1z = z end
|
||||||
|
@ -166,7 +166,7 @@ worldedit.allocate = function(originpos, value)
|
||||||
count = #nodes
|
count = #nodes
|
||||||
for index = 1, count do
|
for index = 1, count do
|
||||||
local entry = nodes[index]
|
local entry = nodes[index]
|
||||||
x, y, z = originx + entry.x, originy + entry.y, originz + entry.z
|
local x, y, z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
if x < pos1x then pos1x = x end
|
if x < pos1x then pos1x = x end
|
||||||
if y < pos1y then pos1y = y end
|
if y < pos1y then pos1y = y end
|
||||||
if z < pos1z then pos1z = z end
|
if z < pos1z then pos1z = z end
|
||||||
|
|
273
mods/WorldEdit/worldedit/serialization.lua~
Normal file
273
mods/WorldEdit/worldedit/serialization.lua~
Normal file
|
@ -0,0 +1,273 @@
|
||||||
|
worldedit = worldedit or {}
|
||||||
|
local minetest = minetest --local copy of global
|
||||||
|
|
||||||
|
--modifies positions `pos1` and `pos2` so that each component of `pos1` is less than or equal to its corresponding conent of `pos2`, returning two new positions
|
||||||
|
worldedit.sort_pos = function(pos1, pos2)
|
||||||
|
pos1 = {x=pos1.x, y=pos1.y, z=pos1.z}
|
||||||
|
pos2 = {x=pos2.x, y=pos2.y, z=pos2.z}
|
||||||
|
if pos1.x > pos2.x then
|
||||||
|
pos2.x, pos1.x = pos1.x, pos2.x
|
||||||
|
end
|
||||||
|
if pos1.y > pos2.y then
|
||||||
|
pos2.y, pos1.y = pos1.y, pos2.y
|
||||||
|
end
|
||||||
|
if pos1.z > pos2.z then
|
||||||
|
pos2.z, pos1.z = pos1.z, pos2.z
|
||||||
|
end
|
||||||
|
return pos1, pos2
|
||||||
|
end
|
||||||
|
|
||||||
|
--determines the version of serialized data `value`, returning the version as a positive integer or 0 for unknown versions
|
||||||
|
worldedit.valueversion = function(value)
|
||||||
|
if value:find("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)") and not value:find("%{") then --previous list format
|
||||||
|
return 3
|
||||||
|
elseif value:find("^[^\"']+%{%d+%}") then
|
||||||
|
if value:find("%[\"meta\"%]") then --previous meta flat table format
|
||||||
|
return 2
|
||||||
|
end
|
||||||
|
return 1 --original flat table format
|
||||||
|
elseif value:find("%{") then --current nested table format
|
||||||
|
return 4
|
||||||
|
end
|
||||||
|
return 0 --unknown format
|
||||||
|
end
|
||||||
|
|
||||||
|
--converts the region defined by positions `pos1` and `pos2` into a single string, returning the serialized data and the number of nodes serialized
|
||||||
|
worldedit.serialize = function(pos1, pos2)
|
||||||
|
--make area stay loaded
|
||||||
|
local manip = minetest.get_voxel_manip()
|
||||||
|
manip:read_from_map(pos1, pos2)
|
||||||
|
|
||||||
|
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
||||||
|
local pos = {x=pos1.x, y=0, z=0}
|
||||||
|
local count = 0
|
||||||
|
local result = {}
|
||||||
|
local get_node, get_meta = minetest.get_node, minetest.get_meta
|
||||||
|
while pos.x <= pos2.x do
|
||||||
|
pos.y = pos1.y
|
||||||
|
while pos.y <= pos2.y do
|
||||||
|
pos.z = pos1.z
|
||||||
|
while pos.z <= pos2.z do
|
||||||
|
local node = get_node(pos)
|
||||||
|
if node.name ~= "air" and node.name ~= "ignore" then
|
||||||
|
count = count + 1
|
||||||
|
local meta = get_meta(pos):to_table()
|
||||||
|
|
||||||
|
--convert metadata itemstacks to itemstrings
|
||||||
|
for name, inventory in pairs(meta.inventory) do
|
||||||
|
for index, stack in ipairs(inventory) do
|
||||||
|
inventory[index] = stack.to_string and stack:to_string() or stack
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
result[count] = {
|
||||||
|
x = pos.x - pos1.x,
|
||||||
|
y = pos.y - pos1.y,
|
||||||
|
z = pos.z - pos1.z,
|
||||||
|
name = node.name,
|
||||||
|
param1 = node.param1,
|
||||||
|
param2 = node.param2,
|
||||||
|
meta = meta,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
pos.z = pos.z + 1
|
||||||
|
end
|
||||||
|
pos.y = pos.y + 1
|
||||||
|
end
|
||||||
|
pos.x = pos.x + 1
|
||||||
|
end
|
||||||
|
result = minetest.serialize(result) --convert entries to a string
|
||||||
|
return result, count
|
||||||
|
end
|
||||||
|
|
||||||
|
--determines the volume the nodes represented by string `value` would occupy if deserialized at `originpos`, returning the two corner positions and the number of nodes
|
||||||
|
--contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) by ChillCode, available under the MIT license (GPL compatible)
|
||||||
|
worldedit.allocate = function(originpos, value)
|
||||||
|
local huge = math.huge
|
||||||
|
local pos1x, pos1y, pos1z = huge, huge, huge
|
||||||
|
local pos2x, pos2y, pos2z = -huge, -huge, -huge
|
||||||
|
local originx, originy, originz = originpos.x, originpos.y, originpos.z
|
||||||
|
local count = 0
|
||||||
|
local version = worldedit.valueversion(value)
|
||||||
|
if version == 1 or version == 2 then --flat table format
|
||||||
|
--obtain the node table
|
||||||
|
local get_tables = loadstring(value)
|
||||||
|
if get_tables then --error loading value
|
||||||
|
return originpos, originpos, count
|
||||||
|
end
|
||||||
|
local tables = get_tables()
|
||||||
|
|
||||||
|
--transform the node table into an array of nodes
|
||||||
|
for i = 1, #tables do
|
||||||
|
for j, v in pairs(tables[i]) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
tables[i][j] = tables[v[1]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local nodes = tables[1]
|
||||||
|
|
||||||
|
--check the node array
|
||||||
|
count = #nodes
|
||||||
|
if version == 1 then --original flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local pos = entry[1]
|
||||||
|
local x, y, z = originx - pos.x, originy - pos.y, originz - pos.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
else --previous meta flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local x, y, z = originx - entry.x, originy - entry.y, originz - entry.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif version == 3 then --previous list format
|
||||||
|
for x, y, z, name, param1, param2 in value:gmatch("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do --match node entries
|
||||||
|
x, y, z = originx + tonumber(x), originy + tonumber(y), originz + tonumber(z)
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
elseif version == 4 then --current nested table format
|
||||||
|
--wip: this is a filthy hack that works surprisingly well
|
||||||
|
value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1)
|
||||||
|
local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end)
|
||||||
|
local startpos, startpos1, endpos = 1, 1
|
||||||
|
local nodes = {}
|
||||||
|
while true do
|
||||||
|
startpos, endpos = escaped:find("},%s*{", startpos)
|
||||||
|
if not startpos then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
local current = value:sub(startpos1, startpos)
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. current))
|
||||||
|
startpos, startpos1 = endpos, endpos
|
||||||
|
end
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. value:sub(startpos1)))
|
||||||
|
|
||||||
|
--local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT
|
||||||
|
|
||||||
|
count = #nodes
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
x, y, z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local pos1 = {x=pos1x, y=pos1y, z=pos1z}
|
||||||
|
local pos2 = {x=pos2x, y=pos2y, z=pos2z}
|
||||||
|
return pos1, pos2, count
|
||||||
|
end
|
||||||
|
|
||||||
|
--loads the nodes represented by string `value` at position `originpos`, returning the number of nodes deserialized
|
||||||
|
--contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) by ChillCode, available under the MIT license (GPL compatible)
|
||||||
|
worldedit.deserialize = function(originpos, value)
|
||||||
|
--make area stay loaded
|
||||||
|
local pos1, pos2 = worldedit.allocate(originpos, value)
|
||||||
|
local manip = minetest.get_voxel_manip()
|
||||||
|
manip:read_from_map(pos1, pos2)
|
||||||
|
|
||||||
|
local originx, originy, originz = originpos.x, originpos.y, originpos.z
|
||||||
|
local count = 0
|
||||||
|
local add_node, get_meta = minetest.add_node, minetest.get_meta
|
||||||
|
local version = worldedit.valueversion(value)
|
||||||
|
if version == 1 or version == 2 then --original flat table format
|
||||||
|
--obtain the node table
|
||||||
|
local get_tables = loadstring(value)
|
||||||
|
if not get_tables then --error loading value
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
local tables = get_tables()
|
||||||
|
|
||||||
|
--transform the node table into an array of nodes
|
||||||
|
for i = 1, #tables do
|
||||||
|
for j, v in pairs(tables[i]) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
tables[i][j] = tables[v[1]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local nodes = tables[1]
|
||||||
|
|
||||||
|
--load the node array
|
||||||
|
count = #nodes
|
||||||
|
if version == 1 then --original flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local pos = entry[1]
|
||||||
|
pos.x, pos.y, pos.z = originx - pos.x, originy - pos.y, originz - pos.z
|
||||||
|
add_node(pos, entry[2])
|
||||||
|
end
|
||||||
|
else --previous meta flat table format
|
||||||
|
for index = 1, #nodes do
|
||||||
|
local entry = nodes[index]
|
||||||
|
entry.x, entry.y, entry.z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
add_node(entry, entry) --entry acts both as position and as node
|
||||||
|
get_meta(entry):from_table(entry.meta)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif version == 3 then --previous list format
|
||||||
|
local pos = {x=0, y=0, z=0}
|
||||||
|
local node = {name="", param1=0, param2=0}
|
||||||
|
for x, y, z, name, param1, param2 in value:gmatch("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do --match node entries
|
||||||
|
pos.x, pos.y, pos.z = originx + tonumber(x), originy + tonumber(y), originz + tonumber(z)
|
||||||
|
node.name, node.param1, node.param2 = name, param1, param2
|
||||||
|
add_node(pos, node)
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
elseif version == 4 then --current nested table format
|
||||||
|
--wip: this is a filthy hack that works surprisingly well
|
||||||
|
value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1)
|
||||||
|
local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end)
|
||||||
|
local startpos, startpos1, endpos = 1, 1
|
||||||
|
local nodes = {}
|
||||||
|
while true do
|
||||||
|
startpos, endpos = escaped:find("},%s*{", startpos)
|
||||||
|
if not startpos then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
local current = value:sub(startpos1, startpos)
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. current))
|
||||||
|
startpos, startpos1 = endpos, endpos
|
||||||
|
end
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. value:sub(startpos1)))
|
||||||
|
|
||||||
|
--local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT
|
||||||
|
|
||||||
|
--load the nodes
|
||||||
|
count = #nodes
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
entry.x, entry.y, entry.z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
add_node(entry, entry) --entry acts both as position and as node
|
||||||
|
end
|
||||||
|
|
||||||
|
--load the metadata
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
get_meta(entry):from_table(entry.meta)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return count
|
||||||
|
end
|
16
mods/command/debug.lua
Normal file
16
mods/command/debug.lua
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
minetest.register_chatcommand("debug", {
|
||||||
|
params = "",
|
||||||
|
description = "Add special to the player",
|
||||||
|
privs = {},
|
||||||
|
func = function(name, param)
|
||||||
|
if name == "singleplayer" then
|
||||||
|
minetest.chat_send_all("/grant singleplayer all")
|
||||||
|
local receiverref = core.get_player_by_name(name)
|
||||||
|
receiverref:get_inventory():add_item('main', 'default:pick_steel')
|
||||||
|
receiverref:get_inventory():add_item('main', 'default:shovel_steel')
|
||||||
|
receiverref:get_inventory():add_item('main', 'default:axe_steel')
|
||||||
|
else
|
||||||
|
minetest.chat_send_player(name, "Only SinglePlayer commande")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
53
mods/command/gm.lua
Normal file
53
mods/command/gm.lua
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
local god_mode = false
|
||||||
|
|
||||||
|
vanished_players = {}
|
||||||
|
|
||||||
|
minetest.register_privilege("vanish", "Allow to use /vanish command")
|
||||||
|
|
||||||
|
minetest.register_chatcommand("vanish", {
|
||||||
|
params = "",
|
||||||
|
description = "Make user invisible at eye of all",
|
||||||
|
privs = {vanish = true},
|
||||||
|
func = function(name, param)
|
||||||
|
local prop
|
||||||
|
vanished_players[name] = not vanished_players[name]
|
||||||
|
|
||||||
|
if vanished_players[name] then
|
||||||
|
prop = {visual_size = {x=0, y=0}, collisionbox = {0,0,0,0,0,0}}
|
||||||
|
minetest.chat_send_player(name, "Vannish Command: You are Invisible now")
|
||||||
|
else
|
||||||
|
-- default player size
|
||||||
|
prop = {visual_size = {x=1, y=1},
|
||||||
|
collisionbox = {-0.35, -1, -0.35, 0.35, 1, 0.35}}
|
||||||
|
minetest.chat_send_player(name, "Vannish Command: You are Visible now")
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.get_player_by_name(name):set_properties(prop)
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_privilege("god", "Allow to use /god command")
|
||||||
|
|
||||||
|
minetest.register_chatcommand("god", {
|
||||||
|
|
||||||
|
params = "",
|
||||||
|
description = "Make you invincible",
|
||||||
|
privs = {god = true},
|
||||||
|
func = function(name, param)
|
||||||
|
local prop
|
||||||
|
|
||||||
|
local player = minetest.get_player_by_name(name)
|
||||||
|
|
||||||
|
if god_mode == false then
|
||||||
|
player:set_hp(9999)
|
||||||
|
minetest.item_eat(9999)
|
||||||
|
minetest.chat_send_player(name, "God Command: You are Invincible")
|
||||||
|
else
|
||||||
|
player:set_hp(20)
|
||||||
|
minetest.chat_send_player(name, "God Command: You can die now")
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.get_player_by_name(name):set_properties(prop)
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
INFO_BLANK = "To find out more about certain items type the command '/info' with the params 'update', 'version', 'creative', 'suprise'"
|
INFO_BLANK = "To find out more about certain items type the command '/info' with the params 'update', 'version', 'creative', 'suprise'"
|
||||||
INFO_VERSION = "0.1"
|
INFO_VERSION = "0.24"
|
||||||
INFO_UPDATE = "I think nether ... but lot of monster before"
|
INFO_UPDATE = "I think finish the struct system"
|
||||||
INFO_CREATIVE = "Type the command '/gamemode ' and use the params '0' or 's' for survival and '1' or 'c' for creative"
|
INFO_CREATIVE = "Type the command '/gamemode ' and use the params '0' or 's' for survival and '1' or 'c' for creative"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
local path = minetest.get_modpath(minetest.get_current_modname())
|
local path = minetest.get_modpath(minetest.get_current_modname())
|
||||||
|
|
||||||
|
|
||||||
-- Load Info command
|
-- Load Info command
|
||||||
dofile(path.."/info.lua")
|
dofile(path.."/info.lua")
|
||||||
|
|
||||||
-- Load vanish command
|
-- Load GM command
|
||||||
dofile(path.."/vanish.lua")
|
dofile(path.."/gm.lua")
|
||||||
|
|
||||||
-- Load time command
|
-- Load time command
|
||||||
dofile(path.."/time.lua")
|
dofile(path.."/time.lua")
|
||||||
|
@ -12,6 +13,9 @@ dofile(path.."/time.lua")
|
||||||
-- Load kits command
|
-- Load kits command
|
||||||
dofile(path.."/kits.lua")
|
dofile(path.."/kits.lua")
|
||||||
|
|
||||||
|
-- Load debug command
|
||||||
|
dofile(path.."/debug.lua")
|
||||||
|
|
||||||
-- By VanessaE, sfan5, and kaeza.
|
-- By VanessaE, sfan5, and kaeza.
|
||||||
local disallowed = {
|
local disallowed = {
|
||||||
["guest"] = "Guest accounts are disallowed on this server. "..
|
["guest"] = "Guest accounts are disallowed on this server. "..
|
||||||
|
|
|
@ -4,13 +4,14 @@ minetest.register_chatcommand("kit", {
|
||||||
privs = {},
|
privs = {},
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
if param == "" then
|
if param == "" then
|
||||||
minetest.chat_send_player(name, "No kit selected use ... Aviable : noob , pvp")
|
minetest.chat_send_player(name, "No kit selected ... ")
|
||||||
|
minetest.chat_send_player(name, "List of Kit: noob , pvp")
|
||||||
end
|
end
|
||||||
local receiverref = core.get_player_by_name(name)
|
local receiverref = core.get_player_by_name(name)
|
||||||
if param == "noob" then
|
if param == "noob" then
|
||||||
receiverref:get_inventory():add_item('main', 'default:pick_steel')
|
receiverref:get_inventory():add_item('main', 'default:pick_steel')
|
||||||
receiverref:get_inventory():add_item('main', 'default:shovel_steel')
|
receiverref:get_inventory():add_item('main', 'default:shovel_steel')
|
||||||
receiverref:get_inventory():add_item('main', 'default:torch 16')
|
receiverref:get_inventory():add_item('main', 'torch:torch 16')
|
||||||
receiverref:get_inventory():add_item('main', 'default:axe_steel')
|
receiverref:get_inventory():add_item('main', 'default:axe_steel')
|
||||||
receiverref:get_inventory():add_item('main', 'default:cobble 64')
|
receiverref:get_inventory():add_item('main', 'default:cobble 64')
|
||||||
end
|
end
|
||||||
|
@ -23,4 +24,4 @@ minetest.register_chatcommand("kit", {
|
||||||
receiverref:get_inventory():add_item('main', '3d_armor:boots_diamond')
|
receiverref:get_inventory():add_item('main', '3d_armor:boots_diamond')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
|
@ -4,11 +4,11 @@ minetest.register_chatcommand("night", {
|
||||||
description = "Make the night",
|
description = "Make the night",
|
||||||
privs = {settime = true},
|
privs = {settime = true},
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local player = minetest.env:get_player_by_name(name)
|
local player = minetest.get_player_by_name(name)
|
||||||
if not player then
|
if not player then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
minetest.env:set_timeofday(0.22)
|
minetest.set_timeofday(0.22)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -17,11 +17,11 @@ minetest.register_chatcommand("day", {
|
||||||
description = "Make the day wakeup",
|
description = "Make the day wakeup",
|
||||||
privs = {settime = true},
|
privs = {settime = true},
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local player = minetest.env:get_player_by_name(name)
|
local player = minetest.get_player_by_name(name)
|
||||||
if not player then
|
if not player then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
minetest.env:set_timeofday(0.6)
|
minetest.set_timeofday(0.6)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
local z = math.random(0, 9)/3
|
local z = math.random(0, 9)/3
|
||||||
pos.x = pos.x + x
|
pos.x = pos.x + x
|
||||||
pos.z = pos.z + z
|
pos.z = pos.z + z
|
||||||
minetest.env:add_item(pos, stack)
|
minetest.add_item(pos, stack)
|
||||||
stack:clear()
|
stack:clear()
|
||||||
inv:set_stack("main", i, stack)
|
inv:set_stack("main", i, stack)
|
||||||
pos.x = pos.x - x
|
pos.x = pos.x - x
|
||||||
|
@ -24,11 +24,11 @@
|
||||||
--
|
--
|
||||||
|
|
||||||
default.cool_lava_source = function(pos)
|
default.cool_lava_source = function(pos)
|
||||||
minetest.env:set_node(pos, {name="default:obsidian"})
|
minetest.set_node(pos, {name="default:obsidian"})
|
||||||
end
|
end
|
||||||
|
|
||||||
default.cool_lava_flowing = function(pos)
|
default.cool_lava_flowing = function(pos)
|
||||||
minetest.env:set_node(pos, {name="default:stone"})
|
minetest.set_node(pos, {name="default:stone"})
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
|
@ -58,17 +58,17 @@ minetest.register_abm({
|
||||||
-- Functions
|
-- Functions
|
||||||
grow_cactus = function(pos, node)
|
grow_cactus = function(pos, node)
|
||||||
pos.y = pos.y-1
|
pos.y = pos.y-1
|
||||||
local name = minetest.env:get_node(pos).name
|
local name = minetest.get_node(pos).name
|
||||||
if minetest.get_item_group(name, "sand") ~= 0 then
|
if minetest.get_item_group(name, "sand") ~= 0 then
|
||||||
pos.y = pos.y+1
|
pos.y = pos.y+1
|
||||||
local height = 0
|
local height = 0
|
||||||
while minetest.env:get_node(pos).name == "default:cactus" and height < 4 do
|
while minetest.get_node(pos).name == "default:cactus" and height < 4 do
|
||||||
height = height+1
|
height = height+1
|
||||||
pos.y = pos.y+1
|
pos.y = pos.y+1
|
||||||
end
|
end
|
||||||
if height < 4 then
|
if height < 4 then
|
||||||
if minetest.env:get_node(pos).name == "air" then
|
if minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:set_node(pos, {name="default:cactus"})
|
minetest.set_node(pos, {name="default:cactus"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -76,20 +76,20 @@ end
|
||||||
|
|
||||||
grow_reeds = function(pos, node)
|
grow_reeds = function(pos, node)
|
||||||
pos.y = pos.y-1
|
pos.y = pos.y-1
|
||||||
local name = minetest.env:get_node(pos).name
|
local name = minetest.get_node(pos).name
|
||||||
if name == "default:dirt" or name == "default:dirt_with_grass" then
|
if name == "default:dirt" or name == "default:dirt_with_grass" then
|
||||||
if minetest.env:find_node_near(pos, 3, {"group:water"}) == nil then
|
if minetest.find_node_near(pos, 3, {"group:water"}) == nil then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
pos.y = pos.y+1
|
pos.y = pos.y+1
|
||||||
local height = 0
|
local height = 0
|
||||||
while minetest.env:get_node(pos).name == "default:reeds" and height < 3 do
|
while minetest.get_node(pos).name == "default:reeds" and height < 3 do
|
||||||
height = height+1
|
height = height+1
|
||||||
pos.y = pos.y+1
|
pos.y = pos.y+1
|
||||||
end
|
end
|
||||||
if height < 3 then
|
if height < 3 then
|
||||||
if minetest.env:get_node(pos).name == "air" then
|
if minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:set_node(pos, {name="default:reeds"})
|
minetest.set_node(pos, {name="default:reeds"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -106,11 +106,11 @@ minetest.register_abm({
|
||||||
for xp=-1,1 do
|
for xp=-1,1 do
|
||||||
for zp=-1,1 do
|
for zp=-1,1 do
|
||||||
local p = {x=pos.x+xp, y=pos.y, z=pos.z+zp}
|
local p = {x=pos.x+xp, y=pos.y, z=pos.z+zp}
|
||||||
local n = minetest.env:get_node(p)
|
local n = minetest.get_node(p)
|
||||||
-- On verifie si il y a de l'eau
|
-- On verifie si il y a de l'eau
|
||||||
if (n.name=="default:water_flowing") then
|
if (n.name=="default:water_flowing") then
|
||||||
drop_attached_node(pos)
|
drop_attached_node(pos)
|
||||||
minetest.env:dig_node(pos)
|
minetest.dig_node(pos)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -118,11 +118,11 @@ minetest.register_abm({
|
||||||
-- cas rare
|
-- cas rare
|
||||||
for yp=-1,1 do
|
for yp=-1,1 do
|
||||||
local p = {x=pos.x, y=pos.y+yp, z=pos.z}
|
local p = {x=pos.x, y=pos.y+yp, z=pos.z}
|
||||||
local n = minetest.env:get_node(p)
|
local n = minetest.get_node(p)
|
||||||
-- On verifie si il y a de l'eau
|
-- On verifie si il y a de l'eau
|
||||||
if (n.name=="default:water_flowing") then
|
if (n.name=="default:water_flowing") then
|
||||||
drop_attached_node(pos)
|
drop_attached_node(pos)
|
||||||
minetest.env:dig_node(pos)
|
minetest.dig_node(pos)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -161,9 +161,9 @@ minetest.register_on_dignode(function(pos, node)
|
||||||
while timber_nodenames[i]~=nil do
|
while timber_nodenames[i]~=nil do
|
||||||
if node.name==timber_nodenames[i] then
|
if node.name==timber_nodenames[i] then
|
||||||
np={x=pos.x, y=pos.y+1, z=pos.z}
|
np={x=pos.x, y=pos.y+1, z=pos.z}
|
||||||
while minetest.env:get_node(np).name==timber_nodenames[i] do
|
while minetest.get_node(np).name==timber_nodenames[i] do
|
||||||
minetest.env:remove_node(np)
|
minetest.remove_node(np)
|
||||||
minetest.env:add_item(np, timber_nodenames[i])
|
minetest.add_item(np, timber_nodenames[i])
|
||||||
np={x=np.x, y=np.y+1, z=np.z}
|
np={x=np.x, y=np.y+1, z=np.z}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -183,9 +183,9 @@ function get_nodedef_field(nodename, fieldname)
|
||||||
end
|
end
|
||||||
|
|
||||||
function set_fire(pointed_thing)
|
function set_fire(pointed_thing)
|
||||||
local n = minetest.env:get_node(pointed_thing.above)
|
local n = minetest.get_node(pointed_thing.above)
|
||||||
if n.name ~= "" and n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then
|
if n.name ~= "" and n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then
|
||||||
minetest.env:add_node(pointed_thing.above, {name="fire:basic_flame"})
|
minetest.add_node(pointed_thing.above, {name="fire:basic_flame"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -229,17 +229,17 @@ end
|
||||||
|
|
||||||
function generate_tree(pos, trunk, leaves, typearbre)
|
function generate_tree(pos, trunk, leaves, typearbre)
|
||||||
pos.y = pos.y-1
|
pos.y = pos.y-1
|
||||||
local nodename = minetest.env:get_node(pos).name
|
local nodename = minetest.get_node(pos).name
|
||||||
|
|
||||||
pos.y = pos.y+1
|
pos.y = pos.y+1
|
||||||
if not minetest.env:get_node_light(pos) then
|
if not minetest.get_node_light(pos) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if typearbre == nil or typearbre == 1 then
|
if typearbre == nil or typearbre == 1 then
|
||||||
node = {name = ""}
|
node = {name = ""}
|
||||||
for dy=1,4 do
|
for dy=1,4 do
|
||||||
pos.y = pos.y+dy
|
pos.y = pos.y+dy
|
||||||
if minetest.env:get_node(pos).name ~= "air" then
|
if minetest.get_node(pos).name ~= "air" then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
pos.y = pos.y-dy
|
pos.y = pos.y-dy
|
||||||
|
@ -247,8 +247,8 @@ function generate_tree(pos, trunk, leaves, typearbre)
|
||||||
node = {name = trunk}
|
node = {name = trunk}
|
||||||
for dy=0,4 do
|
for dy=0,4 do
|
||||||
pos.y = pos.y+dy
|
pos.y = pos.y+dy
|
||||||
if minetest.env:get_node(pos).name == "air" then
|
if minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
end
|
end
|
||||||
pos.y = pos.y-dy
|
pos.y = pos.y-dy
|
||||||
end
|
end
|
||||||
|
@ -267,40 +267,40 @@ function generate_tree(pos, trunk, leaves, typearbre)
|
||||||
pos.z = pos.z+dz
|
pos.z = pos.z+dz
|
||||||
|
|
||||||
if dx == 0 and dz == 0 and dy==3 then
|
if dx == 0 and dz == 0 and dy==3 then
|
||||||
if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
if rarity == 1 then
|
if rarity == 1 then
|
||||||
minetest.env:add_node(pos, apple_leave())
|
minetest.add_node(pos, apple_leave())
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, air_leave())
|
minetest.add_node(pos, air_leave())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif dx == 0 and dz == 0 and dy==4 then
|
elseif dx == 0 and dz == 0 and dy==4 then
|
||||||
if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
if rarity == 1 then
|
if rarity == 1 then
|
||||||
minetest.env:add_node(pos, apple_leave())
|
minetest.add_node(pos, apple_leave())
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, air_leave())
|
minetest.add_node(pos, air_leave())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
|
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
|
||||||
if minetest.env:get_node(pos).name == "air" then
|
if minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
if rarity == 1 then
|
if rarity == 1 then
|
||||||
minetest.env:add_node(pos, apple_leave())
|
minetest.add_node(pos, apple_leave())
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, air_leave())
|
minetest.add_node(pos, air_leave())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
|
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
|
||||||
if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
if rarity == 1 then
|
if rarity == 1 then
|
||||||
minetest.env:add_node(pos, apple_leave())
|
minetest.add_node(pos, apple_leave())
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, air_leave())
|
minetest.add_node(pos, air_leave())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -318,7 +318,7 @@ function generate_tree(pos, trunk, leaves, typearbre)
|
||||||
local tree_size = math.random(15, 25)
|
local tree_size = math.random(15, 25)
|
||||||
for dy=1,4 do
|
for dy=1,4 do
|
||||||
pos.y = pos.y+dy
|
pos.y = pos.y+dy
|
||||||
if minetest.env:get_node(pos).name ~= "air" then
|
if minetest.get_node(pos).name ~= "air" then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
pos.y = pos.y-dy
|
pos.y = pos.y-dy
|
||||||
|
@ -329,14 +329,14 @@ function generate_tree(pos, trunk, leaves, typearbre)
|
||||||
for dz=0,1 do
|
for dz=0,1 do
|
||||||
pos.z = pos.z + dz
|
pos.z = pos.z + dz
|
||||||
--> 0
|
--> 0
|
||||||
if minetest.env:get_node(pos).name == "default:dirt_with_grass"
|
if minetest.get_node(pos).name == "default:dirt_with_grass"
|
||||||
or minetest.env:get_node(pos).name == "default:dirt" then else
|
or minetest.get_node(pos).name == "default:dirt" then else
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
pos.x = pos.x+1
|
pos.x = pos.x+1
|
||||||
--> 1
|
--> 1
|
||||||
if minetest.env:get_node(pos).name == "default:dirt_with_grass"
|
if minetest.get_node(pos).name == "default:dirt_with_grass"
|
||||||
or minetest.env:get_node(pos).name == "default:dirt" then else
|
or minetest.get_node(pos).name == "default:dirt" then else
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
pos.x = pos.x-1
|
pos.x = pos.x-1
|
||||||
|
@ -353,43 +353,43 @@ function generate_tree(pos, trunk, leaves, typearbre)
|
||||||
for dz=-1,2 do
|
for dz=-1,2 do
|
||||||
if dz == -1 then
|
if dz == -1 then
|
||||||
pos.z = pos.z + dz
|
pos.z = pos.z + dz
|
||||||
if math.random(1, 3) == 1 and minetest.env:get_node(pos).name == "air" then
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, {name = "default:vine", param2 = 4})
|
minetest.add_node(pos, {name = "default:vine", param2 = 4})
|
||||||
end
|
end
|
||||||
pos.x = pos.x+1
|
pos.x = pos.x+1
|
||||||
if math.random(1, 3) == 1 and minetest.env:get_node(pos).name == "air" then
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, {name = "default:vine", param2 = 4})
|
minetest.add_node(pos, {name = "default:vine", param2 = 4})
|
||||||
end
|
end
|
||||||
pos.x = pos.x-1
|
pos.x = pos.x-1
|
||||||
pos.z = pos.z - dz
|
pos.z = pos.z - dz
|
||||||
elseif dz == 2 then
|
elseif dz == 2 then
|
||||||
pos.z = pos.z + dz
|
pos.z = pos.z + dz
|
||||||
if math.random(1, 3) == 1 and minetest.env:get_node(pos).name == "air"then
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air"then
|
||||||
minetest.env:add_node(pos, {name = "default:vine", param2 = 5})
|
minetest.add_node(pos, {name = "default:vine", param2 = 5})
|
||||||
end
|
end
|
||||||
pos.x = pos.x+1
|
pos.x = pos.x+1
|
||||||
if math.random(1, 3) == 1 and minetest.env:get_node(pos).name == "air" then
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, {name = "default:vine", param2 = 5})
|
minetest.add_node(pos, {name = "default:vine", param2 = 5})
|
||||||
end
|
end
|
||||||
pos.x = pos.x-1
|
pos.x = pos.x-1
|
||||||
pos.z = pos.z - dz
|
pos.z = pos.z - dz
|
||||||
else
|
else
|
||||||
pos.z = pos.z + dz
|
pos.z = pos.z + dz
|
||||||
pos.x = pos.x-1
|
pos.x = pos.x-1
|
||||||
if math.random(1, 3) == 1 and minetest.env:get_node(pos).name == "air" then
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, {name = "default:vine", param2 = 2})
|
minetest.add_node(pos, {name = "default:vine", param2 = 2})
|
||||||
end
|
end
|
||||||
pos.x = pos.x+1
|
pos.x = pos.x+1
|
||||||
if minetest.env:get_node(pos).name == "air" then
|
if minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, {name = trunk, param2=2})
|
minetest.add_node(pos, {name = trunk, param2=2})
|
||||||
end
|
end
|
||||||
pos.x = pos.x+1
|
pos.x = pos.x+1
|
||||||
if minetest.env:get_node(pos).name == "air" then
|
if minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, {name = trunk, param2=2})
|
minetest.add_node(pos, {name = trunk, param2=2})
|
||||||
end
|
end
|
||||||
pos.x = pos.x+1
|
pos.x = pos.x+1
|
||||||
if math.random(1, 3) == 1 and minetest.env:get_node(pos).name == "air" then
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, {name = "default:vine", param2 = 3})
|
minetest.add_node(pos, {name = "default:vine", param2 = 3})
|
||||||
end
|
end
|
||||||
pos.x = pos.x-2
|
pos.x = pos.x-2
|
||||||
pos.z = pos.z - dz
|
pos.z = pos.z - dz
|
||||||
|
@ -410,26 +410,26 @@ function generate_tree(pos, trunk, leaves, typearbre)
|
||||||
pos.z = pos.z+dz
|
pos.z = pos.z+dz
|
||||||
|
|
||||||
if dx == 0 and dz == 0 and dy==3 then
|
if dx == 0 and dz == 0 and dy==3 then
|
||||||
if minetest.env:get_node(pos).name == "air" or minetest.env:get_node(pos).name == "default:vine" and math.random(1, 2) == 1 then
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "default:vine" and math.random(1, 2) == 1 then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
end
|
end
|
||||||
elseif dx == 0 and dz == 0 and dy==4 then
|
elseif dx == 0 and dz == 0 and dy==4 then
|
||||||
if minetest.env:get_node(pos).name == "air" or minetest.env:get_node(pos).name == "default:vine" and math.random(1, 5) == 1 then
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "default:vine" and math.random(1, 5) == 1 then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
minetest.env:add_node(pos, air_leave())
|
minetest.add_node(pos, air_leave())
|
||||||
end
|
end
|
||||||
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
|
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
|
||||||
if minetest.env:get_node(pos).name == "air" or minetest.env:get_node(pos).name == "default:vine" then
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "default:vine" then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
|
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
|
||||||
if minetest.env:get_node(pos).name == "air" or minetest.env:get_node(pos).name == "default:vine" and math.random(1, 3) == 1 then
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "default:vine" and math.random(1, 3) == 1 then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if math.random(1, 5) == 1 and minetest.env:get_node(pos).name == "air" then
|
if math.random(1, 5) == 1 and minetest.get_node(pos).name == "air" then
|
||||||
minetest.env:add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -471,51 +471,51 @@ end)
|
||||||
|
|
||||||
function duengen(pointed_thing)
|
function duengen(pointed_thing)
|
||||||
pos = pointed_thing.under
|
pos = pointed_thing.under
|
||||||
n = minetest.env:get_node(pos)
|
n = minetest.get_node(pos)
|
||||||
if n.name == "" then return end
|
if n.name == "" then return end
|
||||||
local stage = ""
|
local stage = ""
|
||||||
if n.name == "default:sapling" then
|
if n.name == "default:sapling" then
|
||||||
minetest.env:add_node(pos, {name="air"})
|
minetest.add_node(pos, {name="air"})
|
||||||
generate_tree(pos, "default:tree", "default:leaves", 1)
|
generate_tree(pos, "default:tree", "default:leaves", 1)
|
||||||
elseif string.find(n.name, "farming:wheat_") ~= nil then
|
elseif string.find(n.name, "farming:wheat_") ~= nil then
|
||||||
stage = string.sub(n.name, 15)
|
stage = string.sub(n.name, 15)
|
||||||
if stage == "3" then
|
if stage == "3" then
|
||||||
minetest.env:add_node(pos, {name="farming:wheat"})
|
minetest.add_node(pos, {name="farming:wheat"})
|
||||||
elseif math.random(1,5) < 3 then
|
elseif math.random(1,5) < 3 then
|
||||||
minetest.env:add_node(pos, {name="farming:wheat"})
|
minetest.add_node(pos, {name="farming:wheat"})
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, {name="farming:wheat_"..math.random(2,3)})
|
minetest.add_node(pos, {name="farming:wheat_"..math.random(2,3)})
|
||||||
end
|
end
|
||||||
elseif string.find(n.name, "farming:potato_") ~= nil then
|
elseif string.find(n.name, "farming:potato_") ~= nil then
|
||||||
stage = tonumber(string.sub(n.name, 16))
|
stage = tonumber(string.sub(n.name, 16))
|
||||||
if stage == 1 then
|
if stage == 1 then
|
||||||
minetest.env:add_node(pos, {name="farming:potato_"..math.random(stage,2)})
|
minetest.add_node(pos, {name="farming:potato_"..math.random(stage,2)})
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, {name="farming:potato"})
|
minetest.add_node(pos, {name="farming:potato"})
|
||||||
end
|
end
|
||||||
elseif string.find(n.name, "farming:carrot_") ~= nil then
|
elseif string.find(n.name, "farming:carrot_") ~= nil then
|
||||||
stage = tonumber(string.sub(n.name, 16))
|
stage = tonumber(string.sub(n.name, 16))
|
||||||
if stage == 1 then
|
if stage == 1 then
|
||||||
minetest.env:add_node(pos, {name="farming:carrot_"..math.random(stage,2)})
|
minetest.add_node(pos, {name="farming:carrot_"..math.random(stage,2)})
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, {name="farming:carrot"})
|
minetest.add_node(pos, {name="farming:carrot"})
|
||||||
end
|
end
|
||||||
elseif string.find(n.name, "farming:pumpkin_") ~= nil then
|
elseif string.find(n.name, "farming:pumpkin_") ~= nil then
|
||||||
stage = tonumber(string.sub(n.name, 17))
|
stage = tonumber(string.sub(n.name, 17))
|
||||||
if stage == 1 then
|
if stage == 1 then
|
||||||
minetest.env:add_node(pos, {name="farming:pumpkin_"..math.random(stage,2)})
|
minetest.add_node(pos, {name="farming:pumpkin_"..math.random(stage,2)})
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, {name="farming:pumpkintige_unconnect"})
|
minetest.add_node(pos, {name="farming:pumpkintige_unconnect"})
|
||||||
end
|
end
|
||||||
elseif string.find(n.name, "farming:melontige_") ~= nil then
|
elseif string.find(n.name, "farming:melontige_") ~= nil then
|
||||||
stage = tonumber(string.sub(n.name, 18))
|
stage = tonumber(string.sub(n.name, 18))
|
||||||
if stage == 1 then
|
if stage == 1 then
|
||||||
minetest.env:add_node(pos, {name="farming:melontige_"..math.random(stage,2)})
|
minetest.add_node(pos, {name="farming:melontige_"..math.random(stage,2)})
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, {name="farming:melontige_unconnect"})
|
minetest.add_node(pos, {name="farming:melontige_unconnect"})
|
||||||
end
|
end
|
||||||
elseif n.name ~= "" and n.name == "default:junglesapling" then
|
elseif n.name ~= "" and n.name == "default:junglesapling" then
|
||||||
minetest.env:add_node(pos, {name="air"})
|
minetest.add_node(pos, {name="air"})
|
||||||
generate_tree(pos, "default:jungletree", "default:jungleleaves", 2)
|
generate_tree(pos, "default:jungletree", "default:jungleleaves", 2)
|
||||||
elseif n.name ~="" and n.name == "default:reeds" then
|
elseif n.name ~="" and n.name == "default:reeds" then
|
||||||
grow_reeds(pos)
|
grow_reeds(pos)
|
||||||
|
@ -526,14 +526,14 @@ function duengen(pointed_thing)
|
||||||
for j = -3, 2, 1 do
|
for j = -3, 2, 1 do
|
||||||
pos = pointed_thing.above
|
pos = pointed_thing.above
|
||||||
pos = {x=pos.x+i, y=pos.y, z=pos.z+j}
|
pos = {x=pos.x+i, y=pos.y, z=pos.z+j}
|
||||||
n = minetest.env:get_node(pos)
|
n = minetest.get_node(pos)
|
||||||
n2 = minetest.env:get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
n2 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
||||||
|
|
||||||
if n.name ~= "" and n.name == "air" and n2.name == "default:dirt_with_grass" then
|
if n.name ~= "" and n.name == "air" and n2.name == "default:dirt_with_grass" then
|
||||||
if math.random(0,5) > 3 then
|
if math.random(0,5) > 3 then
|
||||||
minetest.env:add_node(pos, {name=plant_tab[math.random(0, rnd_max)]})
|
minetest.add_node(pos, {name=plant_tab[math.random(0, rnd_max)]})
|
||||||
else
|
else
|
||||||
minetest.env:add_node(pos, {name=plant_tab[math.random(0, 5)]})
|
minetest.add_node(pos, {name=plant_tab[math.random(0, 5)]})
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -559,7 +559,7 @@ minetest.register_abm({
|
||||||
local can_change = 0
|
local can_change = 0
|
||||||
for i=1,4 do
|
for i=1,4 do
|
||||||
local p = {x=pos.x, y=pos.y+i, z=pos.z}
|
local p = {x=pos.x, y=pos.y+i, z=pos.z}
|
||||||
local n = minetest.env:get_node(p)
|
local n = minetest.get_node(p)
|
||||||
-- On verifie si il y a de l'air
|
-- On verifie si il y a de l'air
|
||||||
if (n.name=="air") then
|
if (n.name=="air") then
|
||||||
can_change = can_change + 1
|
can_change = can_change + 1
|
||||||
|
@ -568,7 +568,7 @@ minetest.register_abm({
|
||||||
if can_change > 3 then
|
if can_change > 3 then
|
||||||
local light = minetest.get_node_light(pos)
|
local light = minetest.get_node_light(pos)
|
||||||
if light or light > 10 then
|
if light or light > 10 then
|
||||||
minetest.env:add_node(pos, {name="default:dirt_with_grass"})
|
minetest.add_node(pos, {name="default:dirt_with_grass"})
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -589,7 +589,7 @@ minetest.register_abm({
|
||||||
action = function(pos)
|
action = function(pos)
|
||||||
local light = minetest.get_node_light(pos)
|
local light = minetest.get_node_light(pos)
|
||||||
if light or light > 10 then
|
if light or light > 10 then
|
||||||
minetest.env:add_node(pos, {name="air"})
|
minetest.add_node(pos, {name="air"})
|
||||||
generate_tree(pos, "default:tree", "default:leaves", 1)
|
generate_tree(pos, "default:tree", "default:leaves", 1)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
@ -604,7 +604,7 @@ minetest.register_abm({
|
||||||
action = function(pos)
|
action = function(pos)
|
||||||
local light = minetest.get_node_light(pos)
|
local light = minetest.get_node_light(pos)
|
||||||
if light or light > 10 then
|
if light or light > 10 then
|
||||||
minetest.env:add_node(pos, {name="air"})
|
minetest.add_node(pos, {name="air"})
|
||||||
generate_tree(pos, "default:jungletree", "default:jungleleaves", 2)
|
generate_tree(pos, "default:jungletree", "default:jungleleaves", 2)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
@ -619,10 +619,10 @@ minetest.register_abm({
|
||||||
chance = 5,
|
chance = 5,
|
||||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||||
local newpos = {x=pos.x, y=pos.y-1, z=pos.z}
|
local newpos = {x=pos.x, y=pos.y-1, z=pos.z}
|
||||||
local n = minetest.env:get_node(newpos)
|
local n = minetest.get_node(newpos)
|
||||||
if n.name == "air" then
|
if n.name == "air" then
|
||||||
walldir = node.param2
|
walldir = node.param2
|
||||||
minetest.env:add_node(newpos, {name = "default:vine", param2 = walldir})
|
minetest.add_node(newpos, {name = "default:vine", param2 = walldir})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -638,7 +638,7 @@ snowball_VELOCITY=19
|
||||||
--Shoot snowball.
|
--Shoot snowball.
|
||||||
snow_shoot_snowball=function (item, player, pointed_thing)
|
snow_shoot_snowball=function (item, player, pointed_thing)
|
||||||
local playerpos=player:getpos()
|
local playerpos=player:getpos()
|
||||||
local obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, "default:snowball_entity")
|
local obj=minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, "default:snowball_entity")
|
||||||
local dir=player:get_look_dir()
|
local dir=player:get_look_dir()
|
||||||
obj:setvelocity({x=dir.x*snowball_VELOCITY, y=dir.y*snowball_VELOCITY, z=dir.z*snowball_VELOCITY})
|
obj:setvelocity({x=dir.x*snowball_VELOCITY, y=dir.y*snowball_VELOCITY, z=dir.z*snowball_VELOCITY})
|
||||||
obj:setacceleration({x=dir.x*-3, y=-snowball_GRAVITY, z=dir.z*-3})
|
obj:setacceleration({x=dir.x*-3, y=-snowball_GRAVITY, z=dir.z*-3})
|
||||||
|
@ -659,7 +659,7 @@ snowball_ENTITY={
|
||||||
snowball_ENTITY.on_step = function(self, dtime)
|
snowball_ENTITY.on_step = function(self, dtime)
|
||||||
self.timer=self.timer+dtime
|
self.timer=self.timer+dtime
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
local node = minetest.env:get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
|
|
||||||
--Become item when hitting a node.
|
--Become item when hitting a node.
|
||||||
if self.lastpos.x~=nil then --If there is no lastpos for some reason.
|
if self.lastpos.x~=nil then --If there is no lastpos for some reason.
|
||||||
|
@ -874,7 +874,7 @@ minetest.register_abm({
|
||||||
end
|
end
|
||||||
if not do_preserve then
|
if not do_preserve then
|
||||||
-- Drop stuff other than the node itself
|
-- Drop stuff other than the node itself
|
||||||
itemstacks = minetest.get_node_drops(n0.name)
|
local itemstacks = minetest.get_node_drops(n0.name)
|
||||||
for _, itemname in ipairs(itemstacks) do
|
for _, itemname in ipairs(itemstacks) do
|
||||||
if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or
|
if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or
|
||||||
itemname ~= n0.name then
|
itemname ~= n0.name then
|
||||||
|
|
|
@ -335,7 +335,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||||
if is_shallow then
|
if is_shallow then
|
||||||
for x1=-divlen,divlen do
|
for x1=-divlen,divlen do
|
||||||
for z1=-divlen,divlen do
|
for z1=-divlen,divlen do
|
||||||
if minetest.env:get_node({x=cx+x1,y=0,z=cz+z1}).name == "default:sand" then
|
if minetest.env:get_node({x=cx+x1,y=0,z=cz+z1}).name == "default:sand" or minetest.env:get_node({x=cx+x1,y=0,z=cz+z1}).name == "default:sandstone" then
|
||||||
minetest.env:set_node({x=cx+x1,y=0,z=cz+z1}, {name="default:clay"})
|
minetest.env:set_node({x=cx+x1,y=0,z=cz+z1}, {name="default:clay"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -366,6 +366,12 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||||
minetest.env:find_node_near({x=x,y=1,z=z}, 1, "default:water_source") then
|
minetest.env:find_node_near({x=x,y=1,z=z}, 1, "default:water_source") then
|
||||||
default.make_reeds({x=x,y=2,z=z}, pr:next(2, 4))
|
default.make_reeds({x=x,y=2,z=z}, pr:next(2, 4))
|
||||||
end
|
end
|
||||||
|
if minetest.env:get_node({x=x,y=1,z=z}).name == "default:sand" then
|
||||||
|
if math.random(0,1000) == 1 then -- 0,12000
|
||||||
|
random_struct.call_struct(p,2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -443,6 +449,9 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||||
-- If dirt with grass, add grass
|
-- If dirt with grass, add grass
|
||||||
elseif nn == "default:dirt_with_grass" then
|
elseif nn == "default:dirt_with_grass" then
|
||||||
minetest.env:set_node(p,{name="default:grass"})
|
minetest.env:set_node(p,{name="default:grass"})
|
||||||
|
if math.random(0,12000) == 1 then
|
||||||
|
random_struct.call_struct(p,1)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
1050
mods/mobs/api.lua~
Normal file
1050
mods/mobs/api.lua~
Normal file
File diff suppressed because it is too large
Load diff
1
mods/random_struct/build/desert_temple.we
Normal file
1
mods/random_struct/build/desert_temple.we
Normal file
File diff suppressed because one or more lines are too long
1
mods/random_struct/build/pnj_town_1.we
Normal file
1
mods/random_struct/build/pnj_town_1.we
Normal file
File diff suppressed because one or more lines are too long
1
mods/random_struct/build/pnj_town_withway_1.we
Normal file
1
mods/random_struct/build/pnj_town_withway_1.we
Normal file
File diff suppressed because one or more lines are too long
1
mods/random_struct/build/witcher_house.we
Normal file
1
mods/random_struct/build/witcher_house.we
Normal file
File diff suppressed because one or more lines are too long
|
@ -15,5 +15,266 @@ random_struct.get_struct = function(file)
|
||||||
return allnode
|
return allnode
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- World edit function
|
||||||
|
|
||||||
|
random_struct.valueversion_WE = function(value)
|
||||||
|
if value:find("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)") and not value:find("%{") then --previous list format
|
||||||
|
return 3
|
||||||
|
elseif value:find("^[^\"']+%{%d+%}") then
|
||||||
|
if value:find("%[\"meta\"%]") then --previous meta flat table format
|
||||||
|
return 2
|
||||||
|
end
|
||||||
|
return 1 --original flat table format
|
||||||
|
elseif value:find("%{") then --current nested table format
|
||||||
|
return 4
|
||||||
|
end
|
||||||
|
return 0 --unknown format
|
||||||
|
end
|
||||||
|
random_struct.allocate_WE = function(originpos, value)
|
||||||
|
local huge = math.huge
|
||||||
|
local pos1x, pos1y, pos1z = huge, huge, huge
|
||||||
|
local pos2x, pos2y, pos2z = -huge, -huge, -huge
|
||||||
|
local originx, originy, originz = originpos.x, originpos.y, originpos.z
|
||||||
|
local count = 0
|
||||||
|
local version = random_struct.valueversion_WE (value)
|
||||||
|
if version == 1 or version == 2 then --flat table format
|
||||||
|
--obtain the node table
|
||||||
|
local get_tables = loadstring(value)
|
||||||
|
if get_tables then --error loading value
|
||||||
|
return originpos, originpos, count
|
||||||
|
end
|
||||||
|
local tables = get_tables()
|
||||||
|
|
||||||
|
--transform the node table into an array of nodes
|
||||||
|
for i = 1, #tables do
|
||||||
|
for j, v in pairs(tables[i]) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
tables[i][j] = tables[v[1]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local nodes = tables[1]
|
||||||
|
|
||||||
|
--check the node array
|
||||||
|
count = #nodes
|
||||||
|
if version == 1 then --original flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local pos = entry[1]
|
||||||
|
local x, y, z = originx - pos.x, originy - pos.y, originz - pos.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
else --previous meta flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local x, y, z = originx - entry.x, originy - entry.y, originz - entry.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif version == 3 then --previous list format
|
||||||
|
for x, y, z, name, param1, param2 in value:gmatch("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do --match node entries
|
||||||
|
local x, y, z = originx + tonumber(x), originy + tonumber(y), originz + tonumber(z)
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
elseif version == 4 then --current nested table format
|
||||||
|
--wip: this is a filthy hack that works surprisingly well
|
||||||
|
value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1)
|
||||||
|
local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end)
|
||||||
|
local startpos, startpos1, endpos = 1, 1
|
||||||
|
local nodes = {}
|
||||||
|
while true do
|
||||||
|
startpos, endpos = escaped:find("},%s*{", startpos)
|
||||||
|
if not startpos then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
local current = value:sub(startpos1, startpos)
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. current))
|
||||||
|
startpos, startpos1 = endpos, endpos
|
||||||
|
end
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. value:sub(startpos1)))
|
||||||
|
|
||||||
|
--local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT
|
||||||
|
|
||||||
|
count = #nodes
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local x, y, z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local pos1 = {x=pos1x, y=pos1y, z=pos1z}
|
||||||
|
local pos2 = {x=pos2x, y=pos2y, z=pos2z}
|
||||||
|
return pos1, pos2, count
|
||||||
|
end
|
||||||
|
random_struct.deserialise_WE = function(originpos, value)
|
||||||
|
--make area stay loaded
|
||||||
|
local pos1, pos2 = random_struct.allocate_WE(originpos, value)
|
||||||
|
local manip = minetest.get_voxel_manip()
|
||||||
|
manip:read_from_map(pos1, pos2)
|
||||||
|
|
||||||
|
local originx, originy, originz = originpos.x, originpos.y, originpos.z
|
||||||
|
local count = 0
|
||||||
|
local add_node, get_meta = minetest.add_node, minetest.get_meta
|
||||||
|
local version = random_struct.valueversion_WE(value)
|
||||||
|
if version == 1 or version == 2 then --original flat table format
|
||||||
|
--obtain the node table
|
||||||
|
local get_tables = loadstring(value)
|
||||||
|
if not get_tables then --error loading value
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
local tables = get_tables()
|
||||||
|
|
||||||
|
--transform the node table into an array of nodes
|
||||||
|
for i = 1, #tables do
|
||||||
|
for j, v in pairs(tables[i]) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
tables[i][j] = tables[v[1]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local nodes = tables[1]
|
||||||
|
|
||||||
|
--load the node array
|
||||||
|
count = #nodes
|
||||||
|
if version == 1 then --original flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local pos = entry[1]
|
||||||
|
pos.x, pos.y, pos.z = originx - pos.x, originy - pos.y, originz - pos.z
|
||||||
|
add_node(pos, entry[2])
|
||||||
|
end
|
||||||
|
else --previous meta flat table format
|
||||||
|
for index = 1, #nodes do
|
||||||
|
local entry = nodes[index]
|
||||||
|
entry.x, entry.y, entry.z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
add_node(entry, entry) --entry acts both as position and as node
|
||||||
|
get_meta(entry):from_table(entry.meta)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif version == 3 then --previous list format
|
||||||
|
local pos = {x=0, y=0, z=0}
|
||||||
|
local node = {name="", param1=0, param2=0}
|
||||||
|
for x, y, z, name, param1, param2 in value:gmatch("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do --match node entries
|
||||||
|
pos.x, pos.y, pos.z = originx + tonumber(x), originy + tonumber(y), originz + tonumber(z)
|
||||||
|
node.name, node.param1, node.param2 = name, param1, param2
|
||||||
|
add_node(pos, node)
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
elseif version == 4 then --current nested table format
|
||||||
|
--wip: this is a filthy hack that works surprisingly well
|
||||||
|
value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1)
|
||||||
|
local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end)
|
||||||
|
local startpos, startpos1, endpos = 1, 1
|
||||||
|
local nodes = {}
|
||||||
|
while true do
|
||||||
|
startpos, endpos = escaped:find("},%s*{", startpos)
|
||||||
|
if not startpos then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
local current = value:sub(startpos1, startpos)
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. current))
|
||||||
|
startpos, startpos1 = endpos, endpos
|
||||||
|
end
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. value:sub(startpos1)))
|
||||||
|
|
||||||
|
--local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT
|
||||||
|
|
||||||
|
--load the nodes
|
||||||
|
count = #nodes
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
entry.x, entry.y, entry.z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
add_node(entry, entry) --entry acts both as position and as node
|
||||||
|
end
|
||||||
|
|
||||||
|
--load the metadata
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
get_meta(entry):from_table(entry.meta)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
|
||||||
|
-- End of world edit deserialise part
|
||||||
|
|
||||||
|
|
||||||
|
-- The call of Struct
|
||||||
|
random_struct.call_struct= function(pos, struct_style)
|
||||||
|
-- 1 : City , 2 : Temple Sand
|
||||||
|
if struct_style == 1 then
|
||||||
|
random_struct.generatecity(pos)
|
||||||
|
elseif struct_style == 2 then
|
||||||
|
random_struct.generate_temple_sand(pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
random_struct.generatecity = function(pos)
|
||||||
|
-- No Generating for the moment only place it :D
|
||||||
|
local city = random_struct.get_struct("pnj_town_1.we")
|
||||||
|
local newpos = {x=pos.x,y=pos.y,z=pos.z}
|
||||||
|
if newpos == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
random_struct.deserialise_WE(newpos, city )
|
||||||
|
end
|
||||||
|
|
||||||
|
random_struct.generate_temple_sand = function(pos)
|
||||||
|
-- No Generating for the temple ... Why using it ? No Change
|
||||||
|
local temple = random_struct.get_struct("desert_temple.we")
|
||||||
|
local newpos = {x=pos.x,y=pos.y-12,z=pos.z}
|
||||||
|
if newpos == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
random_struct.deserialise_WE(newpos, temple)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Debug command
|
||||||
|
minetest.register_chatcommand("spawnstruct", {
|
||||||
|
params = "",
|
||||||
|
description = "Spawn a Struct.",
|
||||||
|
func = function(name, param)
|
||||||
|
local pos= minetest.get_player_by_name(name):getpos()
|
||||||
|
if not pos then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if param == "" or param == "help" then
|
||||||
|
minetest.chat_send_player(name, "Please use instruction /spawnstruct TYPE")
|
||||||
|
minetest.chat_send_player(name, "TYPE avaiable : town, temple_sand")
|
||||||
|
end
|
||||||
|
if param == "town" then
|
||||||
|
random_struct.generatecity(pos)
|
||||||
|
minetest.chat_send_player(name, "Town Created")
|
||||||
|
end
|
||||||
|
if param == "temple_sand" then
|
||||||
|
random_struct.generate_temple_sand(pos)
|
||||||
|
minetest.chat_send_player(name, "Temple Sand Created")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
local time_to_load= os.clock() - init
|
local time_to_load= os.clock() - init
|
||||||
print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load))
|
print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load))
|
||||||
|
|
282
mods/random_struct/init.lua~
Normal file
282
mods/random_struct/init.lua~
Normal file
|
@ -0,0 +1,282 @@
|
||||||
|
local init = os.clock()
|
||||||
|
random_struct ={}
|
||||||
|
|
||||||
|
random_struct.get_struct = function(file)
|
||||||
|
local localfile = minetest.get_modpath("random_struct").."/build/"..file
|
||||||
|
local file, errorload = io.open(localfile, "rb")
|
||||||
|
if errorload ~= nil then
|
||||||
|
minetest.log("action", '[Random_Struct] error: could not open this struct "' .. localfile .. '"')
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local allnode = file:read("*a")
|
||||||
|
file:close()
|
||||||
|
|
||||||
|
return allnode
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- World edit function
|
||||||
|
|
||||||
|
random_struct.valueversion_WE = function(value)
|
||||||
|
if value:find("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)") and not value:find("%{") then --previous list format
|
||||||
|
return 3
|
||||||
|
elseif value:find("^[^\"']+%{%d+%}") then
|
||||||
|
if value:find("%[\"meta\"%]") then --previous meta flat table format
|
||||||
|
return 2
|
||||||
|
end
|
||||||
|
return 1 --original flat table format
|
||||||
|
elseif value:find("%{") then --current nested table format
|
||||||
|
return 4
|
||||||
|
end
|
||||||
|
return 0 --unknown format
|
||||||
|
end
|
||||||
|
random_struct.allocate_WE = function(originpos, value)
|
||||||
|
local huge = math.huge
|
||||||
|
local pos1x, pos1y, pos1z = huge, huge, huge
|
||||||
|
local pos2x, pos2y, pos2z = -huge, -huge, -huge
|
||||||
|
local originx, originy, originz = originpos.x, originpos.y, originpos.z
|
||||||
|
local count = 0
|
||||||
|
local version = random_struct.valueversion_WE (value)
|
||||||
|
if version == 1 or version == 2 then --flat table format
|
||||||
|
--obtain the node table
|
||||||
|
local get_tables = loadstring(value)
|
||||||
|
if get_tables then --error loading value
|
||||||
|
return originpos, originpos, count
|
||||||
|
end
|
||||||
|
local tables = get_tables()
|
||||||
|
|
||||||
|
--transform the node table into an array of nodes
|
||||||
|
for i = 1, #tables do
|
||||||
|
for j, v in pairs(tables[i]) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
tables[i][j] = tables[v[1]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local nodes = tables[1]
|
||||||
|
|
||||||
|
--check the node array
|
||||||
|
count = #nodes
|
||||||
|
if version == 1 then --original flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local pos = entry[1]
|
||||||
|
local x, y, z = originx - pos.x, originy - pos.y, originz - pos.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
else --previous meta flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local x, y, z = originx - entry.x, originy - entry.y, originz - entry.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif version == 3 then --previous list format
|
||||||
|
for x, y, z, name, param1, param2 in value:gmatch("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do --match node entries
|
||||||
|
local x, y, z = originx + tonumber(x), originy + tonumber(y), originz + tonumber(z)
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
elseif version == 4 then --current nested table format
|
||||||
|
--wip: this is a filthy hack that works surprisingly well
|
||||||
|
value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1)
|
||||||
|
local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end)
|
||||||
|
local startpos, startpos1, endpos = 1, 1
|
||||||
|
local nodes = {}
|
||||||
|
while true do
|
||||||
|
startpos, endpos = escaped:find("},%s*{", startpos)
|
||||||
|
if not startpos then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
local current = value:sub(startpos1, startpos)
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. current))
|
||||||
|
startpos, startpos1 = endpos, endpos
|
||||||
|
end
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. value:sub(startpos1)))
|
||||||
|
|
||||||
|
--local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT
|
||||||
|
|
||||||
|
count = #nodes
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local x, y, z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
if x < pos1x then pos1x = x end
|
||||||
|
if y < pos1y then pos1y = y end
|
||||||
|
if z < pos1z then pos1z = z end
|
||||||
|
if x > pos2x then pos2x = x end
|
||||||
|
if y > pos2y then pos2y = y end
|
||||||
|
if z > pos2z then pos2z = z end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local pos1 = {x=pos1x, y=pos1y, z=pos1z}
|
||||||
|
local pos2 = {x=pos2x, y=pos2y, z=pos2z}
|
||||||
|
return pos1, pos2, count
|
||||||
|
end
|
||||||
|
random_struct.deserialise_WE = function(originpos, value)
|
||||||
|
--make area stay loaded
|
||||||
|
local pos1, pos2 = random_struct.allocate_WE(originpos, value)
|
||||||
|
local manip = minetest.get_voxel_manip()
|
||||||
|
manip:read_from_map(pos1, pos2)
|
||||||
|
|
||||||
|
local originx, originy, originz = originpos.x, originpos.y, originpos.z
|
||||||
|
local count = 0
|
||||||
|
local add_node, get_meta = minetest.add_node, minetest.get_meta
|
||||||
|
local version = random_struct.valueversion_WE(value)
|
||||||
|
if version == 1 or version == 2 then --original flat table format
|
||||||
|
--obtain the node table
|
||||||
|
local get_tables = loadstring(value)
|
||||||
|
if not get_tables then --error loading value
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
local tables = get_tables()
|
||||||
|
|
||||||
|
--transform the node table into an array of nodes
|
||||||
|
for i = 1, #tables do
|
||||||
|
for j, v in pairs(tables[i]) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
tables[i][j] = tables[v[1]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local nodes = tables[1]
|
||||||
|
|
||||||
|
--load the node array
|
||||||
|
count = #nodes
|
||||||
|
if version == 1 then --original flat table format
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
local pos = entry[1]
|
||||||
|
pos.x, pos.y, pos.z = originx - pos.x, originy - pos.y, originz - pos.z
|
||||||
|
add_node(pos, entry[2])
|
||||||
|
end
|
||||||
|
else --previous meta flat table format
|
||||||
|
for index = 1, #nodes do
|
||||||
|
local entry = nodes[index]
|
||||||
|
entry.x, entry.y, entry.z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
add_node(entry, entry) --entry acts both as position and as node
|
||||||
|
get_meta(entry):from_table(entry.meta)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif version == 3 then --previous list format
|
||||||
|
local pos = {x=0, y=0, z=0}
|
||||||
|
local node = {name="", param1=0, param2=0}
|
||||||
|
for x, y, z, name, param1, param2 in value:gmatch("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do --match node entries
|
||||||
|
pos.x, pos.y, pos.z = originx + tonumber(x), originy + tonumber(y), originz + tonumber(z)
|
||||||
|
node.name, node.param1, node.param2 = name, param1, param2
|
||||||
|
add_node(pos, node)
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
elseif version == 4 then --current nested table format
|
||||||
|
--wip: this is a filthy hack that works surprisingly well
|
||||||
|
value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1)
|
||||||
|
local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end)
|
||||||
|
local startpos, startpos1, endpos = 1, 1
|
||||||
|
local nodes = {}
|
||||||
|
while true do
|
||||||
|
startpos, endpos = escaped:find("},%s*{", startpos)
|
||||||
|
if not startpos then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
local current = value:sub(startpos1, startpos)
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. current))
|
||||||
|
startpos, startpos1 = endpos, endpos
|
||||||
|
end
|
||||||
|
table.insert(nodes, minetest.deserialize("return " .. value:sub(startpos1)))
|
||||||
|
|
||||||
|
--local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT
|
||||||
|
|
||||||
|
--load the nodes
|
||||||
|
count = #nodes
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
entry.x, entry.y, entry.z = originx + entry.x, originy + entry.y, originz + entry.z
|
||||||
|
add_node(entry, entry) --entry acts both as position and as node
|
||||||
|
end
|
||||||
|
|
||||||
|
--load the metadata
|
||||||
|
for index = 1, count do
|
||||||
|
local entry = nodes[index]
|
||||||
|
get_meta(entry):from_table(entry.meta)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
|
||||||
|
-- End of world edit deserialise part
|
||||||
|
|
||||||
|
|
||||||
|
-- The call of Struct
|
||||||
|
random_struct.call_struct= function(pos, struct_style)
|
||||||
|
if math.random(1,2) == 1 then
|
||||||
|
-- 1 : City , 2 : Temple Sand
|
||||||
|
if struct_style == 1 then
|
||||||
|
random_struct.generatecity(pos)
|
||||||
|
elseif struct_style == 2 then
|
||||||
|
random_struct.generate_temple_sand(pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
random_struct.generatecity = function(pos)
|
||||||
|
-- No Generating for the moment only place it :D
|
||||||
|
local city = random_struct.get_struct("pnj_town_1.we")
|
||||||
|
local newpos = {x=pos.x,y=pos.y,z=pos.z}
|
||||||
|
if newpos == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
random_struct.deserialise_WE(newpos, city )
|
||||||
|
end
|
||||||
|
|
||||||
|
random_struct.generate_temple_sand = function(pos)
|
||||||
|
-- No Generating for the temple ... Why using it ? No Change
|
||||||
|
local temple = random_struct.get_struct("desert_temple.we")
|
||||||
|
local newpos = {x=pos.x,y=pos.y-12,z=pos.z}
|
||||||
|
if newpos == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
random_struct.deserialise_WE(newpos, temple)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Debug command
|
||||||
|
minetest.register_chatcommand("spawnstruct", {
|
||||||
|
params = "",
|
||||||
|
description = "Spawn a Struct.",
|
||||||
|
func = function(name, param)
|
||||||
|
local pos= minetest.get_player_by_name(name):getpos()
|
||||||
|
if not pos then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if param == "" or param == "help" then
|
||||||
|
minetest.chat_send_player(name, "Please use instruction /spawnstruct TYPE")
|
||||||
|
minetest.chat_send_player(name, "TYPE avaiable : town, temple_sand")
|
||||||
|
end
|
||||||
|
if param == "town" then
|
||||||
|
random_struct.generatecity(pos)
|
||||||
|
minetest.chat_send_player(name, "Town Created")
|
||||||
|
end
|
||||||
|
if param == "temple_sand" then
|
||||||
|
random_struct.generate_temple_sand(pos)
|
||||||
|
minetest.chat_send_player(name, "Temple Sand Created")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
local time_to_load= os.clock() - init
|
||||||
|
print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load))
|
|
@ -36,6 +36,18 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
local futurpos = pointed_thing.under
|
||||||
|
local frontstair = {x=futurpos.x-1, y=futurpos.y+1, z=futurpos.z}
|
||||||
|
local leftstair = {x=futurpos.x, y=futurpos.y+1, z=futurpos.z+1}
|
||||||
|
print( minetest.get_node(frontstair).name)
|
||||||
|
if minetest.get_node(frontstair).name == "stairs:stair_"..subname.."" and minetest.get_node(leftstair).name == "stairs:stair_"..subname.."" then
|
||||||
|
local fakestack = ItemStack("stairs:stair_" .. subname.."_corner_1")
|
||||||
|
local ret = minetest.item_place(fakestack, placer, pointed_thing)
|
||||||
|
if ret:is_empty() then
|
||||||
|
itemstack:take_item()
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Otherwise place regularly
|
-- Otherwise place regularly
|
||||||
return minetest.item_place(itemstack, placer, pointed_thing)
|
return minetest.item_place(itemstack, placer, pointed_thing)
|
||||||
|
@ -60,6 +72,24 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_node(":stairs:stair_" .. subname.."_corner_1", {
|
||||||
|
drop = "stairs:stair_" .. subname,
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = images,
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
is_ground_content = true,
|
||||||
|
groups = groups,
|
||||||
|
sounds = sounds,
|
||||||
|
node_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {
|
||||||
|
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||||
|
{-0.5, -0, -0, 0, 0.5, 0.5},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = 'stairs:stair_' .. subname .. ' 4',
|
output = 'stairs:stair_' .. subname .. ' 4',
|
||||||
recipe = {
|
recipe = {
|
||||||
|
|
Loading…
Reference in a new issue