Beiträge von Jeffry

    Also so wie es aussieht erstellst du den ersten Checkpoint direkt an der Spawn-Stelle, den Koordinaten eines vorherigen Prints zufolge.
    Poste bitte dein ganzes OnPlayerEnterCheckpoint.

    Theoretisch möglich aber da das praktisch mehr als unwahrscheinlich ist kann man das vernachlässigen.


    Bei 100.000 Nummern ist das nicht zu vernachlässigen, da das relativ schnell voll sein kann. Und selbst bei höheren Zahlen sollte man keine theoretischen Lücken lassen, das macht man einfach nicht.


    Nehmen wir mal an es sind fast alle Nummern belegt, dann freezt der Server solange bis er die richtige Zahl gefunden hat.


    Nein. Daher die security Variable.
    (Edit: Ach fast alle, ja klar, das dauert bei MySQL etwas. Sowas müsste man ohnehin komplett anders lösen.)



    Ich hatte allerdings vergessen, die Nummer bei 99999 wieder auf 10000 zu setzen, das ist jetzt behoben.

    Wenn alle Nummern vergeben sind, was theoretisch möglich ist, hängt sich der Server auf, da er in einer Endlos-Schleife endet.
    Sollte die Sicherheit unter dem Ressourcenverbrauch stehen, ok. Das tut sie aber nicht.

    Das hat aber nichts damit zu tun, dass man es vermeiden sollte, das sind persönliche Präferenzen.
    Klar kann ich es auch so, oder ähnlich, schreiben, allerdings finde ich das nicht so toll, da man eben die Prüfung und die Variable benötigt.

    Spoiler anzeigen
    stock Nummer()
    {
    new Query[128], count, security;
    new nr = random(89999) + 10000;
    new bool:again = true;
    while(again)
    {
    again = false;
    format(Query, sizeof(Query), "SELECT * FROM `User` WHERE `Nummer` = '%d'", nr);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    if(count == 0)
    {
    return Nummer;
    }
    else
    {
    nr++;
    if(nr > 99999)
    {
    if(security == 1) return -1;
    security = 1;
    nr = 10000;
    }
    again = true;
    }
    }
    return -1;
    }


    Ich bevorzuge goto an dieser Stelle, das ist für die meisten auch nachvollziehbarer.

    Der Fall kann nicht vorkommen, da die Queries nacheinander ausgeführt werden, sprich zuerst das UPDATE, dann das SELECT.
    Natürlich muss er, wenn er die Nummer vergeben hat, sofort den Spieler speichern.


    Man könnte die Prüfung allerdings zur Sicherheit einbauen, schaden tut es nicht. Das kann er ja selbst entscheiden.

    Im normalen Bereich (wenn wir davon ausgehen, dass du für einen /clearchat Befehl nicht 10000 SendClientMessages nacheinander in den Code packst, ohne Schleife), spielt das keine merkliche Rolle.
    Genau weiß ich das nicht, da es auch nur schwer zu testen ist, aber generell geht das so schnell, das spielt keine Rolle. Wichtiger ist es, den Code leserlich zu schreiben.

    Du hattest da zwei else's hintereinander.
    Versuche es so:

    Spoiler anzeigen
    public UpdateUhrundDatum()
    {
    new
    string[128],
    Float:x,
    Float:y,
    Float:z,
    fID2,
    gwbonus[MAX_FRAKTIONNEN] = 0,
    gwowndareas[MAX_FRAKTIONNEN] = 0,
    standgebuer = 0,
    counter = 0,
    fraktzins,
    bool:fraktionspayday = false;

    gettime(stunde,minute,sekunde);
    getdate(jahr,monat,tag);
    format(string,sizeof(string),"%02d:%02d",stunde,minute);
    TextDrawSetString(SERVERUHR,string);
    format(string,sizeof(string),"%02d/%02d/%04d",tag,monat,jahr);
    TextDrawSetString(SERVERDATUM,string);
    format(string,sizeof(string),"worldtime %02d:%02d | %i.%i",stunde,minute,tag,monat);
    SendRconCommand(string);
    if(stunde == 0 && minute == 0 && sekunde == 0 || stunde == 2 && minute == 0 && sekunde == 0 || stunde == 4 && minute == 0 && sekunde == 0 ||
    stunde == 6 && minute == 0 && sekunde == 0 || stunde == 8 && minute == 0 && sekunde == 0 || stunde == 10 && minute == 0 && sekunde == 0 ||
    stunde == 12 && minute == 0 && sekunde == 0 || stunde == 14 && minute == 0 && sekunde == 0 || stunde == 16 && minute == 0 && sekunde == 0 ||
    stunde == 18 && minute == 0 && sekunde == 0 || stunde == 20 && minute == 0 && sekunde == 0 || stunde == 22 && minute == 0 && sekunde == 0)
    {
    for(new fID=0;fID<MAX_FRAKTIONNEN;fID++)
    {
    if(fID == 4 || fID == 5 || fID == 7 || fID == 9 || fID == 10 || fID == 12 || fID == 13 || fID == 15 || fID == 17 || fID == 18)
    {
    fraktzins = floatround(fverwaltungen[fID][Geld]/100*0.2);
    for(new gw;gw<sizeof(GangwarZones);gw++)
    {
    if(fID == GangwarZones[gw][War_Owner])
    {
    gwowndareas[fID]++;
    gwbonus[fID] += GangwarZones[gw][War_Zone_Property];
    }
    }
    fverwaltungen[fID][Geld] += fraktzins;
    fverwaltungen[16][Geld] -= fraktzins;
    fverwaltungen[fID][Geld] += gwbonus[fID];
    for(new fv;fv<MAX_FVEHS;fv++)
    {
    if(Fahrzeug[fv][Fraktion] == fID)
    {
    if(vFahrzeug[Fahrzeug[fv][Vehicle]][Abgeschleppt] != 0)
    {
    standgebuer += fsteuern[OamtStandGebuer];
    counter++;
    }
    }
    }
    fID2 = fID;
    fraktionspayday = true;
    }
    }
    }
    if(stunde == 3 && minute == 59 && sekunde == 0)
    {
    SendClientMessageToAll(ROT,"--> Restart Information <--");
    SendClientMessageToAll(GELB,"Der Server startet in einer Minute neu (Daily Restart)");
    return 1;
    }
    if(stunde == 4 && minute == 0 && sekunde == 0)
    {
    ForEachPlayer(i)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i) && GetPVarInt(i,"Eingeloggt") == 1)
    {
    SaveAccount(i);
    }
    }
    Log("System","Der Server wurde neugestartet.");
    OnGameModeSave();
    GameModeExit();
    return 1;
    }
    ForEachPlayer(i)
    {
    if(GetPVarInt(i,"Eingeloggt") == 1)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    if(Spieler[i][pStonedAntiSpam] == 0)
    {
    if(Spieler[i][pInPrison] == 0)
    {
    if(Paintball[i] == 0)
    {
    if(GetPlayerInterior(i) == 0 && GetPlayerVirtualWorld(i) == 0)
    {
    GetPlayerPos(i,x,y,z);
    if((x > -992.5172 && x < 4000.0000) && (y < 528.0000 && y > -4000.0000)) //Los Santos
    {
    if(UseBadWeather[0] == 0)
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    if(monat > 9 || monat < 2)//winterzeit
    {
    if(stunde > 9 || stunde < 18) SetPlayerTime(i,stunde+3,minute);
    if(stunde < 9 || stunde > 18) SetPlayerTime(i,23,59);
    }
    else//sommerzeit
    {
    if(stunde > 6 || stunde < 22) SetPlayerTime(i,stunde,minute);
    if(stunde < 6 || stunde > 22) SetPlayerTime(i,23,59);
    }
    SetPlayerWeather(i,2);
    }
    else
    {
    if(UseBadWeather[0] == 8 || UseBadWeather[0] == 16 || UseBadWeather[0] == 9)
    {
    if(monat > 9 || monat < 2)//winterzeit
    {
    new Float:Pos[3];
    if(Spieler[i][pSnow] == 0) Spieler[i][pHaveSnow] = CreatePlayerObject(i,18864,x,y,z,0.0,0.0,0.0);
    GetPlayerObjectRot(i,Spieler[i][pHaveSnow],Pos[0],Pos[1],Pos[2]);
    MovePlayerObject(i,Spieler[i][pHaveSnow],x,y,z,100.0,Pos[0]+(random(5)),Pos[1]+(random(5)),Pos[2]+(random(5)));
    Spieler[i][pSnow] = 1;
    SetPlayerTime(i,22,59);
    SetPlayerWeather(i,UseBadWeather[0]);
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    SetPlayerTime(i,22,59);
    SetPlayerWeather(i,UseBadWeather[0]);
    }
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    if(monat > 9 || monat < 2)//winterzeit
    {
    if(stunde > 9 || stunde < 18) SetPlayerTime(i,stunde+3,minute);
    if(stunde < 9 || stunde > 18) SetPlayerTime(i,23,59);
    }
    else//sommerzeit
    {
    if(stunde > 6 || stunde < 22) SetPlayerTime(i,stunde,minute);
    if(stunde < 6 || stunde > 22) SetPlayerTime(i,23,59);
    }
    SetPlayerWeather(i,UseBadWeather[0]);
    }
    }
    }
    if((x > -4000.0000 && x < -992.5172) && (y < 4000.0000 && y > -4000.0000)) //San Fierro
    {
    if(UseBadWeather[1] == 0)
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    if(monat > 9 || monat < 2)//winterzeit
    {
    if(stunde > 9 || stunde < 18) SetPlayerTime(i,stunde+3,minute);
    if(stunde < 9 || stunde > 18) SetPlayerTime(i,23,59);
    }
    else//sommerzeit
    {
    if(stunde > 6 || stunde < 22) SetPlayerTime(i,stunde,minute);
    if(stunde < 6 || stunde > 22) SetPlayerTime(i,23,59);
    }
    SetPlayerWeather(i,1);
    }
    else
    {
    if(UseBadWeather[1] == 8 || UseBadWeather[1] == 16 || UseBadWeather[1] == 9)
    {
    if(monat > 9 || monat < 2)//winterzeit
    {
    new Float:Pos[3];
    if(Spieler[i][pSnow] == 0) Spieler[i][pHaveSnow] = CreatePlayerObject(i,18864,x,y,z,0.0,0.0,0.0);
    GetPlayerObjectRot(i,Spieler[i][pHaveSnow],Pos[0],Pos[1],Pos[2]);
    MovePlayerObject(i,Spieler[i][pHaveSnow],x,y,z,100.0,Pos[0]+(random(5)),Pos[1]+(random(5)),Pos[2]+(random(5)));
    Spieler[i][pSnow] = 1;
    SetPlayerTime(i,22,59);
    SetPlayerWeather(i,UseBadWeather[0]);
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    SetPlayerTime(i,22,59);
    SetPlayerWeather(i,UseBadWeather[1]);
    }
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    if(monat > 9 || monat < 2)//winterzeit
    {
    if(stunde > 9 || stunde < 18) SetPlayerTime(i,stunde+3,minute);
    if(stunde < 9 || stunde > 18) SetPlayerTime(i,23,59);
    }
    else//sommerzeit
    {
    if(stunde > 6 || stunde < 22) SetPlayerTime(i,stunde,minute);
    if(stunde < 6 || stunde > 22) SetPlayerTime(i,23,59);
    }
    SetPlayerWeather(i,UseBadWeather[1]);
    }
    }
    }
    if((x > -992.5172 && x < 4000.0000) && (y < 4000.0000 && y > 528.0000)) //Las Venturas
    {
    if(UseBadWeather[2] == 0)
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    if(monat > 9 || monat < 2)//winterzeit
    {
    if(stunde > 9 || stunde < 18) SetPlayerTime(i,stunde+3,minute);
    if(stunde < 9 || stunde > 18) SetPlayerTime(i,23,59);
    }
    else//sommerzeit
    {
    if(stunde > 6 || stunde < 22) SetPlayerTime(i,stunde,minute);
    if(stunde < 6 || stunde > 22) SetPlayerTime(i,23,59);
    }
    SetPlayerWeather(i,2);
    }
    else
    {
    if(UseBadWeather[2] == 8 || UseBadWeather[2] == 16 || UseBadWeather[2] == 9)
    {
    if(monat > 9 || monat < 2)//winterzeit
    {
    new Float:Pos[3];
    if(Spieler[i][pSnow] == 0) Spieler[i][pHaveSnow] = CreatePlayerObject(i,18864,x,y,z,0.0,0.0,0.0);
    GetPlayerObjectRot(i,Spieler[i][pHaveSnow],Pos[0],Pos[1],Pos[2]);
    MovePlayerObject(i,Spieler[i][pHaveSnow],x,y,z,100.0,Pos[0]+(random(5)),Pos[1]+(random(5)),Pos[2]+(random(5)));
    Spieler[i][pSnow] = 1;
    SetPlayerTime(i,22,59);
    SetPlayerWeather(i,UseBadWeather[0]);
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    SetPlayerTime(i,22,59);
    SetPlayerWeather(i,UseBadWeather[2]);
    }
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    if(monat > 9 || monat < 2)//winterzeit
    {
    if(stunde > 9 || stunde < 18) SetPlayerTime(i,stunde+3,minute);
    if(stunde < 9 || stunde > 18) SetPlayerTime(i,23,59);
    }
    else//sommerzeit
    {
    if(stunde > 6 || stunde < 22) SetPlayerTime(i,stunde,minute);
    if(stunde < 6 || stunde > 22) SetPlayerTime(i,23,59);
    }
    SetPlayerWeather(i,UseBadWeather[2]);
    }
    }
    }
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    SetPlayerTime(i,stunde+1,minute+30);
    SetPlayerWeather(i,2);
    }
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    SetPlayerTime(i,stunde+1,minute+30);
    SetPlayerWeather(i,2);
    }
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    SetPlayerTime(i,23,59);
    SetPlayerWeather(i,16);
    }
    }
    else
    {
    if(Spieler[i][pSnow] == 1)
    {
    Spieler[i][pSnow] = 0;
    StopPlayerObject(i,Spieler[i][pHaveSnow]);
    DestroyPlayerObject(i,Spieler[i][pHaveSnow]);
    }
    SetPlayerTime(i,12,00);
    SetPlayerWeather(i,250);
    }
    if(fraktionspayday == true)
    {
    new counterfcars,kfzsteuer;
    if(isPlayerInFrakt(i,fID2))
    {
    for(new fv;fv<MAX_FVEHS;fv++)
    {
    if(Fahrzeug[fv][Fraktion] == Spieler[i][pFraktion])
    {
    counterfcars++;
    }
    }
    SendClientMessage(i,GRUEN,"[_Fraktion's Payday_]");
    format(string,sizeof(string),"Alter Kontostand: %i$",fverwaltungen[fID2][Geld]-floatround(fraktzins)+gwbonus[fID2]);
    SendClientMessage(i,GRUEN,string);
    format(string,sizeof(string),"Zinssatz: 0.2 Zinsen: %i$",fraktzins);
    SendClientMessage(i,GRUEN,string);
    SendClientMessage(i,GRUEN,"Fraktionsbankstand:");
    format(string,sizeof(string),"Opium Pillen: %i | Ganja: %i | Kokain: %i | C4: %i | Materials: %i | Spice: %i",fverwaltungen[fID2][Opium],fverwaltungen[fID2][Ganja],fverwaltungen[fID2][Kokain],fverwaltungen[fID2][C4],fverwaltungen[fID2][Materials],fverwaltungen[fID2][Spice]);
    SendClientMessage(i,GRUEN,string);
    format(string,sizeof(string),"Waffenpack: %i Waffenslots: %i | Healpack: %i Healslots: %i | Armourpack: %i Armourslots: %i",fverwaltungen[fID2][WaffenPack],fverwaltungen[fID2][WaffenSlots],fverwaltungen[fID2][Heal],fverwaltungen[fID2][HealSlots],fverwaltungen[fID2][Armour],fverwaltungen[fID2][ArmourSlots]);
    SendClientMessage(i,GRUEN,string);
    if(counterfcars == 0)
    {
    kfzsteuer = 0;
    }
    else
    {
    kfzsteuer = counterfcars*245;
    fverwaltungen[fID2][Geld] -= kfzsteuer;
    }
    format(string,sizeof(string),"KFZ-Steuern: -%i (%i Fahrzeuge)",kfzsteuer,counterfcars);
    SendClientMessage(i,GRUEN,string);
    if(counter != 0)
    {
    format(string,sizeof(string),"Ordnungsamtstellplatzgebühr: %i$ für %i abgeschleppte Fahrzeuge",standgebuer,counter);
    SendClientMessage(i,GRUEN,string);
    fverwaltungen[fID2][Geld] -= standgebuer;
    fverwaltungen[16][Geld] += standgebuer;
    }
    format(string,sizeof(string),"Gebietsbonus: %i$ für %i Eroberte Gebiete",gwbonus[fID2],gwowndareas[fID2]);
    SendClientMessage(i,GRUEN,string);
    if(fverwaltungen[fID2][Geld] < 800000)
    {
    format(string,sizeof(string),"Neuer Kontostand: %i$",fverwaltungen[fID2][Geld]);
    SendClientMessage(i,GRUEN,string);
    }
    else
    {
    fverwaltungen[fID2][Geld] = 800000;
    format(string,sizeof(string),"Neuer Kontostand: %i$",fverwaltungen[fID2][Geld]);
    SendClientMessage(i,GRUEN,string);
    SendClientMessage(i,GRAU,"Die Fraktionskasse ist voll. Es muss eine größere Fraktionskasse gekauft werden!");
    }
    counterfcars = 0;
    }
    }
    }
    if(BeforeRace[i] == false)
    {
    RaceZeitAfterRace[i] = gettime()-RaceBestzeit[i];
    format(string,sizeof(string),"Zeit: %i:%02d",RaceZeitAfterRace[i]/60,RaceZeitAfterRace[i]%60);
    PlayerTextDrawSetString(i,RACEdraw[i][5],string);
    }
    }
    }
    return 1;
    }

    Problem 2:
    Schreibe den Timer so:
    forward GangfightUpdate();
    public GangfightUpdate()
    {
    new OwnerText[128], GegnerText[128], GZName[128], GZFZeit[128], Af[128], Bf[128], Cf[128], OwnerPoints[128], GegnerPoints[128];
    for(new playerid, = 0; playerid < MAX_PLAYERS; playerid++)
    {
    new set;
    for(new i = 0; i < sizeof Gangzonen; i++)
    {
    //printf("Fraktion %d == GFOwnerID %d || == GFGegnerID %d", Spieler[playerid][Fraktion], Gangzonen[i][GFOwnerID], Gangzonen[i][GFGegnerID]);


    printf("playerid: %d // Fraktion %d == GFOwnerID %d || == GFGegnerID %d", playerid, Spieler[playerid][Fraktion], Gangzonen[i][GFOwnerID], Gangzonen[i][GFGegnerID]);
    if(Gangzonen[i][GFRunningTime] < 0) continue;
    if(Spieler[playerid][Fraktion] == Gangzonen[i][GFOwnerID] || Spieler[playerid][Fraktion] == Gangzonen[i][GFGegnerID])
    {
    printf("i: %d", i);
    if(Gangzonen[i][GFOwnerID] != -1) format(OwnerText,sizeof(OwnerText),"%s",Fraktionen[Gangzonen[i][GFOwnerID]][Frakname]);
    else format(OwnerText,sizeof(OwnerText),"Niemand");
    printf("OwnerText: %s", OwnerText);
    if(Gangzonen[i][GFGegnerID] != -1) format(GegnerText,sizeof(GegnerText),"%s",Fraktionen[Gangzonen[i][GFGegnerID]][Frakname]);
    else format(GegnerText,sizeof(GegnerText),"Niemand");
    printf("GegnerText: %s", GegnerText);
    format(GZName,sizeof(GZName),"~y~%s",Gangzonen[i][GangZoneName]);
    printf("GZName: %s", GZName);
    format(GZFZeit,sizeof(GZFZeit),"~r~Verbl. Zeit %d Minuten",60-Gangzonen[i][GFRunningTime]);
    printf("GZFZeit: %s", GZFZeit);
    format(Af,sizeof(Af),"~b~A: ~w~%s",Fraktionen[Gangzonen[i][GFFlaggenOwnerA]][Frakname]);
    format(Bf,sizeof(Bf),"~b~B: ~w~%s",Fraktionen[Gangzonen[i][GFFlaggenOwnerB]][Frakname]);
    format(Cf,sizeof(Cf),"~b~C: ~w~%s",Fraktionen[Gangzonen[i][GFFlaggenOwnerC]][Frakname]);
    printf("a: %s", Af);
    printf("c: %s", Bf);
    printf("a: %s", Cf);
    format(OwnerPoints, sizeof(OwnerPoints),"%s%d/100",(Gangzonen[i][GFOwnerPoints] < 10) ? ("00") : (""), Gangzonen[i][GFOwnerPoints]);
    format(GegnerPoints, sizeof(GegnerPoints),"%s%d/100",(Gangzonen[i][GFGegnerPoints] < 10) ? ("00") : (""), Gangzonen[i][GFGegnerPoints]);
    printf("OwnerPoints: %s", OwnerPoints);
    printf("GegnerPoints: %s", GegnerPoints);
    UpdateGangfightBox(playerid, OwnerText, GegnerText, GZName, GZFZeit, Af, Bf, Cf, OwnerPoints, GegnerPoints);
    set = 1;
    break;
    }
    }
    if(!set) DestroyGangfightBox(playerid);
    }
    return 1;
    }


    Und starte ihn nur einmal bei OnGameModeInit.
    SetTimer("GangfightUpdate", 331, true);

    Im Befehl:
    PutPlayerInVehicle(playerid, testcar, 1);


    zu:
    PutPlayerInVehicle(playerid, testcar, 1);
    new Float:x, Float:y, Float:z;
    GetVehiclePos(testcar, x, y, z);
    printf("->id: %f/%f/%f %d", testcar, x, y, z, GetVehicleModel(testcar));


    Dann poste was im Log steht, wenn du den Gutschein einlöst und dich danach hinteleportieren willst, mit dem Befehl.

    stock Nummer()
    {
    new Query[128], count, security;
    new nr = random(89999) + 10000;
    Nummer_AGAIN:
    format(Query, sizeof(Query), "SELECT * FROM `User` WHERE `Nummer` = '%d'", nr);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    if(count == 0)
    {
    return Nummer;
    }
    else
    {
    nr++;
    if(nr > 99999)
    {
    if(security == 1) return -1;
    security = 1;
    nr = 10000;
    }
    goto Nummer_AGAIN;
    }
    return -1;
    }

    Das verstehe ich auch nicht, liegt wohl am Stur-Sinn mancher. Weniger zu schreiben ist in diesem Fall eben nicht besser, da ein Array-Zugriff eben langsamer ist.
    Ungeachtet dessen nutze ich trotzdem immer die erste Variante (bezogen auf das x,y,z), da es wesentlich schneller und einfacher zu schreiben ist, man spart sich die eckigen Klammern. Arrays sollte man nur nutzen, wenn sie auch Sinn ergeben. Natürlich geht man jetzt nicht hin und macht 200 Variablen die dann heißen "pSkin1, pSkin2, ..., pSkin200". Das wäre Quatsch. :D


    Grundsätzlich sei aber noch anzumerken, dass die Unterschiede natürlich minimal sind, auch wenn es im Zeitvergleich recht deutlich aussieht, nur wer macht 10 Millionen Aufrufe auf einmal. Rechnest du das um auf sagen wir 100ms pro 10 Millionen aufrufe, dann entspricht das 1 Sekunde pro 100 Millionen Aufrufe, das entspricht einer hundert-millionstel Sekunde pro Aufruf.

    Wenn, dann hat die enum-Variante ebenso minimal mehr Memoryverbrauch, anonsten macht es keinen Unterschied, da für die Werte der gleiche Speicherplatz reserviert wird, nur eben an einem Stück.


    new a, b, c, d;
    Verbraucht gleich viel Speicher wie
    new abcd[4];


    Nur musst du natürlich bedenken, dass die Werte im enum-Bereich auch Speicher verbrauchen (jede Zeile im enum stellt im Prinzip eine Zahl dar). Daher braucht die enum Variante minimal mehr Speicher.


    Also von der Performance ist es auf jeden Fall besser einzelne Variablen zu verwenden und dem enum aus dem Weg zu gehen.

    Die erste Variante (einzelne Variablen/Arrays) ist besser hinsichtlich der CPU-Belastung, da der Zugriff auf Arrays grundsätzlich langsamer ist (Variablen mit enums sind Arrays).


    Das bestätigt auch der Zeit-Test beim setzen von GVar4 auf 1, 10.000.000 mal hintereinander:

    Code
    [25/06/2015 22:44:49] Ohne Enum: 177ms
    [25/06/2015 22:44:49] Mit Enum: 245ms