mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-12 08:02:25 +00:00
Add api to update lockout duration
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
This commit is contained in:
parent
f97cc7cdec
commit
e8d250827d
@ -2055,6 +2055,7 @@ struct ServerExpeditionLockout_Struct {
|
|||||||
uint32 sender_zone_id;
|
uint32 sender_zone_id;
|
||||||
uint16 sender_instance_id;
|
uint16 sender_instance_id;
|
||||||
uint8 remove;
|
uint8 remove;
|
||||||
|
uint8 members_only;
|
||||||
char event_name[256];
|
char event_name[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -448,15 +448,34 @@ void Expedition::AddReplayLockout(uint32_t seconds)
|
|||||||
|
|
||||||
void Expedition::AddLockout(const std::string& event_name, uint32_t seconds)
|
void Expedition::AddLockout(const std::string& event_name, uint32_t seconds)
|
||||||
{
|
{
|
||||||
// any current lockouts for the event are updated with new expiration time
|
|
||||||
ExpeditionLockoutTimer lockout{m_uuid, m_expedition_name, event_name, 0, seconds};
|
ExpeditionLockoutTimer lockout{m_uuid, m_expedition_name, event_name, 0, seconds};
|
||||||
lockout.Reset(); // sets expire time
|
lockout.Reset(); // sets expire time
|
||||||
|
AddLockout(lockout);
|
||||||
|
}
|
||||||
|
|
||||||
ExpeditionDatabase::InsertLockout(m_id, lockout);
|
void Expedition::AddLockout(const ExpeditionLockoutTimer& lockout, bool members_only)
|
||||||
|
{
|
||||||
|
if (!members_only)
|
||||||
|
{
|
||||||
|
ExpeditionDatabase::InsertLockout(m_id, lockout);
|
||||||
|
}
|
||||||
ExpeditionDatabase::InsertMembersLockout(m_members, lockout);
|
ExpeditionDatabase::InsertMembersLockout(m_members, lockout);
|
||||||
|
|
||||||
ProcessLockoutUpdate(lockout, false);
|
ProcessLockoutUpdate(lockout, false, members_only);
|
||||||
SendWorldLockoutUpdate(lockout, false);
|
SendWorldLockoutUpdate(lockout, false, members_only);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Expedition::UpdateLockoutDuration(
|
||||||
|
const std::string& event_name, uint32_t seconds, bool members_only)
|
||||||
|
{
|
||||||
|
// some live expeditions update existing lockout timers during progression
|
||||||
|
auto it = m_lockouts.find(event_name);
|
||||||
|
if (it != m_lockouts.end())
|
||||||
|
{
|
||||||
|
uint64_t expire_time = it->second.GetStartTime() + seconds;
|
||||||
|
ExpeditionLockoutTimer lockout{m_uuid, m_expedition_name, event_name, expire_time, seconds};
|
||||||
|
AddLockout(lockout, members_only);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Expedition::RemoveLockout(const std::string& event_name)
|
void Expedition::RemoveLockout(const std::string& event_name)
|
||||||
@ -1223,15 +1242,19 @@ void Expedition::ProcessMemberRemoved(std::string removed_char_name, uint32_t re
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Expedition::ProcessLockoutUpdate(const ExpeditionLockoutTimer& lockout, bool remove)
|
void Expedition::ProcessLockoutUpdate(
|
||||||
|
const ExpeditionLockoutTimer& lockout, bool remove, bool members_only)
|
||||||
{
|
{
|
||||||
if (!remove)
|
if (!members_only)
|
||||||
{
|
{
|
||||||
m_lockouts[lockout.GetEventName()] = lockout;
|
if (!remove)
|
||||||
}
|
{
|
||||||
else
|
m_lockouts[lockout.GetEventName()] = lockout;
|
||||||
{
|
}
|
||||||
m_lockouts.erase(lockout.GetEventName());
|
else
|
||||||
|
{
|
||||||
|
m_lockouts.erase(lockout.GetEventName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& member : m_members)
|
for (const auto& member : m_members)
|
||||||
@ -1453,7 +1476,7 @@ void Expedition::SendWorldLeaderChanged()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Expedition::SendWorldLockoutUpdate(
|
void Expedition::SendWorldLockoutUpdate(
|
||||||
const ExpeditionLockoutTimer& lockout, bool remove)
|
const ExpeditionLockoutTimer& lockout, bool remove, bool members_only)
|
||||||
{
|
{
|
||||||
uint32_t pack_size = sizeof(ServerExpeditionLockout_Struct);
|
uint32_t pack_size = sizeof(ServerExpeditionLockout_Struct);
|
||||||
auto pack = std::unique_ptr<ServerPacket>(new ServerPacket(ServerOP_ExpeditionLockout, pack_size));
|
auto pack = std::unique_ptr<ServerPacket>(new ServerPacket(ServerOP_ExpeditionLockout, pack_size));
|
||||||
@ -1464,6 +1487,7 @@ void Expedition::SendWorldLockoutUpdate(
|
|||||||
buf->sender_zone_id = zone ? zone->GetZoneID() : 0;
|
buf->sender_zone_id = zone ? zone->GetZoneID() : 0;
|
||||||
buf->sender_instance_id = zone ? zone->GetInstanceID() : 0;
|
buf->sender_instance_id = zone ? zone->GetInstanceID() : 0;
|
||||||
buf->remove = remove;
|
buf->remove = remove;
|
||||||
|
buf->members_only = members_only;
|
||||||
strn0cpy(buf->event_name, lockout.GetEventName().c_str(), sizeof(buf->event_name));
|
strn0cpy(buf->event_name, lockout.GetEventName().c_str(), sizeof(buf->event_name));
|
||||||
worldserver.SendPacket(pack.get());
|
worldserver.SendPacket(pack.get());
|
||||||
}
|
}
|
||||||
@ -1655,7 +1679,7 @@ void Expedition::HandleWorldMessage(ServerPacket* pack)
|
|||||||
ExpeditionLockoutTimer lockout{
|
ExpeditionLockoutTimer lockout{
|
||||||
expedition->GetUUID(), expedition->GetName(), buf->event_name, buf->expire_time, buf->duration
|
expedition->GetUUID(), expedition->GetName(), buf->event_name, buf->expire_time, buf->duration
|
||||||
};
|
};
|
||||||
expedition->ProcessLockoutUpdate(lockout, buf->remove);
|
expedition->ProcessLockoutUpdate(lockout, buf->remove, buf->members_only);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -109,6 +109,7 @@ public:
|
|||||||
bool HasReplayLockout();
|
bool HasReplayLockout();
|
||||||
void RemoveLockout(const std::string& event_name);
|
void RemoveLockout(const std::string& event_name);
|
||||||
void SetReplayLockoutOnMemberJoin(bool add_on_join, bool update_db = false);
|
void SetReplayLockoutOnMemberJoin(bool add_on_join, bool update_db = false);
|
||||||
|
void UpdateLockoutDuration(const std::string& event_name, uint32_t seconds, bool members_only = true);
|
||||||
|
|
||||||
bool CanClientLootCorpse(Client* client, uint32_t npc_type_id, uint32_t spawn_id);
|
bool CanClientLootCorpse(Client* client, uint32_t npc_type_id, uint32_t spawn_id);
|
||||||
std::string GetLootEventByNPCTypeID(uint32_t npc_id);
|
std::string GetLootEventByNPCTypeID(uint32_t npc_id);
|
||||||
@ -143,12 +144,13 @@ private:
|
|||||||
static void CacheExpeditions(MySQLRequestResult& results);
|
static void CacheExpeditions(MySQLRequestResult& results);
|
||||||
static void SendWorldGetOnlineMembers(const std::vector<std::pair<uint32_t, uint32_t>>& expedition_character_ids);
|
static void SendWorldGetOnlineMembers(const std::vector<std::pair<uint32_t, uint32_t>>& expedition_character_ids);
|
||||||
|
|
||||||
|
void AddLockout(const ExpeditionLockoutTimer& lockout, bool members_only = false);
|
||||||
void AddInternalMember(const std::string& char_name, uint32_t char_id, ExpeditionMemberStatus status);
|
void AddInternalMember(const std::string& char_name, uint32_t char_id, ExpeditionMemberStatus status);
|
||||||
bool ChooseNewLeader();
|
bool ChooseNewLeader();
|
||||||
bool ConfirmLeaderCommand(Client* requester);
|
bool ConfirmLeaderCommand(Client* requester);
|
||||||
bool ProcessAddConflicts(Client* leader_client, Client* add_client, bool swapping);
|
bool ProcessAddConflicts(Client* leader_client, Client* add_client, bool swapping);
|
||||||
void ProcessLeaderChanged(uint32_t new_leader_id, const std::string& new_leader_name);
|
void ProcessLeaderChanged(uint32_t new_leader_id, const std::string& new_leader_name);
|
||||||
void ProcessLockoutUpdate(const ExpeditionLockoutTimer& lockout, bool remove);
|
void ProcessLockoutUpdate(const ExpeditionLockoutTimer& lockout, bool remove, bool members_only = false);
|
||||||
void ProcessMakeLeader(Client* old_leader, Client* new_leader, const std::string& new_leader_name, bool is_online);
|
void ProcessMakeLeader(Client* old_leader, Client* new_leader, const std::string& new_leader_name, bool is_online);
|
||||||
void ProcessMemberAdded(std::string added_char_name, uint32_t added_char_id);
|
void ProcessMemberAdded(std::string added_char_name, uint32_t added_char_id);
|
||||||
void ProcessMemberRemoved(std::string removed_char_name, uint32_t removed_char_id);
|
void ProcessMemberRemoved(std::string removed_char_name, uint32_t removed_char_id);
|
||||||
@ -161,7 +163,7 @@ private:
|
|||||||
void SendWorldExpeditionUpdate(uint16_t server_opcode);
|
void SendWorldExpeditionUpdate(uint16_t server_opcode);
|
||||||
void SendWorldAddPlayerInvite(const std::string& inviter_name, const std::string& swap_remove_name, const std::string& add_name, bool pending = false);
|
void SendWorldAddPlayerInvite(const std::string& inviter_name, const std::string& swap_remove_name, const std::string& add_name, bool pending = false);
|
||||||
void SendWorldLeaderChanged();
|
void SendWorldLeaderChanged();
|
||||||
void SendWorldLockoutUpdate(const ExpeditionLockoutTimer& lockout, bool remove);
|
void SendWorldLockoutUpdate(const ExpeditionLockoutTimer& lockout, bool remove, bool members_only = false);
|
||||||
void SendWorldMakeLeaderRequest(const std::string& requester_name, const std::string& new_leader_name);
|
void SendWorldMakeLeaderRequest(const std::string& requester_name, const std::string& new_leader_name);
|
||||||
void SendWorldMemberChanged(const std::string& char_name, uint32_t char_id, bool remove);
|
void SendWorldMemberChanged(const std::string& char_name, uint32_t char_id, bool remove);
|
||||||
void SendWorldMemberStatus(uint32_t character_id, ExpeditionMemberStatus status);
|
void SendWorldMemberStatus(uint32_t character_id, ExpeditionMemberStatus status);
|
||||||
|
|||||||
@ -43,6 +43,7 @@ public:
|
|||||||
|
|
||||||
uint32_t GetDuration() const { return static_cast<uint32_t>(m_duration.count()); }
|
uint32_t GetDuration() const { return static_cast<uint32_t>(m_duration.count()); }
|
||||||
uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); }
|
uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); }
|
||||||
|
uint64_t GetStartTime() const { return std::chrono::system_clock::to_time_t(m_expire_time - m_duration); }
|
||||||
uint32_t GetSecondsRemaining() const;
|
uint32_t GetSecondsRemaining() const;
|
||||||
DaysHoursMinutes GetDaysHoursMinutesRemaining() const;
|
DaysHoursMinutes GetDaysHoursMinutesRemaining() const;
|
||||||
const std::string& GetExpeditionName() const { return m_expedition_name; }
|
const std::string& GetExpeditionName() const { return m_expedition_name; }
|
||||||
|
|||||||
@ -180,6 +180,16 @@ void Lua_Expedition::SetZoneInLocation(float x, float y, float z, float heading)
|
|||||||
self->SetDzZoneInLocation(x, y, z, heading, true);
|
self->SetDzZoneInLocation(x, y, z, heading, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Lua_Expedition::UpdateLockoutDuration(std::string event_name, uint32_t duration) {
|
||||||
|
Lua_Safe_Call_Void();
|
||||||
|
self->UpdateLockoutDuration(event_name, duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lua_Expedition::UpdateLockoutDuration(std::string event_name, uint32_t duration, bool members_only) {
|
||||||
|
Lua_Safe_Call_Void();
|
||||||
|
self->UpdateLockoutDuration(event_name, duration, members_only);
|
||||||
|
}
|
||||||
|
|
||||||
luabind::scope lua_register_expedition() {
|
luabind::scope lua_register_expedition() {
|
||||||
return luabind::class_<Lua_Expedition>("Expedition")
|
return luabind::class_<Lua_Expedition>("Expedition")
|
||||||
.def(luabind::constructor<>())
|
.def(luabind::constructor<>())
|
||||||
@ -211,7 +221,9 @@ luabind::scope lua_register_expedition() {
|
|||||||
.def("SetReplayLockoutOnMemberJoin", (void(Lua_Expedition::*)(bool))&Lua_Expedition::SetReplayLockoutOnMemberJoin)
|
.def("SetReplayLockoutOnMemberJoin", (void(Lua_Expedition::*)(bool))&Lua_Expedition::SetReplayLockoutOnMemberJoin)
|
||||||
.def("SetSafeReturn", (void(Lua_Expedition::*)(uint32_t, float, float, float, float))&Lua_Expedition::SetSafeReturn)
|
.def("SetSafeReturn", (void(Lua_Expedition::*)(uint32_t, float, float, float, float))&Lua_Expedition::SetSafeReturn)
|
||||||
.def("SetSafeReturn", (void(Lua_Expedition::*)(std::string, float, float, float, float))&Lua_Expedition::SetSafeReturn)
|
.def("SetSafeReturn", (void(Lua_Expedition::*)(std::string, float, float, float, float))&Lua_Expedition::SetSafeReturn)
|
||||||
.def("SetZoneInLocation", (void(Lua_Expedition::*)(float, float, float, float))&Lua_Expedition::SetZoneInLocation);
|
.def("SetZoneInLocation", (void(Lua_Expedition::*)(float, float, float, float))&Lua_Expedition::SetZoneInLocation)
|
||||||
|
.def("UpdateLockoutDuration", (void(Lua_Expedition::*)(std::string, uint32_t))&Lua_Expedition::UpdateLockoutDuration)
|
||||||
|
.def("UpdateLockoutDuration", (void(Lua_Expedition::*)(std::string, uint32_t, bool))&Lua_Expedition::UpdateLockoutDuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // LUA_EQEMU
|
#endif // LUA_EQEMU
|
||||||
|
|||||||
@ -79,6 +79,8 @@ public:
|
|||||||
void SetSafeReturn(uint32_t zone_id, float x, float y, float z, float heading);
|
void SetSafeReturn(uint32_t zone_id, float x, float y, float z, float heading);
|
||||||
void SetSafeReturn(std::string zone_name, float x, float y, float z, float heading);
|
void SetSafeReturn(std::string zone_name, float x, float y, float z, float heading);
|
||||||
void SetZoneInLocation(float x, float y, float z, float heading);
|
void SetZoneInLocation(float x, float y, float z, float heading);
|
||||||
|
void UpdateLockoutDuration(std::string event_name, uint32_t duration);
|
||||||
|
void UpdateLockoutDuration(std::string event_name, uint32_t duration, bool members_only);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // LUA_EQEMU
|
#endif // LUA_EQEMU
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user