ModernUO/Projects/UOContent/Regions
Kamron Batman 1e4cdc4ab6
fix: Fixes criminals having guards called on them (#2348)
## Summary

Fixes three bugs in `GuardedRegion.CallGuards`:

- **Operator precedence bug**: The condition `!m.Region.IsPartOf(this) && !m_GuardCandidates.ContainsKey(m)`
  was inverted from intent. Replaced with explicit split: dictionary members are targeted regardless of
  region; permanent candidates (reds/AlwaysMurderer) must be inside the region.
- **Premature `break`**: Only the first guard candidate was ever processed per "guards" call.
  Removed the `break` so all valid candidates in range get a guard spawned.
- **Misleading message for permanent reds**: "Guards can no longer be called on you." (502276)
  was sent to permanent reds, but guards can *always* be called on them. Now only sent to
  temporary criminals whose guard window is actually consumed.

Also extracts `IsAlwaysGuardCandidate()` helper and simplifies `IsGuardCandidate()`.

## Edge cases verified (by analysis)

- **Multiple players call guards on same red**: `BaseGuard.Spawn` dedup (scans 15 tiles for
  existing guard with same `Focus`) prevents duplicate guards. Message suppression eliminates spam.
- **Red fights spawned guard → criminal → guards called again**: Same dedup prevents infinite
  guard spawns. Existing guard already has `Focus == red`.

## Test plan

- [ ] Temporary criminal in guarded region → guard spawns, receives "Guards can no longer be called on you."
- [ ] Permanent red (5+ kills) in guarded region → guard spawns, does NOT receive the message
- [ ] Multiple players call "guards" on same red → only 1 guard spawns
- [ ] Criminal outside region but in dictionary → still targeted by guards call from inside region
- [ ] Red outside guarded region → NOT targeted by guards call (must be inside region)
2026-03-13 17:35:47 -07:00
..
AcidRiverRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
ApprenticeRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
BaseRegion.cs feat: Replaces params array with params ReadOnlySpan (#2125) 2025-02-13 21:19:02 -08:00
BattleRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
BlackthornCastleRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
BlackthornDungeonRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
CousteauPerronHouseRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
CrystalFieldRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
DoomGuardianRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
DungeonRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
ExodusDungeonRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
ExploringDeepCreaturesRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
GreenAcresRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
GuardedRegion.cs fix: Fixes criminals having guards called on them (#2348) 2026-03-13 17:35:47 -07:00
HouseRegion.cs feat: Converts OnLogin to a coded generated event (#2070) 2025-01-17 15:21:45 -08:00
IcyRiverRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
LostCityEntranceRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
MondainRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
NewMaginciaRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
NoHousingGuardedRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
NoHousingRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
NoTravelSpellsAllowedRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
PoisonedTreeRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
PolisonedCemeteryRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
RegionJsonRegistration.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
SeaMarketRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
ToKBridgeRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
TokunoDocksRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
TombOfKingsRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
TownRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
TwistedWealdDesertRegion.cs feat: Converts OnLogin to a coded generated event (#2070) 2025-01-17 15:21:45 -08:00
UnderwaterRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
WrongJailRegion.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00
WrongLevel3Region.cs fix: Drastically simplifies regions (#1400) 2023-05-19 16:39:40 -07:00