Compare commits

...

7 Commits

Author SHA1 Message Date
Akkadius f0278d9591 Update dbcore.cpp 2025-03-02 23:17:54 -06:00
Akkadius 8a1f4545a4 Update entity.cpp 2025-03-02 23:15:17 -06:00
Akkadius 8419e284d4 Fix 2025-03-02 23:10:43 -06:00
Akkadius 72646cab35 Revert "Reload crash fix"
This reverts commit 96e1e76306.
2025-03-02 23:09:33 -06:00
Akkadius 96e1e76306 Reload crash fix 2025-03-02 22:55:27 -06:00
Akkadius 7c242723f4 Potentially fix aura crash 2025-03-02 22:16:43 -06:00
Akkadius 2162c00edd Stuff 2025-03-02 22:09:06 -06:00
7 changed files with 30 additions and 12 deletions
+3 -1
View File
@@ -302,7 +302,9 @@ std::string DBcore::Escape(const std::string& s)
void DBcore::SetMutex(Mutex *mutex) void DBcore::SetMutex(Mutex *mutex)
{ {
safe_delete(m_mutex); if (m_mutex && m_mutex != mutex) {
safe_delete(m_mutex);
}
DBcore::m_mutex = mutex; DBcore::m_mutex = mutex;
} }
+2 -1
View File
@@ -894,7 +894,8 @@ void ZSList::SendServerReload(ServerReload::Type type, uchar *packet)
ServerReload::Type::Commands, ServerReload::Type::Commands,
ServerReload::Type::PerlExportSettings, ServerReload::Type::PerlExportSettings,
ServerReload::Type::DataBucketsCache, ServerReload::Type::DataBucketsCache,
ServerReload::Type::WorldRepop ServerReload::Type::WorldRepop,
ServerReload::Type::WorldWithRespawn
}; };
// Set requires_zone_booted flag before executing reload logic // Set requires_zone_booted flag before executing reload logic
+3
View File
@@ -708,6 +708,9 @@ Client::Client(EQStreamInterface *ieqs) : Mob(
} }
Client::~Client() { Client::~Client() {
entity_list.RemoveMobFromCloseLists(this);
m_close_mobs.clear();
if (ClientVersion() == EQ::versions::ClientVersion::RoF2 && RuleB (Parcel, EnableParcelMerchants)) { if (ClientVersion() == EQ::versions::ClientVersion::RoF2 && RuleB (Parcel, EnableParcelMerchants)) {
DoParcelCancel(); DoParcelCancel();
} }
+1 -1
View File
@@ -2933,7 +2933,7 @@ void EntityList::ScanCloseMobs(Mob *scanning_mob)
for (auto &e : mob_list) { for (auto &e : mob_list) {
auto mob = e.second; auto mob = e.second;
if (mob->GetID() <= 0) { if (mob && mob->GetID() <= 0) {
continue; continue;
} }
+8 -1
View File
@@ -375,6 +375,10 @@ void NPC::AddLootDrop(
if (item2->Slots & slots) { if (item2->Slots & slots) {
if (equipment[i]) { if (equipment[i]) {
compitem = database.GetItem(equipment[i]); compitem = database.GetItem(equipment[i]);
if (!compitem) {
continue;
}
if (item2->AC > compitem->AC || (item2->AC == compitem->AC && item2->HP > compitem->HP)) { if (item2->AC > compitem->AC || (item2->AC == compitem->AC && item2->HP > compitem->HP)) {
// item would be an upgrade // item would be an upgrade
// check if we're multi-slot, if yes then we have to keep // check if we're multi-slot, if yes then we have to keep
@@ -385,6 +389,9 @@ void NPC::AddLootDrop(
else { else {
// Unequip old item // Unequip old item
auto *old_item = GetItem(i); auto *old_item = GetItem(i);
if (!old_item) {
continue;
}
old_item->equip_slot = EQ::invslot::SLOT_INVALID; old_item->equip_slot = EQ::invslot::SLOT_INVALID;
@@ -677,7 +684,7 @@ LootItem *NPC::GetItem(int slot_id)
end = m_loot_items.end(); end = m_loot_items.end();
for (; cur != end; ++cur) { for (; cur != end; ++cur) {
LootItem *item = *cur; LootItem *item = *cur;
if (item->equip_slot == slot_id) { if (item && item->equip_slot == slot_id) {
return item; return item;
} }
} }
+3 -3
View File
@@ -531,6 +531,9 @@ Mob::Mob(
Mob::~Mob() Mob::~Mob()
{ {
entity_list.RemoveMobFromCloseLists(this);
m_close_mobs.clear();
quest_manager.stopalltimers(this); quest_manager.stopalltimers(this);
mMovementManager->RemoveMob(this); mMovementManager->RemoveMob(this);
@@ -570,11 +573,8 @@ Mob::~Mob()
entity_list.UnMarkNPC(GetID()); entity_list.UnMarkNPC(GetID());
UninitializeBuffSlots(); UninitializeBuffSlots();
entity_list.RemoveMobFromCloseLists(this);
entity_list.RemoveAuraFromMobs(this); entity_list.RemoveAuraFromMobs(this);
m_close_mobs.clear();
ClearDataBucketCache(); ClearDataBucketCache();
LeaveHealRotationTargetPool(); LeaveHealRotationTargetPool();
+9 -4
View File
@@ -4663,14 +4663,19 @@ void WorldServer::ProcessReload(const ServerReload::Request& request)
case ServerReload::Type::WorldRepop: case ServerReload::Type::WorldRepop:
entity_list.ClearAreas(); entity_list.ClearAreas();
parse->ReloadQuests(); parse->ReloadQuests();
zone->Repop(); if (zone && zone->IsLoaded()) {
zone->Repop();
}
break; break;
case ServerReload::Type::WorldWithRespawn: case ServerReload::Type::WorldWithRespawn:
entity_list.ClearAreas();
parse->ReloadQuests(); parse->ReloadQuests();
zone->Repop(); if (zone && zone->IsLoaded()) {
zone->ClearSpawnTimers(); entity_list.ClearAreas();
zone->Repop();
zone->ClearSpawnTimers();
}
break; break;
case ServerReload::Type::ZonePoints: case ServerReload::Type::ZonePoints: