Boats: Add cruise mode (boat autoforward)

Document controls in README.txt.

Optimise 'get yaw' and 'set yaw' code.
This commit is contained in:
Paramat 2018-07-03 19:52:28 +01:00 committed by GitHub
parent 876a9ca5d2
commit 59dbeebc2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 8 deletions

@ -13,3 +13,19 @@ Textures: Zeg9 (CC BY-SA 3.0)
Model: thetoon and Zeg9 (CC BY-SA 3.0),
modified by PavelS(SokolovPavel) (CC BY-SA 3.0),
modified by sofar (CC BY-SA 3.0)
Controls
--------
Right mouse button = Enter or exit boat when pointing at boat.
Forward = Speed up.
Slow down when moving backwards.
Forward + backward = Enable cruise mode: Boat will accelerate to maximum forward
speed and remain at that speed without needing to hold the
forward key.
Backward = Slow down.
Speed up when moving backwards.
Disable cruise mode.
Left = Turn to the left.
Turn to the right when moving backwards.
Right = Turn to the right.
Turn to the left when moving backwards.

@ -44,7 +44,8 @@ local boat = {
driver = nil,
v = 0,
last_v = 0,
removed = false
removed = false,
auto = false
}
@ -55,6 +56,7 @@ function boat.on_rightclick(self, clicker)
local name = clicker:get_player_name()
if self.driver and clicker == self.driver then
self.driver = nil
self.auto = false
clicker:set_detach()
player_api.player_attached[name] = false
player_api.set_animation(clicker, "stand" , 30)
@ -130,24 +132,35 @@ end
function boat.on_step(self, dtime)
self.v = get_v(self.object:get_velocity()) * get_sign(self.v)
if self.driver then
local driver_name = self.driver:get_player_name()
local ctrl = self.driver:get_player_control()
local yaw = self.object:get_yaw()
if ctrl.up then
self.v = self.v + 0.1
if ctrl.up and ctrl.down then
if not self.auto then
self.auto = true
minetest.chat_send_player(driver_name,
"[boats] Cruise on")
end
elseif ctrl.down then
self.v = self.v - 0.1
if self.auto then
self.auto = false
minetest.chat_send_player(driver_name,
"[boats] Cruise off")
end
elseif ctrl.up or self.auto then
self.v = self.v + 0.1
end
if ctrl.left then
if self.v < 0 then
self.object:set_yaw(yaw - (1 + dtime) * 0.03)
self.object:set_yaw(self.object:get_yaw() - (1 + dtime) * 0.03)
else
self.object:set_yaw(yaw + (1 + dtime) * 0.03)
self.object:set_yaw(self.object:get_yaw() + (1 + dtime) * 0.03)
end
elseif ctrl.right then
if self.v < 0 then
self.object:set_yaw(yaw + (1 + dtime) * 0.03)
self.object:set_yaw(self.object:get_yaw() + (1 + dtime) * 0.03)
else
self.object:set_yaw(yaw - (1 + dtime) * 0.03)
self.object:set_yaw(self.object:get_yaw() - (1 + dtime) * 0.03)
end
end
end