Resourcen gegen CPU Leistung tauschen (keine Passenderere Überschrift eingefallen)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
    Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

    • Resourcen gegen CPU Leistung tauschen (keine Passenderere Überschrift eingefallen)

      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

      PAWN-Quellcode

      1. 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?

      PAWN-Quellcode

      1. 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

      PAWN-Quellcode

      1. stock GetMehrfach(var,d) {
      2. 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;
      3. for(; i>=0; i--) if(var>=h[i]) { var-=h[i]; x[i]++; }
      4. if(!d) for(i=0; i<30; i++) { if(!x[i]) return i; }
      5. else { for(i=29; i>=0; i--) { if(!x[i]) return i; }}
      6. return -1;
      7. }
      8. stock AddMehrfach(var,a) {
      9. if(a<=29) {
      10. 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 };
      11. return var+h[a]; }
      12. return var;
      13. }
      14. stock RemoveMehrfach(var,a) {
      15. if(a<=29) {
      16. 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 };
      17. return var-h[a]; }
      18. return var;
      19. }
      20. stock VonMehrfach(var,a) {
      21. if(a<=29) {
      22. 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 };
      23. return (var/h[a])%2; }
      24. return -1;
      25. }
      Alles anzeigen

      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:

      PAWN-Quellcode

      1. abgeschlossen[0]=AddMehrfach(abgeschlossen[0],0);//erklärung folgt später
      2. //für autoid 1 dementsprechend:
      3. 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

      PAWN-Quellcode

      1. abgeschlossen[0]=RemoveMehrfach(abgeschlossen[0],0);//autoid 0
      2. //für autoid 1 dementsprechend:
      3. 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:

      PAWN-Quellcode

      1. 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.:

      PAWN-Quellcode

      1. abgeschlossen[0]=AddMehrfach(abgeschlossen[0],0);//position 0
      2. abgeschlossen[0]=AddMehrfach(abgeschlossen[0],1);//position 1
      3. abgeschlossen[0]=AddMehrfach(abgeschlossen[0],2);//position 2

      So wäre ja an Position 3 unsere nächste 0, daher:

      PAWN-Quellcode

      1. 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:

      PAWN-Quellcode

      1. new a=vehicleid/30;
      2. 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:

      PAWN-Quellcode

      1. //ganz nach oben:
      2. new abgeschlossen[67];
      3. //OnPlayerCommandText:
      4. if(strcmp(cmdtext,"/abschließen",true)==0) {
      5. if(IsPlayerInAnyVehicle(playerid)) {
      6. new aid=GetPlayerVehicleID(playerid), a=aid/30, b=aid%30;
      7. if(!VonMehrfach(abgeschlossen[a],b)) {
      8. abgeschlossen[a]=AddMehrfach(abgeschlossen[a],b);
      9. //jetzt ist es halt abgeschlossen
      10. }}
      11. return 1;
      12. }
      13. if(strcmp(cmdtext,"/aufschließen",true)==0) {
      14. if(IsPlayerInAnyVehicle(playerid)) {
      15. new aid=GetPlayerVehicleID(playerid), a=aid/30, b=aid%30;
      16. if(VonMehrfach(abgeschlossen[a],b)==1) {
      17. abgeschlossen[a]=RemoveMehrfach(abgeschlossen[a],b);
      18. //jetzt ist es halt aufgeschlossen
      19. }}
      20. return 1;
      21. }
      22. //OnPlayerEnterVehicle:
      23. if(VonMehrfach(abgeschlossen[vehicleid/30],vehicleid%30)==1) {
      24. SendClientMessage(playerid,FARBE,"Die Türen dieses Fahrzeuges sind abgeschlossen");
      25. TogglePlayerControllable(playerid,0);
      26. TogglePlayerControllable(playerid,1);
      27. return 0;
      28. }
      Alles anzeigen


      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^^
    • Sieht ganz Nett aus aber sowas

      PAWN-Quellcode

      1. if(!VonMehrfach(abgeschlossen[a],b)){
      2. }


      kann man auch abkürzen mit einer Direkten Anweisung den Code zu beenden sprich eine Rückgabe, oder sowas

      PAWN-Quellcode

      1. if(a<=29) {
      2. new h[]= {...};
      3. return var-h[a]; }
      4. return var;


      zu

      PAWN-Quellcode

      1. return (a<=29) ? (var-h[a]) : (var);
      Mfg. BlackFoX_UD_ alias [BFX]Explosion

    • PAWN-Quellcode

      1. return (a<=29) ? (var-h[a]) : (var);


      bringt es in dem Fall nicht wirklich weil du innerhalb Triadischer Operatoren nicht mit der
      Zuweisung Bitwerten arbeiten kannst.

      PAWN-Quellcode

      1. new h[]= {...};


      Soweit ich weiß (~bin mir nicht sicher habs nicht getestet) kann man erst gar nicht erst mit Triadischen Op.
      und Tabellen arbeiten.

      PAWN-Quellcode

      1. new h[] = (a<=29) ? ({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}) : ("\0");

      Mta Script Editor - Work in Progress

    • Hab ich doch tatsächlich vergessen Gestern hier noch zu posten.

      PAWN-Quellcode

      1. enum (<<= 1)
      2. {
      3. PLAYER_FLAG_GOD = 1,
      4. PLAYER_FLAG_VIP, // 2
      5. PLAYER_FLAG_MUTE, // 4
      6. PLAYER_FLAG_INVISIBLE, // 8
      7. PLAYER_FLAG_SPECTATED, // 16
      8. PLAYER_FLAG_SPEEDO, // ...
      9. PLAYER_FLAG_LOGGEDIN,
      10. PLAYER_FLAG_LOGINCHECK,
      11. PLAYER_FLAG_JAIL,
      12. PLAYER_FLAG_REGISTERMSG,
      13. PLAYER_FLAG_VTEXT,
      14. PLAYER_FLAG_DRAWAVAILABLE,
      15. PLAYER_FLAG_FREEZE,
      16. PLAYER_FLAG_LOGINPANEL
      17. };
      18. // defined um es einfacher zu gestalten :-O
      19. #define IsPlayerFlag(%0,%1) \
      20. (PlayerInfo[%0][ibFlag] & (%1) )
      21. #define AddPlayerFlag(%0,%1) \
      22. (PlayerInfo[%0][ibFlag] |= %1 )
      23. #define DeletePlayerFlag(%0,%1) \
      24. (PlayerInfo[%0][ibFlag] &= ~%1 )
      25. #define ResetPlayerFlag(%0) \
      26. (PlayerInfo[%0][ibFlag] = 0)
      27. // AddPlayerFlag(playerid,PLAYER_FLAG_MUTE); bsp
      Alles anzeigen


      Sowas kann man bei vielen Sachen benutzen.
      Ein gutes Beispiel wäre wohl ein Führerschein in einem Reallife-Script.
      Anstatt sowas zu benutzten:

      PAWN-Quellcode

      1. bool:HATAUTOFUEHRERSCHEIN[MAX_PLAYERS];
      2. bool:HATMOTORRADFUEHRERSCHEIN[MAX_PLAYERS];
      3. ...

      Kann man es anders regeln wie oben gezeigt.

      PAWN-Quellcode

      1. enum (<<= 1)
      2. {
      3. LAPPEN_AUTO = 1,
      4. LAPPEN_MOTORRAD,
      5. LAPPEN_BOOT,
      6. LAPPEN_FLUGZEUG
      7. };
      8. new ibFuehrerschein[MAX_PLAYERS];

      Man müsste dann nur Abfragen ob das Bit gesetzt ist für einen bestimmten Führerschein.

      PAWN-Quellcode

      1. if(ibFuehrerscehin[playerid] & LAPPEN_AUTO) { }

      Spart einiges an Arbeit.Hab es selber auch so gemacht in einem angefangen Reallife-Script X/ .

      Passt zwar nicht ganz hier in den Thread aber was solls :-O