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 "ChatCommand.h"
20#include "Config.h"
21#include "Creature.h"
22#include "CreatureAIImpl.h"
23#include "DatabaseEnv.h"
24#include "DBCStores.h"
25#include "GossipDef.h"
26#include "InstanceScript.h"
27#include "Item.h"
28#include "LFGScripts.h"
29#include "Log.h"
30#include "MapManager.h"
31#include "ObjectMgr.h"
32#include "OutdoorPvPMgr.h"
33#include "Player.h"
34#include "ScriptReloadMgr.h"
35#include "ScriptSystem.h"
36#include "SmartAI.h"
37#include "SpellInfo.h"
38#include "SpellMgr.h"
39#include "SpellScript.h"
40#include "Transport.h"
41#include "Vehicle.h"
42#include "Weather.h"
43#include "WorldPacket.h"
44#include "WorldSession.h"
45
46// Trait which indicates whether this script type
47// must be assigned in the database.
48template<typename>
50 : std::false_type { };
51
52template<>
54 : std::true_type { };
55
56template<>
58 : std::true_type { };
59
60template<>
62 : std::true_type { };
63
64template<>
66 : std::true_type { };
67
68template<>
70 : std::true_type { };
71
72template<>
74 : std::true_type { };
75
76template<>
78 : std::true_type { };
79
80template<>
82 : std::true_type { };
83
84template<>
86 : std::true_type { };
87
88template<>
90 : std::true_type { };
91
92template<>
94 : std::true_type { };
95
96template<>
98 : std::true_type { };
99
100template<>
102 : std::true_type { };
103
104template<>
106 : std::true_type { };
107
109{
110 SPELL_HOTSWAP_VISUAL_SPELL_EFFECT = 40162 // 59084
112
114{
115public:
118
121
124
127 virtual void ReleaseContext(std::string const& context) = 0;
128
130 virtual void SwapContext(bool initialize) = 0;
131
134 virtual void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) = 0;
135
137 virtual void Unload() = 0;
138};
139
140template<class>
141class ScriptRegistry;
142
145{
147
148 template<class>
149 friend class ScriptRegistry;
150
161
162 template<typename T>
164 : public DeleteableObjectBase
165 {
166 public:
168 : _object(std::forward<T>(object)) { }
169
170 private:
172 };
173
174public:
175 void SetScriptNameInContext(std::string const& scriptname, std::string const& context)
176 {
178 "Scriptname was assigned to this context already!");
179 _scriptnames_to_context.insert(std::make_pair(scriptname, context));
180 }
181
182 std::string const& GetScriptContextOfScriptName(std::string const& scriptname) const
183 {
184 auto itr = _scriptnames_to_context.find(scriptname);
185 ASSERT(itr != _scriptnames_to_context.end() &&
186 "Given scriptname doesn't exist!");
187 return itr->second;
188 }
189
190 void ReleaseContext(std::string const& context) final override
191 {
192 for (auto const registry : _registries)
193 registry->ReleaseContext(context);
194
195 // Clear the script names in context after calling the release hooks
196 // since it's possible that new references to a shared library
197 // are acquired when releasing.
198 for (auto itr = _scriptnames_to_context.begin();
199 itr != _scriptnames_to_context.end();)
200 if (itr->second == context)
201 itr = _scriptnames_to_context.erase(itr);
202 else
203 ++itr;
204 }
205
206 void SwapContext(bool initialize) final override
207 {
208 for (auto const registry : _registries)
209 registry->SwapContext(initialize);
210
212 }
213
214 void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) final override
215 {
216 for (auto const registry : _registries)
217 registry->RemoveUsedScriptsFromContainer(scripts);
218 }
219
220 void Unload() final override
221 {
222 for (auto const registry : _registries)
223 registry->Unload();
224 }
225
226 template<typename T>
228 {
229 _delayed_delete_queue.push_back(
230 std::make_unique<
231 DeleteableObject<typename std::decay<T>::type>
232 >(std::forward<T>(any))
233 );
234 }
235
237 {
238 static ScriptRegistryCompositum instance;
239 return &instance;
240 }
241
242private:
244 {
245 _registries.insert(registry);
246 }
247
249 {
250 _delayed_delete_queue.clear();
251 }
252
253 std::unordered_set<ScriptRegistryInterface*> _registries;
254
255 std::vector<std::unique_ptr<DeleteableObjectBase>> _delayed_delete_queue;
256
257 std::unordered_map<
258 std::string /*script name*/,
259 std::string /*context*/
261};
262
263#define sScriptRegistryCompositum ScriptRegistryCompositum::Instance()
264
265template<typename /*ScriptType*/, bool /*IsDatabaseBound*/>
267
268// This is the global static registry of scripts.
269template<class ScriptType>
270class ScriptRegistry final
272 ScriptType, is_script_database_bound<ScriptType>::value>
273{
275 {
276 sScriptRegistryCompositum->Register(this);
277 }
278
279public:
281 {
282 static ScriptRegistry instance;
283 return &instance;
284 }
285
286 void LogDuplicatedScriptPointerError(ScriptType const* first, ScriptType const* second)
287 {
288 // See if the script is using the same memory as another script. If this happens, it means that
289 // someone forgot to allocate new memory for a script.
290 TC_LOG_ERROR("scripts", "Script '{}' has same memory pointer as '{}'.",
291 first->GetName(), second->GetName());
292 }
293};
294
296{
297public:
300
303
306
308 virtual void BeforeReleaseContext(std::string const& /*context*/) { }
309
311 virtual void BeforeSwapContext(bool /*initialize*/) { }
312
314 virtual void BeforeUnload() { }
315};
316
317template<typename ScriptType, typename Base>
324template<typename Base>
328public:
329 void BeforeReleaseContext(std::string const& context) final override
330 {
331 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
332 ASSERT(bounds.first == bounds.second);
333 }
334};
335
337template<typename ObjectType, typename ScriptType, typename Base>
340{
341 template<typename W>
343 {
344 public:
345 template<typename T>
347 : _worker(std::forward<T>(worker)) { }
348
349 void Visit(std::unordered_map<ObjectGuid, ObjectType*>& objects)
350 {
351 _worker(objects);
352 }
353
354 template<typename O>
355 void Visit(std::unordered_map<ObjectGuid, O*>&) { }
356
357 private:
359 };
360
362 {
363 public:
364 explicit AsyncCastHotswapEffectEvent(Unit* owner) : owner_(owner) { }
365
366 bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override
367 {
369 return true;
370 }
371
372 private:
374 };
375
376 // Hook which is called before a creature is swapped
377 static void UnloadResetScript(Creature* creature)
378 {
379 // Remove deletable events only,
380 // otherwise it causes crashes with non-deletable spell events.
381 creature->m_Events.KillAllEvents(false);
382
383 if (creature->IsCharmed())
384 creature->RemoveCharmedBy(nullptr);
385
386 ASSERT(!creature->IsCharmed(),
387 "There is a disabled AI which is still loaded.");
388
389 if (creature->IsAlive())
390 creature->AI()->EnterEvadeMode();
391 }
392
393 static void UnloadDestroyScript(Creature* creature)
394 {
395 bool const destroyed = creature->AIM_Destroy();
396 ASSERT(destroyed,
397 "Destroying the AI should never fail here!");
398 (void)destroyed;
399
400 ASSERT(!creature->AI(),
401 "The AI should be null here!");
402 }
403
404 // Hook which is called before a gameobject is swapped
405 static void UnloadResetScript(GameObject* gameobject)
406 {
407 // Remove deletable events only,
408 // otherwise it causes crashes with non-deletable spell events.
409 gameobject->m_Events.KillAllEvents(false);
410
411 gameobject->AI()->Reset();
412 }
413
414 static void UnloadDestroyScript(GameObject* gameobject)
415 {
416 gameobject->AIM_Destroy();
417
418 ASSERT(!gameobject->AI(),
419 "The AI should be null here!");
420 }
421
422 // Hook which is called after a creature was swapped
423 static void LoadInitializeScript(Creature* creature)
424 {
425 ASSERT(!creature->AI(),
426 "The AI should be null here!");
427
428 if (creature->IsAlive())
431 bool const created = creature->AIM_Create();
432 ASSERT(created,
433 "Creating the AI should never fail here!");
434 (void)created;
435 }
436
437 static void LoadResetScript(Creature* creature)
438 {
439 if (!creature->IsAlive())
440 return;
441
442 creature->AI()->InitializeAI();
443 if (creature->GetVehicleKit())
444 creature->GetVehicleKit()->Reset();
445 creature->AI()->EnterEvadeMode();
446
447 // Cast a dummy visual spell asynchronously here to signal
448 // that the AI was hot swapped
449 creature->m_Events.AddEvent(new AsyncCastHotswapEffectEvent(creature),
450 creature->m_Events.CalculateTime(0s));
451 }
452
453 // Hook which is called after a gameobject was swapped
454 static void LoadInitializeScript(GameObject* gameobject)
455 {
456 ASSERT(!gameobject->AI(),
457 "The AI should be null here!");
458
459 gameobject->AIM_Initialize();
460 }
461
462 static void LoadResetScript(GameObject* gameobject)
463 {
464 gameobject->AI()->Reset();
465 }
466
467 static Creature* GetEntityFromMap(std::common_type<Creature>, Map* map, ObjectGuid const& guid)
468 {
469 return map->GetCreature(guid);
470 }
471
472 static GameObject* GetEntityFromMap(std::common_type<GameObject>, Map* map, ObjectGuid const& guid)
473 {
474 return map->GetGameObject(guid);
475 }
476
477 template<typename T>
478 static void VisitObjectsToSwapOnMap(Map* map, std::unordered_set<uint32> const& idsToRemove, T visitor)
479 {
480 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
481 {
482 for (auto object : objects)
483 {
484 // When the script Id of the script isn't removed in this
485 // context change, do nothing.
486 if (idsToRemove.find(object.second->GetScriptId()) != idsToRemove.end())
487 visitor(object.second);
488 }
489 };
490
491 AIFunctionMapWorker<std::decay_t<decltype(evaluator)>> worker(std::move(evaluator));
492 TypeContainerVisitor<decltype(worker), MapStoredObjectTypesContainer> containerVisitor(worker);
493
494 containerVisitor.Visit(map->GetObjectsStore());
495 }
496
497 static void DestroyScriptIdsFromSet(std::unordered_set<uint32> const& idsToRemove)
498 {
499 // First reset all swapped scripts safe by guid
500 // Skip creatures and gameobjects with an empty guid
501 // (that were not added to the world as of now)
502 sMapMgr->DoForAllMaps([&](Map* map)
503 {
504 std::vector<ObjectGuid> guidsToReset;
505
506 VisitObjectsToSwapOnMap(map, idsToRemove, [&](ObjectType* object)
507 {
508 if (object->AI() && !object->GetGUID().IsEmpty())
509 guidsToReset.push_back(object->GetGUID());
510 });
511
512 for (ObjectGuid const& guid : guidsToReset)
513 {
514 if (auto entity = GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
515 UnloadResetScript(entity);
516 }
517
518 VisitObjectsToSwapOnMap(map, idsToRemove, [&](ObjectType* object)
519 {
520 // Destroy the scripts instantly
521 UnloadDestroyScript(object);
522 });
523 });
524 }
525
526 static void InitializeScriptIdsFromSet(std::unordered_set<uint32> const& idsToRemove)
527 {
528 sMapMgr->DoForAllMaps([&](Map* map)
529 {
530 std::vector<ObjectGuid> guidsToReset;
531
532 VisitObjectsToSwapOnMap(map, idsToRemove, [&](ObjectType* object)
533 {
534 if (!object->AI() && !object->GetGUID().IsEmpty())
535 {
536 // Initialize the script
537 LoadInitializeScript(object);
538 guidsToReset.push_back(object->GetGUID());
539 }
540 });
541
542 for (ObjectGuid const& guid : guidsToReset)
543 {
544 // Reset the script
545 if (auto entity = GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
546 {
547 if (!entity->AI())
548 LoadInitializeScript(entity);
549
550 LoadResetScript(entity);
551 }
552 }
553 });
554 }
555
556public:
557 void BeforeReleaseContext(std::string const& context) final override
558 {
559 auto idsToRemove = static_cast<Base*>(this)->GetScriptIDsToRemove(context);
560 DestroyScriptIdsFromSet(idsToRemove);
561
562 // Add the new ids which are removed to the global ids to remove set
563 ids_removed_.insert(idsToRemove.begin(), idsToRemove.end());
564 }
565
566 void BeforeSwapContext(bool initialize) override
567 {
568 // Never swap creature or gameobject scripts when initializing
569 if (initialize)
570 return;
571
572 // Add the recently added scripts to the deleted scripts to replace
573 // default AI's with recently added core scripts.
574 ids_removed_.insert(static_cast<Base*>(this)->GetRecentlyAddedScriptIDs().begin(),
575 static_cast<Base*>(this)->GetRecentlyAddedScriptIDs().end());
576
579
580 ids_removed_.clear();
581 }
582
583 void BeforeUnload() final override
584 {
585 ASSERT(ids_removed_.empty());
586 }
587
588private:
589 std::unordered_set<uint32> ids_removed_;
590};
591
592// This hook is responsible for swapping CreatureAI's
593template<typename Base>
596 Creature, CreatureScript, Base
597 > { };
598
599// This hook is responsible for swapping GameObjectAI's
600template<typename Base>
603 GameObject, GameObjectScript, Base
604 > { };
605
607template<typename Base>
610
612template<typename Base>
615
617template<typename Base>
620{
621public:
622 ScriptRegistrySwapHooks() : swapped(false) { }
623
624 void BeforeReleaseContext(std::string const& context) final override
625 {
626 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
627
628 if ((!swapped) && (bounds.first != bounds.second))
629 {
630 swapped = true;
631 sOutdoorPvPMgr->Die();
632 }
633 }
634
635 void BeforeSwapContext(bool initialize) override
636 {
637 // Never swap outdoor pvp scripts when initializing
638 if ((!initialize) && swapped)
639 {
640 sOutdoorPvPMgr->InitOutdoorPvP();
641 swapped = false;
642 }
643 }
644
645 void BeforeUnload() final override
646 {
647 ASSERT(!swapped);
648 }
649
650private:
652};
653
655template<typename Base>
658{
659public:
660 ScriptRegistrySwapHooks() : swapped(false) { }
661
662 void BeforeReleaseContext(std::string const& context) final override
663 {
664 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
665 if (bounds.first != bounds.second)
666 swapped = true;
667 }
668
669 void BeforeSwapContext(bool /*initialize*/) override
670 {
671 swapped = false;
672 }
673
674 void BeforeUnload() final override
675 {
676 ASSERT(!swapped);
677 }
678
679private:
681};
682
684template<typename Base>
687{
688public:
689 ScriptRegistrySwapHooks() : swapped(false) { }
690
691 void BeforeReleaseContext(std::string const& context) final override
692 {
693 auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
694
695 if (bounds.first != bounds.second)
696 swapped = true;
697 }
698
699 void BeforeSwapContext(bool /*initialize*/) override
700 {
701 if (swapped)
702 {
703 sObjectMgr->ValidateSpellScripts();
704 swapped = false;
705 }
706 }
707
708 void BeforeUnload() final override
709 {
710 ASSERT(!swapped);
711 }
712
713private:
715};
716
717// Database bound script registry
718template<typename ScriptType>
719class SpecializedScriptRegistry<ScriptType, true>
721 public ScriptRegistrySwapHooks<ScriptType, ScriptRegistry<ScriptType>>
722{
723 template<typename>
725
726 template<typename, typename>
728
729 template<typename, typename, typename>
731
732public:
734
735 typedef std::unordered_map<
736 uint32 /*script id*/,
737 std::unique_ptr<ScriptType>
739
740 typedef typename ScriptStoreType::iterator ScriptStoreIteratorType;
741
742 void ReleaseContext(std::string const& context) final override
743 {
744 this->BeforeReleaseContext(context);
745
746 auto const bounds = _ids_of_contexts.equal_range(context);
747 for (auto itr = bounds.first; itr != bounds.second; ++itr)
748 _scripts.erase(itr->second);
749 }
750
751 void SwapContext(bool initialize) final override
752 {
753 this->BeforeSwapContext(initialize);
754
755 _recently_added_ids.clear();
756 }
757
758 void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) final override
759 {
760 for (auto const& script : _scripts)
761 scripts.erase(script.second->GetName());
762 }
763
764 void Unload() final override
765 {
766 this->BeforeUnload();
767
768 ASSERT(_recently_added_ids.empty(),
769 "Recently added script ids should be empty here!");
770
771 _scripts.clear();
772 _ids_of_contexts.clear();
773 }
774
775 // Adds a database bound script
776 void AddScript(ScriptType* script)
777 {
778 ASSERT(script,
779 "Tried to call AddScript with a nullpointer!");
780 ASSERT(!sScriptMgr->GetCurrentScriptContext().empty(),
781 "Tried to register a script without being in a valid script context!");
782
783 std::unique_ptr<ScriptType> script_ptr(script);
784
785 // Get an ID for the script. An ID only exists if it's a script that is assigned in the database
786 // through a script name (or similar).
787 if (uint32 const id = sObjectMgr->GetScriptId(script->GetName()))
788 {
789 // Try to find an existing script.
790 for (auto const& stored_script : _scripts)
791 {
792 // If the script names match...
793 if (stored_script.second->GetName() == script->GetName())
794 {
795 // If the script is already assigned -> delete it!
796 ABORT_MSG("Script '%s' already assigned with the same script name, "
797 "so the script can't work.", script->GetName().c_str());
798
799 // Error that should be fixed ASAP.
800 sScriptRegistryCompositum->QueueForDelayedDelete(std::move(script_ptr));
801 ABORT();
802 return;
803 }
804 }
805
806 // If the script isn't assigned -> assign it!
807 _scripts.insert(std::make_pair(id, std::move(script_ptr)));
808 _ids_of_contexts.insert(std::make_pair(sScriptMgr->GetCurrentScriptContext(), id));
809 _recently_added_ids.insert(id);
810
811 sScriptRegistryCompositum->SetScriptNameInContext(script->GetName(),
812 sScriptMgr->GetCurrentScriptContext());
813 }
814 else
815 {
816 // The script exist in the core, but isn't assigned to anything in the database.
817 TC_LOG_ERROR("sql.sql", "Script '{}' exists in the core, but is not referenced by the database!",
818 script->GetName());
819
820 // Avoid calling "delete script;" because we are currently in the script constructor
821 // In a valid scenario this will not happen because every script has a name assigned in the database
822 sScriptRegistryCompositum->QueueForDelayedDelete(std::move(script_ptr));
823 return;
824 }
825 }
826
827 // Gets a script by its ID (assigned by ObjectMgr).
828 ScriptType* GetScriptById(uint32 id)
829 {
830 auto const itr = _scripts.find(id);
831 if (itr != _scripts.end())
832 return itr->second.get();
833
834 return nullptr;
835 }
836
838 {
839 return _scripts;
840 }
841
842protected:
843 // Returns the script id's which are registered to a certain context
844 std::unordered_set<uint32> GetScriptIDsToRemove(std::string const& context) const
845 {
846 // Create a set of all ids which are removed
847 std::unordered_set<uint32> scripts_to_remove;
848
849 auto const bounds = _ids_of_contexts.equal_range(context);
850 for (auto itr = bounds.first; itr != bounds.second; ++itr)
851 scripts_to_remove.insert(itr->second);
852
853 return scripts_to_remove;
854 }
855
856 std::unordered_set<uint32> const& GetRecentlyAddedScriptIDs() const
857 {
858 return _recently_added_ids;
859 }
860
861private:
863
864 // Scripts of a specific context
865 std::unordered_multimap<std::string /*context*/, uint32 /*id*/> _ids_of_contexts;
866
867 // Script id's which were registered recently
868 std::unordered_set<uint32> _recently_added_ids;
869};
870
872template<typename Base>
875{
876public:
877 void BeforeReleaseContext(std::string const& /*context*/) final override
878 {
880 }
881
882 void BeforeSwapContext(bool /*initialize*/) override
883 {
885 }
886
887 void BeforeUnload() final override
888 {
890 }
891};
892
893// Database unbound script registry
894template<typename ScriptType>
895class SpecializedScriptRegistry<ScriptType, false>
897 public ScriptRegistrySwapHooks<ScriptType, ScriptRegistry<ScriptType>>
898{
899 template<typename, typename>
901
902public:
903 typedef std::unordered_multimap<std::string /*context*/, std::unique_ptr<ScriptType>> ScriptStoreType;
904 typedef typename ScriptStoreType::iterator ScriptStoreIteratorType;
905
907
908 void ReleaseContext(std::string const& context) final override
909 {
910 this->BeforeReleaseContext(context);
911
912 _scripts.erase(context);
913 }
914
915 void SwapContext(bool initialize) final override
916 {
917 this->BeforeSwapContext(initialize);
918 }
919
920 void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) final override
921 {
922 for (auto const& script : _scripts)
923 scripts.erase(script.second->GetName());
924 }
925
926 void Unload() final override
927 {
928 this->BeforeUnload();
929
930 _scripts.clear();
931 }
932
933 // Adds a non database bound script
934 void AddScript(ScriptType* script)
935 {
936 ASSERT(script,
937 "Tried to call AddScript with a nullpointer!");
938 ASSERT(!sScriptMgr->GetCurrentScriptContext().empty(),
939 "Tried to register a script without being in a valid script context!");
940
941 std::unique_ptr<ScriptType> script_ptr(script);
942
943 for (auto const& entry : _scripts)
944 if (entry.second.get() == script)
945 {
946 static_cast<ScriptRegistry<ScriptType>*>(this)->
947 LogDuplicatedScriptPointerError(script, entry.second.get());
948
949 sScriptRegistryCompositum->QueueForDelayedDelete(std::move(script_ptr));
950 return;
951 }
952
953 // We're dealing with a code-only script, just add it.
954 _scripts.insert(std::make_pair(sScriptMgr->GetCurrentScriptContext(), std::move(script_ptr)));
955 }
956
958 {
959 return _scripts;
960 }
961
962private:
964};
965
966// Utility macros to refer to the script registry.
967#define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptStoreType
968#define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptStoreIteratorType
969#define SCR_REG_LST(T) ScriptRegistry<T>::Instance()->GetScripts()
970
971// Utility macros for looping over scripts.
972#define FOR_SCRIPTS(T, C, E) \
973 if (!SCR_REG_LST(T).empty()) \
974 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
975 C != SCR_REG_LST(T).end(); ++C)
976
977#define FOR_SCRIPTS_RET(T, C, E, R) \
978 if (SCR_REG_LST(T).empty()) \
979 return R; \
980 \
981 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
982 C != SCR_REG_LST(T).end(); ++C)
983
984#define FOREACH_SCRIPT(T) \
985 FOR_SCRIPTS(T, itr, end) \
986 itr->second
987
988// Utility macros for finding specific scripts.
989#define GET_SCRIPT(T, I, V) \
990 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
991 if (!V) \
992 return;
993
994#define GET_SCRIPT_RET(T, I, V, R) \
995 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
996 if (!V) \
997 return R;
998
999struct TSpellSummary
1000{
1001 uint8 Targets; // set of enum SelectTarget
1002 uint8 Effects; // set of enum SelectEffect
1004
1005ScriptObject::ScriptObject(char const* name) : _name(name)
1006{
1007 sScriptMgr->IncreaseScriptCount();
1008}
1009
1011{
1012 sScriptMgr->DecreaseScriptCount();
1013}
1014
1015std::string const& ScriptObject::GetName() const
1016{
1017 return _name;
1018}
1019
1021 : _scriptCount(0), _script_loader_callback(nullptr)
1022{
1023}
1024
1026
1028{
1029 static ScriptMgr instance;
1030 return &instance;
1031}
1032
1034{
1036 && "Reload hotswap spell effect for creatures isn't valid!");
1037
1038 uint32 oldMSTime = getMSTime();
1039
1040 LoadDatabase();
1041
1042 TC_LOG_INFO("server.loading", "Loading C++ scripts");
1043
1045
1046 // Load core scripts
1048
1049 // SmartAI
1051
1052 // LFGScripts
1054
1055 // Load all static linked scripts through the script loader function.
1057 "Script loader callback wasn't registered!");
1059
1060 // Initialize all dynamic scripts
1061 // and finishes the context switch to do
1062 // bulk loading
1063 sScriptReloadMgr->Initialize();
1064
1065 // Loads all scripts from the current context
1066 sScriptMgr->SwapScriptContext(true);
1067
1068 // Print unused script names.
1069 std::unordered_set<std::string> unusedScriptNames(
1070 sObjectMgr->GetAllScriptNames().begin(),
1071 sObjectMgr->GetAllScriptNames().end());
1072
1073 // Remove the used scripts from the given container.
1074 sScriptRegistryCompositum->RemoveUsedScriptsFromContainer(unusedScriptNames);
1075
1076 for (std::string const& scriptName : unusedScriptNames)
1077 {
1078 // Avoid complaining about empty script names since the
1079 // script name container contains a placeholder as the 0 element.
1080 if (scriptName.empty())
1081 continue;
1082
1083 TC_LOG_ERROR("sql.sql", "Script '{}' is referenced by the database, but does not exist in the core!", scriptName);
1084 }
1085
1086 TC_LOG_INFO("server.loading", ">> Loaded {} C++ scripts in {} ms",
1087 GetScriptCount(), GetMSTimeDiffToNow(oldMSTime));
1088}
1089
1090void ScriptMgr::SetScriptContext(std::string const& context)
1091{
1092 _currentContext = context;
1093}
1094
1095void ScriptMgr::SwapScriptContext(bool initialize)
1096{
1097 sScriptRegistryCompositum->SwapContext(initialize);
1098 _currentContext.clear();
1099}
1100
1102{
1103 static std::string const name = "___static___";
1104 return name;
1105}
1106
1107void ScriptMgr::ReleaseScriptContext(std::string const& context)
1108{
1109 sScriptRegistryCompositum->ReleaseContext(context);
1110}
1111
1112std::shared_ptr<ModuleReference>
1113 ScriptMgr::AcquireModuleReferenceOfScriptName(std::string const& scriptname) const
1114{
1115#ifdef TRINITY_API_USE_DYNAMIC_LINKING
1116 // Returns the reference to the module of the given scriptname
1118 sScriptRegistryCompositum->GetScriptContextOfScriptName(scriptname));
1119#else
1120 (void)scriptname;
1121 // Something went wrong when this function is used in
1122 // a static linked context.
1123 WPAbort();
1124#endif // #ifndef TRINITY_API_USE_DYNAMIC_LINKING
1125}
1126
1128{
1129 sScriptRegistryCompositum->Unload();
1130
1131 delete[] SpellSummary;
1132 delete[] UnitAI::AISpellInfo;
1133}
1134
1136{
1137 sScriptSystemMgr->LoadScriptSplineChains();
1138}
1139
1141{
1143
1144 SpellSummary = new TSpellSummary[sSpellMgr->GetSpellInfoStoreSize()];
1145
1146 SpellInfo const* pTempSpell;
1147
1148 for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
1149 {
1150 SpellSummary[i].Effects = 0;
1151 SpellSummary[i].Targets = 0;
1152
1153 pTempSpell = sSpellMgr->GetSpellInfo(i);
1154 // This spell doesn't exist.
1155 if (!pTempSpell)
1156 continue;
1157
1158 for (SpellEffectInfo const& spellEffectInfo : pTempSpell->GetEffects())
1159 {
1160 // Spell targets self.
1161 if (spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_CASTER)
1163
1164 // Spell targets a single enemy.
1165 if (spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY ||
1166 spellEffectInfo.TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY)
1168
1169 // Spell targets AoE at enemy.
1170 if (spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY ||
1171 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY ||
1172 spellEffectInfo.TargetA.GetTarget() == TARGET_SRC_CASTER ||
1173 spellEffectInfo.TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
1175
1176 // Spell targets an enemy.
1177 if (spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY ||
1178 spellEffectInfo.TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY ||
1179 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY ||
1180 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY ||
1181 spellEffectInfo.TargetA.GetTarget() == TARGET_SRC_CASTER ||
1182 spellEffectInfo.TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
1184
1185 // Spell targets a single friend (or self).
1186 if (spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_CASTER ||
1187 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY ||
1188 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY)
1190
1191 // Spell targets AoE friends.
1192 if (spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY ||
1193 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY ||
1194 spellEffectInfo.TargetA.GetTarget() == TARGET_SRC_CASTER)
1196
1197 // Spell targets any friend (or self).
1198 if (spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_CASTER ||
1199 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY ||
1200 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY ||
1201 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY ||
1202 spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY ||
1203 spellEffectInfo.TargetA.GetTarget() == TARGET_SRC_CASTER)
1205
1206 // Make sure that this spell includes a damage effect.
1207 if (spellEffectInfo.Effect == SPELL_EFFECT_SCHOOL_DAMAGE ||
1208 spellEffectInfo.Effect == SPELL_EFFECT_INSTAKILL ||
1209 spellEffectInfo.Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE ||
1210 spellEffectInfo.Effect == SPELL_EFFECT_HEALTH_LEECH)
1212
1213 // Make sure that this spell includes a healing effect (or an apply aura with a periodic heal).
1214 if (spellEffectInfo.Effect == SPELL_EFFECT_HEAL ||
1215 spellEffectInfo.Effect == SPELL_EFFECT_HEAL_MAX_HEALTH ||
1216 spellEffectInfo.Effect == SPELL_EFFECT_HEAL_MECHANICAL ||
1217 (spellEffectInfo.Effect == SPELL_EFFECT_APPLY_AURA && spellEffectInfo.ApplyAuraName == 8))
1218 SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_HEALING-1);
1219
1220 // Make sure that this spell applies an aura.
1221 if (spellEffectInfo.Effect == SPELL_EFFECT_APPLY_AURA)
1223 }
1224 }
1225}
1226
1227template<typename T, typename F, typename O>
1228void CreateSpellOrAuraScripts(uint32 spellId, std::vector<T*>& scriptVector, F&& extractor, O* objectInvoker)
1229{
1230 SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
1231 for (auto itr = bounds.first; itr != bounds.second; ++itr)
1232 {
1233 // When the script is disabled continue with the next one
1234 if (!itr->second.second)
1235 continue;
1236
1237 SpellScriptLoader* tmpscript = sScriptMgr->GetSpellScriptLoader(itr->second.first);
1238 if (!tmpscript)
1239 continue;
1240
1241 T* script = (*tmpscript.*extractor)();
1242 if (!script)
1243 continue;
1244
1245 script->_Init(&tmpscript->GetName(), spellId);
1246 if (!script->_Load(objectInvoker))
1247 {
1248 delete script;
1249 continue;
1250 }
1251
1252 scriptVector.push_back(script);
1253 }
1254}
1255
1256void ScriptMgr::CreateSpellScripts(uint32 spellId, std::vector<SpellScript*>& scriptVector, Spell* invoker) const
1257{
1258 CreateSpellOrAuraScripts(spellId, scriptVector, &SpellScriptLoader::GetSpellScript, invoker);
1259}
1260
1261void ScriptMgr::CreateAuraScripts(uint32 spellId, std::vector<AuraScript*>& scriptVector, Aura* invoker) const
1262{
1263 CreateSpellOrAuraScripts(spellId, scriptVector, &SpellScriptLoader::GetAuraScript, invoker);
1264}
1265
1270
1272{
1273 FOREACH_SCRIPT(ServerScript)->OnNetworkStart();
1274}
1275
1277{
1278 FOREACH_SCRIPT(ServerScript)->OnNetworkStop();
1279}
1280
1281void ScriptMgr::OnSocketOpen(std::shared_ptr<WorldSocket> const& socket)
1282{
1283 ASSERT(socket);
1284
1285 FOREACH_SCRIPT(ServerScript)->OnSocketOpen(socket);
1286}
1287
1288void ScriptMgr::OnSocketClose(std::shared_ptr<WorldSocket> const& socket)
1289{
1290 ASSERT(socket);
1291
1292 FOREACH_SCRIPT(ServerScript)->OnSocketClose(socket);
1293}
1294
1296{
1297 if (SCR_REG_LST(ServerScript).empty())
1298 return;
1299
1300 WorldPacket copy(packet);
1301 FOREACH_SCRIPT(ServerScript)->OnPacketReceive(session, copy);
1302}
1303
1305{
1306 ASSERT(session);
1307
1308 if (SCR_REG_LST(ServerScript).empty())
1309 return;
1310
1311 WorldPacket copy(packet);
1312 FOREACH_SCRIPT(ServerScript)->OnPacketSend(session, copy);
1313}
1314
1316{
1317 FOREACH_SCRIPT(WorldScript)->OnOpenStateChange(open);
1318}
1319
1321{
1322 FOREACH_SCRIPT(WorldScript)->OnConfigLoad(reload);
1323}
1324
1325void ScriptMgr::OnMotdChange(std::string& newMotd)
1326{
1327 FOREACH_SCRIPT(WorldScript)->OnMotdChange(newMotd);
1328}
1329
1331{
1332 FOREACH_SCRIPT(WorldScript)->OnShutdownInitiate(code, mask);
1333}
1334
1336{
1337 FOREACH_SCRIPT(WorldScript)->OnShutdownCancel();
1338}
1339
1341{
1342 FOREACH_SCRIPT(WorldScript)->OnUpdate(diff);
1343}
1344
1345void ScriptMgr::OnHonorCalculation(float& honor, uint8 level, float multiplier)
1346{
1347 FOREACH_SCRIPT(FormulaScript)->OnHonorCalculation(honor, level, multiplier);
1348}
1349
1350void ScriptMgr::OnGrayLevelCalculation(uint8& grayLevel, uint8 playerLevel)
1351{
1352 FOREACH_SCRIPT(FormulaScript)->OnGrayLevelCalculation(grayLevel, playerLevel);
1353}
1354
1356{
1357 FOREACH_SCRIPT(FormulaScript)->OnColorCodeCalculation(color, playerLevel, mobLevel);
1358}
1359
1361{
1362 FOREACH_SCRIPT(FormulaScript)->OnZeroDifferenceCalculation(diff, playerLevel);
1363}
1364
1365void ScriptMgr::OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content)
1366{
1367 FOREACH_SCRIPT(FormulaScript)->OnBaseGainCalculation(gain, playerLevel, mobLevel, content);
1368}
1369
1371{
1372 ASSERT(player);
1373 ASSERT(unit);
1374
1375 FOREACH_SCRIPT(FormulaScript)->OnGainCalculation(gain, player, unit);
1376}
1377
1378void ScriptMgr::OnGroupRateCalculation(float& rate, uint32 count, bool isRaid)
1379{
1380 FOREACH_SCRIPT(FormulaScript)->OnGroupRateCalculation(rate, count, isRaid);
1381}
1382
1383#define SCR_MAP_BGN(M, V, I, E, C, T) \
1384 if (V->GetEntry() && V->GetEntry()->T()) \
1385 { \
1386 FOR_SCRIPTS(M, I, E) \
1387 { \
1388 MapEntry const* C = I->second->GetEntry(); \
1389 if (!C) \
1390 continue; \
1391 if (C->ID == V->GetId()) \
1392 {
1393
1394#define SCR_MAP_END \
1395 return; \
1396 } \
1397 } \
1398 }
1399
1401{
1402 ASSERT(map);
1403
1404 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1405 itr->second->OnCreate(map);
1407
1408 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1409 itr->second->OnCreate((InstanceMap*)map);
1411
1412 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1413 itr->second->OnCreate((BattlegroundMap*)map);
1415}
1416
1418{
1419 ASSERT(map);
1420
1421 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1422 itr->second->OnDestroy(map);
1424
1425 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1426 itr->second->OnDestroy((InstanceMap*)map);
1428
1429 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1430 itr->second->OnDestroy((BattlegroundMap*)map);
1432}
1433
1435{
1436 ASSERT(map);
1437 ASSERT(gmap);
1438
1439 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1440 itr->second->OnLoadGridMap(map, gmap, gx, gy);
1442
1443 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1444 itr->second->OnLoadGridMap((InstanceMap*)map, gmap, gx, gy);
1446
1447 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1448 itr->second->OnLoadGridMap((BattlegroundMap*)map, gmap, gx, gy);
1450}
1451
1453{
1454 ASSERT(map);
1455 ASSERT(gmap);
1456
1457 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1458 itr->second->OnUnloadGridMap(map, gmap, gx, gy);
1460
1461 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1462 itr->second->OnUnloadGridMap((InstanceMap*)map, gmap, gx, gy);
1464
1465 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1466 itr->second->OnUnloadGridMap((BattlegroundMap*)map, gmap, gx, gy);
1468}
1469
1471{
1472 ASSERT(map);
1473 ASSERT(player);
1474
1475 FOREACH_SCRIPT(PlayerScript)->OnMapChanged(player);
1476
1477 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1478 itr->second->OnPlayerEnter(map, player);
1480
1481 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1482 itr->second->OnPlayerEnter((InstanceMap*)map, player);
1484
1485 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1486 itr->second->OnPlayerEnter((BattlegroundMap*)map, player);
1488}
1489
1491{
1492 ASSERT(map);
1493 ASSERT(player);
1494
1495 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1496 itr->second->OnPlayerLeave(map, player);
1498
1499 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1500 itr->second->OnPlayerLeave((InstanceMap*)map, player);
1502
1503 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1504 itr->second->OnPlayerLeave((BattlegroundMap*)map, player);
1506}
1507
1509{
1510 ASSERT(map);
1511
1512 SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
1513 itr->second->OnUpdate(map, diff);
1515
1516 SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
1517 itr->second->OnUpdate((InstanceMap*)map, diff);
1519
1520 SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
1521 itr->second->OnUpdate((BattlegroundMap*)map, diff);
1523}
1524
1525#undef SCR_MAP_BGN
1526#undef SCR_MAP_END
1527
1529{
1530 ASSERT(map);
1531
1532 GET_SCRIPT_RET(InstanceMapScript, map->GetScriptId(), tmpscript, nullptr);
1533 return tmpscript->GetInstanceScript(map);
1534}
1535
1536bool ScriptMgr::OnQuestAccept(Player* player, Item* item, Quest const* quest)
1537{
1538 ASSERT(player);
1539 ASSERT(item);
1540 ASSERT(quest);
1541
1542 GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
1543 player->PlayerTalkClass->ClearMenus();
1544 return tmpscript->OnQuestAccept(player, item, quest);
1545}
1546
1547bool ScriptMgr::OnItemUse(Player* player, Item* item, SpellCastTargets const& targets)
1548{
1549 ASSERT(player);
1550 ASSERT(item);
1551
1552 GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
1553 return tmpscript->OnUse(player, item, targets);
1554}
1555
1557{
1558 ASSERT(player);
1559 ASSERT(proto);
1560
1561 GET_SCRIPT_RET(ItemScript, proto->ScriptId, tmpscript, false);
1562 return tmpscript->OnExpire(player, proto);
1563}
1564
1566{
1567 ASSERT(player);
1568 ASSERT(item);
1569
1570 GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
1571 return tmpscript->OnRemove(player, item);
1572}
1573
1574bool ScriptMgr::OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo const* spellInfo, Item* item)
1575{
1576 ASSERT(player);
1577 ASSERT(victim);
1578 ASSERT(spellInfo);
1579 ASSERT(item);
1580
1581 GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, true);
1582 return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item);
1583}
1584
1586{
1587 ASSERT(creature);
1588
1589 GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, nullptr);
1590 return tmpscript->GetAI(creature);
1591}
1592
1594{
1595 ASSERT(gameobject);
1596
1597 GET_SCRIPT_RET(GameObjectScript, gameobject->GetScriptId(), tmpscript, nullptr);
1598 return tmpscript->GetAI(gameobject);
1599}
1600
1602{
1603 ASSERT(player);
1604 ASSERT(trigger);
1605
1606 GET_SCRIPT_RET(AreaTriggerScript, sObjectMgr->GetAreaTriggerScriptId(trigger->ID), tmpscript, false);
1607 return tmpscript->OnTrigger(player, trigger);
1608}
1609
1611{
1612 GET_SCRIPT_RET(BattlefieldScript, scriptId, tmpscript, nullptr);
1613 return tmpscript->GetBattlefield();
1614}
1615
1617{
1619 ABORT();
1620 return nullptr;
1621}
1622
1624{
1625 GET_SCRIPT_RET(OutdoorPvPScript, scriptId, tmpscript, nullptr);
1626 return tmpscript->GetOutdoorPvP();
1627}
1628
1630{
1632
1633 FOR_SCRIPTS(CommandScript, itr, end)
1634 {
1635 Trinity::ChatCommands::ChatCommandTable cmds = itr->second->GetCommands();
1636 std::move(cmds.begin(), cmds.end(), std::back_inserter(table));
1637 }
1638
1639 return table;
1640}
1641
1642void ScriptMgr::OnWeatherChange(Weather* weather, WeatherState state, float grade)
1643{
1644 ASSERT(weather);
1645
1646 GET_SCRIPT(WeatherScript, weather->GetScriptId(), tmpscript);
1647 tmpscript->OnChange(weather, state, grade);
1648}
1649
1651{
1652 ASSERT(weather);
1653
1654 GET_SCRIPT(WeatherScript, weather->GetScriptId(), tmpscript);
1655 tmpscript->OnUpdate(weather, diff);
1656}
1657
1659{
1660 ASSERT(ah);
1661 ASSERT(entry);
1662
1663 FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionAdd(ah, entry);
1664}
1665
1667{
1668 ASSERT(ah);
1669 ASSERT(entry);
1670
1671 FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionRemove(ah, entry);
1672}
1673
1675{
1676 ASSERT(ah);
1677 ASSERT(entry);
1678
1679 FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionSuccessful(ah, entry);
1680}
1681
1683{
1684 ASSERT(ah);
1685 ASSERT(entry);
1686
1687 FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionExpire(ah, entry);
1688}
1689
1691{
1692 ASSERT(condition);
1693
1694 GET_SCRIPT_RET(ConditionScript, condition->ScriptId, tmpscript, true);
1695 return tmpscript->OnConditionCheck(condition, sourceInfo);
1696}
1697
1699{
1700 ASSERT(veh);
1701 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1702
1703 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1704 tmpscript->OnInstall(veh);
1705}
1706
1708{
1709 ASSERT(veh);
1710 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1711
1712 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1713 tmpscript->OnUninstall(veh);
1714}
1715
1717{
1718 ASSERT(veh);
1719 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1720
1721 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1722 tmpscript->OnReset(veh);
1723}
1724
1726{
1727 ASSERT(veh);
1728 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1729 ASSERT(accessory);
1730
1731 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1732 tmpscript->OnInstallAccessory(veh, accessory);
1733}
1734
1735void ScriptMgr::OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId)
1736{
1737 ASSERT(veh);
1738 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1739 ASSERT(passenger);
1740
1741 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1742 tmpscript->OnAddPassenger(veh, passenger, seatId);
1743}
1744
1746{
1747 ASSERT(veh);
1748 ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
1749 ASSERT(passenger);
1750
1751 GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
1752 tmpscript->OnRemovePassenger(veh, passenger);
1753}
1754
1756{
1757 ASSERT(dynobj);
1758
1760 itr->second->OnUpdate(dynobj, diff);
1761}
1762
1764{
1765 ASSERT(transport);
1766 ASSERT(player);
1767
1768 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1769 tmpscript->OnAddPassenger(transport, player);
1770}
1771
1773{
1774 ASSERT(transport);
1775 ASSERT(creature);
1776
1777 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1778 tmpscript->OnAddCreaturePassenger(transport, creature);
1779}
1780
1782{
1783 ASSERT(transport);
1784 ASSERT(player);
1785
1786 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1787 tmpscript->OnRemovePassenger(transport, player);
1788}
1789
1791{
1792 ASSERT(transport);
1793
1794 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1795 tmpscript->OnUpdate(transport, diff);
1796}
1797
1798void ScriptMgr::OnRelocate(Transport* transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
1799{
1800 GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
1801 tmpscript->OnRelocate(transport, waypointId, mapId, x, y, z);
1802}
1803
1805{
1806 FOREACH_SCRIPT(WorldScript)->OnStartup();
1807}
1808
1810{
1811 FOREACH_SCRIPT(WorldScript)->OnShutdown();
1812}
1813
1814bool ScriptMgr::OnCriteriaCheck(uint32 scriptId, Player* source, Unit* target)
1815{
1816 ASSERT(source);
1817 // target can be NULL.
1818
1819 GET_SCRIPT_RET(AchievementCriteriaScript, scriptId, tmpscript, false);
1820 return tmpscript->OnCheck(source, target);
1821}
1822
1823// Player
1824void ScriptMgr::OnPVPKill(Player* killer, Player* killed)
1825{
1826 FOREACH_SCRIPT(PlayerScript)->OnPVPKill(killer, killed);
1827}
1828
1830{
1831 FOREACH_SCRIPT(PlayerScript)->OnCreatureKill(killer, killed);
1832}
1833
1835{
1836 FOREACH_SCRIPT(PlayerScript)->OnPlayerKilledByCreature(killer, killed);
1837}
1838
1840{
1841 FOREACH_SCRIPT(PlayerScript)->OnLevelChanged(player, oldLevel);
1842}
1843
1845{
1846 FOREACH_SCRIPT(PlayerScript)->OnFreeTalentPointsChanged(player, points);
1847}
1848
1849void ScriptMgr::OnPlayerTalentsReset(Player* player, bool involuntarily)
1850{
1851 FOREACH_SCRIPT(PlayerScript)->OnTalentsReset(player, involuntarily);
1852}
1853
1855{
1856 FOREACH_SCRIPT(PlayerScript)->OnMoneyChanged(player, amount);
1857}
1858
1860{
1861 FOREACH_SCRIPT(PlayerScript)->OnMoneyLimit(player, amount);
1862}
1863
1864void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim)
1865{
1866 FOREACH_SCRIPT(PlayerScript)->OnGiveXP(player, amount, victim);
1867}
1868
1869void ScriptMgr::OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental)
1870{
1871 FOREACH_SCRIPT(PlayerScript)->OnReputationChange(player, factionID, standing, incremental);
1872}
1873
1875{
1876 FOREACH_SCRIPT(PlayerScript)->OnDuelRequest(target, challenger);
1877}
1878
1880{
1881 FOREACH_SCRIPT(PlayerScript)->OnDuelStart(player1, player2);
1882}
1883
1885{
1886 FOREACH_SCRIPT(PlayerScript)->OnDuelEnd(winner, loser, type);
1887}
1888
1889void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg)
1890{
1891 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg);
1892}
1893
1894void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Player* receiver)
1895{
1896 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, receiver);
1897}
1898
1899void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group)
1900{
1901 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, group);
1902}
1903
1904void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild)
1905{
1906 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, guild);
1907}
1908
1909void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel)
1910{
1911 FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, channel);
1912}
1913
1915{
1916 FOREACH_SCRIPT(PlayerScript)->OnEmote(player, emote);
1917}
1918
1919void ScriptMgr::OnPlayerTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
1920{
1921 FOREACH_SCRIPT(PlayerScript)->OnTextEmote(player, textEmote, emoteNum, guid);
1922}
1923
1924void ScriptMgr::OnPlayerSpellCast(Player* player, Spell* spell, bool skipCheck)
1925{
1926 FOREACH_SCRIPT(PlayerScript)->OnSpellCast(player, spell, skipCheck);
1927}
1928
1929void ScriptMgr::OnPlayerLogin(Player* player, bool firstLogin)
1930{
1931 FOREACH_SCRIPT(PlayerScript)->OnLogin(player, firstLogin);
1932}
1933
1935{
1936 FOREACH_SCRIPT(PlayerScript)->OnLogout(player);
1937}
1938
1940{
1941 FOREACH_SCRIPT(PlayerScript)->OnCreate(player);
1942}
1943
1945{
1946 FOREACH_SCRIPT(PlayerScript)->OnDelete(guid, accountId);
1947}
1948
1950{
1951 FOREACH_SCRIPT(PlayerScript)->OnFailedDelete(guid, accountId);
1952}
1953
1955{
1956 FOREACH_SCRIPT(PlayerScript)->OnSave(player);
1957}
1958
1959void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent, uint8 extendState)
1960{
1961 FOREACH_SCRIPT(PlayerScript)->OnBindToInstance(player, difficulty, mapid, permanent, extendState);
1962}
1963
1964void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea)
1965{
1966 FOREACH_SCRIPT(PlayerScript)->OnUpdateZone(player, newZone, newArea);
1967}
1968
1970{
1971 FOREACH_SCRIPT(PlayerScript)->OnQuestStatusChange(player, questId);
1972}
1973
1975{
1976 FOREACH_SCRIPT(PlayerScript)->OnPlayerRepop(player);
1977}
1978
1979void ScriptMgr::OnQuestObjectiveProgress(Player* player, Quest const* quest, uint32 objectiveIndex, uint16 progress)
1980{
1981 FOREACH_SCRIPT(PlayerScript)->OnQuestObjectiveProgress(player, quest, objectiveIndex, progress);
1982}
1983
1985{
1986 FOREACH_SCRIPT(PlayerScript)->OnMovieComplete(player, movieId);
1987}
1988
1989// Account
1991{
1992 FOREACH_SCRIPT(AccountScript)->OnAccountLogin(accountId);
1993}
1994
1996{
1997 FOREACH_SCRIPT(AccountScript)->OnFailedAccountLogin(accountId);
1998}
1999
2001{
2002 FOREACH_SCRIPT(AccountScript)->OnEmailChange(accountId);
2003}
2004
2006{
2007 FOREACH_SCRIPT(AccountScript)->OnFailedEmailChange(accountId);
2008}
2009
2011{
2012 FOREACH_SCRIPT(AccountScript)->OnPasswordChange(accountId);
2013}
2014
2016{
2017 FOREACH_SCRIPT(AccountScript)->OnFailedPasswordChange(accountId);
2018}
2019
2020// Guild
2021void ScriptMgr::OnGuildAddMember(Guild* guild, Player* player, uint8& plRank)
2022{
2023 FOREACH_SCRIPT(GuildScript)->OnAddMember(guild, player, plRank);
2024}
2025
2026void ScriptMgr::OnGuildRemoveMember(Guild* guild, Player* player, bool isDisbanding, bool isKicked)
2027{
2028 FOREACH_SCRIPT(GuildScript)->OnRemoveMember(guild, player, isDisbanding, isKicked);
2029}
2030
2031void ScriptMgr::OnGuildMOTDChanged(Guild* guild, const std::string& newMotd)
2032{
2033 FOREACH_SCRIPT(GuildScript)->OnMOTDChanged(guild, newMotd);
2034}
2035
2036void ScriptMgr::OnGuildInfoChanged(Guild* guild, const std::string& newInfo)
2037{
2038 FOREACH_SCRIPT(GuildScript)->OnInfoChanged(guild, newInfo);
2039}
2040
2041void ScriptMgr::OnGuildCreate(Guild* guild, Player* leader, const std::string& name)
2042{
2043 FOREACH_SCRIPT(GuildScript)->OnCreate(guild, leader, name);
2044}
2045
2047{
2048 FOREACH_SCRIPT(GuildScript)->OnDisband(guild);
2049}
2050
2051void ScriptMgr::OnGuildMemberWitdrawMoney(Guild* guild, Player* player, uint32 &amount, bool isRepair)
2052{
2053 FOREACH_SCRIPT(GuildScript)->OnMemberWitdrawMoney(guild, player, amount, isRepair);
2054}
2055
2057{
2058 FOREACH_SCRIPT(GuildScript)->OnMemberDepositMoney(guild, player, amount);
2059}
2060
2061void ScriptMgr::OnGuildItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId,
2062 bool isDestBank, uint8 destContainer, uint8 destSlotId)
2063{
2064 FOREACH_SCRIPT(GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
2065}
2066
2067void ScriptMgr::OnGuildEvent(Guild* guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
2068{
2069 FOREACH_SCRIPT(GuildScript)->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank);
2070}
2071
2072void ScriptMgr::OnGuildBankEvent(Guild* guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
2073{
2074 FOREACH_SCRIPT(GuildScript)->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId);
2075}
2076
2077// Group
2079{
2080 ASSERT(group);
2081 FOREACH_SCRIPT(GroupScript)->OnAddMember(group, guid);
2082}
2083
2085{
2086 ASSERT(group);
2087 FOREACH_SCRIPT(GroupScript)->OnInviteMember(group, guid);
2088}
2089
2090void ScriptMgr::OnGroupRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const* reason)
2091{
2092 ASSERT(group);
2093 FOREACH_SCRIPT(GroupScript)->OnRemoveMember(group, guid, method, kicker, reason);
2094}
2095
2096void ScriptMgr::OnGroupChangeLeader(Group* group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid)
2097{
2098 ASSERT(group);
2099 FOREACH_SCRIPT(GroupScript)->OnChangeLeader(group, newLeaderGuid, oldLeaderGuid);
2100}
2101
2103{
2104 ASSERT(group);
2105 FOREACH_SCRIPT(GroupScript)->OnDisband(group);
2106}
2107
2108// Unit
2109void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain)
2110{
2111 FOREACH_SCRIPT(UnitScript)->OnHeal(healer, reciever, gain);
2112}
2113
2114void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage)
2115{
2116 FOREACH_SCRIPT(UnitScript)->OnDamage(attacker, victim, damage);
2117}
2118
2120{
2121 FOREACH_SCRIPT(UnitScript)->ModifyPeriodicDamageAurasTick(target, attacker, damage);
2122}
2123
2124void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage)
2125{
2126 FOREACH_SCRIPT(UnitScript)->ModifyMeleeDamage(target, attacker, damage);
2127}
2128
2129void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage)
2130{
2131 FOREACH_SCRIPT(UnitScript)->ModifySpellDamageTaken(target, attacker, damage);
2132}
2133
2135 : ScriptObject(name)
2136{
2138}
2139
2141{
2142 return nullptr;
2143}
2144
2146{
2147 return nullptr;
2148}
2149
2151 : ScriptObject(name)
2152{
2153 ScriptRegistry<ServerScript>::Instance()->AddScript(this);
2154}
2155
2159
2163
2164void ServerScript::OnSocketOpen(std::shared_ptr<WorldSocket> /*socket*/)
2165{
2166}
2167
2168void ServerScript::OnSocketClose(std::shared_ptr<WorldSocket> /*socket*/)
2169{
2170}
2171
2173{
2174}
2175
2177{
2178}
2179
2181 : ScriptObject(name)
2182{
2183 ScriptRegistry<WorldScript>::Instance()->AddScript(this);
2184}
2185
2187{
2188}
2189
2190void WorldScript::OnConfigLoad(bool /*reload*/)
2191{
2192}
2193
2194void WorldScript::OnMotdChange(std::string& /*newMotd*/)
2195{
2196}
2197
2201
2205
2207{
2208}
2209
2211{
2212}
2213
2215{
2216}
2217
2219 : ScriptObject(name)
2220{
2221 ScriptRegistry<FormulaScript>::Instance()->AddScript(this);
2222}
2223
2224void FormulaScript::OnHonorCalculation(float& /*honor*/, uint8 /*level*/, float /*multiplier*/)
2225{
2226}
2227
2228void FormulaScript::OnGrayLevelCalculation(uint8& /*grayLevel*/, uint8 /*playerLevel*/)
2229{
2230}
2231
2232void FormulaScript::OnColorCodeCalculation(XPColorChar& /*color*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/)
2233{
2234}
2235
2237{
2238}
2239
2240void FormulaScript::OnBaseGainCalculation(uint32& /*gain*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/, ContentLevels /*content*/)
2241{
2242}
2243
2244void FormulaScript::OnGainCalculation(uint32& /*gain*/, Player* /*player*/, Unit* /*unit*/)
2245{
2246}
2247
2248void FormulaScript::OnGroupRateCalculation(float& /*rate*/, uint32 /*count*/, bool /*isRaid*/)
2249{
2250}
2251
2252template <class TMap>
2253MapScript<TMap>::MapScript(MapEntry const* mapEntry) : _mapEntry(mapEntry)
2254{
2255}
2256
2257template <class TMap>
2259{
2260 return _mapEntry;
2261}
2262
2263template <class TMap>
2264void MapScript<TMap>::OnCreate(TMap* /*map*/)
2265{
2266}
2267
2268template <class TMap>
2270{
2271}
2272
2273template <class TMap>
2274void MapScript<TMap>::OnPlayerEnter(TMap* /*map*/, Player* /*player*/)
2275{
2276}
2277
2278template <class TMap>
2279void MapScript<TMap>::OnPlayerLeave(TMap* /*map*/, Player* /*player*/)
2280{
2281}
2282
2283template <class TMap>
2284void MapScript<TMap>::OnUpdate(TMap* /*map*/, uint32 /*diff*/)
2285{
2286}
2287
2291
2293 : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId))
2294{
2295 if (!GetEntry())
2296 TC_LOG_ERROR("scripts", "Invalid WorldMapScript for {}; no such map ID.", mapId);
2297
2298 if (GetEntry() && !GetEntry()->IsWorldMap())
2299 TC_LOG_ERROR("scripts", "WorldMapScript for map {} is invalid.", mapId);
2300
2302}
2303
2305 : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId))
2306{
2307 if (!GetEntry())
2308 TC_LOG_ERROR("scripts", "Invalid InstanceMapScript for {}; no such map ID.", mapId);
2309
2310 if (GetEntry() && !GetEntry()->IsDungeon())
2311 TC_LOG_ERROR("scripts", "InstanceMapScript for map {} is invalid.", mapId);
2312
2314}
2315
2317{
2318 return nullptr;
2319}
2320
2322 : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId))
2323{
2324 if (!GetEntry())
2325 TC_LOG_ERROR("scripts", "Invalid BattlegroundMapScript for {}; no such map ID.", mapId);
2326
2327 if (GetEntry() && !GetEntry()->IsBattleground())
2328 TC_LOG_ERROR("scripts", "BattlegroundMapScript for map {} is invalid.", mapId);
2329
2331}
2332
2333ItemScript::ItemScript(char const* name)
2334 : ScriptObject(name)
2335{
2336 ScriptRegistry<ItemScript>::Instance()->AddScript(this);
2337}
2338
2339bool ItemScript::OnQuestAccept(Player* /*player*/, Item* /*item*/, Quest const* /*quest*/)
2340{
2341 return false;
2342}
2343
2344bool ItemScript::OnUse(Player* /*player*/, Item* /*item*/, SpellCastTargets const& /*targets*/)
2345{
2346 return false;
2347}
2348
2349bool ItemScript::OnExpire(Player* /*player*/, ItemTemplate const* /*proto*/)
2350{
2351 return false;
2352}
2353
2354bool ItemScript::OnRemove(Player* /*player*/, Item* /*item*/)
2355{
2356 return false;
2357}
2358
2359bool ItemScript::OnCastItemCombatSpell(Player* /*player*/, Unit* /*victim*/, SpellInfo const* /*spellInfo*/, Item* /*item*/)
2360{
2361 return true;
2362}
2363
2364UnitScript::UnitScript(char const* name)
2365 : ScriptObject(name)
2366{
2367 ScriptRegistry<UnitScript>::Instance()->AddScript(this);
2368}
2369
2370void UnitScript::OnHeal(Unit* /*healer*/, Unit* /*reciever*/, uint32& /*gain*/)
2371{
2372}
2373
2374void UnitScript::OnDamage(Unit* /*attacker*/, Unit* /*victim*/, uint32& /*damage*/)
2375{
2376}
2377
2378void UnitScript::ModifyPeriodicDamageAurasTick(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/)
2379{
2380}
2381
2382void UnitScript::ModifyMeleeDamage(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/)
2383{
2384}
2385
2386void UnitScript::ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/)
2387{
2388}
2389
2391 : ScriptObject(name)
2392{
2394}
2395
2397 : ScriptObject(name)
2398{
2400}
2401
2403 : ScriptObject(name)
2404{
2406}
2407
2408bool AreaTriggerScript::OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/)
2409{
2410 return false;
2411}
2412
2414{
2415 uint32 const triggerId = trigger->ID;
2416 InstanceScript* instance = player->GetInstanceScript();
2417 if (instance && instance->IsAreaTriggerDone(triggerId))
2418 return true;
2419
2420 if (TryHandleOnce(player, trigger) && instance)
2421 instance->MarkAreaTriggerDone(triggerId);
2422
2423 return true;
2424}
2426void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger) { if (InstanceScript* instance = player->GetInstanceScript()) ResetAreaTriggerDone(instance, trigger->ID); }
2427
2429 : ScriptObject(name)
2430{
2432}
2433
2435 : ScriptObject(name)
2436{
2438}
2439
2441 : ScriptObject(name)
2442{
2444}
2445
2447 : ScriptObject(name)
2448{
2449 ScriptRegistry<CommandScript>::Instance()->AddScript(this);
2450}
2451
2453 : ScriptObject(name)
2454{
2455 ScriptRegistry<WeatherScript>::Instance()->AddScript(this);
2456}
2457
2458void WeatherScript::OnChange(Weather* /*weather*/, WeatherState /*state*/, float /*grade*/)
2459{
2460}
2461
2462void WeatherScript::OnUpdate(Weather* /*weather*/, uint32 /*diff*/)
2463{
2464}
2465
2467 : ScriptObject(name)
2468{
2470}
2471
2475
2479
2483
2487
2489 : ScriptObject(name)
2490{
2492}
2493
2494bool ConditionScript::OnConditionCheck(Condition const* /*condition*/, ConditionSourceInfo& /*sourceInfo*/)
2495{
2496 return true;
2497}
2498
2500 : ScriptObject(name)
2501{
2502 ScriptRegistry<VehicleScript>::Instance()->AddScript(this);
2503}
2504
2506{
2507}
2508
2510{
2511}
2512
2514{
2515}
2516
2518{
2519}
2520
2521void VehicleScript::OnAddPassenger(Vehicle* /*veh*/, Unit* /*passenger*/, int8 /*seatId*/)
2522{
2523}
2524
2525void VehicleScript::OnRemovePassenger(Vehicle* /*veh*/, Unit* /*passenger*/)
2526{
2527}
2528
2530 : ScriptObject(name)
2531{
2533}
2534
2536{
2537}
2538
2540 : ScriptObject(name)
2541{
2543}
2544
2545void TransportScript::OnAddPassenger(Transport* /*transport*/, Player* /*player*/)
2546{
2547}
2548
2550{
2551}
2552
2553void TransportScript::OnRemovePassenger(Transport* /*transport*/, Player* /*player*/)
2554{
2555}
2556
2557void TransportScript::OnRelocate(Transport* /*transport*/, uint32 /*waypointId*/, uint32 /*mapId*/, float /*x*/, float /*y*/, float /*z*/)
2558{
2559}
2560
2561void TransportScript::OnUpdate(Transport* /*transport*/, uint32 /*diff*/)
2562{
2563}
2564
2570
2572 : ScriptObject(name)
2573{
2574 ScriptRegistry<PlayerScript>::Instance()->AddScript(this);
2575}
2576
2577void PlayerScript::OnPVPKill(Player* /*killer*/, Player* /*killed*/)
2578{
2579}
2580
2581void PlayerScript::OnCreatureKill(Player* /*killer*/, Creature* /*killed*/)
2582{
2583}
2584
2586{
2587}
2588
2589void PlayerScript::OnLevelChanged(Player* /*player*/, uint8 /*oldLevel*/)
2590{
2591}
2592
2594{
2595}
2596
2597void PlayerScript::OnTalentsReset(Player* /*player*/, bool /*involuntarily*/)
2598{
2599}
2600
2601void PlayerScript::OnMoneyChanged(Player* /*player*/, int32& /*amount*/)
2602{
2603}
2604
2605void PlayerScript::OnMoneyLimit(Player* /*player*/, int32 /*amount*/)
2606{
2607}
2608
2609void PlayerScript::OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/)
2610{
2611}
2612
2613void PlayerScript::OnReputationChange(Player* /*player*/, uint32 /*factionId*/, int32& /*standing*/, bool /*incremental*/)
2614{
2615}
2616
2617void PlayerScript::OnDuelRequest(Player* /*target*/, Player* /*challenger*/)
2618{
2619}
2620
2621void PlayerScript::OnDuelStart(Player* /*player1*/, Player* /*player2*/)
2622{
2623}
2624
2625void PlayerScript::OnDuelEnd(Player* /*winner*/, Player* /*loser*/, DuelCompleteType /*type*/)
2626{
2627}
2628
2629void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/)
2630{
2631}
2632
2633void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Player* /*receiver*/)
2634{
2635}
2636
2637void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Group* /*group*/)
2638{
2639}
2640
2641void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Guild* /*guild*/)
2642{
2643}
2644
2645void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Channel* /*channel*/)
2646{
2647}
2648
2649void PlayerScript::OnEmote(Player* /*player*/, Emote /*emote*/)
2650{
2651}
2652
2653void PlayerScript::OnTextEmote(Player* /*player*/, uint32 /*textEmote*/, uint32 /*emoteNum*/, ObjectGuid /*guid*/)
2654{
2655}
2656
2657void PlayerScript::OnSpellCast(Player* /*player*/, Spell* /*spell*/, bool /*skipCheck*/)
2658{
2659}
2660
2661void PlayerScript::OnLogin(Player* /*player*/, bool /*firstLogin*/)
2662{
2663}
2664
2666{
2667}
2668
2670{
2671}
2672
2673void PlayerScript::OnDelete(ObjectGuid /*guid*/, uint32 /*accountId*/)
2674{
2675}
2676
2678{
2679}
2680
2682{
2683}
2684
2685void PlayerScript::OnBindToInstance(Player* /*player*/, Difficulty /*difficulty*/, uint32 /*mapId*/, bool /*permanent*/, uint8 /*extendState*/)
2686{
2687}
2688
2689void PlayerScript::OnUpdateZone(Player* /*player*/, uint32 /*newZone*/, uint32 /*newArea*/)
2690{
2691}
2692
2694{
2695}
2696
2698{
2699}
2700
2702{
2703}
2704
2705void PlayerScript::OnMovieComplete(Player* /*player*/, uint32 /*movieId*/)
2706{
2707}
2708
2710 : ScriptObject(name)
2711{
2712 ScriptRegistry<AccountScript>::Instance()->AddScript(this);
2713}
2714
2716{
2717}
2718
2720{
2721}
2722
2724{
2725}
2726
2728{
2729}
2730
2732{
2733}
2734
2736{
2737}
2738
2740 : ScriptObject(name)
2741{
2742 ScriptRegistry<GuildScript>::Instance()->AddScript(this);
2743}
2744
2745void GuildScript::OnAddMember(Guild* /*guild*/, Player* /*player*/, uint8& /*plRank*/)
2746{
2747}
2748
2749void GuildScript::OnRemoveMember(Guild* /*guild*/, Player* /*player*/, bool /*isDisbanding*/, bool /*isKicked*/)
2750{
2751}
2752
2753void GuildScript::OnMOTDChanged(Guild* /*guild*/, std::string const& /*newMotd*/)
2754{
2755}
2756
2757void GuildScript::OnInfoChanged(Guild* /*guild*/, std::string const& /*newInfo*/)
2758{
2759}
2760
2761void GuildScript::OnCreate(Guild* /*guild*/, Player* /*leader*/, std::string const& /*name*/)
2762{
2763}
2764
2766{
2767}
2768
2769void GuildScript::OnMemberWitdrawMoney(Guild* /*guild*/, Player* /*player*/, uint32& /*amount*/, bool /*isRepair*/)
2770{
2771}
2772
2773void GuildScript::OnMemberDepositMoney(Guild* /*guild*/, Player* /*player*/, uint32& /*amount*/)
2774{
2775}
2776
2777void GuildScript::OnItemMove(Guild* /*guild*/, Player* /*player*/, Item* /*pItem*/, bool /*isSrcBank*/, uint8 /*srcContainer*/, uint8 /*srcSlotId*/, bool /*isDestBank*/,
2778 uint8 /*destContainer*/, uint8 /*destSlotId*/)
2779{
2780}
2781
2782void GuildScript::OnEvent(Guild* /*guild*/, uint8 /*eventType*/, ObjectGuid::LowType /*playerGuid1*/, ObjectGuid::LowType /*playerGuid2*/, uint8 /*newRank*/)
2783{
2784}
2785
2786void GuildScript::OnBankEvent(Guild* /*guild*/, uint8 /*eventType*/, uint8 /*tabId*/, ObjectGuid::LowType /*playerGuid*/, uint32 /*itemOrMoney*/, uint16 /*itemStackCount*/,
2787 uint8 /*destTabId*/)
2788{
2789}
2790
2792 : ScriptObject(name)
2793{
2794 ScriptRegistry<GroupScript>::Instance()->AddScript(this);
2795}
2796
2798{
2799}
2800
2802{
2803}
2804
2805void GroupScript::OnRemoveMember(Group* /*group*/, ObjectGuid /*guid*/, RemoveMethod /*method*/, ObjectGuid /*kicker*/, char const* /*reason*/)
2806{
2807}
2808
2809void GroupScript::OnChangeLeader(Group* /*group*/, ObjectGuid /*newLeaderGuid*/, ObjectGuid /*oldLeaderGuid*/)
2810{
2811}
2812
2814{
2815}
2816
2817// Specialize for each script type class like so:
@ SELECT_TARGET_ANY_FRIEND
Definition CreatureAI.h:61
@ SELECT_TARGET_AOE_FRIEND
Definition CreatureAI.h:60
@ SELECT_TARGET_ANY_ENEMY
Definition CreatureAI.h:58
@ SELECT_TARGET_SINGLE_FRIEND
Definition CreatureAI.h:59
@ SELECT_TARGET_SINGLE_ENEMY
Definition CreatureAI.h:56
@ SELECT_TARGET_SELF
Definition CreatureAI.h:55
@ SELECT_TARGET_AOE_ENEMY
Definition CreatureAI.h:57
@ SELECT_EFFECT_AURA
Definition CreatureAI.h:70
@ SELECT_EFFECT_HEALING
Definition CreatureAI.h:69
@ SELECT_EFFECT_DAMAGE
Definition CreatureAI.h:68
Difficulty
Definition DBCEnums.h:279
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
ContentLevels
Definition DBCStores.h:51
#define TC_GAME_API
Definition Define.h:114
uint8_t uint8
Definition Define.h:135
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint64_t uint64
Definition Define.h:132
uint16_t uint16
Definition Define.h:134
uint32_t uint32
Definition Define.h:133
#define ABORT_MSG
Definition Errors.h:75
#define ABORT
Definition Errors.h:74
#define WPAbort()
Definition Errors.h:61
#define ASSERT
Definition Errors.h:68
#define TC_LOG_ERROR(filterType__,...)
Definition Log.h:165
#define TC_LOG_INFO(filterType__,...)
Definition Log.h:159
#define sMapMgr
Definition MapManager.h:211
@ TYPEID_UNIT
Definition ObjectGuid.h:38
std::pair< SpellScriptsContainer::iterator, SpellScriptsContainer::iterator > SpellScriptsBounds
Definition ObjectMgr.h:413
#define sObjectMgr
Definition ObjectMgr.h:1721
#define sOutdoorPvPMgr
Spells
Definition PlayerAI.cpp:32
#define FOREACH_SCRIPT(T)
@ SPELL_HOTSWAP_VISUAL_SPELL_EFFECT
void CreateSpellOrAuraScripts(uint32 spellId, std::vector< T * > &scriptVector, F &&extractor, O *objectInvoker)
#define SCR_MAP_END
#define SCR_MAP_BGN(M, V, I, E, C, T)
#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)
struct TSpellSummary * SpellSummary
#define sScriptMgr
Definition ScriptMgr.h:1168
#define sScriptReloadMgr
#define sScriptSystemMgr
TSpellSummary * SpellSummary
@ SPELL_EFFECT_HEALTH_LEECH
@ SPELL_EFFECT_HEAL
@ SPELL_EFFECT_HEAL_MAX_HEALTH
@ SPELL_EFFECT_HEAL_MECHANICAL
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ SPELL_EFFECT_INSTAKILL
@ SPELL_EFFECT_APPLY_AURA
Targets
@ TARGET_UNIT_TARGET_PARTY
@ TARGET_DEST_DYNOBJ_ENEMY
@ TARGET_UNIT_CASTER_AREA_PARTY
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_TARGET_ALLY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_DEST_TARGET_ENEMY
@ TARGET_UNIT_TARGET_ENEMY
@ TARGET_UNIT_LASTTARGET_AREA_PARTY
@ TARGET_UNIT_CASTER
@ TARGET_SRC_CASTER
XPColorChar
DuelCompleteType
BattlegroundTypeId
RemoveMethod
void AddSC_SmartScripts()
Registers scripts required by the SAI scripting system.
Definition SmartAI.cpp:1146
#define sSpellMgr
Definition SpellMgr.h:738
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:57
uint32 getMSTime()
Definition Timer.h:33
@ UNIT_STATE_EVADE
Definition Unit.h:242
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)
AchievementCriteriaScript(char const *name)
AreaTriggerScript(char const *name)
virtual bool OnTrigger(Player *player, AreaTriggerEntry const *trigger)
virtual void OnAuctionAdd(AuctionHouseObject *ah, AuctionEntry *entry)
virtual void OnAuctionRemove(AuctionHouseObject *ah, AuctionEntry *entry)
virtual void OnAuctionExpire(AuctionHouseObject *ah, AuctionEntry *entry)
AuctionHouseScript(char const *name)
virtual void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionEntry *entry)
BattlefieldScript(char const *name)
BattlegroundMapScript(char const *name, uint32 mapId)
BattlegroundScript(char const *name)
CommandScript(char const *name)
virtual bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
ConditionScript(char const *name)
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void Visit(std::unordered_map< ObjectGuid, ObjectType * > &objects)
void Visit(std::unordered_map< ObjectGuid, O * > &)
This hook is responsible for swapping Creature and GameObject AI's.
static void InitializeScriptIdsFromSet(std::unordered_set< uint32 > const &idsToRemove)
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
static void UnloadResetScript(GameObject *gameobject)
static void UnloadResetScript(Creature *creature)
static void LoadResetScript(Creature *creature)
void BeforeUnload() final override
Called before Unload.
std::unordered_set< uint32 > ids_removed_
static void DestroyScriptIdsFromSet(std::unordered_set< uint32 > const &idsToRemove)
static void LoadInitializeScript(GameObject *gameobject)
static GameObject * GetEntityFromMap(std::common_type< GameObject >, Map *map, ObjectGuid const &guid)
void BeforeSwapContext(bool initialize) override
Called before SwapContext.
static Creature * GetEntityFromMap(std::common_type< Creature >, Map *map, ObjectGuid const &guid)
static void LoadResetScript(GameObject *gameobject)
static void UnloadDestroyScript(GameObject *gameobject)
static void LoadInitializeScript(Creature *creature)
static void UnloadDestroyScript(Creature *creature)
static void VisitObjectsToSwapOnMap(Map *map, std::unordered_set< uint32 > const &idsToRemove, T visitor)
CreatureScript(char const *name)
bool AIM_Destroy()
Definition Creature.cpp:999
uint32 GetScriptId() const
bool AIM_Create(CreatureAI *ai=nullptr)
CreatureAI * AI() const
Definition Creature.h:154
virtual void OnUpdate(DynamicObject *obj, uint32 diff)
DynamicObjectScript(char const *name)
void KillAllEvents(bool force)
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
FormulaScript(char const *name)
virtual void OnBaseGainCalculation(uint32 &gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content)
virtual void OnGrayLevelCalculation(uint8 &grayLevel, uint8 playerLevel)
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)
GameObjectAI * AI() const
Definition GameObject.h:275
bool AIM_Initialize()
uint32 GetScriptId() const
void AIM_Destroy()
Definition Map.h:155
GroupScript(char const *name)
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)
virtual void OnRemoveMember(Group *group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const *reason)
Definition Group.h:165
virtual void OnMemberWitdrawMoney(Guild *guild, Player *player, uint32 &amount, bool isRepair)
virtual void OnEvent(Guild *guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
virtual void OnRemoveMember(Guild *guild, Player *player, bool isDisbanding, bool isKicked)
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 OnBankEvent(Guild *guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
virtual void OnDisband(Guild *guild)
GuildScript(char const *name)
virtual void OnAddMember(Guild *guild, Player *player, uint8 &plRank)
virtual void OnMemberDepositMoney(Guild *guild, Player *player, uint32 &amount)
Definition Guild.h:284
virtual InstanceScript * GetInstanceScript(InstanceMap *map) const
InstanceMapScript(char const *name, uint32 mapId)
uint32 GetScriptId() const
Definition Map.h:885
bool IsAreaTriggerDone(uint32 id) const
void MarkAreaTriggerDone(uint32 id)
void ResetAreaTriggerDone(uint32 id)
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)
virtual bool OnCastItemCombatSpell(Player *player, Unit *victim, SpellInfo const *spellInfo, Item *item)
virtual bool OnExpire(Player *player, ItemTemplate const *proto)
ItemScript(char const *name)
Definition Item.h:62
uint32 GetScriptId() const
Definition Item.h:208
virtual void OnCreate(TMap *map)
MapScript(MapEntry const *mapEntry)
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:281
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:489
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:4430
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:4397
uint32 LowType
Definition ObjectGuid.h:142
static Creature * ToCreature(Object *o)
Definition Object.h:186
TypeID GetTypeId() const
Definition Object.h:93
bool OnTrigger(Player *, AreaTriggerEntry const *) final override
virtual bool TryHandleOnce(Player *player, AreaTriggerEntry const *trigger)=0
void ResetAreaTriggerDone(InstanceScript *instance, uint32 triggerId)
OutdoorPvPScript(char const *name)
void ClearMenus()
virtual void OnReputationChange(Player *player, uint32 factionId, int32 &standing, bool incremental)
virtual void OnMoneyChanged(Player *player, int32 &amount)
virtual void OnTalentsReset(Player *player, bool involuntarily)
virtual void OnLevelChanged(Player *player, uint8 oldLevel)
virtual void OnDuelRequest(Player *target, Player *challenger)
virtual void OnMovieComplete(Player *player, uint32 movieId)
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)
PlayerScript(char const *name)
virtual void OnQuestStatusChange(Player *player, uint32 questId)
virtual void OnEmote(Player *player, Emote emote)
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 OnMoneyLimit(Player *player, int32 amount)
virtual void OnCreate(Player *player)
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)
PlayerMenu * PlayerTalkClass
Definition Player.h:1969
bool OnItemUse(Player *player, Item *item, SpellCastTargets const &targets)
void OnPlayerDelete(ObjectGuid guid, uint32 accountId)
void OnPlayerLogin(Player *player, bool firstLogin)
void OnPlayerCreate(Player *player)
void OnBaseGainCalculation(uint32 &gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content)
void OnEmailChange(uint32 accountId)
std::shared_ptr< ModuleReference > AcquireModuleReferenceOfScriptName(std::string const &scriptname) const
void CreateSpellScripts(uint32 spellId, std::vector< SpellScript * > &scriptVector, Spell *invoker) const
void OnGuildAddMember(Guild *guild, Player *player, uint8 &plRank)
void OnOpenStateChange(bool open)
OutdoorPvP * CreateOutdoorPvP(uint32 scriptId)
void OnShutdownCancel()
void OnMovieComplete(Player *player, uint32 movieId)
void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionEntry *entry)
void OnShutdown()
void OnPlayerFreeTalentPointsChanged(Player *player, uint32 newPoints)
void OnLoadGridMap(Map *map, GridMap *gmap, uint32 gx, uint32 gy)
void OnPlayerEmote(Player *player, Emote emote)
void ModifyPeriodicDamageAurasTick(Unit *target, Unit *attacker, uint32 &damage)
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 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)
Battleground * CreateBattleground(BattlegroundTypeId typeId)
void SwapScriptContext(bool initialize=false)
uint32 GetScriptCount() const
Definition ScriptMgr.h:838
void OnHeal(Unit *healer, Unit *reciever, uint32 &gain)
void OnUninstall(Vehicle *veh)
void OnPlayerLeaveMap(Map *map, Player *player)
void OnDynamicObjectUpdate(DynamicObject *dynobj, uint32 diff)
void OnGuildDisband(Guild *guild)
bool OnCriteriaCheck(uint32 scriptId, Player *source, Unit *target)
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 OnAuctionExpire(AuctionHouseObject *ah, AuctionEntry *entry)
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)
virtual ~ScriptMgr()
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 OnGuildRemoveMember(Guild *guild, Player *player, bool isDisbanding, bool isKicked)
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 OnQuestObjectiveProgress(Player *player, Quest const *quest, uint32 objectiveIndex, uint16 progress)
void OnPlayerSpellCast(Player *player, Spell *spell, bool skipCheck)
void OnPVPKill(Player *killer, Player *killed)
void OnWorldUpdate(uint32 diff)
void ModifySpellDamageTaken(Unit *target, Unit *attacker, int32 &damage)
void OnGroupRateCalculation(float &rate, uint32 count, bool isRaid)
void OnSocketOpen(std::shared_ptr< WorldSocket > const &socket)
GameObjectAI * GetGameObjectAI(GameObject *go)
std::vector< Trinity::ChatCommands::ChatCommandBuilder > GetChatCommands()
Battlefield * CreateBattlefield(uint32 scriptId)
void OnGuildMemberWitdrawMoney(Guild *guild, Player *player, uint32 &amount, bool isRepair)
void OnNetworkStop()
void OnReset(Vehicle *veh)
void Unload()
void OnPlayerMoneyChanged(Player *player, int32 &amount)
bool OnAreaTrigger(Player *player, AreaTriggerEntry const *trigger)
void OnGroupAddMember(Group *group, ObjectGuid guid)
void OnGroupDisband(Group *group)
void OnZeroDifferenceCalculation(uint8 &diff, uint8 playerLevel)
void OnPlayerMoneyLimit(Player *player, int32 amount)
std::string _currentContext
Definition ScriptMgr.h:1085
void SetScriptContext(std::string const &context)
void OnInstallAccessory(Vehicle *veh, Creature *accessory)
void OnGuildMOTDChanged(Guild *guild, const std::string &newMotd)
ScriptLoaderCallbackType _script_loader_callback
Definition ScriptMgr.h:1083
void OnDamage(Unit *attacker, Unit *victim, uint32 &damage)
void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask)
void OnPlayerTalentsReset(Player *player, bool involuntarily)
void OnGuildInfoChanged(Guild *guild, const std::string &newInfo)
void OnPlayerKilledByCreature(Creature *killer, Player *killed)
void OnGainCalculation(uint32 &gain, Player *player, Unit *unit)
void OnPlayerLevelChanged(Player *player, uint8 oldLevel)
void OnPlayerSave(Player *player)
void OnPlayerLogout(Player *player)
void OnGivePlayerXP(Player *player, uint32 &amount, Unit *victim)
void OnPlayerDuelRequest(Player *target, Player *challenger)
void OnConfigLoad(bool reload)
void OnMapUpdate(Map *map, uint32 diff)
CreatureAI * GetCreatureAI(Creature *creature)
void LoadDatabase()
void OnUnloadGridMap(Map *map, GridMap *gmap, uint32 gx, uint32 gy)
void OnPlayerTextEmote(Player *player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
void OnPlayerEnterMap(Map *map, Player *player)
void OnGuildBankEvent(Guild *guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
void OnInstall(Vehicle *veh)
InstanceScript * CreateInstanceData(InstanceMap *map)
void OnGuildMemberDepositMoney(Guild *guild, Player *player, uint32 &amount)
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)
void OnRelocate(Transport *transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
void OnStartup()
void OnPacketReceive(WorldSession *session, WorldPacket const &packet)
void OnCreatureKill(Player *killer, Creature *killed)
void OnGuildCreate(Guild *guild, Player *leader, const std::string &name)
void OnAuctionAdd(AuctionHouseObject *ah, AuctionEntry *entry)
void OnAddCreaturePassenger(Transport *transport, Creature *creature)
void OnPlayerDuelStart(Player *player1, Player *player2)
void OnAuctionRemove(AuctionHouseObject *ah, AuctionEntry *entry)
void OnPasswordChange(uint32 accountId)
void OnSocketClose(std::shared_ptr< WorldSocket > const &socket)
void OnNetworkStart()
void OnWeatherChange(Weather *weather, WeatherState state, float grade)
bool OnItemExpire(Player *player, ItemTemplate const *proto)
void OnCreateMap(Map *map)
void OnAddPassenger(Vehicle *veh, Unit *passenger, int8 seatId)
void OnPlayerRepop(Player *player)
static ScriptMgr * instance()
virtual ~ScriptObject()
std::string const & GetName() const
std::string const _name
Definition ScriptMgr.h:184
ScriptObject(char const *name)
Type erasure wrapper for objects.
DeleteableObjectBase & operator=(DeleteableObjectBase const &)=delete
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 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
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
virtual void Unload()=0
Unloads the script registry.
ScriptRegistryInterface(ScriptRegistryInterface const &)=delete
ScriptRegistryInterface(ScriptRegistryInterface &&)=delete
virtual void ReleaseContext(std::string const &context)=0
ScriptRegistryInterface & operator=(ScriptRegistryInterface const &)=delete
virtual ~ScriptRegistryInterface()
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
virtual void BeforeUnload()
Called before Unload.
ScriptRegistrySwapHookBase(ScriptRegistrySwapHookBase const &)=delete
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 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 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)
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 Unload() final override
Unloads the script registry.
ScriptStoreType::iterator ScriptStoreIteratorType
void ReleaseContext(std::string const &context) final override
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 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 ReleaseContext(std::string const &context) final override
void Unload() final override
Unloads the script registry.
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > const & GetEffects() const
Definition SpellInfo.h:482
SpellScriptLoader(char const *name)
virtual SpellScript * GetSpellScript() const
virtual AuraScript * GetAuraScript() const
Definition Spell.h:152
virtual void OnUpdate(Transport *transport, uint32 diff)
virtual void OnAddCreaturePassenger(Transport *transport, Creature *creature)
virtual void OnAddPassenger(Transport *transport, Player *player)
virtual void OnRelocate(Transport *transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
virtual void OnRemovePassenger(Transport *transport, Player *player)
TransportScript(char const *name)
static void FillAISpellInfo()
Definition UnitAI.cpp:182
virtual void InitializeAI()
Definition UnitAI.cpp:36
static AISpellInfoType * AISpellInfo
Definition UnitAI.h:252
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)
UnitScript(char const *name)
virtual void ModifyMeleeDamage(Unit *target, Unit *attacker, uint32 &damage)
virtual void ModifySpellDamageTaken(Unit *target, Unit *attacker, int32 &damage)
Definition Unit.h:769
void ClearUnitState(uint32 f)
Definition Unit.h:877
bool IsCharmed() const
Definition Unit.h:1280
bool IsAlive() const
Definition Unit.h:1234
void RemoveCharmedBy(Unit *charmer)
Definition Unit.cpp:11666
Vehicle * GetVehicleKit() const
Definition Unit.h:1735
This hook is responsible for swapping OutdoorPvP's.
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
virtual void OnUninstall(Vehicle *veh)
VehicleScript(char const *name)
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
May be called from scripts.
Definition Vehicle.h:45
void Reset(bool evading=false)
Reapplies immunities and reinstalls accessories. Only has effect for creatures.
Definition Vehicle.cpp:137
virtual void OnChange(Weather *weather, WeatherState state, float grade)
virtual void OnUpdate(Weather *weather, uint32 diff)
WeatherScript(char const *name)
Weather for one zone.
Definition Weather.h:67
WorldMapScript(char const *name, uint32 mapId)
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
EventProcessor m_Events
Definition Object.h:591
virtual void OnOpenStateChange(bool open)
virtual void OnShutdownCancel()
virtual void OnShutdown()
virtual void OnConfigLoad(bool reload)
virtual void OnStartup()
WorldScript(char const *name)
virtual void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask)
virtual void OnUpdate(uint32 diff)
virtual void OnMotdChange(std::string &newMotd)
Player session in the World.
uint32 GetScriptId() const
Definition Weather.h:83
WeatherState
Definition Weather.h:47
ShutdownExitCode
Definition World.h:62
ShutdownMask
Definition World.h:55
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:50
TC_GAME_API void InvalidateCommandMap()
void AddSC_LFGScripts()
STL namespace.
uint32 ScriptId