Beiträge von Goldkiller


    Bin mir auch nicht sicher ob es überhaupt damit klappt:
    strget(cmdtext, 3)
    Kenn die Funktion nicht :-O.


    Eigentlich müsste wenigstens ein Wort angezeigen werden,vorrausgesetzt du gibst sowas ein:

    Zitat

    /ticket 3 1000 du bist zu schnell gefahren.


    Dann müsste grund "du" sein. Das ist auch sehr umständlich es mit strget zu machen. Man könnte direkt auf den Index zugreifen, ist aber keine Gute Lösung. Da würde ich dir eher den sscanf-Part dieses Tutorials empfehlen.Damit ist es viel leichter, trotzdem hier mal n Lösung die du testen könntest.


    format(grund, sizeof grund, cmdtext[7+1+strlen(strget(cmdtext,1)) + 1 + strlen(strget(cmdtext,2))]);
    printf("grund -> '%s'",grund);
    format(text2, sizeof(text2), "Du musstes ein Tickt in höhe von %i bezahlen. Grund: '%s'", money, grund);
    printf(text2);

    Das wird definitiv nicht leer sein,wenn du es so machst.
    format(text2, sizeof(text2), "Du musstes ein Tickt in höhe von %i bezahlen. Grund: %s", money, grund);


    Selbst wenn es mit grund ein Fehler wäre, würdest du da irgendeinen komischen output haben.
    Wie auch immer, mach mal folgendes rein und kopier die Ausgabe aus der Konsole hier ins Forum.
    // Ja,nimm diese Zeile... nicht die oben.
    printf("grund -> '%s'",grund);
    format(text2, sizeof(text2), "Du musstes ein Tickt in höhe von %i bezahlen. Grund: '%s'", money, grund);
    printf(text2);

    Die Funktion womit die IP in Blöcke geteilt wird, ist wirklich nicht gut.Nicht sehr übersichtlich und auch die Blöcke als Array zu speichern ist nicht gerade klever.Das könnte man als Integer pro Block besser speichern oder via Bitshift in nur einer Variable alle Werte.


    printf("banip %s.%s.*.*",blocks[0],blocks[1]);


    Hätte das auch viel eher mit sscanf gemacht.Wie auch immer,hab hier noch eine sehr alte Funktion die mir breadfish mal vor bestimmt über 3Jahren geschrieben hatte, als Ich gerade mit PAWN angefangen hatte:
    stock IP2RootIP(ip[16], blocks) { //breadfish
    new
    rootend,
    i,
    rootip[16];
    if (blocks >= 4) {
    rootip = ip;
    } else {
    for (i=1;i<=blocks;i++) {
    rootend = strfind(ip, ".", true, rootend) + 1;
    }
    strmid(rootip, ip, 0, rootend - 1);
    }


    for (i=1;i<=4-blocks;i++) {
    strcat(rootip, ".*");
    }
    return rootip;
    }


    So funktioniert es definitiv:
    http://pastebin.com/y7uwYcCi

    Hab mir das Video nicht angesehen, weil Ich über HIDEMYASS nicht vorspulen kann :/.


    Jedoch werden die neuen Daten nicht "live" auf den Server übernommen,
    weshalb man den Server erst neustarten, bzw. einen GMX durchführen muss :rolleyes:


    Ändert also nur den CFG - Wert. Über die Console kann man teilweise live Änderungen vornehmen, zwar nicht alle aber bei ein paar Wenigen.
    Vielleicht könnte man das irgendwie kombinieren und einen Hinweis ausgeben, ob es live-Änderungen gab oder erst nach einem restart die Änderung eingespielt werden. Müsstest dann aber durchtesten, wo eine live-Änderung möglich ist.

    Ok,dann will ich auch mal.



    Auch lassen sich somit maßgeschneiderte Spieler-Schleifen erstellen. Genau angepasst an die Limits des Servers.


    Wo ist da der Unterschied zu:
    GetMaxPlayers();
    oder
    GetServerVarAsInt("maxplayers");
    Gibt nämlich keinen :). Die Funktionen gibt es schon sehr lange, sollte man also auch nutzen.


    http://wiki.sa-mp.com/wiki/GetServerVarAsString
    http://wiki.sa-mp.com/wiki/GetServerVarAsInt
    http://wiki.sa-mp.com/wiki/GetServerVarAsBool


    Mit deinen GET Funktionen kann man nur Int auslesen, daher funktioniert folgendes auch nicht:
    #define WEBURL 4096


    Dann noch eine Frage zu den Defines:
    #define ANNOUNCE 64
    #define WEAPONRATE 128
    // Wieso hast denn hier 256 weg gelassen :-0 ?
    #define ONFOOTRATE 512
    #define RCONPASSWORD 1024
    #define QUERY 2048

    Hat das einen besonderen Grund ? Hab im Source nur GetNameOfData , weiss aber nicht wie diese funktioniert.
    enum ( <<= 1 ) {
    LANMODE = 2,
    INCARRATE, // 4
    PASSWORD, // 8
    STREAMRATE, //16
    PORT, //32
    ANNOUNCE, //64
    WEAPONRATE, //128
    ONFOOTRATE, //256
    RCONPASSWORD, //512
    QUERY, //1024
    WEBURL, //2048
    MAXPLAYERS, //4096
    MAXNPC //8192
    }


    Wie auch immer.Die GET-Methode halte Ich für relativ unnötig ( Kannst mir ja Grund nennen, wieso sie es nicht sein sollte :) ).
    Bin mir auch nicht sicher,was die SET-Methode wirklich macht. Die CONFIG-Daten kann man auch über die Console bearbeiten, wird dann aber nicht in der CONFIG-Datei geändert.Sonst kann man auch einfach in die Console schreiben:
    <varname> wert
    Klappt nicht bei allen ( gibt teilweise read-only Daten ) , bei Einigen aber schon möglich.
    stream_distance
    // Ausgabe aktueller stream_distance - Wert
    stream_distance 300.0
    stream_distance
    // Ausgabe aktueller stream_distance - Wert

    Dann streng dich mal ein bischen an und lern dir selbst zu helfen.
    Es gibt hier einige Tutorials zur Nutzung von Dini...
    dini_Int(filename[],key[])
    dini_Float(filename[],key[])
    dini_Bool(filename[],key[])


    Beispiel:
    HouseInfo[i][x] = dini_Get(formatLD, "x");
    ersetzen durch
    HouseInfo[i][x] = dini_Float(formatLD, "x");

    Das Problem ist,dass owner ein Array der Größe 10 ist, DINI_Get aber in der Regel ein Array der Größe 256 returnt.
    Daher auch:

    Zitat

    array sizes do not match, or destination array is too small


    Das könntest du aber mit format lösen.
    format( HouseInfo[i][owner], 10 , dini_Get(formatLD, "owner") );

    Und was genau funktioniert dabei nicht? Du bist ziemlich sparsam mit Informationen , wie soll man dir sonst helfen?


    if(strcmp(option,"add",true))
    Das prüft ob option NICHT "add" ist.
    if(!strcmp(option,"add",true))


    Klassischer fall für mein Tutorial.

    Du hast ein , zwischen zwei Parametern vergessen ( "OK""Nöö" )
    ShowPlayerDialog(playerid,Dialog1,DIALOG_STYLE_MSGBOX,"Fraktion","Bewerbe dich doch in einer Fraktion.","OK","Nöö")

    Fehler liegt hier:
    if(SkinID == 3 || 4 || 5 || 6 || 8 || 42 || 65 || 74 || 86 || 119 || 149 || 208 || 268 || 273 || 289) return SendClientMessage(playerid, ROT, "Ungültige Skin-ID!");


    Du kannst nicht direkt abfragen, ob SkinID == 3 , 4 , 5 , 6 oder 837 ... ist.
    Das muss man alles einzelnt machen.


    if( SkinID == 3 ||
    SkinID == 4 ||
    SkinID == 5 ||
    SkinID == 6 ||
    // usw
    ) return SendClientMessage(playerid, ROT, "Ungültige Skin-ID!");



    //Edit:
    stock IsValidSkin(skinid) //by Simon
    {
    #define MAX_BAD_SKINS 14
    static badSkins[MAX_BAD_SKINS] = {
    3, 4, 5, 6, 8, 42, 65, 74, 86,
    119, 149, 208, 273, 289
    };
    if (skinid < 0 || skinid > 299) return false;
    for (new i;i<MAX_BAD_SKINS;i++) {
    if (skinid == badSkins[i]) return false;
    }
    #undef MAX_BAD_SKINS
    return true;
    }
    Würde an deiner Stelle lieber die Funktion nutzen.
    if( !IsValidSkin(SkinID) ) return SendClientMessage(playerid, ROT, "Ungültige Skin-ID!");

    Das funktioniert schon,du machst es nur falsch.
    Es hilft auch nicht wirklich,wenn du nur sagst "Da bekomme ich 23 Errors".
    Du musst natürlich auch an den Stellen "mod" in "localmod" umbenennen, wo du diese Variable nutzen möchtest.


    Die Warnung die du erhälst, kommt daher, dass du eine Variable Global hast Namens mod, sowie eine Variable die local ist Names mod.


    Kleine Auszug, wie ich das meine:
    #include <a_samp>


    new
    test = 12;


    main()
    {
    }


    public OnGameModeInit()
    {
    return 1;
    }


    public OnGameModeExit()
    {
    return 1;
    }


    public OnPlayerConnect(playerid)
    {
    new
    test; // eine Variable mit dem Namen gibt es bereits
    test = 213;
    return 1;
    }


    Eventuell mal die Errors posten mit den dazugehörigen Zeilen im Code.

    Kannst auch einfach die Abfrage negieren:


    if( !( SpielerInfo[playerid][Fraktion] == 1 || SpielerInfo[playerid][Fraktion] == 2|| SpielerInfo[playerid][Fraktion] == 3 ) ){
    //was passieren soll,wenn er nicht in 1 , 2 oder 3 ist
    // ReturnText(playerid,"Du bist nicht befugt!");}
    }


    Hat eventuell eine bessere Übersicht,geschmackssache.

    Zcelo12,
    Der Platzhalter für den Str fehlt, So wird es definitiv nicht richtig in die Datei geschrieben.


    public SaveZones()
    {
    new
    str[128];
    str[0] = '\0';
    for(new z=0; z<ZONEN_ANZAHL; z++)
    {
    format(str,sizeof(str),"%s%s|", str,Zonen[z][CurrentOwner]);
    }
    new File:file = fopen(OWNER_DATEI,io_write);
    if( file ) {
    fwrite(file,str);
    fclose(file);
    return 1;
    }
    printf("ERROR: SaveZones ( Datei konnte nicht geschrieben werden");
    return 0;
    }
    Ich kann jetzt schlecht sagen,ob es an der Formatierung lag. Denn du hast nirgendwo erwähnt, ob CurrentOwner ein String ist, eine Zahl oder Sonstiges. Wäre nützlich, wenn du das noch angibst.Pablo_Borsellino hat auch schon richtig angedeutet, dass du Debug-Notes benutzten solltest. Dazu findest du einen Link in meiner Signatur unter Tutorials.