Beiträge von Jeffry

    Momentan hast du es ja so:
    if(Postinfo[playerid][postpackete] < 2)


    das zu:
    if(Postinfo[playerid][postpackete] < sizeof(Postfuhr_Stationen[]))


    Oder hast du es auch so gemacht, dass du Nuller Checkpoints hast, also dass die Routen unterschiedlich viele Checkpoints haben?



    EDIT: (Post unten)
    @xCurry: Ok, dann passt es so. :)

    Das könnte so aussehen:
    ocmd:setfbankmats(playerid,params[])
    {
    admincheck(6);
    logOCMDCommand(playerid,"setfbankmats",params);
    new betrag, fID;
    if(sscanf(params,"ii",fID, betrag))return ErrorMsg(playerid,"INFO: /setfbankmats [frak] [betrag]");
    if(betrag<1||betrag>999999)return ErrorMsg(playerid,"Ungültiger Betrag. (1-999999)");


    for(new i=0; i<maxfbanken; i++)
    {
    if(Fbank[i][Fraktion]==fID)
    {
    Fbank[i][Mats]+=betrag;
    format(string,sizeof(string),"AdmCmd: %s hat der Fraktion %i %i Mats gegeben.",SpielerName(playerid),fID,betrag);
    SendAdminMessage(COLOR_BLUE,string);
    SaveFbank(i);
    return 1;
    }
    }
    return 1;
    }

    Hast du es bei allen anderen auch geändert?
    Wenn nicht:
    if(dialogid==DIALOG_SUPMOBIL)
    {
    if(!response)return 1;
    new Float:p[4];
    GetPlayerPos(playerid,p[0],p[1],p[2]),GetPlayerFacingAngle(playerid,p[3]);
    switch(listitem)
    {
    case 0:
    {
    supmobil[playerid] = CreateVehicle(560,p[0],p[1],p[2],p[3],79,79,-1);
    SetVehicleNumberPlate(supmobil[playerid],"Supmobil");
    tank[supmobil[playerid]] = 100;
    /*supsirene[supmobil[playerid]] = CreateObject(18646,0,0,-1000,0,0,0,100);
    AttachObjectToVehicle(supsirene[supmobil[playerid]],supmobil[playerid],-0.54, 0.1, 0.88, 0.0, 0.0, 0.0);*/
    supsirene[supmobil[playerid]] = CreateObject(19620,0,0,-1000,0,0,0,100);
    AttachObjectToVehicle(supsirene[supmobil[playerid]],supmobil[playerid],-0.54, 0.1, 0.88, 0.0, 0.0, 0.0);
    PutPlayerInVehicle(playerid,supmobil[playerid],0);
    printf("%s %s hat sich den Sultan als Supmobil gespawnt!)",arang(playerid),getPlayerName(playerid));
    }
    case 1:
    {
    supmobil[playerid] = CreateVehicle(415,p[0],p[1],p[2],p[3],79,79,-1);
    SetVehicleNumberPlate(supmobil[playerid],"Supmobil");
    tank[supmobil[playerid]] = 100;
    supsirene[supmobil[playerid]] = CreateObject(18646,0,0,-1000,0,0,0,100);
    AttachObjectToVehicle(supsirene[supmobil[playerid]],supmobil[playerid],-0.45, -0.2, 0.66, 0.0, 0.0, 0.0);
    PutPlayerInVehicle(playerid,supmobil[playerid],0);
    printf("%s %s hat sich den Cheetah als Supmobil gespawnt!)",arang(playerid),getPlayerName(playerid));
    }
    case 2:
    {
    supmobil[playerid] = CreateVehicle(495,p[0],p[1],p[2],p[3],79,79,-1);
    SetVehicleNumberPlate(supmobil[playerid],"Supmobil");
    tank[supmobil[playerid]] = 100;
    supsirene[supmobil[playerid]] = CreateObject(18646,0,0,-1000,0,0,0,100);
    AttachObjectToVehicle(supsirene[supmobil[playerid]],supmobil[playerid],-0.5, -0.2, 1.04, 0.0, 0.0, 0.0);
    PutPlayerInVehicle(playerid,supmobil[playerid],0);
    printf("%s %s hat sich den Sandking als Supmobil gespawnt!)",arang(playerid),getPlayerName(playerid));
    }
    }
    }


    Vor allem, weil du den Spieler erst danach in das Fahrzeug setzt.

    Oder dass du es löschst, irgendwo in einem Timer? Hast du denn einen Timer, der alle paar Sekunden aufgerufen wird?


    Alternativ, versuche es über ein Dummy zu lösen, manchmal hilft das, wenn man den Fehler nicht findet (ist zwar unschön, aber übergangsweise tut es das oft).
    paydayzeit[playerid] = CreatePlayerTextDraw(playerid, 256.799957, 7.466705, "PayDay: 00/60");
    zu:
    CreatePlayerTextDraw(playerid, 0.0, 0.0, "Dummy");
    paydayzeit[playerid] = CreatePlayerTextDraw(playerid, 256.799957, 7.466705, "PayDay: 00/60");


    Wichtig ist, dass es vor dem anderen CreatePlayerTextDraw steht, also lass die Reihenfolge so ^ .

    Beim Starten:
    Postinfo[playerid][post_Route] = random(sizeof(Postfuhr_Stationen));


    Und dort wo du einen Checkpoint setzt, oder eben damit arbeitest:
    new id = Postinfo[playerid][post_Checkpoint];
    new route = Postinfo[playerid][post_Route];
    SetPlayerCheckpoint(playerid,Postfuhr_Stationen[route][id][P_fx],Postfuhr_Stationen[route][id][P_fy],Postfuhr_Stationen[route][id][P_fz],Postfuhr_Stationen[route][id][P_fRad]);


    Es ändert sich eigentlich nichts, außer dass die Route dazu kommt.

    Ja, die können frei bleiben. Alternativ kannst du auch genau die Anzahl reinschreiben, aber das ist irrelevant.


    Allerdings muss es so aussehen:
    new Postfuhr_Stationen[][][e_Post] =
    {
    {
    {2200.8418,-2302.9058,14.7647,5.0},
    {2084.4307,-1655.3788,12.9596,5.0},
    {2069.5339,-1654.8695,13.5469,5.0}//Bis hier Route 1
    },
    {
    {1911.5476,-1603.8575,13.5469,5.0},
    {/*hier noch ein CP*/},
    {1800.0997,-1583.5662,13.4807,5.0}//Bis hier Route 2
    }
    };


    Es müssen in jeder Route gleich viele Checkpoints sein, das wird von mehrdimensionalen Arrays so verlangt.


    Alternativ kannst du es so machen:
    new Postfuhr_Stationen[][][e_Post] =
    {
    {
    {2200.8418,-2302.9058,14.7647,5.0},
    {2084.4307,-1655.3788,12.9596,5.0},
    {2069.5339,-1654.8695,13.5469,5.0}//Bis hier Route 1
    },
    {
    {1911.5476,-1603.8575,13.5469,5.0},
    {1800.0997,-1583.5662,13.4807,5.0},
    {0.0,0.0,0.0,0.0}//Bis hier Route 2
    }
    };


    Dann musst du beim anzeigen des nächsten Checkpoints eben abfragen, ob der alles 0 hat, falls ja, oder falls das Maximum (3) erreicht ist, ist Ende.

    new bisgebannt = mysql_function_query(dbhandle,mysqlquery,false,"","");
    zu:
    mysql_function_query(dbhandle,mysqlquery,false,"OnPlayerTimeBanCheck","d", playerid);


    Und das hier ganz unten im Gamemode:
    forward OnPlayerTimeBanCheck(playerid);
    public OnPlayerTimeBanCheck(playerid)
    {
    new rows = cache_num_rows(), bisgebannt;
    if(rows > 0)
    {
    bisgebannt = cache_get_row_int(0, 0, dbhandle);
    }
    if(gettime() < bisgebannt)
    {
    new differenz = bisgebannt - timestamp;
    new minuten = differenz / 60;
    new string[64];
    format(string,sizeof(string),"Du bist noch %i Minuten gebannt!",minuten);
    SendClientMessage(playerid,0xFAFAFAFF,string);
    Kick(playerid);
    }
    else
    {
    //Login Dialog hier anzeigen
    }
    return 1;
    }


    Die Abfrage nach dem mysql_function_query entfernst du natürlich, das steht ja jetzt in OnPlayerTimeBanCheck drin, dort zeigst du von nun an auch den Login Dialog an.

    Du könntest versuchen, in der TimerFix.inc von Slice (je nach dem wie die Include bei dir heißt) das hier zu erhöhen:
    #define TIMER_FIX_TIMER_SLOTS 128


    Setze das mal auf 256 und schaue ob der Fehler dann weg ist. Vergesse aber nicht deinen Gamemode bzw. Code neu zu kompilieren, nachdem du die Änderung gemacht hast. Die Include findest du in /pawno/includes/, ändere es dort. Anschließend öffne die pawno.exe im /pawno/ Ordner und wähle deinen Code aus, den kompilierst du dann.


    Falls das nicht hilft kannst du die Include auch einfach aus deinem Gamemode raus nehmen, dann funktioniert es auf jeden Fall, die Timer sind dann eben nicht zu 100% akkurat, sondern Standard (heißt mit einer kleinen Abweichung (5 bis 10%)).

    Nutzt du irgendwo, zum Beispiel in einem Timer, PlayerTextDrawHide? Wenn ja, für dieses Textdraw vielleicht sogar?
    Zeigt es denn das Textdraw wieder an, wenn der PayDay um eins hochgezählt wird und geht es danach auch gleich wieder weg?

    Ok, auch gut. :)


    Zwecks den Routen würde ich es dir so vorschlagen:
    new Postfuhr_Stationen[][][e_Post] =
    {
    {
    {x, y, z},
    //...
    {x, y, z}
    },
    //...
    {
    {x, y, z},
    //...
    {x, y, z}
    }
    };


    Dann kannst du so direkt drauf zugreifen:
    Postfuhr_Stationen[routenID][cpID][P_fx]


    Die routenID kannst du dir mit einem random zum Start generieren lassen und eben speichern, wie den Checkpoint Status, nur dass sich die RoutenID eben nicht ändert.


    Im Array oben musst du nur darauf achten, dass alle Routen die gleiche Anzahl an Checkpoints haben.

    mysql_function_query gibt dir den Timestamp nicht zurück.
    Du musst mit mysql_function_query ein Callback aufrufen lassen, zum Beispiel OnPlayerTimeBan, und darin dann den cache des Feldes für die Zeit auslesen. Danach musst du in diesem Callback die Abfrage setzen und auch dort drinnen den Login Dialog anzeigen lassen, falls der Spieler nicht gebannt ist.