diff options
27 files changed, 204 insertions, 109 deletions
diff --git a/sql/updates/world/2011_11_28_00_world_achievement_criteria_data.sql b/sql/updates/world/2011_11_28_00_world_achievement_criteria_data.sql new file mode 100644 index 00000000000..9fea807a97c --- /dev/null +++ b/sql/updates/world/2011_11_28_00_world_achievement_criteria_data.sql @@ -0,0 +1,3 @@ +DELETE FROM achievement_criteria_data WHERE criteria_id = 3693; +INSERT INTO achievement_criteria_data VALUES +(3693, 11, 0, 0, 'achievement_bg_control_all_nodes'); diff --git a/sql/updates/world/2011_11_29_00_world_spell_script.sql b/sql/updates/world/2011_11_29_00_world_spell_script.sql new file mode 100644 index 00000000000..ff87ebff788 --- /dev/null +++ b/sql/updates/world/2011_11_29_00_world_spell_script.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gen_damage_reduction_aura' AND `spell_id`=50720; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_warr_vigilance'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(50720,'spell_warr_vigilance'); -- Vigilance diff --git a/sql/updates/world/2011_12_03_00_world_gameobject.sql b/sql/updates/world/2011_12_03_00_world_gameobject.sql new file mode 100644 index 00000000000..5707ee28d12 --- /dev/null +++ b/sql/updates/world/2011_12_03_00_world_gameobject.sql @@ -0,0 +1,4 @@ +DELETE FROM `gameobject` WHERE `guid` IN (207,215) AND `id`=300245; -- TEMP Forgemaster''s Anvil +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(207, 300245, 658, 3, 1, 637.954, -209.544, 533.269, 3.53903, 0, 0, 0.980321, -0.197413, 300, 0, 1), +(215, 300245, 658, 3, 1, 726.268, -237.654, 534.13, 5.5732, 0, 0, 0.347582, -0.93765, 300, 0, 1); diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp index 533a7ca825c..55051fda4bb 100644 --- a/src/server/collision/Maps/TileAssembler.cpp +++ b/src/server/collision/Maps/TileAssembler.cpp @@ -500,7 +500,7 @@ namespace VMAP { model.setGroupModels(groupsArray); - std::string worldModelFileName(iSrcDir); + std::string worldModelFileName(iDestDir); worldModelFileName.push_back('/'); worldModelFileName.append(pModelFilename).append(".vmo"); success = model.writeFile(worldModelFileName); 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; 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..b9ac21cc040 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; } @@ -1123,7 +1126,7 @@ 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); 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) { diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp index 23477741ba1..bcdcc69181a 100755 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp @@ -166,11 +166,15 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId) if (!go->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), 0, 0, 0, 0, 100, GO_STATE_READY)) { delete go; + return true; } - else + + go->SetRespawnTime(0); + + if (!map->AddToMap(go)) { - go->SetRespawnTime(0); - map->AddToMap(go); + delete go; + return true; } } } @@ -189,17 +193,22 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId) Map* map = player->GetMap(); if (!map) { - delete go; - return true; - } + delete go; + return true; + } + if (!go->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), 0, 0, 0, 0, 100, GO_STATE_READY)) { delete go; + return true; } - else + + go->SetRespawnTime(0); + + if (!map->AddToMap(go)) { - go->SetRespawnTime(0); - map->AddToMap(go); + delete go; + return true; } } } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 90abf2073ee..260b0c57563 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1373,9 +1373,9 @@ class spell_gen_damage_reduction_aura : public SpellScriptLoader public: spell_gen_damage_reduction_aura() : SpellScriptLoader("spell_gen_damage_reduction_aura") { } - class spell_gen_damage_reduction_auraScript : public AuraScript + class spell_gen_damage_reduction_AuraScript : public AuraScript { - PrepareAuraScript(spell_gen_damage_reduction_auraScript); + PrepareAuraScript(spell_gen_damage_reduction_AuraScript); bool Validate(SpellInfo const* /*SpellEntry*/) { @@ -1387,19 +1387,16 @@ public: void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - if (!target || target->HasAura(SPELL_DAMAGE_REDUCTION_AURA)) - return; - target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); } void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - if (!target || !target->HasAura(SPELL_DAMAGE_REDUCTION_AURA)) + if (!target->HasAura(SPELL_DAMAGE_REDUCTION_AURA)) return; - if (target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || + if (target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) || target->HasAura(SPELL_RENEWED_HOPE) || target->HasAura(SPELL_VIGILANCE)) @@ -1410,15 +1407,15 @@ public: void Register() { - OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_auraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_auraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; AuraScript* GetAuraScript() const { - return new spell_gen_damage_reduction_auraScript(); + return new spell_gen_damage_reduction_AuraScript(); } }; diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index be6e1c49ee7..b9def701fca 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -89,8 +89,68 @@ class spell_warr_improved_spell_reflection : public SpellScriptLoader } }; +enum DamageReductionAura +{ + SPELL_BLESSING_OF_SANCTUARY = 20911, + SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899, + SPELL_RENEWED_HOPE = 63944, + SPELL_DAMAGE_REDUCTION_AURA = 68066, +}; + +class spell_warr_vigilance : public SpellScriptLoader +{ +public: + spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { } + + class spell_warr_vigilance_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_vigilance_AuraScript); + + bool Validate(SpellInfo const* /*SpellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) + return false; + return true; + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + if (!target->HasAura(SPELL_DAMAGE_REDUCTION_AURA)) + return; + + if (target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || + target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) || + target->HasAura(SPELL_RENEWED_HOPE)) + return; + + target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_vigilance_AuraScript(); + } +}; + void AddSC_warrior_spell_scripts() { new spell_warr_last_stand(); new spell_warr_improved_spell_reflection(); + new spell_warr_vigilance(); } diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp index 2dbbd949526..29cb6c082a2 100755 --- a/src/server/scripts/World/achievement_scripts.cpp +++ b/src/server/scripts/World/achievement_scripts.cpp @@ -24,24 +24,6 @@ #include "BattlegroundAV.h" #include "Vehicle.h" -class achievement_storm_glory : public AchievementCriteriaScript -{ - public: - achievement_storm_glory() : AchievementCriteriaScript("achievement_storm_glory") { } - - bool OnCheck(Player* source, Unit* /*target*/) - { - if (source->GetBattlegroundTypeId() != BATTLEGROUND_EY) - return false; - - Battleground* pEotS = source->GetBattleground(); - if (!pEotS) - return false; - - return pEotS->IsAllNodesConrolledByTeam(source->GetTeam()); - } -}; - class achievement_resilient_victory : public AchievementCriteriaScript { public: @@ -93,11 +75,14 @@ class achievement_save_the_day : public AchievementCriteriaScript if (Player const* player = target->ToPlayer()) { - if (source->GetBattlegroundTypeId() != BATTLEGROUND_WS || !source->GetBattleground()) + Battleground* bg = source->GetBattleground(); + if (!bg) + return false; + + if (bg->GetTypeID(true) != BATTLEGROUND_WS) return false; - BattlegroundWS* pWSG = static_cast<BattlegroundWS*>(source->GetBattleground()); - if (pWSG->GetFlagState(player->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE) + if (static_cast<BattlegroundWS*>(bg)->GetFlagState(player->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE) return true; } return false; @@ -219,7 +204,7 @@ class achievement_everything_counts : public AchievementCriteriaScript if (!bg) return false; - if (source->GetBattlegroundTypeId() != BATTLEGROUND_AV) + if (bg->GetTypeID(true) != BATTLEGROUND_AV) return false; if (static_cast<BattlegroundAV*>(bg)->IsBothMinesControlledByTeam(source->GetTeam())) @@ -240,7 +225,7 @@ class achievement_bg_av_perfection : public AchievementCriteriaScript if (!bg) return false; - if (source->GetBattlegroundTypeId() != BATTLEGROUND_AV) + if (bg->GetTypeID(true) != BATTLEGROUND_AV) return false; if (static_cast<BattlegroundAV*>(bg)->IsAllTowersControlledAndCaptainAlive(source->GetTeam())) @@ -302,7 +287,6 @@ class achievement_bg_sa_defense_of_ancients : public AchievementCriteriaScript void AddSC_achievement_scripts() { - new achievement_storm_glory(); new achievement_resilient_victory(); new achievement_bg_control_all_nodes(); new achievement_save_the_day(); |
