2017-07-07 16:52:28 +02:00
-- Liquids: Water and lava
2021-05-29 16:12:33 +02:00
local S = minetest.get_translator ( minetest.get_current_modname ( ) )
2019-03-07 23:40:43 +01:00
2021-05-23 00:09:07 +02:00
local vector = vector
local math = math
--local WATER_ALPHA = 179
2017-07-07 16:52:28 +02:00
local WATER_VISC = 1
local LAVA_VISC = 7
2020-08-19 20:17:04 +02:00
local LIGHT_LAVA = minetest.LIGHT_MAX
2021-04-02 14:12:44 +02:00
local USE_TEXTURE_ALPHA = true
2021-02-18 10:58:50 +01:00
if minetest.features . use_texture_alpha_string_modes then
USE_TEXTURE_ALPHA = " blend "
end
2017-07-07 16:52:28 +02:00
minetest.register_node ( " mcl_core:water_flowing " , {
2019-03-07 23:40:43 +01:00
description = S ( " Flowing Water " ) ,
2017-07-07 16:52:28 +02:00
_doc_items_create_entry = false ,
2023-11-03 00:47:26 +01:00
wield_image = " mcl_core_water_flow_animation.png^[verticalframe:64:0 " ,
2017-07-07 16:52:28 +02:00
drawtype = " flowingliquid " ,
2023-11-03 00:47:26 +01:00
tiles = { " mcl_core_water_flow_animation.png^[verticalframe:64:0 " } ,
2017-07-07 16:52:28 +02:00
special_tiles = {
{
2023-11-03 00:47:26 +01:00
image = " mcl_core_water_flow_animation.png " ,
2017-07-07 16:52:28 +02:00
backface_culling = false ,
2023-02-18 09:21:24 +01:00
animation = { type = " vertical_frames " , aspect_w = 16 , aspect_h = 16 , length = 1.5 }
2017-07-07 16:52:28 +02:00
} ,
{
2023-11-03 00:47:26 +01:00
image = " mcl_core_water_flow_animation.png " ,
2020-01-19 22:56:37 +01:00
backface_culling = false ,
2023-02-18 09:21:24 +01:00
animation = { type = " vertical_frames " , aspect_w = 16 , aspect_h = 16 , length = 1.5 }
2017-07-07 16:52:28 +02:00
} ,
} ,
2023-02-18 09:21:24 +01:00
color = " #3F76E4 " ,
2018-01-12 02:26:12 +01:00
sounds = mcl_sounds.node_sound_water_defaults ( ) ,
2020-06-07 21:32:55 +02:00
is_ground_content = false ,
2021-02-18 10:58:50 +01:00
use_texture_alpha = USE_TEXTURE_ALPHA ,
2017-07-07 16:52:28 +02:00
paramtype = " light " ,
paramtype2 = " flowingliquid " ,
walkable = false ,
pointable = false ,
diggable = false ,
buildable_to = true ,
drop = " " ,
drowning = 4 ,
liquidtype = " flowing " ,
liquid_alternative_flowing = " mcl_core:water_flowing " ,
liquid_alternative_source = " mcl_core:water_source " ,
liquid_viscosity = WATER_VISC ,
liquid_range = 7 ,
2022-08-12 15:11:17 +02:00
waving = 3 ,
2023-02-18 09:21:24 +01:00
post_effect_color = { a = 60 , r = 24.7 , g = 46.3 , b = 89.4 } ,
2017-07-07 16:52:28 +02:00
groups = { water = 3 , liquid = 3 , puts_out_fire = 1 , not_in_creative_inventory = 1 , freezes = 1 , melt_around = 1 , dig_by_piston = 1 } ,
2020-04-15 13:27:29 +02:00
_mcl_blast_resistance = 100 ,
2017-07-07 16:52:28 +02:00
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
_mcl_hardness = - 1 ,
} )
minetest.register_node ( " mcl_core:water_source " , {
2019-03-07 23:40:43 +01:00
description = S ( " Water Source " ) ,
_doc_items_entry_name = S ( " Water " ) ,
2017-07-07 16:52:28 +02:00
_doc_items_longdesc =
2019-03-24 08:03:50 +01:00
S ( " Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time. " ) .. " \n \n " ..
S ( " Water interacts with lava in various ways: " ) .. " \n " ..
S ( " • When water is directly above or horizontally next to a lava source, the lava turns into obsidian. " ) .. " \n " ..
S ( " • When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone. " ) .. " \n " ..
S ( " • When water is directly below lava, the water turns into stone. " ) ,
2017-07-07 16:52:28 +02:00
_doc_items_hidden = false ,
drawtype = " liquid " ,
2022-08-12 15:11:17 +02:00
waving = 3 ,
2017-07-07 16:52:28 +02:00
tiles = {
2023-11-03 00:47:26 +01:00
{ name = " mcl_core_water_source_animation.png " , animation = { type = " vertical_frames " , aspect_w = 16 , aspect_h = 16 , length = 3.0 } }
2017-07-07 16:52:28 +02:00
} ,
special_tiles = {
-- New-style water source material (mostly unused)
{
2023-11-03 00:47:26 +01:00
name = " mcl_core_water_source_animation.png " ,
2023-02-18 09:21:24 +01:00
animation = { type = " vertical_frames " , aspect_w = 16 , aspect_h = 16 , length = 3.0 } ,
2017-07-07 16:52:28 +02:00
backface_culling = false ,
}
} ,
2023-02-18 09:21:24 +01:00
color = " #3F76E4 " ,
2018-01-12 02:26:12 +01:00
sounds = mcl_sounds.node_sound_water_defaults ( ) ,
2020-06-07 21:32:55 +02:00
is_ground_content = false ,
2021-02-18 10:58:50 +01:00
use_texture_alpha = USE_TEXTURE_ALPHA ,
2017-07-07 16:52:28 +02:00
paramtype = " light " ,
2023-02-18 09:21:24 +01:00
paramtype2 = " color " ,
palette = " mcl_core_palette_water.png " ,
2017-07-07 16:52:28 +02:00
walkable = false ,
pointable = false ,
diggable = false ,
buildable_to = true ,
drop = " " ,
drowning = 4 ,
liquidtype = " source " ,
liquid_alternative_flowing = " mcl_core:water_flowing " ,
liquid_alternative_source = " mcl_core:water_source " ,
liquid_viscosity = WATER_VISC ,
liquid_range = 7 ,
2023-02-18 09:21:24 +01:00
post_effect_color = { a = 60 , r = 24.7 , g = 46.3 , b = 89.4 } ,
2017-07-07 16:52:28 +02:00
stack_max = 64 ,
2023-02-18 09:21:24 +01:00
groups = { water = 3 , liquid = 3 , puts_out_fire = 1 , freezes = 1 , not_in_creative_inventory = 1 , dig_by_piston = 1 , water_palette = 1 } ,
2020-04-15 13:27:29 +02:00
_mcl_blast_resistance = 100 ,
2017-07-07 16:52:28 +02:00
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
_mcl_hardness = - 1 ,
2023-02-18 09:21:24 +01:00
on_construct = function ( pos )
local node = minetest.get_node ( pos )
if node.param2 == 0 then
local new_node = mcl_core.get_water_block_type ( pos )
if new_node.param2 ~= 0 then
minetest.swap_node ( pos , new_node )
end
end
end ,
2017-07-07 16:52:28 +02:00
} )
minetest.register_node ( " mcl_core:lava_flowing " , {
2019-03-07 23:40:43 +01:00
description = S ( " Flowing Lava " ) ,
2017-07-07 16:52:28 +02:00
_doc_items_create_entry = false ,
2023-11-03 00:47:26 +01:00
wield_image = " mcl_core_lava_flow_animation.png^[verticalframe:64:0 " ,
2017-07-07 16:52:28 +02:00
drawtype = " flowingliquid " ,
2023-11-03 00:47:26 +01:00
tiles = { " mcl_core_lava_flow_animation.png^[verticalframe:64:0 " } ,
2017-07-07 16:52:28 +02:00
special_tiles = {
{
2023-11-03 00:47:26 +01:00
image = " mcl_core_lava_flow_animation.png " ,
2017-07-07 16:52:28 +02:00
backface_culling = false ,
2017-07-17 12:20:15 +02:00
animation = { type = " vertical_frames " , aspect_w = 16 , aspect_h = 16 , length = 6.6 }
2017-07-07 16:52:28 +02:00
} ,
{
2023-11-03 00:47:26 +01:00
image = " mcl_core_lava_flow_animation.png " ,
2020-01-19 22:56:37 +01:00
backface_culling = false ,
2017-07-17 12:20:15 +02:00
animation = { type = " vertical_frames " , aspect_w = 16 , aspect_h = 16 , length = 6.6 }
2017-07-07 16:52:28 +02:00
} ,
} ,
2019-02-01 06:23:12 +01:00
paramtype = " light " ,
2017-07-07 16:52:28 +02:00
paramtype2 = " flowingliquid " ,
2020-08-19 20:17:04 +02:00
light_source = LIGHT_LAVA ,
2020-06-07 21:32:55 +02:00
is_ground_content = false ,
2018-01-12 02:26:12 +01:00
sounds = mcl_sounds.node_sound_lava_defaults ( ) ,
2017-07-07 16:52:28 +02:00
walkable = false ,
pointable = false ,
diggable = false ,
buildable_to = true ,
drop = " " ,
--[[ Drowning in Minecraft deals 2 damage per second.
2024-11-28 20:55:48 +01:00
In Luanti , drowning damage is dealt every 2 seconds so this
2017-07-07 16:52:28 +02:00
translates to 4 drowning damage ] ]
drowning = 4 ,
liquidtype = " flowing " ,
liquid_alternative_flowing = " mcl_core:lava_flowing " ,
liquid_alternative_source = " mcl_core:lava_source " ,
liquid_viscosity = LAVA_VISC ,
liquid_renewable = false ,
liquid_range = 3 ,
damage_per_second = 4 * 2 ,
2020-07-01 00:56:27 +02:00
post_effect_color = { a = 245 , r = 208 , g = 73 , b = 10 } ,
2021-01-01 19:25:47 +01:00
groups = { lava = 3 , liquid = 2 , destroys_items = 1 , not_in_creative_inventory = 1 , dig_by_piston = 1 , set_on_fire = 15 } ,
2020-04-15 13:27:29 +02:00
_mcl_blast_resistance = 100 ,
2017-07-07 16:52:28 +02:00
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
_mcl_hardness = - 1 ,
} )
2019-04-09 15:25:27 +02:00
local fire_text
local fire_enabled = minetest.settings : get_bool ( " enable_fire " , true )
if fire_enabled then
fire_text = S ( " A lava source sets fire to a couple of air blocks above when they're next to a flammable block. " )
else
fire_text = " "
end
2017-07-07 16:52:28 +02:00
minetest.register_node ( " mcl_core:lava_source " , {
2019-03-07 23:40:43 +01:00
description = S ( " Lava Source " ) ,
2017-07-07 16:52:28 +02:00
_doc_items_entry_name = " Lava " ,
_doc_items_longdesc =
2019-03-07 23:40:43 +01:00
S ( " Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out. " ) .. " \n " ..
2019-04-09 15:25:27 +02:00
fire_text .. " \n \n " ..
2019-03-24 08:03:50 +01:00
S ( " Lava interacts with water various ways: " ) .. " \n " ..
S ( " • When a lava source is directly below or horizontally next to water, the lava turns into obsidian. " ) .. " \n " ..
S ( " • When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone. " ) .. " \n " ..
S ( " • When lava is directly above water, the water turns into stone. " ) ,
2017-07-07 16:52:28 +02:00
drawtype = " liquid " ,
tiles = {
2023-11-03 00:47:26 +01:00
{ name = " mcl_core_lava_source_animation.png " , animation = { type = " vertical_frames " , aspect_w = 16 , aspect_h = 16 , length = 3.0 } }
2017-07-07 16:52:28 +02:00
} ,
special_tiles = {
-- New-style lava source material (mostly unused)
{
2023-11-03 00:47:26 +01:00
name = " mcl_core_lava_source_animation.png " ,
2017-07-17 12:20:15 +02:00
animation = { type = " vertical_frames " , aspect_w = 16 , aspect_h = 16 , length = 3.0 } ,
2017-07-07 16:52:28 +02:00
backface_culling = false ,
}
} ,
2019-02-01 06:23:12 +01:00
paramtype = " light " ,
2020-08-19 20:17:04 +02:00
light_source = LIGHT_LAVA ,
2020-06-07 21:32:55 +02:00
is_ground_content = false ,
2018-01-12 02:26:12 +01:00
sounds = mcl_sounds.node_sound_lava_defaults ( ) ,
2017-07-07 16:52:28 +02:00
walkable = false ,
pointable = false ,
diggable = false ,
buildable_to = true ,
drop = " " ,
drowning = 4 ,
liquidtype = " source " ,
liquid_alternative_flowing = " mcl_core:lava_flowing " ,
liquid_alternative_source = " mcl_core:lava_source " ,
liquid_viscosity = LAVA_VISC ,
liquid_renewable = false ,
liquid_range = 3 ,
damage_per_second = 4 * 2 ,
2020-07-01 00:56:27 +02:00
post_effect_color = { a = 245 , r = 208 , g = 73 , b = 10 } ,
2017-07-07 16:52:28 +02:00
stack_max = 64 ,
2021-04-14 15:46:52 +02:00
groups = { lava = 3 , lava_source = 1 , liquid = 2 , destroys_items = 1 , not_in_creative_inventory = 1 , dig_by_piston = 1 , set_on_fire = 15 , fire_damage = 1 } ,
2020-04-15 13:27:29 +02:00
_mcl_blast_resistance = 100 ,
2017-07-07 16:52:28 +02:00
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
_mcl_hardness = - 1 ,
} )
2020-08-19 20:17:04 +02:00
2021-05-26 19:57:43 +02:00
local function emit_lava_particle ( pos )
2020-08-19 20:17:04 +02:00
local node = minetest.get_node ( pos )
if minetest.get_item_group ( node.name , " lava_source " ) == 0 then
return
end
local ppos = vector.add ( pos , { x = math.random ( - 7 , 7 ) / 16 , y = 0.45 , z = math.random ( - 7 , 7 ) / 16 } )
2021-05-23 00:09:07 +02:00
--local spos = vector.add(ppos, { x = 0, y = -0.2, z = 0 })
2020-08-19 20:17:04 +02:00
local vel = { x = math.random ( - 3 , 3 ) / 10 , y = math.random ( 4 , 7 ) , z = math.random ( - 3 , 3 ) / 10 }
local acc = { x = 0 , y = - 9.81 , z = 0 }
-- Lava droplet
minetest.add_particle ( {
pos = ppos ,
velocity = vel ,
acceleration = acc ,
expirationtime = 2.5 ,
collisiondetection = true ,
collision_removal = true ,
size = math.random ( 20 , 30 ) / 10 ,
texture = " mcl_particles_lava.png " ,
glow = LIGHT_LAVA ,
} )
end
2020-08-19 20:39:05 +02:00
if minetest.settings : get ( " mcl_node_particles " ) == " full " then
2020-08-19 20:17:04 +02:00
minetest.register_abm ( {
label = " Lava particles " ,
nodenames = { " group:lava_source " } ,
interval = 8.0 ,
chance = 20 ,
action = function ( pos , node )
local apos = { x = pos.x , y = pos.y + 1 , z = pos.z }
local anode = minetest.get_node ( apos )
-- Only emit partiles when directly below lava
if anode.name ~= " air " then
return
end
minetest.after ( math.random ( 0 , 800 ) * 0.01 , emit_lava_particle , pos )
end ,
} )
end
2023-02-18 09:21:24 +01:00
minetest.register_on_liquid_transformed ( function ( pos_list , node_list )
for _ , fwpos in pairs ( pos_list ) do
local fwnode = minetest.get_node ( fwpos )
if minetest.get_item_group ( fwnode , " palette_index " ) ~= 1 then
local pos1 , pos2 = vector.offset ( fwpos , - 1 , - 1 , - 1 ) , vector.offset ( fwpos , 1 , 1 , 1 )
local water = minetest.find_nodes_in_area ( pos1 , pos2 , { " group:water_palette " } )
for _ , wpos in pairs ( water ) do
local wnode = minetest.get_node ( wpos )
local water_palette_index = mcl_util.get_palette_indexes_from_pos ( wpos ) . water_palette_index
if wnode.param2 ~= water_palette_index then
wnode.param2 = water_palette_index
minetest.set_node ( wpos , wnode )
end
end
end
end
end
)