Cristofer Posted November 9, 2016 Posted November 9, 2016 I am building a escort mission, where you are escorting a C130. I want a radio item (F10) that sends a text message about the C130 position relative yours. How exactlyis is that done? I have tried getposition in do script, but I don´t seem to get it. I know nothing about scripting, so easy instructions please :) Unit name of the C130: C130 Unit name of the player: Player I have done a radio item add, that set flag 999 to true, or 1. Then when 999 is true, the action is "do script". What exactly should I enter? (if it is possible at all)
sea2sky Posted November 9, 2016 Posted November 9, 2016 local unitPos = Unit.getByName('My unit'):getPosition() i5-9600K@4.8GHz ★ 32Gb DDR4 ★ Asus TUF rtx3080 OC ★ Quest Pro ★ Warthog on Virpil base
Cristofer Posted November 9, 2016 Author Posted November 9, 2016 local unitPos = Unit.getByName('My unit'):getPosition() Nothing happens.
sea2sky Posted November 9, 2016 Posted November 9, 2016 Nothing happens. try this: local group = Group.getByName('Your unit group name') local unitPos = nil local units = group:getUnits() if units then unitPos = Unit.getByName(units[1]:getName()):getPosition() end i5-9600K@4.8GHz ★ 32Gb DDR4 ★ Asus TUF rtx3080 OC ★ Quest Pro ★ Warthog on Virpil base
Cristofer Posted November 9, 2016 Author Posted November 9, 2016 No, nothing. Where should I put the text? My unit name is Player. The C130 unit name is C130. Is this correct? local group = Group.getByName('Player') local unitPos = nil local units = group:getUnits() if units then unitPos = Unit.getByName(units[1]:getName()):getPosition() end
sea2sky Posted November 9, 2016 Posted November 9, 2016 no, this is correct: local group = Group.getByName('C130') local unitPos = nil local units = group:getUnits() if units then unitPos = Unit.getByName(units[1]:getName()):getPosition() end i5-9600K@4.8GHz ★ 32Gb DDR4 ★ Asus TUF rtx3080 OC ★ Quest Pro ★ Warthog on Virpil base
Cristofer Posted November 9, 2016 Author Posted November 9, 2016 Still nothing. What exactly shall happen? I want a text message to appear, with the C130 position
sea2sky Posted November 9, 2016 Posted November 9, 2016 Still nothing. What exactly shall happen? I want a text message to appear, with the C130 position Ah, then you need to add an extra line (also, I assume 'C130' is a name of the group the unit belongs to): local group = Group.getByName('C130') local unitPos = nil local units = group:getUnits() if units then unitPos = Unit.getByName(units[1]:getName()):getPosition() end trigger.action.outText("Position X is: "..unitPos.x.z, 5) i5-9600K@4.8GHz ★ 32Gb DDR4 ★ Asus TUF rtx3080 OC ★ Quest Pro ★ Warthog on Virpil base
Cristofer Posted November 9, 2016 Author Posted November 9, 2016 It works, thanks :) But is it possible to use heading and range from your aircraft, or relative from bullseye? Now it says something like 0.5343242345 and that doesn´t say much to me :)
sea2sky Posted November 9, 2016 Posted November 9, 2016 It works, thanks :) But is it possible to use heading and range from your aircraft, or relative from bullseye? Now it says something like 0.5343242345 and that doesn´t say much to me :) I knew that would be your next step :), but was kinda lazy to dig into the code... Ok, so here what you need to do: - get position with the code I gave you - get position of your own aircraft (same method, but use the name of your aircraft's group) - convert positions above from Vec3 to Vec2 coordinates - calculate a heading and distance using functions below Conversion from Vec3 to Vec2 example: local myVec2Position = {x = myVec3Position.p.x, y = myVec3Position.p.z} These functions will calculate distance and heading between two positions respectively using Vec2 positions: function GetDistance(Vec2a, Vec2b) local deltax = Vec2b.x - Vec2a.x local deltay = Vec2b.y - Vec2a.y return math.sqrt(math.pow(deltax, 2) + math.pow(deltay, 2)) end function GetHeadingBetween(Vec2a, Vec2b) local deltax = Vec2b.x - Vec2a.x local deltay = Vec2b.y - Vec2a.y if (deltax > 0) and (deltay == 0) then return 360 elseif (deltax > 0) and (deltay > 0) then return math.deg(math.atan(deltay / deltax)) elseif (deltax == 0) and (deltay > 0) then return 90 elseif (deltax < 0) and (deltay > 0) then return 90 - math.deg(math.atan(deltax / deltay)) elseif (deltax < 0) and (deltay == 0) then return 180 elseif (deltax < 0) and (deltay < 0) then return 180 + math.deg(math.atan(deltay / deltax)) elseif (deltax == 0) and (deltay < 0) then return 270 elseif (deltax > 0) and (deltay < 0) then return 270 - math.deg(math.atan(deltax / deltay)) end end i5-9600K@4.8GHz ★ 32Gb DDR4 ★ Asus TUF rtx3080 OC ★ Quest Pro ★ Warthog on Virpil base
Steggles Posted November 10, 2016 Posted November 10, 2016 This is a hell of a lot cleaner to get a bearing between 2 objects: function getBearing(obj1PosX, obj1PosZ, obj2PosX, obj2PosZ) local bearing = math.atan2(obj2PosZ - obj1PosZ, obj2PosX - obj1PosX) if bearing < 0 then bearing = bearing + 2 * math.pi end bearing = bearing * 180 / math.pi return bearing -- degrees end -16AGR- 16th Air Guards Regiment is always looking for pilots - http://www.16agr.com EWRS - Early Warning Radar Script Specs: Gigabyte Sniper Z5-S Intel i5-4670k 3.4GHz OC'd 3.9GHz w/ Thermaltake 120mm Water 3.0 Pro Liquid CPU Cooler 16GB RAM Gigabyte GTX 1080 TM Hotas Warthog: SN: 06976 Saitek Pro Flight Combat Rudder Pedals TrackIR5 with TrackClipPro & Oculus Rift 2x 28" 4k UHD Monitors (3840x2160 each) + 1280x1024
Cristofer Posted November 10, 2016 Author Posted November 10, 2016 Thanks for the replies. But I can´t get it to work. Remember that I´m a newbie with scripting. When pressing F10 and then activate the script I want a text message to appear with the information (distance and heading to the C130 from me/or Bulls eye). I have tried both Ruskybeavers and Steggles versions. Is this correct?: local group = Group.getByName('C130') local unitPos = nil local units = group:getUnits() if units then unitPos = Unit.getByName(units[1]:getName()):getPosition() end local group = Group.getByName('Player') local unitPos = nil local units = group:getUnits() if units then unitPos = Unit.getByName(units[1]:getName()):getPosition() end local myVec2Position = {x = myVec3Position.p.x, y = myVec3Position.p.z} function GetDistance(Vec2a, Vec2b) local deltax = Vec2b.x - Vec2a.x local deltay = Vec2b.y - Vec2a.y return math.sqrt(math.pow(deltax, 2) + math.pow(deltay, 2)) end function GetHeadingBetween(Vec2a, Vec2b) local deltax = Vec2b.x - Vec2a.x local deltay = Vec2b.y - Vec2a.y if (deltax > 0) and (deltay == 0) then return 360 elseif (deltax > 0) and (deltay > 0) then return math.deg(math.atan(deltay / deltax)) elseif (deltax == 0) and (deltay > 0) then return 90 elseif (deltax < 0) and (deltay > 0) then return 90 - math.deg(math.atan(deltax / deltay)) elseif (deltax < 0) and (deltay == 0) then return 180 elseif (deltax < 0) and (deltay < 0) then return 180 + math.deg(math.atan(deltay / deltax)) elseif (deltax == 0) and (deltay < 0) then return 270 elseif (deltax > 0) and (deltay < 0) then return 270 - math.deg(math.atan(deltax / deltay)) end end Or the same start but with Steggles code.
sea2sky Posted November 10, 2016 Posted November 10, 2016 No, if that would be your final script - it is far from being correct. It seems like you need to get familiar with some basic programming concepts, i.e. how to call functions, how to pass variables etc etc. i5-9600K@4.8GHz ★ 32Gb DDR4 ★ Asus TUF rtx3080 OC ★ Quest Pro ★ Warthog on Virpil base
Steggles Posted November 11, 2016 Posted November 11, 2016 (edited) Here you go. Make sure you set the PILOT names for the units in the editor. You will have to format the output too cause it has a heap of decimal places. function getBearing(obj1PosX, obj1PosZ, obj2PosX, obj2PosZ) local bearing = math.atan2(obj2PosZ - obj1PosZ, obj2PosX - obj1PosX) if bearing < 0 then bearing = bearing + 2 * math.pi end bearing = bearing * 180 / math.pi return bearing -- degrees end function getDistance(obj1PosX, obj1PosZ, obj2PosX, obj2PosZ) local xDiff = obj1PosX - obj2PosX local yDiff = obj1PosZ - obj2PosZ return math.sqrt(xDiff * xDiff + yDiff * yDiff) -- meters end local unit = Unit.getByName('C130') -- Set Pilot name (not group name) of the C130 in the editor to C130 local unitPos = unit:getPosition() local player = Unit.getByName('Player') -- Set Pilot name (not group name) of player slot to Player local playerPos = player:getPosition() local distance = getDistance(playerPos.p.x, playerPos.p.z, unitPos.p.x, unitPos.p.z) local bearing = getBearing(playerPos.p.x, playerPos.p.z, unitPos.p.x, unitPos.p.z) --bearing from playerPos to unitPos trigger.action.outText("BRA: C130 " .. bearing .. " degrees for " .. distance .. " meters.",10) Hint: If you want the units altitude too, its unitPos.p.y and its in meters Edited November 11, 2016 by Steggles 1 -16AGR- 16th Air Guards Regiment is always looking for pilots - http://www.16agr.com EWRS - Early Warning Radar Script Specs: Gigabyte Sniper Z5-S Intel i5-4670k 3.4GHz OC'd 3.9GHz w/ Thermaltake 120mm Water 3.0 Pro Liquid CPU Cooler 16GB RAM Gigabyte GTX 1080 TM Hotas Warthog: SN: 06976 Saitek Pro Flight Combat Rudder Pedals TrackIR5 with TrackClipPro & Oculus Rift 2x 28" 4k UHD Monitors (3840x2160 each) + 1280x1024
Cristofer Posted November 11, 2016 Author Posted November 11, 2016 Yeah, it works. Thanks alot.:thumbup: How do I format the output?
Steggles Posted November 11, 2016 Posted November 11, 2016 Yeah, it works. Thanks alot.:thumbup: How do I format the output? http://lua-users.org/wiki/StringLibraryTutorial Look at the string.format() function. Something like this: trigger.action.outText("BRA: C130 " .. string.format("%03d",bearing) .. " degrees for " .. string.format("%8.1f",distance) .. " meters.",10) You can of course apply some maths to change meters to NM or KM etc before displaying as well if you wanted. -16AGR- 16th Air Guards Regiment is always looking for pilots - http://www.16agr.com EWRS - Early Warning Radar Script Specs: Gigabyte Sniper Z5-S Intel i5-4670k 3.4GHz OC'd 3.9GHz w/ Thermaltake 120mm Water 3.0 Pro Liquid CPU Cooler 16GB RAM Gigabyte GTX 1080 TM Hotas Warthog: SN: 06976 Saitek Pro Flight Combat Rudder Pedals TrackIR5 with TrackClipPro & Oculus Rift 2x 28" 4k UHD Monitors (3840x2160 each) + 1280x1024
Recommended Posts