Skip to content
This repository has been archived by the owner on May 23, 2023. It is now read-only.

Commit

Permalink
MP: do not slow down for player driven unloader #6536 (#6591)
Browse files Browse the repository at this point in the history
Now the combine checks if a nearby vehicle is driven by the player
and won't slow down if this vehicle is in the proximity sensor's range.
  • Loading branch information
pvaiko authored Dec 30, 2020
1 parent 79a61f5 commit 5b7497b
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 41 deletions.
44 changes: 37 additions & 7 deletions AIDriver.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1908,6 +1908,11 @@ function AIDriver:checkSafetyConstraints(maxSpeed, allowedToDrive, moveForwards)
return math.min(proximityLimitedSpeed, trafficLimitedSpeed), allowedToDrive, moveForwards
end

------------------------------------------------------------------------------------------------------------------------
--- Proximity sensor control
------------------------------------------------------------------------------------------------------------------------
--- proximity speed control enabled/disabled: if disabled, all of the vehicle's proximity sensors are deactivated and
--- won't see anything, therefore, no stopping/slowing down/swerving on obstacles
function AIDriver:enableProximitySpeedControl()
self.proximitySpeedControlEnabled = true
end
Expand All @@ -1920,6 +1925,8 @@ function AIDriver:isProximitySpeedControlEnabled()
return self.proximitySpeedControlEnabled
end

--- proximity swerve enabled/disabled: will try to swerve for other vehicles when enabled. Will swerve for CP driven
--- vehicles only when driving in a different direction (heading difference > 45 degrees)
function AIDriver:enableProximitySwerve()
self.proximitySwerveEnabled = true
end
Expand All @@ -1928,10 +1935,20 @@ function AIDriver:disableProximitySwerve()
self.proximitySwerveEnabled = false
end

--- proximity swerve enabled is checked with isProximitySwerveEnabled() and thus can be extended in derived classes with
--- checking for the specific vehicle.
function AIDriver:isProximitySwerveEnabled(vehicle)
return self.proximitySwerveEnabled
end


--- proximity slow down: slowing down when close to another vehicle
--- proximity slow down is checked with isProximitySlowDownEnabled() and thus can be extended in derived classes with
--- checking for the specific vehicle.
function AIDriver:isProximitySlowDownEnabled(vehicle)
return true
end

--- Temporarily ignore vehicle for the forward proximity sensor
function AIDriver:ignoreVehicleProximity(vehicleToIgnore, ttlMs)
if self.forwardLookingProximitySensorPack then
Expand Down Expand Up @@ -1961,6 +1978,7 @@ AIDriver.psStateNoVehicle = {name = 'no vehicle'}
AIDriver.psStateReverse = {name = 'reverse'}
AIDriver.psStateSwerve = {name = 'swerve'}
AIDriver.psStateSlowDown = {name = 'slow down'}
AIDriver.psStateSlowDownDisabled = {name = 'slow down disabled'}
AIDriver.psStateReverse = {name = 'reverse'}
AIDriver.psStateStop = {name = 'stop'}

Expand Down Expand Up @@ -2026,14 +2044,16 @@ function AIDriver:checkProximitySensor(maxSpeed, allowedToDrive, moveForwards)
debug(AIDriver.psStateNoObstacle, '')
return maxSpeed, allowedToDrive, moveForwards
end
-- something in range, reduce speed proportionally

-- something in range, reduce speed proportionally when enabled
local deltaV = maxSpeed - AIDriver.proximityMinLimitedSpeed
local newSpeed = AIDriver.proximityMinLimitedSpeed + normalizedD * deltaV
local slowSpeed = AIDriver.proximityMinLimitedSpeed + normalizedD * deltaV
local newSpeed = maxSpeed
local sameDirection = TurnContext.isSameDirection(
AIDriverUtil.getDirectionNode(self.vehicle), AIDriverUtil.getDirectionNode(vehicle), 45)
-- check for nil and NaN
if deg and deg == deg and self:isProximitySwerveEnabled(vehicle) and
(not sameDirection or not vehicle:getIsCourseplayDriving())then
(not sameDirection or not vehicle:getIsCourseplayDriving()) then
local dx = dAvg * math.sin(math.rad(deg))
-- which direction to swerve (have a little bias for right, sorry UK folks :)
local dir = dx > -1.2 and 1 or -1
Expand All @@ -2044,13 +2064,23 @@ function AIDriver:checkProximitySensor(maxSpeed, allowedToDrive, moveForwards)
local error = setPoint - dx
local offsetChange = 0.5 * error
self.course:changeTemporaryOffsetX(offsetChange, 1000)
debug(AIDriver.psStateSwerve, 'dAvg = %.1f (%d), slow down, speed = %.1f, swerve dx = %.1f, setPoint = %.1f, error = %.1f, offsetChange = %.1f',
-- always slow down when swerving
newSpeed = slowSpeed
debug(AIDriver.psStateSwerve, 'dAvg = %.1f (%d), speed = %.1f, swerve dx = %.1f, setPoint = %.1f, error = %.1f, offsetChange = %.1f',
dAvg, 100 * normalizedD, newSpeed, dx, setPoint, error, offsetChange)
else
self:setInfoText('SLOWING_DOWN_FOR_TRAFFIC')
if self:isProximitySlowDownEnabled(vehicle) then
newSpeed = slowSpeed
self:setInfoText('SLOWING_DOWN_FOR_TRAFFIC')
debug(AIDriver.psStateSlowDown, 'proximity: d = %.1f (%d), speed = %.1f, deg = %.1f',
d, 100 * normalizedD, newSpeed, deg)
else
newSpeed = maxSpeed
debug(AIDriver.psStateSlowDownDisabled, 'proximity: d = %.1f (%d), speed = %.1f, deg = %.1f',
d, 100 * normalizedD, newSpeed, deg)
end
-- not swerving, reset offset
self.course:setTemporaryOffset(0, 0, 6000)
debug(AIDriver.psStateSlowDown, 'proximity: d = %.1f (%d), slow down, speed = %.1f, deg = %.1f',
d, 100 * normalizedD, newSpeed, deg)
end
return newSpeed, allowedToDrive, moveForwards
end
Expand Down
23 changes: 22 additions & 1 deletion CombineAIDriver.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1602,4 +1602,25 @@ function CombineAIDriver:addForwardProximitySensor()
self:setFrontMarkerNode(self.vehicle)
self.forwardLookingProximitySensorPack = WideForwardLookingProximitySensorPack(
self.vehicle, self.ppc, self:getFrontMarkerNode(self.vehicle), self.proximitySensorRange, 1, self.vehicle.cp.workWidth)
end
end

--- Check the vehicle in the proximity sensor's range. If it is player driven, don't slow them down when hitting this
--- vehicle.
--- Note that we don't really know if the player is to unload the combine, this will disable all proximity check for
--- player driven vehicles.
function CombineAIDriver:isProximitySlowDownEnabled(vehicle)
-- if not on fieldwork, always enable slowing down
if self.state ~= self.states.ON_FIELDWORK_COURSE then return true end

-- CP drives other vehicle, it'll take care of everything, including enable/disable
-- the proximity sensor when unloading
if vehicle.cp.driver and vehicle.cp.driver.isActive and vehicle.cp.driver:isActive() then return true end

if vehicle and vehicle:getIsEntered() then
self:debugSparse('human player in nearby %s not driven by CP so do not slow down for it', nameNum(vehicle))
-- trust the player to avoid collisions
return false
else
return true
end
end
31 changes: 0 additions & 31 deletions CombineUnloadAIDriver.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2073,37 +2073,6 @@ function CombineUnloadAIDriver:drawDebugInfo()

end


--- If the player drives the unloader, check the vicinity for combines driven by courseplay
--- and tell them to ignore this vehicle so their proximity sensor won't slow them down when hitting this vehicle.
--- Note that we don't really know if the player is to unload the combine, this will disable all proximity check for
--- player driven vehicles.
function CombineUnloadAIDriver.disableProximitySensorForNonCourseplayDriver(unloader)
if not g_server then return end
-- CP drives unloader, it'll take care of everything
if unloader.cp.driver and unloader.cp.driver.isActive and unloader.cp.driver:isActive() then return end
-- TODO: maybe check for AutoDrive? Or better provide and interface to AutoDrive to disable the proximity sensor?
-- no player in unloader, so do not ignore this vehicle
if not unloader:getIsEntered() then return end

-- find combines driven by CP around unloader
if g_currentMission then
for _, vehicle in pairs(g_currentMission.vehicles) do
if vehicle.cp.driver and vehicle.cp.driver.is_a and vehicle.cp.driver:is_a(CombineAIDriver) then
local d = calcDistanceFrom(unloader.rootNode, vehicle.rootNode)
if d < CombineUnloadAIDriver.safeManeuveringDistance then
vehicle.cp.driver:ignoreVehicleProximity(unloader, 3000)
--TODO: figure out a possible debug channel, if needed

--if g_updateLoopIndex % 500 == 0 then
--courseplay.infoVehicle(vehicle, 'Proximity sensor deactivated for player driven %s', nameNum(unloader))
--end
end
end
end
end
end

function CombineUnloadAIDriver:renderText(x, y, ...)

if not courseplay.debugChannels[self.debugChannel] then return end
Expand Down
2 changes: 0 additions & 2 deletions base.lua
Original file line number Diff line number Diff line change
Expand Up @@ -773,8 +773,6 @@ function courseplay:onUpdate(dt)
courseplay:record(self);
end;

CombineUnloadAIDriver.disableProximitySensorForNonCourseplayDriver(self)

-- we are in drive mode and single player /MP server
if self.cp.isDriving and g_server ~= nil then
for refIdx,_ in pairs(CpManager.globalInfoText.msgReference) do
Expand Down

0 comments on commit 5b7497b

Please sign in to comment.