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