mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-12-22 19:45:02 +00:00
core pos: Add (complicated) compat w/worldedit
This commit is contained in:
parent
285572e16b
commit
f998110303
3 changed files with 60 additions and 17 deletions
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
|
Loading…
Reference in a new issue