- Statt den defines für die Dialoge, wäre ein enum besser, da kannst du nämlich oben die erste Zahl ändern, und dann zählt der Compiler automatisch immer eins hoch, das ist dann leichter anzupassen
- dini sollte man nicht nutzen, das ist wirklich Schmutz. Verstehe, dass du kein MySQL nutzen wolltest, da das wieder Konfigurationsaufwand wäre. Dann aber zumindest SQLite wäre eine deuutlich bessere Alternative gewesen.
- Das größte Manko was mir aufgefallen ist, aber da geht es nicht nur die so, sondern sehr sehr vielen Leuten. Man wiederholt Code ohne Ende. Das möchte man als Entwickler eigentlich komplett vermeiden. Beispiel: Zeile 142 und 156 da geht es schon los. Einfach Funktionen machen, die tun nicht weh xD Aber ich sage mal so 80% Code ist redundant. Zeile 435 - 546 und dann von 546-778 kannst du dir komplett schenken
Das sind einfach mal 300 Zeilen Code, die unnötig sind. Und in deinen Befehlen wiederholst du auch sehr oft Routinen, die einfach in eine Funktion auslagern
Das würde den Code deutlich deutlich übersichtlicher machen.
Zu Punkt 3, wie man das realisieren kann:
switch(listitem){
case 0:{//Kick Player
permissionChange[playerid] = 1;
return ShowCurrentAccessLevelDialog(playerid,"KICKPLAYER_USABLE");
}
Da hast du ein ewig langes switch-case.
Wie wäre es aber so, du machst ein konstantes großes Array mit den ganzen Namen, also sowas wie:
//Ganz oben ins Skript
static stock const gUserUsables[][] = {
"KICKPLAYER_USABLE",
"BANPLAYER_USABLE",
"TIMEBANPLAYER_USABLE",
"UNBANPLAYER_USABLE",
//usw..
};
//Und dann anstatt dem switch-case, einfach:
permissionChange[playerid] = listitem+1;
return ShowCurrentAccessLevelDialog(playerid, gUserUsables[listitem]);
Alles anzeigen
Dadurch würdest du dir allein dort 100 Zeilen sparen.
Dann genau das Selbe weiter unten:
switch(permissionChange[playerid]){
case 1:{// Kick Player
if(strval(inputtext) <= 0 || strval(inputtext) > MAX_ADMINLEVEL){
return ShowCurrentAccesLevelDialogE(playerid, "KICKPLAYER_USABLE");
}
permissionChange[playerid] = -1;
UpdateAccessLevel("KICKPLAYER_USABLE", strval(inputtext));
return ShowPermissionDialog(playerid);
}
case 2:{// Ban Player
if(strval(inputtext) <= 0 || strval(inputtext) > MAX_ADMINLEVEL){
return ShowCurrentAccesLevelDialogE(playerid, "BANPLAYER_USABLE");
}
permissionChange[playerid] = -1;
UpdateAccessLevel("BANPLAYER_USABLE", strval(inputtext));
return ShowPermissionDialog(playerid);
}
Alles anzeigen
Da machst du es dir viel zu kompliziert 😅
Kannst dir die 300 Zeilen sparen und einfach:
new tValue = strval(inputtext);
if(tValue <= 0 || tValue > MAX_ADMINLEVEL)
return ShowCurrentAccesLevelDialogE(playerid, gUserUsables[permissionChange[playerid]]);
UpdateAccessLevel(gUserUsables[permissionChange[playerid]], tValue);
permissionChange[playerid] = -1;
return ShowPermissionDialog(playerid);
4. Du machst es dir mit deinem Sprachensystem viel zu schwierig. Hier würde sich auch anbieten einfach ein konstantes Array anbieten und dort schreibst du alle Texte rein und greifst dann nur noch darauf zu. Da sparst du dir maaaassig Zeilen xD Zumal du oft gleich den ganzen Befehl in 2 Sprachen gemacht hast, statt nur den Code, auf den es ankommt 
5. Durch die ganzen Wiederholungen ist dein Code sehr anfällig für Fehler. Also es ist fast unmöglich keine zu machen, da ständig alle Variablen manuell zurückgesetzt werden müssen etc pp. Sowas einfach in Funktionen auslagern.
6. Du nutzt sehr viele globale Variablen. Ruhig, gerade wenn es nur temporär ist paar PVars nutzen.
Für Weitere Infos, kann den YouTube Channel für CleanCode empfehlen: https://www.youtube.com/@10minuteswithcoachjoe55
Gibt da gewisse Regeln generell wie KISS und DRY (https://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself).
Bei deinem nächsten Projekt kannst du versuchen diese mehr zu berücksichtigen! 