- 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.
* [Database] Database update improvements, content db and terminal checks
* Update manifest entries with content flag
* Update database_update_manifest.cpp
# Perl
- Add `$client->HasItemOnCorpse(item_id)`.
# Lua
- Add `client:HasItemOnCorpse(item_id)`.
# Notes
- Allows operators to see if a player has an item on any of their corpses.
- May need to address having to allocate and deallocate memory for every corpse that could possibly exist for a player.
* [Cleanup] Gender constants cleanup
# Notes
- Convert to a `Gender` namespace using `constexpr`.
- Cleanup spots where we were using magic numbers for gender values.
* Cleanup
* [Cleanup] Delete errmsg.h in common and zone
# Notes
- These files were mostly unused.
- Moved the stuff that was used to the `dbcore.h` file since it's already used.
* Remove references
* [forage rule feature] add a rule to disabled using common_food_ids from the list in forage.cpp. currently set to enabled.
* NPC database emotes now supports basic variables. More than one variable can be used at a time.
* Format manifest
* Formatting
* Formatting
* Formatting
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Cleanup] Consolidate GetHateRandomBot(), GetHateRandomClient(), and GetHateRandomNPC()
# Notes
- These were separate methods and duplicated a lot of code, consolidated into the singular method using the `EntityFilterType`.
* Simplify random logic. Use filtered hate list.
* D
* D
Optional update to bring database up-to-date with Live data which includes Froglok and Drakkin data which was previously missing.
Raw data can be found in the Live client at Resources\Faction\FactionAssociations.txt
See discussion at #3678
This error is not necessary as it can be triggered when clicked spells have secondary effects that run through the same spell checks for clicked items but aren't actually clicked by the item. Spells that trigger other spell effects and some Bard scaling songs could trigger this after the initial click.
# Note
- `can_riposte` logic was reverse, setting to `true` caused the attack to not be able to be riposted, the opposite of the intended functionality.
Previously bots were only scanning for nearby clients so any AE spells or procs didn't have mobs to hit.
This changes that to scan for mobs instead of clients so their close entity list supports AEs with mobs to hit.
* [Bug Fix] Send Entity ID in Death Events to resolve#3721
# Notes
- Due to some pointers becoming invalid you may get an invalid entity ID on the killed mob if we don't just directly send the entity ID in the export string.
* Update attack.cpp
* Remove GetID() export.
* Experiment with PCH
* Another run
* GCC test
* Different test
* Another one
* Another one
* Lua headers
* PCH main zone primitives
* Tweaks
* Tweaks
* Tweaks
* Add EQEMU_BUILD_PCH option default to ON
* [Bots][Quest API] Add ^clickitem, ^timer, revamp bot timers, fix GetBestBotSpellForCure
This adds the command **^clickitem** for bots.
Bots can click items they are wearing with the provided slot ID, players can use **^invlist** on their bots to see items and slot IDs.
This supports actionables.
**^itemclick 13 byclass 11** would command all Necromancer bots to attempt to click their Primary item.
This adds and supports charges for items to bots, when an item is used, it will lose a charge and cannot be clicked once no charges remain.
This adds the following rules:
**Bots, BotsClickItemsMinLvl** - Minimum level bots can use **^clickitem**.
**Bots, BotsCanClickItems** - Whether or not **^clickitem** is allowed for bots.
**Bots, CanClickMageEpicV1** - Whether or not players are allowed to command their bots to use the Magician Epic 1.0
This adds quest methods to Perl/Lua for:
ClearDisciplineReuseTimer, ClearItemReuseTimer, ClearSpellRecastTimer
GetDisciplineReuseTimer, GetItemReuseTimer, GetSpellRecastTimer
SetDisciplineReuseTimer, SetItemReuseTimer, SetSpellRecastTimer
Discipline and Spell methods use the spell_id to check, get and set. Item uses the item_id.
Clear and Get support wildcards (no spell/item id) to clear all timers of the type or get the first timer of the type.
Get will return the remaining time on the chosen timer, if any.
Set supports a wildcard (no recast/reuse provided) to use the default of the provided type, you can also specify a recast/reuse timer to set that timer to the chosen value.
**^timer** has been added as a bot command, defaulted for GM access.
This can be used to set, get and clear timers of different types. Use **^timer help** for info.
This revamps the way timers are set, stored, loaded for bots.
**GetBestBotSpellForCure** was previously checking only the first spell found and not properly iterating through the checks.
This requires modifications to the **bot_timers** table and is included in this commit.
* Rebase Conflicts
* Update queries to use repositories
* Minor adjustment
* Formatting
* Handle delete as well
* Cleanup.
* Adjust primary keys to prevent conflicts
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
* [BUG] Fixed the discrepacy with time using command #time and in quests. https://github.com/EQEmu/Server/issues/3700
* removed comments and paratheses from previous commit.
* fixed typos.
* made some adjustment so #time, /time, scripting, and log all match.
* Update lua_general.cpp
* [Quest API] Add EVENT_LEVEL_UP and EVENT_LEVEL_DOWN to bots
# Notes
- Bots did not have these events, this will allow operators to perform events on bot level up/down.
* Update bot.cpp
Adds additional options to **^itemuse** to narrow down the list of accepting bots.
You can now specify by class, casters, hybrids, melee, WIS caster, INT caster or plate/chain/leather/cloth wearing.
Bots and especially their pets could get in a loop where they try to attack an invalid target. This would result in their pets spamming "That is not a legal target" messages.
* [Rules] Add DOT and HOT Rules
# Notes
- Add `Spells:DOTDamageBonusSplitOverDuration` rule.
- Allows operators to disable the DOT bonus damage being split over duration and instead adds the full amount every tic.
- Add `Spells:HOTBonusHealingSplitOverDuration` rule.
- Allows operators to disable the HOT bonus healing being split over duration and instead adds the full amount every tic.
* Update effects.cpp
* Update effects.cpp
Adds the rule **Bots, AutosaveIntervalSeconds** to control the frequency of the autosave of bots. Currently they only fully save on camp/zone.
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
**Bots, CazicTouchBotsOwner** is a rule that will toggle whether or not DT will hit the targeted bot or the owner. Similar to how **Spells, CazicTouchTargetsPetOwner** functions except for bots.
```
CMake Deprecation Warning at client_files/CMakeLists.txt:1 (CMAKE_MINIMUM_REQUIRED):
Compatibility with CMake < 3.5 will be removed from a future version of
CMake.
Update the VERSION argument <min> value or use a ...<max> suffix to tell
CMake that the project does not need compatibility with older versions.
```
* [Database] Add primary key to keyring table
# Notes
- Adds a primary key of `id` to `keyring` table so we can use it with repositories.
* Update version.h
* Update client.cpp
* Update client.cpp
* [Cleanup] Remove hard-coded Status Checks
# Notes
- Removed the hard-coded GM status checks since if you have access to the command we can now limit access to subcommands if necessary.
* Update client_packet.cpp
* [Database] Modify `updated` column in `items` table with proper default.
From https://mariadb.com/kb/en/datetime/, `datetime` can be ZERO_DATE (`0000-00-00` with no time component) or between `1000-01-01 00:00:00.000000` and `9999-12-31 23:59:59.999999`. Currently, `updated` is the only datetime field that is `NOT NULL` and improperly defaulted to `0000-00-00 00:00:00`. This change matches existing structures of the other `datetime` columns.
* Update items_repository.h
* Update base_items_repository.h
* Revert "Update items_repository.h"
This reverts commit 3599f26818f31bd8efd3a1e0d9cb9bf5d40785c5.
* [Database] Consolidate Starting Items Table
# Notes
- Convert `class`, `deityId`, `race`, and `zoneid` columns to `|` separated columns.
- Consolidates up to 15 rows per item down to a singular row.
- Allows ease of use for operators.
- Entire process is automated and creates a backup of pre-existing table.
* Update shareddb.cpp
* Unnecessary.
Mail to 'Guild' was failing after after 50ish members.
The buffer was set at 512, which cut truncated the message and caused the issue.
Refactored to adjust the size of the buffer based on the inbound message size.
* [Commands] Cleanup #list Command
# Notes
- Cleanup messages and logic.
- Introduce a struct so we don't have to duplicate so much code.
* Update list.cpp
# Perl
- Add `$mob->GMMove(x, y, z, heading, save_guard_spot)`.
# Lua
- Add `mob:GMMove(x, y, z, heading, save_guard_spot)`.
# Notes
- Operators weren't able to disable saving guard spots, so moving with `GMMove` meant NPCs stayed where they were moved.
Hate Reduction, Slow and DoT spells were failing IsValidSpellRange checks due to improper spell IDs being checked.
They were using the first spell in a bot's spell list by checking botSpell.id vs the proper spells in the loop.
* Updates login table to support tickets in a way that makes more sense.
* Change to snake_case as requested by Akka
---------
Co-authored-by: KimLS <KimLS@peqtgc.com>
* [Bug] NPC Faction War prevention.
This should assist with prevention of NPC Faction waring. I have been using this code on my server for over 5 years with no coredumps or any noted bugs. This was brought up as users have reported a few events where they can trigger NPC's to fight each other.
* Correct a few entries to line up with updated code.
* Re-add missing RestTimer functionality
This adds raid support to actionables for bot commands.
This also addresses Issue #3567
If in a group, group based commands will function as normal, however if in a raid they will support raids and use the group of the bot that fits the criteria.
This adds new actionables as well; namely, **ownerraid**, **byclass** and **byrace**.
**byclass** and **byrace** use the int of the chosen class/race. IE Shadowknight is 5, Barbarian is 2. **^create help** is an easy way for players to identify numbers associated with classes and races.
**targetgroup** will now select all bots that meet the criteria within a raid group in addition to the current functionality of groups.
**namesgroup** will now select all bots that meet the criteria within a raid group in addition to the current functionality of groups.
**ownerraid** will select all bots in the raid owned by the player.
**byclass** will selects all bots in the group or raid owned by the player that match the class.
**byrace** will selects all bots in the group or raid owned by the player that match the race
This adds actionables to **^casterrange** and **^camp** as well.
* [Cleanup] Cleanup #show currencies Command
# Notes
- Cleans up messages.
- Adds `AA Points` as a viewable currency.
- Adds an enum for `MoneyTypes` and `MoneySubtypes` so we're not using magic numbers for `GetMoney` anymore.
- Converts money amounts to `uint64`.
* Update currencies.cpp
* Update currencies.cpp
* Added mintime and maxtime to spawnentry. This will prevent a NPC from spawning outside of the times specified. NPCs spawned in this way will then behave like normal NPCs. They will not despawn on their own, unlike spawn_events/spawn_conditions. NPCs using this that are alone in their spawngroup will attempt to spawn after their respawn timer has expired if the time of day is outside their range. Otherwise, another NPC in the spawngroup will be chosen to spawn. The normal rules (chance, spawn_limit) still apply to these NPCs, this is just another rule added to the system.
mintime and maxtime both represent the in-game EQ Hour. Valid values are 1-24. If either or both of the values are 0, then the NPC will not have any time restriction.
Added a new rule World:BootHour. This allows server admins to specify the EQ hour the server will boot to. Valid options are 1-24. Setting this rule to 0 (default) disables it and world will use whatever time is specified in the DB.
* generated base_spawnentry_repository.h from script
* removed the rule insert from database_update_manifest.cpp.
* Add logging, initializers, minor cleanup
* Remove if/else branch
* Update eqtime.cpp
* Initializers, logging
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Feature] Add Comment to Item Data/Quest API
# Perl
- Add `quest::getitemcomment(item_id)`.
- Add `quest::getitemlore(item_id)`.
- Add `$questitemdata->GetComment()`.
# Lua
- Add `eq.get_item_comment(item_id)`.
- Add `eq.get_item_lore(item_id)`.
- Add `item:Comment()`.
# Notes
- Added the ability for operators to pull these fields from item data without a database hit.
- Fixed a bug in `embparser_api.cpp` where `GetZoneGravity` was connected to the wrong methods.
* Update embparser_api.cpp
Previously this check allowed bots of invalid races to be created. If a race was neither a valid combination or a valid player race, it would pass the check and allow bots of any race to be created.
**^create 1 123 0** could create a Male Innoruuk Warrior
* [CRASH] Fix crash on CentOS
Update raid crash in CentOS. raid constructors and learnmembers used a memset that was overwriting std::string structure.
Added default initializers to RaidMember struct
* Update based on feedback
* Added IsNightOnly for Dance of the Fireflies spell which should only be cast at night from 7pm to 4pm.
* Update to include IsDayTime and replace magic numbers.
* [Logs] Convert Loot Messages to Error Logs
# Notes
- These messages were sending to users and not being logged.
- `Message(Chat::Red, "Error: OP_EndLootRequest: Corpse not found (ent = 0)");` sends often when corpse expires right as you try to loot, so it makes the user think there's a true error.
* Update zoning.cpp
* [Pets] Disallow effect of alliance line when cast on pets.
* Update spell_effects.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
* Zone sidecar work
* Process management work
* Merge
* Sidecar work
* API config option
* Request proxy work
* Proxy headers and params
* Change port
* Remove code
* Sim work
* Sidecar work
* Update loot_simulator_controller.cpp
* Update loot_simulator_controller.cpp
* Formatting
* Post merge change
* Windows compile fix
* Update sidecar_api.cpp
* Update strings.cpp
Perl wasn't implementing quest interface's Init which is called by
Zone::Bootup. This should fix zone's that were in standby not using the
latest version of perl plugin scripts.
* [Bug Fix] Fix issue with subcommand settings not working
# Notes
- We were checking for `arguments >= 2` when we should just be checking for if there are any arguments and comparing `sep.arg[0]` (the command) and `sep.arg[1]` (the subcommand) to our `command_subsettings` to see if it exists and if we pass the requirements.
- This fix will let operators properly set a subcommand to a lower or higher status level than the parent command.
* Remove debug message.
* [Feature] Add Expansion and Content Flag support to Blocked Spells
# Notes
- Allows operators to filter blocked spells behind expansions or content flags.
- Requested in https://github.com/EQEmu/Server/issues/3582
* [Tradeskills] Add learned_by_item_id field (#3637)
* [Feature] Add Expansion and Content Flag support to Blocked Spells
- Allows operators to filter blocked spells behind expansions or content flags.
- Requested in https://github.com/EQEmu/Server/issues/3582
---------
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* [Feature] Add Bot Starting Items
# Notes
- This table is similar to the player starting items table, however it uses bitmasks.
- Allows operators to give bots gear on creation.
- `races` of `0` for all races.
- `classes` of `0` for all classes.
* Update bot.cpp
* Update database_update_manifest_bots.cpp
* [Scripts] Update 13th Floor importer
Overhaul to script.
- Now uses `eqemu_config.json`
- More descriptive during the process
- Accounts for adjustments (`idfile`, `prockunk1`)
- No longer needs to adjust `UNK132`
* [DB] Adjust `items` structure for import (#3629)
Our `items` table has 5 fields that need to adjust in order to pull data from 13th Floor.
* [DB] Update `version.h`
* Update Raid Functions
Updated various raid features for:
Titanium
- Raid window now functional, including with BOTS
- Raid delegate assist/mark work
- Raid notes work
- Raid /rmark, /clearmarks work
Underfoot
- Raid window was already functional
- Raid delegate assist/mark work
- Raid notes work
- Raid /rmark, /clearmarks work
* Updates to resolve feedback
* Slight update for overlooked case in encode for RaidUpdate for clients above Ti.
* Updates to further address feedback. Only updated translators for Ti/RoF2. Once ok, I will update the others.
* Update linux-build.sh
* Final updates for other translators and the strncpy_s issue.
* Fix for strn0cpy in raids.cpp, translators, and defines. Updated all in raids.cpp as well.
* Reveted defines change.
* Reverted accidental change
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
# Notes
- Bots were having a hard time keeping up with players.
- Part of this was due to using walk until a certain distance.
- Another part was their ctor only having `0.7f` run speed versus our Mob sanity check of `1.25f`.
- We check movement stuff now before idle checks so bots are more likely to start moving earlier.
# Command
- Add optional `level` argument to `#grantaa` so you can grant AAs up the specified level.
# Perl
- Add `$client->GrantAllAAPoints()`.
- Add `$client->GrantAllAAPoints(level)`.
# Lua
- Add `client:GrantAllAAPoints()`.
- Add `client:GrantAllAAPoints(level)`.
# Notes
- Grants all AA abilities up to client's current level or a specified level.
* [Feature] Add Extra Kick Classes
# Notes
- Allows operators to add extra classes to the "Kick" skill.
- Without this only Warrior, Ranger, Monk, Beastlord, and Berserker could kick.
* Remove gotos.
* [Quest API] Add Caster ID Parameter to FindBuff in Perl/Lua
# Perl
- Add `$mob->FindBuff(spell_id, caster_id)`.
# Lua
- Add `mob:FindBuff(spell_id, caster_id)`.
# Notes
- Allows operators to check if the spell ID is cast by a specific entity ID.
- We don't use `Mob*` reference here since the mob may have died, left zone, etc.
* Formatting.
# Notes
- Entities killed by a spell with #cast were not reporting their pre-death entity ID properly.
- Added an `entity_id_override` to `GetTargetDescription()` and added a pre-defined entity ID variable to the cast command so we can message the proper pre-death entity ID.
# Notes
- Allows operators to modify the level gap penalty and level gap required for the penalty for defensive procs' level gap penalty.
- Setting `Spells:DefensiveProcPenaltyLevelGap` to `-1` will disable the penalty.
This is just the packet framework for the Scribe button on recipe books
and the Cast Spell button on books that allow casting spells on
targets. It will need to be hooked up to a content implementation
* -Always load AAs beyond our current expansion (Will need this for refunding invalid AAs).
-AAs beyond our current expansion will no longer be buyable or sendable to clients.
* #reload aa will now reload character aa data.
* Base Implementation of auto grant AA
* -Add DB manifest entry
-Made has already purchased fn a bit better
-Added auto grant to db entry
* -Added grantaa command.
-Reworked grantaa to not spam the client with packets, it still does spam messages because the feedback is important.
* Port suggested changes for Finish AA purchase.
---------
Co-authored-by: KimLS <KimLS@peqtgc.com>
* [Instances] Refine id selection
Since the IDs start above the minimum, we needed to check if the first slot was available.
* Remove else by returning early, add validation before accessing row
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
* [Instances] Honor reserved instances
Logic to select next available instance id was incorrect.
The correct logic selected the max id + 1 or max reserved + 1, but then it would overwrite if we enabled recycling ids.
Additionally, it was incrementing the reserved ids and assigning ids to the max reserved id vice the next available.
Finally, it was running the logic twice.
* Fix updated SQL to use fmt
* [Charm] Fix to update target windows on charm on/off
* Removed accidental change
* Removed magic #
* reformated brace style in function that was modified
* Use better names for clear variables
* Forgot header with name change
* More header name changes
* [Feature] Change #reload zone to reload zone headers globally.
# Notes
- This allows operators to globally reload zone headers without going to every zone individually to do so.
* Update worldserver.cpp
* Update worldserver.cpp
* [Feature] Add adjustability for AERampage Range.
This functionality is needed for fights like Ture to be accurate, where their ramp range was 101% of their melee safe range.
Example in lua of utilizing this scripting
```
e.self:SetSpecialAbilityParam(SpecialAbility.area_rampage,8,101;
```
* Updates to address comments
* [Bug Fix] Bots will now load AAs properly when spawned.
* formatting
* formatting
* formatting
* formatting
* formatting (for real this time)
* formatting (for real this time)
* Formatting
This isn't designed well and wasn't handled correctly since the perlbind
library was getting built and linked with default options while zone was
using PERLBIND_NO_STRICT_SCALAR_TYPES. This was probably leading to some
unspecified behavior.
* [Bug] Escape item name in trader audit.
Quick fix to escape the item names in Trader Audit.
* Update trading.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
* initial commit
* oops.
* that wasn't supposed to be committed.
* Update effects.cpp
---------
Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
* [Character] Record character stats to
* Record stats on disconnect as well
* Record later in connect process
* Move enter zone code path so we're after bonuses
* Ok this spot for real
* Adjust recording
* Update client_packet.cpp
* Timestamps
* Update database_update_manifest.cpp
* Update client_packet.cpp
* Fix stat bonuses
* Fix for GENERIC_9_STRINGS
* Add Bot Heal Message Display
Creates a new rule to display Bot heal messages to the Bot Owner
* 2021-03-25 11L04pm
Spell and Heal Rule added to allow for Bot spell and heal damage to be sent to the Bot Owner's Group. Also added a check to remove duplicate message for #damage on self.
* Update .gitignore
* BOT work
Added BOT logging damage/heals to owner
Added BOT message to owner for harmony fails
Made var Critical global to remove duplicate crit messages
Added a NULL check to Mob:GetCleanname()
* Bot Group Work
Fixed botid=charid spawn on zone issue
Added a group_list update on zone to refresh from database to fix a dangling pointer to a Bot object that was camped but was previously in a group within the zone being entered.
Modified Bot::ProcessBotGroupInvite to use the client of the bot when doing the Bot initialization so that a leader can invite another owner's Bot
* Jan 4
Basic structure in place for Raid::AddBot though not working
* Basement Jan 5
* End of day Jan 5
Working Raid Invite to a Bot.
* Update to Client::QueuePacket to not attempt to send a packet to a BoT. Not clean, but a broad solution.
* Updated Raid::VerifyRaid
* Some Bot Raid working
* Before VS Crash
* Use Case 1, 2, 3,4,7 working.
Need to fix 5, 6, 8
* Work on usecase 5
* A few more use cases working
* New work on Raid invite with a invitor having a group
* Bot Raid inviting working for all use cases
* A few changes
* end of day jan 10
* Jan 11
* end of day Jan 11
* Bot Invite/Accept cleanup
* Start of moving raid bot functions to their own methods
* More bot raid changes
* More raid spell work
* end of day Jan 16
* spawn work
* Spawn on login working
* End of Day Jan 18
* Raid leader and mana/hp updates fixed
* Spell Tracking
* Issue with Bot Death in raid when casted upon. 1741 raid.cpp
* Bot Death fixed and few other crashes
* Working on botgroup removal
* Bot Disbanding Work 90%
* Looks like BOTs are working
* Fixed a bot crash
* bug tracing on entity list mismatch
* safe_delete resoves problem. No to track down leak
* seems to be working
* Memory corruption found - sending packets to BoTs using Client class
* added Raid::IsRaidMemberBot()
* Update p_raid_instance
* g3
* Final - Bot Raid Working
* Fixed IsRaidMemberBot to remove memory leak
Fixed altcombat crash though RaidMainAssist (428) needs fixing
* add RaidMember.IsBot
* Repaired IsBot function to be more preformant. Now works on standard performance machine
* Fixed Bard AE Target Spells
Removed assert for buffs
* updated based on Feb 2022 master updates
* Added bot_db_updates and version increment
* Cleanup of bot raid work and inclusion of bot_raid in cmake
* Fix repop crash
* Bot databse change to not use view
* Revert "Merge branch 'master' of https://github.com/neckkola/Server"
This reverts commit 18268306378a34a6f0a9015cfcb4f48364bef013, reversing
changes made to 7c1a1399918aeee1dc3f6f30e39044d7d1bec4c9.
* Updated syntax for 9230
Updated this syntax as to run on maria 10.1
* Revert "Updated syntax for 9230"
This reverts commit ffdd46c8b26a8607d41b95af3c3ab575c41f4231.
* Fix for cross zone mark npc when entity ids are reused.
* Fixed and tested
added db change
and tested across zones
* Transition to direct attributes instead of encode
Update the pattern to utilize direct raid object attributes for entity id, zone id and instance id instead of an encoded single field.
* [Cleanup] Cleanup #view zone_loot Command
# Notes
- An item ID was being required, we don't want to do that.
- Cleanup messages to only show item name/item ID
* Update zone_loot.cpp
# Notes
- Fixes an issue where Drakkin illusions that used different Drakkin Heritages were not properly applying the Drakkin Heritage due to not sending the Face Appearance.
* [Bug Fix] Fix Appearance Issues
# Notes
- Changing race, gender, or texture of a Mob could result in it changing sizes due to use not sending the size as part of the appearance packet.
- Also converts the parameterized method to a struct parameter so that we can optionally send things without back-filling multiple arguments.
* Gender cleanup.
* Fix.
* Formatting.
* [Data Buckets] Zone-Based Data Bucket Caching
# Notes
- Adds a data bucket cache so we're not needlessly hitting the database every time we need to read a data bucket value.
* Cleanup and unify GetData access patterns
* Cache work
* Push
* Add to cache when we fetch and do a db hit
* Handle bucket misses in cache
* Formatting
* Logging
* [Data Buckets] Zone-Based Data Bucket Caching
- Adds a data bucket cache so we're not needlessly hitting the database every time we need to read a data bucket value.
* Cleanup and unify GetData access patterns
* Cache work
* Push
* Add to cache when we fetch and do a db hit
* Handle bucket misses in cache
* Formatting
* Remove redundant fetches from cache since GetData does the same thing
* Push progress
* Distributed cache work
* Logging
* Fix issue with scoping where same named keys could return overlapping results
* Misses cache tweak, logging, comments
* Add bot, client, and NPC bucket methods to Lua.
---------
Co-authored-by: Akkadius <akkadius1@gmail.com>
@ -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.