Warehose v0.6.6

WAREHOUSE:
- Improved parking spot check for airbase ship.
AI_FORMATION:
- Added Stop option
CT:
- fixes
COORDINATE:
- Improved landing waypoint.
This commit is contained in:
Frank 2018-10-28 13:15:38 +01:00
parent b754972490
commit 1a4baeafb6
5 changed files with 71 additions and 40 deletions

View File

@ -911,7 +911,17 @@ end
-- @param #string From From state.
-- @param #string Event Event.
-- @pram #string To The to state.
function AI_FORMATION:onbeforeFollowing( FollowGroupSet, From, Event, To ) --R2.1
function AI_FORMATION:onafterStop(FollowGroupSet, From, Event, To) --R2.1
self:E("Stopping formation.")
end
--- Follow event fuction. Check if coming from state "stopped". If so the transition is rejected.
-- @param #AI_FORMATION self
-- @param Core.Set#SET_GROUP FollowGroupSet The following set of groups.
-- @param #string From From state.
-- @param #string Event Event.
-- @pram #string To The to state.
function AI_FORMATION:onbeforeFollow( FollowGroupSet, From, Event, To ) --R2.1
if From=="Stopped" then
return false -- Deny transition.
end

View File

@ -1121,6 +1121,9 @@ do -- COORDINATE
--- Build a Waypoint Air "Landing".
-- @param #COORDINATE self
-- @param DCS#Speed Speed Airspeed in km/h.
-- @param Wrapper.Airbase#AIRBASE airbase The airbase for takeoff and landing points.
-- @param #table DCSTasks A table of @{DCS#Task} items which are executed at the waypoint.
-- @param #string description A text description of the waypoint, which will be shown on the F10 map.
-- @return #table The route point.
-- @usage
--
@ -1129,8 +1132,8 @@ do -- COORDINATE
-- LandingWaypoint = LandingCoord:WaypointAirLanding( 60 )
-- HeliGroup:Route( { LandWaypoint }, 1 ) -- Start landing the helicopter in one second.
--
function COORDINATE:WaypointAirLanding( Speed )
return self:WaypointAir( nil, COORDINATE.WaypointType.Land, COORDINATE.WaypointAction.Landing, Speed )
function COORDINATE:WaypointAirLanding( Speed, airbase, DCSTasks, description )
return self:WaypointAir( nil, COORDINATE.WaypointType.Land, COORDINATE.WaypointAction.Landing, Speed, airbase, DCSTasks, description )
end

View File

@ -153,7 +153,7 @@ CARRIERTRAINER.MenuF10={}
--- Carrier trainer class version.
-- @field #string version
CARRIERTRAINER.version="0.1.1w"
CARRIERTRAINER.version="0.1.1"
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Constructor
@ -407,6 +407,7 @@ function CARRIERTRAINER:_InitNewRound(playerData)
playerData.step=0
playerData.score=100
playerData.grade={}
playerData.debrief={}
playerData.summary = "Debriefing:\n"
playerData.longDownwindDone = false
playerData.boltered=false
@ -423,7 +424,7 @@ end
-- @param #string item Text item appeded to the debrief.
function CARRIERTRAINER:_AddToSummary(playerData, step, item)
--playerData.summary = playerData.summary .. item .. "\n"
table.inser(playerData.debrief, {step=step, hint=item})
table.insert(playerData.debrief, {step=step, hint=item})
end
--- Append text to result text.
@ -671,7 +672,7 @@ function CARRIERTRAINER:_AbortPattern(playerData, X, Z, posData)
self:E(self.lid..text)
--MESSAGE:New(text, 60):ToAllIf(self.Debug)
self:_AddToSummary(playerData, "Approach aborted.")
self:_AddToSummary(playerData, "Abort", "Approach aborted.")
self:_PrintFinalScore(playerData, 30, -2)
@ -805,8 +806,8 @@ function CARRIERTRAINER:_InitStennis()
self.Wake.Zmax=nil
self.Wake.LimitXmin=nil
self.Wake.LimitXmax=nil
self.Wake.LimitZmin=nil
self.Wake.LimitZmax=0
self.Wake.LimitZmin=0
self.Wake.LimitZmax=nil
self.Wake.Altitude=UTILS.FeetToMeters(370)
self.Wake.AoA=8.1
self.Wake.Distance=nil
@ -927,7 +928,7 @@ function CARRIERTRAINER:_Upwind(playerData)
self:_SendMessageToPlayer(hint, 8, playerData)
-- Debrief.
self:_AddToSummary(playerData, hint)
self:_AddToSummary(playerData, "Entering the Break", hint)
-- Next step.
playerData.step=3
@ -968,8 +969,12 @@ function CARRIERTRAINER:_Break(playerData, part)
-- Send message to player.
self:_SendMessageToPlayer(hint, 10, playerData)
-- Debrif
self:_AddToSummary(playerData, hint)
-- Debrief
if part =="late" then
self:_AddToSummary(playerData, "Late Break", hint)
else
self:_AddToSummary(playerData, "Early Entry", hint)
end
-- Nest step: late break or abeam.
if (part == "early") then
@ -1003,7 +1008,7 @@ function CARRIERTRAINER:_CheckForLongDownwind(playerData)
self:_SendMessageToPlayer(hint, 10, playerData)
-- Debrief.
self:_AddToSummary(playerData, hint)
self:_AddToSummary(playerData, "Long Downwind Leg", hint)
-- Decrease score.
playerData.score=playerData.score-40
@ -1058,7 +1063,7 @@ function CARRIERTRAINER:_Abeam(playerData)
self:_SendMessageToPlayer(hintFull, 10, playerData)
-- Add to debrief.
self:_AddToSummary(playerData, "Abeam", hintFull)
self:_AddToSummary(playerData, "Abeam Position", hintFull)
-- Proceed to next step.
playerData.step = 6
@ -1101,7 +1106,7 @@ function CARRIERTRAINER:_Ninety(playerData)
self:_SendMessageToPlayer(hintFull, 10, playerData)
-- Add to debrief.
self:_AddToSummary(playerData, "At the 90:", hintFull)
self:_AddToSummary(playerData, "At the 90", hintFull)
-- Long downwind not an issue any more
playerData.longDownwindDone = true
@ -1144,7 +1149,7 @@ function CARRIERTRAINER:_Wake(playerData)
self:_SendMessageToPlayer(hintFull, 10, playerData)
-- Add to debrief.
self:_AddToSummary(playerData, "At the wake:", hintFull)
self:_AddToSummary(playerData, "At the Wake", hintFull)
-- Next step: Groove.
playerData.step = 8
@ -1195,7 +1200,7 @@ function CARRIERTRAINER:_Groove(playerData)
self:_SendMessageToPlayer(hintFull, 10, playerData)
-- Add to debrief.
self:_AddToSummary(playerData, "Entering the Groove:", hintFull)
self:_AddToSummary(playerData, "Entering the Groove", hintFull)
-- Next step.
playerData.step = 9
@ -1235,7 +1240,10 @@ function CARRIERTRAINER:_CallTheBall(playerData)
local glideslopeError = math.deg(glideslope) - 3.5
if diffX>-UTILS.NMToMeters(0.75) and diffX<-100 and playerData.calledball==false then
self:_SendMessageToPlayer("Call the ball.", 8, playerData)
playerData.calledball=true
return
end
-- Check if we are beween 3/4 NM and end of ship.
if diffX>-UTILS.NMToMeters(0.75) and diffX<-100 then
@ -1296,7 +1304,7 @@ function CARRIERTRAINER:_CallTheBall(playerData)
self:_SendMessageToPlayer( hint, 8, playerData )
self:_PrintScore(score, playerData, true)
self:_AddToSummary(playerData, hint)
self:_AddToSummary(playerData, "Calling the Ball", hint)
self:_PrintFinalScore(playerData, 60, wire)
self:_HandleCollectedResult(playerData, wire)
@ -1348,7 +1356,7 @@ function CARRIERTRAINER:_Trapped(playerData, pos)
local fullHint = string.format("Trapped catching the %d-wire.", wire)
self:_AddToSummary(playerData, fullHint)
self:_AddToSummary(playerData, "Trapped", fullHint)
else
--Boltered!
@ -1766,16 +1774,19 @@ function CARRIERTRAINER:_HandleCollectedResult(playerData, wire)
playerData.totalscore = playerData.totalscore + playerData.score
playerData.passes = playerData.passes + 1
--TODO: collect results
--[[
if playerData.collectedResultString == "" then
playerData.collectedResultString = newString
else
playerData.collectedResultString = playerData.collectedResultString .. ", " .. newString
MessageToAll( playerData.callsign .. "'s " .. playerData.passes .. " passes: " .. playerData.collectedResultString .. " (TOTAL: " .. playerData.totalscore .. ")" , 30, "CollectedResult" )
end
]]
local heading=playerData.unit:GetCoordinate():HeadingTo(self.startZone:GetCoordinate())
local distance=playerData.unit:GetCoordinate():Get2DDistance(self.startZone:GetCoordinate())
local text=string.format("%s, fly heading %d for %d nm to restart the pattern.", playerData.callsign, heading, UTILS.MetersToNM(distance))
local heading=playerData.unit:GetCoordinate():HeadingTo(self.registerZone:GetCoordinate())
local distance=playerData.unit:GetCoordinate():Get2DDistance(self.registerZone:GetCoordinate())
local text=string.format("%s, fly heading %d for %d NM to restart the pattern.", playerData.callsign, heading, UTILS.MetersToNM(distance))
--"Return south 4 nm (over the trailing ship), towards WP 1, to restart the pattern."
self:_SendMessageToPlayer(text, 30, playerData)
end

View File

@ -1729,7 +1729,7 @@ WAREHOUSE.db = {
--- Warehouse class version.
-- @field #string version
WAREHOUSE.version="0.6.5"
WAREHOUSE.version="0.6.6"
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO: Warehouse todo list.
@ -6318,25 +6318,26 @@ function WAREHOUSE:_CheckRequestValid(request)
-- TODO: maybe only check if spots > 0 for the necessary terminal type? At least for FARPS.
-- Get necessary terminal type.
local termtype=self:_GetTerminal(asset.attribute)
local termtype_dep=self:_GetTerminal(asset.attribute, self:GetAirbaseCategory())
local termtype_des=self:_GetTerminal(asset.attribute, request.warehouse:GetAirbaseCategory())
-- Get number of parking spots.
local np_departure=self.airbase:GetParkingSpotsNumber(termtype)
local np_destination=request.airbase:GetParkingSpotsNumber(termtype)
local np_departure=self.airbase:GetParkingSpotsNumber(termtype_dep)
local np_destination=request.airbase:GetParkingSpotsNumber(termtype_des)
-- Debug info.
self:T(string.format("Asset attribute = %s, terminal type = %d, spots at departure = %d, destination = %d", asset.attribute, termtype, np_departure, np_destination))
self:T(string.format("Asset attribute = %s, DEPARTURE: terminal type = %d, spots = %d, DESTINATION: terminal type = %d, spots = %d", asset.attribute, termtype_dep, np_departure, termtype_des, np_destination))
-- Not enough parking at sending warehouse.
--if (np_departure < request.nasset) and not (self.category==Airbase.Category.SHIP or self.category==Airbase.Category.HELIPAD) then
if np_departure < nasset then
self:E(string.format("ERROR: Incorrect request. Not enough parking spots of terminal type %d at warehouse. Available spots %d < %d necessary.", termtype, np_departure, nasset))
self:E(string.format("ERROR: Incorrect request. Not enough parking spots of terminal type %d at warehouse. Available spots %d < %d necessary.", termtype_dep, np_departure, nasset))
valid=false
end
-- No parking at requesting warehouse.
if np_destination == 0 then
self:E(string.format("ERROR: Incorrect request. No parking spots of terminal type %d at requesting warehouse. Available spots = %d!", termtype, np_destination))
self:E(string.format("ERROR: Incorrect request. No parking spots of terminal type %d at requesting warehouse. Available spots = %d!", termtype_des, np_destination))
valid=false
end
@ -6474,7 +6475,7 @@ function WAREHOUSE:_CheckRequestValid(request)
self:T(text)
-- Get necessary terminal type for helos or transport aircraft.
local termtype=self:_GetTerminal(request.transporttype)
local termtype=self:_GetTerminal(request.transporttype, self:GetAirbaseCategory())
-- Get number of parking spots.
local np_departure=self.airbase:GetParkingSpotsNumber(termtype)
@ -6493,6 +6494,7 @@ function WAREHOUSE:_CheckRequestValid(request)
if request.transporttype==WAREHOUSE.TransportType.AIRPLANE then
-- Total number of parking spots for transport planes at destination.
termtype=self:_GetTerminal(request.transporttype, request.warehouse:GetAirbaseCategory())
local np_destination=request.airbase:GetParkingSpotsNumber(termtype)
-- Debug info.
@ -6934,13 +6936,13 @@ end
--- Get the proper terminal type based on generalized attribute of the group.
--@param #WAREHOUSE self
--@param #WAREHOUSE.Attribute _attribute Generlized attibute of unit.
--@param #number _category Airbase category.
--@return Wrapper.Airbase#AIRBASE.TerminalType Terminal type for this group.
function WAREHOUSE:_GetTerminal(_attribute)
function WAREHOUSE:_GetTerminal(_attribute, _category)
-- Default terminal is "large".
local _terminal=AIRBASE.TerminalType.OpenBig
if _attribute==WAREHOUSE.Attribute.AIR_FIGHTER then
-- Fighter ==> small.
_terminal=AIRBASE.TerminalType.FighterAircraft
@ -6950,6 +6952,15 @@ function WAREHOUSE:_GetTerminal(_attribute)
elseif _attribute==WAREHOUSE.Attribute.AIR_TRANSPORTHELO or _attribute==WAREHOUSE.Attribute.AIR_ATTACKHELO then
-- Helicopter.
_terminal=AIRBASE.TerminalType.HelicopterUsable
else
--_terminal=AIRBASE.TerminalType.OpenMedOrBig
end
-- For ships, we allow medium spots for all fixed wing aircraft. There are smaller tankers and AWACS aircraft that can use a carrier.
if _category==Airbase.Category.SHIP then
if not (_attribute==WAREHOUSE.Attribute.AIR_TRANSPORTHELO or _attribute==WAREHOUSE.Attribute.AIR_ATTACKHELO) then
_terminal=AIRBASE.TerminalType.OpenMedOrBig
end
end
return _terminal
@ -7034,7 +7045,7 @@ function WAREHOUSE:_FindParkingForAssets(airbase, assets)
local _asset=asset --#WAREHOUSE.Assetitem
-- Get terminal type of this asset
local terminaltype=self:_GetTerminal(asset.attribute)
local terminaltype=self:_GetTerminal(asset.attribute, self:GetAirbaseCategory())
-- Asset specific parking.
parking[_asset.uid]={}

View File

@ -990,11 +990,7 @@ function CONTROLLABLE:TaskRefueling()
-- params = {}
-- }
local DCSTask
DCSTask = { id = 'Refueling',
params = {
},
},
local DCSTask={id='Refueling', params={}}
self:T3( { DCSTask } )
return DCSTask