diff options
| author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-12-06 12:01:51 +0100 |
|---|---|---|
| committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-12-06 12:01:51 +0100 |
| commit | fe69bd654a424f560f37774d5c3e763fd6589607 (patch) | |
| tree | 0f4a8ef0e26a0aabfea98d5800076003ee11ce3e /src/server/game | |
| parent | b0d106944b155babf22dd1837da2017180589b0c (diff) | |
| parent | 15c24a4e971e2808976d9844a60767442b51ae5e (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.x
Conflicts:
src/server/game/Entities/Creature/GossipDef.cpp
src/server/game/Globals/ObjectMgr.cpp
src/server/game/Quests/QuestDef.cpp
Diffstat (limited to 'src/server/game')
| -rwxr-xr-x | src/server/game/Battlegrounds/Battleground.cpp | 13 | ||||
| -rwxr-xr-x | src/server/game/Chat/Commands/Level2.cpp | 4 | ||||
| -rwxr-xr-x | src/server/game/Entities/Creature/Creature.cpp | 4 | ||||
| -rwxr-xr-x | src/server/game/Entities/Creature/Creature.h | 3 | ||||
| -rwxr-xr-x | src/server/game/Entities/DynamicObject/DynamicObject.cpp | 8 | ||||
| -rwxr-xr-x | src/server/game/Entities/DynamicObject/DynamicObject.h | 2 | ||||
| -rwxr-xr-x | src/server/game/Entities/GameObject/GameObject.cpp | 5 | ||||
| -rwxr-xr-x | src/server/game/Entities/GameObject/GameObject.h | 3 | ||||
| -rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 11 | ||||
| -rwxr-xr-x | src/server/game/Events/GameEventMgr.cpp | 7 | ||||
| -rwxr-xr-x | src/server/game/Globals/ObjectMgr.cpp | 11 | ||||
| -rwxr-xr-x | src/server/game/Maps/Map.cpp | 22 | ||||
| -rwxr-xr-x | src/server/game/Maps/Map.h | 2 | ||||
| -rwxr-xr-x | src/server/game/Pools/PoolMgr.cpp | 6 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 9 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellMgr.cpp | 8 |
16 files changed, 67 insertions, 51 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index e978fec46f4..b1d0765aa6e 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1458,7 +1458,11 @@ bool Battleground::AddObject(uint32 type, uint32 entry, float x, float y, float data.go_state = 1; */ // Add to world, so it can be later looked up from HashMapHolder - map->AddToMap(go); + if (!map->AddToMap(go)) + { + delete go; + return false; + } m_BgObjects[type] = go->GetGUID(); return true; } @@ -1561,7 +1565,12 @@ Creature* Battleground::AddCreature(uint32 entry, uint32 type, uint32 teamval, f creature->SetSpeed(MOVE_WALK, cinfo->speed_walk); creature->SetSpeed(MOVE_RUN, cinfo->speed_run); - map->AddToMap(creature); + if (!map->AddToMap(creature)) + { + delete creature; + return NULL; + } + m_BgCreatures[type] = creature->GetGUID(); if (respawntime) diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp index a5dc27c233a..d31ddc9aa33 100755 --- a/src/server/game/Chat/Commands/Level2.cpp +++ b/src/server/game/Chat/Commands/Level2.cpp @@ -863,10 +863,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/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index b1a353dcb88..8065e66216e 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1241,7 +1241,7 @@ bool Creature::CreateFromProto(uint32 guidlow, uint32 Entry, uint32 vehId, uint3 return true; } -bool Creature::LoadFromDB(uint32 guid, Map* map) +bool Creature::LoadCreatureFromDB(uint32 guid, Map* map, bool addToMap) { CreatureData const* data = sObjectMgr->GetCreatureData(guid); @@ -1310,6 +1310,8 @@ bool Creature::LoadFromDB(uint32 guid, Map* map) m_creatureData = data; + if (addToMap && !GetMap()->AddToMap(this)) + return false; return true; } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index c21ad246044..ae1c3ac59c6 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -577,7 +577,8 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature void setDeathState(DeathState s); // override virtual Unit::setDeathState bool FallGround(); - bool LoadFromDB(uint32 guid, Map* map); + bool LoadFromDB(uint32 guid, Map* map) { return LoadCreatureFromDB(guid, map, false); } + bool LoadCreatureFromDB(uint32 guid, Map* map, bool addToMap = true); void SaveToDB(); // overriden in Pet virtual void SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask); diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 4c8ce4d8d8f..9fe1a2ba296 100755 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -79,7 +79,7 @@ void DynamicObject::RemoveFromWorld() } } -bool DynamicObject::Create(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type) +bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type) { SetMap(caster->GetMap()); Relocate(pos); @@ -106,6 +106,12 @@ bool DynamicObject::Create(uint32 guidlow, Unit* caster, uint32 spellId, Positio SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime()); m_isWorldObject = active; + if (active) + setActive(true); //must before add to map to be put in world container + + if (!GetMap()->AddToMap(this)) + return false; + return true; } diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h index 419aaf9e83b..c178fe98d14 100755 --- a/src/server/game/Entities/DynamicObject/DynamicObject.h +++ b/src/server/game/Entities/DynamicObject/DynamicObject.h @@ -41,7 +41,7 @@ class DynamicObject : public WorldObject, public GridObject<DynamicObject> void AddToWorld(); void RemoveFromWorld(); - bool Create(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type); + bool CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type); void Update(uint32 p_time); void Remove(); void SetDuration(int32 newDuration); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 68091611a5d..8ca60d6a4e4 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -695,7 +695,7 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) WorldDatabase.CommitTransaction(trans); } -bool GameObject::LoadFromDB(uint32 guid, Map* map) +bool GameObject::LoadGameObjectFromDB(uint32 guid, Map* map, bool addToMap) { GameObjectData const* data = sObjectMgr->GetGOData(guid); @@ -760,6 +760,9 @@ bool GameObject::LoadFromDB(uint32 guid, Map* map) m_goData = data; + if (addToMap && !GetMap()->AddToMap(this)) + return false; + return true; } diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index d6ddc29a3e0..63651a73278 100755 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -649,7 +649,8 @@ class GameObject : public WorldObject, public GridObject<GameObject> void SaveToDB(); void SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask); - bool LoadFromDB(uint32 guid, Map* map); + bool LoadFromDB(uint32 guid, Map* map) { return LoadGameObjectFromDB(guid, map, false); } + bool LoadGameObjectFromDB(uint32 guid, Map* map, bool addToMap = true); void DeleteFromDB(); void SetOwnerGUID(uint64 owner) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0bbf95fe890..9d5d2dc5f9f 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5124,6 +5124,8 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); + setDeathState(ALIVE); + SetMovement(MOVE_LAND_WALK); SetMovement(MOVE_UNROOT); @@ -5154,8 +5156,6 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) // update visibility UpdateObjectVisibility(); - setDeathState(ALIVE); - if (!applySickness) return; @@ -22435,12 +22435,9 @@ uint32 Player::GetBaseWeaponSkillValue (WeaponAttackType attType) const void Player::ResurectUsingRequestData() { /// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse - if (IS_PLAYER_GUID(m_resurrectGUID)) - TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation()); + TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation()); - //we cannot resurrect player when we triggered far teleport - //player will be resurrected upon teleportation - if (IsBeingTeleportedFar()) + if (IsBeingTeleported()) { ScheduleDelayedOperation(DELAYED_RESURRECT_PLAYER); return; diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index dbcb07e88f5..d3cc27c9e6c 100755 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -1176,10 +1176,8 @@ void GameEventMgr::GameEventSpawn(int16 event_id) { Creature* creature = new Creature; //sLog->outDebug("Spawning creature %u", *itr); - if (!creature->LoadFromDB(*itr, map)) + if (!creature->LoadCreatureFromDB(*itr, map)) delete creature; - else - map->AddToMap(creature); } } } @@ -1205,7 +1203,8 @@ void GameEventMgr::GameEventSpawn(int16 event_id) { GameObject* pGameobject = new GameObject; //sLog->outDebug("Spawning gameobject %u", *itr); - if (!pGameobject->LoadFromDB(*itr, map)) + //TODO: find out when it is add to map + if (!pGameobject->LoadGameObjectFromDB(*itr, map, false)) delete pGameobject; else { diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 4680d6edc4f..a3a5996a7d9 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1634,13 +1634,12 @@ uint32 ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, float y, float if (!map->Instanceable() && map->IsGridLoaded(x, y)) { GameObject* go = new GameObject; - if (!go->LoadFromDB(guid, map)) + if (!go->LoadGameObjectFromDB(guid, map)) { sLog->outError("AddGOData: cannot add gameobject entry %u to map", entry); delete go; return 0; } - map->AddToMap(go); } sLog->outDebug(LOG_FILTER_MAPS, "AddGOData: dbguid %u entry %u map %u x %f y %f z %f o %f", guid, entry, mapId, x, y, z, o); @@ -1670,13 +1669,12 @@ bool ObjectMgr::MoveCreData(uint32 guid, uint32 mapId, Position pos) if (!map->Instanceable() && map->IsGridLoaded(data.posX, data.posY)) { Creature* creature = new Creature; - if (!creature->LoadFromDB(guid, map)) + if (!creature->LoadCreatureFromDB(guid, map)) { sLog->outError("AddCreature: cannot add creature entry %u to map", guid); delete creature; return false; } - map->AddToMap(creature); } } return true; @@ -1723,13 +1721,12 @@ uint32 ObjectMgr::AddCreData(uint32 entry, uint32 /*team*/, uint32 mapId, float if (!map->Instanceable() && !map->IsRemovalGrid(x, y)) { Creature* creature = new Creature; - if (!creature->LoadFromDB(guid, map)) + if (!creature->LoadCreatureFromDB(guid, map)) { sLog->outError("AddCreature: cannot add creature entry %u to map", entry); delete creature; return 0; } - map->AddToMap(creature); } } @@ -3955,7 +3952,7 @@ void ObjectMgr::LoadQuests() } else { - if (qinfo->RequiredSourceItemCount[j] > 0) + if (qinfo->RequiredSourceItemCount[j]>0) { sLog->outErrorDb("Quest %u has `RequiredSourceItemId%d` = 0 but `RequiredSourceItemCount%d` = %u.", qinfo->GetQuestId(), j+1, j+1, qinfo->RequiredSourceItemCount[j]); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index d9970b79259..4b21f1c7d7d 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -415,21 +415,25 @@ void Map::InitializeObject(Creature* obj) } template<class T> -void Map::AddToMap(T *obj) +bool Map::AddToMap(T *obj) { //TODO: Needs clean up. An object should not be added to map twice. if (obj->IsInWorld()) { ASSERT(obj->IsInGrid()); obj->UpdateObjectVisibility(true); - return; + return true; } CellCoord cellCoord = Trinity::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY()); + //It will create many problems (including crashes) if an object is not added to grid after creation + //The correct way to fix it is to make AddToMap return false and delete the object if it is not added to grid + //But now AddToMap is used in too many places, I will just see how many ASSERT failures it will cause + ASSERT(cellCoord.IsCoordValid()); if (!cellCoord.IsCoordValid()) { sLog->outError("Map::Add: Object " UI64FMTD " has invalid coordinates X:%f Y:%f grid cell [%u:%u]", obj->GetGUID(), obj->GetPositionX(), obj->GetPositionY(), cellCoord.x_coord, cellCoord.y_coord); - return; + return false; //Should delete object } Cell cell(cellCoord); @@ -452,6 +456,7 @@ void Map::AddToMap(T *obj) //something, such as vehicle, needs to be update immediately //also, trigger needs to cast spell, if not update, cannot see visual obj->UpdateObjectVisibility(true); + return true; } bool Map::IsGridLoaded(const GridCoord &p) const @@ -660,8 +665,7 @@ void Map::RemovePlayerFromMap(Player* player, bool remove) } template<class T> -void -Map::RemoveFromMap(T *obj, bool remove) +void Map::RemoveFromMap(T *obj, bool remove) { obj->RemoveFromWorld(); if (obj->isActiveObject()) @@ -2137,10 +2141,10 @@ void Map::RemoveFromActive(Creature* c) } } -template void Map::AddToMap(Corpse*); -template void Map::AddToMap(Creature*); -template void Map::AddToMap(GameObject*); -template void Map::AddToMap(DynamicObject*); +template bool Map::AddToMap(Corpse*); +template bool Map::AddToMap(Creature*); +template bool Map::AddToMap(GameObject*); +template bool Map::AddToMap(DynamicObject*); template void Map::RemoveFromMap(Corpse*, bool); template void Map::RemoveFromMap(Creature*, bool); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 9caef8457b8..5b652a2524a 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -246,7 +246,7 @@ class Map : public GridRefManager<NGridType> virtual bool AddPlayerToMap(Player*); virtual void RemovePlayerFromMap(Player*, bool); - template<class T> void AddToMap(T *); + template<class T> bool AddToMap(T *); template<class T> void RemoveFromMap(T *, bool); void VisitNearbyCellsOf(WorldObject* obj, TypeContainerVisitor<Trinity::ObjectUpdater, GridTypeMapContainer> &gridVisitor, TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer> &worldVisitor); diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index bd8840ff8a8..96bb4a211eb 100755 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -365,13 +365,11 @@ void PoolGroup<Creature>::Spawn1Object(PoolObject* obj) { Creature* creature = new Creature; //sLog->outDebug(LOG_FILTER_POOLSYS, "Spawning creature %u", guid); - if (!creature->LoadFromDB(obj->guid, map)) + if (!creature->LoadCreatureFromDB(obj->guid, map)) { delete creature; return; } - else - map->AddToMap(creature); } } } @@ -391,7 +389,7 @@ void PoolGroup<GameObject>::Spawn1Object(PoolObject* obj) { GameObject* pGameobject = new GameObject; //sLog->outDebug(LOG_FILTER_POOLSYS, "Spawning gameobject %u", guid); - if (!pGameobject->LoadFromDB(obj->guid, map)) + if (!pGameobject->LoadGameObjectFromDB(obj->guid, map, false)) { delete pGameobject; return; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index b533b1a1fe3..55e71fe42d1 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2589,14 +2589,12 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex) if (!caster->IsInWorld()) return; DynamicObject* dynObj = new DynamicObject(); - if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, false, DYNAMIC_OBJECT_AREA_SPELL)) + if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, false, DYNAMIC_OBJECT_AREA_SPELL)) { delete dynObj; return; } - dynObj->GetMap()->AddToMap(dynObj); - if (Aura* aura = Aura::TryCreate(m_spellInfo, MAX_EFFECT_MASK, dynObj, caster, &m_spellValue->EffectBasePoints[0])) { m_spellAura = aura; @@ -3440,16 +3438,13 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) return; DynamicObject* dynObj = new DynamicObject(); - if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) + if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) { delete dynObj; return; } dynObj->SetDuration(duration); - - dynObj->setActive(true); //must before add to map to be put in world container - dynObj->GetMap()->AddToMap(dynObj); //grid will also be loaded dynObj->SetCasterViewpoint(); } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index d5969a94690..21c32ca57b2 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2824,6 +2824,13 @@ void SpellMgr::LoadSpellCustomAttr() case 48689: case 48690: case 48691: + case 6785: // Ravage + case 6787: + case 9866: + case 9867: + case 27005: + case 48578: + case 48579: case 21987: // Lash of Pain case 23959: // Test Stab R50 case 24825: // Test Backstab @@ -2968,6 +2975,7 @@ void SpellMgr::LoadDbcDataCorrections() case 51904: // Summon Ghouls On Scarlet Crusade (this should use conditions table, script for this spell needs to be fixed) case 2895: // Wrath of Air Totem rank 1 (Aura) case 68933: // Wrath of Air Totem rank 2 (Aura) + case 29200: // Purify Helboar Meat spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER; spellInfo->EffectImplicitTargetB[0] = 0; break; |
