Commit graph

3418 commits

Author SHA1 Message Date
6255cf8814 #W# Era: Changed from UOR back to AOS. 2026-10-23 17:19:42 -04:00
fc38c54767 #W# Added: New Skill guide button added to the crafting menu. 2026-10-23 14:38:01 -04:00
92af75f796 #W# Change: Ore now gets smelted 1 at a time instead of the whole stack. Gain chance on each attempt. 2026-10-23 13:09:04 -04:00
4e4391e1dd #W# Region: Region Tweak. 2026-10-22 15:48:08 -04:00
6cd2f766da #W# Added: New player area at the entrance of the dungeon. Added some npcs. 2026-10-22 14:23:16 -04:00
48358c80df #W# Dungeon: New player dungeon is spawned and ready to go. 2026-10-22 13:04:47 -04:00
7ddbb1efde #W# Dungeon: Changed the New Player Dungeon. 2026-10-22 10:53:08 -04:00
dd197bbc1c #W# Fix: Traps where still being spawned fixed now. 2026-10-20 19:53:09 -04:00
11cf73428d #W# Region: Added a new Cave Region. 2026-10-20 19:35:43 -04:00
162af7b68a #W# Added: New ThiefPedestals that only require stealing/snooping, but are also trapped. 2026-10-20 19:14:41 -04:00
0148f6d1fc #W# Added: Taskmanager now has a 4 hour timer running. 2026-10-20 19:13:16 -04:00
94762a9c9d #W# Town: Added new town of Mearid. 2026-10-20 19:12:08 -04:00
5aa5797b2f #W# Tweak: Lower delay for playing and instrument from 6 to 1 second. 2026-10-17 21:55:01 -04:00
e46bb9d4a5 #W# Tweak: Map tweak. 2026-10-16 17:19:22 -04:00
555806150f #W# TreasureMaps: Maps now have there own gump. Level 6 maps are locked behind power scrolls. Need a min of 100.1 to attempt them. 2026-10-16 16:09:16 -04:00
c789630cd5 #W# Typo: Fixed a Typo. 2026-10-16 14:01:37 -04:00
17f0b6926c #W# Fix: Stopped the 'You lost a little bit of karma' message when you actually didn't. 2026-10-16 13:26:58 -04:00
a4d7500518 #W# Fix: Dungeon traps and there spawners now get deleted if they where prevously enabled. 2026-10-16 12:57:41 -04:00
9c3ae44601 #W# Spawn: Moved dungeon floor traps file to Underworld folder. 2026-10-16 11:26:44 -04:00
84fa7c1522 #W# Region: Fixed a region issue. 2026-10-16 09:49:35 -04:00
3247cd98a3 #W# Traps: Tweaked trap damage. 2026-10-16 08:42:15 -04:00
b19ac1ce57 #W# Tweak: Tweaked some stat based skills. 2026-10-15 19:44:21 -04:00
a055a9e525 #W# Traps: New region traps tweaked. Also give skill gains. Settings to disable messages. 2026-10-15 11:44:39 -04:00
becd970525 #W# Command: Added [WipeTraps command to clear floor traps. 2026-10-15 10:39:33 -04:00
2d26a23278 #W# Tweak: Disabled taskmanager tasks for now. 2026-10-15 10:33:43 -04:00
c43f543611 #W# Traps: Added Dungeon traps that are step based but can be avoided with skill/armor/stats. New settings in Settings.cs 2026-10-14 15:19:54 -04:00
c66ce46f90 #W# Tweak: Moongates now hide you when you use them. 2026-10-14 13:31:23 -04:00
d5f10e58dc #W# Fixes/Tweaks: A few tweaks and fixes. Fixed escort quest locations. added names to dyetubs. Moongates now have checks and hide you. 2026-10-14 12:14:51 -04:00
b23e5fdd52 #W# MLQuests: Escortable quests are now working. I just need to add more of them. Added moongate to Shiver Island. 2026-10-14 08:31:58 -04:00
ac47317723 #W# Cliloc: Issue with Bandage.cs and wrong cliloc. 2026-10-13 20:49:30 -04:00
7c29f6a55c #W# Change: Bandage's now do a small HoT. You get a small drip of health every second that takes a way from the end total healing points. Dungeons now give a 1.5 skill gain chance. 2026-10-13 20:28:03 -04:00
5be7c8be6c #W# Fix: New Player Dungeon teleporter fix. 2026-10-13 19:21:19 -04:00
ef210f1ab0 #W# Fixes: Fixed messed up spawns. 2026-10-13 13:09:05 -04:00
9e2e6c13b6 #W# Bounty: Bounty tiers are done. 2026-10-12 19:42:47 -04:00
9394d7cc3e #W# File: Added a Corpse retreival sytem to look in to adding later. 2026-10-12 13:57:56 -04:00
c5534bdd37 #W# Spawn: Finishing up Overworld npc/animal spawns. 2026-10-12 12:06:05 -04:00
13d13ca979 #W# Spawn: Fairwinds is now spawned. Added new GreetingInnRegion. 2026-10-12 11:14:06 -04:00
d8db393d1a #W# Added: Made a custom moongate and gump. 2026-10-11 19:21:44 -04:00
282fd94fd2 #W# Added: Treasure bags now spawn in dungeons 2026-10-11 19:21:04 -04:00
128bececce #W# Added: Treasure bags are like treasure chests but theres a chance they may not be locked or trapped for less loot. 2026-10-11 16:08:46 -04:00
e15fde2e97 #W# Statusbar: Removed tithing points (UOR). 2026-10-11 11:13:38 -04:00
c630502c8d #W# Added: There is now a delay setting for the dungeon bounty timers in Settings.cs. 2026-10-11 08:59:37 -04:00
ad38314ca7 #W# Confict: Fixed BaseCreature git merge conflict. 2026-10-10 23:17:41 -04:00
08fd68b9d0 #W# Factions: Disabled the faction regions. 2026-10-10 23:05:33 -04:00
4160a83eaa #W# Removed: Removed ToT Stuff. 2026-10-10 21:21:57 -04:00
624de0f229 #W# Tweak: Disabled mount stamina. So annoying. 2026-10-10 21:05:01 -04:00
314fbf0003 #W# Bounty: Doing some bounty tier work. 2026-10-10 20:03:24 -04:00
c672cda6dc #W# Tweak: Removed -Karma from some animals. 2026-10-10 19:49:58 -04:00
25d3f980f2 #W# Tweak: Make a few tweaks. Also added Tier list of mobs by fame. 2026-10-10 13:42:41 -04:00
Kamron Batman
d857f03b68
fix: bound and purge NPC vendor buyback stock (#2677)
## Summary

Stacked on #2676. Review that first; this PR's diff is against it.

Items players sell to NPC vendors go into the vendor's buyback (`ShopBuy`) pack. That pack was purged only when someone opened the buy menu, so a vendor that players sold to but never bought from grew without limit.
- A server operator reported 250k+ items piling up from players crafting and selling on a macro.
- Every one of those items was saved.
- Purging or deleting that vendor then sent one remove packet per item to every nearby client and disconnected them.

The behavior is inherited from RunUO.

- **`VendorBuybackPack`** replaces the plain backpack on `Layer.ShopBuy`.
  - It opts in to `SkipsChildSerialization`, so buyback items are never saved.
  - Its contents are private like any container's, so removing them reaches only the vendor (no client) and openers. Purges and deletes send nothing to bystanders.
- **Capacity.** The buyback holds at most `250 − buy-list entries` items, which is what the buy gump can show. The oldest items are evicted first. At capacity 0 the sold item is consumed and the seller is still paid.
- **Purge on the restock grid.**
  - `Restock()` empties the buyback.
  - A purge-only timer, armed on the first sale, covers vendors nobody buys from. It is due at the next restock boundary after now, so a vendor whose restock hasn't run for hours doesn't purge an item the moment it's sold.
  - The timer never restocks, so stock doubling and halving is unchanged.
  - The old per-item one-hour `LastMoved` check is gone.
- **Existing saves.** A legacy `ShopBuy` pack is replaced on the first tick after load. Thanks to #2676, deleting a pack of 250k+ items takes well under a second.

**Behavior changes for shard operators:**
- A buyback item lasts until the next restock boundary (at most `RestockDelay`), not one hour after its sale.
- A vendor that changes maps drops its buyback.
- A buy window that is open during a purge can show a row whose item is gone. Buying that row does nothing, and reopening shows the current list.

## Test plan

- [x] `VendorBuybackPackTests`: evicts oldest first; capacity 0 consumes the item; purge; a stale front entry can't spin eviction
- [x] `VendorBuybackTests`:
  - purge due time stays on the restock grid, including a stale restock and a restock time in the future;
  - partial stack sale: the split goes to buyback and the seller keeps the remainder;
  - zero capacity consumes the item and still pays;
  - restock purges and clears the timer, and the next sale re-arms it;
  - deleting the vendor cancels the timer;
  - a legacy 20k-item pack is replaced.
- [x] UOContent.Tests and Server.Tests green; schema generator clean
- [x] Manual in-game pass:
  - sell and buy back, including a partial stack;
  - over-capacity sale;
  - purge with no buyer;
  - `[restock`;
  - vendor facet change;
  - restart;
  - legacy save with a large `ShopBuy` pack;
  - mass selling with bystanders present;
  - deleting a vendor with a full buyback.
2026-10-09 22:56:39 -07:00