SNAFU Posted June 28, 2013 Posted June 28, 2013 (edited) I wrote a little script for practicing with BDU-50LD/HD bombs. This script indicates the BDU hit in relation to you attack path and the target, therefore it prints out: -total off in m -how far short or long in m -how far to left or right in m The target unit to drop your BDUs on is marked with a green flare every 5 seconds. After one drop the next unit with the name "target(n)" (n=1,2,..) will be marked with flares But you need MIST2.0 and have to place units in the ME with the names "target1", "target2"... I found it helpfull in practicing bomb deliveries, so someone might agree. ;) Ah, btw works also with WP rockets. PS: The second file with the name BDUIndicatorMultipleZones_v1.lua uses triggerzones as target and prints out the weapon impact in relation to the closest triggerzone with the name "target1", "target2",...BDUIndicatorMultipleTargets.luaBDUIndicatorMultipleZones_v1.lua Edited November 4, 2013 by SNAFU [sIGPIC][/sIGPIC] Unsere Facebook-Seite
Midnight Posted June 29, 2013 Posted June 29, 2013 Hi SNAFU I just can not get this to work man. :helpsmilie: I still didn't get the Air Traffic to work either, I included the miz file with both your scripts. Will appreciate if you can have a look at it.Tbilisi ILS Training - MP1 Day.miz
SNAFU Posted June 29, 2013 Author Posted June 29, 2013 Hi Midnight, I took a look at your miz and rearranged the trigger slightly to the way I am used to. For the BDU targets: They need to be units and have the unitname "target1","target2" etc, not static. ;) But I also made one version, in which the aimpoint is a zone center, might be better for your puropose. You just place the zone with the name "target" over the static position and voila. I attached the script below, that might suite your purpose better. To the random traffic: Airfield Lochini is named Tbilisi-Lochini, that was the bug. Thought is was otherwise, but good to know. ;) I attached the modified miz below, so you can see what I mean.BDUIndicatorZone.luaTbilisi ILS Training - MP1 Day_snafumod.miz [sIGPIC][/sIGPIC] Unsere Facebook-Seite
Midnight Posted July 13, 2013 Posted July 13, 2013 I need some help here please, this script is not working the way I want it to. I want to set up 4 target zones: targetrange = {'target1', 'target2', 'target3', 'target4'} -- targetzone name that must activate when a player enters that zone, say zone is 5 miles. Script below: targetrange = {'target1', 'target2', 'target3', 'target4'} -- targetzone name function SignalTarget() Aimpoint = trigger.misc.getZone(targetrange) Aimpointpos = {} Aimpointposx = Aimpoint.point.x Aimpointposz = Aimpoint.point.z Aimpointposy = land.getHeight({x = Aimpoint.point.x, y = Aimpoint.point.z}) Aimpt3 = {x=Aimpointposx, y=Aimpointposy, z=Aimpointposz} trigger.action.smoke({x=Aimpointposx, y=Aimpointposy, z=Aimpointposz}, trigger.smokeColor.Green, 0) return timer.getTime() + 5 end timer.scheduleFunction(SignalTarget, nil, timer.getTime() + 1) DummybombHandler = {} function DummybombHandler:onEvent(event) if event.id == world.event.S_EVENT_SHOT then BombInit = event.initiator BombInitGroup = BombInit:getGroup() _alpha = mist.getHeading(BombInit) _ordnance = event.weapon _ordnanceName = _ordnance:getTypeName() if (_ordnanceName == "weapons.bombs.BDU_50HD" or _ordnanceName == "weapons.bombs.BDU_50LD") then function TrackBombDummy() local BombDummyPos = _ordnance:getPoint() local _time = timer.getTime(); if BombDummyPos.y < land.getHeight({x = BombDummyPos.x, y = BombDummyPos.z}) + 10 then local xOffset = BombDummyPos.x - Aimpointposx local zOffset = BombDummyPos.z - Aimpointposz local BombOffset = math.sqrt(xOffset * xOffset + zOffset * zOffset) local BombOffsetInt = math.floor(BombOffset) local _beta = math.atan2(zOffset,xOffset) local _gamma = _alpha - _beta local xOffsetRel = BombOffset * math.sin(_gamma*(-1)) local zOffsetRel = BombOffset * math.cos(_gamma) local xOffsetRelAbs = math.floor(math.abs(xOffsetRel)) local zOffsetRelAbs = math.floor(math.abs(zOffsetRel)) if (xOffsetRel > 0 and zOffsetRel > 0) then trigger.action.outText("Distance off: "..string.format(BombOffsetInt) .. "m / Off right "..string.format(xOffsetRelAbs) .. "m / Too long by "..string.format(zOffsetRelAbs).."m", 10) elseif (xOffsetRel > 0 and zOffsetRel < 0) then trigger.action.outText("Distance off: "..string.format(BombOffsetInt) .. "m / Off right "..string.format(xOffsetRelAbs) .. "m / Too short by "..string.format(zOffsetRelAbs).."m", 10) elseif (xOffsetRel < 0 and zOffsetRel > 0) then trigger.action.outText("Distance off: "..string.format(BombOffsetInt) .. "m / Off left "..string.format(xOffsetRelAbs) .. "m / Too long by "..string.format(zOffsetRelAbs).."m", 10) elseif (xOffsetRel < 0 and zOffsetRel < 0) then trigger.action.outText("Distance off: "..string.format(BombOffsetInt) .. "m / Off left "..string.format(xOffsetRelAbs) .. "m / Too short by "..string.format(zOffsetRelAbs).."m", 10) end return end return timer.getTime() + 0.01 end timer.scheduleFunction(TrackBombDummy, nil, timer.getTime() + 1) end --end end end world.addEventHandler(DummybombHandler) I tried many different options without result. At most I can get only one zone active(target1)
galevsky06 Posted July 13, 2013 Posted July 13, 2013 (edited) May I suggest to create into the ME some triggers 'In Zone' that execute lua like 'ActiveTarget = target1' for first zone, 'ActiveTarget = target2' for second an so on... Then, remove the ActiveTarget = ActiveTarget + 1 if (ActiveTarget > nrTargets) then ActiveTarget = 1 end that switches to the next target after the ordnance impact on the previous active target in the original script. For me, I don't want the trainee to respect some order to engage the targets, so taht I am building a training area with long-distance separated objectives, and the active target is computed while the ordnance impacts the ground (I get the closest target position). Edited July 13, 2013 by galevsky06
galevsky06 Posted July 13, 2013 Posted July 13, 2013 I forgot: don't schedule the signalTarget function until there is an active target ! Add a function in your lua: function activateTarget(id) if (activeTarget == nil) then activeTarget = "target"..id timer.scheduleFunction(SignalTarget, nil, timer.getTime() + 1) else activateTarget = "target"..id end end And lua code for InZone triggers becomes: activateTarget("X"); -- X in {1,2,3,4} according to the zone
Midnight Posted July 13, 2013 Posted July 13, 2013 I forgot: don't schedule the signalTarget function until there is an active target ! Add a function in your lua: function activateTarget(id) if (activeTarget == nil) then activeTarget = "target"..id timer.scheduleFunction(SignalTarget, nil, timer.getTime() + 1) else activateTarget = "target"..id end end And lua code for InZone triggers becomes: activateTarget("X"); -- X in {1,2,3,4} according to the zone You saved the day...thank m8
Midnight Posted July 14, 2013 Posted July 14, 2013 Just one last hing, since I am going to use practice bombs, I surely need to deactivate target 1 before target 2 gets activated. If not the script will measure distance from the first target only. There should be a condition though: if bomb hits inside a preset zone = 100meters, then only activate target 2. any ideas?
galevsky06 Posted July 14, 2013 Posted July 14, 2013 (edited) Just one last hing, since I am going to use practice bombs, I surely need to deactivate target 1 before target 2 gets activated. If not the script will measure distance from the first target only. There should be a condition though: if bomb hits inside a preset zone = 100meters, then only activate target 2. any ideas? Ok, First: we don't need to deactivate the previous target: the original SignalTarget function will just start flaring on the current target: local Rangetarget = Unit.getByName('target'..string.format(ActiveTarget))So it works fine with ActiveTarget content only. A better implementation for you could be: function SignalTarget() local Rangetarget = Unit.getByName(ActiveTarget) if RangeTarget then -- <<<<<<< flare only if ActiveTarget is not nil Aimpointpos = Rangetarget:getPosition().p Aimpointposx = Aimpointpos.x Aimpointposz = Aimpointpos.z Aimpointposy = land.getHeight({x = Aimpointposx, y = Aimpointposz}) Aimpt3 = {x=Aimpointposx, y=Aimpointposy, z=Aimpointposz} trigger.action.signalFlare({x=Aimpointposx, y=Aimpointposy, z=Aimpointposz}, trigger.flareColor.Green, 0) end return timer.getTime() + 5 end timer.scheduleFunction(SignalTarget, nil, timer.getTime() + 1) Then, set the ActivateTarget to nil when unit destruction is caught for the unit named 'ActivateTarget'. And do simple activateTarget = "targetX"for InZone triggers. Secondly, you can handle your ActivateTarget variable with impacts on the ground by looking for the closest unit. This is my solution. But you cannot do SignalTarget because you will know who is your active target only when bombs hit the ground ! So you have to choose: Want to flare on targets before bombs impact ? => InZone trigger looks fine, or fixed order as it was in the original script. Doesn't mind about flaring, just want to display stats after impact ? Search for you target just before computing stats, inside TrackBombDummy. That implies that you have the full list of targets, and you loop on them to compute the distance to the impact... Edited July 14, 2013 by galevsky06
Midnight Posted July 14, 2013 Posted July 14, 2013 Thanks galevsky06, that was a mouth full man, you are a great help. I will test it immediately.
galevsky06 Posted July 14, 2013 Posted July 14, 2013 Thanks galevsky06, that was a mouth full man, you are a great help. I will test it immediately. You're welcome. :smilewink:
PFunk1606688187 Posted July 15, 2013 Posted July 15, 2013 Can you run me by changing the green flare to some smoke instead? Warning: Nothing I say is automatically correct, even if I think it is.
galevsky06 Posted July 15, 2013 Posted July 15, 2013 trigger.action.smoke({x=Aimpointposx, y=Aimpointposy, z=Aimpointposz}, trigger.smokeColor.Green, 0) We said flare but it is already green smoke :smilewink:
PFunk1606688187 Posted July 15, 2013 Posted July 15, 2013 Ah. I was using the indicator zone lua and it has flares in it. Thanks. Looks like a useful script. Warning: Nothing I say is automatically correct, even if I think it is.
galevsky06 Posted July 15, 2013 Posted July 15, 2013 Ah. I was using the indicator zone lua and it has flares in it. ? Are you talking about BDUIndicatorMultipleTargets.lua script or something else ? Don't know what is "indicator zone lua"
PFunk1606688187 Posted July 15, 2013 Posted July 15, 2013 (edited) ? Are you talking about BDUIndicatorMultipleTargets.lua script or something else ? Don't know what is "indicator zone lua" Yes, the script attached to post #3. I went and changed flare into smoke, but for some reason the smoke doesn't appear. I've no clue why. I know that the unedited version works fine. EDIT. I figured it out. I had to delete the Return from the smoke/flare portion of the script. Smoke appears in place of the flares, now I need to test out the actual accuracy calling to see if it works properly Edited July 15, 2013 by P*Funk Warning: Nothing I say is automatically correct, even if I think it is.
PFunk1606688187 Posted July 15, 2013 Posted July 15, 2013 Well I was silly and shortsighted and forgot that if I don't have a Return for the smoke it'll dissipate rather quickly. So, I'm going to play with it, but anybody have the hard numbers on how long smoke lasts? Warning: Nothing I say is automatically correct, even if I think it is.
galevsky06 Posted July 15, 2013 Posted July 15, 2013 The original script: function SignalTarget() local Rangetarget = Unit.getByName('target'..string.format(ActiveTarget)) Aimpointpos = Rangetarget:getPosition().p Aimpointposx = Aimpointpos.x Aimpointposz = Aimpointpos.z Aimpointposy = land.getHeight({x = Aimpointposx, y = Aimpointposz}) Aimpt3 = {x=Aimpointposx, y=Aimpointposy, z=Aimpointposz} trigger.action.signalFlare({x=Aimpointposx, y=Aimpointposy, z=Aimpointposz}, trigger.flareColor.Green, 0) return [b]timer.getTime() + 5 [/b]end Every 5s a new smoke is launched. I guess that SNAFU chose the right value...
PFunk1606688187 Posted July 15, 2013 Posted July 15, 2013 Well the original script pops signal flares every 5 seconds rather than smoke. I initially tried changing this to smoke once I found out what to input, but with the return timer it seems to stop the smoke appearing at all. I just checked and a single smoke will last exactly 5 minutes, or 300 seconds. If I eliminate the Return command the smoke appears, but it dissipates. If I have the Return command it seems to prevent smoke from appearing, unlike with flares. This works, but doesn't last. function SignalTarget() Aimpoint = trigger.misc.getZone(target) Aimpointpos = {} Aimpointposx = Aimpoint.point.x Aimpointposz = Aimpoint.point.z Aimpointposy = land.getHeight({x = Aimpoint.point.x, y = Aimpoint.point.z}) Aimpt3 = {x=Aimpointposx, y=Aimpointposy, z=Aimpointposz} trigger.action.smoke({x=Aimpointposx, y=Aimpointposy, z=Aimpointposz}, trigger.smokeColor.Green, 0) end This seems to prevent the smoke from appearing, though the rest of the script functions correctly: function SignalTarget() Aimpoint = trigger.misc.getZone(target) Aimpointpos = {} Aimpointposx = Aimpoint.point.x Aimpointposz = Aimpoint.point.z Aimpointposy = land.getHeight({x = Aimpoint.point.x, y = Aimpoint.point.z}) Aimpt3 = {x=Aimpointposx, y=Aimpointposy, z=Aimpointposz} trigger.action.smoke({x=Aimpointposx, y=Aimpointposy, z=Aimpointposz}, trigger.smokeColor.Green, 0) return timer.getTime() + 5 end Warning: Nothing I say is automatically correct, even if I think it is.
galevsky06 Posted July 15, 2013 Posted July 15, 2013 Well the original script pops signal flares every 5 seconds rather than smoke. Oups... my mistake :D This seems to prevent the smoke from appearing, though the rest of the script functions correctly: function SignalTarget() Aimpoint = trigger.misc.getZone(target) Aimpointpos = {} Aimpointposx = Aimpoint.point.x Aimpointposz = Aimpoint.point.z Aimpointposy = land.getHeight({x = Aimpoint.point.x, y = Aimpoint.point.z}) Aimpt3 = {x=Aimpointposx, y=Aimpointposy, z=Aimpointposz} trigger.action.smoke({x=Aimpointposx, y=Aimpointposy, z=Aimpointposz}, trigger.smokeColor.Green, 0) return timer.getTime() + 5 end Did you try 1min ? It seems to be an issue with already existing smoke, maybe not, but let's try with big time.... in case smoke still exists even if invisible.
PFunk1606688187 Posted July 15, 2013 Posted July 15, 2013 I figured it out. I was a bad boy and broke the cardinal rule: I changed more than 1 variable at a time. I turned the smoke from Green to Red at the same time that I was fiddling with the Return timer, but I didn't capitalize the "r" and apparently if you don't capitalize the colour it doesn't render the smoke. It works fine. This functions to turn the flare into smoke and refreshes the smoke after 4 minutes. The reason I'm using 4 minutes is because around 4 minutes into the life of a smoke plume it starts to thin out considerably and the final 15 seconds or so its basically a whisp. This way the new smoke starts right when the old one starts thinning. function SignalTarget() Aimpoint = trigger.misc.getZone(target) Aimpointpos = {} Aimpointposx = Aimpoint.point.x Aimpointposz = Aimpoint.point.z Aimpointposy = land.getHeight({x = Aimpoint.point.x, y = Aimpoint.point.z}) Aimpt3 = {x=Aimpointposx, y=Aimpointposy, z=Aimpointposz} trigger.action.smoke({x=Aimpointposx, y=Aimpointposy, z=Aimpointposz}, trigger.smokeColor.Red, 0) return timer.getTime() + 240 end Now, I'm not sure if making the Return timer operate every 5 seconds or something similar would lead to an endless supply of new smoke that would slow the machine down or if it just replaces the old one. Either way there's no need to Return the smoke that often. 4 minutes should do just fine, and if it does create a second plume on top of the first, this way it'll dissipate back to 1 plume within 60 seconds so you won't get so many individual smoke plumes that you get lag after a while. Warning: Nothing I say is automatically correct, even if I think it is.
galevsky06 Posted July 15, 2013 Posted July 15, 2013 Now, I'm not sure if making the Return timer operate every 5 seconds or something similar would lead to an endless supply of new smoke that would slow the machine down or if it just replaces the old one. Either way there's no need to Return the smoke that often. 4 minutes should do just fine, and if it does create a second plume on top of the first, this way it'll dissipate back to 1 plume within 60 seconds so you won't get so many individual smoke plumes that you get lag after a while. Good News ! No bug here :smoke: Smoke has no ID => normaly, you can smoke it as many times as you want, just slowing down the framerate. As we do as JTAC for fun :P
PFunk1606688187 Posted July 15, 2013 Posted July 15, 2013 Good! Now I just need to learn to actually bomb correctly. :P Though, new project. I need to figure out how to add one of these to the ground underneath this script. Warning: Nothing I say is automatically correct, even if I think it is.
Recommended Posts