Beiträge von Goldkiller

    Hast du denn wirklich "1,2,3,4,5" als Text/String in der Datenbank stehen ?
    Falls ja,dann kannst du es nicht mit "cache_get_field_content_int" auslesen. Wie der Funktionsname sagt,kannst du damit eine Zahl auslesen."1,2,3,4,5" wäre aber ein Text. Es gibt bestimmt ein entsprechende Funktion die Strings auslesen kann.


    Abgesehen davon sollte man keine Listen in einem Feld speichern, dass aber nur nebenbei.
    Normalisierung ( Datenbank ) 1. Normalform



    //Edit:
    format(string2,sizeof(string2),"Keys:\n%i\n%i",cache_get_field_content_int(20,"userID",serverdbhandle));
    Du hast zwei Platzhalter (%i) aber nur 1 extra Parameter. Dann noch die Schleife wie cocacola schrieb.

    Du musst den Einzelnen Eintrag mit Komma trennen, nicht Semikolon:
    {"Landstalker",0,400,-1,4000,5000,784.2260,-1332.1432,13.5554,90.0000}, // nicht ;
    Beim Letzten natürlich kein Komma setzen.

    SwiftKey.
    Hab es mir vor 1-2 Jahren mal als SwitftKey X gekauft.
    Für das Smarthphone immernoch Top, beim Tablet ist es aber mMn nicht so gut. Komisch :|


    //Edit: Nutze es aber ohne Swype. Find die Funktion besser, bei der man durch das Wischen von Rechts nach Links das Letzte Wort löschen kann. Das geht mit Swype nicht :/

    Erklärung wofür?
    Der Post ist die komplette Erklärung:

    • "can create a file "pawn.cfg" in pawno directory"
    • "-d3" in die Datei schreiben
    • Neu kompilieren
    • Server mit dem Script starten
    • amx backtrace auswerten bzw hier posten. Diesmal MIT Zeilenangabe


    Eventuell hab ich auch nicht so recht verstanden, für was du eine Erklärung benötigst.

    Viel zu kompliziert was ihr dort macht.
    Wäre einfacher, wenn der Dateiname die Nummer + ".txt" o.Ä. ist.


    zB.
    /Crews/1043.cfg
    /Crews/3423.cfg
    Das sind dann die Crew Dateien. Zu prüfen ob eine Nummer dann noch frei ist, reicht über fexist().


    /Crews/maps.cfg:

    Zitat

    1043 = breadfish Crew
    3423 = MÖP Crew


    Für den Fall, man möchte wissen hinter welcher Nummer welche Crew steckt.


    Gibt natürlich noch genug andere Möglichkeiten sowas umzusetzen, man sollte es aber nicht unnötig kompliziert gestalten.



    Bei AvailableNR(nr) hast du übrigens ein Memory Leak.
    stock AvailableNR(nr){
    new dir:dHandle = dir_open("./scriptfiles/Crews/");
    new item[40], type,datei[20];
    while(dir_list(dHandle, item, type))
    {
    if(type == FM_FILE)
    {
    format(datei,20,"/Crews/%s",item);
    if(dini_Int(datei,"CrewNR") == nr)return false; // <--- dir_close fehlt wenn du hier return'st
    else return true; // <--- dir_close fehlt wenn du hier return'st
    }
    }
    return dir_close(dHandle);
    }



    - - - - - - - - - -


    //Edit: Ich wäre mir auch nicht sicher,dass "return dir_close(dHandle)" so klug ist.


    Steht zwar "nothing", dass geht aber gar nicht. Sollest lieber "return false" machen und dir_close() davor.
    dir_close(dHandle);
    return true;// muss true sein


    Noch etwas:
    stock AvailableNR(nr){
    new dir:dHandle = dir_open("./scriptfiles/Crews/");
    new item[40], type,datei[20];
    while(dir_list(dHandle, item, type))
    {
    if(type == FM_FILE)
    {
    format(datei,20,"/Crews/%s",item);
    if(dini_Int(datei,"CrewNR") == nr)return false;
    else return true; // <--- das ist falsch. Das muss dort weg. Würde ja bedeuten, sobald die Zahl in einer (von X Vielen) Dateien nicht steht, ist sie frei. Das stimmt aber nicht
    }
    }
    return dir_close(dHandle);
    }
    Gefixt wäre es dann so:


    stock AvailableNR(nr){
    new dir:dHandle = dir_open("./scriptfiles/Crews/");
    new item[40], type,datei[20];
    while(dir_list(dHandle, item, type))
    {
    if(type == FM_FILE)
    {
    format(datei,20,"/Crews/%s",item);
    if(dini_Int(datei,"CrewNR") == nr)
    {
    dir_close(dHandle);
    return false;
    }
    }
    }
    dir_close(dHandle);
    return true;
    }

    Spoiler anzeigen
    Ein break + bool:variable geht natürlich auch :-0

    Mmn sind da mehrere Fehler drin und die zu beschreiben wäre mir jetzt zu viel Aufwand.
    Fängt schon damit an,dass du "<= 59" machst.
    Es gibt keine Minute 60 auf der Uhr. Es ist "58 -59 - 0 - 1 - 2 ...".
    if(stunde == 23 && minute == 59)stunde ++;
    Den Sinn erkenn ich hier auch nicht wirklich. Du wirst bei 23:59 die "stunde" doppelt zählen.

    Spoiler anzeigen
    Da sind bestimmt noch n paar weitere


    Ich würde dir empfehlen, nur die Sekunden oder in deinem Fall "minuten" zu zählen. Alle anderen Zahlen kann man daraus ableiten wie "stunde" oder "tag". Es gibt ja zum Glück die
    Möglichkeit den Rest einer Rechnung zu erhalten ( % ).



    http://forum.sa-mp.de/gta-mult…zeiteinheiten/#post768251
    stock ConvertSecEx(secs,&sec,&min,&hour,&day) {
    new
    rest;
    sec = 0;
    min = 0;
    hour = 0;
    day = 0;
    day = (secs / (60*60*24));
    rest = (secs % (60*60*24));
    hour = (rest / (60*60));
    rest = (rest % (60*60));
    min = (rest / 60);
    sec = (rest % 60);
    return 1;
    }
    Die Variablennamen sind jetzt natürlich nicht gleichbedeutend mit deinen. Vom Prinzip ist es so gemeint.


    //Edit:
    Die Funktion sollte sogar klappen. Du könntest einfach als Wert für "secs" folgendes angeben: minute * 60
    Für den Wochentag nur noch den Rest von day durch 7.


    //Edit2:
    Damit du es nicht falsch verstehst:
    Jede Sekunde "minute" um 1 erhöhen dann sollte es mit "minute*60" als Wert für "secs" klappen.

    Der Text ist zu lang.
    Wenn der Text länger als 144 Zeichen ist, wird die Nachricht nicht an den Client gesendet. Sieht dann immer so aus, als würde der Funktionsaufruf zu SendClientMessage(ToAll) nicht stattfinden. Bei dir komme ich auf 160 Zeichen. Das Color-Embedding zählt ebenfalls zu den 144 Zeichen ( bzw 160 ).


    //Edit:

    Zitat

    The function executed successfully. Success is reported when the string is over 144 characters, but the message won't be sent.


    http://wiki.sa-mp.com/wiki/SendClientMessage

    if(TutTime[i] >= 1)
    {
    TutTime[i] += 1;
    if(TutTime[i] == 0) //DASTUTORIAL
    {

    Wenn TutTime[] größer/gleich 1 ist, dann wird es nachdem ich +1 zähle niemals gleich 0 sein. Zudem fragst du ständig direkt ab, ob der Spieler bereits im Checkpoint ist. Wenn du das so machen möchtest, dann solltest du einen Timer verwenden um die Funktion immer neu aufzurufen.


    Wie aber sgt.TannerHD schon sagte, zeig doch mal wo du die Funktion für "TutTime" aufrufst.

    Die sieht ja auch aus wie ein Regenbogen.
    Ich hätte die ebenfalls nicht freigeschaltet. Die jetzt einfach nochmal abzusenden im Regenbogen-Stil bringt dir sicherlich nichts. Denn ich lösch die ebenfalls.



    Wie so oft hätte man auch hier erst eine PM schreiben können.

    Die Partikeleffekte selber haben eine Interne Drawdistance. Die kannst du nicht über SA:MP steuern.
    Wenn es es doch ändern möchtest, müsstest du in der *.DFF den Wert ändern.Bin mir da aber nicht mehr ganz sicher. Schon sehr lange her, dass ich damit mal gearbeitet habe.


    Objekt enthält Partikel-Effekt
    Kannst du mit SA:MP steuern.
    Kannst du nicht bestimmt.
    Das gleiche gilt übrigens auch für die Lichter. Die sind auch in einem Objekt eingebunden.


    //Edit: Ups, passt wohl nicht ganz zum Thema.

    Hier hast noch einen Vorschlag:
    ocmd:pds(playerid, params[])
    {
    if(!lspdschranke)
    {
    lspdschranke = true;
    {
    MoveObject(LSPDSchranke,1260.3502, -1698.7749, 13.2889,2);//auf //-1698.7749
    SetDynamicObjectRot(LSPDSchranke, 0.0000, 1.0000, 180.0000);
    SendClientMessage(playerid,Blau,"Schranke wurde geöffnet, bitte schließe sie gleich wieder!");
    }
    }
    else if(lspdschranke)
    {
    lspdschranke = false;
    {
    MoveObject(LSPDSchranke,1260.3502, -1698.7749, 13.2889,2);//zu
    SetDynamicObjectRot(LSPDSchranke, 0.00000, 90.00000, 180.00000);
    SendClientMessage(playerid,Blau,"Schranke wurde geschlossen!");
    }
    }
    else
    {
    SendClientMessage(playerid,Rot,"Du bist kein Polizist!");
    }
    return 1;
    }
    Das "else if" kannst du in "else" ändern und das Letzte "else" komplett löschen.
    Warum ?
    Wenn "if(!lspdschranke)" nicht Eintritt, ist lspdschranke definitiv wahr. Ich brauch daher gar nicht abfragen, ob "else if(lspdschranke)" stimmt. Es muss eintreten. Wenn ich nur 2 Zustände kenne, wahr oder falsch, dann macht ein 3. Fall gar keinen Sinn.
    Tritt also Fall 1. nicht ein ( falsch ) , dann muss es der 2. Fall sein ( wahr ).
    ocmd:pds(playerid, params[])
    {
    if(!lspdschranke) { lspdschranke = true; etc ... }
    else { lspdschranke = false; etc ... }
    return 1;
    }