aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/Collision/Management/MMapFactory.cpp2
-rw-r--r--src/common/Collision/Management/MMapFactory.h1
-rw-r--r--src/common/Collision/Management/MMapManager.h2
-rw-r--r--src/common/Collision/Maps/MapDefines.h2
-rw-r--r--src/common/Collision/VMapDefinitions.h4
-rw-r--r--src/common/Common.cpp1
-rw-r--r--src/common/Cryptography/Authentication/AuthCrypt.cpp1
-rw-r--r--src/common/Cryptography/BigNumber.cpp1
-rw-r--r--src/common/Cryptography/BigNumber.h1
-rw-r--r--src/common/Cryptography/HMACSHA1.h1
-rw-r--r--src/common/Debugging/WheatyExceptionReport.cpp2
-rw-r--r--src/common/Debugging/WheatyExceptionReport.h1
-rw-r--r--src/common/Metric/Metric.cpp5
-rw-r--r--src/common/Utilities/ByteConverter.h1
-rw-r--r--src/common/Utilities/EventProcessor.cpp21
-rw-r--r--src/common/Utilities/EventProcessor.h8
-rw-r--r--src/server/database/Database/Field.h1
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp3
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.h3
-rw-r--r--src/server/game/AI/CoreAI/GuardAI.cpp4
-rw-r--r--src/server/game/AI/CoreAI/GuardAI.h1
-rw-r--r--src/server/game/AI/CoreAI/PassiveAI.h1
-rw-r--r--src/server/game/AI/CoreAI/PetAI.h1
-rw-r--r--src/server/game/AI/CoreAI/ReactorAI.h1
-rw-r--r--src/server/game/AI/CoreAI/TotemAI.h1
-rw-r--r--src/server/game/AI/CreatureAIRegistry.cpp1
-rw-r--r--src/server/game/AI/CreatureAIRegistry.h1
-rw-r--r--src/server/game/AI/CreatureAISelector.h1
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp46
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.h2
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.h1
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp1
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.h20
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.h1
-rw-r--r--src/server/game/Chat/Channels/Channel.h1
-rw-r--r--src/server/game/DataStores/DBCStructure.h1
-rw-r--r--src/server/game/DataStores/M2Stores.h2
-rw-r--r--src/server/game/DataStores/M2Structure.h2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp109
-rw-r--r--src/server/game/Entities/Creature/Creature.h3
-rw-r--r--src/server/game/Entities/Creature/CreatureData.h10
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp2
-rw-r--r--src/server/game/Entities/Item/Container/Bag.cpp1
-rw-r--r--src/server/game/Entities/Item/Container/Bag.h1
-rw-r--r--src/server/game/Entities/Item/ItemEnchantmentMgr.cpp1
-rw-r--r--src/server/game/Entities/Item/ItemEnchantmentMgr.h1
-rw-r--r--src/server/game/Entities/Object/Object.cpp18
-rw-r--r--src/server/game/Entities/Object/Object.h6
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.cpp1
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.h1
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateMask.h1
-rw-r--r--src/server/game/Entities/Player/CinematicMgr.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Events/GameEventMgr.cpp2
-rw-r--r--src/server/game/Events/GameEventMgr.h1
-rw-r--r--src/server/game/Globals/ObjectAccessor.h1
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp14
-rw-r--r--src/server/game/Globals/ObjectMgr.h2
-rw-r--r--src/server/game/Grids/Cells/Cell.h1
-rw-r--r--src/server/game/Grids/Cells/CellImpl.h1
-rw-r--r--src/server/game/Grids/Dynamic/TypeContainerFunctions.h1
-rw-r--r--src/server/game/Grids/Dynamic/TypeContainerVisitor.h1
-rw-r--r--src/server/game/Grids/Grid.h1
-rw-r--r--src/server/game/Grids/GridLoader.h1
-rw-r--r--src/server/game/Grids/GridRefManager.h1
-rw-r--r--src/server/game/Grids/GridReference.h1
-rw-r--r--src/server/game/Grids/GridStates.cpp1
-rw-r--r--src/server/game/Grids/NGrid.h1
-rw-r--r--src/server/game/Groups/Group.cpp2
-rw-r--r--src/server/game/Groups/GroupRefManager.h1
-rw-r--r--src/server/game/Groups/GroupReference.cpp1
-rw-r--r--src/server/game/Groups/GroupReference.h1
-rw-r--r--src/server/game/Guilds/Guild.cpp1
-rw-r--r--src/server/game/Handlers/AddonHandler.h1
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp10
-rw-r--r--src/server/game/Handlers/MailHandler.cpp3
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp1
-rw-r--r--src/server/game/Handlers/NPCHandler.h1
-rw-r--r--src/server/game/Handlers/VoiceChatHandler.cpp1
-rw-r--r--src/server/game/Maps/AreaBoundary.cpp5
-rw-r--r--src/server/game/Maps/AreaBoundary.h1
-rw-r--r--src/server/game/Maps/Map.cpp15
-rw-r--r--src/server/game/Maps/MapRefManager.h1
-rw-r--r--src/server/game/Maps/MapReference.h1
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp28
-rw-r--r--src/server/game/Pools/PoolMgr.cpp103
-rw-r--r--src/server/game/Pools/PoolMgr.h1
-rw-r--r--src/server/game/Reputation/ReputationMgr.cpp4
-rw-r--r--src/server/game/Server/WorldSession.cpp13
-rw-r--r--src/server/game/Server/WorldSession.h12
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp4
-rw-r--r--src/server/game/Spells/SpellMgr.cpp25
-rw-r--r--src/server/game/Spells/SpellMgr.h2
-rw-r--r--src/server/game/Spells/SpellScript.cpp1
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp1
-rw-r--r--src/server/game/Weather/Weather.cpp1
-rw-r--r--src/server/game/World/World.cpp6
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp2
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp5
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h1
-rw-r--r--src/server/scripts/Kalimdor/zone_orgrimmar.cpp2
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp1
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp16
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp16
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp54
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp10
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp47
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp42
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp300
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp90
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h235
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp7
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp6
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp3
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp17
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp1
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp2
-rw-r--r--src/server/scripts/Outland/zone_terokkar_forest.cpp334
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp229
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp2
-rw-r--r--src/server/scripts/World/duel_reset.cpp1
-rw-r--r--src/server/scripts/World/go_scripts.cpp63
-rw-r--r--src/server/scripts/World/guards.cpp418
-rw-r--r--src/server/scripts/World/npc_guard.cpp246
-rw-r--r--src/server/scripts/World/npc_innkeeper.cpp22
-rw-r--r--src/server/scripts/World/npcs_special.cpp43
-rw-r--r--src/server/scripts/World/world_script_loader.cpp4
-rw-r--r--src/server/shared/Dynamic/FactoryHolder.h1
-rw-r--r--src/server/shared/Dynamic/LinkedReference/RefManager.h1
-rw-r--r--src/server/shared/Dynamic/TypeList.h1
-rw-r--r--src/server/shared/Memory.h2
-rw-r--r--src/tools/map_extractor/dbcfile.cpp1
-rw-r--r--src/tools/map_extractor/dbcfile.h1
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp6
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.h1
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp4
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp6
168 files changed, 1127 insertions, 1740 deletions
diff --git a/src/common/Collision/Management/MMapFactory.cpp b/src/common/Collision/Management/MMapFactory.cpp
index 02295c2b2db..6834756dca6 100644
--- a/src/common/Collision/Management/MMapFactory.cpp
+++ b/src/common/Collision/Management/MMapFactory.cpp
@@ -41,4 +41,4 @@ namespace MMAP
g_MMapManager = nullptr;
}
}
-} \ No newline at end of file
+}
diff --git a/src/common/Collision/Management/MMapFactory.h b/src/common/Collision/Management/MMapFactory.h
index 4aa39c6ffcc..770cec1bf1a 100644
--- a/src/common/Collision/Management/MMapFactory.h
+++ b/src/common/Collision/Management/MMapFactory.h
@@ -47,4 +47,3 @@ namespace MMAP
}
#endif
-
diff --git a/src/common/Collision/Management/MMapManager.h b/src/common/Collision/Management/MMapManager.h
index e55a9a3a9d0..296eb813206 100644
--- a/src/common/Collision/Management/MMapManager.h
+++ b/src/common/Collision/Management/MMapManager.h
@@ -86,4 +86,4 @@ namespace MMAP
};
}
-#endif \ No newline at end of file
+#endif
diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h
index 3dd19735ff9..ad7bdd5fddc 100644
--- a/src/common/Collision/Maps/MapDefines.h
+++ b/src/common/Collision/Maps/MapDefines.h
@@ -22,7 +22,7 @@
#include "DetourNavMesh.h"
const uint32 MMAP_MAGIC = 0x4d4d4150; // 'MMAP'
-#define MMAP_VERSION 6
+#define MMAP_VERSION 7
struct MmapTileHeader
{
diff --git a/src/common/Collision/VMapDefinitions.h b/src/common/Collision/VMapDefinitions.h
index d5beac48a3c..5af52770dd3 100644
--- a/src/common/Collision/VMapDefinitions.h
+++ b/src/common/Collision/VMapDefinitions.h
@@ -25,8 +25,8 @@
namespace VMAP
{
- const char VMAP_MAGIC[] = "VMAP_4.3";
- const char RAW_VMAP_MAGIC[] = "VMAP043"; // used in extracted vmap files with raw data
+ const char VMAP_MAGIC[] = "VMAP_4.4";
+ const char RAW_VMAP_MAGIC[] = "VMAP044"; // used in extracted vmap files with raw data
const char GAMEOBJECT_MODELS[] = "GameObjectModels.dtree";
// defined in TileAssembler.cpp currently...
diff --git a/src/common/Common.cpp b/src/common/Common.cpp
index 9e361c35e11..a41cf23fadb 100644
--- a/src/common/Common.cpp
+++ b/src/common/Common.cpp
@@ -39,4 +39,3 @@ LocaleConstant GetLocaleByName(const std::string& name)
return LOCALE_enUS; // including enGB case
}
-
diff --git a/src/common/Cryptography/Authentication/AuthCrypt.cpp b/src/common/Cryptography/Authentication/AuthCrypt.cpp
index 64d29782424..2b6eb3a5229 100644
--- a/src/common/Cryptography/Authentication/AuthCrypt.cpp
+++ b/src/common/Cryptography/Authentication/AuthCrypt.cpp
@@ -72,4 +72,3 @@ void AuthCrypt::EncryptSend(uint8 *data, size_t len)
_serverEncrypt.UpdateData(len, data);
}
-
diff --git a/src/common/Cryptography/BigNumber.cpp b/src/common/Cryptography/BigNumber.cpp
index c67e8c8fbbc..93463fedbd7 100644
--- a/src/common/Cryptography/BigNumber.cpp
+++ b/src/common/Cryptography/BigNumber.cpp
@@ -209,4 +209,3 @@ std::string BigNumber::AsDecStr() const
OPENSSL_free(ch);
return ret;
}
-
diff --git a/src/common/Cryptography/BigNumber.h b/src/common/Cryptography/BigNumber.h
index 8936ffffe53..0e68a760497 100644
--- a/src/common/Cryptography/BigNumber.h
+++ b/src/common/Cryptography/BigNumber.h
@@ -99,4 +99,3 @@ class TC_COMMON_API BigNumber
};
#endif
-
diff --git a/src/common/Cryptography/HMACSHA1.h b/src/common/Cryptography/HMACSHA1.h
index 972c9b02012..6b66a2a78d9 100644
--- a/src/common/Cryptography/HMACSHA1.h
+++ b/src/common/Cryptography/HMACSHA1.h
@@ -44,4 +44,3 @@ class TC_COMMON_API HmacHash
uint8 m_digest[SHA_DIGEST_LENGTH];
};
#endif
-
diff --git a/src/common/Debugging/WheatyExceptionReport.cpp b/src/common/Debugging/WheatyExceptionReport.cpp
index e818df4e8fb..f541efcc001 100644
--- a/src/common/Debugging/WheatyExceptionReport.cpp
+++ b/src/common/Debugging/WheatyExceptionReport.cpp
@@ -1028,7 +1028,7 @@ bool logChildren)
ULONG64 length;
SymGetTypeInfo(m_hProcess, modBase, innerTypeID, TI_GET_LENGTH, &length);
char buffer2[50];
- FormatOutputValue(buffer2, basicType, length, (PVOID)address, sizeof(buffer));
+ FormatOutputValue(buffer2, basicType, length, (PVOID)address, sizeof(buffer2));
symbolDetails.top().Value = buffer2;
}
bHandled = true;
diff --git a/src/common/Debugging/WheatyExceptionReport.h b/src/common/Debugging/WheatyExceptionReport.h
index 2fee14708f2..6a3560f1993 100644
--- a/src/common/Debugging/WheatyExceptionReport.h
+++ b/src/common/Debugging/WheatyExceptionReport.h
@@ -212,4 +212,3 @@ class WheatyExceptionReport
extern WheatyExceptionReport g_WheatyExceptionReport; // global instance of class
#endif // _WIN32
#endif // _WHEATYEXCEPTIONREPORT_
-
diff --git a/src/common/Metric/Metric.cpp b/src/common/Metric/Metric.cpp
index 10f0d13b688..e208cdc4aec 100644
--- a/src/common/Metric/Metric.cpp
+++ b/src/common/Metric/Metric.cpp
@@ -217,7 +217,12 @@ void Metric::ForceSend()
{
// Send what's queued only if io_service is stopped (so only on shutdown)
if (_enabled && _batchTimer->get_io_service().stopped())
+ {
+ _enabled = false;
SendBatch();
+ _batchTimer->cancel();
+ _overallStatusTimer->cancel();
+ }
}
void Metric::ScheduleOverallStatusLog()
diff --git a/src/common/Utilities/ByteConverter.h b/src/common/Utilities/ByteConverter.h
index 29d7497f242..18047d0d3a5 100644
--- a/src/common/Utilities/ByteConverter.h
+++ b/src/common/Utilities/ByteConverter.h
@@ -65,4 +65,3 @@ inline void EndianConvertReverse(uint8&) { }
inline void EndianConvertReverse( int8&) { }
#endif
-
diff --git a/src/common/Utilities/EventProcessor.cpp b/src/common/Utilities/EventProcessor.cpp
index 0149f222da8..eda5c5ed5ac 100644
--- a/src/common/Utilities/EventProcessor.cpp
+++ b/src/common/Utilities/EventProcessor.cpp
@@ -111,29 +111,24 @@ void EventProcessor::KillAllEvents(bool force)
m_events.clear();
}
-void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime)
+void EventProcessor::AddEvent(BasicEvent* event, uint64 e_time, bool set_addtime)
{
if (set_addtime)
- Event->m_addTime = m_time;
- Event->m_execTime = e_time;
- m_events.insert(std::pair<uint64, BasicEvent*>(e_time, Event));
+ event->m_addTime = m_time;
+ event->m_execTime = e_time;
+ m_events.insert(std::pair<uint64, BasicEvent*>(e_time, event));
}
-void EventProcessor::ModifyEventTime(BasicEvent* Event, uint64 newTime)
+void EventProcessor::ModifyEventTime(BasicEvent* event, uint64 newTime)
{
for (auto itr = m_events.begin(); itr != m_events.end(); ++itr)
{
- if (itr->second != Event)
+ if (itr->second != event)
continue;
- Event->m_execTime = newTime;
+ event->m_execTime = newTime;
m_events.erase(itr);
- m_events.insert(std::pair<uint64, BasicEvent*>(newTime, Event));
+ m_events.insert(std::pair<uint64, BasicEvent*>(newTime, event));
break;
}
}
-
-uint64 EventProcessor::CalculateTime(uint64 t_offset) const
-{
- return(m_time + t_offset);
-}
diff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h
index 9a356b0e3f5..488d4a98649 100644
--- a/src/common/Utilities/EventProcessor.h
+++ b/src/common/Utilities/EventProcessor.h
@@ -20,6 +20,7 @@
#define __EVENTPROCESSOR_H
#include "Define.h"
+#include "Duration.h"
#include <map>
class EventProcessor;
@@ -76,9 +77,10 @@ class TC_COMMON_API EventProcessor
void Update(uint32 p_time);
void KillAllEvents(bool force);
- void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime = true);
- void ModifyEventTime(BasicEvent* Event, uint64 newTime);
- uint64 CalculateTime(uint64 t_offset) const;
+ void AddEvent(BasicEvent* event, uint64 e_time, bool set_addtime = true);
+ void AddEventAtOffset(BasicEvent* event, Milliseconds const& offset) { AddEvent(event, CalculateTime(offset.count())); }
+ void ModifyEventTime(BasicEvent* event, uint64 newTime);
+ uint64 CalculateTime(uint64 t_offset) const { return m_time + t_offset; }
protected:
uint64 m_time;
diff --git a/src/server/database/Database/Field.h b/src/server/database/Database/Field.h
index f7f8397b761..d0df441b608 100644
--- a/src/server/database/Database/Field.h
+++ b/src/server/database/Database/Field.h
@@ -143,4 +143,3 @@ class TC_DATABASE_API Field
};
#endif
-
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index 398973a7e85..33b691efaf7 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -127,6 +127,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, houseid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH);
PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, houseid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_AUCTION_BIDDERS, "SELECT id, bidderguid FROM auctionbidders", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_AUCTION_BIDDERS, "INSERT IGNORE INTO auctionbidders (id, bidderguid) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_AUCTION_BIDDERS, "DELETE FROM auctionbidders WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET buyguid = ?, lastbid = ? WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?", CONNECTION_ASYNC);
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h
index 8f59059abc0..8803ab3c6b3 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.h
+++ b/src/server/database/Database/Implementation/CharacterDatabase.h
@@ -113,6 +113,9 @@ enum CharacterDatabaseStatements : uint32
CHAR_DEL_AUCTION,
CHAR_UPD_AUCTION_BID,
CHAR_SEL_AUCTIONS,
+ CHAR_SEL_AUCTION_BIDDERS,
+ CHAR_INS_AUCTION_BIDDERS,
+ CHAR_DEL_AUCTION_BIDDERS,
CHAR_INS_MAIL,
CHAR_DEL_MAIL_BY_ID,
CHAR_INS_MAIL_ITEM,
diff --git a/src/server/game/AI/CoreAI/GuardAI.cpp b/src/server/game/AI/CoreAI/GuardAI.cpp
index 7f65af41d63..acc2e69ee06 100644
--- a/src/server/game/AI/CoreAI/GuardAI.cpp
+++ b/src/server/game/AI/CoreAI/GuardAI.cpp
@@ -67,9 +67,7 @@ void GuardAI::EnterEvadeMode(EvadeReason /*why*/)
me->GetThreatManager().ClearAllThreat();
me->CombatStop(true);
- // Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
- me->GetMotionMaster()->MoveTargetedHome();
+ me->GetMotionMaster()->MoveTargetedHome();
}
void GuardAI::JustDied(Unit* killer)
diff --git a/src/server/game/AI/CoreAI/GuardAI.h b/src/server/game/AI/CoreAI/GuardAI.h
index 77b83340c91..ebb65f3e5ea 100644
--- a/src/server/game/AI/CoreAI/GuardAI.h
+++ b/src/server/game/AI/CoreAI/GuardAI.h
@@ -36,4 +36,3 @@ class TC_GAME_API GuardAI : public ScriptedAI
void JustDied(Unit* killer) override;
};
#endif
-
diff --git a/src/server/game/AI/CoreAI/PassiveAI.h b/src/server/game/AI/CoreAI/PassiveAI.h
index 277d52f2ec9..687434559af 100644
--- a/src/server/game/AI/CoreAI/PassiveAI.h
+++ b/src/server/game/AI/CoreAI/PassiveAI.h
@@ -86,4 +86,3 @@ class TC_GAME_API TriggerAI : public NullCreatureAI
};
#endif
-
diff --git a/src/server/game/AI/CoreAI/PetAI.h b/src/server/game/AI/CoreAI/PetAI.h
index 7dda6a38644..bf62aff3015 100644
--- a/src/server/game/AI/CoreAI/PetAI.h
+++ b/src/server/game/AI/CoreAI/PetAI.h
@@ -71,4 +71,3 @@ class TC_GAME_API PetAI : public CreatureAI
void ClearCharmInfoFlags();
};
#endif
-
diff --git a/src/server/game/AI/CoreAI/ReactorAI.h b/src/server/game/AI/CoreAI/ReactorAI.h
index db1f60fc263..570e74372bd 100644
--- a/src/server/game/AI/CoreAI/ReactorAI.h
+++ b/src/server/game/AI/CoreAI/ReactorAI.h
@@ -33,4 +33,3 @@ class TC_GAME_API ReactorAI : public CreatureAI
static int32 Permissible(Creature const* creature);
};
#endif
-
diff --git a/src/server/game/AI/CoreAI/TotemAI.h b/src/server/game/AI/CoreAI/TotemAI.h
index 31fb68c6f60..60f27f7721b 100644
--- a/src/server/game/AI/CoreAI/TotemAI.h
+++ b/src/server/game/AI/CoreAI/TotemAI.h
@@ -42,4 +42,3 @@ class TC_GAME_API TotemAI : public CreatureAI
ObjectGuid i_victimGuid;
};
#endif
-
diff --git a/src/server/game/AI/CreatureAIRegistry.cpp b/src/server/game/AI/CreatureAIRegistry.cpp
index a89c410a93b..4e638a3bed1 100644
--- a/src/server/game/AI/CreatureAIRegistry.cpp
+++ b/src/server/game/AI/CreatureAIRegistry.cpp
@@ -59,4 +59,3 @@ namespace AIRegistry
(new MovementGeneratorFactory<WaypointMovementGenerator<Creature>>(WAYPOINT_MOTION_TYPE))->RegisterSelf();
}
}
-
diff --git a/src/server/game/AI/CreatureAIRegistry.h b/src/server/game/AI/CreatureAIRegistry.h
index 0917099890b..1a62699af63 100644
--- a/src/server/game/AI/CreatureAIRegistry.h
+++ b/src/server/game/AI/CreatureAIRegistry.h
@@ -24,4 +24,3 @@ namespace AIRegistry
void Initialize(void);
}
#endif
-
diff --git a/src/server/game/AI/CreatureAISelector.h b/src/server/game/AI/CreatureAISelector.h
index aeeb60fdca0..501a39eaa87 100644
--- a/src/server/game/AI/CreatureAISelector.h
+++ b/src/server/game/AI/CreatureAISelector.h
@@ -33,4 +33,3 @@ namespace FactorySelector
TC_GAME_API GameObjectAI* SelectGameObjectAI(GameObject* go);
}
#endif
-
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index 1dabff8a76e..d4faa188493 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -355,21 +355,37 @@ void AuctionHouseMgr::LoadAuctions()
uint32 oldMSTime = getMSTime();
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTIONS);
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
+ PreparedQueryResult resultAuctions = CharacterDatabase.Query(stmt);
- if (!result)
+ if (!resultAuctions)
{
TC_LOG_INFO("server.loading", ">> Loaded 0 auctions. DB table `auctionhouse` is empty.");
return;
}
- uint32 count = 0;
+ // parse bidder list
+ std::unordered_map<uint32, std::unordered_set<ObjectGuid>> biddersByAuction;
+ PreparedStatement* stmt2 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTION_BIDDERS);
+ uint32 countBidders = 0;
+ if (PreparedQueryResult resultBidders = CharacterDatabase.Query(stmt2))
+ {
+ do
+ {
+ Field* fields = resultBidders->Fetch();
+ biddersByAuction[fields[0].GetUInt32()].insert(ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt32()));
+ ++countBidders;
+ }
+ while (resultBidders->NextRow());
+ }
+
+ // parse auctions from db
+ uint32 countAuctions = 0;
SQLTransaction trans = CharacterDatabase.BeginTransaction();
do
{
- Field* fields = result->Fetch();
+ Field* fields = resultAuctions->Fetch();
AuctionEntry* aItem = new AuctionEntry();
if (!aItem->LoadFromDB(fields))
@@ -379,14 +395,17 @@ void AuctionHouseMgr::LoadAuctions()
continue;
}
+ auto it = biddersByAuction.find(aItem->Id);
+ if (it != biddersByAuction.end())
+ aItem->bidders = std::move(it->second);
+
GetAuctionsMapByHouseId(aItem->houseId)->AddAuction(aItem);
- ++count;
- } while (result->NextRow());
+ ++countAuctions;
+ } while (resultAuctions->NextRow());
CharacterDatabase.CommitTransaction(trans);
- TC_LOG_INFO("server.loading", ">> Loaded %u auctions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
-
+ TC_LOG_INFO("server.loading", ">> Loaded %u auctions with %u bidders in %u ms", countAuctions, countBidders, GetMSTimeDiffToNow(oldMSTime));
}
void AuctionHouseMgr::AddAItem(Item* it)
@@ -656,7 +675,7 @@ void AuctionHouseObject::BuildListBidderItems(WorldPacket& data, Player* player,
for (AuctionEntryMap::const_iterator itr = AuctionsMap.begin(); itr != AuctionsMap.end(); ++itr)
{
AuctionEntry* Aentry = itr->second;
- if (Aentry && Aentry->bidder == player->GetGUID().GetCounter())
+ if (Aentry && Aentry->bidders.find(player->GetGUID()) != Aentry->bidders.end())
{
if (itr->second->BuildAuctionInfo(data))
++count;
@@ -863,7 +882,13 @@ uint32 AuctionEntry::GetAuctionOutBid() const
void AuctionEntry::DeleteFromDB(SQLTransaction& trans) const
{
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_AUCTION);
+ PreparedStatement* stmt;
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_AUCTION);
+ stmt->setUInt32(0, Id);
+ trans->Append(stmt);
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_AUCTION_BIDDERS);
stmt->setUInt32(0, Id);
trans->Append(stmt);
}
@@ -913,6 +938,7 @@ bool AuctionEntry::LoadFromDB(Field* fields)
TC_LOG_ERROR("misc", "Auction %u has not a existing item : %u", Id, itemGUIDLow);
return false;
}
+
return true;
}
std::string AuctionEntry::BuildAuctionMailSubject(MailAuctionAnswers response) const
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h
index 2fad4264d15..3c2080b1ad5 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.h
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h
@@ -88,6 +88,7 @@ struct TC_GAME_API AuctionEntry
ObjectGuid::LowType bidder;
uint32 deposit; //deposit can be calculated only when creating auction
uint32 etime;
+ std::unordered_set<ObjectGuid> bidders;
AuctionHouseEntry const* auctionHouseEntry; // in AuctionHouse.dbc
// helpers
@@ -164,7 +165,6 @@ class TC_GAME_API AuctionHouseMgr
AuctionHouseObject* GetAuctionsMap(uint32 factionTemplateId);
AuctionHouseObject* GetAuctionsMapByHouseId(uint8 auctionHouseId);
- AuctionHouseObject* GetBidsMap(uint32 factionTemplateId);
Item* GetAItem(ObjectGuid::LowType id)
{
diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h
index 38f2b7daaaa..7b3087813b2 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.h
+++ b/src/server/game/Battlegrounds/ArenaTeam.h
@@ -200,4 +200,3 @@ class TC_GAME_API ArenaTeam
ArenaTeamStats Stats;
};
#endif
-
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index 76e3d7ea08c..e22a2ee38ee 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -1026,4 +1026,3 @@ void BattlegroundMgr::RemoveBattleground(BattlegroundTypeId bgTypeId, uint32 ins
{
bgDataStore[bgTypeId].m_Battlegrounds.erase(instanceId);
}
-
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
index 9adaea025d3..7336caaf0d7 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
@@ -987,19 +987,19 @@ Position const BG_AV_CreaturePos[AV_CPLACE_MAX] =
enum BG_AV_CreatureIds
{
- AV_NPC_A_TOWERDEFENSE = 0, // stormpike bowman
- AV_NPC_A_GRAVEDEFENSE0 = 1, // stormpike Defender
- AV_NPC_A_GRAVEDEFENSE1 = 2, // seasoned defender
- AV_NPC_A_GRAVEDEFENSE2 = 3, // veteran defender
- AV_NPC_A_GRAVEDEFENSE3 = 4, // champion defender
+ AV_NPC_A_GRAVEDEFENSE0 = 0, // stormpike Defender
+ AV_NPC_A_GRAVEDEFENSE1 = 1, // seasoned defender
+ AV_NPC_A_GRAVEDEFENSE2 = 2, // veteran defender
+ AV_NPC_A_GRAVEDEFENSE3 = 3, // champion defender
+ AV_NPC_A_TOWERDEFENSE = 4, // stormpike bowman
AV_NPC_A_CAPTAIN = 5, // balinda
AV_NPC_A_BOSS = 6, // vanndar
- AV_NPC_H_TOWERDEFENSE = 7, // frostwolf bowman
- AV_NPC_H_GRAVEDEFENSE0 = 8, // frostwolf guardian
- AV_NPC_H_GRAVEDEFENSE1 = 9, // seasoned guardian
- AV_NPC_H_GRAVEDEFENSE2 = 10, // veteran guardian
- AV_NPC_H_GRAVEDEFENSE3 = 11, // champion guardian
+ AV_NPC_H_GRAVEDEFENSE0 = 7, // frostwolf guardian
+ AV_NPC_H_GRAVEDEFENSE1 = 8, // seasoned guardian
+ AV_NPC_H_GRAVEDEFENSE2 = 9, // veteran guardian
+ AV_NPC_H_GRAVEDEFENSE3 = 10, // champion guardian
+ AV_NPC_H_TOWERDEFENSE = 11, // frostwolf bowman
AV_NPC_H_CAPTAIN = 12, // galvangar
AV_NPC_H_BOSS = 13, // drek thar
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
index 2555bc40a29..8451253dec9 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
@@ -432,4 +432,3 @@ class BattlegroundEY : public Battleground
uint32 m_HonorTics;
};
#endif
-
diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h
index 364bec73a5f..ac3fe7b747e 100644
--- a/src/server/game/Chat/Channels/Channel.h
+++ b/src/server/game/Chat/Channels/Channel.h
@@ -253,4 +253,3 @@ class TC_GAME_API Channel
AreaTableEntry const* _zoneEntry;
};
#endif
-
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 409f1ec25f7..195d51b02cc 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -1895,4 +1895,3 @@ typedef std::vector<TaxiPathNodeEntry const*> TaxiPathNodeList;
typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath;
#endif
-
diff --git a/src/server/game/DataStores/M2Stores.h b/src/server/game/DataStores/M2Stores.h
index b37bff395d5..ab05aa9a29f 100644
--- a/src/server/game/DataStores/M2Stores.h
+++ b/src/server/game/DataStores/M2Stores.h
@@ -32,4 +32,4 @@ TC_GAME_API void LoadM2Cameras(std::string const& dataPath);
TC_GAME_API std::vector<FlyByCamera> const* GetFlyByCameras(uint32 cinematicCameraId);
-#endif \ No newline at end of file
+#endif
diff --git a/src/server/game/DataStores/M2Structure.h b/src/server/game/DataStores/M2Structure.h
index 332563df388..81d69b77e4b 100644
--- a/src/server/game/DataStores/M2Structure.h
+++ b/src/server/game/DataStores/M2Structure.h
@@ -130,4 +130,4 @@ struct M2Camera
};
#pragma pack(pop)
-#endif \ No newline at end of file
+#endif
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 1501e2f2c5b..cc1188ede3e 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -513,6 +513,8 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
SetFloatValue(UNIT_FIELD_HOVERHEIGHT, cinfo->HoverHeight);
+ SetCanDualWield(cinfo->flags_extra & CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK);
+
// checked at loading
m_defaultMovementType = MovementGeneratorType(data ? data->movementType : cinfo->MovementType);
if (!m_respawnradius && m_defaultMovementType == RANDOM_MOTION_TYPE)
@@ -557,6 +559,8 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/,
SetUInt32Value(UNIT_DYNAMIC_FLAGS, dynamicflags);
+ SetCanDualWield(cInfo->flags_extra & CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK);
+
SetAttackTime(BASE_ATTACK, cInfo->BaseAttackTime);
SetAttackTime(OFF_ATTACK, cInfo->BaseAttackTime);
SetAttackTime(RANGED_ATTACK, cInfo->RangeAttackTime);
@@ -2098,101 +2102,6 @@ bool Creature::isWorldBoss() const
return (GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_BOSS_MOB) != 0;
}
-SpellInfo const* Creature::reachWithSpellAttack(Unit* victim)
-{
- if (!victim)
- return nullptr;
-
- for (uint32 i=0; i < MAX_CREATURE_SPELLS; ++i)
- {
- if (!m_spells[i])
- continue;
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(m_spells[i]);
- if (!spellInfo)
- {
- TC_LOG_ERROR("entities.unit", "WORLD: unknown spell id %i", m_spells[i]);
- continue;
- }
-
- bool bcontinue = true;
- for (uint32 j = 0; j < MAX_SPELL_EFFECTS; j++)
- {
- if ((spellInfo->Effects[j].Effect == SPELL_EFFECT_SCHOOL_DAMAGE) ||
- (spellInfo->Effects[j].Effect == SPELL_EFFECT_INSTAKILL) ||
- (spellInfo->Effects[j].Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE) ||
- (spellInfo->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH)
- )
- {
- bcontinue = false;
- break;
- }
- }
- if (bcontinue)
- continue;
-
- if (spellInfo->ManaCost > GetPower(POWER_MANA))
- continue;
- float range = spellInfo->GetMaxRange(false);
- float minrange = spellInfo->GetMinRange(false);
- float dist = GetDistance(victim);
- if (dist > range || dist < minrange)
- continue;
- if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
- continue;
- if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
- continue;
- return spellInfo;
- }
- return nullptr;
-}
-
-SpellInfo const* Creature::reachWithSpellCure(Unit* victim)
-{
- if (!victim)
- return nullptr;
-
- for (uint32 i=0; i < MAX_CREATURE_SPELLS; ++i)
- {
- if (!m_spells[i])
- continue;
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(m_spells[i]);
- if (!spellInfo)
- {
- TC_LOG_ERROR("entities.unit", "WORLD: unknown spell id %i", m_spells[i]);
- continue;
- }
-
- bool bcontinue = true;
- for (uint32 j = 0; j < MAX_SPELL_EFFECTS; j++)
- {
- if ((spellInfo->Effects[j].Effect == SPELL_EFFECT_HEAL))
- {
- bcontinue = false;
- break;
- }
- }
- if (bcontinue)
- continue;
-
- if (spellInfo->ManaCost > GetPower(POWER_MANA))
- continue;
-
- float range = spellInfo->GetMaxRange(true);
- float minrange = spellInfo->GetMinRange(true);
- float dist = GetDistance(victim);
- //if (!isInFront(victim, range) && spellInfo->AttributesEx)
- // continue;
- if (dist > range || dist < minrange)
- continue;
- if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
- continue;
- if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
- continue;
- return spellInfo;
- }
- return nullptr;
-}
-
// select nearest hostile unit within the given distance (regardless of threat list).
Unit* Creature::SelectNearestTarget(float dist, bool playerOnly /* = false */) const
{
@@ -2372,7 +2281,7 @@ void Creature::SaveRespawnTime(uint32 forceDelay, bool savetodb)
return;
}
- uint32 thisRespawnTime = forceDelay ? time(NULL) + forceDelay : m_respawnTime;
+ time_t thisRespawnTime = forceDelay ? time(NULL) + forceDelay : m_respawnTime;
GetMap()->SaveRespawnTime(SPAWN_TYPE_CREATURE, m_spawnId, GetEntry(), thisRespawnTime, GetMap()->GetZoneId(GetHomePosition()), Trinity::ComputeGridCoord(GetHomePosition().GetPositionX(), GetHomePosition().GetPositionY()).GetId(), savetodb && m_creatureData && m_creatureData->dbData);
}
@@ -2768,7 +2677,7 @@ uint32 Creature::GetPetAutoSpellOnPos(uint8 pos) const
float Creature::GetPetChaseDistance() const
{
- float range = MELEE_RANGE;
+ float range = 0.f;
for (uint8 i = 0; i < GetPetAutoSpellSize(); ++i)
{
@@ -2778,10 +2687,8 @@ float Creature::GetPetChaseDistance() const
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID))
{
- if (spellInfo->GetRecoveryTime() == 0 && // No cooldown
- spellInfo->RangeEntry->ID != 1 /*Self*/ && spellInfo->RangeEntry->ID != 2 /*Combat Range*/ &&
- spellInfo->GetMinRange() > range)
- range = spellInfo->GetMinRange();
+ if (spellInfo->GetRecoveryTime() == 0 && spellInfo->RangeEntry->ID != 1 /*Self*/ && spellInfo->RangeEntry->ID != 2 /*Combat Range*/ && spellInfo->GetMaxRange() > range)
+ range = spellInfo->GetMaxRange();
}
}
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 4a7c3362f30..051d0bf6f22 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -203,9 +203,6 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
void RemoveLootMode(uint16 lootMode) { m_LootMode &= ~lootMode; }
void ResetLootMode() { m_LootMode = LOOT_MODE_DEFAULT; }
- SpellInfo const* reachWithSpellAttack(Unit* victim);
- SpellInfo const* reachWithSpellCure(Unit* victim);
-
uint32 m_spells[MAX_CREATURE_SPELLS];
bool CanStartAttack(Unit const* u, bool force) const;
diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h
index de169c97136..f9ae6f24850 100644
--- a/src/server/game/Entities/Creature/CreatureData.h
+++ b/src/server/game/Entities/Creature/CreatureData.h
@@ -43,7 +43,7 @@ enum CreatureFlagsExtra : uint32
CREATURE_FLAG_EXTRA_NO_TAUNT = 0x00000100, // creature is immune to taunt auras and effect attack me
CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE = 0x00000200, // creature won't update movement flags
CREATURE_FLAG_EXTRA_GHOST_VISIBILITY = 0x00000400, // creature will be only visible for dead players
- CREATURE_FLAG_EXTRA_UNUSED_11 = 0x00000800,
+ CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK = 0x00000800, // creature will use offhand attacks
CREATURE_FLAG_EXTRA_UNUSED_12 = 0x00001000,
CREATURE_FLAG_EXTRA_UNUSED_13 = 0x00002000,
CREATURE_FLAG_EXTRA_WORLDEVENT = 0x00004000, // custom flag for world event creatures (left room for merging)
@@ -66,10 +66,10 @@ enum CreatureFlagsExtra : uint32
CREATURE_FLAG_EXTRA_UNUSED_31 = 0x80000000,
// Masks
- CREATURE_FLAG_EXTRA_UNUSED = (CREATURE_FLAG_EXTRA_UNUSED_11 | CREATURE_FLAG_EXTRA_UNUSED_12 | CREATURE_FLAG_EXTRA_UNUSED_13 |
- CREATURE_FLAG_EXTRA_UNUSED_16 | CREATURE_FLAG_EXTRA_UNUSED_22 | CREATURE_FLAG_EXTRA_UNUSED_23 |
- CREATURE_FLAG_EXTRA_UNUSED_24 | CREATURE_FLAG_EXTRA_UNUSED_25 | CREATURE_FLAG_EXTRA_UNUSED_26 |
- CREATURE_FLAG_EXTRA_UNUSED_27 | CREATURE_FLAG_EXTRA_UNUSED_31),
+ CREATURE_FLAG_EXTRA_UNUSED = (CREATURE_FLAG_EXTRA_UNUSED_12 | CREATURE_FLAG_EXTRA_UNUSED_13 | CREATURE_FLAG_EXTRA_UNUSED_16 |
+ CREATURE_FLAG_EXTRA_UNUSED_22 | CREATURE_FLAG_EXTRA_UNUSED_23 | CREATURE_FLAG_EXTRA_UNUSED_24 |
+ CREATURE_FLAG_EXTRA_UNUSED_25 | CREATURE_FLAG_EXTRA_UNUSED_26 | CREATURE_FLAG_EXTRA_UNUSED_27 |
+ CREATURE_FLAG_EXTRA_UNUSED_31),
CREATURE_FLAG_EXTRA_DB_ALLOWED = (0xFFFFFFFF & ~(CREATURE_FLAG_EXTRA_UNUSED | CREATURE_FLAG_EXTRA_DUNGEON_BOSS))
};
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index ce9658ef37e..f7e3bc965d8 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2513,7 +2513,7 @@ public:
virtual G3D::Vector3 GetPosition() const override { return G3D::Vector3(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); }
virtual float GetOrientation() const override { return _owner->GetOrientation(); }
virtual float GetScale() const override { return _owner->GetObjectScale(); }
- virtual void DebugVisualizeCorner(G3D::Vector3 const& corner) const override { _owner->SummonCreature(1, corner.x, corner.y, corner.z, 0, TEMPSUMMON_MANUAL_DESPAWN); }
+ virtual void DebugVisualizeCorner(G3D::Vector3 const& corner) const override { const_cast<GameObject*>(_owner)->SummonCreature(1, corner.x, corner.y, corner.z, 0, TEMPSUMMON_MANUAL_DESPAWN); }
private:
GameObject const* _owner;
diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp
index 847142f2ad4..dd24100c279 100644
--- a/src/server/game/Entities/Item/Container/Bag.cpp
+++ b/src/server/game/Entities/Item/Container/Bag.cpp
@@ -245,4 +245,3 @@ Item* Bag::GetItemByPos(uint8 slot) const
return nullptr;
}
-
diff --git a/src/server/game/Entities/Item/Container/Bag.h b/src/server/game/Entities/Item/Container/Bag.h
index e39a7ed6b66..b9e814788de 100644
--- a/src/server/game/Entities/Item/Container/Bag.h
+++ b/src/server/game/Entities/Item/Container/Bag.h
@@ -70,4 +70,3 @@ inline Item* NewItemOrBag(ItemTemplate const* proto)
return (proto->InventoryType == INVTYPE_BAG) ? new Bag : new Item;
}
#endif
-
diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
index 1468d168ffa..09a2e171f33 100644
--- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
+++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
@@ -244,4 +244,3 @@ uint32 GenerateEnchSuffixFactor(uint32 item_id)
}
return 0;
}
-
diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.h b/src/server/game/Entities/Item/ItemEnchantmentMgr.h
index 9692a491c89..8cec5b25168 100644
--- a/src/server/game/Entities/Item/ItemEnchantmentMgr.h
+++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.h
@@ -27,4 +27,3 @@ TC_GAME_API uint32 GetItemEnchantMod(int32 entry);
TC_GAME_API uint32 GenerateEnchSuffixFactor(uint32 item_id);
#endif
-
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 9e2546f2df7..1a94b420b4c 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1969,13 +1969,13 @@ void WorldObject::ClearZoneScript()
m_zoneScript = nullptr;
}
-TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempSummonType spwtype /*= TEMPSUMMON_MANUAL_DESPAWN*/, uint32 duration /*= 0*/, uint32 /*vehId = 0*/) const
+TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, uint32 despawnTime /*= 0*/, uint32 /*vehId = 0*/)
{
if (Map* map = FindMap())
{
- if (TempSummon* summon = map->SummonCreature(entry, pos, nullptr, duration, isType(TYPEMASK_UNIT) ? (Unit*)this : nullptr))
+ if (TempSummon* summon = map->SummonCreature(entry, pos, nullptr, despawnTime, ToUnit()))
{
- summon->SetTempSummonType(spwtype);
+ summon->SetTempSummonType(despawnType);
return summon;
}
}
@@ -1983,17 +1983,13 @@ TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempS
return nullptr;
}
-TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float ang /*= 0*/, TempSummonType spwtype /*= TEMPSUMMON_MANUAL_DESPAWN*/, uint32 despwtime /*= 0*/) const
+TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float o /*= 0*/, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, uint32 despawnTime /*= 0*/)
{
if (!x && !y && !z)
- {
GetClosePoint(x, y, z, GetCombatReach());
- ang = GetOrientation();
- }
-
- Position pos;
- pos.Relocate(x, y, z, ang);
- return SummonCreature(id, pos, spwtype, despwtime, 0);
+ if (!o)
+ o = GetOrientation();
+ return SummonCreature(id, { x,y,z,o }, despawnType, despawnTime);
}
GameObject* WorldObject::SummonGameObject(uint32 entry, Position const& pos, QuaternionData const& rot, uint32 respawnTime)
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index b6cee547126..2d94496e20b 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -20,6 +20,7 @@
#define _OBJECT_H
#include "Common.h"
+#include "Duration.h"
#include "GridReference.h"
#include "GridRefManager.h"
#include "ModelIgnoreFlags.h"
@@ -372,8 +373,9 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
void ClearZoneScript();
ZoneScript* GetZoneScript() const { return m_zoneScript; }
- TempSummon* SummonCreature(uint32 id, Position const& pos, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, uint32 vehId = 0) const;
- TempSummon* SummonCreature(uint32 id, float x, float y, float z, float ang = 0, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0) const;
+ TempSummon* SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, uint32 despawnTime = 0, uint32 vehId = 0);
+ TempSummon* SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType, Milliseconds const& despawnTime, uint32 vehId = 0) { return SummonCreature(entry, pos, despawnType, uint32(despawnTime.count()), vehId); }
+ TempSummon* SummonCreature(uint32 entry, float x, float y, float z, float o = 0, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, uint32 despawnTime = 0);
GameObject* SummonGameObject(uint32 entry, Position const& pos, QuaternionData const& rot, uint32 respawnTime /* s */);
GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, QuaternionData const& rot, uint32 respawnTime /* s */);
Creature* SummonTrigger(float x, float y, float z, float ang, uint32 dur, CreatureAI* (*GetAI)(Creature*) = nullptr);
diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp
index cb8ecf45e2f..1003562c3af 100644
--- a/src/server/game/Entities/Object/Updates/UpdateData.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp
@@ -147,4 +147,3 @@ void UpdateData::Clear()
m_outOfRangeGUIDs.clear();
m_blockCount = 0;
}
-
diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h
index e3437595c0b..b9a4894aa6d 100644
--- a/src/server/game/Entities/Object/Updates/UpdateData.h
+++ b/src/server/game/Entities/Object/Updates/UpdateData.h
@@ -81,4 +81,3 @@ class UpdateData
UpdateData& operator=(UpdateData const& right) = delete;
};
#endif
-
diff --git a/src/server/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h
index 21fe8d700f7..442314d5e25 100644
--- a/src/server/game/Entities/Object/Updates/UpdateMask.h
+++ b/src/server/game/Entities/Object/Updates/UpdateMask.h
@@ -122,4 +122,3 @@ class UpdateMask
};
#endif
-
diff --git a/src/server/game/Entities/Player/CinematicMgr.h b/src/server/game/Entities/Player/CinematicMgr.h
index f2c0970fb81..e9967a6df28 100644
--- a/src/server/game/Entities/Player/CinematicMgr.h
+++ b/src/server/game/Entities/Player/CinematicMgr.h
@@ -57,4 +57,4 @@ protected:
TempSummon* m_CinematicObject;
};
-#endif \ No newline at end of file
+#endif
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 7bf4e185efd..55473c2922a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -15824,6 +15824,7 @@ void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/)
// Remove seasonal quest also
Quest const* qInfo = sObjectMgr->GetQuestTemplate(questId);
+ ASSERT(qInfo);
if (qInfo->IsSeasonal())
{
uint16 eventId = qInfo->GetEventIdForQuest();
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index bd4c71c06e6..636a386b3b3 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -5889,9 +5889,9 @@ bool Unit::Attack(Unit* victim, bool meleeAttack)
SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
}
- // delay offhand weapon attack to next attack time
+ // delay offhand weapon attack by 50% of the base attack time
if (haveOffhandWeapon() && GetTypeId() != TYPEID_PLAYER)
- resetAttackTimer(OFF_ATTACK);
+ setAttackTimer(OFF_ATTACK, std::max(getAttackTimer(OFF_ATTACK), getAttackTimer(BASE_ATTACK) + uint32(CalculatePct(GetFloatValue(UNIT_FIELD_BASEATTACKTIME), 50))));
if (meleeAttack)
SendMeleeAttackStart(victim);
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index 14fdccce85e..39cb88c670b 100644
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -1774,6 +1774,8 @@ void GameEventMgr::SetHolidayEventTime(GameEventData& event)
timeInfo.tm_hour = (date >> 6) & 0x1F;
timeInfo.tm_min = date & 0x3F;
timeInfo.tm_sec = 0;
+ timeInfo.tm_wday = 0;
+ timeInfo.tm_yday = 0;
timeInfo.tm_isdst = -1;
tm tmCopy = timeInfo;
diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h
index 4d1ce718422..0c2bb6e689c 100644
--- a/src/server/game/Events/GameEventMgr.h
+++ b/src/server/game/Events/GameEventMgr.h
@@ -193,4 +193,3 @@ TC_GAME_API bool IsHolidayActive(HolidayIds id);
TC_GAME_API bool IsEventActive(uint16 event_id);
#endif
-
diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h
index bc4062eed77..cd108b333d8 100644
--- a/src/server/game/Globals/ObjectAccessor.h
+++ b/src/server/game/Globals/ObjectAccessor.h
@@ -111,4 +111,3 @@ namespace ObjectAccessor
};
#endif
-
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 2f1e4fa48f3..ddcc9e7cae4 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -808,6 +808,12 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
ok = true;
}
+ if (cInfo->AIName == "TotemAI")
+ {
+ TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has not-allowed `AIName` '%s' set, removing", cInfo->Entry, cInfo->AIName.c_str());
+ const_cast<CreatureTemplate*>(cInfo)->AIName.clear();
+ }
+
if (!cInfo->AIName.empty() && !sCreatureAIRegistry->HasItem(cInfo->AIName))
{
TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has non-registered `AIName` '%s' set, removing", cInfo->Entry, cInfo->AIName.c_str());
@@ -5992,7 +5998,7 @@ QuestGreeting const* ObjectMgr::GetQuestGreeting(ObjectGuid guid) const
if (questItr == itr->second.end())
return nullptr;
- return questItr->second;
+ return &questItr->second;
}
void ObjectMgr::LoadQuestGreetings()
@@ -6020,7 +6026,7 @@ void ObjectMgr::LoadQuestGreetings()
uint32 id = fields[0].GetUInt32();
uint8 type = fields[1].GetUInt8();
// overwrite
- switch (type)
+ switch (type)
{
case 0: // Creature
type = TYPEID_UNIT;
@@ -6054,7 +6060,7 @@ void ObjectMgr::LoadQuestGreetings()
uint32 greetEmoteDelay = fields[3].GetUInt32();
std::string greeting = fields[4].GetString();
- _questGreetingStore[type][id] = new QuestGreeting(greetEmoteType, greetEmoteDelay, greeting);
+ _questGreetingStore[type][id] = QuestGreeting(greetEmoteType, greetEmoteDelay, greeting);
++count;
}
@@ -7734,7 +7740,7 @@ void ObjectMgr::LoadQuestPOI()
_questPOIStore.at(questId).POIData.QuestPOIBlobDataStats.push_back(POI);
}
else
- TC_LOG_ERROR("server.loading", "Table quest_poi references unknown quest points for quest %u POI id %u", questId, id);
+ TC_LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest %u POI id %u", questId, id);
++count;
} while (result->NextRow());
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 8a07723a34e..80d120a13ea 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -811,7 +811,7 @@ struct QuestGreeting
: greetEmoteType(_greetEmoteType), greetEmoteDelay(_greetEmoteDelay), greeting(_greeting) { }
};
-typedef std::unordered_map<uint8, std::unordered_map<uint32, QuestGreeting const*>> QuestGreetingContainer;
+typedef std::unordered_map<uint8, std::unordered_map<uint32, QuestGreeting>> QuestGreetingContainer;
struct GraveyardData
{
diff --git a/src/server/game/Grids/Cells/Cell.h b/src/server/game/Grids/Cells/Cell.h
index 56aa7f794af..b238e8cf29d 100644
--- a/src/server/game/Grids/Cells/Cell.h
+++ b/src/server/game/Grids/Cells/Cell.h
@@ -125,4 +125,3 @@ private:
};
#endif
-
diff --git a/src/server/game/Grids/Cells/CellImpl.h b/src/server/game/Grids/Cells/CellImpl.h
index 66f1dcae78c..548d00409d3 100644
--- a/src/server/game/Grids/Cells/CellImpl.h
+++ b/src/server/game/Grids/Cells/CellImpl.h
@@ -255,4 +255,3 @@ inline void Cell::VisitAllObjects(float x, float y, Map* map, T& visitor, float
}
#endif
-
diff --git a/src/server/game/Grids/Dynamic/TypeContainerFunctions.h b/src/server/game/Grids/Dynamic/TypeContainerFunctions.h
index 97d20922a05..e1edd28f23a 100644
--- a/src/server/game/Grids/Dynamic/TypeContainerFunctions.h
+++ b/src/server/game/Grids/Dynamic/TypeContainerFunctions.h
@@ -214,4 +214,3 @@ namespace Trinity
//}
}
#endif
-
diff --git a/src/server/game/Grids/Dynamic/TypeContainerVisitor.h b/src/server/game/Grids/Dynamic/TypeContainerVisitor.h
index 2d08da778e9..0ad3e173322 100644
--- a/src/server/game/Grids/Dynamic/TypeContainerVisitor.h
+++ b/src/server/game/Grids/Dynamic/TypeContainerVisitor.h
@@ -101,4 +101,3 @@ class TypeContainerVisitor
VISITOR &i_visitor;
};
#endif
-
diff --git a/src/server/game/Grids/Grid.h b/src/server/game/Grids/Grid.h
index cd358603466..9bdaedc0fba 100644
--- a/src/server/game/Grids/Grid.h
+++ b/src/server/game/Grids/Grid.h
@@ -141,4 +141,3 @@ class Grid
//ActiveGridObjects m_activeGridObjects;
};
#endif
-
diff --git a/src/server/game/Grids/GridLoader.h b/src/server/game/Grids/GridLoader.h
index cbf870fedeb..06bda25d423 100644
--- a/src/server/game/Grids/GridLoader.h
+++ b/src/server/game/Grids/GridLoader.h
@@ -75,4 +75,3 @@ class GridLoader
};
*/
#endif
-
diff --git a/src/server/game/Grids/GridRefManager.h b/src/server/game/Grids/GridRefManager.h
index 89d6cc9e7e6..739eacc3da7 100644
--- a/src/server/game/Grids/GridRefManager.h
+++ b/src/server/game/Grids/GridRefManager.h
@@ -37,4 +37,3 @@ class GridRefManager : public RefManager<GridRefManager<OBJECT>, OBJECT>
iterator end() { return iterator(nullptr); }
};
#endif
-
diff --git a/src/server/game/Grids/GridReference.h b/src/server/game/Grids/GridReference.h
index a85051a8398..69d17b4d8ce 100644
--- a/src/server/game/Grids/GridReference.h
+++ b/src/server/game/Grids/GridReference.h
@@ -50,4 +50,3 @@ class GridReference : public Reference<GridRefManager<OBJECT>, OBJECT>
GridReference* next() { return (GridReference*)Reference<GridRefManager<OBJECT>, OBJECT>::next(); }
};
#endif
-
diff --git a/src/server/game/Grids/GridStates.cpp b/src/server/game/Grids/GridStates.cpp
index 4e3b11154af..61a8553e640 100644
--- a/src/server/game/Grids/GridStates.cpp
+++ b/src/server/game/Grids/GridStates.cpp
@@ -64,4 +64,3 @@ void RemovalState::Update(Map& map, NGridType& grid, GridInfo& info, uint32 diff
}
}
}
-
diff --git a/src/server/game/Grids/NGrid.h b/src/server/game/Grids/NGrid.h
index dc6f2561e4f..a057da26b42 100644
--- a/src/server/game/Grids/NGrid.h
+++ b/src/server/game/Grids/NGrid.h
@@ -187,4 +187,3 @@ class NGrid
bool i_GridObjectDataLoaded;
};
#endif
-
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 79df88b61a5..e82520d4e16 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1501,6 +1501,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
roll->getLoot()->unlootedCount--;
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(roll->itemid);
+ ASSERT(pProto);
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, 13262); // Disenchant
ItemPosCountVec dest;
@@ -2552,4 +2553,3 @@ void Group::ToggleGroupMemberFlag(member_witerator slot, uint8 flag, bool apply)
else
slot->flags &= ~flag;
}
-
diff --git a/src/server/game/Groups/GroupRefManager.h b/src/server/game/Groups/GroupRefManager.h
index d433206bd69..abab0c19688 100644
--- a/src/server/game/Groups/GroupRefManager.h
+++ b/src/server/game/Groups/GroupRefManager.h
@@ -32,4 +32,3 @@ class GroupRefManager : public RefManager<Group, Player>
GroupReference const* getFirst() const { return ((GroupReference const*)RefManager<Group, Player>::getFirst()); }
};
#endif
-
diff --git a/src/server/game/Groups/GroupReference.cpp b/src/server/game/Groups/GroupReference.cpp
index f0cfc4ff689..b56354d3977 100644
--- a/src/server/game/Groups/GroupReference.cpp
+++ b/src/server/game/Groups/GroupReference.cpp
@@ -36,4 +36,3 @@ void GroupReference::sourceObjectDestroyLink()
// called from invalidate()
//getTarget()->DelinkMember(this);
}
-
diff --git a/src/server/game/Groups/GroupReference.h b/src/server/game/Groups/GroupReference.h
index 47d8418c5cb..649f229b086 100644
--- a/src/server/game/Groups/GroupReference.h
+++ b/src/server/game/Groups/GroupReference.h
@@ -40,4 +40,3 @@ class TC_GAME_API GroupReference : public Reference<Group, Player>
void setSubGroup(uint8 pSubGroup) { iSubGroup = pSubGroup; }
};
#endif
-
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 54d802ef546..98d066996fd 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -1709,6 +1709,7 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, std::string const& nam
}
Member const* memberMe = GetMember(player->GetGUID());
+ ASSERT(memberMe);
uint8 rankId = memberMe->GetRankId();
if (demote)
{
diff --git a/src/server/game/Handlers/AddonHandler.h b/src/server/game/Handlers/AddonHandler.h
index ac98cd0a877..f75958182fa 100644
--- a/src/server/game/Handlers/AddonHandler.h
+++ b/src/server/game/Handlers/AddonHandler.h
@@ -36,4 +36,3 @@ class AddonHandler
};
#define sAddOnHandler AddonHandler::instance()
#endif
-
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index a0d6ae3bdd2..89db6ee6e69 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -515,6 +515,16 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData)
stmt->setUInt32(2, auction->Id);
trans->Append(stmt);
+ if (auction->bidders.find(player->GetGUID()) == auction->bidders.end())
+ {
+ // save new bidder in list, and save record to db
+ auction->bidders.insert(player->GetGUID());
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AUCTION_BIDDERS);
+ stmt->setUInt32(0, auction->Id);
+ stmt->setUInt32(1, auction->bidder);
+ trans->Append(stmt);
+ }
+
SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, ERR_AUCTION_OK, 0);
}
else
diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
index fc283e1d3df..3d1b995cd1e 100644
--- a/src/server/game/Handlers/MailHandler.cpp
+++ b/src/server/game/Handlers/MailHandler.cpp
@@ -298,6 +298,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData)
item->DeleteFromInventoryDB(trans); // deletes item from character's inventory
item->SetOwnerGUID(receiverGuid);
+ item->SetState(ITEM_CHANGED);
item->SaveToDB(trans); // recursive and not have transaction guard into self, item not in inventory and can be save standalone
draft.AddItem(item);
@@ -693,7 +694,7 @@ void WorldSession::HandleGetMailList(WorldPacket& recvData)
// durability
data << uint32((item ? item->GetUInt32Value(ITEM_FIELD_DURABILITY) : 0));
// unknown wotlk
- data << uint8(0);
+ data << uint8((item && !item->IsLocked() ? 1 : 0));
}
++realCount;
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index 59344509283..1ddb36c3b56 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -851,4 +851,3 @@ void WorldSession::HandleRepairItemOpcode(WorldPacket& recvData)
_player->DurabilityRepairAll(true, discountMod, guildBank != 0);
}
}
-
diff --git a/src/server/game/Handlers/NPCHandler.h b/src/server/game/Handlers/NPCHandler.h
index 61db8bfb04c..bb8c500c1f8 100644
--- a/src/server/game/Handlers/NPCHandler.h
+++ b/src/server/game/Handlers/NPCHandler.h
@@ -57,4 +57,3 @@ struct NpcTextLocale
std::vector<std::string> Text_1[MAX_GOSSIP_TEXT_OPTIONS];
};
#endif
-
diff --git a/src/server/game/Handlers/VoiceChatHandler.cpp b/src/server/game/Handlers/VoiceChatHandler.cpp
index e67124b0316..8c0aceee3c9 100644
--- a/src/server/game/Handlers/VoiceChatHandler.cpp
+++ b/src/server/game/Handlers/VoiceChatHandler.cpp
@@ -41,4 +41,3 @@ void WorldSession::HandleSetActiveVoiceChannel(WorldPacket& recvData)
recvData.read_skip<uint32>();
recvData.read_skip<char*>();
}
-
diff --git a/src/server/game/Maps/AreaBoundary.cpp b/src/server/game/Maps/AreaBoundary.cpp
index 952d82668bb..6ed21ec50f6 100644
--- a/src/server/game/Maps/AreaBoundary.cpp
+++ b/src/server/game/Maps/AreaBoundary.cpp
@@ -103,6 +103,11 @@ BoundaryUnionBoundary::BoundaryUnionBoundary(AreaBoundary const* b1, AreaBoundar
{
ASSERT(b1 && b2);
}
+BoundaryUnionBoundary::~BoundaryUnionBoundary()
+{
+ delete _b1;
+ delete _b2;
+}
bool BoundaryUnionBoundary::IsWithinBoundaryArea(Position const* pos) const
{
return (_b1->IsWithinBoundary(pos) || _b2->IsWithinBoundary(pos));
diff --git a/src/server/game/Maps/AreaBoundary.h b/src/server/game/Maps/AreaBoundary.h
index 1e8f22e9cd4..dab73e9b51b 100644
--- a/src/server/game/Maps/AreaBoundary.h
+++ b/src/server/game/Maps/AreaBoundary.h
@@ -157,6 +157,7 @@ class TC_GAME_API BoundaryUnionBoundary : public AreaBoundary
BoundaryUnionBoundary(AreaBoundary const* b1, AreaBoundary const* b2, bool isInverted = false);
protected:
+ virtual ~BoundaryUnionBoundary();
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index ee20c63b7e1..f1af14e5b8d 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2680,8 +2680,10 @@ void Map::GetFullTerrainStatusForPosition(float x, float y, float z, PositionFul
if (vmapData.areaInfo)
data.areaInfo = boost::in_place(vmapData.areaInfo->adtId, vmapData.areaInfo->rootId, vmapData.areaInfo->groupId, vmapData.areaInfo->mogpFlags);
+ float mapHeight = VMAP_INVALID_HEIGHT;
GridMap* gmap = const_cast<Map*>(this)->GetGrid(x, y);
- float mapHeight = gmap->getHeight(x, y);
+ if (gmap)
+ mapHeight = gmap->getHeight(x, y);
// area lookup
AreaTableEntry const* areaEntry = nullptr;
@@ -2689,6 +2691,8 @@ void Map::GetFullTerrainStatusForPosition(float x, float y, float z, PositionFul
if (WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(vmapData.areaInfo->rootId, vmapData.areaInfo->adtId, vmapData.areaInfo->groupId))
areaEntry = sAreaTableStore.LookupEntry(wmoEntry->areaId);
+ data.areaId = 0;
+
if (areaEntry)
{
data.floorZ = vmapData.floorZ;
@@ -2697,7 +2701,8 @@ void Map::GetFullTerrainStatusForPosition(float x, float y, float z, PositionFul
else
{
data.floorZ = mapHeight;
- data.areaId = gmap->getArea(x, y);
+ if (gmap)
+ data.areaId = gmap->getArea(x, y);
if (!data.areaId)
data.areaId = i_mapEntry->linked_zone;
@@ -2972,7 +2977,9 @@ bool Map::CheckRespawn(RespawnInfo* info)
{
time_t now = time(NULL);
time_t respawnTime;
- if (sObjectMgr->GetLinkedRespawnGuid(thisGUID) == thisGUID) // never respawn, save "something" in DB
+ if (linkedTime == std::numeric_limits<time_t>::max())
+ respawnTime = linkedTime;
+ else if (sObjectMgr->GetLinkedRespawnGuid(thisGUID) == thisGUID) // never respawn, save "something" in DB
respawnTime = now + WEEK;
else // set us to check again shortly after linked unit
respawnTime = std::max<time_t>(now, linkedTime) + urand(5, 15);
@@ -3257,7 +3264,7 @@ bool Map::SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn, bool force, std::v
TC_LOG_ERROR("maps", "Tried to spawn non-existing (or system) spawn group %u on map %u. Blocked.", groupId, GetId());
return false;
}
-
+
for (auto& pair : sObjectMgr->GetSpawnDataForGroup(groupId))
{
SpawnData const* data = pair.second;
diff --git a/src/server/game/Maps/MapRefManager.h b/src/server/game/Maps/MapRefManager.h
index 4b4a53d78fa..52f7bddfcb6 100644
--- a/src/server/game/Maps/MapRefManager.h
+++ b/src/server/game/Maps/MapRefManager.h
@@ -39,4 +39,3 @@ class MapRefManager : public RefManager<Map, Player>
const_iterator end() const { return const_iterator(nullptr); }
};
#endif
-
diff --git a/src/server/game/Maps/MapReference.h b/src/server/game/Maps/MapReference.h
index 73b0635390e..ee95fd4ba9a 100644
--- a/src/server/game/Maps/MapReference.h
+++ b/src/server/game/Maps/MapReference.h
@@ -39,4 +39,3 @@ class MapReference : public Reference<Map, Player>
MapReference const* nocheck_prev() const { return (MapReference const*)Reference<Map, Player>::nocheck_prev(); }
};
#endif
-
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
index 3fba420059e..74a8588163c 100755
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
@@ -252,16 +252,15 @@ bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* creature, uint32 di
if (!_nextMoveTime.Passed())
{
- _nextMoveTime.Update(diff);
- if (_nextMoveTime.Passed())
- return StartMoveNow(creature);
+ if (creature->movespline->Finalized())
+ {
+ _nextMoveTime.Update(diff);
+ if (_nextMoveTime.Passed())
+ return StartMoveNow(creature);
+ }
}
else
{
- // Set home position at place on waypoint movement.
- if (!creature->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) || creature->GetTransGUID().IsEmpty())
- creature->SetHomePosition(creature->GetPosition());
-
if (creature->movespline->Finalized())
{
OnArrived(creature);
@@ -270,14 +269,21 @@ bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* creature, uint32 di
if (_nextMoveTime.Passed())
return StartMove(creature);
}
- else if (_recalculateSpeed)
+ else
{
- if (_nextMoveTime.Passed())
- StartMove(creature);
+ // Set home position at place on waypoint movement.
+ if (!creature->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) || creature->GetTransGUID().IsEmpty())
+ creature->SetHomePosition(creature->GetPosition());
+
+ if (_recalculateSpeed)
+ {
+ if (_nextMoveTime.Passed())
+ StartMove(creature);
+ }
}
}
return true;
- }
+}
void WaypointMovementGenerator<Creature>::MovementInform(Creature* creature)
{
diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp
index 7ab6c43d410..25b9bd5f363 100644
--- a/src/server/game/Pools/PoolMgr.cpp
+++ b/src/server/game/Pools/PoolMgr.cpp
@@ -153,34 +153,6 @@ bool PoolGroup<T>::CheckPool() const
return true;
}
-template <class T>
-PoolObject* PoolGroup<T>::RollOne(ActivePoolData& spawns, uint32 triggerFrom)
-{
- if (!ExplicitlyChanced.empty())
- {
- float roll = (float)rand_chance();
-
- for (uint32 i = 0; i < ExplicitlyChanced.size(); ++i)
- {
- roll -= ExplicitlyChanced[i].chance;
- // Triggering object is marked as spawned at this time and can be also rolled (respawn case)
- // so this need explicit check for this case
- if (roll < 0 && (ExplicitlyChanced[i].guid == triggerFrom || !spawns.IsActiveObject<T>(ExplicitlyChanced[i].guid)))
- return &ExplicitlyChanced[i];
- }
- }
- if (!EqualChanced.empty())
- {
- uint32 index = urand(0, EqualChanced.size()-1);
- // Triggering object is marked as spawned at this time and can be also rolled (respawn case)
- // so this need explicit check for this case
- if (EqualChanced[index].guid == triggerFrom || !spawns.IsActiveObject<T>(EqualChanced[index].guid))
- return &EqualChanced[index];
- }
-
- return nullptr;
-}
-
// Main method to despawn a creature or gameobject in a pool
// If no guid is passed, the pool is just removed (event end case)
// If guid is filled, cache will be used and no removal will occur, it just fill the cache
@@ -340,7 +312,6 @@ void PoolGroup<Pool>::RemoveOneRelation(uint32 child_pool_id)
template <class T>
void PoolGroup<T>::SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 triggerFrom)
{
- uint32 lastDespawned = 0;
int count = limit - spawns.GetActiveObjectCount(poolId);
// If triggered from some object respawn this object is still marked as spawned
@@ -349,32 +320,70 @@ void PoolGroup<T>::SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 trig
if (triggerFrom)
++count;
- // This will try to spawn the rest of pool, not guaranteed
- for (int i = 0; i < count; ++i)
+ if (count > 0)
{
- PoolObject* obj = RollOne(spawns, triggerFrom);
- if (!obj)
- continue;
- if (obj->guid == lastDespawned)
- continue;
+ PoolObjectList rolledObjects;
+ rolledObjects.reserve(count);
- if (obj->guid == triggerFrom)
+ // roll objects to be spawned
+ if (!ExplicitlyChanced.empty())
{
- ReSpawn1Object(obj);
- triggerFrom = 0;
- continue;
+ while (count && ExplicitlyChanced.size() > rolledObjects.size())
+ {
+ --count;
+ float roll = (float)rand_chance();
+
+ for (PoolObject& obj : ExplicitlyChanced)
+ {
+ roll -= obj.chance;
+ // Triggering object is marked as spawned at this time and can be also rolled (respawn case)
+ // so this need explicit check for this case
+ if (roll < 0 && (obj.guid == triggerFrom || !spawns.IsActiveObject<T>(obj.guid)))
+ {
+ rolledObjects.push_back(obj);
+ break;
+ }
+ }
+ }
+ }
+ else if (!EqualChanced.empty())
+ {
+ rolledObjects = EqualChanced;
+
+ for (auto itr = rolledObjects.begin(); itr != rolledObjects.end();)
+ {
+ // remove most of the active objects so there is higher chance inactive ones are spawned
+ if (spawns.IsActiveObject<T>(itr->guid) && urand(1, 4) != 1)
+ itr = rolledObjects.erase(itr);
+ else
+ ++itr;
+ }
+
+ Trinity::Containers::RandomResize(rolledObjects, count);
}
- spawns.ActivateObject<T>(obj->guid, poolId);
- Spawn1Object(obj);
- if (triggerFrom)
+ // try to spawn rolled objects
+ for (PoolObject& obj : rolledObjects)
{
- // One spawn one despawn no count increase
- DespawnObject(spawns, triggerFrom);
- lastDespawned = triggerFrom;
- triggerFrom = 0;
+ if (spawns.IsActiveObject<T>(obj.guid))
+ continue;
+
+ if (obj.guid == triggerFrom)
+ {
+ ReSpawn1Object(&obj);
+ triggerFrom = 0;
+ }
+ else
+ {
+ spawns.ActivateObject<T>(obj.guid, poolId);
+ Spawn1Object(&obj);
+ }
}
}
+
+ // One spawn one despawn no count increase
+ if (triggerFrom)
+ DespawnObject(spawns, triggerFrom);
}
// Method that is actualy doing the spawn job on 1 creature
diff --git a/src/server/game/Pools/PoolMgr.h b/src/server/game/Pools/PoolMgr.h
index c36e7bd29ef..6de34c05fb4 100644
--- a/src/server/game/Pools/PoolMgr.h
+++ b/src/server/game/Pools/PoolMgr.h
@@ -77,7 +77,6 @@ class TC_GAME_API PoolGroup
bool isEmpty() const { return ExplicitlyChanced.empty() && EqualChanced.empty(); }
void AddEntry(PoolObject& poolitem, uint32 maxentries);
bool CheckPool() const;
- PoolObject* RollOne(ActivePoolData& spawns, uint32 triggerFrom);
void DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType guid=0);
void Despawn1Object(ObjectGuid::LowType guid);
void SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 triggerFrom);
diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
index b688a212464..3ccec22e7c4 100644
--- a/src/server/game/Reputation/ReputationMgr.cpp
+++ b/src/server/game/Reputation/ReputationMgr.cpp
@@ -463,8 +463,8 @@ void ReputationMgr::SetAtWar(RepListID repListID, bool on)
void ReputationMgr::SetAtWar(FactionState* faction, bool atWar) const
{
- // not allow declare war to own faction
- if (atWar && (faction->Flags & FACTION_FLAG_PEACE_FORCED))
+ // Do not allow to declare war to our own faction. But allow for rival factions (eg Aldor vs Scryer).
+ if (atWar && (faction->Flags & FACTION_FLAG_PEACE_FORCED) && !(faction->Flags & FACTION_FLAG_RIVAL))
return;
// already set
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index a5a4f9139b2..58f9bbda64d 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -28,6 +28,7 @@
#include "Common.h"
#include "DatabaseEnv.h"
#include "DBCStructure.h"
+#include "GameTime.h"
#include "Group.h"
#include "Guild.h"
#include "GuildMgr.h"
@@ -267,9 +268,6 @@ void WorldSession::LogUnprocessedTail(WorldPacket* packet)
/// Update the WorldSession (triggered by World update)
bool WorldSession::Update(uint32 diff, PacketFilter& updater)
{
- /// Update Timeout timer.
- UpdateTimeOutTime(diff);
-
///- Before we process anything:
/// If necessary, kick the player because the client didn't send anything for too long
/// (or they've been idling in character select)
@@ -637,9 +635,14 @@ char const* WorldSession::GetTrinityString(uint32 entry) const
void WorldSession::ResetTimeOutTime(bool onlyActive)
{
if (GetPlayer())
- m_timeOutTime = int32(sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME_ACTIVE));
+ m_timeOutTime = GameTime::GetGameTime() + time_t(sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME_ACTIVE));
else if (!onlyActive)
- m_timeOutTime = int32(sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME));
+ m_timeOutTime = GameTime::GetGameTime() + time_t(sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME));
+}
+
+bool WorldSession::IsConnectionIdle() const
+{
+ return m_timeOutTime < GameTime::GetGameTime() && !m_inQueue;
}
void WorldSession::Handle_NULL(WorldPacket& null)
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 237fa991456..2caba989384 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -432,19 +432,11 @@ class TC_GAME_API WorldSession
void SetLatency(uint32 latency) { m_latency = latency; }
void ResetClientTimeDelay() { m_clientTimeDelay = 0; }
- std::atomic<int32> m_timeOutTime;
-
- void UpdateTimeOutTime(uint32 diff)
- {
- m_timeOutTime -= int32(diff);
- }
+ std::atomic<time_t> m_timeOutTime;
void ResetTimeOutTime(bool onlyActive);
- bool IsConnectionIdle() const
- {
- return m_timeOutTime <= 0 && !m_inQueue;
- }
+ bool IsConnectionIdle() const;
// Recruit-A-Friend Handling
uint32 GetRecruiterId() const { return recruiterId; }
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index cff25bc8e2c..7c1cdc56de0 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -947,6 +947,9 @@ bool Aura::CanBeSaved() const
if (IsPassive())
return false;
+ if (GetSpellInfo()->IsChanneled())
+ return false;
+
// Check if aura is single target, not only spell info
if (GetCasterGUID() != GetOwner()->GetGUID())
if (GetSpellInfo()->IsSingleTarget() || IsSingleTarget())
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 75c97b005af..12c437884a6 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1964,7 +1964,10 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex)
if (gameObjTarget)
SendLoot(guid, LOOT_SKINNING);
else if (itemTarget)
+ {
itemTarget->SetFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_UNLOCKED);
+ itemTarget->SetState(ITEM_CHANGED, itemTarget->GetOwner());
+ }
// not allow use skill grow at item base open
if (!m_CastItem && skillId != SKILL_NONE)
@@ -3410,6 +3413,7 @@ void Spell::EffectInterruptCast(SpellEffIndex effIndex)
{
int32 duration = m_spellInfo->GetDuration();
unitTarget->GetSpellHistory()->LockSpellSchool(curSpellInfo->GetSchoolMask(), unitTarget->ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1 << effIndex));
+ m_originalCaster->ProcSkillsAndAuras(unitTarget, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_HIT, PROC_HIT_INTERRUPT, nullptr, nullptr, nullptr);
}
ExecuteLogEffectInterruptCast(effIndex, unitTarget, curSpellInfo->Id);
unitTarget->InterruptSpell(CurrentSpellTypes(i), false);
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 22b16a29dde..26638ca7c2d 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2344,9 +2344,11 @@ void SpellMgr::LoadSpellAreas()
uint32 oldMSTime = getMSTime();
mSpellAreaMap.clear(); // need for reload case
+ mSpellAreaForAreaMap.clear();
mSpellAreaForQuestMap.clear();
mSpellAreaForQuestEndMap.clear();
mSpellAreaForAuraMap.clear();
+ mSpellAreaForQuestAreaMap.clear();
// 0 1 2 3 4 5 6 7 8 9
QueryResult result = WorldDatabase.Query("SELECT spell, area, quest_start, quest_start_status, quest_end_status, quest_end, aura_spell, racemask, gender, autocast FROM spell_area");
@@ -2542,6 +2544,22 @@ void SpellMgr::LoadSpellInfoStore()
for (SpellEntry const* spellEntry : sSpellStore)
mSpellInfoMap[spellEntry->Id] = new SpellInfo(spellEntry);
+ for (uint32 spellIndex = 0; spellIndex < GetSpellInfoStoreSize(); ++spellIndex)
+ {
+ if (!mSpellInfoMap[spellIndex])
+ continue;
+
+ for (auto const& effect : mSpellInfoMap[spellIndex]->Effects)
+ {
+ //ASSERT(effect.EffectIndex < MAX_SPELL_EFFECTS, "MAX_SPELL_EFFECTS must be at least %u", effect.EffectIndex + 1);
+ ASSERT(effect.Effect < TOTAL_SPELL_EFFECTS, "TOTAL_SPELL_EFFECTS must be at least %u", effect.Effect + 1);
+ ASSERT(effect.ApplyAuraName < TOTAL_AURAS, "TOTAL_AURAS must be at least %u", effect.ApplyAuraName + 1);
+ ASSERT(effect.TargetA.GetTarget() < TOTAL_SPELL_TARGETS, "TOTAL_SPELL_TARGETS must be at least %u", effect.TargetA.GetTarget() + 1);
+ ASSERT(effect.TargetB.GetTarget() < TOTAL_SPELL_TARGETS, "TOTAL_SPELL_TARGETS must be at least %u", effect.TargetB.GetTarget() + 1);
+ }
+ }
+
+
TC_LOG_INFO("server.loading", ">> Loaded SpellInfo store in %u ms", GetMSTimeDiffToNow(oldMSTime));
}
@@ -3256,11 +3274,6 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_0].SpellClassMask[0] |= 0x800;
});
- // The Eye of Acherus (no spawn in phase 2 in db)
- ApplySpellFix({ 51852 }, [](SpellInfo* spellInfo)
- {
- spellInfo->Effects[EFFECT_0].MiscValue |= 1;
- });
// Crafty's Ultra-Advanced Proto-Typical Shortening Blaster
ApplySpellFix({ 51912 }, [](SpellInfo* spellInfo)
@@ -3598,7 +3611,7 @@ void SpellMgr::LoadSpellInfoCorrections()
47134 // Quest Complete
}, [](SpellInfo* spellInfo)
{
- //! HACK: This spell break quest complete for alliance and on retail not used °_O
+ //! HACK: This spell break quest complete for alliance and on retail not used
spellInfo->Effects[EFFECT_0].Effect = 0;
});
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index c9fb69a8eb2..51c84f18d42 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -229,7 +229,7 @@ enum ProcFlagsHit
PROC_HIT_DEFLECT = 0x0000200,
PROC_HIT_ABSORB = 0x0000400, // partial or full absorb
PROC_HIT_REFLECT = 0x0000800,
- PROC_HIT_INTERRUPT = 0x0001000, // (not used atm)
+ PROC_HIT_INTERRUPT = 0x0001000,
PROC_HIT_FULL_BLOCK = 0x0002000,
PROC_HIT_MASK_ALL = 0x0002FFF
};
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 3750cae08ef..e9431d216a3 100644
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -1200,4 +1200,3 @@ AuraApplication const* AuraScript::GetTargetApplication() const
{
return m_auraApplication;
}
-
diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
index 030f1d170d8..8894f9986e1 100644
--- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
@@ -156,4 +156,3 @@ void CharacterDatabaseCleaner::CleanCharacterQuestStatus()
{
CharacterDatabase.DirectExecute("DELETE FROM character_queststatus WHERE status = 0");
}
-
diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp
index fb26ae61a12..e6c53ca88d3 100644
--- a/src/server/game/Weather/Weather.cpp
+++ b/src/server/game/Weather/Weather.cpp
@@ -321,4 +321,3 @@ WeatherState Weather::GetWeatherState() const
return WEATHER_STATE_FINE;
}
}
-
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 03081a113de..9e4a1ca3a45 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -721,8 +721,10 @@ void World::LoadConfigSettings(bool reload)
else
m_int_configs[CONFIG_PORT_WORLD] = sConfigMgr->GetIntDefault("WorldServerPort", 8085);
- m_int_configs[CONFIG_SOCKET_TIMEOUTTIME] = sConfigMgr->GetIntDefault("SocketTimeOutTime", 900000);
- m_int_configs[CONFIG_SOCKET_TIMEOUTTIME_ACTIVE] = sConfigMgr->GetIntDefault("SocketTimeOutTimeActive", 60000);
+ // Config values are in "milliseconds" but we handle SocketTimeOut only as "seconds" so divide by 1000
+ m_int_configs[CONFIG_SOCKET_TIMEOUTTIME] = sConfigMgr->GetIntDefault("SocketTimeOutTime", 900000) / 1000;
+ m_int_configs[CONFIG_SOCKET_TIMEOUTTIME_ACTIVE] = sConfigMgr->GetIntDefault("SocketTimeOutTimeActive", 60000) / 1000;
+
m_int_configs[CONFIG_SESSION_ADD_DELAY] = sConfigMgr->GetIntDefault("SessionAddDelay", 10000);
m_float_configs[CONFIG_GROUP_XP_DISTANCE] = sConfigMgr->GetFloatDefault("MaxGroupXPDistance", 74.0f);
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index af8e5c12268..99b229f31d2 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -1021,7 +1021,7 @@ public:
if (!*args)
return false;
- uint16 display_id = (uint16)atoi((char*)args);
+ uint32 display_id = (uint32)atoi((char*)args);
Unit* target = handler->getSelectedUnit();
if (!target)
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 54c48cd1205..3cb7adef2a0 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -50,7 +50,7 @@ struct EnumName
#define CREATE_NAMED_ENUM(VALUE) { VALUE, STRINGIZE(VALUE) }
#define NPCFLAG_COUNT 24
-#define FLAGS_EXTRA_COUNT 20
+#define FLAGS_EXTRA_COUNT 21
EnumName<NPCFlags, int32> const npcFlagTexts[NPCFLAG_COUNT] =
{
@@ -173,7 +173,8 @@ EnumName<CreatureFlagsExtra> const flagsExtra[FLAGS_EXTRA_COUNT] =
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_DUNGEON_BOSS),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK)
+ CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK),
+ CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK)
};
bool HandleNpcSpawnGroup(ChatHandler* handler, char const* args)
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
index ed97d7670a1..3247dea994b 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
@@ -147,4 +147,4 @@ public:
void AddSC_boss_drekthar()
{
new boss_drekthar;
-} \ No newline at end of file
+}
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
index 372ee7ba4a1..f1cbd631d18 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
@@ -125,4 +125,4 @@ public:
void AddSC_boss_vanndar()
{
new boss_vanndar;
-} \ No newline at end of file
+}
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
index 93f10b1a81e..c0b2a3c9b4c 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
@@ -112,7 +112,7 @@ class boss_selin_fireheart : public CreatureScript
DoCast(crystal, SPELL_FEL_CRYSTAL_DUMMY);
CrystalGUID = crystal->GetGUID();
-
+
float x, y, z;
crystal->GetClosePoint(x, y, z, me->GetCombatReach(), CONTACT_DISTANCE);
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
index c96d86aff57..b125184103b 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
@@ -431,4 +431,3 @@ void AddSC_boss_archaedas()
new npc_stonekeepers();
new go_altar_of_archaedas();
}
-
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
index 6db29b9bc6a..c1c5b726713 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
@@ -168,4 +168,3 @@ void AddSC_uldaman()
new go_keystone_chamber();
new AreaTrigger_at_map_chamber();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index 2983ae15477..42c9dd9d766 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
@@ -463,4 +463,3 @@ void AddSC_boss_akilzon()
new boss_akilzon();
new npc_akilzon_eagle();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index 6bced5b64d0..fa617532e00 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
@@ -1052,4 +1052,3 @@ void AddSC_boss_hex_lord_malacrass()
new boss_alyson_antille();
new spell_hexlord_unstable_affliction();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
index 90c0516da52..606f6652a89 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
@@ -692,4 +692,3 @@ void AddSC_boss_janalai()
new npc_janalai_hatchling();
new npc_janalai_egg();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
index 02313eab281..6ea6388bc3c 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
@@ -608,4 +608,3 @@ void AddSC_boss_zuljin()
new boss_zuljin();
new npc_zuljin_vortex();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
index 4561a2dd924..f9e4ac50c59 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
@@ -117,4 +117,3 @@ void AddSC_boss_grilek()
{
new boss_grilek();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
index 16c8154af87..b59c2650e77 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
@@ -182,4 +182,3 @@ void AddSC_boss_hakkar()
{
new boss_hakkar();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
index 972229a1a8f..2fd84c07889 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
@@ -173,4 +173,3 @@ void AddSC_boss_renataki()
{
new boss_renataki();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
index 44500347ca2..b937a5102f9 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
@@ -109,4 +109,3 @@ void AddSC_boss_wushoolay()
{
new boss_wushoolay();
}
-
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
index 9a0c1f78b92..cbba1013573 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
@@ -206,4 +206,3 @@ struct hyjalAI : public EscortAI
uint32 SpellTimer[3];
};
#endif
-
diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
index fc0d5120015..d893974a3c6 100644
--- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
+++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
@@ -202,7 +202,7 @@ public:
Initialize();
}
- void EnterCombat(Unit* /*who*/) override
+ void EnterCombat(Unit* /*who*/) override
{
DoPlaySoundToSet(me, SOUND_AGGRO);
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp
index 144d2ab2312..b42470c3bac 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp
@@ -1067,4 +1067,3 @@ void AddSC_obsidian_sanctum()
new achievement_twilight_duo();
new achievement_twilight_zone();
}
-
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
index 24f35115e04..2f9201ec473 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
@@ -334,16 +334,22 @@ class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader
{
PrepareSpellScript(spell_baltharus_enervating_brand_trigger_SpellScript);
- void CheckDistance()
+ bool Validate(SpellInfo const* /*spell*/) override
{
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
- target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true);
+ return ValidateSpellInfo({ SPELL_SIPHONED_MIGHT });
+ }
+
+ void HandleSiphonedMight()
+ {
+ if (SpellInfo const* spellInfo = GetTriggeringSpell())
+ if (Aura* triggerAura = GetCaster()->GetAura(spellInfo->Id))
+ if (Unit* caster = triggerAura->GetCaster())
+ GetHitUnit()->CastSpell(caster, SPELL_SIPHONED_MIGHT, true);
}
void Register() override
{
- OnHit += SpellHitFn(spell_baltharus_enervating_brand_trigger_SpellScript::CheckDistance);
+ OnHit += SpellHitFn(spell_baltharus_enervating_brand_trigger_SpellScript::HandleSiphonedMight);
}
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
index 72ac4f0e499..4d3f243a4a7 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
@@ -168,7 +168,7 @@ class boss_anubarak_trial : public CreatureScript
struct boss_anubarak_trialAI : public BossAI
{
- boss_anubarak_trialAI(Creature* creature) : BossAI(creature, BOSS_ANUBARAK)
+ boss_anubarak_trialAI(Creature* creature) : BossAI(creature, DATA_ANUBARAK)
{
Initialize();
}
@@ -223,7 +223,7 @@ class boss_anubarak_trial : public CreatureScript
void JustReachedHome() override
{
- instance->SetBossState(BOSS_ANUBARAK, FAIL);
+ instance->SetBossState(DATA_ANUBARAK, FAIL);
//Summon Scarab Swarms neutral at random places
for (int i = 0; i < 10; i++)
if (Creature* scarab = me->SummonCreature(NPC_SCARAB, AnubarakLoc[1].GetPositionX()+urand(0, 50)-25, AnubarakLoc[1].GetPositionY()+urand(0, 50)-25, AnubarakLoc[1].GetPositionZ()))
@@ -461,8 +461,8 @@ class npc_swarm_scarab : public CreatureScript
DoCast(me, SPELL_ACID_MANDIBLE);
me->SetInCombatWithZone();
if (me->IsInCombat())
- if (Creature* Anubarak = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_ANUBARAK)))
- Anubarak->AI()->JustSummoned(me);
+ if (Creature* anubarak = _instance->GetCreature(DATA_ANUBARAK))
+ anubarak->AI()->JustSummoned(me);
}
void DoAction(int32 actionId) override
@@ -485,7 +485,7 @@ class npc_swarm_scarab : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (_instance->GetBossState(BOSS_ANUBARAK) != IN_PROGRESS)
+ if (_instance->GetBossState(DATA_ANUBARAK) != IN_PROGRESS)
me->DisappearAndDie();
if (!UpdateVictim())
@@ -541,8 +541,8 @@ class npc_nerubian_burrower : public CreatureScript
DoCast(me, SPELL_AWAKENED);
me->SetInCombatWithZone();
if (me->IsInCombat())
- if (Creature* Anubarak = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_ANUBARAK)))
- Anubarak->AI()->JustSummoned(me);
+ if (Creature* anubarak = _instance->GetCreature(DATA_ANUBARAK))
+ anubarak->AI()->JustSummoned(me);
}
void DoAction(int32 actionId) override
@@ -561,7 +561,7 @@ class npc_nerubian_burrower : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (_instance->GetBossState(BOSS_ANUBARAK) != IN_PROGRESS)
+ if (_instance->GetBossState(DATA_ANUBARAK) != IN_PROGRESS)
me->DisappearAndDie();
if (!UpdateVictim() && !me->HasAura(SPELL_SUBMERGE_EFFECT))
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
index fc2d5c466cc..be5772f191f 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
@@ -375,12 +375,11 @@ class boss_toc_champion_controller : public CreatureScript
public:
boss_toc_champion_controller() : CreatureScript("boss_toc_champion_controller") { }
- struct boss_toc_champion_controllerAI : public ScriptedAI
+ struct boss_toc_champion_controllerAI : public BossAI
{
- boss_toc_champion_controllerAI(Creature* creature) : ScriptedAI(creature), _summons(me)
+ boss_toc_champion_controllerAI(Creature* creature) : BossAI(creature, DATA_FACTION_CRUSADERS)
{
Initialize();
- _instance = creature->GetInstanceScript();
}
void Initialize()
@@ -396,6 +395,8 @@ class boss_toc_champion_controller : public CreatureScript
Initialize();
}
+ void JustSummoned(Creature* /*summon*/) override { }
+
std::vector<uint32> SelectChampions(Team playerTeam)
{
std::vector<uint32> vHealersEntries;
@@ -415,7 +416,7 @@ class boss_toc_champion_controller : public CreatureScript
vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARRIOR : NPC_ALLIANCE_WARRIOR);
uint8 healersSubtracted = 2;
- if (_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL || _instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC)
+ if (instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL || instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC)
healersSubtracted = 1;
for (uint8 i = 0; i < healersSubtracted; ++i)
{
@@ -452,7 +453,7 @@ class boss_toc_champion_controller : public CreatureScript
vHealersEntries.erase(vHealersEntries.begin() + pos);
}
- if (_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || _instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
+ if (instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
for (uint8 i = 0; i < 4; ++i)
vOtherEntries.erase(vOtherEntries.begin() + urand(0, vOtherEntries.size() - 1));
@@ -486,7 +487,7 @@ class boss_toc_champion_controller : public CreatureScript
uint8 pos = urand(0, vChampionJumpTarget.size()-1);
if (Creature* champion = me->SummonCreature(vChampionEntries[i], vChampionJumpOrigin[urand(0, vChampionJumpOrigin.size()-1)], TEMPSUMMON_MANUAL_DESPAWN))
{
- _summons.Summon(champion);
+ summons.Summon(champion);
champion->SetReactState(REACT_PASSIVE);
champion->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
champion->SetImmuneToPC(false);
@@ -515,7 +516,7 @@ class boss_toc_champion_controller : public CreatureScript
SummonChampions((Team)uiData);
break;
case 1:
- for (SummonList::iterator i = _summons.begin(); i != _summons.end(); ++i)
+ for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i)
{
if (Creature* summon = ObjectAccessor::GetCreature(*me, *i))
{
@@ -530,10 +531,10 @@ class boss_toc_champion_controller : public CreatureScript
{
case FAIL:
_championsFailed++;
- if (_championsFailed + _championsKilled >= _summons.size())
+ if (_championsFailed + _championsKilled >= summons.size())
{
- _instance->SetBossState(BOSS_CRUSADERS, FAIL);
- _summons.DespawnAll();
+ instance->SetBossState(DATA_FACTION_CRUSADERS, FAIL);
+ summons.DespawnAll();
me->DespawnOrUnsummon();
}
break;
@@ -544,21 +545,23 @@ class boss_toc_champion_controller : public CreatureScript
_championsFailed = 0;
_championsKilled = 0;
_inProgress = true;
- _summons.DoZoneInCombat();
- _instance->SetBossState(BOSS_CRUSADERS, IN_PROGRESS);
+ summons.DoZoneInCombat();
+ instance->SetBossState(DATA_FACTION_CRUSADERS, IN_PROGRESS);
}
break;
case DONE:
+ {
_championsKilled++;
if (_championsKilled == 1)
- _instance->SetBossState(BOSS_CRUSADERS, SPECIAL);
- else if (_championsKilled >= _summons.size())
+ instance->SetBossState(DATA_FACTION_CRUSADERS, SPECIAL);
+ else if (_championsKilled >= summons.size())
{
- _instance->SetBossState(BOSS_CRUSADERS, DONE);
- _summons.DespawnAll();
+ instance->SetBossState(DATA_FACTION_CRUSADERS, DONE);
+ summons.DespawnAll();
me->DespawnOrUnsummon();
}
break;
+ }
default:
break;
}
@@ -568,8 +571,6 @@ class boss_toc_champion_controller : public CreatureScript
}
}
private:
- InstanceScript* _instance;
- SummonList _summons;
uint32 _championsNotStarted;
uint32 _championsFailed;
uint32 _championsKilled;
@@ -584,9 +585,10 @@ class boss_toc_champion_controller : public CreatureScript
struct boss_faction_championsAI : public BossAI
{
- boss_faction_championsAI(Creature* creature, uint32 aitype) : BossAI(creature, BOSS_CRUSADERS)
+ boss_faction_championsAI(Creature* creature, uint32 aitype) : BossAI(creature, DATA_FACTION_CHAMPIONS)
{
_aiType = aitype;
+ SetBoundary(instance->GetBossBoundary(DATA_FACTION_CRUSADERS));
}
void Reset() override
@@ -598,7 +600,7 @@ struct boss_faction_championsAI : public BossAI
void JustReachedHome() override
{
- if (Creature* pChampionController = ObjectAccessor::GetCreature((*me), instance->GetGuidData(NPC_CHAMPIONS_CONTROLLER)))
+ if (Creature* pChampionController = instance->GetCreature(DATA_FACTION_CRUSADERS))
pChampionController->AI()->SetData(2, FAIL);
me->DespawnOrUnsummon();
}
@@ -637,15 +639,17 @@ struct boss_faction_championsAI : public BossAI
void JustDied(Unit* /*killer*/) override
{
if (_aiType != AI_PET)
- if (Creature* pChampionController = ObjectAccessor::GetCreature((*me), instance->GetGuidData(NPC_CHAMPIONS_CONTROLLER)))
+ if (Creature* pChampionController = instance->GetCreature(DATA_FACTION_CRUSADERS))
pChampionController->AI()->SetData(2, DONE);
}
void EnterCombat(Unit* /*who*/) override
{
DoCast(me, SPELL_ANTI_AOE, true);
- _EnterCombat();
- if (Creature* pChampionController = ObjectAccessor::GetCreature((*me), instance->GetGuidData(NPC_CHAMPIONS_CONTROLLER)))
+ me->SetCombatPulseDelay(5);
+ me->setActive(true);
+ DoZoneInCombat();
+ if (Creature* pChampionController = instance->GetCreature(DATA_FACTION_CRUSADERS))
pChampionController->AI()->SetData(2, IN_PROGRESS);
}
@@ -662,11 +666,11 @@ struct boss_faction_championsAI : public BossAI
if (TeamInInstance == ALLIANCE)
{
- if (Creature* varian = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_VARIAN)))
+ if (Creature* varian = instance->GetCreature(DATA_VARIAN))
varian->AI()->Talk(SAY_KILL_PLAYER);
}
else
- if (Creature* garrosh = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_GARROSH)))
+ if (Creature* garrosh = instance->GetCreature(DATA_GARROSH))
garrosh->AI()->Talk(SAY_KILL_PLAYER);
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
index 8f50ed0e365..8b32acdadb5 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
@@ -102,7 +102,7 @@ class boss_jaraxxus : public CreatureScript
struct boss_jaraxxusAI : public BossAI
{
- boss_jaraxxusAI(Creature* creature) : BossAI(creature, BOSS_JARAXXUS) { }
+ boss_jaraxxusAI(Creature* creature) : BossAI(creature, DATA_JARAXXUS) { }
void Reset() override
{
@@ -119,7 +119,7 @@ class boss_jaraxxus : public CreatureScript
void JustReachedHome() override
{
_JustReachedHome();
- instance->SetBossState(BOSS_JARAXXUS, FAIL);
+ instance->SetBossState(DATA_JARAXXUS, FAIL);
DoCast(me, SPELL_JARAXXUS_CHAINS);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetImmuneToPC(true);
@@ -238,7 +238,7 @@ class npc_legion_flame : public CreatureScript
void UpdateAI(uint32 /*diff*/) override
{
UpdateVictim();
- if (_instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS)
+ if (_instance->GetBossState(DATA_JARAXXUS) != IN_PROGRESS)
me->DespawnOrUnsummon();
}
private:
@@ -330,7 +330,7 @@ class npc_fel_infernal : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (_instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS)
+ if (_instance->GetBossState(DATA_JARAXXUS) != IN_PROGRESS)
{
me->DespawnOrUnsummon();
return;
@@ -438,7 +438,7 @@ class npc_mistress_of_pain : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (_instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS)
+ if (_instance->GetBossState(DATA_JARAXXUS) != IN_PROGRESS)
{
me->DespawnOrUnsummon();
return;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
index 17ce9458905..772edda63c6 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
@@ -179,7 +179,10 @@ class boss_gormok : public CreatureScript
struct boss_gormokAI : public BossAI
{
- boss_gormokAI(Creature* creature) : BossAI(creature, BOSS_BEASTS) { }
+ boss_gormokAI(Creature* creature) : BossAI(creature, DATA_GORMOK_THE_IMPALER)
+ {
+ SetBoundary(instance->GetBossBoundary(DATA_NORTHREND_BEASTS));
+ }
void Reset() override
{
@@ -192,7 +195,7 @@ class boss_gormok : public CreatureScript
void EnterEvadeMode(EvadeReason why) override
{
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
ScriptedAI::EnterEvadeMode(why);
}
@@ -204,7 +207,7 @@ class boss_gormok : public CreatureScript
switch (pointId)
{
case 0:
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetImmuneToPC(false);
me->SetReactState(REACT_AGGRESSIVE);
@@ -222,7 +225,7 @@ class boss_gormok : public CreatureScript
void JustReachedHome() override
{
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
instance->SetData(TYPE_NORTHREND_BEASTS, FAIL);
me->DespawnOrUnsummon();
@@ -230,8 +233,11 @@ class boss_gormok : public CreatureScript
void EnterCombat(Unit* /*who*/) override
{
- _EnterCombat();
+ me->SetCombatPulseDelay(5);
+ me->setActive(true);
+ //DoZoneInCombat();
instance->SetData(TYPE_NORTHREND_BEASTS, GORMOK_IN_PROGRESS);
+ instance->SetBossState(DATA_NORTHREND_BEASTS, IN_PROGRESS);
}
void DamageTaken(Unit* /*who*/, uint32& damage) override
@@ -387,7 +393,7 @@ class npc_snobold_vassal : public CreatureScript
void MountOnBoss()
{
- Unit* gormok = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_GORMOK));
+ Unit* gormok = _instance->GetCreature(DATA_GORMOK_THE_IMPALER);
if (gormok && gormok->IsAlive())
{
me->AttackStop();
@@ -511,7 +517,7 @@ class npc_firebomb : public CreatureScript
struct boss_jormungarAI : public BossAI
{
- boss_jormungarAI(Creature* creature) : BossAI(creature, BOSS_BEASTS)
+ boss_jormungarAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId)
{
OtherWormEntry = 0;
ModelStationary = 0;
@@ -525,6 +531,7 @@ struct boss_jormungarAI : public BossAI
Phase = PHASE_MOBILE;
Enraged = false;
WasMobile = false;
+ SetBoundary(instance->GetBossBoundary(DATA_NORTHREND_BEASTS));
}
void Reset() override
@@ -539,9 +546,14 @@ struct boss_jormungarAI : public BossAI
events.ScheduleEvent(EVENT_SLIME_POOL, 15*IN_MILLISECONDS, 0, PHASE_MOBILE);
}
+ uint32 GetOtherWormData(uint32 wormEntry)
+ {
+ return wormEntry == NPC_ACIDMAW ? DATA_ACIDMAW : DATA_DREADSCALE;
+ }
+
void JustDied(Unit* /*killer*/) override
{
- if (Creature* otherWorm = ObjectAccessor::GetCreature(*me, instance->GetGuidData(OtherWormEntry)))
+ if (Creature* otherWorm = instance->GetCreature(GetOtherWormData(OtherWormEntry)))
{
if (!otherWorm->IsAlive())
{
@@ -714,7 +726,7 @@ class boss_acidmaw : public CreatureScript
struct boss_acidmawAI : public boss_jormungarAI
{
- boss_acidmawAI(Creature* creature) : boss_jormungarAI(creature) { }
+ boss_acidmawAI(Creature* creature) : boss_jormungarAI(creature, DATA_ACIDMAW) { }
void Reset() override
{
@@ -745,7 +757,7 @@ class boss_dreadscale : public CreatureScript
struct boss_dreadscaleAI : public boss_jormungarAI
{
- boss_dreadscaleAI(Creature* creature) : boss_jormungarAI(creature) { }
+ boss_dreadscaleAI(Creature* creature) : boss_jormungarAI(creature, DATA_DREADSCALE) { }
void Reset() override
{
@@ -772,7 +784,7 @@ class boss_dreadscale : public CreatureScript
switch (pointId)
{
case 0:
- instance->DoCloseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoCloseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetImmuneToPC(false);
me->SetReactState(REACT_AGGRESSIVE);
@@ -785,13 +797,13 @@ class boss_dreadscale : public CreatureScript
void EnterEvadeMode(EvadeReason why) override
{
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
boss_jormungarAI::EnterEvadeMode(why);
}
void JustReachedHome() override
{
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
boss_jormungarAI::JustReachedHome();
}
@@ -887,9 +899,10 @@ class boss_icehowl : public CreatureScript
struct boss_icehowlAI : public BossAI
{
- boss_icehowlAI(Creature* creature) : BossAI(creature, BOSS_BEASTS)
+ boss_icehowlAI(Creature* creature) : BossAI(creature, DATA_ICEHOWL)
{
Initialize();
+ SetBoundary(instance->GetBossBoundary(DATA_NORTHREND_BEASTS));
}
void Initialize()
@@ -946,7 +959,7 @@ class boss_icehowl : public CreatureScript
_movementFinish = true;
break;
case 2:
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetImmuneToPC(false);
me->SetReactState(REACT_AGGRESSIVE);
@@ -959,13 +972,13 @@ class boss_icehowl : public CreatureScript
void EnterEvadeMode(EvadeReason why) override
{
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
ScriptedAI::EnterEvadeMode(why);
}
void JustReachedHome() override
{
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
instance->SetData(TYPE_NORTHREND_BEASTS, FAIL);
me->DespawnOrUnsummon();
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
index 49bd28f7e56..7050f20c1c9 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -158,9 +158,14 @@ class OrbsDespawner : public BasicEvent
Creature* _creature;
};
+static uint32 GetSisterData(uint32 sisterEntry)
+{
+ return sisterEntry == NPC_FJOLA_LIGHTBANE ? DATA_FJOLA_LIGHTBANE : DATA_EYDIS_DARKBANE;
+}
+
struct boss_twin_baseAI : public BossAI
{
- boss_twin_baseAI(Creature* creature) : BossAI(creature, BOSS_VALKIRIES)
+ boss_twin_baseAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId)
{
AuraState = AURA_STATE_NONE;
Weapon = 0;
@@ -173,6 +178,7 @@ struct boss_twin_baseAI : public BossAI
TwinPactSpellId = 0;
SpikeSpellId = 0;
TouchSpellId = 0;
+ SetBoundary(instance->GetBossBoundary(DATA_TWIN_VALKIRIES));
}
void Reset() override
@@ -189,7 +195,7 @@ struct boss_twin_baseAI : public BossAI
void JustReachedHome() override
{
- instance->SetBossState(BOSS_VALKIRIES, FAIL);
+ instance->SetBossState(DATA_TWIN_VALKIRIES, FAIL);
summons.DespawnAll();
me->DespawnOrUnsummon();
@@ -248,12 +254,14 @@ struct boss_twin_baseAI : public BossAI
{
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- _JustDied();
+ events.Reset();
+ summons.DespawnAll();
+ instance->SetBossState(DATA_TWIN_VALKIRIES, DONE);
}
else
{
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- instance->SetBossState(BOSS_VALKIRIES, SPECIAL);
+ instance->SetBossState(DATA_TWIN_VALKIRIES, SPECIAL);
}
}
summons.DespawnAll();
@@ -262,7 +270,7 @@ struct boss_twin_baseAI : public BossAI
// Called when sister pointer needed
Creature* GetSister()
{
- return ObjectAccessor::GetCreature((*me), instance->GetGuidData(SisterNpcId));
+ return instance->GetCreature(GetSisterData(SisterNpcId));
}
void EnterCombat(Unit* /*who*/) override
@@ -273,10 +281,12 @@ struct boss_twin_baseAI : public BossAI
me->AddAura(MyEmphatySpellId, pSister);
pSister->SetInCombatWithZone();
}
- instance->SetBossState(BOSS_VALKIRIES, IN_PROGRESS);
+ instance->SetBossState(DATA_TWIN_VALKIRIES, IN_PROGRESS);
Talk(SAY_AGGRO);
DoCast(me, SurgeSpellId);
+ me->SetCombatPulseDelay(5);
+ me->setActive(true);
events.ScheduleEvent(EVENT_TWIN_SPIKE, 20 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 6 * MINUTE*IN_MILLISECONDS : 10 * MINUTE*IN_MILLISECONDS);
@@ -354,7 +364,7 @@ class boss_fjola : public CreatureScript
struct boss_fjolaAI : public boss_twin_baseAI
{
- boss_fjolaAI(Creature* creature) : boss_twin_baseAI(creature)
+ boss_fjolaAI(Creature* creature) : boss_twin_baseAI(creature, DATA_FJOLA_LIGHTBANE)
{
GenerateStageSequence();
}
@@ -364,7 +374,7 @@ class boss_fjola : public CreatureScript
SetEquipmentSlots(false, EQUIP_MAIN_1, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
Weapon = EQUIP_MAIN_1;
AuraState = AURA_STATE_UNKNOWN22;
- SisterNpcId = NPC_DARKBANE;
+ SisterNpcId = NPC_EYDIS_DARKBANE;
MyEmphatySpellId = SPELL_TWIN_EMPATHY_DARK;
OtherEssenceSpellId = SPELL_DARK_ESSENCE_HELPER;
SurgeSpellId = SPELL_LIGHT_SURGE;
@@ -421,13 +431,13 @@ class boss_fjola : public CreatureScript
void EnterEvadeMode(EvadeReason why) override
{
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
boss_twin_baseAI::EnterEvadeMode(why);
}
void JustReachedHome() override
{
- instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ instance->DoUseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
boss_twin_baseAI::JustReachedHome();
}
@@ -465,14 +475,14 @@ class boss_eydis : public CreatureScript
struct boss_eydisAI : public boss_twin_baseAI
{
- boss_eydisAI(Creature* creature) : boss_twin_baseAI(creature) { }
+ boss_eydisAI(Creature* creature) : boss_twin_baseAI(creature, DATA_EYDIS_DARKBANE) { }
void Reset() override
{
SetEquipmentSlots(false, EQUIP_MAIN_2, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
Weapon = EQUIP_MAIN_2;
AuraState = AURA_STATE_UNKNOWN19;
- SisterNpcId = NPC_LIGHTBANE;
+ SisterNpcId = NPC_FJOLA_LIGHTBANE;
MyEmphatySpellId = SPELL_TWIN_EMPATHY_LIGHT;
OtherEssenceSpellId = SPELL_LIGHT_ESSENCE_HELPER;
SurgeSpellId = SPELL_DARK_SURGE;
@@ -860,8 +870,8 @@ class spell_power_of_the_twins : public SpellScriptLoader
{
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
{
- if (Creature* Valk = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(GetCaster()->GetEntry())))
- ENSURE_AI(boss_twin_baseAI, Valk->AI())->EnableDualWield(true);
+ if (Creature* valk = instance->GetCreature(GetSisterData(GetCaster()->GetEntry())))
+ ENSURE_AI(boss_twin_baseAI, valk->AI())->EnableDualWield(true);
}
}
@@ -869,8 +879,8 @@ class spell_power_of_the_twins : public SpellScriptLoader
{
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
{
- if (Creature* Valk = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(GetCaster()->GetEntry())))
- ENSURE_AI(boss_twin_baseAI, Valk->AI())->EnableDualWield(false);
+ if (Creature* valk = instance->GetCreature(GetSisterData(GetCaster()->GetEntry())))
+ ENSURE_AI(boss_twin_baseAI, valk->AI())->EnableDualWield(false);
}
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
index 506f076be33..28891678aef 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
@@ -29,11 +29,53 @@
BossBoundaryData const boundaries =
{
- { BOSS_BEASTS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
- { BOSS_JARAXXUS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
- { BOSS_CRUSADERS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
- { BOSS_VALKIRIES, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
- { BOSS_ANUBARAK, new EllipseBoundary(Position(746.0f, 135.0f), 100.0, 75.0) }
+ { DATA_NORTHREND_BEASTS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
+ { DATA_JARAXXUS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
+ { DATA_FACTION_CRUSADERS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
+ { DATA_TWIN_VALKIRIES, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
+ { DATA_ANUBARAK, new EllipseBoundary(Position(746.0f, 135.0f), 100.0, 75.0) }
+};
+
+ObjectData const creatureData[] =
+{
+ { NPC_GORMOK, DATA_GORMOK_THE_IMPALER },
+ { NPC_ACIDMAW, DATA_ACIDMAW },
+ { NPC_DREADSCALE, DATA_DREADSCALE },
+ { NPC_ICEHOWL, DATA_ICEHOWL },
+ { NPC_JARAXXUS, DATA_JARAXXUS },
+ { NPC_CHAMPIONS_CONTROLLER, DATA_FACTION_CRUSADERS },
+ { NPC_FJOLA_LIGHTBANE, DATA_FJOLA_LIGHTBANE },
+ { NPC_EYDIS_DARKBANE, DATA_EYDIS_DARKBANE },
+ { NPC_LICH_KING, DATA_LICH_KING },
+ { NPC_ANUBARAK, DATA_ANUBARAK },
+ { NPC_BARRET_RAMSEY, DATA_BARRET_RAMSEY },
+ { NPC_TIRION_FORDRING, DATA_FORDRING },
+ { NPC_TIRION_FORDRING_ANUBARAK, DATA_FORDRING_ANUBARAK },
+ { NPC_VARIAN, DATA_VARIAN },
+ { NPC_GARROSH, DATA_GARROSH },
+ { NPC_FIZZLEBANG, DATA_FIZZLEBANG },
+ { 0, 0 } // END
+};
+
+ObjectData const gameObjectData[] =
+{
+ { GO_CRUSADERS_CACHE_10, DATA_CRUSADERS_CHEST },
+ { GO_CRUSADERS_CACHE_25, DATA_CRUSADERS_CHEST },
+ { GO_CRUSADERS_CACHE_10_H, DATA_CRUSADERS_CHEST },
+ { GO_CRUSADERS_CACHE_25_H, DATA_CRUSADERS_CHEST },
+ { GO_ARGENT_COLISEUM_FLOOR, DATA_COLISEUM_FLOOR },
+ { GO_MAIN_GATE_DOOR, DATA_MAIN_GATE },
+ { GO_EAST_PORTCULLIS, DATA_EAST_PORTCULLIS },
+ { GO_WEB_DOOR, DATA_WEB_DOOR },
+ { GO_TRIBUTE_CHEST_10H_25, DATA_TRIBUTE_CHEST },
+ { GO_TRIBUTE_CHEST_10H_45, DATA_TRIBUTE_CHEST },
+ { GO_TRIBUTE_CHEST_10H_50, DATA_TRIBUTE_CHEST },
+ { GO_TRIBUTE_CHEST_10H_99, DATA_TRIBUTE_CHEST },
+ { GO_TRIBUTE_CHEST_25H_25, DATA_TRIBUTE_CHEST },
+ { GO_TRIBUTE_CHEST_25H_45, DATA_TRIBUTE_CHEST },
+ { GO_TRIBUTE_CHEST_25H_50, DATA_TRIBUTE_CHEST },
+ { GO_TRIBUTE_CHEST_25H_99, DATA_TRIBUTE_CHEST },
+ { 0, 0 } // END
};
class instance_trial_of_the_crusader : public InstanceMapScript
@@ -46,8 +88,9 @@ class instance_trial_of_the_crusader : public InstanceMapScript
instance_trial_of_the_crusader_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
- SetBossNumber(MAX_ENCOUNTERS);
+ SetBossNumber(EncounterCount);
LoadBossBoundaries(boundaries);
+ LoadObjectData(creatureData, gameObjectData);
TrialCounter = 50;
EventStage = 0;
NorthrendBeasts = NOT_STARTED;
@@ -62,12 +105,12 @@ class instance_trial_of_the_crusader : public InstanceMapScript
bool IsEncounterInProgress() const override
{
- for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
+ for (uint8 i = 0; i < EncounterCount; ++i)
if (GetBossState(i) == IN_PROGRESS)
return true;
// Special state is set at Faction Champions after first champ dead, encounter is still in combat
- if (GetBossState(BOSS_CRUSADERS) == SPECIAL)
+ if (GetBossState(DATA_FACTION_CRUSADERS) == SPECIAL)
return true;
return false;
@@ -84,8 +127,8 @@ class instance_trial_of_the_crusader : public InstanceMapScript
player->SendUpdateWorldState(UPDATE_STATE_UI_SHOW, 0);
// make sure Anub'arak isnt missing
- if (GetBossState(BOSS_LICH_KING) == DONE && TrialCounter && GetBossState(BOSS_ANUBARAK) != DONE)
- if (!ObjectAccessor::GetCreature(*player, GetGuidData(NPC_ANUBARAK)))
+ if (GetBossState(DATA_LICH_KING) == DONE && TrialCounter && GetBossState(DATA_ANUBARAK) != DONE)
+ if (!GetCreature(DATA_ANUBARAK))
player->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
}
@@ -109,100 +152,18 @@ class instance_trial_of_the_crusader : public InstanceMapScript
void OnCreatureCreate(Creature* creature) override
{
- switch (creature->GetEntry())
- {
- case NPC_BARRENT:
- BarrentGUID = creature->GetGUID();
- if (!TrialCounter)
- creature->DespawnOrUnsummon();
- break;
- case NPC_TIRION:
- TirionGUID = creature->GetGUID();
- break;
- case NPC_TIRION_FORDRING:
- TirionFordringGUID = creature->GetGUID();
- break;
- case NPC_FIZZLEBANG:
- FizzlebangGUID = creature->GetGUID();
- break;
- case NPC_GARROSH:
- GarroshGUID = creature->GetGUID();
- break;
- case NPC_VARIAN:
- VarianGUID = creature->GetGUID();
- break;
-
- case NPC_GORMOK:
- GormokGUID = creature->GetGUID();
- break;
- case NPC_ACIDMAW:
- AcidmawGUID = creature->GetGUID();
- break;
- case NPC_DREADSCALE:
- DreadscaleGUID = creature->GetGUID();
- break;
- case NPC_ICEHOWL:
- IcehowlGUID = creature->GetGUID();
- break;
- case NPC_JARAXXUS:
- JaraxxusGUID = creature->GetGUID();
- break;
- case NPC_CHAMPIONS_CONTROLLER:
- ChampionsControllerGUID = creature->GetGUID();
- break;
- case NPC_DARKBANE:
- DarkbaneGUID = creature->GetGUID();
- break;
- case NPC_LIGHTBANE:
- LightbaneGUID = creature->GetGUID();
- break;
- case NPC_ANUBARAK:
- AnubarakGUID = creature->GetGUID();
- creature->SetRespawnDelay(7 * DAY);
- break;
- default:
- break;
- }
+ InstanceScript::OnCreatureCreate(creature);
+ if (creature->GetEntry() == NPC_BARRET_RAMSEY)
+ if (!TrialCounter)
+ creature->DespawnOrUnsummon();
}
void OnGameObjectCreate(GameObject* go) override
{
- switch (go->GetEntry())
- {
- case GO_CRUSADERS_CACHE_10:
- case GO_CRUSADERS_CACHE_25:
- case GO_CRUSADERS_CACHE_10_H:
- case GO_CRUSADERS_CACHE_25_H:
- CrusadersCacheGUID = go->GetGUID();
- break;
- case GO_ARGENT_COLISEUM_FLOOR:
- FloorGUID = go->GetGUID();
- if (GetBossState(BOSS_LICH_KING) == DONE)
- go->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
- break;
- case GO_MAIN_GATE_DOOR:
- MainGateDoorGUID = go->GetGUID();
- break;
- case GO_EAST_PORTCULLIS:
- EastPortcullisGUID = go->GetGUID();
- break;
- case GO_WEB_DOOR:
- WebDoorGUID = go->GetGUID();
- break;
-
- case GO_TRIBUTE_CHEST_10H_25:
- case GO_TRIBUTE_CHEST_10H_45:
- case GO_TRIBUTE_CHEST_10H_50:
- case GO_TRIBUTE_CHEST_10H_99:
- case GO_TRIBUTE_CHEST_25H_25:
- case GO_TRIBUTE_CHEST_25H_45:
- case GO_TRIBUTE_CHEST_25H_50:
- case GO_TRIBUTE_CHEST_25H_99:
- TributeChestGUID = go->GetGUID();
- break;
- default:
- break;
- }
+ InstanceScript::OnGameObjectCreate(go);
+ if (go->GetEntry() == GO_ARGENT_COLISEUM_FLOOR)
+ if (GetBossState(DATA_LICH_KING) == DONE)
+ go->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
}
void OnUnitDeath(Unit* unit) override
@@ -219,20 +180,20 @@ class instance_trial_of_the_crusader : public InstanceMapScript
switch (type)
{
- case BOSS_BEASTS:
+ case DATA_NORTHREND_BEASTS:
break;
- case BOSS_JARAXXUS:
+ case DATA_JARAXXUS:
// Cleanup Icehowl
- if (Creature* icehowl = instance->GetCreature(IcehowlGUID))
+ if (Creature* icehowl = GetCreature(DATA_ICEHOWL))
icehowl->DespawnOrUnsummon();
if (state == DONE)
EventStage = 2000;
break;
- case BOSS_CRUSADERS:
+ case DATA_FACTION_CRUSADERS:
// Cleanup Jaraxxus
- if (Creature* jaraxxus = instance->GetCreature(JaraxxusGUID))
+ if (Creature* jaraxxus = GetCreature(DATA_JARAXXUS))
jaraxxus->DespawnOrUnsummon();
- if (Creature* fizzlebang = instance->GetCreature(FizzlebangGUID))
+ if (Creature* fizzlebang = GetCreature(DATA_FIZZLEBANG))
fizzlebang->DespawnOrUnsummon();
switch (state)
{
@@ -247,8 +208,8 @@ class instance_trial_of_the_crusader : public InstanceMapScript
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS);
if (ResilienceWillFixItTimer > 0)
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE);
- DoRespawnGameObject(CrusadersCacheGUID, 7*DAY);
- if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID))
+ DoRespawnGameObject(GetGuidData(DATA_CRUSADERS_CHEST), 7*DAY);
+ if (GameObject* cache = GetGameObject(DATA_CRUSADERS_CHEST))
cache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
EventStage = 3100;
break;
@@ -256,27 +217,27 @@ class instance_trial_of_the_crusader : public InstanceMapScript
break;
}
break;
- case BOSS_VALKIRIES:
+ case DATA_TWIN_VALKIRIES:
// Cleanup chest
- if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID))
+ if (GameObject* cache = GetGameObject(DATA_CRUSADERS_CHEST))
cache->Delete();
switch (state)
{
case FAIL:
- if (GetBossState(BOSS_VALKIRIES) == NOT_STARTED)
+ if (GetBossState(DATA_TWIN_VALKIRIES) == NOT_STARTED)
state = NOT_STARTED;
break;
case SPECIAL:
- if (GetBossState(BOSS_VALKIRIES) == SPECIAL)
+ if (GetBossState(DATA_TWIN_VALKIRIES) == SPECIAL)
state = DONE;
break;
default:
break;
}
break;
- case BOSS_LICH_KING:
+ case DATA_LICH_KING:
break;
- case BOSS_ANUBARAK:
+ case DATA_ANUBARAK:
switch (state)
{
case DONE:
@@ -319,7 +280,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
}
if (tributeChest)
- if (Creature* tirion = instance->GetCreature(TirionGUID))
+ if (Creature* tirion = GetCreature(DATA_FORDRING))
if (GameObject* chest = tirion->SummonGameObject(tributeChest, 805.62f, 134.87f, 142.16f, 3.27f, QuaternionData(), WEEK))
chest->SetRespawnTime(chest->GetRespawnDelay());
break;
@@ -334,16 +295,16 @@ class instance_trial_of_the_crusader : public InstanceMapScript
if (IsEncounterInProgress())
{
- CloseDoor(GetGuidData(GO_EAST_PORTCULLIS));
- CloseDoor(GetGuidData(GO_WEB_DOOR));
+ CloseDoor(GetGuidData(DATA_EAST_PORTCULLIS));
+ CloseDoor(GetGuidData(DATA_WEB_DOOR));
}
else
{
- OpenDoor(GetGuidData(GO_EAST_PORTCULLIS));
- OpenDoor(GetGuidData(GO_WEB_DOOR));
+ OpenDoor(GetGuidData(DATA_EAST_PORTCULLIS));
+ OpenDoor(GetGuidData(DATA_WEB_DOOR));
}
- if (type < MAX_ENCOUNTERS)
+ if (type < EncounterCount)
{
TC_LOG_DEBUG("scripts", "[ToCr] BossState(type %u) %u = state %u;", type, GetBossState(type), state);
if (state == FAIL)
@@ -360,21 +321,21 @@ class instance_trial_of_the_crusader : public InstanceMapScript
// if theres no more attemps allowed
if (!TrialCounter)
{
- if (Unit* announcer = instance->GetCreature(GetGuidData(NPC_BARRENT)))
+ if (Unit* announcer = GetCreature(DATA_BARRET_RAMSEY))
announcer->ToCreature()->DespawnOrUnsummon();
- if (Creature* anubArak = instance->GetCreature(GetGuidData(NPC_ANUBARAK)))
- anubArak->DespawnOrUnsummon();
+ if (Creature* anubarak = GetCreature(DATA_ANUBARAK))
+ anubarak->DespawnOrUnsummon();
}
}
NeedSave = true;
- EventStage = (type == BOSS_BEASTS ? 666 : 0);
+ EventStage = (type == DATA_NORTHREND_BEASTS ? 666 : 0);
state = NOT_STARTED;
}
if (state == DONE || NeedSave)
{
- if (Unit* announcer = instance->GetCreature(GetGuidData(NPC_BARRENT)))
+ if (Unit* announcer = GetCreature(DATA_BARRET_RAMSEY))
announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
Save();
}
@@ -421,10 +382,10 @@ class instance_trial_of_the_crusader : public InstanceMapScript
case ICEHOWL_DONE:
EventStage = 400;
SetData(TYPE_NORTHREND_BEASTS, DONE);
- SetBossState(BOSS_BEASTS, DONE);
+ SetBossState(DATA_NORTHREND_BEASTS, DONE);
break;
case FAIL:
- SetBossState(BOSS_BEASTS, FAIL);
+ SetBossState(DATA_NORTHREND_BEASTS, FAIL);
break;
default:
break;
@@ -448,57 +409,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript
}
}
- ObjectGuid GetGuidData(uint32 type) const override
- {
- switch (type)
- {
- case NPC_BARRENT:
- return BarrentGUID;
- case NPC_TIRION:
- return TirionGUID;
- case NPC_TIRION_FORDRING:
- return TirionFordringGUID;
- case NPC_FIZZLEBANG:
- return FizzlebangGUID;
- case NPC_GARROSH:
- return GarroshGUID;
- case NPC_VARIAN:
- return VarianGUID;
-
- case NPC_GORMOK:
- return GormokGUID;
- case NPC_ACIDMAW:
- return AcidmawGUID;
- case NPC_DREADSCALE:
- return DreadscaleGUID;
- case NPC_ICEHOWL:
- return IcehowlGUID;
- case NPC_JARAXXUS:
- return JaraxxusGUID;
- case NPC_CHAMPIONS_CONTROLLER:
- return ChampionsControllerGUID;
- case NPC_DARKBANE:
- return DarkbaneGUID;
- case NPC_LIGHTBANE:
- return LightbaneGUID;
- case NPC_ANUBARAK:
- return AnubarakGUID;
-
- case GO_ARGENT_COLISEUM_FLOOR:
- return FloorGUID;
- case GO_MAIN_GATE_DOOR:
- return MainGateDoorGUID;
- case GO_EAST_PORTCULLIS:
- return EastPortcullisGUID;
- case GO_WEB_DOOR:
- return WebDoorGUID;
- default:
- break;
- }
-
- return ObjectGuid::Empty;
- }
-
uint32 GetData(uint32 type) const override
{
switch (type)
@@ -553,7 +463,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
case 6000:
case 6005:
case 6010:
- return NPC_TIRION;
+ return NPC_TIRION_FORDRING;
break;
case 5010:
case 5030:
@@ -595,7 +505,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
return NPC_FIZZLEBANG;
break;
default:
- return NPC_TIRION;
+ return NPC_TIRION_FORDRING;
break;
};
default:
@@ -615,7 +525,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
NotOneButTwoJormungarsTimer -= diff;
}
- if (GetBossState(BOSS_CRUSADERS) == SPECIAL && ResilienceWillFixItTimer)
+ if (GetBossState(DATA_FACTION_CRUSADERS) == SPECIAL && ResilienceWillFixItTimer)
{
if (ResilienceWillFixItTimer <= diff)
ResilienceWillFixItTimer = 0;
@@ -630,7 +540,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
std::ostringstream saveStream;
- for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
+ for (uint8 i = 0; i < EncounterCount; ++i)
saveStream << GetBossState(i) << ' ';
saveStream << TrialCounter;
@@ -658,7 +568,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
std::istringstream loadStream(strIn);
- for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
+ for (uint8 i = 0; i < EncounterCount; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
@@ -718,30 +628,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript
bool NeedSave;
std::string SaveDataBuffer;
- ObjectGuid BarrentGUID;
- ObjectGuid TirionGUID;
- ObjectGuid TirionFordringGUID;
- ObjectGuid FizzlebangGUID;
- ObjectGuid GarroshGUID;
- ObjectGuid VarianGUID;
-
- ObjectGuid GormokGUID;
- ObjectGuid AcidmawGUID;
- ObjectGuid DreadscaleGUID;
- ObjectGuid IcehowlGUID;
- ObjectGuid JaraxxusGUID;
- ObjectGuid ChampionsControllerGUID;
- ObjectGuid DarkbaneGUID;
- ObjectGuid LightbaneGUID;
- ObjectGuid AnubarakGUID;
-
- ObjectGuid CrusadersCacheGUID;
- ObjectGuid FloorGUID;
- ObjectGuid TributeChestGUID;
- ObjectGuid MainGateDoorGUID;
- ObjectGuid EastPortcullisGUID;
- ObjectGuid WebDoorGUID;
-
// Achievement stuff
uint32 NotOneButTwoJormungarsTimer;
uint32 ResilienceWillFixItTimer;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index fdc93f56c39..de24ab4a352 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
@@ -164,12 +164,12 @@ struct _Messages
static _Messages _GossipMessage[]=
{
- {MSG_BEASTS, GOSSIP_ACTION_INFO_DEF + 1, false, BOSS_BEASTS},
- {MSG_JARAXXUS, GOSSIP_ACTION_INFO_DEF + 2, false, BOSS_JARAXXUS},
- {MSG_CRUSADERS, GOSSIP_ACTION_INFO_DEF + 3, false, BOSS_CRUSADERS},
- {MSG_VALKIRIES, GOSSIP_ACTION_INFO_DEF + 4, false, BOSS_VALKIRIES},
- {MSG_LICH_KING, GOSSIP_ACTION_INFO_DEF + 5, false, BOSS_ANUBARAK},
- {MSG_ANUBARAK, GOSSIP_ACTION_INFO_DEF + 6, true, BOSS_ANUBARAK}
+ {MSG_BEASTS, GOSSIP_ACTION_INFO_DEF + 1, false, DATA_NORTHREND_BEASTS},
+ {MSG_JARAXXUS, GOSSIP_ACTION_INFO_DEF + 2, false, DATA_JARAXXUS},
+ {MSG_CRUSADERS, GOSSIP_ACTION_INFO_DEF + 3, false, DATA_FACTION_CRUSADERS},
+ {MSG_VALKIRIES, GOSSIP_ACTION_INFO_DEF + 4, false, DATA_TWIN_VALKIRIES},
+ {MSG_LICH_KING, GOSSIP_ACTION_INFO_DEF + 5, false, DATA_ANUBARAK},
+ {MSG_ANUBARAK, GOSSIP_ACTION_INFO_DEF + 6, true, DATA_ANUBARAK}
};
enum Messages
@@ -229,16 +229,16 @@ class npc_announcer_toc10 : public CreatureScript
ClearGossipMenuFor(player);
CloseGossipMenuFor(player);
- if (instance->GetBossState(BOSS_BEASTS) != DONE)
+ if (instance->GetBossState(DATA_NORTHREND_BEASTS) != DONE)
{
instance->SetData(TYPE_EVENT, 110);
instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED);
- instance->SetBossState(BOSS_BEASTS, NOT_STARTED);
+ instance->SetBossState(DATA_NORTHREND_BEASTS, NOT_STARTED);
}
- else if (instance->GetBossState(BOSS_JARAXXUS) != DONE)
+ else if (instance->GetBossState(DATA_JARAXXUS) != DONE)
{
// if Jaraxxus is spawned, but the raid wiped
- if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS)))
+ if (Creature* jaraxxus = instance->GetCreature(DATA_JARAXXUS))
{
jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS);
jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -249,29 +249,29 @@ class npc_announcer_toc10 : public CreatureScript
else
{
instance->SetData(TYPE_EVENT, 1010);
- instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED);
+ instance->SetBossState(DATA_JARAXXUS, NOT_STARTED);
}
}
- else if (instance->GetBossState(BOSS_CRUSADERS) != DONE)
+ else if (instance->GetBossState(DATA_FACTION_CRUSADERS) != DONE)
{
if (player->GetTeam() == ALLIANCE)
instance->SetData(TYPE_EVENT, 3000);
else
instance->SetData(TYPE_EVENT, 3001);
- instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED);
+ instance->SetBossState(DATA_FACTION_CRUSADERS, NOT_STARTED);
}
- else if (instance->GetBossState(BOSS_VALKIRIES) != DONE)
+ else if (instance->GetBossState(DATA_TWIN_VALKIRIES) != DONE)
{
instance->SetData(TYPE_EVENT, 4000);
- instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED);
+ instance->SetBossState(DATA_TWIN_VALKIRIES, NOT_STARTED);
}
- else if (instance->GetBossState(BOSS_LICH_KING) != DONE)
+ else if (instance->GetBossState(DATA_LICH_KING) != DONE)
{
if (me->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE)
instance->SetData(TYPE_EVENT, 4020);
else
instance->SetData(TYPE_EVENT, 4030);
- instance->SetBossState(BOSS_LICH_KING, NOT_STARTED);
+ instance->SetBossState(DATA_LICH_KING, NOT_STARTED);
}
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
return true;
@@ -305,7 +305,7 @@ class boss_lich_king_toc : public CreatureScript
summoned->SetDisplayId(summoned->GetCreatureTemplate()->Modelid2);
}
- _instance->SetBossState(BOSS_LICH_KING, IN_PROGRESS);
+ _instance->SetBossState(DATA_LICH_KING, IN_PROGRESS);
me->SetWalk(true);
}
@@ -376,15 +376,15 @@ class boss_lich_king_toc : public CreatureScript
break;
case 5080:
{
- if (GameObject* go = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(GO_ARGENT_COLISEUM_FLOOR)))
+ if (GameObject* go = _instance->GetGameObject(DATA_COLISEUM_FLOOR))
go->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
me->CastSpell(me, SPELL_CORPSE_TELEPORT, false);
me->CastSpell(me, SPELL_DESTROY_FLOOR_KNOCKUP, false);
- _instance->SetBossState(BOSS_LICH_KING, DONE);
+ _instance->SetBossState(DATA_LICH_KING, DONE);
- if (!ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_ANUBARAK)))
+ if (!_instance->GetCreature(DATA_ANUBARAK))
me->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
_instance->SetData(TYPE_EVENT, 0);
@@ -429,7 +429,7 @@ class npc_fizzlebang_toc : public CreatureScript
{
Talk(SAY_STAGE_1_06, killer);
_instance->SetData(TYPE_EVENT, 1180);
- if (Creature* jaraxxus = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_JARAXXUS)))
+ if (Creature* jaraxxus = _instance->GetCreature(DATA_JARAXXUS))
{
jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
jaraxxus->SetImmuneToPC(false);
@@ -454,7 +454,7 @@ class npc_fizzlebang_toc : public CreatureScript
{
case 1:
me->SetWalk(false);
- _instance->DoUseDoorOrButton(_instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ _instance->DoUseDoorOrButton(_instance->GetGuidData(DATA_MAIN_GATE));
_instance->SetData(TYPE_EVENT, 1120);
_instance->SetData(TYPE_EVENT_TIMER, 1*IN_MILLISECONDS);
break;
@@ -538,7 +538,7 @@ class npc_fizzlebang_toc : public CreatureScript
_updateTimer = 5*IN_MILLISECONDS;
break;
case 1142:
- if (Creature* jaraxxus = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_JARAXXUS)))
+ if (Creature* jaraxxus = _instance->GetCreature(DATA_JARAXXUS))
jaraxxus->SetTarget(me->GetGUID());
if (Creature* pTrigger = ObjectAccessor::GetCreature(*me, _triggerGUID))
pTrigger->DespawnOrUnsummon();
@@ -548,13 +548,13 @@ class npc_fizzlebang_toc : public CreatureScript
_updateTimer = 10*IN_MILLISECONDS;
break;
case 1144:
- if (Creature* jaraxxus = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_JARAXXUS)))
+ if (Creature* jaraxxus = _instance->GetCreature(DATA_JARAXXUS))
jaraxxus->AI()->Talk(SAY_STAGE_1_05);
_instance->SetData(TYPE_EVENT, 1150);
_updateTimer = 5*IN_MILLISECONDS;
break;
case 1150:
- if (Creature* jaraxxus = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_JARAXXUS)))
+ if (Creature* jaraxxus = _instance->GetCreature(DATA_JARAXXUS))
{
//1-shot Fizzlebang
jaraxxus->CastSpell(me, 67888, false); // 67888 - Fel Lightning
@@ -605,7 +605,7 @@ class npc_tirion_toc : public CreatureScript
if (!_instance)
return;
- if (_instance->GetData(TYPE_EVENT_NPC) != NPC_TIRION)
+ if (_instance->GetData(TYPE_EVENT_NPC) != NPC_TIRION_FORDRING)
return;
uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
@@ -627,9 +627,9 @@ class npc_tirion_toc : public CreatureScript
break;
case 150:
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
- if (_instance->GetBossState(BOSS_BEASTS) != DONE)
+ if (_instance->GetBossState(DATA_NORTHREND_BEASTS) != DONE)
{
- _instance->DoUseDoorOrButton(_instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ _instance->DoUseDoorOrButton(_instance->GetGuidData(DATA_MAIN_GATE));
if (Creature* gormok = me->SummonCreature(NPC_GORMOK, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30*IN_MILLISECONDS))
{
@@ -649,9 +649,9 @@ class npc_tirion_toc : public CreatureScript
break;
case 200:
Talk(SAY_STAGE_0_04);
- if (_instance->GetBossState(BOSS_BEASTS) != DONE)
+ if (_instance->GetBossState(DATA_NORTHREND_BEASTS) != DONE)
{
- _instance->DoUseDoorOrButton(_instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ _instance->DoUseDoorOrButton(_instance->GetGuidData(DATA_MAIN_GATE));
if (Creature* dreadscale = me->SummonCreature(NPC_DREADSCALE, ToCSpawnLoc[1].GetPositionX(), ToCSpawnLoc[1].GetPositionY(), ToCSpawnLoc[1].GetPositionZ(), 5, TEMPSUMMON_MANUAL_DESPAWN))
{
dreadscale->GetMotionMaster()->MovePoint(0, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ());
@@ -667,9 +667,9 @@ class npc_tirion_toc : public CreatureScript
break;
case 300:
Talk(SAY_STAGE_0_05);
- if (_instance->GetBossState(BOSS_BEASTS) != DONE)
+ if (_instance->GetBossState(DATA_NORTHREND_BEASTS) != DONE)
{
- _instance->DoUseDoorOrButton(_instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ _instance->DoUseDoorOrButton(_instance->GetGuidData(DATA_MAIN_GATE));
if (Creature* icehowl = me->SummonCreature(NPC_ICEHOWL, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5, TEMPSUMMON_DEAD_DESPAWN))
{
icehowl->GetMotionMaster()->MovePoint(2, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ());
@@ -697,7 +697,7 @@ class npc_tirion_toc : public CreatureScript
case 1010:
Talk(SAY_STAGE_1_01);
_updateTimer = 7*IN_MILLISECONDS;
- _instance->DoUseDoorOrButton(_instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ _instance->DoUseDoorOrButton(_instance->GetGuidData(DATA_MAIN_GATE));
me->SummonCreature(NPC_FIZZLEBANG, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
_instance->SetData(TYPE_EVENT, 0);
break;
@@ -751,7 +751,7 @@ class npc_tirion_toc : public CreatureScript
_instance->SetData(TYPE_EVENT, 3092);
break;
case 3092:
- if (Creature* pChampionController = ObjectAccessor::GetCreature((*me), _instance->GetGuidData(NPC_CHAMPIONS_CONTROLLER)))
+ if (Creature* pChampionController = _instance->GetCreature(DATA_FACTION_CRUSADERS))
pChampionController->AI()->SetData(1, NOT_STARTED);
_instance->SetData(TYPE_EVENT, 3095);
break;
@@ -768,14 +768,14 @@ class npc_tirion_toc : public CreatureScript
break;
case 4010:
Talk(SAY_STAGE_3_02);
- if (Creature* lightbane = me->SummonCreature(NPC_LIGHTBANE, ToCSpawnLoc[1].GetPositionX(), ToCSpawnLoc[1].GetPositionY(), ToCSpawnLoc[1].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
+ if (Creature* lightbane = me->SummonCreature(NPC_FJOLA_LIGHTBANE, ToCSpawnLoc[1].GetPositionX(), ToCSpawnLoc[1].GetPositionY(), ToCSpawnLoc[1].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
{
lightbane->SetVisible(false);
lightbane->SetReactState(REACT_PASSIVE);
lightbane->SummonCreature(NPC_LIGHT_ESSENCE, TwinValkyrsLoc[0].GetPositionX(), TwinValkyrsLoc[0].GetPositionY(), TwinValkyrsLoc[0].GetPositionZ());
lightbane->SummonCreature(NPC_LIGHT_ESSENCE, TwinValkyrsLoc[1].GetPositionX(), TwinValkyrsLoc[1].GetPositionY(), TwinValkyrsLoc[1].GetPositionZ());
}
- if (Creature* darkbane = me->SummonCreature(NPC_DARKBANE, ToCSpawnLoc[2].GetPositionX(), ToCSpawnLoc[2].GetPositionY(), ToCSpawnLoc[2].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
+ if (Creature* darkbane = me->SummonCreature(NPC_EYDIS_DARKBANE, ToCSpawnLoc[2].GetPositionX(), ToCSpawnLoc[2].GetPositionY(), ToCSpawnLoc[2].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
{
darkbane->SetVisible(false);
darkbane->SetReactState(REACT_PASSIVE);
@@ -786,13 +786,13 @@ class npc_tirion_toc : public CreatureScript
_instance->SetData(TYPE_EVENT, 4015);
break;
case 4015:
- _instance->DoUseDoorOrButton(_instance->GetGuidData(GO_MAIN_GATE_DOOR));
- if (Creature* lightbane = ObjectAccessor::GetCreature((*me), _instance->GetGuidData(NPC_LIGHTBANE)))
+ _instance->DoUseDoorOrButton(_instance->GetGuidData(DATA_MAIN_GATE));
+ if (Creature* lightbane = _instance->GetCreature(DATA_FJOLA_LIGHTBANE))
{
lightbane->GetMotionMaster()->MovePoint(1, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ());
lightbane->SetVisible(true);
}
- if (Creature* darkbane = ObjectAccessor::GetCreature((*me), _instance->GetGuidData(NPC_DARKBANE)))
+ if (Creature* darkbane = _instance->GetCreature(DATA_EYDIS_DARKBANE))
{
darkbane->GetMotionMaster()->MovePoint(1, ToCCommonLoc[9].GetPositionX(), ToCCommonLoc[9].GetPositionY(), ToCCommonLoc[9].GetPositionZ());
darkbane->SetVisible(true);
@@ -801,7 +801,7 @@ class npc_tirion_toc : public CreatureScript
_instance->SetData(TYPE_EVENT, 4016);
break;
case 4016:
- _instance->DoUseDoorOrButton(_instance->GetGuidData(GO_MAIN_GATE_DOOR));
+ _instance->DoUseDoorOrButton(_instance->GetGuidData(DATA_MAIN_GATE));
_instance->SetData(TYPE_EVENT, 4017);
break;
case 4040:
@@ -824,14 +824,14 @@ class npc_tirion_toc : public CreatureScript
_instance->SetData(TYPE_EVENT, 0);
break;
case 6000:
- me->SummonCreature(NPC_TIRION_FORDRING, EndSpawnLoc[0]);
+ me->SummonCreature(NPC_TIRION_FORDRING_ANUBARAK, EndSpawnLoc[0]);
me->SummonCreature(NPC_ARGENT_MAGE, EndSpawnLoc[1]);
me->SummonGameObject(GO_PORTAL_TO_DALARAN, EndSpawnLoc[2], QuaternionData(), 0);
_updateTimer = 20*IN_MILLISECONDS;
_instance->SetData(TYPE_EVENT, 6005);
break;
case 6005:
- if (Creature* tirionFordring = ObjectAccessor::GetCreature((*me), _instance->GetGuidData(NPC_TIRION_FORDRING)))
+ if (Creature* tirionFordring = _instance->GetCreature(DATA_FORDRING_ANUBARAK))
tirionFordring->AI()->Talk(SAY_STAGE_4_06);
_updateTimer = 20*IN_MILLISECONDS;
_instance->SetData(TYPE_EVENT, 6010);
@@ -839,10 +839,10 @@ class npc_tirion_toc : public CreatureScript
case 6010:
if (IsHeroic())
{
- if (Creature* tirionFordring = ObjectAccessor::GetCreature((*me), _instance->GetGuidData(NPC_TIRION_FORDRING)))
+ if (Creature* tirionFordring = _instance->GetCreature(DATA_FORDRING_ANUBARAK))
tirionFordring->AI()->Talk(SAY_STAGE_4_07);
_updateTimer = 1*MINUTE*IN_MILLISECONDS;
- _instance->SetBossState(BOSS_ANUBARAK, SPECIAL);
+ _instance->SetBossState(DATA_ANUBARAK, SPECIAL);
_instance->SetData(TYPE_EVENT, 6020);
}
else
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
index d744c7e1cd2..d3565fe27eb 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
@@ -25,19 +25,42 @@
#define DataHeader "TCR"
struct Position;
+uint32 const EncounterCount = 6;
enum TCRDataTypes
{
- BOSS_BEASTS = 0,
- BOSS_JARAXXUS = 1,
- BOSS_CRUSADERS = 2,
- BOSS_VALKIRIES = 3,
- BOSS_LICH_KING = 4, // not really a boss but oh well
- BOSS_ANUBARAK = 5,
- MAX_ENCOUNTERS = 6,
-
- TYPE_COUNTER = 8,
- TYPE_EVENT = 9,
+ // Encounter States
+ DATA_NORTHREND_BEASTS = 0,
+ DATA_JARAXXUS = 1,
+ DATA_FACTION_CRUSADERS = 2,
+ DATA_TWIN_VALKIRIES = 3,
+ DATA_LICH_KING = 4,
+ DATA_ANUBARAK = 5,
+
+ // Additional Data
+ DATA_GORMOK_THE_IMPALER = 5,
+ DATA_ACIDMAW = 6,
+ DATA_DREADSCALE = 7,
+ DATA_ICEHOWL = 8,
+ DATA_FJOLA_LIGHTBANE = 9,
+ DATA_EYDIS_DARKBANE = 10,
+ DATA_BARRET_RAMSEY = 11,
+ DATA_FORDRING = 12,
+ DATA_FORDRING_ANUBARAK = 13,
+ DATA_VARIAN = 14,
+ DATA_GARROSH = 15,
+ DATA_FIZZLEBANG = 16,
+ DATA_FACTION_CHAMPIONS = 17,
+
+ DATA_CRUSADERS_CHEST = 18,
+ DATA_COLISEUM_FLOOR = 19,
+ DATA_MAIN_GATE = 20,
+ DATA_EAST_PORTCULLIS = 21,
+ DATA_WEB_DOOR = 22,
+ DATA_TRIBUTE_CHEST = 23,
+
+ TYPE_COUNTER = 24,
+ TYPE_EVENT = 25,
TYPE_EVENT_TIMER = 101,
TYPE_EVENT_NPC = 102,
@@ -60,7 +83,7 @@ enum TCRSpellIds
enum TCRMiscData
{
- DESPAWN_TIME = 1200000
+ DESPAWN_TIME = 1200000
};
extern Position const ToCCommonLoc[];
@@ -68,121 +91,121 @@ extern Position const AnubarakLoc[];
enum TCRWorldStateIds
{
- UPDATE_STATE_UI_SHOW = 4390,
- UPDATE_STATE_UI_COUNT = 4389
+ UPDATE_STATE_UI_SHOW = 4390,
+ UPDATE_STATE_UI_COUNT = 4389
};
enum NorthrendBeasts
{
- GORMOK_IN_PROGRESS = 1000,
- GORMOK_DONE = 1001,
- SNAKES_IN_PROGRESS = 2000,
- DREADSCALE_SUBMERGED = 2001,
- ACIDMAW_SUBMERGED = 2002,
- SNAKES_SPECIAL = 2003,
- SNAKES_DONE = 2004,
- ICEHOWL_IN_PROGRESS = 3000,
- ICEHOWL_DONE = 3001
+ GORMOK_IN_PROGRESS = 1000,
+ GORMOK_DONE = 1001,
+ SNAKES_IN_PROGRESS = 2000,
+ DREADSCALE_SUBMERGED = 2001,
+ ACIDMAW_SUBMERGED = 2002,
+ SNAKES_SPECIAL = 2003,
+ SNAKES_DONE = 2004,
+ ICEHOWL_IN_PROGRESS = 3000,
+ ICEHOWL_DONE = 3001
};
enum AnnouncerMessages
{
- MSG_BEASTS = 724001,
- MSG_JARAXXUS = 724002,
- MSG_CRUSADERS = 724003,
- MSG_VALKIRIES = 724004,
- MSG_LICH_KING = 724005,
- MSG_ANUBARAK = 724006
+ MSG_BEASTS = 724001,
+ MSG_JARAXXUS = 724002,
+ MSG_CRUSADERS = 724003,
+ MSG_VALKIRIES = 724004,
+ MSG_LICH_KING = 724005,
+ MSG_ANUBARAK = 724006
};
enum TCRCreatureIds
{
- NPC_BARRENT = 34816,
- NPC_TIRION = 34996,
- NPC_TIRION_FORDRING = 36095,
- NPC_ARGENT_MAGE = 36097,
- NPC_FIZZLEBANG = 35458,
- NPC_GARROSH = 34995,
- NPC_VARIAN = 34990,
- NPC_LICH_KING = 35877,
-
- NPC_THRALL = 34994,
- NPC_PROUDMOORE = 34992,
- NPC_WILFRED_PORTAL = 17965,
- NPC_TRIGGER = 35651,
-
- NPC_ICEHOWL = 34797,
- NPC_GORMOK = 34796,
- NPC_DREADSCALE = 34799,
- NPC_ACIDMAW = 35144,
-
- NPC_JARAXXUS = 34780,
-
- NPC_CHAMPIONS_CONTROLLER = 34781,
-
- NPC_ALLIANCE_DEATH_KNIGHT = 34461,
- NPC_ALLIANCE_DRUID_BALANCE = 34460,
- NPC_ALLIANCE_DRUID_RESTORATION = 34469,
- NPC_ALLIANCE_HUNTER = 34467,
- NPC_ALLIANCE_MAGE = 34468,
- NPC_ALLIANCE_PALADIN_HOLY = 34465,
- NPC_ALLIANCE_PALADIN_RETRIBUTION = 34471,
- NPC_ALLIANCE_PRIEST_DISCIPLINE = 34466,
- NPC_ALLIANCE_PRIEST_SHADOW = 34473,
- NPC_ALLIANCE_ROGUE = 34472,
- NPC_ALLIANCE_SHAMAN_ENHANCEMENT = 34463,
- NPC_ALLIANCE_SHAMAN_RESTORATION = 34470,
- NPC_ALLIANCE_WARLOCK = 34474,
- NPC_ALLIANCE_WARRIOR = 34475,
-
- NPC_HORDE_DEATH_KNIGHT = 34458,
- NPC_HORDE_DRUID_BALANCE = 34451,
- NPC_HORDE_DRUID_RESTORATION = 34459,
- NPC_HORDE_HUNTER = 34448,
- NPC_HORDE_MAGE = 34449,
- NPC_HORDE_PALADIN_HOLY = 34445,
- NPC_HORDE_PALADIN_RETRIBUTION = 34456,
- NPC_HORDE_PRIEST_DISCIPLINE = 34447,
- NPC_HORDE_PRIEST_SHADOW = 34441,
- NPC_HORDE_ROGUE = 34454,
- NPC_HORDE_SHAMAN_ENHANCEMENT = 34455,
- NPC_HORDE_SHAMAN_RESTORATION = 34444,
- NPC_HORDE_WARLOCK = 34450,
- NPC_HORDE_WARRIOR = 34453,
-
- NPC_LIGHTBANE = 34497,
- NPC_DARKBANE = 34496,
-
- NPC_DARK_ESSENCE = 34567,
- NPC_LIGHT_ESSENCE = 34568,
-
- NPC_ANUBARAK = 34564
+ NPC_BARRET_RAMSEY = 34816,
+ NPC_TIRION_FORDRING = 34996,
+ NPC_TIRION_FORDRING_ANUBARAK = 36095,
+ NPC_ARGENT_MAGE = 36097,
+ NPC_FIZZLEBANG = 35458,
+ NPC_GARROSH = 34995,
+ NPC_VARIAN = 34990,
+ NPC_LICH_KING = 35877,
+
+ NPC_THRALL = 34994,
+ NPC_PROUDMOORE = 34992,
+ NPC_WILFRED_PORTAL = 17965,
+ NPC_TRIGGER = 35651,
+
+ NPC_ICEHOWL = 34797,
+ NPC_GORMOK = 34796,
+ NPC_DREADSCALE = 34799,
+ NPC_ACIDMAW = 35144,
+
+ NPC_JARAXXUS = 34780,
+
+ NPC_CHAMPIONS_CONTROLLER = 34781,
+
+ NPC_ALLIANCE_DEATH_KNIGHT = 34461,
+ NPC_ALLIANCE_DRUID_BALANCE = 34460,
+ NPC_ALLIANCE_DRUID_RESTORATION = 34469,
+ NPC_ALLIANCE_HUNTER = 34467,
+ NPC_ALLIANCE_MAGE = 34468,
+ NPC_ALLIANCE_PALADIN_HOLY = 34465,
+ NPC_ALLIANCE_PALADIN_RETRIBUTION = 34471,
+ NPC_ALLIANCE_PRIEST_DISCIPLINE = 34466,
+ NPC_ALLIANCE_PRIEST_SHADOW = 34473,
+ NPC_ALLIANCE_ROGUE = 34472,
+ NPC_ALLIANCE_SHAMAN_ENHANCEMENT = 34463,
+ NPC_ALLIANCE_SHAMAN_RESTORATION = 34470,
+ NPC_ALLIANCE_WARLOCK = 34474,
+ NPC_ALLIANCE_WARRIOR = 34475,
+
+ NPC_HORDE_DEATH_KNIGHT = 34458,
+ NPC_HORDE_DRUID_BALANCE = 34451,
+ NPC_HORDE_DRUID_RESTORATION = 34459,
+ NPC_HORDE_HUNTER = 34448,
+ NPC_HORDE_MAGE = 34449,
+ NPC_HORDE_PALADIN_HOLY = 34445,
+ NPC_HORDE_PALADIN_RETRIBUTION = 34456,
+ NPC_HORDE_PRIEST_DISCIPLINE = 34447,
+ NPC_HORDE_PRIEST_SHADOW = 34441,
+ NPC_HORDE_ROGUE = 34454,
+ NPC_HORDE_SHAMAN_ENHANCEMENT = 34455,
+ NPC_HORDE_SHAMAN_RESTORATION = 34444,
+ NPC_HORDE_WARLOCK = 34450,
+ NPC_HORDE_WARRIOR = 34453,
+
+ NPC_FJOLA_LIGHTBANE = 34497,
+ NPC_EYDIS_DARKBANE = 34496,
+
+ NPC_DARK_ESSENCE = 34567,
+ NPC_LIGHT_ESSENCE = 34568,
+
+ NPC_ANUBARAK = 34564
};
enum TCRGameObjectIds
{
- GO_CRUSADERS_CACHE_10 = 195631,
- GO_CRUSADERS_CACHE_25 = 195632,
- GO_CRUSADERS_CACHE_10_H = 195633,
- GO_CRUSADERS_CACHE_25_H = 195635,
+ GO_CRUSADERS_CACHE_10 = 195631,
+ GO_CRUSADERS_CACHE_25 = 195632,
+ GO_CRUSADERS_CACHE_10_H = 195633,
+ GO_CRUSADERS_CACHE_25_H = 195635,
// Tribute Chest (heroic)
// 10-man modes
- GO_TRIBUTE_CHEST_10H_25 = 195668, // 10man 01-24 attempts
- GO_TRIBUTE_CHEST_10H_45 = 195667, // 10man 25-44 attempts
- GO_TRIBUTE_CHEST_10H_50 = 195666, // 10man 45-49 attempts
- GO_TRIBUTE_CHEST_10H_99 = 195665, // 10man 50 attempts
+ GO_TRIBUTE_CHEST_10H_25 = 195668, // 10man 01-24 attempts
+ GO_TRIBUTE_CHEST_10H_45 = 195667, // 10man 25-44 attempts
+ GO_TRIBUTE_CHEST_10H_50 = 195666, // 10man 45-49 attempts
+ GO_TRIBUTE_CHEST_10H_99 = 195665, // 10man 50 attempts
// 25-man modes
- GO_TRIBUTE_CHEST_25H_25 = 195672, // 25man 01-24 attempts
- GO_TRIBUTE_CHEST_25H_45 = 195671, // 25man 25-44 attempts
- GO_TRIBUTE_CHEST_25H_50 = 195670, // 25man 45-49 attempts
- GO_TRIBUTE_CHEST_25H_99 = 195669, // 25man 50 attempts
-
- GO_ARGENT_COLISEUM_FLOOR = 195527, //20943
- GO_MAIN_GATE_DOOR = 195647,
- GO_EAST_PORTCULLIS = 195648,
- GO_WEB_DOOR = 195485,
- GO_PORTAL_TO_DALARAN = 195682
+ GO_TRIBUTE_CHEST_25H_25 = 195672, // 25man 01-24 attempts
+ GO_TRIBUTE_CHEST_25H_45 = 195671, // 25man 25-44 attempts
+ GO_TRIBUTE_CHEST_25H_50 = 195670, // 25man 45-49 attempts
+ GO_TRIBUTE_CHEST_25H_99 = 195669, // 25man 50 attempts
+
+ GO_ARGENT_COLISEUM_FLOOR = 195527, //20943
+ GO_MAIN_GATE_DOOR = 195647,
+ GO_EAST_PORTCULLIS = 195648,
+ GO_WEB_DOOR = 195485,
+ GO_PORTAL_TO_DALARAN = 195682
};
enum TCRAchievementData
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index 3925fd3b042..09f80db1f36 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -1626,7 +1626,7 @@ class FlameLeviathanPursuedTargetSelector
};
public:
- explicit FlameLeviathanPursuedTargetSelector(Unit* unit) : _me(unit) { };
+ explicit FlameLeviathanPursuedTargetSelector() { };
bool operator()(WorldObject* target) const
{
@@ -1656,9 +1656,6 @@ class FlameLeviathanPursuedTargetSelector
return !playerFound;
}
-
- private:
- Unit const* _me;
};
class spell_pursue : public SpellScriptLoader
@@ -1679,7 +1676,7 @@ class spell_pursue : public SpellScriptLoader
private:
void FilterTargets(std::list<WorldObject*>& targets)
{
- targets.remove_if(FlameLeviathanPursuedTargetSelector(GetCaster()));
+ targets.remove_if(FlameLeviathanPursuedTargetSelector());
if (!targets.empty())
{
//! In the end, only one target should be selected
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index 41985059aae..2b5e11c0d50 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -1469,8 +1469,12 @@ struct npc_razorscale_devouring_flame : public ScriptedAI
void Reset() override
{
- DoCastSelf(DEVOURING_FLAME_GROUND);
+ me->SetReactState(REACT_PASSIVE);
+ DoCastSelf(DEVOURING_FLAME_GROUND, true);
}
+
+ // Evade caused by Spell::SummonGuardian. Creature dont need evade at all, is despawned if razorscale enter in evade
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
};
class go_razorscale_harpoon : public GameObjectScript
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
index a6340227270..1573fb3bcf7 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
@@ -178,6 +178,9 @@ class spell_talon_king_ikiss_blink : public SpellScriptLoader
void FilterTargets(std::list<WorldObject*>& targets)
{
+ if (targets.empty())
+ return;
+
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
targets.clear();
targets.push_back(target);
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index 3c2eb05a083..181a01f6745 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -407,6 +407,12 @@ Position const IllidanDBTargetPoints[4] =
{ 660.3492f, 345.5749f, 353.2961f }
};
+Position const BladesPositions[2] =
+{
+ { 676.226013f, 325.230988f },
+ { 678.059998f, 285.220001f }
+};
+
uint32 const SummonCageTrapSpells[8] =
{
SPELL_SUMMON_CAGE_TRAP_1,
@@ -438,15 +444,14 @@ private:
class ChargeTargetSelector : public std::unary_function<Unit*, bool>
{
public:
- ChargeTargetSelector(Unit const* unit) : _me(unit) { }
+ ChargeTargetSelector() { }
bool operator()(Unit* unit) const
{
- return unit->GetTypeId() == TYPEID_PLAYER && _me->GetDistance2d(unit) > 25.0f;
+ return unit->GetTypeId() == TYPEID_PLAYER
+ && unit->GetDistance2d(BladesPositions[0].GetPositionX(), BladesPositions[0].GetPositionY()) > 25.0f
+ && unit->GetDistance2d(BladesPositions[1].GetPositionX(), BladesPositions[1].GetPositionY()) > 25.0f;
}
-
-private:
- Unit const* _me;
};
struct boss_illidan_stormrage : public BossAI
@@ -1497,7 +1502,7 @@ struct npc_flame_of_azzinoth : public ScriptedAI
_events.ScheduleEvent(EVENT_FLAME_CHARGE, Seconds(5));
break;
case EVENT_FLAME_CHARGE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, ChargeTargetSelector(me)))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, ChargeTargetSelector()))
{
DoCast(target, SPELL_CHARGE);
_events.Repeat(Seconds(5));
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
index 059613f9450..f49b02949eb 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
@@ -371,4 +371,3 @@ void AddSC_boss_kelidan_the_breaker()
new boss_kelidan_the_breaker();
new npc_shadowmoon_channeler();
}
-
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
index 6eec5664855..cc68806ecf6 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
@@ -322,4 +322,3 @@ void AddSC_instance_blood_furnace()
{
new instance_blood_furnace();
}
-
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
index a8914c31b96..6da7007d42c 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
@@ -239,4 +239,3 @@ void AddSC_boss_omor_the_unscarred()
{
new boss_omor_the_unscarred();
}
-
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
index 88cf3e61bc7..6a9d6a020f1 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
@@ -524,4 +524,3 @@ void AddSC_boss_vazruden_the_herald()
new boss_nazan();
new npc_hellfire_sentry();
}
-
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
index dd2e7700d1c..a00c492a807 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
@@ -183,4 +183,3 @@ void AddSC_boss_watchkeeper_gargolmar()
{
new boss_watchkeeper_gargolmar();
}
-
diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
index 087343a83f4..692c688ad8e 100644
--- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
@@ -145,4 +145,3 @@ void AddSC_instance_magtheridons_lair()
{
new instance_magtheridons_lair();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
index 813910f5bc5..12cbff7fc25 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
@@ -546,4 +546,3 @@ void AddSC_boss_high_astromancer_solarian()
new npc_solarium_priest();
new spell_astromancer_wrath_of_the_astromancer();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
index 6c2f7500055..f2720b4ffe9 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
@@ -171,4 +171,3 @@ void AddSC_boss_void_reaver()
{
new boss_void_reaver();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
index 71471909f6b..87a291ec19e 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
@@ -129,4 +129,3 @@ void AddSC_instance_the_eye()
{
new instance_the_eye;
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
index fb2361f2837..5aa2d7bfbc8 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
@@ -112,4 +112,3 @@ void AddSC_the_eye()
{
new npc_crystalcore_devastator();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
index 0b060d35771..6fa78e6ff6d 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
@@ -135,4 +135,3 @@ void AddSC_boss_gatewatcher_iron_hand()
{
new boss_gatewatcher_iron_hand();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
index 25bbfe0392a..6f3547f722e 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
@@ -253,4 +253,3 @@ void AddSC_boss_pathaleon_the_calculator()
new boss_pathaleon_the_calculator();
new npc_nether_wraith();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
index bbe26ac1bb2..e0f8577169a 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
@@ -304,4 +304,3 @@ void AddSC_boss_harbinger_skyriss()
new boss_harbinger_skyriss();
new boss_harbinger_skyriss_illusion();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
index ba5b7b7e0a5..b5405d4e86c 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
@@ -195,4 +195,3 @@ void AddSC_instance_arcatraz()
{
new instance_arcatraz();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
index 204a52609b0..35c2ea74c7b 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
@@ -220,4 +220,3 @@ void AddSC_boss_high_botanist_freywinn()
{
new boss_high_botanist_freywinn();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
index 31241a050dd..1e747509069 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
@@ -231,4 +231,3 @@ void AddSC_boss_laj()
{
new boss_laj();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
index 291be813dc1..49f7ffde633 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
@@ -250,4 +250,3 @@ void AddSC_boss_warp_splinter()
new boss_warp_splinter();
new npc_warp_splinter_treant();
}
-
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index 582272d90a4..26f29a08a13 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -1405,7 +1405,7 @@ enum Enraged_Dpirits
// ENRAGED EARTH SPIRIT SPELLS
SPELL_FIERY_BOULDER = 38498,
SPELL_SUMMON_ENRAGED_EARTH_SHARD = 38365,
-
+
// SOULS
NPC_EARTHEN_SOUL = 21073,
NPC_FIERY_SOUL = 21097,
diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp
index ba39e16e4d7..a8b91b913e5 100644
--- a/src/server/scripts/Outland/zone_terokkar_forest.cpp
+++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp
@@ -19,26 +19,22 @@
/* ScriptData
SDName: Terokkar_Forest
SD%Complete: 85
-SDComment: Quest support: 9889, 10009, 10873, 10896, 10898, 11096, 10052, 10051. Skettis->Ogri'la Flight
+SDComment: Quest support: 9889, 10898, 10052, 10051.
SDCategory: Terokkar Forest
EndScriptData */
/* ContentData
npc_unkor_the_ruthless
-npc_infested_root_walker
-npc_rotting_forest_rager
-npc_floon
npc_isla_starmane
-npc_slim
+npc_skywing
+npc_akuno
EndContentData */
#include "ScriptMgr.h"
#include "GameObject.h"
-#include "GameObjectAI.h"
#include "Group.h"
#include "Player.h"
#include "ScriptedEscortAI.h"
-#include "ScriptedGossip.h"
#include "WorldSession.h"
/*######
@@ -166,43 +162,6 @@ public:
};
/*######
-## npc_infested_root_walker
-######*/
-
-enum InfestedRootWalker
-{
- SPELL_SUMMON_WOOD_MITES = 39130
-};
-
-class npc_infested_root_walker : public CreatureScript
-{
-public:
- npc_infested_root_walker() : CreatureScript("npc_infested_root_walker") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_infested_root_walkerAI(creature);
- }
-
- struct npc_infested_root_walkerAI : public ScriptedAI
- {
- npc_infested_root_walkerAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() override { }
- void EnterCombat(Unit* /*who*/) override { }
-
- void DamageTaken(Unit* done_by, uint32 &damage) override
- {
- if (done_by && done_by->GetTypeId() == TYPEID_PLAYER)
- if (me->GetHealth() <= damage)
- if (rand32() % 100 < 75)
- //Summon Wood Mites
- DoCast(me, SPELL_SUMMON_WOOD_MITES, true);
- }
- };
-};
-
-/*######
## npc_skywing
######*/
@@ -264,159 +223,6 @@ public:
};
/*######
-## npc_rotting_forest_rager
-######*/
-
-enum RottingForestRager
-{
- SPELL_SUMMON_LOTS_OF_WOOD_MITES = 39134
-};
-
-class npc_rotting_forest_rager : public CreatureScript
-{
-public:
- npc_rotting_forest_rager() : CreatureScript("npc_rotting_forest_rager") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_rotting_forest_ragerAI(creature);
- }
-
- struct npc_rotting_forest_ragerAI : public ScriptedAI
- {
- npc_rotting_forest_ragerAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() override { }
- void EnterCombat(Unit* /*who*/) override { }
-
- void DamageTaken(Unit* done_by, uint32 &damage) override
- {
- if (done_by->GetTypeId() == TYPEID_PLAYER)
- if (me->GetHealth() <= damage)
- if (rand32() % 100 < 75)
- //Summon Lots of Wood Mites
- DoCast(me, SPELL_SUMMON_LOTS_OF_WOOD_MITES, true);
- }
- };
-};
-
-/*######
-## npc_floon
-######*/
-
-enum Floon
-{
- SAY_FLOON_ATTACK = 0,
- OPTION_ID_PAY_UP_OR_DIE = 0,
- OPTION_ID_COLLECT_A_DEBT = 0,
- MENU_ID_PAY_UP_OR_DIE = 7731,
- MENU_ID_COLLECT_A_DEBT = 7732,
- GOSSIP_FLOON_STRANGE_SOUNDS = 9442,
- GOSSIP_HE_ALREADY_KILLED_ME = 9443,
-
- SPELL_SILENCE = 6726,
- SPELL_FROSTBOLT = 9672,
- SPELL_FROST_NOVA = 11831,
-
- QUEST_CRACKIN_SOME_SKULLS = 10009
-};
-
-class npc_floon : public CreatureScript
-{
-public:
- npc_floon() : CreatureScript("npc_floon") { }
-
- struct npc_floonAI : public ScriptedAI
- {
- npc_floonAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- m_uiNormFaction = creature->GetFaction();
- }
-
- void Initialize()
- {
- Silence_Timer = 2000;
- Frostbolt_Timer = 4000;
- FrostNova_Timer = 9000;
- }
-
- uint32 m_uiNormFaction;
- uint32 Silence_Timer;
- uint32 Frostbolt_Timer;
- uint32 FrostNova_Timer;
-
- void Reset() override
- {
- Initialize();
- if (me->GetFaction() != m_uiNormFaction)
- me->SetFaction(m_uiNormFaction);
- }
-
- void EnterCombat(Unit* /*who*/) override { }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- if (Silence_Timer <= diff)
- {
- DoCastVictim(SPELL_SILENCE);
- Silence_Timer = 30000;
- } else Silence_Timer -= diff;
-
- if (FrostNova_Timer <= diff)
- {
- DoCast(me, SPELL_FROST_NOVA);
- FrostNova_Timer = 20000;
- } else FrostNova_Timer -= diff;
-
- if (Frostbolt_Timer <= diff)
- {
- DoCastVictim(SPELL_FROSTBOLT);
- Frostbolt_Timer = 5000;
- } else Frostbolt_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
- {
- uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF)
- {
- AddGossipItemFor(player, MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, GOSSIP_HE_ALREADY_KILLED_ME, me->GetGUID());
- }
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
- {
- CloseGossipMenuFor(player);
- me->SetFaction(FACTION_ARAKKOA);
- Talk(SAY_FLOON_ATTACK, player);
- AttackStart(player);
- }
- return true;
- }
-
- bool GossipHello(Player* player) override
- {
- if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- SendGossipMenuFor(player, GOSSIP_FLOON_STRANGE_SOUNDS, me->GetGUID());
- return true;
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_floonAI(creature);
- }
-};
-
-/*######
## npc_isla_starmane
######*/
enum IslaStarmaneData
@@ -512,135 +318,6 @@ public:
}
};
-/*######
-## go_skull_pile
-######*/
-
-enum SkullPile
-{
- OPTION_ID_GEZZARAK_THE_HUNTRESS = 0,
- OPTION_ID_DARKSCREECHER_AKKARAI = 1,
- OPTION_ID_KARROG = 2,
- OPTION_ID_VAKKIZ_THE_WINDRAGER = 3,
- GOSSIP_MENU_ID_SKULL_PILE = 8660,
- ADVERSARIAL_BLOOD = 11885,
- SUMMON_GEZZARAK_THE_HUNTRESS = 40632,
- SUMMON_KARROG = 40640,
- SUMMON_DARKSCREECHER_AKKARAI = 40642,
- SUMMON_VAKKIZ_THE_WINDRAGER = 40644
-};
-
-class go_skull_pile : public GameObjectScript
-{
-public:
- go_skull_pile() : GameObjectScript("go_skull_pile") { }
-
- struct go_skull_pileAI : public GameObjectAI
- {
- go_skull_pileAI(GameObject* go) : GameObjectAI(go) { }
-
- bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
- {
- uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);
- uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
- ClearGossipMenuFor(player);
- switch (sender)
- {
- case GOSSIP_SENDER_MAIN: SendActionMenu(player, action); break;
- }
- return true;
- }
-
- bool GossipHello(Player* player) override
- {
- if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD))
- {
- AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- }
-
- SendGossipMenuFor(player, me->GetGOInfo()->questgiver.gossipID, me->GetGUID());
- return true;
- }
-
- void SendActionMenu(Player* player, uint32 action)
- {
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1:
- player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- player->CastSpell(player, SUMMON_KARROG, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 4:
- player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false);
- break;
- }
- }
- };
-
- GameObjectAI* GetAI(GameObject* go) const override
- {
- return new go_skull_pileAI(go);
- }
-};
-
-/*######
-## npc_slim
-######*/
-
-enum Slim
-{
- FACTION_CONSORTIUM = 933,
- NPC_TEXT_NEITHER_SLIM_NOR_SHADY = 9895,
- NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND = 9896
-};
-
-class npc_slim : public CreatureScript
-{
-public:
- npc_slim() : CreatureScript("npc_slim") { }
-
- struct npc_slimAI : public ScriptedAI
- {
- npc_slimAI(Creature* creature) : ScriptedAI(creature) { }
-
- bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
- {
- uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(me->GetGUID());
-
- return true;
- }
-
- bool GossipHello(Player* player) override
- {
- if (me->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY)
- {
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- SendGossipMenuFor(player, NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, me->GetGUID());
- }
- else
- SendGossipMenuFor(player, NPC_TEXT_NEITHER_SLIM_NOR_SHADY, me->GetGUID());
-
- return true;
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_slimAI(creature);
- }
-};
-
/*########
####npc_akuno
#####*/
@@ -707,12 +384,7 @@ public:
void AddSC_terokkar_forest()
{
new npc_unkor_the_ruthless();
- new npc_infested_root_walker();
- new npc_rotting_forest_rager();
- new npc_floon();
new npc_isla_starmane();
- new go_skull_pile();
new npc_skywing();
- new npc_slim();
new npc_akuno();
}
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
index f211f3248ae..8c395077c96 100644
--- a/src/server/scripts/Spells/spell_holiday.cpp
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -1489,117 +1489,175 @@ enum TorchSpells
SPELL_TORCH_TOSSING_PRACTICE = 46630,
SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE = 45719,
SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE = 46651,
+ SPELL_TARGET_INDICATOR_COSMETIC = 46901,
+ SPELL_TARGET_INDICATOR = 45723,
SPELL_BRAZIERS_HIT = 45724
};
// 45724 - Braziers Hit!
-class spell_midsummer_braziers_hit : public SpellScriptLoader
+class spell_midsummer_braziers_hit : public AuraScript
{
- public:
- spell_midsummer_braziers_hit() : SpellScriptLoader("spell_midsummer_braziers_hit") { }
+ PrepareAuraScript(spell_midsummer_braziers_hit);
- class spell_midsummer_braziers_hit_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
{
- PrepareAuraScript(spell_midsummer_braziers_hit_AuraScript);
+ SPELL_TORCH_TOSSING_TRAINING,
+ SPELL_TORCH_TOSSING_PRACTICE,
+ SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE,
+ SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE
+ });
+ }
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_TORCH_TOSSING_TRAINING, SPELL_TORCH_TOSSING_PRACTICE });
- }
+ void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Player* player = GetTarget()->ToPlayer();
+ if (!player)
+ return;
- void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Player* player = GetTarget()->ToPlayer();
- if (!player)
- return;
+ if ((player->HasAura(SPELL_TORCH_TOSSING_TRAINING) && GetStackAmount() == 8) || (player->HasAura(SPELL_TORCH_TOSSING_PRACTICE) && GetStackAmount() == 20))
+ {
+ if (player->GetTeam() == ALLIANCE)
+ player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE, true);
+ else if (player->GetTeam() == HORDE)
+ player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE, true);
+ Remove();
+ }
+ }
- if ((player->HasAura(SPELL_TORCH_TOSSING_TRAINING) && GetStackAmount() == 8) || (player->HasAura(SPELL_TORCH_TOSSING_PRACTICE) && GetStackAmount() == 20))
- {
- if (player->GetTeam() == ALLIANCE)
- player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE, true);
- else if (player->GetTeam() == HORDE)
- player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE, true);
- Remove();
- }
- }
+ void Register() override
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_midsummer_braziers_hit::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAPPLY);
+ }
+};
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_midsummer_braziers_hit_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAPPLY));
- }
- };
+// 45907 - Torch Target Picker
+class spell_midsummer_torch_target_picker : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_torch_target_picker);
- AuraScript* GetAuraScript() const override
- {
- return new spell_midsummer_braziers_hit_AuraScript();
- }
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_TARGET_INDICATOR_COSMETIC, SPELL_TARGET_INDICATOR });
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* target = GetHitUnit();
+ target->CastSpell(target, SPELL_TARGET_INDICATOR_COSMETIC, true);
+ target->CastSpell(target, SPELL_TARGET_INDICATOR, true);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_midsummer_torch_target_picker::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 46054 - Torch Toss (land)
+class spell_midsummer_torch_toss_land : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_torch_toss_land);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_BRAZIERS_HIT });
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ GetHitUnit()->CastSpell(GetCaster(), SPELL_BRAZIERS_HIT, true);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_midsummer_torch_toss_land::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
};
enum RibbonPoleData
{
- SPELL_HAS_FULL_MIDSUMMER_SET = 58933,
- SPELL_BURNING_HOT_POLE_DANCE = 58934,
- SPELL_RIBBON_DANCE_COSMETIC = 29726,
- SPELL_RIBBON_DANCE = 29175,
- GO_RIBBON_POLE = 181605,
+ SPELL_HAS_FULL_MIDSUMMER_SET = 58933,
+ SPELL_BURNING_HOT_POLE_DANCE = 58934,
+ SPELL_RIBBON_POLE_PERIODIC_VISUAL = 45406,
+ SPELL_RIBBON_DANCE = 29175,
+ SPELL_TEST_RIBBON_POLE_1 = 29705,
+ SPELL_TEST_RIBBON_POLE_2 = 29726,
+ SPELL_TEST_RIBBON_POLE_3 = 29727
};
-class spell_gen_ribbon_pole_dancer_check : public SpellScriptLoader
+// 29705, 29726, 29727 - Test Ribbon Pole Channel
+class spell_midsummer_test_ribbon_pole_channel : public AuraScript
{
- public:
- spell_gen_ribbon_pole_dancer_check() : SpellScriptLoader("spell_gen_ribbon_pole_dancer_check") { }
+ PrepareAuraScript(spell_midsummer_test_ribbon_pole_channel);
- class spell_gen_ribbon_pole_dancer_check_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
{
- PrepareAuraScript(spell_gen_ribbon_pole_dancer_check_AuraScript);
+ SPELL_RIBBON_POLE_PERIODIC_VISUAL,
+ SPELL_BURNING_HOT_POLE_DANCE,
+ SPELL_HAS_FULL_MIDSUMMER_SET,
+ SPELL_RIBBON_DANCE
+ });
+ }
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_HAS_FULL_MIDSUMMER_SET,
- SPELL_RIBBON_DANCE,
- SPELL_BURNING_HOT_POLE_DANCE
- });
- }
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->RemoveAurasDueToSpell(SPELL_RIBBON_POLE_PERIODIC_VISUAL);
+ }
- void PeriodicTick(AuraEffect const* /*aurEff*/)
- {
- Unit* target = GetTarget();
+ void PeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ Unit* target = GetTarget();
+ target->CastSpell(target, SPELL_RIBBON_POLE_PERIODIC_VISUAL, true);
- // check if aura needs to be removed
- if (!target->FindNearestGameObject(GO_RIBBON_POLE, 8.0f) || !target->HasUnitState(UNIT_STATE_CASTING))
- {
- target->InterruptNonMeleeSpells(false);
- target->RemoveAurasDueToSpell(GetId());
- target->RemoveAura(SPELL_RIBBON_DANCE_COSMETIC);
- return;
- }
+ if (Aura* aur = target->GetAura(SPELL_RIBBON_DANCE))
+ {
+ aur->SetMaxDuration(std::min(3600000, aur->GetMaxDuration() + 180000));
+ aur->RefreshDuration();
- // set xp buff duration
- if (Aura* aur = target->GetAura(SPELL_RIBBON_DANCE))
- {
- aur->SetMaxDuration(std::min(3600000, aur->GetMaxDuration() + 180000));
- aur->RefreshDuration();
+ if (aur->GetMaxDuration() == 3600000 && target->HasAura(SPELL_HAS_FULL_MIDSUMMER_SET))
+ target->CastSpell(target, SPELL_BURNING_HOT_POLE_DANCE, true);
+ }
+ else
+ target->CastSpell(target, SPELL_RIBBON_DANCE, true);
+ }
- // reward achievement criteria
- if (aur->GetMaxDuration() == 3600000 && target->HasAura(SPELL_HAS_FULL_MIDSUMMER_SET))
- target->CastSpell(target, SPELL_BURNING_HOT_POLE_DANCE, true);
- }
- else
- target->AddAura(SPELL_RIBBON_DANCE, target);
- }
+ void Register() override
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_midsummer_test_ribbon_pole_channel::HandleRemove, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_midsummer_test_ribbon_pole_channel::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
+};
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_ribbon_pole_dancer_check_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
- };
+// 45406 - Holiday - Midsummer, Ribbon Pole Periodic Visual
+class spell_midsummer_ribbon_pole_periodic_visual : public AuraScript
+{
+ PrepareAuraScript(spell_midsummer_ribbon_pole_periodic_visual);
- AuraScript* GetAuraScript() const override
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
{
- return new spell_gen_ribbon_pole_dancer_check_AuraScript();
- }
+ SPELL_TEST_RIBBON_POLE_1,
+ SPELL_TEST_RIBBON_POLE_2,
+ SPELL_TEST_RIBBON_POLE_3
+ });
+ }
+
+ void PeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ Unit* target = GetTarget();
+ if (!target->HasAura(SPELL_TEST_RIBBON_POLE_1) && !target->HasAura(SPELL_TEST_RIBBON_POLE_2) && !target->HasAura(SPELL_TEST_RIBBON_POLE_3))
+ Remove();
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_midsummer_ribbon_pole_periodic_visual::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
};
void AddSC_holiday_spell_scripts()
@@ -1650,6 +1708,9 @@ void AddSC_holiday_spell_scripts()
new spell_brewfest_dismount_ram();
new spell_brewfest_barker_bunny();
// Midsummer Fire Festival
- new spell_midsummer_braziers_hit();
- new spell_gen_ribbon_pole_dancer_check();
+ RegisterAuraScript(spell_midsummer_braziers_hit);
+ RegisterSpellScript(spell_midsummer_torch_target_picker);
+ RegisterSpellScript(spell_midsummer_torch_toss_land);
+ RegisterAuraScript(spell_midsummer_test_ribbon_pole_channel);
+ RegisterAuraScript(spell_midsummer_ribbon_pole_periodic_visual);
}
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index 7cc32340665..874fb45638c 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -317,7 +317,7 @@ class spell_q11396_11399_scourging_crystal_controller : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* target = GetExplTargetUnit())
+ if (Unit* target = GetHitUnit())
if (target->GetTypeId() == TYPEID_UNIT && target->HasAura(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3))
// Make sure nobody else is channeling the same target
if (!target->HasAura(SPELL_SCOURGING_CRYSTAL_CONTROLLER))
diff --git a/src/server/scripts/World/duel_reset.cpp b/src/server/scripts/World/duel_reset.cpp
index 32c391a5ef6..eb57ee50d81 100644
--- a/src/server/scripts/World/duel_reset.cpp
+++ b/src/server/scripts/World/duel_reset.cpp
@@ -137,4 +137,3 @@ void AddSC_duel_reset()
{
new DuelResetScript();
}
-
diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index 6bc225bdb27..91b7bf30ad7 100644
--- a/src/server/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
@@ -37,7 +37,6 @@ go_soulwell
go_bashir_crystalforge
go_soulwell
go_dragonflayer_cage
-go_tadpole_cage
go_amberpine_outhouse
go_hive_pod
go_veil_skith_cage
@@ -1232,49 +1231,6 @@ public:
};
/*######
-## Quest 11560: Oh Noes, the Tadpoles!
-## go_tadpole_cage
-######*/
-
-enum Tadpoles
-{
- QUEST_OH_NOES_THE_TADPOLES = 11560,
- NPC_WINTERFIN_TADPOLE = 25201
-};
-
-class go_tadpole_cage : public GameObjectScript
-{
-public:
- go_tadpole_cage() : GameObjectScript("go_tadpole_cage") { }
-
- struct go_tadpole_cageAI : public GameObjectAI
- {
- go_tadpole_cageAI(GameObject* go) : GameObjectAI(go) { }
-
- bool GossipHello(Player* player) override
- {
- me->UseDoorOrButton();
- if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE)
- {
- Creature* pTadpole = me->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f);
- if (pTadpole)
- {
- pTadpole->DisappearAndDie();
- player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE);
- //FIX: Summon minion tadpole
- }
- }
- return true;
- }
- };
-
- GameObjectAI* GetAI(GameObject* go) const override
- {
- return new go_tadpole_cageAI(go);
- }
-};
-
-/*######
## go_amberpine_outhouse
######*/
@@ -1528,10 +1484,18 @@ public:
enum MidsummerPoleRibbon
{
- SPELL_POLE_DANCE = 29726,
- SPELL_BLUE_FIRE_RING = 46842,
- NPC_POLE_RIBBON_BUNNY = 17066,
- ACTION_COSMETIC_FIRES = 0
+ SPELL_TEST_RIBBON_POLE_1 = 29705,
+ SPELL_TEST_RIBBON_POLE_2 = 29726,
+ SPELL_TEST_RIBBON_POLE_3 = 29727,
+ NPC_POLE_RIBBON_BUNNY = 17066,
+ ACTION_COSMETIC_FIRES = 0
+};
+
+uint32 const RibbonPoleSpells[3] =
+{
+ SPELL_TEST_RIBBON_POLE_1,
+ SPELL_TEST_RIBBON_POLE_2,
+ SPELL_TEST_RIBBON_POLE_3
};
class go_midsummer_ribbon_pole : public GameObjectScript
@@ -1548,7 +1512,7 @@ public:
if (Creature* creature = me->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f))
{
creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES);
- player->CastSpell(creature, SPELL_POLE_DANCE, true);
+ player->CastSpell(player, RibbonPoleSpells[urand(0, 2)], true);
}
return true;
}
@@ -2101,7 +2065,6 @@ void AddSC_go_scripts()
new go_table_theka();
new go_inconspicuous_landmark();
new go_soulwell();
- new go_tadpole_cage();
new go_dragonflayer_cage();
new go_amberpine_outhouse();
new go_hive_pod();
diff --git a/src/server/scripts/World/guards.cpp b/src/server/scripts/World/guards.cpp
deleted file mode 100644
index 638e53c45c5..00000000000
--- a/src/server/scripts/World/guards.cpp
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-SDName: Guards
-SD%Complete: 100
-SDComment:
-SDCategory: Guards
-EndScriptData */
-
-/* ContentData
-guard_generic
-guard_shattrath_aldor
-guard_shattrath_scryer
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "GuardAI.h"
-#include "MotionMaster.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "SpellInfo.h"
-
-enum GuardGeneric
-{
- GENERIC_CREATURE_COOLDOWN = 5000,
-
- SAY_GUARD_SIL_AGGRO = 0,
-
- NPC_CENARION_HOLD_INFANTRY = 15184,
- NPC_STORMWIND_CITY_GUARD = 68,
- NPC_STORMWIND_CITY_PATROLLER = 1976,
- NPC_ORGRIMMAR_GRUNT = 3296
-};
-
-class guard_generic : public CreatureScript
-{
-public:
- guard_generic() : CreatureScript("guard_generic") { }
-
- struct guard_genericAI : public GuardAI
- {
- guard_genericAI(Creature* creature) : GuardAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- globalCooldown = 0;
- buffTimer = 0;
- }
-
- void Reset() override
- {
- Initialize();
- }
-
- void EnterCombat(Unit* who) override
- {
- if (me->GetEntry() == NPC_CENARION_HOLD_INFANTRY)
- Talk(SAY_GUARD_SIL_AGGRO, who);
- if (SpellInfo const* spell = me->reachWithSpellAttack(who))
- DoCast(who, spell->Id);
- }
-
- void UpdateAI(uint32 diff) override
- {
- //Always decrease our global cooldown first
- if (globalCooldown > diff)
- globalCooldown -= diff;
- else
- globalCooldown = 0;
-
- //Buff timer (only buff when we are alive and not in combat
- if (me->IsAlive() && !me->IsInCombat())
- {
- if (buffTimer <= diff)
- {
- //Find a spell that targets friendly and applies an aura (these are generally buffs)
- SpellInfo const* info = SelectSpell(me, 0, 0, SELECT_TARGET_ANY_FRIEND, 0, 0, 0, 0, SELECT_EFFECT_AURA);
-
- if (info && !globalCooldown)
- {
- //Cast the buff spell
- DoCast(me, info->Id);
-
- //Set our global cooldown
- globalCooldown = GENERIC_CREATURE_COOLDOWN;
-
- //Set our timer to 10 minutes before rebuff
- buffTimer = 600000;
- } //Try again in 30 seconds
- else buffTimer = 30000;
- } else buffTimer -= diff;
- }
-
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- // Make sure our attack is ready and we arn't currently casting
- if (me->isAttackReady() && !me->IsNonMeleeSpellCast(false))
- {
- //If we are within range melee the target
- if (me->IsWithinMeleeRange(me->GetVictim()))
- {
- bool healing = false;
- SpellInfo const* info = nullptr;
-
- //Select a healing spell if less than 30% hp
- if (me->HealthBelowPct(30))
- info = SelectSpell(me, 0, 0, SELECT_TARGET_ANY_FRIEND, 0, 0, 0, 0, SELECT_EFFECT_HEALING);
-
- //No healing spell available, select a hostile spell
- if (info)
- healing = true;
- else
- info = SelectSpell(me->GetVictim(), 0, 0, SELECT_TARGET_ANY_ENEMY, 0, 0, 0, 0, SELECT_EFFECT_DONTCARE);
-
- //20% chance to replace our white hit with a spell
- if (info && urand(0, 99) < 20 && !globalCooldown)
- {
- //Cast the spell
- if (healing)
- DoCast(me, info->Id);
- else
- DoCastVictim(info->Id);
-
- //Set our global cooldown
- globalCooldown = GENERIC_CREATURE_COOLDOWN;
- }
- else
- me->AttackerStateUpdate(me->GetVictim());
-
- me->resetAttackTimer();
- }
- }
- else
- {
- //Only run this code if we arn't already casting
- if (!me->IsNonMeleeSpellCast(false))
- {
- bool healing = false;
- SpellInfo const* info = nullptr;
-
- //Select a healing spell if less than 30% hp ONLY 33% of the time
- if (me->HealthBelowPct(30) && 33 > urand(0, 99))
- info = SelectSpell(me, 0, 0, SELECT_TARGET_ANY_FRIEND, 0, 0, 0, 0, SELECT_EFFECT_HEALING);
-
- //No healing spell available, See if we can cast a ranged spell (Range must be greater than ATTACK_DISTANCE)
- if (info)
- healing = true;
- else
- info = SelectSpell(me->GetVictim(), 0, 0, SELECT_TARGET_ANY_ENEMY, 0, 0, NOMINAL_MELEE_RANGE, 0, SELECT_EFFECT_DONTCARE);
-
- //Found a spell, check if we arn't on cooldown
- if (info && !globalCooldown)
- {
- //If we are currently moving stop us and set the movement generator
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != IDLE_MOTION_TYPE)
- {
- me->GetMotionMaster()->Clear(false);
- me->GetMotionMaster()->MoveIdle();
- }
-
- //Cast spell
- if (healing)
- DoCast(me, info->Id);
- else
- DoCastVictim(info->Id);
-
- //Set our global cooldown
- globalCooldown = GENERIC_CREATURE_COOLDOWN;
- } //If no spells available and we arn't moving run to target
- else if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
- {
- //Cancel our current spell and then mutate new movement generator
- me->InterruptNonMeleeSpells(false);
- me->GetMotionMaster()->Clear(false);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- }
- }
- }
-
- DoMeleeAttackIfReady();
- }
-
- void DoReplyToTextEmote(uint32 emote)
- {
- switch (emote)
- {
- case TEXT_EMOTE_KISS:
- me->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
- break;
-
- case TEXT_EMOTE_WAVE:
- me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE);
- break;
-
- case TEXT_EMOTE_SALUTE:
- me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE);
- break;
-
- case TEXT_EMOTE_SHY:
- me->HandleEmoteCommand(EMOTE_ONESHOT_FLEX);
- break;
-
- case TEXT_EMOTE_RUDE:
- case TEXT_EMOTE_CHICKEN:
- me->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
- break;
- }
- }
-
- void ReceiveEmote(Player* player, uint32 textEmote) override
- {
- switch (me->GetEntry())
- {
- case NPC_STORMWIND_CITY_GUARD:
- case NPC_STORMWIND_CITY_PATROLLER:
- case NPC_ORGRIMMAR_GRUNT:
- break;
- default:
- return;
- }
-
- if (!me->IsFriendlyTo(player))
- return;
-
- DoReplyToTextEmote(textEmote);
- }
-
- private:
- uint32 globalCooldown;
- uint32 buffTimer;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new guard_genericAI(creature);
- }
-};
-
-enum GuardShattrath
-{
- SPELL_BANISHED_SHATTRATH_A = 36642,
- SPELL_BANISHED_SHATTRATH_S = 36671,
- SPELL_BANISH_TELEPORT = 36643,
- SPELL_EXILE = 39533
-};
-
-class guard_shattrath_scryer : public CreatureScript
-{
-public:
- guard_shattrath_scryer() : CreatureScript("guard_shattrath_scryer") { }
-
- struct guard_shattrath_scryerAI : public GuardAI
- {
- guard_shattrath_scryerAI(Creature* creature) : GuardAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- banishTimer = 5000;
- exileTimer = 8500;
- playerGUID.Clear();
- canTeleport = false;
- }
-
- void Reset() override
- {
- Initialize();
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- if (canTeleport)
- {
- if (exileTimer <= diff)
- {
- if (Unit* temp = ObjectAccessor::GetUnit(*me, playerGUID))
- {
- temp->CastSpell(temp, SPELL_EXILE, true);
- temp->CastSpell(temp, SPELL_BANISH_TELEPORT, true);
- }
- playerGUID.Clear();
- exileTimer = 8500;
- canTeleport = false;
- } else exileTimer -= diff;
- }
- else if (banishTimer <= diff)
- {
- Unit* temp = me->GetVictim();
- if (temp && temp->GetTypeId() == TYPEID_PLAYER)
- {
- DoCast(temp, SPELL_BANISHED_SHATTRATH_A);
- banishTimer = 9000;
- playerGUID = temp->GetGUID();
- if (playerGUID)
- canTeleport = true;
- }
- } else banishTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- private:
- uint32 exileTimer;
- uint32 banishTimer;
- ObjectGuid playerGUID;
- bool canTeleport;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new guard_shattrath_scryerAI(creature);
- }
-};
-
-class guard_shattrath_aldor : public CreatureScript
-{
-public:
- guard_shattrath_aldor() : CreatureScript("guard_shattrath_aldor") { }
-
- struct guard_shattrath_aldorAI : public GuardAI
- {
- guard_shattrath_aldorAI(Creature* creature) : GuardAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- banishTimer = 5000;
- exileTimer = 8500;
- playerGUID.Clear();
- canTeleport = false;
- }
-
- void Reset() override
- {
- Initialize();
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- if (canTeleport)
- {
- if (exileTimer <= diff)
- {
- if (Unit* temp = ObjectAccessor::GetUnit(*me, playerGUID))
- {
- temp->CastSpell(temp, SPELL_EXILE, true);
- temp->CastSpell(temp, SPELL_BANISH_TELEPORT, true);
- }
- playerGUID.Clear();
- exileTimer = 8500;
- canTeleport = false;
- } else exileTimer -= diff;
- }
- else if (banishTimer <= diff)
- {
- Unit* temp = me->GetVictim();
- if (temp && temp->GetTypeId() == TYPEID_PLAYER)
- {
- DoCast(temp, SPELL_BANISHED_SHATTRATH_S);
- banishTimer = 9000;
- playerGUID = temp->GetGUID();
- if (playerGUID)
- canTeleport = true;
- }
- } else banishTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
- private:
- uint32 exileTimer;
- uint32 banishTimer;
- ObjectGuid playerGUID;
- bool canTeleport;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new guard_shattrath_aldorAI(creature);
- }
-};
-
-void AddSC_guards()
-{
- new guard_generic();
- new guard_shattrath_aldor();
- new guard_shattrath_scryer();
-}
diff --git a/src/server/scripts/World/npc_guard.cpp b/src/server/scripts/World/npc_guard.cpp
new file mode 100644
index 00000000000..53bfddf56b6
--- /dev/null
+++ b/src/server/scripts/World/npc_guard.cpp
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "GuardAI.h"
+#include "ObjectAccessor.h"
+#include "Player.h"
+#include "Random.h"
+#include "ScriptMgr.h"
+#include "SpellInfo.h"
+
+enum GuardMisc
+{
+ SAY_GUARD_SIL_AGGRO = 0,
+
+ NPC_CENARION_HOLD_INFANTRY = 15184,
+ NPC_STORMWIND_CITY_GUARD = 68,
+ NPC_STORMWIND_CITY_PATROLLER = 1976,
+ NPC_ORGRIMMAR_GRUNT = 3296,
+ NPC_ALDOR_VINDICATOR = 18549,
+
+ SPELL_BANISHED_SHATTRATH_A = 36642,
+ SPELL_BANISHED_SHATTRATH_S = 36671,
+ SPELL_BANISH_TELEPORT = 36643,
+ SPELL_EXILE = 39533,
+};
+
+struct npc_guard_generic : public GuardAI
+{
+ npc_guard_generic(Creature* creature) : GuardAI(creature)
+ {
+ _scheduler.SetValidator([this]
+ {
+ return !me->HasUnitState(UNIT_STATE_CASTING) && !me->IsInEvadeMode() && me->IsAlive();
+ });
+ _combatScheduler.SetValidator([this]
+ {
+ return !me->HasUnitState(UNIT_STATE_CASTING);
+ });
+ }
+
+ void Reset() override
+ {
+ _scheduler.CancelAll();
+ _combatScheduler.CancelAll();
+ _scheduler.Schedule(Seconds(1), [this](TaskContext context)
+ {
+ // Find a spell that targets friendly and applies an aura (these are generally buffs)
+ if (SpellInfo const* spellInfo = SelectSpell(me, 0, 0, SELECT_TARGET_ANY_FRIEND, 0, 0, 0, 0, SELECT_EFFECT_AURA))
+ DoCast(me, spellInfo->Id);
+
+ context.Repeat(Minutes(10));
+ });
+ }
+
+ void DoReplyToTextEmote(uint32 emote)
+ {
+ switch (emote)
+ {
+ case TEXT_EMOTE_KISS:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
+ break;
+ case TEXT_EMOTE_WAVE:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE);
+ break;
+ case TEXT_EMOTE_SALUTE:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE);
+ break;
+ case TEXT_EMOTE_SHY:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_FLEX);
+ break;
+ case TEXT_EMOTE_RUDE:
+ case TEXT_EMOTE_CHICKEN:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void ReceiveEmote(Player* player, uint32 textEmote) override
+ {
+ switch (me->GetEntry())
+ {
+ case NPC_STORMWIND_CITY_GUARD:
+ case NPC_STORMWIND_CITY_PATROLLER:
+ case NPC_ORGRIMMAR_GRUNT:
+ break;
+ default:
+ return;
+ }
+
+ if (!me->IsFriendlyTo(player))
+ return;
+
+ DoReplyToTextEmote(textEmote);
+ }
+
+ void EnterCombat(Unit* who) override
+ {
+ if (me->GetEntry() == NPC_CENARION_HOLD_INFANTRY)
+ Talk(SAY_GUARD_SIL_AGGRO, who);
+
+ _combatScheduler.Schedule(Seconds(1), [this](TaskContext meleeContext)
+ {
+ Unit* victim = me->GetVictim();
+ if (!me->isAttackReady() || !me->IsWithinMeleeRange(victim))
+ {
+ meleeContext.Repeat();
+ return;
+ }
+ if (roll_chance_i(20))
+ {
+ if (SpellInfo const* spellInfo = SelectSpell(me->GetVictim(), 0, 0, SELECT_TARGET_ANY_ENEMY, 0, 0, 0, NOMINAL_MELEE_RANGE, SELECT_EFFECT_DONTCARE))
+ {
+ me->resetAttackTimer();
+ DoCastVictim(spellInfo->Id);
+ meleeContext.Repeat();
+ return;
+ }
+ }
+ if (ShouldSparWith(victim))
+ me->FakeAttackerStateUpdate(victim);
+ else
+ me->AttackerStateUpdate(victim);
+ me->resetAttackTimer();
+ meleeContext.Repeat();
+ }).Schedule(Seconds(5), [this](TaskContext spellContext)
+ {
+ bool healing = false;
+ SpellInfo const* spellInfo = nullptr;
+
+ // Select a healing spell if less than 30% hp and ONLY 33% of the time
+ if (me->HealthBelowPct(30) && roll_chance_i(33))
+ spellInfo = SelectSpell(me, 0, 0, SELECT_TARGET_ANY_FRIEND, 0, 0, 0, 0, SELECT_EFFECT_HEALING);
+
+ // No healing spell available, check if we can cast a ranged spell
+ if (spellInfo)
+ healing = true;
+ else
+ spellInfo = SelectSpell(me->GetVictim(), 0, 0, SELECT_TARGET_ANY_ENEMY, 0, 0, NOMINAL_MELEE_RANGE, 0, SELECT_EFFECT_DONTCARE);
+
+ // Found a spell
+ if (spellInfo)
+ {
+ if (healing)
+ DoCast(me, spellInfo->Id);
+ else
+ DoCastVictim(spellInfo->Id);
+ spellContext.Repeat(Seconds(5));
+ }
+ else
+ spellContext.Repeat(Seconds(1));
+ });
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+
+ if (!UpdateVictim())
+ return;
+
+ _combatScheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
+ TaskScheduler _combatScheduler;
+};
+
+struct npc_guard_shattrath_faction : public GuardAI
+{
+ npc_guard_shattrath_faction(Creature* creature) : GuardAI(creature)
+ {
+ _scheduler.SetValidator([this]
+ {
+ return !me->HasUnitState(UNIT_STATE_CASTING);
+ });
+ }
+
+ void Reset() override
+ {
+ _scheduler.CancelAll();
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ ScheduleVanish();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ _scheduler.Update(diff, std::bind(&GuardAI::DoMeleeAttackIfReady, this));
+ }
+
+ void ScheduleVanish()
+ {
+ _scheduler.Schedule(Seconds(5), [this](TaskContext banishContext)
+ {
+ Unit* temp = me->GetVictim();
+ if (temp && temp->GetTypeId() == TYPEID_PLAYER)
+ {
+ DoCast(temp, me->GetEntry() == NPC_ALDOR_VINDICATOR ? SPELL_BANISHED_SHATTRATH_S : SPELL_BANISHED_SHATTRATH_A);
+ ObjectGuid playerGUID = temp->GetGUID();
+ banishContext.Schedule(Seconds(9), [this, playerGUID](TaskContext /*exileContext*/)
+ {
+ if (Unit* temp = ObjectAccessor::GetUnit(*me, playerGUID))
+ {
+ temp->CastSpell(temp, SPELL_EXILE, true);
+ temp->CastSpell(temp, SPELL_BANISH_TELEPORT, true);
+ }
+ ScheduleVanish();
+ });
+ }
+ else
+ banishContext.Repeat();
+ });
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
+void AddSC_npc_guard()
+{
+ RegisterCreatureAI(npc_guard_generic);
+ RegisterCreatureAI(npc_guard_shattrath_faction);
+}
diff --git a/src/server/scripts/World/npc_innkeeper.cpp b/src/server/scripts/World/npc_innkeeper.cpp
index 7db733c7f78..ad579f2aa8d 100644
--- a/src/server/scripts/World/npc_innkeeper.cpp
+++ b/src/server/scripts/World/npc_innkeeper.cpp
@@ -42,7 +42,14 @@ enum Spells
#define LOCALE_TRICK_OR_TREAT_6 "¡Truco o trato!"
#define LOCALE_INNKEEPER_0 "Make this inn my home."
+#define LOCALE_INNKEEPER_2 "Faites de cette auberge votre foyer."
#define LOCALE_INNKEEPER_3 "Ich möchte dieses Gasthaus zu meinem Heimatort machen."
+#define LOCALE_INNKEEPER_6 "Fija tu hogar en esta taberna."
+
+#define LOCALE_VENDOR_0 "I want to browse your goods."
+#define LOCALE_VENDOR_2 "Je voudrais regarder vos articles."
+#define LOCALE_VENDOR_3 "Ich sehe mich nur mal um."
+#define LOCALE_VENDOR_6 "Quiero ver tus mercancías."
class npc_innkeeper : public CreatureScript
{
@@ -72,14 +79,26 @@ public:
player->PrepareQuestMenu(me->GetGUID());
if (me->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ {
+ char const* localizedEntry;
+ switch (player->GetSession()->GetSessionDbcLocale())
+ {
+ case LOCALE_frFR: localizedEntry = LOCALE_VENDOR_2; break;
+ case LOCALE_deDE: localizedEntry = LOCALE_VENDOR_3; break;
+ case LOCALE_esES: localizedEntry = LOCALE_VENDOR_6; break;
+ case LOCALE_enUS: default: localizedEntry = LOCALE_VENDOR_0;
+ }
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ }
if (me->IsInnkeeper())
{
char const* localizedEntry;
switch (player->GetSession()->GetSessionDbcLocale())
{
+ case LOCALE_frFR: localizedEntry = LOCALE_INNKEEPER_2; break;
case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break;
+ case LOCALE_esES: localizedEntry = LOCALE_INNKEEPER_6; break;
case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0;
}
AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN);
@@ -147,4 +166,3 @@ void AddSC_npc_innkeeper()
{
new npc_innkeeper();
}
-
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index 4ca666a55bb..f7b6173ea22 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -457,8 +457,7 @@ public:
enum TorchTossingTarget
{
- NPC_TORCH_TOSSING_TARGET_BUNNY = 25535,
- SPELL_TARGET_INDICATOR = 45723
+ SPELL_TORCH_TARGET_PICKER = 45907
};
class npc_torch_tossing_target_bunny_controller : public CreatureScript
@@ -468,42 +467,28 @@ public:
struct npc_torch_tossing_target_bunny_controllerAI : public ScriptedAI
{
- npc_torch_tossing_target_bunny_controllerAI(Creature* creature) : ScriptedAI(creature)
- {
- _targetTimer = 3000;
- }
+ npc_torch_tossing_target_bunny_controllerAI(Creature* creature) : ScriptedAI(creature) { }
- ObjectGuid DoSearchForTargets(ObjectGuid lastTargetGUID)
+ void Reset() override
{
- std::list<Creature*> targets;
- me->GetCreatureListWithEntryInGrid(targets, NPC_TORCH_TOSSING_TARGET_BUNNY, 60.0f);
- targets.remove_if([lastTargetGUID](Creature* creature) { return creature->GetGUID() == lastTargetGUID; });
-
- if (!targets.empty())
+ _scheduler.Schedule(Seconds(2), [this](TaskContext context)
{
- _lastTargetGUID = Trinity::Containers::SelectRandomContainerElement(targets)->GetGUID();
-
- return _lastTargetGUID;
- }
- return ObjectGuid::Empty;
+ me->CastCustomSpell(SPELL_TORCH_TARGET_PICKER, SPELLVALUE_MAX_TARGETS, 1);
+ _scheduler.Schedule(Seconds(3), [this](TaskContext /*context*/)
+ {
+ me->CastCustomSpell(SPELL_TORCH_TARGET_PICKER, SPELLVALUE_MAX_TARGETS, 1);
+ });
+ context.Repeat(Seconds(5));
+ });
}
void UpdateAI(uint32 diff) override
{
- if (_targetTimer < diff)
- {
- if (Unit* target = ObjectAccessor::GetUnit(*me, DoSearchForTargets(_lastTargetGUID)))
- target->CastSpell(target, SPELL_TARGET_INDICATOR, true);
-
- _targetTimer = 3000;
- }
- else
- _targetTimer -= diff;
+ _scheduler.Update(diff);
}
private:
- uint32 _targetTimer;
- ObjectGuid _lastTargetGUID;
+ TaskScheduler _scheduler;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -2893,7 +2878,7 @@ class CastFoodSpell : public BasicEvent
bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
{
_owner->CastSpell(_owner, _spellId, true);
- return false;
+ return true;
}
private:
diff --git a/src/server/scripts/World/world_script_loader.cpp b/src/server/scripts/World/world_script_loader.cpp
index 086bd8700f2..43ff1b7c9de 100644
--- a/src/server/scripts/World/world_script_loader.cpp
+++ b/src/server/scripts/World/world_script_loader.cpp
@@ -23,7 +23,7 @@ void AddSC_areatrigger_scripts();
void AddSC_emerald_dragons();
void AddSC_generic_creature();
void AddSC_go_scripts();
-void AddSC_guards();
+void AddSC_npc_guard();
void AddSC_item_scripts();
void AddSC_npc_professions();
void AddSC_npc_innkeeper();
@@ -43,7 +43,7 @@ void AddWorldScripts()
AddSC_emerald_dragons();
AddSC_generic_creature();
AddSC_go_scripts();
- AddSC_guards();
+ AddSC_npc_guard();
AddSC_item_scripts();
AddSC_npc_professions();
AddSC_npc_innkeeper();
diff --git a/src/server/shared/Dynamic/FactoryHolder.h b/src/server/shared/Dynamic/FactoryHolder.h
index 9e67fe11467..09fa2816faf 100644
--- a/src/server/shared/Dynamic/FactoryHolder.h
+++ b/src/server/shared/Dynamic/FactoryHolder.h
@@ -54,4 +54,3 @@ class Permissible
virtual int32 Permit(T const*) const = 0;
};
#endif
-
diff --git a/src/server/shared/Dynamic/LinkedReference/RefManager.h b/src/server/shared/Dynamic/LinkedReference/RefManager.h
index ad6bf1d79ad..0dbf1ebf2a6 100644
--- a/src/server/shared/Dynamic/LinkedReference/RefManager.h
+++ b/src/server/shared/Dynamic/LinkedReference/RefManager.h
@@ -51,4 +51,3 @@ class RefManager : public LinkedListHead
//=====================================================
#endif
-
diff --git a/src/server/shared/Dynamic/TypeList.h b/src/server/shared/Dynamic/TypeList.h
index a8dcea05bcc..5afdcef5751 100644
--- a/src/server/shared/Dynamic/TypeList.h
+++ b/src/server/shared/Dynamic/TypeList.h
@@ -42,4 +42,3 @@ struct TypeList
#define TYPELIST_5(T1, T2, T3, T4, T5) TypeList<T1, TYPELIST_4(T2, T3, T4, T5) >
#define TYPELIST_6(T1, T2, T3, T4, T5, T6) TypeList<T1, TYPELIST_5(T2, T3, T4, T5, T6) >
#endif
-
diff --git a/src/server/shared/Memory.h b/src/server/shared/Memory.h
index e41e4baf025..b251efa34b6 100644
--- a/src/server/shared/Memory.h
+++ b/src/server/shared/Memory.h
@@ -31,4 +31,4 @@ inline void dtCustomFree(void* ptr)
delete [] (unsigned char*)ptr;
}
-#endif \ No newline at end of file
+#endif
diff --git a/src/tools/map_extractor/dbcfile.cpp b/src/tools/map_extractor/dbcfile.cpp
index 25ded3e6c60..68cf7047fa9 100644
--- a/src/tools/map_extractor/dbcfile.cpp
+++ b/src/tools/map_extractor/dbcfile.cpp
@@ -98,4 +98,3 @@ DBCFile::Iterator DBCFile::end()
assert(data);
return Iterator(*this, stringTable);
}
-
diff --git a/src/tools/map_extractor/dbcfile.h b/src/tools/map_extractor/dbcfile.h
index 5130469b5f3..5b3aaeeb1d4 100644
--- a/src/tools/map_extractor/dbcfile.h
+++ b/src/tools/map_extractor/dbcfile.h
@@ -138,4 +138,3 @@ private:
};
#endif
-
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
index df9c1607bd3..bfaa4211569 100644
--- a/src/tools/mmaps_generator/MapBuilder.cpp
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -26,7 +26,7 @@
#include <limits.h>
#define MMAP_MAGIC 0x4d4d4150 // 'MMAP'
-#define MMAP_VERSION 6
+#define MMAP_VERSION 7
struct MmapTileHeader
{
@@ -598,8 +598,8 @@ namespace MMAP
config.minRegionArea = rcSqr(60);
config.mergeRegionArea = rcSqr(50);
config.maxSimplificationError = 1.8f; // eliminates most jagged edges (tiny polygons)
- config.detailSampleDist = config.cs * 64;
- config.detailSampleMaxError = config.ch * 2;
+ config.detailSampleDist = config.cs * 16;
+ config.detailSampleMaxError = config.ch * 1;
// this sets the dimensions of the heightfield - should maybe happen before border padding
rcCalcGridSize(config.bmin, config.bmax, config.cs, &config.width, &config.height);
diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h
index 4dcca5f15fe..06347f0471a 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.h
+++ b/src/tools/mmaps_generator/TerrainBuilder.h
@@ -124,4 +124,3 @@ namespace MMAP
}
#endif
-
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
index aeac69b6751..e6340bde553 100644
--- a/src/tools/vmap4_extractor/vmapexport.cpp
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -25,7 +25,7 @@
#include "Banner.h"
#include <sys/stat.h>
-#ifdef WIN32
+#ifdef _WIN32
#include <direct.h>
#define mkdir _mkdir
#endif
@@ -65,7 +65,7 @@ bool preciseVectorData = false;
//static const char * szWorkDirMaps = ".\\Maps";
char const* szWorkDirWmo = "./Buildings";
-char const* szRawVMAPMagic = "VMAP043";
+char const* szRawVMAPMagic = "VMAP044";
// Local testing functions
diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp
index 441fe281c04..d98e1f9112d 100644
--- a/src/tools/vmap4_extractor/wmo.cpp
+++ b/src/tools/vmap4_extractor/wmo.cpp
@@ -349,10 +349,8 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise
{
// Skip no collision triangles
bool isRenderFace = (MOPY[2 * i] & WMO_MATERIAL_RENDER) && !(MOPY[2 * i] & WMO_MATERIAL_DETAIL);
- bool isDetail = (MOPY[2 * i] & WMO_MATERIAL_DETAIL) != 0;
- bool isCollision = (MOPY[2 * i] & WMO_MATERIAL_COLLISION) != 0;
-
- if (!isRenderFace && !isDetail && !isCollision)
+ bool isCollision = MOPY[2 * i] & WMO_MATERIAL_COLLISION || isRenderFace;
+ if (!isCollision)
continue;
// Use this triangle