- License was intended to be GPLv3 per earlier commit of GPLv3 LICENSE FILE
- This is confirmed by the inclusion of libraries that are incompatible with GPLv2
- This is also confirmed by KLS and the agreement of KLS's predecessors
- Added GPLv3 license headers to the compilable source files
- Removed Folly licensing in strings.h since the string functions do not match the Folly functions and are standard functions - this must have been left over from previous implementations
- Removed individual contributor license headers since the project has been under the "developer" mantle for many years
- Removed comments on files that were previously automatically generated since they've been manually modified multiple times and there are no automatic scripts referencing them (removed in 2023)
Expansion Bitmask settings were saved by stances and should be universal for the bot.
This addresses that as well as moves the data back to the `bot_data` table instead of the `bot_settings` table.
This will check current settings saved and take the highest value of the stances to save to `bot_data`, if none are found (default), it will use the value from the rule `Bots:BotExpansionSettings`
FindFirstFreeSlotThatFitsItem was returning 0 instead of INVALID_INDEX
when no free slot was found. This caused items to be placed in slot 0
(charm equipment slot) when inventory was full, overwriting equipped items.
Changes:
- Fix FindFirstFreeSlotThatFitsItem to return INVALID_INDEX when no slot found
- Add defensive check in PutItemInInventoryWithStacking to protect equipment
slots 0-22 from being targeted for item placement
- Windows does not allow paths as mutexes
- Remove the config directory from the mutex name
- This fix has the potential for collision of concerns on Windows when running multiple instances, but it is an unlikely scenario given port requirements
making an inline global variable doesn't work around the fact that this
variable still has to be initialized at some point.
Unfortunately, logging may be called upon during static init because we
use rules inside of static initializers, and rules can log.
So we must always retrieve the logger when we want to log something. it
should be fairly cheap anyways.
* Start rewrite, add vcpkg
* Simple vcpkg manifest, will almost certainly need tweaking
* Remove cmake ext we wont be using anymore
* Update vcpkg to no longer be from 2022, update cmake lists (wip)
* Add finds to the toplevel cmakelists
* WIP, luabind and perlbind build. Common only partially builds.
* Fix common build.
* shared_memory compiles
* client files compile
* Tests and more cmake version updates
* World, had to swap out zlib-ng for now because it wasn't playing nicely along side the zlib install. May revisit.
* UCS compiles now too!
* queryserv and eqlaunch
* loginserver works
* Zone works but is messy, tomorrow futher cleanup!
* Cleanup main file
* remove old zlibng, remove perlwrap, remove hc
* More cleanup
* vcpkg baseline set for CI
* Remove pkg-config, it's the suggested way to use luajit with vcpkg but it causes issues with CI and might be a pain point for windows users
* Actually add file
* Set perlbind include dir
* Perl link got lost
* PERL_SET_INTERP causes an issue on newer versions of perl on windows because a symbol is not properly exported in their API, change the lines so it's basically what it used to be
* Remove static unix linking, we dont do automated released anymore and this was tightly coupled to that. Can explore this again if we decide to change that.
* Remove unused submodules, set cmake policy for boost
* Fix some cereal includes
* Improve some boilerplate, I'd still like to do better about getting linker stuff set.
* Going through and cleaning up the build.
* Fix world, separate out data_buckets.
* add fixes for other servers
* fix zone
* Fix client files, loginserver and tests
* Newer versions of libmariadb default to tls forced on, return to the default of not forcing that.
auto_login were breaking on linux builds
loginserver wasn't setting proper openssl compile flag
* Move set out of a giant cpp file include.
* Convert show
* convert find
* Add uuid to unix builds
* Remove some cpp includes.
* Restructure to remove more things.
* change db update manifest to header
change build yml
* Move world CLI include cpps to cmake.
* Move zone cli out of source and into cmake
* Sidecar stuff wont directly include cpp files now too.
* Fix uuid-dev missing on linux runner
* Reorg common cmake file
* Some cleanup
* Fix libsodium support (oops). Fix perl support (more oops)
* Change doc
---------
Co-authored-by: KimLS <KimLS@peqtgc.com>
Basic support for building linux and windows in pull requests and also
the master branch.
Removes search for local perl on windows. Just always use the packaged
perl until we can switch to a package manager.
Removes drone config file, since that isn't doing anything useful anymore.
* Initial plan
* Initial plan
* Enhance SummonItemIntoInventory to support stacking
Co-authored-by: Valorith <76063792+Valorith@users.noreply.github.com>
* Update .gitignore
* Revert "Update .gitignore"
This reverts commit 16159398d8a69c53a719a1d54d068bbe0fa5284c.
* Disable PCH for patch sources compiled with -O0
Disables precompiled headers for specific patch source files that are compiled with -O0 on UNIX. This avoids Clang errors caused by __OPTIMIZE__ macro state mismatches between the PCH and translation units.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
world/client.cpp's EnterWorld will correctly serve a LAN client the eqemu_config.json.world.localaddress based off IsLocalClient. It will then serve a non-LAN client the world.address value. This concept needs to be applied to UCS as that system also receives direct client connections. Inside world/client.cpp HandleEnterWorldPacket is where world sends the client info about UCS connection. This fix specifically handles the issue when you have a server on LAN and want to connect to it via another LAN computer + you have external clients.
* Add sending evolving items via parcels
Send, retrieve and inspect tested ok
* Sell evolving items to a merchant and purchase tested ok.
* Fix a problem with potions and quantity
* [Corpses] Add corpse entity variables to DB
- When corpses have entity variables add/remove/modified it will update the database accordingly.
- Corpse loading will pull the database values if they exist.
* Updates per review
* Update version.h
---------
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* [Code] LFGuildManager Global to Singleton Cleanup
* Update lfguild.h
* Update worldserver.cpp
---------
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* [Doors] Fix door saving for versions
- Door saving wasn't saving to the proper version on `#door save`
* Update doors.cpp
---------
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* [Performance] AFK Client Packet Filtering
* Player feedback
* Update client_packet.cpp
* Fixes
* Streamline updates to SetAFK
* Decouple idling and AFK and manual AFK
* Reset clock timer when we take AFK or idle off
* Exclude bard songs in non combat zones from resetting timer
* GM exclusion adjustments
* [Quest API] Add Last Login and First Login Flags to EVENT_CONNECT
* Push
* Update base_character_data_repository.h
* Update version field
---------
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* [Performance] Store Player Title Sets in Zone Memory
* Move to client memory
* Update client_packet.cpp
* Update zonedb.cpp
* Save only when necessary
* Single Insert
* Add optional insert flag
* Update client.h
* Consolidation
* 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
* [Bots] Fix bots getting stuck on ^pull
- Removed initial LoS check from bots and rely only on owner when told to ^pull. This prevents bots from getting stuck in a loop if they don't have LoS when trying to initiate the pull.
* [Bots] Add valid state checks to ^clickitem
- Bots previously weren't checking if they were in a valid state or not before trying to click an item when told (in a death state, held, feared, silenced, in group/raid, etc.)
* [Bots] Add valid state checks to ^clickitem
- Bots previously weren't checking if they were in a valid state or not before trying to click an item when told (in a death state, held, feared, silenced, in group/raid, etc.)
Miscommit
* undo
* Cleanup and Fixes
- Cleanup
- Fixed Animation Empathy checks and consolidates
- Enchanter pets will honor Animation Empathy rules all around
- Pets will properly guard if allowed when pulling
* [Bugfix] Fix uninitialized char* in object.cpp.
* [Bugfix] Clear object user and user tradeskill object on reset.
* [Bugfix] Send clear object packet on Object::Close()
* [Bots] Fix creation limit, spawn limit, level requirement checks
- Previously if buckets were being used to control any of these values and the appropriate rule was set to 0, unset class specific buckets would override the main limit buckets.
- For example, if `Bots:SpawnLimit` is set to `0` and a player has their `bot_spawn_limit` set to `5` but they don't have a class bucket set for the class they're attempting to spawn a Cleric, the unset `bot_spawn_limit_Cleric` would return 0 and prevent Clerics from being spawned.
- This affected spawn limits, creation limits and level requirements to use bots if controlled by buckets.
- `#gm on` is required to be on for those beyond the ruled min status requirements to bypass the limits.
Rewrote checks and tested every scenario of set unset rules/buckets.
* Cleanup, fix bot count
- Fixes QueryBotCount to not account for soft deleted bots (`-deleted-`)
- Casters could endlessly flee a mob if they had target reflection and were too close.
- Prevents all bots that aren't taunting from adjusting if they're too close and have target reflection. This is safer than limiting it to just casters and ranged bots to prevent situations where melee bots might not be able to outrun the mob to get to their melee range and continually flee.
- WE'LL GET THIS RIGHT EVENTUALLY /sigh
* Clean up for fear related bonus variables
SPA 181 FearResistChance (% chance to outright resist fear) and SPA 102 Fearless (on live used only on pets for full fear immunity if presents)
The way were calculating the bonuses was mixing the variables we used for each together in a way that could cause conflicts when combined with negate spell effect.
While doing some live testing was able to confirm SPA102 when cast on pets will terminate the fear on the next tick which is consistent with how we have the mechanic coded.
* Update spells.cpp
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Bots] Positioning rewrite
- Fixes positioning issues where bots could run back and forth or stay at the target's feet.
- Adds checks to ensure bots don't spam positioning updates and complete their initial positioning.
- Cleans up logic and makes it easier to read.
* Cleanup
* [Bots] Add valid state checks to ^clickitem
- Bots previously weren't checking if they were in a valid state or not before trying to click an item when told (in a death state, held, feared, silenced, in group/raid, etc.)
* Add error output on no bots selected.=
- [#4756](https://github.com/EQEmu/Server/pull/4756) changed the way overwriting worked for buffs. It allowed stronger spells to overwrite lesser spells if they were already on the target.
- However, this is a positive change but has its drawbacks with spells of similar value. It could cause an endless buff loop where they constantly replaced one another.
Overall, the con of endless buffing outweighs the benefit of automatic overwriting lesser spells and the control should be left to only spell lists via `^spells` for bot owners as it was before to determine which buffs bots will cast.
- Certain resist spells have a DS bonus on them and can be casted as a resist rather than a damage shield. This forces anything with a damage shield as a damage shield buff.
* SPA180 bypassed by field no_resist (field209)
SPA 180 SE_ResistSpellChance provides chance to resist spells outright. This should not be checked to resist a spell if spell has (field209 / no_resist) set to 1.
* Update spells.cpp
confirmed on live unresistable spells are not blocked by sanctification disc or related AA's
* SPA 378 update
Update to SPA 378
SE_SpellEffectResistChance provides chance to resist specific spell effects.
This updates allows support for multiple resistance checks against different effects in same spell.
Example. If a spell has a silence and a blind effect and the target has an AA that gives 10% chance to resist silence and 5% chance to resist blind. It will roll against effect respectively each giving a chance to resist the spell.
* Update spells.cpp
Unresistable spells (resisttype = 0) do not ever resist a spell even with SPA378
Example: Pheonix Charm in Plane of Fire, or Storm Comet in Bastion of Thunder. Parsed both and never got a resist despite having the AA that has effect specific resists which both those spells match.
* [Zone] Zone State Automated Testing and Improvements
* Spawn condition
* Update zone.cpp
* Remove redundant logic
* Update zone_state.cpp
* TestZLocationDrift
* Protect NPC resumed NPC's from being able to die
* [Bots] Line of Sight and Mez optimizations and cleanup
- Renames `Map:CheckForLoSCheat` to `Map:CheckForDoorLoSCheat` to better reflect what it does.
- Renames `Map:RangeCheckForLoSCheat` to `Map:RangeCheckForDoorLoSCheat` to better reflect what it does.
- Adds the rule `Pets:PetsRequireLoS` to determine whether or not commanded pet attacks require an addition layer of LoS checks for edge-cases.
- Adds the rule `Bots:BotsRequireLoS` to determine whether or not bots require LoS to `^attack`, `^pull` and `^precombat`.
- Adds the rule `Map:ZonesToCheckDoorCheat` to control what if any zones will be checked..
- Corrects, removes and adds LoS checks where necessary.
- Improves door checking logic for locked or triggered doors that could be blocking LoS.
- Cleans up false positives for door cheat checks.
- Adds `drawbox` option to `#door` command. This will spawn points at the center and each corner of the door's "box". It will also spawn points at your and your target's location.
- Improves Mez and AE Mez logic
- Adds more details to the rule `Bots:EpicPetSpellName`
* Remove leftover debugging
* Change return to continue for GetFirstIncomingMobToMez checks
* Move mez chance fail to beginning of cast process
- Non-taunting melee bots will now properly go behind their target when it is enraged.
- Reduces how often taunting bots adjust their positioning by removing unnecessary rules.
- Cleans up CombatPositioning a bit
* [Bots] Fix error copy/paste
Oops
* Eliminate false errors on empty rules and add more sanity checks
- `Bots:ZonesWithSpawnLimits` - This is to be used when zones will only allow up to x amount of bots. Example: A player can normally spawn 5 bots but a zone in this rule has a lower limit of up to 3, this rule would override their normal limit if their normal limit is above the listed zone's max in `Bots:ZoneSpawnLimits`.
- `Bots:ZonesWithForcedSpawnLimits` - Zones in this rule will override any spawn limits high or low and force it. If one player can normally spawn 2 and another player can spawn 10 but a zone listed forces a limit of 5, all players will be able to spawn 5. Follows the limits set in `Bots:ZoneForcedSpawnLimits`
* [Performance] Have World Send Smarter Guild Updates
* Updates to correct incorrect guild window details (permissions, etc) not being sent on guild creation.
---------
Co-authored-by: Mitch Freeman <65987027+neckkola@users.noreply.github.com>
* initial work, need to clean up gm commands still
* cleaned up command, works without kicking char select now
* remove thj-specific methods
* add script hooks
* actually clear flag
* rework questmgr::rename
* remove unnecessary logging
* revert
* added missing binding to perl api and updated some text
* don't return a value
* Fix some bad argument types.
* adjust case
* alpha order
* refactor some old string stuff
* don't quote integers, bob
---------
Co-authored-by: Zimp <zimp@zenryo.xyz>
Co-authored-by: Chris Miles <akkadius1@gmail.com>
- When bots would charm a pet, once they zoned or camped the pet would poof and not trigger a respawn so the NPC which was charmed would never respawn until the zone was shut down or server restarted.
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.
* [Zone] State saving improvements
* Make sure we load spawn enabled off of the state row
* Update npc.h
* Update spawn2.cpp
* Update database_instances.cpp
* Update database_instances.cpp
* [Bots] Fix taunting bots positioning
- Fixes taunting bots liking to hug their target on certain models or chosen positions.
- Makes bots have a more realistic combat range in comparison to players.
- Removed unnecessary rules and checks for melee distance.
* Update ruletypes.h
- Something between the latest release caused this crash to appear, unsure of this exact cause.
- Prevents bots from being sent a spawn packet for Auras.
- Removes the bot's auras on Depop
* Check for valid JSON before using it
* Do not allow nested keys to set be set an expiration
* Prevent overwriting of existing object or array
* Nested deletion support
* Update data_bucket.cpp
* Test cases
* More test cases, fix
* Update databuckets.cpp
* Update databuckets.cpp
* Basic databucket tests
* Update databuckets.cpp
* Update databuckets.cpp
* refactor AddItemBonuses
* typo
* simplify some syntax
* fix indents
* Revert "fix indents"
This reverts commit 8e660707a96090105213fcee924d0e492fc44ddd.
* fix indents without blowing up entire file
* Revert "fix indents without blowing up entire file"
This reverts commit 6b21d1bcc96608e1dc620962b426401540cedbbf.
* ok for real though
* Undo spaces in formatting, source uses tabs
* Spaces to tabs take 2
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* 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
- Prevent bots not set to ^behindmob from finding positions behind their target.
- Backs up a bot if they're too close and have target reflection, not just taunting bots.
- Backs up bots if the target is rooting and they are not taunting to the appropriate position.
- This will particularly help with casters running around.
- Previously this only checked the bots target to med. It will now check the hatelist of the bot to ensure no mobs have the bot targeted before medding.
* [Hotfix] Fix cursor load on zone
- Corrects an issue where the item on your cursor would become invisible upon trying to place it anywhere in your inventory.
* Remove general to prevent duplicate loads
* Bug Fix Find Zone - Expansion Settings
#fz expansion 30 Would crash your zone since the expansions don't go up that high. This Adds a check for range out of bounds and provides an exception to expansion 99 since those are test/dev zones.
* Update zone.cpp
* Update zone.cpp
* Update zone.cpp
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
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 a re-write of Guild Bank to enable RoF2 features
* Testing - Corrected a few bugs with merging, splitting and withdrawing
* Testing - Corrected a few bugs with depositing of bags
* Added player event logging for deposit, withdrawal and movement between deposit to main area.
* Fix the guilddelete routine
Fix the guilddelete routine as a result of the new guild_bank table structure
* Fix an issue with items not being withdrawn correctly.
* Final Testing Phase 1 - A few failures to be resolved yet.
* Final Testing Phase 2 - Looks good
* Final Testing Phase 3 - Repair a visual bug with withdrawal of items with charges
* Cleanup
* Formatting feedback updates
* Rebase and fix version.h
* Fix manifest issue after changes
- Certain AE types weren't properly calculating their AE range and would base off the actual AE range for targeted types rather than the spells range itself
- Moved stance check to function
- Added check for Efficient and Assist stances.
- Sets aggressive to ignore aggrochecks by default
- Adds more types to default aggrocheck list
- Sets Assist to hold CCs
- Added all TargetedAE types to IsTargetableAESpell
- Added IsTargetableAESpell to IsAnyAESpell and changed order for earlier escapes
- IsPBAESpell now checks all PBAE types
- The rule Spells, TargetedAOEMaxTargets will now check all Targeted AE types
- The rule Spells, PointBlankAOEMaxTargets will now check all remaining types that can be a PBAE and not only Nuke PBAEs
- Prevents casting on ineligible targets due to target type, stacking, etc.
- Adjust the rules Bots, MezChance, Bots, MezSuccessDelay and Bots, MezFailDelay
- Fix ^discipline saying no bots were selected
- Adds more information to certain commands to explain how they function.
- Rewrote ^copysettings and ^defaultsettings to not be so bloated and accept arguments properly.
- Added long names for setting categories
- Add Spell ID output to ^spells
- Add pre-death checks and early returns
- Cleanup pointers for GetUltimateSpellType checks
- Rename IsBotSpellTypeOtherBeneficial to BotSpellTypeUsesTargetSettings
- Rename GetUltimateSpellTypeDelayCheck to GetUltimateSpellTypeRecastCheck
-Add entity validation to GetNumberNeedingHealedInGroup
* [Commands] [Hotfix] Fix Illusion Block
This wasn't properly being set or saved if bots were not enabled, moved to extended character profile for players.
* Move out of EPP
* ValueWithin
* I learned a new word today - idempotent
I'm dumb. Will forget it tomorrow.
* Move saving to ZoneDatabase, inline SetIllusionBlock
- Fix priority value check in spellpriority commands
- Fix list option
- Remove unnecessary temp vector on list grab
- Will move getter to cache in future PR
* [Cleanup] Use Repositories for Titles
* Update titles.h
* Further use repositories
* Revert "Further use repositories"
This reverts commit 80d5f750f0157657af05497eeade8b45e15dc12a.
* Push
* Update titles.cpp
* Push
* Merge branch 'cleanup/titles_repositories' of https://github.com/EQEmu/Server into cleanup/titles_repositories
* Final push
_tempSpellType was not getting defined during bot spawn process which could lead to a potential crash in RaidGroupSay.
Auto archery toggle was what triggered the crash as it announces their status on spawn.
Also moved this toggle for Rangers further down the proccess line.
* [Bug] Item Purchase Offset when multiple buyers are buying at the same time.
- Much of the code lifted from TAKP/P2002 and adapted
- Needs Testing
- This should help prevent situations where multiple people are purchasing items from a merchant and both attempt to purchase the same temp merchant or limited item, it should result in the later person recieving a notice that the item no longer exists and refreshes the merchant table.
- Updated strings
* fix formatting
* Push
* Update client.cpp
* Update database_update_manifest.cpp
* Update database_update_manifest.cpp
* Update database_update_manifest.cpp
* Update client.cpp
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
Co-authored-by: Akkadius <akkadius1@gmail.com>
* 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>
* [Bug] Big Bag Cleanup
- Fixed the Database Updates to properly check for the missing column
- Added the cursor slot overflow migration and drop - Only the first 200 overflow slots are migrated due to the destination buffer size shrinking from 1000 to 200. Anything over 200 is dropped (Generally just summoned food).
- Fixed a direct DB call in corpses to the inventory table with incorrect column names
- Fixed the Inventory Snapshot bidirectional queries to account for updated inventory table names.
* Accidently nuked a line.
This isn't really necessary, but just in case anyone rolls back version or an error/crash happens during an update, it doesn't rerun these checks by returning false positives for the condition checks. Also validates most data from spells_new incase modifications were made..
* Implement spell AI pulling, fix throw stone
* more pull tweaks
* holding check at start of ai process
* fully implement ^pull logic to always return, can still be overidden by ^attack
* Rewrite ^pull logic and handling. **MORE**
Add ^setassistee command to set who your bots will assist. Bots will always assist you first before anyone else.
If the rule Bots, AllowCrossGroupRaidAssist is enabled bots will assist the group or raid main assists.
Rewrites logic in handling of pull and returning to ensure bots make it back to their location.
* Move HateLine to a better ID
* cleanup ST_Self logic in CastChecks
* Removed unused BotSpellTypeRequiresLoS
* Move fizzle message to define
* add timer checks to Idle/Engaged/Pursue CastCheck to early terminate
* Add back !IsBotNonSpellFighter() check to the different CastCheck
* Correct IsValidSpellRange
* Implement AAs and harmtouch/layonhands to ^cast --- fix IsValidSpellRange
* Add PetDamageShields and PetResistBuffs to IsPetBotSpellType()
* Add priorities to HateLine inserts for db update
* Remove SpellTypeRequiresCastChecks
* Add bot check to DetermineSpellTargets for IsIllusionSpell
* merge with previous
* Correct bot checks for ST_GroupClientAndPet
* Remove misc target_type checks
* Add lull/aelull to ^cast
* Add more checks for CommandedSubTypes::AETarget
* remove unneeded checks on IsValidSpellTypeBySpellID
* add to aelull
* rewrite GetCorrectSpellType
* Add IsBlockedBuff to CastChecks
* Add spellid option to ^cast to allow casting of a specific spell by ID
* ^cast adjustments for spellid casts
* Add missing alert round for ranged attacks
* More castcheck improvements
* CanUseBotSpell for ^cast
* remove ht/loh from attack ai
* remove SetCombatRoundForAlerts that triggered every engagement
* Add RangedAttackImmunity checks before trying to ranged attack
* move bot backstab to mob
* fix MinStatusToBypassCreateLimit
* more backstab to mob cleanup
* add bot checks to tryheadshot / tryassassinate
* adjust version number for bots
* add back m_mob_check_moving_timer, necessary?
* add sanity checks for classattacks
* Get rid of Bots:BotGroupXP and change logic to support Bots:SameRaidGroupForXP
Bots won't do anything if not in the same group so this should more accurately control only when in the same raid group.
* add "confirm" check to ^delete
* Update bot.cpp
* Remove `id` from bot_settings, correct types
* Implement blocked_buffs and blocked_pet_buffs
* more blocked buff tweaks
* add beneficial check to ^blockedbuffs
* command grammar
* missing )
* Move getnames for categories and settings to mob, rename hptomed/manatomed
* add GetBotSpellCategoryIDByShortName and CopyBotBlockedPetBuffs, update ^defaultsettings command
* cls cleanup
* Allow bots to clear HasProjectIllusion flag
* Add PercentChanceToCastGroupCure
* Implmenet PetCures, add some missing types for defaults/chance to cast
* Change GetRaidByBotName to GetRaidByBot
* Typo on PetBuffs implement
* Change GetSpellListSpellType to GetParentSpellType
* missing from GetChanceToCastBySpellType
* Fix performance in IsValidSpellRange by flipping HasProjectIllusion
* merge with prev
* merge with cls cleanup
* Reorder IsTargetAlreadyReceivingSpell/CheckSpellLevelRestriction/IsBlockedBuff
* Combine GatherGroupSpellTargets and GatherSpellTargets
* Cleanup IsTargetAlreadyReceivingSpell
* Fix ^petsettype to account for usable levels of spells and remove hardcoded level limits.
* Remove Bot_AICheckCloseBeneficialSpells and use AttemptCloseBeneficialSpells for better performance
* remove default hold for resist buffa
* move IsValidSpellRange further down castchecks
* raid optimizations
* correct name checking to match players
* more name checks and add proper soft deletes to bots
* organize some checks in IsImmuneToBotSpell
* Fix GetRaidByBotName and GetRaidByBot checks to not loop unnecessarily
* Move GatherSpellTargets to mob
* Change GetPrioritizedBotSpellsBySpellType to vector
Some slipped through in "organize some checks in IsImmuneToBotSpell"
* Move GatherSpellTargets and Raid to stored variables.
Missing some in "organize some checks in IsImmuneToBotSpell"
* comment out precheck, delays, thresholds, etc logging
missed some in "organize some checks in IsImmuneToBotSpell"
* Missing IsInGroupOrRaid cleanup
* Implement AIBot_spells_by_type to reduce looping when searching for spells
* Add _tempSpellType as placeholder for any future passthru
* todo
* Move bot_list from std::list to std::unordered_map like other entities
* Fix missing raid assignment for GetStoredRaid in IsInGroupOrRaid
* TempPet owned by bots that get the kill will now give exp like a client would
* Remove unnecessary checks in bot process (closescanmoving timer, verify raid, send hp/mana/end packet
* Fix client spell commands from saving the wrong setting
* Cleanup ^copysettings command and add new commands
* Add pet option to ^taunt
No longer has toggle, required on/off option and an optional "pet" option to control pets' taunting state
* Allow pet types to ^cast, prevent failure spam, add cure check
* more raid optimizations, should be final.
10 clients, 710 bots, 10 raids, ~250 pets sits around 3.5% CPU idle
* Move spell range check to proper location
* Implement ^discipline
* remove ^aggressive/^defensive
* remove this for a separate PR
* cleanup
* Add BotGroupSay method
* todo list
* Add missing bot_blocked_buffs to schema
* Remove plural on ^spelltypeidsand ^spelltypenames
* Move spelltype names, spell subtypes, category names and setting names to maps.
* move los checks to mob.cpp
* Bot CampAll fix
* Bots special_attacks.cpp fix
* Add zero check for bot spawn limits
If the spawn limit rule is set to 0 and spawn limit is set by bucket, if no class buckets are set, it defaults to the rule of 0 and renders the player unable to spawn bots.
This adds a check where if the rule and class bucket are 0, it will check for the spawn limit bucket
* Add HasSkill checks to bot special abilities (kick/bash/etc)
* code cleanup 1
* code cleanup 2
* code cleanup 3
* code cleanup 4
* fix ^cast wirh commanded types
* Remove bcspells, fix helper_send_usage_required_bots
* linux build fix
* remove completed todo
* Allow inventory give to specific ID slots
* Update TODO
* Correct slot ranges for inventorygive
* Add zone specific spawn limits and zone specific forced spawn limits
* remove bd. from update queries where it doesn't exist
* Rename _spellSettings to m_bot_spell_settings
* Add IsPetOwnerOfClientBot(), add Lua and Perl methods
* Make botOwnerCharacterID snakecase
* Throw bot_camp_timer behind Bots:Enabled rule
* Move various Bot<>Checks logging to BotSpellChecks
* Remove from LogCategoryName
* Consolidate IsInGroupOrRaid
* Consolidate GatherSpellTargets
* Add missing Bot Spell Type Checks to log
* Add GetParentSpellType when checking spelltypes for idle, engaged, pursue CastChecks.
* Consolidate AttemptForcedCastSpell
* Consolidate SetBotBlockedBuff/SetBotBlockedPetBuff
* Add list option to ^spellpriority commands.
* Move client functions to client_bot
* Move mob functions to mob_bot
* Move bot spdat functions to spdat_bot
* Move SendCommandHelpWindow to SendBotCommandHelpWindow and simplify
* Change char_id to character_id for bot_settings
* update todo
* Fix typo on merge conflict
* Cleanup command format changes, remove hardcoded class IDs in examples.
* Set #illusionblock for players to guide access
* Move client commands for bot spells from gm commands to existing bot commands
* Fix alignment issues
* More alignment fixes
* More cleanup 1
* More cleanup 2
* Fix BotMeditate to med at proper percentages
* Correct GetStopMeleeLevel checks for some buff checks
* Add back hpmanaend update to bot raid, force timer update to prevent spamming
* Remove log
* Cleanup ranged and ammo calculations - Adds throwing check for match
* Add check in distance calculations to stay at range if set even if no ammo or ranged
* Move melee distance calculations to better function
* Add GetBuffTargets helper
* Missing p_item, s_item in CombatRangeInput
* Linux test?
* Reduce GetCorrectBotSpellType branching slightly
This is still an ugly ass function but my brain is melted
* Line fixes
* Make bot pets only do half damage in pvp
* Add bot pet pvp damage to tune
* Add bot pet check for AIYellForHelp
* Add bots to UseSpellImpliedTargeting
* Move toggleranged, togglehelm and illusionblock to new help window. Add actionable support
* Add bot and bot pet checks to various spells, auras and targeting checks that were missing.
* update todo
* New lines
* Correct DoLosChecks
* Remove Log TestDebug
* Remove _Struct from struct declarations
* Add bot check to IsAttackAllowed for GetUltimateOwner to skip entity list where possible
* Wrap SaveBotSettings in Bots Enabled check
* Remove comment
* Wrap bot setting loading for clients in bots enabled rule
* Cleanup BlockedBuffs logic in SpellOnTarget
* Rename BotSpells_Struct/BotSpells_Struct_wIndex
* Rename spawn/create status bypass rules, fix return for spawn limit
* Remove unnecessary return in CanBuffStack, cleanup
* Enable recastdelay support for clients
* Remove unused variables
* Rename _assistee to bot_assistee
* hardcode BotCommandHelpWindow colors
* todo
* Fix ^cast summoncorpse
* todo
* Reimplement secondary colors to BotSendCommandHelpWindow
* Give ^copysettings/^defaultsettings more options, cleanup.
* Cleanup some commands
* Add comment to CheckLosCheat/CheckLosCheatExempt
* Make struct BotSpellSettings snake case
* Allow duplicate casts of same spell on target for heals and cures
* Add default delay to cures
* Remove unused methods
* Implement missing ^spellresistlimits/^resistlimits command
* Move functions out of mob.h and cleanup
* Return for GetRawBotList
This checks offline bots too
* Rename BotGroupSay to RaidGroupSay
* Prevent bots from forming their own group if a bot that is a group leader is removed from the raid
* Linux fix?
* IsPetOwner fixes
* Add remove option to list for ^blockedbuffs / ^blockedpetbuffs
* Implement ^spellannouncecasts to toggle announcing casts of spell types
* Remove rule Bots:BardsAnnounceCasts
* Update bot.h
* Remove unused no_pets option from GatherSpellTargets
* Move ^attack response back to normal chat window (other)
* Set lower limit of spell delays to 100 rather than 1
* Correct pet checks on GetUltimateSpell functions
* Add rules (Bots, AICastSpellTypeDelay, Bots, AICastSpellTypeHeldDelay) to prevent spamming of failed spell type AI casts
* Correct pet buff type logic to catch DS/Resists with other spell effects in them
* Fix defaults for clients
* Add more logic for necros/shaman for default heal thresholds due to lich and canni
* Rename SpellHold, SpellDelay, SpellMinThreshold, SpellMaxThreshold, SpellRecastDelay to fit SpellType style naming
* Use GetTempSpellType() for announce check in RaidGroupSay
* Make all spell shortnames plural where applicable
* Update bot.cpp
* Bots:BotsUseLiveBlockedMessage filter to spell failure
* Move GetSpellTargetList to only get called when necessary to reduce overhead
* formatting
* Formatting
* Simplify case SE_Illusion and SE_IllusionCopy for GetIllusionBlock
* Clean up InterruptSpell
* Cleanup IsBot() checks for DetermineSpellTargets->ST_GroupClientAndPet
* Cleanup range/aoe_range check in SpellFinished
* Cleanup DetermineSpellTargets->ST_GroupNoPets
* Cleanup DetermineSpellTargets->ST_Self for bot summon corpse
* Cleanup DetermineSpellTargets->ST_Pet
* Cleanup bot logic in TryBackstab
* Cleanup IsAttackAllowed checks for bots and their pets
* Cleanup StopMoving for bots
* Cleanup CanThisClassTripleAttack
* Fix casting for GetIllusionBlock checks
* Formatting
* Fix DetermineSpellTargets for group spells (this also wasn't properly checking the rule Character:EnableTGB in master)
* Cleanup spelltarget grabbing logic, consolidate group heals in to GetNumberNeedingHealedInGroup
* Throw added client los pet checks behind LoS cheat rule for bots
* CLeanup give_exp on npc death logic and ensure client pets always pass.
* Undo unintended rename from previous refactor
* Remove pointless Bots, SameRaidGroupForXP rule
* Revision to 0690783a9d1e99005d6bee0824597ea920e26df9
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Performance] Significantly Improve Client Network Resends
* Update daybreak_connection.cpp
* Improve resend algorithm to be exact about when to resend
* Create Alternate BazaarSearch Routine
Establishes an alterative to the in memory bazaar search routine and instead uses a db query process. For large Bazaars (with 1000s of items) this is much faster. Testing with 30k items produced a search in ~1sec version 2.7sec for the in memory version.
Default is false - Do not use this version.
* Indexes for trader and items
* Set query-based bazaar search the default
* Update database_update_manifest.cpp
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* rebase\tidy up to address commends
* I blame git for this one
* last typo
* spaces
* formating fixes I think?
* Repository fixes
* Cleanup
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* Zone optimizations
* More changes
* More
* Update entity.cpp
* Beautiful
* Amazing
* Feature flag all logic
* Broadcast to group
* Update mob.cpp
* Updates
* Update client.cpp
* Update client.cpp
* Add rule Zone:EnableEntityClipping
* Little bit of cleanup
* Don't send update to self while in group
* Remove visibility work and feature flags
* Cleanup
* Logging
* Improve CheckSendBulkNpcPositions
* No need to cast
* Field cleanup
* Build initial list on zone-in
* basic evolving items framework created
* Implement evolving tab in the inventory window
* Implement experience and number of kills
* Move zone evolving map to a evolvingitemsmanager class
* rework gm commands
* rework GetInventory
* wip
* wip loot testing
* Fix Duplicate Message
* reworked evolving item looting, swapping, etc
* reworked const functions for evolving methods
* Functioning Player Trade of evolving items test item_id is 89550
* First pass of Final Result link working
* First pass of item upgrading when reaching 100%
* Add strings and logic for displaying the evolving item xp transfer window in Corathus
* Prototype of xp transfer window sending items
* WIP for evolve xp transfer
* WIP for evolve xp transfer. First tests passed
* XP Transfer Cleanup
* XP Transfer Cleanup
* Add Rule for evolving items equip timer/ default is 30 secs
* Add logging and player events
Add logging and player events
* Formatting
* Database updates
* Updates for linux build
* Perl/Cleanup
* Command cleanup
* Lua
* Added a crash condition check if final item id is blank or not found.
* Review Changes
Updates to resolve review comments and a rebase.
* migrate to content_db for items_evolving_details
migrate to content_db for items_evolving_details
* Simplify, don't hit database unless evolving
* Update 2025_01_19_items_evolving_details.sql
* Update client.cpp
* Update manifest with items_evolving_details
* character_id vs char_id
* Remove _Struct from structs
* Remove license header in evolving.cpp
* Move evolving constants from eq_constants.h to evolving.h since it is more specific
* Update database_schema.h
* General cleanup
* Be more specific with `evolving_items` vs `evolving`
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
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>
* [Zone] Implement zone player count sharding
* Update client.cpp
* Update database_instances.cpp
* You must request a shard change from the zone you are currently in.
* // zone sharding
* You cannot request a shard change while in combat.
* Query adjustment
* Use safe coords
* Changes
* Fixes to instance query
* Push
* Push
* Final push
* Update client.cpp
* Update eq_packet_structs.h
* Remove pick menu
* Comment
* Update character_data_repository.h
* Update zoning.cpp
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
When the guild membership was large (1k+) the client would studder for half a sec when a guild member would login or logout. This was reproduceable with a guild size of 2k members though floor would be client dependent most likely.
* rules for enabling requiring custom files
* shorten default
* variable name
* check account status for enforcing client key
* rule for custom files admin level
---------
Co-authored-by: Paul Johnson <Paul@pjohnsomac-6366.digi.box>
* 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.
Previously level requirement was only being checked on the initial rank of an AA. If passed, bots would gain all ranks for that AA regardless of level, this will now check for the level requirement for each rank before granting the AA
This allows task elements to update in any zone when it has an invalid
zone id <= 0. This has the same effect as leaving the zones field empty
except "Unknown Zone" instead of "ALL" will be shown in task windows.
Note that Titanium shows "ALL" for a zone id of 0 despite it being an
invalid zone id. This could be manipulated server side to match newer
clients but there isn't much benefit since any other invalid zone id
below 0 can be used to do the same.
This adds a compile time concept to determine if from_chars has
floating-point support and uses fallbacks if not.
This is a C++17 feature but support for floats was only added to
libstdc++ with GCC 11.1 and LLVM libc++ in 20.0 (unreleased).
* Fix a formatting bug with #mystats
When using values larger than 1,000, we were calling commify on a string that already had commas. This resulted in the value 1005 looking like 1,,005.
* Update mob.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
* Add database quest API
API functions are named to be similar to LuaSQL and perl DBI
New connections are made for Database objects. These can either use
credentials from the server eqemu_config or manual connections.
* Add option to use zone db connections
This update resolves two bazaar issues that have been reported.
- If parcel delivery is used to purchase an item, and the seller has several of the same items, that have various charges, the item would not be removed from the db. This allowed for incorrect purchases.
- If a player 'reclaims' an alt currency item that they also have for sale with an active trader, the item would remain for sale, and be reclaimed. This impacted custom alt currency items that were no trade.
* [Performance] Minor improvements to ScanCloseMobs
* Remove timer checks one level up to reduce branching
* Reserve memory in m_close_mobs to avoid frequent re-allocations if not already reserved.
- Adds a perl::ref alias for perl::reference
- Optimizes array return pushes by accessing SV* values directly instead
of using operator[] scalar_proxy
- Allows functions with a perl::hash parameter to accept hashes with any
scalar key type instead of requiring explicit string keys
e.g., foo(123 => 1) will now work on functions accepting a perl::hash
This adds support for using prepared statements for MySQL queries. It is
intended for use in a database quest API but it can be used in source
with some caveats:
- It uses exceptions for error handling instead of returning a fake
result that needs checked. Usage must be wrapped in try/catch.
- DBcore has a connection mutex which indicates the connection might be
shared with other threads. This mutex is locked for certain stmt
operations in an attempt to make it safe to use with multi threaded
connections.
- Prepared statements should only be used on the main thread since the
internal logging is not synchronized.
- Unlike the current query API which retrieves all results as strings,
results are stored in buffers that represent the db field type.
Getter functions are available to retrieve values as desired types.
* Add Rule Spells:AllowFocusOnSkillDamageSpells
* Currently, focus mods defaults to 0 when processing spell effect 193.
* The default value for this rule is false.
* When false, the rule will retain the current default behavior.
* When true, the aforementioned focus effects will allow focus effects (185, 459, and 482) to modify spell effect 193.
* Removed undesirable whitespace
* Update spell_effects.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
* [Bots] Fix pet buffs from saving duplicates every save
Previously we were not checking the pet index properly when clearing buffs in the database before saving which resulted in no prior data being deleted.
This corrects the logic for the save and also will clean up any buffs for pets that don't exist in the table.
* Changes
* Update world_boot.cpp
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* Loginserver will auto create the opcodes file if it doesn't exist on load.
* Use path manager in login opcodes.
---------
Co-authored-by: KimLS <KimLS@peqtgc.com>
Timers were not properly checking their expiration time on spawn and load and could cause invalid timers to load if the server was restarted resulting in improper lockouts.
* Fixed a typo in Zoning.cpp changed reguest to request.
* Update zoning.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
* [Bug Fix] Spells - Self Only (Yellow) cast when non group member is targeted
When using a Yellow gem invis spell, it should cast on yourself regardless of the targetted entity.
* Update spells.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
When zoning or forming a raid, bots would spam their spawn message. They will now be muted.
Adds an optional argument "silent" to the ^spawn command. This will bypass ^oo spawnmessage settings and not send a spawn message. Example: ^spawn Warbot silent
This adds a flag to mobs that are told to attack by their owner to prevent unintended attacks.
Previously, if you were to send your bots to attack a target and then switch targets: before casters land their spell or if melee (especially anyone with pets) hasn't engaged before the target switch, they could switch to your new target and attack.
This adds a flag upon attack and bots will only attack flagged targets.
* [Feature] Teach npcs how to cast sacrifice
* [Feature] Teach npcs how to cast sacrifice
- Remove the hardcoded limit preventing npcs from casting sacrifice. The
npc will receive as loot an emerald essence as expected.
* Update client.cpp
* Update client_packet.cpp
* Update spell_effects.cpp
* rename Client::SacrificeCaster to Client::sacrifice_caster_id
Current version only looks at your unspent AAs, meaning if you have 2000 spent AAs and 1 unspent AA, your scaling will be based on the 1 unspent AA instead of the 2001 total AA.
Here's the original log which is custom code found in the ModernAAScalingEnabled function:
[Wed Sep 11 14:10:19 2024] [AA] [ScaleAAXPBasedOnCurrentAATotal] AA Experience Calculation: add_aaxp = 660796, Base Bonus = 256.000000, Half-Life = 64.000000, Minimum Bonus = 1.000000, Earned AA = 1, Calculated Bonus = 253.242371
Custom code looks like this:
uint64 totalWithExpMod = add_aaxp;
if (RuleB(AA, EnableLogrithmicClasslessAABonus)) {
float base_bonus = RuleR(AA, InitialLogrithmicClasslessAABonus);
float half_life = RuleR(AA, HalfLifeLogrithmicClasslessAABonus);
float min_bon = RuleR(AA, MinimumLogrithmicClasslessAABonus);
float bonus_expon = earnedAA / half_life;
float bonus = base_bonus * std::pow(0.5, bonus_expon);
Log(Logs::General,
Logs::AA,
"AA Experience Calculation: add_aaxp = %d, Base Bonus = %f, Half-Life = %f, Minimum Bonus = %f, Earned AA = %d, Calculated Bonus = %f",
add_aaxp, base_bonus, half_life, min_bon, earnedAA, bonus);
if (bonus < min_bon) bonus = min_bon;
totalWithExpMod = (uint64)(totalWithExpMod * bonus);
}
After the fix, the log becomes:
[Wed Sep 11 14:10:19 2024] [AA] [ScaleAAXPBasedOnCurrentAATotal] AA Experience Calculation: add_aaxp = 660796, Base Bonus = 256.000000, Half-Life = 64.000000, Minimum Bonus = 1.000000, Earned AA = 1, Calculated Bonus = 253.242371
Which is much closer to the expected behavior
* initial work porting this to upstream
* more
* track complete connect
* it sucks to suck
* Few optimizations
* Move sent_inventory init
* Move var
* Adjustments
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* Add an exception process to assigning item serial numbers to correct a bug in the client hot bar clicky system.
* fixed missing guid in replace statement
* added snapshot support
* upate #show inventory command to protect against crash conditions
* [Feature] Add Optional Return to EVENT_DAMAGE_TAKEN
# Description
- Allows operators to return a value from `EVENT_DAMAGE_TAKEN` to override the amount of damage taken based on any arbitrary criteria they'd like to apply.
* Update attack.cpp
When using a method that leverages client_max_level (e.g. Max Level by bucket / qglobal / quest API) it would stop xp at 0% into the level rather than maximum xp for the level.
This could pose an issue where: If you had a max level of 65 via a databucket and a raid zone required level 65, one death would de-level them and potentially prevent them from entering the zone.
I reorganized the code to leverage the existing max_level logic which allows max xp in the max level.
I also cleaned up the overall functions formating (Mostly brackets and implied if statements).
* [Improvment] Filtered Messages Extension
Added:
ItemSpeech 25
Strikethrough 26
Stuns 27
BardSongsOnPets 28
I wired up Strikethrough and Stuns as they already had message entries.
ItemSpeech and BardSongsOnPets do not appear to be currently used in the source.
Note: There are still 5 unknown Filters in RoF2 that need to be investigated:
Achievments
Fellowships
Mercenary Messages
PVP Messages
Spam
* Spelling Error
* Missed some stun calls
* 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>
* Implement Move Multiple Items
* Send LinkDead on invalid packet
* structure this more like MoveItem
* implement all modes
* remove un-needed debug message
* handle mode 3 swaps in bank\shared bank correctly.
* Revert "handle mode 3 swaps in bank\shared bank correctly."
This reverts commit ce01fbfde70d52e88381772a6c7a77b4b650c7c5.
* Revert "remove un-needed debug message"
This reverts commit f4b662459e11a60c3a46a97e5320757c4b2b9a84.
* handle mode 3 swaps without extra unintended code
* correct variable type
* remove magic numbers
* forgot a semicolon in emu_constants.h
* fix bad rebase artifact
* Remove unused struct
* apply changes discussed in PR
* last rebase conflict
* last rebase conflict
fix more inventory type enum refs
* fix windows build error
* fix other windows build error.
* fix duplication bug
* [Cleanup] Mask GM Show Buff message behind EntityVariable
Removes the spam of "Your GM flag allows you to always see your targets' buffs." for GMs every time a buff lands on a target.
It will now lock to an Entity Variable and only show once per zone.
* Convert string to constexpr
* Switch from string to char
* [Bug Fix] Prox aggro for frustrated and undead.
If mob is frustrated (Rooted and has no one to kill or is undead will add prox aggro to hate list.
* Update aggro.cpp
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [Bug Fix] Corpse Call removing Rez Effects
When calling a corpse, it should not remove rez effects.
* Update client_process.cpp
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [Rules] Add HasteCap and Hastev3Cap rules for NPCs, Bots and Mercs
Previously NPCs, bots and mercs all had a flat haste cap of 150 whereas clients were capped at 100.
NPCs, bots and mercs used the character rule for v3 cap, they now each have their own.
Rules for v3 cap are the default of 25 as they were using.
Rules for haste caps are the default of 150 for NPCs they were using but lowered to 100 for bots and mercs, the same as clients.
This also adds haste output to the GM target stat window
* Fix for stat windows to account for client haste
Code Credit TAKP:
Bug Post: https://discord.com/channels/212663220849213441/1258430167764832319
Resolved issue with split message being sent to group members when no split is present which creates an "Unknown Split".
Also added the random remainder split portion unless using a manual /split
Converted manual messages to Strings
* fix stacking issues with Aegolism spell line
Issue: When casting buffing a player with aegolism spell line, who already has cleric AC, symbol and heroism spell, it would overwrite heorism buff and leave other two.
Aegolism spell line when applied when a client has Heroism spell line, AC spell line, and symbol spell line. Should overwrite the Heroism spell and fade the AC and Symbol buffs.
* Update spdat.cpp
Previous change did not account for the modern slay undead and holyforge spells.
Reverted some of the changes and cleaned up others.
Rule Renamed (Default value was incorrect, this was a clean way to fix that) - SlayDamageAdjustment -> SlayDamageMultiplier
Also added a rate multiplier
RULE_REAL(Combat, SlayRateMultiplier, 1.0, "Slay Rate Adjustments - Multiply final slay rate check by this value. Default: 1.0")
Fixed the ordering of the constants for the slay undead SPA that were backwards and causing major headaches with tuning and setting up slay undead correctly.
Base = Damage Mod (100 is base, so 240 = 140% more)
Limit = Proc Rate - Value is divided by 10000 for a Float %. e.g. 1700 becomes 0.17 (Or 17% proc rate).
Damage bonus should be additive not std::max as AA, Spells and Item bonuses should stack.
e.g. Slay Undead RK3 240 + Holy Forge 140 should = 380 (280% damage)
* Fix bazaar trading
* Update `constexpr`
* Added world trader table truncate on boot to ensure that the trader table is always empty when world starts.
---------
Co-authored-by: Mitch Freeman <65987027+neckkola@users.noreply.github.com>
* [Rule] Classic Harm Touch Formula
Pre 2007 Harm Touch was handled differently with base harm Touch ( Ability or 2 ranks aa) and Improved Harm Touch AA. It was converted into 10 ranks of Harm Touch -
http://www.tski.co.jp/baldio/patch/20071113.html
It was further refined in 2008 to have a DoT component.
http://www.tski.co.jp/baldio/patch/20080709.html
This rule focuses on the pre 2007 version and allows the damage to properly scale
* Updated logic
* Update per feedback.
MendAlwaysSucceedValue allows you to adjust skill at which mend will always succeed its check.
SneakAlwaysSucceedOver100 allows sneak to always succeed when over skill 100 (Higher skill increases the movement speed).
* Potential fix for players having empty bazaar window dropdown list, even though trader is tagged as a trader.
* Update the truncate of the trader table to avoid inappropriate deletions if an instance of bazaar was started.
* [Bug] Prevent Ressurection Spells from being resisted
Added IsRessurectionSpell(uint16 spell_id) to assist with checking on a spell is a ressurection spell.
This was noticed when Dragons of Norrath launched and the Tier 5 Progression AA provided SPA 180 2% SE_ResistSpellChance
* Helps if I spell it correctly
* Update per feedback
* [Rule] Snare Override Movement Bonus
This rule allows snare to override any movement bonuses.
RULE_BOOL(Spells, AllowSnareEffectsOverrideBonus, false, "Enabling will allow snares to override any speed bonuses the entity may have. Default: False")
Default: False
* Rule name
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [NPC Spells} fixed an issue where the repository spell adj value was overriding the spell difficulty default value.
[Command] Add resist adj to #show spells_list command to see the resist value.
* True fix, do IsValidSpell on actual spell
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Rule] Legacy Compute Defense against modern agi based defense.
In new code, AGI becomes a large contributor to avoidance at low levels, since AGI isn't capped by Level but Defense is A scale factor is implemented for PCs to reduce the effect of AGI at low levels. This isn't applied to NPCs since they can be easily controlled via the Database.
* `snake_case`
---------
Co-authored-by: Kinglykrab <kinglykrab@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>
- Haste should only provide a max of a 2 s reduction to Backstab cooldown, but it seems that while BackstabReuseTimer can be reduced, there is another timer (repop on the button) that is controlling the actual cooldown. I'm not sure how this is implemented, but it is impacted by spell haste (including bard v2 and v3), but not worn haste. This code applies an adjustment to backstab accuracy to compensate for this so that Rogue DPS doesn't significantly outclass other classes.
* [Bug] Raid Targets should not be Blindable as this will break all spell casting AI.
* Add rule.
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [Feature] Add SE_IncreaseArchery and rules to tune archery
* Adjustments per comments, also added to the tune system.
* Update bonuses.cpp
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [Bug Fix] Accuracy, Avoidance and Atk adjustments
- Applied Fix to Attack Power contributing too much to damage.
Rule of thumb for era was 100 attack = 10% damage increase, but I was seeing closer to 15-25%. Found that in the GetATK() function it seemed to be double counting attack power from items and spells, so I applied a /2 to remedy this.
* Update Tune
* [Merchants] Add New Classic Greed/Faction/Charisma Prices Rule
* Fix size of greed field.
* Fix { formatting and add {} to one liners
* Fix return type of GetGreedPercent
* Remove code that slipped in from another patch
* Fix greed to be unsigned
* Update client.cpp
* Update client_packet.cpp
* Update client.cpp
Fix bad name in extra log message added manually from merge.
* Update client_packet.cpp
Spacing.
* Update client.cpp
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* Add parcel container support
This allows sending containers with items as a parcel
When sending a item via a parcel, if the player had multiples of that item, the wrong item would be removed from inventory.
* Rebase updates
* Changes to npcspawn create command so it takes more stats from the target npc
* Add see invis stats to npccreate command
* WIP npcspawn command changes
* Add npcspawn clone and help args, fix some broken things with npcspawn
* Cleanup comments and add apostraphes to zone shortname query
* Make it so npcspawn remove only removes spawn2 row and optionally removes spawngroup and spawnentry, make create and add spawn the npc at client loc
* Make npcspawn create use the same syntax for spawngroup naming as npcspawn add
* Revert npcspawn create and add to use npc location rather than client, other misc tweaks
When depositing an item in the guild bank with an unlimited charge (-1) a db error would occur resulting in a duplication issue.
Can test with item id 70208
* Fix for world crash with over 1500 guilds
There was an existing issue with certain clients (RoF2) if there were more than 1500 guilds. This also enhances the loading of guilds in both world and zone for performance if there are large number of guilds as RoF2 will support 1500+ guilds.
* Safely access permissions map
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Database] Break out changes to `npc_types` from parcels
# Description
Breaking out changes to `npc_types` table to its own update since we need to alter the content schema. See #4198.
## Type of change
- [X] Bug fix (non-breaking change which fixes an issue)
# Testing
Clients tested: N/A
# Checklist
- [X] I have tested my changes
- [X] I have performed a self-review of my code. Ensuring variables, functions and methods are named in a human-readable way, comments are added only where naming of variables, functions and methods can't give enough context.
- [X] I own the changes of my code and take responsibility for the potential issues that occur
- [X] If my changes make database schema changes, I have tested the changes on a local database. Updated version.h CURRENT_BINARY_DATABASE_VERSION to the new version.
* Remove extra line
* [Bug Fix] All NPC classes could stun with kick/only warriors could be stunned.
* Fix default NPCKickStun value to match existing code
* Remove else and make NPC the default.
* assign stun_level in declaration.
* 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>
* Hopefully fix glaa
* Potential Fix for GroupAA Issues
This seems to resolve the GroupAA issue. Tested with two characters joining a group. Functions the same as previous builds like 22.45, 22.46, etc.
* Fix for GLAA issue - For testing.
* Redo fix for GLAA
* Cleanup GLAA fix and move savng to repo
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
This fixes corpses "disappearing" by fixing the graveyard check. Prior to the corpse overhaul (#3938), moving corpses to graveyards was assumed successful and automatically removed from the process.
Note: Will open a separate issue for the graveyard timer handling.
## Type of change
Please delete options that are not relevant.
- [x] Bug fix (non-breaking change which fixes an issue)
# Testing
Attach images and describe testing done to validate functionality.
Clients tested: RoF2
# Checklist
- [x] I have tested my changes
- [x] I have performed a self-review of my code. Ensuring variables, functions and methods are named in a human-readable way, comments are added only where naming of variables, functions and methods can't give enough context.
- [x] I own the changes of my code and take responsibility for the potential issues that occur
# Description
The client appears to generate its own taunt message, so I removed the additional server side generated message.
## Type of change
Please delete options that are not relevant.
- [x] New feature (non-breaking change which adds functionality)
- [ ] This change requires a documentation update
# Testing
Clients tested: RoF2
# Checklist
- [x] I have tested my changes
- [x] I have performed a self-review of my code. Ensuring variables, functions and methods are named in a human-readable way, comments are added only where naming of variables, functions and methods can't give enough context.
- [ ] I have made corresponding changes to the documentation (if applicable, if not delete this line)
- [x] I own the changes of my code and take responsibility for the potential issues that occur
* Allow SPA69 to work on worn effects.
Update to allow SPA69 to work on worn effects which the client accepts and calculates properly.
Updated spell effect related Max HP change variables. 1) We had stat bonuses defined that did same function. Without updating would have had to create another variable for above to work. 2) Negate bonuses spell effect end up negating item HPs. which is not intended since using same variable for items and spells.
* HP variable updates
fixes
* HP variable updates
fixes
* HP variable updates
fixes
* Update mob.cpp
* [Bug Fix] Hero forge armor bug on login and show helm toggle.
* Merge in KayenEQ provided revert of original work around
* Fix botched merge section.
* [Bug Fix] Using %T in channel messages on fresh corpse yields mob/player name, not corpse name.
* Undo changes to PC corpse.
* Use rename to fix %T usage on client for those in zone
* Fix indentation spacing
* Update to consolidate Rename as suggested.
* Fix for mobs with ` in name
* Fix to use GetName() instead of GetCleanName()
* [Bug Fix] HP Bar not updating when applying HP Buff with a heal.
Bug: When an HP buff with a heal effect is applied for first time, the heal portion of the effect heals the client and updates HPs currently server side, but client side the HP bar does not register it as a heal thus you display as less than full HP. However due to server thinking your healed, you are unable to correct it by healing.
Solution: You need to resend the HP update after buff completed and action packet resent.
* add SE_MaxHPChange to fix
would result in same bug
* [Bug Fix] HP Bar not updating when applying HP Buff with a heal.
Bug: When an HP buff with a heal effect is applied for first time, the heal portion of the effect heals the client and updates HPs currently server side, but client side the HP bar does not register it as a heal thus you display as less than full HP. However due to server thinking your healed, you are unable to correct it by healing.
Solution: You need to resend the HP update after buff completed and action packet resent.
* add SE_MaxHPChange to fix
would result in same bug
* [Bug Fix] SPA214 Percent HP change calculation fix
Fix how spell and item bonuses using SPA 214 are calculated. Will now be calculated consistent with client.
* [Bug Fix] SPA214 SE_MaxHPChange calculation errors corrected.
removed code from other PR
# Notes
- Creating bots was failing because were checking for `false` on `Database::CheckUsedName()` in `BotDatabase::QueryNameAvailability`.
- `Database::CheckUsedName()` is now `Database::IsNameUsed()` and checks for both bots and character name usages.
- We were checking for `false` which was always happening when there were no entries for the supplied name, meaning we were never allowed to create a bot.
* [Spells] Add Unblockable Spell Table and Spell Blocked Event
- Add `EVENT_SPELL_BLOCKED`, exports `$blocking_spell_id`, `$cast_spell_id`, `$blocking_spell`, and `$cast_spell`.
- Add `event_spell_blocked`, exports `e.blocking_spell_id`, `e.cast_spell_id`, `e.blocking_spell`, and `e.cast_spell`.
- Adds `spells_unblockable` table with a `spell_id` and `is_unblockable` column.
- This table will need to be populated based on known spells that should be unblockable.
- This event will allow operators to perform events when spells are blocked.
* Cleanup
* Cleanup
* Update spells.cpp
* Remove unused repositories.
* Finalize
* Update lua_parser_events.cpp
If a mob has a target when a zone is shutdown it will crash while trying
to dispatch EVENT_TARGET_CHANGE when the Mob destructor cleans up hatelists
if a quest interface isn't loaded for the type (in this case no bot scripts):
zone.exe!fmt::v10::format<std::string const &,char const *>(fmt::v10::basic_format_string<char,std::string const &,char const *> fmt={...}, const std::string & <args_0>={...}, const char * && <args_1>=0x0000000000000000) Line 2835 C++
> zone.exe!QuestParserCollection::GetQIByBotQuest(std::string & filename={...}) Line 1138 C++
zone.exe!QuestParserCollection::BotHasQuestSubLocal(QuestEventID event_id=EVENT_TARGET_CHANGE) Line 353 C++
zone.exe!QuestParserCollection::BotHasQuestSub(QuestEventID event_id=EVENT_TARGET_CHANGE) Line 389 C++
zone.exe!Mob::SetTarget(Mob * mob=0x0000000000000000) Line 5431 C++
zone.exe!NPC::SetTarget(Mob * mob=0x0000000000000000) Line 575 C++
zone.exe!Mob::RemoveFromHateList(Mob * mob=0x000001bfbdc66040) Line 4894 C++
zone.exe!EntityList::RemoveFromTargets(Mob * mob=0x000001bfbdc66040, bool RemoveFromXTargets=true) Line 1530 C++
zone.exe!Mob::~Mob() Line 547 C++
zone.exe!NPC::~NPC() Line 537 C++
zone.exe!NPC::`scalar deleting destructor'(unsigned int) C++
zone.exe!EntityList::RemoveAllMobs() Line 2678 C++
zone.exe!EntityList::Clear() Line 3090 C++
zone.exe!Zone::~Zone() Line 1103 C++
zone.exe!Zone::`scalar deleting destructor'(unsigned int) C++
zone.exe!Zone::Shutdown(bool quiet=false) Line 928 C++
This is caused by the Zone destructor deleting short_name before calling
entity_list.Clear(). With an unloaded quest interface BotHasQuestSubLocal
calls GetQIByBotQuest which gets a null zone->GetShortName() and crashes
while formatting strings.
The immediate regressing commit for this crash is because a check for
zone->IsLoaded() was removed in 74f1eac4 with others that were removed
to fix a regression by #4025. GetQIByBotQuest and GetQIByPlayerQuest
always had this check and should have remained for them.
This restores the zone->IsLoaded() checks for GetQIByBotQuest/PlayerQuest.
The other functions cannot have that check added until the other issues
mentioned in #4149 are addressed.
## Type of change
Please delete options that are not relevant.
- [x] Bug fix (non-breaking change which fixes an issue)
# Checklist:
- [x] I have performed a self-review of my code. Ensuring variables, functions and methods are named in a human-readable way, comments are added only where naming of variables, functions and methods can't give enough context.
- [x] I have tested my changes
- [x] I own the changes of my code take responsibilities for the potential issues that occur
# Notes
- Bots were reportedly being bypassed by NPCs due to not taking into consideration their raid group's damage.
- Must have been missed when bot raids were implemented.
SPA 463 SE_SHIELD_TARGET
Live description: "Shields your target, taking a percentage of their damage".
Only example spell on live is an NPC who uses it during a raid event "Laurion's Song" expansion. SPA 54492 'Guardian Stance' Described as 100% Melee Shielding
Example of mechanic. Base value = 70. Caster puts buff on target. Each melee hit Buff Target takes 70% less damage, Buff Caster receives 30% of the melee damage.
Added mechanic to cause buff to fade if target or caster are separated by a distance greater than the casting range of the spell. This allows similar mechanics to the /shield ability, without a range removal mechanic it would be too easy to abuse if put on a player spell. *can not confirm live does this currently
Can not be cast on self.
* [Feature] Additive Spell Focus from Worn slot with limits
New rule (UseAdditiveFocusFromWornSlotWithLimits) allows you place to focus effects in worn slots which will apply the focus additively and perform normal limit checks on those focus. This differs from regular focus behavior that only takes highest value.
This is a new version of an old rule "UseAdditiveFocusFromWornSlot"
which allowed similar behavior but ignored focus limits. Thus hindering its full potential for itemization.
* Update spell_effects.cpp
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [Bug Fix] Fix Luabind Double Class Register
# Notes
- These two methods were registering to the same class as another method, causing an error seen by @neckkola and others.
# Error
```
zone: /home/eqemu/source_jas/libs/luabind/src/class_registry.cpp:151: void luabind::detail::class_registry::add_class(const luabind::type_id&, luabind::detail::class_rep*): Assertion `(m_classes.find(info) == m_classes.end()) && "you are trying to register a class twice"' failed.
```
* Update lua_general.cpp
* [Bug Fix] Fix Group Leadership
# Notes
- We were not sending anything to `group_leaders` table if we did not already have an existing row.
# Video
* Update database.cpp
* [LUA] Add Zone and Language Constants
This will add Zone:
```lua
if eq.get_zone_id() == Zone.Qeynos then
foo()
end
```
It will also add Language:
```lua
if e.language == Language.ElderElvish and e.other:GetLanguageSkill(Language.ElderElvish) >= 100 then
e.self:Say("You know my language!", Language.ElderElvish);
end
```
These changes should help avoid magic numbers in quests and aide in readability without the need for -- comments to clarify.
* Adjust to lower case
* [Bug Fix] Fix Auto Login Issue
# Notes
- We were setting `live_name` value regardless of if we were zoning, causing us to automatically log in to the last character we'd logged in to before.
* Remove &
Update to SPA148 which acts to block spells buffs that are of lesser value than the current buff for specific effect slots. This effected was preventing detrimental debuffs from being applied that were using same effect slot. This bug affected a very small amount of spell interactions and was fixed on live in 2018. Example being Vishmitars Corruption (6642) being blocked by SteelOak Skin (5352)
I confirmed the behavior on live myself. The detrimental buff if in conflict should now be applied instead of blocked.
Fix regression from #4008 where the item count wasn't being incremented
Move the zone table chance to a rule
General cleanup of some initializers and variable types
* [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
* [Bug] Radiant/Ebon Crystals should only extract to 1000
Creating a stack larger than 1000 can cause potential dupe issues further down the stream if other tasks are performed on the stack.
* Use stacksize instead
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [Rules] Add World:Rules Rule
# Notes
- Adds `World:Rules` rule to take the place of the variables table value.
* Update client.cpp
* Update client.cpp
* [Quest API] Add Restore Methods for Health, Mana, and Endurance to Perl/Lua
- Add `$mob->RestoreEndurance()`.
- Add `$mob->RestoreHealth()`.
- Add `$mob->RestoreMana()`.
- Add `mob:RestoreEndurance()`.
- Add `mob:RestoreHealth()`.
- Add `mob:RestoreMana()`.
- Allows operators to easily restore a mob to full health, mana, or endurance.
- `RestoreHealth` is just a more verbosely named `Heal`.
- Convert spots in source to use these short hands instead of directly using `SetEndurance(GetMaxEndurance())`, `SetHP(GetMaxHP())`, or `SetMana(GetMaxMana())`.
* Update mob.h
* Update mob.h
This uses the book scribe button to learn recipes in SoF+ clients. For
Titanium clients the button is not available so a workaround will need
to be added later.
Note live gives no feedback when scribing books (at least those tested).
# Notes
- We were not passing `override_special_abilities` in the right parameter slot.
- Default `always_scale` to `true` when using the Perl/Lua method.
* [Bug Fix] Fix #serverrules Command
# Notes
- This command was effectively disabled as it was not included nor was the command itself defined within a `command_add`
* Update command.cpp
* [Bug Fix] Fix EVENT_KILLED_MERIT firing before NPC removal
# Notes
- NPCs were parsing this event too early and anything that checked if they were still alive in `EVENT_KILLED_MERIT` would show them still alive because of this.
# Image
* Code cleanup
* Update client.h
* Add GetRaidOrGroupOrSelf() to Perl/Lua
* Update to luabind::object, fix logic per comments.
* Fix
* Fix per comments.
# Perl
- Add `$client->RemoveAlternateCurrencyValue(currency_id, amount)`.
# Lua
- Add `client:RemoveAlternateCurrencyValue(currency_id, amount)`.
# Notes
- Allows operators to more easily remove alternate currencies, returns a `bool`, `false` if failed`, `true` if succeeded.
- Added `Zone::DoesAlternateCurrencyExist` that will reject setting, removing, or adding to a currency that does not exist.
* [Bug Fix] Fix GetLeaderName() for Groups
# Notes
- We were getting bogus data in this.
- Made it its own method.
* Remove ExpeditionRequest::GetGroupLeaderName()
# Perl
- Add `quest::silent_saylink(text)`.
- Add `quest::silent_saylink(text, link_name)`.
# Lua
- Add `eq.silent_say_link(text)`.
- Add `eq.silent_say_link(text, link_name)`.
# Notes
- Allows operators to more easily use silent saylinks without an optional silent parameter in the traditional saylink methods.
- Sets `silent` parameter default to `false` so we do not need to pass `false` when we are not using a a silent saylink.
- Changes all places that used `EQ::SayLinkEngine::GenerateQuestSaylink` to `Saylink::Create` where possible.
- Removed `questmgr` method that is no longer necessary.
- Cleaned up Lua methods to use the strings directly instead of building one out.
* [Bots] IsValidTarget crash fix
This addresses crashes related to IsValidTarget on multiple servers.
Unsure of the exact reason if anyone can explain why changing from const bool to bool in this situation fixes the problem.
Is it because the const is somehow crashing on a bad pointer or is it attempting to be force changed?
* Update bot.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
* [Quest API] Add RemoveAAPoints() and AA Loss Event to Perl/Lua
# Perl
- Add `$client->RemoveAAPoints(points)`.
- Add `EVENT_AA_LOSS`, exports `$aa_lost`.
# Lua
- Add `client:RemoveAAPoints(points)`.
- Add `event_aa_loss`, exports `e.aa_lost`.
# Notes
- Allows operators to more easily remove AA Points.
- Has a bool return type that will return false if the player does not have enough AA Points to complete the removal.
* Update client.cpp
### Perl
- Add $bot->DeleteBot().
```
sub EVENT_SAY {
if ($text =~/#deletebot/i && $client->Admin() >= 100) {
my @bot_list = $entity_list->GetBotList();
foreach $ent (@bot_list) {
if ($ent) {
quest::shout("Deleting " . $ent->GetCleanName());
$ent->DeleteBot();
$ent->Camp(0);
}
}
}
}
```
### Lua
- Add bot:DeleteBot().
```
function event_say(e)
if(e.message:findi("#deletebot")) then
local bot_list = eq.get_entity_list():GetBotList();
for ent in bot_list.entries do
if (ent) then
e.self:Message(7,"Deleting " .. ent:GetCleanName() .. "");
ent:DeleteBot();
ent:Camp(false);
end
end
end
end
```
### Notes
- Allows operators to delete bots.
# Notes
- The `-1.0f` was causing these modifiers to be set to `0.0` and when people would enable them they would get no experience.
- We now use the zone based grabbed methods when setting which will default to a value of `1.0f` if there is not a value found.
- Add `$mob->IsBoat()`.
- Add `$mob->IsControllableBoat()`.
- Add `mob:IsBoat()`.
- Add `mob:IsControllableBoat()`.
- Allows operators to determine if a mob is a boat or a controllable boat.
# Perl
- Add `$mob-.IsDestructibleObject()`.
# Lua
- Add `mob:IsDestructibleObject()`.
# Notes
- Allows operators to determine if a mob is a destructible object.
* [Quest API] Add Bot Special Attacks for Immune Aggro/Damage
# Notes
- Adds `IMMUNE_AGGRO_BOT` and `IMMUNE_DAMAGE_BOT` for uses in special abilities.
* Cleanup
* Update attack.cpp
# Notes
- We were getting a warning for returning `std::string()` from this method as it's a temporary reference.
- Change from `const std::string&` to `const std::string` to avoid this.
```
/home/eqemu/source/zone/bot_database.cpp: In member function ‘const std::string& BotDatabase::GetBotNameByID(uint32)’:
/home/eqemu/source/zone/bot_database.cpp:2374:25: warning: returning reference to temporary [-Wreturn-local-addr]
2374 | return e.bot_id ? e.name : std::string();
```
* Exempt zone from IP checks
* [Feature] Add Support for String-based Rules
# Notes
- Add support for string-based rules.
# Images
* convert to comma-seperated list
* Forgot to convert the zone to a string
* Update lua_general.cpp
* fixed rule name
* use the local string methods instead
* I think this will work as desired without the extra condition
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [Bug Fix] Cleanup NPC Mana Tap Logic
Mana Tap rule logic was invalid - Cleaned up and simplified, either we care about npc mana or we dont.
* Updated for bypass all rule
* Change so melee targets get blocked even with requiremana rule off
---------
Co-authored-by: Trust <fryguy503@gmail.com>
Helper template was not deducing float for lower/upper values allowing invalid sizes
Limit to sane values of 1-255 unrestricted and 3-15 for clients and pets
* [Commands] Add #fish Command
# Notes
- Adds `#fish` command.
- Allows operators to simulate fishing to see what they would get, consumes no bait.
* `use_bait`
* Update fish.cpp
* [Bug Fix] Fix issue with NPC heads
# Notes
- We were overwriting head material within this secondary loop which caused NPC's heads to show their body texture in some places or no texture if their `showhelm` was not flagged.
# Images
* Update mob.cpp
* Update mob.cpp
* Update mob.cpp
Forage was not properly incrementing the total chance of items when more than one was found and would result in the final chance roll being based off the last item found rather than the total. This would cause the first item returned to be chosen in most cases when the chances are the same in the table.
* test against vanilla branch
* use existing methods to validate name instead of raw sql
* Revert "use existing methods to validate name instead of raw sql"
This reverts commit 43750c6f4f597864f3e433885f9e3f84144e3d65.
* ReserveName doesn't work like that. Oops. Well, check against Name Filter at least.
* That db access condition was wrong.
* that isn't how CheckNameFilter works, either.
* apply editorconfig w/ trivial change
* Actually apply editorconfig changes.
Issue: guild creation routine does not update world memory holding guild details until the player zones.
Between the creation of a new guild, and a guild member zones, a /who all displays 'Invalid Guild' instead of the actual guild name.
# Perl
- Add `$combat_start_time`, `$combat_end_time`, `$damage_received`, and `$healing_received` to death events for NPCs.
# Lua
- Add `e.combat_start_time`, `e.combat_end_time`, `e.damage_received`, and `e.healing_received` to death events for NPCs.
# Notes
- Allows operators to hook in to the combat record logic so they can log the start and end of combat as well as the damage/healing received over the course of the fight.
# Notes
- Bot weapons that have no races were not causing damage and saying the target was invulnerable because we were not checking the `Bots:AllowBotEquipAnyRaceGear` rule.
# Perl
- Add `$questitem->GetAugmentIDs()`.
# Lua
- Add `iteminst:GetAugmentIDs()`.
# Notes
- Allows operators to get a list of augment IDs from an item instance directly without using the inventory method.
Updates guild bank functionality
- Allows QTY 100 in guild bank
- Removes bug when deposit area is full and a UF or RoF2 client attempts to deposit another item
- Attempt to deposit a nodrop item in RoF2 creates a dupe situation
Ubuntu 22.04 as of Feb 25 2024 was crashing when sending guild tributes on zone in. Issue was caused by an overrun on string copies.
Updated to use strn0cpy, crash was resolved.
# Perl
- Add `$mob->GetHateListCount()`.# Perl
- Add `$mob->GetHateListCount()`.
- Add `$mob->GetHateListBotCount()`.
- Add `$mob->GetHateListClientCount()`.
- Add `$mob->GetHateListNPCCount()`.
# Lua
- Add `mob:GetHateListCount()`.
- Add `mob:GetHateListBotCount()`.
- Add `mob:GetHateListClientCount()`.
- Add `mob:GetHateListNPCCount()`.
# Notes
- Allows operators to more easily get a total entity count of a Mob's hate list, can do an overall count, or specifically bots, clients, or NPCs.
* [Feature] Add Augments to Starting Items for Bots/Players
- Adds support for augments to `bot_starting_items` and `starting_items`.
- Will allow operators to kit bots/players out with augmented gear from the start if they so choose.
* Update database_update_manifest.cpp
* Update client.cpp
* [Bug Fix] Revert 2df7d19f97
This change breaks lich-type spells as seen in #4098. Per comment on original change, also don't see where Runes come into play.
* Revert invis change
* [Bug Fix] Correct Rune damage check location for invis break.
Correct the location of the CommonBreakInvis for runes. Appologize for the incorrect location. Thank you JJ for pointing me to the PR that caused the issue.
---------
Co-authored-by: Trust <fryguy503@gmail.com>
* [Repositories] Cleanup and Convert Character Creation to Repositories
# Notes
- Converts `Database::GetCharacterID()`, `Database::SaveCharacterCreate()`, and `Client::OPCharCreate` to repositories.
- Cleanup a spot we were doing a queries in a loop.
* Cleanup
* Update database.cpp
* Update database.cpp
# Notes
- Add `eq.cast_spell(spell_id)` and `eq.self_cast(spell_id)` to Lua.
- Lua did not have a `quest::castspell(spell_id)` or `quest::selfcast(spell_id)` equivalent, so this adds them.
* [Bots] Cleanup empty `bot_commands` files
# Notes
- These files were part of the conversion of bot commands to individual files, these commands are part of overarching commands and therefore do not have their own files.
- These were not removed when initially committed.
* Update bot_command.cpp
* Update bot_command.cpp
This adds an error msg handler for lua calls to add a stack trace to
error messages. Lua 5.1 does not have luaL_traceback like luajit and lua
5.2+ so debug.traceback() is used directly as the msg handler.
The traceback will add more detail to errors than just logging package
and event names. Exceptions in C++ binds and luabind errors will now
show script context instead of just the error message.
e.g., for a luabind overload error:
No matching overload found, candidates:
void signal(int,int,int)
void signal(int,int)
stack traceback:
[C]: in function 'signal'
quests/arena/player.lua:10: in function 'somefn'
quests/arena/player.lua:27: in function <quests/arena/player.lua:17>
# Perl
- Add `$client->IsInAGuild()`.
# Lua
- Add `client:IsInAGuild()`.
# Notes
- Allows operators to more accurately tell if a player is in a group.
- `GuildID()` returns `uint32` max value if the player isn't in a guild so conditions using it must check for a value over a certain point, this is just a bool that simplifies that logic.
* [Bots] Remove Alt Combat Functionality
# Notes
- This functionality needlessly complicates bot targeting logic and causes crashes and unintended behavior for players when accidentally enabled or enabled by default.
* Cleanup
* [Database] Fix default value for `time_of_death` in `character_corpses`
* Extra `NULL`
* Update repository
* Repositories with updated structure this time
* [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>
If a task was deleted or had new elements added to it without updating
character states to match changes, client state for the task was not
loaded into memory and a "contact a GM" warning was sent to the client.
This caused an issue if a client later accepted a new task because it
could be placed in the same client state slot as a non-loaded task. The
table does not have constraints so this was also inserted into the db.
The next time client task state was reloaded after zoning, the new task
would not be loaded since it occupied a used slot, even though that used
slot was also not being loaded. The client could not remove or reacquire
the original task without GM intervention and an entry was left in the
db for the new task.
This makes the following changes to client task state loading:
- If a task id no longer exists it is deleted from client state tables
instead of only being removed from memory.
- If a task occupies the same client state slot as another task, it is
deleted from client state tables instead of being ignored.
- If new elements have been added to a task, client state will keep the
task in memory. The new activity states will be inserted into the db
when necessary for updates (may not be immediate).
These changes also fix two smaller bugs as a consequence:
- If a character was at the 20 quest limit the last quest wasn't being
processed for activity count changes. The task would continue to show
to clients but any added new elements couldn't be completed.
- Deleted tasks that occupied slot 0 in client state would fallback to
loading it as a solo task of type 0. This prevented a client's real
solo task from being loaded if the deleted task was processed first.
Note clients may receive or lose credit for completed elements if new
ones are added in the middle of tasks. Server ops will still need to
update character state tables manually on task changes to prevent this.
Only the first element was being serialized to show the start zone of
tasks. This was resulting in a blank description for tasks that only
have element descriptions.
Live sends all initial active elements for the task when sending this
packet. Any bracket text with these elements as a requirement will be
appended to the description.
* DRAFT - Classic Taunt (Pre 2006) style of taunt
RULE: ClassicTauntSystem
Completely seperate logic for each system. Could potentially be re-writte to be more inline but there are a good bit of minor differences.
* Consolidate Logic
Still needs in-game testing
* Feedback Request
* Updates per feedback
# 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
* [Feature] Add optional `is_force` parameter to Zone::Repop
# Perl
- Add `quest::repopzone(is_force)`.
# Lua
- Add `eq.repop_zone(is_force)`.
# Commands
- Cleanup `#repop` to use new parameter in `Zone::Repop`.
# Notes
- Allows operators to forcefully repop a zone without using a second method to clear the respawn timers.
* is_forced
* Update repop.cpp
* Update repop.cpp
* [Commands] Add #show special_abilities
# Notes
- Allows operators to see what special abilities an NPC has.
- Move special ability values to `common/emu_constants.h`.
- Add `EQ::constants::GetSpecialAbilityMap()` and `EQ::constants::GetSpecialAbilityName()`.
- Add `NPC::DescribeSpecialAbilities(client)` to describe special abilities to a specified client.
# Images
* Update npc.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>
* [Objects] Add is_floating column to objects/ground spawns
# Notes
- Allows ground spawns/objects to float without having `FixZ()` called.
* Remove from object.
* Database version
* Fix
* Change to fix_z
* [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
# Notes
- These were not displaying because bots pass the `attacker && attacker->GetOwner()` check which assumes they're a pet because we weren't confirming it wasn't a bot.
# Image
* [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
* [Pets] Convert Load of Pets Beastlord Data to Repositories
# Notes
- Convert `GetBeastlordPetData()` to repositories.
- Add support for `unsigned` versions of `float`, `double`, and `decimal`, without this we defaulted to `std::string`, such as with `pets_beastlord_data`.
* Update repository-generator.pl
---------
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* [Bug Fix] Fix NPC After Death Emotes
- `DoNPCEmote` was being called on the corpse, not the NPC, so it wasn't working for some reason despite it working for years.
- Cleaned up some other logic and variable names in `NPC::Death` while I was in there.
* Update attack.cpp
* Update npc.cpp
* Update attack.cpp
* Update attack.cpp
# Notes
- Adds an expansion settings update to the `Mercs:Enable` command, only updates if the expansion setting isn't already `-1` or doesn't already contain the bitmask for Seeds of Destruction (16384).
- This will enable Mercenary Liaisons spawning properly in Plane of Knowledge for the hiring of mercenaries.
- Adds support to `#petitems` to allow you to target bot's pets to view their items, defaults to your pet if you have one.
- If you have no pet or no bot pet targeted it won't function.
# Notes
- Use constants where possible.
- Change `resist_adjust` parameter in `Beacon::AELocationSpell` from `resist_adjust` to `in_resist_adjust` so we're not possibly causing parameter shadowing.
* [Bug Fix] Fix issue in character_corpses Repository Query
# Notes
- Query had an extra ` inside of it, causing it to fail.
* Update character_corpses_repository.h
* [Bug Fix] Player Taunt Distance
Previously this was not regulated on the server side and allowed players to exploit situations where the client did not enforce Z distance checks.
Rule Name: MaximumTauntDistance
Rule Default: 150
Calculation is Rule Squared
* remove `this`
* [Bug Fix] Limit pet taunt distance
Previously this was not regulated and allowed players to exploit unlimited taunt distance.
Rule Name: PetTauntRange
Rule Default: 150
Calculation is Rule Squared.
* Remove `this`
* [Crash Fix] Fix crash when creating Frogloks/Drakkin
# Notes
- https://github.com/EQEmu/Server/pull/3920 introduced an issue where we were using `uchar` for `race_selection` and `class_selection` which was not functioning properly within `IsPlayerRace()`.
* Update client.cpp
* [forage rule feature] add a rule to disabled using common_food_ids from the list in forage.cpp. currently set to enabled.
* [Quest] change QuestReward summonitem to SummonItemToInventory.
* add closing brackets in QuestReward functions.
# Notes
- Mercenaries were disappearing on zoning because they were saving to slot `1` and being loaded from slot `0`.
- Mercenaries were not displaying properly in group window because of this as well.
- Mercenary buffs were saving even when they did not have any buffs.
* [Merchants] Change database structure for merchant slots
The `slot` field should be unsigned int. The temp slot is currently limited to 127. The client will limit the visible slots.
* Update version.h
* [Rules] Convert IDLE_WHEN_EMPTY to a rule
# Notes
- Converts `IDLE_WHEN_EMPTY` to `Zone:ZonesIdleWhenEmpty` so that we can change this on the fly or on a zone-by-zone basis instead of having to recompile to do this.
- Especially helpful for those using release binaries that do not compile their own source.
* Convert to zone column.
* Update ruletypes.h
* Update ruletypes.h
* Update entity.cpp
* Update entity.cpp
* Rename.
* Update database_update_manifest.cpp
* Update base_zone_repository.h
* Update zone.cpp
* seconds_before_idle
* Update database_update_manifest.cpp
* Getter/Setters/Private
* Update base_zone_repository.h
* IsIdle()/SetIsIdle()
* Update entity.cpp
* [Zones] Convert Get/Set of Zone Timezone to Repositories
- Convert `GetZoneTimezone()` and `SetZoneTimeZone()` to repositories.
* Update time_zone.cpp
* DRAFT: [Feature] Add Lore Item Trade Error
I had lots of feedback from players to add feedback when doing player to player trades to include what items were causing the trade block.
I quickly added this check, however if multiple lore items are being traded, this will only output the first. So far it has worked well, but not sure if we want to:
- Expand this to list all lore items in the trade.
- Enable this by default and do not provide a rule?
* Credit to @KinglyKrab for the assist on making this output a list.
Ruled this off but enabled by default.
* [AAs] Convert Loading of AAs to Repositories
- Convert `LoadAlternateAdvancementAbilities()` to repositories.
- Regenerate repositories since a column was added to `aa_ability`.
* Update aa.cpp
* Update aa.cpp
* [Rules] Classic Spell Data SPA Calc variability
When using lucy imports of older more classic data, they lack the limit values which provides Focus Random Effectiveness.
Example:
Bazu Plauge (6472) went from a 40 limit to 0 limit on the 2006 lucy import.
Lucy does have limit value data, but it appears the affected SPAs sony handled in source vs in spell data.
* Requested Changes
* [Bug Fix] Rampage Number of Hits Limit
Rampage should Hit 1-2 times (Primary / Secondary) should not be Triple/Quadable
* requested name convention changes
* [Rule] Classic Tracking Skillups
Rule: TrackingAutoRefreshSkillUps
Default: True
Disable rule to prevent skillups from happening on auto refresh of tracking window.
* typo
* [Bug Fix] Increase percision on CheckDoubleAttack.
On DA Checks where class was a non skill based DA Attacker (Bard or BST with granted DA) The DA check was too steep and should not have been dividing by 500 but rather 100. Also adjusted logic percision to use floats so loss of data does not occur.
* logging var names update
* Update attack.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
I have been informed that this was proven to be false, but the AA is pretty useless without some adjustment.
Adding this as a rule to allow server owners to adjust as needed.
Update Sinister Strikes
tapatalk.com/groups/monklybusiness43508/leksikon-s-half-assed-guide-to-monkly-aas-oow-incl-t510-s20.html?sid=a9c7745f287f3e89301c960c20f33248
Sinister Strikes:
19 Delay weapon -- Gives a 5 damage bonus to all hits
20 Delay weapon -- Gives a 6 damage bonus to all hits
24 Delay weapon -- Gives a 7 damage bonus to all hits
Given Quarm hammer with maxed non-GoD AAs:
0.7 HPS offhand = 4.9 DPS increase.
* [Bug] Limit MeleeMitigationEffect to defender if only client.
* Fix MeleeMitigation to properly Add (Substract due to negative values).
* defender fix
* [Rule] Allow GMs to silently summon
Disable to silently summon players with #summon.
Converted SummonPC to a MessageString
* Implementing an automatic detection of gm hidden mode and silent summoning.
* [Bug] HT Crit Ratio
This is used to tune and bring HT Crits more in line with the correct values as proven in screenshots.
* requested changes
* mistakenly kept mob::
When using `UseLiveBlockedMessage` rule, bard will get massively spammed when doing aoe songs that are blocked. Not sure it is resonable to try and filter out all stacking messages from songs, but rather just block bards as a whole. I can not think of many cases where bards care of songs land or not when using this rule.
Elements that share a group are placed in the same list section and
separated from other groups with a divider.
Live appears to only use this for optional elements in some tasks and
when used each optional always gets its own group. This might indicate
it's done automatically under certain criteria to ensure optionals are
never grouped with non-optionals regardless of index.
Since groups are available in captures and there's very few tasks that
use this, we don't need to worry about trying to replicate any automatic
behavior since this allows more customization.
* [Crash Fix] Character Creation Class/Race out of Range.
Known bug to crash the world server from character creation.
You can send a packet with a manual race or class entry below 0 or above 255 will cause world crash.
* Requested changes
* Compile fixes and logging change
* Fixed compile issues
Rule: BashTwoHanderUseShoulderAC
Default: False
Allows server operators to choose if they want two handed bash to utilize the shoulder armor or not.
Rule: BashACBonusDivisor
Default: 25.0
Allows adjustment for bash AC value contributions. Lower to increase damage.
* [Rule] Over taunt hate rule
Rule to add additional hate when taunt succeeds. This can help tune snap aggro on taunt classes. Only works when taunt succeeds and not already top hate.
* Requested Adjustments
* Add default +1 on rule
* Revert back to 0 default on rule with +1 on the standard formula
* formatting fix
Ignoring the Z axis allows you to attack mobs on target from wildly inappropriate Z distances.
Example you can pull mobs to the cy in bothunder from the towers you are under when many 1000's of units away by Z only.
* [Bug Fix] TGB - Added logic to stop bard errors on group songs.
Occasionally bards would get an error when singing songs with another group member targetted.
* Logic Fix
* Fixed missing brace
* [Rule] Classic Triple Attack
Classic Triple attack pre-dates skill based triple attack.
Originally it was only for a few classes but was expanded to Warrior, Monks, Berserkers and finally rangers for Dragons of Norrath. After which it was converted to a skill based feature.
These were innate starting level 60 and had a flat % to trigger.
* Requested Changes
* [Bug Fix] depop charm pet and detach debuffs on evac.
This will depop charm pets and deteach debuffs to prevent some social aggro issues and exploitable conditions with charming and pulling a mob across the zone with no aggro concerns.
* Added Rules
* [Rule] RequireMnemonicRetention for Spells 9-12 Rule
Rule is default false to maintain current server setup.
Enabling will require clients to have the required ranks of Mnemonic Retention in order to cast.
This is a stopgap as on live, the buttons are not even available to use. This will mimic the functionality but denying the cast.
* Change to default true
* Cleanup Logic - Thank you @KinglyKrab
* To aggressive on the cleanup
* True != true
* fix duplicated rule after rebase.
* [Bug Fix] Clear Ramp when Clearing hate
When clearing a client from the hatelist, also clear them from ramp
* Add additional calls missed
* requested changes
* extra tabs
* [Bug Fix] Swiming rules adjustment and racial
We need to set all character default swiming prior to working through racials. Added racial check so if starting rule is over the racial default it will not over-ride the starting rule.
* operator fix
* [Feature] Legacy Manaburn Rule
Enabling this rule allows the legacy style Manaburn and LifeBurn early 2003 and earlier.
* Requested Changes
* Requested Change
* [Rules] PC Push and NPCtoNPC Push
Added knobs to increase/decrease push for players/clients by percentage.
Added toggle to enable or disable (disabled by default) NPCtoNPC push (2013 patch)
* Requested Changes
* Fix build errors
* [Rule] Classic Invite Requires Target
Default is false, when enabled, group invites will require a hard target to invite.
`/invite charname` will no longer function when enabled.
* Updates including raid errors
* String Suggestion
* [Bug Fix] Harm Touch Unholy Disc Type
Added an small if block in the ResistSpell() function to set the correct resist type, disease,when HT is casted while the Unholy Disc is up.
* Remove Extra Space
* [Bug Fix] Vampiric Embrace Fixes
Fixed the difference of procs for Vampiric Embrace between Necros and Shadow Knights.
* Space
* Cleanup
* Update spdat.h
---------
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [Bug Fix] Dire Charm Reset
Added Druid and Necro Dire Charm to Failure Check
* [Rule] RequireMnemonicRetention for Spells 9-12 Rule
Rule is default false to maintain current server setup.
Enabling will require clients to have the required ranks of Mnemonic Retention in order to cast.
This is a stopgap as on live, the buttons are not even available to use. This will mimic the functionality but denying the cast.
* Revert "[Rule] RequireMnemonicRetention for Spells 9-12 Rule"
This reverts commit c65e86223da7fbd961ff1f54f059ccb4e20b5290.
* [Feature] Legacy Fizzle Code
Enabling UseLegacyFizzleCode will enable the legacy fizzle code system.
New fizzle codes modeled on extensive testing in 2001/2002 (thank you druid's grove and graffe)
* requested adjustments
* Requested Changes
* [Bug Fix] Class Trainers dont steal your money!
Class trainers log an error when you have reached your max train in the specific skill. They will continue to "Appear" to eat money and practices however they will be returned on logout/in or zone.
* Remove un-needed logic due to legacy code.
* more cleanup
* [Rule] Mounts will wear off on zone
Allows server admins to toggle if they want to prevent players from retaining mounts on zone. false is default to maintain current feature set.
* Added Date for mount zoning added
* [Bug Fix] DI/Death Pact Fix
Divine Intervention/Death Pact buffs were always fading the moment a person dropped below 16% regardless if it healed or not. It will now only fade if it succeeds in healing, and it will only check to heal when a person drops below 16%
* Requested Updates
If aggro goes negative, it resets the counter from the max value, so having a negative aggro will give massive aggro. This was happening with bane attacks from monk special abilities being set to -5 damage so they don't hit, and since aggro was set to the same, instant aggro from monks on bane mobs. Set all monk special attacks to generate 0 aggro if it is less than 0.
* [Feature] Break Trader if moved
If the player moves while in trader mode, it will end the mode, this prevents traders from moving outside of the trader area after entering trader mode.
* Fix spacing
* [Tuning] FD and Sneak break when cast on adjustments.
Rules added:
RULE_REAL(Spells, BreakFeignDeathWhenCastOn, 50.0) // percentage that fd will break when you resist a spell
RULE_REAL(Spells, BreakSneakWhenCastOn, 2.0) // percentage that sneak will break when you resist a spell
* Fix default value to be peq default and spacing
* [Character] Convert NoRentExpired to Repositories
- Create a custom `GetSecondsSinceLastLogin` repository method to use in `NoRentExpired`.
* Update character_data_repository.h
- Convert `LoadAltCurrencyValues` and `UpdateAltCurrencyValue` to repositories.
- Cleanup some other code and logic as well.
- Add `AlternateCurrencyMode` namespace for `AltCurrencyPopulate_Struct` opcode magic numbers.
* [Pets] Convert Save/Load of Pet Info to Repositories
- Convert `LoadPetInfo` to repositories.
- `SavePetInfo` already used repositories, cleanup logic.
* Update repositories.
* Update zonedb.cpp
* [Character] Convert Delete/Load/Remove/Save of Character AA to Repositories
- Convert `DeleteCharacterAAs`, `LoadAlternateAdvancement`, `RemoveExpendedAA` and `SaveAA` to repositories.
- Add `AACategory` namespace for AA Categories.
- Cleanup some logic/formatting in modified methods.
* Move namespace.
* [Character] Convert Load/Save of Character Currency to Repositories
- Convert `LoadCharacterCurrency` and `SaveCharacterCurrency` to repositories.
* Update zonedb.cpp
* [Character] Convert Load/Save of Character Potion Belt to Repositories
- Converts `LoadCharacterPotionBelt` and `SaveCharacterPotionBelt` to repositories.
* Update zonedb.cpp
* Update zonedb.cpp
* [Character] Convert Load/Save of Character Skills to Repositories
- Converts `LoadCharacterSkills` and `SaveCharacterSkill` to repositories.
* Update zonedb.cpp
* [Character] Convert Delete/Load/Save of Character Spells to Repositories
- Converts `DeleteCharacterSpell`, `LoadCharacterSpellBook`, and `SaveCharacterSpell` to repositories.
* Update zonedb.cpp
* [Character] Convert Load/Save of Characters to Repositories
# Notes
- `LoadCharacterData` and `SaveCharacterData` now use repositories.
* Update zonedb.cpp
* [Character] Convert Delete/Load/Save of Character Material to Repositories
- Convert `DeleteCharacterMaterialColor`, `LoadCharacterMaterialColor`, and `SaveCharacterMaterialColor` to repositories.
* Cleanup
# Notes
- Cleanup messages and logic.
- Add a confirmation so operators don't accidentally shutdown the zone they're in thinking this is `#worldshutdown` instead.
* [Commands] Cleanup #appearance Command
# Notes
- Cleanup messages and logic.
- Cleanup appearance type constants to use a namespace with constexpr instead.
- Cleanup animation constants to use a namespace with constexpr instead.
* Update emu_constants.cpp
* Cleanup
# Perl
- Add `$client->ClearXTargets()`.
# Lua
- Add `client:ClearXTargets()`.
# Notes
- Add `#clearxtargets` command for players.
- Allows operators/players to clear their XTargets if something get stuck on it.
* [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
* [UCS] Consolidate configuration block
* Update eqemu_config.cpp
* Single indent config
* reload config internally
* Make sure port is a string to be consistent with previous fields
* Move conversion logic to function CheckUcsConfigConversion
Bots were not casting the highest level spell with ^resist. Base_value was being used to compare resist spells, but this is typically the same value for all resist spells. This fix should be easier than calculating the caster bots level adjusted "resist_total".
* [Crash] Fix a crash where a raid invite could be accepted affter joining a group with the invitor.
* [Crash] Fix a crash where a raid invite could be accepted after joining a group with the invitor.
@ -4,46 +4,35 @@ This guide is far from exhaustive, you should expect to have some experience wit
### CMake
EQEmu uses CMake as the build system on all platforms. You will need CMake 3.2 or higher to build from source.
EQEmu uses CMake as the build system on all platforms. You will need CMake 3.20 or higher to build from source.
### Dependencies
The following libraries are required to build from source:
- [boost](https://www.boost.org/ "boost")
- [zlib](https://www.zlib.net/ "zlib") (If not included the source will build [zlib-ng](https://github.com/zlib-ng/zlib-ng "zlib-ng") instead)
- [libmysql](https://dev.mysql.com/downloads/connector/c/ "libmysql") or [libmariadb](https://github.com/MariaDB/mariadb-connector-c "libmariadb")
- uuid (unix)
The following libraries are not strictly required but in many cased recommended.
- [OpenSSL](https://www.openssl.org/ "OpenSSL") or [mbedTLS](https://tls.mbed.org/ "mbedTLS") (Required for the loginserver and headless client)
- [libsodium](https://github.com/jedisct1/libsodium "libsodium") (Required for strong password hashing on the loginserver)
- [Lua 5.1](https://www.lua.org/ "Lua 5.1") or [LuaJit](http://luajit.org/ "LuaJit") (Required for Lua Quest Scripting)
- [Perl](https://www.perl.org/ "Perl") (Required for Perl Quest Scripting)
##### Windows
For windows it is suggested you make use of [vcpkg](https://github.com/microsoft/vcpkg "vcpkg") if you wish to build your own dependencies.
If you wish to use Perl then you should use whichever version of Perl you have installed on the target system.
You can also download a vcpkg export from our releases section for Visual Studio [x86](https://github.com/EQEmu/Server/releases/download/v1.2/vcpkg-export-x86.zip "x86") or [x64](https://github.com/EQEmu/Server/releases/download/v1.2/vcpkg-export-x64.zip "x64") that includes a toolchain file you can pass to CMake.
##### Linux
For Linux you simply can install the dependencies from your package manager, below is an example of doing it on Ubuntu using apt-get.
**EQEmulator is a custom completely from-scratch open source server implementation for EverQuest built mostly on C++**
* MySQL/MariaDB is used as the database engine (over 200+ tables)
* Perl and LUA are both supported scripting languages for NPC/Player/Quest oriented events
* Open source database (Project EQ) has content up to expansion OoW (included in server installs)
* Game server environments and databases can be heavily customized to create all new experiences
* Hundreds of Quests/events created and maintained by Project EQ
<palign="center">
EQEmulator is a <b>passion-driven</b>, <b>open source server emulator</b> project dedicated to preserving and celebrating the legacy of a groundbreaking classic MMORPG.
For over two decades and continuing, EQEmulator has served as a <strong>fan tribute</strong>, providing tools and technology that allow players to explore, customize, and experience the legendary game's iconic gameplay in new ways. This project exists solely out of <strong>deep admiration</strong> for the original developers, artists, designers, and visionaries who created one of the most influential online worlds of all time.
We do not claim ownership of the original game or its assets. <strong>All credit and respect belong to the original creators and Daybreak Game Company</strong>, whose work continues to inspire generations of players and developers alike.
</p>
### > Debian/Ubuntu/CentOS/Fedora
<palign="center">
EQEmulator has for over 20 years and always will be a <strong>fan-based, non-commercial open-source effort</strong> made by players, for players—preserving the legacy of the game while empowering community-driven creativity, learning and joy that the game and its creators has so strongly inspired in us all.
<palign="center">EQEmulator represents <strong>over two decades of collaborative reverse engineering</strong>, building the server from the ground up without access to the original source code. This effort was achieved entirely through <strong>community-driven analysis, network protocol decoding, and in-game behavioral research</strong>.</p>
Every system, packet, opcode, and game mechanic has been reconstructed through countless hours of live packet sniffing, client disassembly, and in-game experimentation by dedicated contributors over the years.
</p>
<palign="center">
No proprietary code or server sources were ever used.
</p>
<palign="center">
All implementations are the result of clean-room engineering.
* High-performance networking and gameplay logic built in C++
* Cross-platform support for Linux and Windows
**MySQL / MariaDB Backend**
* Fully structured schema with over 200+ tables
* Supports content customization, expansions, and custom worlds
**Scripting Engine**
* Native support for **Perl** and **Lua** scripting
* Powerfully extendable for quests, NPC behaviors, and custom events
**Open Source Content Database**
* Includes ProjectEQ’s world data up through *Dragons of Norrath*
* 100% customizable to create entirely new game worlds
<h1align="center">
🚀 Why It Matters
</h1>
<palign="center">🧬 EQEmulator stands as a <strong>technical preservation project</strong>, ensuring that the magic of classic and custom servers lives on for future generations of players, tinkerers, and game designers.
</p>
> We humbly acknowledge and thank the original developers for creating one of the most influential online experiences in gaming history.
<h1align="center">
🧑💻🖥️ Supported Clients
</h1>
|Titanium Edition|Secrets of Faydwer|Seeds of Destruction|Underfoot|Rain of Fear|
If you want to set up your own EQEmulator server, please refer to the current [server installation guides](https://docs.eqemu.dev/#server-installation). We've had 100,000s of players and developers use our guides to set up their own servers, and we hope you will too!
LogDataBuckets("Attempted to read expired key [{}] removing from cache",e.key_);
DeleteData(database,k);
returnDataBucketsRepository::NewEntity();
}
LogDataBuckets("Returning key [{}] value [{}] from cache",e.key_,e.value);
if(is_nested_key&&!k_.key.empty()){
returnExtractNestedValue(e,k_.key);
}
returne;
}
}
}
// Fetch the value from the database
autor=DataBucketsRepository::GetWhere(
*database,
fmt::format(
" {} `key` = '{}' LIMIT 1",
DataBucket::GetScopedDbFilters(k),
k.key
)
);
if(r.empty()){
// Handle cache misses
if(!ignore_misses_cache&&can_cache){
size_tsize_before=g_data_bucket_cache.size();
g_data_bucket_cache.emplace_back(
DataBucketsRepository::DataBuckets{
.id=0,
.key_=k.key,
.value="",
.expires=0,
.account_id=k.account_id,
.character_id=k.character_id,
.npc_id=k.npc_id,
.bot_id=k.bot_id,
.zone_id=k.zone_id,
.instance_id=k.instance_id
}
);
LogDataBuckets(
"Key [{}] not found in database, adding to cache as a miss account_id [{}] character_id [{}] npc_id [{}] bot_id [{}] zone_id [{}] instance_id [{}] cache size before [{}] after [{}]",
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.