hp_max = 1,
physical = true,
collide_with_objects = false,
- collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5},
+ collisionbox = {-0.4, -0.35, -0.4, 0.4, 0.3, 0.4},
visual = "mesh",
mesh = "boat.obj",
textures = {"boat.png"},
visual_size = {x=3,y=3,z=3},
is_visible = true,
+ automatic_face_movement_dir = 90.0,
+ automatic_face_movement_max_rotation_per_sec = 600,
},
- rider = "",
+ rider = nil,
get_staticdata = function(self)
self.object:set_velocity({x = 0, y = 0, z = 0})
self.object:set_acceleration({x = 0, y = -9.81, z = 0})
end,
+ on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
+ local pos = self.object:getpos()
+ minetest.add_item(pos, "boat:boat")
+ self.object:remove()
+ end,
+
+
+ on_rightclick = function(self,clicker)
+ if not clicker or not clicker:is_player() then
+ return
+ end
+ local player_name = clicker:get_player_name()
+
+ if self.rider and player_name == self.rider then
+ clicker:set_detach()
+ self.rider = nil
+ elseif not self.rider then
+ self.rider = player_name
+ clicker:set_attach(self.object, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0})
+ --player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0})
+ --carts:manage_attachment(clicker, self.object)
+
+ -- player_api does not update the animation
+ -- when the player is attached, reset to default animation
+
+ --player_api.set_animation(clicker, "stand")
+ end
+ end,
+ --check if the boat is stuck on land
+ check_if_on_land = function(self)
+ local pos = self.object:getpos()
+ pos.y = pos.y - 0.37
+ local bottom_node = minetest.get_node(pos).name
+ if (bottom_node == "main:water" or bottom_node == "main:waterflow" or bottom_node == "air") then
+ self.on_land = false
+ else
+ self.on_land = true
+ end
+
+ end,
+ --players drive the baot
+ drive = function(self)
+ if self.rider and not self.on_land == true 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:getvelocity()
+ local goal = rider:get_look_dir()
+ goal = vector.multiply(goal,9)
+ local acceleration = vector.new(goal.x-currentvel.x,0,goal.z-currentvel.z)
+ acceleration = vector.multiply(acceleration, 0.01)
+ self.object:add_velocity(acceleration)
+ self.moving = true
+ end
+ else
+ self.moving = nil
+ end
+ end,
--players push boat
push = function(self)
player_pos.y = 0
local currentvel = self.object:getvelocity()
-
local vel = vector.subtract(pos, player_pos)
vel = vector.normalize(vel)
local distance = vector.distance(pos,player_pos)
-
distance = (1-distance)*10
-
vel = vector.multiply(vel,distance)
-
-
local acceleration = vector.new(vel.x-currentvel.x,0,vel.z-currentvel.z)
-
self.object:add_velocity(acceleration)
end
end
float = function(self)
local pos = self.object:getpos()
local node = minetest.get_node(pos).name
- local vel = self.object:getvelocity()
- local goal = 1
- local acceleration = vector.new(0,goal-vel.y,0)
self.swimming = false
+ --flow normally if floating else don't
if node == "main:water" or node =="main:waterflow" then
- print("float man")
self.swimming = true
+ local vel = self.object:getvelocity()
+ local goal = 3
+ local acceleration = vector.new(0,goal-vel.y,0)
self.object:add_velocity(acceleration)
end
end,
+ --makes boats flow
+ flow = function(self)
+ local pos = self.object:getpos()
+ pos.y = pos.y - 0.37
+ local node = minetest.get_node(pos).name
+ local goalx = 0
+ local goalz = 0
+ if (node == "main:waterflow" or node == "main:water" ) and not self.moving == true and not self.on_land == true then
+ local currentvel = self.object:getvelocity()
+ local level = minetest.get_node_level(pos)
+ local pos = self.object:getpos()
+ 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))
+ print(node)
+ if (level2 < level and nodename == "main:waterflow") or (nodename == "main:water" and level2 == 7) then
+ goalx = x*5
+ goalz = z*5
+ --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)
- local vel = self.object:getvelocity()
- local deceleration = vector.multiply(vel, -0.01)
- self.object:add_velocity(deceleration)
-
-
-
+ if not self.moving == true then
+ local vel = self.object:getvelocity()
+ local deceleration = vector.multiply(vel, -0.01)
+ self.object:add_velocity(deceleration)
+ end
end,
on_step = function(self, dtime)
+ self.check_if_on_land(self)
self.push(self)
+ self.drive(self)
self.float(self)
+ self.flow(self)
self.slowdown(self)
end,
})