364 lines
12 KiB
Lua
364 lines
12 KiB
Lua
|
|
|
|
landscape_shaping.player_copied_node_name = {}
|
|
landscape_shaping.player_reshape_radius = {}
|
|
|
|
|
|
|
|
local function transmute_wand_interact(player, pointed_thing, mode)
|
|
if pointed_thing.type ~= "node" then return end
|
|
|
|
-- A true player is required
|
|
local player_name = player and player:get_player_name()
|
|
if not player_name then return end
|
|
|
|
local pos = pointed_thing.under
|
|
local is_sneak = player and player:get_player_control().sneak or false
|
|
|
|
-- Check for node protection
|
|
if minetest.is_protected(pos, player_name) then
|
|
minetest.chat_send_player(player_name, "You're not authorized to alter nodes in this area")
|
|
minetest.record_protection_violation(pos, player_name)
|
|
return
|
|
end
|
|
|
|
-- Retrieve group info and styles
|
|
local node = minetest.get_node(pos)
|
|
local node_name = node.name
|
|
local style , group_name , group , new_style , new_node_name
|
|
|
|
if mode == "copy" then
|
|
-- Copy node
|
|
landscape_shaping.player_copied_node_name[ player_name ] = node_name
|
|
minetest.chat_send_player(player_name, "Transmute wand: node " .. node_name .. " copied")
|
|
return
|
|
elseif mode == "transmute" then
|
|
-- Paste node
|
|
--if not minetest.get_player_privs(player_name).creative then
|
|
-- minetest.chat_send_player(player_name, "The transmute wand require the 'creative' privilege")
|
|
-- return
|
|
--end
|
|
|
|
new_node_name = landscape_shaping.player_copied_node_name[ player_name ]
|
|
|
|
if not new_node_name then
|
|
minetest.chat_send_player(player_name, "No transmute node copied yet, left-click to copy a node")
|
|
return
|
|
end
|
|
|
|
-- Already the correct node, exit now!
|
|
if new_node_name == node_name then return end
|
|
end
|
|
|
|
|
|
-- Check if rotation could be preserved
|
|
local nodedef = minetest.registered_nodes[node_name]
|
|
local new_nodedef = minetest.registered_nodes[new_node_name]
|
|
local rotation , new_rotation
|
|
|
|
if nodedef and new_nodedef then
|
|
if ( nodedef.paramtype2 == "facedir" or nodedef.paramtype2 == "colorfacedir" )
|
|
and ( new_nodedef.paramtype2 == "facedir" or new_nodedef.paramtype2 == "colorfacedir" )
|
|
then
|
|
rotation = node.param2 % 32 --rotation are on the last 5 digits
|
|
end
|
|
end
|
|
|
|
-- Set the new node
|
|
minetest.set_node(pos, {name= new_node_name})
|
|
local new_node = minetest.get_node(pos)
|
|
|
|
-- Copy rotation if needed!
|
|
if rotation ~= nil then
|
|
new_rotation = new_node.param2 % 32
|
|
|
|
if new_rotation ~= rotation then
|
|
new_node.param2 = new_node.param2 - new_rotation + rotation
|
|
minetest.swap_node(pos, new_node)
|
|
end
|
|
end
|
|
|
|
--minetest.sound_play("jonez_carve", {pos = pos, gain = 0.7, max_hear_distance = 5})
|
|
end
|
|
|
|
|
|
|
|
local function reshape_interact(player, pointed_thing, mode, is_right)
|
|
-- A true player is required
|
|
local player_name = player and player:get_player_name()
|
|
if not player_name then return end
|
|
|
|
local is_sneak = player:get_player_control().sneak or false
|
|
local radius = landscape_shaping.player_reshape_radius[ player_name ] or 3
|
|
|
|
if is_sneak then
|
|
if is_right then
|
|
radius = radius + 1 + math.floor( radius / 6 )
|
|
elseif radius > 1 then
|
|
radius = radius - 1 - math.floor( radius / 8 )
|
|
end
|
|
|
|
minetest.chat_send_player(player_name, "New radius for reshaping wands: " .. radius )
|
|
landscape_shaping.player_reshape_radius[ player_name ] = radius
|
|
return
|
|
end
|
|
|
|
if pointed_thing.type ~= "node" then return end
|
|
local pos = pointed_thing.under
|
|
local node = minetest.get_node(pos)
|
|
local node_name = node.name
|
|
|
|
if mode == "blow-sphere" then
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.sphere,
|
|
use_blast = true
|
|
})
|
|
elseif mode == "blow-hemisphere" then
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.hemisphere,
|
|
use_blast = true
|
|
})
|
|
elseif mode == "fill-down-hemisphere" then
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.down_hemisphere_or_equal,
|
|
content_filter = landscape_shaping.content_filter.any,
|
|
replacement_node = node_name
|
|
})
|
|
elseif mode == "fill-down-hemisphere-with-copy" then
|
|
node_name = landscape_shaping.player_copied_node_name[ player_name ]
|
|
|
|
if not node_name then
|
|
minetest.chat_send_player(player_name, "No node copied yet")
|
|
return
|
|
end
|
|
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.down_hemisphere_or_equal,
|
|
content_filter = landscape_shaping.content_filter.any,
|
|
replacement_node = node_name
|
|
})
|
|
elseif mode == "flat-square" then
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.flat_square,
|
|
content_filter = landscape_shaping.content_filter.any,
|
|
replacement_node = node_name
|
|
})
|
|
elseif mode == "flat-square-with-copy" then
|
|
node_name = landscape_shaping.player_copied_node_name[ player_name ]
|
|
|
|
if not node_name then
|
|
minetest.chat_send_player(player_name, "No node copied yet")
|
|
return
|
|
end
|
|
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.flat_square,
|
|
content_filter = landscape_shaping.content_filter.any,
|
|
replacement_node = node_name
|
|
})
|
|
elseif mode == "fall-sphere" then
|
|
landscape_shaping.fall(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.sphere,
|
|
content_filter = landscape_shaping.content_filter.non_air,
|
|
fall_radius = 32 + 2 * radius
|
|
})
|
|
elseif mode == "cover-sphere" then
|
|
landscape_shaping.cover(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.sphere,
|
|
--content_filter = landscape_shaping.content_filter.non_solid_block,
|
|
--replacement_node = node_name,
|
|
})
|
|
elseif mode == "cover-sphere-copy" then
|
|
node_name = landscape_shaping.player_copied_node_name[ player_name ]
|
|
|
|
if not node_name then
|
|
minetest.chat_send_player(player_name, "No node copied yet")
|
|
return
|
|
end
|
|
|
|
landscape_shaping.cover(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.sphere,
|
|
--content_filter = landscape_shaping.content_filter.non_solid_block,
|
|
replacement_node = node_name,
|
|
})
|
|
elseif mode == "smooth-sphere" then
|
|
landscape_shaping.heightmap(player, pos, radius, {
|
|
--replacement_node = node_name,
|
|
})
|
|
elseif mode == "smoother-sphere" then
|
|
landscape_shaping.heightmap(player, pos, radius, {
|
|
heightmap_filter = landscape_shaping.heightmap_filter.avg_20 ,
|
|
pass = 2 + math.floor( radius / 5 )
|
|
})
|
|
elseif mode == "water-hemisphere" then
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.hemisphere,
|
|
content_filter = landscape_shaping.content_filter.air,
|
|
replacement_node = "default:water_source"
|
|
})
|
|
elseif mode == "evaporate-water-sphere" then
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.sphere,
|
|
content_filter = landscape_shaping.content_filter.water
|
|
})
|
|
elseif mode == "lava-hemisphere" then
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.sphere,
|
|
content_filter = landscape_shaping.content_filter.air,
|
|
replacement_node = "default:lava_source"
|
|
})
|
|
elseif mode == "evaporate-lava-sphere" then
|
|
landscape_shaping.blow(player, pos, radius, {
|
|
area_filter = landscape_shaping.area_filter.sphere,
|
|
content_filter = landscape_shaping.content_filter.lava
|
|
})
|
|
end
|
|
|
|
minetest.chat_send_player(player_name, "Reshaped!")
|
|
end
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:transmute_wand", {
|
|
description = "Copy wand",
|
|
inventory_image = "landscape_shaping_transmute_wand.png",
|
|
wield_image = "landscape_shaping_transmute_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
transmute_wand_interact(player, pointed_thing,"copy")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
transmute_wand_interact(player, pointed_thing,"transmute",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:blow_wand", {
|
|
description = "Blow wand",
|
|
inventory_image = "landscape_shaping_blow_wand.png",
|
|
wield_image = "landscape_shaping_blow_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"blow-sphere")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"blow-hemisphere",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:flat_hemisphere_wand", {
|
|
description = "Flat hemisphere wand",
|
|
inventory_image = "landscape_shaping_flat_hemisphere_wand.png",
|
|
wield_image = "landscape_shaping_flat_hemisphere_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"fill-down-hemisphere")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"fill-down-hemisphere-with-copy",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:flat_square_wand", {
|
|
description = "Flat square wand",
|
|
inventory_image = "landscape_shaping_flat_square_wand.png",
|
|
wield_image = "landscape_shaping_flat_square_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"flat-square")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"flat-square-with-copy",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:water_wand", {
|
|
description = "Water wand",
|
|
inventory_image = "landscape_shaping_water_wand.png",
|
|
wield_image = "landscape_shaping_water_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"evaporate-water-sphere")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"water-hemisphere",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:lava_wand", {
|
|
description = "Lava wand",
|
|
inventory_image = "landscape_shaping_lava_wand.png",
|
|
wield_image = "landscape_shaping_lava_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"evaporate-lava-sphere")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"lava-hemisphere",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:fall_wand", {
|
|
description = "Fall wand",
|
|
inventory_image = "landscape_shaping_fall_wand.png",
|
|
wield_image = "landscape_shaping_fall_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"fall-sphere")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"fall-sphere",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:cover_wand", {
|
|
description = "Cover wand",
|
|
inventory_image = "landscape_shaping_cover_wand.png",
|
|
wield_image = "landscape_shaping_cover_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"cover-sphere")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"cover-sphere-copy",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craftitem("landscape_shaping:smooth_wand", {
|
|
description = "Smooth wand",
|
|
inventory_image = "landscape_shaping_smooth_wand.png",
|
|
wield_image = "landscape_shaping_smooth_wand.png",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"smooth-sphere")
|
|
return itemstack
|
|
end,
|
|
on_place = function(itemstack, player, pointed_thing)
|
|
reshape_interact(player, pointed_thing,"smoother-sphere",true)
|
|
return itemstack
|
|
end,
|
|
})
|
|
|