improved reload and controls

This commit is contained in:
Alexsandro Percy 2023-06-27 20:21:25 -03:00
parent 211b404760
commit 1678a6b1c7
4 changed files with 98 additions and 19 deletions

View file

@ -46,15 +46,11 @@ function airutils.control(self, dtime, hull_direction, longit_speed, longit_drag
--engine and power control
if ctrl.aux1 and self._last_time_command > 0.5 then
self._last_time_command = 0
if self._engine_running then
self._engine_running = false
self._autopilot = false
self._power_lever = 0 --zero power
self._last_applied_power = 0 --zero engine
elseif self._engine_running == false and self._energy > 0 then
self._engine_running = true
self._last_applied_power = -1 --send signal to start
end
if self._yaw_by_mouse == true then
self._yaw_by_mouse = false
else
self._yaw_by_mouse = true
end
end
self._acceleration = 0
@ -113,13 +109,22 @@ function airutils.control(self, dtime, hull_direction, longit_speed, longit_drag
--pitch
local pitch_cmd = 0
if ctrl.up then pitch_cmd = 1 elseif ctrl.down then pitch_cmd = -1 end
airutils.set_pitch(self, pitch_cmd, dtime)
if self._yaw_by_mouse == true then
airutils.set_pitch_by_mouse(self, player)
else
if ctrl.up then pitch_cmd = 1 elseif ctrl.down then pitch_cmd = -1 end
airutils.set_pitch(self, pitch_cmd, dtime)
end
-- yaw
local yaw_cmd = 0
if ctrl.right then yaw_cmd = 1 elseif ctrl.left then yaw_cmd = -1 end
airutils.set_yaw(self, yaw_cmd, dtime)
if self._yaw_by_mouse == true then
local rot_y = math.deg(player:get_look_horizontal())
airutils.set_yaw_by_mouse(self, rot_y)
else
if ctrl.right then yaw_cmd = 1 elseif ctrl.left then yaw_cmd = -1 end
airutils.set_yaw(self, yaw_cmd, dtime)
end
--I'm desperate, center all!
if ctrl.right and ctrl.left then
@ -145,6 +150,14 @@ function airutils.control(self, dtime, hull_direction, longit_speed, longit_drag
return retval_accel, stop
end
function airutils.set_pitch_by_mouse(self, player)
local vehicle_rot = self.object:get_rotation()
local rot_x = player:get_look_vertical()-vehicle_rot.x
self._elevator_angle = -(rot_x * self._elevator_limit)*5
if self._elevator_angle > self._elevator_limit then self._elevator_angle = self._elevator_limit end
if self._elevator_angle < -self._elevator_limit then self._elevator_angle = -self._elevator_limit end
end
function airutils.set_pitch(self, dir, dtime)
local pitch_factor = self._pitch_intensity or 0.6
local multiplier = pitch_factor*(dtime/airutils.ideal_step)
@ -159,6 +172,27 @@ function airutils.set_pitch(self, dir, dtime)
end
end
function airutils.set_yaw_by_mouse(self, dir)
local rotation = self.object:get_rotation()
local rot_y = math.deg(rotation.y)
local total = math.abs(math.floor(rot_y/360))
if rot_y < 0 then rot_y = rot_y + (360*total) end
if rot_y > 360 then rot_y = rot_y - (360*total) end
if rot_y >= 270 and dir <= 90 then dir = dir + 360 end
if rot_y <= 90 and dir >= 270 then dir = dir - 360 end
local intensity = 2
if self._intensity then intensity = self._intensity end
local command = (rot_y - dir) * intensity
if command < -90 then command = -90
elseif command > 90 then command = 90 end
--minetest.chat_send_all("rotation y: "..rot_y.." - dir: "..dir.." - command: "..command)
self._rudder_angle = (-command * self._rudder_limit)/90
end
function airutils.set_yaw(self, dir, dtime)
local yaw_factor = self._yaw_intensity or 25
if dir == 1 then

View file

@ -442,7 +442,8 @@ function airutils.logic(self)
end
if player then
local new_eye_offset = airutils.camera_reposition(player, newpitch, math.rad(self._rudder_angle))
--minetest.chat_send_all(dump(newroll))
local new_eye_offset = airutils.camera_reposition(player, newpitch, newroll)
player:set_eye_offset(new_eye_offset, {x = 0, y = 1, z = -30})
end

View file

@ -16,11 +16,24 @@ end
function airutils.pilot_formspec(name)
local basic_form = table.concat({
"formspec_version[3]",
"size[6,6]",
"size[6.0,7.0]",
}, "")
basic_form = basic_form.."button[1,1.0;4,1;go_out;Go Offboard]"
basic_form = basic_form.."button[1,2.5;4,1;hud;Show/Hide Gauges]"
local player = minetest.get_player_by_name(name)
local plane_obj = airutils.getPlaneFromPlayer(player)
if plane_obj == nil then
return
end
local ent = plane_obj:get_luaentity()
local yaw = "false"
if ent._yaw_by_mouse then yaw = "true" end
basic_form = basic_form.."button[1,1.0;4,1;turn_on;Start/Stop Engines]"
basic_form = basic_form.."button[1,2.1;4,1;go_out;Go Offboard]"
basic_form = basic_form.."button[1,3.2;4,1;hud;Show/Hide Gauges]"
basic_form = basic_form.."button[1,4.3;4,1;inventory;Show Inventory]"
basic_form = basic_form.."checkbox[1,5.7;yaw;Yaw by mouse;"..yaw.."]"
minetest.show_formspec(name, "lib_planes:pilot_main", basic_form)
end
@ -31,6 +44,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local plane_obj = airutils.getPlaneFromPlayer(player)
if plane_obj then
local ent = plane_obj:get_luaentity()
if fields.turn_on then
airutils.start_engine(ent)
end
if fields.hud then
if ent._show_hud == true then
ent._show_hud = false
@ -64,8 +80,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
ent._instruction_mode = true
end
end
airutils.dettachPlayer(ent, player)
end
if fields.inventory then
if ent._trunk_slots then
airutils.show_vehicle_trunk_formspec(ent, player, ent._trunk_slots)
end
end
if fields.yaw then
if ent._yaw_by_mouse == true then
ent._yaw_by_mouse = false
else
ent._yaw_by_mouse = true
end
end
end
minetest.close_formspec(name, "lib_planes:pilot_main")
end

View file

@ -317,7 +317,7 @@ function airutils.testImpact(self, velocity, position)
fade = 0.0,
pitch = 1.0,
}, true)
self.hp_max = self.hp_max - 5
self.hp_max = self.hp_max - self._damage_by_wind_speed
if self.driver_name then
local player_name = self.driver_name
airutils.setText(self, self.infotext)
@ -585,6 +585,18 @@ function airutils.add_destruction_effects(pos, radius)
})
end
function airutils.start_engine(self)
if self._engine_running then
self._engine_running = false
self._autopilot = false
self._power_lever = 0 --zero power
self._last_applied_power = 0 --zero engine
elseif self._engine_running == false and self._energy > 0 then
self._engine_running = true
self._last_applied_power = -1 --send signal to start
end
end
function airutils.get_xz_from_hipotenuse(orig_x, orig_z, yaw, distance)
--cara, o minetest é bizarro, ele considera o eixo no sentido ANTI-HORÁRIO... Então pra equação funcionar, subtrair o angulo de 360 antes
yaw = math.rad(360) - yaw
@ -594,13 +606,16 @@ function airutils.get_xz_from_hipotenuse(orig_x, orig_z, yaw, distance)
end
function airutils.camera_reposition(player, pitch, roll)
if roll < -0.4 then roll = -0.4 end
if roll > 0.4 then roll = 0.4 end
local player_properties = player:get_properties()
local new_eye_offset = vector.new()
local z, y = airutils.get_xz_from_hipotenuse(0, player_properties.eye_height, pitch, player_properties.eye_height)
new_eye_offset.z = z*7
new_eye_offset.y = y*1.5
local x, _ = airutils.get_xz_from_hipotenuse(0, player_properties.eye_height, roll, player_properties.eye_height)
new_eye_offset.x = x*7
new_eye_offset.x = -x*15
return new_eye_offset
end