Return-Bug

Aus Mappedia

Wechseln zu: Navigation, Suche

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.



[bearbeiten] siehe auch

Persönliche Werkzeuge
Besucherstatistiken
kostenlose Statistik
Seit dem 25. Oktober 2006 18:00 Uhr