Hallo, man kennt es wahrscheinlich... Manche Variablen, die nicht wirklich oft verwendet werden, aber dennoch... Ich sage es mal so: Viele Variablen brauchen
Nehmen wir als Beispiel mal
new abgeschlossen[MAX_VEHICLES];
Das sind 2000 Variablen, die dort benötigt werden, dabei wird in jede nur eine 1 oder eine 0 geschrieben, ist doch ein wenig Verschwendung oder?
new abgeschlossen[67];
Sieht doch schon besser aus, oder?
Dazu dienen 4 Funktionen... bekanntlich ist pawn ja eine 32 Bit Software, damit liegt die Maximale Integerwertgröße bei 2147483647 (und bei -2147483648), warum also den Rest ungebraucht lassen?
Hier sind erstmal du Funktionen, Erklärung und Beispiel steht weiter unten
stock GetMehrfach(var,d) {
new x[30], h[]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912 }, i=29;
for(; i>=0; i--) if(var>=h[i]) { var-=h[i]; x[i]++; }
if(!d) for(i=0; i<30; i++) { if(!x[i]) return i; }
else { for(i=29; i>=0; i--) { if(!x[i]) return i; }}
return -1;
}
stock AddMehrfach(var,a) {
if(a<=29) {
new h[]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912 };
return var+h[a]; }
return var;
}
stock RemoveMehrfach(var,a) {
if(a<=29) {
new h[]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912 };
return var-h[a]; }
return var;
}
stock VonMehrfach(var,a) {
if(a<=29) {
new h[]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912 };
return (var/h[a])%2; }
return -1;
}
Erklärung und Anwendung:
Wir fangen mal an mit AddMehrfach(variable,wert);
Man hat jetzt z.B. wieder seine Autos, die man abschließen möchte, dazu haben wir ja unseren Variable "new abgeschlossen[67];"
Wenn man jetzt die Autoid 0 abschließt könnte man es so machen:
abgeschlossen[0]=AddMehrfach(abgeschlossen[0],0);//erklärung folgt später
//für autoid 1 dementsprechend:
abgeschlossen[0]=AddMehrfach(abgeschlossen[0],1);//bis 29
Es wird der Wert der Variable + der wertigkeit der entsprechenden Position zurückgegeben
Sollte es eine inkorrekte Eingabe sein, wird eine unveränderte Varaible zurückgegeben
Dies alles einzelnd zu machen ist ein wenig umständlich, mehr dazu aber später
RemoveMehrfach(variable,wert);
Ist das gleiche wie AddMehrfach, halt nur umgekehrt
Wenn jetzt ein Auto aufgeschlossen wird, wird der Wert einfach wieder abgezogen
abgeschlossen[0]=RemoveMehrfach(abgeschlossen[0],0);//autoid 0
//für autoid 1 dementsprechend:
abgeschlossen[0]=RemoveMehrfach(abgeschlossen[0],1);//bis 29
Sollte es eine inkorrekte Eingabe sein, wird eine unveränderte Varaible zurückgegeben
VonMehrfach(variable,position);
Mit dieser Funktion lässt sich überprüfen, ob in einer Variable an n-ter Stelle (0<=n<=29)
Beispiel:
new a=VonMehrfach(abgeschlossen[0],0);//wenn der wert aus position 1 eine 1 ist, wird eine 1 zurückgegeben, sonst eine 0
Was für unser Beispiel jetzt heißt: Ist a eine 1, ist das Auto abgeschlossen
Sollte es eine inkorrekte Eingabe sein, wird eine -1 zurückgegeben
Dann gibt es noch die Funktion GetMehrfach(variable,kleingroß);
Dies überprüft halt, an welcher Position die erste 0 steht (von vorne oder hinten) und gibt die Position zurück
Wir haben jetzt z.b.:
abgeschlossen[0]=AddMehrfach(abgeschlossen[0],0);//position 0
abgeschlossen[0]=AddMehrfach(abgeschlossen[0],1);//position 1
abgeschlossen[0]=AddMehrfach(abgeschlossen[0],2);//position 2
So wäre ja an Position 3 unsere nächste 0, daher:
new a=GetMehrfach(abgeschlossen[0],0);
Die 0 als zweiter Parameter bestimmt, ob der kleinste oder größte Wert zurückgegeben werden soll, bei einer 0 wird der kleinste Wert zurückgegeben, was in diesem Falle eine 3 wäre, bei etwas anderem als einer 0 der größte, was in diesem Falle die 29 wäre
Bei Inkorrekter Eingabe wird auch hier eine -1 zurückgegeben
Zur Anwendung:
Dies andauernd mit abgeschlossen[0] und so ist ja sehr umständlich, daher kann mans auch errechnen lassen:
new a=vehicleid/30;
abgeschlossen[a]=AddMehrfach(abgeschlossen[a],vehicleid%30);
Wir haben als Beispiel die vehicleid 199...
199/30=6
199%30=19
Man rechnet zusammen: 6*30+19=199, stimmt also
Nun ein Anwendungsbeispiel beim abschließen von Türen bei Autos:
//ganz nach oben:
new abgeschlossen[67];
//OnPlayerCommandText:
if(strcmp(cmdtext,"/abschließen",true)==0) {
if(IsPlayerInAnyVehicle(playerid)) {
new aid=GetPlayerVehicleID(playerid), a=aid/30, b=aid%30;
if(!VonMehrfach(abgeschlossen[a],b)) {
abgeschlossen[a]=AddMehrfach(abgeschlossen[a],b);
//jetzt ist es halt abgeschlossen
}}
return 1;
}
if(strcmp(cmdtext,"/aufschließen",true)==0) {
if(IsPlayerInAnyVehicle(playerid)) {
new aid=GetPlayerVehicleID(playerid), a=aid/30, b=aid%30;
if(VonMehrfach(abgeschlossen[a],b)==1) {
abgeschlossen[a]=RemoveMehrfach(abgeschlossen[a],b);
//jetzt ist es halt aufgeschlossen
}}
return 1;
}
//OnPlayerEnterVehicle:
if(VonMehrfach(abgeschlossen[vehicleid/30],vehicleid%30)==1) {
SendClientMessage(playerid,FARBE,"Die Türen dieses Fahrzeuges sind abgeschlossen");
TogglePlayerControllable(playerid,0);
TogglePlayerControllable(playerid,1);
return 0;
}
Ich weiß genau, dass ich hier jetzt noch was schreiben wollte, habs aber im Laufe der Zeit vergessen^^
Editier ich, wenns mir wieder einfällt... soferns mir wieder einfällt^^