Initial commit
This commit is contained in:
commit
7daaa15d97
44
README.md
Normal file
44
README.md
Normal file
@ -0,0 +1,44 @@
|
||||
# Spawn Builder
|
||||
Version 1.0.0
|
||||
|
||||
## Description
|
||||
This mod generates a simple stone platform at the world origin
|
||||
or the static spawn point.
|
||||
Ideal for the `singlenode` map generator.
|
||||
|
||||
## Usage
|
||||
Activate this *before* the spawn area got generated (ideally
|
||||
in a new world), then just join the world.
|
||||
Recommended to be used in the `singlenode` mapgen, but it works
|
||||
in other map generators, too.
|
||||
|
||||
### Settings
|
||||
With the setting `spawnbuilder_width` you can change the width of
|
||||
the spawn platform. Note that values below 3 are not recommended.
|
||||
|
||||
If the static spawn point (`static_spawnpoint`) is set on the
|
||||
first start of the mod, the platform is centered at this
|
||||
position instead.
|
||||
|
||||
## Behaviour
|
||||
This mod generates a stone platform of size 33×2×33 with
|
||||
a single cobblestone in the center. Also, 3 layers
|
||||
above the platform are turned into air because the
|
||||
center position might be buried in the ground.
|
||||
|
||||
As a safety measure, nodes with the property
|
||||
`is_ground_content=false` will never be overwritten.
|
||||
|
||||
Also, no platform is generated if the center position is
|
||||
already in a safe spawn (in air, a few blocks below solid
|
||||
ground).
|
||||
|
||||
## Dependencies
|
||||
This mod works with almost all subgames out of the box.
|
||||
|
||||
The only requirement is that the subgame defines the mapgen
|
||||
aliases `mapgen_stone` and `mapgen_cobble` which is almost
|
||||
certainly the case.
|
||||
|
||||
## License of everything in this mod
|
||||
MIT License.
|
1
description.txt
Normal file
1
description.txt
Normal file
@ -0,0 +1 @@
|
||||
Generates a stone platform below the world origin or static spawn point. Ideal for the singlenode mapgen.
|
131
init.lua
Normal file
131
init.lua
Normal file
@ -0,0 +1,131 @@
|
||||
local storage_ref = minetest.get_mod_storage()
|
||||
local stored_centerpos = {}
|
||||
local check = storage_ref:get_string("spawnbuilder_centerpos_x")
|
||||
if check ~= "" then
|
||||
stored_centerpos.x = storage_ref:get_int("spawnbuilder_centerpos_x")
|
||||
stored_centerpos.y = storage_ref:get_int("spawnbuilder_centerpos_y")
|
||||
stored_centerpos.z = storage_ref:get_int("spawnbuilder_centerpos_z")
|
||||
minetest.log("action", "[spawnbuilder] Spawn platform position loaded: "..minetest.pos_to_string(stored_centerpos))
|
||||
else
|
||||
stored_centerpos = minetest.setting_get_pos("static_spawnpoint")
|
||||
-- Default position
|
||||
if not stored_centerpos then
|
||||
stored_centerpos = { x=0, y=-1, z=0 }
|
||||
end
|
||||
storage_ref:set_int("spawnbuilder_centerpos_x", stored_centerpos.x)
|
||||
storage_ref:set_int("spawnbuilder_centerpos_y", stored_centerpos.y)
|
||||
storage_ref:set_int("spawnbuilder_centerpos_z", stored_centerpos.z)
|
||||
minetest.log("action", "[spawnbuilder] Initial spawn platform position registered and saved: "..minetest.pos_to_string(stored_centerpos))
|
||||
end
|
||||
|
||||
-- Width of the stored_centerpos platform
|
||||
local WIDTH
|
||||
check = storage_ref:get_string("spawnbuilder_width")
|
||||
if check ~= "" then
|
||||
WIDTH = check
|
||||
else
|
||||
WIDTH = tonumber(minetest.setting_get("spawnbuilder_width"))
|
||||
if type(WIDTH) == "number" then
|
||||
WIDTH = math.floor(WIDTH)
|
||||
else
|
||||
WIDTH = 33
|
||||
end
|
||||
end
|
||||
minetest.log("action", "[spawnbuilder] Using spawn platform width of "..WIDTH..".")
|
||||
|
||||
-- Height of the platform
|
||||
local HEIGHT = 2
|
||||
|
||||
-- Number of air layers above the platform
|
||||
local AIRSPACE = 3
|
||||
|
||||
-- Generates the platform or platform piece within minp and maxp with the center at centerpos
|
||||
local function generate_platform(minp, maxp, centerpos)
|
||||
-- Get stone and cobble nodes, based on the mapgen aliases. This allows for great compability with practically
|
||||
-- all subgames!
|
||||
local c_stone = minetest.get_content_id("mapgen_stone")
|
||||
local c_cobble
|
||||
if minetest.registered_aliases["mapgen_cobble"] == "air" or minetest.registered_aliases["mapgen_cobble"] == nil then
|
||||
-- Fallback option: If cobble mapgen alias is inappropriate or missing, use stone instead.
|
||||
c_cobble = c_stone
|
||||
else
|
||||
c_cobble = minetest.get_content_id("mapgen_cobble")
|
||||
end
|
||||
|
||||
local w_neg, w_pos
|
||||
w_pos = math.floor(WIDTH / 2)
|
||||
if math.fmod(WIDTH, 2) == 0 then
|
||||
w_neg = -w_pos + 1
|
||||
else
|
||||
w_neg = -w_pos
|
||||
end
|
||||
|
||||
local xmin = math.max(centerpos.x + w_neg, minp.x)
|
||||
local xmax = math.min(centerpos.x + w_pos, maxp.x)
|
||||
local zmin = math.max(centerpos.z + w_neg, minp.z)
|
||||
local zmax = math.min(centerpos.z + w_pos, maxp.z)
|
||||
local ymin = math.max(centerpos.y - (HEIGHT-1), minp.y)
|
||||
local ymax = math.min(centerpos.y + AIRSPACE, maxp.y)
|
||||
|
||||
if maxp.x >= xmin and minp.x <= xmax and maxp.y >= ymin and minp.y <= ymax and maxp.z >= zmin and minp.z <= zmax then
|
||||
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
||||
local data = vm:get_data()
|
||||
local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax})
|
||||
|
||||
for x = xmin, xmax do
|
||||
for y = ymin, ymax do
|
||||
for z = zmin, zmax do
|
||||
local p_pos = area:index(x, y, z)
|
||||
local pos = {x=x,y=y,z=z}
|
||||
if minetest.registered_nodes[minetest.get_node(pos).name].is_ground_content == true then
|
||||
if y <= centerpos.y then
|
||||
if x == centerpos.x and y == centerpos.y and z == centerpos.z then
|
||||
data[p_pos] = c_cobble
|
||||
minetest.log("action", "[spawnbuilder] Spawn platform center generated at "..minetest.pos_to_string(pos)..".")
|
||||
else
|
||||
data[p_pos] = c_stone
|
||||
end
|
||||
elseif y >= centerpos.y + 1 and y <= ymax then
|
||||
data[p_pos] = core.CONTENT_AIR
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
vm:set_data(data)
|
||||
vm:calc_lighting()
|
||||
vm:write_to_map()
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local centerpos = table.copy(stored_centerpos)
|
||||
|
||||
if minp.x <= centerpos.x and maxp.x >= centerpos.x and minp.y <= centerpos.y and maxp.y >= centerpos.y and minp.z <= centerpos.z and maxp.z >= centerpos.z then
|
||||
if not WIDTH or WIDTH <= 0 then
|
||||
minetest.log("warning", "[spawnbuilder] Invalid spawnbuilder_width. Spawn platform will NOT be generated.")
|
||||
return
|
||||
end
|
||||
|
||||
local ground = false
|
||||
local air = true
|
||||
-- Check for solid ground
|
||||
for y = 3, -6, -1 do
|
||||
local nn = minetest.get_node({x=centerpos.x, y=centerpos.y+y, centerpos.z}).name
|
||||
local walkable = minetest.registered_nodes[nn].walkable
|
||||
if y >= 0 and nn ~= "air" then
|
||||
air = false
|
||||
elseif y < 0 and walkable then
|
||||
ground = true
|
||||
end
|
||||
end
|
||||
-- Player has enough space and ground to spawn safely. No change required
|
||||
if air and ground then
|
||||
minetest.log("action", "[spawnbuilder] Safe player spawn detected. Spawn platform will NOT be generated.")
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
generate_platform(minp, maxp, centerpos)
|
||||
end)
|
BIN
screenshot.png
Normal file
BIN
screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
4
settingtypes.txt
Normal file
4
settingtypes.txt
Normal file
@ -0,0 +1,4 @@
|
||||
#Side length of the surface area of the spawn platform
|
||||
#If the number is odd, the platform will be centered at spawn.
|
||||
#Using a width lower than 3 is not recommended.
|
||||
spawnbuilder_width (Spawn platform width) int 33 1
|
Loading…
x
Reference in New Issue
Block a user