forked from MineClone5/MineClone5
Merge pull request 'Release MineClone 5 0.71.10' (#52) from testing into production
Reviewed-on: MineClone5/MineClone5#52
This commit is contained in:
commit
8c8f156630
|
@ -1,3 +1,9 @@
|
||||||
# mcl_bubble_column
|
# mcl_bubble_column by j45
|
||||||
bubble_column mod for mineclone2
|
|
||||||
put in /mtdir/games/mineclone2/mods/CORE/
|
https://github.com/Minetest-j45/mcl_bubble_column/
|
||||||
|
|
||||||
|
Adds whirlpools and upwards bubble columns to Mineclone2/5
|
||||||
|
|
||||||
|
A bubble column is a block generated by placing magma blocks or soul sand in water (source).
|
||||||
|
|
||||||
|
Bubble columns push or pull entities and items in certain directions.
|
||||||
|
|
|
@ -1,369 +1,195 @@
|
||||||
local S = minetest.get_translator("mcl_bubble_column")
|
mcl_bubble_column = {}
|
||||||
|
|
||||||
local WATER_ALPHA = 179
|
|
||||||
local WATER_VISC = 1
|
|
||||||
local LAVA_VISC = 7
|
|
||||||
local LIGHT_LAVA = minetest.LIGHT_MAX
|
|
||||||
local USE_TEXTURE_ALPHA
|
|
||||||
if minetest.features.use_texture_alpha_string_modes then
|
|
||||||
USE_TEXTURE_ALPHA = "blend"
|
|
||||||
WATER_ALPHA = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_node("mcl_bubble_column:water_flowing_up", {
|
|
||||||
description = S("Bubble Column Flowing Water (up)"),
|
|
||||||
_doc_items_create_entry = false,
|
|
||||||
wield_image = "default_water_flowing_animated.png^[verticalframe:64:0",
|
|
||||||
drawtype = "flowingliquid",
|
|
||||||
tiles = {"default_water_flowing_animated.png^[verticalframe:64:0"},
|
|
||||||
special_tiles = {
|
|
||||||
{
|
|
||||||
image="default_water_flowing_animated.png",
|
|
||||||
backface_culling=false,
|
|
||||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
image="default_water_flowing_animated.png",
|
|
||||||
backface_culling=false,
|
|
||||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
sounds = mcl_sounds.node_sound_water_defaults(),
|
|
||||||
is_ground_content = false,
|
|
||||||
alpha = WATER_ALPHA,
|
|
||||||
use_texture_alpha = USE_TEXTURE_ALPHA,
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "flowingliquid",
|
|
||||||
walkable = false,
|
|
||||||
pointable = false,
|
|
||||||
diggable = false,
|
|
||||||
buildable_to = true,
|
|
||||||
drop = "",
|
|
||||||
drowning = 4,
|
|
||||||
liquidtype = "flowing",
|
|
||||||
liquid_alternative_flowing = "mcl_bubble_column:water_flowing_up",
|
|
||||||
liquid_alternative_source = "mcl_bubble_column:water_source_up",
|
|
||||||
liquid_viscosity = WATER_VISC,
|
|
||||||
liquid_range = 7,
|
|
||||||
post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C},
|
|
||||||
groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, freezes=1, melt_around=1, dig_by_piston=1},
|
|
||||||
_mcl_blast_resistance = 100,
|
|
||||||
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
|
|
||||||
_mcl_hardness = -1,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("mcl_bubble_column:water_source_up", {
|
|
||||||
description = S("Bubble Column Water Source"),
|
|
||||||
_doc_items_entry_name = S("Water"),
|
|
||||||
_doc_items_longdesc = S("Boosts you up"),
|
|
||||||
_doc_items_hidden = false,
|
|
||||||
drawtype = "liquid",
|
|
||||||
tiles = {
|
|
||||||
{name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}}
|
|
||||||
},
|
|
||||||
special_tiles = {
|
|
||||||
-- New-style water source material (mostly unused)
|
|
||||||
{
|
|
||||||
name="default_water_source_animated.png",
|
|
||||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0},
|
|
||||||
backface_culling = false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sounds = mcl_sounds.node_sound_water_defaults(),
|
|
||||||
is_ground_content = false,
|
|
||||||
alpha = WATER_ALPHA,
|
|
||||||
use_texture_alpha = USE_TEXTURE_ALPHA,
|
|
||||||
paramtype = "light",
|
|
||||||
walkable = false,
|
|
||||||
pointable = false,
|
|
||||||
diggable = false,
|
|
||||||
buildable_to = true,
|
|
||||||
drop = "",
|
|
||||||
drowning = 4,
|
|
||||||
liquidtype = "source",
|
|
||||||
liquid_alternative_flowing = "mcl_bubble_column:water_flowing_up",
|
|
||||||
liquid_alternative_source = "mcl_bubble_column:water_source_up",
|
|
||||||
liquid_viscosity = WATER_VISC,
|
|
||||||
liquid_range = 7,
|
|
||||||
post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C},
|
|
||||||
stack_max = 64,
|
|
||||||
groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, dig_by_piston=1},
|
|
||||||
_mcl_blast_resistance = 100,
|
|
||||||
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
|
|
||||||
_mcl_hardness = -1,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_globalstep(function()
|
|
||||||
for _,player in ipairs(minetest.get_connected_players()) do
|
|
||||||
local name = player:get_player_name()
|
|
||||||
local pos = player:get_pos()
|
|
||||||
local node = minetest.get_node(pos)
|
|
||||||
if node.name == "mcl_bubble_column:water_source_up" then
|
|
||||||
local velocity = player:get_player_velocity()
|
|
||||||
local velocityadd = {x = 0, y = 3, z = 0}
|
|
||||||
player:add_player_velocity(velocityadd)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
minetest.register_abm{
|
minetest.register_abm{
|
||||||
label = "entities go up",
|
label = "bubbleColumnUpStop",
|
||||||
nodenames = {"mcl_bubble_column:water_source_up"},
|
nodenames = {"group:water"},
|
||||||
interval = 0.05,
|
interval = 0.05,
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos)
|
action = function(pos)
|
||||||
for _,entity in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do
|
local meta = minetest.get_meta(pos)
|
||||||
local pos = entity:get_pos()
|
if meta:get_int("bubbly") == 1 then--bubble column
|
||||||
local velocity = entity:get_velocity()
|
--check down if current needs to be deleted
|
||||||
local velocityadd = {x = 0, y = 2, z = 0}
|
local downpos = vector.add(pos, {x = 0, y = -1, z = 0})
|
||||||
entity:add_velocity(velocityadd)
|
local downposnode = minetest.get_node(downpos)
|
||||||
|
local downmeta = minetest.get_meta(downpos)
|
||||||
|
if (downmeta:get_int("bubbly") ~= 1 and downposnode.name ~= "mcl_nether:soul_sand") then
|
||||||
|
meta:set_int("bubbly", 0)
|
||||||
end
|
end
|
||||||
end,
|
--check up to see if needs to go up
|
||||||
}
|
|
||||||
|
|
||||||
minetest.register_abm{
|
|
||||||
label = "bubbles go up",
|
|
||||||
nodenames = {"mcl_bubble_column:water_source_up"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = function(pos)
|
|
||||||
local uppos = vector.add(pos, {x = 0, y = 1, z = 0})
|
local uppos = vector.add(pos, {x = 0, y = 1, z = 0})
|
||||||
local upposnode = minetest.get_node(uppos)
|
local upposnode = minetest.get_node(uppos)
|
||||||
if upposnode.name == "mcl_core:water_source" then
|
local upmeta = minetest.get_meta(uppos)
|
||||||
minetest.set_node(uppos, {name = "mcl_bubble_column:water_source_up"})
|
if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("bubbly") ~= 1) then
|
||||||
|
upmeta:set_int("bubbly", 1)
|
||||||
|
end
|
||||||
|
elseif meta:get_int("whirly") == 1 then--whirlpool
|
||||||
|
--check down if current needs to be deleted
|
||||||
|
local downpos = vector.add(pos, {x = 0, y = -1, z = 0})
|
||||||
|
local downposnode = minetest.get_node(downpos)
|
||||||
|
local downmeta = minetest.get_meta(downpos)
|
||||||
|
if (downmeta:get_int("whirly") ~= 1 and downposnode.name ~= "mcl_nether:magma") then
|
||||||
|
meta:set_int("whirly", 0)
|
||||||
|
end
|
||||||
|
--check up to see if needs to go up
|
||||||
|
local uppos = vector.add(pos, {x = 0, y = 1, z = 0})
|
||||||
|
local upposnode = minetest.get_node(uppos)
|
||||||
|
local upmeta = minetest.get_meta(uppos)
|
||||||
|
if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("whirly") ~= 1) then
|
||||||
|
upmeta:set_int("whirly", 1)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
minetest.register_abm{
|
minetest.register_abm{
|
||||||
label = "start bubble column",
|
label = "startBubbleColumn",
|
||||||
nodenames = {"mcl_nether:soul_sand"},
|
nodenames = {"mcl_nether:soul_sand"},
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = function(pos)
|
|
||||||
local downpos = vector.add(pos, {x = 0, y = 1, z = 0})
|
|
||||||
local downposnode = minetest.get_node(downpos)
|
|
||||||
if downposnode.name == "mcl_core:water_source" then
|
|
||||||
minetest.set_node(downpos, {name = "mcl_bubble_column:water_source_up"})
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
}
|
|
||||||
|
|
||||||
minetest.register_abm{
|
|
||||||
label = "stop bubble column",
|
|
||||||
nodenames = {"mcl_bubble_column:water_source_up"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = function(pos)
|
|
||||||
local downpos = vector.add(pos, {x = 0, y = -1, z = 0})
|
|
||||||
local downposnode = minetest.get_node(downpos)
|
|
||||||
if downposnode.name == "mcl_core:water_source" then
|
|
||||||
minetest.set_node(pos, {name = "mcl_core:water_source"})
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
}
|
|
||||||
minetest.register_abm{
|
|
||||||
label = "bubbles up",
|
|
||||||
nodenames = {"mcl_bubble_column:water_source_up"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = function(pos)
|
|
||||||
minetest.add_particlespawner({
|
|
||||||
amount = 10,
|
|
||||||
time = 0.15,
|
|
||||||
minpos = vector.add(pos, { x = -0.25, y = 0, z = -0.25 }),
|
|
||||||
maxpos = vector.add(pos, { x = 0.25, y = 0, z = 0.75 }),
|
|
||||||
attached = player,
|
|
||||||
minvel = {x = -0.2, y = 0, z = -0.2},
|
|
||||||
maxvel = {x = 0.5, y = 0, z = 0.5},
|
|
||||||
minacc = {x = -0.4, y = 4, z = -0.4},
|
|
||||||
maxacc = {x = 0.5, y = 1, z = 0.5},
|
|
||||||
minexptime = 0.3,
|
|
||||||
maxexptime = 0.8,
|
|
||||||
minsize = 0.7,
|
|
||||||
maxsize = 2.4,
|
|
||||||
texture = "mcl_particles_bubble.png"
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
}
|
|
||||||
--whirlpools(take you down)
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_node("mcl_bubble_column:water_flowing_down", {
|
|
||||||
description = S("Bubble Column Flowing Water(down)"),
|
|
||||||
_doc_items_create_entry = false,
|
|
||||||
wield_image = "default_water_flowing_animated.png^[verticalframe:64:0",
|
|
||||||
drawtype = "flowingliquid",
|
|
||||||
tiles = {"default_water_flowing_animated.png^[verticalframe:64:0"},
|
|
||||||
special_tiles = {
|
|
||||||
{
|
|
||||||
image="default_water_flowing_animated.png",
|
|
||||||
backface_culling=false,
|
|
||||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
image="default_water_flowing_animated.png",
|
|
||||||
backface_culling=false,
|
|
||||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
sounds = mcl_sounds.node_sound_water_defaults(),
|
|
||||||
is_ground_content = false,
|
|
||||||
alpha = WATER_ALPHA,
|
|
||||||
use_texture_alpha = USE_TEXTURE_ALPHA,
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "flowingliquid",
|
|
||||||
walkable = false,
|
|
||||||
pointable = false,
|
|
||||||
diggable = false,
|
|
||||||
buildable_to = true,
|
|
||||||
drop = "",
|
|
||||||
drowning = 4,
|
|
||||||
liquidtype = "flowing",
|
|
||||||
liquid_alternative_flowing = "mcl_bubble_column:water_flowing_down",
|
|
||||||
liquid_alternative_source = "mcl_bubble_column:water_source_down",
|
|
||||||
liquid_viscosity = WATER_VISC,
|
|
||||||
liquid_range = 7,
|
|
||||||
post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C},
|
|
||||||
groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, freezes=1, melt_around=1, dig_by_piston=1},
|
|
||||||
_mcl_blast_resistance = 100,
|
|
||||||
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
|
|
||||||
_mcl_hardness = -1,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("mcl_bubble_column:water_source_down", {
|
|
||||||
description = S("Whirlpool Water Source"),
|
|
||||||
_doc_items_entry_name = S("Water"),
|
|
||||||
_doc_items_longdesc = S("Takes you down!"),
|
|
||||||
_doc_items_hidden = false,
|
|
||||||
drawtype = "liquid",
|
|
||||||
tiles = {
|
|
||||||
{name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}}
|
|
||||||
},
|
|
||||||
special_tiles = {
|
|
||||||
-- New-style water source material (mostly unused)
|
|
||||||
{
|
|
||||||
name="default_water_source_animated.png",
|
|
||||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0},
|
|
||||||
backface_culling = false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sounds = mcl_sounds.node_sound_water_defaults(),
|
|
||||||
is_ground_content = false,
|
|
||||||
alpha = WATER_ALPHA,
|
|
||||||
use_texture_alpha = USE_TEXTURE_ALPHA,
|
|
||||||
paramtype = "light",
|
|
||||||
walkable = false,
|
|
||||||
pointable = false,
|
|
||||||
diggable = false,
|
|
||||||
buildable_to = true,
|
|
||||||
drop = "",
|
|
||||||
drowning = 4,
|
|
||||||
liquidtype = "source",
|
|
||||||
liquid_alternative_flowing = "mcl_bubble_column:water_flowing_down",
|
|
||||||
liquid_alternative_source = "mcl_bubble_column:water_source_down",
|
|
||||||
liquid_viscosity = WATER_VISC,
|
|
||||||
liquid_range = 7,
|
|
||||||
post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C},
|
|
||||||
stack_max = 64,
|
|
||||||
groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, dig_by_piston=1},
|
|
||||||
_mcl_blast_resistance = 100,
|
|
||||||
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
|
|
||||||
_mcl_hardness = -1,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_globalstep(function()
|
|
||||||
for _,player in ipairs(minetest.get_connected_players()) do
|
|
||||||
local name = player:get_player_name()
|
|
||||||
local pos = player:get_pos()
|
|
||||||
local node = minetest.get_node(pos)
|
|
||||||
if node.name == "mcl_bubble_column:water_source_down" then
|
|
||||||
local velocity = player:get_player_velocity()
|
|
||||||
local velocityadd = {x = 0, y = -0.5, z = 0}
|
|
||||||
player:add_player_velocity(velocityadd)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_abm{
|
|
||||||
label = "entities go down",
|
|
||||||
nodenames = {"mcl_bubble_column:water_source_down"},
|
|
||||||
interval = 0.05,
|
interval = 0.05,
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos)
|
|
||||||
for _,entity in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do
|
|
||||||
local pos = entity:get_pos()
|
|
||||||
local velocity = entity:get_velocity()
|
|
||||||
local velocityadd = {x = 0, y = -3, z = 0}
|
|
||||||
entity:add_velocity(velocityadd)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
}
|
|
||||||
|
|
||||||
minetest.register_abm{
|
|
||||||
label = "whirlpools go up",
|
|
||||||
nodenames = {"mcl_bubble_column:water_source_down"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = function(pos)
|
action = function(pos)
|
||||||
local uppos = vector.add(pos, {x = 0, y = 1, z = 0})
|
local uppos = vector.add(pos, {x = 0, y = 1, z = 0})
|
||||||
local upposnode = minetest.get_node(uppos)
|
local upposnode = minetest.get_node(uppos)
|
||||||
if upposnode.name == "mcl_core:water_source" then
|
local upmeta = minetest.get_meta(uppos)
|
||||||
minetest.set_node(uppos, {name = "mcl_bubble_column:water_source_down"})
|
if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("bubbly") ~= 1) then
|
||||||
|
upmeta:set_int("bubbly", 1)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
minetest.register_abm{
|
minetest.register_abm{
|
||||||
label = "start whirlpool",
|
label = "startWhirlpool",
|
||||||
nodenames = {"mcl_nether:magma"},
|
nodenames = {"mcl_nether:magma"},
|
||||||
interval = 1,
|
interval = 0.05,
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos)
|
action = function(pos)
|
||||||
local downpos = vector.add(pos, {x = 0, y = 1, z = 0})
|
local uppos = vector.add(pos, {x = 0, y = 1, z = 0})
|
||||||
local downposnode = minetest.get_node(downpos)
|
local upposnode = minetest.get_node(uppos)
|
||||||
if downposnode.name == "mcl_core:water_source" then
|
local upmeta = minetest.get_meta(uppos)
|
||||||
minetest.set_node(downpos, {name = "mcl_bubble_column:water_source_down"})
|
if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("whirly") ~= 1) then
|
||||||
|
upmeta:set_int("whirly", 1)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mcl_bubble_column.on_enter_bubble_column = function(self)
|
||||||
|
local velocity = self:get_velocity()
|
||||||
|
--[[if down.name == "mcl_nether:soul_sand" then
|
||||||
|
self:add_velocity({x = 0, y = math.min(10, math.abs(velocity.y)+9.4), z = 0})
|
||||||
|
else]]
|
||||||
|
self:add_velocity({x = 0, y = math.min(3.6, math.abs(velocity.y)+3), z = 0})
|
||||||
|
--end
|
||||||
|
end
|
||||||
|
|
||||||
|
mcl_bubble_column.on_enter_whirlpool = function(self)
|
||||||
|
local velocity = self:get_velocity()
|
||||||
|
--self:add_velocity({x = 0, y = math.max(-3, (-math.abs(velocity.y))-2), z = 0})
|
||||||
|
self:add_velocity({x = 0, y = math.max(-0.3, (-math.abs(velocity.y))-0.03), z = 0})
|
||||||
|
end
|
||||||
|
|
||||||
|
mcl_bubble_column.on_enter_bubble_column_with_air_above = function(self)
|
||||||
|
local velocity = self:get_velocity()
|
||||||
|
--[[if down.name == "mcl_nether:soul_sand" then
|
||||||
|
self:add_velocity({x = 0, y = math.min(4.3, math.abs(velocity.y)+2.8), z = 0})
|
||||||
|
else]]
|
||||||
|
self:add_velocity({x = 0, y = math.min(2.6, math.abs(velocity.y)+2), z = 0})
|
||||||
|
--end
|
||||||
|
end
|
||||||
|
|
||||||
|
mcl_bubble_column.on_enter_whirlpool_with_air_above = function(self)
|
||||||
|
local velocity = self:get_velocity()
|
||||||
|
--self:add_velocity({x = 0, y = math.max(-3.5, (-math.abs(velocity.y))-2), z = 0})
|
||||||
|
self:add_velocity({x = 0, y = math.max(-0.9, (-math.abs(velocity.y))-0.03), z = 0})
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_abm{
|
minetest.register_abm{
|
||||||
label = "stop whirlpool",
|
label = "entGo",
|
||||||
nodenames = {"mcl_bubble_column:water_source_down"},
|
nodenames = {"group:water"},
|
||||||
interval = 1,
|
interval = 0.05,
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos)
|
action = function(pos)
|
||||||
local downpos = vector.add(pos, {x = 0, y = -1, z = 0})
|
--if not bubble column block return
|
||||||
local downposnode = minetest.get_node(downpos)
|
local meta = minetest.get_meta(pos)
|
||||||
if downposnode.name == "mcl_core:water_source" then
|
if meta:get_int("bubbly") == 1 then
|
||||||
minetest.set_node(pos, {name = "mcl_core:water_source"})
|
local up = minetest.get_node(vector.add(pos, {x = 0, y = 1, z = 0}))
|
||||||
|
for _,entity in pairs(minetest.get_objects_inside_radius(pos, 0.75)) do
|
||||||
|
if up.name == "air" then
|
||||||
|
mcl_bubble_column.on_enter_bubble_column_with_air_above(entity)
|
||||||
|
else
|
||||||
|
mcl_bubble_column.on_enter_bubble_column(entity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif meta:get_int("whirly") == 1 then
|
||||||
|
local up = minetest.get_node(vector.add(pos, {x = 0, y = 1, z = 0}))
|
||||||
|
for _,entity in pairs(minetest.get_objects_inside_radius(pos, 0.75)) do
|
||||||
|
if up.name == "air" then
|
||||||
|
mcl_bubble_column.on_enter_whirlpool_with_air_above(entity)
|
||||||
|
else
|
||||||
|
mcl_bubble_column.on_enter_whirlpool(entity)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
minetest.register_globalstep(function()
|
||||||
|
for _,player in ipairs(minetest.get_connected_players()) do
|
||||||
|
local ppos = player:get_pos()
|
||||||
|
local eyepos = {x = ppos.x, y = ppos.y + player:get_properties().eye_height, z = ppos.z}
|
||||||
|
local node = minetest.get_node(ppos)
|
||||||
|
local eyenode = minetest.get_node(eyepos)
|
||||||
|
local meta = minetest.get_meta(ppos)
|
||||||
|
local eyemeta = minetest.get_meta(eyepos)
|
||||||
|
|
||||||
|
local eyemeta = minetest.get_meta(ppos)
|
||||||
|
--if minetest.get_item_group(node.name, "water") == 3 and minetest.get_item_group(eyenode.name, "water") == 3 then return end
|
||||||
|
if meta:get_int("bubbly") == 1 or eyemeta:get_int("bubbly") == 1 then
|
||||||
|
local up = minetest.get_node(vector.add(eyepos, {x = 0, y = 1, z = 0}))
|
||||||
|
if up.name == "air" then
|
||||||
|
mcl_bubble_column.on_enter_bubble_column_with_air_above(player)
|
||||||
|
else
|
||||||
|
mcl_bubble_column.on_enter_bubble_column(player)
|
||||||
|
end
|
||||||
|
elseif meta:get_int("whirly") == 1 or eyemeta:get_int("whirly") == 1 then
|
||||||
|
local up = minetest.get_node(vector.add(ppos, {x = 0, y = 1, z = 0}))
|
||||||
|
if up.name == "air" then
|
||||||
|
mcl_bubble_column.on_enter_whirlpool_with_air_above(player)
|
||||||
|
else
|
||||||
|
mcl_bubble_column.on_enter_whirlpool(player)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--abms to remove and replace old bubble columns/whirlpools
|
||||||
minetest.register_abm{
|
minetest.register_abm{
|
||||||
label = "bubbles down",
|
label = "removeOldFlowingColumns",
|
||||||
nodenames = {"mcl_bubble_column:water_source_down"},
|
nodenames = {"mcl_bubble_column:water_flowing_up", "mcl_bubble_column:water_flowing_down"},
|
||||||
interval = 1,
|
interval = 1,--reduce lag
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos)
|
action = function(pos)
|
||||||
minetest.add_particlespawner({
|
minetest.set_node(pos, {name = "air"})
|
||||||
amount = 10,
|
end,
|
||||||
time = 0.15,
|
}
|
||||||
minpos = vector.add(pos, { x = -0.25, y = 0, z = -0.25 }),
|
minetest.register_abm{
|
||||||
maxpos = vector.add(pos, { x = 0.25, y = 0, z = 0.75 }),
|
label = "replaceBubbleColumns",
|
||||||
attached = player,
|
nodenames = {"mcl_bubble_column:water_source_up"},
|
||||||
minvel = {x = -0.2, y = 0, z = -0.2},
|
interval = 1,--reduce lag
|
||||||
maxvel = {x = 0.5, y = 0, z = 0.5},
|
chance = 1,
|
||||||
minacc = {x = -0.4, y = -4, z = -0.4},
|
action = function(pos)
|
||||||
maxacc = {x = 0.5, y = -1, z = 0.5},
|
minetest.set_node(pos, {name = "mcl_core:water_source"})
|
||||||
minexptime = 0.3,
|
local meta = minetest.get_meta(pos)
|
||||||
maxexptime = 0.8,
|
meta:set_int("bubbly", 1)
|
||||||
minsize = 0.7,
|
end,
|
||||||
maxsize = 2.4,
|
}
|
||||||
texture = "mcl_particles_bubble.png"
|
minetest.register_abm{
|
||||||
})
|
label = "replaceWhirlpools",
|
||||||
|
nodenames = {"mcl_bubble_column:water_source_down"},
|
||||||
|
interval = 1,--reduce lag
|
||||||
|
chance = 1,
|
||||||
|
action = function(pos)
|
||||||
|
minetest.set_node(pos, {name = "mcl_core:water_source"})
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_int("whirly", 1)
|
||||||
end,
|
end,
|
||||||
}
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
minetest.register_on_mods_loaded(function ()
|
||||||
|
local light_min = 1
|
||||||
|
for i, def in pairs(minetest.registered_nodes) do
|
||||||
|
local light_source = def.light_source
|
||||||
|
if light_source == nil or light_source < light_min then
|
||||||
|
minetest.override_item(i, { light_source = light_min })
|
||||||
|
elseif light_source == light_min then
|
||||||
|
minetest.override_item(i, { light_source = light_min + 1 })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
|
@ -0,0 +1,3 @@
|
||||||
|
name = ambient_light
|
||||||
|
author = MikeRedwood
|
||||||
|
description = Makes all nodes lit to a small degree!
|
|
@ -1,36 +1,66 @@
|
||||||
mcl_weather.nether_dust = {}
|
mcl_weather.nether_dust = {}
|
||||||
mcl_weather.nether_dust.particles_count = 99
|
mcl_weather.nether_dust.particlespawners = {}
|
||||||
|
|
||||||
-- calculates coordinates and draw particles for Nether dust
|
local psdef= {
|
||||||
function mcl_weather.nether_dust.add_dust_particles(player)
|
amount = 150,
|
||||||
for i=mcl_weather.nether_dust.particles_count, 1,-1 do
|
time = 0,
|
||||||
local rpx, rpy, rpz = mcl_weather.get_random_pos_by_player_look_dir(player)
|
minpos = vector.new(-15,-15,-15),
|
||||||
minetest.add_particle({
|
maxpos =vector.new(15,15,15),
|
||||||
pos = {x = rpx, y = rpy - math.random(6, 18), z = rpz},
|
minvel = vector.new(-0.3,-0.15,-1),
|
||||||
velocity = {x = math.random(-30,30)*0.01, y = math.random(-15,15)*0.01, z = math.random(-30,30)*0.01},
|
maxvel = vector.new(0.3,0.15,0.3),
|
||||||
acceleration = {x = math.random(-50,50)*0.02, y = math.random(-20,20)*0.02, z = math.random(-50,50)*0.02},
|
minacc = vector.new(-1,-0.4,-1),
|
||||||
expirationtime = 3,
|
maxacc = vector.new(1,0.4,1),
|
||||||
size = math.random(6,20)*0.01,
|
minexptime = 1,
|
||||||
|
maxexptime = 10,
|
||||||
|
minsize = 0.2,
|
||||||
|
maxsize = 0.7,
|
||||||
collisiondetection = false,
|
collisiondetection = false,
|
||||||
|
collision_removal = false,
|
||||||
object_collision = false,
|
object_collision = false,
|
||||||
vertical = false,
|
vertical = false
|
||||||
glow = math.random(0,minetest.LIGHT_MAX),
|
}
|
||||||
texture = "mcl_particles_nether_dust"..tostring(i%3+1)..".png",
|
|
||||||
playername = player:get_player_name()
|
local function check_player(player)
|
||||||
})
|
local name=player:get_player_name(name)
|
||||||
|
if mcl_worlds.has_dust(player:get_pos()) and not mcl_weather.nether_dust.particlespawners[name] then
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local timer = 0
|
mcl_weather.nether_dust.add_particlespawners = function(player)
|
||||||
minetest.register_globalstep(function(dtime)
|
local name=player:get_player_name(name)
|
||||||
timer = timer + dtime
|
mcl_weather.nether_dust.particlespawners[name]={}
|
||||||
if timer < 0.7 then return end
|
psdef.playername = name
|
||||||
timer = 0
|
psdef.attached = player
|
||||||
|
psdef.glow = math.random(0,minetest.LIGHT_MAX)
|
||||||
for _, player in pairs(minetest.get_connected_players()) do
|
for i=1,3 do
|
||||||
if not mcl_worlds.has_dust(player:get_pos()) then
|
psdef.texture="mcl_particles_nether_dust"..i..".png"
|
||||||
return false
|
mcl_weather.nether_dust.particlespawners[name][i]=minetest.add_particlespawner(psdef)
|
||||||
end
|
end
|
||||||
mcl_weather.nether_dust.add_dust_particles(player)
|
end
|
||||||
|
|
||||||
|
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
||||||
|
local name=player:get_player_name(name)
|
||||||
|
if mcl_weather.nether_dust.particlespawners[name] then
|
||||||
|
for i=1,3 do
|
||||||
|
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
||||||
|
end
|
||||||
|
mcl_weather.nether_dust.particlespawners[name]=nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
mcl_worlds.register_on_dimension_change(function(player, dimension)
|
||||||
|
if check_player(player) then
|
||||||
|
return mcl_weather.nether_dust.add_particlespawners(player)
|
||||||
|
end
|
||||||
|
mcl_weather.nether_dust.delete_particlespawners(player)
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_joinplayer(function(player)
|
||||||
|
if check_player(player) then
|
||||||
|
mcl_weather.nether_dust.add_particlespawners(player)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
minetest.register_on_leaveplayer(function(player)
|
||||||
|
mcl_weather.nether_dust.delete_particlespawners(player)
|
||||||
|
end)
|
|
@ -0,0 +1,3 @@
|
||||||
|
# mcl_tridents by j45
|
||||||
|
|
||||||
|
Adds tridents to MineClone2.
|
|
@ -0,0 +1,87 @@
|
||||||
|
local S = minetest.get_translator("mcl_tridents")
|
||||||
|
local cooldown = {}
|
||||||
|
|
||||||
|
minetest.register_on_joinplayer(function(player)
|
||||||
|
cooldown[player:get_player_name()] = false
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_leaveplayer(function(player)
|
||||||
|
cooldown[player:get_player_name()] = false
|
||||||
|
end)
|
||||||
|
|
||||||
|
local GRAVITY = 9.81
|
||||||
|
local TRIDENT_DURABILITY = 251
|
||||||
|
local TRIDENT_COOLDOWN = 0.91
|
||||||
|
|
||||||
|
local TRIDENT_ENTITY = {
|
||||||
|
physical = true,
|
||||||
|
pointable = false,
|
||||||
|
visual = "mesh",
|
||||||
|
mesh = "mcl_trident.obj",
|
||||||
|
visual_size = {x=-1, y=1},
|
||||||
|
textures = {"mcl_trident.png"},
|
||||||
|
collisionbox = {-.1, -.1, -1, .1, .1, 0.5},
|
||||||
|
collide_with_objects = true,
|
||||||
|
_fire_damage_resistant = true,
|
||||||
|
|
||||||
|
_lastpos={},
|
||||||
|
_startpos=nil,
|
||||||
|
_damage=8, -- Damage on impact
|
||||||
|
_is_critical=false,
|
||||||
|
_stuck=false, -- Whether arrow is stuck
|
||||||
|
_stucktimer=nil,-- Amount of time (in seconds) the arrow has been stuck so far
|
||||||
|
_stuckrechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow
|
||||||
|
_stuckin=nil, --Position of node in which arow is stuck.
|
||||||
|
_shooter=nil, -- ObjectRef of player or mob who shot it
|
||||||
|
|
||||||
|
_viscosity=0, -- Viscosity of node the arrow is currently in
|
||||||
|
_deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession
|
||||||
|
}
|
||||||
|
|
||||||
|
minetest.register_entity("mcl_tridents:trident_entity", TRIDENT_ENTITY)
|
||||||
|
|
||||||
|
local spawn_trident = function(player)
|
||||||
|
local wielditem = player:get_wielded_item()
|
||||||
|
local obj = minetest.add_entity(vector.add(player:get_pos(), {x = 0, y = 1.5, z = 0}), "mcl_tridents:trident_entity")
|
||||||
|
local yaw = player:get_look_horizontal()+math.pi/2
|
||||||
|
|
||||||
|
if cooldown[player:get_player_name()] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
cooldown[player:get_player_name()] = true
|
||||||
|
|
||||||
|
minetest.after(TRIDENT_COOLDOWN, function()
|
||||||
|
cooldown[player:get_player_name()] = false
|
||||||
|
end)
|
||||||
|
|
||||||
|
if obj then
|
||||||
|
local durability = TRIDENT_DURABILITY
|
||||||
|
local unbreaking = mcl_enchanting.get_enchantment(wielditem, "unbreaking")
|
||||||
|
if unbreaking > 0 then
|
||||||
|
durability = durability * (unbreaking + 1)
|
||||||
|
end
|
||||||
|
wielditem:add_wear(65535/durability)
|
||||||
|
minetest.chat_send_all(wielditem:get_wear())
|
||||||
|
obj:set_velocity(vector.multiply(player:get_look_dir(), 20))
|
||||||
|
obj:set_acceleration({x=0, y=-GRAVITY, z=0})
|
||||||
|
obj:set_yaw(yaw)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
minetest.register_tool("mcl_tridents:trident", {
|
||||||
|
description = S("Trident"),
|
||||||
|
_tt_help = S("Launches a trident when you rightclick and it is in your hand"),
|
||||||
|
_doc_items_durability = TRIDENT_DURABILITY,
|
||||||
|
inventory_image = "mcl_trident_inv.png",
|
||||||
|
stack_max = 1,
|
||||||
|
groups = {weapon=1,weapon_ranged=1,trident=1,enchantability=1},
|
||||||
|
_mcl_uses = TRIDENT_DURABILITY,
|
||||||
|
on_place = function(itemstack, placer, pointed_thing)
|
||||||
|
spawn_trident(placer)
|
||||||
|
end,
|
||||||
|
on_secondary_use = function(itemstack, user, pointed_thing)
|
||||||
|
spawn_trident(user)
|
||||||
|
end
|
||||||
|
})
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
After Width: | Height: | Size: 299 B |
Loading…
Reference in New Issue