core pos: Add (complicated) compat w/worldedit

This commit is contained in:
Starbeamrainbowlabs 2022-09-25 01:43:30 +01:00
parent 285572e16b
commit f998110303
Signed by: sbrl
GPG Key ID: 1BE5172E637709C2
3 changed files with 60 additions and 17 deletions

View File

@ -29,7 +29,13 @@ end
-- @returns void
local function compat_worldedit_pos1_get(player_name)
if worldedit and worldedit.pos1 and worldedit.pos1[player_name] then
positions[player_name][1] = Vector3.clone(worldedit.pos1[player_name])
ensure_player(player_name)
local new_pos1 = Vector3.clone(worldedit.pos1[player_name])
local existing_pos1 = positions[player_name][1]
positions[player_name][1] = new_pos1
if new_pos1 ~= existing_pos1 then
anchor:emit("set", { player_name = player_name, i = 1, pos = new_pos1 })
end
end
end
--- Transparently fetches from worldedit pos2 for compatibility.
@ -39,7 +45,13 @@ end
-- @returns void
local function compat_worldedit_pos2_get(player_name)
if worldedit and worldedit.pos2 and worldedit.pos2[player_name] then
positions[player_name][2] = Vector3.clone(worldedit.pos2[player_name])
ensure_player(player_name)
local new_pos2 = Vector3.clone(worldedit.pos2[player_name])
local existing_pos2 = positions[player_name][2]
positions[player_name][2] = new_pos2
if new_pos2 ~= existing_pos2 then
anchor:emit("set", { player_name = player_name, i = 2, pos = new_pos2 })
end
end
end
@ -48,23 +60,33 @@ end
-- @param i number The index of the position to set.
-- @returns Vector3? The position to set.
local function compat_worldedit_set(player_name, i, pos)
print("DEBUG:compat_worldedit_set i", i, "pos", pos)
if not worldedit then return end
if i == 1 and worldedit.pos1 then
worldedit.pos1[player_name] = nil
if worldedit.marker_update then worldedit.marker_update(player_name) end
worldedit.pos1[player_name] = pos:clone()
if worldedit.mark_pos1 then worldedit.mark_pos1(player_name) end
elseif i == 2 and worldedit.pos2 then
worldedit.pos2[player_name] = nil
if worldedit.marker_update then worldedit.marker_update(player_name) end
worldedit.pos2[player_name] = pos:clone()
if worldedit.mark_pos2 then worldedit.mark_pos2(player_name) end
end
end
--- Fetches pos1/pos2 from WorldEdit (if available) and sets them in WorldEditAdditions' postional subsystem
-- @param player_name string The name of the player to sync the positions for.
local function compat_worldedit_get(player_name)
compat_worldedit_pos1_get(player_name)
compat_worldedit_pos2_get(player_name)
end
--- Gets the position with the given index for the given player.
-- @param player_name string The name of the player to fetch the position for.
-- @param i number The index of the position to fetch.
-- @returns Vector3? The position requested, or nil if it doesn't exist.
local function get_pos(player_name, i)
ensure_player(player_name)
if i == 1 then compat_worldedit_pos1_get(player_name)
if i == 2 then compat_worldedit_pos1_get(player_name)
elseif i == 2 then compat_worldedit_pos2_get(player_name) end
return positions[player_name][i]
@ -201,7 +223,8 @@ end
local function push_pos(player_name, pos)
ensure_player(player_name)
table.insert(positions[player_name], pos)
compat_worldedit_set(player_name, #positions, pos)
print("DEBUG poslist", wea_c.inspect(positions[player_name]))
compat_worldedit_set(player_name, #positions[player_name], pos)
anchor:emit("push", { player_name = player_name, pos = pos, i = #positions[player_name] })
return #positions[player_name]
@ -221,7 +244,8 @@ anchor = wea_c.EventEmitter.new({
set = set_pos,
set_pos1 = set_pos1,
set_pos2 = set_pos2,
set_all = set_pos_all
set_all = set_pos_all,
compat_worldedit_get = compat_worldedit_get
})
return anchor

View File

@ -2,6 +2,20 @@ local wea_c = worldeditadditions_core
local position_entities = {}
local function compat_worldedit_hide_pos1(player_name)
if not worldedit or not worldedit.pos1 or not worldedit.mark_pos1 then return end
local pos1 = worldedit.pos1[player_name]
worldedit.pos1[player_name] = nil
worldedit.mark_pos1(player_name)
worldedit.pos1[player_name] = nil
end
local function compat_worldedit_hide_pos2(player_name)
if not worldedit or not worldedit.pos2 or not worldedit.mark_pos2 then return end
local pos2 = worldedit.pos2[player_name]
worldedit.pos2[player_name] = nil
worldedit.mark_pos2(player_name)
worldedit.pos2[player_name] = nil
end
--- Ensures that a table exists for the given player.
-- @param player_name string The name of the player to check.
@ -18,6 +32,9 @@ end
local function do_create(event)
ensure_player(event.player_name)
if event.i == 1 then compat_worldedit_hide_pos1(event.player_name) end
if event.i == 2 then compat_worldedit_hide_pos2(event.player_name) end
local new_entity = wea_c.entities.pos_marker.create(
event.player_name,
event.pos,

View File

@ -32,25 +32,27 @@ minetest.register_tool(":worldeditadditions:multiwand", {
on_place = function(itemstack, player, pointed_thing)
-- Right click when pointing at something
-- Pointed thing: https://rubenwardy.com/minetest_modding_book/lua_api.html#pointed_thing
-- print("[farwand] on_place", name)
local name = player:get_player_name()
pop_pos(name)
local player_name = player:get_player_name()
wea_c.pos.compat_worldedit_get(player_name)
-- print("[farwand] on_place", player_name)
pop_pos(player_name)
end,
on_use = function(itemstack, player, pointed_thing)
-- Left click when pointing at something or nothing
local name = player:get_player_name()
-- print("[farwand] on_use", name)
local player_name = player:get_player_name()
wea_c.pos.compat_worldedit_get(player_name)
-- print("[farwand] on_use", player_name)
local looking_pos, node_id = wea.farwand.do_raycast(player)
push_pos(name, looking_pos)
push_pos(player_name, looking_pos)
end,
on_secondary_use = function(itemstack, player, pointed_thing)
-- Right click when pointing at nothing
-- print("[farwand] on_secondary_use", name)
local name = player:get_player_name()
local player_name = player:get_player_name()
-- print("[farwand] on_secondary_use", player_name)
wea_c.pos.compat_worldedit_get(player_name)
-- local looking_pos, node_id = do_raycast(player)
pop_pos(name)
pop_pos(player_name)
end
})