Also included is an additive lagged fibonacci generator that should is
very similar to EQ's. Also added BIASED_INT_DIST in case someone wants
to use "bad" int distribution to more closely match EQ as well.
An option to set a custom engine (just in case people would like to play
with other std engines) is available.
There is also support for GCC's SIMD accelerated extension to std random
engines.
All these options are hidden behind advanced options in CMake since
they're rather advanced knobs.
* Add defines (commented) for further known SPAs
Added as comments since that appears what we were doing. This just gets
us caught up to dev post.
* More SPAs
Move the newer stuff added that was recently to the same place all of
our previous spell IDs were defined.
Either of these solutions were good, but I went with defines since it
was less changes
I also added a bunch of stuff the client has hardcoded behavior for, but
not currently implemented by us.
The removed stuff from the command_castspell were reused on live, so I
figured it was best to remove them from the restrictions since they are
no longer test spells
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.
* 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.
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
This isn't the exactly the right way, but it's behavior is much closer
to live than current for Solon's Song of the Sirens (725), the other
bard charms don't repulse due to mana cost
* Bards song with a mana cost shouldn't repulse
* Bard songs with SE_TemporaryPets shouldn't repulse
This is mostly just an issue with Vet AAs, the actually songs have a
recast, so are already handled
* SE_Familiar should be prevented as well
Only zone requires to be linked to lua, so let's not link EVERYTHING.
There is probably more clean up we could do, but I know for a fact Lua
is only used by zone.
This probably has some measurable benefits that probably don't really
matter that much :)
==2317==ERROR: AddressSanitizer: heap-use-after-free on address 0x6170000633c0 at pc 0x55ed1d8e8d8b bp 0x7ffda4bef580 sp 0x7ffda4bef578
WRITE of size 8 at 0x6170000633c0 thread T0
#0 0x55ed1d8e8d8a in Group::SetLeader(Mob*) ../zone/groups.h:80
#1 0x55ed1d8e8d8a in Group::DisbandGroup(bool) ../zone/groups.cpp:1016
ASan didn't like this
I don't think these are actually causing any real problems, ASan
complains about them though since it's kind of a code smell I guess and
a potential source of problems. But our case is fine, so cast to silence
them.
Basically, EntityList::RemoveAllEncounters is called before ReloadQuests
resulting in stale pointers in the lua_encounters map.
We just have to remove the entry from the map.
* Add a std::string overload for Database::SetMQDetectionFlag
* Replace calls to MakeAnyLenString in client_packet.cpp
At least the SetMQDetectionFlag ones
* Replace MakeAnyLenString calls in client_process
At least SetMQDectectionFlag ones
* Replace MakeAnyLenString in embparser
fmtlib actually is gross here, oh well.
* Replace MakeAnyLenString in merc
* Replace MakeAnyLenString in inventory
Also if'd out an unfinished implementation of Client::GetItemLinkHash
* Replace AppendAnyLenString in zonelist
* Replace AppendAnyLenString in zonelist
* Replace MakeAnyLenString in clientlist
* Nuke MakeAnyLenString/AppendAnyLenString
* Fix formatting string in zonelist
* Convert common/eq_limits.cpp to use make_unique
* Convert common/net/console_server.cpp to use make_unique
* Convert common/net/servertalk_client_connection.cpp to use make_unique
* Convert common/net/servertalk_legacy_client_connection.cpp to use make_unique
* Convert common/net/servertalk_server.cpp to use make_unique
* Convert common/net/websocket_server.cpp to use make_unique
* Convert common/net/websocket_server_connection.cpp to use make_unique
* Convert common/shareddb.cpp to use make_unique
* Convert eqlaunch/worldserver.cpp to use make_unique
* Convert loginserver/server_manager.cpp to use make_unique
* Convert loginserver/world_server.cpp to use make_unique
* Convert queryserv/worldserver.cpp to use make_unique
* Convert ucs/worldserver.cpp to use make_unique
* Convert world/clientlist.cpp to use make_unique
* Convert world/expedition.cpp to use make_unique
* Convert world/launcher_link.cpp to use make_unique
* Convert world/login_server.cpp to use make_unique
* Convert world/main.cpp to use make_unique
* Convert world/ucs.cpp to use make_unique
* Convert world/web_interface.cpp to use make_unique
* Convert world/zonelist.cpp to use make_unique
* Convert world/zoneserver.cpp to use make_unique
* Convert zone/client.cpp to use make_unique
* Convert zone/corpse.cpp to use make_unique
* Convert zone/dynamiczone.cpp to use make_unique
* Convert zone/expedition.cpp to use make_unique
* Convert zone/main.cpp to use make_unique
* Convert zone/mob_ai.cpp to use make_unique
* Convert zone/mob_movement_manager.cpp to use make_unique
* Convert zone/pathfinder_nav_mesh.cpp to use make_unique
* Convert zone/worldserver.cpp to use make_unique
It should be fine to init further down after the early returns.
This wasn't really a leak that affected performance, but mainly moving
to shutup valgrind
These cases probably are exceedingly rare, but they still need to be
accounted for. (As in, I don't think anyone has run into these cases too
often to cause problems)
* Add a separate FindLuaJit.cmake
* Remove LuaJit from our modified FindLua51.cmake
* Make use of the new FindLuaJit
The reason for splitting them up like this is so we can have a
preference for LuaJIT that's not determined by the search order in
FindLua51.cmake as well as giving the server operators the choice to
prefer normal Lua with the EQEMU_PREFER_LUA cmake option
* Update NewZone_Structs
* Update packet translators for NewZone_Struct
* Add OP_UnderWorld OPcodes
These aren't implemented yet, but I thought it would be good to document
them. This sends up just entity ID and location when you fall
underworld. This could possibly be used to check for someone screwing
with zone data locally to warp or something I guess.
* Add database fields
This maybe in older clients as well, but I couldn't verify it and those
clients never did anything with this field so it doesn't matter.
MQ2 calls this SubClass, but we call the field it's a "sub" of Type so I
figured we'd call it SubType.
We still need to rename the DB field and handle it server side etc
This still doesn't add support for /autosplit in a raid, how should that
work?
This changes the Raid::SplitMoney to take a group ID and fails when
provided with RAID_GROUPLESS. This does change behavior, but I'm not
sure if it was ever used so ...
This is a field in the packet, live only uses this for Lay on Hands
Currently I didn't add this to the packet since it has 0 effect on the
client.
We could move this field to aa_ranks which would give more flexibility
for custom servers, but no one said they wanted it there.
We do this in GlobalLootEntry::PassesRules since we want to check if the
hot zone status changes during run time
Value can be null, if null it's not checked. If the value is 0 the zone
must not be a hot zone (I guess one might want that) and if it's not 0,
the zone must be a hot zone