Shop restocking now works properly, with per-item-in-shop granularity as well. (Thanos tool update released that allows defining this)
Shops properly restrict ironmen from buying from player stock/overstocked items
Fully functioning individualized player stock support (need to set a server config variable to enable, disabled by default. Specifically, set personalized_shops = true in the world section of the config.)
The shop pricing formula now scales up/down with the authentic ratios based on stock quantity.
Buying or selling, for example, 1000 of an item, now does the proper calculation for each individual item in the purchase/sale rather than exchanging the full 1000 for the initial price at the time. (For example, in the old shops, feather price at full stock was, say, 6gp. You could buy 1000 feathers at once for 6000gp. Authentically, the pricing for each feather should scale as the stock goes down. Now 1000 feathers at once costs a bit over 7k gp, despite the initial price remaining 6gp.)
General store player stock is now shared between all general stores
Added interfaces for standardizing the saving/loading process for data, and allowing it to be declared independently of an entry in PlayerSaver/PlayerSaveParser
Add StartupListener interface - allows a class to call some code on server startup without adding messy code elsewhere
Add ShutdownListener interface - allows a class to call some code on server shutdown without adding messy code elsewhere
Add TickListener interface - allows a class to call some code on each tick without adding messy code elsewhere
Converted all applicable content over to using these new interfaces
Moved all the achievement diary checks out into the achievement event receiver
Refactored `ResourceGatheredEvent` -> `ResourceProducedEvent` and added a new optional field, `original` for item processing
new Event Hook system that is now used to handle Jobs, Slayer tasks and Achievement Diary systems
Added sfx for slashing webs
Music Track ID 454 "Home Sweet Home" now correctly unlocks and plays inside PoH
Fixed Dragon axe special attack
Add back deleted Seercull special attack (got caught in cleanups somewhere and erroneously deleted?)
Added Darklight special attack (its boosted bonus against Demons not added)
Positional audio support for Jewellery/Mounted Jewellery teleports
New administrative command to test drops, ::rolldrops
fixed bot dialogue to use correct playername checking post-JSON changes
Added new commands ::ge bots and ::ge botsearch
Improved ::ge buying and ::ge selling
Fixed Vinesweeper (by fixing a general bug in NPC pathfinding that affects all NPCs)
Fixed NPC safespotting (by fixing a separate general bug in NPC pathfinding)
player can now deposit items with peer the seer after completing the Fremennik Easy, Medium, or Hard diary
added fishing trawler to ::to teleport locations for admins
Fixed NPE in RangeSwingHandler
Added mystic lava staff so you can alch with it as well
Changed deposit listener so it's not specifically for peer the seer, any npc can be added
Fixed fur trader dialogue/shop now that fremmy trials works
More Relekka Dialogues, added Fisherman's dialogues before/after Fremennik Trials is done
locked thieving Rellekka stalls behind fremmy trials quest
added fur stall thieving in rellekka
fixed chieftan brundt stuck dialogue
improved checking quest requirements on equipment before equipping
fixes and additions to other rellekkan NPC dialogues
Equip listeners which accept int arrays
Fixed bug in Brundt's dialogue
Can no longer spawn multiple Koscheis by spamclicking the ladder
Can no longer repeat Peer the Seer's task infinitely
Implemented Tutorial Island
Hans EXP Rate and Ironman Mode setting functionality has been moved inside Tutorial Island (at the end with the Wizard Tutor, he will ask to set your rate and mode instead)
Added more Kurask NPC IDs to Kurask Slayer Tasks
Added more Ogre and Ogress NPC IDs to Ogre Slayer Tasks
Implemented Tribal Totem Quest
Fixed memory leaks