mt-landscape-shaping/wands.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,
})