Freut mich zu sehen, dass es immer wieder Leute gibt die ihr Gesagtes auch darlegen können, Templer gehört da auf jeden Fall dazu! 
Also es muss ein Compilerfehler selbst sein, da er wahrscheinlich vergisst die 2. Variable (Anschaulich an "WaffenLink") nicht umwandelt und an die if-Strukturen (oder andere wie "switch") anpasst. (An der Funktion schon, sonst würde man nicht in einer anderen Funktion es erneut definieren können)
Genau. Deine Testläufe mit dem crashdetect-Plugin untermauern meine vorherige Aussage noch, dass es ein Fehler im Compiler ist. Ich habe diese Testläufe selbst auch nochmal gemacht und kann das bestätigen. Wie genau der Compiler das macht, da geht es mir wie dir, weiß ich nicht, aber das könnte eine Möglichkeit sein. Letztendlich ist es ja auch egal wie er es macht, er macht es falsch und zwar komplett falsch.
Der Fehler bleibt auch innerhalb einer Funktion bzw. eines Callbacks, da man das Multi-dimensionale Array in einer anderen Funktion wieder definieren kann.
Mit 3-dimensionalen Arrays ist es übrigens genau gleich.
Finde die Tatsache mit der Variable "Waffe" lustig, weil wenn man die Deklaration "Waffen" und die Verwendung weglöscht, erkennt der PAWN Compiler es nicht als "already defined" für Waffe.
Nebenbei das "already defined" für die Variable "Waffe" erscheint nur, wenn sie oberhalb vom Array initialisiert wird.
Habe das eben auch nochmal ausprobiert. Es ist tatsächlich so, dass egal was man über einem Multi-dimensionalen Array auf gleicher Ebene (!) definiert hat, der Compiler erkennt es als Error (bereits definiert). Wirklich interessant, denn wenn man es drunter definiert macht es gar nichts aus.
Noch interessanter wird es hier: (ich habe mir mal eben dein Beispiel geborgt)
public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
new test = 5;
if(test == 5)
{
if(test == 5)
{
new Waffe;
new Waffen[10][2];
Waffen[0][1] = 999;
printf("DEBUG %d", Waffen[0][1]);
Waffe = 5;
printf("DEBUG %d", Waffe);
}
}
if(test == 5)
{
new Waffe;
Waffe = 6;
printf("DEBUG %d", Waffe);
}
return 1;
}
=> warning 219: local variable "Waffe" shadows a variable at a preceding level
Es ist jetzt nicht mehr die gleiche Ebene, von der Syntax her passt es immer noch, da es nicht in der gleichen if-Klammer ist, dennoch meint der Compiler es sei schon vorhanden, in diesem Fall aber die Warnung, die normal kommt wenn es in einer tieferen Ebene erneut definiert wird, z.B. so:
new tmp;
if(tmp)
{
new tmp;
}
Hier bekommen wir die Warnung 219.
Im Beispiel oben mit "Waffe" ist es aber anschaulich dargestellt so:
new xy;
if(xy)
{
new tmp;
}
new tmp;
Hier findet der Compiler keinen Fehler (ist ja auch korrekt!), abgesehen von den "is never used", die ich hier mal vernachlässige. Durch die nachfolgende Definition eines multi-dimensionalen Arrays wird es plötzlich als falsch erkannt.
new xy;
if(xy)
{
new tmp;
new array[10][10];
}
new tmp; //219
=> Warnung 219 für tmp.
Irgendwas bringt den Compiler also mächtig durcheinander, wenn man Multi-dimensionale Arrays innerhalb von Funktionen/Callbacks definiert, auch wenn es von der Syntax her kein Problem sein darf.
Durch diese Tests und die Tests von Templer sehe ich es als bewiesen an, dass hier ein Fehler im Compiler ist.
...und zwar kein kleiner!