* strict spawn_events now take into account EQ minute.
This should fixed the eqtime spawn condition from falling behind.
* change a log to logspawns and add a comment in ExecEvent function.
* moved the comment to the note paramenter in the rule for last commit.
This fixes an edge case where a player could be made leader when added
to an expedition that only had a single member previously.
If a leader in a two-member expedition quit (forcing a leader change)
and the new leader went offline while throttled, a leader change flag
would be set until a non-leader was available. The first added member
would then be made the new leader.
This could also potentially occur on world startup due to the initial
throttle timer state but member statuses aren't processed there yet
* [Bots] Remove hardcoded race-class combinations from bots.
- Allows server operators to directly influence via a database table the classes a specific bot race can be.
- Previously this was hardcoded and required a source modification to do.
- Allowed races, classes, and genders have been removed due to redundancy at this point.
* Remove const cast and modify saylink definition.
* fix for charges not being sold correctly
https://github.com/EQEmu/Server/issues/1350 this fixes this issue
* Update client_packet.cpp
* Update zone.cpp
this completes the fix for all charge items being sold to merchants
* code opmizations
could probably be fixed up better but this is a little cleaner
* Update snake_casing
Co-authored-by: Chris Miles <akkadius1@gmail.com>
This moves members from expeditions so other systems can use them
Replace expedition_members table with dynamic_zone_members
Move 'EnableInDynamicZoneStatus' rule to DynamicZone namespace
Modify #dz list to show dz members (not instance players) and type name
Move various queries to repository methods
Remove the overloads that don't make sense (bots probably doesn't make
sense either, but too lazy)
Fix the formulas
Removed the Spells:MaxCastTimeReduction rule since this is HARDCODED in
the client so it doesn't really make sense to have it as a customization
point. If you want to hack the client, change the hardcode as well I
guess.
* [Bug Fix] EntityList::AESpell fix for Pacify / Mez
this fixes AE pacify / Mez spells only landing on 4 when it shouldn't have a cap
* Update effects.cpp
added constants
* Update effects.cpp
opmization thanks to @mackal
* Update effects.cpp
this fixes the unlimited issue
* added Spells:AOEMaxTargets to rules
incase a server doesn't want there to be a absolute unlimited AOE targeting for spells
* Update ruletypes.h
This starts some changes that move storage of things from expeditions to
dynamic zone class so other systems can possibly use them. This will also
make it easier to move window packet creation methods to DynamicZone.
For now these will remain on the expeditions table in the database. This
can be re-evaluated once other components are moved and seeing how other
systems may want to handle their player requirements.
* #list npcs Goto option now goes to higher Z if npc selected is a boat.
Makes using #list npcs and using the goto button more useful when NPC is a boat, as normal Z will put you in the water.
* Use ?: instead of bool multiply
* Update command.cpp
* [Installer] $ENV support
Add support for passing in installation variables instead of install_variables.txt.
In particular:
- EQEMU_SERVER_SKIP_UPDATE
- EQEMU_SERVER_SKIP_MAPS_UPDATE
Both work the same as files with the same name.
- MYSQL_DATABASE
- MYSQL_USER
- MYSQL_PASSWORD
All get read into the same $installation_variables collection, and are still overridden by any values found in installation_variables.txt
- MYSQL_HOST
Added to the list of $installation_variables, supported in installation_variables.txt, and overrides the default host for where the database lives (allowing it to be a separate container)
- MYSQL_ROOT_PASSWORD
If set, will use "root" as the user for DROP/CREATE DATABASE calls, to prevent requiring the "eq" user requiring more permission than is given by default with the MySql/MariaDB containers.
* [Installer] new_server_with_bots
Enabling bots requires both updated binaries and some database scripts. Fetching source and compiling the code is the longest part of setting up a new server. If you know you want bots, rather than having to do it twice, we can just accept an option to do it all at the same time.
* [Installer] Git/Source/Build optimizations
Source code is the same for bot/non-bot, so switch to a common directory for source and separate directories for build.
If the source directory already exists with a .git subfolder, rather than attempt to re-clone, instead do a git pull to still get the latest code. Helps when using a shared volume but rebuilding containers.
* [Installer] Formatting / Cleanup
Fixed some indentation, added an existing option to the utility script output, removed some excess newlines, and moved a debug output to help identifying errors.
World now caches and tracks member statuses so it can send them to zones
that request them on startup. Prior to this the cle would be searched in
world for every zone startup caching request, now it's only searched once
when a new expedition is created.
Bulk loading statuses removed since it would only be needed on world
startup now and likely have no clients in the client list anyway.
This also lets world choose non-linkdead members on expedition leader
changes and better detect when a leader change needs to occur
* Rename dz member id field
The name of the struct is enough to make this implicit
* Rename dz member enum and struct
Rename ExpeditionMember to DynamicZoneMember
Rename ExpeditionMemberStatus to DynamicZoneMemberStatus
* Rename dz window packet structs
This makes it more clear the window may be used by any dynamic zone
system not just expeditions (live missions fill the window when
player doesn't have an active expedition).
* Rename dz window packet fields
* Fix calls to GetSafePoints to not pass null_ptr as zonename
* Fix GetSafePoints to check and deal will nullptr being sent as short_zone_name
* Remove unintentinal formatting change
* Fix some typos/cut-n-paste errors I assume
Co-authored-by: Noudess <noudess@gmail.com>
* Add character-specific zone-based experience modifiers.
This will allow server operators to give players individual experience modifiers (regular and AA).
Zone ID 0 will server as a global modifier for players, if no rows are found the modifier defaults to 1.0 so experience is neither increased nor decreased.
Setting a zone-specific modifier will override the zone ID 0 global modifier.
Requires a SQL update: sql/git/required/2021_04_11_character_exp_modifiers.sql
- Add quest::getaaexpmodifierbycharid(character_id, zone_id) to Perl.
- Add eq.get_aa_exp_modifier_by_char_id(character_id, zone_id) to Lua.
- Add quest::getexpmodifierbycharid(character_id, zone_id) to Perl.
- Add eq.get_exp_modifier_by_char_id(character_id, zone_id) to Lua.
- Add quest::setaaexpmodifierbycharid(character_id, zone_id, aa_modifier) to Perl.
- Add eq.set_aa_exp_modifier_by_char_id(character_id, zone_id, aa_modifier) to Lua.
- Add quest::setexpmodifierbycharid(character_id, zone_id, exp_modifier) to Perl.
- Add eq.set_exp_modifier_by_char_id(character_id, zone_id, exp_modifier) to Lua.
- Add $client->GetAAEXPModifier(character_id, zone_id) to Perl.
- Add client:GetAAEXPModifier(character_id, zone_id) to Lua.
- Add $client->GetEXPModifier(character_id, zone_id) to Perl.
- Add client:GetEXPModifier(character_id, zone_id) to Lua.
- Add $client->SetAAEXPModifier(zone_id, aa_modifier) to Perl.
- Add client:SetAAEXPModifier(zone_id, aa_modifier) to Lua.
- Add $client->SetEXPModifier(zone_id, exp_modifier) to Perl.
- Add client:SetEXPModifier(zone_id, exp_modifier) to Lua.
* Removed unneeded [].
* Fix variable name,
* Fix variable name.
* Fix version.h.
* Rename 2021_04_11_character_exp_modifiers.sql to 2021_04_23_character_exp_modifiers.sql
* Update db_update_manifest.txt
* Add HTML color tag method to Perl and Lua.
- Add quest::gethexcolorcode(color_name) to Perl.
- Add eq.get_hex_color_code(color_name) to Lua.
Full color list here: https://pastebin.com/rUYKr1ye
* Convert to static and use strcasecmp over strcmp.
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* Switch the 2 split calls to SplitString
* Nuke duplicate split in favor of SplitString #1263
* Add a test for SplitString
* Optimize SplitString
Benchmarking:
--------------------------------------------------------------
Benchmark Time CPU Iterations
--------------------------------------------------------------
bench_oldsplit 5201 ns 5201 ns 129500
bench_split 1269 ns 1269 ns 548906
This is splitting a VERY long SpecialAbilities string. This is ~75%
speed up.
* For as long as I can remember people have had issues with zoning in, facing the wrong way, and walking through a zone line.
With this we will be able to set zone's safe heading as well as preserve heading on summon (NPC or GM) and teleports between zones.
This affects several pre-existing quest methods and extends their parameters to allow for the addition of heading.
The following functions have had heading added.
Lua
- client:SetBindPoint()
- client:SetStartZone()
Perl
- $client->SetBindPoint()
- $client->SetStartZone()
- quest::rebind()
SetStartZone parameter list was fixed also.
This converts some pre-existing methods from glm::vec3() to glm::vec4() and has an overload where necessary to use a glm::vec3() method versus glm::vec4() method.
This shouldn't affect any pre-existing servers and will allow PEQ and others to document safe headings for zones properly.
* Removed possible memory leaks.
* Fix SQL.
* Fix client message.
* Fix debug log.
* Fix log message.
* Fix call in rebind overload.
* Fix floats.
* Add default to column.
* Add rule 'GM:MinStatusToBypassLockedServer'
Default Status: 100
Description: Players >= this status can log in to the server even when it is locked
* Add rule 'GM:MinStatusToBypassLockedServer'
Default Status: 100
Description: Players >= this status can log in to the server even when it is locked
Add common expedition base class
Use repository for zone and world expedition caching
World now stores members and leader as Member objects instead of ids
This improves readability of the caching methods and lets world cache
expedition dzs and members like zone. World also now caches expeditions
as unique_ptr which will be necessary for future dz callback lambdas
that capture 'this' so addresses don't change on cache vector resizes.
Using search_deliminated_string here is significantly faster than
splitting, most likely because of dynamic memory management
Some tests on my system:
----------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------
bench_split 864 ns 864 ns 807922
bench_search 35 ns 35 ns 20265205
This test was a case where the string was present somewhere in the
middle which gave a ~96% speed up
----------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------
bench_split 936 ns 936 ns 725518
bench_search 61 ns 61 ns 11156359
This test was when the string was not present, which will be the vast
majority of times this is actually checked, was ~93% speed up
* Added a check to stop Bard song for Mezz/Stun
* Cleaned Song stun / mezz stop
* Update client_process.cpp
* removed bard check & added else where
* code clean up
Co-authored-by: ProducerZekServer <go@away.com>