* Add trader/buyer cleanup actions
Add trader/buyer db cleanup for
- on zone idle
- on client first login
- when world drops a zone connection
- in Client::ProcessMovePC
Cleanup several compiler warnings
* Formatting Updates
When dynamic zones are cached on zone boot each dz requests member
statuses from world separately. This causes a lot of network traffic
between world and booted zones when there are a lot of active dzs.
This changes it to make a single request to world on zone boot and a
single bulk reply back.
* Save spawns
* Update base_zone_state_spawns_repository.h
* Zone state save work
* Code cleanup
* More cleanup
* Database migration
* Update database_update_manifest.cpp
* Revert decay at storage model
* Code cleanup
* More cleanup
* More cleanup
* More cleanup
* Entity variables
* Add entity variables to the schema
* Post rebase
* Checkpoint
* Serialize / deserialize buffs
* Current hp / mana / end save / load
* Save / load current_waypoint
* Add zone spawn protection
* Finishing touches
* Cleanup
* Update zone_save_state.cpp
* Cleanup
* Update zone_save_state.cpp
* Update npc.cpp
* Update npc.cpp
* More
* Update perl_npc.cpp
* Update zone_loot.cpp
This removes the separate Expedition class and moves lockout code and
/dz command handlers into DynamicZone classes. It also refactors some
code to reduce bloat and some database usage.
This completes the effort of moving everything to DynamicZone that
started when implementing shared tasks. It also makes sense to do this
since expeditions are just dynamic zones internally despite dzs being
used for other types. Expedition specific things are just handled with
dz type checks.
Functionally nothing should change. This is mainly internal refactoring
and moving code around along with some bug fixes and reduced database
usage.
Main changes:
- The `expeditions` database table has been removed
- Expeditions no longer use a separate id, the expedition id is just the dz id
- Expedition lock state and replay timer option were moved to the
`dynamic_zones` table
- Expeditions no longer have a separate cache from dynamic zones
- Expedition creation no longer has every zone query the database to cache it
- Expedition internal lockouts are now stored on DynamicZone
- The `expedition_lockouts` table has been renamed to `dynamic_zone_lockouts`
- Fixed a small bug with the UpdateLockoutDuration api where the
internal lockout would get the time added twice in memory in the
initiating zone (this api is likely rarely used)
- Fixed an issue where use of the group/raid DoesAnyMemberHaveExpeditionLockout
api would query once for every out of zone character.
- This api now checks all members in the current zone first and only
performs a single bulk query for out of zone members if that check
is exhausted
- Deprecated the max_check_count param of DoesAnyMemberHaveExpeditionLockout,
the quest api still exists to avoid api break but a passed arg has no effect
* Fix two parcel bugs
Fix two Parcel Bugs
- If a player was at their parcel limit and perform a bazaar purchase via parcel delivery, their money would be lost
- If a container with items was delivered via parcel, the parcel under certain inventory conditions could be delivered into an incorrect slot resulting in the container being lost.
* Incorrect field used for BagSize vs ItemSize. Silly mistake.
* Remove duplicate check and reorder stacking check
* Fix edge case when Parcel Window remains open and Bazaar purchases are made.
* Repair
- bazaar purchase of items with charges reverting to 1 charge in error
- bazaar visual error with selling price. Was caused by the parcel fee not being properly reflected in the client
- corrected a type mismatch with parcel fee uint32 vs uin64
- corrected a few TraderPurchase and TraderSell event data points by splitting quantity and charges
* Formatting
* Use pre-existing AddMoney and TakeMoney and remove unnecessary routines
* Updates after rebase
* First pass of player_event_loot_items
* Second pass of player_event_loot_items
* Third pass of player_event_loot_items
* Example without RecordDetailEvent template
* Cleanup the removal of the template
* Fourth Pass
Add retention for etl tables
Rename tables/fields to etl nomenclature
Combine database work to one atomic load
* Reposition to reduce db tasks
* Refactor etl processing for easier additions
* Add merchant purchase event
testing passed though appears that the event itself has a few bugs. Will fix them in another commit
* Fix PlayerEventMerchantPurchase in client_packet.cpp
* WIP - Handin
* Handin Event added
* Cleanup
* All a rentention period of 0 days which deletes all current records.
* Updates
Cleanup and refactor a few items.
* Cleanup and Formatting
Cleanup and Formatting
* Add etl for
Playerevent::Trade
PlayerEvent::Speech (new event to mirror functionality of qs_speech
* Add etl for
Playerevent::KilledNPC, KilledNamedNPC and KilledRaidNPC
* Add etl for Playerevent::AA_purchase
Add etl for Playerevent::AA_purchase
* Cleanup before PR
* Review comment updates.
* Add world cli etl:settings to output a json on all player event details.
* Add reserve for all etl_queues
Correct a failed test case for improper next id for etl tables when table is first created.
* Potential solution for a dedicated database connection for player events.
* Simple thread for player_events. Likely there is a better way to do this.
* Add zone to qs communications for recordplayerevents
First pass of enabling zone to qs direct transport to allow for PlayerEvents to bypass world.
* Cleanup a linux compile issue
* Add augments to LOOT ITEM and DESTROY ITEM
* Add augments to ITEMCREATION, FORAGESUCCESS, FISHSUCCESS, DESTROYITEM, LOOTITEM, DROPPEDITEM, TRADERPURCHASE, TRADERSELL, GUILDTRIBUTEDONATE and cleaned up the naming convention of augments
* Formatting fixes
* Swap out GetNextTableId
* Statically load counter
* Add counter.clear() since the counter is static
* Upload optional QS conversion scripts
* Remove all qs_tables and code referencing them
* Update database.cpp
* Simplify ProcessBatchQueue
* Simplify PorcessBatchQueue
* Simplify event truncation
* Build event truncation to bulk query by retention groups
* Post rebase
* Update player_events.h
* Fix build
* Update npc.cpp
* First pass of direct zone to qs sending for player events
* Remove keepalive logic
* Fix event ordering
* Cleanup
* Update player_event_logs.cpp
* Wipe event data after ETL processed
* Split up database connections, hot reload logs for QS
* Load rules from database vs qs_database
* Update player_event_logs.cpp
* Hot toggle queryserv connect
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* Update trader add/remove to limit for RoF2
Update trader add/remove to limit for RoF2
* Update for feedback
---------
Co-authored-by: Mitch Freeman <neckkola@gmail.com>
* First pass to enable trader 'Find Trader' functionality
* Move SendBulkTraders out of zoning routines and send as part of the opening of the bazaar search window.
Add zone instance to SendBulkTraders to support multi-instanced bazaars.
* Add Barter/Buyer Features
Adds barter and buyer features, for ROF2 only at this time including item compensation
* Remove FKs from buyer tables
Remove FKs from buyer tables
* Bug fix for Find Buyer and mutli item selling
Update for quantity purchases not correctly providing multi items.
Update for Find Buyer functionality based on zone instancing.
Update buyer messaging
Update buyer LORE duplicate check
* Revert zone instance comment
* Revert zone_id packet size field
* Add zone instancing to barter/buyer
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* Add RoF2 Bazaar Support
Enable RoF2 bazaar features
* Add augments to Trader Items
* Cleanup
Cleanup of formatting and unused functions
* Update PlayerProfile for correct char_id in trader transactions. Further cleanup.
* Add parcel delivery price functionality
Add parcel delivery price functionality via rules and new delivery cost struct.
* Add RoF support for bazaar window outside of bazaar with parcel delivery
* Further Testing and ActiveTransaction added
Further testing and a few fixes and messages added. Add active transaction check to ensure two clients cannot purchase from the bazaar window at the same time
* Cleanup and Formatting updates
Cleanup and Formatting updates
* Update database manifest for the trader table against default peq trader table
* Logs and formatting
* Update bazaarsearch to be content_db aware
* Fix crash
* Simplify search
* Search fixes
* Push up more search logging
* More search fixes
* Formatting
* Update trader_repository.h
* Add Rule for Bazaar Parcel Delivery
Add a rule Bazaar:EnableParcelDelivery to enable/disable bazaar parcel delivery. Default is True.
* Fix crash
* Update Bazaar Search
Adds/Tested bazaar search with move to content_db
- race, class, money, number of returned items, stats, name, slot, level, traders, local traders, specific trader.
Outstanding
- type, more stats to add (heroic, etc)
* Formatting
* Push
* Update bazaarsearch to include all stats that are available in RoF2
* Update BazaarSearch
Updates the bazaar search for item types. They should be working as per RoF2+ types.
* Formatting
* Final updates to BazaarSearch
Add search by augmentation slots available on the item.
This enables all but Prestige, which I believe are not implemented yet.
* Add Titanium functionality correct ItemType Search
Add Titanium /trader /bazaar functionality.
Added itemtype=armor bazaar search. It was missed in the search work
* Close off for loops
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* Add Parcel Feature
Add the parcel system for RoF2 client
* Fixed a duplicate define
* Reformat
reformating and review changes
* Further Formatting
* Memory Mgmt Updates
Refactored to using unique_ptr/make_unique/etc to avoid manual memory mgmt.
Other format changes
* Refactor db structure
Refactor for db structure of parcels to character_parcels
Removal of parcel_merchants
Addition of npc_types.is_parcel_merchant
Cleanup as a result
* Refactor to use item id 99990 for money transfers. Removed the money string function as a result, though simplified the messaging related to money. Other updates based on feedback.
* Move prune routine out of scheduler and into a world process.
Removed RuleI from #define
* Update
* Update database.cpp
* Update database_update_manifest.cpp
* Update main.cpp
* Update client_process.cpp
* Update parcels.cpp
* Remove parcel merchant content to optional sql instead of manifest.
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Skill Caps] Remove from shared memory and simplify
- Removes Skill Caps loading from shared memory and puts it into zone.
- Adds `id` column to `skill_caps`.
- Remove primary keys and use `id` as primary key.
- Add unique index using `skill_id`, `class_id`, `level`, and `cap`.
- Renames `class` to `class_id` in `skill_caps` table.
- Renames `skillID` to `skill_id` in `skill_caps` table.
- Regenerates Skill Caps repository.
- Adds `#reload skill_caps` to reload skill caps in real time.
* Update groups.cpp
* Update groups.cpp
* [Bug Fix] Fix Bot/Character ID Overlap in Groups
- Attempt to fix bot/character ID overlap in groups keeping bots with the same unique identifier as players from not spawning on zone.
- Adds `bot_id` to `group_id` to differentiate bots from characters and hopefully alleviate this issue.
* Update base_group_id_repository.h
* Final push
* [Feature] Add additional Guild Features
This adds the following guild features and design pattern
- the existing guild system was used
- guild features are based on RoF2 within source with translaters used to converted between client differences
- backward compatible with Ti and UF, and allows for mixed client servers
- Guild Back for Ti and UF is based on RoF2 Permissions for banking if Guild Leader does not use Ti/UF
- Guild Ranks and Permissions are enabled.
- Guild Tributes are enabled.
- Event logging via rules for donating tribute items and plat
- Rules to limit Guild Tributes based on max level of server
- Rewrote guild communications to client using specific opcodes
-- Server no longer sends a guild member list on each zone
-- Guild window is updated when a member levels, rank changes, zone changes, banker/alt status using individual opcodes
-- When a member is removed or added to a guild, a single opcode is sent to each guild member
-- This reduces network traffic considerably
Known issues:
- Visual bug only. Guild Tributes window will display a 0 for level if tribute is above max level rule setting.
- Visual bug only. Guild Mgmt Window will not display an online member if the player has 'show offline' unchecked and a guild member zones within the Notes/Tribute tab. This is resolved by selecting and de-selecting the 'Show Offline' checkbox.
* Updated RoF2 Guild Comms
Updated RoF2 Guild Comms
Update RoF2 Opcodes
Rewrote RoF2 Guild Communications using specific opcodes.
Added database changes - they are irreversible
* Formatting
* Update base_guild_members_repository.h
* Format GuildInfo
* Format GuildAction enum
* Formatting in clientlist
* quantity vs quantity
* desc vs description
* Format structs
* Inline struct values
* Formatting
* Formatting
* Formatting fixes
* Formatting items
* Formatting
* Formatting
* struct formatting updates
* Updated formatting
* Updated
- std:string items
- naming conventions
- magic numbers
* Repo refactors
Other formatting updates
* Remove test guild commands
* Updated #guild info command
* Add new repo methods for Neckolla ReplaceOne and ReplaceMany
* Fix guild_tributes repo
* Update database_update_manifest.cpp
* Phase 1 of final testing with RoF2 -> RoF2.
Next phase will be inter compatibility review
* Remove #guild testing commands
* Fix uf translator error
Rewrite LoadGuilds
* Use extended repository
* FIx guild window on member add
* LoadGuild Changes
* Update guild_base.cpp
* Few small fixes for display issue with UF
* Update guild_base.cpp
* Update guild_members_repository.h
* Update zoneserver.cpp
* Update guild.cpp
* Update entity.h
* Switch formatting
* Formatting
* Update worldserver.cpp
* Switch formatting
* Formatting switch statement
* Update guild.cpp
* Formatting in guild_base
* We don't need to validate m_db everywhere
* More formatting / spacing issues
* Switch format
* Update guild_base.cpp
* Fix an UF issue displaying incorrect guildtag as <>
* Updated several constants, fixed a few issues with Ti/UF and guild tributes not being removed or sent when a member is removed/disbands from a guild.
* Formatting and logging updates
* Fix for Loadguilds and permissions after repo updates.
* Cleanup unnecessary m_db checks
* Updated logging to use player_event_logs
* Updated to use the single opcodes for guild traffic for Ti/UF/RoF2. Several enhancements for guild functionality for more reusable code and readability.
* Update to fix Demote Self and guild invites declining when option set to not accept guild invites
* Potential fix for guild notes/tribute display issues when client has 'Show Offline' unchecked.
* Updates to fox recent master changes
Updates to fix recent master changes
* Updates in response to comments
* Further Updates in response to comments
* Comment updates and refactor for SendAppearance functions
* Comment updates
* Update client spawn process for show guild name
Add show guild tag to default spawn process
* Update to use zone spawn packets for RoF2
Removed several unused functions as a result
Updated MemberRankUpdate to properly update guild_show on rank change.
Updated OP_GuildURLAndChannel opcode for UF/RoF2
* Cleanup of world changes
Created function for repetitive zonelist sendpackets to only booted zones
Re-Inserted accidental delete of scanclosemobs
* Fixes
* Further world cleanup
* Fix a few test guild bank cases for backward compat
Removed a duplicate db call
Fixed a fallthrough issue
* Update guild_mgr.cpp
* Cleanup
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
# Corpse Overhaul
Changelog:
- Player corpses now have two timers, one specific to the rezability of the corpse and the other to cover the overall rot timer of the player corpse.
- The rezability timer is based on the online presence of the player/account and is not affected by being offline.
- The rot timer is not affected by offline/online status and will count to the rot status of the corpse.
- Corpses can be rezzed multiple times, however only the first rez that yeilds returned xp will be counted. Not other rez will return any xp. This allows for a "Poor mans COTH" as was used many times in the early eras.
- All Corpse class private/protected member variables are all now prefixed with m_
- Added Corpses logging category along with many debug logs
- Removed LoadCharacterCorpseData
- Removed LoadCharacterCorpseEntity
- Added LoadCharacterCorpse(const CharacterCorpsesRepository::CharacterCorpses, const glm::vec4 &position) which simplifies areas of consumption and reduces double queries from removing LoadCharacterCorpseData and replacing LoadCharacterCorpseEntity
- All parameters that were prefixed with in_ have been dropped
- Removed two queries from CheckIsOwnerOnline and have it query the world's CLE by account_id since that is how live works
- Regenerated repository character_corpses
- Cleaned up many list iterators to use range based for loops
- Rate limit Corpse::Process m_is_rezzable with a 1 second check timer
- General code cleanup
- Added a Server Up check to bury all corpses in instances to prevent lost corpses if an instance is released during server down. This facilitates player recovery via shadowrest or priests of luclin.
This PR also now fixes a long standing issue with HasItem performance in our script plugins. It is significantly faster, we will need to coordinate quest changes and comms with operators.
```lua
if ($client->HasItemOnCorpse($item_id)) {
return 1;
}
```
```lua
--corpse
if self:HasItemOnCorpse(itemid) then
return true
end
```
Testing Completed:
- Create a Corpse
- Standard rezzing
- Ghetto Coth (No Extra XP)
- Rezzing after graveyard move
- Divine Rez works as intended
- No XP Rez (Corpse Call) does not give XP
- Corpse Burying
- Cross Instance Graveyard Corpse movement/Rezzing
- DZ End/Quit Corpse Movement/Rezzing
- Server Shutdown/Reinit DZ Corpse Movement/Rezzing
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Base Data] Remove from shared memory and simplify
- Removes Base Data loading from shared memory and puts it into zone.
- Changes type of `level` and `class` to `uint8_t` from `uint32_t` for consistency since we're renaming fields here anyway.
- Renames `unk1` to `hp_regen` in `base_data` table.
- Renames `unk2` to `end_regen` in `base_data` table.
- These changed fields were already mapped, we just hadn't renamed them for whatever reason.
- Regenerates Base Data repository.
- Adds `#reload base_data` to reload base data in real time.
* Cleanup
* Update shareddb.h
* Cleanup.
* Update shareddb.cpp
* Update main.cpp
* [Factions] Remove from shared memory and simplify
- Removes factions from shared memory and moves to zone based storage of repositories and changes the NPC `faction_list` to also use repositories.
- This affects NPC Factions and Faction Associations.
* Bug fixes.
* Update client.cpp
* Update client.cpp
* Update client.cpp
* Cleanup
* Update client.cpp
* Update client.cpp
* Update client.cpp
* Final push
* Update CMakeLists.txt
* Consolidate reloading.
* [Cleanup] PR # 3999 (#4039)
* [Fixes for PR # 3999
* [Reload actual in game factions, not just the umbrella data.
* syntax
* Fix typo
* Foix bug where primary_faction not filled in when no hits
* Fix typos
* Fix splash factions for kills.
* Fix typo
* Fix more variable names to be accurate
* Fix Loads to load new ones as they come in.
* Load npc_factions without primary (tasks) and support old task faction
* Rename to make way for new LoadFactionAssocition (by faction_id)
* Fix some review comments
* Add code to load factions for splash tasks and quests.
* Fix issue with sign and RewardFaction, fix Log Message
---------
Co-authored-by: Paul Coene <noudess@gmail.com>
* [Bug Fix] Move break in ServerOP_WWSpell handler
# Notes
- This break was cancelling loop early, m
* [Feature] Add support to crosszone/worldwide spells to affect bot pets
* [Cleanup] Cleanup cross-zone/world-wide OPCode handling
# Notes
- Cleans up the logic greatly for cross-zone/world-wide methods since we were doing extraneous status checks and needlessly allocating memory for variables.
* Update worldserver.cpp
* [Languages] Cleanup languages constants
# Notes
- Cleanup formatting and logic where necessary.
- Cleaned up constants to use a namespace with `constexpr` instead.
- Changed `LoadCharacterLanguages` to use a repository instead.
* Lua GroupMessage uint8/language_id
* Lua More uint8/language_id