Compare commits
22 Commits
Author | SHA1 | Date |
---|---|---|
Starbeamrainbowlabs | e89d61034f | |
Starbeamrainbowlabs | 8efceeaa4c | |
Starbeamrainbowlabs | 5ca5d1f1de | |
Starbeamrainbowlabs | 2a9dca6926 | |
Starbeamrainbowlabs | dd6e34bde1 | |
Starbeamrainbowlabs | 125638a079 | |
Starbeamrainbowlabs | 7be2fb125e | |
Starbeamrainbowlabs | 6231132055 | |
Starbeamrainbowlabs | abfd76930a | |
Starbeamrainbowlabs | aec204de8e | |
Starbeamrainbowlabs | daae15eb57 | |
Starbeamrainbowlabs | 200e588c59 | |
Starbeamrainbowlabs | 2840ba4dea | |
Starbeamrainbowlabs | 564785ddf6 | |
Starbeamrainbowlabs | a465a50244 | |
Starbeamrainbowlabs | 5505575cf9 | |
Starbeamrainbowlabs | fd3ee43728 | |
Starbeamrainbowlabs | ee4b3e09bb | |
Starbeamrainbowlabs | 0645bc7b8e | |
VorTechnix | 7766af8a8a | |
VorTechnix | d2fb6db3d0 | |
Starbeamrainbowlabs | a6e8753e64 |
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "worldeditadditions",
|
||||
"version": "1.14.0",
|
||||
"version": "1.14.5",
|
||||
"description": "Documentation website for WorldEditAdditions",
|
||||
"main": "index.js",
|
||||
"private": true,
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
What's the bug? Be clear and concise in our explanation. Don't forget to include any context, error messages, logs, and screenshots required to understand the issue if applicable.
|
||||
|
||||
**Reproduction steps:**
|
||||
Steps to reproduce the behaviour:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Enter this command to '....'
|
||||
4. See error
|
||||
|
||||
**System information (please complete the following information):**
|
||||
- **Operating system and version:** [e.g. iOS]
|
||||
- **Minetest version:** [e.g. 5.8.0]
|
||||
- **WorldEdit version:**
|
||||
- **WorldEditAdditions version:**
|
||||
|
||||
Please add any other additional specific system information here too if you think it would help.
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Problem
|
||||
A clear and concise description of what the problem you want to solve is. e.g. I'm always frustrated when [...]
|
||||
|
||||
## Solution
|
||||
Describe clearly the solution you'd like.
|
||||
|
||||
## Alternatives
|
||||
A clear and concise description of any alternative solutions or features you've considered, and how they relate to your proposed feature.
|
||||
|
||||
## Additional context
|
||||
Add any other context or screenshots about the feature request here.
|
||||
|
||||
Don't forget to remove replace descriptions, but keep the headers.
|
21
CHANGELOG.md
21
CHANGELOG.md
|
@ -4,6 +4,27 @@ It's about time I started a changelog! This will serve from now on as the main c
|
|||
Note to self: See the bottom of this file for the release template text.
|
||||
|
||||
|
||||
## v1.14.5: The multipoint update, hotfix 5 (1st August 2023)
|
||||
- Fix a bug where creative players in survival couldn't punch out position markers
|
||||
- Added `//listentities`, which lists all currently loaded `ObjectRef`s. This is intended for debugging mods - thanks to @Zughy in #103
|
||||
|
||||
|
||||
## v1.14.4: The multipoint update, hotfix 4 (31st July 2023)
|
||||
- When any segment of the marker wall is punched, unmark the entire wall
|
||||
|
||||
|
||||
## v1.14.3: The multipoint update, hotfix 3 (18th July 2023)
|
||||
- Fix regions not remembering their state and being unresettable
|
||||
|
||||
|
||||
## v1.14.2: The multipoint update, hotfix 2 (15th July 2023)
|
||||
- Fix crash in `//subdivide`, again due to the new position system
|
||||
|
||||
|
||||
## v1.14.1: The multipoint update, hotfix 1 (12th July 2023)
|
||||
- Fix issue #100, which caused a crash as `//pos1` and `//pos2` allowed non-integer positions to be set
|
||||
|
||||
|
||||
## v1.14: The multipoint update (11th July 2023)
|
||||
- Add `//dome+`, which allows you to change the direction the dome is pointing in, and also create multiple domes at once
|
||||
- Add `//metaball`, which renders 2 or more [metaballs](https://en.wikipedia.org/wiki/Metaballs) in Minetest
|
||||
|
|
|
@ -1349,6 +1349,17 @@ Here are some more examples:
|
|||
```
|
||||
|
||||
|
||||
### `//listentities`
|
||||
Lists all currently loaded ObjectRefs. Displays their IDs, Names (if possible), and possitions.
|
||||
|
||||
This command is intended for development and modding. You will not normally need to use this command using WorldEditAdditions.
|
||||
|
||||
`//listentities` takes no arguments.
|
||||
|
||||
```
|
||||
//listentities
|
||||
```
|
||||
|
||||
|
||||
## Extras
|
||||
<!--
|
||||
|
|
11
README.md
11
README.md
|
@ -1,5 +1,5 @@
|
|||
# ![](https://raw.githubusercontent.com/sbrl/Minetest-WorldEditAdditions/main/worldeditadditions-64.png) Minetest-WorldEditAdditions
|
||||
![GitHub release (latest by date)](https://img.shields.io/github/v/release/sbrl/Minetest-WorldEditAdditions?color=green&label=latest%20release) [![View the changelog](https://img.shields.io/badge/%F0%9F%93%B0-Changelog-informational)](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/main/CHANGELOG.md) [![ContentDB](https://content.minetest.net/packages/Starbeamrainbowlabs/worldeditadditions/shields/downloads/)](https://content.minetest.net/packages/Starbeamrainbowlabs/worldeditadditions/)
|
||||
# ![](https://raw.githubusercontent.com/sbrl/Minetest-WorldEditAdditions/main/worldeditadditions-64.png) WorldEditAdditions
|
||||
![GitHub release (latest by date)](https://img.shields.io/github/v/release/sbrl/Minetest-WorldEditAdditions?color=green&label=latest%20release) [![View the changelog](https://img.shields.io/badge/%F0%9F%93%B0-Changelog-informational)](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/main/CHANGELOG.md) [![ContentDB](https://content.minetest.net/packages/Starbeamrainbowlabs/worldeditadditions/shields/downloads/)](https://content.minetest.net/packages/Starbeamrainbowlabs/worldeditadditions/) [![Join the official discord server](https://worldeditadditions.mooncarrot.space/img/shield-discord.svg)](https://discord.gg/FzD73kuhsk)
|
||||
|
||||
> Extra tools and commands to extend WorldEdit for Minetest
|
||||
|
||||
|
@ -162,9 +162,16 @@ Please update to v1.8+. There was a bug in earlier versions that caused a race c
|
|||
### Why don't the [moretrees](https://content.minetest.net/packages/VanessaE/moretrees/) trees work with `//forest`?
|
||||
As far as I can tell, the saplings provided by the [`moretrees` mod](https://content.minetest.net/packages/VanessaE/moretrees/) don't properly interact with bonemeal from the [bonemeal mod](https://content.minetest.net/packages/TenPlus1/bonemeal/), which WorldEditAdditions uses to grow trees. As far as I can tell WorldEditAdditions has everything in place needed to support them, but until applying bonemeal to `moretrees` saplings results in a tree rather than waiting for one to grow over time, WorldEditAdditions will always fail to place trees provided by the `moretrees` mod, unfortunately.
|
||||
|
||||
### The region markers look weird!
|
||||
We've implemented a custom replacement for the WorldEdit region markers that supports selecting more than 2 points. This new WorldEditAdditions positioning system synchronises with WorldEdit's positioning system, so you can use both WorldEdit and WorldEditAdditions tools and commands interchangeably and they will seamlessly sync with each other.
|
||||
|
||||
The only side effect of this is that WorldEdit commands such as `//shift` are not aware of the new WorldEditAdditions positioning system, so you may encounter a situation where both WorldEdit and WorldEditAdditions region markers may display until you use another WorldEditAdditions command or tool to update them. This will be fixed in time as more commands and tools are implemented.
|
||||
|
||||
### The position markers disappear when far way
|
||||
This is a limitation of Minetest. You can workaround it though by setting [`active_block_range`](https://github.com/minetest/minetest/blob/5.6.1/minetest.conf.example#L2868) to a higher value - though be aware this also affects ABMs and other entities as well, so it can cause server lag.
|
||||
|
||||
The new positioning system now partially rectifies this issue with the region marker walls by creating a grid of entities instead of a single entity, such that a portion of them are more likely to be in range.
|
||||
|
||||
|
||||
## Contributing
|
||||
Contributions are welcome! Please state in your pull request(s) that you release your contribution under the _Mozilla Public License 2.0_.
|
||||
|
|
4
build.sh
4
build.sh
|
@ -2,10 +2,10 @@
|
|||
set -e;
|
||||
|
||||
# current_branch="$(git rev-parse --abbrev-ref HEAD)";
|
||||
is_main="$(git branch --contains HEAD | awk '/HEAD/ { next } /main/ { print $1 }')";
|
||||
is_main="$(git branch --contains HEAD | awk '/HEAD/ { next } /dev/ { print $1 }')";
|
||||
|
||||
if [[ "${1}" == "ci" ]] && [[ ! -z "${is_main}" ]]; then
|
||||
echo "Skipping build, because this commit does not appear to be on the 'main' branch, and we only deploy commits on the 'main' branch.";
|
||||
echo "Skipping build, because this commit does not appear to be on the 'dev' branch, and we only deploy commits on the 'main' branch.";
|
||||
fi
|
||||
|
||||
# ██████ ██ ██████ ██ ██ ██ ██ ██████
|
||||
|
|
|
@ -3,4 +3,4 @@ description = Extra tools and commands to extend WorldEdit. Currently has over 2
|
|||
|
||||
depends = worldedit
|
||||
optional_depends = bonemeal,cool_trees,default,moretrees,ethereal
|
||||
min_minetest_version = 5.1
|
||||
min_minetest_version = 5.2
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- WorldEditAdditions
|
||||
-- @namespace worldeditadditions
|
||||
-- @release 1.14
|
||||
-- @release 1.14.5
|
||||
-- @copyright 2023 Starbeamrainbowlabs
|
||||
-- @license Mozilla Public License, 2.0
|
||||
-- @author Starbeamrainbowlabs
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
local wea = worldeditadditions
|
||||
|
||||
|
||||
--- Noise generation algorithm engines.
|
||||
-- @namespace worldeditadditions.noise.engines
|
||||
return {
|
||||
available = { "perlin", "perlinmt", "sin", "white", "red", "infrared" },
|
||||
Perlin = dofile(wea.modpath.."/lib/noise/engines/perlin.lua"),
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
local wea = worldeditadditions
|
||||
|
||||
|
||||
--- System to manipulate the world using noise generation functions.
|
||||
-- @namespace worldeditadditions.noise
|
||||
wea.noise = {}
|
||||
|
||||
-- The command itself
|
||||
|
|
|
@ -5,17 +5,18 @@
|
|||
-- ███████ ██████ ██████ ██████ ██ ████ ██ ██████ ███████
|
||||
local wea_c = worldeditadditions_core
|
||||
local wea = worldeditadditions
|
||||
local Vector3 = wea_c.Vector3
|
||||
|
||||
-- Counts the number of chunks in the given area.
|
||||
-- Maths is now done properly. Values from this new implementation were tested
|
||||
-- with 1000 random pos1, pos2, and chunk_size combinations and found to be identical.
|
||||
local function count_chunks(pos1, pos2, chunk_size)
|
||||
-- Assume pos1 & pos2 are sorted
|
||||
local dimensions = {
|
||||
x = pos2.x - pos1.x + 1,
|
||||
y = pos2.y - pos1.y + 1,
|
||||
z = pos2.z - pos1.z + 1,
|
||||
}
|
||||
local dimensions = Vector3.new(
|
||||
pos2.x - pos1.x + 1,
|
||||
pos2.y - pos1.y + 1,
|
||||
pos2.z - pos1.z + 1
|
||||
)
|
||||
-- print("[new] dimensions", dimensions.x, dimensions.y, dimensions.z)
|
||||
return math.ceil(dimensions.x / chunk_size.x)
|
||||
* math.ceil(dimensions.y / chunk_size.y)
|
||||
|
@ -68,12 +69,12 @@ local function subdivide_step_beforeload(state)
|
|||
end
|
||||
end
|
||||
|
||||
state.cpos2 = { x = state.cpos.x, y = state.cpos.y, z = state.cpos.z }
|
||||
state.cpos1 = {
|
||||
x = state.cpos.x - state.chunk_size.x,
|
||||
y = state.cpos.y - state.chunk_size.y,
|
||||
z = state.cpos.z - state.chunk_size.z
|
||||
}
|
||||
state.cpos2 = Vector3.new(state.cpos.x, state.cpos.y, state.cpos.z)
|
||||
state.cpos1 = Vector3.new(
|
||||
state.cpos.x - state.chunk_size.x,
|
||||
state.cpos.y - state.chunk_size.y,
|
||||
state.cpos.z - state.chunk_size.z
|
||||
)
|
||||
if state.cpos1.x < state.pos1.x then state.cpos1.x = state.pos1.x end
|
||||
if state.cpos1.y < state.pos1.y then state.cpos1.y = state.pos1.y end
|
||||
if state.cpos1.z < state.pos1.z then state.cpos1.z = state.pos1.z end
|
||||
|
@ -151,7 +152,7 @@ function worldeditadditions.subdivide(pos1, pos2, chunk_size, callback_subblock,
|
|||
local state = {
|
||||
pos1 = pos1, pos2 = pos2,
|
||||
-- Note that we start 1 over on the Z axis because we increment *before* calling the callback, so if we don't fiddle it here, we'll miss the first chunk
|
||||
cpos = { x = pos2.x, y = pos2.y, z = pos2.z + chunk_size.z + 1 },
|
||||
cpos = Vector3.new(pos2.x, pos2.y, pos2.z + chunk_size.z + 1),
|
||||
-- The size of a single subblock
|
||||
chunk_size = chunk_size,
|
||||
-- The total number of nodes in the defined region
|
||||
|
|
|
@ -16,3 +16,5 @@ dofile(we_cmdpath.."many.lua")
|
|||
dofile(we_cmdpath.."multi.lua")
|
||||
dofile(we_cmdpath.."noiseapply2d.lua")
|
||||
dofile(we_cmdpath.."subdivide.lua")
|
||||
|
||||
dofile(we_cmdpath.."listentities.lua")
|
|
@ -0,0 +1,39 @@
|
|||
-- Lists all currently loaded entities.
|
||||
|
||||
local weac = worldeditadditions_core
|
||||
|
||||
minetest.register_chatcommand("/listentities", {
|
||||
params = "",
|
||||
description =
|
||||
"Lists all currently loaded entities. This is a command for debugging and development. You will not need this unless you are developing a mod.",
|
||||
privs = { worldedit = true },
|
||||
func = function(name, params_text)
|
||||
local table_vals = {
|
||||
{ "ID", "Name", "Position" },
|
||||
{ "------", "-------", "---------" },
|
||||
}
|
||||
for id, obj in pairs(minetest.object_refs) do
|
||||
local obj_name = "[ObjectRef]"
|
||||
if obj.get_luaentity then
|
||||
local luaentity = obj:get_luaentity()
|
||||
if luaentity then
|
||||
obj_name = "[LuaEntity:"..luaentity.name.."]"
|
||||
else
|
||||
obj_name = "[LuaEntity:__UNKNOWN__]"
|
||||
end
|
||||
end
|
||||
local pos = weac.Vector3.clone(obj:get_pos())
|
||||
table.insert(table_vals, {
|
||||
id,
|
||||
obj_name,
|
||||
tostring(pos)
|
||||
})
|
||||
end
|
||||
worldedit.player_notify(name, table.concat({
|
||||
"Currently loaded entities:",
|
||||
weac.format.make_ascii_table(table_vals),
|
||||
"",
|
||||
"Total "..tostring(#table_vals).." objects"
|
||||
}, "\n"))
|
||||
end
|
||||
})
|
|
@ -1,63 +1,63 @@
|
|||
local weac = worldeditadditions_core
|
||||
local Vector3 = weac.Vector3
|
||||
|
||||
|
||||
local function do_set(name, i)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
weac.pos.set(name, i, Vector3.clone(player:get_pos()))
|
||||
end
|
||||
|
||||
local function do_set1(name, params_text)
|
||||
do_set(name, 1)
|
||||
end
|
||||
local function do_set2(name, params_text)
|
||||
do_set(name, 2)
|
||||
end
|
||||
|
||||
if minetest.registered_chatcommands["/pos1"] then
|
||||
minetest.override_chatcommand("/pos1", {
|
||||
params = "",
|
||||
description =
|
||||
"Sets pos1 to the current position of the calling player.",
|
||||
func = do_set1
|
||||
})
|
||||
else
|
||||
minetest.register_chatcommand("/pos1", {
|
||||
params = "",
|
||||
description =
|
||||
"Sets pos1 to the current position of the calling player.",
|
||||
privs = { worldedit = true },
|
||||
func = do_set1
|
||||
})
|
||||
end
|
||||
if minetest.registered_chatcommands["/pos2"] then
|
||||
minetest.override_chatcommand("/pos2", {
|
||||
params = "",
|
||||
description = "Sets pos2 to the current position of the calling player.",
|
||||
func = do_set2
|
||||
})
|
||||
else
|
||||
minetest.register_chatcommand("/pos2", {
|
||||
params = "",
|
||||
description = "Sets pos2 to the current position of the calling player.",
|
||||
privs = { worldedit = true },
|
||||
func = do_set2
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
minetest.register_chatcommand("//pos", {
|
||||
params = "<index>",
|
||||
description = "Sets position <index> to the current position of the calling player.",
|
||||
privs = { worldedit = true },
|
||||
func = function(name, params_text)
|
||||
local i = tonumber(params_text)
|
||||
if type(i) ~= "number" then
|
||||
worldedit.player_notify(name, "Error: Invalid index number given.")
|
||||
return
|
||||
end
|
||||
i = math.floor(i)
|
||||
|
||||
do_set(name, i)
|
||||
end
|
||||
local weac = worldeditadditions_core
|
||||
local Vector3 = weac.Vector3
|
||||
|
||||
|
||||
local function do_set(name, i)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
weac.pos.set(name, i, Vector3.round(player:get_pos()))
|
||||
end
|
||||
|
||||
local function do_set1(name, params_text)
|
||||
do_set(name, 1)
|
||||
end
|
||||
local function do_set2(name, params_text)
|
||||
do_set(name, 2)
|
||||
end
|
||||
|
||||
if minetest.registered_chatcommands["/pos1"] then
|
||||
minetest.override_chatcommand("/pos1", {
|
||||
params = "",
|
||||
description =
|
||||
"Sets pos1 to the current position of the calling player.",
|
||||
func = do_set1
|
||||
})
|
||||
else
|
||||
minetest.register_chatcommand("/pos1", {
|
||||
params = "",
|
||||
description =
|
||||
"Sets pos1 to the current position of the calling player.",
|
||||
privs = { worldedit = true },
|
||||
func = do_set1
|
||||
})
|
||||
end
|
||||
if minetest.registered_chatcommands["/pos2"] then
|
||||
minetest.override_chatcommand("/pos2", {
|
||||
params = "",
|
||||
description = "Sets pos2 to the current position of the calling player.",
|
||||
func = do_set2
|
||||
})
|
||||
else
|
||||
minetest.register_chatcommand("/pos2", {
|
||||
params = "",
|
||||
description = "Sets pos2 to the current position of the calling player.",
|
||||
privs = { worldedit = true },
|
||||
func = do_set2
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
minetest.register_chatcommand("//pos", {
|
||||
params = "<index>",
|
||||
description = "Sets position <index> to the current position of the calling player.",
|
||||
privs = { worldedit = true },
|
||||
func = function(name, params_text)
|
||||
local i = tonumber(params_text)
|
||||
if type(i) ~= "number" then
|
||||
worldedit.player_notify(name, "Error: Invalid index number given.")
|
||||
return
|
||||
end
|
||||
i = math.floor(i)
|
||||
|
||||
do_set(name, i)
|
||||
end
|
||||
})
|
|
@ -4,6 +4,13 @@ local EventEmitter = worldeditadditions_core.EventEmitter
|
|||
|
||||
local anchor
|
||||
|
||||
local function make_id()
|
||||
return tostring(wea_c.get_ms_time()) .. "_" .. tostring(math.floor(math.random() * 1000000))
|
||||
end
|
||||
|
||||
local last_reset = make_id()
|
||||
|
||||
|
||||
local WEAPositionMarker = {
|
||||
initial_properties = {
|
||||
visual = "cube",
|
||||
|
@ -11,7 +18,7 @@ local WEAPositionMarker = {
|
|||
collisionbox = { -0.55, -0.55, -0.55, 0.55, 0.55, 0.55 },
|
||||
physical = false,
|
||||
collide_with_objects = false,
|
||||
static_save = false,
|
||||
hp_max = 1,
|
||||
|
||||
textures = {
|
||||
"worldeditadditions_core_bg.png",
|
||||
|
@ -24,25 +31,57 @@ local WEAPositionMarker = {
|
|||
},
|
||||
|
||||
on_activate = function(self, staticdata)
|
||||
-- noop
|
||||
local data = minetest.parse_json(staticdata)
|
||||
print("DEBUG:pos_marker ON_ACTIVATE data", data)
|
||||
if type(data) ~= "table" or data.id ~= last_reset then
|
||||
-- print("DEBUG:marker_wall/remove staticdata", staticdata, "last_reset", last_reset)
|
||||
self.object:remove()
|
||||
-- else
|
||||
-- print("DEBUG:marker_wall/ok staticdata", staticdata, "type", type(staticdata), "last_reset", last_reset, "type", type(last_reset))
|
||||
return
|
||||
end
|
||||
|
||||
self.__id = data.id
|
||||
self.player_name = data.player_name
|
||||
self.display_number = data.display_number
|
||||
|
||||
anchor:emit("update_entity", {
|
||||
entity = self.object,
|
||||
id = self.__id,
|
||||
player_name = self.player_name,
|
||||
i = self.display_number
|
||||
})
|
||||
anchor.set_number(self.object, self.display_number)
|
||||
end,
|
||||
on_punch = function(self, _)
|
||||
print("DEBUG:pos_marker on_punch")
|
||||
anchor.delete(self)
|
||||
end,
|
||||
on_blast = function(self, damage)
|
||||
return false, false, {} -- Do not damage or knockback the player
|
||||
end,
|
||||
get_staticdata = function(self)
|
||||
return minetest.write_json({
|
||||
id = self.__id,
|
||||
display_number = self.display_number,
|
||||
player_name = self.player_name
|
||||
})
|
||||
end
|
||||
}
|
||||
|
||||
minetest.register_entity(":worldeditadditions:position", WEAPositionMarker)
|
||||
|
||||
local function create(player_name, pos, display_number)
|
||||
local entity = minetest.add_entity(pos, "worldeditadditions:position")
|
||||
local entity = minetest.add_entity(pos, "worldeditadditions:position", minetest.write_json({
|
||||
id = last_reset,
|
||||
display_number = display_number,
|
||||
player_name = player_name
|
||||
}))
|
||||
|
||||
entity:get_luaentity().player_name = player_name
|
||||
entity:get_luaentity().display_number = display_number
|
||||
-- entity:get_luaentity().player_name = player_name
|
||||
-- entity:get_luaentity().display_number = display_number
|
||||
|
||||
anchor.set_number(entity, display_number)
|
||||
-- anchor.set_number(entity, display_number)
|
||||
|
||||
anchor:emit("create", {
|
||||
player_name = player_name,
|
||||
|
@ -53,11 +92,13 @@ local function create(player_name, pos, display_number)
|
|||
end
|
||||
|
||||
local function delete(entity)
|
||||
if not entity.get_luaentity or not entity:get_luaentity() then return end -- Ensure the entity is still valid
|
||||
if not entity or not entity.get_luaentity or not entity:get_luaentity() then return end -- Ensure the entity is still valid
|
||||
|
||||
local player_name = entity:get_luaentity().player_name
|
||||
local display_number = entity:get_luaentity().display_number
|
||||
|
||||
last_reset = make_id()
|
||||
|
||||
entity:remove()
|
||||
|
||||
anchor:emit("delete", {
|
||||
|
@ -117,5 +158,5 @@ anchor = EventEmitter.new({
|
|||
delete = delete,
|
||||
set_number = set_number
|
||||
})
|
||||
|
||||
anchor.debug = true
|
||||
return anchor
|
||||
|
|
|
@ -7,7 +7,12 @@ local anchor
|
|||
local entity_wall_size = 10
|
||||
local collision_thickness = 0.2
|
||||
|
||||
local last_reset = tostring(wea_c.get_ms_time())
|
||||
local function make_id()
|
||||
return tostring(wea_c.get_ms_time()) .. "_" .. tostring(math.floor(math.random() * 1000000))
|
||||
end
|
||||
|
||||
local last_reset = make_id()
|
||||
|
||||
|
||||
local WEAPositionMarkerWall = {
|
||||
initial_properties = {
|
||||
|
@ -17,8 +22,8 @@ local WEAPositionMarkerWall = {
|
|||
-- ^^ { xmin, ymin, zmin, xmax, ymax, zmax } relative to obj pos
|
||||
physical = false,
|
||||
collide_with_objects = false,
|
||||
static_save = false,
|
||||
|
||||
hp_max = 1,
|
||||
|
||||
textures = {
|
||||
"worldeditadditions_core_marker_wall.png",
|
||||
"worldeditadditions_core_marker_wall.png",
|
||||
|
@ -30,18 +35,41 @@ local WEAPositionMarkerWall = {
|
|||
},
|
||||
|
||||
on_activate = function(self, staticdata)
|
||||
if staticdata ~= last_reset then
|
||||
-- print("DEBUG:marker_wall/remove staticdata", staticdata, "last_reset", last_reset)
|
||||
local data = minetest.parse_json(staticdata)
|
||||
if type(data) ~= "table" or data.id ~= last_reset then
|
||||
self.object:remove()
|
||||
-- else
|
||||
-- print("DEBUG:marker_wall/ok staticdata", staticdata, "type", type(staticdata), "last_reset", last_reset, "type", type(last_reset))
|
||||
return
|
||||
end
|
||||
|
||||
self.__id = data.id
|
||||
self._size = Vector3.clone(data.size)
|
||||
self._side = data.side
|
||||
self.player_name = data.player_name
|
||||
|
||||
anchor.__single_setup(self.object, self._size, self._side)
|
||||
|
||||
anchor:emit("update_entity", {
|
||||
entity = self.object,
|
||||
player_name = self.player_name
|
||||
})
|
||||
end,
|
||||
on_punch = function(self, _)
|
||||
print("DEBUG:pos_marker_wall on_punch")
|
||||
anchor.delete(self)
|
||||
-- Only unmark the rest of the walls
|
||||
-- Unmark for the player that created this wall.... NOT the player who punched it!
|
||||
wea_c.pos.unmark(self.player_name, false, true)
|
||||
end,
|
||||
on_blast = function(self, damage)
|
||||
return false, false, {} -- Do not damage or knockback the player
|
||||
end,
|
||||
get_staticdata = function(self)
|
||||
return minetest.write_json({
|
||||
id = self.__id,
|
||||
size = self._size,
|
||||
side = self._side,
|
||||
player_name = self.player_name
|
||||
})
|
||||
end
|
||||
}
|
||||
|
||||
|
@ -109,12 +137,17 @@ local function create_single(player_name, pos1, pos2, side)
|
|||
|
||||
|
||||
local pos_centre = ((pos2 - pos1) / 2) + pos1
|
||||
local entity = minetest.add_entity(pos_centre, "worldeditadditions:marker_wall", last_reset)
|
||||
local entity = minetest.add_entity(pos_centre, "worldeditadditions:marker_wall", minetest.write_json({
|
||||
id = last_reset,
|
||||
size = pos2 - pos1,
|
||||
side = side,
|
||||
player_name = player_name
|
||||
}))
|
||||
-- print("DEBUG:marker_wall create_single --> START player_name", player_name, "pos1", pos1, "pos2", pos2, "side", side, "SPAWN", pos_centre, "last_reset", last_reset)
|
||||
|
||||
entity:get_luaentity().player_name = player_name
|
||||
-- entity:get_luaentity().player_name = player_name
|
||||
|
||||
single_setup(entity, pos2 - pos1, side)
|
||||
-- single_setup(entity, pos2 - pos1, side)
|
||||
|
||||
return entity
|
||||
end
|
||||
|
@ -438,7 +471,7 @@ local function delete(entitylist)
|
|||
entity:remove()
|
||||
end
|
||||
|
||||
last_reset = tostring(wea_c.get_ms_time())
|
||||
last_reset = make_id()
|
||||
-- print("DEBUG:marker_wall delete --> LAST_RESET is now", last_reset, "type", type(last_reset))
|
||||
|
||||
anchor:emit("delete", {
|
||||
|
@ -450,7 +483,8 @@ end
|
|||
|
||||
anchor = EventEmitter.new({
|
||||
create = create_wall,
|
||||
delete = delete
|
||||
delete = delete,
|
||||
__single_setup = single_setup
|
||||
})
|
||||
|
||||
return anchor
|
|
@ -33,7 +33,7 @@ local anchor = nil
|
|||
|
||||
--- It is requested that all position/region marker UI elements be hidden for the given player.
|
||||
-- @event unmark
|
||||
-- @format { player_name: string }
|
||||
-- @format { player_name: string, markers: bool, walls: bool }
|
||||
|
||||
--- It is requested that all position/region marker UI elements be shown once more for the given player.
|
||||
-- @event mark
|
||||
|
@ -268,15 +268,24 @@ end
|
|||
|
||||
--- Hides the visual markers for the given player's positions and defined region, but does not clear the points.
|
||||
-- @param player_name string The name of the player to operate on.
|
||||
local function unmark(player_name)
|
||||
-- @param markers=true bool Whether to hide positional markers.
|
||||
-- @param walls=true bool Whether to hide the marker walls.
|
||||
-- @returns void
|
||||
local function unmark(player_name, markers, walls)
|
||||
if markers == nil then markers = true end
|
||||
if walls == nil then walls = true end
|
||||
|
||||
anchor:emit("unmark", {
|
||||
player_name = player_name
|
||||
player_name = player_name,
|
||||
markers = markers,
|
||||
walls = walls
|
||||
})
|
||||
end
|
||||
|
||||
--- Shows the visual markers for the given player's positions and defined region once more.
|
||||
-- Often used some time after calling worldeditadditions_core.pos.unmark().
|
||||
-- @param player_name string The name of the player to operate on.
|
||||
-- @returns void
|
||||
local function mark(player_name)
|
||||
anchor:emit("mark", {
|
||||
player_name = player_name
|
||||
|
|
|
@ -92,8 +92,9 @@ end)
|
|||
wea_c.pos:addEventListener("unmark", function(event)
|
||||
ensure_player(event.player_name)
|
||||
|
||||
do_delete_all(event.player_name)
|
||||
|
||||
if event.markers then
|
||||
do_delete_all(event.player_name)
|
||||
end
|
||||
-- Note that this function is NOT WorldEdit compatible, because it is only called through our override of WorldEdit's `//unmark`, and WorldEdit doesn't have an API function to call to unmark and everything is complicated.
|
||||
end)
|
||||
|
||||
|
@ -109,4 +110,12 @@ wea_c.pos:addEventListener("mark", function(event)
|
|||
pos = pos
|
||||
})
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
|
||||
wea_c.entities.pos_marker:addEventListener("update_entity", function(event)
|
||||
wea_c.entities.pos_marker.delete(
|
||||
position_entities[event.player_name][event.i]
|
||||
)
|
||||
position_entities[event.player_name][event.i] = event.entity
|
||||
end)
|
||||
|
|
|
@ -53,6 +53,26 @@ local function do_update(event)
|
|||
end
|
||||
|
||||
|
||||
local function garbage_collect(player_name)
|
||||
if not wall_entity_lists[player_name] then return end -- Nothing to do
|
||||
|
||||
for i, entity in ipairs(wall_entity_lists[player_name]) do
|
||||
if not entity:get_pos() then
|
||||
table.remove(wall_entity_lists[player_name], i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function update_entity(event)
|
||||
print("DEBUG:pos_marker_wall_manage UPDATE_ENTITY event", weac.inspect(event))
|
||||
garbage_collect(event.player_name)
|
||||
|
||||
ensure_player(event.player_name)
|
||||
table.insert(
|
||||
wall_entity_lists[event.player_name],
|
||||
event.entity
|
||||
)
|
||||
end
|
||||
|
||||
local function needs_update(event)
|
||||
if event.i > 2 then
|
||||
|
@ -65,11 +85,16 @@ local function handle_event(event)
|
|||
if needs_update(event) then do_update(event) end
|
||||
end
|
||||
|
||||
local function handle_unmark(event)
|
||||
if event.walls then do_delete(event) end
|
||||
end
|
||||
|
||||
weac.pos:addEventListener("set", handle_event)
|
||||
weac.pos:addEventListener("pop", handle_event)
|
||||
weac.pos:addEventListener("push", handle_event)
|
||||
weac.pos:addEventListener("clear", do_delete)
|
||||
|
||||
weac.pos:addEventListener("unmark", do_delete)
|
||||
weac.pos:addEventListener("unmark", handle_unmark)
|
||||
weac.pos:addEventListener("mark", do_update)
|
||||
|
||||
weac.entities.pos_marker_wall:addEventListener("update_entity", update_entity)
|
|
@ -1,6 +1,6 @@
|
|||
--- WorldEditAdditions-Core
|
||||
-- @namespace worldeditadditions_core
|
||||
-- @release 1.14
|
||||
-- @release 1.14.5
|
||||
-- @copyright 2021 Starbeamrainbowlabs and VorTechnix
|
||||
-- @license Mozilla Public License, 2.0
|
||||
-- @author Starbeamrainbowlabs and VorTechnix
|
||||
|
|
|
@ -58,8 +58,12 @@ end
|
|||
-- @param event_name string The name of the event to emit.
|
||||
-- @param args table|any The argument(s) to pass to listener functions. It is strongly advised you pass a table here.
|
||||
function EventEmitter.emit(this, event_name, args)
|
||||
if this.debug then
|
||||
listeners = 0
|
||||
if this.events[event_name] ~= nil then listeners = #this.events[event_name] end
|
||||
print("DEBUG:EventEmitter emit", event_name, "listeners", listeners, "args", wea_c.inspect(args))
|
||||
end
|
||||
if this.events[event_name] == nil then return end
|
||||
if this.debug then print("DEBUG:EventEmitter emit", event_name, "args", wea_c.inspect(args)) end
|
||||
|
||||
for index,next_func in ipairs(this.events[event_name]) do
|
||||
next_func(args)
|
||||
|
|
Loading…
Reference in New Issue