diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index 49f4e8369..8eb488490 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -981,6 +981,185 @@ function SET_GROUP:ForEachGroupNotInZone( ZoneObject, IteratorFunction, ... ) return self end +--- Iterate the SET_GROUP and return true if all the @{Wrapper.Group#GROUP} are completely in the @{Core.Zone#ZONE} +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @return #boolean true if all the @{Wrapper.Group#GROUP} are completly in the @{Core.Zone#ZONE}, false otherwise +-- @usage +-- local MyZone = ZONE:New("Zone1") +-- local MySetGroup = SET_GROUP:New() +-- MySetGroup:AddGroupsByName({"Group1", "Group2"}) +-- +-- if MySetGroup:AllCompletelyInZone(MyZone) then +-- MESSAGE:New("All the SET's GROUP are in zone !", 10):ToAll() +-- else +-- MESSAGE:New("Some or all SET's GROUP are outside zone !", 10):ToAll() +-- end +function SET_GROUP:AllCompletelyInZone(Zone) + self:F2(Zone) + local Set = self:GetSet() + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if not GroupData:IsCompletelyInZone(Zone) then + return false + end + end + return true +end + +--- Iterate the SET_GROUP and return true if at least one of the @{Wrapper.Group#GROUP} is completely inside the @{Core.Zone#ZONE} +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @return #boolean true if at least one of the @{Wrapper.Group#GROUP} is completly inside the @{Core.Zone#ZONE}, false otherwise. +-- @usage +-- local MyZone = ZONE:New("Zone1") +-- local MySetGroup = SET_GROUP:New() +-- MySetGroup:AddGroupsByName({"Group1", "Group2"}) +-- +-- if MySetGroup:AnyCompletelyInZone(MyZone) then +-- MESSAGE:New("At least one GROUP is completely in zone !", 10):ToAll() +-- else +-- MESSAGE:New("No GROUP is completely in zone !", 10):ToAll() +-- end +function SET_GROUP:AnyCompletelyInZone(Zone) + self:F2(Zone) + local Set = self:GetSet() + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if GroupData:IsCompletelyInZone(Zone) then + return true + end + end + return false +end + +--- Iterate the SET_GROUP and return true if at least one @{#UNIT} of one @{GROUP} of the @{SET_GROUP} is in @{ZONE} +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @return #boolean true if at least one of the @{Wrapper.Group#GROUP} is partly or completly inside the @{Core.Zone#ZONE}, false otherwise. +-- @usage +-- local MyZone = ZONE:New("Zone1") +-- local MySetGroup = SET_GROUP:New() +-- MySetGroup:AddGroupsByName({"Group1", "Group2"}) +-- +-- if MySetGroup:AnyPartlyInZone(MyZone) then +-- MESSAGE:New("At least one GROUP has at least one UNIT in zone !", 10):ToAll() +-- else +-- MESSAGE:New("No UNIT of any GROUP is in zone !", 10):ToAll() +-- end +function SET_GROUP:AnyInZone(Zone) + self:F2(Zone) + local Set = self:GetSet() + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if GroupData:IsPartlyInZone(Zone) or GroupData:IsCompletelyInZone(Zone) then + return true + end + end + return false +end + +--- Iterate the SET_GROUP and return true if at least one @{GROUP} of the @{SET_GROUP} is partly in @{ZONE}. +-- Will return false if a @{GROUP} is fully in the @{ZONE} +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @return #boolean true if at least one of the @{Wrapper.Group#GROUP} is partly or completly inside the @{Core.Zone#ZONE}, false otherwise. +-- @usage +-- local MyZone = ZONE:New("Zone1") +-- local MySetGroup = SET_GROUP:New() +-- MySetGroup:AddGroupsByName({"Group1", "Group2"}) +-- +-- if MySetGroup:AnyPartlyInZone(MyZone) then +-- MESSAGE:New("At least one GROUP is partially in the zone, but none are fully in it !", 10):ToAll() +-- else +-- MESSAGE:New("No GROUP are in zone, or one (or more) GROUP is completely in it !", 10):ToAll() +-- end +function SET_GROUP:AnyPartlyInZone(Zone) + self:F2(Zone) + local IsPartlyInZone = false + local Set = self:GetSet() + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if GroupData:IsCompletelyInZone(Zone) then + return false + elseif GroupData:IsPartlyInZone(Zone) then + IsPartlyInZone = true -- at least one GROUP is partly in zone + end + end + + if IsPartlyInZone then + return true + else + return false + end +end + +--- Iterate the SET_GROUP and return true if no @{GROUP} of the @{SET_GROUP} is in @{ZONE} +-- This could also be achieved with `not SET_GROUP:AnyPartlyInZone(Zone)`, but it's easier for the +-- mission designer to add a dedicated method +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @return #boolean true if no @{Wrapper.Group#GROUP} is inside the @{Core.Zone#ZONE} in any way, false otherwise. +-- @usage +-- local MyZone = ZONE:New("Zone1") +-- local MySetGroup = SET_GROUP:New() +-- MySetGroup:AddGroupsByName({"Group1", "Group2"}) +-- +-- if MySetGroup:NoneInZone(MyZone) then +-- MESSAGE:New("No GROUP is completely in zone !", 10):ToAll() +-- else +-- MESSAGE:New("No UNIT of any GROUP is in zone !", 10):ToAll() +-- end +function SET_GROUP:NoneInZone(Zone) + self:F2(Zone) + local Set = self:GetSet() + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if not GroupData:IsNotInZone(Zone) then -- If the GROUP is in Zone in any way + return false + end + end + return true +end + +--- Iterate the SET_GROUP and count how many GROUPs are completely in the Zone +-- That could easily be done with SET_GROUP:ForEachGroupCompletelyInZone(), but this function +-- provides an easy to use shortcut... +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @return #number the number of GROUPs completely in the Zone +-- @usage +-- local MyZone = ZONE:New("Zone1") +-- local MySetGroup = SET_GROUP:New() +-- MySetGroup:AddGroupsByName({"Group1", "Group2"}) +-- +-- MESSAGE:New("There are " .. MySetGroup:CountInZone(MyZone) .. " GROUPs in the Zone !", 10):ToAll() +function SET_GROUP:CountInZone(Zone) + self:F2(Zone) + local Count = 0 + local Set = self:GetSet() + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if GroupData:IsCompletelyInZone(Zone) then + Count = Count + 1 + end + end + return Count +end + +--- Iterate the SET_GROUP and count how many UNITs are completely in the Zone +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @return #number the number of GROUPs completely in the Zone +-- @usage +-- local MyZone = ZONE:New("Zone1") +-- local MySetGroup = SET_GROUP:New() +-- MySetGroup:AddGroupsByName({"Group1", "Group2"}) +-- +-- MESSAGE:New("There are " .. MySetGroup:CountUnitInZone(MyZone) .. " UNITs in the Zone !", 10):ToAll() +function SET_GROUP:CountUnitInZone(Zone) + self:F2(Zone) + local Count = 0 + local Set = self:GetSet() + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + Count = Count + GroupData:CountInZone(Zone) + end + return Count +end ----- Iterate the SET_GROUP and call an interator function for each **alive** player, providing the Group of the player and optional parameters. ---- @param #SET_GROUP self diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 2d845a9f2..3964388f1 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -555,22 +555,23 @@ end function GROUP:IsPartlyInZone( Zone ) self:F2( { self.GroupName, Zone } ) - local PartlyInZone = false + local IsOneUnitInZone = false + local IsOneUnitOutsideZone = false for UnitID, UnitData in pairs( self:GetUnits() ) do local Unit = UnitData -- Wrapper.Unit#UNIT if Zone:IsVec3InZone( Unit:GetVec3() ) then - PartlyInZone = true + IsOneUnitInZone = true else - -- So, if there were groups in the zone found, and suddenly one NOT in the zone, - -- then the group is partialy in the zone :-) - if PartlyInZone == true then - return true - end + IsOneUnitOutsideZone = true end end - return false + if IsOneUnitInZone and IsOneUnitOutsideZone then + return true + else + return false + end end --- Returns true if none of the group units of the group are within a @{Zone}. @@ -590,6 +591,24 @@ function GROUP:IsNotInZone( Zone ) return true end +--- Returns the number of UNITs that are in the @{Zone} +-- @param #GROUP self +-- @param Core.Zone#ZONE_BASE Zone The zone to test. +-- @return #number The number of UNITs that are in the @{Zone} +function GROUP:CountInZone( Zone ) + self:F2( {self.GroupName, Zone} ) + local Count = 0 + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Wrapper.Unit#UNIT + if Zone:IsVec3InZone( Unit:GetVec3() ) then + Count = Count + 1 + end + end + + return Count +end + --- Returns if the group is of an air category. -- If the group is a helicopter or a plane, then this method will return true, otherwise false. -- @param #GROUP self diff --git a/docs/Documentation/Cargo.html b/docs/Documentation/Cargo.html index 22c529efd..c0533186b 100644 --- a/docs/Documentation/Cargo.html +++ b/docs/Documentation/Cargo.html @@ -2847,7 +2847,6 @@ The range till cargo will board.

- CARGO_UNIT.CargoCarrier diff --git a/docs/Documentation/Group.html b/docs/Documentation/Group.html index 7404cd7ba..e415e93ed 100644 --- a/docs/Documentation/Group.html +++ b/docs/Documentation/Group.html @@ -190,6 +190,12 @@ GROUP:CopyRoute(Begin, End, Randomize, Radius)

Return the route of a group by using the Database#DATABASE class.

+ + + + GROUP:CountInZone(Zone) + +

Returns the number of UNITs that are in the Zone

@@ -680,6 +686,33 @@ When randomization is on, the randomization is within the radius.

+ +GROUP:CountInZone(Zone) + +
+
+ +

Returns the number of UNITs that are in the Zone

+ +

Parameter

+ +

Return value

+ +

#number: +The number of UNITs that are in the Zone

+ +
+
+
+
+ GROUP:Destroy() diff --git a/docs/Documentation/Positionable.html b/docs/Documentation/Positionable.html index 772ec4f21..66a0b50be 100644 --- a/docs/Documentation/Positionable.html +++ b/docs/Documentation/Positionable.html @@ -1200,6 +1200,7 @@ self

+ Core.Spot#SPOT POSITIONABLE.Spot diff --git a/docs/Documentation/Set.html b/docs/Documentation/Set.html index bf13d52ef..ed98dd773 100644 --- a/docs/Documentation/Set.html +++ b/docs/Documentation/Set.html @@ -727,6 +727,44 @@ SET_GROUP:AddInDatabase(Event)

Handles the Database to check on an event (birth) that the Object was added in the Database.

+ + + + SET_GROUP:AllCompletelyInZone(ZoneObject, Zone) + +

Iterate the SET_GROUP and return true if all the Wrapper.Group#GROUP are completely in the Core.Zone#ZONE

+ + + + SET_GROUP:AnyCompletelyInZone(ZoneObject, Zone) + +

Iterate the SET_GROUP and return true if at least one of the Wrapper.Group#GROUP is completely inside the Core.Zone#ZONE

+ + + + SET_GROUP:AnyInZone(ZoneObject, Zone) + +

Iterate the SET_GROUP and return true if at least one #UNIT of one GROUP of the SET_GROUP is in ZONE

+ + + + SET_GROUP:AnyPartlyInZone(ZoneObject, Zone) + +

Iterate the SET_GROUP and return true if at least one GROUP of the SET_GROUP is partly in ZONE.

+ + + + SET_GROUP:CountInZone(ZoneObject, Zone) + +

Iterate the SETGROUP and count how many GROUPs are completely in the Zone +That could easily be done with SETGROUP:ForEachGroupCompletelyInZone(), but this function +provides an easy to use shortcut...

+ + + + SET_GROUP:CountUnitInZone(ZoneObject, Zone) + +

Iterate the SET_GROUP and count how many UNITs are completely in the Zone

@@ -811,6 +849,14 @@ SET_GROUP:New()

Creates a new SET_GROUP object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names.

+ + + + SET_GROUP:NoneInZone(ZoneObject, Zone) + +

Iterate the SET_GROUP and return true if no GROUP of the SET_GROUP is in ZONE +This could also be achieved with not SET_GROUP:AnyPartlyInZone(Zone), but it's easier for the +mission designer to add a dedicated method

@@ -3460,6 +3506,261 @@ The GROUP

+ +SET_GROUP:AllCompletelyInZone(ZoneObject, Zone) + +
+
+ +

Iterate the SET_GROUP and return true if all the Wrapper.Group#GROUP are completely in the Core.Zone#ZONE

+ +

Parameters

+
    +
  • + +

    Core.Zone#ZONE ZoneObject : +The Zone to be tested for.

    + +
  • +
  • + +

    Zone :

    + +
  • +
+

Return value

+ +

#boolean: +true if all the Wrapper.Group#GROUP are completly in the Core.Zone#ZONE, false otherwise

+ +

Usage:

+
local MyZone = ZONE:New("Zone1")
+local MySetGroup = SET_GROUP:New()
+MySetGroup:AddGroupsByName({"Group1", "Group2"})
+
+if MySetGroup:AllCompletelyInZone(MyZone) then
+  MESSAGE:New("All the SET's GROUP are in zone !", 10):ToAll()
+else
+  MESSAGE:New("Some or all SET's GROUP are outside zone !", 10):ToAll()
+end
+ +
+
+
+
+ + +SET_GROUP:AnyCompletelyInZone(ZoneObject, Zone) + +
+
+ +

Iterate the SET_GROUP and return true if at least one of the Wrapper.Group#GROUP is completely inside the Core.Zone#ZONE

+ +

Parameters

+
    +
  • + +

    Core.Zone#ZONE ZoneObject : +The Zone to be tested for.

    + +
  • +
  • + +

    Zone :

    + +
  • +
+

Return value

+ +

#boolean: +true if at least one of the Wrapper.Group#GROUP is completly inside the Core.Zone#ZONE, false otherwise.

+ +

Usage:

+
local MyZone = ZONE:New("Zone1")
+local MySetGroup = SET_GROUP:New()
+MySetGroup:AddGroupsByName({"Group1", "Group2"})
+
+if MySetGroup:AnyCompletelyInZone(MyZone) then
+  MESSAGE:New("At least one GROUP is completely in zone !", 10):ToAll()
+else
+  MESSAGE:New("No GROUP is completely in zone !", 10):ToAll()
+end
+ +
+
+
+
+ + +SET_GROUP:AnyInZone(ZoneObject, Zone) + +
+
+ +

Iterate the SET_GROUP and return true if at least one #UNIT of one GROUP of the SET_GROUP is in ZONE

+ +

Parameters

+
    +
  • + +

    Core.Zone#ZONE ZoneObject : +The Zone to be tested for.

    + +
  • +
  • + +

    Zone :

    + +
  • +
+

Return value

+ +

#boolean: +true if at least one of the Wrapper.Group#GROUP is partly or completly inside the Core.Zone#ZONE, false otherwise.

+ +

Usage:

+
local MyZone = ZONE:New("Zone1")
+local MySetGroup = SET_GROUP:New()
+MySetGroup:AddGroupsByName({"Group1", "Group2"})
+
+if MySetGroup:AnyPartlyInZone(MyZone) then
+  MESSAGE:New("At least one GROUP has at least one UNIT in zone !", 10):ToAll()
+else
+  MESSAGE:New("No UNIT of any GROUP is in zone !", 10):ToAll()
+end
+ +
+
+
+
+ + +SET_GROUP:AnyPartlyInZone(ZoneObject, Zone) + +
+
+ +

Iterate the SET_GROUP and return true if at least one GROUP of the SET_GROUP is partly in ZONE.

+ + +

Will return false if a GROUP is fully in the ZONE

+ +

Parameters

+
    +
  • + +

    Core.Zone#ZONE ZoneObject : +The Zone to be tested for.

    + +
  • +
  • + +

    Zone :

    + +
  • +
+

Return value

+ +

#boolean: +true if at least one of the Wrapper.Group#GROUP is partly or completly inside the Core.Zone#ZONE, false otherwise.

+ +

Usage:

+
local MyZone = ZONE:New("Zone1")
+local MySetGroup = SET_GROUP:New()
+MySetGroup:AddGroupsByName({"Group1", "Group2"})
+
+if MySetGroup:AnyPartlyInZone(MyZone) then
+  MESSAGE:New("At least one GROUP is partially in the zone, but none are fully in it !", 10):ToAll()
+else
+  MESSAGE:New("No GROUP are in zone, or one (or more) GROUP is completely in it !", 10):ToAll()
+end
+ +
+
+
+
+ + +SET_GROUP:CountInZone(ZoneObject, Zone) + +
+
+ +

Iterate the SETGROUP and count how many GROUPs are completely in the Zone +That could easily be done with SETGROUP:ForEachGroupCompletelyInZone(), but this function +provides an easy to use shortcut...

+ +

Parameters

+
    +
  • + +

    Core.Zone#ZONE ZoneObject : +The Zone to be tested for.

    + +
  • +
  • + +

    Zone :

    + +
  • +
+

Return value

+ +

#number: +the number of GROUPs completely in the Zone

+ +

Usage:

+
local MyZone = ZONE:New("Zone1")
+local MySetGroup = SET_GROUP:New()
+MySetGroup:AddGroupsByName({"Group1", "Group2"})
+
+MESSAGE:New("There are " .. MySetGroup:CountInZone(MyZone) .. " GROUPs in the Zone !", 10):ToAll()
+ +
+
+
+
+ + +SET_GROUP:CountUnitInZone(ZoneObject, Zone) + +
+
+ +

Iterate the SET_GROUP and count how many UNITs are completely in the Zone

+ +

Parameters

+
    +
  • + +

    Core.Zone#ZONE ZoneObject : +The Zone to be tested for.

    + +
  • +
  • + +

    Zone :

    + +
  • +
+

Return value

+ +

#number: +the number of GROUPs completely in the Zone

+ +

Usage:

+
local MyZone = ZONE:New("Zone1")
+local MySetGroup = SET_GROUP:New()
+MySetGroup:AddGroupsByName({"Group1", "Group2"})
+
+MESSAGE:New("There are " .. MySetGroup:CountUnitInZone(MyZone) .. " UNITs in the Zone !", 10):ToAll()
+ +
+
+
+
+ SET_GROUP:FilterCategories(Categories) @@ -3884,6 +4185,51 @@ DBObject = SET_GROUP:New()
+ +SET_GROUP:NoneInZone(ZoneObject, Zone) + +
+
+ +

Iterate the SET_GROUP and return true if no GROUP of the SET_GROUP is in ZONE +This could also be achieved with not SET_GROUP:AnyPartlyInZone(Zone), but it's easier for the +mission designer to add a dedicated method

+ +

Parameters

+
    +
  • + +

    Core.Zone#ZONE ZoneObject : +The Zone to be tested for.

    + +
  • +
  • + +

    Zone :

    + +
  • +
+

Return value

+ +

#boolean: +true if no Wrapper.Group#GROUP is inside the Core.Zone#ZONE in any way, false otherwise.

+ +

Usage:

+
local MyZone = ZONE:New("Zone1")
+local MySetGroup = SET_GROUP:New()
+MySetGroup:AddGroupsByName({"Group1", "Group2"})
+
+if MySetGroup:NoneInZone(MyZone) then
+  MESSAGE:New("No GROUP is completely in zone !", 10):ToAll()
+else
+  MESSAGE:New("No UNIT of any GROUP is in zone !", 10):ToAll()
+end
+ +
+
+
+
+ SET_GROUP:RemoveGroupsByName(RemoveGroupNames) diff --git a/docs/Documentation/Spawn.html b/docs/Documentation/Spawn.html index f5ca75de3..715ca53a1 100644 --- a/docs/Documentation/Spawn.html +++ b/docs/Documentation/Spawn.html @@ -2966,7 +2966,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
- + #boolean SPAWN.SpawnUnControlled diff --git a/docs/Documentation/Spot.html b/docs/Documentation/Spot.html index 28ddf54bd..4b4f6ad96 100644 --- a/docs/Documentation/Spot.html +++ b/docs/Documentation/Spot.html @@ -138,15 +138,27 @@

Type SPOT

- - - - +<<<<<<< HEAD + + + + + + + + + @@ -180,12 +192,15 @@ +<<<<<<< HEAD +======= +>>>>>>> master +<<<<<<< HEAD +======= +>>>>>>> master +<<<<<<< HEAD +======= +>>>>>>> master
SPOT:Destroyed() -

Destroyed Trigger for SPOT

-
SPOT:IsLasing()

Check if the SPOT is lasing

+======= +
SPOT:Destroyed() +

Destroyed Trigger for SPOT

+>>>>>>> master +
SPOT:LaseOff() +

LaseOff Trigger for SPOT

+
SPOT:LaseOn() +

LaseOn Trigger for SPOT

SPOT:OnAfterDestroyed(From, Event, To)

Destroyed Handler OnAfter for SPOT

SPOT:OnAfterLaseOff(From, Event, To)

LaseOff Handler OnAfter for SPOT

@@ -198,12 +213,15 @@
SPOT:OnBeforeDestroyed(From, Event, To)

Destroyed Handler OnBefore for SPOT

SPOT:OnBeforeLaseOff(From, Event, To)

LaseOff Handler OnBefore for SPOT

@@ -252,12 +270,15 @@
SPOT:__Destroyed(Delay)

Destroyed Asynchronous Trigger for SPOT

SPOT:__LaseOff(Delay)

LaseOff Asynchronous Trigger for SPOT

@@ -311,31 +332,53 @@
- -SPOT:Destroyed() - -
-
- -

Destroyed Trigger for SPOT

- -
-
-
-
- +<<<<<<< HEAD SPOT:IsLasing() +======= + +SPOT:Destroyed() +>>>>>>> master
+<<<<<<< HEAD

Check if the SPOT is lasing

Return value

#boolean: true if it is lasing

+======= +

Destroyed Trigger for SPOT

+>>>>>>> master + +
+
+
+
+ + +SPOT:LaseOff() + +
+
+ +

LaseOff Trigger for SPOT

+ +
+
+
+
+ + +SPOT:LaseOn() + +
+
+ +

LaseOn Trigger for SPOT

@@ -432,6 +475,8 @@ true if it is lasing

+<<<<<<< HEAD +======= SPOT:OnAfterDestroyed(From, Event, To) @@ -463,6 +508,7 @@ true if it is lasing

+>>>>>>> master SPOT:OnAfterLaseOff(From, Event, To) @@ -525,6 +571,8 @@ true if it is lasing

+<<<<<<< HEAD +======= SPOT:OnBeforeDestroyed(From, Event, To) @@ -561,6 +609,7 @@ true if it is lasing

+>>>>>>> master SPOT:OnBeforeLaseOff(From, Event, To) @@ -681,6 +730,10 @@ true if it is lasing

+<<<<<<< HEAD + +SPOT.Spot +======= SPOT.SpotIR @@ -696,6 +749,7 @@ true if it is lasing

SPOT.SpotLaser +>>>>>>> master
@@ -720,6 +774,8 @@ true if it is lasing

+<<<<<<< HEAD +======= SPOT:__Destroyed(Delay) @@ -741,6 +797,7 @@ true if it is lasing

+>>>>>>> master SPOT:__LaseOff(Delay)