-------------------------------------------------------------------------------------------- -- __ __ ___ _ __ __ -- / //_/ / | __________(_)____/ /_____ _____ / /_ -- / ,< ______/ /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ -- / /| /_____/ ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ -- /_/ |_| ___/_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ -- / |/ /___ ______/ /_______ -- / /|_/ / __ `/ ___/ //_/ ___/ -- / / / / /_/ / / / ,< (__ ) -- /_/ /_/\__,_/_/ /_/|_/____/ -- -------------------------------------------------------------------------------------------- -- ------------------------------------ DEV NOTES --------------------------------------------- -- DONE - MOOSE pseudo-atc integration -- -- -- -- -- -- -- K-Assistant: Marks - allows you to get some useful informations using F10 map markers. -- -- METAR of a specific point on the map - METAR information and other useful information will be shown in the map marker text, this will be visible to coalition. -- COORDINATE DISPLAY - Marker coordinates in varius formats and ground elevation will be shown in Marker text and via message only to the group that has created the mark. -- ---------------------------------- HOW TO USE -------------------------------------------- -- -- METAR -- Add a Marker in F10 Map, edit the marker text by inserting the following tag: "#METAR" -- Click outside the text field to apply, marker text will be replaced with METAR infos then. -- METAR MARK Will be automatically removed after some time. (120 seconds by default) -- -- COORD -- Add a Marker in F10 Map, edit the marker text by inserting the following tag: "#COORD" -- Click outside the text field to apply, marker text will be replaced with Cordinates then, an overlay message will be shown too. -- WARNING : #COORD function is disabled by default since it works correctly only in single player. -- -- CIRCLES -- Add a Marker in F10 Map, edit the marker text by inserting the following tag: "#CIRCLE" -- Click outside the text field to apply, a circle draw will appear on marker. -- Delete marker to delete circle. -- You can specify circle radius in meters between brakets in marker text - e.g. " #CIRCLE (1000) " - will create a 1000 meters radius circle -- -- ARROWS -- Add a Marker in F10 Map, edit the marker text by inserting the following tag: "#ARROW" -- Click outside the text field to apply, a arrow draw will appear on marker. -- Delete marker to delete arrow. -- You can specify arrow heading between brakets in marker text - e.g. " #ARROW (270) " - will create an arrow pointing for 270 -- -- MOOSE PSEUDO ATC -- in settings you can enable Moose Pseudo ATC if you want. -- See MOOSE Framework docs form more infos about Pseudo ATC. -- -- ----------------------------------- SETTINGS --------------------------------------------- MarksSettings = { Debug = false, -- enables/disables debug messages PseudoATCEnable = false, -- enables/disables Pseudo ATC MetarEnable = true, -- enables/disables METAR marks MetarTag = "#METAR", -- define metar tag , a string of text that user need to insert into mark text to generate metar infos (default #METAR) MetarMarkerRemoveTime = 120, -- time in seconds after which the metar-marker will be deleted (default 120) CoordinateDisplayEnable = false, -- -- enables/disables COORD markers -- DO NOT USE IN MULTIPLAYER - event handler bugged - DCS indicates server host as mark change event initiator CoordinateDisplayTag = "#COORD", CoordinateDisplayTime = 45, CoordinateMarkerRemoveTime = 45, SignsEnable = true, -- enables/disables CIRCLE and ARROW marks CircleTag = "#CIRCLE", ArrowTag = "#ARROW", WelcomeMessage = true, -- if true a Welcome Message will be displayed at mission start } -------------------------------- END OF SETTINGS ----------------------------------------- MetarMarks = {} -- table where metar markers objects will be stored CoordinateDisplayMarks = {} -- table where coordinate markers objects will be stored function math.round(number, decimals, method) decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end function ReverseBearing(bearing) if not bearing then return end bearing = tonumber(bearing) local reversedBearing = nil if bearing >= 180 then reversedBearing = bearing - 180 elseif bearing < 180 then reversedBearing = bearing + 180 end return reversedBearing end function MetarMarksGenerator (EventData) if MarksSettings.MetarEnable == false then return end local initMarkText = string.upper(EventData.MarkText) if not string.match(initMarkText, MarksSettings.MetarTag) then return end local markPoint = EventData.MarkCoordinate local initMarkID = EventData.MarkID local COALITION = EventData.MarkCoalition local group = EventData.IniGroup local stringCoordinateLLDMS = markPoint:ToStringLLDMS() local landHeightMeters = math.floor(markPoint:GetLandHeight()) local landHeightFeet = math.floor(UTILS.MetersToFeet(landHeightMeters)) local temperatureCelsius = math.floor(markPoint:GetTemperature(landHeightMeters + 10)) local temperatureFarenheit = math.floor(UTILS.CelsiusToFahrenheit(temperatureCelsius)) local pressurehPa = math.round(markPoint:GetPressure(landHeightMeters + 10), 2) local pressureinHg = math.round(UTILS.hPa2inHg(pressurehPa), 2) local windAtGround = { markPoint:GetWind(landHeightMeters + 10) } -- return 2 values local windFrom = math.floor(windAtGround[1]) local windSpeedMs = math.round( windAtGround[2], 1) local windSpeedKmh = math.round( UTILS.MpsToKmph(windSpeedMs), 1) local windSpeedKts = math.round( UTILS.MpsToKnots(windSpeedMs), 1) -- table containing element to compose metar mark text local textTable = { separator = "__________________________________________________\n", title = "K-Assistant METAR INFO".."\n", coordinate = stringCoordinateLLDMS, wind = "Wind from : "..windFrom.." (at ground)".."\n", windspeed = "at : "..windSpeedMs.." m/s".." | "..windSpeedKts.." kts".." | "..windSpeedKmh.." Km/h".."\n", landHeight = "Elev: "..landHeightMeters.."m".." | "..landHeightFeet.."ft".." | ", temperature = "Temp: "..temperatureCelsius.."°C".." | "..temperatureFarenheit.."°F".."\n", pressure = "QFE: "..pressurehPa.." hPa".." | "..pressureinHg.." inHg".."\n", } local metarMarkText = textTable.title..textTable.wind..textTable.windspeed..textTable.landHeight..textTable.temperature..textTable.pressure MetarMarks[initMarkID] = MARKER:New(markPoint):SetText(metarMarkText):ReadOnly():ToCoalition(COALITION) MetarMarks[initMarkID]:Remove(MarksSettings.MetarMarkerRemoveTime) -- removes metar marker after a predetermined time trigger.action.removeMark(initMarkID)-- removes initial user-created marker end function CoordinateDisplayGenerator (EventData) if MarksSettings.CoordinateDisplayEnable == false then return end if not EventData.IniGroup then env.info("Coordinate Diplay - NO GROUP AVAILABLE") return end local initMarkText = string.upper(EventData.MarkText) if not string.match(initMarkText, MarksSettings.CoordinateDisplayTag) then return end local markPoint = EventData.MarkCoordinate local initMarkID = EventData.MarkID local COALITION = EventData.MarkCoalition local group = EventData.IniUnit:GetGroup() -- TODO TEST local stringCoordinateLLDDM = markPoint:ToStringLLDDM() local stringCoordinateLLDMS = markPoint:ToStringLLDMS() local stringCoordinateMGRS = markPoint:ToStringMGRS() local landHeightMeters = math.floor(markPoint:GetLandHeight()) local landHeightFeet = math.floor(UTILS.MetersToFeet(landHeightMeters)) local textTable = { -- table containing element to compose metar mark text separator = "__________________________________________________\n", title = "K-Assistant Coodinate Display".."\n", coordinateLLDDM = stringCoordinateLLDDM.."\n", coordinateLLDMS = stringCoordinateLLDMS.."\n", coordinateMGRS = stringCoordinateMGRS.."\n", landHeight = "Elevation : "..landHeightMeters.." m".." | "..landHeightFeet.." ft".."\n", } local coordinateDisplayTextMessage = textTable.title..textTable.separator..textTable.coordinateLLDDM..textTable.coordinateLLDMS..textTable.coordinateMGRS..textTable.separator..textTable.landHeight local coordinateDisplayTextMarker = textTable.coordinateLLDDM..textTable.coordinateLLDMS..textTable.coordinateMGRS..textTable.landHeight CoordinateDisplayMarks[initMarkID] = MARKER:New(markPoint):SetText(coordinateDisplayTextMarker):ToGroup(group) CoordinateDisplayMarks[initMarkID]:Remove(MarksSettings.CoordinateMarkerRemoveTime) -- removes metar marker after a predetermined time trigger.action.removeMark(initMarkID)-- removes initial user-created marker MESSAGE:New( coordinateDisplayTextMessage , MarksSettings.CoordinateDisplayTime):ToGroup(group) end function CircleAdd(EventData) if MarksSettings.SignsEnable == false then return end local initMarkText = string.upper(EventData.MarkText) if not string.match(initMarkText, MarksSettings.CircleTag) then return end local markPoint = EventData.MarkCoordinate local initMarkID = EventData.MarkID local circleID = initMarkID + 10000 local circleRadius = ( string.match(initMarkText, "%((%d+)%)") or 500) local COALITION = EventData.MarkCoalition local group = EventData.IniGroup trigger.action.circleToAll(COALITION , circleID , markPoint:GetVec3() , circleRadius , {1, 0, 0, 0.5} , {0,0,1,0.1} , 6 , false, "Circle Added") end function CircleRemove(EventData) if MarksSettings.SignsEnable == false then return end local initMarkText = string.upper(EventData.MarkText) if not string.match(initMarkText, MarksSettings.CircleTag) then return end local initMarkID = EventData.MarkID local circleID = initMarkID + 10000 trigger.action.removeMark( circleID ) end function ArrowAdd(EventData) if MarksSettings.SignsEnable == false then return end local initMarkText = string.upper(EventData.MarkText) if not string.match(initMarkText, MarksSettings.ArrowTag) then return end local markPoint = EventData.MarkCoordinate local initMarkID = EventData.MarkID local arrowID = initMarkID + 20000 local arrowBRG = ( ReverseBearing(string.match(initMarkText, "%((%d+)%)")) or 180) local arrowLenght = 1000 local endPoint = markPoint:Translate(arrowLenght, arrowBRG, true, false) local endPointVec3 = endPoint:GetVec3() local COALITION = EventData.MarkCoalition local group = EventData.IniGroup trigger.action.arrowToAll(COALITION , arrowID , markPoint:GetVec3() , endPointVec3 , {1, 0, 0, 0.5} , {0,0,1,0.1} , 6 , false, "Arrow Added") end function ArrowRemove(EventData) if MarksSettings.SignsEnable == false then return end local initMarkText = string.upper(EventData.MarkText) if not string.match(initMarkText, MarksSettings.ArrowTag) then return end local initMarkID = EventData.MarkID local arrowID = initMarkID + 20000 trigger.action.removeMark( arrowID ) end if MarksSettings.PseudoATCEnable == true then pseudoATC=PSEUDOATC:New() pseudoATC:Start() end MarksEventHandler = EVENTHANDLER:New() --MarksEventHandler:HandleEvent(EVENTS.MarkAdded) MarksEventHandler:HandleEvent(EVENTS.MarkChange) MarksEventHandler:HandleEvent(EVENTS.MarkRemoved) --EVENTDATA.MarkCoalition --EVENTDATA.MarkCoordinate --EVENTDATA.MarkGroupID --EVENTDATA.MarkID --EVENTDATA.MarkText --EVENTDATA.MarkVec3 --function MarksEventHandler:OnEventMarkAdded(EventData) --end function MarksEventHandler:OnEventMarkChange(EventData) if MarksSettings.Debug == true then MESSAGE:New("MARK COALITION : "..EventData.MarkCoalition , 9):ToAll() MESSAGE:New("INI GROUP : "..EventData.IniGroup:GetName() , 9):ToAll() MESSAGE:New("INI UNIT : "..EventData.IniUnit:GetName() , 9):ToAll() end MetarMarksGenerator (EventData) CoordinateDisplayGenerator (EventData) CircleAdd(EventData) ArrowAdd(EventData) end function MarksEventHandler:OnEventMarkRemoved(EventData) CircleRemove(EventData) ArrowRemove(EventData) end env.info("K-Assistant : Marks - Loaded!", false) if MarksSettings.WelcomeMessage == true then MESSAGE:New( "K-Assistant: Marks - Loaded!" , 3):ToAll() end if MarksSettings.Debug == true then MESSAGE:New( "K-Assistant: Marks - DEBUG MODE IS ENABLED" , 10):ToAll() end