Beispiel Addon

Aus WARWiki

InGame Bild
vergrößern
InGame Bild

Hier ein Beipiel Addon, welches ein guter Einstieg für die Leute sein sollte, die vorher nicht soviel mit LUA gemacht haben.
Sollten noch Fragen offen sein oder andere Vorschläge, dann schreibt das bitte auf die Diskussionsseite

Das Addon mit den Namen MobHealth ist von mir (Facelessleader) und es hat die Funktion, im Spiel neben dem Zielfenster, die Prozentzahl des Lebens des Feindes anzuzeigen.

Es besteht auch den 3 Dateien:

  • MobHealth.xml
  • MobHealth.mod
  • MobHealth.lua


Inhaltsverzeichnis

MobHealth.xml

In dieser Datein sind Informationen über die optischen Elemente des Addons gespeichert.

<Interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Interface.xsd">

  <Scripts>
    <Script file="MobHealth.lua" />
  </Scripts>

  <!-- erstelle ein label -->
  <Windows>
    <Label name="MobHealthMainText" inherits="DefaultWindowSmallText" textalign="right">
      <Size>
        <AbsPoint x="200" y="30" />  
      </Size>
    </Label>
  </Windows>

</Interface>

Die Anweisungen bewirken, das ein Label mit dem Namen MobHealthMainText erstellt wird, welches die Schriftart DefaultWindowSmallText hat mit rechtsbündigem Text.
AbsPoint gibt die Größe des Labels an, also hier 200 breit und 30 hoch.
Im Script-Tag wird die Dazugehörige LUA-Datei angegeben.

MobHealth.mod

In dieser Datei sind alle "technischen" Informationen enthalten.

<?xml version="1.0" encoding="UTF-8"?>
<ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <UiMod name="MobHealth" version="0.1" date="18/09/2008" >
        
  <Author name="Facelessleader" email="facelessleader@gmail.com" />
  <Description text="Displays Mob Health in Percent" />
        
  <Dependencies>
    <Dependency name="EA_TargetWindow" />
  </Dependencies>
        
  <Files>
    <File name="MobHealth.lua"/>
    <File name="MobHealth.xml"/>
  </Files>
        
  <OnInitialize>
    <CallFunction name="MobHealth.Initialize" />
  </OnInitialize>

  <OnUpdate/>

  <OnShutdown/>

  </UiMod>
</ModuleFile>

Das obere Drittel sollte selbserklärend sein, es enthält Daten über den Author des Addons.
Dependencies sind Abhängigkeiten, damit das Addon geladen werden kann. In unserem Fall EA_TargetWindow, also das WAR eigene Zielfenster.
Im Files Bereich werden die alle Datein aufgelistet, die das Addon enthält, bzw wichtig für dessen Funktion sind. Die *.mod Datei wird hier nicht mit aufgelistet.
OnInitialize gibt an, was passieren soll, wenn das Addon geladen wird (das passiert beim betreten der Spielwelt). In unserem Fall wird die Funktione MobHealth.Initialize aufgerufen, welche in der MobHealth.lua Datei zu finden ist.

MobHealth.lua

Und hier nun das Addon an sich, es ist in LUA geschrieben und beinhaltet alle Funktionen und Variablen Ich versuche den Code verständlich zu kommentieren. Die Kommentare sind im Code mit zwei "--" gekennzeichnet.
Ich empfehle, der Übersicht halber, den LUA Code in einen Editor eurer Wahl (oder siehe Link zu PSPad unten) zu kopieren. Hier ist es etwas schwer zu lesen durch die ganzen Kommentare

MobHealth = {}

--diese Funktion wird aufgerufen wenn das Addon initialisiert wird
function MobHealth.Initialize()

    --erstelle ein Fenster mit dem Namen MobHealthMainText (muss wie in der XML heisen) und setze es auf sichtbar (true)
    CreateWindow("MobHealthMainText", true)

    --aus Sicherheitsgründen das gleiche Fenster noch mal auf sichtbar stellen (true)
    WindowSetShowing("MobHealthMainText", true)

    --entferne die Verankerung des Fensters
    WindowClearAnchors("MobHealthMainText")

    --setze eine Verankerung an unserem Fenster
    --Die Variablen hier sind: Unser Fenster, der Ankerpunkt des Zielfensters, das Zielfenster, der Ankerpunkt unseres Fenster,
    --Abweichung von x und y
    --Also verankere die obere Seite unseres Fensters an die untere-rechte Ecke des Zielfensters TargetWindowStatusConLabel,
    --welches ein Teil des Standart Interface ist und der Schwierigkeitstext beim Zielfenster ist,
    --und versetze den Anker noch um -65 (also 65 nach links) und in der Höhe um nichts
    WindowAddAnchor("MobHealthMainText", "bottomright", "TargetWindowStatusConLabel", "top", -65, 0)

    --Hier sagen wir, das sobald sich das Event PLAYER_TARGET_UPDATED ereignet rufe unsere Funktion MobHealth.MobHealthUpdate
    --diese Event wird immer ausgelöst, sobald man das Ziel ändert, aber auch wenn es Schaden nimmt, geheilt wird oder gebuffed wird
    RegisterEventHandler(SystemData.Events.PLAYER_TARGET_UPDATED, "MobHealth.MobHealthUpdate")
end

--Die Funktion MobHealth.MobHealthUpdate, welche durch ein Event ausgelöst wird
--Das Event übergibt auch 3 Variablen -> Klassifizierunng des Ziels, eine eindeutige ID jenes und den Typ des Ziels
function MobHealth.MobHealthUpdate(targetClassification, targetId , targetType)

    --wenn die Klassifirung selfhostiletarget ist, also unser feindliches Ziel das wird gerade anvisieren
    if(targetClassification == "selfhostiletarget") then
        
        --setze eine lokale Variable auf einen Wert, den wir aus einem Datenobjekt in WAR auslesen
        --in diesem Fall sind das Infos Über das Ziel -> unser aktuelles feindliches Ziel -> aktuelles Leben in Prozent
        --wenn dies ein neues Ziel ist, dann ist das der Wert 100.0000, also 100%
        local MobHealthRaw = TargetInfo.m_Units.selfhostiletarget.healthPercent

        --eine neue Variable, die den Wert der oben definierten bekommt, jedoch mit der LUA Funktion abgerundet wird
        --hier wird aus den 100.0000 eine 100, was sich schöner darstellen lässt
        local MobHealth = math.floor(MobHealthRaw)
        
        --hier kommen ein paar if-elseif-Verschachtelungen, die den Wert MobHealth überprüfen, also die Prozentzahl unseres Zieles
        --es wird die Zahl geprüft und je nach dem was eintritt mittels LabelSetTextColor die Farbe des Labels geändert
        --LabelSetTextColor("nameDesFensters", AnteilRot, AnteilGrün, AnteilBlau)
        --in unserem Fall geht die Farbe bei 100% von Grün über Gelb, Orange und schließlich Rot bei 0%
        if(MobHealth >= 75) then
            LabelSetTextColor("MobHealthMainText", 0, 200,0)
        elseif(MobHealth >= 50) then
            LabelSetTextColor("MobHealthMainText", 255, 255,0)
        elseif(MobHealth >= 25) then
            LabelSetTextColor("MobHealthMainText", 255, 128,0)
        elseif(MobHealth >= 0) then
            LabelSetTextColor("MobHealthMainText", 255, 0,0)
        end
        
        --sollte die targetId 0 sein, also wenn wir kein feinliches Ziel anvisieren
        --dann setzte die Sichtbarkeit des Labels auf aus (false) wenn nicht auch an (true) (siehe oben)
        if(targetId == 0) then
            WindowSetShowing("MobHealthMainText", false)
        else
            WindowSetShowing("MobHealthMainText", true)
        end
        
        --hier wird nun der Text unseres Lables auf die aktuelle Prozentzahl gesetzt, als das was wir schlussendlich im spiel sehen
        --LabelSetText("NameDesFensters", L"text")
        --hier muss aufgepasst werden, das Variablen sicherheitshalber mit der Funktion towstring() auf einen W-String für 
        --die Ausgabe gestellt wird
        --das L" %" ist dann im Spiel das %-Zeichen, hier _muss_ ein großes L vor die Anführungszeichen gestellt werden,
        --da es sonst zu Fehlern kommt. Ausgabe wäre hier 100 %
        LabelSetText("MobHealthMainText", towstring(MobHealth) .. L" %")

    end
end 

Sontiges und Nützliches

  • PSPad ein freier Editor für alle gängigen Progammiersprachen
  • XML Infos über XML auf WikiPedia
  • LUA LUA Manual (englisch)
  • LUA Guide Lua für Anfänger (deutsch)
  • MobHealth Das Addon zum Download und alle neuen Versionen davon
Persönliche Werkzeuge
Anzeige

Sponsoren