Add 60s to lockout times sent to clients. Lockout timers
are rounded down to the nearest minute when displayed
This replaces the lockout leeway rule with better behavior
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
This is a breaking api change
eq.get_expedition_by_instance_id(instance_id) is replaced with
eq.get_expedition_by_zone_instance(zone_id, instance_id)
This replaces the FindCachedExpeditionByInstanceID method of
obtaining expeditions via instance id with a new method that
requires the dz zone id as well
This more accurately matches live for the new behavior introduced
in the September 16, 2020 patch. All members of a raid/group are
still checked for conflicts and the truncation is only allowed if
there are none.
It might make sense to add a rule for this since ignoring members
that would exceed the expedition max from the start makes it more
convenient to create expeditions. Members that wouldn't be added
anyway don't really need their conflicts checked.
Add client GetDynamicZones method to provide a single method to get all
associated client dynamic zones
Refactor compass update and MovePCDynamicZone to use this method
instead of searching for client dzs separately
Add optional disable message arg to MovePCDynamicZone
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.
Add Group and Raid method DoesAnyMemberHaveExpeditionLockout
This is required by some expeditions that perform a manual check for
custom dialogue (Ikkinz group expeditions)
This implements the new behavior from live's September 16, 2020
(test server's September 8, 2020) patch
Expeditions can be created even when the client's group or raid
exceeds the expedition's max player requirement. Members are added
until the max player count is reached and the rest are ignored.
Raid members are added ordered by their raid group number with
ungrouped members having the lowest priority
Rename expedition request method ValidateMembers to CanMembersJoin
Change some expedition messages to System color (live changes)
Increases default from 15 minutes to 25 minutes
This compensates for current default graveyard timer code. Otherwise
instances may shutdown before graveyards can process any corpses.
A better fix needs implemented later to deal with corpses inside
expired dynamic zone/instances. Zones without graveyards should move
corpses to the non-instance version and zones with graveyards should
somehow still be processed (maybe offloaded to world?)
This was loading the dz from database to get safe return data every time
a client's dz removal timer triggered
Add the Zone::GetDynamicZone() method so zones that are dz instances can
find the data from the cache of any dz systems
On live, new expedition leaders are only notified if made leader from
the /dzmakeleader command (or from ui). This rule makes it so the new
leader is always messaged on a leader change for cases where previous
leader goes offline or quits
This prevents toggling to offline state before setting to and from
linkdead status. Without this change, a new expedition leader will be
chosen as soon as the current leader goes linkdead. On live an
expedition leader retains leadership while linkdead
Only choose an online member as new leader on leader changes
Keep leader online status updated in zone expedition caches
Currently this will also trigger a leader change if the leader goes
linkdead. On live the character retains leadership while linkdead
and a new one is only chosen once kicked offline
Set expedition's instance id NULL instead of deleting it from the
database when instances are deleted. Only expedition functions
should delete expeditions
This fixes a regression caused by removing foreign key constraints
The expedition_details row was being deleted and not the corresponding
expedition_members and expedition_lockouts rows. Any characters inside
the members table could no longer join expeditions
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
Some live expeditions update a lockout's duration during progression
The current AddLockout method replaces lockout timers. This updates the
expiration of an existing lockout by modifying the original duration
Only members are updated and not the internal expedition timer by
default. This is so new members receive the original duration like live
Add SetLootEventByNPCTypeID and SetLootEventBySpawnID quest apis
These associate events with npcs or entities inside the dz to prevent
them from being looted by characters that didn't receive the event
lockout from the current expedition.
This fixes an exploit that allowed a player that already had a lockout
from another expedition being added to loot after the event is complete