From af2299d3926c7f2ab8d50c12e0c0b768133c1328 Mon Sep 17 00:00:00 2001 From: funkyfranky Date: Thu, 22 Mar 2018 00:21:41 +0100 Subject: [PATCH] RANGE 1.0.1 Change _OnBirth() to OnEventBirth(). Messages about bomb impact only within Range radius. Fixed DCSunit not known when player leaves. Fixed TgtGroup in DCS onEvent() event handler. Added YT demo vid. Added 476th range object reference. --- Moose Development/Moose/Functional/Range.lua | 80 +++++++++++++------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/Moose Development/Moose/Functional/Range.lua b/Moose Development/Moose/Functional/Range.lua index 5108d13e8..a2a623ccb 100644 --- a/Moose Development/Moose/Functional/Range.lua +++ b/Moose Development/Moose/Functional/Range.lua @@ -12,6 +12,8 @@ -- Implementation is based on the [Simple Range Script](https://forums.eagle.ru/showthread.php?t=157991) by [Ciribob](https://forums.eagle.ru/member.php?u=112175), which itself was motivated -- by a script by SNAFU [see here](https://forums.eagle.ru/showthread.php?t=109174). -- +-- [476th - Air Weapons Range Objects mod](http://www.476vfightergroup.com/downloads.php?do=file&id=287) is highly recommended for this class. +-- -- ## Features -- -- * Bomb and rocket impact point from closest range target is measured and distance reported to the player. @@ -36,7 +38,7 @@ -- -- # YouTube Channel -- --- ### [MOOSE YouTube Channel](https://www.youtube.com/playlist?list=PL7ZUrU4zZUl1jirWIo4t4YxqN-HxjqRkL) +-- ### [MOOSE - On the Range - Demonstration Video](https://www.youtube.com/watch?v=kIXcxNB9_3M) -- -- === -- @@ -54,7 +56,7 @@ -- @field #boolean Debug If true, debug info is send as messages on the screen. -- @field #string rangename Name of the range. -- @field Core.Point#COORDINATE location Coordinate of the range. --- @field #number rangeradius Radius of range defining its total size for e.g. smoking bomb impact points. Default 10 km. +-- @field #number rangeradius Radius of range defining its total size for e.g. smoking bomb impact points and sending radio messages. Default 10 km. -- @field #table strafeTargets Table of strafing targets. -- @field #table bombingTargets Table of targets to bomb. -- @field #number nbombtargets Number of bombing targets. @@ -155,6 +157,8 @@ -- ### Goldwater Range -- This example shows hot to set up the Barry M. Goldwater range. It consists of two strafe pits each has two targets plus three bombing targets. -- +-- The [476th - Air Weapons Range Objects mod](http://www.476vfightergroup.com/downloads.php?do=file&id=287) is used in this example. +-- -- -- Strafe pits. Each pit can consist of multiple targets. Here we have two pits and each of the pits has two targets. These are names of the corresponding units defined in the ME. -- local strafepit_left={"GWR Strafe Pit Left 1", "GWR Strafe Pit Left 2"} -- local strafepit_right={"GWR Strafe Pit Right 1", "GWR Strafe Pit Right 2"} @@ -219,7 +223,7 @@ RANGE.id="RANGE | " --- Range script version. -- @field #number version -RANGE.version="1.0.0" +RANGE.version="1.0.1" --TODO list --TODO: Add statics for strafe pits. @@ -303,9 +307,12 @@ function RANGE:Start() if self.eventmoose then -- Events are handled my MOOSE. self:T(RANGE.id.."Events are handled by MOOSE.") - self:HandleEvent(EVENTS.Birth, self._OnBirth) - self:HandleEvent(EVENTS.Hit, self._OnHit) - self:HandleEvent(EVENTS.Shot, self._OnShot) + --self:HandleEvent(EVENTS.Birth, self._OnBirth) + --self:HandleEvent(EVENTS.Hit, self._OnHit) + --self:HandleEvent(EVENTS.Shot, self._OnShot) + self:HandleEvent(EVENTS.Birth) + self:HandleEvent(EVENTS.Hit) + self:HandleEvent(EVENTS.Shot) else -- Events are handled directly by DCS. self:T(RANGE.id.."Events are handled directly by DCS.") @@ -549,7 +556,7 @@ function RANGE:AddBombingTargets(unitnames, goodhitrange, static) self:AddBombingTargetUnit(_unit, goodhitrange) self:T(RANGE.id..string.format("Adding bombing target %s with hit range %d.", name, goodhitrange)) else - self:E(RANGE.id..string.fromat("ERROR! Could not find bombing target %s.", name)) + self:E(RANGE.id..string.format("ERROR! Could not find bombing target %s.", name)) end end @@ -588,7 +595,12 @@ end function RANGE:onEvent(Event) self:F3(Event) - if Event == nil or Event.initiator == nil or Unit.getByName(Event.initiator:getName()) == nil then + if Event == nil or Event.initiator == nil then + self:T2("Skipping onEvent. Event or Event.initiator unknown.") + return true + end + if Unit.getByName(Event.initiator:getName()) == nil then + self:T2("Skipping onEvent. Initiator unit name unknown.") return true end @@ -610,9 +622,6 @@ function RANGE:onEvent(Event) if Event.target then EventData.TgtUnitName = Event.target:getName() - EventData.TgtDCSGroup = Event.target:getGroup() - EventData.TgtGroupName = Event.target:getGroup():getName() - EventData.TgtGroup = GROUP:FindByName(EventData.TgtGroupName) EventData.TgtUnit = UNIT:FindByName(EventData.TgtUnitName) end @@ -628,22 +637,24 @@ function RANGE:onEvent(Event) self:T3(RANGE.id..string.format("EVENT: Ini group = %s" , tostring(EventData.IniGroupName))) self:T3(RANGE.id..string.format("EVENT: Ini player = %s" , tostring(_playername))) self:T3(RANGE.id..string.format("EVENT: Tgt unit = %s" , tostring(EventData.TgtUnitName))) - self:T3(RANGE.id..string.format("EVENT: Tgt group = %s" , tostring(EventData.IniGroupName))) - self:T3(RANGE.id..string.format("EVENT: Wpn type = %s" , tostring(EventData.WeapoinTypeName))) + self:T3(RANGE.id..string.format("EVENT: Wpn type = %s" , tostring(EventData.WeaponTypeName))) -- Call event Birth function. if Event.id==world.event.S_EVENT_BIRTH and _playername then - self:_OnBirth(EventData) + self:OnEventBirth(EventData) + --self:_OnBirth(EventData) end -- Call event Shot function. if Event.id==world.event.S_EVENT_SHOT and _playername and Event.weapon then - self:_OnShot(EventData) + self:OnEventShot(EventData) + --self:_OnShot(EventData) end -- Call event Hit function. if Event.id==world.event.S_EVENT_HIT and _playername and DCStgtunit then - self:_OnHit(EventData) + self:OnEventHit(EventData) + --self:_OnHit(EventData) end end @@ -652,7 +663,8 @@ end --- Range event handler for event birth. -- @param #RANGE self -- @param Core.Event#EVENTDATA EventData -function RANGE:_OnBirth(EventData) +function RANGE:OnEventBirth(EventData) +--function RANGE:_OnBirth(EventData) self:F({eventbirth = EventData}) local _unitName=EventData.IniUnitName @@ -700,7 +712,8 @@ end --- Range event handler for event hit. -- @param #RANGE self -- @param Core.Event#EVENTDATA EventData -function RANGE:_OnHit(EventData) +function RANGE:OnEventHit(EventData) +--function RANGE:_OnHit(EventData) self:F({eventhit = EventData}) -- Player info @@ -716,7 +729,6 @@ function RANGE:_OnHit(EventData) self:T3(RANGE.id.."HIT: Ini unit = "..tostring(EventData.IniUnitName)) self:T3(RANGE.id.."HIT: Ini group = "..tostring(EventData.IniGroupName)) self:T3(RANGE.id.."HIT: Tgt target = "..tostring(EventData.TgtUnitName)) - self:T3(RANGE.id.."HIT: Tgt group = "..tostring(EventData.TgtGroupName)) -- Current strafe target of player. local _currentTarget = self.strafeStatus[_unitID] @@ -787,7 +799,8 @@ end --- Range event handler for event shot (when a unit releases a rocket or bomb (but not a fast firing gun). -- @param #RANGE self -- @param Core.Event#EVENTDATA EventData -function RANGE:_OnShot(EventData) +function RANGE:OnEventShot(EventData) +--function RANGE:_OnShot(EventData) self:F({eventshot = EventData}) -- Weapon data. @@ -901,10 +914,10 @@ function RANGE:_OnShot(EventData) -- Send message to player. local _message = string.format("%s, impact %d m from bullseye of target %s. %s hit.", _callsign, _distance, _closetTarget.name, _hitquality) - -- Sendmessage. + -- Send message. self:_DisplayMessageToGroup(_unit, _message, nil, true) - else - -- Sendmessage + elseif _distance <= self.rangeradius then + -- Send message local _message=string.format("%s, weapon fell more than %.1f km away from nearest range target. No score!", _callsign, self.scorebombdistance/1000) self:_DisplayMessageToGroup(_unit, _message, nil, true) end @@ -1863,16 +1876,25 @@ function RANGE:_GetPlayerUnitAndName(_unitName) self:F(_unitName) if _unitName ~= nil then + + -- Get DCS unit from its name. local DCSunit=Unit.getByName(_unitName) - local playername=DCSunit:getPlayerName() - local unit=UNIT:Find(DCSunit) - self:T({DCSunit=DCSunit, unit=unit, playername=playername}) - if DCSunit and unit and playername then - return unit, playername + if DCSunit then + + local playername=DCSunit:getPlayerName() + local unit=UNIT:Find(DCSunit) + + self:T({DCSunit=DCSunit, unit=unit, playername=playername}) + if DCSunit and unit and playername then + return unit, playername + end + end - end + end + + -- Return nil if we could not find a player. return nil,nil end