mangos/doc/ScriptCommands.md

21 KiB

Database script processing

In addition to EventAI, mangos provides script processing for various types of game content. These scripts can be executed when creatures move or die, when events are executed, and game object spawns/templates are used, on gossip menu selections, when starting and completing quests, and when casting spells.

Database structure

All database scripts are stored in the db_scripts table in the world database

script_guid

Unique ID for the script, used as primary key in the table

script_type

Type of script. The values are:

  • DBS_ON_QUEST_START(0): scripts which are executed at the quest taking
  • DBS_ON_QUEST_END(1): scripts which are executed when the quest is rewarded
  • DBS_ON_GOSSIP(2): scripts which are executed when player selects an item from a gossip NPC/GO
  • DBS_ON_CREATURE_MOVEMENT(3): scripts executed when a creature passes through waypoints,
  • DBS_ON_CREATURE_DEATH(4): as the name says
  • DBS_ON_SPELL(5): scripts executed when a spell is cast (see what kind of spells below)
  • DBS_ON_GO_USE(6): scripts executed when a particular gameobject (one from gameobject table) is "used" (i.e. opening/closing a door)
  • DBS_ON_GOT_USE(7): scripts executed when a gameobject having the entry specified in gameobject_template is used
  • DBS_ON_EVENT(8): scripts executed when an event occurs (like passing through taxi/transport nodes, spells with effect 61, gameobject_template data)

id column

Has different meanings, depending of script type

  • type 0: DB project self defined id (generally quest entry)
  • type 1: DB project self defined id (generally quest entry)
  • type 2: DB project self defined id
  • type 3: DB project self defined id
  • type 4: Creature entry
  • type 5: Spell id
  • type 6: Game object guid
  • type 7: Game object entry
  • type 8: Event id

delay column

Delay in seconds. Defines the order in which steps are executed.

command column

The action to execute.

datalong columns

2 multipurpose fields, storing raw data as unsigned integer values.

buddy_entry column

1 field to store the entry of a "buddy". Depending on the command used this can can point to a game object template or/and creature template entry.

search_radius column

Range in which the buddy defined in buddy_entry will be searched. In case of SCRIPT_FLAG_BUDDY_BY_GUID this field is the buddy's guid!

data_flags column

Field which holds a combination of these flags:

Value Name Notes
1 SCRIPT_FLAG_BUDDY_AS_TARGET
2 SCRIPT_FLAG_REVERSE_DIRECTION
4 SCRIPT_FLAG_SOURCE_TARGETS_SELF
8 SCRIPT_FLAG_COMMAND_ADDITIONAL (Only for some commands possible)
16 SCRIPT_FLAG_BUDDY_BY_GUID (Interpret search_radius as buddy's guid)
32 SCRIPT_FLAG_BUDDY_IS_PET (Do not search for an NPC, but for a pet)
64 SCRIPT_FLAG_BUDDY_IS_DESPAWNED (Search for dead/despawned creatures)

dataint columns

4 multipurpose fields, storing raw data as signed integer values.

Note: used for text ids SCRIPT_COMMAND_TALK (0), for emote ids in SCRIPT_COMMAND_EMOTE (1), for spell ids in SCRIPT_COMMAND_CAST_SPELL (15) as waittime with SCRIPT_COMMAND_TERMINATE_SCRIPT (31) as equipment ID's with SCRIPT_COMMAND_SET_EQUIPMENT_SLOTS (42)

x, y, z and o columns

Map coordinates for commands that require coordinates

Origin of script and source/target in scripts

  • type 0: quest_template with source: quest giver (creature/GO) and target: player.
  • type 1: quest_template with source: quest taker (creature/GO) and target: player.
  • type 2: gossip_menu_option, gossip_menu with source: creature and target: player in case of NPC-Gossip, or with source: player and target: game object in case of GO-Gossip.
  • type 3: creature_movement and creature_movement_template. Source: creature. Target: creature
  • type 4: Creature death. Source: creature. Target: Unit (player/creature)
  • type 5: spell with effect 77(SCRIPT_EFFECT), spells with effect 3 (DUMMY), spells with effect 64 (TRIGGER_SPELL, with non-existing triggered spell) having source: caster: and target: target of spell (Unit).
  • type 6, 7: game object use with source: user: and target: game object.
  • type 8: Flight path with source: player and target: player, transport path with source: transport game object and target transport game object, gameobject_template with source: user (player/creature) and target: game object, spells having effect 61 with source: caster and target: target.

Buddy concept

Commands except the ones requiring a player (like KILL_CREDIT) have support for the buddy concept. This means that if an entry for buddy_entry is provided, aside from source and target as listed above also a "buddy" is available.

Which one on the three (originalSource, originalTarget, buddy) will be used in the command, depends on the data_flags settings.

Note that some commands (like EMOTE) use only the resulting source for an action.

Possible combinations of the flags:

  • SCRIPT_FLAG_BUDDY_AS_TARGET: 0x01
  • SCRIPT_FLAG_REVERSE_DIRECTION: 0x02
  • SCRIPT_FLAG_SOURCE_TARGETS_SELF: 0x04

are

  • 0: originalSource / buddyIfProvided -> originalTarget
  • 1: originalSource -> buddy
  • 2: originalTarget -> originalSource / buddyIfProvided
  • 3: buddy -> originalSource
  • 4: originalSource / buddyIfProvided -> originalSource / buddyIfProvided
  • 5: originalSource -> originalSource
  • 6: originalTarget -> originalTarget
  • 7: buddy -> buddy

where A -> B means that the command is executed from A with B as target.

Commands and their parameters

ID Name Parameters
0SCRIPT_COMMAND_TALKresultingSource = WorldObject, resultingTarget = Unit/none, `dataint` = text entry from db_script_string -table. `dataint2`-`dataint4` optionally, for random selection of text
1SCRIPT_COMMAND_EMOTEresultingSource = Unit, resultingTarget = Unit/none, `datalong` = emote_id, dataint1-dataint4 = optionally for random selection of emote
2SCRIPT_COMMAND_FIELD_SETsource = any, `datalong` = field_id, `datalong2` = field value
3SCRIPT_COMMAND_MOVE_TOresultingSource = Creature. If position is very near to current position, or x=y=z=0, then only orientation is changed. `datalong2` = travel_speed*100 (use 0 for creature default movement). `data_flags` & SCRIPT_FLAG_COMMAND_ADDITIONAL: teleport unit to position `x`/`y`/`z`/`o`
4SCRIPT_COMMAND_FLAG_SETsource = any. `datalong` = field_id, `datalong2` = bit mask
5SCRIPT_COMMAND_FLAG_REMOVEsource = any. `datalong` = field_id, `datalong2` = bit mask
6SCRIPT_COMMAND_TELEPORT_TOsource or target with Player. `datalong` = map_id, x/y/z
7SCRIPT_COMMAND_QUEST_EXPLOREDone from source or target must be Player, another GO/Creature. `datalong` = quest_id, `datalong2` = distance or 0
8SCRIPT_COMMAND_KILL_CREDITsource or target with Player. `datalong` = creature entry, or 0; If 0 the entry of the creature source or target is used, `datalong2` = bool (0=personal credit, 1=group credit)
9SCRIPT_COMMAND_RESPAWN_GOsource = any, target = any. `datalong`=db_guid (can be skipped for buddy), `datalong2` = despawn_delay
10SCRIPT_COMMAND_TEMP_SUMMON_CREATUREsource = any
target = any
`datalong` = creature entry
`datalong2` = despawn_delay
`data_flags` & SCRIPT_FLAG_COMMAND_ADDITIONAL: summon as active object
`dataint` = bool (setRun); 0 = off (default), 1 = on
11SCRIPT_COMMAND_OPEN_DOORsource = any. `datalong` = db_guid (can be skipped for buddy), `datalong2` = reset_delay
12SCRIPT_COMMAND_CLOSE_DOORsource = any. `datalong` = db_guid (can be skipped for buddy), `datalong2` = reset_delay
13SCRIPT_COMMAND_ACTIVATE_OBJECTsource = unit, target=GO.
14SCRIPT_COMMAND_REMOVE_AURAresultingSource = Unit. `datalong` = spell_id
15SCRIPT_COMMAND_CAST_SPELLresultingSource = Unit, cast spell at resultingTarget = Unit. `datalong` = spell id, `dataint1`-`dataint4` optional. If some of these are set to a spell id, a random spell out of datalong, datint1, ..,dataintX is cast., `data_flags` & SCRIPT_FLAG_COMMAND_ADDITIONAL: cast triggered
16SCRIPT_COMMAND_PLAY_SOUNDsource = any object, target=any/player. `datalong` = sound_id, `datalong2` (bit mask: 0/1=target-player, 0/2=with distance dependent, 0/4=map wide, 0/8=zone wide; so 1 + 2 = 3 is target with distance dependent)
17SCRIPT_COMMAND_CREATE_ITEMsource or target must be player. `datalong` = item entry, `datalong2` = amount
18SCRIPT_COMMAND_DESPAWN_SELFresultingSource = Creature. `datalong` = despawn delay
19SCRIPT_COMMAND_PLAY_MOVIEtarget can only be a player. `datalong` = movie id
20SCRIPT_COMMAND_MOVEMENTresultingSource = Creature. `datalong` = MovementType (0:idle, 1:random or 2:waypoint), `datalong2` = wanderDistance (for random movement), `data_flags` & SCRIPT_FLAG_COMMAND_ADDITIONAL: RandomMovement around current position
21SCRIPT_COMMAND_SET_ACTIVEOBJECTresultingSource = Creature. `datalong` = bool 0=off, 1=on
22SCRIPT_COMMAND_SET_FACTIONresultingSource = Creature. `datalong` = factionId OR 0 to restore original faction from creature_template, `datalong2` = enum TemporaryFactionFlags
23SCRIPT_COMMAND_MORPH_TO_ENTRY_OR_MODELresultingSource = Creature. `datalong` = creature entry/modelid (depend on data_flags) OR 0 to demorph, `data_flags` & SCRIPT_FLAG_COMMAND_ADDITIONAL: use datalong value as modelid explicit
24SCRIPT_COMMAND_MOUNT_TO_ENTRY_OR_MODELresultingSource = Creature. `datalong` = creature entry/modelid (depend on data_flags) OR 0 to dismount, `data_flags` & SCRIPT_FLAG_COMMAND_ADDITIONAL: use datalong value as modelid explicit
25SCRIPT_COMMAND_SET_RUNresultingSource = Creature. `datalong` = bool 0=off, 1=on
26SCRIPT_COMMAND_ATTACK_STARTresultingSource = Creature, resultingTarget = Unit.
27SCRIPT_COMMAND_GO_LOCK_STATEresultingSource = GO. `datalong` = flag_go_lock = 0x01, flag_go_unlock = 0x02, flag_go_nonInteract = 0x04, flag_go_interact = 0x08
28SCRIPT_COMMAND_STAND_STATEresultingSource = Creature. `datalong` = stand state (enum UnitStandStateType)
29SCRIPT_COMMAND_MODIFY_NPC_FLAGSresultingSource = Creature. `datalong` = NPCFlags, `datalong2` = 0x00=toggle, 0x01=add, 0x02=remove
30SCRIPT_COMMAND_SEND_TAXI_PATHresultingTarget or Source must be Player. `datalong` = taxi path id
31SCRIPT_COMMAND_TERMINATE_SCRIPT`datalong` = search for npc entry if provided, `datalong2` = search distance, `!(data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL)`: if npc not alive found, terminate script, `data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL`:if npc alive found, terminate script, `dataint` = change of waittime (MILLISECONDS) of a current waypoint movement type (negative values will decrease time)
32SCRIPT_COMMAND_PAUSE_WAYPOINTSresultingSource must be Creature. `datalong` = 0/1 unpause/pause waypoint movement
33SCRIPT_COMMAND_RESERVED_1reserved for 3.x and later. Do not use!
34SCRIPT_COMMAND_TERMINATE_COND`datalong` = condition_id, `datalong2` = fail-quest (if provided this quest will be failed for a player), `!(data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL)`: terminate when condition is true, `data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL`:terminate when condition is false
35SCRIPT_COMMAND_SEND_AI_EVENT_AROUNDresultingSource = Creature, resultingTarget = Unit, datalong = AIEventType - limited only to EventAI supported events, datalong2 = radius
36SCRIPT_COMMAND_TURN_TOresultingSource = Creature, resultingTarget = Unit/none.
37SCRIPT_COMMAND_MOVE_DYNAMICMove resultingSource to a random point around resultingTarget or to resultingTarget. `resultingSource` = Creature, resultingTarget Worldobject. `datalong` = 0:Move resultingSource towards resultingTarget, `datalong` != 0: Move resultingSource to a random point between datalong2..datalong around resultingTarget. `orientation` != 0: Obtain a random point around resultingTarget in direction of orientation, `data_flags` & SCRIPT_FLAG_COMMAND_ADDITIONAL Obtain a point in direction of resTarget->GetOrientation + orientation for resTarget == resSource and orientation == 0 this will mean resSource moving forward.
38SCRIPT_COMMAND_SEND_MAILSend a mail from resSource to resTarget. `resultingSource` = Creature OR NULL, resTarget must be Player, `datalong` = mailTemplateId, `datalong2`: AlternativeSenderEntry. Use as sender-Entry of the sent mail, `dataint1`: Delay (>= 0) in Seconds
39SCRIPT_COMMAND_SET_FLYToggles the fly mode for a creature.
* resultingSource = Creature
datalong = 0(off) | 1 (on)
* data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL = sets/unsets the flying animation
40SCRIPT_COMMAND_DESPAWN_GO* resultingTarget = GameObject. Not all gameobject types support this command
41SCRIPT_COMMAND_RESPAWN* resultingSource = Creature. Requires data_flags & SCRIPT_FLAG_BUDDY_IS_DESPAWNED to find dead or despawned targets
42SCRIPT_COMMAND_SET_EQUIPMENT_SLOTSChange equipment slots of the resultingSource (Creature)
* resultingSource = Creature
* datalong = reset default (0 - false, 1 - true)
* dataint = main hand slot
* dataint2 = off handslot
* dataint3 = ranged slot
43SCRIPT_COMMAND_RESET_GOResets doors or buttons (GO type 0 or 1)
* resultingTarget = GameObject
44SCRIPT_COMMAND_UPDATE_TEMPLATEUpdate creature entry of the resultingSource
* resultingSource = creature
* datalong = new creature entry. Must be different than the current one

TemporaryFactionFlags

  • TEMPFACTION_NONE: 0x00, when no flag is used in temporary faction change, faction will be persistent. It will then require manual change back to default/another faction when changed once
  • TEMPFACTION_RESTORE_RESPAWN: 0x01, default faction will be restored at respawn
  • TEMPFACTION_RESTORE_COMBAT_STOP: 0x02, ... at CombatStop() (happens at creature death, at evade or custom script among others)
  • TEMPFACTION_RESTORE_REACH_HOME: 0x04, ... at reaching home in home movement (evade), if not already done at CombatStop()

The next flags allow to remove unit_flags combined with a faction change (also these flags will be reapplied when the faction is changed back)

  • TEMPFACTION_TOGGLE_NON_ATTACKABLE: 0x08, remove UNIT_FLAG_NON_ATTACKABLE(0x02) when faction is changed (reapply when temp-faction is removed)
  • TEMPFACTION_TOGGLE_OOC_NOT_ATTACK: 0x10, remove UNIT_FLAG_OOC_NOT_ATTACKABLE(0x100) when faction is changed (reapply when temp-faction is removed)
  • TEMPFACTION_TOGGLE_PASSIVE : 0x20, remove UNIT_FLAG_PASSIVE(0x200)
  • TEMPFACTION_TOGGLE_PACIFIED : 0x40, remove UNIT_FLAG_PACIFIED(0x20000) when faction is changed (reapply when temp-faction is removed)
  • TEMPFACTION_TOGGLE_NOT_SELECTABLE: 0x80, remove UNIT_FLAG_NOT_SELECTABLE(0x2000000) when faction is changed (reapply when temp-faction is removed)