* 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.
This creates an abstract class in common so zone and world can share
most of the implementation. World now has access to the same dz data and
api as zone.
Rename CharacterChange to AddRemoveCharacter for clarity
Rename GetRemainingDuration to GetDurationRemaining for consistency
Move dynamic zone queries to custom repository methods
Move early empty shutdown and process rate rules to DynamicZone scope
This decouples the expired status check from expeditions into an
internal dz method that can be called by its owning system
Use internal dz messages to process duration and location changes
Add world DynamicZone class (later this will inherit from a base)
Add FindDynamicZoneByID to get dz from zone and world system caches
This fixes unnecessary leader processing on mass dzquits
Also marks leader dirty for empty expeditions in case something goes
wrong (shouldn't be possible after 62e480fe)
* 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
Added public/private class for oldleadername so we can save the previous leader name when the entity is destroyed then allow us to transfer leadership.
Adjusted DelmemberOOZ and in zone functions to include removal of the old leader when disbanding.
This is an experimental change which allows members to log in at the
safe return if they were offline when the expedition was deleted.
Prior to this they would log in at bind instead
Partially reverts commit 32c69d235d7fc8b816fa598b499be47d451ddba5
Removed expedition members are no longer hard deleted from db
This should eliminate race conditions caused by zones trying to set
a leader when members in different zones quit at the same time
Zone still detects when leader goes offline to trigger a change
since it's easier than having world process expedition member status
updates and perform expedition lookups
This exposes dynamic zone ids for any future changes and will make it
easier to preserve historic dz and expedition data. This also cleans up
some dynamic zone creation for expedition requests
When purging instances the expedition table is no longer updated
since dynamic zone ids are not re-used like instance ids are
Update #dz list commands to show dz id
Add GetDynamicZoneID and get_expedition_by_dz_id quest apis
All expedition members are notified not just those in dz
This will only work if the dz is running. It might make more sense to
move this to client or world processing so members are notified even if
the zone instance isn't running
Also supports reducing lockout duration
Add Expedition::AddLockoutDuration
Add Client::AddExpeditionLockoutDuration
Some expeditions require adding to existing lockout durations
during progression. These add the specified seconds to individual
member lockout timers instead of setting a static duration based on
internal expedition lockout like UpdateLockoutDuration.
Remove logging unsanitized input
Make unsigned comparison not compare < 0
Cleanup some FormatName and string usage. Some of these strings could
probably be moved instead
Remove unnecessary expedition lookup in a world message handler
Add static expedition methods to add or remove character lockouts
Add CreateLockout static helper to ExpeditionLockoutTimer
Refactor existing character lockout removal to allow removal of lockouts
for offline characters (was only used by #dz lockouts remove command)
Fix #dz list member count
Remove extra cross zone message server opcode and struct. Existing
function already exists for normal messages
Group CZClientMessageString struct with other CZ structs
This optimizes character status requests by only sending a single
bulk request to world for characters in all expeditions instead of
sending a separate request for each expedition on zone startup
Since world now tracks empty expeditions it can determine when to
shutdown dynamic zone instances when the rule is enabled rather than
letting zones do it.
Zones are no longer able to delete expeditions. World now tracks empty
expeditions in cache and only deletes them when it detects an
expedition's dynamic zone instance has no more clients inside.
This fixes an exploit where lockouts couldn't be applied to expeditions
after all members were removed because zones were deleting the expedition
immediately. Clients still inside the dz were able to complete events
before being kicked from the instance while not having an expedition.
Expeditions are no longer purged from database in the world purge
instance timer to avoid a possible race with this new system
This implements a small cache in world to track expedition states.
This fixes expired expeditions being left in zone caches unless the
expedition's dz instance was running to detect it (or unless an
expedition was deleted via a client using /kickplayers). This was also
leaving clients in a ghost expedition that no longer actually existed
Not all expeditions with a replay timer lockout add it to newly
added members automatically
This adds the Expedition::SetReplayLockoutOnMemberJoin(bool) method
to the quest api so it can be disabled