Heute am 09.06.2009 2.09 PM P.S.T hat Blizzard wichtige Informationen über den schon lange angekündigten Patch 1.23b/1.24 preisgegeben, welcher sich maßgeblich auf die Warcraft 3 Modding Szene auswirken wird - und demnach auch ihr Flaggschiff DotA. Die momentane open Beta dieses Patches läuft auf dem Server 'Westfall (ClassicBeta)', welcher unter dan ganz normalen Servern im BNet gefunden werden kann.
Auf Grund der Tatsache, dass diese Änderungen nicht jedermann verständlich sein werden, da fortgeschrittene Kenntnisse mit dem Editor und der Scriptsprache JASS benötigt werden, versuche ich diese in einem F.A.Q. möglichst verständlich zu beantworten.
[Quelle]
Q1: Schwer zu verstehen? Sag uns doch erstmal um welche Änderungen es sich denn in dem Patch handeln wird
A1: Der nächste Patch wird einige grundlegende Änderungen an der Spiel-Engine vornehmen.
Wie den meisten von euch bekannt ist, hatte Blizzard in letzter Zeit vermehrt mit Problemen zu kämpfen, in denen Spieler Schad- und Femdcode in die Map einschleußten (Warcraft Virus) oder Ungenauigkeiten beim Abgleich von Maps ausnutzten um sich mit einer modifizierten Kartenvesion in Spiele einzuloggen (Collided Maps). Diese Probleme hatten mehr oder weniger etwas mit einem, unter dem Namen 'Return-Bug' bekannten Compiling-Glitch der WC3-Scriptsprache JASS zu tun - der in der nächsten Version nun beseitigt werden soll.
Q2: Also wird eigentlich nur ein weiterer Bug gefixt? Für mich klingt das nach etwas gutem und überfälligem.
A2: Ja, normalerweise freut man sich immer über überfällige Bugfixes, aber nicht so bei diesem. Der Return-Bug ist seit Anbegin der Warcraft-Zeit ein essentieller Bestandteil in der Modding und Scripting-Szene von WC3. Hier ein Versuch euch die rolle dieses Bugs nahezubringen:
Die Scriptsprache JASS ist zu 100% funktionsbasiert. Funktionen kennt ihr alle aus dem Mathematik Unterricht. Das sind diese lustigen Gleichungen in denen ihr einen (oder mehrere) Wert(e) einsetzten könnt und zu diesem Wert dann ein spezifisches Ergebnis ermittelt wird.
Die Funktionen in JASS verhalten sich ganz ähnlich, auch wenn sie nicht prinzipiell nur auf Zahlen beruhen müssen.
Das hier ist beispielsweise die funktion in der der Return-Bug ausgenutzt wird.
Dieses kleine Script mag euch vielleicht verwirrend vorkommen, allerdings ist es recht simpel. Die Funtion mit dem Namen 'H2I', was für 'Handle To Integer' steht, hat als Eingabewert einen Wert vom Typ 'Handle' und einen Ausgabewert vom Typ 'Integer'. Während 'Handle' die Gesamtheit aller komplexen Objekte-Daten in JASS beschreibt, ist 'Integer' ein simpler Ganzzahlen-Wert. Die beiden 'return'-Befehle innerhalb des Funktionsfeldes geben sowohl Zeitpunkt als auch Wert der Rückgabe an. Wenn die function den return-Befehl durchführt endet die function aprupt. Kein weiter Befehl aus der Befehlskette wird weiter ausgeführt. Lediglich der Wert der hinter 'return' steht wird nun als Endergebnis der Funktion zurückgegeben. Der typ des zurückgegebenen Wertes muss immer mit dem im Funktionskopf festgelegtem Datentyp (hier 'returns integer') übereinstimmen.
Und hier kommen wir zum entscheidendem Punkt. Es ist eine Lüge. Der Wertetyp muss nicht immer übereinstimmen. Der WC3 Compiler überprüft nämlich lediglich den letzten in der Funktion stehenden return-Befehl und dieser ist in unserem Fall ja 'return 0', also gäbe er den Wert 0 (ein Ganzzahlen-Wert) zurück, was den Compiler zufrieden stelle. Dass darüber ein return versucht, einen völlig unpassenden Datentyp zurückzugeben ignoriert er.
Wenn wir die Funktion nun ausführen wird der erste return-Befehl, welcher den Handle-Wert zurückgibt zuerst ausgeführt, da Funktionen immer von oben nach unten ablaufen. Da nach einem return-Befehl die Funktion endet, wird der 'echte' return-Befehl mit dem Wert 0 komplett ignoriert - und dient demnacht tatsächlich nur dazu um den Compiler auszutricksen.
Aber was macht die Funktion denn nun, wenn sie ein komplexes Objekt, bestehend aus vielen simplen Daten hat aber einen Integer zurückgeben soll? Ganz einfach: sie schnappt sich den nächst-gelegenen Integer-Wert innerhalb der komplexen Struktur, und wie es der Zufall will ist das im Fall von Warcraft 3 ganz einfach die Objekt ID. Die Hundemarke - in Form einer individuellen Ganzzahl für jedes beliebige Objekt.
Das tolle ist, dass sich von diesem Zahlenwert, also der 'Hundemarke' mit Hilfe des Return-Bugs ganz einfach wieder auf das gewünschte Objekt schließen lässt.
Nun, dass allein ist noch nicht wirklich sinnvoll, gäbe es da nicht das so genannte 'Gamecache'. Das ist eine Art textbasierte Hashtabelle - also eine 2 demensionale Tabelle in der Spalte und Zeile nicht durch Zahlen sondern durch Namen definiert sind und in der man nicht komplexe Daten wie strings, reals und integers speichern kann. Und da wir dank des Return-Bugs nun quasi alle komplexen Objekte in nicht-komplexe 'umwandeln' können und wir zu allem überfluss wie Hundemarken der Objekte auch noch als Namen für Zeile und Spalte in der Tabelle definieren können.
Das alles ermöglicht es uns, jedes Objekt auf beliebig viele andere verweisen zu lassen, diese von dem Objekt aus abrufen zu lassen und umgekehrt. Man kann quasi seine Globalen Variablen flexibel erstellen und auch nich an andere Objekte binden was uns ein unheimlich flexibles System ermöglicht, ohne dass Multiplayer-fähige Spells wie in DotA garnicht möglich wären.
Q3: Ich habe hoffentlich alles mehr oder weniger verstanden und habe nun Angst vor den Konsequenzen, die dieser Bug-Fix für DotA haben könnte. Ist DotA überhaupt noch spielbar ohne den Return-Bug?
A3: Die Antwort ist sowohl nein als auch ja. Es wird euch nicht allzusehr erfruen zu hören, dass das nein erstmal überwiegen wird. Sobald der Return-Bug behoben wird, werden keine der, unter IceFrog entwickelten DotA Maps - inklusive der Version 6.60, mehr spielbar sein.
Die gute Nachricht ist, dass Blizzard ein Ersatzsystem für den Verlust des Return-Bugs anbietet. Dieses System bietet insgesamt 97 neune JASS natives (Grundfunktionen), darunter eine mit welcher man die ID (also die Hundemarke) von Objekten auslesen kann. Da leider die Verknüpfung mit anderen Objekten über das Gamecache nicht mehr möglich sein wird, da zum Abrufen des Objektes wieder der Return-Bug von nöten ist, liefert Blizzard ein eigens für den Zweck der Objektverknüpfung entwickeltes Hash-Tabellen System mit, welches natives für jeden einzelnen Objekttyp in JASS bietet. Leider ist dieses Tabellensystem nicht mehr textbasiert sondern werden diesmal die Spalten und Zeilen ganz klassisch durch Ganzzahlen definiert. Das mag logisch klingen, nimmt den ursprünglichem System aber leider sämtliche Übersicht.
Anstatt das man Unit_1 unter der Kategorie "RelatedUnit" an Unit_2 heftet muss man jetzt Unit_1 unter der Kategorie 1 an Unit_2 heften. Das erschwert die Sache für die Scripter extrem...
Q4: Omg, das klingt alles schrecklich kompliziert. Kann IceFrog nicht einfach die Entwicklung von DotA auf v1.23 beruhen lassen? Soll die DotA Community doch einfach bei dieser Version bleiben und eben komplett auf alternative Hosting-Platformen zurückgreifen. BNet sux eh voll und so...
A4: Ja, das wäre in der Tat eine Lösung, aber eine dämliche - und genauso sieht das auch IceFrog. Dieser hat angekündigt DotA für den jeweils aktuellen Warcraft Patch zu entwickeln was bedeutet dass ein Umstieg auf 1.24 obligatorisch sein wird.
Q5: Halt warte! Heißt dass ich auf Patch v.1.24 umsteigen werde MUSS?
A5: Ja, zumindest wenn du die aktuelle DotA-Version spielen willst.
Q6: Also muss ich davon ausgehen, in nächster Zeit einigen Aufwand betreiben zu müssen, um wieder DotA spielen zu können?
A6: Nein, das einzige was du machen musst ist Warcraft up to date halten und warten bis IceFrog eine kompatible Version released. Den Mehraufwand haben nur die Entwickler (d.h. IceFrog und viele Andere - mich inbegriffen).
Q7: Ich hatte nie Probleme mit Viren in meiner Map und da Collided Maps seit dem letzten Patch nicht mehr funktionieren, frage ich mich, ob dieses Update denn wirklich nötig ist?
A7: Diese Frage kann ich nur schwer beantworten. Ich weiß nicht wie kritisch dieser Bug genau war, bin aber der Meinung, dass jede noch so kleine Sicherheitslücke geschlossen gehört. Desweiteren wird dies nicht der einzige Fix in dem Patch sein.
Q8: Hmm, ich bin immer noch nicht davon überzeugt. Bringt denn der Bug-Fix neben der besseren Sicherheit auch noch andere Vorteile die vielleicht greifbarer sind?
A8: Definitiv! Sobald die Map auf den neuen Patch abgestimmt ist wird die Community wahrscheinlich begeistert sein. Das text-basierte Gamecache was vom jetztigen System verwendet wird ist nur mit einem Word zu beschrieben: laaaaaaaannnnnngsssssssaaaaaam. Und vielleicht noch unzuverlässig. Auf jeden Fall ist das Gamecache alles andere als optimal. Es mag zwar konfortabel sein, ist aber wie schon gesagt sehr langsam, im Multiplayer Modus schwer zu synchonisieren und recht unausgereift. So werden beispielsweise viele der berüchtigten 'fatal Errors' durch Probleme mit dem Lesen des GameCaches ausgelöst.
Die neuen einfachen HashTables sind schneller, verbrauchen weniger Speicher, sind synchronosations-technisch besser zu handhaben und sollten sowohl die Rechner- als auch die Netztwerkperformance deutlich verbessern.
Ihr seht also, es ist kein Weltuntergang. Ein wenig Fassungslosigkeit und Gemeckere sind vor der Einsicht dennoch erwünscht.
Auf Grund der Tatsache, dass diese Änderungen nicht jedermann verständlich sein werden, da fortgeschrittene Kenntnisse mit dem Editor und der Scriptsprache JASS benötigt werden, versuche ich diese in einem F.A.Q. möglichst verständlich zu beantworten.
[Quelle]
Q1: Schwer zu verstehen? Sag uns doch erstmal um welche Änderungen es sich denn in dem Patch handeln wird
A1: Der nächste Patch wird einige grundlegende Änderungen an der Spiel-Engine vornehmen.
Wie den meisten von euch bekannt ist, hatte Blizzard in letzter Zeit vermehrt mit Problemen zu kämpfen, in denen Spieler Schad- und Femdcode in die Map einschleußten (Warcraft Virus) oder Ungenauigkeiten beim Abgleich von Maps ausnutzten um sich mit einer modifizierten Kartenvesion in Spiele einzuloggen (Collided Maps). Diese Probleme hatten mehr oder weniger etwas mit einem, unter dem Namen 'Return-Bug' bekannten Compiling-Glitch der WC3-Scriptsprache JASS zu tun - der in der nächsten Version nun beseitigt werden soll.
Q2: Also wird eigentlich nur ein weiterer Bug gefixt? Für mich klingt das nach etwas gutem und überfälligem.
A2: Ja, normalerweise freut man sich immer über überfällige Bugfixes, aber nicht so bei diesem. Der Return-Bug ist seit Anbegin der Warcraft-Zeit ein essentieller Bestandteil in der Modding und Scripting-Szene von WC3. Hier ein Versuch euch die rolle dieses Bugs nahezubringen:
Die Scriptsprache JASS ist zu 100% funktionsbasiert. Funktionen kennt ihr alle aus dem Mathematik Unterricht. Das sind diese lustigen Gleichungen in denen ihr einen (oder mehrere) Wert(e) einsetzten könnt und zu diesem Wert dann ein spezifisches Ergebnis ermittelt wird.
Die Funktionen in JASS verhalten sich ganz ähnlich, auch wenn sie nicht prinzipiell nur auf Zahlen beruhen müssen.
Das hier ist beispielsweise die funktion in der der Return-Bug ausgenutzt wird.
Dieses kleine Script mag euch vielleicht verwirrend vorkommen, allerdings ist es recht simpel. Die Funtion mit dem Namen 'H2I', was für 'Handle To Integer' steht, hat als Eingabewert einen Wert vom Typ 'Handle' und einen Ausgabewert vom Typ 'Integer'. Während 'Handle' die Gesamtheit aller komplexen Objekte-Daten in JASS beschreibt, ist 'Integer' ein simpler Ganzzahlen-Wert. Die beiden 'return'-Befehle innerhalb des Funktionsfeldes geben sowohl Zeitpunkt als auch Wert der Rückgabe an. Wenn die function den return-Befehl durchführt endet die function aprupt. Kein weiter Befehl aus der Befehlskette wird weiter ausgeführt. Lediglich der Wert der hinter 'return' steht wird nun als Endergebnis der Funktion zurückgegeben. Der typ des zurückgegebenen Wertes muss immer mit dem im Funktionskopf festgelegtem Datentyp (hier 'returns integer') übereinstimmen.
Und hier kommen wir zum entscheidendem Punkt. Es ist eine Lüge. Der Wertetyp muss nicht immer übereinstimmen. Der WC3 Compiler überprüft nämlich lediglich den letzten in der Funktion stehenden return-Befehl und dieser ist in unserem Fall ja 'return 0', also gäbe er den Wert 0 (ein Ganzzahlen-Wert) zurück, was den Compiler zufrieden stelle. Dass darüber ein return versucht, einen völlig unpassenden Datentyp zurückzugeben ignoriert er.
Wenn wir die Funktion nun ausführen wird der erste return-Befehl, welcher den Handle-Wert zurückgibt zuerst ausgeführt, da Funktionen immer von oben nach unten ablaufen. Da nach einem return-Befehl die Funktion endet, wird der 'echte' return-Befehl mit dem Wert 0 komplett ignoriert - und dient demnacht tatsächlich nur dazu um den Compiler auszutricksen.
Aber was macht die Funktion denn nun, wenn sie ein komplexes Objekt, bestehend aus vielen simplen Daten hat aber einen Integer zurückgeben soll? Ganz einfach: sie schnappt sich den nächst-gelegenen Integer-Wert innerhalb der komplexen Struktur, und wie es der Zufall will ist das im Fall von Warcraft 3 ganz einfach die Objekt ID. Die Hundemarke - in Form einer individuellen Ganzzahl für jedes beliebige Objekt.
Das tolle ist, dass sich von diesem Zahlenwert, also der 'Hundemarke' mit Hilfe des Return-Bugs ganz einfach wieder auf das gewünschte Objekt schließen lässt.
Nun, dass allein ist noch nicht wirklich sinnvoll, gäbe es da nicht das so genannte 'Gamecache'. Das ist eine Art textbasierte Hashtabelle - also eine 2 demensionale Tabelle in der Spalte und Zeile nicht durch Zahlen sondern durch Namen definiert sind und in der man nicht komplexe Daten wie strings, reals und integers speichern kann. Und da wir dank des Return-Bugs nun quasi alle komplexen Objekte in nicht-komplexe 'umwandeln' können und wir zu allem überfluss wie Hundemarken der Objekte auch noch als Namen für Zeile und Spalte in der Tabelle definieren können.
Das alles ermöglicht es uns, jedes Objekt auf beliebig viele andere verweisen zu lassen, diese von dem Objekt aus abrufen zu lassen und umgekehrt. Man kann quasi seine Globalen Variablen flexibel erstellen und auch nich an andere Objekte binden was uns ein unheimlich flexibles System ermöglicht, ohne dass Multiplayer-fähige Spells wie in DotA garnicht möglich wären.
Q3: Ich habe hoffentlich alles mehr oder weniger verstanden und habe nun Angst vor den Konsequenzen, die dieser Bug-Fix für DotA haben könnte. Ist DotA überhaupt noch spielbar ohne den Return-Bug?
A3: Die Antwort ist sowohl nein als auch ja. Es wird euch nicht allzusehr erfruen zu hören, dass das nein erstmal überwiegen wird. Sobald der Return-Bug behoben wird, werden keine der, unter IceFrog entwickelten DotA Maps - inklusive der Version 6.60, mehr spielbar sein.
Die gute Nachricht ist, dass Blizzard ein Ersatzsystem für den Verlust des Return-Bugs anbietet. Dieses System bietet insgesamt 97 neune JASS natives (Grundfunktionen), darunter eine mit welcher man die ID (also die Hundemarke) von Objekten auslesen kann. Da leider die Verknüpfung mit anderen Objekten über das Gamecache nicht mehr möglich sein wird, da zum Abrufen des Objektes wieder der Return-Bug von nöten ist, liefert Blizzard ein eigens für den Zweck der Objektverknüpfung entwickeltes Hash-Tabellen System mit, welches natives für jeden einzelnen Objekttyp in JASS bietet. Leider ist dieses Tabellensystem nicht mehr textbasiert sondern werden diesmal die Spalten und Zeilen ganz klassisch durch Ganzzahlen definiert. Das mag logisch klingen, nimmt den ursprünglichem System aber leider sämtliche Übersicht.
Anstatt das man Unit_1 unter der Kategorie "RelatedUnit" an Unit_2 heftet muss man jetzt Unit_1 unter der Kategorie 1 an Unit_2 heften. Das erschwert die Sache für die Scripter extrem...
Q4: Omg, das klingt alles schrecklich kompliziert. Kann IceFrog nicht einfach die Entwicklung von DotA auf v1.23 beruhen lassen? Soll die DotA Community doch einfach bei dieser Version bleiben und eben komplett auf alternative Hosting-Platformen zurückgreifen. BNet sux eh voll und so...
A4: Ja, das wäre in der Tat eine Lösung, aber eine dämliche - und genauso sieht das auch IceFrog. Dieser hat angekündigt DotA für den jeweils aktuellen Warcraft Patch zu entwickeln was bedeutet dass ein Umstieg auf 1.24 obligatorisch sein wird.
Q5: Halt warte! Heißt dass ich auf Patch v.1.24 umsteigen werde MUSS?
A5: Ja, zumindest wenn du die aktuelle DotA-Version spielen willst.
Q6: Also muss ich davon ausgehen, in nächster Zeit einigen Aufwand betreiben zu müssen, um wieder DotA spielen zu können?
A6: Nein, das einzige was du machen musst ist Warcraft up to date halten und warten bis IceFrog eine kompatible Version released. Den Mehraufwand haben nur die Entwickler (d.h. IceFrog und viele Andere - mich inbegriffen).
Q7: Ich hatte nie Probleme mit Viren in meiner Map und da Collided Maps seit dem letzten Patch nicht mehr funktionieren, frage ich mich, ob dieses Update denn wirklich nötig ist?
A7: Diese Frage kann ich nur schwer beantworten. Ich weiß nicht wie kritisch dieser Bug genau war, bin aber der Meinung, dass jede noch so kleine Sicherheitslücke geschlossen gehört. Desweiteren wird dies nicht der einzige Fix in dem Patch sein.
Q8: Hmm, ich bin immer noch nicht davon überzeugt. Bringt denn der Bug-Fix neben der besseren Sicherheit auch noch andere Vorteile die vielleicht greifbarer sind?
A8: Definitiv! Sobald die Map auf den neuen Patch abgestimmt ist wird die Community wahrscheinlich begeistert sein. Das text-basierte Gamecache was vom jetztigen System verwendet wird ist nur mit einem Word zu beschrieben: laaaaaaaannnnnngsssssssaaaaaam. Und vielleicht noch unzuverlässig. Auf jeden Fall ist das Gamecache alles andere als optimal. Es mag zwar konfortabel sein, ist aber wie schon gesagt sehr langsam, im Multiplayer Modus schwer zu synchonisieren und recht unausgereift. So werden beispielsweise viele der berüchtigten 'fatal Errors' durch Probleme mit dem Lesen des GameCaches ausgelöst.
Die neuen einfachen HashTables sind schneller, verbrauchen weniger Speicher, sind synchronosations-technisch besser zu handhaben und sollten sowohl die Rechner- als auch die Netztwerkperformance deutlich verbessern.
Ihr seht also, es ist kein Weltuntergang. Ein wenig Fassungslosigkeit und Gemeckere sind vor der Einsicht dennoch erwünscht.
Das Wort "Würde" kennen manche Menschen nur noch als Konjunktiv II in dem Satz: "Für Geld würde ich alles machen."