Hi and welcome to my addon forum :) Here you can find all news and every new version of my addons and mods. Also, if you have any questions, ideas or bugs, you're free to post it here :) This forum guaranteed to be allways actuell and have allways each new version of my addons and mods before any other page has them ;) Also, I will take a look into the forum at least one time each day, and will do my best to answer to every post :)
Deutsch:
Hi und willkommen in meinem Addon Forum :) Hier findest du alle Neuigkeiten und jede neue Version meiner Addons und Mods. Auch fragen, Ideen oder Bugs kannst du hier offen posten :) Das Forum ist garantiert immer aktuell und hat stets die neusten Version als erstes ;) Außerdem schau ich mindestens einmal am Tag in das Forum und werde mein besten versuchen, auf jeden Post zu antworten :)
Kein Problem^^ Das "I wouldn't come from this" sollte "ich würde nicht davon ausgehen" heißen ("I wouldn't count on this" heißt ja "ich würde nicht darauf zählen"^^) und laut dict.leo heißt "von etw. ausgehen" "come from sth"^^
I'm sorry, but I'm afraid you're in the wrong forum :/ This forum, as well as this thread, is about my projects, especially an addon called "GroupInvite" for the game "Runes of Magic" (and, by the way, this is also currently a very inactive forume, as I've stoped working on that addon some years ago to work on a much bigger project). Of course, this does not mean that you can't find someone here to help you, but I wouldn't come from this. (By the way, is "come from" here the right phrase? English is not my mother tongue and I've never used that phrase before, so please correct me if an other phrase would be better )
Hi, sry für die verspätete Antwort, hab den post schlichtweg übersehen *-* (Die Markierung, dass in dem Thread was neues gepostet wurde, ist leicht zu übersehen ). Ich nehme mal an, du benutzt Version 2.3.902? (Ist wegen den Zeilenangaben wichtig^^). Wenn ja, dann läge der Fehler möglicherweise an einem kleinen Kompatibilitätsproblem mit dem Addon XAFK (Zumindest laut Fehlermeldung). Ist dieses Installiert (bzw. zumindest dessen Speichervariable vorhanden) versucht GroupInvite mit der Hilfe dieses Addons zu ermitteln, ob der gespielte Charakter afk ist, in dem er auf einen Bestimmten Wert innerhalb des Speichers des Addons zugreift. Leider scheint es jedoch so, dass mit der aktuellen Version von XAFK diese Variable nicht mehr vorhanden ist, was GroupInvite zu einer Fehlermeldung veranlasst.
Um den Fehler zu beheben gäbe es zwei bis drei Lösungswege: 1. Du deinstallierst XAFK (Edit: XAFK kann auch bestandteil anderer X-Addons wie z.B. XBar sein. Nach dem deinstallieren des Addons das Spiel neu starten. Hilft das nicht, müsstest du einen der beiden anderen Lösungswege hier verwenden) 2. Du öffnest die Datei "GroupInvite/Lua/System/Main.lua" mit einem beliebigen Text-Editor (am besten das normale Notepad von Windows, bzw Notepad++), gehst in Zeile 936 und löscht den folgenden Code-Abschnitt:
if(XAFKSet and XAFKSet["Afk"]>0)then isAFK=true; end
Dann abspeichern und es sollte wieder alles funktionieren.
3. Ist weder XAFK noch ein anderes X-Addon(wie z.B. XBar) installiert, müsste auch das zurücksetzen der gespeicherten Daten helfen (Dokumente->Runes of Magic->Die Datei SaveVariables.lua in diesem und allen Unterordnern löschen und Spiel starten. Damit das Funktioniert muss vorher natürlich das Spiel aus sein. Achtung: Dadurch werden alle Addon-Einstellungen aller Charaktere zurück gesetzt!!!). Wenn du davor kein XAFK an sich installiert hattest und extra Addons wie XBar gelöscht hast, kannst du versuchen, diese nacheinander wieder zu installieren, um zu ermitteln, welches den Fehler verursachte.
Auf jeden Fall vielen Dank für die Meldung, in der nächsten Version wird das gefixed sein (Die allerdings wohl noch etwas braucht bis zum Release, da ich aktuell anderen Projekten mehr Zeit einräume...)
Good day everyone, It's a long time since I've posted here last. The reason for this is that I worked (and be still working) on my first stand-alone project. This project, which is currently still nameless, will be a compleat point-and-click adventure game, just like the old Monkey Island games or some games of Daedalic Entertainment (maybe not as qualitative as their, because I'm working nearly alone...). The game is based on a self-programmed game-engine called "Cloak Engine 1.0", which is currently created in java and can only handle 2D-games at the moment. The game is still far away from a release (by the way, this project will be my first one, which won't be free anymore. However, there will be a free demo including the first of 11 chapters of the game), but at least the cloak-engine works now pretty good. Some smaller functions are still untested and I'm thinking of how to save sound- and cutsceen-data as well as single images, but in the main the engine works very well. At the moment, the cloak-engine uses 5 own file formats to handle special informations, some more complex than others:
SVS: Means "Saved Settings" and includes the last saved settings of the game
SVG: Means "Saved Game" and includes a savegame as well as some meta-data
CAF: Means "Cloak Animation File". This is a resource file with images and informations of an animation
CLF: Means "Cloak Language File". This is a resource file with specific informations depending on the used language
CMF: Means "Cloak Map File". This is a resource file with data of mouse handling for some objects
Of course I don't want to tell you the whole story before you've played the game, but here is at least a small summery of the games story: In a greate and nice kingdom, the marry of the kingdoms pricess with an prince of the nighbore kingdom is planed. Unfortunately, neither the princess has ever seen the prince before, nor vise versa, which leads the prince to the thought, that the princess may won't like him because he has never done something heoric. So he leaves the city to kill a dragon, just some days he would be married. A friend of the price knows about his idea, and as soon as the price doesn't return, he tells the princess this plan, and a huge adventure will start.
The game is created with the thought in mind that it should be unpossible to write a walkthrough. To do this, you'll have to decide at every corner, and every decission, every way of how to compleat a puzzle, and sometimes even contingency will affect the whole story and future puzzels and quests of the game. Yes, you've read right, there will be quests in the game, both main and side quests. You decide, which of them you compleat and how you compleat them, but carefully: you can't do everything! As a second feature, you'll be able to give names to the played characters, and this names will be used by the people around you, both in text and speech.
When the game will be released is not clear yet, as it depends on how much time I will have, but I plan to release the first version of the free demo within the next 6 or 7 months.
Last but not least - just to give you some idea of how the graphics will look like - here is a pre-alpha, still unready version of the background image at the main menu. The top and the background of the image are still missing, as I focused more on program the engine than on drawing the image. Also, this is only a smaller version of the image, due to the file size I didn't want to upload it with full resolution. You're free to use the image uncommercial, as long as you don't change it and allways refer to the original author of the image. Any commercial use of the image is only allowed with an official license of the original author of the image!
(Click on the image to see it at fullscreen) [[File:GUI_MainMenuBack.png|none|auto]]
Ein StandAlone von dem Recrutor wird es (von meiner seite aus) wahrscheinlich nicht geben (ich hoffe hier jetzt mal dass ich den Fehler bei der aktuellen beta noch irgendwie reparieren kann ), da die besonderheit seit v2.3 bei GroupInvite ist, dass jede Seite an sich bereits StandAlone ist - zumindest nahezu Es gibt praktisch zum einen den "Ausführenden Teil" (genannt GroupInviteEngine) und dann zum anderen die Seiten, die jeweils einzelne LUA-Dateien sind. Das Besondere an diesem Aufbau ist, dass im grunde jede dieser LUA-Dateien der Seiten gelöscht werden kann, ohne dass es zu einer Fehlermeldung kommt (bzw kommen sollte, habe bisher keine Rückmeldung erhalten, ob das auch so funktioniert). Ursprünglicher Hintergrundgedanke waren Beschwerden, dass das Addon überladen sei und viele der Funktionen gar nicht genutzt werden. (In der Released-Version von 2.4 wird es sogar eine Ingame-Möglichkeit geben, Seiten zu deaktivieren, so dass ihr Code aus dem Arbeisspeicher genommen wird). Folglich wäre der Recurtor bereits StandAlone, wenn man unter GroupInvite/LUA/Tree/ alle Dateien außer den Recrutor (und das MainInterface) löscht bzw aus dem ordner entvernt oder umbenennt^^ (Das MainInterface erstellt die leiste mit der Gruppen- und Sprachauswahl, weshalb ich empfehle das sicherheitshalber drin zu lassen)
hab bei mir entzwischen auch mal ohne weitere addons GroupInvite laufen lassen(weil könnt ja versehentlich eine art "abhängigkeit" eingebaut sein), aber auch da tritt der fehler bei mir nicht auf :/ der nächste ansatz, den ich hätte, wäre, dass meine version von RoM entzwischen schon 2 oder 3 Jahre alt ist (entsprechend hat er auch extreme probleme mit umgebungstexturen, die haben die vielen patches nich überlebt ), dass das vll daran irgendwie liegt. Hab allerdings nun irgendwie auch nich groß die lust RoM nochmal zu downloaden mal schauen wann ich das dann mal mache, weil solang der Fehler bei mir nicht auftaucht, kann ich da ja machen was ich will ohne zu wissen ob das dann den Fehler behoben hat :/
Die Bedienung ist in diesem Fall tatsächlich fehlerhaft, was allerdings auch an einer schlecht gemachten Bedienoberfläche meinerseits liegen könnte. Diese ist momentan in der 2.4 (beta) auch noch nich verbessert, dies wird aber noch in Angriff genommen Bei der Momentanen Version (2.3 - 2.4.1007) arbeitet der Gilden Recrutor komplett unabhängig vom Gruppen-System: Die Gruppen, die du erstellt, sind tatsächlich nur für das automatische Einladen in eine Gruppe gedacht, und der "Starten" Button ist auch nur für diese Gruppe gedacht. Der Gilden Recrutor besitzt selbst keine eigene "Shout" funktion. Um den Recrutor zu Aktivieren muss man auf der Recrutor Seite den Haken bei "Aktiv" (oder so) rein machen, er wird jedoch dann nicht regelmäßig irgendwas senden sondern das heißt nur, dass die eingestellten Kanäle auf die eingestellten Stichwöter hin untersucht. Um dem ganzen einen Text zu geben, ist das Verwenden der Gildenwerbung empfohlen (wie gesagt, insbesonders wenn ich das so schreibe fällt mir auf, dass das Momentan noch eine sehr unbequeme Art der Benutzung ist ). In die Gildenwerbung kannst du bestimmten Stichworte eingeben (diese werden dir per tooltip mitgeteilt), welche dann automatisch mit gewissen Daten ersetzt werden ("$REC" wird dann z.B. mit den Stichwörtern des Recutors ersetzt), außerdem besitzt die Gildenwerbung (durch anhak-kästchen und eingabeboxen) über die Möglichkeit eines automatischen, regelmäßigen sendens^^ Ich betone mal nochmal, dass die Bedienung dieses Systems noch deutlich verbessert wird
Der Fehler in der Beta ist bereits bekannt (wurde von Goonie unter dem Thread der Beta gepostet ... jaaa, eigl sollte er das hier posten, aber da es diesen Sommer sowieso ein paar Änderungen hier geben wird (die Addresse der Seite wird sich ändern, sowie das Layout und der Umfang, etc^^) lass ich das mal jetzt so durchgehen ^^), nach der Fehlerquelle such ich allerdings bisher noch eher vergebens ([EDIT] der Grund dafür ist, dass ich den Fehler nicht reproduzieren kann :/)
Das mit den Privaten Channels ist da tatsächlich noch fehlerhaft, das wäre aber an sich in der beta dann bereits gefixed (glaub ich ), alles weitere dann im anderen Beitrag
...achja, bevor ichs vergesse: Wegen den Arbeiten an den oben genannten Änderungen an der Seite und an meinem ersten Stand-Alone-Project (heißt ein tatsächlich unabhängiges Spiel) arbeite ich momentan nur sehr wenig an meinen anderen Proekten (GroupInvite mit eingeschlossen). Ich hoffe das ändert sich wieder, sobald die neue Seite online geht, aber bis dahin wird es vermutlich nicht viele updates geben :/ Ich entschuldige mich dafür
ok 0o ich werd mal bei mir bissl nachforschen, ob und wie ich das reproduzieren kann, um das dann zu beheben irgendwie wird man das ja wohl beheben können *-*
ich könnte momentan nicht mal genau sagen wo er hängt 0o hat irgend ein anderer button eine funktion(abgesehen von den anhakbaren kästchen - das häkchen wird von RoM aus immer gemacht)? bzw werden einstellungen auch beibehalten, wenn man zwischendurch die seite wechselt?
die option dafür ist momentan noch etwas versteckt unter dem "GroupInvite" bild ist ein kleines Rechteck zu sehen, das je nach verbindungsstatus(rot=chat ist deaktiviert, gelb=chat wird gesucht, grün=verbunden) gefäbrt ist Im normalfall sollte das system ja keine Schwierigkeiten machen und auch nicht stören, und da ja dann (bald) jede (sichtbare) seite deaktiviert werden kann, wollte ich die einstellung dazu nicht in eine Seite packen, die der Benutzer dann versehentlich löschen könnte - und oben war nicht mehr viel platz um das ordentlich zu beschriften, ein tooltip sollte allerdings deutlich machen was das für ein kästchen ist ist ja momentan noch ne alpha bzw beta, da kann man das auch noch verschieben
0.0 da werd ich auch mal noch weng genauer nachforschen, danke für die Meldung Schreib dann bitte auch ob das löschen der anderen Addons irgendwas gebracht hat, weil so an sich sollte von der Reihenfolge her die Standartvariablen noch vor dieser Meldung erstellt worden sein, mal davon abgesehen dass ich in dem dafür zuständigen System garnichts verändert habe Und im eigentlichen Ladesystem des Addons gibt es eigl keine möglichkeit, dass endlosschleifen entstehen könnten 0o einzige evt. lücke wäre das "UndergroundMessage" system, welches diverse Funktionen vom Chat abendert (und tatsächlich erst nach dieser Meldung läd - neben den Seiten ansich als einziges ) um praktisch komplett unsichtbar zu werden (hab da eigl seit der Beta auch nix dran geändert 0o aber da es eben viel im Chatsystem verändert, ist es auch etwas empfindlich wenn Fehler in diesen Funktionen auftauchen und der Fehler zum Chat - also den Funktionen - gesendet wird ). Werde mir das auf jeden fall nochmal genauer Anschauen
So, hab jetzt mal ne neue alpha hier hoch geladen, in der ich u.a. das Ladesystem und das Minimap-Handling überarbeitet habe, in der hoffnung dass das den Fehler behebt^^ Bei mir zumindest gab es seitdem in keinster weise mehr probleme beim testen Die hohen resourcenkosten des Addons werd ich hingegen wohl nicht in nächster zeit ernsthaft herunter schrauben können, da das sehr viel code ist und ich in dem Thema der Optimierung einfach noch zu neu bin^^ Ich tu allerdings mein bestes Außerdem sollte der Resourcenverbrauch auch nur in den Momenten, in denen man mit dem Interface interagiert (besonders das aufrufen von Seiten/schließen des Einstellungsfensters), sonderlich hoch sein (mitunter liegt das glaube ich an einem Code zum überprüfen der maximalen Zeichenlänge bei Eingabefeldern. Da es von seiten RoMs her dazu keine LUA funktion gibt, musste ich diese selbst erstellen, was zwar funktioniert aber momentan wird die Funktion noch deutlich häufiger aufgerufen, als nötig wäre^^)
Hoffe diese Alpha funktioniert besser als die Beta
Ok, ich werd versuchen ne neue Beta im laufe der nächsten 2 Wochen raus zu bringen, kann aber nichts versprechen^^ (Wahrscheinlich wird auch diese wie schon die vorherige keine/kaum neue funktionen beinhalten, aber ich hoffe sie zumindest resourcensparender und funktionsfähiger hin zu kriegen ) Bin momentan leider etwas arg ausgelastet (schule, skyrim projekt, sowie ein Projekt bezüglich dieses Forums und dem lernen von java (für minecraft mods)), weshalb meine arbeit an dem RoM addons momentan eher langsam voran geht, ich werde aber mein bestes versuchen
ok,danke dass er die namen nich findet ist normal, da bisher noch keine seite aufgerufen wurde, wenn man eine der dropdown tables benutzt würde er dann den zugehörigen namen auch finden^^ Die Fehlermeldung in Bild 6 ist ein Skript-Aufhänger (evt. könnte dies auch die fehlerquelle sein), durch das löschen der Datei GuildAPI.lua in GroupInvite/lua/Tree dürfte das zumindest vorrübergehend helfen(dabei werden alle die gilde betreffenden seite deaktiviert), zumindest sollte es die performance wieder etwas verbessern, wenn der fehler nicht mehr auftaucht^^ Ansonsten konnte ich keine Fehler im Laden finden :/ zumindest soweit sich raus lesen lies wurde alles korrekt geladen, auch in der richtigen reihenfolge... Was vll noch interessant wären, ist ob und welche debug-nachrichten beim benutzen des minimap-buttons auftauchen (weil der ja nicht funktioniert) und die debug-nachrichten beim aufrufen einer seite, bei der der text fehlt (ich bin mir nicht mehr sicher ob das text setzen noch ne debug nachricht drin hat, ich glaube aber schon^^ so könnte man zumindest herausfinden, wo es beim anzeigen der seite denn mangelt^^) Ansonsten vielen dank für die Hilfe MfG
Ja, es gäbe tatsächlich einen Debugmodus, der ist allerdings ein wenig umständlich zu aktivieren (is dafür für mich einfacher zum deaktivieren wenn ich ne neue version hochlade^^) und zwar musst du in dem GroupInvite Ordner eine Datei mit namen "GroupInvite_Edit.gie" anliegen (ja, der dateityp ist .GIE), beim nächsten spielstart erkennt GroupInvite das dann automatisch und schaltet den Debug Modus an^^ (was in der datei enthalten ist, ist übrigens irrelevant^^ sie muss nur existent sein^^) Aber, schonmal als vorwarnung: Im Debug-Modus werden sehr viele Meldungen im Chat-Fenster ausgegeben (die debug-Meldungen sind an sich alle weiß und fangen mit einem grün-blauem "[GroupInvite]:" an^^), kann also evt. etwas verwirrend sein. Sollte der Ladevorgang korrekt abgehandelt werden, müsste nach dem laden irgendwo eine liste mit "try to register XXX" sein, da läd er grad die Seiten. Besonders wichtig ist hierbei die Seite "MainInterface", da es für gewöhnlich diese ist, die ärger macht, und die kümmert sich auch um die Funktion des Minimap-Buttons usw^^ Wenn sich der Skript nicht aufhängt sollten allerdings keine Debug-Nachrichten kommen solange nichts geschieht (kein lade-vorgang, keine nachricht im chat-fenster und ähnliche sachen, diese verursachen alle ein paar debug-nachrichten^^). Beim Aufrufen von Seiten können im übrigen sehr sehr viele Debug-Nachrichten kommen, kann da also bissl unübersichtlich werden, nur als vorwarnung MfG
ok, erstmal danke für die infos Sieht für mich sehr nach einem Fehler beim Seiten laden aus (wenn er die Sprachdatei nicht lesen könnte, würde auch im Tooltip nur variablen-namen stehen), da er dann auf der Seite in den Einstellungen anscheinend die Texte nicht korrekt läd wäre meine erste vermutung jetzt, dass er sich (wahrscheinlich eben wegen dem Ladefehler) irgendwo aufhängt, was ggf. auch die Performance verringern kann. Werd ich mir auf jeden fall mal genauer anschauen und auch versuchen allgemeine Performance-Optimierungen einzubauen. Da ich den Ladefehler schlecht bewusst verursachen kann, kann ich aber schonmal vorwarnen dass es noch wahrscheinlich einige beta-versionen geben wird bevor die 2.4 released wird Auch wird die Zeit bis zur nächsten Beta wohl noch etwas dauern, da Optimierungen immer recht schwer hinzukriegen sind(zumal ich in diesem Themenbereich noch nicht dramatisch viel Erfahrung habe) und ich nebenbei an einem Projekt bezüglich dem gesammten Forum arbeite, das hoffentlich zu Beginn der Sommerferien zumindest als eine art Open-Beta erscheinen kann ^^
Werde also mein bestes geben um die Probleme zu beheben, wird sich aber leider noch einige Zeit hin ziehen... Auf jeden Fall vielen dank für die Unterstützung MfG
Danke, werd ich mir mal genauer anschauen kommst du mit /gic in die Einstellungen? Ggf. kann auch ein Spielneustart den Fehler beheben, aus mir bisher unbekannten gründen hat er manchmal beim Spielstart Probleme, manche Seiten korrekt zu laden... Werd ich mir auf jeden fall nochmal genauer anschauen, danke für die Meldung
Hi there As the work of the project is going on, we will start to create the map soon. But actually, the names of the special places in the world have just systematic names, no "real" names. So - as we want to include you - youre asked. If you have any ideas for the names of the following places, you're able to post them as long as this is not closed. The best names will maybe included into the game. For the main places, we have:
11 citys, 4 from the elves, 1 of the dwarfs, the rest is from the humans, including a king-city, a city of the magic guild and a city with a huge, magical library
8 Villages, where just one is from the elves, and one is (from the humans) in the desert
7 camps of thiefs, jokers and people like them, who can't or don't want to live in the cities or villages
Some special places like 2 lakes, an magic tree of fire, and so on
Every idea is welcome, just try We're counting on you
At the end, please notice that the games is about an fantasy world, just like Skyrim itself, so the names should maybe also be fantasyful
I'm very very sorry, but it seems that I can't work currently on the adddon, as I'm working on an much bigger project. As soon as this will release(planned at summer 2014), I will work on GroupInvite again, but until then the work here is frozen. Sorry again :( (I will of course still do my best to give best support to the addon)
Hi there After much work and long time, the first beta of v2.4 is released. This first beta won't include much new features of bug fixes, as I just rewrote all pages and the GroupInviteEngine, which has now an much better support for other page pack developpers. But at leaset some bugs in the GroupInviteEngine itself are now fixed. New features and bug fixes, as well as three new pages will be in the next beta and - of course - in the next released full version Also, the DevTools-Page Pack won't releases for this beta, but for the next
Please notice that ExtraActionBars is may not compatible with this version. A fix for this will also be released with the next beta, as I think that the ExtraActionBars-project has to be frozen for the next months. The reason for this is my work at my Skyrim-Project as well as my work at an (for now) secret project
Here the change-log of this beta: New:
Added waitlist-system to the color picker
Added support for XBar3 as well as the AFK-addon of XBar (to notice if the player is afk or not)
Added system to allow GroupInvite to communicate with other players(function is deactivated by default)
RaidSort: Added save function to save the actual raid possitions
RaidSort: Added second frame-set to create and edit own classes(such as "DD" or "HEAL")
Fixed:
Sorted lists work very much faster(scrolling a sorted list, choosing something of the list, and so on)
Removed save-commands of the API from the saved data
Other:
Maybe the GroupInviteEngine needs now a bit more resources, (at leased it seemes so to me, but maybe it's just the very old, partly damaged RoM version of me )
Please notice that some functions has in the tooltip "Only if connected", which would mean that the connection to other GroupInvites would be required, but actual this feature is not included. This is for a planed permissions system for the guild system. This means that these functions will be locked in the next version until the guild-leader send you with GroupInvite the permissions to use the function, or the guild-leader is online but not connected to other GroupInvite users(for example because he don't use GroupInvite).
In the case that you found any bug or something like this, or you have ideas for new functions or something like this, please tell it me I will be glad about this, even if i may had known this bug before or can't implement your idea for any reason. Also, this helps me to make a better GroupInvite. An feedback, which functions/features of GroupInvite you like or don't like would be very helpful
Download
Download through curseforge.com. If you want to support me(it's free for you ) please choose this: Download 1 If you don't want to support me or don't like curseforge.com or something like this: Download 2
yours faithfully ~Bizzarrus
[EDIT]: Here's a new ALPHA version: 2.4.1010. This version is not released at curse.com yet, as there are not many changes. The main reason of this alpha was to try to fix loading bugs and so on. For this reason, i've rewritten the page loading, minimap handling and texture handling code. After that, I had actually no loading problems anymore (well, I hadn't this problems often before....), so I hope it is fixed now. If someone would take a look into the code, he would may notice that the preperations for a new page is actually included, but not the page itself. This is because the page doesn't work right at the moment, but I'm working on it. Also, there's still no DevPage, as I'm very busy at the moment, thanks to other projects. The DevPage as well as some other new pages will be included in the next beta By the way, because of the size of code, v2.4.xxx needs much resources at the moment. I tried to make it more light wight, but the game still forzes for a little moment if you use some of the GroupInvite interface. I'll try to make this better, but I'm afraid that this code could be too big and I'm too new in the theme of optimizing, to repear this compleatly in the near feature :/ Here's the download link for the new alpha: [KLICK]
Seit Version 2.3 basiert GroupInvite auf der "GroupInvite-Engine", einer Addon API die extra für GroupInvite programmiert wurde. Diese API stellt neben zahlreichen Funktionen die Möglichkeit zur Verfügung, Addons als sogenannte "Seiten" in den von der API mitgelieferten Main-Frame einzubinden. Hierbei benötigen diese Seiten jedoch keine xml-Datei, sondern können mit Lua-Befehlen auf einfache und schnelle Weise ihren eigenen Frame zusammenbauen, wofür die API zahlreiche Vorlagen zur Verfügung stellt. Ebenso ist das Umblättern innerhalb dieser Seiten möglich, so dass eine Seite mehrere Frames besitzen kann(sollte der Platz für einen nicht ausreichen). Auch die Verarbeitung des Speicherns und Ladens, Tooltips, Beschriftungen, Sprache, etc wird von der API verwaltet und teilweise sogar nahezu komplett automatisiert, sofern man diese Automatisierung wünscht. Mit dem Überarbeiten der API in Version 2.4 wurde diese nicht nur stabiler, sondern bietet den Seiten auch die Möglichkeit, über einen unsichtbaren Chat mit anderen Addon-Nutzern zu kommunizieren. Auch an der Übersichtlichkeit der API wurde gearbeitet, sodass es den Programmierern der Seiten nun leichter fällt, die benötigten Funktionen zu finden. Für den Benutzer der API bietet diese außerdem die Möglichkeit, Seiten ingame zu laden oder zu löschen, ohne dass ein Spielneustart erforderlich wird. Hierbei werden diese Seiten nicht nur deaktiviert, sondern komplett aus dem Speicher gestrichen. Einzig die gespeicherten Variablen bleiben bis zum Spielneustart erhalten. Um dieses komplette löschen der Seiten möglich zu machen, werden alle Funktionen der Seite in eine lokale Table eingespeichert, die von der GroupInvite-Engine eingelesen wird. Zur Übersichtlichkeit hier eine kleine Aufzählung, zu was die GroupInviteEngine fähig ist:
Speichern, Laden und Verarbeiten von Variablen nahezu vollkommen automatisch
Frames Ingame via Lua-Befehlen auf einfache Weise erstellbar(sowohl innerhalb des Main-Frames wie auch außerhalb)
(De-)aktivieren von Seiten ingame, ein Spielneustart ist nicht erforderlich
Aufbau von Listen mit bis zu 3 Spalten, welche nach belieben Alphabetisch sortierbar sind
Seiten mit Drag & Drop Systemen
Automatisch generiertes Baum-Menü, um zwischen den Seiten zu wechseln
Unsichtbare Kommunikationsmöglichkeit zwischen den Benutzern, wobei die Möglichkeit von dem Spieler deaktiviert werden kann
Vereinfachtes Hook-System, bei dem die Hook-Funktionen nur in Ausnahmefällen die Originale Funktion aufrufen müssen(in den meisten Fällen geschieht dies automatisch)
Automatische Verwaltung der Sprache und Sprachdateien sowie der Farben
Ingame veränderbares Layout der Frames
Zahlreiche zusätzliche Funktionen, die z.B. Zahlen mathematisch korrekt auf eine beliebige Menge an Nach-Komma-Stellen runden kann, den Namen des Gruppenleiters oder auch auswählbare Klassen zurückgiebt, usw.
Da die GroupInviteEngine entzwischen mehr als 130 API-Funktionen (plus zusätzliche Systemeigene Funktionen) besitzt, werde ich an dieser Stelle der Übersichtlichkeit wegen keine Referenz zu jeder dieser Funktionen geben. Stattdessen wird es nach Release der Version 2.4 eine "DefPage" geben, die den Entwicklern der Seiten eine komplette Referenz aller API-Funktionen bietet und zudem eigene Funktionen wie ein Debug-Nachrichten-System o.ä. beinhalten wird.
Da die Funktionen seit Version 2.4 nicht mehr Global gespeichert werden, hat sich das Aufrufen der Funktionen leicht gewandelt: Jede API- oder Seiten-Funktion ist nun mit der Funktion GroupInvite_Do aufrufbar. Diese Funktion gewehrleistet - neben dem Aufrufen der Funktionen - zudem die Sicherheit, dass es keinerlei Fehler bei nicht-vorhanden-sein der Funktion auftreten und das Aufrufen der Funktion im Falle, dass die Engine auf einen Fehler gelaufen ist oder deaktiviert wurde, abgebrochen wird. Das Arbeiten mit dieser Funktion ist im Grunde sehr einfach: Das erste Argument, das die Funktion wünscht, ist der Name des Herkunfsortes der Funktion, die du aufrufen willst. Willst du also z.B. eine API Funktion aufrufen, wäre das erste Argument "api", willst du hingegen die Funktion einer Seite aufrufen, wäre es der Name dieser Seite. Anschließend folgt - ebenfalls als String - der Name der aufzurufenden Funktion. Im Anschluss kannst du dann die Argumente an die Funktion durchgeben.
Als Beispiel stellen wir uns folgende Situation vor:
Die Seite "seite1" hat die Funktion "GetMyTable", die eine table-variable zurück gibt, wenn das erste Argument der Funktion true ist.
Die Seite "seite2" möchte die Anzahl an Objekten in dieser table-variable haben, egal ob es eine numerische table ist oder nicht
Da die Funktion "GetMyTable" als erstes Arugment true erhalten hat, gibt diese nach der Beschreibung der Situation eine table-variable zurück. Die API-Funktion "TableMaxn" arbeitet mit 2 Argumenten: das erste ist die table, die gezählt werden soll. Das zweite, optionale Argument ist eine Boolean-Variable. Solange dieses zweite Argument nicht true ist, gibt die Funktion die Anzahl aller Objekte in der Table zurück, unabhängig davon, ob sie numerisch sind oder nicht. Wenn das zweite Argument true ist, gibt es die Anzahl an numerischen Objekten in der Table zurück, allerdings unabhängig von der Bezeichnung des Objektes an sich. Hierzu nochmal ein Beispiel:
tab1={14,7,true,"hust"}
Dies ist eine numerische Table-Variable, d.h. tab1[1]=14, tab1[2]=7,usw
tab2={[7]=13,[5]=false,[12]=9,[10]="hust"}
Diese Table-Variable enthällt ebenfalls nur Nummern als Bezeichner, jedoch ohne jedliche Ordnung
tab3={[8]=5,["test"]=12,[true]=false,[90]=14}
Diese Table-Variabe enthällt zwar auch nummerische Bezeichner, aber auch Bezeichner anderer Typen wie String oder Boolean
Diese Table-Variable enthällt nun keine nummerischen Bezeichner mehr
GroupInvite_Do("api","TableMaxn",tab1)=4
GroupInvite_Do("api","TableMaxn",tab1,true)=4
tab1 ist eine reine Aufzählung, somit ist das zweite Argument oder überhaupt das Verwenden dieser Funktion anstelle von table.maxn eher sinnfrei
GroupInvite_Do("api","TableMaxn",tab2)=4
GroupInvite_Do("api","TableMaxn",tab2,true)=4
tab2 ist keine Aufzählung mehr, aber es sind immer noch alles nummerische Bezeichner, also ist auch hier das zweite Arugment unnötig
GroupInvite_Do("api","TableMaxn",tab3)=4
GroupInvite_Do("api","TableMaxn",tab3,true)=2
In tab3 sind nur zwei nummerische Bezeichner vorhanden, also wird die Funktion mit dem zweiten Argument nur diese beiden zählen
GroupInvite_Do("api","TableMaxn",tab4)=4
GroupInvite_Do("api","TableMaxn",tab4,true)=0
In tab4 gibt es keine nummerischen Bezeichner, folglich gibt die Funktion mit dem zweiten Argument auch 0 an, während die ohne die gesammte Anzahl an Objekten zurück gibt, auch wenn deren Bezeichner Funktionen, Boolean-Variablen oder Strings sind
Eine Seite ist grob in 3 Bereiche einteilbar: Die Definition der Seiteninformationen, die Definition der Funktionen und die Registration der Seite, wobei die Definition der Funktionen verständlicher Weise den größten Teil einer Seite ausmacht.
Die Seiteninformationen Die Seiteninformationen werden in einer lokalen Table gespeichert, auf die innerhalb der Funktionen häufiger Zugegriffen wird. Darin enthalten sind beispielsweise Seitenname und -version. Bei der späteren Regestrierung der Seite wird außerdem eine automatisch generierte ID in die table hinzugefügt, die vorallem beim Handling der Frames von Bedeutung ist. Sowohl der Seitenname als auch die Seiten-ID sind eindeutig mit der Seite verknüpft, heißt es gibt keine zweite Seite gleichen Namens oder ID. Sollte der Name der Seite bereits vergeben sein, wird während der Regestrierung eine Zahl an den Seitennamen angehängt, um ihn so wie eindeutig zu machen. Daher ist es zu Empfehlen, die Funktionen der eigenen Seite immer mit GroupInvite_Do(page.name,...) auszuführen, anstatt den Namen direkt als String anzugeben.
Meistens wird in diesem Bereich auch die lokalen Variablen der Seite geladen, sowie die default-table erstellt. Die default-table ist eine Art Modell der Speichervariablen, beim Starten von GroupInvite werden alle gespeicherten Variablen, die nicht zu diesem Modell passen, gelöscht, und alle die fehlen erstellt. Auf diese Weise wird sicher gestellt, dass es keine Fehler wegen fehlender Speicherdaten gibt. Trägt hierbei ein Wert/eine Table den Bezeichner "$__def", bedeutet dies, dass alle numerischen Variablen in der table, in der dieser Wert ist, als Modell diesen Wert haben. Ähnliches gillt für den Bezeichner "$__all", wobei dieser jedoch für ausnahmslos alle Variablen in der table zutrifft. Auf diese Weise lassen sich Modelle für Listen an gepseicherten Variablen erstellen, ohne dass man die genaue Anzahl kennt (bei der Blockliste z.B. sähe das dann so aus: ["Blocklist"]={["$__def"]="",} das bedeutet, dass alle numerischen Werte in der table "Blocklist" vom typ String sein werden. Trifft das auf einen numerischen Wert nicht zu, wird er "". Exestieren keine numerischen Werte, wird der erste numerische Wert mit dem Index 1 automatisch festgelegt. Diese automatische erstellung eines Wertes, sollte keiner exestieren, gibt es bei "$__all" nicht!). Die Werte $__all und $__def selbst werden NICHT in die gespeicherten Variablen mit aufgenommen! Zusätzlich zu $__all und $__def gibt es auchnoch den Begriff "$__inh" bzw "$__inh[n]", wobei [n] für eine beliebige Ganzzahl steht. Dieser Wert ist immer vom Typ String und gibt einen Pfad an, von dem der Inhalt kopiert werden soll. Bei den AutoAccept bzw AutoDecline listen sieht das dann z.B. so aus:
local default={
AAD = {
["Accept"]={
["Active"] =false,
["Guild"] =false,
["Friend"] =false,
["Other"] ={["$__def"]="",},
["All"] =false,
},
["Decline"]={
["$__inh"]="AAD.Accept",
},
},
}
was dem hier entspricht:
local default={
AAD = {
["Accept"]={
["Active"] =false,
["Guild"] =false,
["Friend"] =false,
["Other"] ={["$__def"]="",},
["All"] =false,
},
["Decline"]={
["Active"] =false,
["Guild"] =false,
["Friend"] =false,
["Other"] ={["$__def"]="",},
["All"] =false,
},
},
}
In dem Pfad werden unterschiedliche Bezeichner stets und aussschließlich mit . getrennt, der Pfad bezieht sich jeweils auf die default-table. Die verwendung von "$__inh[n]" erlaubt zudem, von mehreren Quellen die Variablen zu kopieren, z.B. ["$__inh1"]="AAD.Accept.Other.$__def", ["$__inh2"]="AAD.Decline.Active" . Das letztliche Resultat ist eine Ersparnis der Schreibarbeit sowie der Sicherstellung, dass zwei tabels genau das gleiche Modell besitzen, was z.B. Schreibfehler ausschließt. Ähnlich wie $__def und $__all werden auch die $__inh bzw $__inh[n] Werte an sich nicht in das Modell mit aufgenommen.
Die Seitenfunktionen Die Funktionen einer Seite werden ebenfalls in einer Table gespeichert. Diese beinhaltet außerdem zusätzlich den Wert "ClickModes", welcher als String angibt, welche Arten an Click-Modes von der Seite wahrgenommen werden. Ist der Wert nicht vorhanden oder der String leer, wird nur der Click-Mode "CLICK" wahrgenommen, ansonsten nur die in dem String aufgezählten, wobei die Aufzählung mit Leerzeichen getrennt ist. Vorhandene Click-Modes sind:
CLICK (wird beim Clicken auf einen Frame ausgelöst)
ENTER (wird ausgelöst, wenn die Maus über den entsprechenden Frame gleitet)
LEAVE (wird ausgelöst, wenn die Maus den Frame wieder verlässt)
UP (wird ausgelöst, wenn die Maus nach einem Klick losgelassen wird)
DOWN (wird beim herunterdrücken der Maustaste über dem Frame ausgelöst)
WHEEL (wird beim verwenden des Mausrades über dem Frame ausgelöst, in diesem Fall wird als "key" je nach Bewegungsrichtung des Mausrades 1 oder -1 angegeben)
Als Erklräung zu der zuvor beschriebenen Funktionsweise hier ein paar Beispiele: ClickModes = "" ist gleichwertig mit ClickModes="CLICK", heißt es wird nur das CLICK-Event wahrgenommen ClickModes = "ENTER" bedeutet, dass nur das "ENTER"-Event wahrgenommen wird, jedoch nicht das CLICK-Event ClickModes = "CLICK ENTER" bedeutet, dass sowohl das ENTER-Event als auch das CLICK-Event wahrgenommen wird
Zu den in der Table vorhandenen Funktionen fügt die Regestrierung noch die folgenden Funktionen "GetPage" und GetCmds" hinzu. Sollten bereits Funktionen mit diesen Namen vorhanden sein, werden diese bei der Regestrierung überschrieben! Diese zwei Funktionen sind die einzige Funktionen, die die Seite haben MUSS, um zu funktionieren, daher werden sie automatisch erstellt. Das heißt, du musst sie NICHT defenieren Zusätzlich gibt es eine Reihe von Funktionen, die optional vorhanden sein können. Sind sie vorhanden, werden diese Funktionen automatisch von GroupInvite entsprechend ausgeführt, eine explezite Regestrierung ist hierzu nicht notwendig, sie werden automatisch erkannt:
OnLoad() (wird ausgeführt, sobald die Seite regestriert und alle Variablen geladen sind)
OnUpdate(etime) (wird regelmäßig ausgeführt, wobei etime die vergangene Zeit in Sekunden seit der letzten Ausführung wiedergibt)
OnEvent(event,arg1,arg2,arg3,arg4) (ähnlich wie die standart-OnEvent-Funktion von Frames mit dem unterschied, dass auch GroupInvite-eigene Events ausgeführt werden. Diese Events fangen alle mit "GROUPINVITE_" an, eine komplette Liste der Events wird in der DevPage vorhanden sein)
OnSetText(func) (Diese Funktion wird ausgeführt, wenn die Texte der Frames gesetzt werden. In den meisten Fällen geschieht dies automatisch, die Funktion kommt erst dann zum Einsatz, wenn sich die Texte verändern können. Der Wert func ist eine Funktion, um die Texte zu setzen, und benötigt als erstes Argument den Namen des Frames als String, als zweites Argument die ID der Seite und als drittes Arugment den zu setzenden Text bzw den Text-Key, wie z.B. "GUI_GrpSave_ChooseGrpList")
OnDataControl(func,mode) (Diese Funktion wird sowohl beim Speichern als auch beim Laden von Variablen aufgerufen. func ist auch hier eine Funktion, welche als Argumente (in dieser Reihenfolge) den Namen des Frames, die Seiten-ID und die zu speichernde Variable benötigt, und die geladene Variable zurückgibt. Im Einsatz sieht dies also wie folgt aus: myVariable = func("myFrame",page.ID,myVariable). Diese eine Zeile speichert und läd die Variabe automatisch in den Frame, es ist nichts weiter notwendig. Der wert mode ist entweder "save" oder "load" und wird benutzt, wenn die Seite eigene Funktionen zum Speichern und Laden nutzen sollte. Gibt die Funktion OnDataControl true zurück, wird das Laden wiederhohlt, was dazu eingesetzt werden kann, falsche Eingaben zu korregieren)
OnBtnClick(name,key,mode) (Diese Funktion wird aufgerufen, sobald eine der oben genannten ClickModes eintritt, sofern der entsprechende ClickMode auch von der Seite wahrgenommen wird. Der Wert mode beinhaltet den ausgeführten ClickMode, der Wert key ist entweder "LBUTTON" oder "RBUTTON", je nachdem ob es die linke oder die rechte Maustaste war, und der Wert name beinhaltet den namen des Frames)
OnDropDown(this,name) (OnDropDown funktioniert im Grunde ähnlich wie OnBtnClick, mit dem Unterschied dass es keine ClickModes gibt und die Funktion beim öffnen eines DropDownMenüs aufgerufen wird, wobei der Wert name wieder den Namen des Frames beinhaltet, während der Wert this den Frame selbst beinhaltet)
OnTooltipReplace(_gsub,name,text) (Diese Funktion ist dafür zuständig, Variablen in Tooltips anzuzeigen. _gsub ist hierbei eine Funktion, die mit zwei oder drei Werten zurecht kommt: Bei zwei Werten ist der erste Wert der Textteil, der im Tooltip ersetzt wird (achtung: Im Tooltip sind "<"...">" um diesen Textteil herum, die Funktion fügt diese Zeichen automatisch hinzu, weshlab man sie im Wert weglassen sollte), der zweite Wert ist der zu setzende Text bzw Text-Key (siehe OnSetText), optional kann man vor den ersten Wert noch den Frame-Namen hinzufügen(der dann der erste Wert ist), in diesem Fall wird die Funktion nur bei diesem Frame ausgeführt)
OnShowFrame(pid) (Diese Funktion wird ausgeführt, sobald die Seite angezeigt werden soll. Der Wert pid gibt hierbei den "Part" an, der gezeigt werden soll(falls die Seite aus mehreren Seiten besteht. pid ist numerisch, beginnend mit 1). Meistens werden in dieser Funktion die Frames defeniert)
Wie bereits oben erwähnt ist jede dieser Funktionen optional, es wird keine Fehlermeldung geben, sollte eine Funktion nicht vorhanden sein. Funktionen wie OnBtnClick, OnDataControl, OnSetText,etc werden nur ausgeführt, wenn es nötig ist, heißt wenn mindestens ein Frame der Seite sichtbar ist.
Seitenregestration Zuletzt wird die Seite regestriert. Hierzu wird zum einen eine Regestrierungstable genutzt, die alle wichtigen Informationen beinhaltet, wie unter anderem die default- und die Seiten-table, sowie die Funktions-table. Zusätzlich können zu speichernde Farben oder Slash-Befehle festgelegt werden, sowie zusätzliche Sprachdateien regestriert werden. Letzteres ist für externe Seiten sehr wichtig, um die eigenen Texte einzufügen. Die Farben sind wie folgt festzulegen, wobei diese Festlegung auch genau so in der default-table stattfinden kann: Innerhalb der Table "Colors" gibt es eine Reihe von Tabels, die die Farben in Kategorien unterteilen. Beinhaltet die Table Colors direkt die Farben, werden sie automatisch der Standart-Kategorie hinzugefügt. Innerhalb der Kategorien werden dann die Farben als ["Farbenname"]="|cff[Hexadezimaler Farbcode]" festgelegt. Alle auf diese Weise regestrierten Farben lassen sich mit der Funktion GroupInvite_Do("api","GetColors","Farbenname") erhalten, und können ingame von dem Spieler geändert werden. Die Slash-Befehle sind in der Table Cmds festgelegt, wobei der Bezeichner einer Table oder Funktion dem entsprechenden Befehlsteil, mit leerzeichen getrennt von den Vorrausgehenden, wiederspiegelt. Beginnt der Bezeichner mit "<" und endet mit ">" bedeutet dies, dass es eine Variable ist, die der Benutzer frei wählen kann. Der Wert dieser Variable wird als der x-te Wert an den letztlichen Befehl weitergegeben, wobei x die anzahl an vorrausgehenden Variablen plus der jetzigen entspricht. Würde also in der Table Cmds die table "test" sein, in dieser die table "" und in dieser die funktionen mytest(n) und xxx(n), wären die Slash-Befehle, um diese Funktionen auszuführen: /gic test [hier ein beliebiger Wert] mytest bzw /gic test [hier ein beliebiger Wert] xxx Die Groß- und Kleinschreibung ist hierbei irrelevant. Was immer der Benutzer statt dem "[hier ein beliebiger Wert]" eingibt, wird als erstes Argument an die jeweilige Funktion gesendet. Gibt es außerdem in einer table eine Funktion mit dem Bezeichner "" entspricht dies dem Slash-Befehl, in dem man nur diese table aufruft. (eine bessere Verdeutlichung ist in der Beispielseite "test", die in GroupInvite enthalten ist. Diese Seite wird nicht geladen und dient nur als Beispiel für Seitenentwickler) Um zusätzliche Sprachen hinzuzufügen, muss es in der Regestrierungs-table die table "AddLanguages" geben, welche eine Reihe weitere tables als numerische Aufzählung beinhaltet. Jeder dieser aufgezählten Tabels beinhaltet dann folgende Werte: Der erste Wert ist der Pfad zu dem Ordner, der die Sprachdateien enthällt (nicht zu einer bestimmten Sprachdatei direkt!). Der zweite Wert ist eine Funktion, die die table, die die Sprachdateien beinhalten, zurückgibt. Der dritte Wert ist optional, sofern er angegeben ist, muss er eine table sein. Diese table beinhaltet die Sprachkürzel(nur zwei Großbuchstaben) aller Sprachen, die enthalten sind (z.B {"EN","DE","ES"} für "englisch","deutsch","spanisch"). Ist eine Sprache angegeben, die GroupInvite nicht standartmäßig unterstützt, wird diese Sprache automatisch zu der Liste auswählbarer Sprachen hinzugefügt. Die Sprachdatei sollte jedoch dann mindestens den Wert "GUI_Language" mit dem Namen der Sprache beinhalten, besser noch eine Komplette Übersetzung des gesammten Addons. Damit die Sprachdateien ordentlich funtionieren, muss mindestens eine englische Sprachdatei vorhanden sein, da in dem Falle, dass ein Wert in der ausgewählten Sprache nicht vorhanden ist, stattdessen der Wert aus der englischen Sprachdatei ausgewählt wird.
Die Regestration selbst verläuft dann über die Funktion page=GroupInvite_Do("api","RegisterPage",add), wobei add die Regestrierungs-table ist. Die Funktion gibt die überarbeitete Seiten-Table zurück, welche neue Werte wie die Seiten-ID beinhaltet, ebenso wie den überarbeiteten Namen der Seite(sollte es bereits eine Seite dieses Namens geben). Die Regestrierungsfunktion wird außerhalb jeder anderen Funktion direkt am Ende der Seite aufgerufen, um die Regestrierung beim Laden der Seite zu ermöglichen.
Der erste Schritt beim erstellen einer Seite ist häufig die Erstellung eines Frames, also des vom Spieler verwendbaren Interfaces. Bei normalen Addons wäre dieser Abschnitt umständlich in XML-Dateien zu regeln, wie bereits oben erwähnt unterstützt die GroupInviteEngine jedoch auch das erstellen eines Interfaces ohne die Verwendung irgendwelcher XML-Dateien. Hierzu werden in erster Linie 3 Funktionen pro Objekt benötigt, welche Name und Art des Objektes festlegen, sowie seine Position, Größe, Beschriftung und Tooltip. Für Typspezifische Einstellungen gibt es dann meist weitere Funktionen, dazu jedoch später mehr Das erstellen eines Frames wäre theoretisch jederzeit möglich, wird jedoch meistens in der OnShowFrame-funktion abgehandelt. Sobald die Seite gewechselt wird, werden alle Objekte, die nicht als "AllwaysShown" oder "OutsideShown" markiert sind, wieder gelöscht, um Speicherplatz für die Objekte der neuen Seite zu machen. Beim Schließen des Einstellungsfensters werden zudem alle "AllwaysShown" objekte gelöscht, weshalb diese meist - durch ein Event gesteuert - bereits beim öffnen des Einstellungsfensters erstellt werden.
Diese Funktion "erstellt" dir das Objekt erstmal, und benennt es nach dem eingegebenen Objektnamen. Dieser Objektname muss innerhalb deiner Seite eindeutig sein, es darf also kein anderes Objekt dieses Namens geben(kann es auch garnicht, da es stets das bereits exestierende stattdessen auswählen würde). GroupInviteEngine unterstützt nur ganz bestimmte Objekttypen, wobei von jedem Objekttyp nur eine bestimmte Anzahl zur Verfügung steht. Ist diese Anzahl aufgebraucht, wird er statt den neuen Objekten immer wieder das zuletzt verwendete nehmen, was zu verwirrenden Fehlern führen kann. Eine komplette Liste aller unterstützten Objekttypen wird in der Entwicklungsseite vorhanden sein, hier sind nur ein paar Beispiele: Button, Editbox, List, EmptyButton,... Ein Button beispielsweise ist ein sehr einfacher Objekttyp, welcher keine zusätzlichen Angaben anbietet oder benötigt. Gleiches trift auch auf den EmptyButton hinzu, wobei letzterer jedoch die Eingeschaft hat, keine eigene Textur zu besitzen. Es ist also ein unsichtbares Druckfeld, das jedoch z.B. Klicks regestrieren oder Tooltips anzeigen kann. Eine Editbox hingegen kann zusätzlich mit einer maximalen Zeichenzahl oder dem Wert "numeric"(also dass du Zahlen eingebbar sind) ausgestattet werden. Diese Eigenschaften sind jedoch komplett optional, das Objekt würde auch ohne die Eigenschaften fehlerfrei arbeiten. Eine List(englisch für Liste) hingegen benötigt zusätzliche Angaben wie die Höhe einer in der Liste befindlichen Zeile, sowie zumindest einer Funktion, die die anzuzeigende Liste ausgibt. Ohne diese Werte kann es evt. zu Fehlern kommen oder die Liste wird nicht ordentlich gefüllt. Soll das Objekt außerdem via Drag&Drop verschiebbar sein, oder auch eine "Andock-Station" für ein solches Objekt darstellen, muss dies ebenfalls in einer zusätzlichen Funktion deklariert werden. Wie bereits angedeutet ist, gibt die Funktion außerdem das Objekt selbst zurück, da dieses in den weiteren Funktionen benötigt wird.
Diese Funktion bestimmt mit width(=Breite) und height(=Höhe) die Größe des Objektes, während anchorPoint, relativeAnchorPoint, relativeAnchor, xOffset und yOffset Werte zur Positionsbestimmung sind. Gibt man als relativeAnchor den Wert nil an, wird die Position übrigens Relativ zu dem Einstellungsfenster berechnet, gibt man hingegen "$parent" an, wird die Position relativ zum Bildschirm bestimmt. Der Wert lineHeight ist ausschließlich für Listen und bestimmt einen Anhaltswert für die Höhe jeder Zeile in der Liste. Die tatsächliche Höhe jeder Zeile wird annährend identisch mit dem Angegebenen Wert sein, jedoch aufgrund der Miteinberechnung des Randes und der Beabsichtigung, die komplette Höhe zu nutzen, kann sie etwas abweichen. Außerdem kann eine Liste nicht mehr als 20 Zeilen - den Listentitel mit eingeschlossen - anzeigen, was ebenfalls in die Berechnung einfließt, sollte die Höhe zu niedrig sein. Es sind auch die Funktionen "SetFrameSize" und "SetFramePossition" vorhanden, bei welchen man nur die entsprechenden Werte eingeben kann. Sollte sich die Position oder Größe eines Objektes verändern, während es angezeigt wird (Sofern dies nicht mit dem Drag&Drop system in verbindung steht), lassen sich alle drei Funktionen jederzeit dazu nutzen, die Werte nach Wunsch anzupassen.
Diese Funktion ist vergleichsweise simpel: Du kannst hiermit die Beschriftung und den Tooltip eines Objektes bestimmen. Sofern die Beschriftung auch während das Objekt angezeigt wird verändert werden könnte, wird zum Bestimmen der Beschriftung bevorzugt die Funktion "OnSetText" genommen. In diesem Fall sollte man bei dem Wert text nil angeben. Gibt man bei dem text oder dem tooltip den Wert true an, werden diese automatisch nach folgendem Algorhythmus erstellt: der text wird lauten: GUI_[Seitenname]_[Objektname], der Tooltip Tooltip_[Seitenname]_[Objektname]_..., ansonsten sind diese entsprechend manuell als String einzugeben. Ist ein String in keiner Sprachdatei zu finden, wird er so ausgegeben wie er eingegeben wurde, ansonsten wird er anhand der Sprachdatei übersetzt. Bei der Angabe des Tooltips sind allerdings die Aufzählungsziffern am ende sowie das "Tooltip_" am Anfang weg zu lassen, diese werden automatisch hinzugefügt. Beim Anzeigen des Tooltips wird das Tooltipobjekt mit der Ziffer 1 als Tooltip-Titel genommen, alle direkt nachfolgenden Ziffern als Inhalt des Tooltips, wobei jede Ziffer einen Zeilenumbruch bedeutet. Als beispiel hätte das Objekt "MeinObjekt" von der Seite "MeineSeite" nach der Angabe beider Werte als true die Beschriftung "GUI_MeineSeite_MeinObjekt" bzw eine übersetzung dieses Textes entsprechend den Sprachdateien, als Tooltip-Titel dann die Übersetzung von Tooltip_MeineSeite_MeinObjekt_1, als fließtext (als Beispiel nehm ich jetzt mal nur 3, die Anzahl ist jedoch beliebig auswählbar) im Tooltip dann die Übersetzungen von Tooltip_MeineSeite_MeinObjekt_2 und Tooltip_MeinSeite_MeinObjekt_3. Die suche nach Tooltip-texten wird abgebrochen, sobald das erste nicht mehr gefunden werden konnte(wie hier z.B. Tooltip_MeineSeite_MeinObjekt_4, welches in unserem beispiel nicht vorhanden ist). Ist der Tooltip-Titel nicht vorhanden, wird folglich garkein Tooltip angezeigt.
The new version of GroupInvite is not ready yet, but it is in work So here are some new changes, which are already done and work fine: (As allways, the full changelog will be available as soon as the version will be released)
New:
Raid Assists can use the AutoInvite functions as well (except some special functions)
A new part in the system allows pages to communicate (compleatly invisible) with other GroupInvite users. It is possible to (de-)activate this function, in the default setting it is deactivated
Guild Leaders which uses GroupInvite can decline, who has the right to use the guild-advertisment, guild-message and guild-auto-invite functions. The guild members don't have the right to use this functions until:
They have activated the communication to other GroupInvite users and...
...get the right to use the functions from the guild-leader or...
...it's impossible to communicate with the guild-leader(for example because he don't use GroupInvite or the communicate-function), although the guild-leader is online
As soon as the guild-member gets the right to use a function, he keep hold of this right until:
The guild-leader changes or...
The guild-member disable the communcation to other GroupInvite users (in this case, he will get the right back as soon as he activates the communication system again)
The guild-leader ban the guild-member from useing this function (the guild-leader is only able to change the rights of guild-members, which are online and use the communication system)
Added system to change the layout of GroupInvite, manually or with already declined layouts(saved in .gil (=GroupInviteLayout)-files)
Fixed:
With the rewrite of the sort-function of lists, sorted lists work faster than before. (even huge lists with more than 200 items work now with the same speed as lists with less then 10)
Added a wait-list-function to the color-picker, which allows you to click on more than one color in the color page to change it without changing the color before(the option to change the next color will then appear as soon as you changed the color before)
The possitions of tooltips(if they touch the screen-border) is now better calculated, so the tooltips are in all cases compleatly visible
More changes will follow, as I said before, this is only the list of already-done changes, there is still much work