diff --git a/Moose Development/Moose/Functional/Spawn.lua b/Moose Development/Moose/Functional/Spawn.lua index 6560044d5..e92625849 100644 --- a/Moose Development/Moose/Functional/Spawn.lua +++ b/Moose Development/Moose/Functional/Spawn.lua @@ -47,6 +47,9 @@ -- * @{#SPAWN.InitRepeat}(): Re-spawn groups when they land at the home base. Similar methods are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. -- * @{#SPAWN.InitRandomizeUnits}(): Randomizes the @{Unit}s in the @{Group} that is spawned within a **radius band**, given an Outer and Inner radius. -- * @{#SPAWN.InitRandomizeZones}(): Randomizes the spawning between a predefined list of @{Zone}s that are declared using this function. Each zone can be given a probability factor. +-- * @{#SPAWN.InitAIOn}(): Turns the AI On when spawning the new @{Group} object. +-- * @{#SPAWN.InitAIOff}(): Turns the AI Off when spawning the new @{Group} object. +-- * @{#SPAWN.InitAIOnOff}(): Turns the AI On or Off when spawning the new @{Group} object. -- -- ## 1.3) SPAWN spawning methods -- @@ -238,6 +241,7 @@ function SPAWN:New( SpawnTemplatePrefix ) self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + self.AIOnOff = true -- The AI is on by default when spawning a group. self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. else @@ -275,6 +279,7 @@ function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + self.AIOnOff = true -- The AI is on by default when spawning a group. self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. else @@ -565,6 +570,31 @@ function SPAWN:InitArray( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) return self end +--- Turns the AI On or Off for the @{Group} when spawning. +-- @param #SPAWN self +-- @param #boolean AIOnOff +-- @return #SPAWN The SPAWN object +function SPAWN:InitAIOnOff( AIOnOff ) + + self.AIOnOff = AIOnOff + return self +end + +--- Turns the AI On for the @{Group} when spawning. +-- @param #SPAWN self +-- @return #SPAWN The SPAWN object +function SPAWN:InitAIOn() + + return self:InitAIOnOff( true ) +end + +--- Turns the AI Off for the @{Group} when spawning. +-- @param #SPAWN self +-- @return #SPAWN The SPAWN object +function SPAWN:InitAIOff() + + return self:InitAIOnOff( true ) +end --- Will spawn a group based on the internal index. @@ -661,6 +691,14 @@ function SPAWN:SpawnWithIndex( SpawnIndex ) self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( SpawnTemplate ) + local SpawnGroup = self.SpawnGroups[self.SpawnIndex].Group -- Wrapper.Group#GROUP + + --TODO: Need to check if this function doesn't need to be scheduled, as the group may not be immediately there! + if SpawnGroup then + + SpawnGroup:SetAIOnOff( self.AIOnOff ) + end + -- If there is a SpawnFunction hook defined, call it. if self.SpawnFunctionHook then self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 8bcd18dfe..e4ced888f 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -28,114 +28,26 @@ -- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. -- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. -- --- 1.2) GROUP task methods --- ----------------------- --- Several group task methods are available that help you to prepare tasks. --- These methods return a string consisting of the task description, which can then be given to either a --- @{Wrapper.Controllable#CONTROLLABLE.PushTask} or @{Wrapper.Controllable#CONTROLLABLE.SetTask} method to assign the task to the GROUP. --- Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. --- Each task description where applicable indicates for which group category the task is valid. --- There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks. --- --- ### 1.2.1) Assigned task methods --- --- Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. --- This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed. --- --- Find below a list of the **assigned task** methods: --- --- * @{Wrapper.Controllable#CONTROLLABLE.TaskAttackGroup}: (AIR) Attack a Group. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). --- * @{Wrapper.Controllable#CONTROLLABLE.TaskAttackUnit}: (AIR) Attack the Unit. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskBombing}: (Wrapper.Controllable#CONTROLLABLEDelivering weapon at the point on the ground. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskBombingRunway}: (AIR) Delivering weapon on the runway. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskEmbarking}: (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskEscort}: (AIR) Escort another airborne group. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskFireAtPoint}: (GROUND) Fire at a VEC2 point until ammunition is finished. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskFollow}: (AIR) Following another airborne group. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskHold}: (GROUND) Hold ground group from moving. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the group. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskLandAtZone}: (AIR) Land the group at a @{Core.Zone#ZONE_RADIUS). --- * @{Wrapper.Controllable#CONTROLLABLE.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the group at a specified alititude. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskRouteToVec2}: (AIR + GROUND) Make the Group move to a given point. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskRouteToVec3}: (AIR + GROUND) Make the Group move to a given point. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskRouteToZone}: (AIR + GROUND) Route the group to a given zone. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskReturnToBase}: (AIR) Route the group to an airbase. +-- ## 1.2) GROUP task methods -- --- ### 1.2.2) EnRoute task methods --- --- EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed: --- --- * @{Wrapper.Controllable#CONTROLLABLE.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- * @{Wrapper.Controllable#CONTROLLABLE.EnRouteTaskEngageGroup}: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- * @{Wrapper.Controllable#CONTROLLABLE.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. --- * @{Wrapper.Controllable#CONTROLLABLE.EnRouteTaskEWR}: (AIR) Attack the Unit. --- * @{Wrapper.Controllable#CONTROLLABLE.EnRouteTaskFAC}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- * @{Wrapper.Controllable#CONTROLLABLE.EnRouteTaskFAC_EngageGroup}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- * @{Wrapper.Controllable#CONTROLLABLE.EnRouteTaskTanker}: (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- --- ### 1.2.3) Preparation task methods --- --- There are certain task methods that allow to tailor the task behaviour: +-- A GROUP is a @{Controllable}. See the @{Controllable} task methods section for a description of the task methods. -- --- * @{Wrapper.Controllable#CONTROLLABLE.TaskWrappedAction}: Return a WrappedAction Task taking a Command. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskCombo}: Return a Combo Task taking an array of Tasks. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskCondition}: Return a condition section for a controlled task. --- * @{Wrapper.Controllable#CONTROLLABLE.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. --- -- ### 1.2.4) Obtain the mission from group templates -- -- Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another: -- -- * @{Wrapper.Controllable#CONTROLLABLE.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. -- --- 1.3) GROUP Command methods --- -------------------------- --- Group **command methods** prepare the execution of commands using the @{Wrapper.Controllable#CONTROLLABLE.SetCommand} method: +-- ## 1.3) GROUP Command methods +-- +-- A GROUP is a @{Controllable}. See the @{Controllable} command methods section for a description of the command methods. -- --- * @{Wrapper.Controllable#CONTROLLABLE.CommandDoScript}: Do Script command. --- * @{Wrapper.Controllable#CONTROLLABLE.CommandSwitchWayPoint}: Perform a switch waypoint command. +-- ## 1.4) GROUP option methods +-- +-- A GROUP is a @{Controllable}. See the @{Controllable} option methods section for a description of the option methods. -- --- 1.4) GROUP Option methods --- ------------------------- --- Group **Option methods** change the behaviour of the Group while being alive. +-- ## 1.5) GROUP Zone validation methods -- --- ### 1.4.1) Rule of Engagement: --- --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROEWeaponFree} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROEOpenFire} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROEReturnFire} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROEEvadeFire} --- --- To check whether an ROE option is valid for a specific group, use: --- --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROEWeaponFreePossible} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROEOpenFirePossible} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROEReturnFirePossible} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROEEvadeFirePossible} --- --- ### 1.4.2) Rule on thread: --- --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROTNoReaction} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROTPassiveDefense} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROTEvadeFire} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROTVertical} --- --- To test whether an ROT option is valid for a specific group, use: --- --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROTNoReactionPossible} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROTPassiveDefensePossible} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROTEvadeFirePossible} --- * @{Wrapper.Controllable#CONTROLLABLE.OptionROTVerticalPossible} --- --- 1.5) GROUP Zone validation methods --- ---------------------------------- -- The group can be validated whether it is completely, partly or not within a @{Zone}. -- Use the following Zone validation methods on the group: -- @@ -145,6 +57,14 @@ -- -- The zone can be of any @{Zone} class derived from @{Core.Zone#ZONE_BASE}. So, these methods are polymorphic to the zones tested on. -- +-- ## 1.6) GROUP AI methods +-- +-- A GROUP has AI methods to control the AI activation. +-- +-- * @{#GROUP.SetAIOnOff}(): Turns the GROUP AI On or Off. +-- * @{#GROUP.SetAIOn}(): Turns the GROUP AI On. +-- * @{#GROUP.SetAIOff}(): Turns the GROUP AI Off. +-- -- @module Group -- @author FlightControl @@ -494,7 +414,7 @@ end --- Is Zone Functions +do -- Is Zone methods --- Returns true if all units of the group are within a @{Zone}. -- @param #GROUP self @@ -660,6 +580,49 @@ function GROUP:AllOnGround() return nil end +end + +do -- AI methods + + --- Turns the AI On or Off for the GROUP. + -- @param #GROUP self + -- @param #boolean OnOff The value true turns the AI On, the value false turns the AI Off. + -- @return #GROUP The GROUP. + function GROUP:SetAIOnOff( OnOff ) + + local DCSGroup = self:GetDCSObject() -- Dcs.DCSGroup#Group + + if DCSGroup then + local DCSController = DCSGroup:getController() -- Dcs.DCSController#Controller + if DCSController then + DCSController:setOnOff( OnOff ) + return self + end + end + + return nil + end + + --- Turns the AI On for the GROUP. + -- @param #GROUP self + -- @return #GROUP The GROUP. + function GROUP:SetAIOn() + + return self:SetAIOnOff( true ) + end + + --- Turns the AI Off for the GROUP. + -- @param #GROUP self + -- @return #GROUP The GROUP. + function GROUP:SetAIOff() + + return self:SetAIOnOff( false ) + end + +end + + + --- Returns the current maximum velocity of the group. -- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. -- @param #GROUP self diff --git a/docs/Documentation/Fsm.html b/docs/Documentation/Fsm.html index c3202b0b2..6327d4274 100644 --- a/docs/Documentation/Fsm.html +++ b/docs/Documentation/Fsm.html @@ -735,12 +735,6 @@ YYYY-MM-DD: CLASS:NewFunction( Params ) added

Type FSM_PROCESS

- - - -
FSM_PROCESS:AddScore(State, ScoreText, Score) -

Adds a score for the FSM_PROCESS to be achieved.

-
FSM_PROCESS:Assign(Task, ProcessUnit)

Assign the process to a Unit and activate the process.

@@ -1488,7 +1482,7 @@ A string defining the start state.

- #string + FSM._StartState @@ -1782,6 +1776,7 @@ A string defining the start state.

+ FSM.current @@ -2000,45 +1995,6 @@ Finite State Machine Table

- -FSM_PROCESS:AddScore(State, ScoreText, Score) - -
-
- -

Adds a score for the FSM_PROCESS to be achieved.

- -

Parameters

-
    -
  • - -

    #string State : -is the state of the process when the score needs to be given. (See the relevant state descriptions of the process).

    - -
  • -
  • - -

    #string ScoreText : -is a text describing the score that is given according the status.

    - -
  • -
  • - -

    #number Score : -is a number providing the score of the status.

    - -
  • -
-

Return value

- -

#FSM_PROCESS: -self

- -
-
-
-
- FSM_PROCESS:Assign(Task, ProcessUnit) diff --git a/docs/Documentation/Group.html b/docs/Documentation/Group.html index bc2c97e39..588f45ecf 100644 --- a/docs/Documentation/Group.html +++ b/docs/Documentation/Group.html @@ -105,69 +105,8 @@ If the DCS Group object does not exist or is nil, the GROUP methods will return

1.2) GROUP task methods

-

Several group task methods are available that help you to prepare tasks. -These methods return a string consisting of the task description, which can then be given to either a
-Wrapper.Controllable#CONTROLLABLE.PushTask or Wrapper.Controllable#CONTROLLABLE.SetTask method to assign the task to the GROUP. -Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. -Each task description where applicable indicates for which group category the task is valid. -There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks.

-

1.2.1) Assigned task methods

- -

Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. -This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed.

- -

Find below a list of the assigned task methods:

- - - -

1.2.2) EnRoute task methods

- -

EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed:

- - - -

1.2.3) Preparation task methods

- -

There are certain task methods that allow to tailor the task behaviour:

- - +

A GROUP is a Controllable. See the Controllable task methods section for a description of the task methods.

1.2.4) Obtain the mission from group templates

@@ -178,53 +117,15 @@ This is different from the EnRoute tasks, where the targets of the task need to

1.3) GROUP Command methods

-

Group command methods prepare the execution of commands using the Wrapper.Controllable#CONTROLLABLE.SetCommand method:

- +

A GROUP is a Controllable. See the Controllable command methods section for a description of the command methods.

-

1.4) GROUP Option methods

-

Group Option methods change the behaviour of the Group while being alive.

+

1.4) GROUP option methods

-

1.4.1) Rule of Engagement:

- - - -

To check whether an ROE option is valid for a specific group, use:

- - - -

1.4.2) Rule on thread:

- - - -

To test whether an ROT option is valid for a specific group, use:

- - +

A GROUP is a Controllable. See the Controllable option methods section for a description of the option methods.

1.5) GROUP Zone validation methods

+

The group can be validated whether it is completely, partly or not within a Zone. Use the following Zone validation methods on the group:

@@ -236,6 +137,16 @@ Use the following Zone validation methods on the group:

The zone can be of any Zone class derived from Core.Zone#ZONE_BASE. So, these methods are polymorphic to the zones tested on.

+

1.6) GROUP AI methods

+ +

A GROUP has AI methods to control the AI activation.

+ +

Global(s)

@@ -506,6 +417,24 @@ Use the following Zone validation methods on the group:

+ + + + + + + + + + + + @@ -1493,6 +1422,69 @@ The template of the Group retrieved with GROUP:GetTemplate()

+ +GROUP:SetAIOff() + +
+
+ +

Turns the AI Off for the GROUP.

+ +

Return value

+ +

#GROUP: +The GROUP.

+ +
+
+
+
+ + +GROUP:SetAIOn() + +
+
+ +

Turns the AI On for the GROUP.

+ +

Return value

+ +

#GROUP: +The GROUP.

+ +
+
+
+
+ + +GROUP:SetAIOnOff(OnOff) + +
+
+ +

Turns the AI On or Off for the GROUP.

+ +

Parameter

+
    +
  • + +

    #boolean OnOff : +The value true turns the AI On, the value false turns the AI Off.

    + +
  • +
+

Return value

+ +

#GROUP: +The GROUP.

+ +
+
+
+
+ GROUP:SetTemplateCoalition(CoalitionID, Template) diff --git a/docs/Documentation/Spawn.html b/docs/Documentation/Spawn.html index 846a7ceb0..32917f2d9 100644 --- a/docs/Documentation/Spawn.html +++ b/docs/Documentation/Spawn.html @@ -128,6 +128,9 @@ So in principle, the group list will contain all parameters and configurations a
  • SPAWN.InitRepeat(): Re-spawn groups when they land at the home base. Similar methods are SPAWN.InitRepeatOnLanding and SPAWN.InitRepeatOnEngineShutDown.
  • SPAWN.InitRandomizeUnits(): Randomizes the Units in the Group that is spawned within a radius band, given an Outer and Inner radius.
  • SPAWN.InitRandomizeZones(): Randomizes the spawning between a predefined list of Zones that are declared using this function. Each zone can be given a probability factor.
  • +
  • SPAWN.InitAIOn(): Turns the AI On when spawning the new Group object.
  • +
  • SPAWN.InitAIOff(): Turns the AI Off when spawning the new Group object.
  • +
  • SPAWN.InitAIOnOff(): Turns the AI On or Off when spawning the new Group object.
  • 1.3) SPAWN spawning methods

    @@ -317,6 +320,12 @@ A coding example is provided at the description of the Type SPAWN
    GROUP:Respawn(Template)

    Respawn the GROUP using a (tweaked) template of the Group.

    +
    GROUP:SetAIOff() +

    Turns the AI Off for the GROUP.

    +
    GROUP:SetAIOn() +

    Turns the AI On for the GROUP.

    +
    GROUP:SetAIOnOff(OnOff) +

    Turns the AI On or Off for the GROUP.

    + + + + + + + + + + + + + + + + @@ -883,6 +910,23 @@ A coding example is provided at the description of the
    + #boolean + +SPAWN.AIOnOff + +
    +
    + + + + +

    The AI is on by default when spawning a group.

    + +
    + +
    +
    + #number SPAWN.AliveUnits @@ -1098,6 +1142,68 @@ end
    + +SPAWN:InitAIOff() + +
    +
    + +

    Turns the AI Off for the Group when spawning.

    + +

    Return value

    + +

    #SPAWN: +The SPAWN object

    + +
    +
    +
    +
    + + +SPAWN:InitAIOn() + +
    +
    + +

    Turns the AI On for the Group when spawning.

    + +

    Return value

    + +

    #SPAWN: +The SPAWN object

    + +
    +
    +
    +
    + + +SPAWN:InitAIOnOff(AIOnOff) + +
    +
    + +

    Turns the AI On or Off for the Group when spawning.

    + +

    Parameter

    +
      +
    • + +

      #boolean AIOnOff :

      + +
    • +
    +

    Return value

    + +

    #SPAWN: +The SPAWN object

    + +
    +
    +
    +
    + SPAWN:InitArray(SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY) @@ -2171,7 +2277,7 @@ when nothing was spawned.

    - #number + SPAWN.SpawnMaxGroups @@ -2188,7 +2294,7 @@ when nothing was spawned.

    - #number + SPAWN.SpawnMaxUnitsAlive
    SPAWN.AIOnOff + +
    SPAWN.AliveUnits @@ -362,6 +371,24 @@ A coding example is provided at the description of the SPAWN:GetSpawnIndexFromGroup(SpawnGroup)

    Get the index from a given group.

    +
    SPAWN:InitAIOff() +

    Turns the AI Off for the Group when spawning.

    +
    SPAWN:InitAIOn() +

    Turns the AI On for the Group when spawning.

    +
    SPAWN:InitAIOnOff(AIOnOff) +

    Turns the AI On or Off for the Group when spawning.