Also ich habe mir den Sourcecode nur flüchtig angeschaut, insbesondere die playerinfo-Aufrufe, da das Error 3 Problem besteht. Ich habe also nicht den Quellcode verinnerlicht.
Sicherlich sind switch/case-Statements quellcodetechnisch übersichtlicher und damit leicht durchschaubar. Sie sind also langen if/else-Statements vorzuziehen.
Der Code von Impressive V5.3 kann sicherlich noch an den Stellen optimiert werden, an denen augenscheinlich immer dasselbe getan wird, aber dies mit langen if/else- und switch/case-Statements programmiert wurde. Dazu kann man in der Funktion admin_impressive Arrays benutzen, die dann mit Schleifen durchlaufen werden.
Z.B. case 0:
Man deklariert:
Code:
new CommandNameArray[]={"displaykill", "displayscore", ...};
new VaultDataArray[]={"IMP_DISPLAY_KILL", "IMP_DISPLAY_SCORE", ...};
new TextArray[]={"Die Anzeige der Kills und Headshots wurde auf %s gesetzt.", "Die TeamScore- und Bester-Spieler-Anzeige wurde auf %s gesetzt.", ...};
Dann steht im case 0-Zweig nur noch folgendes:
Code:
for(i=0; i<MaxVomCommandNameArray;i++)
{
if(!strcasecmp(Commandname,CommandNameArray[i]))
{
set_vaultdata(VaultDataArray[i],CommandParam);
if(i==2) // bei killtime Sonderbehandlung, sollten weitere Fälle auftreten -> switch/case Statement
{
iCommandParam = strtonum(CommandParam);
killtime = iCommandParam;
}
snprintf(Text,MAX_TEXT_LENGTH,TextArray[i],CommandParam);
break;
}
}
Damit entfallen die elseif-Konstrukte. Dasselbe kann auch für case 1 bist case 14 angewendet werden, auch hier sind ständig dieselben Funktionen:
Code:
new ImpSoundArray[ALL_SOUNDS][MAX_TEXT_LENGTH];
switch(iNumber)
{
case 0:
{
// siehe oben
}
default:
{
set_vaultdata(VaulDataArray[Offset+iNumber],Commandname);
snprintf(Text,MAX_TEXT_LENGTH,TextArray[Offset+iNumber],Commandname);
strcpy(ImpSoundArray[iNumber-1],Commandname,MAX_TEXT_LENGTH);
}
}
Für default: kann auch stehen case 1: case 2: bis case 14: falls noch andere Fälle reinkommen, die extra behandelt werden sollen.
Bei den Weapon-Funktionen könnte man ähnlich verfahren. Wenn man die ganze Sache schnell machen will, also auf die strcasecmp verzichten will, sollte man Bytevergleiche nutzen. Dazu muss man jedoch die Waffennamen analysieren, einfacher zu programmieren ist natürlich die strcasecmp-Variante. Ich stelle mir eine schnelle Identifizierung etwa so vor:
Code:
switch(Weapon[0])
{
case 's':
{
switch(Weapon[4])
{
case '2':
{
// sg552
}
case 't':
{
// scout
}
case '0':
{
// sg550
}
}
}
....
}
Diese Methode ist sicherlich kein Allheilrezept und vor allem nicht schnell überschaubar, aber auf jeden Fall sehr schnell in der Erkennung. Es ist auch fraglich ob diese Methode in allen Fällen anwendbar ist, aber soweit ich das überschaut habe, ist sie in diesem Fall eine Möglichkeit, die man beachten sollte...
Die Auflösung der elseif-Statements in switch/case kann dann auch in den folgenden Funktionen wie imp_UTSounds, imp_killstreak und im_resetscore erfolgen.
Disclaimer: Es handelt sich bei dem geschriebenen um meine persönliche Meinung. Niemand ist verpflichtet, diese Techniken anzuwenden. Sie dienen lediglich als Anregung. Der Code wurde nicht auf Funktionsfähigkeit überprüft.