builtin_item/init.lua

187 lines
4.3 KiB
Lua
Raw Normal View History

2016-05-26 12:17:00 +02:00
local time = minetest.get_us_time()+10*1000000
local lastpos = {x=0, y=0, z=0}
2015-06-05 11:30:34 +02:00
local last_tab, always_test
if not core.get_gravity then
local gravity,grav_updating = 10
function core.get_gravity()
if not grav_updating then
2017-06-11 09:18:46 +02:00
gravity = tonumber(core.settings:get("movement_gravity")) or gravity
2015-06-05 11:30:34 +02:00
grav_updating = true
core.after(50, function()
grav_updating = false
end)
end
return gravity
end
end
2014-08-31 14:44:42 +02:00
2014-08-31 14:12:32 +02:00
local function get_nodes(pos)
if not always_test then
2016-05-26 12:17:00 +02:00
local t = minetest.get_us_time()
if vector.equals(pos, lastpos)
and t-time < 10*1000000 then
return last_tab
end
2014-08-31 14:49:25 +02:00
time = t
2016-05-26 12:17:00 +02:00
lastpos = pos
local near_objects = minetest.get_objects_inside_radius(pos, 1)
if #near_objects >= 2 then
always_test = true
minetest.after(10, function() always_test = false end)
end
2014-08-31 14:49:25 +02:00
end
2014-08-31 14:12:32 +02:00
local tab,n = {},1
for i = -1,1,2 do
for _,p in pairs({
{x=pos.x+i, y=pos.y, z=pos.z},
{x=pos.x, y=pos.y, z=pos.z+i}
}) do
tab[n] = {p, minetest.get_node(p)}
n = n+1
end
end
if not always_test then
last_tab = tab
end
2014-08-31 14:12:32 +02:00
return tab
end
2012-09-25 16:29:37 +02:00
2014-08-31 14:12:32 +02:00
local function get_flowing_dir(pos)
local data = get_nodes(pos)
local param2 = minetest.get_node(pos).param2
if param2 > 7 then
return
end
for _,i in pairs(data) do
local nd = i[2]
local name = nd.name
local par2 = nd.param2
if name == "default:water_flowing"
and par2 < param2 then
return i[1]
2012-09-25 16:29:37 +02:00
end
2014-08-31 14:12:32 +02:00
end
for _,i in pairs(data) do
local nd = i[2]
local name = nd.name
local par2 = nd.param2
if name == "default:water_flowing"
and par2 >= 11 then
return i[1]
2012-09-25 16:29:37 +02:00
end
2014-08-31 14:12:32 +02:00
end
for _,i in pairs(data) do
local nd = i[2]
local name = nd.name
local par2 = nd.param2
local tmp = minetest.registered_nodes[name]
if tmp
and not tmp.walkable
and name ~= "default:water_flowing" then
return i[1]
2012-09-25 16:29:37 +02:00
end
2014-08-31 14:12:32 +02:00
end
end
2012-09-25 16:29:37 +02:00
2014-08-31 14:12:32 +02:00
local item_entity = minetest.registered_entities["__builtin:item"]
local old_on_step = item_entity.on_step or function()end
2012-09-25 16:29:37 +02:00
2016-02-18 18:45:59 +01:00
item_entity.makes_footstep_sound = true
2016-02-21 12:31:33 +01:00
item_entity.bt_timer = 0
item_entity.on_step = function(self, dtime, ...)
old_on_step(self, dtime, ...)
2015-06-05 11:30:34 +02:00
2016-05-26 12:17:00 +02:00
if self.bt_acc
2020-08-01 21:12:24 +02:00
and not vector.equals(self.object:get_acceleration(), self.bt_acc) then
self.object:set_acceleration(self.bt_acc)
2016-05-26 12:17:00 +02:00
end
if self.bt_vel
2020-08-01 21:12:24 +02:00
and not vector.equals(self.object:get_velocity(), self.bt_vel) then
self.object:set_velocity(self.bt_vel)
2016-05-26 12:17:00 +02:00
end
if self.bt_phys ~= nil
and self.physical_state ~= self.bt_phys then
self.physical_state = self.bt_phys
self.object:set_properties({
physical = self.bt_phys
})
end
2016-02-21 12:31:33 +01:00
self.bt_timer = self.bt_timer+dtime
if self.bt_timer < 1 then
return
end
self.bt_timer = 0
2020-08-01 21:12:24 +02:00
local p = self.object:get_pos()
2016-05-26 12:17:00 +02:00
local pos = vector.round(p)
2015-06-05 11:30:34 +02:00
2016-05-26 12:17:00 +02:00
local name = minetest.get_node(pos).name
2014-08-31 14:12:32 +02:00
if name == "default:lava_flowing"
2017-03-07 10:41:37 +01:00
or name == "default:lava_source" then -- update to newest default please
2014-08-31 14:12:32 +02:00
minetest.sound_play("builtin_item_lava", {pos=p})
2015-04-09 22:31:21 +02:00
minetest.add_particlespawner({
amount = 3,
time = 0.1,
minpos = {x=p.x, y=p.y, z=p.z},
maxpos = {x=p.x, y=p.y+0.2, z=p.z},
minacc = {x=-0.5,y=5,z=-0.5},
maxacc = {x=0.5,y=5,z=0.5},
minexptime = 0.1,
minsize = 2,
maxsize = 4,
texture = "smoke_puff.png"
})
minetest.add_particlespawner ({
amount = 1, time = 0.4,
minpos = {x = p.x, y= p.y + 0.25, z= p.z},
maxpos = {x = p.x, y= p.y + 0.5, z= p.z},
minexptime = 0.2, maxexptime = 0.4,
minsize = 4, maxsize = 6,
collisiondetection = false,
vertical = false,
texture = "fire_basic_flame.png",
})
2014-08-31 14:12:32 +02:00
self.object:remove()
return
end
2012-09-25 16:29:37 +02:00
2014-08-31 14:12:32 +02:00
local tmp = minetest.registered_nodes[name]
2016-05-26 12:17:00 +02:00
if not tmp then
return
end
local acc
if tmp.liquidtype then
acc = {x=0, y=core.get_gravity()*(((p.y-.5)%1)*.9-1), z=0}
self.object:set_acceleration(acc)
2016-05-26 12:17:00 +02:00
self.bt_acc = acc
else
self.bt_acc = nil
end
if tmp.liquidtype == "flowing" then
local vec = get_flowing_dir(pos)
2014-08-31 14:12:32 +02:00
if vec then
2017-06-11 08:59:50 +02:00
local v = vector.add(
2020-08-01 21:12:24 +02:00
self.object:get_velocity(),
2017-06-11 08:59:50 +02:00
vector.multiply(vector.subtract(vec, pos),.5)
)
2016-05-26 12:17:00 +02:00
self.bt_vel = v
self.object:set_velocity(v)
2014-08-31 14:12:32 +02:00
self.physical_state = true
2016-05-26 12:17:00 +02:00
self.bt_phys = true
2014-08-31 14:12:32 +02:00
self.object:set_properties({
physical = true
})
2016-05-26 12:17:00 +02:00
return
2012-09-25 16:29:37 +02:00
end
2014-08-31 14:12:32 +02:00
end
2016-05-26 12:17:00 +02:00
self.bt_vel = nil
2014-08-31 14:12:32 +02:00
end
minetest.register_entity(":__builtin:item", item_entity)
2012-10-07 19:42:41 +02:00
2017-06-11 09:18:46 +02:00
if minetest.settings:get("log_mods") then
2012-10-07 19:42:41 +02:00
minetest.log("action", "builtin_item loaded")
end