Beiträge von Goldkiller

    Dann benutzt doch Google oder die Forensuche,so schwer kann es doch nicht sein.
    Da steht,dass GetDistanceBetweenPlayer unbekannt ist.Dann mach das es bekannt ist.
    //http://forum.pawno.ru/archive/index.php/t-39.html
    forward Float:GetDistanceBetweenPlayers(player1, player2);
    public Float:GetDistanceBetweenPlayers(player1, player2)
    {
    new Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2;
    if(!IsPlayerConnected(player1) || !IsPlayerConnected(player2)) return -1.00;
    GetPlayerPos(player1, x1, y1, z1);
    GetPlayerPos(player2, x2, y2, z2);
    return floatsqroot((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1));
    }


    Hast du denn die neuesten Includes?
    Denn eigentlich ist das ja eine Standard Funktion..


    Ist es nicht :-O

    Da ist noch ein kleiner Fehler drin,dürfte nicht möglich sein das zu kompilieren.
    public searchtimer(playerid,id)
    {
    new Float:X,Float:Y,Float:Z;
    //GetPlayerPos(pID,X,Y,Z); <- pID ist hier falsch
    GetPlayerPos(id,X,Y,Z);
    SetPlayerCheckpoint(playerid,X,Y,Z,3);
    }

    Ich selber mach es eigentlich auch immer nach der inneren Schleife, hab es jetzt aber mal so gelassen.
    Hat Beides Vor- und Nachteile es innerhalb der Schleife zu machen oder Außerhalb.
    Wie auch immer,so wäre es etwas erweitert:
    forward PayZone(playerid);
    public PayZone(playerid) // Wieso hast du hier überhaupt playerid als Parameter?
    {
    new
    iMoney,
    bool:bSendMessage;
    for(new i;i<MAX_PLAYERS;i++)
    {
    bSendMessage = false;
    iMoney = 0;
    for(new g; g<sizeof(Gebiete); g++)//Damit alle gebiete durchlaufen werden
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    iMoney += 300;
    bSendMessage = true;
    }
    }
    if(bSendMessage) {
    GivePlayerMoney(i, iMoney);
    // Dann könnte man iMoney für einen formatierten Text nutzen.
    // format(String,sizeof(String),"Du hast %d$ für den Besitz von %d Gebieten bekommen", iMoney , ( iMoney / 300 ) );
    ClientLanguageText(i,COLOR_GREEN,"Du hast Geld für den Besitz von Gebieten bekommen!","You got money from the zones of your team!");
    bSendMessage = false;
    }
    else {
    ClientLanguageText(i,COLOR_GREEN,"Deine Gang besitzt keine Gebiete,daher erhälst du keinen Geld-Bonus"," ENG ... ");
    }
    }
    return 1;
    }

    Bringt nichts,BlackAce Anarchiyx3.
    Da würde man maximal 1x die Nachricht insgesamt versenden,da return 1.
    forward PayZone(playerid);
    public PayZone(playerid) // Wieso hast du hier überhaupt playerid als Parameter?
    {
    new
    bool:bSendMessage;
    for(new i;i<MAX_PLAYERS;i++)
    {
    bSendMessage = true;
    for(new g; g<sizeof(Gebiete); g++)//Damit alle gebiete durchlaufen werden
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    GivePlayerMoney(i,300);
    if(bSendMessage) {
    ClientLanguageText(i,COLOR_GREEN,"Du hast Geld für den Besitz von Gebieten bekommen!","You got money from the zones of your team!");
    bSendMessage = false;
    }
    }
    }
    }
    return 1;
    }

    Gute Frage. Ich find den eingebauten Streamer auch Kacke, da man mit dem sowieso nicht 400 selbst eingefügte Objekte gleichzeitig sehen kann. Auch die gesetzten Limits sind behindert, da der Streamer nur Objekte anzeigen lässt von denen man 300 Einheiten ( Meter ) entfernt ist. Das der Streamer sowieso nur 400 Objekte verwalten kann ist sowieso schlecht.
    Deswegen, um einen Streamer kommst du wohl nicht herrum.Eigentlich hast du dann einen Streamer ( Egal welchen,ob Einstein oder Incognito ) der einen Streamer ( SA:MP 0.3c ) benutzt. Es kommt aber auch immer darauf an,wie man den Streamer einstellt. Hab vor längerer Zeit mal eine Funktion erstellt,die dir die optimale Distanz angibt, ab wann man ein GTA Objekt sehen kann. Falls es dich interessiert,hier . Beschreibung liegt beim Link bei.

    Wo ist denn das Problem? Ich hab dir doch den Code gegeben , der sehr sehr leicht zum einfügen ist.


    if(strcmp(cmdtext,"/stuff get",true)==0)
    {
    if(IsPlayerInRangeOfPoint(playerid,2.0,-1846.5907,168.2846,15.1172))
    {
    // Ist es denn so schwer,vor der if() Abfrage erstmal
    // die Variable zu deklarieren und einen Wert zuzuweisen ??
    new vehicleid;
    vehicle = GetPlayerVehicleID(playerid);
    // -------
    if( 2 <= vehicleid <= 11 )
    {
    if(GetPVarInt(playerid,"Stuffs")==0)
    {
    if(GetPVarInt(playerid,"Job")==1)
    {
    SendClientMessage(playerid,DUNKLESGELB,"Du hast dir Stuffs gekauft fahre nun zum Verkaufspunkt!");
    SetPlayerCheckpoint(playerid,-1919.5896,595.8679,35.1719,6);
    SetPVarInt(playerid,"Stuffs",1);
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du bist kein Trucker!");
    }
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du hast bereits Stuffs, liefer sie zuerst ab!");
    SetPlayerCheckpoint(playerid,-1919.5896,595.8679,35.1719,6);
    }
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du bist nicht im Truck!");
    }
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du bist nicht an der richtigen Stelle!");
    }
    return 1;
    }
    Komm jetzt bloß nicht mit "Loose Indentation" Warnung ....

    Dann ließ doch was dort steht.

    Zitat

    undefined symbol "vehicleid"


    Die Variable vehicleid ist nicht bekannt.


    Wie auch immer, der Code von dir hätte dann aber schon vorher diesen Fehler ergeben. Unter welchem Callback hast du diesen Code ? Falls du es bei OnPlayerStateChange hast,musst du erst die VehicleID des Spielers beziehen damit du die benutzten kannst.
    new vehicleid;
    vehicle = GetPlayerVehicleID(playerid);

    if(vehicleid== 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11)
    Das ist falsch ( jedenfalls für das was du möchstest ) und wird imer true sein.


    if(vehicleid== 2 ||
    vehicleid == 3 ||
    vehicleid == 4 ||
    ... )
    oder
    if(vehicleid >= 2 && vehicleid <= 11)
    oder
    if( 2 <= vehicleid <= 11 )

    Der integrierte Streamer in 0.3c ist überflüssig. Man kann zwar dank dem anstatt 150-200 rund 400 Objekte einfügen ( Limits), aber das kann man auch mit jedem Anderem Streamer.
    Nimm diesen Streamer, [REL] Streamer Plugin v2.5.2
    Der enthält noch viel mehr als nur einen Objektstreamer und ist zZt definitiv der beste den du bekommen kannst.

    Wenn du schon sscanf benutzt,dann mach dich doch vorher damit etwas vertraut.
    In meiner Signatur findest du dazu ein sehr ausführliches Tutorial.Hier trotzdem nochmal der Link.
    http://forum.sa-mp.de/wbb/san-…-commands-mit-parametern/
    ocmd:setlevel(playerid,params[])
    {
    // 0 = Gebannt
    // 1 = Spieler
    // 2 = Supporter
    // 3 = Co-Admin
    // 4 = Admin
    new alevel;
    new pName[MAX_PLAYER_NAME], save[28], pID;
    GetPlayerName(playerid, pName, sizeof(pName));
    format(save, sizeof(save), "/Spieler/%s.ini", pName);
    if(dini_Exists(save))
    {
    sInfo[playerid][level] = dini_Int(save,"level"); // <- Wieso lädst du erst hier den Level des Spielers?
    if(sInfo[playerid][level] > 2)
    {
    if(sscanf(params,"ui",pID,alevel)) return SendClientMessage(playerid,COLOR_YELLOW,"Benutze: /setlevel [Spieler][User-Level]");
    {
    // Hier fehlt der Code zum ändern des Value
    GetPlayerName(pID, pName, sizeof(pName) ); // pID ist nun die ID an der wir arbeiten möchten
    format(save, sizeof(save), "/Spieler/%s.ini", pName);
    if(dini_Exists(save))
    {
    dini_IntSet(save, "level", alevel);
    SendClientMessage(playerid,COLOR_GREEN,"Info: Userlevel erfolgreich angepasst!");
    }
    else {
    SendClientMessage(playerid,COLOR_RED,"Spieler hat keinen Account!");
    }
    }
    }
    }
    return 1;
    }
    Die Erklärung lasse ich mal weg zu sscanf.Dazu findest du alles wie gesagt im Tutorial.

    GOTO teleportiert nicht genau genommen immer zu dir,sondern immer zu ID 0. Würdest du das ganze als ID 2 ausprobieren, würde es trotzdem versuchen dich zu ID 0 zu porten.Ich zeig dir mal den Fehler:


    dcmd_goto(playerid,params[])
    {
    new name[MAX_PLAYER_NAME];
    new ID,string[128];
    new Float:x,Float:y,Float:z;
    new car = GetPlayerVehicleID(playerid);
    // Wir kennen die Verarbeitung der Parameter noch nicht
    // Erst später im Code verarbeiten wir die Eingabe und weisen ID
    // einen richtigen Wert zu
    //
    // GetPlayerPos(ID,x,y,z); <-- hier ist ID noch 0
    // GetPlayerName(ID,name,sizeof(name)); <-- hier ist ID noch 0. Da noch kein Wert zugewiesen und nur deklariert
    // Da du beim testen ID 0 bist,wird immer zu "dir" geportet. Da noch kein Wert zugewiesen und nur deklariert
    if(PlayerInfo[playerid][Admin] >= 1)
    {
    if(sscanf(params,"u",ID)) // <- Erst hier wird ID der richtige Wert der Eingabe überwiesen
    // bsp /goto 23 oder /goto Tim ( Tim hat playerid 23 )
    // Dann wird ID = 23
    {
    SendClientMessage(playerid,Rot,"Benutze /goto [playerid]");
    return 1;
    }
    if(!IsPlayerConnected(ID))
    {
    SendClientMessage(playerid,Rot,"Angegebene ID ist nicht online!");
    return 1;
    }
    GetPlayerPos(ID,x,y,z); // Jetzt kennen wir ID,also besorgen wir uns die Position
    GetPlayerName(ID,name,sizeof(name)); // Jetzt kennen wir ID,also besorgen wir uns den Namen
    if (GetPlayerState(playerid) == 2)
    {
    LinkVehicleToInterior(car,0);
    SetVehiclePos(playerid,x,y+2,z);
    return 1;
    }
    else
    {
    SetPlayerPos(playerid,x,y+2,z);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    format(string, sizeof(string), "Du hast dich zu %s geportet.",name);
    SendClientMessage(playerid,Grün,string);
    }
    return 1;
    }
    else
    {
    SendClientMessage(playerid,Rot,"Du bist kein Admin!");
    }
    return 1;
    }
    Im Code steht die Information.

    Wieso machst du das denn überhaupt mit MYSQL ? Auch gut wäre zu wissen,welches MYSQL Plugin du benutzt. Du solltest nämlich auch mal mysql_free_result() benutzen, sonst kommt es irgendwann zu Fehlern ( Falls Ich es noch richtig in Erinnerung habe )
    Ich erkenn ehrlich gesagt nicht den Sinn hinter den Funktionen. Wieso willst du denn Anhand der ID überprüfen,ob ein Spieler Leader ist oder Member,wobei du bei Member nirgendwo sagst Member von was. Seh Ich jedenfalls nicht. Macht sowas nicht mehr Sinn,anhand des Spielernamens ? ( ID ist natürlich auch möglich, sofern es pro Spieler eine einzigartige ID gibt. So wie USERID's hier im Forum ).


    Zeig mal wie du CheckLeader bzw CheckMember aufrufst.

    Das hier ist kein Tutorial im Eigentlichen Sinne,sondern ein Tipp
    für alle die weiter kommen möchten mit ihren Scriptfähigkeiten indem sie Selbstständig
    ihre Fehler finden und beheben. Es soll euch helfen, eure Fehler im Code zu verstehen und zu beheben.


    Das Stichwort sind Debug-Notes oder einfach auch Debug-Nachrichten.
    Das sind Nachrichten bzw Texte, die ihr in euren Code einbaut, um nachzuvollziehen
    mit welchen Werten euer Script welchen Weg durchläuft ( Kein richtiger Weg, aber wir können
    uns die unzäglichen if / else if / else Bedinungen,Schleifen,Codeblöcke usw doch so vorstellen, oder ;]? )
    .
    Ich verwende sie persönlich sehr oft,denn es kommt immer mal wieder vor das einem Fehler unterlaufen.


    Debug-Notes werden verwendet, um den Grund zu finden, wieso etwas
    nicht so funktioniert, wie man es meistens möchte.


    Nehmen wir eine Ganz simple Abfrage, um zu prüfen ob iInput gleich iValue ist.
    Das Beispiel ist jetzt ziemlich banal, aber es soll nur die grobe Form darstellen wie
    es funktionieren soll.
    iInput könnte bspw eine globale Variable sein, die sich merkt, welcher Spieler zuletzt
    gejoint ist.



    new
    iInput = 14,
    iValue = 4;
    if(iInput == iValue) {
    // Code
    // Noch mehr Code
    // Code Ende
    }

    Nun gut. Sollte die Abfrage scheitern, hätten wir keine Informationen darüber, wieso es dazu kommt.
    Da wir in der Abfrage zwei Integer-Werte vergleichen,sollten wir uns diese
    doch am besten ausgeben lassen, falls die Abfrage false ergibt.



    new
    iInput = 14,
    iValue = 4;
    if(iInput == iValue) {
    // Code
    // Noch mehr Code
    // Code Ende
    }
    else {
    printf("DEBUG: iValue %d iInput %d",iValue,iInput);
    }

    Man kann auch direkt über die if() Abfrage die Debug-Notes einfügen.Ist Gewöhnungssache.

    new
    iInput = 14,
    iValue = 4;
    printf("DEBUG: iValue %d iInput %d",iValue,iInput);
    if(iInput == iValue) {
    // Code
    // Noch mehr Code
    // Code Ende
    }

    Das ist jetzt ein völlig frei erfundenes Beispiel, dass nur den Grundaufbau zeigt.Natürlich
    würde es in eurem Script viel weiter gehen und ihr solltet dann auch immer weitere Debug-Infos
    für euch hinzufügen,um dem Fehler auf die Spur zu kommen.



    public OnPlayerDeath(playerid,killerid,reason) {
    PlayerDeaths[playerid]++;
    PlayerKills[killerid]++;
    // Mehr Code
    printf("PlayerDeaths[%d] %d PlayerKills[%d] %d",playerid,PlayerDeaths[playerid],killerid,PlayerKills[killerid]);
    return 1;
    }
    Auch ein ziemlich simpler Code.Ich würde einfach mal tippen,dass Einigen nicht auffällt, dass
    dieser Code unter Umständen zu einem Stopp im Script kommt.
    Der Fehler kommt sehr häufig vor,ja, ich habe das manchmal auch übersehen.
    Angenommen man wird von einem Mitspieler getötet der die ID 15 hat.Man selber ist ID 4

    public OnPlayerDeath(playerid,killerid,reason) {
    PlayerDeaths[4]++;
    PlayerKills[15]++;
    // Mehr Code
    printf("PlayerDeaths[%d] %d PlayerKills[%d] %d",4,PlayerDeaths[4],15,PlayerKills[15]);
    return 1;
    }
    Alles Okay soweit.Der Code wird Fehlerfrei funktionieren.Was ist aber,wenn man Selbstmord begeht?
    ( Man muss ja immer alle Möglichkeiten durchtesten. )
    Dann ist die killerid INVALID_PLAYER_ID ( 0xFFFF ) oder auch 65535.Wir sind weiterhin ID 4.

    public OnPlayerDeath(playerid,killerid,reason) {
    PlayerDeaths[4]++;
    PlayerKills[65535]++; // index out of bounce! 65535 ist definitiv größer als MAX_PLAYERS
    // Wird nicht weiter ausgeführt - Mehr Code
    printf("PlayerDeaths[%d] %d PlayerKills[%d] %d",4,PlayerDeaths[4],15,PlayerKills[15]);
    return 1;
    }
    Jetzt würde man höchstwahrscheinlich erst gar nicht bis zum printf() im Code gelangen,da vorher
    mehr oder weniger der Code gestoppt wird. Jetzt bringt uns die Debug-Note leider nichts.
    Daher ist es oft noch hilfreich, einzelne Debug-Notes zu setzen um zu sehen, bis zu welcher Operation der Code Fehlerfrei läuft.
    Am besten ihr fügt auch eine Debug-Note ein,dass die Funktion überhaupt aufgerufen wurde.Dazu noch alle
    Parameter die übergeben werden.

    public OnPlayerDeath(playerid,killerid,reason) {
    printf("DEBUG: OnPlayerDeath( %d , %d , %d )",playerid,killerid,reason);
    PlayerDeaths[playerid]++;
    printf("DEBUG: 2");
    PlayerKills[killerid]++;
    printf("DEBUG: 3");
    // usw usf
    return 1;
    }
    Anhand der Debug-Notes solltet ihr auswerten können,wo der Fehler liegt. Natürlich muss
    man sich jetzt auch selber bischen anstrengen und den Fehler finden, doch so ist es definitiv
    leichter für jeden seine Fehler selber zu finden, ohne bei jeder Fehlermeldung nach Hilfe zu nachzufragen.


    In der Konsole ( serverlog ) wird ausgegeben bei Selbstmord:

    Zitat


    DEBUG: OnPlayerDeath( 4, 65535, 0 )
    DEBUG: 2


    Jetzt sollte wohl klar sein,dass es an folgender Zeile liegt:
    PlayerKills[killerid]++;


    Den letzten Schritt und den Fehler fixen müsst ihr aber selber machen. Ich
    geb den Code aber trotzdem mal richtig an:

    public OnPlayerDeath(playerid,killerid,reason) {
    printf("DEBUG: OnPlayerDeath( %d , %d , %d )",playerid,killerid,reason);
    PlayerDeaths[playerid]++;
    printf("DEBUG: 2");
    if( killerid != INVALID_PLAYER_ID ) {
    PlayerKills[killerid]++;
    printf("DEBUG: 3");
    }
    // usw usf
    return 1;
    }




    Nehmen wir ein weiteres Beispiel ( Aus dem Forum etwas gekürzt )

    // Folgende Variablen gibt es:
    //
    // new bool:Eingeloggt[MAX_PLAYERS];
    // new s[128];
    // weiteres:
    // #define DIALOG_REGISTER 5
    //
    // Es soll ein REGISTER Dialog erstellt werden.
    // Die Dialogid ist DIALOG_REGISTER ( 5 ) und es soll in dieses Fenster
    // ein Passwort eingegeben werden.
    // Der Code stand irgendwo hier im Forum ... ist nicht original von mir
    //
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == DIALOG_REGISTER)
    {
    if(!Eingeloggt[playerid])
    {
    if(response)
    {
    if(!strlen(inputtext))
    {
    GetPlayerName(playerid,Name,sizeof(Name));
    format(s,sizeof(s),"acc/%s.ini",Name);
    if(!dini_Exists(s))
    {
    dini_Create(s);
    dini_IntSet(s,"Passwort",udb_hash(inputtext));


    }
    }


    }
    }
    }
    return 1;
    }
    Dem Geschultem Auge wird relativ schnell auffallen wo der Fehler liegt.Nicht schlimm wenn man es
    nicht sieht.
    Wir kommen also nicht dahinter wo jetzt der Fehler liegt,was machen wir also?


    Wir könnten jetzt natürlich einen Thread im Forum erstellen mit einem Threadtitel,
    der nicht gerade Aussagekräftig ist und einer sehr geringen Information zum eigentlichem Problem. Nach
    spätestens 1Stunden pushen wir und fragen uns,wieso uns bisher keiner geholfen hat.


    Oder,wir fangen an den Code mit Debug-Notes zu füllen um nachvollziehen zu können,bis vohin
    der Code abläuft.
    Nun testen wir das ganze nochmal um auch die Debug-Notes zu erhalten mit den Daten die wir danach auswerten.
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    printf("OnDialogResponse(%d , %d , %d , %d , '%s')",playerid, dialogid, response, listitem, inputtext);
    printf("DEBUG: 1 - %d == %d ( dialogid == DIALOG_REGISTER )",dialogid,DIALOG_REGISTER);
    if(dialogid == DIALOG_REGISTER)
    {
    printf("DEBUG: 2 - %d ( !Eingeloggt[playerid] )",!Eingeloggt[playerid]);
    if(!Eingeloggt[playerid])
    {
    printf("DEBUG: 3 - %d ( response )",response);
    if(response)
    {
    printf("DEBUG: 4 - %d '%s' ( !strlen(inputtext) inputtext)",!strlen(inputtext),inputtext);
    if(!strlen(inputtext))
    {
    printf("DEBUG: 5");
    GetPlayerName(playerid,Name,sizeof(Name));
    printf("DEBUG: 6 - '%s' ( Name )",Name);
    format(s,sizeof(s),"acc/%s.ini",Name);
    printf("DEBUG: 7 - '%s' ( s )",s);
    printf("DEBUG: 8 - %d ( !dini_Exists(s) )",!dini_Exists(s));
    if(!dini_Exists(s))
    {
    printf("DEBUG: 9");
    dini_Create(s);
    printf("DEBUG: 10");
    dini_IntSet(s,"Passwort",udb_hash(inputtext));
    printf("DEBUG: 11");
    // usw.
    }
    }


    }
    }
    }
    return 1;
    }
    Haben wir das getan,sehen wir uns die Debug-Notes in der Log an.

    Zitat

    server_log.txt
    OnDialogResponse(0 , 5 , 1 , 0 , 'meinpasswort')
    DEBUG: 1 - 5 == 5 ( dialogid == DIALOG_REGISTER )
    DEBUG: 2 - 1 ( Eingeloggt[playerid] )
    DEBUG: 3 - 1 ( response )
    DEBUG: 4 - 0 'meinpasswort' ( !strlen(inputtext) inputtext)


    Wir wissen nun also bis wohin der Code abläuft anhand der Debug-Notes.
    Anscheinend geht es hier nicht mehr weiter
    if(!strlen(inputtext))
    Nun,schauen wir uns mal den Code genauer an. strlen() gibt die Länge des Strings zurück.
    In der Abfrage wollen wir aber überprüfen,ob die Länge des Strings 0 ist (!).Die Sache ist aber,dass
    wir als Passwort "meinpasswort" eingegeben haben.Die Länge ist also definitiv nicht 0. Sondern
    12 im Beispiel von "meinpasswort"


    Wir haben also den Fehler gefunden.Es liegt daran,dass wir fälschlicherweise in der Abfrage überprüfen,ob der
    String leer ist bzw keiner eingegeben wurde, anstatt zu schauen ob er überhaupt existiert
    if(strlen(inputtext))



    Natürlich,wozu ist das Ganze gut. Es soll dabei helfen, selbstständig seine Fehler zu finden anstatt immer
    von Anderen Hilfe in Anspruch zu nehmen. Klar ist das Forum dazu da, um euch bei Fehlern zu helfen,doch
    wäre es nicht besser, man schafft es auch alleine seine Fehler zu finden ? Falls man es wirklich nicht
    schafft seinen Fehler zu finden nachdem man es probiert hat durch die Debug-Notes, kann man immernoch nachfragen.




    Ich selber benutzen auch oft diese Technik um meine Fehler zu finden. Irgendwo schleicht sich doch bei
    jedem von uns der ein oder Andere Fehler ein, den wir nicht auf den ersten Blick sofort erkennen.
    Passend dazu habe ich mir vor langer Zeit auch eine kleine Funktion geschrieben,damit Ich mir
    Ingame die letzten Debug-Notes ansehen kann.
    Download < debugviewer >


    Include einfügen und an den Stellen,wo ihr eine Debug Nachricht einfügen wollt folgendes:

    Debug_AddEntry("Das ist ein %s mit %d Worten und pi %.2f", "Test",8,3.1415); // - Mit auto-format
    Debug_AddEntry("Das ist ein ein simpler Test",0); // - Falls kein format-Parameter,einfach 0 eintragen

    An der gewünschten Stelle noch
    Debug_ShowPanel(playerid)
    ,wenn ihr dem Spieler das Panel anzeigen wollt.




    Falls es noch Fragen,Anmerkungen oder Sonstiges gibt könnt ihr die natürlich gerne stellen :p

    Zeig mal den Abschnitt direkt unter OnPlayerText der mit "Weiter" bzw "fertig" zusammen hängt.


    public OnPlayerText(playerid, text[])
    {
    if( !strcmp(text,"weiter") ) {
    }
    return 1;
    }
    So wie EvilToastBrot schon sagte,würde es so auch klappen.


    Bist du dir denn sicher,dass die if Abfrage mit if(Skinauswahl[playerid] == 1) nicht scheitert ? Füg einfach mal Debug-Notes ein über der if Abfrage:

    printf("Skinauswahl[%d] = %d",playerid,Skinauswahl[playerid]);
    if(Skinauswahl[playerid] == 1){
    printf("text = '%s'",text);
    }

    Ist ja auch normal.
    Du müsstest dann per http://wiki.sa-mp.com/wiki/SetSpawnInfo den Skin des Spielers ändern. Dazu müsstest du aber auch wieder alle Daten wie Spawn-Pos usw wissen.Nicht die beste Lösung.


    Eine Andere Möglichkeit wäre,so mach Ich es zB, eine Variable zu haben und daran festlegen,ob der Skin geändert werden muss.



    #define INVALID_PLAYERSKIN -1
    new
    iPlayerSkin[MAX_PLAYERS];


    //OnPlayerConnect


    iPlayerSkin[playerid] = INVALID_PLAYERSKIN;


    // bei "fertig" mit SkinChange
    iPlayerSkin[playerid] = GetPlayerSkin(playerid);


    //OnPlayerSpawn


    if( iPlayerSkin[playerid] != INVALID_PLAYERSKIN) {
    SetPlayerSkin(playerid,iPlayerSkin[playerid]);
    }

    Was macht ihr denn da :( ?
    EvilToastBrot,
    Ne,so würde er immernoch folgendes machen müssen:
    skins[INDEX][0]


    So ist es doch am einfachsten:
    new
    skins[] = {
    280,
    281,
    282,
    284,
    283,
    288
    };


    Dann machst du
    skins[ INDEX ]
    anstatt
    skins[0][ INDEX ]
    // bzw
    skins[ INDEX ][0]


    Würde dann so aussehen:
    //OnPlayerText
    if(Skinauswahl[playerid] == 1)
    {
    new idx;
    new tmp[256];
    tmp = strtok(text, idx);
    if ((strcmp("weiter", tmp, true, strlen(tmp)) == 0) && (strlen(tmp) == strlen("weiter")))
    {
    if(GetPlayerFraktion(playerid) == 1)
    {
    if(CheckLeader(playerid))
    {
    if(GetPlayerSkin(playerid) == skins[4]){SetPlayerSkin(playerid,skins[5]);}
    if(GetPlayerSkin(playerid) == skins[5]){SetPlayerSkin(playerid,skins[4]);}
    return 0;
    }
    else if(CheckMember(playerid))
    {
    if(GetPlayerSkin(playerid) == skins[0]){SetPlayerSkin(playerid,skins[1]);}
    if(GetPlayerSkin(playerid) == skins[1]){SetPlayerSkin(playerid,skins[2]);}
    if(GetPlayerSkin(playerid) == skins[2]){SetPlayerSkin(playerid,skins[3]);}
    if(GetPlayerSkin(playerid) == skins[3]){SetPlayerSkin(playerid,skins[0]);}
    return 0;
    }
    }
    }
    else if ((strcmp("fertig", tmp, true, strlen(tmp)) == 0) && (strlen(tmp) == strlen("fertig")))
    {
    SetPlayerInt(playerid,"Skin",GetPlayerSkin(playerid));
    OnPlayerSpawn(playerid);
    SetCameraBehindPlayer(playerid);
    return 0;
    }
    }
    // Replace-Funktion von PAWNO benutzt