trike/trike_control.lua

161 lines
6.0 KiB
Lua

--global constants
trike.trike_last_time_command = 0
trike.vector_up = vector.new(0, 1, 0)
trike.max_engine_acc = 4.5
trike.ideal_step = 0.02
dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_utilities.lua")
function trike.check_node_below(obj)
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
function trike.control(self, dtime, hull_direction, longit_speed,
longit_drag, later_speed, later_drag, accel, player, is_flying)
trike.trike_last_time_command = trike.trike_last_time_command + self.dtime
if trike.trike_last_time_command > 1 then trike.trike_last_time_command = 1 end
if self.driver_name == nil then return end
local retval_accel = accel
local rudder_limit = 30
local stop = false
-- player control
if player then
local ctrl = player:get_player_control()
--engine and power control
if ctrl.aux1 and trike.trike_last_time_command > 0.3 then
trike.trike_last_time_command = 0
if self._engine_running then
self._engine_running = false
-- 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)
elseif self._engine_running == false and self._energy > 0 then
self._engine_running = true
-- sound and animation
self.sound_handle = minetest.sound_play({name = "trike_engine"},
{object = self.object, gain = 2.0,
pitch = 0.5 + ((self._power_lever/100)/2),max_hear_distance = 32,
loop = true,})
self.engine:set_animation_frame_speed(60)
end
end
self._acceleration = 0
if self._engine_running then
--engine acceleration calc
local engineacc = (self._power_lever * trike.max_engine_acc) / 100;
self.engine:set_animation_frame_speed(60 + self._power_lever)
local add_factor = 1
add_factor = add_factor * (dtime/trike.ideal_step) --adjusting the command speed by dtime
--increase power lever
if ctrl.jump then
if self._power_lever < 100 then
self._power_lever = self._power_lever + add_factor
end
if self._power_lever > 100 then
self._power_lever = 100
engineacc = trike.max_engine_acc
else
--sound
if self.sound_handle then
minetest.sound_stop(self.sound_handle)
self.sound_handle = minetest.sound_play({name = "trike_engine"},
{object = self.object, gain = 2.0,
pitch = 0.5 + ((self._power_lever/100)/2),max_hear_distance = 32,
loop = true,})
end
end
end
--decrease power lever
if ctrl.sneak 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 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.1 then
stop = true
end
else
--sound
minetest.sound_stop(self.sound_handle)
self.sound_handle = minetest.sound_play({name = "trike_engine"},
{object = self.object, gain = 2.0,
pitch = 0.5 + ((self._power_lever/100)/2),
max_hear_distance = 32, loop = true,})
end
end
--do not exceed
local max_speed = 6
if longit_speed > max_speed then
engineacc = engineacc - (longit_speed-max_speed)
if engineacc < 0 then engineacc = 0 end
end
self._acceleration = engineacc
else
local pushacc = 0
if longit_speed < 1.0 then
if ctrl.jump then pushacc = 0.5 end
end
if longit_speed > -1.0 then
if ctrl.sneak then pushacc = -0.5 end
end
self._acceleration = pushacc
end
local hull_acc = vector.multiply(hull_direction,self._acceleration)
retval_accel=vector.add(retval_accel,hull_acc)
--wing
local wing_limit = 10
if ctrl.down then
self._angle_of_attack = math.max(self._angle_of_attack-10*self.dtime,2)
elseif ctrl.up then
self._angle_of_attack = math.min(self._angle_of_attack+10*self.dtime,wing_limit)
end
-- yaw
if ctrl.right then
self._rudder_angle = math.max(self._rudder_angle-30*self.dtime,-rudder_limit)
elseif ctrl.left then
self._rudder_angle = math.min(self._rudder_angle+30*self.dtime,rudder_limit)
end
end
if longit_speed > 0 then
local factor = 1
if self._rudder_angle > 0 then factor = -1 end
local correction = (rudder_limit*(longit_speed/1000)) * factor
self._rudder_angle = self._rudder_angle + correction
end
return retval_accel, stop
end