vest-patchesPatch Notes - Changelog

Version 1.5.0

10th Jan 2026

Added

  • Wall Placement Zone System: New component for positioning agents at specific spots (wall defenses, tower positions, siege scenarios).

    • New EnemyMassesWallPlacementZone component for defining placement formations in the scene

    • Spot Arrangement Types: Line, Grid, Circle, or Manual (child transforms)

    • Configurable dimensions: width/height for Line/Grid, radius/count for Circle

    • Distance-based auto-assignment: Agents within trigger radius auto-assign to nearest available spot

    • Placement Modes:

      • Instant - Teleport directly to spot (if within max distance; otherwise pathfinds until within range, then warps)

      • Pathfind - Agent walks to the spot from any distance

    • Facing Options: Face center or custom facing direction, with smooth per-agent facing enforcement

    • Editor gizmos showing spots, trigger radii, and formation bounds

    • Public API: AssignAgentsToSpots(), RemoveAgentFromSpot(), GetAssignedAgents(), FindNearestAvailableSpot(), IsPositionInZone(), RegenerateSpots()

    • Full custom editor with spot arrangement UI and runtime status display

  • RTS Controller Wall Placement Integration: Command-clicking on wall placement zones assigns selected agents to spots.

    • New settings: enableWallPlacementZones, wallPlacementZones, autoDiscoverWallPlacementZones

    • Zones auto-discovered at startup when enabled

    • Public API: DiscoverWallPlacementZones(), RegisterWallPlacementZone(), UnregisterWallPlacementZone(), WallPlacementZones property

  • Wall Placement Zone - Runtime Visualization: Optional runtime display of zone outline and spot markers.

    • Zone Outline: Optional LineRenderer draws outer shape (Line, Grid, Circle, or Manual convex hull)

    • Spot Markers: Optional sphere indicators show spot positions at runtime (available vs occupied markers/materials)

    • Custom marker prefab support, configurable marker size and outline width

    • Public methods: SetRuntimeOutlineVisible(), SetRuntimeSpotMarkersVisible()

  • Wall Placement Zone - Status Effects On Arrival: Apply status effects when agents arrive at assigned spots.

    • New settings: applyStatusEffectOnArrival, arrivalStatusEffectType, statusEffectValue, statusEffectLingerDuration

    • Supports buffs and debuffs (ArmorBuff, DamageBuff, SpeedBuff, etc.)

    • Status persists while at spot; removed (or lingers) when leaving

    • VFX Support: ParticleSystem or VFX Graph, zone-centered or per-agent VFX

    • Audio Support: Arrival/departure sounds with volume, pitch variation, spatial blend

    • Audio Pooling: Limits concurrent sounds (configurable, oldest interrupted if pool exhausted)

  • Wall Placement Zone - Combat Stance On Arrival: Auto-set stance on spot arrival (Offensive, Defensive, HoldPosition, Passive).

    • New settings: setStanceOnArrival, arrivalStance, rtsController

    • Stance applied via RTSController (fallback to direct assignment)

  • Spawn Around Target - Max Waves Limit: Limit total waves for interval spawn modes.

    • New maxWaves (0 = unlimited) for IntervalWaves and IndividualAtIntervals

    • New properties: WavesSpawned, RemainingWaves (-1 when unlimited)

    • New methods: ResetWaveCounter(), ResetAllCounters()

    • Stops automatically at limit with warning message; editor/runtime controls updated

  • Free Roam for EnemyMassesSpawnAroundTarget: Optional random patrol after spawning within a configurable radius.

    • New FreeRoamCenterMode: SpawnPosition, TargetPositionAtSpawn, CustomTransform, FollowTarget

    • New settings: enableFreeRoam, freeRoamCenterMode, freeRoamCenterTransform, freeRoamRadius, freeRoamArrivalDistance, freeRoamMinTargetDistance, freeRoamWaitTime, freeRoamUpdateInterval, pauseFreeRoamWhenEngaged, useFormationForFreeRoam

    • Gizmo visualization for radius and patrol targets

  • RTS AI Group Splitting & Flanking System: AI can split forces into tactical groups for multi-direction attacks.

    • New settings: enableGroupSplitting, maxGroupSize, minGroupSize, maxGroups, flankingDistance, flankingAngle, flankingDelay, attackDistribution

    • New TacticalGroup roles: MainForce, LeftFlank, RightFlank, RearGuard, Reserve, Bait

    • New RTSAIState.Flanking state

    • Auto-split/merge behavior based on size/casualties; difficulty affects flanking likelihood

    • Public API: ForceSplitGroups(), ForceConsolidateGroups(), ForceFlankingAttack(), GetTacticalGroup(), GetGroupAgentIndices()

    • Runtime buttons and gizmo visualization for tactical groups

Improved

  • EnemyCrowd Inspector - Attack Range Settings: Attack range fields are now always visible in the Inspector.

    • Now shown in the main "Combat Engagement" section regardless of template selection

    • Fields include: Combat Range Type, Melee Min/Max Distance, Ranged Min/Max Distance, Ranged Preferred Distance

  • Wall Placement Zone - Free Rotation During Combat: Agents assigned to spots can rotate freely to face enemies during combat.

    • Skips facing enforcement while in combat/has a target (Attacking, Approach, Blocking, Charging)

    • Returns to assigned facing direction when combat ends

  • GPUI Patchers - Conditional Compilation: GPUI patchers compile only when needed (GPUI Pro < 0.12.9).

    • GPUIPrefabManagerPatcher, GPUICameraPatcher, GPUIShaderPatcher wrapped with #if EM_GPUIP_NEEDS_PATCH

    • Setup Wizard shows patchers as "not needed" for GPUI Pro 0.12.9+

    • Reduces compilation and avoids unnecessary references on newer GPUI versions

Changed

  • Spawn Around Target - Simplified Interval Mode Logic:

    • Breaking Change: Interval modes (IntervalWaves, IndividualAtIntervals) now use only Max Waves

    • Total Agents is now only shown for AllAtOnce

    • Max Waves = 0 enables unlimited waves

    • Help text updated with clear examples; runtime controls show wave progress when limited

  • Wall Placement Zone Editor - Faction Filter: Replaced toggle list with dropdown MaskField.

    • Uses EditorGUILayout.MaskField multi-select dropdown

    • Shows "Everything" when all factions allowed (empty list internally)

    • Populates factions from CrowdController or discovers EnemyCrowd assets in project

Fixed

  • HoldPosition Stance Attack Bug: HoldPosition agents now correctly attack enemies that come within range.

    • Fix: HoldPosition now uses engagement radius (or max attack range) instead of strict melee/ranged distance checks

    • Fix: HoldPosition now participates in positioning/slot assignment so attacks can trigger

    • Hybrid factions automatically switch activeHybridMode by distance (ranged if far, melee if close)

    • Attack cooldown resets when entering HoldPosition stance to prevent stale cooldowns

  • Offensive Agents Stop After Being Hit: Offensive agents no longer stop after ranged hit-stun in developer mode.

    • Fix: Preserves attack targets during Hit and Blocking so agents resume combat after hit stun

    • Root cause: EnterCombatState cleared attackTargetTransform and attackTargetAgentIndex for non-Attacking states

  • CrowdController CombatSystem Accessor: Added public CombatSystem property to EnemyMassesCrowdController.

    • Enables access to EnemyMassesCombatSystem and subsystems (e.g., StatusEffectSystem)

    • Note: EnemyMassesCombatSystem is a plain C# class, so GetComponent<>() cannot be used

  • Spawn Around Target - Free Roam Flickering: Fixed idle/walk/run flicker during free roam patrol.

    • Fix: Sets destinations with useManualCommand: true to prevent formation overrides

    • Fix: Adds minimum travel time check before arrival detection

    • Fix: Uses NavMeshAgent remainingDistance and pathPending for robust arrival detection

    • Matches proven implementation from EnemyMassesSpawnPatrol

  • Fixed CS0108 warning in NavMeshLinkClimbableEditor.cs (DrawHeader() hiding Editor.DrawHeader()) by adding the new keyword.

  • Fixed missing #endregion in EnemyMassesRTSAI.cs causing CS1038 compiler error.

Version 1.4.1

9th Jan 2026

Fixed minor editor issue:

  • Fixed CS0108 compiler warning in `NavMeshLinkClimbableEditor.cs` where `DrawHeader()` was hiding inherited member `Editor.DrawHeader()`. Added `new` keyword to explicitly indicate intentional hiding.

Version 1.4.0

9th Jan 2026

  • New NavMeshLink-based climbing (replaces custom system) for better performance + reliability. New: NavMeshLinkClimbable (unified climbable; auto-generates NavMeshLinks) New: NavMeshLinkTraversalHandler (agent traversal + animation support) New: NavMeshLinkCrowdAnimationHandler (GPU Instancer Pro animation integration) Removed: ClimbingManager, ClimbCommandHandler Replaced: ClimbingController → NavMeshLinkTraversalHandler, ClimbableLadder/Wall → NavMeshLinkClimbable Inspector upgrades: modern custom inspector with organized foldouts

Combat Targeting (Vertical + LOS)

  • Vertical targeting: agents can properly target enemies at different heights (better multi-level combat).

  • Optional line-of-sight (LOS) validation: prevents attacking through walls/obstacles.

  • New combat settings (Combat Settings > Vertical Targeting): maxTargetHeightDifference (0 disables; recommended ~3–5 for ground units) requireLineOfSight losCheckMode: EveryCheck, ClosestCandidatesOnly (recommended), Probabilistic (best for very large crowds) lineOfSightBlockingLayers (raycast layer mask)

RTS AI System

  • New spawner: EnemyMassesSpawnAroundTarget (spawn within radius around a target Transform; supports waves/ambushes).

  • New AI opponent controller: EnemyMassesRTSAI State machine: Idle → Attacking → Retreating → Baiting AoE threat detection + configurable aggression/retreat/rally behavior

  • Spawner menu cleanup: moved to GameObject → Enemy Masses → Spawners

Networking

  • Late-joiner sync: SendFullStateToClient() + automatic sync on OnClientConnected (batched RPCs) Full snapshot includes position, rotation, health, faction, owner

  • Position sync upgrades: SyncCriticalState() now syncs position + health AgentFullState struct for complete transfers Configurable correction threshold to reduce jitter

  • Relaxed co-op validation: distance tolerance option for hit validation (useful for co-op/horde vs competitive)

  • Docs expanded: Game mode considerations (RTS vs Co-op/Horde) NavMeshAgent position synchronization Late-joiner synchronization Clearer guidance: command-based vs position-sync approaches

NGO (Netcode for GameObjects) P2P Host-Client Guide

  • Added comprehensive NGO 2.7.0 P2P Host-Client integration documentation

    • Covers: architecture overview, built-in network events, command events, NetworkBridge pattern, CrowdAgent network properties

    • Documents event structs in Arawn.EnemyMasses.Runtime.Networking (Spawn/Damage/Death/Command/HealthChange/StateChange)

Combat Stance

  • New stance: CombatStance.Passive No aggro, no attacking even when attacked Still moves/navigates/climbs normally Will attack only when given an explicit attack command

  • API/UI: EnemyMassesRTSController.SetSelectedAgentsPassive() CrowdAgent.hasManualAttackCommand RTS selection panel: passiveButton, passiveClickSfx, HandlePassiveClicked()

Performance & Animation

  • New performance preset tuned for 1000+ agents.

  • Animation stability for large crowds: fixed glitch at 1000+ agents; improved GPU Instancer Pro batching.

  • Animation/visibility improvements: Fog-hidden agents treated as offscreen (prevents stale animation state) Prioritized refresh queue to avoid starvation under throttling Throttling respected; disabled when preset is None New preset: Prioritized (visible-only animation rotation when throttling)

Fixes

  • Fixed collection-modified exception when agents complete climbing.

  • Fixed StuckRecoverySystem incorrectly triggering pathPending timeouts for climbing agents.

  • Mecanim animator fallback is now try-catch wrapped (prevents crashes if parameters don’t exist).

  • GPU Instancer animation path now correctly used when climb clips are assigned.

EnemyCrowd integration (Climbing Animations)

  • New EnemyCrowd field: climbingAnimationConfig

  • New editor foldout: Animations → Climbing Animations Compute Animator clips (up/down/left/right, mount/dismount, idle, fall) Mecanim parameters (bool/float/triggers) Timing (mount/dismount durations) Workflow-aware visibility (shows only fields relevant to the selected Animator workflow)

Version 1.3.0

5th Jan 2026

🌐 Multiplayer Networking Groundwork

This release adds comprehensive networking infrastructure that allows developers to integrate their preferred multiplayer solution (Netcode for GameObjects, Mirror, Photon, FishNet, etc.) with Enemy Masses.

Setup Wizard - Network Configuration

The Setup Wizard now includes a dedicated Network Setup page:

  • Multiplayer Mode Selection - Choose from:

    • 1v1 (500 units per player)

    • 2v2 (250 units per player)

    • 1v1v1 (333 units per player)

    • FFA 4/6/8 players

    • Custom player count

  • Soft Cap Explanation - Clear guidance on the ~1000 networked unit recommendation

  • Anti-Cheat Toggle - Optional server-side cheat detection

  • Network Solution Info - Links to integration guides for NGO, Mirror, Photon, FishNet

  • Automatic Component Setup - Adds LocalNetworkAuthority and AntiCheatComponent when enabled

Network Interfaces (Runtime/Networking/)

Seven new interfaces provide clean integration points for any networking library:

  • INetworkAuthorityProvider - Central hub for network state queries

    • IsServer, IsClient, IsHost properties

    • LocalPlayerId for identifying the local player

    • IsNetworkAuthoritative(agent) for authority checks

    • Access to all other authority interfaces

  • INetworkDamageAuthority - Server-authoritative damage validation

    • ValidateDamage() for server-side damage verification

    • OnDamageApplied / OnDamageRejected events

    • Support for client-side prediction with rollback

  • INetworkCommandAuthority - RTS command validation

    • ValidateMoveCommand(), ValidateAttackCommand(), ValidateStopCommand()

    • Rate limiting and ownership validation

    • Command sequence tracking for ordering

  • INetworkSpawnAuthority - Spawn/despawn synchronization

    • RequestSpawn() / RequestDespawn() patterns

    • Network ID assignment

    • Spawn validation callbacks

  • INetworkStateSync - State synchronization

    • SyncAgentState() for periodic sync

    • Delta compression support

    • Priority-based sync frequency

  • INetworkProjectileAuthority - Projectile network events

    • OnProjectileFired / OnProjectileHit events

    • ProjectileNetworkData struct for serialization

  • INetworkOwnership - Player ownership tracking

    • GetOwner() / SetOwner() for agents

    • Ownership transfer support

Network Events on Controllers

  • EnemyMassesCrowdController now fires:

    • NetworkEventAgentSpawned with full SpawnEventData

    • NetworkEventAgentDied with DeathEventData

    • NetworkEventAgentsDespawned for batch despawns

  • EnemyMassesRTSController now fires:

    • NetworkEventMoveCommand with formation data

    • NetworkEventAttackCommand with target info

    • NetworkEventStopCommand

  • EnemyMassesCombatSystem now fires:

    • NetworkEventProjectileFired

    • NetworkEventProjectileHit

Sample Implementation

  • LocalNetworkAuthority - Reference implementation for single-player/testing

    • Pre-configured for local authority (all operations approved)

    • Demonstrates proper interface implementation

    • Custom editor with Network Settings tab

Documentation

  • multiplayer-integration-guide.md - Complete integration guide

  • multiplayer-security-hardening.md - Security best practices


🛡️ Security Hardening (Anti-Cheat)

Comprehensive security hardening to protect competitive multiplayer games from common cheats.

Phase 1: Field Encapsulation (CrowdAgent)

Critical fields converted to properties with security guards:

Field
Protection

health

Blocks unauthorized health increases

isDead

Prevents resurrection hacks

isInvulnerable

Blocks god mode on non-authoritative clients

ownerPlayerId

Prevents ownership hijacking

enemyCrowdIndex

Blocks team/faction switching

nextAttackTime

Prevents attack speed hacks

Server-authoritative bypass methods added:

  • SetHealthAuthoritative()

  • SetDeadAuthoritative()

  • SetInvulnerableAuthoritative()

  • SetOwnerAuthoritative()

  • SetFactionAuthoritative()

Phase 2: Request/Validate/Apply Pattern

Damage System (EnemyMassesCombatSystem):

  • RequestDamage() - Routes through network authority

  • ApplyServerDamage() - Authoritative server application

  • RollbackDamage() - Corrects mispredicted damage

Command System (EnemyMassesRTSController):

  • RequestMoveCommand() - Validated move requests

  • RequestAttackCommand() - Validated attack requests

  • RequestStopCommand() - Validated stop requests

  • ExecuteServerXxxCommand() - Remote command execution

Phase 3: Anti-Cheat Systems (Runtime/Networking/)

NetworkDamageValidator

  • Per-agent DPS rate limiting

  • Attack range validation

  • Cooldown enforcement

  • Dead attacker rejection

NetworkCommandValidator

  • Commands-per-second rate limiting

  • Ownership verification

  • Agent count limits per command

  • Command range validation

SpeedHackDetector

  • Movement speed validation

  • Teleport detection

  • Server/client position delta checks

  • Violation tracking with decay

  • AllowTeleport() API for legitimate teleports

StateReconciliationSystem

  • Periodic server state snapshots

  • Delta compression (only changed fields)

  • Urgent reconciliation on critical divergence

  • Client state correction

AntiCheatManager

  • Unified coordinator for all subsystems

  • Per-player suspicion tracking with decay

  • Configurable sensitivity presets (Default/Strict/Lenient)

  • Events: OnCheatDetected, OnPlayerFlaggedAsCheater

  • Comprehensive statistics tracking

AntiCheatComponent (MonoBehaviour)

  • Inspector-configurable anti-cheat settings

  • Runtime manager wrapper

  • Singleton access pattern

Cheat Types Detected

Cheat Type
Detection Method

SpeedHack

Velocity exceeds max speed × tolerance

Teleport

Instant large position change

DamageHack

DPS exceeds configured maximum

GodMode

Taking no damage / instant heal

CommandFlooding

Too many commands per second

OwnershipViolation

Controlling unowned units

RangeHack

Attacking from impossible range

AttackSpeedHack

Attacking faster than cooldown


🔧 Editor Tooling

Anti-Cheat Monitor Window (Debug Tool)

Tools > Enemy Masses > Network > Anti-Cheat Monitor

Editor-only debugging tool for development - not included in builds.

  • Overview Tab - Live statistics dashboard

    • Detection count, flagged players, tracked players

    • Subsystem breakdown with reject rates

    • Recent activity feed

  • Players Tab - Per-player suspicion visualization

    • Color-coded suspicion bars (green→yellow→orange→red)

    • Reset/Flag buttons per player

    • Search filtering

  • Detection Log Tab - Complete detection history

    • Filterable by cheat type

    • Severity-based coloring

    • Timestamps and details

  • Settings Tab - Quick preset application

AntiCheatComponent Inspector

  • Modern header with status indicator

  • Quick preset buttons (Default/Strict/Lenient)

  • Live statistics during Play Mode

  • Player suspicion visualization

  • Subsystem status indicators

Network Tab in CrowdControllerEditor

  • Network event configuration

  • Authority provider assignment

Network Events Section in RTSControllerEditor

  • Command event visualization

  • Network callback configuration


📁 New Files


⚠️ Breaking Changes

None. All changes are additive and backward-compatible with existing single-player implementations.


🔜 Future Considerations

  • Lag compensation for hit detection

  • Server-side replay validation

  • Encrypted network traffic support

  • Match result verification system


📝 Migration Guide

For Single-Player Games: No changes required. The system defaults to local authority mode.

For Multiplayer Integration:

  1. Implement the INetworkAuthorityProvider interface

  2. Assign your implementation to NetworkAuthorityProvider.Instance

  3. Subscribe to network events on controllers

  4. (Optional) Add AntiCheatComponent for server-side protection

Version 1.2.0

4th Jan 2026

Camera System: Presets, Control Handoffs, Editor UX

Added

  • New RTSCameraPreset ScriptableObject system (replaces hardcoded schemes) with: User-created preset list support in RTSCameraController Factory presets: Classic RTS, Modern RTS, Third Person, Total War, Supreme Commander Focus and Follow settings moved into presets: enableFocus, smoothFocusTransition, focusTransitionSpeed Per-preset initial setup: Initial Zoom, Pitch, Yaw

  • Runtime preset switching and management: TransitionToPreset by index, name, or reference AddPreset and RemovePreset Public preset accessors: CameraPresets, ActivePresetIndex, ActivePreset, ActivePresetName, PresetCount

  • Camera control enable/disable integration hooks: Inspector option: 'Control Active On Start' (useful for GC2) API: SetControlActive(bool) API: SyncFromCameraTransform() Properties: IsControlActive, CurrentPosition, CurrentRotation, CurrentZoom Events: OnControlEnabled, OnControlDisabled

  • Editor UX improvements: RTSCameraPreset now shows the CamEnemyMasses icon in Unity editor and inspector RTS camera editor info box when presets list is empty Drag and drop support for adding RTSCameraPreset assets into the presets list

Changed

  • Removed CameraControlScheme enum usage, camera is now preset-asset driven.

  • Focus and Follow section in the RTS camera editor now only shows the Follow Target field. Behavior settings are in the preset.

  • Scheme transition settings renamed to preset transition settings: enablePresetTransitions, presetTransitionDuration, presetTransitionCurve

  • Transition behavior updates: Transitions now use preset initialZoom and initialPitch Yaw resets to preset initialYaw when transitioning to presets with rotation disabled

  • RTS camera now skips Update processing when control is disabled.

Removed

  • CameraControlScheme enum.

  • Redundant preset fields: transitionTargetZoom, transitionTargetPitch.

Game Creator 2: Camera Transitions

Added

  • GC2 instruction: 'Transition to GC2 Camera' (disable RTS camera, enable GC2 MainCamera, transition to Shot Camera)

  • GC2 instruction: 'Transition to RTS Camera' (disable GC2 MainCamera, enable RTS camera, optional transform sync)

Changed

  • GC2 instruction InstructionTransitionRTSCameraScheme updated to use RTSCameraPreset (by reference or name lookup)

Spawning: Interval Waves and Patrol Spawners

Added

  • EnemyMassesSpawnInterval runtime component: Interval or wave spawning, start delay, max waves, and post-spawn behavior

  • EnemyMassesSpawnIntervalEditor: Modern inspector layout, runtime controls, gizmo and formation preview settings

  • EnemyMassesSpawnPatrol runtime component: Patrol spawning with free roam or waypoint patrol Formation-aware movement Option to force spawner formation even if crowd 'Override Formation' is enabled

  • EnemyMassesSpawnPatrolEditor: Patrol settings, waypoint settings, and runtime controls

Changed

  • Patrol stability improvements: Arrival checks validate distance to last patrol target to reduce retarget flicker Minimum patrol point distance and short travel-time guard Optional debug logging for patrol arrival, retargeting, navigation, overrides Staggered initial patrol updates to avoid synchronized spikes Central scheduler option to spread patrol updates across frames

Combat: Effect Zones, Range Overrides, Sight Range

Added

  • EnemyMassesCombatEffectZone: Cyclic AoE effects (status or healing), faction filters, VFX/audio cues, gizmos Optional animated radius via LineRenderer

  • Combat range override API for Hybrid crowds: Force melee, ranged, or default behavior by faction, enemy type, or agent selection

  • GC2 instruction to set combat range overrides (by faction, type, agent, or RTS selected agents)

  • EnemyCrowd editor now exposes 'Sight Range' in the Combat tab (for fog reveal radius config)

Changed

  • Effect zone radius line renders only while active, fades in/out on activation

  • Effect zone pooled particle VFX are stopped before disabling on stop/disable

RTS: World Anchors, Markers, Waypoint Patrol, Commands

Added

  • EnemyMassesRTSWorldAnchor: Faction, minimap color, fog reveal radius

  • Custom inspectors with modern layout and quick actions: EnemyMassesRTSWorldAnchor EnemyMassesRTSWorldMarker

  • Hierarchy context menu entries for: Spawners (Interval, Trigger, Start, Patrol, Combat Effect Zone) RTS world anchors

  • Waypoint Patrol System (RTS controller): Hold Shift (configurable) while clicking to queue waypoints Loop closing by clicking near first waypoint Ping-pong paths when not looped Auto-pause on combat, resume after combat ends Visualization with waypoint markers and connecting lines (blue paths, green loops) Formation-aware patrol movement (type and spacing) AgentPatrolPath stores formation index, count, formation type, spacing APIs: HasPatrolPath(agentIndex), GetPatrolPath(agentIndex), ClearPatrolPath(agentIndex)

Changed

  • EnemyMassesRTSWorldMarker refactored to provide rules for anchors (fog reveal and minimap visibility per faction type)

  • Anchors auto-discover markers from parents or root children, cache results, and refresh when markers appear at runtime

  • Anchors now draw gizmos for position and fog reveal radius

  • Setup Wizard now adds EnemyMassesRTSWorldMarker when adding required scene components

  • Normal move commands now clear patrol paths for selected agents

  • Stop command clears patrol paths for stopped agents

  • RTS move command toggle and InstructionCrowdMoveInFormation option: Match formation speed to the slowest selected agent

  • Faction battle mode no longer disables NavMeshAgents with active paths, enabling patrol-like movement when no targets are assigned

UI: Health Bars and Status Effects

Added

  • EnemyMassesRTSHealthBarUI: Show per-agent health or average crowd health via UI Sliders Player and non-player faction filtering Optional labels per bar

  • EnemyMassesRTSStatusEffectUI: Show active buffs/debuffs/DOT/CC on selected agents or always-visible agents

  • Health-driven UI update events: EnemyMassesCrowdController.EventAgentHealthChanged EnemyMassesCombatSystem.OnAgentHealthChanged

Changed

  • Health bar behavior and scalability: Averages can include dead agents and preserve dead selection totals Cached aggregates with event-driven updates for large crowds Bars turn transparent at zero health Spawn group labels support tokens: {faction}, {type}, {index} Inspector includes placeholder reference and label usage guidance

Audio: Charge Attack Improvements

Changed

  • Charge attack audio respects per-faction 'Max Concurrent Sounds per Clip' for start, loop, and impact

  • Charge loop audio now uses pooled CrowdAudioManager sources instead of creating per-agent AudioSource GameObjects

Setup Wizard and Editor Maintenance

Changed

  • Setup Wizard camera section now reuses preset assets from Assets/Plugins/EnemyMasses/CameraPresets/ instead of generating new ones

  • Setup Wizard now properly references EnemyMassesRTSController in EnemyMassesCrowdController when crowd type is RTS

  • Civil waypoint hierarchy menu moved under Enemy Masses

  • Player Targets help text changed from warning to info and clarified as optional

Fixes

  • RTS command panel now correctly triggers post-combat reformation when: Strict Mode is toggled off during combat Combat stance is changed (Offensive or Defensive) during combat

  • Editor domain reload safety: EnemyMassesCrowdControllerEditor.OnEnable validates target to prevent InvalidCastException EnemyMassesRTSControllerEditor.OnEnable validates target to prevent InvalidCastException

  • RTS waypoint patrol agents properly engage enemies when targets enter aggro range (patrol pauses during combat)

Version 1.1.0

30th Dec 2025 Added

  • Player Targets list support in EnemyMassesCrowdController (multi-target, runtime add/remove helpers, list-aware accessors) + Setup Wizard UI and GC2 instructions.

  • New demo scene: RTS-Feature-Demo-CrystalSave.

  • Crystal Save integration: new Remember components to persist Enemy Masses runtime state:

  • RememberEnemyMassesCrowd,

  • RememberEnemyMassesRTSCommands,

  • RememberRTSSelectionCommandPanel,

  • RememberFogOfWarLite.

  • Attack raycasts can pick props; attack events report targetIndex = -1 for props.

  • Damageable props support (doors/objectives) via RTS attack commands:

  • IEnemyMassesDamageable + EnemyMassesDamageableObject (health, events, optional disable/destroy).

  • More GC2 events for RTS flow: Selection Changed, Agent Deselected, Selection Cleared, Move Command, plus a distance-based "On Agent In Range" event for colliderless agents.

  • WebGPU GPUI shader patcher (TreeProxy vertex requirement) + Setup Wizard integration.

  • Civil waypoints: new Lean and Sit waypoint types with reservable spots, interaction playback, durations, optional outro, editor support, and quick-create actions.

  • Formation cycling while holding the command button (scroll wheel optional, dpad/keys, or axis).

  • Social Interactions: optional start/end SFX and VFX per interaction.

  • RTS UI: RTSSelectionCommandPanel with toggle + stance/stop buttons (Offensive/Defensive/Hold strict, Stop).

  • Exposed renderer-binding controls in EnemyCrowd inspector (name field hidden when auto-find is enabled).

  • Death VFX renderer binding (better pooled spawns + skinned/mesh support):

  • Bind death VFX shape to cached SkinnedMeshRenderer / MeshRenderer.

  • Extended death FX config with renderer-binding options (bind toggle, prefer skinned, auto-find, optional name).

  • Cache per-agent renderer selection during spawn for efficient binding.

Changed

  • Auto-targeting for non-player factions now evaluates the nearest player target (not a single fixed target). Combat/spawn/trigger targeting is list-aware.

  • RTS attack command events also report non-agent targets (prop attacks).

  • RTS UI toggle renamed to "Strict Mode" (no legacy alias). Scenes/prefabs may need field reassignment.

  • Formation preview improvements: better sampling for hollow shapes and spacing-aware density (still capped at 200 markers).

  • Switching Hold to Offensive/Defensive force-exits ManualCommand.Stance behavior cleanup:

  • Switching to Offensive/Defensive clears hold/manual/formation locks so units re-engage properly.

  • Stop defaults selected agents back to non-strict Offensive.

  • Attack clears hold/manual flags before chase so units engage immediately.

  • Hold no longer cancels movement: units finish marching, then lock position and hold there.

  • NavMesh safety: only resume (isStopped=false) when agents are on the NavMesh.

  • Debug cleanup: removed HOLD DEBUG force navigation logs.

Fixed

  • Aggroed agents can retarget to a closer player target within range (reduces ignored nearby players).

  • Civil Waypoint "Add Activity" button now properly inserts a default activity entry (undo/dirty/refresh works).

Last updated