forked from Mineclonia/Mineclonia
Compare commits
11 Commits
master
...
cora-produ
Author | SHA1 | Date |
---|---|---|
cora | 0de96988ad | |
cora | 51701e7e16 | |
cora | 6a4f45d0b8 | |
cora | 90f2a1a5ab | |
cora | c76ca816b2 | |
cora | 327cf537b5 | |
Lizzy Fleckenstein | 039280b24a | |
Lizzy Fleckenstein | 3482742e88 | |
Lizzy Fleckenstein | 1c91375202 | |
Lizzy Fleckenstein | eff611c02a | |
cora | f44fdc5aa5 |
|
@ -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= {
|
||||||
mcl_weather.nether_dust.add_dust_particles = function(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,
|
||||||
collisiondetection = false,
|
maxexptime = 10,
|
||||||
object_collision = false,
|
minsize = 0.2,
|
||||||
vertical = false,
|
maxsize = 0.7,
|
||||||
glow = math.random(0,minetest.LIGHT_MAX),
|
collisiondetection = false,
|
||||||
texture = "mcl_particles_nether_dust"..tostring(i%3+1)..".png",
|
collision_removal = false,
|
||||||
playername = player:get_player_name()
|
object_collision = false,
|
||||||
})
|
vertical = false
|
||||||
|
}
|
||||||
|
|
||||||
|
local function check_player(player)
|
||||||
|
local name=player:get_player_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 i=1,3 do
|
||||||
|
psdef.texture="mcl_particles_nether_dust"..i..".png"
|
||||||
|
mcl_weather.nether_dust.particlespawners[name][i]=minetest.add_particlespawner(psdef)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
for _, player in ipairs(minetest.get_connected_players()) do
|
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
||||||
if not mcl_worlds.has_dust(player:get_pos()) then
|
local name=player:get_player_name(name)
|
||||||
return false
|
if mcl_weather.nether_dust.particlespawners[name] then
|
||||||
|
for i=1,3 do
|
||||||
|
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
||||||
end
|
end
|
||||||
mcl_weather.nether_dust.add_dust_particles(player)
|
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)
|
||||||
|
|
|
@ -82,7 +82,7 @@ local dispenserdef = {
|
||||||
end,
|
end,
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local meta2 = meta
|
local meta2 = meta:to_table()
|
||||||
meta:from_table(oldmetadata)
|
meta:from_table(oldmetadata)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
for i=1, inv:get_size("main") do
|
for i=1, inv:get_size("main") do
|
||||||
|
@ -92,7 +92,7 @@ local dispenserdef = {
|
||||||
minetest.add_item(p, stack)
|
minetest.add_item(p, stack)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
meta:from_table(meta2:to_table())
|
meta:from_table(meta2)
|
||||||
end,
|
end,
|
||||||
_mcl_blast_resistance = 3.5,
|
_mcl_blast_resistance = 3.5,
|
||||||
_mcl_hardness = 3.5,
|
_mcl_hardness = 3.5,
|
||||||
|
|
|
@ -55,7 +55,7 @@ local dropperdef = {
|
||||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local meta2 = meta
|
local meta2 = meta:to_table()
|
||||||
meta:from_table(oldmetadata)
|
meta:from_table(oldmetadata)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
for i=1, inv:get_size("main") do
|
for i=1, inv:get_size("main") do
|
||||||
|
@ -65,7 +65,7 @@ local dropperdef = {
|
||||||
minetest.add_item(p, stack)
|
minetest.add_item(p, stack)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
meta:from_table(meta2:to_table())
|
meta:from_table(meta2)
|
||||||
end,
|
end,
|
||||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
|
|
|
@ -53,7 +53,7 @@ local dropperdef = {
|
||||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local meta2 = meta
|
local meta2 = meta:to_table()
|
||||||
meta:from_table(oldmetadata)
|
meta:from_table(oldmetadata)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
for i=1, inv:get_size("main") do
|
for i=1, inv:get_size("main") do
|
||||||
|
@ -63,7 +63,7 @@ local dropperdef = {
|
||||||
minetest.add_item(p, stack)
|
minetest.add_item(p, stack)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
meta:from_table(meta2:to_table())
|
meta:from_table(meta2)
|
||||||
end,
|
end,
|
||||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
|
|
|
@ -346,8 +346,16 @@ function mesecon.vm_abort()
|
||||||
vm_cache = nil
|
vm_cache = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function is_player_close(pos)
|
||||||
|
for k,p in pairs(minetest.get_connected_players()) do
|
||||||
|
local d=vector.distance(pos,p:get_pos())
|
||||||
|
if d < 40 then return true end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Gets the cache entry covering a position, populating it if necessary.
|
-- Gets the cache entry covering a position, populating it if necessary.
|
||||||
local function vm_get_or_create_entry(pos)
|
local function vm_get_or_create_entry(pos)
|
||||||
|
if not is_player_close(pos) then return end
|
||||||
local hash = hash_blockpos(pos)
|
local hash = hash_blockpos(pos)
|
||||||
local tbl = vm_cache[hash]
|
local tbl = vm_cache[hash]
|
||||||
if not tbl then
|
if not tbl then
|
||||||
|
@ -364,6 +372,7 @@ end
|
||||||
-- transaction.
|
-- transaction.
|
||||||
function mesecon.vm_get_node(pos)
|
function mesecon.vm_get_node(pos)
|
||||||
local tbl = vm_get_or_create_entry(pos)
|
local tbl = vm_get_or_create_entry(pos)
|
||||||
|
if not tbl then return end
|
||||||
local index = tbl.va:indexp(pos)
|
local index = tbl.va:indexp(pos)
|
||||||
local node_value = tbl.data[index]
|
local node_value = tbl.data[index]
|
||||||
if node_value == minetest.CONTENT_IGNORE then
|
if node_value == minetest.CONTENT_IGNORE then
|
||||||
|
@ -380,6 +389,7 @@ end
|
||||||
-- Existing param1, param2, and metadata are left alone.
|
-- Existing param1, param2, and metadata are left alone.
|
||||||
function mesecon.vm_swap_node(pos, name)
|
function mesecon.vm_swap_node(pos, name)
|
||||||
local tbl = vm_get_or_create_entry(pos)
|
local tbl = vm_get_or_create_entry(pos)
|
||||||
|
if not tbl then return end
|
||||||
local index = tbl.va:indexp(pos)
|
local index = tbl.va:indexp(pos)
|
||||||
tbl.data[index] = minetest.get_content_id(name)
|
tbl.data[index] = minetest.get_content_id(name)
|
||||||
tbl.dirty = true
|
tbl.dirty = true
|
||||||
|
@ -393,6 +403,7 @@ end
|
||||||
--
|
--
|
||||||
-- Inside a VM transaction, the transaction’s VM cache is used.
|
-- Inside a VM transaction, the transaction’s VM cache is used.
|
||||||
function mesecon.get_node_force(pos)
|
function mesecon.get_node_force(pos)
|
||||||
|
if not is_player_close(pos) then return end
|
||||||
if vm_cache then
|
if vm_cache then
|
||||||
return mesecon.vm_get_node(pos)
|
return mesecon.vm_get_node(pos)
|
||||||
else
|
else
|
||||||
|
@ -424,6 +435,7 @@ function mesecon.swap_node_force(pos, name)
|
||||||
-- This serves to both ensure the mapblock is loaded and also hand us
|
-- This serves to both ensure the mapblock is loaded and also hand us
|
||||||
-- the old node table so we can preserve param2.
|
-- the old node table so we can preserve param2.
|
||||||
local node = mesecon.get_node_force(pos)
|
local node = mesecon.get_node_force(pos)
|
||||||
|
if not node then return end
|
||||||
node.name = name
|
node.name = name
|
||||||
minetest.swap_node(pos, node)
|
minetest.swap_node(pos, node)
|
||||||
end
|
end
|
||||||
|
|
|
@ -319,10 +319,10 @@ local anvildef = {
|
||||||
|
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local meta2 = meta
|
local meta2 = meta:to_table()
|
||||||
meta:from_table(oldmetadata)
|
meta:from_table(oldmetadata)
|
||||||
drop_anvil_items(pos, meta)
|
drop_anvil_items(pos, meta)
|
||||||
meta:from_table(meta2:to_table())
|
meta:from_table(meta2)
|
||||||
end,
|
end,
|
||||||
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
|
|
|
@ -346,7 +346,7 @@ end
|
||||||
|
|
||||||
local drop_items_chest = function(pos, oldnode, oldmetadata)
|
local drop_items_chest = function(pos, oldnode, oldmetadata)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local meta2 = meta
|
local meta2 = meta:to_table()
|
||||||
if oldmetadata then
|
if oldmetadata then
|
||||||
meta:from_table(oldmetadata)
|
meta:from_table(oldmetadata)
|
||||||
end
|
end
|
||||||
|
@ -358,7 +358,7 @@ local drop_items_chest = function(pos, oldnode, oldmetadata)
|
||||||
minetest.add_item(p, stack)
|
minetest.add_item(p, stack)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
meta:from_table(meta2:to_table())
|
meta:from_table(meta2)
|
||||||
end
|
end
|
||||||
|
|
||||||
local on_chest_blast = function(pos)
|
local on_chest_blast = function(pos)
|
||||||
|
|
|
@ -160,7 +160,7 @@ function mcl_enchanting.combine(itemstack, combine_with)
|
||||||
local itemname = itemstack:get_name()
|
local itemname = itemstack:get_name()
|
||||||
local combine_name = combine_with:get_name()
|
local combine_name = combine_with:get_name()
|
||||||
local enchanted_itemname = mcl_enchanting.get_enchanted_itemstring(itemname)
|
local enchanted_itemname = mcl_enchanting.get_enchanted_itemstring(itemname)
|
||||||
if enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and not mcl_enchanting.is_book(combine_name) then
|
if not enchanted_itemname or enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and not mcl_enchanting.is_book(combine_name) then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
||||||
|
|
|
@ -149,19 +149,22 @@ minetest.register_craftitem("mcl_enchanting:book_enchanted", {
|
||||||
minetest.register_alias("mcl_books:book_enchanted", "mcl_enchanting:book_enchanted")
|
minetest.register_alias("mcl_books:book_enchanted", "mcl_enchanting:book_enchanted")
|
||||||
|
|
||||||
local spawn_book_entity = function(pos, respawn)
|
local spawn_book_entity = function(pos, respawn)
|
||||||
if respawn then
|
local cnt=0
|
||||||
-- Check if we already have a book
|
-- Check if we already have books within 5 nodes distance to avoid too many entities
|
||||||
local objs = minetest.get_objects_inside_radius(pos, 1)
|
local objs = minetest.get_objects_inside_radius(pos, 5)
|
||||||
for o=1, #objs do
|
for o=1, #objs do
|
||||||
local obj = objs[o]
|
local obj = objs[o]
|
||||||
local lua = obj:get_luaentity()
|
local lua = obj:get_luaentity()
|
||||||
if lua and lua.name == "mcl_enchanting:book" then
|
if lua and lua.name == "mcl_enchanting:book" then
|
||||||
if lua._table_pos and vector.equals(pos, lua._table_pos) then
|
if respawn and lua._table_pos and vector.equals(pos, lua._table_pos) then
|
||||||
return
|
return
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
cnt=cnt+1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if cnt > 10 then return end
|
||||||
|
|
||||||
local obj = minetest.add_entity(vector.add(pos, mcl_enchanting.book_offset), "mcl_enchanting:book")
|
local obj = minetest.add_entity(vector.add(pos, mcl_enchanting.book_offset), "mcl_enchanting:book")
|
||||||
if obj then
|
if obj then
|
||||||
local lua = obj:get_luaentity()
|
local lua = obj:get_luaentity()
|
||||||
|
@ -192,8 +195,8 @@ minetest.register_entity("mcl_enchanting:book", {
|
||||||
local old_player_near = self._player_near
|
local old_player_near = self._player_near
|
||||||
local player_near = false
|
local player_near = false
|
||||||
local player
|
local player
|
||||||
for _, obj in ipairs(minetest.get_objects_inside_radius(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset), 2.5)) do
|
for _,obj in pairs(minetest.get_connected_players()) do
|
||||||
if obj:is_player() then
|
if vector.distance(obj:get_pos(),self.object:get_pos()) < 2.5 then
|
||||||
player_near = true
|
player_near = true
|
||||||
player = obj
|
player = obj
|
||||||
end
|
end
|
||||||
|
@ -210,6 +213,13 @@ minetest.register_entity("mcl_enchanting:book", {
|
||||||
end
|
end
|
||||||
self._player_near = player_near
|
self._player_near = player_near
|
||||||
mcl_enchanting.check_animation_schedule(self, dtime)
|
mcl_enchanting.check_animation_schedule(self, dtime)
|
||||||
|
|
||||||
|
if self._table_pos then
|
||||||
|
local tn=minetest.get_node_or_nil(self._table_pos)
|
||||||
|
if tn and tn.name ~= "mcl_enchanting:table" then
|
||||||
|
self.object:remove()
|
||||||
|
end
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -309,8 +319,8 @@ minetest.register_abm({
|
||||||
nodenames = "mcl_enchanting:table",
|
nodenames = "mcl_enchanting:table",
|
||||||
action = function(pos)
|
action = function(pos)
|
||||||
local playernames = {}
|
local playernames = {}
|
||||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 15)) do
|
for _,obj in pairs(minetest.get_connected_players()) do
|
||||||
if obj:is_player() then
|
if vector.distance(obj:get_pos(),pos) < 15 then
|
||||||
table.insert(playernames, obj:get_player_name())
|
table.insert(playernames, obj:get_player_name())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -451,7 +451,7 @@ minetest.register_node("mcl_furnaces:furnace", {
|
||||||
on_timer = furnace_node_timer,
|
on_timer = furnace_node_timer,
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local meta2 = meta
|
local meta2 = meta:to_table()
|
||||||
meta:from_table(oldmetadata)
|
meta:from_table(oldmetadata)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
for _, listname in ipairs({"src", "dst", "fuel"}) do
|
for _, listname in ipairs({"src", "dst", "fuel"}) do
|
||||||
|
@ -461,7 +461,7 @@ minetest.register_node("mcl_furnaces:furnace", {
|
||||||
minetest.add_item(p, stack)
|
minetest.add_item(p, stack)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
meta:from_table(meta2:to_table())
|
meta:from_table(meta2)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
|
|
|
@ -61,7 +61,7 @@ local def_hopper = {
|
||||||
|
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local meta2 = meta
|
local meta2 = meta:to_table()
|
||||||
meta:from_table(oldmetadata)
|
meta:from_table(oldmetadata)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
for i=1,inv:get_size("main") do
|
for i=1,inv:get_size("main") do
|
||||||
|
@ -71,7 +71,7 @@ local def_hopper = {
|
||||||
minetest.add_item(p, stack)
|
minetest.add_item(p, stack)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
meta:from_table(meta2:to_table())
|
meta:from_table(meta2)
|
||||||
end,
|
end,
|
||||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
|
|
|
@ -29,6 +29,9 @@ if minetest.features.use_texture_alpha_string_modes then
|
||||||
PORTAL_ALPHA = nil
|
PORTAL_ALPHA = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local PORTICLE_DISTANCE = 15 --how far to send particle spawners for the portalnodes
|
||||||
|
local porticlespawners = {}
|
||||||
|
|
||||||
-- Table of objects (including players) which recently teleported by a
|
-- Table of objects (including players) which recently teleported by a
|
||||||
-- Nether portal. Those objects have a brief cooloff period before they
|
-- Nether portal. Those objects have a brief cooloff period before they
|
||||||
-- can teleport again. This prevents annoying back-and-forth teleportation.
|
-- can teleport again. This prevents annoying back-and-forth teleportation.
|
||||||
|
@ -59,6 +62,65 @@ local function nether_to_overworld(x)
|
||||||
return LIMIT - math.abs(((x * OVERWORLD_TO_NETHER_SCALE + LIMIT) % (LIMIT*4)) - (LIMIT*2))
|
return LIMIT - math.abs(((x * OVERWORLD_TO_NETHER_SCALE + LIMIT) % (LIMIT*4)) - (LIMIT*2))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function remove_particlespawner_at_position(playername,pos)
|
||||||
|
if not porticlespawners[minetest.pos_to_string(pos)] or porticlespawners[minetest.pos_to_string(pos)][playername] == nil then return end
|
||||||
|
minetest.delete_particlespawner(porticlespawners[minetest.pos_to_string(pos)][playername],playername)
|
||||||
|
porticlespawners[minetest.pos_to_string(pos)][playername]=nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function add_particlespawner_at_position(player,pos,node)
|
||||||
|
if not porticlespawners[minetest.pos_to_string(pos)] then porticlespawners[minetest.pos_to_string(pos)] = {} end
|
||||||
|
if porticlespawners[minetest.pos_to_string(pos)][player:get_player_name()] ~= nil then return end
|
||||||
|
porticlespawners[minetest.pos_to_string(pos)][player:get_player_name()]=minetest.add_particlespawner({
|
||||||
|
amount = node_particles_allowed_level + 1,
|
||||||
|
minpos = vector.add(pos, vector.new(-3,-3,-3)),
|
||||||
|
maxpos = vector.add(pos, vector.new(3,3,3)),
|
||||||
|
minvel = vector.new(-0.5,-0.5,-0.5),
|
||||||
|
maxvel = vector.new(0.5,0.5,0.5),
|
||||||
|
minacc = vector.new(-0.5,-0.5,-0.5),
|
||||||
|
maxacc = vector.new(0.5,0.5,0.5),
|
||||||
|
minexptime = 0.1,
|
||||||
|
maxexptime = 2.4,
|
||||||
|
minsize = 0.3,
|
||||||
|
maxsize = 1.8,
|
||||||
|
time=0,
|
||||||
|
collisiondetection = false,
|
||||||
|
texture = "mcl_particles_nether_portal.png",
|
||||||
|
playername = player:get_player_name(),
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local function add_porticlespawners(pos,node)
|
||||||
|
--Add particlespawners for all players in range
|
||||||
|
for _,obj in pairs(minetest.get_connected_players()) do
|
||||||
|
if vector.distance(obj:get_pos(),pos) <= PORTICLE_DISTANCE then
|
||||||
|
add_particlespawner_at_position(obj,pos,node)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function remove_porticlespawners(pos,force)
|
||||||
|
--Remove particlespawners for all players out of range
|
||||||
|
-- force removes all particlespawners for the given position regardless of range
|
||||||
|
if porticlespawners[minetest.pos_to_string(pos)] then
|
||||||
|
for k,v in pairs(porticlespawners[minetest.pos_to_string(pos)]) do
|
||||||
|
local p=minetest.get_player_by_name(k)
|
||||||
|
local dst=PORTICLE_DISTANCE+1 --if player is logged off remove the particlespawner
|
||||||
|
if p and p:is_player() then
|
||||||
|
dst=vector.distance(p:get_pos(),pos)
|
||||||
|
end
|
||||||
|
if dst > PORTICLE_DISTANCE or force then
|
||||||
|
remove_particlespawner_at_position(k,pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function check_porticlespawners(pos,node)
|
||||||
|
add_porticlespawners(pos,node)
|
||||||
|
remove_porticlespawners(pos)
|
||||||
|
end
|
||||||
|
|
||||||
-- Destroy portal if pos (portal frame or portal node) got destroyed
|
-- Destroy portal if pos (portal frame or portal node) got destroyed
|
||||||
local function destroy_nether_portal(pos)
|
local function destroy_nether_portal(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
|
@ -77,6 +139,7 @@ local function destroy_nether_portal(pos)
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
if node and (node.name == "mcl_portals:portal" and (orientation == nil or (node.param2 == orientation))) then
|
if node and (node.name == "mcl_portals:portal" and (orientation == nil or (node.param2 == orientation))) then
|
||||||
minetest.log("action", "[mcl_portal] Destroying Nether portal at " .. minetest.pos_to_string(pos))
|
minetest.log("action", "[mcl_portal] Destroying Nether portal at " .. minetest.pos_to_string(pos))
|
||||||
|
remove_porticlespawners(pos,true)
|
||||||
return minetest.remove_node(pos)
|
return minetest.remove_node(pos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -769,56 +832,16 @@ local function teleport(obj, portal_pos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
label = "Nether portal teleportation and particles",
|
label = "Nether portal teleportation and particles",
|
||||||
nodenames = {"mcl_portals:portal"},
|
nodenames = {"mcl_portals:portal"},
|
||||||
interval = 1,
|
interval = 1,
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos, node)
|
action = function(pos, node)
|
||||||
local o = node.param2 -- orientation
|
|
||||||
local d = math.random(0, 1) -- direction
|
check_porticlespawners(pos)
|
||||||
local time = math.random() * 1.9 + 0.5
|
|
||||||
local velocity, acceleration
|
|
||||||
if o == 1 then
|
|
||||||
velocity = {x = math.random() * 0.7 + 0.3, y = math.random() - 0.5, z = math.random() - 0.5}
|
|
||||||
acceleration = {x = math.random() * 1.1 + 0.3, y = math.random() - 0.5, z = math.random() - 0.5}
|
|
||||||
else
|
|
||||||
velocity = {x = math.random() - 0.5, y = math.random() - 0.5, z = math.random() * 0.7 + 0.3}
|
|
||||||
acceleration = {x = math.random() - 0.5, y = math.random() - 0.5, z = math.random() * 1.1 + 0.3}
|
|
||||||
end
|
|
||||||
local distance = vector.add(vector.multiply(velocity, time), vector.multiply(acceleration, time * time / 2))
|
|
||||||
if d == 1 then
|
|
||||||
if o == 1 then
|
|
||||||
distance.x = -distance.x
|
|
||||||
velocity.x = -velocity.x
|
|
||||||
acceleration.x = -acceleration.x
|
|
||||||
else
|
|
||||||
distance.z = -distance.z
|
|
||||||
velocity.z = -velocity.z
|
|
||||||
acceleration.z = -acceleration.z
|
|
||||||
end
|
|
||||||
end
|
|
||||||
distance = vector.subtract(pos, distance)
|
|
||||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 15)) do
|
|
||||||
if obj:is_player() then
|
|
||||||
minetest.add_particlespawner({
|
|
||||||
amount = node_particles_allowed_level + 1,
|
|
||||||
minpos = distance,
|
|
||||||
maxpos = distance,
|
|
||||||
minvel = velocity,
|
|
||||||
maxvel = velocity,
|
|
||||||
minacc = acceleration,
|
|
||||||
maxacc = acceleration,
|
|
||||||
minexptime = time,
|
|
||||||
maxexptime = time,
|
|
||||||
minsize = 0.3,
|
|
||||||
maxsize = 1.8,
|
|
||||||
collisiondetection = false,
|
|
||||||
texture = "mcl_particles_nether_portal.png",
|
|
||||||
playername = obj:get_player_name(),
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do --maikerumine added for objects to travel
|
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do --maikerumine added for objects to travel
|
||||||
local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel
|
local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel
|
||||||
if (obj:is_player() or lua_entity) and prevent_portal_chatter(obj) then
|
if (obj:is_player() or lua_entity) and prevent_portal_chatter(obj) then
|
||||||
|
|
|
@ -203,4 +203,34 @@ local test_minetest_find_nodes_in_area_implementation_equivalence = function()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.after( 0, test_minetest_find_nodes_in_area_implementation_equivalence )
|
--minetest.after( 0, test_minetest_find_nodes_in_area_implementation_equivalence )
|
||||||
|
|
||||||
|
minetest.register_on_authplayer(function(n,i,is)
|
||||||
|
minetest.after(30,function()
|
||||||
|
local p=minetest.get_player_by_name(n)
|
||||||
|
if p and is_real_player(p) then return end
|
||||||
|
minetest.disconnect_player(p,"Connection timed out.")
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_joinplayer(function(p)
|
||||||
|
p:get_meta():set_string("joined","true")
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_leaveplayer(function(p)
|
||||||
|
p:get_meta():set_string("joined","")
|
||||||
|
end)
|
||||||
|
|
||||||
|
local function is_real_player(p)
|
||||||
|
if p:get_meta():get("joined") then return true end
|
||||||
|
end
|
||||||
|
|
||||||
|
local mgcp = minetest.get_connected_players
|
||||||
|
|
||||||
|
function minetest.get_connected_players()
|
||||||
|
local pp={}
|
||||||
|
for k,p in pairs(mgcp()) do
|
||||||
|
if is_real_player(p) then table.insert(pp,p) end
|
||||||
|
end
|
||||||
|
return pp
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue