diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index bf28c654b..0d3b564f6 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -1042,6 +1042,11 @@ void Perl__repopzone() quest_manager.repopzone(); } +void Perl__repopzone(bool is_forced) +{ + quest_manager.repopzone(is_forced); +} + void Perl__processmobswhilezoneempty(bool on) { quest_manager.processmobswhilezoneempty(on); @@ -6547,7 +6552,8 @@ void perl_register_quest() package.add("removeldonwin", &Perl__removeldonwin); package.add("removetitle", &Perl__removetitle); package.add("rename", &Perl__rename); - package.add("repopzone", &Perl__repopzone); + package.add("repopzone", (void(*)(void))&Perl__repopzone); + package.add("repopzone", (void(*)(bool))&Perl__repopzone); package.add("resettaskactivity", &Perl__resettaskactivity); package.add("respawn", &Perl__respawn); package.add("resume", &Perl__resume); diff --git a/zone/gm_commands/repop.cpp b/zone/gm_commands/repop.cpp index aa98b105d..8527d9260 100755 --- a/zone/gm_commands/repop.cpp +++ b/zone/gm_commands/repop.cpp @@ -2,23 +2,17 @@ void command_repop(Client *c, const Seperator *sep) { - int arguments = sep->argnum; - if (!arguments) { - entity_list.ClearAreas(); - c->Message(Chat::White, "Zone depopped, repopping now."); - zone->Repop(); - return; - } + const bool is_forced = sep->argnum > 0 ? !strcasecmp(sep->arg[1], "force") : false; - bool is_force = !strcasecmp(sep->arg[1], "force"); + c->Message( + Chat::White, + fmt::format( + "Zone depopped, {}repopping now.", + is_forced ? "forcefully " : "" + ).c_str() + ); - if (is_force) { - zone->ClearSpawnTimers(); - c->Message(Chat::White, "Zone depopped, forcefully repopping now."); - } else { - c->Message(Chat::White, "Zone depopped, repopping now."); - } - - zone->Repop(); + entity_list.ClearAreas(); + zone->Repop(is_forced); } diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 18ac9a683..efeefc9c0 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -403,6 +403,10 @@ void lua_repop_zone() { quest_manager.repopzone(); } +void lua_repop_zone(bool is_forced) { + quest_manager.repopzone(is_forced); +} + void lua_process_mobs_while_zone_empty(bool on) { quest_manager.processmobswhilezoneempty(on); } @@ -5634,7 +5638,8 @@ luabind::scope lua_register_general() { luabind::def("depop_all", (void(*)(void))&lua_depop_all), luabind::def("depop_all", (void(*)(int))&lua_depop_all), luabind::def("depop_zone", &lua_depop_zone), - luabind::def("repop_zone", &lua_repop_zone), + luabind::def("repop_zone", (void(*)(void))&lua_repop_zone), + luabind::def("repop_zone", (void(*)(bool))&lua_repop_zone), luabind::def("process_mobs_while_zone_empty", &lua_process_mobs_while_zone_empty), luabind::def("is_disc_tome", &lua_is_disc_tome), luabind::def("get_race_name", (std::string(*)(uint16))&lua_get_race_name), diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 0f7c92286..5875a4474 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -926,11 +926,11 @@ void QuestManager::depopzone(bool StartSpawnTimer) { } } -void QuestManager::repopzone() { - if(zone) { - zone->Repop(); - } - else { +void QuestManager::repopzone(bool is_forced) +{ + if (zone) { + zone->Repop(is_forced); + } else { LogQuests("QuestManager::repopzone called with nullptr zone. Probably syntax error in quest file"); } } diff --git a/zone/questmgr.h b/zone/questmgr.h index 11eec9d39..a19d98764 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -105,7 +105,7 @@ public: void depop_withtimer(int npc_type = 0); // depop NPC and start spawn timer void depopall(int npc_type = 0); void depopzone(bool StartSpawnTimer = true); - void repopzone(); + void repopzone(bool is_forced = false); void processmobswhilezoneempty(bool quest_override_on); void settarget(const char *type, int target_id); void follow(int entity_id, int distance); diff --git a/zone/zone.cpp b/zone/zone.cpp index 9e7d7c46e..e549264f7 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -1888,7 +1888,7 @@ void Zone::ClearNPCTypeCache(int id) { } } -void Zone::Repop() +void Zone::Repop(bool is_forced) { if (!Depop()) { return; @@ -1901,6 +1901,10 @@ void Zone::Repop() iterator.RemoveCurrent(); } + if (is_forced) { + ClearSpawnTimers(); + } + npc_scale_manager->LoadScaleData(); entity_list.ClearTrapPointers(); diff --git a/zone/zone.h b/zone/zone.h index 7531701b6..7d8b0d0b5 100755 --- a/zone/zone.h +++ b/zone/zone.h @@ -307,7 +307,7 @@ public: void ReloadWorld(uint8 global_repop); void RemoveAuth(const char *iCharName, const char *iLSKey); void RemoveAuth(uint32 lsid); - void Repop(); + void Repop(bool is_forced = false); void RequestUCSServerStatus(); void ResetAuth(); void SetDate(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute);