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