mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-03 13:36:36 +00:00
[Dynamic Zones] Implement dz templates (#2345)
This allows shared tasks to create dz instances automatically through the `dz_template_id` field instead of using quest scripts. Quest apis were also added to create expeditions from template ids.
This commit is contained in:
@@ -164,3 +164,13 @@ void DynamicZoneManager::Process()
|
||||
fmt::format("id IN ({})", fmt::join(dynamic_zone_ids, ",")));
|
||||
}
|
||||
}
|
||||
|
||||
void DynamicZoneManager::LoadTemplates()
|
||||
{
|
||||
m_dz_templates.clear();
|
||||
auto dz_templates = DynamicZoneTemplatesRepository::All(content_db);
|
||||
for (const auto& dz_template : dz_templates)
|
||||
{
|
||||
m_dz_templates[dz_template.id] = dz_template;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define WORLD_DYNAMIC_ZONE_MANAGER_H
|
||||
|
||||
#include "../common/timer.h"
|
||||
#include "../common/repositories/dynamic_zone_templates_repository.h"
|
||||
#include <memory>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
@@ -20,13 +21,16 @@ public:
|
||||
void CacheAllFromDatabase();
|
||||
void CacheNewDynamicZone(ServerPacket* pack);
|
||||
DynamicZone* CreateNew(DynamicZone& dz_request, const std::vector<DynamicZoneMember>& members);
|
||||
void LoadTemplates();
|
||||
void Process();
|
||||
void PurgeExpiredDynamicZones();
|
||||
const auto& GetTemplates() const { return m_dz_templates; }
|
||||
|
||||
std::unordered_map<uint32_t, std::unique_ptr<DynamicZone>> dynamic_zone_cache;
|
||||
|
||||
private:
|
||||
Timer m_process_throttle_timer{};
|
||||
std::unordered_map<uint32_t, DynamicZoneTemplatesRepository::DynamicZoneTemplates> m_dz_templates;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -177,6 +177,8 @@ void SharedTaskManager::AttemptSharedTaskCreation(
|
||||
// check if task should immediately lock
|
||||
HandleCompletedActivities(&inserted);
|
||||
|
||||
LoadDynamicZoneTemplate(&inserted);
|
||||
|
||||
LogTasks(
|
||||
"[AttemptSharedTaskCreation] shared_task_id [{}] created successfully | task_id [{}] member_count [{}] activity_count [{}] current tasks in state [{}]",
|
||||
new_shared_task.GetDbSharedTask().id,
|
||||
@@ -1145,6 +1147,27 @@ void SharedTaskManager::CreateDynamicZone(SharedTask *shared_task, DynamicZone &
|
||||
}
|
||||
}
|
||||
|
||||
void SharedTaskManager::LoadDynamicZoneTemplate(SharedTask* s)
|
||||
{
|
||||
const auto& task = s->GetTaskData();
|
||||
if (task.dz_template_id != 0)
|
||||
{
|
||||
auto it = dynamic_zone_manager.GetTemplates().find(task.dz_template_id);
|
||||
if (it != dynamic_zone_manager.GetTemplates().end())
|
||||
{
|
||||
DynamicZone dz(DynamicZoneType::Mission);
|
||||
dz.LoadTemplate(it->second);
|
||||
dz.SetMinPlayers(task.min_players);
|
||||
dz.SetMaxPlayers(task.max_players);
|
||||
if (task.duration > dz.GetDuration())
|
||||
{
|
||||
dz.SetDuration(task.duration);
|
||||
}
|
||||
CreateDynamicZone(s, dz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SharedTaskManager::SendLeaderMessage(SharedTask *shared_task, int chat_type, const std::string &message)
|
||||
{
|
||||
if (!shared_task) {
|
||||
|
||||
@@ -123,6 +123,7 @@ protected:
|
||||
void ChooseNewLeader(SharedTask *s);
|
||||
bool HandleCompletedActivities(SharedTask* s);
|
||||
void HandleCompletedTask(SharedTask* s);
|
||||
void LoadDynamicZoneTemplate(SharedTask* s);
|
||||
void SendSharedTaskMemberListToAllMembers(SharedTask *s);
|
||||
void SendSharedTaskMemberAddedToAllMembers(SharedTask *s, const std::string &player_name);
|
||||
void SendSharedTaskMemberRemovedToAllMembers(SharedTask *s, const std::string &player_name);
|
||||
|
||||
@@ -408,6 +408,7 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv)
|
||||
database.PurgeExpiredInstances();
|
||||
|
||||
LogInfo("Loading dynamic zones");
|
||||
dynamic_zone_manager.LoadTemplates();
|
||||
dynamic_zone_manager.CacheAllFromDatabase();
|
||||
|
||||
LogInfo("Loading char create info");
|
||||
|
||||
@@ -37,6 +37,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "queryserv.h"
|
||||
#include "world_store.h"
|
||||
#include "dynamic_zone.h"
|
||||
#include "dynamic_zone_manager.h"
|
||||
#include "expedition_message.h"
|
||||
#include "shared_task_world_messaging.h"
|
||||
#include "../common/shared_tasks.h"
|
||||
@@ -1352,6 +1353,11 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
|
||||
zoneserver_list.SendPacket(pack);
|
||||
break;
|
||||
}
|
||||
case ServerOP_ReloadDzTemplates: {
|
||||
dynamic_zone_manager.LoadTemplates();
|
||||
zoneserver_list.SendPacket(pack);
|
||||
break;
|
||||
}
|
||||
case ServerOP_ChangeSharedMem: {
|
||||
auto hotfix_name = std::string((char*) pack->pBuffer);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user