From e91df41c8ea371c8def031d58fd0fa0cc44934af Mon Sep 17 00:00:00 2001 From: Simon Jarrett Date: Thu, 21 Jun 2018 23:32:21 +0100 Subject: [PATCH] more conversions to weak pointers --- Source/Ammunition.cpp | 4 +- Source/Client.cpp | 5 +- Source/ClientEvents.cpp | 1138 +++++++++++++++++--------------- Source/ClientEvents.h | 2 +- Source/Container.cpp | 467 +++++++++---- Source/Container.h | 8 +- Source/Corpse.cpp | 2 +- Source/HotSpot.cpp | 2 +- Source/House.cpp | 10 +- Source/Monster.cpp | 33 +- Source/ObjectMsgs.cpp | 30 +- Source/Player.cpp | 86 ++- Source/Player.h | 10 +- Source/Scroll.cpp | 3 +- Source/SpellProjectile.cpp | 4 +- Source/SpellcastingManager.cpp | 74 ++- Source/WeenieFactory.cpp | 2 +- Source/WeenieObject.cpp | 40 +- Source/WeenieObject.h | 8 +- Source/World.cpp | 18 +- Source/WorldLandBlock.cpp | 2 +- 21 files changed, 1201 insertions(+), 747 deletions(-) diff --git a/Source/Ammunition.cpp b/Source/Ammunition.cpp index b309742..8dacc36 100644 --- a/Source/Ammunition.cpp +++ b/Source/Ammunition.cpp @@ -73,7 +73,7 @@ void CAmmunitionWeenie::HandleNonTargetCollision() if (source->AsPlayer()) source->SendText("Your missile attack hit the environment.", LTT_DEFAULT); else - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); EmitSound(Sound_Collision, 1.0f); } @@ -83,7 +83,7 @@ void CAmmunitionWeenie::HandleNonTargetCollision() void CAmmunitionWeenie::HandleTargetCollision() { - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); } BOOL CAmmunitionWeenie::DoCollision(const class EnvCollisionProfile &prof) diff --git a/Source/Client.cpp b/Source/Client.cpp index bc9d28f..0dba02f 100644 --- a/Source/Client.cpp +++ b/Source/Client.cpp @@ -1041,9 +1041,10 @@ void CClient::GenerateStarterGear(std::shared_ptr weenieObject, A std::shared_ptr sack = NULL; for (auto pack : weenie->m_Packs) { - if (pack->AsContainer()) + std::shared_ptr pPack = pack.lock(); + if (pPack && pPack->AsContainer()) { - sack = pack->AsContainer(); + sack = pPack->AsContainer(); break; } } diff --git a/Source/ClientEvents.cpp b/Source/ClientEvents.cpp index 711b872..2099f0e 100644 --- a/Source/ClientEvents.cpp +++ b/Source/ClientEvents.cpp @@ -30,38 +30,40 @@ CClientEvents::CClientEvents(CClient *parent) { m_pClient = parent; - m_pPlayer = nullptr; + m_pPlayer = std::shared_ptr(); } CClientEvents::~CClientEvents() { - if (m_pPlayer) - { - m_pPlayer->BeginLogout(); - m_pPlayer->DetachClient(); + std::shared_ptr pPlayer = m_pPlayer.lock(); - m_pPlayer = nullptr; + if (pPlayer) + { + pPlayer->BeginLogout(); + pPlayer->DetachClient(); + + DetachPlayer(); } } void CClientEvents::DetachPlayer() { - m_pPlayer = nullptr; + m_pPlayer = std::shared_ptr(); } DWORD CClientEvents::GetPlayerID() { - + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) return 0; - return m_pPlayer->GetID(); + return pPlayer->GetID(); } std::shared_ptr CClientEvents::GetPlayer() { - return m_pPlayer; + return m_pPlayer.lock(); } void CClientEvents::ExitWorld() @@ -72,8 +74,9 @@ void CClientEvents::ExitWorld() void CClientEvents::Think() { - - if (m_pPlayer) + std::shared_ptr pPlayer = m_pPlayer.lock(); + + if (pPlayer) { if (m_bSendAllegianceUpdates) { @@ -94,25 +97,27 @@ void CClientEvents::Think() void CClientEvents::BeginLogout() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (m_pPlayer && !m_pPlayer->IsLoggingOut()) + if (pPlayer && !pPlayer->IsLoggingOut()) { - if (m_pPlayer->IsBusyOrInAction()) + if (pPlayer->IsBusyOrInAction()) { - m_pPlayer->NotifyWeenieError(WERROR_ACTIONS_LOCKED); + pPlayer->NotifyWeenieError(WERROR_ACTIONS_LOCKED); return; } - m_pPlayer->BeginLogout(); + pPlayer->BeginLogout(); } } void CClientEvents::ForceLogout() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (m_pPlayer && !m_pPlayer->IsLoggingOut()) + if (pPlayer && !pPlayer->IsLoggingOut()) { - m_pPlayer->BeginLogout(); + pPlayer->BeginLogout(); } } @@ -142,7 +147,7 @@ void CClientEvents::LoginCharacter(DWORD char_weenie_id, const char *szAccount) return; } - if (m_pPlayer || g_pWorld->FindPlayer(char_weenie_id)) + if (m_pPlayer.lock() || g_pWorld->FindPlayer(char_weenie_id)) { // LOG(Temp, Normal, "Character already logged in!\n"); LoginError(13); // update error codes @@ -158,13 +163,12 @@ void CClientEvents::LoginCharacter(DWORD char_weenie_id, const char *szAccount) return; } */ - - CPlayerWeenie *pPlayer = new CPlayerWeenie(m_pClient, char_weenie_id, m_pClient->IncCharacterInstanceTS(char_weenie_id)); - m_pPlayer = pPlayer->GetPointer(true); - + std::shared_ptr pPlayer = (new CPlayerWeenie(m_pClient, char_weenie_id, m_pClient->IncCharacterInstanceTS(char_weenie_id)))->GetPointer(true); - if (!m_pPlayer->Load()) + m_pPlayer = pPlayer; + + if (!pPlayer->Load()) { LoginError(13); // update error codes SERVER_WARN << szAccount << "Login request, but character failed to load!"; @@ -172,23 +176,23 @@ void CClientEvents::LoginCharacter(DWORD char_weenie_id, const char *szAccount) return; } - m_pPlayer->SetLoginPlayerQualities(); // overrides - m_pPlayer->RecalculateEncumbrance(); - m_pPlayer->LoginCharacter(); + pPlayer->SetLoginPlayerQualities(); // overrides + pPlayer->RecalculateEncumbrance(); + pPlayer->LoginCharacter(); //temporarily send a purge all enchantments packet on login to wipe stacked characters. - if (m_pPlayer->m_Qualities._enchantment_reg) + if (pPlayer->m_Qualities._enchantment_reg) { PackableList removed; - if (m_pPlayer->m_Qualities._enchantment_reg->_add_list) + if (pPlayer->m_Qualities._enchantment_reg->_add_list) { - for (auto it = m_pPlayer->m_Qualities._enchantment_reg->_add_list->begin(); it != m_pPlayer->m_Qualities._enchantment_reg->_add_list->end();) + for (auto it = pPlayer->m_Qualities._enchantment_reg->_add_list->begin(); it != pPlayer->m_Qualities._enchantment_reg->_add_list->end();) { if (it->_duration == -1.0) { removed.push_back(it->_id); - it = m_pPlayer->m_Qualities._enchantment_reg->_add_list->erase(it); + it = pPlayer->m_Qualities._enchantment_reg->_add_list->erase(it); } else { @@ -197,14 +201,14 @@ void CClientEvents::LoginCharacter(DWORD char_weenie_id, const char *szAccount) } } - if (m_pPlayer->m_Qualities._enchantment_reg->_mult_list) + if (pPlayer->m_Qualities._enchantment_reg->_mult_list) { - for (auto it = m_pPlayer->m_Qualities._enchantment_reg->_mult_list->begin(); it != m_pPlayer->m_Qualities._enchantment_reg->_mult_list->end();) + for (auto it = pPlayer->m_Qualities._enchantment_reg->_mult_list->begin(); it != pPlayer->m_Qualities._enchantment_reg->_mult_list->end();) { if (it->_duration == -1.0) { removed.push_back(it->_id); - it = m_pPlayer->m_Qualities._enchantment_reg->_mult_list->erase(it); + it = pPlayer->m_Qualities._enchantment_reg->_mult_list->erase(it); } else { @@ -225,63 +229,68 @@ void CClientEvents::LoginCharacter(DWORD char_weenie_id, const char *szAccount) } } - for (auto wielded : m_pPlayer->m_Wielded) + for (auto wielded : pPlayer->m_Wielded) { - + std::shared_ptr pWielded = wielded.lock(); // Updates shields to have SHIELD_VALUE_INT - if(wielded->InqIntQuality(ITEM_TYPE_INT, 0) == TYPE_ARMOR && wielded->InqIntQuality(LOCATIONS_INT, 0) == SHIELD_LOC) + if(pWielded->InqIntQuality(ITEM_TYPE_INT, 0) == TYPE_ARMOR && pWielded->InqIntQuality(LOCATIONS_INT, 0) == SHIELD_LOC) { - wielded->m_Qualities.SetInt(SHIELD_VALUE_INT, wielded->InqIntQuality(ARMOR_LEVEL_INT, 0)); + pWielded->m_Qualities.SetInt(SHIELD_VALUE_INT, pWielded->InqIntQuality(ARMOR_LEVEL_INT, 0)); } // Weeping wand nerf - if (wielded->m_Qualities.m_WeenieType == 35 && wielded->InqStringQuality(NAME_STRING, "") == "Weeping Wand" - && (wielded->InqDIDQuality(SPELL_DID, 0) > 0 || wielded->InqFloatQuality(SLAYER_DAMAGE_BONUS_FLOAT, 0) != 1.4)) + if (pWielded->m_Qualities.m_WeenieType == 35 && pWielded->InqStringQuality(NAME_STRING, "") == "Weeping Wand" + && (pWielded->InqDIDQuality(SPELL_DID, 0) > 0 || pWielded->InqFloatQuality(SLAYER_DAMAGE_BONUS_FLOAT, 0) != 1.4)) { - wielded->m_Qualities.RemoveDataID(SPELL_DID); - wielded->m_Qualities.SetFloat(SLAYER_DAMAGE_BONUS_FLOAT, 1.4); + pWielded->m_Qualities.RemoveDataID(SPELL_DID); + pWielded->m_Qualities.SetFloat(SLAYER_DAMAGE_BONUS_FLOAT, 1.4); } } - for (auto item : m_pPlayer->m_Items) + for (auto item : pPlayer->m_Items) { + std::shared_ptr pItem = item.lock(); + // Updates shields to have SHIELD_VALUE_INT - if (item->InqIntQuality(ITEM_TYPE_INT, 0) == TYPE_ARMOR && item->InqIntQuality(LOCATIONS_INT, 0) == SHIELD_LOC) + if (pItem->InqIntQuality(ITEM_TYPE_INT, 0) == TYPE_ARMOR && pItem->InqIntQuality(LOCATIONS_INT, 0) == SHIELD_LOC) { - item->m_Qualities.SetInt(SHIELD_VALUE_INT, item->InqIntQuality(ARMOR_LEVEL_INT, 0)); + pItem->m_Qualities.SetInt(SHIELD_VALUE_INT, pItem->InqIntQuality(ARMOR_LEVEL_INT, 0)); } // Weeping wand nerf - if (item->m_Qualities.m_WeenieType == 35 && item->InqStringQuality(NAME_STRING, "") == "Weeping Wand" - && (item->InqDIDQuality(SPELL_DID, 0) > 0 || item->InqFloatQuality(SLAYER_DAMAGE_BONUS_FLOAT, 0) != 1.4)) + if (pItem->m_Qualities.m_WeenieType == 35 && pItem->InqStringQuality(NAME_STRING, "") == "Weeping Wand" + && (pItem->InqDIDQuality(SPELL_DID, 0) > 0 || pItem->InqFloatQuality(SLAYER_DAMAGE_BONUS_FLOAT, 0) != 1.4)) { - item->m_Qualities.RemoveDataID(SPELL_DID); - item->m_Qualities.SetFloat(SLAYER_DAMAGE_BONUS_FLOAT, 1.4); + pItem->m_Qualities.RemoveDataID(SPELL_DID); + pItem->m_Qualities.SetFloat(SLAYER_DAMAGE_BONUS_FLOAT, 1.4); } } - for (auto pack : m_pPlayer->m_Packs) + for (auto pack : pPlayer->m_Packs) { + std::shared_ptr pPack = pack.lock(); - if (pack->m_Qualities.id != W_PACKCREATUREESSENCE_CLASS && pack->m_Qualities.id != W_PACKITEMESSENCE_CLASS && pack->m_Qualities.id != W_PACKLIFEESSENCE_CLASS && - pack->m_Qualities.id != W_PACKWARESSENCE_CLASS ) + if (pPack->m_Qualities.id != W_PACKCREATUREESSENCE_CLASS && pPack->m_Qualities.id != W_PACKITEMESSENCE_CLASS && pPack->m_Qualities.id != W_PACKLIFEESSENCE_CLASS && + pPack->m_Qualities.id != W_PACKWARESSENCE_CLASS ) { - for (auto item : pack->AsContainer()->m_Items) + for (auto item : pPack->AsContainer()->m_Items) { + std::shared_ptr pItem = item.lock(); + // Updates shields to have SHIELD_VALUE_INT - if (item->InqIntQuality(ITEM_TYPE_INT, 0) == TYPE_ARMOR && item->InqIntQuality(LOCATIONS_INT, 0) == SHIELD_LOC) + if (pItem->InqIntQuality(ITEM_TYPE_INT, 0) == TYPE_ARMOR && pItem->InqIntQuality(LOCATIONS_INT, 0) == SHIELD_LOC) { - item->m_Qualities.SetInt(SHIELD_VALUE_INT, item->InqIntQuality(ARMOR_LEVEL_INT, 0)); + pItem->m_Qualities.SetInt(SHIELD_VALUE_INT, pItem->InqIntQuality(ARMOR_LEVEL_INT, 0)); } // Weeping wand nerf - if (item->m_Qualities.m_WeenieType == 35 && item->InqStringQuality(NAME_STRING, "") == "Weeping Wand" - && (item->InqDIDQuality(SPELL_DID, 0) > 0 || item->InqFloatQuality(SLAYER_DAMAGE_BONUS_FLOAT, 0) != 1.4)) + if (pItem->m_Qualities.m_WeenieType == 35 && pItem->InqStringQuality(NAME_STRING, "") == "Weeping Wand" + && (pItem->InqDIDQuality(SPELL_DID, 0) > 0 || pItem->InqFloatQuality(SLAYER_DAMAGE_BONUS_FLOAT, 0) != 1.4)) { - item->m_Qualities.RemoveDataID(SPELL_DID); - item->m_Qualities.SetFloat(SLAYER_DAMAGE_BONUS_FLOAT, 1.4); + pItem->m_Qualities.RemoveDataID(SPELL_DID); + pItem->m_Qualities.SetFloat(SLAYER_DAMAGE_BONUS_FLOAT, 1.4); } } @@ -290,47 +299,49 @@ void CClientEvents::LoginCharacter(DWORD char_weenie_id, const char *szAccount) } } - m_pPlayer->SendText("GDLEnhanced " SERVER_VERSION_NUMBER_STRING " " SERVER_VERSION_STRING, LTT_DEFAULT); - m_pPlayer->SendText("Maintained by, ChosenOne, LikeableLime and Scribble, Contact us at https://discord.gg/WzGX348", LTT_DEFAULT); - m_pPlayer->SendText("Powered by GamesDeadLol. Not an official Asheron's Call server.", LTT_DEFAULT); + pPlayer->SendText("GDLEnhanced " SERVER_VERSION_NUMBER_STRING " " SERVER_VERSION_STRING, LTT_DEFAULT); + pPlayer->SendText("Maintained by, ChosenOne, LikeableLime and Scribble, Contact us at https://discord.gg/WzGX348", LTT_DEFAULT); + pPlayer->SendText("Powered by GamesDeadLol. Not an official Asheron's Call server.", LTT_DEFAULT); /* if (*g_pConfig->WelcomeMessage() != 0) { - m_pPlayer->SendText(g_pConfig->WelcomeMessage(), LTT_DEFAULT); + pPlayer->SendText(g_pConfig->WelcomeMessage(), LTT_DEFAULT); } */ - g_pWorld->CreateEntity(m_pPlayer); + g_pWorld->CreateEntity(pPlayer); //temporarily add all enchantments back from the character's wielded items - for (auto item : m_pPlayer->m_Wielded) + for (auto item : pPlayer->m_Wielded) { - if (item->m_Qualities._spell_book) + std::shared_ptr pItem = item.lock(); + + if (pItem->m_Qualities._spell_book) { bool bShouldCast = true; std::string name; - if (item->m_Qualities.InqString(CRAFTSMAN_NAME_STRING, name)) + if (pItem->m_Qualities.InqString(CRAFTSMAN_NAME_STRING, name)) { - if (!name.empty() && name != item->InqStringQuality(NAME_STRING, "")) + if (!name.empty() && name != pItem->InqStringQuality(NAME_STRING, "")) { bShouldCast = false; - m_pPlayer->NotifyWeenieErrorWithString(WERROR_ACTIVATION_NOT_CRAFTSMAN, name.c_str()); + pPlayer->NotifyWeenieErrorWithString(WERROR_ACTIVATION_NOT_CRAFTSMAN, name.c_str()); } } int difficulty; difficulty = 0; - if (item->m_Qualities.InqInt(ITEM_DIFFICULTY_INT, difficulty, TRUE, FALSE)) + if (pItem->m_Qualities.InqInt(ITEM_DIFFICULTY_INT, difficulty, TRUE, FALSE)) { DWORD skillLevel = 0; - if (!m_pPlayer->m_Qualities.InqSkill(ARCANE_LORE_SKILL, skillLevel, FALSE) || (int)skillLevel < difficulty) + if (!pPlayer->m_Qualities.InqSkill(ARCANE_LORE_SKILL, skillLevel, FALSE) || (int)skillLevel < difficulty) { bShouldCast = false; - m_pPlayer->NotifyWeenieError(WERROR_ACTIVATION_ARCANE_LORE_TOO_LOW); + pPlayer->NotifyWeenieError(WERROR_ACTIVATION_ARCANE_LORE_TOO_LOW); } } @@ -338,63 +349,63 @@ void CClientEvents::LoginCharacter(DWORD char_weenie_id, const char *szAccount) { difficulty = 0; DWORD skillActivationTypeDID = 0; - if (item->m_Qualities.InqInt(ITEM_SKILL_LEVEL_LIMIT_INT, difficulty, TRUE, FALSE) && item->m_Qualities.InqDataID(ITEM_SKILL_LIMIT_DID, skillActivationTypeDID)) + if (pItem->m_Qualities.InqInt(ITEM_SKILL_LEVEL_LIMIT_INT, difficulty, TRUE, FALSE) && pItem->m_Qualities.InqDataID(ITEM_SKILL_LIMIT_DID, skillActivationTypeDID)) { STypeSkill skillActivationType = SkillTable::OldToNewSkill((STypeSkill)skillActivationTypeDID); DWORD skillLevel = 0; - if (!m_pPlayer->m_Qualities.InqSkill(skillActivationType, skillLevel, FALSE) || (int)skillLevel < difficulty) + if (!pPlayer->m_Qualities.InqSkill(skillActivationType, skillLevel, FALSE) || (int)skillLevel < difficulty) { bShouldCast = false; - m_pPlayer->NotifyWeenieErrorWithString(WERROR_ACTIVATION_SKILL_TOO_LOW, CachedSkillTable->GetSkillName(skillActivationType).c_str()); + pPlayer->NotifyWeenieErrorWithString(WERROR_ACTIVATION_SKILL_TOO_LOW, CachedSkillTable->GetSkillName(skillActivationType).c_str()); } } } - if (bShouldCast && item->InqIntQuality(ITEM_ALLEGIANCE_RANK_LIMIT_INT, 0) > item->InqIntQuality(ALLEGIANCE_RANK_INT, 0)) + if (bShouldCast && pItem->InqIntQuality(ITEM_ALLEGIANCE_RANK_LIMIT_INT, 0) > pItem->InqIntQuality(ALLEGIANCE_RANK_INT, 0)) { bShouldCast = false; - m_pPlayer->NotifyInventoryFailedEvent(item->GetID(), WERROR_ACTIVATION_RANK_TOO_LOW); + pPlayer->NotifyInventoryFailedEvent(pItem->GetID(), WERROR_ACTIVATION_RANK_TOO_LOW); } if (bShouldCast) { - int heritageRequirement = item->InqIntQuality(HERITAGE_GROUP_INT, -1); - if (heritageRequirement != -1 && heritageRequirement != item->InqIntQuality(HERITAGE_GROUP_INT, 0)) + int heritageRequirement = pItem->InqIntQuality(HERITAGE_GROUP_INT, -1); + if (heritageRequirement != -1 && heritageRequirement != pItem->InqIntQuality(HERITAGE_GROUP_INT, 0)) { bShouldCast = false; - std::string heritageString = item->InqStringQuality(ITEM_HERITAGE_GROUP_RESTRICTION_STRING, "of the correct heritage"); - m_pPlayer->NotifyWeenieErrorWithString(WERROR_ACTIVATION_WRONG_RACE, heritageString.c_str()); + std::string heritageString = pItem->InqStringQuality(ITEM_HERITAGE_GROUP_RESTRICTION_STRING, "of the correct heritage"); + pPlayer->NotifyWeenieErrorWithString(WERROR_ACTIVATION_WRONG_RACE, heritageString.c_str()); } } int currentMana = 0; - if (bShouldCast && item->m_Qualities.InqInt(ITEM_CUR_MANA_INT, currentMana, TRUE, FALSE)) + if (bShouldCast && pItem->m_Qualities.InqInt(ITEM_CUR_MANA_INT, currentMana, TRUE, FALSE)) { if (currentMana == 0) { bShouldCast = false; - m_pPlayer->NotifyWeenieError(WERROR_ACTIVATION_NOT_ENOUGH_MANA); + pPlayer->NotifyWeenieError(WERROR_ACTIVATION_NOT_ENOUGH_MANA); } else - item->_nextManaUse = Timer::cur_time; + pItem->_nextManaUse = Timer::cur_time; } if (bShouldCast) { DWORD serial = 0; - serial |= ((DWORD)m_pPlayer->GetEnchantmentSerialByteForMask(item->InqIntQuality(LOCATIONS_INT, 0, TRUE)) << (DWORD)0); - serial |= ((DWORD)m_pPlayer->GetEnchantmentSerialByteForMask(item->InqIntQuality(CLOTHING_PRIORITY_INT, 0, TRUE)) << (DWORD)8); + serial |= ((DWORD)pPlayer->GetEnchantmentSerialByteForMask(pItem->InqIntQuality(LOCATIONS_INT, 0, TRUE)) << (DWORD)0); + serial |= ((DWORD)pPlayer->GetEnchantmentSerialByteForMask(pItem->InqIntQuality(CLOTHING_PRIORITY_INT, 0, TRUE)) << (DWORD)8); - for (auto &spellPage : item->m_Qualities._spell_book->_spellbook) + for (auto &spellPage : pItem->m_Qualities._spell_book->_spellbook) { - item->MakeSpellcastingManager()->CastSpellEquipped(m_pPlayer->GetID(), spellPage.first, (WORD)serial); + pItem->MakeSpellcastingManager()->CastSpellEquipped(pPlayer->GetID(), spellPage.first, (WORD)serial); } } } } - m_pPlayer->DebugValidate(); + pPlayer->DebugValidate(); return; } @@ -406,54 +417,57 @@ void CClientEvents::SendText(const char *szText, long lColor) void CClientEvents::Attack(DWORD target, DWORD height, float power) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } if (height <= 0 || height >= ATTACK_HEIGHT::NUM_ATTACK_HEIGHTS) { - SERVER_WARN << "Bad melee attack height" << height << "sent by player"<< m_pPlayer->GetID(); + SERVER_WARN << "Bad melee attack height" << height << "sent by player"<< pPlayer->GetID(); return; } if (power < 0.0f || power > 1.0f) { - SERVER_WARN << "Bad melee attack power" << power << "sent by player" << m_pPlayer->GetID(); + SERVER_WARN << "Bad melee attack power" << power << "sent by player" << pPlayer->GetID(); return; } - m_pPlayer->TryMeleeAttack(target, (ATTACK_HEIGHT) height, power); + pPlayer->TryMeleeAttack(target, (ATTACK_HEIGHT) height, power); } void CClientEvents::MissileAttack(DWORD target, DWORD height, float power) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } if (height <= 0 || height >= ATTACK_HEIGHT::NUM_ATTACK_HEIGHTS) { - SERVER_WARN << "Bad missile attack height" << height << "sent by player" << m_pPlayer->GetID(); + SERVER_WARN << "Bad missile attack height" << height << "sent by player" << pPlayer->GetID(); return; } if (power < 0.0f || power > 1.0f) { - SERVER_WARN << "Bad missile attack power" << power << "sent by player" << m_pPlayer->GetID(); + SERVER_WARN << "Bad missile attack power" << power << "sent by player" << pPlayer->GetID(); return; } - m_pPlayer->TryMissileAttack(target, (ATTACK_HEIGHT)height, power); + pPlayer->TryMissileAttack(target, (ATTACK_HEIGHT)height, power); } void CClientEvents::SendTellByGUID(const char* szText, DWORD dwGUID) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -469,9 +483,9 @@ void CClientEvents::SendTellByGUID(const char* szText, DWORD dwGUID) return; /* - if (dwGUID == m_pPlayer->GetID()) + if (dwGUID == pPlayer->GetID()) { - m_pPlayer->SendNetMessage(ServerText("You really need some new friends..", 1), PRIVATE_MSG, FALSE); + pPlayer->SendNetMessage(ServerText("You really need some new friends..", 1), PRIVATE_MSG, FALSE); return; } */ @@ -481,20 +495,21 @@ void CClientEvents::SendTellByGUID(const char* szText, DWORD dwGUID) if (!(pTarget = g_pWorld->FindPlayer(dwGUID))) return; - if (pTarget->GetID() != m_pPlayer->GetID()) + if (pTarget->GetID() != pPlayer->GetID()) { char szResponse[300]; _snprintf(szResponse, 300, "You tell %s, \"%s\"", pTarget->GetName().c_str(), szText); - m_pPlayer->SendNetMessage(ServerText(szResponse, 4), PRIVATE_MSG, FALSE, TRUE); + pPlayer->SendNetMessage(ServerText(szResponse, 4), PRIVATE_MSG, FALSE, TRUE); } - pTarget->SendNetMessage(DirectChat(szText, m_pPlayer->GetName().c_str(), m_pPlayer->GetID(), pTarget->GetID(), 3), PRIVATE_MSG, TRUE); + pTarget->SendNetMessage(DirectChat(szText, pPlayer->GetName().c_str(), pPlayer->GetID(), pTarget->GetID(), 3), PRIVATE_MSG, TRUE); } void CClientEvents::SendTellByName(const char* szText, const char* szName) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -516,20 +531,21 @@ void CClientEvents::SendTellByName(const char* szText, const char* szName) if (!(pTarget = g_pWorld->FindPlayer(szName))) return; - if (pTarget->GetID() != m_pPlayer->GetID()) + if (pTarget->GetID() != pPlayer->GetID()) { char szResponse[300]; _snprintf(szResponse, 300, "You tell %s, \"%s\"", pTarget->GetName().c_str(), szText); - m_pPlayer->SendNetMessage(ServerText(szResponse, 4), PRIVATE_MSG, FALSE, TRUE); + pPlayer->SendNetMessage(ServerText(szResponse, 4), PRIVATE_MSG, FALSE, TRUE); } - pTarget->SendNetMessage(DirectChat(szText, m_pPlayer->GetName().c_str(), m_pPlayer->GetID(), pTarget->GetID(), 3), PRIVATE_MSG, TRUE); + pTarget->SendNetMessage(DirectChat(szText, pPlayer->GetName().c_str(), pPlayer->GetID(), pTarget->GetID(), 3), PRIVATE_MSG, TRUE); } void CClientEvents::ClientText(const char *szText) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -555,15 +571,16 @@ void CClientEvents::ClientText(const char *szText) { if (CheckForChatSpam()) { - m_pPlayer->SpeakLocal(szText); + pPlayer->SpeakLocal(szText); } } } void CClientEvents::EmoteText(const char* szText) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -578,13 +595,14 @@ void CClientEvents::EmoteText(const char* szText) if (szText[0] == '\0') //Make sure the text isn't blank return; - m_pPlayer->EmoteLocal(szText); + pPlayer->EmoteLocal(szText); } void CClientEvents::ActionText(const char *text) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -597,13 +615,14 @@ void CClientEvents::ActionText(const char *text) if (text[0] == '\0') //Make sure the text isn't blank return; - m_pPlayer->ActionLocal(text); + pPlayer->ActionLocal(text); } void CClientEvents::ChannelText(DWORD channel_id, const char *text) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -622,51 +641,52 @@ void CClientEvents::ChannelText(DWORD channel_id, const char *text) case Fellow_ChannelID: { std::string fellowName; - if (!m_pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowName)) + if (!pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowName)) return; - g_pFellowshipManager->Chat(fellowName, m_pPlayer->GetID(), text); - CHAT_LOG << m_pPlayer->GetName().c_str() << "says (fellowship)," << text; + g_pFellowshipManager->Chat(fellowName, pPlayer->GetID(), text); + CHAT_LOG << pPlayer->GetName().c_str() << "says (fellowship)," << text; break; } case Patron_ChannelID: - g_pAllegianceManager->ChatPatron(m_pPlayer->GetID(), text); - CHAT_LOG << m_pPlayer->GetName().c_str() << "says (patron)," << text; + g_pAllegianceManager->ChatPatron(pPlayer->GetID(), text); + CHAT_LOG << pPlayer->GetName().c_str() << "says (patron)," << text; break; case Vassals_ChannelID: - g_pAllegianceManager->ChatVassals(m_pPlayer->GetID(), text); - CHAT_LOG << m_pPlayer->GetName().c_str() << "says (vassals)," << text; + g_pAllegianceManager->ChatVassals(pPlayer->GetID(), text); + CHAT_LOG << pPlayer->GetName().c_str() << "says (vassals)," << text; break; case Covassals_ChannelID: - g_pAllegianceManager->ChatCovassals(m_pPlayer->GetID(), text); - CHAT_LOG << m_pPlayer->GetName().c_str() << "says (covassals)," << text; + g_pAllegianceManager->ChatCovassals(pPlayer->GetID(), text); + CHAT_LOG << pPlayer->GetName().c_str() << "says (covassals)," << text; break; case Monarch_ChannelID: - g_pAllegianceManager->ChatMonarch(m_pPlayer->GetID(), text); - CHAT_LOG << m_pPlayer->GetName().c_str() << "says (monarch)," << text; + g_pAllegianceManager->ChatMonarch(pPlayer->GetID(), text); + CHAT_LOG << pPlayer->GetName().c_str() << "says (monarch)," << text; break; } } void CClientEvents::RequestHealthUpdate(DWORD dwGUID) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - std::shared_ptr pEntity = g_pWorld->FindWithinPVS(m_pPlayer, dwGUID); + std::shared_ptr pEntity = g_pWorld->FindWithinPVS(pPlayer, dwGUID); if (pEntity) { if (std::shared_ptr pMonster = pEntity->AsMonster()) { - m_pPlayer->SetLastHealthRequest(pEntity->GetID()); + pPlayer->SetLastHealthRequest(pEntity->GetID()); m_pClient->SendNetMessage(HealthUpdate(pMonster), PRIVATE_MSG, TRUE, TRUE); } @@ -675,25 +695,27 @@ void CClientEvents::RequestHealthUpdate(DWORD dwGUID) void CClientEvents::ChangeCombatStance(COMBAT_MODE mode) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - m_pPlayer->ChangeCombatMode(mode, true); + pPlayer->ChangeCombatMode(mode, true); // ActionComplete(); } void CClientEvents::ExitPortal() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - m_pPlayer->ExitPortal(); + pPlayer->ExitPortal(); } void CClientEvents::Ping() @@ -705,50 +727,52 @@ void CClientEvents::Ping() void CClientEvents::UseItemEx(DWORD dwSourceID, DWORD dwDestID) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - std::shared_ptr pSource = g_pWorld->FindWithinPVS(m_pPlayer, dwSourceID); - std::shared_ptr pDest = g_pWorld->FindWithinPVS(m_pPlayer, dwDestID); + std::shared_ptr pSource = g_pWorld->FindWithinPVS(pPlayer, dwSourceID); + std::shared_ptr pDest = g_pWorld->FindWithinPVS(pPlayer, dwDestID); if (pSource && pSource->AsCaster()) - m_pPlayer->ExecuteUseEvent(new CWandSpellUseEvent(dwSourceID, pDest ? dwDestID : dwSourceID)); + pPlayer->ExecuteUseEvent(new CWandSpellUseEvent(dwSourceID, pDest ? dwDestID : dwSourceID)); else if (pSource && pDest) - pSource->UseWith(m_pPlayer, pDest); + pSource->UseWith(pPlayer, pDest); else ActionComplete(); } void CClientEvents::UseObject(DWORD dwEID) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - if (m_pPlayer->IsBusyOrInAction()) + if (pPlayer->IsBusyOrInAction()) { ActionComplete(WERROR_ACTIONS_LOCKED); return; } - std::shared_ptr pTarget = g_pWorld->FindWithinPVS(m_pPlayer, dwEID); + std::shared_ptr pTarget = g_pWorld->FindWithinPVS(pPlayer, dwEID); if (pTarget) { - if (pTarget->AsContainer() && pTarget->AsContainer()->_openedById == m_pPlayer->GetID()) + if (pTarget->AsContainer() && pTarget->AsContainer()->_openedById == pPlayer->GetID()) { //we're closing a chest - pTarget->AsContainer()->OnContainerClosed(m_pPlayer); + pTarget->AsContainer()->OnContainerClosed(pPlayer); ActionComplete(); return; } - int error = pTarget->UseChecked(m_pPlayer); + int error = pTarget->UseChecked(pPlayer); if (error != WERROR_NONE) ActionComplete(error); @@ -761,19 +785,21 @@ void CClientEvents::UseObject(DWORD dwEID) void CClientEvents::ActionComplete(int error) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - m_pPlayer->NotifyUseDone(error); + pPlayer->NotifyUseDone(error); } void CClientEvents::Identify(DWORD target_id) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -785,7 +811,7 @@ void CClientEvents::Identify(DWORD target_id) } /* - std::shared_ptr pTarget = g_pWorld->FindWithinPVS(m_pPlayer, target_id); + std::shared_ptr pTarget = g_pWorld->FindWithinPVS(pPlayer, target_id); if (!pTarget) { @@ -803,8 +829,8 @@ void CClientEvents::Identify(DWORD target_id) if (pTarget && !pTarget->m_Qualities.InqBool(VISIBILITY_BOOL, vis)) #endif { - pTarget->TryIdentify(m_pPlayer); - m_pPlayer->SetLastAssessed(pTarget->GetID()); + pTarget->TryIdentify(pPlayer); + pPlayer->SetLastAssessed(pTarget->GetID()); } _next_allowed_identify = Timer::cur_time + 0.5; @@ -812,8 +838,9 @@ void CClientEvents::Identify(DWORD target_id) void CClientEvents::SpendAttributeXP(STypeAttribute key, DWORD amount) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -825,24 +852,25 @@ void CClientEvents::SpendAttributeXP(STypeAttribute key, DWORD amount) // TODO verify they are trying to spend the correct amount of XP __int64 unassignedExp = 0; - m_pPlayer->m_Qualities.InqInt64(AVAILABLE_EXPERIENCE_INT64, unassignedExp); + pPlayer->m_Qualities.InqInt64(AVAILABLE_EXPERIENCE_INT64, unassignedExp); if ((unsigned __int64)unassignedExp < (unsigned __int64)amount) { // Not enough experience return; } - m_pPlayer->GiveAttributeXP(key, amount); - m_pPlayer->m_Qualities.SetInt64(AVAILABLE_EXPERIENCE_INT64, (unsigned __int64)unassignedExp - (unsigned __int64)amount); + pPlayer->GiveAttributeXP(key, amount); + pPlayer->m_Qualities.SetInt64(AVAILABLE_EXPERIENCE_INT64, (unsigned __int64)unassignedExp - (unsigned __int64)amount); - m_pPlayer->NotifyAttributeStatUpdated(key); - m_pPlayer->NotifyInt64StatUpdated(AVAILABLE_EXPERIENCE_INT64); + pPlayer->NotifyAttributeStatUpdated(key); + pPlayer->NotifyInt64StatUpdated(AVAILABLE_EXPERIENCE_INT64); } void CClientEvents::SpendAttribute2ndXP(STypeAttribute2nd key, DWORD amount) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -854,23 +882,24 @@ void CClientEvents::SpendAttribute2ndXP(STypeAttribute2nd key, DWORD amount) // TODO verify they are trying to spend the correct amount of XP __int64 unassignedExp = 0; - m_pPlayer->m_Qualities.InqInt64(AVAILABLE_EXPERIENCE_INT64, unassignedExp); + pPlayer->m_Qualities.InqInt64(AVAILABLE_EXPERIENCE_INT64, unassignedExp); if ((unsigned __int64)unassignedExp < (unsigned __int64)amount) { // Not enough experience return; } - m_pPlayer->GiveAttribute2ndXP(key, amount); + pPlayer->GiveAttribute2ndXP(key, amount); - m_pPlayer->m_Qualities.SetInt64(AVAILABLE_EXPERIENCE_INT64, (unsigned __int64)unassignedExp - (unsigned __int64)amount); - m_pPlayer->NotifyInt64StatUpdated(AVAILABLE_EXPERIENCE_INT64); + pPlayer->m_Qualities.SetInt64(AVAILABLE_EXPERIENCE_INT64, (unsigned __int64)unassignedExp - (unsigned __int64)amount); + pPlayer->NotifyInt64StatUpdated(AVAILABLE_EXPERIENCE_INT64); } void CClientEvents::SpendSkillXP(STypeSkill key, DWORD exp) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -878,7 +907,7 @@ void CClientEvents::SpendSkillXP(STypeSkill key, DWORD exp) // TODO verify they are trying to spend the correct amount of XP __int64 unassignedExp = 0; - m_pPlayer->m_Qualities.InqInt64(AVAILABLE_EXPERIENCE_INT64, unassignedExp); + pPlayer->m_Qualities.InqInt64(AVAILABLE_EXPERIENCE_INT64, unassignedExp); if ((unsigned __int64)unassignedExp < (unsigned __int64)exp) { // Not enough experience @@ -886,22 +915,23 @@ void CClientEvents::SpendSkillXP(STypeSkill key, DWORD exp) } Skill skill; - if (!m_pPlayer->m_Qualities.InqSkill(key, skill) || skill._sac < TRAINED_SKILL_ADVANCEMENT_CLASS) + if (!pPlayer->m_Qualities.InqSkill(key, skill) || skill._sac < TRAINED_SKILL_ADVANCEMENT_CLASS) { // Skill doesn't exist or isn't trained return; } - m_pPlayer->GiveSkillXP(key, exp); + pPlayer->GiveSkillXP(key, exp); - m_pPlayer->m_Qualities.SetInt64(AVAILABLE_EXPERIENCE_INT64, (unsigned __int64)unassignedExp - (unsigned __int64)exp); - m_pPlayer->NotifyInt64StatUpdated(AVAILABLE_EXPERIENCE_INT64); + pPlayer->m_Qualities.SetInt64(AVAILABLE_EXPERIENCE_INT64, (unsigned __int64)unassignedExp - (unsigned __int64)exp); + pPlayer->NotifyInt64StatUpdated(AVAILABLE_EXPERIENCE_INT64); } void CClientEvents::SpendSkillCredits(STypeSkill key, DWORD credits) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -909,7 +939,7 @@ void CClientEvents::SpendSkillCredits(STypeSkill key, DWORD credits) // TODO verify they are trying to spend the correct amount of XP DWORD unassignedCredits = 0; - m_pPlayer->m_Qualities.InqInt(AVAILABLE_SKILL_CREDITS_INT, *(int *)&unassignedCredits); + pPlayer->m_Qualities.InqInt(AVAILABLE_SKILL_CREDITS_INT, *(int *)&unassignedCredits); if (unassignedCredits < credits) { // Not enough experience @@ -917,48 +947,49 @@ void CClientEvents::SpendSkillCredits(STypeSkill key, DWORD credits) } Skill skill; - if (!m_pPlayer->m_Qualities.InqSkill(key, skill) || skill._sac >= TRAINED_SKILL_ADVANCEMENT_CLASS) + if (!pPlayer->m_Qualities.InqSkill(key, skill) || skill._sac >= TRAINED_SKILL_ADVANCEMENT_CLASS) { // Skill doesn't exist or already trained return; } - DWORD costToRaise = m_pPlayer->GetCostToRaiseSkill(key); + DWORD costToRaise = pPlayer->GetCostToRaiseSkill(key); - if (m_pPlayer->GetCostToRaiseSkill(key) != credits) + if (pPlayer->GetCostToRaiseSkill(key) != credits) { - SERVER_WARN << m_pPlayer->GetName() << "- Credit cost to raise skill does not match what player is trying to spend."; + SERVER_WARN << pPlayer->GetName() << "- Credit cost to raise skill does not match what player is trying to spend."; return; } - m_pPlayer->GiveSkillAdvancementClass(key, TRAINED_SKILL_ADVANCEMENT_CLASS); - m_pPlayer->m_Qualities.SetSkillLevel(key, 5); - m_pPlayer->NotifySkillStatUpdated(key); + pPlayer->GiveSkillAdvancementClass(key, TRAINED_SKILL_ADVANCEMENT_CLASS); + pPlayer->m_Qualities.SetSkillLevel(key, 5); + pPlayer->NotifySkillStatUpdated(key); - m_pPlayer->m_Qualities.SetInt(AVAILABLE_SKILL_CREDITS_INT, unassignedCredits - costToRaise); - m_pPlayer->NotifyIntStatUpdated(AVAILABLE_SKILL_CREDITS_INT); + pPlayer->m_Qualities.SetInt(AVAILABLE_SKILL_CREDITS_INT, unassignedCredits - costToRaise); + pPlayer->NotifyIntStatUpdated(AVAILABLE_SKILL_CREDITS_INT); } void CClientEvents::LifestoneRecall() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - if ( m_pPlayer->CheckPKActivity()) + if ( pPlayer->CheckPKActivity()) { - m_pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); + pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); return; } Position lifestone; - if (m_pPlayer->m_Qualities.InqPosition(SANCTUARY_POSITION, lifestone) && lifestone.objcell_id) + if (pPlayer->m_Qualities.InqPosition(SANCTUARY_POSITION, lifestone) && lifestone.objcell_id) { - if (!m_pPlayer->IsBusyOrInAction()) + if (!pPlayer->IsBusyOrInAction()) { - m_pPlayer->ExecuteUseEvent(new CLifestoneRecallUseEvent()); + pPlayer->ExecuteUseEvent(new CLifestoneRecallUseEvent()); } } else @@ -969,33 +1000,35 @@ void CClientEvents::LifestoneRecall() void CClientEvents::MarketplaceRecall() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - if (m_pPlayer->CheckPKActivity()) + if (pPlayer->CheckPKActivity()) { - m_pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); + pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); return; } - if (!m_pPlayer->IsBusyOrInAction()) + if (!pPlayer->IsBusyOrInAction()) { - m_pPlayer->ExecuteUseEvent(new CMarketplaceRecallUseEvent()); + pPlayer->ExecuteUseEvent(new CMarketplaceRecallUseEvent()); } } void CClientEvents::TryInscribeItem(DWORD object_id, const std::string &text) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - std::shared_ptr weenie = m_pPlayer->FindContainedItem(object_id); + std::shared_ptr weenie = pPlayer->FindContainedItem(object_id); if (!weenie) { @@ -1008,18 +1041,19 @@ void CClientEvents::TryInscribeItem(DWORD object_id, const std::string &text) } weenie->m_Qualities.SetString(INSCRIPTION_STRING, text.length() <= 800 ? text : text.substr(0, 800)); - weenie->m_Qualities.SetString(SCRIBE_NAME_STRING, m_pPlayer->GetName()); + weenie->m_Qualities.SetString(SCRIBE_NAME_STRING, pPlayer->GetName()); } void CClientEvents::TryBuyItems(DWORD vendor_id, std::list &items) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - std::shared_ptr weenie = g_pWorld->FindWithinPVS(m_pPlayer, vendor_id); + std::shared_ptr weenie = g_pWorld->FindWithinPVS(pPlayer, vendor_id); if (!weenie) { @@ -1030,8 +1064,8 @@ void CClientEvents::TryBuyItems(DWORD vendor_id, std::list int error = WERROR_NO_OBJECT; if (std::shared_ptr pVendor = weenie->AsVendor()) { - error = pVendor->TrySellItemsToPlayer(m_pPlayer, items); - pVendor->SendVendorInventory(m_pPlayer); + error = pVendor->TrySellItemsToPlayer(pPlayer, items); + pVendor->SendVendorInventory(pPlayer); } ActionComplete(error); @@ -1040,13 +1074,14 @@ void CClientEvents::TryBuyItems(DWORD vendor_id, std::list void CClientEvents::TrySellItems(DWORD vendor_id, std::list &items) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - std::shared_ptr weenie = g_pWorld->FindWithinPVS(m_pPlayer, vendor_id); + std::shared_ptr weenie = g_pWorld->FindWithinPVS(pPlayer, vendor_id); if (!weenie) { @@ -1057,8 +1092,8 @@ void CClientEvents::TrySellItems(DWORD vendor_id, std::list int error = WERROR_NO_OBJECT; if (std::shared_ptr pVendor = weenie->AsVendor()) { - error = pVendor->TryBuyItemsFromPlayer(m_pPlayer, items); - pVendor->SendVendorInventory(m_pPlayer); + error = pVendor->TryBuyItemsFromPlayer(pPlayer, items); + pVendor->SendVendorInventory(pPlayer); } ActionComplete(error); @@ -1066,156 +1101,165 @@ void CClientEvents::TrySellItems(DWORD vendor_id, std::list void CClientEvents::TryFellowshipCreate(const std::string name, int shareXP) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - if (m_pPlayer->HasFellowship()) + if (pPlayer->HasFellowship()) return; - int error = g_pFellowshipManager->Create(name, m_pPlayer->GetID(), shareXP); + int error = g_pFellowshipManager->Create(name, pPlayer->GetID(), shareXP); if (error) - m_pPlayer->NotifyWeenieError(error); + pPlayer->NotifyWeenieError(error); } void CClientEvents::TryFellowshipQuit(int disband) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } std::string fellowshipName; - if (!m_pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) + if (!pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) return; int error = 0; if (disband) - error = g_pFellowshipManager->Disband(fellowshipName, m_pPlayer->GetID()); + error = g_pFellowshipManager->Disband(fellowshipName, pPlayer->GetID()); else - error = g_pFellowshipManager->Quit(fellowshipName, m_pPlayer->GetID()); + error = g_pFellowshipManager->Quit(fellowshipName, pPlayer->GetID()); if (error) - m_pPlayer->NotifyWeenieError(error); + pPlayer->NotifyWeenieError(error); } void CClientEvents::TryFellowshipDismiss(DWORD dismissed) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } std::string fellowshipName; - if (!m_pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) + if (!pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) return; - int error = g_pFellowshipManager->Dismiss(fellowshipName, m_pPlayer->GetID(), dismissed); + int error = g_pFellowshipManager->Dismiss(fellowshipName, pPlayer->GetID(), dismissed); if (error) - m_pPlayer->NotifyWeenieError(error); + pPlayer->NotifyWeenieError(error); } void CClientEvents::TryFellowshipRecruit(DWORD target) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } std::string fellowshipName; - if (!m_pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) + if (!pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) return; - int error = g_pFellowshipManager->Recruit(fellowshipName, m_pPlayer->GetID(), target); + int error = g_pFellowshipManager->Recruit(fellowshipName, pPlayer->GetID(), target); if (error) - m_pPlayer->NotifyWeenieError(error); + pPlayer->NotifyWeenieError(error); } void CClientEvents::TryFellowshipUpdate(int on) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } std::string fellowshipName; - if (!m_pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) + if (!pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) return; - int error = g_pFellowshipManager->RequestUpdates(fellowshipName, m_pPlayer->GetID(), on); + int error = g_pFellowshipManager->RequestUpdates(fellowshipName, pPlayer->GetID(), on); if (error) - m_pPlayer->NotifyWeenieError(error); + pPlayer->NotifyWeenieError(error); } void CClientEvents::TryFellowshipAssignNewLeader(DWORD target) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } std::string fellowshipName; - if (!m_pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) + if (!pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) return; - int error = g_pFellowshipManager->AssignNewLeader(fellowshipName, m_pPlayer->GetID(), target); + int error = g_pFellowshipManager->AssignNewLeader(fellowshipName, pPlayer->GetID(), target); if (error) - m_pPlayer->NotifyWeenieError(error); + pPlayer->NotifyWeenieError(error); } void CClientEvents::TryFellowshipChangeOpenness(int open) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } std::string fellowshipName; - if (!m_pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) + if (!pPlayer->m_Qualities.InqString(FELLOWSHIP_STRING, fellowshipName)) return; - int error = g_pFellowshipManager->ChangeOpen(fellowshipName, m_pPlayer->GetID(), open); + int error = g_pFellowshipManager->ChangeOpen(fellowshipName, pPlayer->GetID(), open); if (error) - m_pPlayer->NotifyWeenieError(error); + pPlayer->NotifyWeenieError(error); } void CClientEvents::SendAllegianceUpdate() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - if (!m_pPlayer) + if (!pPlayer) return; - g_pAllegianceManager->SendAllegianceProfile(m_pPlayer); + g_pAllegianceManager->SendAllegianceProfile(pPlayer); } void CClientEvents::SendAllegianceMOTD() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - AllegianceTreeNode *self = g_pAllegianceManager->GetTreeNode(m_pPlayer->GetID()); + AllegianceTreeNode *self = g_pAllegianceManager->GetTreeNode(pPlayer->GetID()); if (!self) return; @@ -1223,7 +1267,7 @@ void CClientEvents::SendAllegianceMOTD() if (!info) return; - m_pPlayer->SendText(csprintf("\"%s\" -- %s", info->_info.m_motd.c_str(), info->_info.m_motdSetBy.c_str()), LTT_DEFAULT); + pPlayer->SendText(csprintf("\"%s\" -- %s", info->_info.m_motd.c_str(), info->_info.m_motdSetBy.c_str()), LTT_DEFAULT); } void CClientEvents::SetRequestAllegianceUpdate(int on) @@ -1233,14 +1277,15 @@ void CClientEvents::SetRequestAllegianceUpdate(int on) void CClientEvents::TryBreakAllegiance(DWORD target) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - int error = g_pAllegianceManager->TryBreakAllegiance(m_pPlayer, target); - m_pPlayer->NotifyWeenieError(error); + int error = g_pAllegianceManager->TryBreakAllegiance(pPlayer, target); + pPlayer->NotifyWeenieError(error); if (error == WERROR_NONE) { @@ -1250,8 +1295,9 @@ void CClientEvents::TryBreakAllegiance(DWORD target) void CClientEvents::TrySwearAllegiance(DWORD target) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -1259,12 +1305,12 @@ void CClientEvents::TrySwearAllegiance(DWORD target) std::shared_ptr targetWeenie = g_pWorld->FindPlayer(target); if (!targetWeenie) { - m_pPlayer->NotifyWeenieError(WERROR_NO_OBJECT); + pPlayer->NotifyWeenieError(WERROR_NO_OBJECT); return; } - int error = g_pAllegianceManager->TrySwearAllegiance(m_pPlayer, targetWeenie); - m_pPlayer->NotifyWeenieError(error); + int error = g_pAllegianceManager->TrySwearAllegiance(pPlayer, targetWeenie); + pPlayer->NotifyWeenieError(error); if (error == WERROR_NONE) { @@ -1274,30 +1320,31 @@ void CClientEvents::TrySwearAllegiance(DWORD target) void CClientEvents::AllegianceInfoRequest(const std::string &target) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - AllegianceTreeNode *myNode = g_pAllegianceManager->GetTreeNode(m_pPlayer->GetID()); + AllegianceTreeNode *myNode = g_pAllegianceManager->GetTreeNode(pPlayer->GetID()); if (!myNode) { - m_pPlayer->SendText("You are not in an allegiance.", LTT_DEFAULT); + pPlayer->SendText("You are not in an allegiance.", LTT_DEFAULT); return; } AllegianceTreeNode *myMonarchNode = g_pAllegianceManager->GetTreeNode(myNode->_monarchID); if (!myMonarchNode) { - m_pPlayer->SendText("There was an error processing your request.", LTT_DEFAULT); + pPlayer->SendText("There was an error processing your request.", LTT_DEFAULT); return; } AllegianceTreeNode *myTargetNode = myMonarchNode->FindCharByNameRecursivelySlow(target); if (!myTargetNode) { - m_pPlayer->SendText("Could not find allegiance member.", LTT_DEFAULT); + pPlayer->SendText("Could not find allegiance member.", LTT_DEFAULT); return; } @@ -1308,31 +1355,32 @@ void CClientEvents::AllegianceInfoRequest(const std::string &target) allegianceUpdate.Write(0x27C); allegianceUpdate.Write(myTargetNode->_charID); profile->Pack(&allegianceUpdate); - m_pPlayer->SendNetMessage(&allegianceUpdate, PRIVATE_MSG, TRUE, FALSE); + pPlayer->SendNetMessage(&allegianceUpdate, PRIVATE_MSG, TRUE, FALSE); delete profile; } else { - m_pPlayer->SendText("Error retrieving allegiance member information.", LTT_DEFAULT); + pPlayer->SendText("Error retrieving allegiance member information.", LTT_DEFAULT); } } void CClientEvents::TrySetAllegianceMOTD(const std::string &text) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - AllegianceTreeNode *self = g_pAllegianceManager->GetTreeNode(m_pPlayer->GetID()); + AllegianceTreeNode *self = g_pAllegianceManager->GetTreeNode(pPlayer->GetID()); if (!self) return; if (self->_charID != self->_monarchID) { - m_pPlayer->SendText("Only the monarch can set the Message of the Day.", LTT_DEFAULT); + pPlayer->SendText("Only the monarch can set the Message of the Day.", LTT_DEFAULT); return; } @@ -1341,29 +1389,30 @@ void CClientEvents::TrySetAllegianceMOTD(const std::string &text) return; info->_info.m_motd = text; - info->_info.m_motdSetBy = m_pPlayer->GetName(); - m_pPlayer->SendText(csprintf("MOTD changed to: \"%s\" -- %s", info->_info.m_motd.c_str(), info->_info.m_motdSetBy.c_str()), LTT_DEFAULT); + info->_info.m_motdSetBy = pPlayer->GetName(); + pPlayer->SendText(csprintf("MOTD changed to: \"%s\" -- %s", info->_info.m_motd.c_str(), info->_info.m_motdSetBy.c_str()), LTT_DEFAULT); } void CClientEvents::AllegianceHometownRecall() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - if (m_pPlayer->CheckPKActivity()) + if (pPlayer->CheckPKActivity()) { - m_pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); + pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); return; } - AllegianceTreeNode *allegianceNode = g_pAllegianceManager->GetTreeNode(m_pPlayer->GetID()); + AllegianceTreeNode *allegianceNode = g_pAllegianceManager->GetTreeNode(pPlayer->GetID()); if (!allegianceNode) { - m_pPlayer->NotifyWeenieError(WERROR_ALLEGIANCE_NONEXISTENT); + pPlayer->NotifyWeenieError(WERROR_ALLEGIANCE_NONEXISTENT); return; } @@ -1371,72 +1420,75 @@ void CClientEvents::AllegianceHometownRecall() if (allegianceInfo && allegianceInfo->_info.m_BindPoint.objcell_id) { - if (!m_pPlayer->IsBusyOrInAction()) - m_pPlayer->ExecuteUseEvent(new CAllegianceHometownRecallUseEvent()); + if (!pPlayer->IsBusyOrInAction()) + pPlayer->ExecuteUseEvent(new CAllegianceHometownRecallUseEvent()); } else - m_pPlayer->NotifyWeenieError(WERROR_ALLEGIANCE_HOMETOWN_NOT_SET); + pPlayer->NotifyWeenieError(WERROR_ALLEGIANCE_HOMETOWN_NOT_SET); } void CClientEvents::HouseBuy(DWORD slumlord, const PackableList &items) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } if (std::shared_ptr slumlordObj = g_pWorld->FindObject(slumlord)) { - if (m_pPlayer->DistanceTo(slumlordObj, true) > 10.0) + if (pPlayer->DistanceTo(slumlordObj, true) > 10.0) return; if (std::shared_ptr slumlord = slumlordObj->AsSlumLord()) { - slumlord->BuyHouse(m_pPlayer, items); + slumlord->BuyHouse(pPlayer, items); } } } void CClientEvents::HouseRent(DWORD slumlord, const PackableList &items) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } if (std::shared_ptr slumlordObj = g_pWorld->FindObject(slumlord)) { - if (m_pPlayer->DistanceTo(slumlordObj, true) > 10.0) + if (pPlayer->DistanceTo(slumlordObj, true) > 10.0) return; if (std::shared_ptr slumlord = slumlordObj->AsSlumLord()) { - slumlord->RentHouse(m_pPlayer, items); + slumlord->RentHouse(pPlayer, items); } } } void CClientEvents::HouseAbandon() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData && houseData->_ownerId == m_pPlayer->GetID()) + if (houseData && houseData->_ownerId == pPlayer->GetID()) { houseData->AbandonHouse(); - m_pPlayer->SendText("You've abandoned your house.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("You've abandoned your house.", LTT_DEFAULT); //todo: made up message. } else - m_pPlayer->SendText("That house does not belong to you.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("That house does not belong to you.", LTT_DEFAULT); //todo: made up message. } else m_pClient->SendNetMessage(ServerText("You do not have a house!", 7), PRIVATE_MSG); @@ -1444,29 +1496,30 @@ void CClientEvents::HouseAbandon() void CClientEvents::HouseRecall() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - if (m_pPlayer->CheckPKActivity()) + if (pPlayer->CheckPKActivity()) { - m_pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); + pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); return; } - DWORD houseId = m_pPlayer->GetAccountHouseId(); + DWORD houseId = pPlayer->GetAccountHouseId(); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerAccount == m_pPlayer->GetClient()->GetAccountInfo().id) + if (houseData->_ownerAccount == pPlayer->GetClient()->GetAccountInfo().id) { - if (!m_pPlayer->IsBusyOrInAction()) - m_pPlayer->ExecuteUseEvent(new CHouseRecallUseEvent()); + if (!pPlayer->IsBusyOrInAction()) + pPlayer->ExecuteUseEvent(new CHouseRecallUseEvent()); } else - m_pPlayer->SendText("That house does not belong to you.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("That house does not belong to you.", LTT_DEFAULT); //todo: made up message. } else m_pClient->SendNetMessage(ServerText("You do not have a house!", 7), PRIVATE_MSG); @@ -1474,23 +1527,24 @@ void CClientEvents::HouseRecall() void CClientEvents::HouseMansionRecall() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - if (m_pPlayer->CheckPKActivity()) + if (pPlayer->CheckPKActivity()) { - m_pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); + pPlayer->SendText("You have been involved in Player Killer combat too recently!", LTT_MAGIC); return; } - AllegianceTreeNode *allegianceNode = g_pAllegianceManager->GetTreeNode(m_pPlayer->GetID()); + AllegianceTreeNode *allegianceNode = g_pAllegianceManager->GetTreeNode(pPlayer->GetID()); if (!allegianceNode) { - m_pPlayer->NotifyWeenieError(WERROR_ALLEGIANCE_NONEXISTENT); + pPlayer->NotifyWeenieError(WERROR_ALLEGIANCE_NONEXISTENT); return; } @@ -1512,8 +1566,8 @@ void CClientEvents::HouseMansionRecall() CHouseData *houseData = g_pHouseManager->GetHouseData(allegianceHouseId); if (houseData && houseData->_ownerId == allegianceNode->_monarchID && (houseData->_houseType == 2 || houseData->_houseType == 3)) //2 = villa, 3 = mansion { - if (!m_pPlayer->IsBusyOrInAction()) - m_pPlayer->ExecuteUseEvent(new CMansionRecallUseEvent()); + if (!pPlayer->IsBusyOrInAction()) + pPlayer->ExecuteUseEvent(new CMansionRecallUseEvent()); return; } } @@ -1526,86 +1580,89 @@ void CClientEvents::HouseMansionRecall() void CClientEvents::HouseRequestData() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) - g_pHouseManager->SendHouseData(m_pPlayer, houseId); + g_pHouseManager->SendHouseData(pPlayer, houseId); else { //if we can't get the data send the "no house" packet BinaryWriter noHouseData; noHouseData.Write(0x0226); noHouseData.Write(0); - m_pPlayer->SendNetMessage(&noHouseData, PRIVATE_MSG, TRUE, FALSE); + pPlayer->SendNetMessage(&noHouseData, PRIVATE_MSG, TRUE, FALSE); } } void CClientEvents::HouseToggleHooks(bool newSetting) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { houseData->SetHookVisibility(newSetting); if (newSetting) - m_pPlayer->SendText("Your dwelling's hooks are now visible.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your dwelling's hooks are now visible.", LTT_DEFAULT); //todo: made up message. else - m_pPlayer->SendText("Your dwelling's hooks are now hidden.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your dwelling's hooks are now hidden.", LTT_DEFAULT); //todo: made up message. } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseRequestAccessList() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { - m_pPlayer->SendText("Access:", LTT_DEFAULT); - m_pPlayer->SendText(csprintf(" Public: %s", houseData->_everyoneAccess ? "Allow" : "Deny"), LTT_DEFAULT); - m_pPlayer->SendText(csprintf(" Allegiance: %s", houseData->_allegianceAccess ? "Allow" : "Deny"), LTT_DEFAULT); + pPlayer->SendText("Access:", LTT_DEFAULT); + pPlayer->SendText(csprintf(" Public: %s", houseData->_everyoneAccess ? "Allow" : "Deny"), LTT_DEFAULT); + pPlayer->SendText(csprintf(" Allegiance: %s", houseData->_allegianceAccess ? "Allow" : "Deny"), LTT_DEFAULT); - m_pPlayer->SendText("Storage:", LTT_DEFAULT); - m_pPlayer->SendText(csprintf(" Public: %s", houseData->_everyoneStorageAccess ? "Allow" : "Deny"), LTT_DEFAULT); - m_pPlayer->SendText(csprintf(" Allegiance: %s", houseData->_allegianceStorageAccess ? "Allow" : "Deny"), LTT_DEFAULT); + pPlayer->SendText("Storage:", LTT_DEFAULT); + pPlayer->SendText(csprintf(" Public: %s", houseData->_everyoneStorageAccess ? "Allow" : "Deny"), LTT_DEFAULT); + pPlayer->SendText(csprintf(" Allegiance: %s", houseData->_allegianceStorageAccess ? "Allow" : "Deny"), LTT_DEFAULT); if (houseData->_accessList.empty()) - m_pPlayer->SendText("Your dwelling's acess list is empty.", LTT_DEFAULT); + pPlayer->SendText("Your dwelling's acess list is empty.", LTT_DEFAULT); else { - m_pPlayer->SendText("Access List:", LTT_DEFAULT); + pPlayer->SendText("Access List:", LTT_DEFAULT); std::list::iterator i = houseData->_accessList.begin(); while (i != houseData->_accessList.end()) { std::string name = g_pWorld->GetPlayerName(*(i), true); if (!name.empty()) { - m_pPlayer->SendText(csprintf(" %s", name.c_str()), LTT_DEFAULT); + pPlayer->SendText(csprintf(" %s", name.c_str()), LTT_DEFAULT); i++; } else @@ -1614,17 +1671,17 @@ void CClientEvents::HouseRequestAccessList() } if (houseData->_storageAccessList.empty()) - m_pPlayer->SendText("Your dwelling's storage access list is empty.", LTT_DEFAULT); + pPlayer->SendText("Your dwelling's storage access list is empty.", LTT_DEFAULT); else { - m_pPlayer->SendText("Storage Access list:", LTT_DEFAULT); + pPlayer->SendText("Storage Access list:", LTT_DEFAULT); std::list::iterator i = houseData->_storageAccessList.begin(); while (i != houseData->_storageAccessList.end()) { std::string name = g_pWorld->GetPlayerName(*(i), true); if (!name.empty()) { - m_pPlayer->SendText(csprintf(" %s", name.c_str()), LTT_DEFAULT); + pPlayer->SendText(csprintf(" %s", name.c_str()), LTT_DEFAULT); i++; } else @@ -1633,16 +1690,17 @@ void CClientEvents::HouseRequestAccessList() } } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseAddPersonToAccessList(std::string name) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -1650,42 +1708,43 @@ void CClientEvents::HouseAddPersonToAccessList(std::string name) DWORD targetId = g_pWorld->GetPlayerId(name.c_str(), true); if (!target) { - m_pPlayer->SendText("Can't find a player by that name.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Can't find a player by that name.", LTT_DEFAULT); //todo: made up message. return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { if (houseData->_accessList.size() > 128) { - m_pPlayer->SendText("The access list is full", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("The access list is full", LTT_DEFAULT); //todo: made up message. return; } if (std::find(houseData->_accessList.begin(), houseData->_accessList.end(), targetId) != houseData->_accessList.end()) { - m_pPlayer->SendText(csprintf("%s is already in the access list", name.c_str()), LTT_DEFAULT); //todo: made up message. + pPlayer->SendText(csprintf("%s is already in the access list", name.c_str()), LTT_DEFAULT); //todo: made up message. } else { - m_pPlayer->SendText(csprintf("You add %s to your dwelling's access list", name.c_str()), LTT_DEFAULT); //todo: made up message. + pPlayer->SendText(csprintf("You add %s to your dwelling's access list", name.c_str()), LTT_DEFAULT); //todo: made up message. houseData->_accessList.push_back(targetId); } } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseRemovePersonFromAccessList(std::string name) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -1693,108 +1752,111 @@ void CClientEvents::HouseRemovePersonFromAccessList(std::string name) DWORD targetId = g_pWorld->GetPlayerId(name.c_str(), true); if (!target) { - m_pPlayer->SendText("Can't find a player by that name.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Can't find a player by that name.", LTT_DEFAULT); //todo: made up message. return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { auto iter = std::find(houseData->_accessList.begin(), houseData->_accessList.end(), targetId); if (iter != houseData->_accessList.end()) { - m_pPlayer->SendText(csprintf("You remove %s from your dwelling's access list", name.c_str()), LTT_DEFAULT); //todo: made up message. + pPlayer->SendText(csprintf("You remove %s from your dwelling's access list", name.c_str()), LTT_DEFAULT); //todo: made up message. houseData->_accessList.erase(iter); } else { - m_pPlayer->SendText(csprintf("%s is not in the access list", name.c_str()), LTT_DEFAULT); //todo: made up message. + pPlayer->SendText(csprintf("%s is not in the access list", name.c_str()), LTT_DEFAULT); //todo: made up message. } } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseToggleOpenAccess(bool newSetting) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { if (houseData->_everyoneAccess != newSetting) { houseData->_everyoneAccess = newSetting; if (newSetting) - m_pPlayer->SendText("Your dwelling is now open to the public.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your dwelling is now open to the public.", LTT_DEFAULT); //todo: made up message. else - m_pPlayer->SendText("Your dwelling is now private.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your dwelling is now private.", LTT_DEFAULT); //todo: made up message. } else { if (newSetting) - m_pPlayer->SendText("Your dwelling is already open to the public.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your dwelling is already open to the public.", LTT_DEFAULT); //todo: made up message. else - m_pPlayer->SendText("Your dwelling is already private.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your dwelling is already private.", LTT_DEFAULT); //todo: made up message. } } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseToggleOpenStorageAccess() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } //not sure how this worked? Is this a toggle? If not which command was used to disable it? - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { if (!houseData->_everyoneStorageAccess) { - m_pPlayer->SendText("Your dwelling's storage is now open to the public.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your dwelling's storage is now open to the public.", LTT_DEFAULT); //todo: made up message. houseData->_everyoneStorageAccess = true; } else { - m_pPlayer->SendText("Your dwelling's storage is now private.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your dwelling's storage is now private.", LTT_DEFAULT); //todo: made up message. houseData->_everyoneStorageAccess = false; } } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseAddOrRemovePersonToStorageList(std::string name, bool isAdd) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -1802,30 +1864,30 @@ void CClientEvents::HouseAddOrRemovePersonToStorageList(std::string name, bool i DWORD targetId = g_pWorld->GetPlayerId(name.c_str(), true); if (!target) { - m_pPlayer->SendText("Can't find a player by that name.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Can't find a player by that name.", LTT_DEFAULT); //todo: made up message. return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { if (isAdd) { if (houseData->_accessList.size() > 128) { - m_pPlayer->SendText("The storage access list is full", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("The storage access list is full", LTT_DEFAULT); //todo: made up message. return; } if (std::find(houseData->_storageAccessList.begin(), houseData->_storageAccessList.end(), targetId) != houseData->_storageAccessList.end()) { - m_pPlayer->SendText(csprintf("%s is already in the storage access list", name.c_str()), LTT_DEFAULT); //todo: made up message. + pPlayer->SendText(csprintf("%s is already in the storage access list", name.c_str()), LTT_DEFAULT); //todo: made up message. } else { - m_pPlayer->SendText(csprintf("You add %s to your dwelling's storage access list", name.c_str()), LTT_DEFAULT); //todo: made up message. + pPlayer->SendText(csprintf("You add %s to your dwelling's storage access list", name.c_str()), LTT_DEFAULT); //todo: made up message. houseData->_storageAccessList.push_back(targetId); } } @@ -1834,162 +1896,167 @@ void CClientEvents::HouseAddOrRemovePersonToStorageList(std::string name, bool i auto iter = std::find(houseData->_storageAccessList.begin(), houseData->_storageAccessList.end(), targetId); if (iter != houseData->_storageAccessList.end()) { - m_pPlayer->SendText(csprintf("You remove %s from your dwelling's storage access list", name.c_str()), LTT_DEFAULT); //todo: made up message. + pPlayer->SendText(csprintf("You remove %s from your dwelling's storage access list", name.c_str()), LTT_DEFAULT); //todo: made up message. houseData->_storageAccessList.erase(iter); } else { - m_pPlayer->SendText(csprintf("%s is not in the storage access list", name.c_str()), LTT_DEFAULT); //todo: made up message. + pPlayer->SendText(csprintf("%s is not in the storage access list", name.c_str()), LTT_DEFAULT); //todo: made up message. } } } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseAddOrRemoveAllegianceToAccessList(bool isAdd) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { if (houseData->_allegianceAccess != isAdd) { houseData->_allegianceAccess = isAdd; if (isAdd) - m_pPlayer->SendText("You have granted your monarchy access to your dwelling.", LTT_DEFAULT); + pPlayer->SendText("You have granted your monarchy access to your dwelling.", LTT_DEFAULT); else - m_pPlayer->SendText("You have revoked access to your dwelling to your monarchy.", LTT_DEFAULT); + pPlayer->SendText("You have revoked access to your dwelling to your monarchy.", LTT_DEFAULT); } else { if (isAdd) - m_pPlayer->SendText("The monarchy already has access to your dwelling.", LTT_DEFAULT); + pPlayer->SendText("The monarchy already has access to your dwelling.", LTT_DEFAULT); else - m_pPlayer->SendText("The monarchy did not have access to your dwelling.", LTT_DEFAULT); + pPlayer->SendText("The monarchy did not have access to your dwelling.", LTT_DEFAULT); } } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseAddOrRemoveAllegianceToStorageList(bool isAdd) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { if (houseData->_allegianceStorageAccess != isAdd) { houseData->_allegianceStorageAccess = isAdd; if (isAdd) - m_pPlayer->SendText("You have granted your monarchy access to your storage.", LTT_DEFAULT); + pPlayer->SendText("You have granted your monarchy access to your storage.", LTT_DEFAULT); else - m_pPlayer->SendText("You have revoked storage access to your monarchy.", LTT_DEFAULT); + pPlayer->SendText("You have revoked storage access to your monarchy.", LTT_DEFAULT); } else { if (isAdd) - m_pPlayer->SendText("The monarchy already has storage access in your dwelling.", LTT_DEFAULT); + pPlayer->SendText("The monarchy already has storage access in your dwelling.", LTT_DEFAULT); else - m_pPlayer->SendText("The monarchy did not have storage access in your dwelling.", LTT_DEFAULT); + pPlayer->SendText("The monarchy did not have storage access in your dwelling.", LTT_DEFAULT); } } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseClearAccessList() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { houseData->_everyoneAccess = false; houseData->_allegianceAccess = false; if (houseData->_accessList.empty()) { houseData->_accessList.clear(); - m_pPlayer->SendText("Your clear the dwelling's access list.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your clear the dwelling's access list.", LTT_DEFAULT); //todo: made up message. } else - m_pPlayer->SendText("There's no one in the dwelling's access list.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("There's no one in the dwelling's access list.", LTT_DEFAULT); //todo: made up message. } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::HouseClearStorageAccess() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } - DWORD houseId = m_pPlayer->InqDIDQuality(HOUSEID_DID, 0); + DWORD houseId = pPlayer->InqDIDQuality(HOUSEID_DID, 0); if (houseId) { CHouseData *houseData = g_pHouseManager->GetHouseData(houseId); - if (houseData->_ownerId == m_pPlayer->GetID()) + if (houseData->_ownerId == pPlayer->GetID()) { houseData->_everyoneStorageAccess = false; houseData->_allegianceStorageAccess = false; if (houseData->_storageAccessList.empty()) { houseData->_storageAccessList.clear(); - m_pPlayer->SendText("Your clear the dwelling's storage list.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("Your clear the dwelling's storage list.", LTT_DEFAULT); //todo: made up message. } else - m_pPlayer->SendText("There's no one in the dwelling's storage list.", LTT_DEFAULT); //todo: made up message. + pPlayer->SendText("There's no one in the dwelling's storage list.", LTT_DEFAULT); //todo: made up message. } else - m_pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); + pPlayer->SendText("Only the character who owns the house may use this command.", LTT_DEFAULT); } else - m_pPlayer->SendText("You do not own a house.", LTT_DEFAULT); + pPlayer->SendText("You do not own a house.", LTT_DEFAULT); } void CClientEvents::NoLongerViewingContents(DWORD container_id) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } @@ -1998,31 +2065,32 @@ void CClientEvents::NoLongerViewingContents(DWORD container_id) { if (std::shared_ptr remoteContainer = remoteContainerObj->AsContainer()) { - remoteContainer->HandleNoLongerViewing(m_pPlayer); + remoteContainer->HandleNoLongerViewing(pPlayer); } } } void CClientEvents::ChangePlayerOption(PlayerOptions option, bool value) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return; } auto changeCharOption = [&](DWORD optionBit) { - m_pPlayer->_playerModule.options_ &= ~optionBit; + pPlayer->_playerModule.options_ &= ~optionBit; if (value) - m_pPlayer->_playerModule.options_ |= optionBit; + pPlayer->_playerModule.options_ |= optionBit; }; auto changeCharOption2 = [&](DWORD optionBit) { - m_pPlayer->_playerModule.options2_ &= ~optionBit; + pPlayer->_playerModule.options2_ &= ~optionBit; if (value) - m_pPlayer->_playerModule.options2_ |= optionBit; + pPlayer->_playerModule.options2_ |= optionBit; }; switch (option) @@ -2269,8 +2337,9 @@ void CClientEvents::ChangePlayerOption(PlayerOptions option, bool value) bool CClientEvents::CheckForChatSpam() { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer) + if (!pPlayer) { return false; } @@ -2290,7 +2359,7 @@ bool CClientEvents::CheckForChatSpam() if (_num_chat_sent > 8) { _next_chat_allowed = Timer::cur_time + 10.0; - m_pPlayer->SendText("You are sending too many messages and have been temporarily muted.", LTT_DEFAULT); + pPlayer->SendText("You are sending too many messages and have been temporarily muted.", LTT_DEFAULT); return false; } @@ -2300,8 +2369,9 @@ bool CClientEvents::CheckForChatSpam() // This is it! void CClientEvents::ProcessEvent(BinaryReader *pReader) { + std::shared_ptr pPlayer = m_pPlayer.lock(); - if (!m_pPlayer || !pReader) + if (!pPlayer || !pReader) { return; } @@ -2361,7 +2431,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) DWORD dwSlot = pReader->ReadDWORD(); if (pReader->GetLastError()) break; - m_pPlayer->MoveItemToContainer(dwItemID, dwContainer, (char)dwSlot); + pPlayer->MoveItemToContainer(dwItemID, dwContainer, (char)dwSlot); break; } case 0x001A: //Equip Item @@ -2370,7 +2440,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) DWORD dwCoverage = pReader->ReadDWORD(); if (pReader->GetLastError()) break; - m_pPlayer->MoveItemToWield(dwItemID, dwCoverage); + pPlayer->MoveItemToWield(dwItemID, dwCoverage); break; } case 0x001B: //Drop Item @@ -2378,7 +2448,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) DWORD dwItemID = pReader->ReadDWORD(); if (pReader->GetLastError()) break; - m_pPlayer->MoveItemTo3D(dwItemID); + pPlayer->MoveItemTo3D(dwItemID); break; } case 0x001D: // Swear Allegiance request @@ -2417,7 +2487,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) case 0x05: // crafting if (accepted) { - m_pPlayer->UseEx(true); + pPlayer->UseEx(true); } break; } @@ -2435,7 +2505,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) break; if (items.size() <= 300) //just some sanity checking: 102 items in main pack + (24 * 7) items in subpacks = 270 items. 300 just to be safe. - m_pPlayer->PerformSalvaging(toolId, items); + pPlayer->PerformSalvaging(toolId, items); break; } case 0x0032: //Send Tell by GUID @@ -2510,7 +2580,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) DWORD spell_id = pReader->ReadDWORD(); if (pReader->GetLastError()) break; - m_pPlayer->TryCastSpell(m_pPlayer->GetID() /*0*/, spell_id); + pPlayer->TryCastSpell(pPlayer->GetID() /*0*/, spell_id); break; } case 0x004A: // cast targeted spell @@ -2519,7 +2589,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) DWORD spell_id = pReader->ReadDWORD(); if (pReader->GetLastError()) break; - m_pPlayer->TryCastSpell(target, spell_id); + pPlayer->TryCastSpell(target, spell_id); break; } case 0x0053: // Evt_Combat__ChangeCombatMode_ID "Change Combat Mode" @@ -2539,7 +2609,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->MergeItem(merge_from_id, merge_to_id, amount); + pPlayer->MergeItem(merge_from_id, merge_to_id, amount); break; } case 0x0055: // Evt_Inventory__StackableSplitToContainer @@ -2552,7 +2622,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->SplitItemToContainer(stack_id, container_id, place, amount); + pPlayer->SplitItemToContainer(stack_id, container_id, place, amount); break; } case 0x0056: // Evt_Inventory__StackableSplitTo3D @@ -2563,7 +2633,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->SplitItemto3D(stack_id, amount); + pPlayer->SplitItemto3D(stack_id, amount); break; } case 0x019B: // Evt_Inventory__StackableSplitToWield @@ -2575,7 +2645,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->SplitItemToWield(stack_id, loc, amount); + pPlayer->SplitItemToWield(stack_id, loc, amount); break; } case 0x005D: //Send Tell by Name @@ -2725,7 +2795,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->GiveItem(target_id, object_id, amount); + pPlayer->GiveItem(target_id, object_id, amount); break; } case 0x00BF: // "Inscribe" @@ -2751,7 +2821,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) } case 0x00D6: // Advocate teleport (triggered by having an admin flag set, clicking the mini-map) { - if (m_pPlayer->GetAccessLevel() < ADVOCATE_ACCESS) + if (pPlayer->GetAccessLevel() < ADVOCATE_ACCESS) break; // Starts with string (was empty when I tested) @@ -2764,7 +2834,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->Movement_Teleport(position); + pPlayer->Movement_Teleport(position); break; } case 0x0147: // Channel Text @@ -2799,7 +2869,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->_playerModule.AddShortCut(data); + pPlayer->_playerModule.AddShortCut(data); break; } case 0x019D: // Add item to shortcut bar @@ -2808,7 +2878,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->_playerModule.RemoveShortCut(index); + pPlayer->_playerModule.RemoveShortCut(index); break; } case 0x01A1: @@ -2818,13 +2888,13 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) break; SendText("Updating character configuration.", LTT_SYSTEM_EVENT); - m_pPlayer->UpdateModuleFromClient(module); + pPlayer->UpdateModuleFromClient(module); break; } case 0x01B7: // Cancel attack { // TODO - m_pPlayer->TryCancelAttack(); + pPlayer->TryCancelAttack(); break; } case 0x01BF: // Request health update @@ -2875,7 +2945,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->_playerModule.AddSpellFavorite(spellID, index, spellBar); + pPlayer->_playerModule.AddSpellFavorite(spellID, index, spellBar); break; } case 0x01E4: // Remove item from spell bar @@ -2885,7 +2955,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->_playerModule.RemoveSpellFavorite(spellID, spellBar); + pPlayer->_playerModule.RemoveSpellFavorite(spellID, spellBar); break; } case 0x01E9: // Ping @@ -2895,18 +2965,18 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) } case 0x1F6: // Open Trade Negotiations { - if (m_pPlayer->GetTradeManager() != NULL) + if (pPlayer->GetTradeManager() != NULL) { //already trading return; } - std::shared_ptr pOther = g_pWorld->FindWithinPVS(m_pPlayer, pReader->Read())->AsPlayer(); + std::shared_ptr pOther = g_pWorld->FindWithinPVS(pPlayer, pReader->Read())->AsPlayer(); if (!pOther) { // cannot open trade - m_pPlayer->SendText("Unable to open trade.", LTT_ERROR); + pPlayer->SendText("Unable to open trade.", LTT_ERROR); } else if (pOther->_playerModule.options_ & 0x20000) { @@ -2920,64 +2990,64 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) { SendText((pOther->GetName() + " is already trading with someone else!").c_str(), LTT_ERROR); } - else if (m_pPlayer->DistanceTo(pOther, true) > 1) + else if (pPlayer->DistanceTo(pOther, true) > 1) { SendText((pOther->GetName() + " is too far away!").c_str(), LTT_ERROR); } else { - TradeManager *tm = TradeManager::RegisterTrade(m_pPlayer, pOther); + TradeManager *tm = TradeManager::RegisterTrade(pPlayer, pOther); - m_pPlayer->SetTradeManager(tm); + pPlayer->SetTradeManager(tm); pOther->SetTradeManager(tm); } break; } case 0x1F7: // Close Trade Negotiations { - TradeManager* tm = m_pPlayer->GetTradeManager(); + TradeManager* tm = pPlayer->GetTradeManager(); if (tm) { - tm->CloseTrade(m_pPlayer); + tm->CloseTrade(pPlayer); return; } break; } case 0x1F8: // AddToTrade { - TradeManager* tm = m_pPlayer->GetTradeManager(); + TradeManager* tm = pPlayer->GetTradeManager(); if (tm) { DWORD item = pReader->Read(); - tm->AddToTrade(m_pPlayer, item); + tm->AddToTrade(pPlayer, item); } break; } case 0x1FA: // Accept trade { - TradeManager* tm = m_pPlayer->GetTradeManager(); + TradeManager* tm = pPlayer->GetTradeManager(); if (tm) { - tm->AcceptTrade(m_pPlayer); + tm->AcceptTrade(pPlayer); } break; } case 0x1FB: // Decline trade { - TradeManager* tm = m_pPlayer->GetTradeManager(); + TradeManager* tm = pPlayer->GetTradeManager(); if (tm) { - tm->DeclineTrade(m_pPlayer); + tm->DeclineTrade(pPlayer); } break; } case 0x204: // Reset trade { - TradeManager* tm = m_pPlayer->GetTradeManager(); + TradeManager* tm = pPlayer->GetTradeManager(); if (tm) { - tm->ResetTrade(m_pPlayer); + tm->ResetTrade(pPlayer); } break; } @@ -3097,7 +3167,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->HandleItemManaRequest(itemId); + pPlayer->HandleItemManaRequest(itemId); break; } case 0x0266: // House_SetHooksVisibility @@ -3137,11 +3207,11 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) } case 0x0279: // "/die" command { - if (!m_pPlayer->IsDead() && !m_pPlayer->IsInPortalSpace() && !m_pPlayer->IsBusyOrInAction()) + if (!pPlayer->IsDead() && !pPlayer->IsInPortalSpace() && !pPlayer->IsBusyOrInAction()) { // this is a bad way of doing this... - m_pPlayer->SetHealth(0, true); - m_pPlayer->OnDeath(m_pPlayer->GetID()); + pPlayer->SetHealth(0, true); + pPlayer->OnDeath(pPlayer->GetID()); } break; @@ -3161,7 +3231,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - m_pPlayer->_playerModule.spell_filters_ = filters; + pPlayer->_playerModule.spell_filters_ = filters; break; } case 0x028D: // Marketplace Recall @@ -3207,97 +3277,97 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - // CTransition *transition = m_pPlayer->transition(&m_pPlayer->m_Position, &position, 0); + // CTransition *transition = pPlayer->transition(&pPlayer->m_Position, &position, 0); /* - CTransition *transit = m_pPlayer->transition(&m_pPlayer->m_Position, &position, 0); + CTransition *transit = pPlayer->transition(&pPlayer->m_Position, &position, 0); if (transit) { - m_pPlayer->SetPositionInternal(transit); + pPlayer->SetPositionInternal(transit); } */ /* - double dist = m_pPlayer->m_Position.distance(position); + double dist = pPlayer->m_Position.distance(position); if (dist >= 5) { - m_pPlayer->_force_position_timestamp++; - m_pPlayer->Movement_UpdatePos(); + pPlayer->_force_position_timestamp++; + pPlayer->Movement_UpdatePos(); - m_pPlayer->SendText(csprintf("Correcting position due to jump %f", dist), LTT_DEFAULT); + pPlayer->SendText(csprintf("Correcting position due to jump %f", dist), LTT_DEFAULT); } */ - double dist = m_pPlayer->m_Position.distance(position); + double dist = pPlayer->m_Position.distance(position); if (dist >= 10) { // Snap them back to their previous position - m_pPlayer->_force_position_timestamp++; + pPlayer->_force_position_timestamp++; } else { - m_pPlayer->SetPositionSimple(&position, TRUE); + pPlayer->SetPositionSimple(&position, TRUE); /* - CTransition *transit = m_pPlayer->transition(&m_pPlayer->m_Position, &position, 0); + CTransition *transit = pPlayer->transition(&pPlayer->m_Position, &position, 0); if (transit) { - m_pPlayer->SetPositionInternal(transit); + pPlayer->SetPositionInternal(transit); } */ } - // m_pPlayer->m_Position = position; + // pPlayer->m_Position = position; /* long stamina = 0; - m_pPlayer->get_minterp()->jump(extent, stamina); + pPlayer->get_minterp()->jump(extent, stamina); if (stamina > 0) { - unsigned int curStamina = m_pPlayer->GetStamina(); + unsigned int curStamina = pPlayer->GetStamina(); if (stamina > curStamina) { // should maybe change the extent? idk - m_pPlayer->SetStamina(0); + pPlayer->SetStamina(0); } else - m_pPlayer->SetStamina(curStamina - stamina); + pPlayer->SetStamina(curStamina - stamina); } - m_pPlayer->Animation_Jump(extent, jumpVelocity); - m_pPlayer->m_bAnimUpdate = TRUE; + pPlayer->Animation_Jump(extent, jumpVelocity); + pPlayer->m_bAnimUpdate = TRUE; */ long stamina = 0; - if (m_pPlayer->JumpStaminaCost(extent, stamina) && stamina > 0) + if (pPlayer->JumpStaminaCost(extent, stamina) && stamina > 0) { - unsigned int curStamina = m_pPlayer->GetStamina(); + unsigned int curStamina = pPlayer->GetStamina(); if (stamina > curStamina) { // should maybe change the extent? idk - m_pPlayer->SetStamina(0); + pPlayer->SetStamina(0); } else - m_pPlayer->SetStamina(curStamina - stamina); + pPlayer->SetStamina(curStamina - stamina); } - m_pPlayer->transient_state &= ~((DWORD)TransientState::CONTACT_TS); - m_pPlayer->transient_state &= ~((DWORD)WATER_CONTACT_TS); - m_pPlayer->calc_acceleration(); - m_pPlayer->set_on_walkable(FALSE); - m_pPlayer->set_local_velocity(jumpVelocity, 0); + pPlayer->transient_state &= ~((DWORD)TransientState::CONTACT_TS); + pPlayer->transient_state &= ~((DWORD)WATER_CONTACT_TS); + pPlayer->calc_acceleration(); + pPlayer->set_on_walkable(FALSE); + pPlayer->set_local_velocity(jumpVelocity, 0); /* - Vector localVel = m_pPlayer->get_local_physics_velocity(); - Vector vel = m_pPlayer->m_velocityVector; - m_pPlayer->EmoteLocal(csprintf("Received jump with velocity %.1f %.1f %.1f (my lv: %.1f %.1f %.1f my v: %.1f %.1f %.1f)", + Vector localVel = pPlayer->get_local_physics_velocity(); + Vector vel = pPlayer->m_velocityVector; + pPlayer->EmoteLocal(csprintf("Received jump with velocity %.1f %.1f %.1f (my lv: %.1f %.1f %.1f my v: %.1f %.1f %.1f)", jumpVelocity.x, jumpVelocity.y, jumpVelocity.z, localVel.x, localVel.y, localVel.z, vel.x, vel.y, vel.z)); */ - m_pPlayer->Movement_UpdateVector(); + pPlayer->Movement_UpdateVector(); break; } @@ -3315,96 +3385,96 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) break; } - //if (is_newer_event_stamp(moveToState.server_control_timestamp, m_pPlayer->_server_control_timestamp)) + //if (is_newer_event_stamp(moveToState.server_control_timestamp, pPlayer->_server_control_timestamp)) //{ // LOG(Temp, Normal, "Old server control timestamp on 0xF61C. Ignoring.\n"); // break; //} - if (is_newer_event_stamp(moveToState.teleport_timestamp, m_pPlayer->_teleport_timestamp)) + if (is_newer_event_stamp(moveToState.teleport_timestamp, pPlayer->_teleport_timestamp)) { SERVER_WARN << "Old teleport timestamp on 0xF61C. Ignoring."; break; } - if (is_newer_event_stamp(moveToState.force_position_ts, m_pPlayer->_force_position_timestamp)) + if (is_newer_event_stamp(moveToState.force_position_ts, pPlayer->_force_position_timestamp)) { SERVER_WARN << "Old force position timestamp on 0xF61C. Ignoring."; break; } - if (m_pPlayer->IsDead()) + if (pPlayer->IsDead()) { SERVER_WARN << "Dead players can't move. Ignoring."; break; } /* - CTransition *transit = m_pPlayer->transition(&m_pPlayer->m_Position, &moveToState.position, 0); + CTransition *transit = pPlayer->transition(&pPlayer->m_Position, &moveToState.position, 0); if (transit) { - m_pPlayer->SetPositionInternal(transit); + pPlayer->SetPositionInternal(transit); } */ /* - double dist = m_pPlayer->m_Position.distance(moveToState.position); + double dist = pPlayer->m_Position.distance(moveToState.position); if (dist >= 5) { - m_pPlayer->_force_position_timestamp++; - m_pPlayer->Movement_UpdatePos(); + pPlayer->_force_position_timestamp++; + pPlayer->Movement_UpdatePos(); - m_pPlayer->SendText(csprintf("Correcting position due to state %f", dist), LTT_DEFAULT); + pPlayer->SendText(csprintf("Correcting position due to state %f", dist), LTT_DEFAULT); } */ /* - bool bHasCell = m_pPlayer->cell ? true : false; - m_pPlayer->SetPositionSimple(&moveToState.position, TRUE); - if (!m_pPlayer->cell && bHasCell) + bool bHasCell = pPlayer->cell ? true : false; + pPlayer->SetPositionSimple(&moveToState.position, TRUE); + if (!pPlayer->cell && bHasCell) { - m_pPlayer->SendText("Damnet...", LTT_DEFAULT); + pPlayer->SendText("Damnet...", LTT_DEFAULT); } */ - double dist = m_pPlayer->m_Position.distance(moveToState.position); + double dist = pPlayer->m_Position.distance(moveToState.position); if (dist >= 10) { // Snap them back to their previous position - m_pPlayer->_force_position_timestamp++; + pPlayer->_force_position_timestamp++; } else { - m_pPlayer->SetPositionSimple(&moveToState.position, TRUE); + pPlayer->SetPositionSimple(&moveToState.position, TRUE); /* - CTransition *transit = m_pPlayer->transition(&m_pPlayer->m_Position, &moveToState.position, 0); + CTransition *transit = pPlayer->transition(&pPlayer->m_Position, &moveToState.position, 0); if (transit) { - m_pPlayer->SetPositionInternal(transit); + pPlayer->SetPositionInternal(transit); } */ } - // m_pPlayer->m_Position = moveToState.position; // should interpolate to this, but oh well + // pPlayer->m_Position = moveToState.position; // should interpolate to this, but oh well /* if (moveToState.contact) { - m_pPlayer->transient_state |= ((DWORD)TransientState::CONTACT_TS); + pPlayer->transient_state |= ((DWORD)TransientState::CONTACT_TS); } else { - m_pPlayer->transient_state &= ~((DWORD)TransientState::CONTACT_TS); - m_pPlayer->transient_state &= ~((DWORD)WATER_CONTACT_TS); + pPlayer->transient_state &= ~((DWORD)TransientState::CONTACT_TS); + pPlayer->transient_state &= ~((DWORD)WATER_CONTACT_TS); } - m_pPlayer->calc_acceleration(); - m_pPlayer->set_on_walkable(moveToState.contact); + pPlayer->calc_acceleration(); + pPlayer->set_on_walkable(moveToState.contact); - m_pPlayer->get_minterp()->standing_longjump = moveToState.longjump_mode ? TRUE : FALSE; + pPlayer->get_minterp()->standing_longjump = moveToState.longjump_mode ? TRUE : FALSE; */ - m_pPlayer->last_move_was_autonomous = true; - m_pPlayer->cancel_moveto(); + pPlayer->last_move_was_autonomous = true; + pPlayer->cancel_moveto(); if (!(moveToState.raw_motion_state.current_style & CM_Style) && moveToState.raw_motion_state.current_style) { @@ -3430,7 +3500,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) break; } - CMotionInterp *minterp = m_pPlayer->get_minterp(); + CMotionInterp *minterp = pPlayer->get_minterp(); minterp->raw_state = moveToState.raw_motion_state; minterp->apply_raw_movement(TRUE, minterp->motion_allows_jump(minterp->interpreted_state.forward_command != 0)); @@ -3438,7 +3508,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) for (const auto &actionNew : moveToState.raw_motion_state.actions) { - if (m_pPlayer->get_minterp()->interpreted_state.GetNumActions() >= MAX_EMOTE_QUEUE) + if (pPlayer->get_minterp()->interpreted_state.GetNumActions() >= MAX_EMOTE_QUEUE) break; if (is_newer_event_stamp(newestActionStamp, actionNew.stamp)) @@ -3452,25 +3522,25 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) } MovementParameters params; - params.action_stamp = ++m_pPlayer->m_wAnimSequence; + params.action_stamp = ++pPlayer->m_wAnimSequence; params.autonomous = 1; params.speed = actionNew.speed; - m_pPlayer->get_minterp()->DoMotion(commandID, ¶ms); + pPlayer->get_minterp()->DoMotion(commandID, ¶ms); - // minterp->interpreted_state.AddAction(ActionNode(actionNew.action, actionNew.speed, ++m_pPlayer->m_wAnimSequence, TRUE)); + // minterp->interpreted_state.AddAction(ActionNode(actionNew.action, actionNew.speed, ++pPlayer->m_wAnimSequence, TRUE)); // newestActionStamp = actionNew.stamp; - // m_pPlayer->Animation_PlayEmote(actionNew.action, actionNew.speed); + // pPlayer->Animation_PlayEmote(actionNew.action, actionNew.speed); } } m_MoveActionStamp = newestActionStamp; - // m_pPlayer->Movement_UpdatePos(); - m_pPlayer->Animation_Update(); - // m_pPlayer->m_bAnimUpdate = TRUE; + // pPlayer->Movement_UpdatePos(); + pPlayer->Animation_Update(); + // pPlayer->m_bAnimUpdate = TRUE; - // m_pPlayer->Movement_UpdatePos(); + // pPlayer->Movement_UpdatePos(); break; } case 0xF753: // Update Exact Position @@ -3483,7 +3553,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - if (instance != m_pPlayer->_instance_timestamp) + if (instance != pPlayer->_instance_timestamp) { SERVER_WARN << "Bad instance."; break; @@ -3492,7 +3562,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) WORD server_control_timestamp = pReader->ReadWORD(); if (pReader->GetLastError()) break; - //if (is_newer_event_stamp(server_control_timestamp, m_pPlayer->_server_control_timestamp)) + //if (is_newer_event_stamp(server_control_timestamp, pPlayer->_server_control_timestamp)) //{ // LOG(Temp, Normal, "Old server control timestamp. Ignoring.\n"); // break; @@ -3501,7 +3571,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) WORD teleport_timestamp = pReader->ReadWORD(); if (pReader->GetLastError()) break; - if (is_newer_event_stamp(teleport_timestamp, m_pPlayer->_teleport_timestamp)) + if (is_newer_event_stamp(teleport_timestamp, pPlayer->_teleport_timestamp)) { SERVER_WARN << "Old teleport timestamp. Ignoring."; break; @@ -3510,7 +3580,7 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) WORD force_position_ts = pReader->ReadWORD(); if (pReader->GetLastError()) break; - if (is_newer_event_stamp(force_position_ts, m_pPlayer->_force_position_timestamp)) + if (is_newer_event_stamp(force_position_ts, pPlayer->_force_position_timestamp)) { SERVER_WARN << "Old force position timestamp. Ignoring."; break; @@ -3520,56 +3590,56 @@ void CClientEvents::ProcessEvent(BinaryReader *pReader) if (pReader->GetLastError()) break; - double dist =m_pPlayer->m_Position.distance(position); + double dist =pPlayer->m_Position.distance(position); if (dist >= 10) { // Snap them back to their previous position - m_pPlayer->_force_position_timestamp++; - // m_pPlayer->SendText(csprintf("Correcting position due to position update %f", dist), LTT_DEFAULT); + pPlayer->_force_position_timestamp++; + // pPlayer->SendText(csprintf("Correcting position due to position update %f", dist), LTT_DEFAULT); } else { /* - CTransition *transit = m_pPlayer->transition(&m_pPlayer->m_Position, &position, 0); + CTransition *transit = pPlayer->transition(&pPlayer->m_Position, &position, 0); if (transit) { - m_pPlayer->SetPositionInternal(transit); + pPlayer->SetPositionInternal(transit); */ /* - double distFromClient = m_pPlayer->m_Position.distance(position); + double distFromClient = pPlayer->m_Position.distance(position); if (distFromClient >= 3.0) { - m_pPlayer->_force_position_timestamp++; + pPlayer->_force_position_timestamp++; } } */ - m_pPlayer->SetPositionSimple(&position, TRUE); + pPlayer->SetPositionSimple(&position, TRUE); /* - if (!m_pPlayer->cell && bHasCell) + if (!pPlayer->cell && bHasCell) { - m_pPlayer->SendText("Damnet...", LTT_DEFAULT); + pPlayer->SendText("Damnet...", LTT_DEFAULT); } */ - // m_pPlayer->m_Position = position; // should interpolate this, not set this directly, but oh well + // pPlayer->m_Position = position; // should interpolate this, not set this directly, but oh well } if (bHasContact) { - m_pPlayer->transient_state |= ((DWORD)TransientState::CONTACT_TS); + pPlayer->transient_state |= ((DWORD)TransientState::CONTACT_TS); } else { - m_pPlayer->transient_state &= ~((DWORD)TransientState::CONTACT_TS); - m_pPlayer->transient_state &= ~((DWORD)WATER_CONTACT_TS); + pPlayer->transient_state &= ~((DWORD)TransientState::CONTACT_TS); + pPlayer->transient_state &= ~((DWORD)WATER_CONTACT_TS); } - m_pPlayer->calc_acceleration(); - m_pPlayer->set_on_walkable(bHasContact); + pPlayer->calc_acceleration(); + pPlayer->set_on_walkable(bHasContact); - m_pPlayer->Movement_UpdatePos(); + pPlayer->Movement_UpdatePos(); break; } default: diff --git a/Source/ClientEvents.h b/Source/ClientEvents.h index a502be9..bb9758b 100644 --- a/Source/ClientEvents.h +++ b/Source/ClientEvents.h @@ -120,7 +120,7 @@ public: private: CClient *m_pClient; - std::shared_ptr m_pPlayer; + std::weak_ptr m_pPlayer; WORD m_MoveActionStamp = 0xFFFF; diff --git a/Source/Container.cpp b/Source/Container.cpp index 3c71539..5982272 100644 --- a/Source/Container.cpp +++ b/Source/Container.cpp @@ -12,31 +12,31 @@ CContainerWeenie::CContainerWeenie() { for (DWORD i = 0; i < MAX_WIELDED_COMBAT; i++) - m_WieldedCombat[i] = NULL; + m_WieldedCombat[i] = std::shared_ptr(); } CContainerWeenie::~CContainerWeenie() { for (DWORD i = 0; i < MAX_WIELDED_COMBAT; i++) - m_WieldedCombat[i] = NULL; + m_WieldedCombat[i] = std::shared_ptr(); for (auto item : m_Wielded) { - g_pWorld->RemoveEntity(item); + g_pWorld->RemoveEntity(item.lock()); } m_Wielded.clear(); for (auto item : m_Items) { - g_pWorld->RemoveEntity(item); + g_pWorld->RemoveEntity(item.lock()); } m_Items.clear(); for (auto container : m_Packs) { - g_pWorld->RemoveEntity(container); + g_pWorld->RemoveEntity(container.lock()); } m_Packs.clear(); @@ -84,9 +84,11 @@ std::shared_ptr CContainerWeenie::FindContainer(DWORD containe for (auto pack : m_Packs) { - if (pack->GetID() == container_id) + std::shared_ptr pPack = pack.lock(); + + if (pPack && pPack->GetID() == container_id) { - if (std::shared_ptr packContainer = pack->AsContainer()) + if (std::shared_ptr packContainer = pPack->AsContainer()) { return packContainer; } @@ -115,7 +117,7 @@ std::shared_ptr CContainerWeenie::GetWieldedCombat(COMBAT_USE com if (index < 0 || index >= MAX_WIELDED_COMBAT) return NULL; - return m_WieldedCombat[index]; + return m_WieldedCombat[index].lock(); } void CContainerWeenie::SetWieldedCombat(std::shared_ptr wielded, COMBAT_USE combatUse) @@ -158,8 +160,10 @@ std::shared_ptr CContainerWeenie::GetWieldedCaster() { for (auto item : m_Wielded) { - if (item->AsCaster()) - return item; + std::shared_ptr pItem = item.lock(); + + if (pItem && pItem->AsCaster()) + return pItem; } return NULL; @@ -169,8 +173,10 @@ void CContainerWeenie::Container_GetWieldedByMask(std::listInqIntQuality(CURRENT_WIELDED_LOCATION_INT, 0, TRUE) & inv_loc_mask) - wielded.push_back(item); + std::shared_ptr pItem = item.lock(); + + if (pItem && pItem->InqIntQuality(CURRENT_WIELDED_LOCATION_INT, 0, TRUE) & inv_loc_mask) + wielded.push_back(pItem); } } @@ -178,8 +184,10 @@ std::shared_ptr CContainerWeenie::GetWielded(INVENTORY_LOC slot) { for (auto item : m_Wielded) { - if (item->InqIntQuality(CURRENT_WIELDED_LOCATION_INT, 0, TRUE) == slot) - return item; + std::shared_ptr pItem = item.lock(); + + if (pItem && pItem->InqIntQuality(CURRENT_WIELDED_LOCATION_INT, 0, TRUE) == slot) + return pItem; } return NULL; @@ -192,13 +200,13 @@ void CContainerWeenie::ReleaseContainedItemRecursive(std::shared_ptr(); } - for (std::vector >::iterator equipmentIterator = m_Wielded.begin(); equipmentIterator != m_Wielded.end();) + for (std::vector >::iterator equipmentIterator = m_Wielded.begin(); equipmentIterator != m_Wielded.end();) { - if (*equipmentIterator != item) + if (equipmentIterator->lock() != item) { equipmentIterator++; continue; @@ -207,9 +215,9 @@ void CContainerWeenie::ReleaseContainedItemRecursive(std::shared_ptr >::iterator itemIterator = m_Items.begin(); itemIterator != m_Items.end();) + for (std::vector >::iterator itemIterator = m_Items.begin(); itemIterator != m_Items.end();) { - if (*itemIterator != item) + if (itemIterator->lock() != item) { itemIterator++; continue; @@ -218,9 +226,9 @@ void CContainerWeenie::ReleaseContainedItemRecursive(std::shared_ptr >::iterator packIterator = m_Packs.begin(); packIterator != m_Packs.end();) + for (std::vector >::iterator packIterator = m_Packs.begin(); packIterator != m_Packs.end();) { - std::shared_ptr pack = *packIterator; + std::shared_ptr pack = packIterator->lock(); if (pack != item) { @@ -255,10 +263,12 @@ BOOL CContainerWeenie::Container_CanEquip(std::shared_ptr item, D for (auto wielded : m_Wielded) { - if (wielded == item) + std::shared_ptr pWielded = wielded.lock(); + + if (pWielded == item) return TRUE; - if (!wielded->CanEquipWith(item, location)) + if (pWielded && !pWielded->CanEquipWith(item, location)) return FALSE; } @@ -273,7 +283,9 @@ void CContainerWeenie::Container_EquipItem(DWORD dwCell, std::shared_ptr pWielded = entry.lock(); + + if (pWielded == item) { bAlreadyEquipped = true; break; @@ -337,22 +349,33 @@ std::shared_ptr CContainerWeenie::FindContainedItem(DWORD object_ { for (auto item : m_Wielded) { - if (item->GetID() == object_id) - return item; + std::shared_ptr pItem = item.lock(); + + if (pItem && pItem->GetID() == object_id) + return pItem; } for (auto item : m_Items) { - if (item->GetID() == object_id) - return item; + std::shared_ptr pItem = item.lock(); + + if (pItem && pItem->GetID() == object_id) + return pItem; } for (auto item : m_Packs) { - if (item->GetID() == object_id) - return item; + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->GetID() == object_id) + return pItem; - if (auto subitem = item->FindContainedItem(object_id)) + if (auto subitem = pItem->FindContainedItem(object_id)) return subitem; } @@ -417,7 +440,7 @@ BOOL CContainerWeenie::Container_CanStore(std::shared_ptr pItem, for (auto container : m_Packs) { - if (container == pItem) + if (container.lock() == pItem) return TRUE; } @@ -447,7 +470,7 @@ BOOL CContainerWeenie::Container_CanStore(std::shared_ptr pItem, for (auto container : m_Items) { - if (container == pItem) + if (container.lock() == pItem) return TRUE; } @@ -589,16 +612,18 @@ bool CContainerWeenie::SpawnInContainer(DWORD wcid, int amount, int ptid, float //If we're stackable, first let's try stacking to existing items. for (auto possibleMatch : m_Items) { - if (item->m_Qualities.id != possibleMatch->m_Qualities.id) + std::shared_ptr pPossibleMatch = possibleMatch.lock(); + + if (item->m_Qualities.id != pPossibleMatch->m_Qualities.id) continue; - if (ptid != 0 && possibleMatch->InqIntQuality(PALETTE_TEMPLATE_INT, 0) != ptid) + if (ptid != 0 && pPossibleMatch->InqIntQuality(PALETTE_TEMPLATE_INT, 0) != ptid) continue; - if (shade >= 0.0 && possibleMatch->InqFloatQuality(SHADE_FLOAT, 0) != shade) + if (shade >= 0.0 && pPossibleMatch->InqFloatQuality(SHADE_FLOAT, 0) != shade) continue; - int possibleMatchStackSize = possibleMatch->InqIntQuality(STACK_SIZE_INT, 1); + int possibleMatchStackSize = pPossibleMatch->InqIntQuality(STACK_SIZE_INT, 1); if (possibleMatchStackSize < maxStackSize) { //we have room. @@ -606,14 +631,14 @@ bool CContainerWeenie::SpawnInContainer(DWORD wcid, int amount, int ptid, float if (roomFor >= amount) { //room for everything! - possibleMatch->SetStackSize(possibleMatchStackSize + amount); + pPossibleMatch->SetStackSize(possibleMatchStackSize + amount); return true; } else { //room for some. amount -= roomFor; - possibleMatch->SetStackSize(maxStackSize); + pPossibleMatch->SetStackSize(maxStackSize); } } } @@ -795,31 +820,51 @@ void CContainerWeenie::InitPhysicsObj() for (auto item : m_Wielded) { + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + #ifdef _DEBUG assert(item->GetWielderID() == GetID()); #endif - int parentLocation = item->InqIntQuality(PARENT_LOCATION_INT, PARENT_ENUM::PARENT_NONE); + int parentLocation = pItem->InqIntQuality(PARENT_LOCATION_INT, PARENT_ENUM::PARENT_NONE); if (parentLocation != PARENT_ENUM::PARENT_NONE) { - item->set_parent(GetPointer(), parentLocation); + pItem->set_parent(GetPointer(), parentLocation); - int placement = item->InqIntQuality(PLACEMENT_POSITION_INT, 0); + int placement = pItem->InqIntQuality(PLACEMENT_POSITION_INT, 0); assert(placement); - item->SetPlacementFrame(placement, FALSE); + pItem->SetPlacementFrame(placement, FALSE); } } #ifdef _DEBUG for (auto item : m_Items) { - assert(item->InqIntQuality(PARENT_LOCATION_INT, PARENT_ENUM::PARENT_NONE) == PARENT_ENUM::PARENT_NONE); + std::shared_ptr pItem = item.lock(); + if (!pItem) + { + continue; + } + + assert(pItem->InqIntQuality(PARENT_LOCATION_INT, PARENT_ENUM::PARENT_NONE) == PARENT_ENUM::PARENT_NONE); } for (auto pack : m_Packs) { - assert(pack->InqIntQuality(PARENT_LOCATION_INT, PARENT_ENUM::PARENT_NONE) == PARENT_ENUM::PARENT_NONE); + std::shared_ptr pPack = pack.lock(); + + if (!pPack) + { + continue; + } + + assert(pPack->InqIntQuality(PARENT_LOCATION_INT, PARENT_ENUM::PARENT_NONE) == PARENT_ENUM::PARENT_NONE); } #endif } @@ -830,20 +875,38 @@ void CContainerWeenie::SaveEx(class CWeenieSave &save) for (auto item : m_Wielded) { - save._equipment.push_back(item->GetID()); - item->Save(); + std::shared_ptr pItem = item.lock(); + if (!pItem) + { + continue; + } + + save._equipment.push_back(pItem->GetID()); + pItem->Save(); } for (auto item : m_Items) { - save._inventory.push_back(item->GetID()); - item->Save(); + std::shared_ptr pItem = item.lock(); + if (!pItem) + { + continue; + } + + save._inventory.push_back(pItem->GetID()); + pItem->Save(); } for (auto item : m_Packs) { - save._packs.push_back(item->GetID()); - item->Save(); + std::shared_ptr pItem = item.lock(); + if (!pItem) + { + continue; + } + + save._packs.push_back(pItem->GetID()); + pItem->Save(); } } @@ -1004,28 +1067,52 @@ void CContainerWeenie::MakeAwareViewContent(std::shared_ptr other //start from the bottom of the tree so the packs have their fill bar correctly populated. for (auto pack : m_Packs) { - if (pack->AsContainer()) - pack->AsContainer()->MakeAwareViewContent(other); - other->MakeAware(pack, true); + std::shared_ptr pPack = pack.lock(); + if (!pPack) + { + continue; + } + + if (pPack->AsContainer()) + pPack->AsContainer()->MakeAwareViewContent(other); + other->MakeAware(pPack, true); } for (auto item : m_Items) { - other->MakeAware(item, true); + std::shared_ptr pItem = item.lock(); + if (!pItem) + { + continue; + } + + other->MakeAware(pItem, true); } PackableList inventoryList; for (auto item : m_Items) { + std::shared_ptr pItem = item.lock(); + if (!pItem) + { + continue; + } + ContentProfile prof; - prof.m_iid = item->GetID(); + prof.m_iid = pItem->GetID(); prof.m_uContainerProperties = 0; inventoryList.push_back(prof); } for (auto pack : m_Packs) { + std::shared_ptr pPack = pack.lock(); + if (!pPack) + { + continue; + } + ContentProfile prof; - prof.m_iid = pack->GetID(); + prof.m_iid = pPack->GetID(); prof.m_uContainerProperties = 1; //todo: what about foci? Do they need a different value here? inventoryList.push_back(prof); } @@ -1118,11 +1205,41 @@ void CContainerWeenie::ResetToInitialState() SetLocked(m_bInitiallyLocked ? TRUE : FALSE); while (!m_Wielded.empty()) - Container_DeleteItem((*m_Wielded.begin())->GetID()); + { + std::shared_ptr pItem = m_Wielded.begin()->lock(); + + if (!pItem) + { + m_Wielded.erase(m_Wielded.begin()); + continue; + } + + Container_DeleteItem(pItem->GetID()); + } while (!m_Items.empty()) - Container_DeleteItem((*m_Items.begin())->GetID()); + { + std::shared_ptr pItem = m_Items.begin()->lock(); + + if (!pItem) + { + m_Items.erase(m_Items.begin()); + continue; + } + + Container_DeleteItem(pItem->GetID()); + } while (!m_Packs.empty()) - Container_DeleteItem((*m_Packs.begin())->GetID()); + { + std::shared_ptr pItem = m_Packs.begin()->lock(); + + if (!pItem) + { + m_Packs.erase(m_Packs.begin()); + continue; + } + + Container_DeleteItem(pItem->GetID()); + } if (m_Qualities._generator_table) @@ -1255,31 +1372,66 @@ void CContainerWeenie::InventoryTick() { CWeenieObject::InventoryTick(); - for (auto wielded : m_Wielded) + auto wielded = m_Wielded.begin(); + while (wielded != m_Wielded.end()) { - wielded->WieldedTick(); + std::shared_ptr pItem = wielded->lock(); + + if (!pItem) + { + m_Wielded.erase(wielded); + } + else + { + pItem->WieldedTick(); #ifdef _DEBUG - wielded->DebugValidate(); + pItem->DebugValidate(); #endif + } + + wielded++; } - for (auto item : m_Items) + auto item = m_Items.begin(); + while (item != m_Items.end()) { - item->InventoryTick(); + std::shared_ptr pItem = item->lock(); + + if (!pItem) + { + m_Items.erase(wielded); + } + else + { + pItem->InventoryTick(); #ifdef _DEBUG - item->DebugValidate(); + pItem->DebugValidate(); #endif + } + item++; } - for (auto pack : m_Packs) + auto pack = m_Packs.begin(); + while (pack != m_Packs.end()) { - pack->InventoryTick(); + std::shared_ptr pItem = pack->lock(); + + if (!pItem) + { + m_Packs.erase(wielded); + } + else + { + pItem->InventoryTick(); #ifdef _DEBUG - pack->DebugValidate(); + pItem->DebugValidate(); #endif + } + + pack++; } } @@ -1297,32 +1449,8 @@ void CContainerWeenie::Tick() return; } - for(auto wielded : m_Wielded) - { - wielded->WieldedTick(); - -#ifdef _DEBUG - wielded->DebugValidate(); -#endif - } - - for (auto item : m_Items) - { - item->InventoryTick(); - -#ifdef _DEBUG - item->DebugValidate(); -#endif - } - - for (auto pack : m_Packs) - { - pack->InventoryTick(); - -#ifdef _DEBUG - pack->DebugValidate(); -#endif - } + // TODO mwnciau removed a lot of code here and replaced it with this. If problems occur... + InventoryTick(); _nextInventoryTick = Timer::cur_time + Random::GenFloat(0.4, 0.6); } @@ -1412,12 +1540,27 @@ DWORD CContainerWeenie::RecalculateCoinAmount() int coinAmount = 0; for (auto item : m_Items) { - if (item->m_Qualities.id == W_COINSTACK_CLASS) - coinAmount += item->InqIntQuality(STACK_SIZE_INT, 1, true); + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->m_Qualities.id == W_COINSTACK_CLASS) + coinAmount += pItem->InqIntQuality(STACK_SIZE_INT, 1, true); } for (auto pack : m_Packs) - coinAmount += pack->RecalculateCoinAmount(); + { + std::shared_ptr pItem = pack.lock(); + + if (!pItem) + { + continue; + } + coinAmount += pItem->RecalculateCoinAmount(); + } m_Qualities.SetInt(COIN_VALUE_INT, coinAmount); NotifyIntStatUpdated(COIN_VALUE_INT); @@ -1430,12 +1573,28 @@ DWORD CContainerWeenie::RecalculateAltCoinAmount(int currencyid) int coinAmount = 0; for (auto item : m_Items) { - if (item->m_Qualities.id == currencyid) - coinAmount += item->InqIntQuality(STACK_SIZE_INT, 1, true); + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->m_Qualities.id == currencyid) + coinAmount += pItem->InqIntQuality(STACK_SIZE_INT, 1, true); } for (auto pack : m_Packs) - coinAmount += pack->RecalculateAltCoinAmount(currencyid); + { + std::shared_ptr pItem = pack.lock(); + + if (!pItem) + { + continue; + } + + coinAmount += pItem->RecalculateAltCoinAmount(currencyid); + } return coinAmount; } @@ -1456,18 +1615,25 @@ DWORD CContainerWeenie::ConsumeCoin(int amountToConsume) DWORD amountConsumed = 0; for (auto item : m_Items) { - if (item->m_Qualities.id == W_COINSTACK_CLASS) + std::shared_ptr pItem = item.lock(); + + if (!pItem) { - int stackSize = item->InqIntQuality(STACK_SIZE_INT, 1, true); + continue; + } + + if (pItem->m_Qualities.id == W_COINSTACK_CLASS) + { + int stackSize = pItem->InqIntQuality(STACK_SIZE_INT, 1, true); if (stackSize <= amountToConsume) { - removeList.push_back(item); + removeList.push_back(pItem); amountToConsume -= stackSize; amountConsumed += stackSize; } else { - item->SetStackSize(stackSize - amountToConsume); + pItem->SetStackSize(stackSize - amountToConsume); amountConsumed += amountToConsume; break; } @@ -1481,7 +1647,14 @@ DWORD CContainerWeenie::ConsumeCoin(int amountToConsume) { for (auto pack : m_Packs) { - DWORD amountFromPack = pack->ConsumeCoin(amountToConsume); + std::shared_ptr pItem = pack.lock(); + + if (!pItem) + { + continue; + } + + DWORD amountFromPack = pItem->ConsumeCoin(amountToConsume); amountToConsume -= amountFromPack; amountConsumed += amountFromPack; @@ -1511,18 +1684,25 @@ DWORD CContainerWeenie::ConsumeAltCoin(int amountToConsume, int currencyid) DWORD amountConsumed = 0; for (auto item : m_Items) { - if (item->m_Qualities.id == currencyid) + std::shared_ptr pItem = item.lock(); + + if (!pItem) { - int stackSize = item->InqIntQuality(STACK_SIZE_INT, 1, true); + continue; + } + + if (pItem->m_Qualities.id == currencyid) + { + int stackSize = pItem->InqIntQuality(STACK_SIZE_INT, 1, true); if (stackSize <= amountToConsume) { - removeList.push_back(item); + removeList.push_back(pItem); amountToConsume -= stackSize; amountConsumed += stackSize; } else { - item->SetStackSize(stackSize - amountToConsume); + pItem->SetStackSize(stackSize - amountToConsume); amountConsumed += amountToConsume; break; } @@ -1536,7 +1716,14 @@ DWORD CContainerWeenie::ConsumeAltCoin(int amountToConsume, int currencyid) { for (auto pack : m_Packs) { - DWORD amountFromPack = pack->ConsumeAltCoin(amountToConsume, currencyid); + std::shared_ptr pItem = pack.lock(); + + if (!pItem) + { + continue; + } + + DWORD amountFromPack = pItem->ConsumeAltCoin(amountToConsume, currencyid); amountToConsume -= amountFromPack; amountConsumed += amountFromPack; @@ -1557,18 +1744,39 @@ void CContainerWeenie::RecalculateEncumbrance() int newValue = 0; for (auto wielded : m_Wielded) { - newValue += wielded->InqIntQuality(ENCUMB_VAL_INT, 0); + std::shared_ptr pItem = wielded.lock(); + + if (!pItem) + { + continue; + } + + newValue += pItem->InqIntQuality(ENCUMB_VAL_INT, 0); } for (auto item : m_Items) { - newValue += item->InqIntQuality(ENCUMB_VAL_INT, 0); + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + newValue += pItem->InqIntQuality(ENCUMB_VAL_INT, 0); } for (auto pack : m_Packs) { - pack->RecalculateEncumbrance(); - newValue += pack->InqIntQuality(ENCUMB_VAL_INT, 0); + std::shared_ptr pItem = pack.lock(); + + if (!pItem) + { + continue; + } + + pItem->RecalculateEncumbrance(); + newValue += pItem->InqIntQuality(ENCUMB_VAL_INT, 0); } if (oldValue != newValue) @@ -1582,19 +1790,40 @@ bool CContainerWeenie::IsAttunedOrContainsAttuned() { for (auto wielded : m_Wielded) { - if (wielded->IsAttunedOrContainsAttuned()) + std::shared_ptr pItem = wielded.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->IsAttunedOrContainsAttuned()) return true; } for (auto item : m_Items) { - if (item->IsAttunedOrContainsAttuned()) + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->IsAttunedOrContainsAttuned()) return true; } for (auto pack : m_Packs) { - if (pack->IsAttunedOrContainsAttuned()) + std::shared_ptr pItem = pack.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->IsAttunedOrContainsAttuned()) return true; } diff --git a/Source/Container.h b/Source/Container.h index 4e60a68..a23dd79 100644 --- a/Source/Container.h +++ b/Source/Container.h @@ -103,10 +103,10 @@ public: void AdjustToNewCombatMode(); - std::shared_ptr m_WieldedCombat[MAX_WIELDED_COMBAT]; - std::vector > m_Wielded; - std::vector > m_Items; - std::vector > m_Packs; + std::weak_ptr m_WieldedCombat[MAX_WIELDED_COMBAT]; + std::vector > m_Wielded; + std::vector > m_Items; + std::vector > m_Packs; // For opening/closing containers double _nextCheckToClose = 0.0; diff --git a/Source/Corpse.cpp b/Source/Corpse.cpp index 18a8bf2..f7fa546 100644 --- a/Source/Corpse.cpp +++ b/Source/Corpse.cpp @@ -140,7 +140,7 @@ void CCorpseWeenie::Tick() { if (_mark_for_destroy_at <= Timer::cur_time) { - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); } } } diff --git a/Source/HotSpot.cpp b/Source/HotSpot.cpp index 10cb1dc..c227e6a 100644 --- a/Source/HotSpot.cpp +++ b/Source/HotSpot.cpp @@ -46,7 +46,7 @@ void CHotSpotWeenie::Tick() { if ((_timeToRot + 2.0) <= Timer::cur_time) { - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); } } else diff --git a/Source/House.cpp b/Source/House.cpp index e2bf8bd..77bda93 100644 --- a/Source/House.cpp +++ b/Source/House.cpp @@ -1139,7 +1139,7 @@ int CHookWeenie::DoUseResponse(std::shared_ptr other) if (m_Items.empty()) return WERROR_OBJECT_GONE; - hookedItem = m_Items[0]; + hookedItem = m_Items[0].lock(); if (!hookedItem) return WERROR_OBJECT_GONE; @@ -1173,7 +1173,7 @@ void CHookWeenie::Identify(std::shared_ptr other, DWORD overrideI if (m_Items.empty()) return; - hookedItem = m_Items[0]; + hookedItem = m_Items[0].lock(); if (!hookedItem) return; @@ -1206,7 +1206,7 @@ void CHookWeenie::UpdateHookedObject(std::shared_ptr hookedItem, if (!hookedItem && !m_Items.empty()) { - hookedItem = m_Items[0]; + hookedItem = m_Items[0].lock(); } if (!hookedItem) @@ -1426,7 +1426,7 @@ void CHookWeenie::SetHookVisibility(bool newSetting) if (!m_Items.empty()) { - std::shared_ptr hookedItem = m_Items[0]; + std::shared_ptr hookedItem = m_Items[0].lock(); if (!hookedItem) return; @@ -1464,7 +1464,7 @@ void CHookWeenie::SetHookVisibility(bool newSetting) else SafeDelete(m_Qualities._emote_table); - if (std::shared_ptr hookedItem = m_Items[0]) + if (std::shared_ptr hookedItem = m_Items[0].lock()) { m_Qualities.SetString(NAME_STRING, hookedItem->GetName()); m_Qualities.SetInt(ITEMS_CAPACITY_INT, hookedItem->m_Qualities.GetInt(ITEMS_CAPACITY_INT, 0)); diff --git a/Source/Monster.cpp b/Source/Monster.cpp index 26ee323..4ee9be4 100644 --- a/Source/Monster.cpp +++ b/Source/Monster.cpp @@ -1595,7 +1595,7 @@ void CMonsterWeenie::OnMotionDone(DWORD motion, BOOL success) NotifyContainedItemRemoved(pItem->id); - pItem->MarkForDestroy(); + g_pWorld->RemoveEntity(pItem); } } @@ -1682,8 +1682,15 @@ void CMonsterWeenie::GenerateDeathLoot(std::shared_ptr pCorpse) for each(auto item in pCorpse->m_Items) { - if (item->IsDestroyedOnDeath()) - removeList.push_back(item); + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->IsDestroyedOnDeath()) + removeList.push_back(pItem); } for (auto item : removeList) @@ -1699,7 +1706,7 @@ void CMonsterWeenie::OnDeathAnimComplete() if (!_IsPlayer()) { - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); } // create corpse @@ -2201,7 +2208,14 @@ double CMonsterWeenie::GetMeleeDefenseModUsingWielded() Container_GetWieldedByMask(wielded, ARMOR_LOC); for (auto item : m_Wielded) //check all armor for appropriate imbue effects { - if (item->GetImbueEffects() & MeleeDefense_ImbuedEffectType) + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->GetImbueEffects() & MeleeDefense_ImbuedEffectType) defenseMod += 0.01; } @@ -2224,7 +2238,14 @@ double CMonsterWeenie::GetMissileDefenseModUsingWielded() Container_GetWieldedByMask(wielded, ARMOR_LOC); for (auto item : m_Wielded) //check all armor for appropriate imbue effects { - if (item->GetImbueEffects() & MissileDefense_ImbuedEffectType) + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->GetImbueEffects() & MissileDefense_ImbuedEffectType) defenseMod += 0.01; } diff --git a/Source/ObjectMsgs.cpp b/Source/ObjectMsgs.cpp index 26ea170..64a0596 100644 --- a/Source/ObjectMsgs.cpp +++ b/Source/ObjectMsgs.cpp @@ -1053,16 +1053,28 @@ BinaryWriter *LoginCharacter(std::shared_ptr pPlayer) PackableList inventoryList; for (auto item : pPlayer->m_Items) { + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } ContentProfile prof; - prof.m_iid = item->GetID(); + prof.m_iid = pItem->GetID(); prof.m_uContainerProperties = 0; inventoryList.push_back(prof); } for (auto item : pPlayer->m_Packs) { + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } ContentProfile prof; - prof.m_iid = item->GetID(); - prof.m_uContainerProperties = item->AsContainer() ? 1 : 2; + prof.m_iid = pItem->GetID(); + prof.m_uContainerProperties = pItem->AsContainer() ? 1 : 2; inventoryList.push_back(prof); } inventoryList.Pack(LC); @@ -1070,10 +1082,16 @@ BinaryWriter *LoginCharacter(std::shared_ptr pPlayer) PackableList wieldedList; for (auto wielded : pPlayer->m_Wielded) { + std::shared_ptr pItem = wielded.lock(); + + if (!pItem) + { + continue; + } InventoryPlacement place; - place.iid_ = wielded->GetID(); - place.loc_ = wielded->InqIntQuality(CURRENT_WIELDED_LOCATION_INT, 0); - place.priority_ = wielded->InqIntQuality(CLOTHING_PRIORITY_INT, 0); + place.iid_ = pItem->GetID(); + place.loc_ = pItem->InqIntQuality(CURRENT_WIELDED_LOCATION_INT, 0); + place.priority_ = pItem->InqIntQuality(CLOTHING_PRIORITY_INT, 0); wieldedList.push_back(place); } wieldedList.Pack(LC); diff --git a/Source/Player.cpp b/Source/Player.cpp index d267de4..af290c8 100644 --- a/Source/Player.cpp +++ b/Source/Player.cpp @@ -351,19 +351,21 @@ void CPlayerWeenie::MakeAware(std::shared_ptr pEntity, bool bForc // make aware of inventory too for (auto item : m_Wielded) { - MakeAware(item); + MakeAware(item.lock()); } for (auto item : m_Items) { - MakeAware(item); + MakeAware(item.lock()); } for (auto item : m_Packs) { - MakeAware(item); + std::shared_ptr pItem = item.lock(); - if (std::shared_ptr container = item->AsContainer()) + MakeAware(pItem); + + if (std::shared_ptr container = pItem->AsContainer()) { container->MakeAwareViewContent(GetPointer()); } @@ -431,7 +433,7 @@ std::string CPlayerWeenie::RemoveLastAssessed() if (pObject && !pObject->AsPlayer() && !pObject->m_bDontClear) { std::string name = pObject->GetName(); - pObject->MarkForDestroy(); + g_pWorld->RemoveEntity(pObject); m_LastAssessed = 0; return name; } @@ -570,18 +572,25 @@ void CPlayerWeenie::OnGivenXP(long long amount, bool allegianceXP) } } -void addItemsToDropLists(PhysObjVector items, std::vector > &removeList, std::vector > &alwaysDropList, std::vector > &allValidItems) +void addItemsToDropLists(std::vector> items, std::vector > &removeList, std::vector > &alwaysDropList, std::vector > &allValidItems) { for (auto item : items) { - if (item->m_Qualities.id == W_COINSTACK_CLASS) + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { continue; - else if (item->IsDestroyedOnDeath()) - removeList.push_back(item); - else if (item->IsDroppedOnDeath()) - alwaysDropList.push_back(item); - else if (!item->IsBonded()) - allValidItems.push_back(item); + } + + if (pItem->m_Qualities.id == W_COINSTACK_CLASS) + continue; + else if (pItem->IsDestroyedOnDeath()) + removeList.push_back(pItem); + else if (pItem->IsDroppedOnDeath()) + alwaysDropList.push_back(pItem); + else if (!pItem->IsBonded()) + allValidItems.push_back(pItem); } } @@ -635,7 +644,14 @@ void CPlayerWeenie::CalculateAndDropDeathItems(std::shared_ptr pC for (auto packAsWeenie : m_Packs) { - std::shared_ptr pack = packAsWeenie->AsContainer(); + std::shared_ptr pItem = packAsWeenie.lock(); + + if (!pItem) + { + continue; + } + + std::shared_ptr pack = pItem->AsContainer(); if (pack) { addItemsToDropLists(pack->m_Items, removeList, alwaysDropList, allValidItems); @@ -1205,11 +1221,18 @@ int CPlayerWeenie::UseEx(bool bConfirmed) priority_queue, vector>, CompareManaNeeds > itemsNeedingMana, itemsStillNeedingMana; // MIN heaps sorted by mana deficit for (auto wielded : m_Wielded) { - int curMana = wielded->InqIntQuality(ITEM_CUR_MANA_INT, 0, TRUE); - int maxMana = wielded->InqIntQuality(ITEM_MAX_MANA_INT, 0, TRUE); + std::shared_ptr pItem = wielded.lock(); + + if (!pItem) + { + continue; + } + + int curMana = pItem->InqIntQuality(ITEM_CUR_MANA_INT, 0, TRUE); + int maxMana = pItem->InqIntQuality(ITEM_MAX_MANA_INT, 0, TRUE); int deficit = maxMana - curMana; if (deficit > 0) { - itemsNeedingMana.push(wielded); + itemsNeedingMana.push(pItem); } } if (itemsNeedingMana.empty()) { @@ -3449,11 +3472,18 @@ void CPlayerWeenie::SetLoginPlayerQualities() for (auto wielded : m_Wielded) { - if (wielded->InqIntQuality(ITEM_CUR_MANA_INT, 0, true) > 0) + std::shared_ptr pItem = wielded.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->InqIntQuality(ITEM_CUR_MANA_INT, 0, true) > 0) { double manaRate = 0.0f; - if (wielded->m_Qualities.InqFloat(MANA_RATE_FLOAT, manaRate, TRUE) && manaRate != 0.0) - wielded->_nextManaUse = Timer::cur_time + (-manaRate * 1000); + if (pItem->m_Qualities.InqFloat(MANA_RATE_FLOAT, manaRate, TRUE) && manaRate != 0.0) + pItem->_nextManaUse = Timer::cur_time + (-manaRate * 1000); } } @@ -3461,9 +3491,16 @@ void CPlayerWeenie::SetLoginPlayerQualities() { for (auto item : m_Items) { - if (item->m_Qualities.id == W_TUTORIALBOOK_CLASS) + std::shared_ptr pItem = item.lock(); + + if (!pItem) { - item->Use(AsPlayer()); + continue; + } + + if (pItem->m_Qualities.id == W_TUTORIALBOOK_CLASS) + { + pItem->Use(AsPlayer()); break; } } @@ -3908,3 +3945,8 @@ void CPlayerWeenie::ChangeCombatMode(COMBAT_MODE mode, bool playerRequested) m_pTradeManager->CloseTrade(AsPlayer(), 2); // EnteredCombat } } + +void CPlayerWeenie::MarkForDestroy() +{ + m_dDestroyTime = Timer::cur_time + 2; // give some time to wrap up +} \ No newline at end of file diff --git a/Source/Player.h b/Source/Player.h index 26ecdf4..d39cc76 100644 --- a/Source/Player.h +++ b/Source/Player.h @@ -79,14 +79,6 @@ public: void HandleItemManaRequest(DWORD itemId); - //base virtuals - - virtual void MarkForDestroy() - { - m_pClient = NULL; - CMonsterWeenie::MarkForDestroy(); - } - //Movement overrides //... @@ -207,6 +199,8 @@ public: void UpdatePKActivity() { m_iPKActivity = Timer::cur_time + 60; } bool CheckPKActivity() { return m_iPKActivity > Timer::cur_time; } + void MarkForDestroy() override; + protected: CClient *m_pClient; diff --git a/Source/Scroll.cpp b/Source/Scroll.cpp index 460897d..b727ed7 100644 --- a/Source/Scroll.cpp +++ b/Source/Scroll.cpp @@ -3,6 +3,7 @@ #include "WeenieObject.h" #include "Scroll.h" #include "Player.h" +#include "World.h" CScrollWeenie::CScrollWeenie() { @@ -109,7 +110,7 @@ void CScrollUseEvent::OnUseAnimSuccess(DWORD motion) pWeenie->ReleaseFromAnyWeenieParent(); pWeenie->NotifyContainedItemRemoved(target->GetID()); - target->MarkForDestroy(); + g_pWorld->RemoveEntity(target); } } diff --git a/Source/SpellProjectile.cpp b/Source/SpellProjectile.cpp index 60d7cb4..b4aed94 100644 --- a/Source/SpellProjectile.cpp +++ b/Source/SpellProjectile.cpp @@ -41,11 +41,11 @@ CSpellProjectile::~CSpellProjectile() void CSpellProjectile::Tick() { - if (!m_bDestroyMe) + if (!ShouldDestroy()) { if (!InValidCell() || (m_fDestroyTime <= Timer::cur_time)) { - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); } // not destroyed yet and distance/time exceeded else if (m_fDestroyTime > Timer::cur_time + 10 && (m_Position.distance(m_CachedSpellCastData.initial_cast_position) > m_CachedSpellCastData.max_range || (m_fSpawnTime + MAX_SPELL_PROJECTILE_LIFETIME - 1) <= Timer::cur_time)) diff --git a/Source/SpellcastingManager.cpp b/Source/SpellcastingManager.cpp index 4814884..ed9cedf 100644 --- a/Source/SpellcastingManager.cpp +++ b/Source/SpellcastingManager.cpp @@ -1703,11 +1703,18 @@ int CSpellcastingManager::LaunchSpellEffect() { for (auto wielded : container->m_Wielded) { - if (wielded->GetItemType() & m_SpellCastData.spell->_non_component_target_type) + std::shared_ptr pItem = wielded.lock(); + + if (!pItem) { - if (castTarget == pWeenie || wielded->parent.lock()) // for other targets, only physically wielded allowed + continue; + } + + if (pItem->GetItemType() & m_SpellCastData.spell->_non_component_target_type) + { + if (castTarget == pWeenie || pItem->parent.lock()) // for other targets, only physically wielded allowed { - targets.push_back(wielded); + targets.push_back(pItem); } } } @@ -1904,11 +1911,18 @@ int CSpellcastingManager::LaunchSpellEffect() { for (auto wielded : container->m_Wielded) { - if (wielded->GetItemType() & m_SpellCastData.spell->_non_component_target_type) + std::shared_ptr pItem = wielded.lock(); + + if (!pItem) { - if (member == pWeenie || wielded->parent.lock()) // for other targets, only physically wielded allowed + continue; + } + + if (pItem->GetItemType() & m_SpellCastData.spell->_non_component_target_type) + { + if (member == pWeenie || pItem->parent.lock()) // for other targets, only physically wielded allowed { - targets.push_back(wielded); + targets.push_back(pItem); } } } @@ -3191,9 +3205,16 @@ std::map CSpellcastingManager::FindComponentInContainer(std::share int amountLeftToFind = amountNeeded; for (auto item : container->m_Items) { - if (item->InqDIDQuality(SPELL_COMPONENT_DID, 0) == componentId) + std::shared_ptr pItem = item.lock(); + + if (!pItem) { - int amount = item->InqIntQuality(STACK_SIZE_INT, 1); + continue; + } + + if (pItem->InqDIDQuality(SPELL_COMPONENT_DID, 0) == componentId) + { + int amount = pItem->InqIntQuality(STACK_SIZE_INT, 1); if (amount > amountLeftToFind) { amount = amountLeftToFind; @@ -3201,7 +3222,7 @@ std::map CSpellcastingManager::FindComponentInContainer(std::share } else amountLeftToFind -= amount; - foundItems.emplace(item->GetID(), amount); + foundItems.emplace(pItem->GetID(), amount); if (amountLeftToFind == 0) return foundItems; @@ -3210,14 +3231,28 @@ std::map CSpellcastingManager::FindComponentInContainer(std::share for (auto packSlot : container->m_Packs) { - std::shared_ptr pack = packSlot->AsContainer(); - if (pack != NULL) + std::shared_ptr pPack = packSlot.lock(); + + if (!pPack) + { + continue; + } + + std::shared_ptr pack = pPack->AsContainer(); + if (pack) { for (auto item : pack->m_Items) { - if (item->InqDIDQuality(SPELL_COMPONENT_DID, 0) == componentId) + std::shared_ptr pItem = item.lock(); + + if (!pItem) { - int amount = item->InqIntQuality(STACK_SIZE_INT, 1); + continue; + } + + if (pItem->InqDIDQuality(SPELL_COMPONENT_DID, 0) == componentId) + { + int amount = pItem->InqIntQuality(STACK_SIZE_INT, 1); if (amount > amountLeftToFind) { amount = amountLeftToFind; @@ -3225,7 +3260,7 @@ std::map CSpellcastingManager::FindComponentInContainer(std::share } else amountLeftToFind -= amount; - foundItems.emplace(item->GetID(), amount); + foundItems.emplace(pItem->GetID(), amount); if (amountLeftToFind == 0) return foundItems; @@ -3243,8 +3278,15 @@ std::shared_ptr CSpellcastingManager::FindFociInContainer(std::sh { for (auto pack : container->m_Packs) { - if (pack->m_Qualities.id == fociWcid) - return pack; + std::shared_ptr pItem = pack.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->m_Qualities.id == fociWcid) + return pItem; } return NULL; diff --git a/Source/WeenieFactory.cpp b/Source/WeenieFactory.cpp index 18b1837..6b9ddd6 100644 --- a/Source/WeenieFactory.cpp +++ b/Source/WeenieFactory.cpp @@ -1094,7 +1094,7 @@ void CWeenieFactory::AddWeenieToDestination(std::shared_ptr weeni if (!weenie->IsContained() && !weenie->IsStuck() && weenie->m_Position.objcell_id && !weenie->cell) { - weenie->MarkForDestroy(); + g_pWorld->RemoveEntity(weenie); return; } diff --git a/Source/WeenieObject.cpp b/Source/WeenieObject.cpp index c108144..9961d4c 100644 --- a/Source/WeenieObject.cpp +++ b/Source/WeenieObject.cpp @@ -927,7 +927,7 @@ void CWeenieObject::OnGeneratedDeath(std::shared_ptr weenie) { //we're the child of a generator and all our children have been destroyed/picked up. //so we're done and should cease to exist. - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); //make the leftovers rot. for each (auto entry in rotList) @@ -1014,7 +1014,7 @@ void CWeenieObject::OnGeneratedPickedUp(std::shared_ptr weenie) { //we're the child of a generator and all our children have been destroyed/picked up. //so we're done and should cease to exist. - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); //make the leftovers rot. for each (auto entry in rotList) @@ -2921,7 +2921,7 @@ void CWeenieObject::Tick() { if ((_timeToRot + 2.0) <= Timer::cur_time) { - MarkForDestroy(); + g_pWorld->RemoveEntity(GetPointer()); } } else @@ -5722,7 +5722,14 @@ bool CWeenieObject::TryMagicResist(DWORD magicSkill) { for (auto item : AsContainer()->m_Wielded) { - if (item->GetImbueEffects() & MagicDefense_ImbuedEffectType) + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->GetImbueEffects() & MagicDefense_ImbuedEffectType) defenseSkill += 1; } } @@ -6047,7 +6054,14 @@ bool CWeenieObject::TryMissileEvade(DWORD attackSkill) { for (auto item : AsContainer()->m_Wielded) { - if (item->GetImbueEffects() & MissileDefense_ImbuedEffectType) + std::shared_ptr pItem = item.lock(); + + if (!pItem) + { + continue; + } + + if (pItem->GetImbueEffects() & MissileDefense_ImbuedEffectType) defenseMod += 0.01; } } @@ -6357,6 +6371,16 @@ bool CWeenieObject::LearnSpell(DWORD spell_id, bool showTextAndEffect) return false; } +void CWeenieObject::MarkForDestroy() +{ + m_dDestroyTime = Timer::cur_time; +} + +bool CWeenieObject::ShouldDestroy() +{ + return m_dDestroyTime > 0 && m_dDestroyTime < Timer::cur_time; +} + void CWeenieObject::Remove() { if (IsContained()) @@ -6384,8 +6408,8 @@ void CWeenieObject::Remove() SetWieldedLocation(INVENTORY_LOC::NONE_LOC); m_Qualities.SetInt(PARENT_LOCATION_INT, 0); unset_parent(); - ReleaseFromBlock(); - MarkForDestroy(); + + g_pWorld->RemoveEntity(GetPointer()); } void CWeenieObject::DebugValidate() @@ -6539,7 +6563,7 @@ void CWeenieObject::HandleEventInactive() if (std::shared_ptr spawned_weenie = g_pWorld->FindObject(weenie_id)) { - spawned_weenie->MarkForDestroy(); + g_pWorld->RemoveEntity(spawned_weenie); } // make sure it's gone (it should be already.) diff --git a/Source/WeenieObject.h b/Source/WeenieObject.h index 953b442..e3a8a96 100644 --- a/Source/WeenieObject.h +++ b/Source/WeenieObject.h @@ -281,8 +281,8 @@ public: virtual void TryIdentify(std::shared_ptr other); virtual void Identify(std::shared_ptr other, DWORD overrideId = 0); - virtual void MarkForDestroy() { m_bDestroyMe = true; } - virtual bool ShouldDestroy() { return m_bDestroyMe; } + virtual void MarkForDestroy(); + virtual bool ShouldDestroy(); virtual void Remove(); virtual void DebugValidate(); @@ -492,8 +492,8 @@ public: void TryCancelAttack(); float GetArmorModForDamageType(DAMAGE_TYPE dt); - - bool m_bDestroyMe = false; + + double m_dDestroyTime = -1; virtual void WieldedTick(); virtual void InventoryTick(); diff --git a/Source/World.cpp b/Source/World.cpp index cb66c40..881c503 100644 --- a/Source/World.cpp +++ b/Source/World.cpp @@ -340,7 +340,7 @@ bool CWorld::CreateEntity(std::shared_ptr pEntity, bool bMakeAwar else { // the caller wants to take control so remove all previous owners - if (bForceTakeControl) + if (true || bForceTakeControl) { LOG_PRIVATE(World, Warning, csprintf("Trying to spawn second (different) weenie with existing ID 0x%08X! Deleting OLD instead (%d, %d refs).\n", pEntity->id, pExistingWeenie.use_count())); pExistingWeenie->Destroy(); @@ -361,9 +361,18 @@ bool CWorld::CreateEntity(std::shared_ptr pEntity, bool bMakeAwar // The dupe is in a corpse! // Let's assume the corpse was already recovered. + while (pContainer->m_Items.size() > 0) { - pContainer->m_Items[0]->Remove(); + auto i = pContainer->m_Items.begin(); + std::shared_ptr pItem = i->lock(); + + if (!pItem) + { + pContainer->m_Items.erase(i); + continue; + } + pItem->Remove(); } // Corpse is now empty. We can get rid of it. @@ -956,7 +965,10 @@ void CWorld::RemoveEntity(std::shared_ptr pEntity) void CWorld::EnsureRemoved(std::shared_ptr pEntity) { - m_mAllPlayers.erase(pEntity->GetID()); + if (m_mAllPlayers.erase(pEntity->GetID())) + { + this->GetNumPlayers(); + } m_mAllObjects.erase(pEntity->GetID()); std::string eventString; diff --git a/Source/WorldLandBlock.cpp b/Source/WorldLandBlock.cpp index 4aa0bc8..9e06f4c 100644 --- a/Source/WorldLandBlock.cpp +++ b/Source/WorldLandBlock.cpp @@ -947,7 +947,7 @@ BOOL CWorldLandBlock::Think() } else { - Destroy(pEntity); + g_pWorld->RemoveEntity(pEntity); } eit++;