mangos/doc/ScriptCommands.md
2016-03-08 22:30:31 +00:00

19 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 script tables share a common structure, to store parameterized commands for the various types of game content.

id column

  • dbscripts_on_creature_death: Creature entry
  • dbscripts_on_creature_movement: DB project self defined id
  • dbscripts_on_event: Event id. Several sources: spell effect 61, taxi/transport nodes, game object_template data
  • dbscripts_on_go_use: Game object guid
  • dbscripts_on_go_template_use: Game object entry
  • dbscripts_on_gossip: DB project self defined id
  • dbscripts_on_quest_end: DB project self defined id (generally quest entry)
  • dbscripts_on_quest_start: DB project self defined id (generally quest entry)
  • dbscripts_on_spell: Spell 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)

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) and as waittime with SCRIPT_COMMAND_TERMINATE_SCRIPT (31)

x, y, z and o columns

Map coordinates for commands that require coordinates

Origin of script and source/target in scripts

  • dbscripts_on_creature_death: Creature death. Source: creature. Target: Unit (player/creature)
  • dbscripts_on_creature_movement: creature_movement and creature_movement_template. Source: creature. Target: creature
  • dbscripts_on_event: 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.
  • dbscripts_on_go_use, dbscripts_on_go_template_use: game object use with source: user: and target: game object.
  • dbscripts_on_gossip: 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.
  • dbscripts_on_quest_end: quest_template with source: quest taker (creature/GO) and target: player.
  • dbscripts_on_quest_start: quest_template with source: quest giver (creature/GO) and target: player.
  • dbscripts_on_spell: 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).

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_GAMEOBJECTsource = 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
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

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)