Beiträge von Goldkiller

    Die Grünen Schilder von denen du sprichst,erhalten den Text via einer 2DFX Sektion in der DFF Datei.
    Kurz gesagt, es gibt keine Textur die du Ändern musst, um den Text zu ändern.Denn den Text den du da ließt, musst du via DFF Editierung einfügen.
    Ich hab das auch mal ausprobiert, ist aber nicht so n spannende Angelegenheit.
    http://goldkiller.kilu.de/Modding/2dfx_text.png
    Dafür gibt es auch ein Tool, weiss aber nicht mehr wie das heisst.


    Das wird auch niemals in SA:MP möglich sein, denn dann würde man auch Partikel Effekte sowieso Lichter im eigentlichen Sinne erstellen können als Effekt.Die Methode die in SA:MP 0.3c genutzt wird ist ja nur ein Model zu erstellen, die den gewünschten Effekt enthält ( Wie Ich finde eine ziemlich dumme Methode, das funktioniert definitiv besser in MTA ).
    In MTA funktioniert es anders, dort wird der Effekt direkt erstellt. Texte sind aber soweit Ich weiss nicht möglich.
    http://www.gtamodding.com/index.php?title=2DFX_(RW_Section) [zZt Down]

    LuxX,falls du das noch lesen wirst.


    static const Colors[13] =
    {
    0x000000FF,0x003300FF,0x006600FF,0x009900FF,0x00CC00FF,0x00FF00FF,0x330000FF,
    0x333300FF,0x336600FF,0x339900FF,0x33CC00FF,0x33FF00FF,0x660000FF
    };



    #1 0x heisst auch nur das ein Wert in Hexadezimal folgt.Der Compiler wird es dann in ein Integer umrechnen.
    #2 Quatsch. Strings sind Strings, Integers sind Integers und Hex-Werte sind im Endeffekt auch nichts Anderes als Integers.

    Das hab Ich doch geschrieben.
    Deswegen sollte er die Textdraws beim Connecten erstellen und beim Verlassen wieder zerstören.So sind auch wirklich nur Textdraws erstellt für Spieler, die sich derzeit auch wirklich auf dem Server befinden.

    Liegt sehr wahrscheinlich an Anderen TextDraws.
    Erstellst du denn andere Textdraws, so wie du in deinem Ausgangscode unter
    OnGameModeInit() gezeigt hast ?
    Falls ja, dann wird es daran liegen.
    In SA:MP sind maximal 2048 Textdraws möglich. Versuchst du weitere zu erstellen,
    wird es nicht funktionieren. MAX_PLAYERS ist standartmäßig auf 500 definiert, falls
    du das nicht geändert hast und du mehrere Textdraws in OnGameModeInit in einem Loop für alle
    Spieler erstellst, überschreitest du ziemlich schnell diese 2048 Textdraws



    public OnGameModeInit() {
    for(new i ; i < MAX_PLAYERS ; i++) {
    TextDrawCreate() ... // 1
    TextDrawCreate() ... // 2
    TextDrawCreate() ... // 3
    TextDrawCreate() ... // 4
    }
    }

    Damit erreichst du bereits 2000 (!!!) Textdraws.Könntest also nur noch 48 erstellen.

    public OnGameModeInit() {
    for(new i ; i < MAX_PLAYERS ; i++) {
    TextDrawCreate() ... // 1
    TextDrawCreate() ... // 2
    TextDrawCreate() ... // 3
    TextDrawCreate() ... // 4
    TextDrawCreate() ... // 5
    }
    }

    Das sind bereits 2500, es werden aber nur 2048 erstellt.Die übrigen 452 ( 500-48 ) Textdraws werden
    nicht erstellt.Denn der Speicher für Textdraws ist voll.


    Entweder du reduzierst MAX_PLAYERS ( Da du mit sehr hoher wahrscheinlichkeit eh nie 500 Spieler haben
    wirst ) oder du erstellst die Textdraws erst bei OnPlayerConnect, so wie Ich es gezeigt habe.
    Zerstörst diese dann auch wieder bei OnPlayerDisconnect.
    Ich empfehle die Methode mit OnPlayerConnect/Disconnect . Da du so zusätzlich die Ressourcen des Server schohnst da nur die Textdraws erstellt sind, die aktuell auch wirklich benötigt werden.


    Für die Andere Methode müsstest folgendes einfügen

    // direkt unter #include <a_samp>
    #if defined MAX_PLAYERS
    #undef MAX_PLAYERS
    #define MAX_PLAYERS 100
    #endif

    Davon gibt es genug.
    Hier sind genug Leute, die vor paar Jahren sich nur an dem Englischen orientieren konnten, weil es dazu nichts anderes gab. Das war auch bei weitem nicht so aisführlich wie das,was du heute alleine hier im Forum an Tutorials findest.


    http://wiki.sa-mp.com/wiki/PAWN_for_Begginers
    http://wiki.sa-mp.com/wiki/PAWN_tutorial


    http://forum.sa-mp.de/wbb/san-…/35274-pawn-einstieg-2-0/


    http://forum.sa-mp.de/wbb/san-…ls/46907-liste-tutorials/

    Dir fehlen mal ganz klar die Grundlagen.
    http://forum.sa-mp.de/wbb/san-…player/board39-tutorials/


    if(strcmp("/wievielheal",cmdtext,true) == 0)
    {
    new Float:leben; // Ist ein Float Datentyp
    new string[100];
    GetPlayerHealth(playerid, leben); // wieso du da "health" benutzt weiss Ich nicht.Grundlagen!
    format(string, sizeof(string), "Dein Leben beträgt %f HP.", leben); // Den Platzhalter für Float Variablen ist f
    SendClientMessage(0xFF0000,string);
    return 1;
    }

    Ja, deswegen geht es ja eben nicht.Ein String ist ja nichts anderes als ein Array.
    Eine einfache Lösung gibt es dazu nicht,du musst es irgendwie umgehen.
    Wieso eine gcarnumber überhaupt ein String sein muss, musst du dir selber überlegen.
    Denn eine Nummer ist bei mir nie ein String.


    Und ob es mit den weiteren Fehler was zu tun hat. Höchstwahrscheinlich. Wenn
    das Array schon Fehlerhaft ist, kannst du davon ausgehen, dass es damit Probleme geben wird.

    Das Problem ist,dass in PAWN maximal 3-Dimensionale Arrays möglich sind.
    Du versucht ein 4-Dimensionales Array zu benutzen.

    Zitat

    ---------------- 1 ------------- 2 -------------- 3 ------------- 4
    GangInfo[MAX_TEAMS][gcarnumber][MAX_TEAMSVEH][20]


    Da kannst nichts gegen machen.Etwas nervig ist es schon, hatte mal das selbe Problem. Weiss aber nicht mehr wie Ich das umgangen habe.

    Nur die innere for(j=1; j<10;j++).


    //Edit


    + close :)

    Und wieso willst du ohne sscanf auskommen?
    public OnFilterScriptInit()
    {
    new sBuffer[] = "gamemode test123456";
    if(!strcmp(sBuffer,"gamemode", true,strlen("gamemode")) ) {
    new
    pos;
    pos = strfind(sBuffer," ");
    if(pos != -1) {
    printf( sBuffer[pos+1] );
    }
    }
    return 1;
    }
    oder so,
    public OnFilterScriptInit()
    {
    new sBuffer[] = "gamemode test123456";
    new len = strlen("gamemode");
    if(!strcmp(sBuffer,"gamemode", true,len) ) {
    if(sBuffer[len] == ' ') {
    printf( sBuffer[len+1] );
    }
    }
    return 1;
    }


    Müsstest es für dich jetzt nur noch allgemeiner als Code ausdrücken.

    Ich würde sscanf dafür benutzen.


    if(!strcmp(sBuffer,"gamemode")) { // für die korrekte Zeile
    new
    sFake[10],
    sGamemode[32];
    if(sscanf(sBuffer,"p ss",sFake,sGamemode)) {
    // if(sscanf(sBuffer,"p< >s[10]s[32]",sFake,sGamemode)) { Falls sscanf v2
    printf("Fehler");
    }
    printf("%s %s",sFake,sGamemode);
    }

    Und wieso muss er das machen? Wieder mal ein Post der nichts bringt außer seinen Post-Count hoch zu treiben ohne wirklich zu helfen.


    Der Fehler ist das return 1; im Loop von TextDraw().Dadurch wird die Funktion beendet und die Schleife wird immer nach dem 1 durchlauf beendet. Ich hab es dir mal etwas verändert, womit es von den Ressourcen weniger verbraucht.


    forward TextDraw();
    new Text:Textdrawstats[MAX_PLAYERS];


    public OnGameModeInit()
    {
    SetTimer("TextDraw", 5003, 1); // Alle ~5 Sek reicht doch locker aus
    return 1;
    }
    public TextDraw()
    {
    new
    bstring[16];
    for(new i = 0; i < MAX_PLAYERS ; i++)
    {
    if(IsPlayerConnected(i)) {
    format(bstring,sizeof(bstring),"~g~$%d", Spieler[i][bankmoney] );
    TextDrawSetString(Textdrawstats[i], bstring);
    }
    }
    return 1;
    }


    public OnPlayerConnect(playerid)
    {
    Textdrawstats[playerid] = TextDrawCreate(BLABLABLA);
    TextDrawAlignment(BLABLABLA);
    // ........................
    TextDrawShowForPlayer(playerid, Textdrawstats[playerid]);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    TextDrawHideForPlayer(playerid, Textdrawstats[playerid]);
    TextDrawDestroy(Textdrawstats[playerid]);
    return 1;
    }


    Es ist besser,wenn du den Textdraw erst beim Connecten für den Spieler erstellst und ihn dann auch beim Verlassen wieder zerstörst.

    Man brauch dafür aber kein multi-Dimensionales Array.
    new const JoinPed[] = {
    280,//POLICE_FORCE 1
    281, //2
    282,//3
    283,//4
    284,//5
    112,//6
    288,//7
    71,//8
    166,//9
    295,//10
    148,//11
    286,//FBI/ATF //12
    164,//12
    163,//14
    55,//NATIONAL_GUARD
    55,
    70,//FIRE/AMBULANCE
    274,
    275,
    276,//20
    277,
    278,
    279,
    258,//LA_COSA_NOSTRA
    127,
    126,
    125,//28
    124,
    113,
    111,
    98,
    120,//Yakuza
    121,
    122,
    123,
    169,
    186,//38,
    228,
    120,//HITMANS
    165,
    186,
    93,
    141,
    148,//NEWS_REPORTERS
    188,
    187,
    115,//TAXI_CAB_COMPANY
    116,
    59,//50//DRIVING/FLYING_SCHOOL
    60,//DRIVING/FLYING_SCHOOL
    76,//DRIVING/FLYING_SCHOOL
    150,//DRIVING/FLYING_SCHOOL
    105,
    106,
    107,
    127,
    112,
    169
    };
    Wenn du die Daten nicht mehr ändern willst,kannst es auch als konstante ( const ) erstellen.

    PVars waren noch nie schneller als normale Variablen und werden es auch nie sein. Weiss auch nicht,
    wieso einige das behaupten oder glauben.
    PVars sind definitiv langsamer. Der Sinn hinter PVars ist es, Informationen überall zugänglich
    zu haben innerhalb verschiedener Scripte. Das war zwar vorher schon möglich get/setProperty, wurde
    aber eher wenig genutzt.


    PVars blähen außerdem nicht die AMX zusätzlich auf, nutzen dagegen mehr CPU wenn sie benutzt
    werden.Ist also ein Thema RAM vs CPU.


    Zu den Timern.Einen für alles zu nutzen, ist nicht optimal.Hab Ich vor paar Jahren aber auch gemacht.
    Es ist besser, wenn man für jede Funktion einen eigenen Timer erstellt.
    Dieser hat dann aber ein Intervall das sich nicht mit einen überschneiden kann.
    Anstatt ein Intervall von 1000ms nimmt man 997ms oder 1009ms ( Primzahlen ) . Der Unterschied
    ist so minimal, den wirst du niemals bemerken.
    Primzahlen nimmt man deshalb, weil sich so die Timer nie überschneiden werden.


    Es gibt einen Grund,wieso die sich am besten nicht überschneiden sollen.
    Das jetzt selber ausführlich zu erklären dauert mir zu lange, dazu gibt es einen super Post
    von Y_Less im offiziellen SA:MP Forum. Aber wie immer, finde Ich den Post nicht.
    Ich schau nochmal nach, ob Ich den finde.


    //Edit:
    Ein hoch auf die Suchfunktion,
    http://forum.sa-mp.com/showthread.php?t=61322

    Da ist aber nirgendwo ZCMD bei.Das hat hier aber schon wer angemerkt.
    Du kannst dir ja auch meinen Test anschauen,
    http://forum.sa-mp.de/wbb/san-…-include-ocmd/#post445162


    Zitat

    auf meine frage zurück geht strcmp mit sscanf oder nur mit strtok


    Ja,ist nur etwas umständlich.


    Goldkillers Test war allerdings ocmd vs zcmd. Servertest's Grafik zeigt allerdings nur den Vergleich Dcmd, Scmd und Ocmd. D.h. es wurde nie behaupted dass es schneller als Zcmd sei.


    [hide]
    [Include] OCMD [/hide]


    Wer aber behauptet, die beste Methode entwickelt zu haben, soll das auch beweisen können und nicht einfach behaupten "Jup meins ist das beste.Schneller als DCMD & SCMD". Dabei kennt mit Sicherheit niemand im offiziellen SA:MP Forum SCMD und auch nur ein geringer Teil OCMD.
    Denn da nutzt man plane strcmp , dcmd oder ZCMD.


    Ich benutze OCMD, immerhin kenn ich ja Opa den Ersteller und habe den Support. Zudem ist es ja auch das bisher schnellste und alles andere als ein Abklatsch von ZCMD.


    Dann Beweis,dass es schneller ist. Jeder der sich mit ZCMD von Anfang an beschäftigt hat,wird dir sagen,dass OCMD ein Abklatsch ist. So ein Schwachsinn ...


    //Edit: So einen Thread gabs schon öfters :/.
    //Edit : strcmp statt plane