Extended am Sonntag #7
Heute mal etwas für Fortgeschrittene und/oder Unerschrockene:
Der Lua-Skripteffekt
WoW-Addons (und auch Weakauren) sind in der Programmiersprache Lua geschrieben. Auch Extended erlaubt es, Lua-Codeschnipsel in eine Kreation einzubauen, falls die vorgefertigten Effekte nicht ausreichen sollten.
Den Effekt findest du unter „Experte > Eingeschränktes Lua-Skript ausführen“.
Eingeschränkt?
Extended kennt verschiedene Sicherheitsstufen. Der Lua-Effekt ist als niedrig eingestuft, trotzdem bietet das Addon einen gewissen Schutz, denn man kann mit dem Effekt nicht beliebigen Code ausführen. Wir werden gleich sehen, dass der Funktionsumfang trotzdem recht groß ist.
Damit erfüllt der Lua-Effekt seinen Zweck als „Sammelstelle“ für vieles, was mit den anderen Effekten nicht geht.
Die Blizzard-API bleibt dem Effekt allerdings verwehrt.
Das Basispaket
Zunächst kann man neben den Strukturelementen if
, for
, function
, … die globalen Elemente date
, ipairs
, math
, next
, pairs
, select
, string
, table
, tonumber
, tostring
, type
und unpack
benutzen.
string
ist hier besonders hervorzuheben, denn darin stecken die üblichen Funktionen zur Manipulation von Zeichenketten.
Auch math
kann interessant sein, wenn man bspw. eine Wurzel berechnen muss zur Entfernungsmessung.
Der Eingabeparameter args
Code, den man in das Eingabefeld eingibt, wird letztendlich als Funktion ausgeführt:
function(args)
-- dein Code wird hier eingefügt
end
args
ist dabei ein Parameter, den man weiterreichen sollte, wenn man die folgenden Funktionen verwendet.
getVar
und setVar
Mit getVar
kann man Variablen aus Arbeitsablauf, Objekt oder Kampagne in das Skript laden:
local wfVar = getVar(args, "w", "workflowVar")
local objVar = getVar(args, "o", "objectVar")
local campVar = getVar(args, "c", "campaignVar")
Umgekehrt kann man mit setVar
ein Ergebnis, das im Skript berechnet wird, in Arbeitsablauf, Objekt oder Kampagne speichern:
setVar(args, "w", "workflowVar", wfVar)
setVar(args, "o", "objectVar", objVar)
setVar(args, "c", "campaignVar", campVar)
Effekte auslösen mit effect
Aus einem Lua-Skript heraus kann man auch Effekte auslösen. Das ist praktisch, denn so kann man sich pro Arbeitsablauf auf ein Skript beschränken, sofern man überhaupt auf Skripte angewiesen ist.
Grundsätzlich löst man Effekte mit
effect("effect_id", args, ...)
aus. Man muss also die Ids der Effekte kennen. Bevor ich mit einer langweiligen Liste aufkreuze, lieber ein paar Beispiele.
effect("text", args, "Gruß aus Luanien", 1)
-- gibt einen Text im Chatfenster aus
effect("item_add", args, nil, "xyz123", "5", false)
-- legt 5 Mal das Item mit der Id xyz123 ins Inventar
effect("sound_id_self", args, "SFX", 1234, false)
-- spielt den Sound mit der Id 1234 im SFX-Kanal ab
Alle Effekt-Ids
cam_load
cam_save
cam_zoom_in
cam_zoom_out
companion_dismiss_critter
companion_dismiss_mount
companion_random_critter
companion_summon_mount
dialog_quick
dialog_start
do_emote
document_close
document_show
item_add
item_bag_durability
item_consume
item_cooldown
item_loot
item_remove
item_roll_dice
item_sheath
item_use
quest_goToStep
quest_markObjDone
quest_revealObjective
quest_start
run_item_workflow
run_workflow
script
secure_macro
signal_send
sound_id_local
sound_id_local_stop
sound_id_self
sound_id_stop
sound_music_local
sound_music_local_stop
sound_music_self
sound_music_stop
speech_env
speech_npc
speech_player
text
var_object
var_operand
var_prompt
Operanden auswerten mit op
result = op("operand_id", args, ...)
wertet den Operanden mit einer vorgegebenen Id aus und gibt das Ergebnis an die Variable result
zurück. Auch hier muss man die Ids kennen.
Zum Beispiel:
local playerName = op("unit_name", args, "player")
-- gibt den Namen des Spielers
local playerName = op("time_hour", args)
-- gibt die momentane Stunde
local itemCount = op("inv_item_count", args, "xyz123", nil)
-- gibt an, wieviele Items mit der Id xyz123 im Inventar sind
Alle Operanden-Ids
char_achievement
char_cam_distance
char_facing
char_falling
char_flying
char_indoors
char_minimap
char_mounted
char_resting
char_stealth
char_subzone
char_swimming
char_zone
check_event_var
check_event_var_n
date_day
date_day_of_week
date_month
date_year
inv_container_slot_id
inv_item_count
inv_item_icon
inv_item_id_weight
inv_item_name
inv_item_quality
inv_item_value
inv_item_weight
quest_is_npc
quest_is_step
quest_obj
quest_obj_all
quest_obj_current
random
time_hour
time_minute
unit_class
unit_classification
unit_creature_family
unit_creature_type
unit_distance_inspect
unit_distance_me
unit_distance_point
unit_distance_trade
unit_exists
unit_faction
unit_guild
unit_guild_rank
unit_health
unit_id
unit_is_dead
unit_is_player
unit_level
unit_name
unit_npc_id
unit_position_x
unit_position_y
unit_race
unit_sex
unit_speed
var_check
var_check_n
Benutze den Skript-Effekt sparsam
Wenn der Lua-Effekt alles kann, was die anderen Effekte auch können, könnte man in Versuchung kommen, einfach alles mit einem Skript umzusetzen.
Davon sollte man aus mindestens zwei Gründen absehen:
- Der Effekt ist als letztes Mittel gedacht, falls es unmöglich sein sollte, die Kreation auf andere Weise zu erstellen.
- Der Effekt umgeht den normalen Schritt-für-Schritt-Ansatz des Addons und macht Arbeitsabläufe schwerer nachvollziehbar.
Überlege also, ob es wirklich ein Skript sein muss, oder ob es vielleicht auch einfacher geht.
Den Überblick behalten
In seiner Rolle als Auffanglösung hat der Skript-Effekt nur ein einfaches Eingabefenster bekommen, in das der Lua-Code hineingeschrieben werden muss.
Ich empfehle, den Code in einem „guten“ Editor, z.B. einem mit Syntaxhervorhebung, zu schreiben, und dann alles zu kopieren und in das Fenster einzufügen.
Verwende Kommentare ausgiebig, damit du auch noch nach Wochen weißt, was dein Code macht oder machen soll.
Viel Spaß beim Experimentieren und
bis zum nächsten Sonntag…