mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 02:11:30 +00:00
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.
114 lines
3.0 KiB
C++
114 lines
3.0 KiB
C++
#include "expedition_base.h"
|
|
#include "repositories/expeditions_repository.h"
|
|
#include "rulesys.h"
|
|
|
|
ExpeditionBase::ExpeditionBase(uint32_t id, const std::string& uuid,
|
|
const std::string& expedition_name, const DynamicZoneMember& leader
|
|
) :
|
|
m_id(id),
|
|
m_uuid(uuid),
|
|
m_expedition_name(expedition_name),
|
|
m_leader(leader)
|
|
{
|
|
}
|
|
|
|
void ExpeditionBase::LoadRepositoryResult(ExpeditionsRepository::ExpeditionWithLeader&& entry)
|
|
{
|
|
m_id = entry.id;
|
|
m_uuid = std::move(entry.uuid);
|
|
m_expedition_name = std::move(entry.expedition_name);
|
|
m_add_replay_on_join = entry.add_replay_on_join;
|
|
m_is_locked = entry.is_locked;
|
|
m_leader.id = entry.leader_id;
|
|
m_leader.name = std::move(entry.leader_name);
|
|
}
|
|
|
|
void ExpeditionBase::AddMemberFromRepositoryResult(
|
|
ExpeditionMembersRepository::MemberWithName&& entry)
|
|
{
|
|
auto status = DynamicZoneMemberStatus::Unknown;
|
|
AddInternalMember({ entry.character_id, std::move(entry.character_name), status });
|
|
}
|
|
|
|
void ExpeditionBase::AddInternalMember(const DynamicZoneMember& member)
|
|
{
|
|
if (!HasMember(member.id))
|
|
{
|
|
m_members.emplace_back(member);
|
|
}
|
|
}
|
|
|
|
void ExpeditionBase::RemoveInternalMember(uint32_t character_id)
|
|
{
|
|
m_members.erase(std::remove_if(m_members.begin(), m_members.end(),
|
|
[&](const DynamicZoneMember& member) { return member.id == character_id; }
|
|
), m_members.end());
|
|
}
|
|
|
|
|
|
bool ExpeditionBase::HasMember(uint32_t character_id)
|
|
{
|
|
return std::any_of(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) {
|
|
return member.id == character_id;
|
|
});
|
|
}
|
|
|
|
bool ExpeditionBase::HasMember(const std::string& character_name)
|
|
{
|
|
return std::any_of(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) {
|
|
return (strcasecmp(member.name.c_str(), character_name.c_str()) == 0);
|
|
});
|
|
}
|
|
|
|
DynamicZoneMember ExpeditionBase::GetMemberData(uint32_t character_id)
|
|
{
|
|
auto it = std::find_if(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) {
|
|
return member.id == character_id;
|
|
});
|
|
|
|
DynamicZoneMember member_data;
|
|
if (it != m_members.end())
|
|
{
|
|
member_data = *it;
|
|
}
|
|
return member_data;
|
|
}
|
|
|
|
DynamicZoneMember ExpeditionBase::GetMemberData(const std::string& character_name)
|
|
{
|
|
auto it = std::find_if(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) {
|
|
return (strcasecmp(member.name.c_str(), character_name.c_str()) == 0);
|
|
});
|
|
|
|
DynamicZoneMember member_data;
|
|
if (it != m_members.end())
|
|
{
|
|
member_data = *it;
|
|
}
|
|
return member_data;
|
|
}
|
|
|
|
bool ExpeditionBase::SetInternalMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status)
|
|
{
|
|
if (status == DynamicZoneMemberStatus::InDynamicZone && !RuleB(Expedition, EnableInDynamicZoneStatus))
|
|
{
|
|
status = DynamicZoneMemberStatus::Online;
|
|
}
|
|
|
|
if (character_id == m_leader.id)
|
|
{
|
|
m_leader.status = status;
|
|
}
|
|
|
|
auto it = std::find_if(m_members.begin(), m_members.end(),
|
|
[&](const DynamicZoneMember& member) { return member.id == character_id; });
|
|
|
|
if (it != m_members.end() && it->status != status)
|
|
{
|
|
it->status = status;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|