From 529af3cd092972c2d5204308a5ba573bad8e0b1f Mon Sep 17 00:00:00 2001 From: megamage Date: Mon, 28 Nov 2011 14:05:25 -0500 Subject: Delete obj if it is not successfully added to grid. More to fix. --- src/server/scripts/Commands/cs_gobject.cpp | 4 +--- src/server/scripts/Commands/cs_npc.cpp | 7 +++++-- src/server/scripts/Commands/cs_wp.cpp | 33 ++++++++++++++++++++++-------- 3 files changed, 31 insertions(+), 13 deletions(-) (limited to 'src/server/scripts/Commands') diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 4c9960992e1..eb1ccc543f3 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -165,14 +165,12 @@ public: object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn()); // this will generate a new guid if the object is in an instance - if (!object->LoadFromDB(guidLow, map)) + if (!object->LoadGameObjectFromDB(guidLow, map)) { delete object; return false; } - map->AddToMap(object); - // TODO: is it really necessary to add both the real and DB table guid here ? sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGOData(guidLow)); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 20d0994b911..bfa8b76f295 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -147,9 +147,12 @@ public: uint32 db_guid = creature->GetDBTableGUIDLow(); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); - creature->LoadFromDB(db_guid, map); + if (!creature->LoadCreatureFromDB(db_guid, map)) + { + delete creature; + return false; + } - map->AddToMap(creature); sObjectMgr->AddCreatureToGrid(db_guid, sObjectMgr->GetCreatureData(db_guid)); return true; } diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index ebeb7b8f4f4..d34ee801e50 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -578,8 +578,13 @@ public: wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); - wpCreature2->LoadFromDB(wpCreature2->GetDBTableGUIDLow(), map); - map->AddToMap(wpCreature2); + //TODO: Should we first use "Create" then use "LoadFromDB"? + if (!wpCreature2->LoadCreatureFromDB(wpCreature2->GetDBTableGUIDLow(), map)) + { + handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); + delete wpCreature2; + return false; + } //sMapMgr->GetMap(npcCreature->GetMapId())->Add(wpCreature2); } @@ -777,8 +782,12 @@ public: wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); - wpCreature->LoadFromDB(wpCreature->GetDBTableGUIDLow(), map); - map->AddToMap(wpCreature); + if (!wpCreature->LoadCreatureFromDB(wpCreature->GetDBTableGUIDLow(), map)) + { + handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); + delete wpCreature; + return false; + } if (target) { @@ -824,8 +833,12 @@ public: } creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); - creature->LoadFromDB(creature->GetDBTableGUIDLow(), map); - map->AddToMap(creature); + if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map)) + { + handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); + delete creature; + return false; + } if (target) { @@ -872,8 +885,12 @@ public: } creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); - creature->LoadFromDB(creature->GetDBTableGUIDLow(), map); - map->AddToMap(creature); + if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map)) + { + handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id); + delete creature; + return false; + } if (target) { -- cgit v1.2.3 From 81fea2d7b51549c340866050f93e3780503112f7 Mon Sep 17 00:00:00 2001 From: megamage Date: Mon, 28 Nov 2011 14:10:56 -0500 Subject: Fix some memory leak from CreateTamedPetFrom. --- src/server/game/Spells/SpellEffects.cpp | 6 ++++++ src/server/scripts/Commands/cs_npc.cpp | 1 + 2 files changed, 7 insertions(+) (limited to 'src/server/scripts/Commands') diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index a4cf8e6a469..bcc791ac3fd 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3828,7 +3828,10 @@ void Spell::EffectTameCreature(SpellEffIndex /*effIndex*/) Pet* pet = m_caster->CreateTamedPetFrom(creatureTarget, m_spellInfo->Id); if (!pet) // in very specific state like near world end/etc. + { + delete pet; return; + } // "kill" original creature creatureTarget->DespawnOrUnsummon(); @@ -7014,7 +7017,10 @@ void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) uint32 creatureEntry = m_spellInfo->Effects[effIndex].MiscValue; Pet* pet = unitTarget->CreateTamedPetFrom(creatureEntry, m_spellInfo->Id); if (!pet) + { + delete pet; return; + } // add to world pet->GetMap()->AddToMap(pet->ToCreature()); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index bfa8b76f295..46b6c1cb16b 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -1131,6 +1131,7 @@ public: { handler->PSendSysMessage (LANG_CREATURE_NON_TAMEABLE, cInfo->Entry); handler->SetSentErrorMessage (true); + delete pet; return false; } -- cgit v1.2.3 From 5b034ee631822f71c6504944963aaa17c6a29b68 Mon Sep 17 00:00:00 2001 From: megamage Date: Mon, 28 Nov 2011 14:34:30 -0500 Subject: Revert 81fea2d7b51549c340866050f93e3780503112f7. --- src/server/game/Chat/Commands/Level2.cpp | 4 ---- src/server/game/Spells/SpellEffects.cpp | 6 ------ src/server/scripts/Commands/cs_npc.cpp | 3 +-- 3 files changed, 1 insertion(+), 12 deletions(-) (limited to 'src/server/scripts/Commands') diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp index 1dd603094f6..41bc564759c 100755 --- a/src/server/game/Chat/Commands/Level2.cpp +++ b/src/server/game/Chat/Commands/Level2.cpp @@ -861,10 +861,6 @@ bool ChatHandler::HandleCreatePetCommand(const char* /*args*/) // Everything looks OK, create new pet Pet* pet = new Pet(player, HUNTER_PET); - - if (!pet) - return false; - if (!pet->CreateBaseAtCreature(creatureTarget)) { delete pet; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index faac7acece5..e42294f59ae 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3823,10 +3823,7 @@ void Spell::EffectTameCreature(SpellEffIndex /*effIndex*/) Pet* pet = m_caster->CreateTamedPetFrom(creatureTarget, m_spellInfo->Id); if (!pet) // in very specific state like near world end/etc. - { - delete pet; return; - } // "kill" original creature creatureTarget->DespawnOrUnsummon(); @@ -7012,10 +7009,7 @@ void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) uint32 creatureEntry = m_spellInfo->Effects[effIndex].MiscValue; Pet* pet = unitTarget->CreateTamedPetFrom(creatureEntry, m_spellInfo->Id); if (!pet) - { - delete pet; return; - } // add to world pet->GetMap()->AddToMap(pet->ToCreature()); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 46b6c1cb16b..b9ac21cc040 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -1126,12 +1126,11 @@ public: } // Everything looks OK, create new pet - Pet* pet = player->CreateTamedPetFrom (creatureTarget); + Pet* pet = player->CreateTamedPetFrom(creatureTarget); if (!pet) { handler->PSendSysMessage (LANG_CREATURE_NON_TAMEABLE, cInfo->Entry); handler->SetSentErrorMessage (true); - delete pet; return false; } -- cgit v1.2.3