motorboat/motorboat_control.lua

168 lines
6.2 KiB
Lua
Raw Permalink Normal View History

2020-05-03 11:50:48 -07:00
--global constants
2020-05-10 13:25:48 -07:00
motorboat.motorboat_last_time_command = 0
motorboat.vector_up = vector.new(0, 1, 0)
2020-05-03 11:50:48 -07:00
2020-05-10 13:25:48 -07:00
function motorboat.get_pointer_angle(energy)
2020-05-03 11:50:48 -07:00
local angle = energy * 18
angle = angle - 90
angle = angle * -1
return angle
end
2020-05-10 13:25:48 -07:00
function motorboat.check_node_below(obj)
2020-05-03 11:50:48 -07:00
local pos_below = obj:get_pos()
pos_below.y = pos_below.y - 0.1
local node_below = minetest.get_node(pos_below).name
local nodedef = minetest.registered_nodes[node_below]
local touching_ground = not nodedef or -- unknown nodes are solid
nodedef.walkable or false
local liquid_below = not touching_ground and nodedef.liquidtype ~= "none"
return touching_ground, liquid_below
end
2022-07-11 16:14:08 -07:00
function motorboat.powerAdjust(self,dtime,factor,dir,max_power)
local max = max_power or 100
local add_factor = factor*10
add_factor = add_factor * (dtime/0.2) --adjusting the command speed by dtime
local power_index = self._power_lever
--minetest.chat_send_all(power_index)
if dir == 1 then
if self._power_lever < max then
self._power_lever = self._power_lever + add_factor
end
if self._power_lever > max then
self._power_lever = max
end
end
if dir == -1 then
if self._power_lever > 0 then
self._power_lever = self._power_lever - add_factor
if self._power_lever < 0 then self._power_lever = 0 end
end
if self._power_lever <= 0 then
self._power_lever = 0
end
end
end
2021-06-09 14:06:02 -07:00
function motorboat.motorboat_control(self, dtime, hull_direction, longit_speed,
longit_drag, later_speed, later_drag, accel)
2020-05-10 13:25:48 -07:00
motorboat.motorboat_last_time_command = motorboat.motorboat_last_time_command + dtime
if motorboat.motorboat_last_time_command > 1 then motorboat.motorboat_last_time_command = 1 end
2020-05-03 11:50:48 -07:00
local player = minetest.get_player_by_name(self.driver_name)
local retval_accel = accel;
2020-05-04 15:27:34 -07:00
2020-05-03 11:50:48 -07:00
-- player control
if player then
2021-05-06 16:39:24 -07:00
--minetest.chat_send_all('teste')
2020-05-03 11:50:48 -07:00
local ctrl = player:get_player_control()
2020-07-19 09:39:39 -07:00
local max_speed_anchor = 0.2
2021-06-09 14:06:02 -07:00
if ctrl.sneak and motorboat.motorboat_last_time_command > 0.3 and
longit_speed < max_speed_anchor and longit_speed > -max_speed_anchor then
2020-07-19 09:39:39 -07:00
motorboat.motorboat_last_time_command = 0
if self.anchored == false then
self.anchored = true
self.object:set_velocity(vector.new())
minetest.chat_send_player(self.driver_name, 'anchors away!')
else
2020-07-19 09:39:39 -07:00
self.anchored = false
minetest.chat_send_player(self.driver_name, 'weigh anchor!')
end
2021-05-06 16:58:37 -07:00
end
2020-07-19 09:39:39 -07:00
if ctrl.sneak then
if longit_speed >= max_speed_anchor or longit_speed <= -max_speed_anchor then
self.rudder_angle = 0
2020-05-03 11:50:48 -07:00
end
end
if self.anchored == false then
2021-05-06 07:57:03 -07:00
if self._engine_running then
2022-07-11 16:14:08 -07:00
local factor = 1
--increase power lever
if ctrl.up then
motorboat.powerAdjust(self, dtime, factor, 1)
end
--decrease power lever
if ctrl.down then
motorboat.powerAdjust(self, dtime, factor, -1)
if self._power_lever <= 0 and is_flying == false then
--break
if longit_speed > 0 then
engineacc = -1
if (longit_speed + engineacc) < 0 then
engineacc = longit_speed * -1
end
end
if longit_speed < 0 then
engineacc = 1
if (longit_speed + engineacc) > 0 then
engineacc = longit_speed * -1
end
end
if abs(longit_speed) == 0 then
stop = true
2021-05-06 16:58:37 -07:00
end
2020-05-03 11:50:48 -07:00
end
2021-05-06 16:58:37 -07:00
end
2022-07-11 16:14:08 -07:00
local max_engine_acc = 1.5
local engineacc = (self._power_lever * max_engine_acc) / 100;
local max_speed = 8.0
if longit_speed > max_speed then
engineacc = engineacc - (longit_speed-max_speed)
if engineacc < 0 then engineacc = 0 end
end
2020-05-03 11:50:48 -07:00
if engineacc then retval_accel=vector.add(accel,vector.multiply(hull_direction,engineacc)) end
--minetest.chat_send_all('paddle: '.. paddleacc)
else
local paddleacc
if longit_speed < 1.0 and ctrl.up then
paddleacc = 0.5
elseif longit_speed > -1.0 and ctrl.down then
paddleacc = -0.5
end
if paddleacc then retval_accel=vector.add(accel,vector.multiply(hull_direction,paddleacc)) end
--minetest.chat_send_all('paddle: '.. paddleacc)
end
end
2021-05-06 16:58:37 -07:00
if ctrl.aux1 then
2020-05-03 11:50:48 -07:00
--sets the engine running - but sets a delay also, cause keypress
2020-05-10 13:25:48 -07:00
if motorboat.motorboat_last_time_command > 0.3 then
motorboat.motorboat_last_time_command = 0
2021-05-06 07:57:03 -07:00
if self._engine_running then
self._engine_running = false
2020-05-03 11:50:48 -07:00
-- sound and animation
if self.sound_handle then
minetest.sound_stop(self.sound_handle)
self.sound_handle = nil
end
self.engine:set_animation_frame_speed(0)
2021-05-06 07:57:03 -07:00
elseif self._engine_running == false and self._energy > 0 then
self._engine_running = true
2020-05-03 11:50:48 -07:00
-- sound and animation
2022-07-11 17:08:36 -07:00
self.sound_handle = minetest.sound_play({name = "motorboat_engine"},
2022-07-11 16:14:08 -07:00
{object = self.object, gain = 1.0, pitch = 0.5, max_hear_distance = 32, loop = true,})
2020-05-03 11:50:48 -07:00
self.engine:set_animation_frame_speed(30)
end
2021-06-09 14:06:02 -07:00
end
2020-05-03 11:50:48 -07:00
end
-- rudder
local rudder_limit = 30
if ctrl.right then
self.rudder_angle = math.max(self.rudder_angle-20*dtime,-rudder_limit)
elseif ctrl.left then
self.rudder_angle = math.min(self.rudder_angle+20*dtime,rudder_limit)
end
end
return retval_accel
end