Commit graph

3378 commits

Author SHA1 Message Date
Sergi Rosell
d26ae63e94
fix: duel teams start on their own arena points, in formation (#2686)
* fix: duel teams start on their own arena points, in formation

MoveInside clamped the team index with Math.Min instead of Math.Max, so
every team started on the west edge point. The formation rotation also
reused the already-rotated X when computing Y, stacking players on the
north and south edges, and the SW/NE corners swapped axes, which leaves
the corner formation pointing out of the arena.

* refactor: one start point index clamp for GetBaseStartPoint and MoveInside

The clamp was written twice, and only one copy was correct.

* refactor: leave the placement loop as it was

Only the rotation lines in the loop belong to the fix.
2026-10-04 17:48:10 -07:00
1be86c0a40 #W# Added: Hunger and Thirst now matter. Taking damage now gives you exhaustion points that will lower your hunger and thirst faster. 2026-10-04 18:26:52 -04:00
7ca5cd3a4e #W# Added: Added a [mystats command to view the stuff i'm tracking. 2026-10-04 12:35:56 -04:00
d7f998cf6b #W# Added: Healing bufficon. 2026-10-03 20:29:18 -04:00
65d434c44a #W# Added: Now tracking player deaths, mobs kill (need to drop gold) and total gold, doesn't have to be looted. 2026-10-03 20:07:08 -04:00
ce9983b081 #W# Added: I am now tracking monster kills. Points are based on mob fame. Also added a nice [StatusBar command. 2026-10-03 18:32:43 -04:00
86b15bbc8e #W# Region: Fixes Shames entrance region. 2026-10-03 13:02:13 -04:00
c34a5f18a5 #W# Typo: Fixed a Typo. 2026-10-03 12:57:48 -04:00
d9e52d5d0e #W# Region: Fixes Shames entrance region. 2026-10-03 12:56:37 -04:00
b787df9164 #W# Bug Fix: Removed Exile Hunter Stuff. Seems buggy. 2026-10-03 12:50:44 -04:00
9503ad1513 #W# Weather: Setup snowy weather for the winter islands. 2026-10-03 10:53:01 -04:00
db20bb768e #W# Typo: Fixed typo in region.json 2026-10-03 09:40:21 -04:00
7e67f8f93e #W# Added: MineClutter added to the ToAdd folder. 2026-10-03 09:34:51 -04:00
acbcfe729b #W# Spawns: Lots of dungeon spawn and decration work. 2026-10-02 21:21:55 -04:00
314a2384d2 #W# Added: Settings.cs has some custimizable settings exposed for easy tweaking. 2026-10-02 13:59:36 -04:00
c1c3c1b30d #W# Spawns: Covetous dungeon is spawned and doors are done. 2026-10-02 12:30:53 -04:00
292cd625c5 #W# Added: Added an Overworld dungeon region. Tweaked overworld animal spawn. 2026-10-01 20:37:16 -04:00
6213604bb1 #W# Skill: The heal skill is now activatable. It heal poison/bleed 100% has a 15 second timer. 2026-10-01 18:53:52 -04:00
e92d8ed078 #W# Change: Decided AOS would be a good expansion to use over UOR. 2026-10-01 18:32:58 -04:00
10d1368fb3 #W# Work: Working on innate abilities. 2026-10-01 17:20:22 -04:00
a628d30ed6 #W# Work: Working on innate abilities. 2026-10-01 13:45:10 -04:00
c22afc8ad6 #W# Tweak: Tweaked FarmSpawner times. 2026-10-01 11:36:01 -04:00
eb35515ad8 #W# Update: Updated BuildWorld gump. 2026-10-01 11:33:26 -04:00
e2f88e01e0 #W# Fix: Fixed wrong teleporters. 2026-10-01 10:46:45 -04:00
029b4c2bc3 #W# Gumps: Tweaked the admin gump to use the new buildworld gump. Also added [buildworld command. 2026-10-01 10:26:01 -04:00
0419e531fa #W# Spawns: Removed some empty spawners. Added Wandering Healers. 2026-10-01 09:23:31 -04:00
Kamron Batman
d4531cd94b
fix: enumerators that end early, repeat entries, or never end (#2685)
Fixes #2682. Thanks @DatMoshu for the detailed report and repro.

While fixing it I audited the other map, item and multi enumerators for the same class of defect. None repeats #2682 itself, but four others turned up. All are fixed here.

## Fixes

- **`StaticTileEnumerator` (#2682)**: `SetMulti` returned `SetTile()` for the first multi whose bounds contained the point. If that multi had no tile at the cell, the enumeration ended and every later multi in the sector was skipped. Movement and line of sight lost a floor that stood inside another multi's bounding box. It now moves on to the next multi.
- **`MultiBoundsEnumerator`**: deduplication used one static `HashSet` that every new query cleared. A query run inside another made the outer query skip multis or return them twice. Each multi is now yielded only from the sector that holds its `Location`; the bounds filter guarantees that sector is visited. A per-enumerator set covers a multi that isn't registered in that sector (components changed after placement). Normal queries allocate nothing.
- **`Item`/`Mobile`/`ClientDistanceEnumerator`**: ring sectors were bounded only by `sx >= _sectorStartX`. Ring cells past the map edge resolved to the shared invalid sector, once per cell. Entities at off-map coordinates were returned more than once, and sectors outside the query were created lazily. The check now covers all four sides. Results match the bounds enumerators, which never returned off-map entities.
- **`BaseBoat.MovingEntitiesEnumerator`**: `GetMovingEntities` handles a null map, but the enumerator constructor still called `boat.Map.GetMobilesInBounds` and threw. A boat with no map now gets empty enumerators.
- **`BaseDoor.ChainEnumerator`**: the walk stopped only on returning to the start door. Links are set in pairs, so `[ChainLink A B C` followed by `[Link B C` leaves A→B→C→B, and enumerating that chain never ended. The walk now stops on any door it has already yielded. Only reachable when `UseChainedFunctionality` is true, which is off in base and in all shipped content.

## Testing

- A regression test for each fix except the boat null guard. Each failed before its fix and passes after.
- Server.Tests 910/910. UOContent.Tests 1185 passed, 2 skipped.
- Test note: the `MultiComponentList(List<MultiTileEntry>)` constructor drops entries after the first whose `Flags` are 0. The new test multis use non-zero flags.
2026-09-30 21:24:44 -07:00
72ce92cf34 #W# Added: Added a new [bandself command. 2026-09-30 08:10:01 -04:00
Reetus
edd7553c6f
fix: a juka mage buff no longer permanently raises a juka lord (#2684)
## Summary

Fixes Juka buff so that restored values are correct.
2026-09-29 08:32:44 -07:00
2b5d1e62fc #W# Restructure: Moved around where Overworld and Underworld spawn files are. 2026-09-29 09:44:49 -04:00
67da9fd13c #W# Spawns: Dungeon Shame monster spawns done. 2026-09-29 09:43:19 -04:00
910cdde124 #W# Added: More things to the ToAdd Folder. 2026-09-28 20:41:19 -04:00
cdc061dc54 #W# Added: Added folder with things I would like to eventually add to the game. 2026-09-28 20:35:50 -04:00
19fe3f4a83 #W# Spawns: Still tweaking spawn amounts. 2026-09-28 19:21:47 -04:00
add11001a2 #W# Added: Landow is done. 2026-09-28 18:46:09 -04:00
af57fcef79 #W# Spawns: More spawn work. 2026-09-28 15:29:07 -04:00
Sergi Rosell
e440c6fafa
fix: stealing no longer takes items out of a locked container (#2681)
`TryStealItem` doesn't check for a locked container, so an item that can still be targeted inside one (the gump stays open when it gets locked, or the client targets by serial) is stolen without picking the lock. 

It now refuses with 501747 ("It appears to be locked."); GMs are exempt, and stealing the locked container itself is unchanged. It checks the lock directly rather than calling `CheckLift`, which would also refuse items in deco containers.
2026-09-28 10:32:01 -07:00
813ba0cd20 #W# Added: Added more farm plots to the farm spawner system. 2026-09-27 20:09:29 -04:00
0d3b637a45 #W# Added: Farm spawner system. 2026-09-27 18:38:26 -04:00
21286e8660 #W# Spawns: Tweaked some Overworld spawn amounts. 2026-09-27 15:35:31 -04:00
b94e0d634d #W# Change: Change Veridia's map rule set. 2026-09-27 12:56:07 -04:00
a9bec503a5 #W# Spawns: Overworld common monster spawns done. 2026-09-27 12:43:50 -04:00
accb38d7d2 #W# Spawn: Added low tier mobs to the dynamic spawner. 2026-09-26 20:15:54 -04:00
3578b6c1a8 #W# Spawn: Overworld mob forts/camps/cemeteries spawned. 2026-09-26 19:33:18 -04:00
895e18149a #W# Spawn: Overworld animal spawn is done. 2026-09-26 18:06:20 -04:00
180d5ee93d #W# Work: Added all the Overworld mob spawn regions. 2026-09-26 15:34:28 -04:00
393198aad4 #W# Work: Teleporter and go menu work. 2026-09-25 11:33:55 -04:00
Kamron Batman
225c634bf7
test: stop the 1 ms promotion window leaking out of StepCacheLifecycleTests (#2679)
## Summary

`Find_TwoPathfindsOverlappingChunks_PromoteToBuildOnSecondFind` fails intermittently in CI with `second Find through overlapping chunks must promote (got 0 builds)`.

**Cause:** `SecondTouchAfterWindow_RestartsTheCount` and `TwoFindsAcrossTheWindow_DoNotPromote` set `StepCache.Instance.MissPromotionWindowMs = 1` and never restore it, and `Clear()` does not reset it. Both classes share the `Sequential Pathfinding Tests` collection, so when a lifecycle test runs first, the promotion test's two Finds have to land within 1 ms of each other. On Linux, `Environment.TickCount` moves in coarse steps of several ms, so even a sub-millisecond test can see the window lapse. The second Find then restarts the miss count instead of promoting. On Windows the ~15.6 ms tick nearly always reads the same value for both Finds, which is why it didn't reproduce locally.

**Fix (tests only):**
- `StepCacheLifecycleTests` implements `IDisposable` and restores the window after each test.
- The promotion test sets the window it depends on (30 s) instead of inheriting it.

## Test plan

- [x] Reproduced deterministically: with a temporary 20 ms sleep between the two Finds, the test fails whenever the lifecycle tests run first and passes when run alone
- [x] With the sleep still in, the test passes with the Dispose restore alone and with both fixes
- [x] All pathfinding tests pass (123/123) with the sleep removed
2026-09-25 00:55:07 -07:00
Sergi Rosell
37a80e3447
fix: Begging's failed-roll refusal (500404) goes to the beggar, not the target (#2678)
### Summary

Fixes an issue where beggars that fail their skill check don't get the error message saying the NPC is unwilling to give them any money.
2026-09-25 00:50:10 -07:00
Kamron Batman
95177fb647
fix: a deleted character's followers, and familiars that never unregistered (#2675)
## Summary

**Followers of a deleted character.** `PlayerMobile.OnDelete` deleted stabled pets and left every active follower pointing at the deleted mobile. Pets stayed controlled by nobody, and after a restart they loaded as owned pets with no owner. Now, when a character is deleted:
- bonded or dead pets and summons (controlled or not) are deleted;
- unbonded pets are released: they go wild and despawn on the abandoned-pet timer;
- escorts and hirelings are left alone, because they already notice a deleted master and walk off on their own.

**Familiars and animated dead that never unregistered.** `BaseCreature` unregistered them in `OnAfterDelete`, after `OnDelete` had already cleared the master. Both calls did nothing, so `SummonFamiliarSpell.Table` and the animated-dead registry kept deleted creatures until the caster's next cast. The unregisters now run in `OnDelete`, before the master is cleared.

## Test plan

- [x] `DeletedMasterTests` (6 cases, all failing on main): unbonded pet released; bonded and bonded-dead pets deleted; controlled and uncontrolled summons deleted; familiar unregistered on delete
- [x] UOContent.Tests (1184 passed, 2 skipped) and Server.Tests (907) green
2026-09-24 23:01:40 -07:00