2.1 Dialog zum schließen des Zolles
switch(dialogid){
case DIALOG_CLOSE_ZOLL:{
if(response){
new i;
for(; i < MAX_ZOLLGATES; ++i){
if(listitem == i){
ZollClickID{playerid} = i;
SetPlayerMapIcon(playerid, i, ZollInfo[i][zCX],ZollInfo[i][zCY],ZollInfo[i][zCZ], 47, 0, MAPICON_GLOBAL );
return
ShowPlayerDialog(playerid,DIALOG_CHANGESTATE_ZOLL,DIALOG_STYLE_INPUT,"Zollsystem",
"Gebe hier 1 für schließen und 0 für dne Status offen ein", "Login",
"Cancel");
}
}
}
}
case DIALOG_CHANGESTATE_ZOLL:{
if(response){
if(sscanf(inputtext,"l",ZollInfo[ZollClickID{playerid}][zState]))return
ShowPlayerDialog(playerid,DIALOG_CHANGESTATE_ZOLL,DIALOG_STYLE_INPUT,"Zollsystem",
"Gebe hier 1 für schließen und 0 für dne Status offen ein", "Login",
"Cancel");
ZollDialogText();
RemovePlayerMapIcon(playerid,ZollClickID{playerid});
ShowPlayerDialog(playerid,DIALOG_CLOSE_ZOLL,DIALOG_STYLE_LIST,"Zollverwaltung",ZOLLCSTRING,"Auswählen","Schließen");
}else{
RemovePlayerMapIcon(playerid,ZollClickID{playerid});
return ShowPlayerDialog(playerid,DIALOG_CLOSE_ZOLL,DIALOG_STYLE_LIST,"Zollverwaltung",ZOLLCSTRING,"Auswählen","Schließen");
}
}
}
Alles anzeigen
Ich benutz meist für die Dialogids case und für die listitems if-Statements
das ist jedem dennoch selbst überlassen es schenkt sich im großen und
ganzen sag ich mal nix es sind nur kleine unterschied und zwar das
else if abfragen schneller sind als die Verwendung von switch. Jedoch
wenn man die möglichkeit hat Ternäre Operatoren zu verwenden was eine vereinfachung von
ist und sind zu dem noch schneller da er keine Anweisung durchführen muss, sondern nur
Werte zurück gibt. Was man hier nun noch beachten sollte ist das man
bei der Verwendung von mehreren if-Abfragen ein else if benutzt da dies
schneller ist als ständig neue if abfragen aufzurufen da die
hinzugefügten else if zur if abfrage dazu gehören
der code geht
solange weiter bis eines davon richtig ist. Daher kann man einer if
Bedingung unendlich viele else if Bedingung anhängen jedoch nur eine
"else".
Nun ruf ich danach eine for-schleife und lass auch danasch die richtige Zahl in einer variabel Temporär speichern unter
ZollClickID[MAX_PLAYERS char];
Das char reduziert den Memory Verbrauch (RAM) vom Skript von normale 2000
bytes auf 500 der einzigste nachteil ist nun das nur Zahlen von 0 bis
255 gespeichert werden. Das bedeutet das eine Zelle nur 8 Bits fast.
Dies genügt um ein Zeichen zu Speichern oder eine Zahl. Mann kan
dies auch noch tun in dem man den deklarierten variabeln gleich noch
ihren Datentyp zuweisst.Jeder normale deklarierte Integer wird als langer
Integerwert gehandelt und verbraucht 4 bytes durch new int:....; werden
nur 2 bytes verbraucht jedoch können nur Werte von -32 768 .. 32 767 gespeichert werden.
Die for-schleife geht nun von 0 - MAX_ZOLLGATES besser gesagt bis 1 sollte
nun das gedrückte listitem der Zahl entsprechen so wird die Schleife abgebrochen.
Die jeweilige deklarierten Variabeln-Array wird der jeweiligen Wert
zurgeordnet und ein Icon wird auf der map angezeigt. Dies ist hier nur als kleines
zusätzliches
Feature drinne das man ungefähr weiß wo dies liegt und um die Schleife
abzubrechen rufe ich per return gleich den Dialog auf.
Dort kann man nun den jeweiligen wert eingeben den man will daher benutze
ich auch sscanf um die eingabe zu überprufen nun kann man true , false ,
1 , 0 eingeben dies dient zum verändern des Status der Zollschranke, ob diese dann zu oder offen ist.
Jedoch kann man auch andere Werte eingeben, jedoch kann man die Zollschranke nur noch mit 0 oder false entsperren.
Nun wird noch eine stock-function aufgerufen um nochmal den string zu formatieren.
stock ZollDialogText()
{
strdel(ZOLLCSTRING,0,sizeof(ZOLLCSTRING));
new i;
for(; i < MAX_ZOLLGATES;
++i)format(ZOLLCSTRING,sizeof(ZOLLCSTRING),"%s{FFFFFF}Zoll %d |
%s\n",ZOLLCSTRING,i,((ZollInfo[i][zState])?("{FF0000}geschlossen"):("{00FF00}offen")));
}
hier
wird der string gecleart damit keine unerwünschte Inhalte im String
enthalten sind und mit format demenstprechend formatiert hier wird noch
ein Operator verwendet
der Ternäre Operator mit Farbcode er vereinfacht das typische
ist
jedoch weit aus schneller und sehr praktisch der erste ist der true
wert nach dem ? der zweite der false wert , eine erklärung dazu ist ja
schon oben erfolgt,
wie das posten des Codes.
Ich hoffe das Tutorial war ausführlich genug erklärt.
Sollte es Probleme geben könnt ihr dies gerne posten
Mit freundlichen Grüßen IPrototypeI
Edits:
Dieser Teil ist ebenso von IPrototypeI