mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-11-26 17:12:59 +00:00
commit
a027130917
6 changed files with 206 additions and 10 deletions
41
README.md
41
README.md
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
If you can dream of it, it probably belongs here!
|
If you can dream of it, it probably belongs here!
|
||||||
|
|
||||||
|
**Important News: The `master` branch has been renamed to `main`, to follow the new standard across the Git ecosystem. If you've installed _WorldEditAadditions_ through git, you will need to re-clone the repository.**
|
||||||
|
|
||||||
![Screenshot](https://raw.githubusercontent.com/sbrl/Minetest-WorldEditAdditions/master/screenshot.png)
|
![Screenshot](https://raw.githubusercontent.com/sbrl/Minetest-WorldEditAdditions/master/screenshot.png)
|
||||||
|
|
||||||
_(Do you have a cool build that you used WorldEditAdditions to build? [Get in touch](https://github.com/sbrl/Minetest-WorldEditAdditions/issues/new) and I'll feature your screenshot here!)_
|
_(Do you have a cool build that you used WorldEditAdditions to build? [Get in touch](https://github.com/sbrl/Minetest-WorldEditAdditions/issues/new) and I'll feature your screenshot here!)_
|
||||||
|
@ -57,10 +59,12 @@ The detailed explanations have moved! Check them out [here](https://github.com/s
|
||||||
- [`//count`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#count)
|
- [`//count`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#count)
|
||||||
|
|
||||||
### Selection
|
### Selection
|
||||||
- [`//srect [<axis1> [<axis2>]] <length>`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#srect-axis1-axis2-length)
|
- [`//scol [<axis1> ] <length>`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#scol-axis1--length)
|
||||||
- [`//sstack`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#sstack)
|
- [`//srect [<axis1> [<axis2>]] <length>`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#srect-axis1-axis2-length)
|
||||||
- [`//spush`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#spush)
|
- [`//scube [<axis1> [<axis2> [<axis3>]]] <length>`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#scube-axis1-axis2-axis3-length)
|
||||||
- [`//spop`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#spop)
|
- [`//sstack`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#sstack)
|
||||||
|
- [`//spush`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#spush)
|
||||||
|
- [`//spop`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#spop)
|
||||||
|
|
||||||
### Meta
|
### Meta
|
||||||
- [`//multi <command_a> <command_b> ....`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#multi-command_a-command_b-command_c-)
|
- [`//multi <command_a> <command_b> ....`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#multi-command_a-command_b-command_c-)
|
||||||
|
@ -77,6 +81,33 @@ The detailed explanations have moved! Check them out [here](https://github.com/s
|
||||||
- [`//farwand skip_liquid (true|false) | maxdist <number>`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#farwand-skip_liquid-truefalse--maxdist-number)
|
- [`//farwand skip_liquid (true|false) | maxdist <number>`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#farwand-skip_liquid-truefalse--maxdist-number)
|
||||||
|
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
You can install _WorldEditAadditions_ in multiple ways:
|
||||||
|
|
||||||
|
### Through ContentDB
|
||||||
|
WorldEditAdditions is on ContentDB here: <https://content.minetest.net/packages/Starbeamrainbowlabs/worldeditadditions/>.
|
||||||
|
|
||||||
|
### Through the latest release
|
||||||
|
You can get a copy of WorldEditAdditions by downloading the source code for the [latest release](https://github.com/sbrl/Minetest-WorldEditAdditions/releases/latest), but this is not recommended because it takes additional effort to update to the latest version.
|
||||||
|
|
||||||
|
### Through Git
|
||||||
|
You can also clone this git repository. Note that the `main` branch is not considered to be stable at all times - though it shouldn't crash. It is recommended that you checkout a release to ensure stability. Do that like so:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# First, clone the repository
|
||||||
|
git clone https://github.com/sbrl/Minetest-WorldEditAdditions.git WorldEditAdditions
|
||||||
|
cd WorldEditAdditions
|
||||||
|
# Then, checkout the latest release on Linux:
|
||||||
|
git checkout "$(git describe --tags --abbrev=0)";
|
||||||
|
```
|
||||||
|
|
||||||
|
Windows users, you'll need to check the [releases page](https://github.com/sbrl/Minetest-WorldEditAdditions/releases) and find the name of the latest release, then do this instead of the `git checkout` above:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout TAG_NAME_HERE
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
If you're experiencing issues with this mod, try checking this FAQ before opening an issue.
|
If you're experiencing issues with this mod, try checking this FAQ before opening an issue.
|
||||||
|
|
||||||
|
@ -98,6 +129,8 @@ Contributions are welcome! Please state in your pull request(s) that you release
|
||||||
|
|
||||||
Please also make sure that the logic for every new command has it's own file. For example, the logic for `//floodfill` goes in `worldeditadditions/floodfill.lua`, the logic for `//overlay` goes in `worldeditadditions/overlay.lua`, etc.
|
Please also make sure that the logic for every new command has it's own file. For example, the logic for `//floodfill` goes in `worldeditadditions/floodfill.lua`, the logic for `//overlay` goes in `worldeditadditions/overlay.lua`, etc.
|
||||||
|
|
||||||
|
I, Starbeamrainbowlabs (@sbrl), have the ultimate final say.
|
||||||
|
|
||||||
|
|
||||||
## WorldEditAdditions around the web
|
## WorldEditAdditions around the web
|
||||||
Are you using WorldEditAdditions for a project? Open an issue and I'll add your project to the below list!
|
Are you using WorldEditAdditions for a project? Open an issue and I'll add your project to the below list!
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
function worldeditadditions.noise.engine_perlin_2d(x, y)
|
|
||||||
|
|
||||||
end
|
|
100
worldeditadditions/lib/noise/engines/perlin.lua
Normal file
100
worldeditadditions/lib/noise/engines/perlin.lua
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
local wea = worldeditadditions
|
||||||
|
|
||||||
|
-- original code by Ken Perlin: http://mrl.nyu.edu/~perlin/noise/
|
||||||
|
-- Port from this StackOverflow answer: https://stackoverflow.com/a/33425812/1460422
|
||||||
|
|
||||||
|
|
||||||
|
local function BitAND(a, b) --Bitwise and
|
||||||
|
local p, c = 1, 0
|
||||||
|
while a > 0 and b > 0 do
|
||||||
|
local ra, rb = a%2, b%2
|
||||||
|
if ra + rb > 1 then c = c + p end
|
||||||
|
a, b, p = (a - ra) / 2, (b - rb) / 2, p * 2
|
||||||
|
end
|
||||||
|
return c
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fade(t)
|
||||||
|
return t * t * t * (t * (t * 6 - 15) + 10)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function lerp(t, a, b)
|
||||||
|
return a + t * (b - a)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function grad(hash, x, y, z)
|
||||||
|
local h = BitAND(hash, 15)
|
||||||
|
local u = h < 8 and x or y
|
||||||
|
local v = h < 4 and y or ((h == 12 or h == 14) and x or z)
|
||||||
|
return ((h and 1) == 0 and u or - u) + ((h and 2) == 0 and v or - v)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
wea.noise.perlin = {}
|
||||||
|
wea.noise.perlin.p = {}
|
||||||
|
wea.noise.perlin.permutation = {
|
||||||
|
151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140,
|
||||||
|
36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120,
|
||||||
|
234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33,
|
||||||
|
88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
|
||||||
|
134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133,
|
||||||
|
230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161,
|
||||||
|
1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130,
|
||||||
|
116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250,
|
||||||
|
124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227,
|
||||||
|
47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44,
|
||||||
|
154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19,
|
||||||
|
98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228,
|
||||||
|
251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
|
||||||
|
249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176,
|
||||||
|
115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29,
|
||||||
|
24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180
|
||||||
|
}
|
||||||
|
wea.noise.perlin.size = 256
|
||||||
|
wea.noise.perlin.gx = {}
|
||||||
|
wea.noise.perlin.gy = {}
|
||||||
|
wea.noise.perlin.randMax = 256
|
||||||
|
|
||||||
|
--- Creates a new perlin instance.
|
||||||
|
-- @return perlin A new perlin instance.
|
||||||
|
function wea.noise.perlin.new()
|
||||||
|
local instance = {}
|
||||||
|
setmetatable(instance, wea.noise.perlin)
|
||||||
|
instance:load()
|
||||||
|
return instance
|
||||||
|
end
|
||||||
|
|
||||||
|
function wea.noise.perlin:load()
|
||||||
|
for i = 1, self.size do
|
||||||
|
self.p[i] = self.permutation[i]
|
||||||
|
self.p[255 + i] = self.p[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function wea.noise.perlin:noise( x, y, z )
|
||||||
|
local X = BitAND(math.floor(x), 255) + 1
|
||||||
|
local Y = BitAND(math.floor(y), 255) + 1
|
||||||
|
local Z = BitAND(math.floor(z), 255) + 1
|
||||||
|
|
||||||
|
x = x - math.floor(x)
|
||||||
|
y = y - math.floor(y)
|
||||||
|
z = z - math.floor(z)
|
||||||
|
local u = fade(x)
|
||||||
|
local v = fade(y)
|
||||||
|
local w = fade(z)
|
||||||
|
local A = self.p[X] + Y
|
||||||
|
local AA = self.p[A] + Z
|
||||||
|
local AB = self.p[A + 1] + Z
|
||||||
|
local B = self.p[X + 1] + Y
|
||||||
|
local BA = self.p[B] + Z
|
||||||
|
local BB = self.p[B + 1] + Z
|
||||||
|
|
||||||
|
return lerp(w, lerp(v, lerp(u, grad(self.p[AA ], x, y, z ),
|
||||||
|
grad(self.p[BA ], x - 1, y, z )),
|
||||||
|
lerp(u, grad(self.p[AB ], x, y - 1, z ),
|
||||||
|
grad(self.p[BB ], x - 1, y - 1, z ))),
|
||||||
|
lerp(v, lerp(u, grad(self.p[AA + 1], x, y, z - 1),
|
||||||
|
grad(self.p[BA + 1], x - 1, y, z - 1)),
|
||||||
|
lerp(u, grad(self.p[AB + 1], x, y - 1, z - 1),
|
||||||
|
grad(self.p[BB + 1], x - 1, y - 1, z - 1))))
|
||||||
|
end
|
|
@ -4,6 +4,33 @@
|
||||||
-- ██ ████ ██ ███████ █████ █████ █████ ██ ██
|
-- ██ ████ ██ ███████ █████ █████ █████ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
-- ██ ██ ██ ██ ██ ██ ███████ ███████ ███████ ██████
|
-- ██ ██ ██ ██ ██ ██ ███████ ███████ ███████ ██████
|
||||||
function worldeditadditions.noise.make_2d(size, noise_func)
|
|
||||||
-- TODO: Follow https://www.redblobgames.com/maps/terrain-from-noise/
|
|
||||||
|
-- Generate a flat array of 2D noise.
|
||||||
|
-- Written with help from https://www.redblobgames.com/maps/terrain-from-noise/
|
||||||
|
-- @param size Vector An x/y vector representing the size of the noise area to generate.
|
||||||
|
-- @param params table|table<table> A table of noise params to use to generate the noise. Values that aren't specified are filled in automatically. If a table of tables is specified, it is interpreted as multiple octaves of noise to apply in sequence.
|
||||||
|
function worldeditadditions.noise.make_2d(size, params)
|
||||||
|
params = worldeditadditions.noise.params_apply_default(params)
|
||||||
|
|
||||||
|
local result = {}
|
||||||
|
|
||||||
|
local generator;
|
||||||
|
if params.algorithm == "perlin" then
|
||||||
|
generator = worldeditadditions.noise.perlin.new()
|
||||||
|
else -- We don't have any other generators just yet
|
||||||
|
return false, "Error: Unknown noise algorithm '"..params.."'."
|
||||||
|
end
|
||||||
|
|
||||||
|
for x=params.offset.x, params.offset.x+size.x do
|
||||||
|
for y=params.offset.y, params.offset.y+size.y do
|
||||||
|
local result = 0
|
||||||
|
for i,params_octave in ipairs(params) do
|
||||||
|
result = result + (generator:noise(x * scale.x, y * scale.y, 0) ^ params.exponent) * params.multiply + params.add
|
||||||
|
end
|
||||||
|
result[y*size.x + x] = result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return result
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
worldeditadditions.noise = {}
|
worldeditadditions.noise = {}
|
||||||
|
|
||||||
dofile(worldeditadditions.modpath.."/lib/noise/alg_perlin.lua")
|
dofile(worldeditadditions.modpath.."/lib/noise/noise_params.lua")
|
||||||
|
dofile(worldeditadditions.modpath.."/lib/noise/make_2d.lua")
|
||||||
|
dofile(worldeditadditions.modpath.."/lib/noise/engines/perlin.lua")
|
||||||
|
|
37
worldeditadditions/lib/noise/noise_params.lua
Normal file
37
worldeditadditions/lib/noise/noise_params.lua
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
--- Makes sure that the default settings are all present in the given params table.
|
||||||
|
-- This way not all params have to be specified by the user.
|
||||||
|
-- @param params table The params table generated from the user's input.
|
||||||
|
-- @return table A NEW table with all the missing properties filled in with the default values.
|
||||||
|
function worldeditadditions.noise.params_apply_default(params)
|
||||||
|
local params_default = {
|
||||||
|
algorithm = "perlin",
|
||||||
|
-- Zooms in and out
|
||||||
|
scale = vector.new(1, 1, 1),
|
||||||
|
-- Offset the generated noise by this vector.
|
||||||
|
offset = vector.new(0, 0, 0),
|
||||||
|
-- Apply this exponent to the resulting noise value
|
||||||
|
exponent = 1,
|
||||||
|
-- Multiply the resulting noise value by this number. Changes the "strength" of the noise
|
||||||
|
multiply = 1,
|
||||||
|
-- Add this number to the resulting noise value
|
||||||
|
add = 0
|
||||||
|
-- The seed to generate the noise with. nil = randomly chosen
|
||||||
|
-- The perlin generator isn't currently seedable :-/
|
||||||
|
-- seed = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if not params[1] then params = { params } end
|
||||||
|
|
||||||
|
-- If params[1] is thing, this is a list of params
|
||||||
|
-- This might be a thing if we're dealingw ith multiple octaves
|
||||||
|
for i,params_el in ipairs(params) do
|
||||||
|
local default_copy = worldeditadditions.shallowcopy(params_default)
|
||||||
|
worldeditadditions.table_apply(
|
||||||
|
params_el,
|
||||||
|
default_copy
|
||||||
|
)
|
||||||
|
params[i] = default_copy
|
||||||
|
end
|
||||||
|
|
||||||
|
return params
|
||||||
|
end
|
Loading…
Reference in a new issue