+
+local
+minetest,vector,math,pairs
+=
+minetest,vector,math,pairs
+
+local name
+local pos
+local node
+local node_above
+local goalx
+local goalz
+local currentvel
+local level
+local level2
+local nodename
+local acceleration
+
+local function lavaflow(self)
+ pos = self.object:get_pos()
+ pos.y = pos.y + self.object:get_properties().collisionbox[2]
+ pos = vector.round(pos)
+ node = minetest.get_node(pos).name
+ node_above = minetest.get_node(vector.new(pos.x,pos.y+1,pos.z)).name
+ goalx = 0
+ goalz = 0
+ found = false
+ if node == "main:lavaflow" then
+ currentvel = self.object:get_velocity()
+ level = minetest.get_node_level(pos)
+ for x = -1,1 do
+ for z = -1,1 do
+ if found == false then
+ nodename = minetest.get_node(vector.new(pos.x+x,pos.y,pos.z+z)).name
+ level2 = minetest.get_node_level(vector.new(pos.x+x,pos.y,pos.z+z))
+ if level2 > level and nodename == "main:lavaflow" or nodename == "main:lava" then
+ goalx = -x
+ goalz = -z
+ --diagonal flow
+ if goalx ~= 0 and goalz ~= 0 then
+ found = true
+ end
+ end
+ end
+ end
+ end
+ --only add velocity if there is one
+ --else this stops the player
+ if goalx ~= 0 and goalz ~= 0 then
+ acceleration = vector.new(goalx-currentvel.x,0,goalz-currentvel.z)
+ self.object:add_velocity(acceleration)
+ elseif goalx ~= 0 or goalz ~= 0 then
+ acceleration = vector.new(goalx-currentvel.x,0,goalz-currentvel.z)
+ self.object:add_velocity(acceleration)
+ end
+ end
+end
+
--minetest.get_node_level(pos)
minetest.register_entity("boat:boat", {
initial_properties = {
--players drive the baot
drive = function(self)
- if self.rider and not self.on_land == true then
+ if self.rider then
local rider = minetest.get_player_by_name(self.rider)
local move = rider:get_player_control().up
self.moving = nil
if move then
+
local currentvel = self.object:get_velocity()
local goal = rider:get_look_dir()
- goal = vector.multiply(goal,20)
+ if self.on_land == true then
+ goal = vector.multiply(goal,1)
+ else
+ goal = vector.multiply(goal,20)
+ end
local acceleration = vector.new(goal.x-currentvel.x,0,goal.z-currentvel.z)
acceleration = vector.multiply(acceleration, 0.01)
self.object:add_velocity(acceleration)
--flow normally if floating else don't
if node == "main:water" or node =="main:waterflow" then
+ self.object:set_acceleration(vector.new(0,0,0))
self.swimming = true
local vel = self.object:get_velocity()
local goal = 9
self.object:add_velocity(acceleration)
--self.object:set_acceleration(vector.new(0,0,0))
else
- local vel = self.object:get_velocity()
- local goal = -9.81
- local acceleration = vector.new(0,goal-vel.y,0)
- acceleration = vector.multiply(acceleration, 0.01)
- self.object:add_velocity(acceleration)
- --self.object:set_acceleration(vector.new(0,0,0))
- end
- end,
-
- --makes boats flow
- flow = function(self)
- local pos = self.object:get_pos()
- pos.y = pos.y - 0.4
- local node = minetest.get_node(pos).name
- local node_above = minetest.get_node(vector.new(pos.x,pos.y+1,pos.z)).name
- local goalx = 0
- local goalz = 0
- --print(node_above)
- if (node == "main:waterflow" or node == "main:water" ) and not self.moving == true and (node_above ~= "main:water" and node_above ~= "main:waterflow") then
- local currentvel = self.object:get_velocity()
- local level = minetest.get_node_level(pos)
- local pos = self.object:get_pos()
- for x = -1,1 do
- for y = -1,0 do
- for z = -1,1 do
- if (x == 0 and z ~= 0) or (z == 0 and x ~=0) then
- local nodename = minetest.get_node(vector.new(pos.x+x,pos.y+y,pos.z+z)).name
- local level2 = minetest.get_node_level(vector.new(pos.x+x,pos.y+y,pos.z+z))
- if (level2 < level and nodename == "main:waterflow") or (nodename == "main:water" and level2 == 7) then
- goalx = x*7
- goalz = z*7
- --break
- end
- end
- end
- end
- end
- --only add velocity if there is one
- --else this stops the boat
- if goalx ~= 0 or goalz ~= 0 then
- local acceleration = vector.new(goalx-currentvel.x,0,goalz-currentvel.z)
- acceleration = vector.multiply(acceleration, 0.01)
- self.object:add_velocity(acceleration)
- end
+ self.object:set_acceleration(vector.new(0,-10,0))
end
end,
local pos = self.object:get_pos()
local velocity = self.object:get_velocity()
if self.lag_check then
- local chugent = math.ceil(minetest.get_us_time()/1000 - self.lag_check)
+ local chugent = minetest.get_us_time()/1000000 - self.lag_check
--print("lag = "..chugent.." ms")
- if chugent > 70 and self.old_pos and self.old_velocity then
+ if chugent > 1 and self.old_pos and self.old_velocity then
self.object:move_to(self.old_pos)
self.object:set_velocity(self.old_velocity)
end
end
self.old_pos = pos
- self.old_velocity = vel
- self.lag_check = minetest.get_us_time()/1000
+ self.old_velocity = velocity
+ self.lag_check = minetest.get_us_time()/1000000
+ end,
+
+ flow = function(self)
+ local flow_dir = flow(self.object:get_pos())
+ if flow_dir then
+ flow_dir = vector.multiply(flow_dir,10)
+ local vel = self.object:get_velocity()
+ local acceleration = vector.new(flow_dir.x-vel.x,flow_dir.y-vel.y,flow_dir.z-vel.z)
+ acceleration = vector.multiply(acceleration, 0.01)
+ self.object:add_velocity(acceleration)
+ end
end,
on_step = function(self, dtime)
return
end
- if minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "water")>0 then
- minetest.add_entity(pointed_thing.under, "boat:boat")
- else
- return
- end
+ minetest.add_entity(pointed_thing.above, "boat:boat")
itemstack:take_item()
end
end,
- --makes boats flow
- flow = function(self)
- local pos = self.object:get_pos()
- pos.y = pos.y - 0.4
- local node = minetest.get_node(pos).name
- local node_above = minetest.get_node(vector.new(pos.x,pos.y+1,pos.z)).name
- local goalx = 0
- local goalz = 0
- --print(node_above)
- if (node == "nether:lavaflow" or node == "nether:lava" ) and not self.moving == true and (node_above ~= "nether:lava" and node_above ~= "nether:lavaflow") then
- local currentvel = self.object:get_velocity()
- local level = minetest.get_node_level(pos)
- local pos = self.object:get_pos()
- for x = -1,1 do
- for y = -1,0 do
- for z = -1,1 do
- if (x == 0 and z ~= 0) or (z == 0 and x ~=0) then
- local nodename = minetest.get_node(vector.new(pos.x+x,pos.y+y,pos.z+z)).name
- local level2 = minetest.get_node_level(vector.new(pos.x+x,pos.y+y,pos.z+z))
- if (level2 < level and nodename == "main:lavaflow") or (nodename == "main:lava" and level2 == 7) then
- goalx = x*7
- goalz = z*7
- --break
- end
- end
- end
- end
- end
- --only add velocity if there is one
- --else this stops the boat
- if goalx ~= 0 or goalz ~= 0 then
- local acceleration = vector.new(goalx-currentvel.x,0,goalz-currentvel.z)
- acceleration = vector.multiply(acceleration, 0.01)
- self.object:add_velocity(acceleration)
- end
- end
- end,
-
-
--slows the boat down
slowdown = function(self)
if not self.moving == true then
local pos = self.object:get_pos()
local velocity = self.object:get_velocity()
if self.lag_check then
- local chugent = math.ceil(minetest.get_us_time()/1000- self.lag_check)
+ local chugent = minetest.get_us_time()/1000000- self.lag_check
--print("lag = "..chugent.." ms")
if chugent > 70 and self.old_pos and self.old_velocity then
end
end
self.old_pos = pos
- self.old_velocity = vel
- self.lag_check = minetest.get_us_time()/1000
+ self.old_velocity = velocity
+ self.lag_check = minetest.get_us_time()/1000000
end,
on_step = function(self, dtime)
self.push(self)
self.drive(self)
self.float(self)
- self.flow(self)
+ lavaflow(self)
self.slowdown(self)
self.lag_correction(self,dtime)
end,
})
minetest.register_craftitem("boat:iron_boat", {
- description = "Iron Boat",
+ description = "Nether Iron Boat",
inventory_image = "iron_boatitem.png",
wield_image = "iron_boatitem.png",
liquids_pointable = true,
return
end
- if pointed_thing.above.y < -10000 and pointed_thing.above.y > -20000 then
- minetest.add_entity(pointed_thing.under, "boat:iron_boat")
- else
- return
- end
+ minetest.add_entity(pointed_thing.above, "boat:iron_boat")
itemstack:take_item()