TrinityCore
ScriptMgr.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "ScriptMgr.h"
19#include "AchievementMgr.h"
20#include "AreaTrigger.h"
21#include "AreaTriggerAI.h"
22#include "ChatCommand.h"
23#include "Conversation.h"
24#include "ConversationAI.h"
25#include "Creature.h"
26#include "CreatureAI.h"
27#include "CreatureAIImpl.h"
28#include "CreatureAISelector.h"
29#include "DB2Stores.h"
30#include "Errors.h"
31#include "GameObject.h"
32#include "GossipDef.h"
33#include "InstanceScript.h"
34#include "Item.h"
35#include "LFGScripts.h"
36#include "Log.h"
37#include "Map.h"
38#include "MapManager.h"
39#include "ObjectMgr.h"
40#include "OutdoorPvPMgr.h"
41#include "Player.h"
42#include "ScriptReloadMgr.h"
43#include "ScriptSystem.h"
44#include "SmartAI.h"
45#include "SpellInfo.h"
46#include "SpellMgr.h"
47#include "SpellScript.h"
48#include "Timer.h"
49#include "Transport.h"
50#include "Vehicle.h"
51#include "Weather.h"
52#include "WorldPacket.h"
53#include <unordered_map>
54
55// Trait which indicates whether this script type
56// must be assigned in the database.
57template<typename>
59 : std::false_type { };
60
61template<>
63 : std::true_type { };
64
65template<>
67 : std::true_type { };
68
69template<>
71 : std::true_type { };
72
73template<>
75 : std::true_type { };
76
77template<>
79 : std::true_type { };
80
81template<>
83 : std::true_type { };
84
85template<>
87 : std::true_type { };
88
89template<>
91 : std::true_type { };
92
93template<>
95 : std::true_type { };
96
97template<>
99 : std::true_type { };
100
101template<>
103 : std::true_type { };
104
105template<>
107 : std::true_type { };
108
109template<>
111 : std::true_type { };
112
113template<>
115 : std::true_type { };
116
117template<>
119 : std::true_type { };
120
121template<>
123 : std::true_type { };
124
125template<>
127 : std::true_type { };
128
129template<>
131 : std::true_type { };
132
133template<>
135 : std::true_type { };
136
137template<>
139 : std::true_type { };
140
141template<>
143 : std::true_type { };
144
146{
147 SPELL_HOTSWAP_VISUAL_SPELL_EFFECT = 40162 // 59084
149
151{
152public:
155
158
161
164 virtual void ReleaseContext(std::string const& context) = 0;
165
167 virtual void SwapContext(bool initialize) = 0;
168
171 virtual void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) = 0;
172
174 virtual void Unload() = 0;
175
177 virtual void SyncScriptNames() = 0;
178};
179
180template<class>
181class ScriptRegistry;
182
185{
187
188 template<class>
189 friend class ScriptRegistry;
190
193 {
194 public:
197
200 };
201
202 template<typename T>
204 : public DeleteableObjectBase
205 {
206 public:
208 : _object(std::forward<T>(object)) { }
209
210 private:
212 };
213
214public:
215 void SetScriptNameInContext(std::string const& scriptname, std::string const& context)
216 {
218 "Scriptname was assigned to this context already!");
219 _scriptnames_to_context.insert(std::make_pair(scriptname, context));
220 }
221
222 std::string const& GetScriptContextOfScriptName(std::string const& scriptname) const
223 {
224 auto itr = _scriptnames_to_context.find(scriptname);
225 ASSERT(itr != _scriptnames_to_context.end() &&
226 "Given scriptname doesn't exist!");
227 return itr->second;
228 }
229
230 void ReleaseContext(std::string const& context) final override
231 {
232 for (auto const registry : _registries)
233 registry->ReleaseContext(context);
234
235 // Clear the script names in context after calling the release hooks
236 // since it's possible that new references to a shared library
237 // are acquired when releasing.
238 for (auto itr = _scriptnames_to_context.begin();
239 itr != _scriptnames_to_context.end();)
240 if (itr->second == context)
241 itr = _scriptnames_to_context.erase(itr);
242 else
243 ++itr;
244 }
245
246 void SwapContext(bool initialize) final override
247 {
248 for (auto const registry : _registries)
249 registry->SwapContext(initialize);
250
252 }
253
254 void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) final override
255 {
256 for (auto const registry : _registries)
257 registry->RemoveUsedScriptsFromContainer(scripts);
258 }
259
260 void Unload() final override
261 {
262 for (auto const registry : _registries)
263 registry->Unload();
264 }
265
266 void SyncScriptNames() final override
267 {
268 for (auto const registry : _registries)
269 registry->SyncScriptNames();
270 }
271
272 template<typename T>
274 {
275 _delayed_delete_queue.push_back(
276 std::make_unique<
277 DeleteableObject<typename std::decay<T>::type>
278 >(std::forward<T>(any))
279 );
280 }
281
283 {
284 static ScriptRegistryCompositum instance;
285 return &instance;
286 }
287
288private:
290 {
291 _registries.insert(registry);
292 }
293
295 {
296 _delayed_delete_queue.clear();
297 }
298
299 std::unordered_set<ScriptRegistryInterface*> _registries;
300
301 std::vector<std::unique_ptr<DeleteableObjectBase>> _delayed_delete_queue;
302
303 std::unordered_map<
304 std::string /*script name*/,
305 std::string /*context*/
307};
308
309#define sScriptRegistryCompositum ScriptRegistryCompositum::Instance()
310
311template<typename /*ScriptType*/, bool /*IsDatabaseBound*/>
313
314// This is the global static registry of scripts.
315template<class ScriptType>
316class ScriptRegistry final
318 ScriptType, is_script_database_bound<ScriptType>::value>
319{
322 sScriptRegistryCompositum->Register(this);
323 }
324
325public:
327 {
328 static ScriptRegistry instance;
329 return &instance;
330 }
331
332 void LogDuplicatedScriptPointerError(ScriptType const* first, ScriptType const* second)
333 {
334 // See if the script is using the same memory as another script. If this happens, it means that
335 // someone forgot to allocate new memory for a script.
336 TC_LOG_ERROR("scripts", "Script '{}' has same memory pointer as '{}'.",
337 first->GetName(), second->GetName());
339};
342{
343public:
346
349
352
354 virtual void BeforeReleaseContext(std::string const& /*context*/) { }
355
357 virtual void BeforeSwapContext(bool /*initialize*/) { }
358
360 virtual void BeforeUnload() { }
361
363 virtual void OnScriptNamesSync() { };
364};
365
366template<typename ScriptType, typename Base>
369{
370};
371
372template<typename Base>
375{
376public:
377 void BeforeReleaseContext(std::string const& context) final override
378 {
379 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
380 ASSERT(bounds.first == bounds.second);
381 }
382};
383
385template<typename ObjectType, typename ScriptType, typename Base>
388{
389 template<typename W>
391 {
392 public:
393 template<typename T>
395 : _worker(std::forward<T>(worker)) { }
396
397 void Visit(std::unordered_map<ObjectGuid, ObjectType*>& objects)
398 {
399 _worker(objects);
400 }
401
402 template<typename O>
403 void Visit(std::unordered_map<ObjectGuid, O*>&) { }
404
405 private:
407 };
408
410 {
411 public:
412 explicit AsyncCastHotswapEffectEvent(Unit* owner) : owner_(owner) { }
413
414 bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override
415 {
417 return true;
418 }
419
420 private:
422 };
423
424 // Hook which is called before a creature is swapped
425 static void UnloadResetScript(Creature* creature)
426 {
427 // Remove deletable events only,
428 // otherwise it causes crashes with non-deletable spell events.
429 creature->m_Events.KillAllEvents(false);
430
431 if (creature->IsCharmed())
432 creature->RemoveCharmedBy(nullptr);
433
434 ASSERT(!creature->IsCharmed(),
435 "There is a disabled AI which is still loaded.");
436
437 if (creature->IsAlive())
438 creature->AI()->EnterEvadeMode();
439 }
440
441 static void UnloadDestroyScript(Creature* creature)
442 {
443 bool const destroyed = creature->AIM_Destroy();
444 ASSERT(destroyed,
445 "Destroying the AI should never fail here!");
446 (void)destroyed;
447
448 ASSERT(!creature->AI(),
449 "The AI should be null here!");
450 }
451
452 // Hook which is called before a gameobject is swapped
453 static void UnloadResetScript(GameObject* gameobject)
454 {
455 // Remove deletable events only,
456 // otherwise it causes crashes with non-deletable spell events.
457 gameobject->m_Events.KillAllEvents(false);
458
459 gameobject->AI()->Reset();
460 }
461
462 static void UnloadDestroyScript(GameObject* gameobject)
463 {
464 gameobject->AIM_Destroy();
465
466 ASSERT(!gameobject->AI(),
467 "The AI should be null here!");
468 }
469
470 // Hook which is called before a areatrigger is swapped
472 {
473 // Remove deletable events only,
474 // otherwise it causes crashes with non-deletable spell events.
475 at->m_Events.KillAllEvents(false);
476
477 at->AI()->OnRemove();
478 }
479
481 {
482 at->AI_Destroy();
483
484 ASSERT(!at->AI(),
485 "The AI should be null here!");
486 }
487
488 // Hook which is called before a conversation is swapped
489 static void UnloadResetScript(Conversation* conversation)
490 {
491 // Remove deletable events only,
492 // otherwise it causes crashes with non-deletable spell events.
493 conversation->m_Events.KillAllEvents(false);
494
495 conversation->AI()->OnRemove();
496 }
497
498 static void UnloadDestroyScript(Conversation* conversation)
499 {
500 conversation->AI_Destroy();
501
502 ASSERT(!conversation->AI(),
503 "The AI should be null here!");
504 }
505
506 // Hook which is called after a creature was swapped
507 static void LoadInitializeScript(Creature* creature)
508 {
509 ASSERT(!creature->AI(),
510 "The AI should be null here!");
511
512 if (creature->IsAlive())
514
515 bool const created = creature->AIM_Create();
516 ASSERT(created,
517 "Creating the AI should never fail here!");
518 (void)created;
519 }
520
521 static void LoadResetScript(Creature* creature)
522 {
523 if (!creature->IsAlive())
524 return;
525
526 creature->AI()->InitializeAI();
527 if (creature->GetVehicleKit())
528 creature->GetVehicleKit()->Reset();
529 creature->AI()->EnterEvadeMode();
530
531 // Cast a dummy visual spell asynchronously here to signal
532 // that the AI was hot swapped
533 creature->m_Events.AddEvent(new AsyncCastHotswapEffectEvent(creature),
534 creature->m_Events.CalculateTime(0s));
535 }
536
537 // Hook which is called after a gameobject was swapped
538 static void LoadInitializeScript(GameObject* gameobject)
539 {
540 ASSERT(!gameobject->AI(),
541 "The AI should be null here!");
542
543 gameobject->AIM_Initialize();
544 }
545
546 static void LoadResetScript(GameObject* gameobject)
547 {
548 gameobject->AI()->Reset();
549 }
550
551 // Hook which is called after a areatrigger was swapped
553 {
554 ASSERT(!at->AI(),
555 "The AI should be null here!");
556
557 at->AI_Initialize();
558 }
559
561 {
562 at->AI()->OnCreate(nullptr);
563 }
564
565 // Hook which is called after a conversation was swapped
566 static void LoadInitializeScript(Conversation* conversation)
567 {
568 ASSERT(!conversation->AI(),
569 "The AI should be null here!");
570
571 conversation->AI_Initialize();
572 }
573
574 static void LoadResetScript(Conversation* conversation)
575 {
576 conversation->AI()->OnCreate(nullptr);
577 }
578
579 static Creature* GetEntityFromMap(std::common_type<Creature>, Map* map, ObjectGuid const& guid)
580 {
581 return map->GetCreature(guid);
582 }
583
584 static GameObject* GetEntityFromMap(std::common_type<GameObject>, Map* map, ObjectGuid const& guid)
585 {
586 return map->GetGameObject(guid);
587 }
588
589 static AreaTrigger* GetEntityFromMap(std::common_type<AreaTrigger>, Map* map, ObjectGuid const& guid)
590 {
591 return map->GetAreaTrigger(guid);
592 }
593
594 static Conversation* GetEntityFromMap(std::common_type<Conversation>, Map* map, ObjectGuid const& guid)
595 {
596 return map->GetConversation(guid);
597 }
598
599 static auto VisitObjectsToSwapOnMap(std::unordered_set<uint32> const& idsToRemove)
600 {
601 return [&idsToRemove](Map* map, auto&& visitor)
602 {
603 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
604 {
605 for (auto object : objects)
606 {
607 // When the script Id of the script isn't removed in this
608 // context change, do nothing.
609 uint32 aiId = object.second->AI() ? object.second->AI()->GetId() : 0;
610 if (idsToRemove.find(aiId) != idsToRemove.end() || (aiId == 0 && object.second->GetScriptId()))
611 visitor(object.second);
612 }
613 };
614
615 AIFunctionMapWorker<typename std::decay<decltype(evaluator)>::type> worker(std::move(evaluator));
616 TypeContainerVisitor<decltype(worker), MapStoredObjectTypesContainer> containerVisitor(worker);
617
618 containerVisitor.Visit(map->GetObjectsStore());
619 };
620 }
621
623 {
624 return [](Map* map, auto&& visitor)
625 {
626 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
627 {
628 for (auto object : objects)
629 {
630 if (object.second->AI())
631 {
632 ASSERT(object.second->AI()->GetId());
633
634 uint32 aiId = object.second->AI()->GetId();
635 uint32 scriptId = FactorySelector::GetSelectedAIId(object.second);
636
637 ASSERT(scriptId);
638
639 if (aiId == scriptId)
640 {
641 // Skip if the ai id matches
642 continue;
643 }
644
645 if (!sObjectMgr->IsScriptDatabaseBound(scriptId)
646 && !sObjectMgr->IsScriptDatabaseBound(aiId))
647 {
648 // Skip if we are dealing with two selectable AI scripts
649 continue;
650 }
651
652 visitor(object.second);
653 }
654 else
655 visitor(object.second);
656 }
657 };
658
659 AIFunctionMapWorker<typename std::decay<decltype(evaluator)>::type> worker(std::move(evaluator));
660 TypeContainerVisitor<decltype(worker), MapStoredObjectTypesContainer> containerVisitor(worker);
661
662 containerVisitor.Visit(map->GetObjectsStore());
663 };
664 }
665
666 template<typename T>
667 static void DestroyScriptIdsWithVisitor(T&& visitor)
668 {
669 // First reset all swapped scripts safe by guid
670 sMapMgr->DoForAllMaps([&](Map* map)
671 {
672 std::vector<ObjectGuid> guidsToReset;
673
674 visitor(map, [&](ObjectType* object)
675 {
676 if (object->AI())
677 guidsToReset.push_back(object->GetGUID());
678 });
679
680 for (ObjectGuid const& guid : guidsToReset)
681 {
682 if (auto entity = GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
683 UnloadResetScript(entity);
684 }
685
686 visitor(map, [&](ObjectType* object)
687 {
688 // Destroy the scripts instantly
689 UnloadDestroyScript(object);
690 });
691 });
692 }
693
694 template<typename T>
695 static void InitializeScriptIdsWithVisitor(T&& visitor)
696 {
697 sMapMgr->DoForAllMaps([&](Map* map)
698 {
699 std::vector<ObjectGuid> guidsToReset;
700
701 visitor(map, [&](ObjectType* object)
702 {
703 if (!object->AI())
704 {
705 // Initialize the script
706 LoadInitializeScript(object);
707 guidsToReset.push_back(object->GetGUID());
708 }
709 });
710
711 for (ObjectGuid const& guid : guidsToReset)
712 {
713 // Reset the script
714 if (auto entity = GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
715 {
716 if (!entity->AI())
717 LoadInitializeScript(entity);
718
719 LoadResetScript(entity);
720 }
721 }
722 });
723 }
724
725public:
726 void BeforeReleaseContext(std::string const& context) final override
727 {
728 auto idsToRemove = static_cast<Base*>(this)->GetScriptIDsToRemove(context);
730
731 // Add the new ids which are removed to the global ids to remove set
732 ids_removed_.insert(idsToRemove.begin(), idsToRemove.end());
733 }
734
735 void BeforeSwapContext(bool initialize) override
736 {
737 // Never swap creature or gameobject scripts when initializing
738 if (initialize)
739 return;
740
741 // Add the recently added scripts to the deleted scripts to replace
742 // default AI's with recently added core scripts.
743 ids_removed_.insert(static_cast<Base*>(this)->GetRecentlyAddedScriptIDs().begin(),
744 static_cast<Base*>(this)->GetRecentlyAddedScriptIDs().end());
745
746 auto const visitor = VisitObjectsToSwapOnMap(ids_removed_);
749
750 ids_removed_.clear();
751 }
752
753 void BeforeUnload() final override
754 {
755 ASSERT(ids_removed_.empty());
756 }
757
758 void OnScriptNamesSync() final override
759 {
760 auto const visitor = VisitObjectsWhereIdWasUpdated();
763 }
764
765private:
766 std::unordered_set<uint32> ids_removed_;
767};
768
769// This hook is responsible for swapping CreatureAI's
770template<typename Base>
773 Creature, CreatureScript, Base
774 > { };
775
776// This hook is responsible for swapping GameObjectAI's
777template<typename Base>
780 GameObject, GameObjectScript, Base
781 > { };
782
783// This hook is responsible for swapping AreaTriggerAI's
784template<typename Base>
787 AreaTrigger, AreaTriggerEntityScript, Base
788 > { };
789
790// This hook is responsible for swapping ConversationAI's
791template<typename Base>
794 Conversation, ConversationScript, Base
795 > {
796};
797
799template<typename Base>
801 : public UnsupportedScriptRegistrySwapHooks<Base> { };
802
804template<typename Base>
807{
808public:
809 ScriptRegistrySwapHooks() : swapped(false) { }
810
811 void BeforeReleaseContext(std::string const& context) final override
812 {
813 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
814
815 if ((!swapped) && (bounds.first != bounds.second))
816 {
817 swapped = true;
818 sOutdoorPvPMgr->Die();
819 }
820 }
821
822 void BeforeSwapContext(bool initialize) override
823 {
824 // Never swap outdoor pvp scripts when initializing
825 if ((!initialize) && swapped)
826 {
827 sOutdoorPvPMgr->InitOutdoorPvP();
828 swapped = false;
829 }
830 }
831
832 void BeforeUnload() final override
833 {
834 ASSERT(!swapped);
835 }
836
837private:
839};
840
842template<typename Base>
845{
846public:
847 ScriptRegistrySwapHooks() : swapped(false) { }
848
849 void BeforeReleaseContext(std::string const& context) final override
850 {
851 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
852 if (bounds.first != bounds.second)
853 swapped = true;
854 }
855
856 void BeforeSwapContext(bool /*initialize*/) override
857 {
858 swapped = false;
859 }
860
861 void BeforeUnload() final override
862 {
863 ASSERT(!swapped);
864 }
865
866private:
868};
869
871template<typename Base>
874{
875public:
876 ScriptRegistrySwapHooks() : swapped(false) { }
877
878 void BeforeReleaseContext(std::string const& context) final override
879 {
880 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
881 if (bounds.first != bounds.second)
882 swapped = true;
883 }
884
885 void BeforeSwapContext(bool /*initialize*/) override
886 {
887 swapped = false;
888 }
889
890 void BeforeUnload() final override
891 {
892 ASSERT(!swapped);
893 }
894
895private:
897};
898
900template<typename Base>
903{
904public:
905 ScriptRegistrySwapHooks() : swapped(false) { }
906
907 void BeforeReleaseContext(std::string const& context) final override
908 {
909 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
910 if (bounds.first != bounds.second)
911 swapped = true;
912 }
913
914 void BeforeSwapContext(bool /*initialize*/) override
915 {
916 swapped = false;
917 }
918
919 void BeforeUnload() final override
920 {
921 ASSERT(!swapped);
922 }
923
924private:
926};
927
929template<typename Base>
932{
933public:
934 ScriptRegistrySwapHooks() : swapped(false) { }
935
936 void BeforeReleaseContext(std::string const& context) final override
937 {
938 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
939 if (bounds.first != bounds.second)
940 swapped = true;
941 }
942
943 void BeforeSwapContext(bool /*initialize*/) override
944 {
945 swapped = false;
946 }
947
948 void BeforeUnload() final override
949 {
950 ASSERT(!swapped);
951 }
952
953private:
955};
956
958template<typename Base>
961{
962public:
963 ScriptRegistrySwapHooks() : swapped(false) { }
964
965 void BeforeReleaseContext(std::string const& context) final override
966 {
967 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
968
969 if (bounds.first != bounds.second)
970 swapped = true;
971 }
972
973 void BeforeSwapContext(bool /*initialize*/) override
974 {
975 if (swapped)
976 {
977 sObjectMgr->ValidateSpellScripts();
978 swapped = false;
979 }
980 }
981
982 void BeforeUnload() final override
983 {
984 ASSERT(!swapped);
985 }
986
987private:
989};
990
991// Database bound script registry
992template<typename ScriptType>
993class SpecializedScriptRegistry<ScriptType, true>
995 public ScriptRegistrySwapHooks<ScriptType, ScriptRegistry<ScriptType>>
996{
997 template<typename>
999
1000 template<typename, typename>
1002
1003 template<typename, typename, typename>
1005
1006public:
1008
1009 typedef std::unordered_map<
1010 uint32 /*script id*/,
1011 std::unique_ptr<ScriptType>
1013
1014 typedef typename ScriptStoreType::iterator ScriptStoreIteratorType;
1015
1016 void ReleaseContext(std::string const& context) final override
1017 {
1018 this->BeforeReleaseContext(context);
1019
1020 auto const bounds = _ids_of_contexts.equal_range(context);
1021 for (auto itr = bounds.first; itr != bounds.second; ++itr)
1022 _scripts.erase(itr->second);
1023 }
1024
1025 void SwapContext(bool initialize) final override
1026 {
1027 this->BeforeSwapContext(initialize);
1028
1029 _recently_added_ids.clear();
1030 }
1031
1032 void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) final override
1033 {
1034 for (auto const& script : _scripts)
1035 scripts.erase(script.second->GetName());
1036 }
1037
1038 void Unload() final override
1039 {
1040 this->BeforeUnload();
1041
1042 ASSERT(_recently_added_ids.empty(),
1043 "Recently added script ids should be empty here!");
1044
1045 _scripts.clear();
1046 _ids_of_contexts.clear();
1047 }
1048
1049 void SyncScriptNames() final override
1050 {
1051 this->OnScriptNamesSync();
1052 }
1053
1054 // Adds a database bound script
1055 void AddScript(ScriptType* script)
1056 {
1057 ASSERT(script,
1058 "Tried to call AddScript with a nullpointer!");
1059 ASSERT(!sScriptMgr->GetCurrentScriptContext().empty(),
1060 "Tried to register a script without being in a valid script context!");
1061
1062 std::unique_ptr<ScriptType> script_ptr(script);
1063
1064 // Get an ID for the script.
1065 uint32 const id = sObjectMgr->GetScriptId(script->GetName());
1066
1067 // Try to find an existing script.
1068 for (auto const& stored_script : _scripts)
1069 {
1070 // If the script names match...
1071 if (stored_script.second->GetName() == script->GetName())
1072 {
1073 // If the script is already assigned -> delete it!
1074 ABORT_MSG("Script '%s' already assigned with the same script name, "
1075 "so the script can't work.", script->GetName().c_str());
1076
1077 // Error that should be fixed ASAP.
1078 sScriptRegistryCompositum->QueueForDelayedDelete(std::move(script_ptr));
1079 ABORT();
1080 return;
1081 }
1082 }
1083
1084 // If the script isn't assigned -> assign it!
1085 _scripts.insert(std::make_pair(id, std::move(script_ptr)));
1086 _ids_of_contexts.insert(std::make_pair(sScriptMgr->GetCurrentScriptContext(), id));
1087 _recently_added_ids.insert(id);
1088
1089 sScriptRegistryCompositum->SetScriptNameInContext(script->GetName(),
1090 sScriptMgr->GetCurrentScriptContext());
1091 }
1092
1093 // Gets a script by its ID (assigned by ObjectMgr).
1094 ScriptType* GetScriptById(uint32 id)
1095 {
1096 auto const itr = _scripts.find(id);
1097 if (itr != _scripts.end())
1098 return itr->second.get();
1099
1100 return nullptr;
1101 }
1102
1104 {
1105 return _scripts;
1106 }
1107
1108protected:
1109 // Returns the script id's which are registered to a certain context
1110 std::unordered_set<uint32> GetScriptIDsToRemove(std::string const& context) const
1111 {
1112 // Create a set of all ids which are removed
1113 std::unordered_set<uint32> scripts_to_remove;
1114
1115 auto const bounds = _ids_of_contexts.equal_range(context);
1116 for (auto itr = bounds.first; itr != bounds.second; ++itr)
1117 scripts_to_remove.insert(itr->second);
1118
1119 return scripts_to_remove;
1120 }
1121
1122 std::unordered_set<uint32> const& GetRecentlyAddedScriptIDs() const
1123 {
1124 return _recently_added_ids;
1125 }
1126
1127private:
1129
1130 // Scripts of a specific context
1131 std::unordered_multimap<std::string /*context*/, uint32 /*id*/> _ids_of_contexts;
1132
1133 // Script id's which were registered recently
1134 std::unordered_set<uint32> _recently_added_ids;
1135};
1136
1138template<typename Base>
1141{
1142public:
1143 void BeforeReleaseContext(std::string const& /*context*/) final override
1144 {
1146 }
1147
1148 void BeforeSwapContext(bool /*initialize*/) override
1149 {
1151 }
1152
1153 void BeforeUnload() final override
1154 {
1156 }
1157};
1158
1159// Database unbound script registry
1160template<typename ScriptType>
1161class SpecializedScriptRegistry<ScriptType, false>
1162 : public ScriptRegistryInterface,
1163 public ScriptRegistrySwapHooks<ScriptType, ScriptRegistry<ScriptType>>
1164{
1165 template<typename, typename>
1167
1168public:
1169 typedef std::unordered_multimap<std::string /*context*/, std::unique_ptr<ScriptType>> ScriptStoreType;
1170 typedef typename ScriptStoreType::iterator ScriptStoreIteratorType;
1171
1173
1174 void ReleaseContext(std::string const& context) final override
1175 {
1176 this->BeforeReleaseContext(context);
1177
1178 _scripts.erase(context);
1179 }
1180
1181 void SwapContext(bool initialize) final override
1182 {
1183 this->BeforeSwapContext(initialize);
1184 }
1185
1186 void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) final override
1187 {
1188 for (auto const& script : _scripts)
1189 scripts.erase(script.second->GetName());
1190 }
1191
1192 void Unload() final override
1193 {
1194 this->BeforeUnload();
1195
1196 _scripts.clear();
1197 }
1198
1199 void SyncScriptNames() final override
1200 {
1201 }
1202
1203 // Adds a non database bound script
1204 void AddScript(ScriptType* script)
1205 {
1206 ASSERT(script,
1207 "Tried to call AddScript with a nullpointer!");
1208 ASSERT(!sScriptMgr->GetCurrentScriptContext().empty(),
1209 "Tried to register a script without being in a valid script context!");
1210
1211 std::unique_ptr<ScriptType> script_ptr(script);
1212
1213 for (auto const& entry : _scripts)
1214 if (entry.second.get() == script)
1215 {
1216 static_cast<ScriptRegistry<ScriptType>*>(this)->
1217 LogDuplicatedScriptPointerError(script, entry.second.get());
1218
1219 sScriptRegistryCompositum->QueueForDelayedDelete(std::move(script_ptr));
1220 return;
1221 }
1222
1223 // We're dealing with a code-only script, just add it.
1224 _scripts.insert(std::make_pair(sScriptMgr->GetCurrentScriptContext(), std::move(script_ptr)));
1225 }
1226
1228 {
1229 return _scripts;
1230 }
1231
1232private:
1234};
1235
1236// Utility macros to refer to the script registry.
1237#define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptStoreType
1238#define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptStoreIteratorType
1239#define SCR_REG_LST(T) ScriptRegistry<T>::Instance()->GetScripts()
1240
1241// Utility macros for looping over scripts.
1242#define FOR_SCRIPTS(T, C, E) \
1243 if (!SCR_REG_LST(T).empty()) \
1244 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
1245 C != SCR_REG_LST(T).end(); ++C)
1246
1247#define FOR_SCRIPTS_RET(T, C, E, R) \
1248 if (SCR_REG_LST(T).empty()) \
1249 return R; \
1250 \
1251 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
1252 C != SCR_REG_LST(T).end(); ++C)
1253
1254#define FOREACH_SCRIPT(T) \
1255 FOR_SCRIPTS(T, itr, end) \
1256 itr->second
1257
1258// Utility macros for finding specific scripts.
1259#define GET_SCRIPT(T, I, V) \
1260 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1261 if (!V) \
1262 return;
1263
1264#define GET_SCRIPT_RET(T, I, V, R) \
1265 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1266 if (!V) \
1267 return R;
1268
1269ScriptObject::ScriptObject(char const* name) : _name(name)
1270{
1271 sScriptMgr->IncreaseScriptCount();
1272}
1273
1275{
1276 sScriptMgr->DecreaseScriptCount();
1277}
1278
1279std::string const& ScriptObject::GetName() const
1280{
1281 return _name;
1282}
1283
1285 : _scriptCount(0), _scriptIdUpdated(false), _script_loader_callback(nullptr)
1286{
1287}
1288
1289ScriptMgr::~ScriptMgr() = default;
1290
1292{
1293 static ScriptMgr instance;
1294 return &instance;
1295}
1296
1298{
1300 && "Reload hotswap spell effect for creatures isn't valid!");
1301
1302 uint32 oldMSTime = getMSTime();
1303
1304 LoadDatabase();
1305
1306 TC_LOG_INFO("server.loading", "Loading C++ scripts");
1307
1309
1310 // Load core scripts
1312
1313 // SmartAI
1315
1316 // LFGScripts
1318
1319 // MapScripts
1320 sMapMgr->AddSC_BuiltInScripts();
1321
1322 // Load all static linked scripts through the script loader function.
1324 "Script loader callback wasn't registered!");
1326
1327 // Initialize all dynamic scripts
1328 // and finishes the context switch to do
1329 // bulk loading
1330 sScriptReloadMgr->Initialize();
1331
1332 // Loads all scripts from the current context
1333 sScriptMgr->SwapScriptContext(true);
1334
1335 // Print unused script names.
1336 std::unordered_set<std::string> unusedScriptNames = sObjectMgr->GetAllDBScriptNames();
1337
1338 // Remove the used scripts from the given container.
1339 sScriptRegistryCompositum->RemoveUsedScriptsFromContainer(unusedScriptNames);
1340
1341 for (std::string const& scriptName : unusedScriptNames)
1342 {
1343 // Avoid complaining about empty script names since the
1344 // script name container contains a placeholder as the 0 element.
1345 if (scriptName.empty())
1346 continue;
1347
1348 TC_LOG_ERROR("sql.sql", "Script '{}' is referenced by the database, but does not exist in the core!", scriptName);
1349 }
1350
1351 TC_LOG_INFO("server.loading", ">> Loaded {} C++ scripts in {} ms",
1352 GetScriptCount(), GetMSTimeDiffToNow(oldMSTime));
1353}
1354
1356{
1357 _scriptIdUpdated = true;
1358}
1359
1361{
1362 if (_scriptIdUpdated)
1363 {
1364 _scriptIdUpdated = false;
1365 sScriptRegistryCompositum->SyncScriptNames();
1366 }
1367}
1368
1369void ScriptMgr::SetScriptContext(std::string const& context)
1370{
1371 _currentContext = context;
1372}
1373
1374void ScriptMgr::SwapScriptContext(bool initialize)
1375{
1376 sScriptRegistryCompositum->SwapContext(initialize);
1377 _currentContext.clear();
1378}
1379
1381{
1382 static std::string const name = "___static___";
1383 return name;
1384}
1385
1386void ScriptMgr::ReleaseScriptContext(std::string const& context)
1387{
1388 sScriptRegistryCompositum->ReleaseContext(context);
1389}
1390
1391std::shared_ptr<ModuleReference>
1392 ScriptMgr::AcquireModuleReferenceOfScriptName(std::string const& scriptname) const
1393{
1394#ifdef TRINITY_API_USE_DYNAMIC_LINKING
1395 // Returns the reference to the module of the given scriptname
1397 sScriptRegistryCompositum->GetScriptContextOfScriptName(scriptname));
1398#else
1399 (void)scriptname;
1400 // Something went wrong when this function is used in
1401 // a static linked context.
1402 WPAbort();
1403#endif // #ifndef TRINITY_API_USE_DYNAMIC_LINKING
1404}
1405
1407{
1408 sScriptRegistryCompositum->Unload();
1409
1410 UnitAI::AISpellInfo.clear();
1411}
1412
1414{
1415 sScriptSystemMgr->LoadScriptSplineChains();
1416}
1417
1419{
1421}
1422
1423template<typename T, typename O>
1424void CreateSpellOrAuraScripts(uint32 spellId, std::vector<T*>& scriptVector, T*(SpellScriptLoader::*extractor)() const, O* objectInvoker)
1425{
1426 SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
1427 for (auto itr = bounds.first; itr != bounds.second; ++itr)
1428 {
1429 // When the script is disabled continue with the next one
1430 if (!itr->second.second)
1431 continue;
1432
1433 SpellScriptLoader* tmpscript = sScriptMgr->GetSpellScriptLoader(itr->second.first);
1434 if (!tmpscript)
1435 continue;
1436
1437 T* script = (tmpscript->*extractor)();
1438 if (!script)
1439 continue;
1440
1441 script->_Init(tmpscript->GetName(), spellId);
1442 if (!script->_Load(objectInvoker))
1443 {
1444 delete script;
1445 continue;
1446 }
1447
1448 scriptVector.push_back(script);
1449 }
1450}
1451
1452void ScriptMgr::CreateSpellScripts(uint32 spellId, std::vector<SpellScript*>& scriptVector, Spell* invoker) const
1453{
1454 CreateSpellOrAuraScripts(spellId, scriptVector, &SpellScriptLoader::GetSpellScript, invoker);
1455}
1456
1457void ScriptMgr::CreateAuraScripts(uint32 spellId, std::vector<AuraScript*>& scriptVector, Aura* invoker) const
1458{
1459 CreateSpellOrAuraScripts(spellId, scriptVector, &SpellScriptLoader::GetAuraScript, invoker);
1460}
1461
1463{
1464 return ScriptRegistry<SpellScriptLoader>::Instance()->GetScriptById(scriptId);
1465}
1466
1468{
1469 FOREACH_SCRIPT(ServerScript)->OnNetworkStart();
1470}
1471
1473{
1474 FOREACH_SCRIPT(ServerScript)->OnNetworkStop();
1475}
1476
1477void ScriptMgr::OnSocketOpen(std::shared_ptr<WorldSocket> socket)
1478{
1479 ASSERT(socket);
1480
1481 FOREACH_SCRIPT(ServerScript)->OnSocketOpen(socket);
1482}
1483
1484void ScriptMgr::OnSocketClose(std::shared_ptr<WorldSocket> socket)
1485{
1486 ASSERT(socket);
1487
1488 FOREACH_SCRIPT(ServerScript)->OnSocketClose(socket);
1489}
1490
1492{
1493 if (SCR_REG_LST(ServerScript).empty())
1494 return;
1495
1496 WorldPacket copy(packet);
1497 FOREACH_SCRIPT(ServerScript)->OnPacketReceive(session, copy);
1498}
1499
1501{
1502 ASSERT(session);
1503
1504 if (SCR_REG_LST(ServerScript).empty())
1505 return;
1506
1507 WorldPacket copy(packet);
1508 FOREACH_SCRIPT(ServerScript)->OnPacketSend(session, copy);
1509}
1510
1512{
1513 FOREACH_SCRIPT(WorldScript)->OnOpenStateChange(open);
1514}
1515
1517{
1518 FOREACH_SCRIPT(WorldScript)->OnConfigLoad(reload);
1519}
1520
1521void ScriptMgr::OnMotdChange(std::string& newMotd)
1522{
1523 FOREACH_SCRIPT(WorldScript)->OnMotdChange(newMotd);
1524}
1525
1527{
1528 FOREACH_SCRIPT(WorldScript)->OnShutdownInitiate(code, mask);
1529}
1530
1532{
1533 FOREACH_SCRIPT(WorldScript)->OnShutdownCancel();
1534}
1535
1537{
1538 FOREACH_SCRIPT(WorldScript)->OnUpdate(diff);
1539}
1540
1541void ScriptMgr::OnHonorCalculation(float& honor, uint8 level, float multiplier)
1542{
1543 FOREACH_SCRIPT(FormulaScript)->OnHonorCalculation(honor, level, multiplier);
1544}
1545
1546void ScriptMgr::OnGrayLevelCalculation(uint8& grayLevel, uint8 playerLevel)
1547{
1548 FOREACH_SCRIPT(FormulaScript)->OnGrayLevelCalculation(grayLevel, playerLevel);
1549}
1550
1552{
1553 FOREACH_SCRIPT(FormulaScript)->OnColorCodeCalculation(color, playerLevel, mobLevel);
1554}
1555
1557{
1558 FOREACH_SCRIPT(FormulaScript)->OnZeroDifferenceCalculation(diff, playerLevel);
1559}
1560
1561void ScriptMgr::OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel)
1562{
1563 FOREACH_SCRIPT(FormulaScript)->OnBaseGainCalculation(gain, playerLevel, mobLevel);
1564}
1565
1567{
1568 ASSERT(player);
1569 ASSERT(unit);
1570
1571 FOREACH_SCRIPT(FormulaScript)->OnGainCalculation(gain, player, unit);
1572}
1573
1574void ScriptMgr::OnGroupRateCalculation(float& rate, uint32 count, bool isRaid)
1575{
1576 FOREACH_SCRIPT(FormulaScript)->OnGroupRateCalculation(rate, count, isRaid);
1577}
1578
1579#define SCR_MAP_BGN(M, V, I, E, C, T) \
1580 if (V->GetEntry() && V->GetEntry()->T()) \
1581 { \
1582 FOR_SCRIPTS(M, I, E) \
1583 { \
1584 MapEntry const* C = I->second->GetEntry(); \
1585 if (!C) \
1586 continue; \
1587 if (C->ID == V->GetId()) \
1588 {
1589
1590#define SCR_MAP_END \
1591 return; \
1592 } \
1593 } \
1594 }
1595
1597{
1598 ASSERT(map);
1599
1600 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1601 itr->second->OnCreate(map);
1603
1604 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1605 itr->second->OnCreate((InstanceMap*)map);
1607
1608 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1609 itr->second->OnCreate((BattlegroundMap*)map);
1611}
1612
1614{
1615 ASSERT(map);
1616
1617 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1618 itr->second->OnDestroy(map);
1620
1621 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1622 itr->second->OnDestroy((InstanceMap*)map);
1624
1625 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1626 itr->second->OnDestroy((BattlegroundMap*)map);
1628}
1629
1631{
1632 ASSERT(map);
1633 ASSERT(player);
1634
1635 FOREACH_SCRIPT(PlayerScript)->OnMapChanged(player);
1636
1637 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1638 itr->second->OnPlayerEnter(map, player);
1640
1641 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1642 itr->second->OnPlayerEnter((InstanceMap*)map, player);
1644
1645 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1646 itr->second->OnPlayerEnter((BattlegroundMap*)map, player);
1648}
1649
1651{
1652 ASSERT(map);
1653 ASSERT(player);
1654
1655 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1656 itr->second->OnPlayerLeave(map, player);
1658
1659 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1660 itr->second->OnPlayerLeave((InstanceMap*)map, player);
1662
1663 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1664 itr->second->OnPlayerLeave((BattlegroundMap*)map, player);
1666}
1667
1669{
1670 ASSERT(map);
1671
1672 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1673 itr->second->OnUpdate(map, diff);
1675
1676 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1677 itr->second->OnUpdate((InstanceMap*)map, diff);
1679
1680 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1681 itr->second->OnUpdate((BattlegroundMap*)map, diff);
1683}
1684
1685#undef SCR_MAP_BGN
1686#undef SCR_MAP_END
1687
1689{
1690 ASSERT(map);
1691
1692 GET_SCRIPT_RET(InstanceMapScript, map->GetScriptId(), tmpscript, nullptr);
1693 return tmpscript->GetInstanceScript(map);
1694}
1695
1697{
1698 ASSERT(map);
1699
1700 GET_SCRIPT_RET(BattlegroundMapScript, map->GetScriptId(), tmpscript, NULL);
1701 return tmpscript->GetBattlegroundScript(map);
1702}
1703
1704bool ScriptMgr::OnQuestAccept(Player* player, Item* item, Quest const* quest)
1705{
1706 ASSERT(player);
1707 ASSERT(item);
1708 ASSERT(quest);
1709
1710 GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
1711 player->PlayerTalkClass->ClearMenus();
1712 return tmpscript->OnQuestAccept(player, item, quest);
1713}
1714
1715bool ScriptMgr::OnItemUse(Player* player, Item* item, SpellCastTargets const& targets, ObjectGuid castId)
1716{
1717 ASSERT(player);
1718 ASSERT(item);
1719
1720 GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
1721 return tmpscript->OnUse(player, item, targets, castId);
1722}
1723
1725{
1726 ASSERT(player);
1727 ASSERT(proto);
1728
1729 GET_SCRIPT_RET(ItemScript, proto->ScriptId, tmpscript, false);
1730 return tmpscript->OnExpire(player, proto);
1731}
1732
1734{
1735 ASSERT(player);
1736 ASSERT(item);
1737
1738 GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
1739 return tmpscript->OnRemove(player, item);
1740}
1741
1742bool ScriptMgr::OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo const* spellInfo, Item* item)
1743{
1744 ASSERT(player);
1745 ASSERT(victim);
1746 ASSERT(spellInfo);
1747 ASSERT(item);
1748
1749 GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, true);
1750 return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item);
1751}
1752
1754{
1755 return !!ScriptRegistry<CreatureScript>::Instance()->GetScriptById(scriptId);
1756}
1757
1759{
1760 ASSERT(creature);
1761
1762 GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, nullptr);
1763 return tmpscript->GetAI(creature);
1764}
1765
1767{
1768 return !!ScriptRegistry<GameObjectScript>::Instance()->GetScriptById(scriptId);
1769}
1770
1772{
1773 ASSERT(gameobject);
1774
1775 GET_SCRIPT_RET(GameObjectScript, gameobject->GetScriptId(), tmpscript, nullptr);
1776 return tmpscript->GetAI(gameobject);
1777}
1778
1780{
1781 return !!ScriptRegistry<AreaTriggerEntityScript>::Instance()->GetScriptById(scriptId);
1782}
1783
1785{
1786 ASSERT(areatrigger);
1787
1788 GET_SCRIPT_RET(AreaTriggerEntityScript, areatrigger->GetScriptId(), tmpscript, nullptr);
1789 return tmpscript->GetAI(areatrigger);
1790}
1791
1792bool ScriptMgr::OnAreaTrigger(Player* player, AreaTriggerEntry const* trigger, bool entered)
1793{
1794 ASSERT(player);
1795 ASSERT(trigger);
1796
1797 GET_SCRIPT_RET(AreaTriggerScript, sObjectMgr->GetAreaTriggerScriptId(trigger->ID), tmpscript, false);
1798 return entered ? tmpscript->OnTrigger(player, trigger) : tmpscript->OnExit(player, trigger);
1799}
1800
1802{
1803 return !!ScriptRegistry<ConversationScript>::Instance()->GetScriptById(scriptId);
1804}
1805
1807{
1808 ASSERT(conversation);
1809
1810 GET_SCRIPT_RET(ConversationScript, conversation->GetScriptId(), tmpscript, nullptr);
1811 return tmpscript->GetAI(conversation);
1812}
1813
1815{
1816 GET_SCRIPT_RET(BattlefieldScript, scriptId, tmpscript, nullptr);
1817 return tmpscript->GetBattlefield(map);
1818}
1819
1821{
1822 GET_SCRIPT_RET(OutdoorPvPScript, scriptId, tmpscript, nullptr);
1823 return tmpscript->GetOutdoorPvP(map);
1824}
1825
1827{
1829
1830 FOR_SCRIPTS(CommandScript, itr, end)
1831 {
1832 Trinity::ChatCommands::ChatCommandTable cmds = itr->second->GetCommands();
1833 std::move(cmds.begin(), cmds.end(), std::back_inserter(table));
1834 }
1835
1836 return table;
1837}
1838
1839void ScriptMgr::OnWeatherChange(Weather* weather, WeatherState state, float grade)
1840{
1841 ASSERT(weather);
1842
1843 GET_SCRIPT(WeatherScript, weather->GetScriptId(), tmpscript);
1844 tmpscript->OnChange(weather, state, grade);
1845}
1846
1848{
1849 ASSERT(weather);
1850
1851 GET_SCRIPT(WeatherScript, weather->GetScriptId(), tmpscript);
1852 tmpscript->OnUpdate(weather, diff);
1853}
1854
1856{
1857 ASSERT(ah);
1858 ASSERT(auction);
1859
1860 FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionAdd(ah, auction);
1861}
1862
1864{
1865 ASSERT(ah);
1866 ASSERT(auction);
1867
1868 FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionRemove(ah, auction);
1869}
1870
1872{
1873 ASSERT(ah);
1874 ASSERT(auction);
1875
1876 FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionSuccessful(ah, auction);
1877}
1878
1880{
1881 ASSERT(ah);
1882 ASSERT(auction);
1883
1884 FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionExpire(ah, auction);
1885}
1886
1888{
1889 ASSERT(condition);
1890
1891 GET_SCRIPT_RET(ConditionScript, condition->ScriptId, tmpscript, true);
1892 return tmpscript->OnConditionCheck(condition, sourceInfo);
1893}
1894
1896{
1897 ASSERT(veh);
1898 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1899
1900 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1901 tmpscript->OnInstall(veh);
1902}
1903
1905{
1906 ASSERT(veh);
1907 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1908
1909 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1910 tmpscript->OnUninstall(veh);
1911}
1912
1914{
1915 ASSERT(veh);
1916 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1917
1918 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1919 tmpscript->OnReset(veh);
1920}
1921
1923{
1924 ASSERT(veh);
1925 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1926 ASSERT(accessory);
1927
1928 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1929 tmpscript->OnInstallAccessory(veh, accessory);
1930}
1931
1932void ScriptMgr::OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId)
1933{
1934 ASSERT(veh);
1935 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1936 ASSERT(passenger);
1937
1938 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1939 tmpscript->OnAddPassenger(veh, passenger, seatId);
1940}
1941
1943{
1944 ASSERT(veh);
1945 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1946 ASSERT(passenger);
1947
1948 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1949 tmpscript->OnRemovePassenger(veh, passenger);
1950}
1951
1953{
1954 ASSERT(dynobj);
1955
1957 itr->second->OnUpdate(dynobj, diff);
1958}
1959
1961{
1962 ASSERT(transport);
1963 ASSERT(player);
1964
1965 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1966 tmpscript->OnAddPassenger(transport, player);
1967}
1968
1970{
1971 ASSERT(transport);
1972 ASSERT(creature);
1973
1974 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1975 tmpscript->OnAddCreaturePassenger(transport, creature);
1976}
1977
1979{
1980 ASSERT(transport);
1981 ASSERT(player);
1982
1983 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1984 tmpscript->OnRemovePassenger(transport, player);
1985}
1986
1988{
1989 ASSERT(transport);
1990
1991 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1992 tmpscript->OnUpdate(transport, diff);
1993}
1994
1995void ScriptMgr::OnRelocate(Transport* transport, uint32 mapId, float x, float y, float z)
1996{
1997 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1998 tmpscript->OnRelocate(transport, mapId, x, y, z);
1999}
2000
2002{
2003 FOREACH_SCRIPT(WorldScript)->OnStartup();
2004}
2005
2007{
2008 FOREACH_SCRIPT(WorldScript)->OnShutdown();
2009}
2010
2011// Achievement
2013{
2014 ASSERT(player);
2015 ASSERT(achievement);
2016
2017 GET_SCRIPT(AchievementScript, sAchievementMgr->GetAchievementScriptId(achievement->ID), tmpscript);
2018 tmpscript->OnCompleted(player, achievement);
2019}
2020
2021bool ScriptMgr::OnCriteriaCheck(uint32 scriptId, Player* source, Unit* target)
2022{
2023 ASSERT(source);
2024 // target can be NULL.
2025
2026 GET_SCRIPT_RET(AchievementCriteriaScript, scriptId, tmpscript, false);
2027 return tmpscript->OnCheck(source, target);
2028}
2029
2030// Player
2031void ScriptMgr::OnPVPKill(Player* killer, Player* killed)
2032{
2033 FOREACH_SCRIPT(PlayerScript)->OnPVPKill(killer, killed);
2034}
2035
2037{
2038 FOREACH_SCRIPT(PlayerScript)->OnCreatureKill(killer, killed);
2039}
2040
2042{
2043 FOREACH_SCRIPT(PlayerScript)->OnPlayerKilledByCreature(killer, killed);
2044}
2045
2047{
2048 FOREACH_SCRIPT(PlayerScript)->OnLevelChanged(player, oldLevel);
2049}
2050
2052{
2053 FOREACH_SCRIPT(PlayerScript)->OnFreeTalentPointsChanged(player, points);
2054}
2055
2056void ScriptMgr::OnPlayerTalentsReset(Player* player, bool noCost)
2057{
2058 FOREACH_SCRIPT(PlayerScript)->OnTalentsReset(player, noCost);
2059}
2060
2062{
2063 FOREACH_SCRIPT(PlayerScript)->OnMoneyChanged(player, amount);
2064}
2065
2067{
2068 FOREACH_SCRIPT(PlayerScript)->OnMoneyLimit(player, amount);
2069}
2070
2071void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim)
2072{
2073 FOREACH_SCRIPT(PlayerScript)->OnGiveXP(player, amount, victim);
2074}
2075
2076void ScriptMgr::OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental)
2077{
2078 FOREACH_SCRIPT(PlayerScript)->OnReputationChange(player, factionID, standing, incremental);
2079}
2080
2082{
2083 FOREACH_SCRIPT(PlayerScript)->OnDuelRequest(target, challenger);
2084}
2085
2087{
2088 FOREACH_SCRIPT(PlayerScript)->OnDuelStart(player1, player2);
2089}
2090
2092{
2093 FOREACH_SCRIPT(PlayerScript)->OnDuelEnd(winner, loser, type);
2094}
2095
2096void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg)
2097{
2098 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg);
2099}
2100
2101void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Player* receiver)
2102{
2103 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, receiver);
2104}
2105
2106void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group)
2107{
2108 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, group);
2109}
2110
2111void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild)
2112{
2113 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, guild);
2114}
2115
2116void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel)
2117{
2118 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, channel);
2119}
2120
2122{
2123 FOREACH_SCRIPT(PlayerScript)->OnClearEmote(player);
2124}
2125
2126void ScriptMgr::OnPlayerTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
2127{
2128 FOREACH_SCRIPT(PlayerScript)->OnTextEmote(player, textEmote, emoteNum, guid);
2129}
2130
2131void ScriptMgr::OnPlayerSpellCast(Player* player, Spell* spell, bool skipCheck)
2132{
2133 FOREACH_SCRIPT(PlayerScript)->OnSpellCast(player, spell, skipCheck);
2134}
2135
2136void ScriptMgr::OnPlayerLogin(Player* player, bool firstLogin)
2137{
2138 FOREACH_SCRIPT(PlayerScript)->OnLogin(player, firstLogin);
2139}
2140
2142{
2143 FOREACH_SCRIPT(PlayerScript)->OnLogout(player);
2144}
2145
2147{
2148 FOREACH_SCRIPT(PlayerScript)->OnCreate(player);
2149}
2150
2152{
2153 FOREACH_SCRIPT(PlayerScript)->OnDelete(guid, accountId);
2154}
2155
2157{
2158 FOREACH_SCRIPT(PlayerScript)->OnFailedDelete(guid, accountId);
2159}
2160
2162{
2163 FOREACH_SCRIPT(PlayerScript)->OnSave(player);
2164}
2165
2166void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent, uint8 extendState)
2167{
2168 FOREACH_SCRIPT(PlayerScript)->OnBindToInstance(player, difficulty, mapid, permanent, extendState);
2169}
2170
2171void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea)
2172{
2173 FOREACH_SCRIPT(PlayerScript)->OnUpdateZone(player, newZone, newArea);
2174}
2175
2177{
2178 FOREACH_SCRIPT(PlayerScript)->OnQuestStatusChange(player, questId);
2179}
2180
2182{
2183 FOREACH_SCRIPT(PlayerScript)->OnPlayerRepop(player);
2184}
2185
2187{
2188 FOREACH_SCRIPT(PlayerScript)->OnMovieComplete(player, movieId);
2189}
2190
2191void ScriptMgr::OnPlayerChoiceResponse(Player* player, uint32 choiceId, uint32 responseId)
2192{
2193 FOREACH_SCRIPT(PlayerScript)->OnPlayerChoiceResponse(player, choiceId, responseId);
2194}
2195
2196// Account
2198{
2199 FOREACH_SCRIPT(AccountScript)->OnAccountLogin(accountId);
2200}
2201
2203{
2204 FOREACH_SCRIPT(AccountScript)->OnFailedAccountLogin(accountId);
2205}
2206
2208{
2209 FOREACH_SCRIPT(AccountScript)->OnEmailChange(accountId);
2210}
2211
2213{
2214 FOREACH_SCRIPT(AccountScript)->OnFailedEmailChange(accountId);
2215}
2216
2218{
2219 FOREACH_SCRIPT(AccountScript)->OnPasswordChange(accountId);
2220}
2221
2223{
2224 FOREACH_SCRIPT(AccountScript)->OnFailedPasswordChange(accountId);
2225}
2226
2227// Guild
2228void ScriptMgr::OnGuildAddMember(Guild* guild, Player* player, uint8 plRank)
2229{
2230 FOREACH_SCRIPT(GuildScript)->OnAddMember(guild, player, plRank);
2231}
2232
2233void ScriptMgr::OnGuildRemoveMember(Guild* guild, ObjectGuid guid, bool isDisbanding, bool isKicked)
2234{
2235 FOREACH_SCRIPT(GuildScript)->OnRemoveMember(guild, guid, isDisbanding, isKicked);
2236}
2237
2238void ScriptMgr::OnGuildMOTDChanged(Guild* guild, const std::string& newMotd)
2239{
2240 FOREACH_SCRIPT(GuildScript)->OnMOTDChanged(guild, newMotd);
2241}
2242
2243void ScriptMgr::OnGuildInfoChanged(Guild* guild, const std::string& newInfo)
2244{
2245 FOREACH_SCRIPT(GuildScript)->OnInfoChanged(guild, newInfo);
2246}
2247
2248void ScriptMgr::OnGuildCreate(Guild* guild, Player* leader, const std::string& name)
2249{
2250 FOREACH_SCRIPT(GuildScript)->OnCreate(guild, leader, name);
2251}
2252
2254{
2255 FOREACH_SCRIPT(GuildScript)->OnDisband(guild);
2256}
2257
2258void ScriptMgr::OnGuildMemberWitdrawMoney(Guild* guild, Player* player, uint64 &amount, bool isRepair)
2259{
2260 FOREACH_SCRIPT(GuildScript)->OnMemberWitdrawMoney(guild, player, amount, isRepair);
2261}
2262
2264{
2265 FOREACH_SCRIPT(GuildScript)->OnMemberDepositMoney(guild, player, amount);
2266}
2267
2268void ScriptMgr::OnGuildItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId,
2269 bool isDestBank, uint8 destContainer, uint8 destSlotId)
2270{
2271 FOREACH_SCRIPT(GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
2272}
2273
2274void ScriptMgr::OnGuildEvent(Guild* guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
2275{
2276 FOREACH_SCRIPT(GuildScript)->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank);
2277}
2278
2279void ScriptMgr::OnGuildBankEvent(Guild* guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
2280{
2281 FOREACH_SCRIPT(GuildScript)->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId);
2282}
2283
2284// Group
2286{
2287 ASSERT(group);
2288 FOREACH_SCRIPT(GroupScript)->OnAddMember(group, guid);
2289}
2290
2292{
2293 ASSERT(group);
2294 FOREACH_SCRIPT(GroupScript)->OnInviteMember(group, guid);
2295}
2296
2297void ScriptMgr::OnGroupRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const* reason)
2298{
2299 ASSERT(group);
2300 FOREACH_SCRIPT(GroupScript)->OnRemoveMember(group, guid, method, kicker, reason);
2301}
2302
2303void ScriptMgr::OnGroupChangeLeader(Group* group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid)
2304{
2305 ASSERT(group);
2306 FOREACH_SCRIPT(GroupScript)->OnChangeLeader(group, newLeaderGuid, oldLeaderGuid);
2307}
2308
2310{
2311 ASSERT(group);
2312 FOREACH_SCRIPT(GroupScript)->OnDisband(group);
2313}
2314
2315// Unit
2316void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain)
2317{
2318 FOREACH_SCRIPT(UnitScript)->OnHeal(healer, reciever, gain);
2319}
2320
2321void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage)
2322{
2323 FOREACH_SCRIPT(UnitScript)->OnDamage(attacker, victim, damage);
2324}
2325
2327{
2328 FOREACH_SCRIPT(UnitScript)->ModifyPeriodicDamageAurasTick(target, attacker, damage);
2329}
2330
2331void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage)
2332{
2333 FOREACH_SCRIPT(UnitScript)->ModifyMeleeDamage(target, attacker, damage);
2334}
2335
2336void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage, SpellInfo const* spellInfo)
2337{
2338 FOREACH_SCRIPT(UnitScript)->ModifySpellDamageTaken(target, attacker, damage, spellInfo);
2339}
2340
2341// Scene
2342void ScriptMgr::OnSceneStart(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate)
2343{
2344 ASSERT(player);
2345 ASSERT(sceneTemplate);
2346
2347 GET_SCRIPT(SceneScript, sceneTemplate->ScriptId, tmpscript);
2348 tmpscript->OnSceneStart(player, sceneInstanceID, sceneTemplate);
2349}
2350
2351void ScriptMgr::OnSceneTrigger(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate, std::string const& triggerName)
2352{
2353 ASSERT(player);
2354 ASSERT(sceneTemplate);
2355
2356 GET_SCRIPT(SceneScript, sceneTemplate->ScriptId, tmpscript);
2357 tmpscript->OnSceneTriggerEvent(player, sceneInstanceID, sceneTemplate, triggerName);
2358}
2359
2360void ScriptMgr::OnSceneCancel(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate)
2361{
2362 ASSERT(player);
2363 ASSERT(sceneTemplate);
2364
2365 GET_SCRIPT(SceneScript, sceneTemplate->ScriptId, tmpscript);
2366 tmpscript->OnSceneCancel(player, sceneInstanceID, sceneTemplate);
2367}
2368
2369void ScriptMgr::OnSceneComplete(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate)
2370{
2371 ASSERT(player);
2372 ASSERT(sceneTemplate);
2373
2374 GET_SCRIPT(SceneScript, sceneTemplate->ScriptId, tmpscript);
2375 tmpscript->OnSceneComplete(player, sceneInstanceID, sceneTemplate);
2376}
2377
2378// Quest
2379void ScriptMgr::OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus)
2380{
2381 ASSERT(player);
2382 ASSERT(quest);
2383
2384 GET_SCRIPT(QuestScript, quest->GetScriptId(), tmpscript);
2385 tmpscript->OnQuestStatusChange(player, quest, oldStatus, newStatus);
2386}
2387
2389{
2390 ASSERT(player);
2391 ASSERT(quest);
2392
2393 GET_SCRIPT(QuestScript, quest->GetScriptId(), tmpscript);
2394 tmpscript->OnAcknowledgeAutoAccept(player, quest);
2395}
2396
2397void ScriptMgr::OnQuestObjectiveChange(Player* player, Quest const* quest, QuestObjective const& objective, int32 oldAmount, int32 newAmount)
2398{
2399 ASSERT(player);
2400 ASSERT(quest);
2401
2402 GET_SCRIPT(QuestScript, quest->GetScriptId(), tmpscript);
2403 tmpscript->OnQuestObjectiveChange(player, quest, objective, oldAmount, newAmount);
2404}
2405
2406// WorldState
2407void ScriptMgr::OnWorldStateValueChange(WorldStateTemplate const* worldStateTemplate, int32 oldValue, int32 newValue, Map const* map)
2408{
2409 ASSERT(worldStateTemplate);
2410
2411 GET_SCRIPT(WorldStateScript, worldStateTemplate->ScriptId, tmpscript);
2412 tmpscript->OnValueChange(worldStateTemplate->Id, oldValue, newValue, map);
2413}
2414
2415// Event
2417{
2418 ASSERT(invoker);
2419
2420 GET_SCRIPT(EventScript, sObjectMgr->GetEventScriptId(eventId), tmpscript);
2421 tmpscript->OnTrigger(object, invoker, eventId);
2422}
2423
2425 : ScriptObject(name)
2426{
2428}
2429
2431{
2432 return nullptr;
2433}
2434
2436{
2437 return nullptr;
2438}
2439
2441 : ScriptObject(name)
2442{
2443 ScriptRegistry<ServerScript>::Instance()->AddScript(this);
2444}
2445
2446ServerScript::~ServerScript() = default;
2447
2449{
2450}
2451
2453{
2454}
2455
2456void ServerScript::OnSocketOpen(std::shared_ptr<WorldSocket> /*socket*/)
2457{
2458}
2459
2460void ServerScript::OnSocketClose(std::shared_ptr<WorldSocket> /*socket*/)
2461{
2462}
2463
2465{
2466}
2467
2469{
2470}
2471
2473 : ScriptObject(name)
2474{
2475 ScriptRegistry<WorldScript>::Instance()->AddScript(this);
2476}
2477
2478WorldScript::~WorldScript() = default;
2479
2481{
2482}
2483
2484void WorldScript::OnConfigLoad(bool /*reload*/)
2485{
2486}
2487
2488void WorldScript::OnMotdChange(std::string& /*newMotd*/)
2489{
2490}
2491
2493{
2494}
2495
2497{
2498}
2499
2501{
2502}
2503
2505{
2506}
2507
2509{
2510}
2511
2513 : ScriptObject(name)
2514{
2515 ScriptRegistry<FormulaScript>::Instance()->AddScript(this);
2516}
2517
2519
2520void FormulaScript::OnHonorCalculation(float& /*honor*/, uint8 /*level*/, float /*multiplier*/)
2521{
2522}
2523
2524void FormulaScript::OnGrayLevelCalculation(uint8& /*grayLevel*/, uint8 /*playerLevel*/)
2525{
2526}
2527
2528void FormulaScript::OnColorCodeCalculation(XPColorChar& /*color*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/)
2529{
2530}
2531
2533{
2534}
2535
2536void FormulaScript::OnBaseGainCalculation(uint32& /*gain*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/)
2537{
2538}
2539
2540void FormulaScript::OnGainCalculation(uint32& /*gain*/, Player* /*player*/, Unit* /*unit*/)
2541{
2542}
2543
2544void FormulaScript::OnGroupRateCalculation(float& /*rate*/, uint32 /*count*/, bool /*isRaid*/)
2545{
2546}
2547
2548template <class TMap>
2549MapScript<TMap>::MapScript(MapEntry const* mapEntry) : _mapEntry(mapEntry)
2550{
2551}
2552
2553template <class TMap>
2555{
2556 return _mapEntry;
2557}
2558
2559template <class TMap>
2560void MapScript<TMap>::OnCreate(TMap* /*map*/)
2561{
2562}
2563
2564template <class TMap>
2566{
2567}
2568
2569template <class TMap>
2570void MapScript<TMap>::OnPlayerEnter(TMap* /*map*/, Player* /*player*/)
2571{
2572}
2573
2574template <class TMap>
2575void MapScript<TMap>::OnPlayerLeave(TMap* /*map*/, Player* /*player*/)
2576{
2577}
2578
2579template <class TMap>
2580void MapScript<TMap>::OnUpdate(TMap* /*map*/, uint32 /*diff*/)
2581{
2582}
2583
2587
2589 : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId))
2590{
2591 if (!GetEntry())
2592 TC_LOG_ERROR("scripts", "Invalid WorldMapScript for {}; no such map ID.", mapId);
2593
2594 if (GetEntry() && !GetEntry()->IsWorldMap())
2595 TC_LOG_ERROR("scripts", "WorldMapScript for map {} is invalid.", mapId);
2596
2598}
2599
2601
2603 : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId))
2604{
2605 if (!GetEntry())
2606 TC_LOG_ERROR("scripts", "Invalid InstanceMapScript for {}; no such map ID.", mapId);
2607
2608 if (GetEntry() && !GetEntry()->IsDungeon())
2609 TC_LOG_ERROR("scripts", "InstanceMapScript for map {} is invalid.", mapId);
2610
2612}
2613
2615
2617{
2618 return nullptr;
2619}
2620
2622 : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId))
2623{
2624 if (!GetEntry())
2625 TC_LOG_ERROR("scripts", "Invalid BattlegroundMapScript for {}; no such map ID.", mapId);
2626
2627 if (GetEntry() && !GetEntry()->IsBattleground())
2628 TC_LOG_ERROR("scripts", "BattlegroundMapScript for map {} is invalid.", mapId);
2629
2631}
2632
2634
2636{
2637 return nullptr;
2638}
2639
2640ItemScript::ItemScript(char const* name)
2641 : ScriptObject(name)
2642{
2643 ScriptRegistry<ItemScript>::Instance()->AddScript(this);
2644}
2645
2646ItemScript::~ItemScript() = default;
2647
2648bool ItemScript::OnQuestAccept(Player* /*player*/, Item* /*item*/, Quest const* /*quest*/)
2649{
2650 return false;
2651}
2652
2653bool ItemScript::OnUse(Player* /*player*/, Item* /*item*/, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/)
2654{
2655 return false;
2656}
2657
2658bool ItemScript::OnExpire(Player* /*player*/, ItemTemplate const* /*proto*/)
2659{
2660 return false;
2661}
2662
2663bool ItemScript::OnRemove(Player* /*player*/, Item* /*item*/)
2664{
2665 return false;
2666}
2667
2668bool ItemScript::OnCastItemCombatSpell(Player* /*player*/, Unit* /*victim*/, SpellInfo const* /*spellInfo*/, Item* /*item*/)
2669{
2670 return true;
2671}
2672
2673UnitScript::UnitScript(char const* name)
2674 : ScriptObject(name)
2675{
2676 ScriptRegistry<UnitScript>::Instance()->AddScript(this);
2677}
2678
2679UnitScript::~UnitScript() = default;
2680
2681void UnitScript::OnHeal(Unit* /*healer*/, Unit* /*reciever*/, uint32& /*gain*/)
2682{
2683}
2684
2685void UnitScript::OnDamage(Unit* /*attacker*/, Unit* /*victim*/, uint32& /*damage*/)
2686{
2687}
2688
2689void UnitScript::ModifyPeriodicDamageAurasTick(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/)
2690{
2691}
2692
2693void UnitScript::ModifyMeleeDamage(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/)
2694{
2695}
2696
2697void UnitScript::ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/, SpellInfo const* /*spellInfo*/)
2698{
2699}
2700
2702 : ScriptObject(name)
2703{
2705}
2706
2708
2710 : ScriptObject(name)
2711{
2713}
2714
2716
2718 : ScriptObject(name)
2719{
2721}
2722
2724
2725bool AreaTriggerScript::OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/)
2726{
2727 return false;
2728}
2729
2730bool AreaTriggerScript::OnExit(Player* /*player*/, AreaTriggerEntry const* /*trigger*/)
2731{
2732 return false;
2733}
2734
2736
2738{
2739 uint32 const triggerId = trigger->ID;
2740 InstanceScript* instance = player->GetInstanceScript();
2741 if (instance && instance->IsAreaTriggerDone(triggerId))
2742 return true;
2743
2744 if (TryHandleOnce(player, trigger) && instance)
2745 instance->MarkAreaTriggerDone(triggerId);
2746
2747 return true;
2748}
2750void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger) { if (InstanceScript* instance = player->GetInstanceScript()) ResetAreaTriggerDone(instance, trigger->ID); }
2751
2753 : ScriptObject(name)
2754{
2756}
2757
2759
2761 : ScriptObject(name)
2762{
2764}
2765
2767
2769 : ScriptObject(name)
2770{
2771 ScriptRegistry<CommandScript>::Instance()->AddScript(this);
2772}
2773
2775
2777 : ScriptObject(name)
2778{
2779 ScriptRegistry<WeatherScript>::Instance()->AddScript(this);
2780}
2781
2783
2784void WeatherScript::OnChange(Weather* /*weather*/, WeatherState /*state*/, float /*grade*/)
2785{
2786}
2787
2788void WeatherScript::OnUpdate(Weather* /*weather*/, uint32 /*diff*/)
2789{
2790}
2791
2793 : ScriptObject(name)
2794{
2796}
2797
2799
2801{
2802}
2803
2805{
2806}
2807
2809{
2810}
2811
2813{
2814}
2815
2817 : ScriptObject(name)
2818{
2820}
2821
2823
2824bool ConditionScript::OnConditionCheck(Condition const* /*condition*/, ConditionSourceInfo& /*sourceInfo*/)
2825{
2826 return true;
2827}
2828
2830 : ScriptObject(name)
2831{
2832 ScriptRegistry<VehicleScript>::Instance()->AddScript(this);
2833}
2834
2836
2838{
2839}
2840
2842{
2843}
2844
2846{
2847}
2848
2850{
2851}
2852
2853void VehicleScript::OnAddPassenger(Vehicle* /*veh*/, Unit* /*passenger*/, int8 /*seatId*/)
2854{
2855}
2856
2857void VehicleScript::OnRemovePassenger(Vehicle* /*veh*/, Unit* /*passenger*/)
2858{
2859}
2860
2862 : ScriptObject(name)
2863{
2865}
2866
2868
2870{
2871}
2872
2874 : ScriptObject(name)
2875{
2877}
2878
2880
2881void TransportScript::OnAddPassenger(Transport* /*transport*/, Player* /*player*/)
2882{
2883}
2884
2886{
2887}
2888
2889void TransportScript::OnRemovePassenger(Transport* /*transport*/, Player* /*player*/)
2890{
2891}
2892
2893void TransportScript::OnRelocate(Transport* /*transport*/, uint32 /*mapId*/, float /*x*/, float /*y*/, float /*z*/)
2894{
2895}
2896
2897void TransportScript::OnUpdate(Transport* /*transport*/, uint32 /*diff*/)
2898{
2899}
2900
2902 : ScriptObject(name)
2903{
2905}
2906
2908
2909void AchievementScript::OnCompleted(Player* /*player*/, AchievementEntry const* /*achievement*/)
2910{
2911}
2912
2914 : ScriptObject(name)
2915{
2917}
2918
2920
2922 : ScriptObject(name)
2923{
2924 ScriptRegistry<PlayerScript>::Instance()->AddScript(this);
2925}
2926
2927PlayerScript::~PlayerScript() = default;
2928
2929void PlayerScript::OnPVPKill(Player* /*killer*/, Player* /*killed*/)
2930{
2931}
2932
2933void PlayerScript::OnCreatureKill(Player* /*killer*/, Creature* /*killed*/)
2934{
2935}
2936
2938{
2939}
2940
2941void PlayerScript::OnLevelChanged(Player* /*player*/, uint8 /*oldLevel*/)
2942{
2943}
2944
2946{
2947}
2948
2949void PlayerScript::OnTalentsReset(Player* /*player*/, bool /*noCost*/)
2950{
2951}
2952
2953void PlayerScript::OnMoneyChanged(Player* /*player*/, int64& /*amount*/)
2954{
2955}
2956
2957void PlayerScript::OnMoneyLimit(Player* /*player*/, int64 /*amount*/)
2958{
2959}
2960
2961void PlayerScript::OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/)
2962{
2963}
2964
2965void PlayerScript::OnReputationChange(Player* /*player*/, uint32 /*factionId*/, int32& /*standing*/, bool /*incremental*/)
2966{
2967}
2968
2969void PlayerScript::OnDuelRequest(Player* /*target*/, Player* /*challenger*/)
2970{
2971}
2972
2973void PlayerScript::OnDuelStart(Player* /*player1*/, Player* /*player2*/)
2974{
2975}
2976
2977void PlayerScript::OnDuelEnd(Player* /*winner*/, Player* /*loser*/, DuelCompleteType /*type*/)
2978{
2979}
2980
2981void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/)
2982{
2983}
2984
2985void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Player* /*receiver*/)
2986{
2987}
2988
2989void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Group* /*group*/)
2990{
2991}
2992
2993void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Guild* /*guild*/)
2994{
2995}
2996
2997void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Channel* /*channel*/)
2998{
2999}
3000
3002{
3003}
3004
3005void PlayerScript::OnTextEmote(Player* /*player*/, uint32 /*textEmote*/, uint32 /*emoteNum*/, ObjectGuid /*guid*/)
3006{
3007}
3008
3009void PlayerScript::OnSpellCast(Player* /*player*/, Spell* /*spell*/, bool /*skipCheck*/)
3010{
3011}
3012
3013void PlayerScript::OnLogin(Player* /*player*/, bool /*firstLogin*/)
3014{
3015}
3016
3018{
3019}
3020
3022{
3023}
3024
3025void PlayerScript::OnDelete(ObjectGuid /*guid*/, uint32 /*accountId*/)
3026{
3027}
3028
3030{
3031}
3032
3034{
3035}
3036
3037void PlayerScript::OnBindToInstance(Player* /*player*/, Difficulty /*difficulty*/, uint32 /*mapId*/, bool /*permanent*/, uint8 /*extendState*/)
3038{
3039}
3040
3041void PlayerScript::OnUpdateZone(Player* /*player*/, uint32 /*newZone*/, uint32 /*newArea*/)
3042{
3043}
3044
3046{
3047}
3048
3050{
3051}
3052
3054{
3055}
3056
3057void PlayerScript::OnMovieComplete(Player* /*player*/, uint32 /*movieId*/)
3058{
3059}
3060
3061void PlayerScript::OnPlayerChoiceResponse(Player* /*player*/, uint32 /*choiceId*/, uint32 /*responseId*/)
3062{
3063}
3064
3066 : ScriptObject(name)
3067{
3068 ScriptRegistry<AccountScript>::Instance()->AddScript(this);
3069}
3070
3072
3074{
3075}
3076
3078{
3079}
3080
3082{
3083}
3084
3086{
3087}
3088
3090{
3091}
3092
3094{
3095}
3096
3098 : ScriptObject(name)
3099{
3100 ScriptRegistry<GuildScript>::Instance()->AddScript(this);
3101}
3102
3103GuildScript::~GuildScript() = default;
3104
3105void GuildScript::OnAddMember(Guild* /*guild*/, Player* /*player*/, uint8 /*plRank*/)
3106{
3107}
3108
3109void GuildScript::OnRemoveMember(Guild* /*guild*/, ObjectGuid /*guid*/, bool /*isDisbanding*/, bool /*isKicked*/)
3110{
3111}
3112
3113void GuildScript::OnMOTDChanged(Guild* /*guild*/, std::string const& /*newMotd*/)
3114{
3115}
3116
3117void GuildScript::OnInfoChanged(Guild* /*guild*/, std::string const& /*newInfo*/)
3118{
3119}
3120
3121void GuildScript::OnCreate(Guild* /*guild*/, Player* /*leader*/, std::string const& /*name*/)
3122{
3123}
3124
3126{
3127}
3128
3129void GuildScript::OnMemberWitdrawMoney(Guild* /*guild*/, Player* /*player*/, uint64& /*amount*/, bool /*isRepair*/)
3130{
3131}
3132
3133void GuildScript::OnMemberDepositMoney(Guild* /*guild*/, Player* /*player*/, uint64& /*amount*/)
3134{
3135}
3136
3137void GuildScript::OnItemMove(Guild* /*guild*/, Player* /*player*/, Item* /*pItem*/, bool /*isSrcBank*/, uint8 /*srcContainer*/, uint8 /*srcSlotId*/, bool /*isDestBank*/,
3138 uint8 /*destContainer*/, uint8 /*destSlotId*/)
3139{
3140}
3141
3142void GuildScript::OnEvent(Guild* /*guild*/, uint8 /*eventType*/, ObjectGuid::LowType /*playerGuid1*/, ObjectGuid::LowType /*playerGuid2*/, uint8 /*newRank*/)
3143{
3144}
3145
3146void GuildScript::OnBankEvent(Guild* /*guild*/, uint8 /*eventType*/, uint8 /*tabId*/, ObjectGuid::LowType /*playerGuid*/, uint64 /*itemOrMoney*/, uint16 /*itemStackCount*/,
3147 uint8 /*destTabId*/)
3148{
3149}
3150
3152 : ScriptObject(name)
3153{
3154 ScriptRegistry<GroupScript>::Instance()->AddScript(this);
3155}
3156
3157GroupScript::~GroupScript() = default;
3158
3160{
3161}
3162
3164{
3165}
3166
3167void GroupScript::OnRemoveMember(Group* /*group*/, ObjectGuid /*guid*/, RemoveMethod /*method*/, ObjectGuid /*kicker*/, char const* /*reason*/)
3168{
3169}
3170
3171void GroupScript::OnChangeLeader(Group* /*group*/, ObjectGuid /*newLeaderGuid*/, ObjectGuid /*oldLeaderGuid*/)
3172{
3173}
3174
3176{
3177}
3178
3180 : ScriptObject(name)
3181{
3183}
3184
3186
3188{
3189 return nullptr;
3190}
3191
3193 : ScriptObject(name)
3194{
3196}
3197
3199
3201{
3202 return nullptr;
3203}
3204
3206 : ScriptObject(name)
3207{
3208 ScriptRegistry<SceneScript>::Instance()->AddScript(this);
3209}
3210
3211SceneScript::~SceneScript() = default;
3212
3213void SceneScript::OnSceneStart(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/)
3214{
3215}
3216
3217void SceneScript::OnSceneTriggerEvent(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& /*triggerName*/)
3218{
3219}
3220
3221void SceneScript::OnSceneCancel(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/)
3222{
3223}
3224
3225void SceneScript::OnSceneComplete(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/)
3226{
3227}
3228
3230 : ScriptObject(name)
3231{
3232 ScriptRegistry<QuestScript>::Instance()->AddScript(this);
3233}
3234
3235QuestScript::~QuestScript() = default;
3236
3237void QuestScript::OnQuestStatusChange(Player* /*player*/, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus /*newStatus*/)
3238{
3239}
3240
3241void QuestScript::OnAcknowledgeAutoAccept(Player* /*player*/, Quest const* /*quest*/)
3242{
3243}
3244
3245void QuestScript::OnQuestObjectiveChange(Player* /*player*/, Quest const* /*quest*/, QuestObjective const& /*objective*/, int32 /*oldAmount*/, int32 /*newAmount*/)
3246{
3247}
3248
3250 : ScriptObject(name)
3251{
3253}
3254
3256
3257void WorldStateScript::OnValueChange(int32 /*worldStateId*/, int32 /*oldValue*/, int32 /*newValue*/, Map const* /*map*/)
3258{
3259}
3260
3262 : ScriptObject(name)
3263{
3264 ScriptRegistry<EventScript>::Instance()->AddScript(this);
3265}
3266
3267EventScript::~EventScript() = default;
3268
3269void EventScript::OnTrigger(WorldObject* /*object*/, WorldObject* /*invoker*/, uint32 /*eventId*/)
3270{
3271}
3272
3273// Specialize for each script type class like so:
#define sAchievementMgr
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
Difficulty
Definition: DBCEnums.h:918
@ DIFFICULTY_NONE
Definition: DBCEnums.h:919
#define TC_GAME_API
Definition: Define.h:123
uint8_t uint8
Definition: Define.h:144
int64_t int64
Definition: Define.h:137
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
#define ABORT_MSG
Definition: Errors.h:75
#define ABORT
Definition: Errors.h:74
#define WPAbort()
Definition: Errors.h:61
#define ASSERT
Definition: Errors.h:68
#define TC_LOG_ERROR(filterType__, message__,...)
Definition: Log.h:188
#define TC_LOG_INFO(filterType__, message__,...)
Definition: Log.h:182
#define sMapMgr
Definition: MapManager.h:186
@ TYPEID_UNIT
Definition: ObjectGuid.h:42
std::pair< SpellScriptsContainer::iterator, SpellScriptsContainer::iterator > SpellScriptsBounds
Definition: ObjectMgr.h:422
#define sObjectMgr
Definition: ObjectMgr.h:1995
#define sOutdoorPvPMgr
Spells
Definition: PlayerAI.cpp:32
QuestStatus
Definition: QuestDef.h:145
#define FOREACH_SCRIPT(T)
Definition: ScriptMgr.cpp:1254
@ SPELL_HOTSWAP_VISUAL_SPELL_EFFECT
Definition: ScriptMgr.cpp:147
#define SCR_MAP_END
Definition: ScriptMgr.cpp:1590
#define SCR_MAP_BGN(M, V, I, E, C, T)
Definition: ScriptMgr.cpp:1579
#define GET_SCRIPT_RET(T, I, V, R)
Definition: ScriptMgr.cpp:1264
#define GET_SCRIPT(T, I, V)
Definition: ScriptMgr.cpp:1259
#define SCR_REG_LST(T)
Definition: ScriptMgr.cpp:1239
#define sScriptRegistryCompositum
Definition: ScriptMgr.cpp:309
void CreateSpellOrAuraScripts(uint32 spellId, std::vector< T * > &scriptVector, T *(SpellScriptLoader::*extractor)() const, O *objectInvoker)
Definition: ScriptMgr.cpp:1424
#define FOR_SCRIPTS(T, C, E)
Definition: ScriptMgr.cpp:1242
#define sScriptMgr
Definition: ScriptMgr.h:1417
#define sScriptReloadMgr
#define sScriptSystemMgr
Definition: ScriptSystem.h:53
XPColorChar
DuelCompleteType
RemoveMethod
void AddSC_SmartScripts()
Registers scripts required by the SAI scripting system.
Definition: SmartAI.cpp:1259
#define sSpellMgr
Definition: SpellMgr.h:861
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:57
uint32 getMSTime()
Definition: Timer.h:33
@ UNIT_STATE_EVADE
Definition: Unit.h:279
virtual void OnFailedEmailChange(uint32 accountId)
Definition: ScriptMgr.cpp:3085
virtual void OnPasswordChange(uint32 accountId)
Definition: ScriptMgr.cpp:3089
virtual void OnEmailChange(uint32 accountId)
Definition: ScriptMgr.cpp:3081
virtual void OnFailedAccountLogin(uint32 accountId)
Definition: ScriptMgr.cpp:3077
virtual void OnFailedPasswordChange(uint32 accountId)
Definition: ScriptMgr.cpp:3093
virtual void OnAccountLogin(uint32 accountId)
Definition: ScriptMgr.cpp:3073
AccountScript(char const *name)
Definition: ScriptMgr.cpp:3065
AchievementCriteriaScript(char const *name)
Definition: ScriptMgr.cpp:2913
AchievementScript(char const *name)
Definition: ScriptMgr.cpp:2901
virtual void OnCompleted(Player *player, AchievementEntry const *achievement)
Definition: ScriptMgr.cpp:2909
virtual void OnCreate(Spell const *creatingSpell)
Definition: AreaTriggerAI.h:42
virtual void OnRemove()
Definition: AreaTriggerAI.h:60
virtual AreaTriggerAI * GetAI(AreaTrigger *at) const
Definition: ScriptMgr.cpp:3187
AreaTriggerEntityScript(char const *name)
Definition: ScriptMgr.cpp:3179
virtual bool OnExit(Player *player, AreaTriggerEntry const *trigger)
Definition: ScriptMgr.cpp:2730
AreaTriggerScript(char const *name)
Definition: ScriptMgr.cpp:2717
virtual bool OnTrigger(Player *player, AreaTriggerEntry const *trigger)
Definition: ScriptMgr.cpp:2725
AreaTriggerAI * AI()
Definition: AreaTrigger.h:74
void AI_Destroy()
uint32 GetScriptId() const
void AI_Initialize()
virtual void OnAuctionAdd(AuctionHouseObject *ah, AuctionPosting *auction)
Definition: ScriptMgr.cpp:2800
virtual void OnAuctionRemove(AuctionHouseObject *ah, AuctionPosting *auction)
Definition: ScriptMgr.cpp:2804
virtual void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionPosting *auction)
Definition: ScriptMgr.cpp:2808
virtual void OnAuctionExpire(AuctionHouseObject *ah, AuctionPosting *auction)
Definition: ScriptMgr.cpp:2812
AuctionHouseScript(char const *name)
Definition: ScriptMgr.cpp:2792
BattlefieldScript(char const *name)
Definition: ScriptMgr.cpp:2752
virtual BattlegroundScript * GetBattlegroundScript(BattlegroundMap *map) const
Definition: ScriptMgr.cpp:2635
BattlegroundMapScript(char const *name, uint32 mapId)
Definition: ScriptMgr.cpp:2621
uint32 GetScriptId() const
Definition: Map.h:954
CommandScript(char const *name)
Definition: ScriptMgr.cpp:2768
virtual bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
Definition: ScriptMgr.cpp:2824
ConditionScript(char const *name)
Definition: ScriptMgr.cpp:2816
virtual void OnCreate(Unit *creator)
virtual void OnRemove()
virtual ConversationAI * GetAI(Conversation *conversation) const
Definition: ScriptMgr.cpp:3200
ConversationScript(char const *name)
Definition: ScriptMgr.cpp:3192
uint32 GetScriptId() const
void AI_Initialize()
ConversationAI * AI()
Definition: Conversation.h:92
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:218
void Visit(std::unordered_map< ObjectGuid, ObjectType * > &objects)
Definition: ScriptMgr.cpp:397
This hook is responsible for swapping Creature, GameObject and AreaTrigger AI's.
Definition: ScriptMgr.cpp:388
void BeforeSwapContext(bool initialize) override
Called before SwapContext.
Definition: ScriptMgr.cpp:735
void BeforeUnload() final override
Called before Unload.
Definition: ScriptMgr.cpp:753
static auto VisitObjectsToSwapOnMap(std::unordered_set< uint32 > const &idsToRemove)
Definition: ScriptMgr.cpp:599
static Creature * GetEntityFromMap(std::common_type< Creature >, Map *map, ObjectGuid const &guid)
Definition: ScriptMgr.cpp:579
static void LoadResetScript(Conversation *conversation)
Definition: ScriptMgr.cpp:574
static AreaTrigger * GetEntityFromMap(std::common_type< AreaTrigger >, Map *map, ObjectGuid const &guid)
Definition: ScriptMgr.cpp:589
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:726
static void UnloadResetScript(Conversation *conversation)
Definition: ScriptMgr.cpp:489
static void LoadInitializeScript(Conversation *conversation)
Definition: ScriptMgr.cpp:566
void OnScriptNamesSync() final override
Called manually to sync scriptnames.
Definition: ScriptMgr.cpp:758
static void UnloadDestroyScript(Conversation *conversation)
Definition: ScriptMgr.cpp:498
static GameObject * GetEntityFromMap(std::common_type< GameObject >, Map *map, ObjectGuid const &guid)
Definition: ScriptMgr.cpp:584
static Conversation * GetEntityFromMap(std::common_type< Conversation >, Map *map, ObjectGuid const &guid)
Definition: ScriptMgr.cpp:594
CreatureScript(char const *name)
Definition: ScriptMgr.cpp:2701
bool AIM_Destroy()
Definition: Creature.cpp:1055
uint32 GetScriptId() const
Definition: Creature.cpp:3166
bool AIM_Create(CreatureAI *ai=nullptr)
Definition: Creature.cpp:1062
CreatureAI * AI() const
Definition: Creature.h:228
virtual void OnUpdate(DynamicObject *obj, uint32 diff)
Definition: ScriptMgr.cpp:2869
DynamicObjectScript(char const *name)
Definition: ScriptMgr.cpp:2861
void KillAllEvents(bool force)
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
virtual void OnTrigger(WorldObject *object, WorldObject *invoker, uint32 eventId)
Definition: ScriptMgr.cpp:3269
EventScript(char const *name)
Definition: ScriptMgr.cpp:3261
FormulaScript(char const *name)
Definition: ScriptMgr.cpp:2512
virtual void OnBaseGainCalculation(uint32 &gain, uint8 playerLevel, uint8 mobLevel)
Definition: ScriptMgr.cpp:2536
virtual void OnGrayLevelCalculation(uint8 &grayLevel, uint8 playerLevel)
Definition: ScriptMgr.cpp:2524
virtual void OnGroupRateCalculation(float &rate, uint32 count, bool isRaid)
Definition: ScriptMgr.cpp:2544
virtual void OnZeroDifferenceCalculation(uint8 &diff, uint8 playerLevel)
Definition: ScriptMgr.cpp:2532
virtual void OnHonorCalculation(float &honor, uint8 level, float multiplier)
Definition: ScriptMgr.cpp:2520
virtual void OnGainCalculation(uint32 &gain, Player *player, Unit *unit)
Definition: ScriptMgr.cpp:2540
virtual void OnColorCodeCalculation(XPColorChar &color, uint8 playerLevel, uint8 mobLevel)
Definition: ScriptMgr.cpp:2528
virtual void Reset()
Definition: GameObjectAI.h:63
GameObjectScript(char const *name)
Definition: ScriptMgr.cpp:2709
GameObjectAI * AI() const
Definition: GameObject.h:383
bool AIM_Initialize()
Definition: GameObject.cpp:884
uint32 GetScriptId() const
void AIM_Destroy()
Definition: GameObject.cpp:878
GroupScript(char const *name)
Definition: ScriptMgr.cpp:3151
virtual void OnAddMember(Group *group, ObjectGuid guid)
Definition: ScriptMgr.cpp:3159
virtual void OnChangeLeader(Group *group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid)
Definition: ScriptMgr.cpp:3171
virtual void OnInviteMember(Group *group, ObjectGuid guid)
Definition: ScriptMgr.cpp:3163
virtual void OnDisband(Group *group)
Definition: ScriptMgr.cpp:3175
virtual void OnRemoveMember(Group *group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const *reason)
Definition: ScriptMgr.cpp:3167
Definition: Group.h:205
virtual void OnMemberDepositMoney(Guild *guild, Player *player, uint64 &amount)
Definition: ScriptMgr.cpp:3133
virtual void OnEvent(Guild *guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
Definition: ScriptMgr.cpp:3142
virtual void OnMemberWitdrawMoney(Guild *guild, Player *player, uint64 &amount, bool isRepair)
Definition: ScriptMgr.cpp:3129
virtual void OnItemMove(Guild *guild, Player *player, Item *pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId, bool isDestBank, uint8 destContainer, uint8 destSlotId)
Definition: ScriptMgr.cpp:3137
virtual void OnInfoChanged(Guild *guild, std::string const &newInfo)
Definition: ScriptMgr.cpp:3117
virtual void OnMOTDChanged(Guild *guild, std::string const &newMotd)
Definition: ScriptMgr.cpp:3113
virtual void OnCreate(Guild *guild, Player *leader, std::string const &name)
Definition: ScriptMgr.cpp:3121
virtual void OnDisband(Guild *guild)
Definition: ScriptMgr.cpp:3125
virtual void OnRemoveMember(Guild *guild, ObjectGuid guid, bool isDisbanding, bool isKicked)
Definition: ScriptMgr.cpp:3109
GuildScript(char const *name)
Definition: ScriptMgr.cpp:3097
virtual void OnBankEvent(Guild *guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
Definition: ScriptMgr.cpp:3146
virtual void OnAddMember(Guild *guild, Player *player, uint8 plRank)
Definition: ScriptMgr.cpp:3105
Definition: Guild.h:329
virtual InstanceScript * GetInstanceScript(InstanceMap *map) const
Definition: ScriptMgr.cpp:2616
InstanceMapScript(char const *name, uint32 mapId)
Definition: ScriptMgr.cpp:2602
uint32 GetScriptId() const
Definition: Map.h:902
bool IsAreaTriggerDone(uint32 id) const
void MarkAreaTriggerDone(uint32 id)
void ResetAreaTriggerDone(uint32 id)
virtual bool OnRemove(Player *player, Item *item)
Definition: ScriptMgr.cpp:2663
virtual bool OnQuestAccept(Player *player, Item *item, Quest const *quest)
Definition: ScriptMgr.cpp:2648
virtual bool OnUse(Player *player, Item *item, SpellCastTargets const &targets, ObjectGuid castId)
Definition: ScriptMgr.cpp:2653
virtual bool OnCastItemCombatSpell(Player *player, Unit *victim, SpellInfo const *spellInfo, Item *item)
Definition: ScriptMgr.cpp:2668
virtual bool OnExpire(Player *player, ItemTemplate const *proto)
Definition: ScriptMgr.cpp:2658
ItemScript(char const *name)
Definition: ScriptMgr.cpp:2640
Definition: Item.h:171
uint32 GetScriptId() const
Definition: Item.h:404
virtual void OnCreate(TMap *map)
Definition: ScriptMgr.cpp:2560
MapScript(MapEntry const *mapEntry)
Definition: ScriptMgr.cpp:2549
MapEntry const * GetEntry() const
Definition: ScriptMgr.cpp:2554
virtual void OnDestroy(TMap *map)
Definition: ScriptMgr.cpp:2565
virtual void OnUpdate(TMap *map, uint32 diff)
Definition: ScriptMgr.cpp:2580
virtual void OnPlayerEnter(TMap *map, Player *player)
Definition: ScriptMgr.cpp:2570
virtual void OnPlayerLeave(TMap *map, Player *player)
Definition: ScriptMgr.cpp:2575
Definition: Map.h:222
MapStoredObjectTypesContainer & GetObjectsStore()
Definition: Map.h:455
GameObject * GetGameObject(ObjectGuid const &guid)
Definition: Map.cpp:3507
Conversation * GetConversation(ObjectGuid const &guid)
Definition: Map.cpp:3482
AreaTrigger * GetAreaTrigger(ObjectGuid const &guid)
Definition: Map.cpp:3472
Creature * GetCreature(ObjectGuid const &guid)
Definition: Map.cpp:3497
uint64 LowType
Definition: ObjectGuid.h:281
static Creature * ToCreature(Object *o)
Definition: Object.h:255
TypeID GetTypeId() const
Definition: Object.h:209
bool OnTrigger(Player *player, AreaTriggerEntry const *trigger) final
Definition: ScriptMgr.cpp:2737
virtual bool TryHandleOnce(Player *player, AreaTriggerEntry const *trigger)=0
void ResetAreaTriggerDone(InstanceScript *instance, uint32 triggerId)
Definition: ScriptMgr.cpp:2749
OutdoorPvPScript(char const *name)
Definition: ScriptMgr.cpp:2760
virtual void OnReputationChange(Player *player, uint32 factionId, int32 &standing, bool incremental)
Definition: ScriptMgr.cpp:2965
virtual void OnLevelChanged(Player *player, uint8 oldLevel)
Definition: ScriptMgr.cpp:2941
virtual void OnDuelRequest(Player *target, Player *challenger)
Definition: ScriptMgr.cpp:2969
virtual void OnMovieComplete(Player *player, uint32 movieId)
Definition: ScriptMgr.cpp:3057
virtual void OnClearEmote(Player *player)
Definition: ScriptMgr.cpp:3001
virtual void OnTalentsReset(Player *player, bool noCost)
Definition: ScriptMgr.cpp:2949
virtual void OnFreeTalentPointsChanged(Player *player, uint32 points)
Definition: ScriptMgr.cpp:2945
virtual void OnSpellCast(Player *player, Spell *spell, bool skipCheck)
Definition: ScriptMgr.cpp:3009
virtual void OnPVPKill(Player *killer, Player *killed)
Definition: ScriptMgr.cpp:2929
virtual void OnMapChanged(Player *player)
Definition: ScriptMgr.cpp:3045
virtual void OnGiveXP(Player *player, uint32 &amount, Unit *victim)
Definition: ScriptMgr.cpp:2961
virtual void OnChat(Player *player, uint32 type, uint32 lang, std::string &msg)
Definition: ScriptMgr.cpp:2981
virtual void OnCreatureKill(Player *killer, Creature *killed)
Definition: ScriptMgr.cpp:2933
virtual void OnLogout(Player *player)
Definition: ScriptMgr.cpp:3017
virtual void OnSave(Player *player)
Definition: ScriptMgr.cpp:3033
virtual void OnLogin(Player *player, bool firstLogin)
Definition: ScriptMgr.cpp:3013
virtual void OnDelete(ObjectGuid guid, uint32 accountId)
Definition: ScriptMgr.cpp:3025
PlayerScript(char const *name)
Definition: ScriptMgr.cpp:2921
virtual void OnQuestStatusChange(Player *player, uint32 questId)
Definition: ScriptMgr.cpp:3049
virtual void OnPlayerRepop(Player *player)
Definition: ScriptMgr.cpp:3053
virtual void OnPlayerKilledByCreature(Creature *killer, Player *killed)
Definition: ScriptMgr.cpp:2937
virtual void OnBindToInstance(Player *player, Difficulty difficulty, uint32 mapId, bool permanent, uint8 extendState)
Definition: ScriptMgr.cpp:3037
virtual void OnDuelStart(Player *player1, Player *player2)
Definition: ScriptMgr.cpp:2973
virtual void OnUpdateZone(Player *player, uint32 newZone, uint32 newArea)
Definition: ScriptMgr.cpp:3041
virtual void OnCreate(Player *player)
Definition: ScriptMgr.cpp:3021
virtual void OnPlayerChoiceResponse(Player *player, uint32 choiceId, uint32 responseId)
Definition: ScriptMgr.cpp:3061
virtual void OnMoneyLimit(Player *player, int64 amount)
Definition: ScriptMgr.cpp:2957
virtual void OnFailedDelete(ObjectGuid guid, uint32 accountId)
Definition: ScriptMgr.cpp:3029
virtual void OnDuelEnd(Player *winner, Player *loser, DuelCompleteType type)
Definition: ScriptMgr.cpp:2977
virtual void OnTextEmote(Player *player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
Definition: ScriptMgr.cpp:3005
virtual void OnMoneyChanged(Player *player, int64 &amount)
Definition: ScriptMgr.cpp:2953
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition: Player.h:2482
virtual void OnAcknowledgeAutoAccept(Player *player, Quest const *quest)
Definition: ScriptMgr.cpp:3241
virtual void OnQuestObjectiveChange(Player *player, Quest const *quest, QuestObjective const &objective, int32 oldAmount, int32 newAmount)
Definition: ScriptMgr.cpp:3245
QuestScript(char const *name)
Definition: ScriptMgr.cpp:3229
virtual void OnQuestStatusChange(Player *player, Quest const *quest, QuestStatus oldStatus, QuestStatus newStatus)
Definition: ScriptMgr.cpp:3237
uint32 GetScriptId() const
Definition: QuestDef.h:690
SceneScript(char const *name)
Definition: ScriptMgr.cpp:3205
virtual void OnSceneTriggerEvent(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate, std::string const &triggerName)
Definition: ScriptMgr.cpp:3217
virtual void OnSceneStart(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
Definition: ScriptMgr.cpp:3213
virtual void OnSceneCancel(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
Definition: ScriptMgr.cpp:3221
virtual void OnSceneComplete(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
Definition: ScriptMgr.cpp:3225
void NotifyScriptIDUpdate()
Inform the ScriptMgr that an entity has a changed script id.
Definition: ScriptMgr.cpp:1355
void OnAuctionRemove(AuctionHouseObject *ah, AuctionPosting *auction)
Definition: ScriptMgr.cpp:1863
void OnPlayerDelete(ObjectGuid guid, uint32 accountId)
Definition: ScriptMgr.cpp:2151
void OnSceneTrigger(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate, std::string const &triggerName)
Definition: ScriptMgr.cpp:2351
void OnPlayerLogin(Player *player, bool firstLogin)
Definition: ScriptMgr.cpp:2136
void OnPlayerCreate(Player *player)
Definition: ScriptMgr.cpp:2146
void OnEmailChange(uint32 accountId)
Definition: ScriptMgr.cpp:2207
void OnPlayerTalentsReset(Player *player, bool noCost)
Definition: ScriptMgr.cpp:2056
std::shared_ptr< ModuleReference > AcquireModuleReferenceOfScriptName(std::string const &scriptname) const
Definition: ScriptMgr.cpp:1392
void CreateSpellScripts(uint32 spellId, std::vector< SpellScript * > &scriptVector, Spell *invoker) const
Definition: ScriptMgr.cpp:1452
void OnOpenStateChange(bool open)
Definition: ScriptMgr.cpp:1511
void OnShutdownCancel()
Definition: ScriptMgr.cpp:1531
void OnMovieComplete(Player *player, uint32 movieId)
Definition: ScriptMgr.cpp:2186
void OnBaseGainCalculation(uint32 &gain, uint8 playerLevel, uint8 mobLevel)
Definition: ScriptMgr.cpp:1561
void OnShutdown()
Definition: ScriptMgr.cpp:2006
void OnPlayerFreeTalentPointsChanged(Player *player, uint32 newPoints)
Definition: ScriptMgr.cpp:2051
bool CanCreateCreatureAI(uint32 scriptId) const
Definition: ScriptMgr.cpp:1753
void ModifyPeriodicDamageAurasTick(Unit *target, Unit *attacker, uint32 &damage)
Definition: ScriptMgr.cpp:2326
void ModifySpellDamageTaken(Unit *target, Unit *attacker, int32 &damage, SpellInfo const *spellInfo)
Definition: ScriptMgr.cpp:2336
bool OnQuestAccept(Player *player, Item *item, Quest const *quest)
Definition: ScriptMgr.cpp:1704
void OnQuestStatusChange(Player *player, uint32 questId)
Definition: ScriptMgr.cpp:2176
void OnHonorCalculation(float &honor, uint8 level, float multiplier)
Definition: ScriptMgr.cpp:1541
void OnPlayerBindToInstance(Player *player, Difficulty difficulty, uint32 mapid, bool permanent, uint8 extendState)
Definition: ScriptMgr.cpp:2166
void FillSpellSummary()
Definition: ScriptMgr.cpp:1418
void OnGroupInviteMember(Group *group, ObjectGuid guid)
Definition: ScriptMgr.cpp:2291
void OnGuildRemoveMember(Guild *guild, ObjectGuid guid, bool isDisbanding, bool isKicked)
Definition: ScriptMgr.cpp:2233
bool _scriptIdUpdated
Definition: ScriptMgr.h:1300
void OnDestroyMap(Map *map)
Definition: ScriptMgr.cpp:1613
void OnPacketSend(WorldSession *session, WorldPacket const &packet)
Definition: ScriptMgr.cpp:1500
void OnGrayLevelCalculation(uint8 &grayLevel, uint8 playerLevel)
Definition: ScriptMgr.cpp:1546
void OnGroupRemoveMember(Group *group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const *reason)
Definition: ScriptMgr.cpp:2297
void OnAchievementCompleted(Player *player, AchievementEntry const *achievement)
Definition: ScriptMgr.cpp:2012
void SwapScriptContext(bool initialize=false)
Definition: ScriptMgr.cpp:1374
uint32 GetScriptCount() const
Definition: ScriptMgr.h:1015
void OnHeal(Unit *healer, Unit *reciever, uint32 &gain)
Definition: ScriptMgr.cpp:2316
void OnUninstall(Vehicle *veh)
Definition: ScriptMgr.cpp:1904
void OnPlayerLeaveMap(Map *map, Player *player)
Definition: ScriptMgr.cpp:1650
void OnSceneComplete(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
Definition: ScriptMgr.cpp:2369
void OnGuildAddMember(Guild *guild, Player *player, uint8 plRank)
Definition: ScriptMgr.cpp:2228
void OnDynamicObjectUpdate(DynamicObject *dynobj, uint32 diff)
Definition: ScriptMgr.cpp:1952
void OnGuildDisband(Guild *guild)
Definition: ScriptMgr.cpp:2253
bool OnCriteriaCheck(uint32 scriptId, Player *source, Unit *target)
Definition: ScriptMgr.cpp:2021
void SyncScripts()
Synchronize all scripts with their current ids.
Definition: ScriptMgr.cpp:1360
void OnGuildBankEvent(Guild *guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
Definition: ScriptMgr.cpp:2279
void OnAccountLogin(uint32 accountId)
Definition: ScriptMgr.cpp:2197
void OnRemovePassenger(Vehicle *veh, Unit *passenger)
Definition: ScriptMgr.cpp:1942
void OnFailedPasswordChange(uint32 accountId)
Definition: ScriptMgr.cpp:2222
void Initialize()
Definition: ScriptMgr.cpp:1297
void OnPlayerChat(Player *player, uint32 type, uint32 lang, std::string &msg)
Definition: ScriptMgr.cpp:2096
void OnPlayerMoneyChanged(Player *player, int64 &amount)
Definition: ScriptMgr.cpp:2061
void ModifyMeleeDamage(Unit *target, Unit *attacker, uint32 &damage)
Definition: ScriptMgr.cpp:2331
static std::string const & GetNameOfStaticContext()
Returns the context name of the static context provided by the worldserver.
Definition: ScriptMgr.cpp:1380
void OnMotdChange(std::string &newMotd)
Definition: ScriptMgr.cpp:1521
void OnGuildItemMove(Guild *guild, Player *player, Item *pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId, bool isDestBank, uint8 destContainer, uint8 destSlotId)
Definition: ScriptMgr.cpp:2268
void OnTransportUpdate(Transport *transport, uint32 diff)
Definition: ScriptMgr.cpp:1987
void OnGroupChangeLeader(Group *group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid)
Definition: ScriptMgr.cpp:2303
SpellScriptLoader * GetSpellScriptLoader(uint32 scriptId)
Definition: ScriptMgr.cpp:1462
void OnPlayerChoiceResponse(Player *player, uint32 choiceId, uint32 responseId)
Definition: ScriptMgr.cpp:2191
void OnPlayerDuelEnd(Player *winner, Player *loser, DuelCompleteType type)
Definition: ScriptMgr.cpp:2091
void OnFailedEmailChange(uint32 accountId)
Definition: ScriptMgr.cpp:2212
void OnPlayerReputationChange(Player *player, uint32 factionID, int32 &standing, bool incremental)
Definition: ScriptMgr.cpp:2076
void OnPlayerFailedDelete(ObjectGuid guid, uint32 accountId)
Definition: ScriptMgr.cpp:2156
void OnPlayerSpellCast(Player *player, Spell *spell, bool skipCheck)
Definition: ScriptMgr.cpp:2131
void OnPVPKill(Player *killer, Player *killed)
Definition: ScriptMgr.cpp:2031
void OnWorldUpdate(uint32 diff)
Definition: ScriptMgr.cpp:1536
void OnGroupRateCalculation(float &rate, uint32 count, bool isRaid)
Definition: ScriptMgr.cpp:1574
Battlefield * CreateBattlefield(uint32 scriptId, Map *map)
Definition: ScriptMgr.cpp:1814
bool OnAreaTrigger(Player *player, AreaTriggerEntry const *trigger, bool entered)
Definition: ScriptMgr.cpp:1792
GameObjectAI * GetGameObjectAI(GameObject *go)
Definition: ScriptMgr.cpp:1771
bool CanCreateGameObjectAI(uint32 scriptId) const
Definition: ScriptMgr.cpp:1766
void OnRelocate(Transport *transport, uint32 mapId, float x, float y, float z)
Definition: ScriptMgr.cpp:1995
void OnSocketOpen(std::shared_ptr< WorldSocket > socket)
Definition: ScriptMgr.cpp:1477
BattlegroundScript * CreateBattlegroundData(BattlegroundMap *map)
Definition: ScriptMgr.cpp:1696
std::vector< Trinity::ChatCommands::ChatCommandBuilder > GetChatCommands()
Definition: ScriptMgr.cpp:1826
OutdoorPvP * CreateOutdoorPvP(uint32 scriptId, Map *map)
Definition: ScriptMgr.cpp:1820
void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionPosting *auction)
Definition: ScriptMgr.cpp:1871
ConversationAI * GetConversationAI(Conversation *conversation)
Definition: ScriptMgr.cpp:1806
void OnNetworkStop()
Definition: ScriptMgr.cpp:1472
void OnPlayerClearEmote(Player *player)
Definition: ScriptMgr.cpp:2121
void OnReset(Vehicle *veh)
Definition: ScriptMgr.cpp:1913
void Unload()
Definition: ScriptMgr.cpp:1406
void OnQuestObjectiveChange(Player *player, Quest const *quest, QuestObjective const &objective, int32 oldAmount, int32 newAmount)
Definition: ScriptMgr.cpp:2397
void OnGroupAddMember(Group *group, ObjectGuid guid)
Definition: ScriptMgr.cpp:2285
void OnGroupDisband(Group *group)
Definition: ScriptMgr.cpp:2309
void OnZeroDifferenceCalculation(uint8 &diff, uint8 playerLevel)
Definition: ScriptMgr.cpp:1556
std::string _currentContext
Definition: ScriptMgr.h:1304
void SetScriptContext(std::string const &context)
Definition: ScriptMgr.cpp:1369
void OnInstallAccessory(Vehicle *veh, Creature *accessory)
Definition: ScriptMgr.cpp:1922
void OnGuildMOTDChanged(Guild *guild, const std::string &newMotd)
Definition: ScriptMgr.cpp:2238
ScriptLoaderCallbackType _script_loader_callback
Definition: ScriptMgr.h:1302
void OnDamage(Unit *attacker, Unit *victim, uint32 &damage)
Definition: ScriptMgr.cpp:2321
void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask)
Definition: ScriptMgr.cpp:1526
void OnGuildInfoChanged(Guild *guild, const std::string &newInfo)
Definition: ScriptMgr.cpp:2243
void OnPlayerKilledByCreature(Creature *killer, Player *killed)
Definition: ScriptMgr.cpp:2041
void OnGainCalculation(uint32 &gain, Player *player, Unit *unit)
Definition: ScriptMgr.cpp:1566
bool OnItemUse(Player *player, Item *item, SpellCastTargets const &targets, ObjectGuid castId)
Definition: ScriptMgr.cpp:1715
void OnPlayerLevelChanged(Player *player, uint8 oldLevel)
Definition: ScriptMgr.cpp:2046
void OnPlayerSave(Player *player)
Definition: ScriptMgr.cpp:2161
void OnPlayerMoneyLimit(Player *player, int64 amount)
Definition: ScriptMgr.cpp:2066
void OnSocketClose(std::shared_ptr< WorldSocket > socket)
Definition: ScriptMgr.cpp:1484
bool CanCreateConversationAI(uint32 scriptId) const
Definition: ScriptMgr.cpp:1801
void OnSceneCancel(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
Definition: ScriptMgr.cpp:2360
void OnGuildMemberDepositMoney(Guild *guild, Player *player, uint64 &amount)
Definition: ScriptMgr.cpp:2263
void OnPlayerLogout(Player *player)
Definition: ScriptMgr.cpp:2141
void OnGivePlayerXP(Player *player, uint32 &amount, Unit *victim)
Definition: ScriptMgr.cpp:2071
void OnPlayerDuelRequest(Player *target, Player *challenger)
Definition: ScriptMgr.cpp:2081
void OnConfigLoad(bool reload)
Definition: ScriptMgr.cpp:1516
void OnWorldStateValueChange(WorldStateTemplate const *worldStateTemplate, int32 oldValue, int32 newValue, Map const *map)
Definition: ScriptMgr.cpp:2407
void OnMapUpdate(Map *map, uint32 diff)
Definition: ScriptMgr.cpp:1668
CreatureAI * GetCreatureAI(Creature *creature)
Definition: ScriptMgr.cpp:1758
void LoadDatabase()
Definition: ScriptMgr.cpp:1413
void OnPlayerTextEmote(Player *player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
Definition: ScriptMgr.cpp:2126
void OnPlayerEnterMap(Map *map, Player *player)
Definition: ScriptMgr.cpp:1630
void OnInstall(Vehicle *veh)
Definition: ScriptMgr.cpp:1895
InstanceScript * CreateInstanceData(InstanceMap *map)
Definition: ScriptMgr.cpp:1688
void ReleaseScriptContext(std::string const &context)
Definition: ScriptMgr.cpp:1386
void OnGuildEvent(Guild *guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
Definition: ScriptMgr.cpp:2274
void CreateAuraScripts(uint32 spellId, std::vector< AuraScript * > &scriptVector, Aura *invoker) const
Definition: ScriptMgr.cpp:1457
void OnWeatherUpdate(Weather *weather, uint32 diff)
Definition: ScriptMgr.cpp:1847
void OnColorCodeCalculation(XPColorChar &color, uint8 playerLevel, uint8 mobLevel)
Definition: ScriptMgr.cpp:1551
bool OnCastItemCombatSpell(Player *player, Unit *victim, SpellInfo const *spellInfo, Item *item)
Definition: ScriptMgr.cpp:1742
void OnPlayerUpdateZone(Player *player, uint32 newZone, uint32 newArea)
Definition: ScriptMgr.cpp:2171
bool OnItemRemove(Player *player, Item *item)
Definition: ScriptMgr.cpp:1733
void OnFailedAccountLogin(uint32 accountId)
Definition: ScriptMgr.cpp:2202
bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
Definition: ScriptMgr.cpp:1887
void OnStartup()
Definition: ScriptMgr.cpp:2001
void OnEventTrigger(WorldObject *object, WorldObject *invoker, uint32 eventId)
Definition: ScriptMgr.cpp:2416
void OnPacketReceive(WorldSession *session, WorldPacket const &packet)
Definition: ScriptMgr.cpp:1491
AreaTriggerAI * GetAreaTriggerAI(AreaTrigger *areaTrigger)
Definition: ScriptMgr.cpp:1784
void OnCreatureKill(Player *killer, Creature *killed)
Definition: ScriptMgr.cpp:2036
void OnAuctionExpire(AuctionHouseObject *ah, AuctionPosting *auction)
Definition: ScriptMgr.cpp:1879
void OnGuildCreate(Guild *guild, Player *leader, const std::string &name)
Definition: ScriptMgr.cpp:2248
void OnAddCreaturePassenger(Transport *transport, Creature *creature)
Definition: ScriptMgr.cpp:1969
void OnPlayerDuelStart(Player *player1, Player *player2)
Definition: ScriptMgr.cpp:2086
void OnGuildMemberWitdrawMoney(Guild *guild, Player *player, uint64 &amount, bool isRepair)
Definition: ScriptMgr.cpp:2258
void OnPasswordChange(uint32 accountId)
Definition: ScriptMgr.cpp:2217
void OnNetworkStart()
Definition: ScriptMgr.cpp:1467
void OnWeatherChange(Weather *weather, WeatherState state, float grade)
Definition: ScriptMgr.cpp:1839
void OnSceneStart(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
Definition: ScriptMgr.cpp:2342
bool OnItemExpire(Player *player, ItemTemplate const *proto)
Definition: ScriptMgr.cpp:1724
void OnQuestAcknowledgeAutoAccept(Player *player, Quest const *quest)
Definition: ScriptMgr.cpp:2388
void OnCreateMap(Map *map)
Definition: ScriptMgr.cpp:1596
void OnAuctionAdd(AuctionHouseObject *ah, AuctionPosting *auction)
Definition: ScriptMgr.cpp:1855
void OnAddPassenger(Vehicle *veh, Unit *passenger, int8 seatId)
Definition: ScriptMgr.cpp:1932
void OnPlayerRepop(Player *player)
Definition: ScriptMgr.cpp:2181
bool CanCreateAreaTriggerAI(uint32 scriptId) const
Definition: ScriptMgr.cpp:1779
static ScriptMgr * instance()
Definition: ScriptMgr.cpp:1291
virtual ~ScriptObject()
Definition: ScriptMgr.cpp:1274
std::string const & GetName() const
Definition: ScriptMgr.cpp:1279
std::string const _name
Definition: ScriptMgr.h:197
ScriptObject(ScriptObject const &right)=delete
Type erasure wrapper for objects.
Definition: ScriptMgr.cpp:193
DeleteableObjectBase & operator=(DeleteableObjectBase const &)=delete
DeleteableObjectBase(DeleteableObjectBase const &)=delete
void QueueForDelayedDelete(T &&any)
Definition: ScriptMgr.cpp:273
std::vector< std::unique_ptr< DeleteableObjectBase > > _delayed_delete_queue
Definition: ScriptMgr.cpp:301
std::unordered_set< ScriptRegistryInterface * > _registries
Definition: ScriptMgr.cpp:299
void Unload() final override
Unloads the script registry.
Definition: ScriptMgr.cpp:260
void Register(ScriptRegistryInterface *registry)
Definition: ScriptMgr.cpp:289
std::string const & GetScriptContextOfScriptName(std::string const &scriptname) const
Definition: ScriptMgr.cpp:222
void SetScriptNameInContext(std::string const &scriptname, std::string const &context)
Definition: ScriptMgr.cpp:215
void ReleaseContext(std::string const &context) final override
Definition: ScriptMgr.cpp:230
void SyncScriptNames() final override
Updates the scripts to reflect the current id.
Definition: ScriptMgr.cpp:266
void SwapContext(bool initialize) final override
Injects and updates the changed script objects.
Definition: ScriptMgr.cpp:246
static ScriptRegistryCompositum * Instance()
Definition: ScriptMgr.cpp:282
std::unordered_map< std::string, std::string > _scriptnames_to_context
Definition: ScriptMgr.cpp:306
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
Definition: ScriptMgr.cpp:254
virtual void Unload()=0
Unloads the script registry.
ScriptRegistryInterface(ScriptRegistryInterface const &)=delete
ScriptRegistryInterface(ScriptRegistryInterface &&)=delete
virtual void ReleaseContext(std::string const &context)=0
ScriptRegistryInterface & operator=(ScriptRegistryInterface const &)=delete
virtual void SyncScriptNames()=0
Updates the scripts to reflect the current id.
virtual ~ScriptRegistryInterface()
Definition: ScriptMgr.cpp:154
virtual void SwapContext(bool initialize)=0
Injects and updates the changed script objects.
virtual void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts)=0
virtual void BeforeReleaseContext(std::string const &)
Called before the actual context release happens.
Definition: ScriptMgr.cpp:354
virtual void BeforeSwapContext(bool)
Called before SwapContext.
Definition: ScriptMgr.cpp:357
virtual ~ScriptRegistrySwapHookBase()
Definition: ScriptMgr.cpp:345
ScriptRegistrySwapHookBase & operator=(ScriptRegistrySwapHookBase const &)=delete
ScriptRegistrySwapHookBase(ScriptRegistrySwapHookBase &&)=delete
virtual void BeforeUnload()
Called before Unload.
Definition: ScriptMgr.cpp:360
ScriptRegistrySwapHookBase(ScriptRegistrySwapHookBase const &)=delete
virtual void OnScriptNamesSync()
Called manually to sync scriptnames.
Definition: ScriptMgr.cpp:363
void BeforeSwapContext(bool) override
Called before SwapContext.
Definition: ScriptMgr.cpp:885
void BeforeUnload() final override
Called before Unload.
Definition: ScriptMgr.cpp:890
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:878
void BeforeReleaseContext(std::string const &) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:1143
void BeforeSwapContext(bool) override
Called before SwapContext.
Definition: ScriptMgr.cpp:1148
void BeforeUnload() final override
Called before Unload.
Definition: ScriptMgr.cpp:1153
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:849
void BeforeUnload() final override
Called before Unload.
Definition: ScriptMgr.cpp:861
void BeforeSwapContext(bool) override
Called before SwapContext.
Definition: ScriptMgr.cpp:856
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:811
void BeforeUnload() final override
Called before Unload.
Definition: ScriptMgr.cpp:832
void BeforeSwapContext(bool initialize) override
Called before SwapContext.
Definition: ScriptMgr.cpp:822
void BeforeSwapContext(bool) override
Called before SwapContext.
Definition: ScriptMgr.cpp:943
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:936
void BeforeUnload() final override
Called before Unload.
Definition: ScriptMgr.cpp:948
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:907
void BeforeUnload() final override
Called before Unload.
Definition: ScriptMgr.cpp:919
void BeforeSwapContext(bool) override
Called before SwapContext.
Definition: ScriptMgr.cpp:914
void BeforeUnload() final override
Called before Unload.
Definition: ScriptMgr.cpp:982
void BeforeSwapContext(bool) override
Called before SwapContext.
Definition: ScriptMgr.cpp:973
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:965
void LogDuplicatedScriptPointerError(ScriptType const *first, ScriptType const *second)
Definition: ScriptMgr.cpp:332
static ScriptRegistry * Instance()
Definition: ScriptMgr.cpp:326
static std::shared_ptr< ModuleReference > AcquireModuleReferenceOfContext(std::string const &context)
Returns an owning reference to the current module of the given context.
ServerScript(char const *name)
Definition: ScriptMgr.cpp:2440
virtual void OnNetworkStop()
Definition: ScriptMgr.cpp:2452
virtual void OnNetworkStart()
Definition: ScriptMgr.cpp:2448
virtual void OnSocketOpen(std::shared_ptr< WorldSocket > socket)
Definition: ScriptMgr.cpp:2456
virtual void OnPacketSend(WorldSession *session, WorldPacket &packet)
Definition: ScriptMgr.cpp:2464
virtual void OnSocketClose(std::shared_ptr< WorldSocket > socket)
Definition: ScriptMgr.cpp:2460
virtual void OnPacketReceive(WorldSession *session, WorldPacket &packet)
Definition: ScriptMgr.cpp:2468
void SwapContext(bool initialize) final override
Injects and updates the changed script objects.
Definition: ScriptMgr.cpp:1181
void SyncScriptNames() final override
Updates the scripts to reflect the current id.
Definition: ScriptMgr.cpp:1199
void Unload() final override
Unloads the script registry.
Definition: ScriptMgr.cpp:1192
ScriptStoreType::iterator ScriptStoreIteratorType
Definition: ScriptMgr.cpp:1170
void ReleaseContext(std::string const &context) final override
Definition: ScriptMgr.cpp:1174
std::unordered_multimap< std::string, std::unique_ptr< ScriptType > > ScriptStoreType
Definition: ScriptMgr.cpp:1169
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
Definition: ScriptMgr.cpp:1186
ScriptStoreType::iterator ScriptStoreIteratorType
Definition: ScriptMgr.cpp:1014
std::unordered_multimap< std::string, uint32 > _ids_of_contexts
Definition: ScriptMgr.cpp:1131
void SyncScriptNames() final override
Updates the scripts to reflect the current id.
Definition: ScriptMgr.cpp:1049
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
Definition: ScriptMgr.cpp:1032
std::unordered_set< uint32 > const & GetRecentlyAddedScriptIDs() const
Definition: ScriptMgr.cpp:1122
std::unordered_map< uint32, std::unique_ptr< ScriptType > > ScriptStoreType
Definition: ScriptMgr.cpp:1012
void SwapContext(bool initialize) final override
Injects and updates the changed script objects.
Definition: ScriptMgr.cpp:1025
std::unordered_set< uint32 > _recently_added_ids
Definition: ScriptMgr.cpp:1134
std::unordered_set< uint32 > GetScriptIDsToRemove(std::string const &context) const
Definition: ScriptMgr.cpp:1110
void ReleaseContext(std::string const &context) final override
Definition: ScriptMgr.cpp:1016
void Unload() final override
Unloads the script registry.
Definition: ScriptMgr.cpp:1038
SpellScriptLoader(char const *name)
Definition: ScriptMgr.cpp:2424
virtual SpellScript * GetSpellScript() const
Definition: ScriptMgr.cpp:2430
virtual AuraScript * GetAuraScript() const
Definition: ScriptMgr.cpp:2435
Definition: Spell.h:262
virtual void OnUpdate(Transport *transport, uint32 diff)
Definition: ScriptMgr.cpp:2897
virtual void OnAddCreaturePassenger(Transport *transport, Creature *creature)
Definition: ScriptMgr.cpp:2885
virtual void OnRelocate(Transport *transport, uint32 mapId, float x, float y, float z)
Definition: ScriptMgr.cpp:2893
virtual void OnAddPassenger(Transport *transport, Player *player)
Definition: ScriptMgr.cpp:2881
virtual void OnRemovePassenger(Transport *transport, Player *player)
Definition: ScriptMgr.cpp:2889
TransportScript(char const *name)
Definition: ScriptMgr.cpp:2873
static void FillAISpellInfo()
Definition: UnitAI.cpp:190
virtual void InitializeAI()
Definition: UnitAI.cpp:43
static std::unordered_map< std::pair< uint32, Difficulty >, AISpellInfoType > AISpellInfo
Definition: UnitAI.h:165
virtual void OnHeal(Unit *healer, Unit *reciever, uint32 &gain)
Definition: ScriptMgr.cpp:2681
virtual void OnDamage(Unit *attacker, Unit *victim, uint32 &damage)
Definition: ScriptMgr.cpp:2685
virtual void ModifyPeriodicDamageAurasTick(Unit *target, Unit *attacker, uint32 &damage)
Definition: ScriptMgr.cpp:2689
virtual void ModifySpellDamageTaken(Unit *target, Unit *attacker, int32 &damage, SpellInfo const *spellInfo)
Definition: ScriptMgr.cpp:2697
UnitScript(char const *name)
Definition: ScriptMgr.cpp:2673
virtual void ModifyMeleeDamage(Unit *target, Unit *attacker, uint32 &damage)
Definition: ScriptMgr.cpp:2693
Definition: Unit.h:630
void ClearUnitState(uint32 f)
Definition: Unit.h:739
bool IsCharmed() const
Definition: Unit.h:1226
bool IsAlive() const
Definition: Unit.h:1175
void RemoveCharmedBy(Unit *charmer)
Definition: Unit.cpp:11695
Vehicle * GetVehicleKit() const
Definition: Unit.h:1741
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
Definition: ScriptMgr.cpp:377
virtual void OnUninstall(Vehicle *veh)
Definition: ScriptMgr.cpp:2841
VehicleScript(char const *name)
Definition: ScriptMgr.cpp:2829
virtual void OnRemovePassenger(Vehicle *veh, Unit *passenger)
Definition: ScriptMgr.cpp:2857
virtual void OnInstallAccessory(Vehicle *veh, Creature *accessory)
Definition: ScriptMgr.cpp:2849
virtual void OnInstall(Vehicle *veh)
Definition: ScriptMgr.cpp:2837
virtual void OnReset(Vehicle *veh)
Definition: ScriptMgr.cpp:2845
virtual void OnAddPassenger(Vehicle *veh, Unit *passenger, int8 seatId)
Definition: ScriptMgr.cpp:2853
Unit * GetBase() const
Definition: Vehicle.h:49
void Reset(bool evading=false)
Reapplies immunities and reinstalls accessories. Only has effect for creatures.
Definition: Vehicle.cpp:138
virtual void OnChange(Weather *weather, WeatherState state, float grade)
Definition: ScriptMgr.cpp:2784
virtual void OnUpdate(Weather *weather, uint32 diff)
Definition: ScriptMgr.cpp:2788
WeatherScript(char const *name)
Definition: ScriptMgr.cpp:2776
Weather for one zone.
Definition: Weather.h:66
WorldMapScript(char const *name, uint32 mapId)
Definition: ScriptMgr.cpp:2588
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1091
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2977
EventProcessor m_Events
Definition: Object.h:904
virtual void OnOpenStateChange(bool open)
Definition: ScriptMgr.cpp:2480
virtual void OnShutdownCancel()
Definition: ScriptMgr.cpp:2496
virtual void OnShutdown()
Definition: ScriptMgr.cpp:2508
virtual void OnConfigLoad(bool reload)
Definition: ScriptMgr.cpp:2484
virtual void OnStartup()
Definition: ScriptMgr.cpp:2504
WorldScript(char const *name)
Definition: ScriptMgr.cpp:2472
virtual void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask)
Definition: ScriptMgr.cpp:2492
virtual void OnUpdate(uint32 diff)
Definition: ScriptMgr.cpp:2500
virtual void OnMotdChange(std::string &newMotd)
Definition: ScriptMgr.cpp:2488
Player session in the World.
Definition: WorldSession.h:976
WorldStateScript(char const *name)
Definition: ScriptMgr.cpp:3249
virtual void OnValueChange(int32 worldStateId, int32 oldValue, int32 newValue, Map const *map)
Definition: ScriptMgr.cpp:3257
uint32 GetScriptId() const
Definition: Weather.h:83
WeatherState
Definition: Weather.h:46
ShutdownExitCode
Definition: World.h:72
ShutdownMask
Definition: World.h:65
uint32 GetSelectedAIId(Creature const *creature)
std::vector< ChatCommandBuilder > ChatCommandTable
Definition: ChatCommand.h:49
TC_GAME_API void InvalidateCommandMap()
void AddSC_LFGScripts()
Definition: LFGScripts.cpp:248
STL namespace.
uint32 ScriptId
Definition: ConditionMgr.h:261
uint32 ScriptId
Definition: ItemTemplate.h:872
uint32 ScriptId
Definition: ObjectMgr.h:874