Strat work on a far-reaching wand, but it isn't finished yet.

We've got all the backend functions we'll probably need implemented 
though!
This commit is contained in:
Starbeamrainbowlabs 2020-06-13 02:08:03 +01:00
parent b8a5bec987
commit 6f20b31763
Signed by: sbrl
GPG key ID: 1BE5172E637709C2
8 changed files with 90 additions and 2 deletions

View file

@ -11,6 +11,7 @@ dofile(worldeditadditions.modpath.."/utils/strings.lua")
dofile(worldeditadditions.modpath.."/utils/numbers.lua") dofile(worldeditadditions.modpath.."/utils/numbers.lua")
dofile(worldeditadditions.modpath.."/utils/nodes.lua") dofile(worldeditadditions.modpath.."/utils/nodes.lua")
dofile(worldeditadditions.modpath.."/utils/tables.lua") dofile(worldeditadditions.modpath.."/utils/tables.lua")
dofile(worldeditadditions.modpath.."/utils/raycast_adv.lua") -- For the farwand
dofile(worldeditadditions.modpath.."/utils.lua") dofile(worldeditadditions.modpath.."/utils.lua")
dofile(worldeditadditions.modpath.."/lib/floodfill.lua") dofile(worldeditadditions.modpath.."/lib/floodfill.lua")

View file

@ -32,7 +32,7 @@ local node_id_air = minetest.get_content_id("air")
local node_id_ignore = minetest.get_content_id("ignore") local node_id_ignore = minetest.get_content_id("ignore")
--- Determines whether the given node/content id is an airlike node or not. --- Determines whether the given node/content id is an airlike node or not.
-- @param id number The content/node id to check. -- @param id number The content/node id to check.
-- @return bool Whether the given node/content id is an airlike node or not. -- @return bool Whether the given node/content id is an airlike node or not.
function worldeditadditions.is_airlike(id) function worldeditadditions.is_airlike(id)
-- Do a fast check against air and ignore -- Do a fast check against air and ignore
@ -42,13 +42,13 @@ function worldeditadditions.is_airlike(id)
return false return false
end end
local name = minetest.get_name_from_content_id(id)
-- If the node isn't registered, then it might not be an air node -- If the node isn't registered, then it might not be an air node
if not minetest.registered_nodes[id] then return false end if not minetest.registered_nodes[id] then return false end
if minetest.registered_nodes[id].sunlight_propagates == true then if minetest.registered_nodes[id].sunlight_propagates == true then
return true return true
end end
-- Check for membership of the airlike group -- Check for membership of the airlike group
local name = minetest.get_name_from_content_id(id)
local airlike_value = minetest.get_item_group(name, "airlike") local airlike_value = minetest.get_item_group(name, "airlike")
if airlike_value ~= nil and airlike_value > 0 then if airlike_value ~= nil and airlike_value > 0 then
return true return true
@ -61,6 +61,20 @@ function worldeditadditions.is_airlike(id)
return false return false
end end
--- Determines whether the given node/content id is a liquid-ish node or not.
-- @param id number The content/node id to check.
-- @return bool Whether the given node/content id is a liquid-ish node or not.
function worldeditadditions.is_liquidlike(id)
if id == node_id_ignore then return false end
if not minetest.registered_nodes[id] then return false end
local liquidtype = minetest.registered_nodes[id].liquidtype
if liquidtype == nil or liquidtype == "none" then return false end
-- If it's not none, then it has to be a liquid as the only other values are source and flowing
return true
end
--- Given a manip object and associates, generates a 2D x/z heightmap. --- Given a manip object and associates, generates a 2D x/z heightmap.
-- Note that pos1 and pos2 should have already been pushed through -- Note that pos1 and pos2 should have already been pushed through
-- worldedit.sort_pos(pos1, pos2) before passing them to this function. -- worldedit.sort_pos(pos1, pos2) before passing them to this function.

View file

@ -0,0 +1,47 @@
--- Raycasts to find a node in the direction the given player is looking.
-- @param player Player The player object to raycast from.
-- @param maxdist number The maximum distance to raycast.
-- @param skip_liquid bool Whether to skip liquids when raycasting.
-- @return position, number nil if nothing was found (or unloaded chunks were hit), or the position as an {x, y, z} table and the node id if something was found.
function worldeditadditions.raycast(player, maxdist, skip_liquid)
if maxdist == nil then maxdist = 100 end
if skip_liquid == nil then skip_liquid = false end
local look_dir = player:get_look_dir()
local node_id_ignore = minetest.get_content_id("ignore")
local cur_pos = {}
local player_pos = player:getpos()
player_pos.y = player_pos.y + 1.5 -- Calculate from the eye position
for i = 1, maxdist do
local j = i / 10
cur_pos.x = (look_dir.x*j) + player_pos.x
cur_pos.y = (look_dir.y*j) + player_pos.y
cur_pos.z = (look_dir.z*j) + player_pos.z
local found_node = false
local node = minetest.get_node_or_nil(cur_pos)
if node ~= nil then
local node_id = minetest.get_content_id(node.name)
local is_air = worldeditadditions.is_airlike(node_id)
-- ignore = unloaded chunks, as far as I can tell
if node_id == node_id_ignore then
return nil
end
if is_air == false then
if skip_liquid == true then
return cur_pos, node_id
elseif worldeditadditions.is_liquidlike(node_id) == true then
return cur_pos, node_id
end
end
end
end
return nil
end

View file

@ -0,0 +1,2 @@
worldedit
worldeditadditions

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"worldedit_wand","description":"","fps":0,"height":16,"width":16,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":3,\"chunks\":[{\"layout\":[[0],[1],[2]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAQCAYAAABQrvyxAAACWklEQVRIS82WXUhTYRjH/yd31ra2viQ5cxFRJlbUKre6CI2gm6AP2kV4FVSGXiZFfoSErCi76OOmQLqJERWkkMFuKqQsShIxvQrbyMK2yMztzNa2sz1xFkdW2fa+BwXP9ft/zu/3vO/zniP4BJCtAniVlNAeCAvQ8WSelJIQlJGekmFoAFcNqW4hWVYasdT6DJOxXQi2ylx5wb9JoNfvCFv2V8PT+ZwrrLpSt43SkRSK4mJWAEnA0Mgusc8XoEk5lm3bj0QaAw3buBiEpjI7OStWYai3D+XbV+Po4w9cBajDRtqm6RUY+VaJlJxGkfgURx5Vo/XlT2aG6YU3qyQKhcOwbHCh6WE/cwHlKqYF1O5f7DZxAWy9V0IJOYX0FCE5fh/Heg5y5f8AvV5TRcGBXqx3O1F/5y27RPtvCRXeZTeiP5TkglCz3p2mbA3e/D+QbXskikbGYSmrhPduH7OEdoxUEF6I3HuDNz8j4GmPk6QFUQhmK075hue1xH/hmvfaabFZRGb5Wpy91TNvJfKCXajdTeJEEIogoqXzvS4JaYkZ4Uiceya0uSiULwh147iLPo8GIDo24tztFwXX//0dVM+0CjHyNY7Lb9ivx9yZypdnAmqpcVOpIYYvE1F4/WNMmVyRM24TrVuhXyJfnhnm/KE1ZBEFfFQW4VrXEHNOE5krCS6Qk57N5DDKiCkZtD0Y5cqqInMhwQ3ReECikmIrxhQrrvgGufOzLcENoHayuXYHJULDKHcUo77jE3eN2ZTgfrl2pi8dttEyRUZdF/uf50yDfcL/XReD1oRfxpVUxz8/zhUAAAAASUVORK5CYII=\"}]}"]}}

View file

@ -0,0 +1,3 @@
local modpath = minetest.get_modpath("worldeditadditions_farwand")
dofile(modpath.."/lib/farwand.lua")

View file

@ -0,0 +1,20 @@
minetest.register_tool(":worldeditadditions:farwand", {
description = "WorldEditAdditions far-reaching wand",
inventory_image = "worldeditadditions_farwand.png",
on_place = function(itemstack, player, pointed_thing)
print("[farwand] on_place", player:get_player_name())
-- Right click when pointing at something
end,
on_use = function(itemstack, player, pointed_thing)
print("[farwand] on_use", player:get_player_name())
-- Left click when pointing at something or nothing
end,
on_secondary_use = function(itemstack, player, pointed_thing)
-- Right click when pointing at nothing
print("[farwand] on_secondary_use", player:get_player_name())
end
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B