Selber Addons programmieren

Carathas

Rare-Mob
Mitglied seit
24.07.2007
Beiträge
290
Reaktionspunkte
0
Kommentare
4
Buffs erhalten
7
Ein Hallo an euch Coder


Je länger ich im Netz nach neuen Addons suche und ich selbst an meinem Interface bastle, je grösser wird der Wunsch auch selbst endlich mal ein Addon zu coden. Ich bin momentan schon so weit dass ich es schaffe meine Panels mit Hilfe von Litepanels zu erstellen und darin sogar auch noch einige Scripts abgespeichert habe. Und halt noch andere Sachen in dieser Grössenordnung. Aber ich brauche für solche kleinen Spässe schon eine halbe Ewigkeit bis diese dann auch wirklich funktionieren. Es frisst extrem viel Zeit sich durch all diese Foren Wikis und den Code von Addons zu kämpfen um dann mal zu verstehen wie das alles so läuft.

Ich wollte jetzt hier mal so in die Runde fragen wie ihr denn zum "WoW-Addon" programmieren gekommen seid. Wie habt ihr programmieren gelernt und speziell wo habt ihr die Infos her und welche Hilfsmittel braucht ihr während dem programmieren?

Ich tue mich vorallem auch schwer mit dem Vorgehen. Momentan läuft es bei mir so: Ich habe WoW, Notepad++, wowwiki und noch ein paar andere Foren etc offen. Suche in den Addons irgendwelche Funktionen raus, versuche die zu interpretieren, versteh was nicht und suche die Befehle auf wowwiki, schreib dann irgend ein paar wenige Zeilen für mein Panelscript, wechsel zu WoW, Reload UI und guck mal obs geht. Ich denke wenn ich das so bei einem komplett selbst geschriebenen Addon versuche zu handhaben, habe ich keine Lust mehr bevor ich überhaupt richtig angefangen habe. Ich kenn ja die WoW API kaum. Ganz zu schweigen von diesen ACE Libraries.. da blick ich ja gar noch nicht durch. Und wenn man dann auch noch ein wenig Mühe hat mit der Syntax hat und allgemein halt nicht weiss wie man so ein Addon strukturiert wirds extrem mühsam.

Gibt es Entwicklungsumgebungen speziell für WoW Addons? Wo beispielsweise die API integriert ist und wo man schnell an die korrekten Befehle ran kommt? Oder gibt es PlugIns für Notepad++ oder so?
Was mich auch noch interessieren würde ist, ob es eine bestimmte Struktur vom Aufbau her eines Addons gibt und ob sich da eine bestimmte Vorgehensweise etabliert hat. Gibt es Bücher die vorallem eher solche Themen behandeln? Könnt ihr mir da vielleicht was empfehlen. Und kenn ihr einen Link zu einer gut strukturierten Übersicht der LUA Syntax? Mir geht es da vorallem eher um so Sachen wie Variablen Weitergabe/Übergabe in Funktionen und so.

So das wärs erst mal, ich hoffe es ist euch nicht zu viel Text und ihr könnt mir ein wenig weiter helfen.
 
So wie du es machst haben wir alle angefangen denke ich mal
Es gibt keine allgemeingültige Anleitung oder ein für jeden gleich einfach zu verstehendes Tutorial.

Mir hat es sehr geholfen, dass ich vor den AddOns schon mit Hollywood gearbeitet habe.
Das ist eine auf Lua basierende Programmiersprache mit der man super Multimediaanwendungen entwickeln kann.
http://de.wikipedia....mmiersprache%29

Auf wowinterface.com sind einige Tools in den Foren erwähnt. Syntaxhighlighting bietet zb
http://www.wowinterf...ad.php?p=217275

Aber insgesamt bist du schon auf dem richtigen Weg. Lernen von anderen, versuchen zu verstehen was zb ACE macht
und schauen ob man es selbst besser kann oder halt doch ACE nutzt um Nerven und Ressourcen zu sparen

Ich wollte mal ein Tutorial schreiben ... aber bin auch irgendwie zeitlich mal wieder zu nichts gekommen
http://my.morphosi.net/mediawiki/index.php/AddOn
 
Ok, das kann nun etwas dauern.

Zum Programmieren selber.

1. Der richtige Editor : Ich benutzte momentan Scite (klick), er hebt alles hervor das man braucht und gibt auch zum teil Vollendungen an (z.b. bei h = CreateFrame .... zeigt er die reihenfolge an.)
2. Die Ordnung : Funktionen immer ganz oben bestimmen oder in einer Core datei speicher, jedoch musst dann das local von der Funktion weg.
3. Die Syntax : Jaja, Sie nervt, jedoch gewöhne ich sie mir auch an. Nach jeder Funktion, if oder do kommt ein Tab (Wichtig! Das end muss auf gleicher höhe sein der Funktion, schleife was auch immer). Dazu kommt noch das schöne Semikolon(, nach jedem Befehl, end oder end) kommt so eines (nicht nach funktionen, gibt Fehlermeldung aus).
4. Die richtigen Funktionen : Funktionen erleichtern einem das Leben. Beispiel :

Code:
function frame(...)
	f = CreateFrame(...);
	return f;
end;

Das erleichtert einem halt das dauernde CreateFrame bla bla bla.

Wie kam ich darauf?

Langeweile! Ne spass, hat mich schon immer gereizt. Ich hab es auch durch Wiki und Foren gelernt, aber das Meiste kam vom learning by doing, ich habe mir Scripts angeschaut und beobachtet was Sie machen. Mit der Zeit wird man schneller, lernt sie auswendig und denkt selber Logisch nach wie der richtige Befehl heissen könnte.

Datenbanken zum Thema API


Die Ace Libs. (Bibliotheken zu Deutsch) sind Ansammlungen von Funktionen.

mehr kommt später
 
Zuletzt bearbeitet von einem Moderator:
Hey vielen Dank für die schnellen Antworten! Dann werd ich mich wohl mal ein wenig einrichten, damit ich immer alle wichtigen Seiten Griff bereit habe und mich weiter ins Abenteuer stürzen. Über weitere Infos freue ich mich natürlich immer :-)
 
noch ne seite für die api wäre wowprogramming.com, die enthält oft genauere erklärungen zu funktionen/events/etc. als wowwiki

btw: das semikolon MUSS aber nicht sein oder? benutz es eigentlich nie und hab keine probleme
 
Code:
function frame(...)
	f = CreateFrame(...);
end;
Wenn du ein Beispiel zeigst, dann mach es richtig xD
Code:
local function frame(...)
	local f = CreateFrame(...);
	return f;
end;
Wenn man seine Funktionen nicht lokalisieren will (Damit sie nur in deiner Datei funktionieren und nicht überschreibbar von anderen Add-ons sind), dann macht man das "local" weg, ABER: NIEMALS frame, update, oder ähnliche "Standard"-Namen geben, denn das machen viele Anfänger und überschreiben damit andere Funktionen die genau so heissen, was wiederum heisst, dass man ein anderes Add-on kaputt macht, Lua-Fehlermeldungen produziert etc pp. Dann lieber: AddonName_Funktion()

Zu WoWWiki: Nicht mehr benutzen, veraltet und wird nicht weiter dran gebaut. Ersatz: www.WoWPedia.org
 
ach, deshalb geht die funktion nur 1 mal xD

danke @Shanty auch wegen der neuen Seite

noch ne seite für die api wäre wowprogramming.com, die enthält oft genauere erklärungen zu funktionen/events/etc. als wowwiki

btw: das semikolon MUSS aber nicht sein oder? benutz es eigentlich nie und hab keine probleme

nein nein, ist nur einfacher zu lesen wenn man z.b. funktionen auf einer Linie schreibt

Code:
local function frame(...) f = CreateFrame(...); return f; end;

Code:
local function frame(...) f = CreateFrame(...) return f end

unterschied sollte man merken
 
Zuletzt bearbeitet von einem Moderator:
Ich nutze diesen Thread gleich dann noch für ein paar Fragen die ich habe :-)

Gibt es eine Möglichkeit über LUA ein Slash Command eines anderen Addons auszuführen? Ich möchte Reflux automatisieren, so dass beim ersten Login automatisch auf das richtige Profil geswitcht wird. Ich hab mir gedacht sowas könnte man über ein onLoad Script von LitePanels lösen..

Und gleich die zweite Frage: Wie krieg ich es hin dass nur beim ersten Login auf einen neuen Char reflux ausgelöst wird? Muss ich dafür extra Code schreiben der eine Variable speichert? Oder kann man irgendwie das aktuelle Profil eines Addons mit relativ wenig Aufwand auslösen?

Dann noch in dem Zusammenhang.. Wie liest man gespeicherte Werte der savedVariables ein? Die sind ja irgendwie so verschachtelt abgespeichert.. wie ruft man das auf? Hmm oder noch ne Idee.. Kann man das vorhanden sein einer savedVariables Datei eines bestimmten Addons überprüfen. So, dass code nur ausgeführt wird wenn die entsprechende Datei noch NICHT vorhanden ist?


Hab jetzt Stundenlang Den Code von verschiedensten Addons angeguckt aber hab aber nix entdeckt was mir wirklich ein Aha Erlebnis gebracht hat.
 
Und gleich die zweite Frage: Wie krieg ich es hin dass nur beim ersten Login auf einen neuen Char reflux ausgelöst wird? Muss ich dafür extra Code schreiben der eine Variable speichert? Oder kann man irgendwie das aktuelle Profil eines Addons mit relativ wenig Aufwand auslösen?
würds entweder wieder mit einem onload script machen oder mit OnEvent mit dem "PLAYER_ENTERING_WORLD" event

Dann noch in dem Zusammenhang.. Wie liest man gespeicherte Werte der savedVariables ein? Die sind ja irgendwie so verschachtelt abgespeichert.. wie ruft man das auf?
in der toc datei gibst du ja an wo deine savedvariables gespeichert werden sollen, zbsp. ## SavedVariables: MeineSV
du kannst dann ganz einfach in deinem addon diesen namen, also MeineSV, benutzen wie jede ganz normale tabelle
WoWPedia zu SavedVariables

Hmm oder noch ne Idee.. Kann man das vorhanden sein einer savedVariables Datei eines bestimmten Addons überprüfen. So, dass code nur ausgeführt wird wenn die entsprechende Datei noch NICHT vorhanden ist?
du kannst zwar glaube ich nicht überprüfen ob die datei vorhanden ist, aber ob deren inhalt existiert
ganz einfach mit if MeineSV then bla bla bla end
ich weiß aber nicht ob man das auch für andere addons überprüfen kann, wobei die tabelle in den savedvariables ja eigentlich global definiert werden

hoffe konnte helfen, die profis hier werden mich auch sicher verbessern
 
Hmmm also ich habe es jetzt fast hingekriegt...

Dieser Code steht im LitePanels Layout drin:

Code:
	{	name = "onloadscript",
			OnLoad = function(self)
				if DBM_SavedOptions["HPFrameY"] == 50 then
					SlashCmdList["REFLUX"]("switch Default")
		 	end;
			end;
	},

Nur leider hat mir die "protected" Funktion reloudUI() einen Strich durch die Rechnung gemacht :-/

This function is protected, and may only be called in response to hardware event.

Ich versuchs jetzt mal mit einer onClick Funktion..
 
Also ich hab ReloadUI() in einem Button drin und es funktionierte bis jetzt.
 
Mit viel "pröbeln" und suchen hab ichs jetzt hingekriegt! Zumindest funktioniert es. Also zwar nicht vollautomatisch aber mit einem Button für ein UI Reload der danach verschwindet. Jetzt muss ich noch am aussehen feilen.

Code:
local f = CreateFrame("Frame","FiliLoadFrame",UIParent);
f:SetFrameStrata("MEDIUM");
f:SetWidth(350);
f:SetHeight(150);
f:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background", edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 16, insets = { left = 4, right = 4, top = 4, bottom = 4 }});
f:SetBackdropColor(0,0,0,1);
f:SetPoint("CENTER",0,0);
f:RegisterEvent("PLAYER_ALIVE");
f:RegisterEvent("ADDON_LOADED");

local b = CreateFrame("Button","FiliLoadButton",FiliLoadFrame);
b:SetAllPoints(f);
b:RegisterForClicks("AnyUp");
b:SetScript("OnClick", ReloadUI);

local t = b:CreateTexture(nil,"HIGH");
t:SetTexture("Interface\\BUTTONS\\UI-MicroButton-Help-Up.blp");
t:SetAllPoints(f);

local function eventHandler(self, event, ...)
	if event == "PLAYER_ALIVE" and DBM_SavedOptions["HPFrameY"] == 50 then
		SlashCmdList["REFLUX"]("switch Default");
	end;
	if event == "ADDON_LOADED" and DBM_SavedOptions["HPFrameY"] ~= 50 then
		f:Hide();
	end;
end;
f:SetScript("OnEvent", eventHandler);


Danke für eure Hilfe und Denkanstösse
 
ReloadUI sollte doch ReloadUI() sein oder?

Noch was, warum f erschaffen wenn du b genau gleich machst?
aus den zwei if bei eventhandler kannst auch ein if und ein elseif machen, sieht besser aus. Und dort wird auch nicht überprüft ob das addon geladen ist beim ersten
 
Zuletzt bearbeitet von einem Moderator:
Zurück