Return-Bug
Aus Mappedia
Inhaltsverzeichnis |
[bearbeiten] Das Ende des Return-Bugs
Der Return-Bug wurde durch Patch 1.24 entfernt, dieser Artikel beschreibt den Return-Bug, wie er in früheren Versionen vorzufinden war.
[bearbeiten] Der Return-Bug
Der Return-Bug besteht darin, dass Warcraft immer nur den letzten Rückgabe-Wert einer Funktion auf den Richtigen Typ überprüft. Deshalb ist es möglich einen falschen Rückgabewert als Ergebnis einer Funktion zu haben. Dies kann im Extremfall zum Absturz von Warcraft führen. Man kann den Return-Bug aber auch nutzen um eigentlich nicht erlaubte Umwandlungsfunktionen zu schreiben. Dafür muss mann wissen, dass fast jeder komplexere Variablentyp in Warcraft eigentlich ein Handle ist. Ein Handle ist wiederum ein einfacher integer, in dem gespeichert wird welche Position ein Objekt (z.B.: eine Einheit) im Speicher hat. Da ein Handle ein Integer ist müsste man es mit folgender Funktion eigentlich umwandeln können:
function handle2integer takes handle h returns integer return h endfunction
Diese Funktion verursacht jedoch einen Kompiler-Fehler, den man aber mit dem returnbug umgehen kann:
function handle2integer takes handle h returns integer return h return 0 endfunction
Um aus einem Integer-Wert wieder einen komplexen Variablentyp zu bekommen dreht man die Funktion einfach um. Beispiel für Variablentyp Unit:
function integer2unit takes integer i returns unit return i return null //hier darf nicht 0 stehen, da eine Einheit nicht 0 sein darf endfunction
[bearbeiten] Anwendung
Man kann diese Umwandlungsfunktionen zum Beispiel benutzen um im Gamecache einen Timer zu speichern (was ohne Return-Bug nicht möglich wäre) :
//speichern: call StoreInteger( udg_my_gamecache, "Timer" , "1", handle2integer( my_timer ) ) //laden: set my_timer = integer2timer( GetStoredInteger( udg_my_gamecache, "Timer" , "1" ) )
Besonders nützlich kann es auch sein eine Unit mit einem Timer zu verknüpfen:
//speichern: call StoreInteger( udg_my_gamecache, "unit_of_timer" , I2S( handle2integer( my_timer )) , handle2integer( my_unit ) ) //laden: set my_unit = integer2unit( udg_my_gamecache, GetStoredInteger("unit_of_timer" , I2S( handle2integer( my_timer ))) )
Damit ist es zum Beispiel möglich eine Unit nach Ablauf eines Timers unverwundbar zu machen.
[bearbeiten] Erklärung :
Mit Hilfe der Return-Bug-Funktion "handle2integer" kommt man an den Integer-Wert eines Handle-Objekts. Diesen Integer kann man mit I2S in einen String umwandeln und diesen dann als Label für den Spiel-Cache benutzen. So kann man eine Einheit mit einem Timer verknüpfen.
In einer anderen Funktion kann man dann, wenn man nur den Timer hat, wieder an die Einheit kommen.

