---
redirect_from: "/sai"
---
# smart\_scripts
[<-Back-to:World](database-world.md)
The `smart_scripts` table has 31 attributes. It serves to make scripts in SQL language. The important thing is always to analyze, who is the event that motivates the execution of an action and of course, who is the objective. As a recommendation, you can review the scripts that are already inside the table, to understand how it works. The advantage, for which several use this method, is that it is not required to compile, when adding records, with restarting the server, if it is well programmed, you can appreciate the changes. Another reason is the portability, but it depends on the point of view of the developer, the response you can get.
**Table Structure**
| Field | Type | Attributes | Key | Null | Default | Extra | Comment |
| --------------------- | -------- | ---------- | --- | ---- | ------- | ----- | ------------- |
| [entryorguid][1] | INT | SIGNED | PRI | NO | | | |
| [source_type][2] | TINYINT | UNSIGNED | PRI | NO | 0 | | |
| [id][3] | SMALLINT | UNSIGNED | PRI | NO | 0 | | |
| [link][4] | SMALLINT | UNSIGNED | PRI | NO | 0 | | |
| [event_type][5] | TINYINT | UNSIGNED | | NO | 0 | | |
| [event_phase_mask][6] | SMALLINT | UNSIGNED | | NO | 0 | | |
| [event_chance][7] | TINYINT | UNSIGNED | | NO | 100 | | |
| [event_flags][8] | SMALLINT | UNSIGNED | | NO | 0 | | |
| [event_param1][5] | INT | UNSIGNED | | NO | 0 | | |
| [event_param2][5] | INT | UNSIGNED | | NO | 0 | | |
| [event_param3][5] | INT | UNSIGNED | | NO | 0 | | |
| [event_param4][5] | INT | UNSIGNED | | NO | 0 | | |
| [event_param5][5] | INT | UNSIGNED | | NO | 0 | | |
| [event_param6][5] | INT | UNSIGNED | | NO | 0 | | |
| [action_type][9] | TINYINT | UNSIGNED | | NO | 0 | | |
| [action_param1][9] | INT | UNSIGNED | | NO | 0 | | |
| [action_param2][9] | INT | UNSIGNED | | NO | 0 | | |
| [action_param3][9] | INT | UNSIGNED | | NO | 0 | | |
| [action_param4][9] | INT | UNSIGNED | | NO | 0 | | |
| [action_param5][9] | INT | UNSIGNED | | NO | 0 | | |
| [action_param6][9] | INT | UNSIGNED | | NO | 0 | | |
| [target_type][10] | TINYINT | UNSIGNED | | NO | 0 | | |
| [target_param1][10] | INT | UNSIGNED | | NO | 0 | | |
| [target_param2][10] | INT | UNSIGNED | | NO | 0 | | |
| [target_param3][10] | INT | UNSIGNED | | NO | 0 | | |
| [target_param4][10] | INT | UNSIGNED | | NO | 0 | | |
| [target_x][10] | FLOAT | SIGNED | | NO | 0 | | |
| [target_y][10] | FLOAT | SIGNED | | NO | 0 | | |
| [target_z][10] | FLOAT | SIGNED | | NO | 0 | | |
| [target_o][10] | FLOAT | SIGNED | | NO | 0 | | |
| [comment][11] | text | | | NO | | | Event Comment |
[1]: #entryorguid
[2]: #sourcetype
[3]: #id
[4]: #link
[5]: #eventtype
[6]: #eventphasemask
[7]: #eventchance
[8]: #eventflags
[9]: #actiontype
[10]: #targettype
[11]: #comment
**Description of the fields**
### entryorguid
- EntryOrGuid > 0: `entry` of the creature / game object / etc.
- EntryOrGuid < 0: `guid` of the creature / game object / etc.
- **Depends on source\_type.**
When using GUID-specific SAI, the extra_flag DONT_OVERRIDE_SAI_ENTRY allows us to not require duplicating rows shared between all creatures of the same entry.
For example, you can keep all movement-related scripting in the GUID script, while combat scripting is handled by the ENTRY script.
For creatures that use this flag, SAI row IDs cannot overlap, thus we use row IDs starting with 1000 and incrementing it (e.g. 1000, 1001, 1002, ...).
### source\_type
Object type: creature, game object, spell. see table below for values
| Name | Value |
| -------------------------------------- | ----- |
| SMART\_SCRIPT\_TYPE\_CREATURE | 0 |
| SMART\_SCRIPT\_TYPE\_GAMEOBJECT | 1 |
| SMART\_SCRIPT\_TYPE\_AREATRIGGER | 2 |
| SMART\_SCRIPT\_TYPE\_TIMED\_ACTIONLIST | 9 |
### id
Incremental id *bound* to each entryorguid & source\_type (0, 1, 2, ...).
### link
Simple event linking;
- Example: if id = 0 and link = 1; id 1 will only be able to occur if id = 0 was triggered (id 1 has to use event\_type SMART\_EVENT\_LINK).
- Smart\_event to be used.
**Thanks to the use of links, you can execute several actions, keeping the same event.**
### event\_phase\_mask
When dealing with phases, *phase IDs* have to be used. There are 13 (12+1) different phases: 1, 2, ... 12 and the default 0.
**Example:** The script is in phase 0 by default - If we want it to go to phase 1, we got two choices:
- SMART\_ACTION\_INC\_PHASE by 1 or SMART\_ACTION\_SET\_PHASE 1
If the script is in phase 0 and want to skip to phase 2:
- SMART\_ACTION\_INC\_PHASE by 2 or SMART\_ACTION\_SET\_PHASE 2
If the script is in phase 1 and want to skip to phase 2:
- SMART\_ACTION\_INC\_PHASE by 1 or SMART\_ACTION\_SET\_PHASE 2
| Name | Flag | Hex | Comment |
| -------------------------------- | ---- | ----- | --------------------------- |
| SMART\_EVENT\_PHASE\_ALWAYS\_BIT | 0 | 0x000 | Means all phases (1 ... 12) |
| SMART\_EVENT\_PHASE\_1 | 1 | 0x001 | Phase 1 only. |
| SMART\_EVENT\_PHASE\_2 | 2 | 0x002 | Phase 2 only. |
| SMART\_EVENT\_PHASE\_3 | 4 | 0x004 | Phase 3 only. |
| SMART\_EVENT\_PHASE\_4 | 8 | 0x008 | Phase 4 only. |
| SMART\_EVENT\_PHASE\_5 | 16 | 0x010 | Phase 5 only. |
| SMART\_EVENT\_PHASE\_6 | 32 | 0x020 | Phase 6 only. |
| SMART\_EVENT\_PHASE\_7 | 64 | 0x040 | Phase 7 only. |
| SMART\_EVENT\_PHASE\_8 | 128 | 0x080 | Phase 8 only. |
| SMART\_EVENT\_PHASE\_9 | 256 | 0x100 | Phase 9 only. |
| SMART\_EVENT\_PHASE\_10 | 512 | 0x200 | Phase 10 only. |
| SMART\_EVENT\_PHASE\_11 | 1024 | 0x400 | Phase 11 only. |
| SMART\_EVENT\_PHASE\_12 | 2048 | 0x800 | Phase 12 only. |
- Event will only be able to occur if creature/GO is in this phase.
- Example: If we want an event to only be able to occure in phase 1 and 4, **event\_phase\_mask** = 1+8 = 9
### event\_chance
This is the probability of the event to occur as a percentage from 0-100. So, if you want the event to occur roughly half of the time, then set this to 50.
### event\_flags
| Name | Flag | Hex | Comment |
| ------------------------------- | ---- | ----- | ---------------------------------------------- |
| SMART_EVENT_FLAG_NOT_REPEATABLE | 1 | 0x01 | Event can not repeat |
| SMART_EVENT_FLAG_DIFFICULTY_0 | 2 | 0x02 | Event only occurs in normal dungeon |
| SMART_EVENT_FLAG_DIFFICULTY_1 | 4 | 0x04 | Event only occurs in heroic dungeon |
| SMART_EVENT_FLAG_DIFFICULTY_2 | 8 | 0x08 | Event only occurs in normal raid |
| SMART_EVENT_FLAG_DIFFICULTY_3 | 16 | 0x10 | Event only occurs in heroic raid |
| SMART_EVENT_FLAG_RESERVED_5 | 32 | 0x20 | |
| SMART_EVENT_FLAG_RESERVED_6 | 64 | 0x40 | |
| SMART_EVENT_FLAG_DEBUG_ONLY | 128 | 0x80 | Event only occurs in debug build |
| SMART_EVENT_FLAG_DONT_RESET | 256 | 0x100 | Event will not reset in SmartScript::OnReset() |
| SMART_EVENT_FLAG_WHILE_CHARMED | 512 | 0x200 | Event occurs even if AI owner is charmed |
- Sets if the event should not repeat or should only happen in a given instance/dungeon difficulty (if applicable);
- Values can be added together (bitwise math).
### event\_type
| Name | Value | Param1 | Param2 | Param3 | Param4 | Param5 | Param6 | Comment |
| --------------------------------- | ----- | ----------------------------------------------------- | --------------------------- | ----------------- | ------------------------------- | -------------------- | -------------------- | ---------------------------------------------------------------------------- |
| SMART_EVENT_UPDATE_IC | 0 | InitialMin | InitialMax | RepeatMin | RepeatMax | | | In combat. |
| SMART_EVENT_UPDATE_OOC | 1 | InitialMin | InitialMax | RepeatMin | RepeatMax | | | Out of combat. |
| SMART_EVENT_HEALTH_PCT | 2 | HPMin% | HPMax% | RepeatMin | RepeatMax | | | Health Percentage |
| SMART_EVENT_MANA_PCT | 3 | ManaMin% | ManaMax% | RepeatMin | RepeatMax | | | Mana Percentage |
| SMART_EVENT_AGGRO | 4 | | | | | | | On Creature Aggro |
| SMART_EVENT_KILL | 5 | CooldownMin | CooldownMax | Player only (0/1) | Creature entry (if param3 is 0) | | | On Creature Kill |
| SMART_EVENT_DEATH | 6 | | | | | | | On Creature Death |
| SMART_EVENT_EVADE | 7 | | | | | | | On Creature Evade Attack |
| SMART_EVENT_SPELLHIT | 8 | SpellID | School | CooldownMin | CooldownMax | | | On Creature/Gameobject Spell Hit |
| SMART_EVENT_RANGE | 9 | InitialMin | InitialMax | RepeatMin | RepeatMax | MinDist | MaxDist | On Victim In Range |
| SMART_EVENT_OOC_LOS | 10 | NoHostile | MaxRange | CooldownMin | CooldownMax | 0/1 Player Only | | On Target In Distance Out of Combat |
| SMART_EVENT_RESPAWN | 11 | type (None = 0, Map = 1, Area = 2) | MapId | ZoneId | | | | On Creature/Gameobject Respawn |
| SMART_EVENT_TARGET_HEALTH_PCT | 12 | HPMin% | HPMax% | RepeatMin | RepeatMax | | | On Target Health Percentage |
| SMART_EVENT_VICTIM_CASTING | 13 | RepeatMin | RepeatMax | Spell id (0 any) | | | | On Target Casting Spell |
| SMART_EVENT_FRIENDLY_HEALTH | 14 | HPDeficit | Radius | RepeatMin | RepeatMax | | | On Friendly Health Deficit |
| SMART_EVENT_FRIENDLY_IS_CC | 15 | Radius | RepeatMin | RepeatMax | | | | |
| SMART_EVENT_FRIENDLY_MISSING_BUFF | 16 | SpellId | Radius | RepeatMin | RepeatMax | onlyInCombat | | On Friendly Lost Buff |
| SMART_EVENT_SUMMONED_UNIT | 17 | CretureId (0 all) | CooldownMin | CooldownMax | | | | On Creature/Gameobject Summoned Unit |
| SMART_EVENT_TARGET_MANA_PCT | 18 | ManaMin% | ManaMax% | RepeatMin | RepeatMax | | | On Target Mana Percentage |
| SMART_EVENT_ACCEPTED_QUEST | 19 | QuestID (0 any) | CooldownMin | CooldownMax | | | | On Target Accepted Quest |
| SMART_EVENT_REWARD_QUEST | 20 | QuestID (0 any) | CooldownMin | CooldownMax | | | | On Target Rewarded Quest |
| SMART_EVENT_REACHED_HOME | 21 | | | | | | | On Creature Reached Home |
| SMART_EVENT_RECEIVE_EMOTE | 22 | EmoteId | CooldownMin | CooldownMax | | | | On Receive Emote. |
| SMART_EVENT_HAS_AURA | 23 | SpellID | Stacks | RepeatMin | RepeatMax | | | On Creature Has Aura |
| SMART_EVENT_TARGET_BUFFED | 24 | SpellID | Stacks | RepeatMin | RepeatMax | | | On Target Buffed With Spell |
| SMART_EVENT_RESET | 25 | | | | | | | After Combat, On Respawn or Spawn |
| SMART_EVENT_IC_LOS | 26 | NoHostile | MaxRange | CooldownMin | CooldownMax | 0/1 Player Only | | On Target In Distance In Combat |
| SMART_EVENT_PASSENGER_BOARDED | 27 | CooldownMin | CooldownMax | | | | | |
| SMART_EVENT_PASSENGER_REMOVED | 28 | CooldownMin | CooldownMax | | | | | |
| SMART_EVENT_CHARMED | 29 | onRemove (0 - on apply, 1 - on remove) | | | | | | On Creature Charmed |
| SMART_EVENT_CHARMED_TARGET | 30 | | | | | | | On Target Charmed |
| SMART_EVENT_SPELLHIT_TARGET | 31 | SpellId | School | RepeatMin | RepeatMax | | | On Target Spell Hit |
| SMART_EVENT_DAMAGED | 32 | MinDmg | MaxDmg | RepeatMin | RepeatMax | | | On Creature Damaged |
| SMART_EVENT_DAMAGED_TARGET | 33 | MinDmg | MaxDmg | RepeatMin | RepeatMax | | | On Target Damaged |
| SMART_EVENT_MOVEMENTINFORM | 34 | MovementType (0=any) | PointID | | | | | ESCORT_MOTION_TYPE = 17, POINT_MOTION_TYPE = 8 |
| SMART_EVENT_SUMMON_DESPAWNED | 35 | Entry | CooldownMin | CooldownMax | | | | On Summoned Unit Despawned |
| SMART_EVENT_CORPSE_REMOVED | 36 | | | | | | | On Creature Corpse Removed |
| SMART_EVENT_AI_INIT | 37 | | | | | | | |
| SMART_EVENT_DATA_SET | 38 | Field | Value | CooldownMin | CooldownMax | | | On Creature/Gameobject Data Set, Can be used with SMART_ACTION_SET_DATA |
| SMART_EVENT_WAYPOINT_START | 39 | PointId (0 any) | pathId (0 any) | | | | | On Creature Waypoint ID Started |
| SMART_EVENT_WAYPOINT_REACHED | 40 | PointId (0 any) | pathId (0 any) | | | | | On Creature Waypoint ID Reached |
| SMART_EVENT_AREATRIGGER_ONTRIGGER | 46 | TriggerId (0 any) | | | | | | |
| SMART_EVENT_TEXT_OVER | 52 | creature_text.GroupID | creature.id (0 any) | | | | | On TEXT_OVER Event Triggered After SMART_ACTION_TALK |
| SMART_EVENT_RECEIVE_HEAL | 53 | MinHeal | MaxHeal | CooldownMin | CooldownMax | | | On Creature Received Healing |
| SMART_EVENT_JUST_SUMMONED | 54 | | | | | | | On Creature Just spawned |
| SMART_EVENT_WAYPOINT_PAUSED | 55 | PointId (0 any) | pathID (0 any) | | | | | On Creature Paused at Waypoint ID |
| SMART_EVENT_WAYPOINT_RESUMED | 56 | PointId (0 any) | pathID (0 any) | | | | | On Creature Resumed after Waypoint ID |
| SMART_EVENT_WAYPOINT_STOPPED | 57 | PointId (0 any) | pathID (0 any) | | | | | On Creature Stopped On Waypoint ID |
| SMART_EVENT_WAYPOINT_ENDED | 58 | PointId (0 any) | pathID (0 any) | | | | | On Creature Waypoint Path Ended |
| SMART_EVENT_TIMED_EVENT_TRIGGERED | 59 | Id | | | | | | |
| SMART_EVENT_UPDATE | 60 | InitialMin | InitialMax | RepeatMin | RepeatMax | | | |
| SMART_EVENT_LINK | 61 | | | | | | | Used to link together multiple events as a chain of events. |
| SMART_EVENT_GOSSIP_SELECT | 62 | gossip_menu_option.MenuID | gossip_menu_option.OptionID | | | | | On gossip clicked (gossip_menu_option). |
| SMART_EVENT_JUST_CREATED | 63 | | | | | | | On Gameobject Just spawned |
| SMART_EVENT_GOSSIP_HELLO | 64 | | | | | | | On Right-Click Creature/Gameobject that have gossip enabled. |
| SMART_EVENT_FOLLOW_COMPLETED | 65 | | | | | | | |
| SMART_EVENT_EVENT_PHASE_CHANGE | 66 | event phase mask | | | | | | On event phase mask set |
| SMART_EVENT_IS_BEHIND_TARGET | 67 | InitialMin | InitialMax | RepeatMin | RepeatMax | RangeMin | RangeMax | On Creature is behind target. |
| SMART_EVENT_GAME_EVENT_START | 68 | game_event.eventEntry | | | | | | On game_event started. |
| SMART_EVENT_GAME_EVENT_END | 69 | game_event.eventEntry | | | | | | On game_event ended. |
| SMART_EVENT_GO_STATE_CHANGED | 70 | State (0 - Active, 1 - Ready, 2 - Active alternative) | | | | | | |
| SMART_EVENT_GO_EVENT_INFORM | 71 | EventId | | | | | | |
| SMART_EVENT_ACTION_DONE | 72 | EventId | | | | | | |
| SMART_EVENT_ON_SPELLCLICK | 73 | | | | | | | |
| SMART_EVENT_FRIENDLY_HEALTH_PCT | 74 | InitialMin | InitialMax | RepeatMin | RepeatMax | Hp Percentage | Range | When a friendly creature within range falls below the HP Percentage |
| SMART_EVENT_DISTANCE_CREATURE | 75 | database guid | database entry | distance | repeat interval (ms) | | | On creature guid OR any instance of creature entry is within distance. |
| SMART_EVENT_DISTANCE_GAMEOBJECT | 76 | database guid | database entry | distance | repeat interval (ms) | | | On gameobject guid OR any instance of gameobject entry is within distance. |
| SMART_EVENT_COUNTER_SET | 77 | counterID | value | cooldownMin | cooldownMax | | | If the value of specified counterID is equal to a specified value |
| SMART_EVENT_SUMMONED_UNIT_DIES | 82 | CreatureId (0 all) | CooldownMin | CooldownMax | | | | |
| SMART_EVENT_NEAR_PLAYERS | 101 | minPlayers | Range (yards) | FirstCheck (ms) | RepeatMin (ms) | RepeatMax (ms) | | Event will trigger if there are more or equal than minPlayers in range. |
| SMART_EVENT_NEAR_PLAYERS_NEGATION | 102 | maxPlayers | Range (yards) | FirstCheck (ms) | RepeatMin (ms) | RepeatMax (ms) | | Event will trigger if there are less than maxPlayers in range. |
| SMART_EVENT_NEAR_UNIT | 103 | Unit type to check (0: creature 1: gob) | Entry (template) | Count | Range | Timer (ms) | | Will check for >= count of specified entry within range |
| SMART_EVENT_NEAR_UNIT_NEGATION | 104 | Unit type to check (0: creature 1: gob) | Entry (template) | Count | Range | Timer (ms) | | Will check for < count of specified entry within range |
| SMART_EVENT_AREA_CASTING | 105 | InitialMin | InitialMax | RepeatMin | RepeatMax | RangeMin | RangeMax | Check threat list for hostiles casting. If none are found, repeat in 1200ms |
| SMART_EVENT_AREA_RANGE | 106 | InitialMin | InitialMax | RepeatMin | RepeatMax | RangeMin | RangeMax | Check threat list for hostiles in range. If none are found, repeat in 1200ms |
| SMART_EVENT_SUMMONED_UNIT_EVADE | 107 | CreatureId (0 all) | CooldownMin | CooldownMax | | | | On Summoned Unit Evade |
### action\_type
| Name | Value | Param1 | Param2 | Param3 | Param4 | Param5 | Param6 | Comment |
| ----------------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SMART_ACTION_NONE | 0 | | | | | | | Do nothing |
| SMART_ACTION_TALK | 1 | creature_text.GroupID | Duration to wait before SMART_EVENT_TEXT_OVER is triggered. | 0 It will try to trigger talk of the target
1 Set target as talk target (used for $vars in texts and whisper target) | | | | Param2 in Milliseconds. |
| SMART_ACTION_SET_FACTION | 2 | FactionID (or 0 for default) | | | | | | Sets faction to creature. |
| SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL | 3 | creature_template.entry(param1) | creature_template.modelidx(param2) | | | | | Take DisplayID of creature (param1) OR Turn to DisplayID (param2) OR Both = 0 for Demorph |
| SMART_ACTION_SOUND | 4 | SoundId | onlySelf (0/1) | distance | | | | Play Sound; onlySelf = 1 only sends sound to self, onlySelf = 0 sends sound to everyone in visibility range |
| SMART_ACTION_PLAY_EMOTE | 5 | EmoteId | | | | | | Makes the target perform an Emote |
| SMART_ACTION_FAIL_QUEST | 6 | QuestID | | | | | | Fail Quest of Target |
| SMART_ACTION_OFFER_QUEST | 7 | quest_template.id | directAdd (0/1) | | | | | Add Quest to Target |
| SMART_ACTION_SET_REACT_STATE | 8 | ReactState | | | | | | React State. Can be Passive (0), Defensive (1), Aggressive (2). |
| SMART_ACTION_ACTIVATE_GOBJECT | 9 | | | | | | | Activate Object |
| SMART_ACTION_RANDOM_EMOTE | 10 | EmoteId1 | EmoteId2 | EmoteId3 | EmoteId4 | EmoteId5 | EmoteId6 | Play Random Emote |
| SMART_ACTION_CAST | 11 | SpellId | [castFlags](#cast-flags) | [triggeredFlags](#triggered-flags) | limitTargets (0 = all) | | | Cast Spell ID at Target(s) |
| SMART_ACTION_SUMMON_CREATURE | 12 | creature_template.entry | Summon type | duration in ms | attackInvoker (0/1/2) | attackScriptOwner (0/1) | | Summon Unit; attackInvoker 1: attack target; attackInvoker 2: attack actual invoker |
| SMART_ACTION_THREAT_SINGLE_PCT | 13 | Threat% inc | Threat% dec | | | | | Change Threat Percentage for Single Target |
| SMART_ACTION_THREAT_ALL_PCT | 14 | Threat% inc | Threat% dec | | | | | Change Threat Percentage for All Enemies |
| SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS | 15 | quest_template.id | | | | | | |
| SMART_ACTION_SET_EMOTE_STATE | 17 | EmoteId | | | | | | Play Emote Continuously |
| SMART_ACTION_SET_UNIT_FLAG | 18 | (may be more than one field OR'd together) | type
If false set creature_template.unit_flags
If true set creature_template.unit_flags2 | | | | | Can set Multi-able flags at once |
| SMART_ACTION_REMOVE_UNIT_FLAG | 19 | (may be more than one field OR'd together) | type
If false set creature_template.unit_flags
If true set creature_template.unit_flags2 | | | | | Can Remove Multi-able flags at once |
| SMART_ACTION_AUTO_ATTACK | 20 | AllowAttackState (0 = Stop attack, anything else means continue attacking) | | | | | | Stop or Continue Automatic Attack. |
| SMART_ACTION_ALLOW_COMBAT_MOVEMENT | 21 | AllowCombatMovement (0 = Stop combat based movement, anything else continue attacking) | | | | | | Allow or Disable Combat Movement |
| SMART_ACTION_SET_EVENT_PHASE | 22 | event_phase_mask | | | | | | Set event phase 0-12 (the actual values, no bit mask!) |
| SMART_ACTION_INC_EVENT_PHASE | 23 | Increment | Decrement | | | | | Set param1 OR param2 (not both). Value 0 has no effect. |
| SMART_ACTION_EVADE | 24 | | | | | | | Evade Incoming Attack |
| SMART_ACTION_FLEE_FOR_ASSIST | 25 | 0/1 (If you want the fleeing NPC to say attempts to flee text on flee, use 1 on param1. For no message use 0.) | | | | | | If you want the fleeing NPC to say '%s attempts to run away in fear' on flee, use 1 on param1. 0 for no message. |
| SMART_ACTION_CALL_GROUPEVENTHAPPENS | 26 | quest_template.id | | | | | | |
| SMART_ACTION_COMBAT_STOP | 27 | | | | | | | |
| SMART_ACTION_REMOVEAURASFROMSPELL | 28 | Spellid (0 removes all auras) | charges (0 removes aura) | | | | | |
| SMART_ACTION_FOLLOW | 29 | Distance (0 = Default value) | Angle (0 = Default value) | End creature_template.entry | credit | creditType (0 monsterkill, 1 event) | | Follow Target. If target type is NONE or SELF, Stop Follow |
| SMART_ACTION_RANDOM_PHASE | 30 | event_phase_mask 1 | event_phase_mask 2 | event_phase_mask 3 | event_phase_mask 4 | event_phase_mask 5 | event_phase_mask 6 | |
| SMART_ACTION_RANDOM_PHASE_RANGE | 31 | event_phase_mask minimum | event_phase_mask maximum | | | | | |
| SMART_ACTION_RESET_GOBJECT | 32 | | | | | | | Reset Gameobject |
| SMART_ACTION_CALL_KILLEDMONSTER | 33 | creature_template.entry | | | | | | This is the ID from quest_template.RequiredNpcOrGo |
| SMART_ACTION_SET_INST_DATA | 34 | Field | Data | | Type (0 = SetData, 1 = SetBossState) | | | Set Instance Data |
| SMART_ACTION_SET_INST_DATA64 | 35 | Field | | | | | | Set Instance Data uint64 |
| SMART_ACTION_UPDATE_TEMPLATE | 36 | creature_template.entry | Update Level | | | | | Updates creature_template to given entry |
| SMART_ACTION_DIE | 37 | Milliseconds | | | | | | Kill Target, if param1 is set, it will die after param1 milliseconds. 0: no delay, the target will die instantly |
| SMART_ACTION_SET_IN_COMBAT_WITH_ZONE | 38 | Range in yards for all players to be forced into combat with the creature. Only used in the open world. Leave as 0 if used in an instance. | | | | | | Sets the creature in combat with its zone, can be used in instances and open world. Useful for creatures inside instances so all players will be set in combat until the fight ends. |
| SMART_ACTION_CALL_FOR_HELP | 39 | Radius in yards that other creatures must be to acknowledge the cry for help. | 0/1 (say calls for help text) | | | | | If you want the NPC to say '%s calls for help!'. Use 1 on param1, 0 for no message. |
| SMART_ACTION_SET_SHEATH | 40 | Sheath (0-unarmed, 1-melee, 2-ranged) | | | | | | |
| SMART_ACTION_FORCE_DESPAWN | 41 | Despawn timer "ms" | Respawn Timer "s" | | | | | Despawn Target after param1 in Milliseconds. Respawn after param2 in seconds. |
| SMART_ACTION_SET_INVINCIBILITY_HP_LEVEL | 42 | flat hp value | percent hp value | | | | | If you use both params, only percent will be used. |
| SMART_ACTION_MOUNT_TO_ENTRY_OR_MODEL | 43 | creature_template.entry | creature_template.modelidx | | | | | Mount to Creature Entry (param1) OR Mount to Creature Display (param2) Or both = 0 for Unmount |
| SMART_ACTION_SET_INGAME_PHASE_MASK | 44 | creature.phaseMask | | | | | | |
| SMART_ACTION_SET_DATA | 45 | Field | Data | | | | | Set Data For Target, can be used with SMART_EVENT_DATA_SET |
| SMART_ACTION_MOVE_FORWARD | 46 | distance | | | | | | move self forward for the specified distance (point movement) |
| SMART_ACTION_SET_VISIBILITY | 47 | 0/1 | | | | | | Makes creature Visible = 1 or Invisible = 0 |
| SMART_ACTION_SET_ACTIVE | 48 | 0/1 | | | | | | If a creature or GO is set active it will stay active even if no player is near. Take care, though, as it needs additional ressources (CPU/RAM) to keep them active (other objects/creatures nearby stay active). |
| SMART_ACTION_ATTACK_START | 49 | | | | | | | Allows basic melee swings to creature. |
| SMART_ACTION_SUMMON_GO | 50 | gameobject_template.entry | De-spawn time in seconds. | targetSummon (0/1) | summonType (0 - after a specified time OR when the summoner dies, 1 - after a specified time) | | | Spawns Gameobject, use target_type to set spawn position; if an entity is specified as target and also coordinates are set (target x,y,z) those coordinates are handled as offset from the target's position; if targetSummon is 1 then the target will summon the GO on the position of the actor |
| SMART_ACTION_KILL_UNIT | 51 | | | | | | | Kills Creature. |
| SMART_ACTION_ACTIVATE_TAXI | 52 | TaxiID | | | | | | Sends player to flight path. You have to be close to Flight Master, which gives Taxi ID you need. |
| SMART_ACTION_WP_START | 53 | 0 = walk / 1 = run | waypoints.entry | canRepeat | quest_template.id | despawntime | reactState | Creature starts Waypoint Movement. Use waypoints table to create movement. |
| SMART_ACTION_WP_PAUSE | 54 | time (in ms) | | | | | | Creature pauses its Waypoint Movement for given time. |
| SMART_ACTION_WP_STOP | 55 | despawnTime | quest_template.id | fail (0/1) | | | | Creature stops its Waypoint Movement. |
| SMART_ACTION_ADD_ITEM | 56 | item_template.entry | count | | | | | Adds item(s) to player. |
| SMART_ACTION_REMOVE_ITEM | 57 | item_template.entry | count | | | | | Removes item(s) from player. |
| SMART_ACTION_INSTALL_AI_TEMPLATE | 58 | TemplateID (see Predefined SAI templates below) | | | | | | |
| SMART_ACTION_SET_RUN | 59 | 0 = Off / 1 = On | | | | | | |
| SMART_ACTION_SET_FLY | 60 | fly (0/1) | speed | disable gravity (0/1) | | | | Only works for creatures with inhabit air. |
| SMART_ACTION_SET_SWIM | 61 | 0 = Off / 1 = On | | | | | | |
| SMART_ACTION_TELEPORT | 62 | MapID | | | | | | Continue this action with the TARGET_TYPE column. Use any target_type (except 0), and use target_x, target_y, target_z, target_o as the coordinates |
| SMART_ACTION_SET_COUNTER | 63 | counterID | value | reset (0/1) | | | | If reset is 0 the counter with the specified ID is increased by the given value; if reset is 1 the counter is set to the value. |
| SMART_ACTION_STORE_TARGET_LIST | 64 | varID | | | | | | |
| SMART_ACTION_WP_RESUME | 65 | | | | | | | Creature continues in its Waypoint Movement. |
| SMART_ACTION_SET_ORIENTATION | 66 | Quick Change | Random orientation? (0/1) | Turning Angle (degrees) - The value will turn the creature counterclockwise. target_type must be NONE | | | | Used to alter the source's orientation. Depends on the script target. If SMART_TARGET_SELF, facing will be the same as in HomePosition, For SMART_TARGET_POSITION you need to set target_o : 0 = North, West = 1.5, South = 3, East = 4.5 |
| SMART_ACTION_CREATE_TIMED_EVENT | 67 | id | InitialMin | InitialMax | RepeatMin(only if it repeats) | RepeatMax(only if it repeats) | chance | |
| SMART_ACTION_PLAYMOVIE | 68 | entry | | | | | | |
| SMART_ACTION_MOVE_TO_POS | 69 | PointId | isTransport (0 or 1) | controlled (0 or 1) | ContactDistance | | | PointId is called by SMART_EVENT_MOVEMENTINFORM. Continue this action with the TARGET_TYPE column. Use any target_type, and use target_x, target_y, target_z as the coordinates; if an entity is specified as target and also coordinates are set (target x,y,z) those coordinates are handled as offset from the target's position |
| SMART_ACTION_RESPAWN_TARGET | 70 | Respawntime in seconds | | | | | | |
| SMART_ACTION_EQUIP | 71 | creature_equip_template.ID | Slotmask | Slot1 (item_template.entry) | Slot2 (item_template.entry) | Slot3 (item_template.entry) | | only slots with mask set will be sent to client, bits are 1, 2, 4, leaving mask 0 is defaulted to mask 7 (send all), Slots1-3 are only used if no Param1 is set |
| SMART_ACTION_CLOSE_GOSSIP | 72 | | | | | | | Closes gossip window. |
| SMART_ACTION_TRIGGER_TIMED_EVENT | 73 | id(>1) | | | | | | |
| SMART_ACTION_REMOVE_TIMED_EVENT | 74 | id(>1) | | | | | | |
| SMART_ACTION_ADD_AURA | 75 | SpellId | | | | | | Adds aura to player(s). Use target_type 17 to make AoE aura. |
| SMART_ACTION_OVERRIDE_SCRIPT_BASE_OBJECT | 76 | | | | | | | WARNING: CAN CRASH CORE, do not use if you dont know what you are doing |
| SMART_ACTION_RESET_SCRIPT_BASE_OBJECT | 77 | | | | | | | |
| SMART_ACTION_CALL_SCRIPT_RESET | 78 | | | | | | | |
| SMART_ACTION_SET_RANGED_MOVEMENT | 79 | attackDistance | attackAngle | | | | | Sets movement to follow at a specific range to the target. |
| SMART_ACTION_CALL_TIMED_ACTIONLIST | 80 | EntryOrGuid * 100 (entryorguid with 00 added after the entry, or 01, 02, 03 etc. for multiple action lists) | timer update type(0 OOC, 1 IC, 2 ALWAYS) | allowOverride (0 - Must finish current actionlist, 1 - Allow starting new actionlist during previous actionlist) | | | | |
| SMART_ACTION_SET_NPC_FLAG | 81 | creature_template.npcflag | | | | | | |
| SMART_ACTION_ADD_NPC_FLAG | 82 | creature_template.npcflag | | | | | | |
| SMART_ACTION_REMOVE_NPC_FLAG | 83 | creature_template.npcflag | | | | | | |
| SMART_ACTION_SIMPLE_TALK | 84 | creature_text.GroupID | | | | | | Makes a player say text. SMART_EVENT_TEXT_OVER is not triggered and whispers can not be used. |
| SMART_ACTION_SELF_CAST | 85 | SpellId | [castFlags](#cast-flags) | [triggeredFlags](#triggered-flags) | limitTargets (0 = all) | | | Makes the target cast spell on self. |
| SMART_ACTION_CROSS_CAST | 86 | SpellID | castFlags | CasterTargetType (caster is selected here, use it as target_type) | CasterTarget (target_param1) | CasterTarget (target_param2) | CasterTarget (target_param3) | This action is used to make selected caster (in CasterTargetType) to cast spell. Actual target is entered in target_type as normally. |
| SMART_ACTION_CALL_RANDOM_TIMED_ACTIONLIST | 87 | EntryOrGuid 1 (entryorguid * 100 + n) | EntryOrGuid 2 (entryorguid * 100 + n) | EntryOrGuid 3 (entryorguid * 100 + n) | EntryOrGuid 4 (entryorguid * 100 + n) | EntryOrGuid 5 (entryorguid * 100 + n) | EntryOrGuid 6 (entryorguid * 100 + n) | Will select one entry from the ones provided. 0 is ignored. |
| SMART_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST | 88 | EntryOrGuid 1 (entryorguid * 100 + n) | EntryOrGuid 2 (entryorguid * 100 + n) | | | | | 0 is ignored. |
| SMART_ACTION_RANDOM_MOVE | 89 | Radius | | | | | | Creature moves to random position in given radius. If radius is 0, then stop movement |
| SMART_ACTION_SET_UNIT_FIELD_BYTES_1 | 90 | Value | Type | | | | | |
| SMART_ACTION_REMOVE_UNIT_FIELD_BYTES_1 | 91 | Value | Type | | | | | |
| SMART_ACTION_INTERRUPT_SPELL | 92 | With delay (0/1) | SpellId | Instant (0/1) | | | | This action allows you to interrupt the current spell being cast. If you do not set the spellId, the core will find the current spell depending on the withDelay and the withInstant values. |
| SMART_ACTION_SEND_GO_CUSTOM_ANIM | 93 | animprogress (0-255) | | | | | | |
| SMART_ACTION_SET_DYNAMIC_FLAG | 94 | creature_template.dynamicflags | | | | | | |
| SMART_ACTION_ADD_DYNAMIC_FLAG | 95 | creature_template.dynamicflags | | | | | | |
| SMART_ACTION_REMOVE_DYNAMIC_FLAG | 96 | creature_template.dynamicflags | | | | | | |
| SMART_ACTION_JUMP_TO_POS | 97 | Speed XY | Speed Z | selfJump (0/1) | | | | If selfJump is 1 the actor will jump to the target (you can add an offset from the target's position by also specifying target coordinates); if selfJump is 0 the targeted creature will jump to the target position |
| SMART_ACTION_SEND_GOSSIP_MENU | 98 | gossip_menu.entry | gossip_menu.text_id
(same value as npc_text.ID) | | | | | Can be used together with 'SMART_EVENT_GOSSIP_HELLO' to set custom gossip. |
| SMART_ACTION_GO_SET_LOOT_STATE | 99 | LootState (0 - Not ready, 1 - Ready, 2 - Activated, 3 - Just deactivated) | | | | | | |
| SMART_ACTION_SEND_TARGET_TO_TARGET | 100 | Id | | | | | | Send targets previously stored with SMART_ACTION_STORE_TARGET, to another npc/go, the other npc/go can then access them as if it was its own stored list |
| SMART_ACTION_SET_HOME_POS | 101 | 0: if the target is a creature, set it's current position as it's new home position; if the target is SMART_TARGET_POSITION, use this position as new home position for the actor
1: if the target is a creature, reset it's home position to the one from the DB; if the target is SMART_TARGET_POSITION, reset the actor's home position to the one from the DB (the actual values of the target position are ignored) | | | | | | |
| SMART_ACTION_SET_HEALTH_REGEN | 102 | 0/1 | | | | | | Sets the current creatures health regen on or off. |
| SMART_ACTION_SET_ROOT | 103 | 0/1 | | | | | | Enables or disables creature movement |
| SMART_ACTION_SET_GO_FLAG | 104 | gameobject_template_addon.flags | | | | | | oldFlag = newFlag |
| SMART_ACTION_ADD_GO_FLAG | 105 | gameobject_template_addon.flags | | | | | | oldFlag \|= newFlag |
| SMART_ACTION_REMOVE_GO_FLAG | 106 | gameobject_template_addon.flags | | | | | | oldFlag &= ~newFlag |
| SMART_ACTION_SUMMON_CREATURE_GROUP | 107 | creature_summon_groups.groupId | attackInvoker (0/1) | attackScriptOwner (0/1) | | | | Use creature_summon_groups table. SAI target has no effect, use 0 |
| SMART_ACTION_SET_POWER | 108 | Power type | New power | | | | | |
| SMART_ACTION_ADD_POWER | 109 | Power type | Power to add | | | | | |
| SMART_ACTION_REMOVE_POWER | 110 | Power type | Power to remove | | | | | |
| SMART_ACTION_GAME_EVENT_STOP | 111 | game_event.eventEntry | | | | | | |
| SMART_ACTION_GAME_EVENT_START | 112 | game_event.eventEntry | | | | | | |
| SMART_ACTION_START_CLOSEST_WAYPOINT | 113 | wp1 | wp2 | wp3 | wp4 | wp5 | wp6 | Make target follow closest waypoint to its location |
| SMART_ACTION_RISE_UP | 114 | distance | | | | | | move up for the specified distance (warning: TC 3.3.5 uses another action here: SMART_ACTION_MOVE_OFFSET) |
| SMART_ACTION_RANDOM_SOUND | 115 | soundId1 | soundId2 | soundId3 | soundId4 | onlySelf (0/1) | distance | |
| SMART_ACTION_SET_CORPSE_DELAY | 116 | timer (secs) | | | | | | |
| SMART_ACTION_DISABLE_EVADE | 117 | 0/1 (1 = disabled, 0 = enabled) | | | | | | |
| SMART_ACTION_GO_SET_GO_STATE | 118 | state | | | | | | |
| SMART_ACTION_SET_SIGHT_DIST | 121 | SightDistance | | | | | | |
| SMART_ACTION_FLEE | 122 | FleeTime | | | | | | |
| SMART_ACTION_ADD_THREAT | 123 | +threat | -threat | | | | | |
| SMART_ACTION_LOAD_EQUIPMENT | 124 | Id | force | | | | | |
| SMART_ACTION_TRIGGER_RANDOM_TIMED_EVENT | 125 | id min range | id max range | | | | | |
| SMART_ACTION_REMOVE_ALL_GAMEOBJECTS | 126 | | | | | | | |
| SMART_ACTION_INVOKER_CAST | 134 | SpellId | CastFlags | TriggerFlags | LimitTargets - 0: all targets | | | Make our action invoker type cast a spell to our target type |
| SMART_ACTION_PLAY_CINEMATIC | 135 | entry | | | | | | |
| SMART_ACTION_SET_MOVEMENT_SPEED | 136 | movementType | speedInteger | speedFraction | | | | MOVE_WALK = 0, MOVE_RUN = 1, MOVE_RUN_BACK = 2, MOVE_SWIM = 3, MOVE_SWIM_BACK= 4, MOVE_TURN_RATE= 5, MOVE_FLIGHT = 6, MOVE_FLIGHT_BACK = 7, MOVE_PITCH_RATE = 8 |
| SMART_ACTION_SET_HEALTH_PCT | 142 | percent | | | | | | |
| SMART_ACTION_MOVE_TO_POS_TARGET | 201 | pointId | | | | | | |
| SMART_ACTION_EXIT_VEHICLE | 203 | | | | | | | |
| SMART_ACTION_SET_UNIT_MOVEMENT_FLAGS | 204 | flags | | | | | | |
| SMART_ACTION_SET_COMBAT_DISTANCE | 205 | combatDistance | | | | | | |
| SMART_ACTION_SET_CASTER_COMBAT_DIST | 206 | followDistance | resetToMax | | | | | |
| SMART_ACTION_SET_HOVER | 207 | 0/1 | | | | | | |
| SMART_ACTION_ADD_IMMUNITY | 208 | type | id | value | | | | |
| SMART_ACTION_REMOVE_IMMUNITY | 209 | type | id | value | | | | |
| SMART_ACTION_FALL | 210 | | | | | | | |
| SMART_ACTION_SET_EVENT_FLAG_RESET | 211 | 0/1 | | | | | | |
| SMART_ACTION_STOP_MOTION | 212 | stopMoving | movementExpired | | | | | |
| SMART_ACTION_NO_ENVIRONMENT_UPDATE | 213 | | | | | | | |
| SMART_ACTION_ZONE_UNDER_ATTACK | 214 | | | | | | | |
| SMART_ACTION_LOAD_GRID | 215 | | | | | | | |
| SMART_ACTION_MUSIC | 216 | SoundId | onlySelf | type | | | | Plays the specified sound file as music. Type can be one of these values:
0: Play music for the specified target(s)
1: Play music for all players in the entire zone
2: Play music for all players in the area. |
| SMART_ACTION_RANDOM_MUSIC | 217 | SoundId1 | SoundId2 | SoundId3 | SoundId4 | onlySelf | type | Plays randomly one of the specified sound files as music. Type can be one of these values:
0: Play music for the specified target(s)
1: Play music for all players in the entire zone
2: Play music for all players in the area. |
| SMART_ACTION_CUSTOM_CAST | 218 | spellId | castFlag | bp0 | bp1 | bp2 | | |
| SMART_ACTION_CONE_SUMMON | 219 | entry | Duration (ms)
0 = permanent | Distance between rings (yards) | Distance between each summons in a row (yards) | Length of the cone (yards) | Width of the cone (angle 1°-360°) | Allows you to spawn creatures in a cone (As seen in later expansions). Useful for custom cone aoes |
| SMART_ACTION_PLAYER_TALK | 220 | acore_string.id | yell? (0/1) | | | | | Make the player say something |
| SMART_ACTION_VORTEX_SUMMON | 221 | entry | Duration (ms)
0 = permanent | Spiral scaling | Spiral appearance | range max | phi_delta | Allows you to summon creature in a customizable spiral(/vortex). Parameters can be confusing, exmaple parameters for testing: 5000 - summon duration, 5 - Spiral Scaling, 25 - spiral appearance, 60 - range max, 40 - phi delta |
| SMART_ACTION_CU_ENCOUNTER_START | 222 | | | | | | | Resets all cooldowns and removes exhausted debuffs when action is called |
| SMART_ACTION_DO_ACTION | 223 | ActionId | | | | | | Allows to call for a DoAction in code |
| SMART_ACTION_ATTACK_STOP | 224 | | | | | | | Stop melee, spell casting during combat, chasing the target and facing |
| SMART_ACTION_SET_GUID | 225 | 0/1 (0 = Self Guid, 1 = Invoker Guid) | Index | | | | | Allows the target to perform an action similar to DO_ACTION, but allows a guid to be sent |
| SMART_ACTION_DISABLE | 226 | 0/1 (0 = Disable, 1 = Enable) | | | | | | Disable the targeted creatures, setting them Invisible and Immune to All |
| SMART_ACTION_SET_SCALE | 227 | scale - this value is the percentage of the new scale the targets will take. 100 = default | | | | | | Sets the scale for the targeted creatures |
| SMART_ACTION_SUMMON_RADIAL | 228 | summonEntry - CreatureID to be summoned | summonDuration - duration in ms which the summons will despawn after, if 0 then despawn on death | repetitions - amount of creatures to be summoned | startAngle - offset in degrees, 0: same as source | stepAngle - how many degrees to turn for each summon | dist - distance offset | Summons a set of creatures in a radial pattern, with orientation change specified in parameters |
| SMART_ACTION_PLAY_SPELL_VISUAL | 229 | visualId - can be found within SpellVisual.dbc | | | | | | Makes the targets play the VisualKit ID specified |
| SMART_ACTION_FOLLOW_GROUP | 230 | Follow State (0: Stop Follow, 1: Start Follow) | Smart Follow Type | Distance from Leader divided by 100 (300 = 3.f yards) | | | | Makes the targets follow the source creature in the specified formation. See Smart Follow Types below |
| SMART_ACTION_ORIENTATION_TARGET | 231 | Type (0: Reset to default, 1: Use target.o parameter, 2: Targets face this unit, 3: Use parameters to target a specific creature) | target_type | target_param1 | target_param2 | target_param3 | target_param4 | Makes the targets face a specific orientation. If type = 3, then use the parameters as if it were a smart target and they'll face the newly-selected unit |
### Predefined SAI templates
| Description Name | Value (Param1) | Param2 | Param3 | Param4 | Param5 | Param6 | Comment |
| ------------------------------- | -------------- | ------------ | ------------------------------ | --------- | ------ | ----------- | -------------------------------- |
| SMARTAI_TEMPLATE_BASIC | 0 | | | | | | |
| SMARTAI_TEMPLATE_CASTER | 1 | spellid | repeatMin | repeatMax | range | manaPCT | +JOIN: target_param1 as castFlag |
| SMARTAI_TEMPLATE_TURRET | 2 | spellid | repeatMin | repeatMax | range | manaPCT | +JOIN: target_param1 as castflag |
| SMARTAI_TEMPLATE_PASSIVE | 3 | | | | | | |
| SMARTAI_TEMPLATE_CAGED_GO_PART | 4 | creatureID | give credit at point end (0/1) | | | | |
| SMARTAI_TEMPLATE_CAGED_NPC_PART | 5 | gameObjectID | despawntime | run (0/1) | dist | TextGroupID | |
### target_type
| Name | Value | target_param1 | target_param2 | target_param3 | target_param4 | target_x | target_y | target_z | target_o | Comment |
| ----------------------------------- | ----- | -------------------------------------------------- | --------------------------------------------- | ------------------------------------------------------ | ------------------------------------- | -------- | -------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| SMART_TARGET_NONE | 0 | | | | | | | | | None. |
| SMART_TARGET_SELF | 1 | | | | | | | | | Self cast. |
| SMART_TARGET_VICTIM | 2 | | | | | | | | | Our current target. (ie: highest aggro) |
| SMART_TARGET_HOSTILE_SECOND_AGGRO | 3 | Max Range (0: Unlimited) | Player Only (0/1) | Power Type + 1 | Missing Aura | | | | | Second highest aggro. |
| SMART_TARGET_HOSTILE_LAST_AGGRO | 4 | Max Range (0: Unlimited) | Player Only (0/1) | Power Type + 1 | Missing Aura | | | | | Dead last on aggro. |
| SMART_TARGET_HOSTILE_RANDOM | 5 | Max Range (0: Unlimited) | Player Only (0/1) | Power Type + 1 | Missing Aura | | | | | Just any random target on our threat list. |
| SMART_TARGET_HOSTILE_RANDOM_NOT_TOP | 6 | Max Range (0: Unlimited) | Player Only (0/1) | Power Type + 1 | Missing Aura | | | | | Any random target except top threat. |
| SMART_TARGET_ACTION_INVOKER | 7 | | | | | | | | | Unit who caused this Event to occur. |
| SMART_TARGET_POSITION | 8 | | | | | x | y | z | o | Use xyz from event params. |
| SMART_TARGET_CREATURE_RANGE | 9 | creature_template.entry (0 any) | minDist | maxDist | alive state (1 alive, 2 dead, 0 both) | | | | | All creatures with the specified ID within the specified range and the specified alive state. |
| SMART_TARGET_CREATURE_GUID | 10 | creature.guid | creature_template.entry | getFromHashMap (0/1, this does not work in instances!) | | | | | | Creature with specified GUID and/or specified creature template ID. |
| SMART_TARGET_CREATURE_DISTANCE | 11 | creature_template.entry (0 any) | maxDist | alive state (1 alive, 2 dead, 0 both) | | | | | | All creatures with the specified ID within the specified distance and the specified alive state. |
| SMART_TARGET_STORED | 12 | id | | | | | | | | Uses pre-stored target(list) |
| SMART_TARGET_GAMEOBJECT_RANGE | 13 | gameobject_template.entry (0 any) | minDist | maxDist | | | | | | All game objects with the specified ID within the specified range. |
| SMART_TARGET_GAMEOBJECT_GUID | 14 | gameobject.guid | gameobject_template.entry | getFromHashMap (0/1, this does not work in instances!) | | | | | | Object with specified GUID and/or specified game object template ID. |
| SMART_TARGET_GAMEOBJECT_DISTANCE | 15 | gameobject_template.entry (0 any) | maxDist | | | | | | | All objects with the specified ID within the specified distance. |
| SMART_TARGET_INVOKER_PARTY | 16 | | | | | | | | | Invoker's party members |
| SMART_TARGET_PLAYER_RANGE | 17 | minDist | maxDist | maxCount | | | | | When target.o is set and it didnt find any targets in min-max range, it will try all possible targets in max range instead. | All players up to maxCount within the specified range. Excluding GMs and Dead. |
| SMART_TARGET_PLAYER_DISTANCE | 18 | maxDist | | | | | | | | All players within the specified distance. |
| SMART_TARGET_CLOSEST_CREATURE | 19 | creature_template.entry (0 any) | maxDist (Can be from 0-100 yards) | dead? (0/1) | | | | | | Closest creature with the specified ID within the specified range. |
| SMART_TARGET_CLOSEST_GAMEOBJECT | 20 | gameobject_template.entry (0 any) | maxDist (Can be from 0-100 yards) | | | | | | | Closest object with specified ID within specified range. |
| SMART_TARGET_CLOSEST_PLAYER | 21 | maxDist | | | | | | | | Closest player within specified range. |
| SMART_TARGET_ACTION_INVOKER_VEHICLE | 22 | | | | | | | | | Unit's vehicle who caused this Event to occur |
| SMART_TARGET_OWNER_OR_SUMMONER | 23 | use owner of owner (0/1) | | | | | | | | Unit's owner or summoner |
| SMART_TARGET_THREAT_LIST | 24 | maxDist (0 any) | | | | | | | | All units on creature's threat list within the specified distance if maxDist > 0 |
| SMART_TARGET_CLOSEST_ENEMY | 25 | maxDist | playerOnly (0/1) | | | | | | | Any attackable target (creature or player) within maxDist |
| SMART_TARGET_CLOSEST_FRIENDLY | 26 | maxDist | playerOnly (0/1) | | | | | | | Any friendly unit (creature, player or pet) within maxDist |
| SMART_TARGET_LOOT_RECIPIENTS | 27 | | | | | | | | | All players that have tagged this creature (for kill credit) |
| SMART_TARGET_FARTHEST | 28 | maxDist | playerOnly (0/1) | isInLos (0/1) | | | | | | Farthest unit on the threat list |
| SMART_TARGET_VEHICLE_PASSENGER | 29 | seat number (vehicle can target it's own accessory) | | | | | | | | |
| SMART_TARGET_PLAYER_WITH_AURA | 201 | spellID | Negative (0/1) | MaxDist | MinDist | | | | Number to resize the target list | Target players with or without aura |
| SMART_TARGET_RANDOM_POINT | 202 | range (yards) | amount (for summoning creature) | self as middle (0/1)
else use xyz | | | | | | This only works with SMART_ACTION_SUMMON_CREATURE, SMART_ACTION_MOVE_TO_POS and SMART_ACTION_JUMP_TO_POS |
| SMART_TARGET_ROLE_SELECTION | 203 | rangeMax (yards) | TargetMask (Tanks (1), Healer (2) Damage (4)) | Resize list | | | | | | Target a Tank/Healer/DPS role. Based on the players spec. |
| SMART_TARGET_SUMMONED_CREATURES | 204 | [creature_template.Entry](creature_template#entry) | | | | | | | | |
| SMART_TARGET_INSTANCE_STORAGE | 205 | data index | Type (creature (1), gameobject (2)) | | | | | | | |
### comment
Commenting on SAI uses a template which is the following: (with an example)
"Creature name - Event - Action"
"Minion of Gurok - On spawn - Set Random Movement"
**Quick notes:**
- Always update *creature\_template*,*gameobject\_template* or *areatrigger\_scripts* with:
```sql
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = y;
UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` = y;
INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES (y, 'SmartTrigger');
```
- If the creature or GO is inside a dungeon, set *event\_flags* accordingly to the instance difficulty (heroic, 25 man, etc.).
**In case of doubt about an *Event*, *Action\_or \_Target,\_check source code (\_src/server/game/AI/SmartScripts* files; mainly \*SmartScript.cpp**)
### Cast Flags
| Name | Flag | Hex | Comment |
| ---------------------------------- | ---- | ----- | --------------------------------------------------------------------------- |
| SMARTCAST\_INTERRUPT\_PREVIOUS | 1 | 0x001 | Interrupt any spell casting |
| SMARTCAST\_TRIGGERED | 2 | 0x002 | Triggered (this makes spell cost zero mana and have no cast time) |
| SMARTCAST\_AURA\_NOT\_PRESENT | 32 | 0x020 | Only casts the spell if the target does not have an aura from the spell |
| SMARTCAST\_COMBAT\_MOVE | 64 | 0x040 | Prevent combat movement on cast, allow on fail range, mana, LOS |
| SMARTCAST\_THREATLIST\_NOT\_SINGLE | 128 | 0x080 | Only cast if the source's threatlist is higher than one. This includes pets |
| SMARTCAST\_TARGET\_POWER\_MANA | 256 | 0x100 | Only cast if the target has power type mana |
### Triggered Flags
| Name | Flag | Hex | Comment |
| --------------------------------------------- | ---------- | ---------- | -------------------------------------------------------------------------------------- |
| TRIGGERED_NONE | 0 | 0x00000000 | Not triggered |
| TRIGGERED_IGNORE_GCD | 1 | 0x00000001 | Will ignore GCD |
| TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD | 2 | 0x00000002 | Will ignore Spell and Category cooldowns |
| TRIGGERED_IGNORE_POWER_AND_REAGENT_COST | 4 | 0x00000004 | Will ignore power and reagent cost |
| TRIGGERED_IGNORE_CAST_ITEM | 8 | 0x00000008 | Will not take away cast item or update related achievement criteria |
| RIGGERED_IGNORE_AURA_SCALING | 16 | 0x00000010 | Will ignore aura scaling |
| TRIGGERED_IGNORE_CAST_IN_PROGRESS | 32 | 0x00000020 | Will not check if a current cast is in progress |
| TRIGGERED_IGNORE_COMBO_POINTS | 64 | 0x00000040 | Will ignore combo point requirement |
| TRIGGERED_CAST_DIRECTLY | 128 | 0x00000080 | In Spell::prepare, will be cast directly without setting containers for executed spell |
| TRIGGERED_IGNORE_AURA_INTERRUPT_FLAGS | 256 | 0x00000100 | Will ignore interruptible aura's at cast |
| TRIGGERED_IGNORE_SET_FACING | 512 | 0x00000200 | Will not adjust facing to target (if any) |
| TRIGGERED_IGNORE_SHAPESHIFT | 1024 | 0x00000400 | Will ignore shapeshift checks |
| TRIGGERED_IGNORE_CASTER_AURASTATE | 2048 | 0x00000800 | Will ignore caster aura states including combat requirements and death state |
| TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE | 8192 | 0x00002000 | Will ignore mounted/on vehicle restrictions |
| TRIGGERED_IGNORE_CASTER_AURAS | 65536 | 0x00010000 | Will ignore caster aura restrictions or requirements |
| TRIGGERED_DISALLOW_PROC_EVENTS | 131072 | 0x00020000 | Disallows proc events from triggered spell (default) |
| TRIGGERED_DONT_REPORT_CAST_ERROR | 262144 | 0x00040000 | Will return SPELL_FAILED_DONT_REPORT in CheckCast functions |
| TRIGGERED_FULL_MASK | 524287 | 0x0007FFFF | All triggered flags |
| TRIGGERED_IGNORE_EQUIPPED_ITEM_REQUIREMENT | 524288 | 0x00080000 | Will ignore equipped item requirements |
| TRIGGERED_NO_PERIODIC_RESET | 1048576 | 0x00100000 | Periodic aura tick wont be reset on override |
| TRIGGERED_FULL_DEBUG_MASK | 4294967295 | 0xFFFFFFFF | |
**NOTICE:** If triggeredFlags = 0, cast will trigger with TRIGGERED_FULL_MASK = 524287.
### React States
| Name | Value | Comment |
| ----------------- | ----- | ------------------------------------------------------------- |
| REACT\_PASSIVE | 0 | Does not defend or attack at all. Does nothing. |
| REACT\_DEFENSIVE | 1 | Only attacks back when attacked. |
| REACT\_AGGRESSIVE | 2 | Will attack if on threat list and in threat radius. (default) |
### Summon Types
| Name | Value | Comment |
| ------------------------------------------- | ----- | -------------------------------------------------------------------- |
| TEMPSUMMON\_TIMED\_OR\_DEAD\_DESPAWN | 1 | Despawns after a specified time OR when the creature disappears. |
| TEMPSUMMON\_TIMED\_OR\_CORPSE\_DESPAWN | 2 | Despawns after a specified time OR when the creature dies. |
| TEMPSUMMON\_TIMED\_DESPAWN | 3 | Despawns after a specified time. |
| TEMPSUMMON\_TIMED\_DESPAWN\_OUT\_OF\_COMBAT | 4 | Despawns after a specified time after the creature is out of combat. |
| TEMPSUMMON\_CORPSE\_DESPAWN | 5 | Despawns instantly after death. |
| TEMPSUMMON\_CORPSE\_TIMED\_DESPAWN | 6 | Despawns after a specified time after death. |
| TEMPSUMMON\_DEAD\_DESPAWN | 7 | Despawns when the creature disappears. |
| TEMPSUMMON\_MANUAL\_DESPAWN | 8 | Despawns when UnSummon() (or Force Despawn action) is called. |
### Smart Follow Types
| Name | Value | Comment |
| -------------------------------------- | ----- | -------------------------------------------------------------------- |
| FOLLOW\_TYPE\_CIRCLE | 1 | 360º Degrees around leader. 90º Degrees is the maximum angle. |
| FOLLOW\_TYPE\_SEMI\_CIRCLE\_BEHIND | 2 | 180º Degrees behind leader. |
| FOLLOW\_TYPE\_SEMI\_CIRCLE\_FRONT | 3 | 180º Degrees in front of leader. |
| FOLLOW\_TYPE\_LINE | 4 | Front \-\> Back \-\> Front \-\> Back. |
| FOLLOW\_TYPE\_COLUMN | 5 | Left \-\> Right \-\> Left \-\> Right. |
| FOLLOW\_TYPE\_ANGULAR | 6 | Geese-like formation 135º and 225º degrees behind leader. |
### Power Types
| Name | Value |
| ----------------- | ----- |
| POWER\_MANA | 0 |
| POWER\_RAGE | 1 |
| POWER\_FOCUS | 2 |
| POWER\_ENERGY | 3 |
### Invoker:
> white list of events that actually have an invoker passed to them
> Actions like SMART\_ACTION\_INVOKER\_CAST and targets like SMART\_TARGET\_ACTION\_INVOKER will work only if the event is in this list:
- SMART\_EVENT\_AGGRO
- SMART\_EVENT\_DEATH
- SMART\_EVENT\_KILL
- SMART\_EVENT\_SUMMONED\_UNIT
- SMART\_EVENT\_SPELLHIT
- SMART\_EVENT\_SPELLHIT\_TARGET
- SMART\_EVENT\_DAMAGED
- SMART\_EVENT\_RECEIVE\_HEAL
- SMART\_EVENT\_RECEIVE\_EMOTE
- SMART\_EVENT\_JUST\_SUMMONED
- SMART\_EVENT\_DAMAGED\_TARGET
- SMART\_EVENT\_SUMMON\_DESPAWNED
- SMART\_EVENT\_PASSENGER\_BOARDED
- SMART\_EVENT\_PASSENGER\_REMOVED
- SMART\_EVENT\_GOSSIP\_HELLO
- SMART\_EVENT\_GOSSIP\_SELECT
- SMART\_EVENT\_ACCEPTED\_QUEST
- SMART\_EVENT\_REWARD\_QUEST
- SMART\_EVENT\_FOLLOW\_COMPLETED
- SMART\_EVENT\_ON\_SPELLCLICK
- SMART\_EVENT\_GO\_LOOT\_STATE\_CHANGED
- SMART\_EVENT\_AREATRIGGER\_ONTRIGGER
- SMART\_EVENT\_IC\_LOS
- SMART\_EVENT\_OOC\_LOS
- SMART\_EVENT\_DISTANCE\_CREATURE
- SMART\_EVENT\_FRIENDLY\_HEALTH
- SMART\_EVENT\_FRIENDLY\_HEALTH\_PCT
- SMART\_EVENT\_FRIENDLY\_IS\_CC
- SMART\_EVENT\_FRIENDLY\_MISSING\_BUFF
- SMART\_EVENT\_ACTION\_DONE
- SMART\_EVENT\_TARGET\_HEALTH\_PCT
- SMART\_EVENT\_TARGET\_MANA\_PCT
- SMART\_EVENT\_RANGE
- SMART\_EVENT\_VICTIM\_CASTING
- SMART\_EVENT\_TARGET\_BUFFED
- SMART\_EVENT\_IS\_BEHIND\_TARGET
- SMART\_EVENT\_INSTANCE\_PLAYER\_ENTER
- SMART\_EVENT\_TRANSPORT\_ADDCREATURE
- SMART\_EVENT\_DATA\_SET
- SMART\_EVENT\_AREA\_CASTING
- SMART\_EVENT\_AREA\_RANGE
- SMART\_EVENT\_SUMMONED\_UNIT\_EVADE