mirror of
https://github.com/APercy/airutils.git
synced 2025-03-22 19:02:20 +00:00
improved reload and controls
This commit is contained in:
parent
211b404760
commit
1678a6b1c7
4 changed files with 98 additions and 19 deletions
|
@ -46,15 +46,11 @@ function airutils.control(self, dtime, hull_direction, longit_speed, longit_drag
|
||||||
--engine and power control
|
--engine and power control
|
||||||
if ctrl.aux1 and self._last_time_command > 0.5 then
|
if ctrl.aux1 and self._last_time_command > 0.5 then
|
||||||
self._last_time_command = 0
|
self._last_time_command = 0
|
||||||
if self._engine_running then
|
if self._yaw_by_mouse == true then
|
||||||
self._engine_running = false
|
self._yaw_by_mouse = false
|
||||||
self._autopilot = false
|
else
|
||||||
self._power_lever = 0 --zero power
|
self._yaw_by_mouse = true
|
||||||
self._last_applied_power = 0 --zero engine
|
end
|
||||||
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
|
end
|
||||||
|
|
||||||
self._acceleration = 0
|
self._acceleration = 0
|
||||||
|
@ -113,13 +109,22 @@ function airutils.control(self, dtime, hull_direction, longit_speed, longit_drag
|
||||||
|
|
||||||
--pitch
|
--pitch
|
||||||
local pitch_cmd = 0
|
local pitch_cmd = 0
|
||||||
if ctrl.up then pitch_cmd = 1 elseif ctrl.down then pitch_cmd = -1 end
|
if self._yaw_by_mouse == true then
|
||||||
airutils.set_pitch(self, pitch_cmd, dtime)
|
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
|
-- yaw
|
||||||
local yaw_cmd = 0
|
local yaw_cmd = 0
|
||||||
if ctrl.right then yaw_cmd = 1 elseif ctrl.left then yaw_cmd = -1 end
|
if self._yaw_by_mouse == true then
|
||||||
airutils.set_yaw(self, yaw_cmd, dtime)
|
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!
|
--I'm desperate, center all!
|
||||||
if ctrl.right and ctrl.left then
|
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
|
return retval_accel, stop
|
||||||
end
|
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)
|
function airutils.set_pitch(self, dir, dtime)
|
||||||
local pitch_factor = self._pitch_intensity or 0.6
|
local pitch_factor = self._pitch_intensity or 0.6
|
||||||
local multiplier = pitch_factor*(dtime/airutils.ideal_step)
|
local multiplier = pitch_factor*(dtime/airutils.ideal_step)
|
||||||
|
@ -159,6 +172,27 @@ function airutils.set_pitch(self, dir, dtime)
|
||||||
end
|
end
|
||||||
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)
|
function airutils.set_yaw(self, dir, dtime)
|
||||||
local yaw_factor = self._yaw_intensity or 25
|
local yaw_factor = self._yaw_intensity or 25
|
||||||
if dir == 1 then
|
if dir == 1 then
|
||||||
|
|
|
@ -442,7 +442,8 @@ function airutils.logic(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
if player then
|
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})
|
player:set_eye_offset(new_eye_offset, {x = 0, y = 1, z = -30})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,24 @@ end
|
||||||
function airutils.pilot_formspec(name)
|
function airutils.pilot_formspec(name)
|
||||||
local basic_form = table.concat({
|
local basic_form = table.concat({
|
||||||
"formspec_version[3]",
|
"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]"
|
local player = minetest.get_player_by_name(name)
|
||||||
basic_form = basic_form.."button[1,2.5;4,1;hud;Show/Hide Gauges]"
|
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)
|
minetest.show_formspec(name, "lib_planes:pilot_main", basic_form)
|
||||||
end
|
end
|
||||||
|
@ -31,6 +44,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
local plane_obj = airutils.getPlaneFromPlayer(player)
|
local plane_obj = airutils.getPlaneFromPlayer(player)
|
||||||
if plane_obj then
|
if plane_obj then
|
||||||
local ent = plane_obj:get_luaentity()
|
local ent = plane_obj:get_luaentity()
|
||||||
|
if fields.turn_on then
|
||||||
|
airutils.start_engine(ent)
|
||||||
|
end
|
||||||
if fields.hud then
|
if fields.hud then
|
||||||
if ent._show_hud == true then
|
if ent._show_hud == true then
|
||||||
ent._show_hud = false
|
ent._show_hud = false
|
||||||
|
@ -64,8 +80,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
ent._instruction_mode = true
|
ent._instruction_mode = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
airutils.dettachPlayer(ent, player)
|
airutils.dettachPlayer(ent, player)
|
||||||
end
|
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
|
end
|
||||||
minetest.close_formspec(name, "lib_planes:pilot_main")
|
minetest.close_formspec(name, "lib_planes:pilot_main")
|
||||||
end
|
end
|
||||||
|
|
|
@ -317,7 +317,7 @@ function airutils.testImpact(self, velocity, position)
|
||||||
fade = 0.0,
|
fade = 0.0,
|
||||||
pitch = 1.0,
|
pitch = 1.0,
|
||||||
}, true)
|
}, true)
|
||||||
self.hp_max = self.hp_max - 5
|
self.hp_max = self.hp_max - self._damage_by_wind_speed
|
||||||
if self.driver_name then
|
if self.driver_name then
|
||||||
local player_name = self.driver_name
|
local player_name = self.driver_name
|
||||||
airutils.setText(self, self.infotext)
|
airutils.setText(self, self.infotext)
|
||||||
|
@ -585,6 +585,18 @@ function airutils.add_destruction_effects(pos, radius)
|
||||||
})
|
})
|
||||||
end
|
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)
|
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
|
--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
|
yaw = math.rad(360) - yaw
|
||||||
|
@ -594,13 +606,16 @@ function airutils.get_xz_from_hipotenuse(orig_x, orig_z, yaw, distance)
|
||||||
end
|
end
|
||||||
|
|
||||||
function airutils.camera_reposition(player, pitch, roll)
|
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 player_properties = player:get_properties()
|
||||||
local new_eye_offset = vector.new()
|
local new_eye_offset = vector.new()
|
||||||
local z, y = airutils.get_xz_from_hipotenuse(0, player_properties.eye_height, pitch, player_properties.eye_height)
|
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.z = z*7
|
||||||
new_eye_offset.y = y*1.5
|
new_eye_offset.y = y*1.5
|
||||||
local x, _ = airutils.get_xz_from_hipotenuse(0, player_properties.eye_height, roll, player_properties.eye_height)
|
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
|
return new_eye_offset
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue