Befehl crasht den Server

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Abend zusammen,


    Mein Vekleiden Befehl crasht den Server leider. Kurze Erklärung: Ich habe so eine Art Decknamen gescriptet und wenn der Spieler diesen dann abruft, crasht auf einmal der ganze Server..


    Kann wer mir eventuell sagen was ich falsch gemacht habe ? :wacko:


  • Okey habe das mit dem Crash gefixxt jedoch wird der Name des Users nicht getauscht.. Bzw der Dackname wird immernoch nicht angezeigt nur der Spielername..



    COMMAND:verkleiden(playerid,params[])
    {
    if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du kannst keine Befehle nutzen,da du im Tutorial bist.");
    if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt!");
    if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,WRONGCMD,"Du bist im AFK-Modus und kannst somit keine Befehle nutzen."),SendClientMessage(playerid,WRONGCMD,"BENUTZE: /back");
    if(Spieler[playerid][pInPrison] == 1)return SendClientMessage(playerid,GRAU,"Du bist im Prison.");
    if(Spieler[playerid][pFriedhof] == 1)return SendClientMessage(playerid,GRAU,"Du bist Tot.");
    if(Spieler[playerid][pDeath] == 1)return SendClientMessage(playerid,GRAU,"Du bist verletzt.");
    if(Spieler[playerid][pJailed] != 0)return SendClientMessage(playerid,GRAU,"Du bist im Gefängnis.");
    if(Spieler[playerid][pTazerd] == 1)return SendClientMessage(playerid,GRAU,"Du bist K.O/getazert.");
    if(Spieler[playerid][pCuffed] == 1)return SendClientMessage(playerid,GRAU,"Du bist gefesselt.");
    new string[24],cmdtext[20],query[256];
    if(Paintball[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du bist in der Paintball Arena und kannst somit nicht Maskiert sein.");
    if(!isPlayerInFrakt(playerid,19))return SendClientMessage(playerid,GRAU,"Du bist nicht in der jeweiligen Fraktion.");
    if(Spieler[playerid][pHaveMaske] == 0)return SendClientMessage(playerid,GRAU,"Du trägst keine Maske mit dir.");
    if(Spieler[playerid][pAdminOnduty] == true)return SendClientMessage(playerid,GRAU,"Du bist im Admindienst.");
    if(sscanf(params,"s[20]",cmdtext))return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /verkleiden [Absetzen/SWAT/Undercover/Maske]");
    if(strcmp(cmdtext,"Undercover",true) == 0)
    {
    if(Spieler[playerid][pMaske] == 1)return SendClientMessage(playerid,GRAU,"Du trägst bereits eine Tarnung.");
    Spieler[playerid][pMaske] = 1;
    //format(string,sizeof(string),"%s",Spieler[playerid][pDeckname]);
    SetPlayerName(playerid,Spieler[playerid][pDeckname]);
    SetPlayerScore(playerid,random(3) + 10);
    SetPlayerSkin(playerid,Spieler[playerid][pFraktSkin]);
    SendClientMessage(playerid,SORBLAU,"** Du ziehst deine Tarnung auf **");
    mysql_format(MySqlConnection,query,sizeof(query),"SELECT * FROM "#SQLTAG"_account_main WHERE Deckname = '%s'",Spieler[playerid][pDeckname]);
    mysql_function_query(MySqlConnection,query,false,"","");
    return 1;
    }
    return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /verkleiden [Absetzen/SWAT/Undercover/Maske]");
    }

  • Kleiner Tipp: Du kannst an einem vorherigen Punkt abfragen, ob der Spieler im Tutorial oder eingeloggt ist.
    Ich vermute mal ganz wild, dass dieser Beffehl für einen Roleplay Server ist, weshalb das meiste Dialog oder TD -basiert ist, besonders vor dem Login/ während der Registration. So kann man einige Zeilen sparen, auch wenn einige gerne mit ihrer Scriptgröße um ihre Qualitäten werben :P


    Zurück zum Problem,


    Zitat von wiki.sa-mp.com
    • Changing the players' name to the same name but with different character cases (e.g. "John" to "JOHN") will not work.
    • If used in OnPlayerConnect, the new name will not be shown for the connecting player.
    • Passing a null string as the new name will crash the server.
    • Player names can be up to 24 characters when using this function, but when joining the server from the SA-MP server browser, players' names must be no more than 20 and less than 3 characters (the server will deny entry). This allows for 4 characters extra when using SetPlayerName.

    Schau am besten nach, ob "Spieler[playerid][pDeckname]" tatsächlich kein Integer, sondern ein String ist und nicht dem originalen Spielernamen entspricht. Eventuell ist der Server genau deswegen abgestürzt bzw. wird keine Änderung angezeigt.
    Du kannst ja mal eine Clientmessage an dich selbst versenden. Beim DEBUG erfährst du immer Dinge,.. meine Güte.

    Code
    new debugString[128];
    format(debugString), sizeof(debugString), "[DEBUG] Name: %s Skin: %i", Spieler[playerid][pDeckname], Spieler[playerid][pFraktSkin]);
    SendClientMessage(playerid, WEISS, debugString); 
    //alternativ: print(debugString); oder printf(..) verwenden :)

    Jetzt habe ich schon so viel geschrieben, da hab ich doch glatt was übersehen.
    Ich verwende nicht das Query-basierte MYSQL-Zeug von BlueG, auch wenn es sinnvoller wäre, aber ich vermute, dass du den Namen erst nach dem festlegen des Namens lädst. Setze einfach mal das SetPlayerName(blabla..) hinter den mysql_function_query.


    Sorry für die Verwirrung c:
    Trotzdem kannst du dir das mit dem DEBUG zu Herzen nehmen. Kannst du auch in der Konsole ausgeben, macht kein Unterschied, musst du nur immer das Spiel verlassen :)

  • Hier die Befehle für Decknamen vergeben und Decknamen verkleiden



    COMMAND:setdeckname(playerid,params[])
    {
    if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du kannst keine Befehle nutzen,da du im Tutorial bist.");
    if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt!");
    if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,WRONGCMD,"Du bist im AFK-Modus und kannst somit keine Befehle nutzen."),SendClientMessage(playerid,WRONGCMD,"BENUTZE: /back");
    new pID,deckname[MAX_PLAYER_NAME],query[256];
    if(!isPlayerInFrakt(playerid,19))return SendClientMessage(playerid,GRAU,"Du bist nicht in der jeweiligen Fraktion.");
    if(!isPlayerAMember(playerid,6))return SendClientMessage(playerid,GRAU,"Du besitzt nicht den jeweiligen Rang.");
    if(sscanf(params,"us[24]",pID,deckname))return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /setdeckname [playerid/Name][Neuername]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid,GRAU,"Der angegebene Spieler ist nicht eingeloggt!");
    if(GetPVarInt(pID,"Eingeloggt") == 0)return SendClientMessage(playerid,GRAU,"Der angegebene Spieler ist nicht eingeloggt!");
    if(IsPlayerNPC(pID))return SendClientMessage(playerid,GRAU,"Das kannst du nicht!");
    if(!strcmp(deckname,Spieler[pID][pDeckname]) && Spieler[pID][pDeckname][0] != EOS)return SendClientMessage(playerid,GRAU,"Spieler hat bereits den selben Decknamen!");
    //if(!strcmp(deckname,Spieler[pID][pDeckname],true))return SendClientMessage(playerid,GRAU,"Spieler hat bereits den selben Decknamen!");
    mysql_format(MySqlConnection,query,sizeof(query),"SELECT * FROM "#SQLTAG"_account_main WHERE Deckname = '%s'",deckname);
    mysql_function_query(MySqlConnection,query,true,"OnQueryFinish2","ssiiii",query,deckname,_SQL_SETDECKNAME_QUERY,playerid,pID,MySqlConnection);
    return 1;
    }


    case _SQL_SETDECKNAME_QUERY:
    {
    cache_get_data(rows,fields);
    if(rows)
    {
    SendClientMessage(extraid,GRAU,"Name wir schon verwendet.");
    return 1;
    }
    mysql_format(MySqlConnection,query,sizeof(query),"UPDATE "#SQLTAG"_account_main SET Deckname='%s' WHERE Name='%s'",index2,Spieler[extraid2][pName]);
    mysql_function_query(MySqlConnection,query,false,"","");
    mysql_format(MySqlConnection,query,sizeof(query),"Du hast den Decknamen von %s zu %s umbenannt!",Spieler[extraid2][pName],index2);
    SendClientMessage(extraid,GELB,query);
    mysql_format(MySqlConnection,query,sizeof(query),"SpezialBefehl: Der Leader %s (ID:%i) hat deinen Decknamen in %s umgeändert. Dein Account wurde geupdatet!",Spieler[extraid][pName],extraid,index2);
    SendClientMessage(extraid2,GELB,query);
    return 1;
    }


    COMMAND:verkleiden(playerid,params[])
    {
    if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du kannst keine Befehle nutzen,da du im Tutorial bist.");
    if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt!");
    if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,WRONGCMD,"Du bist im AFK-Modus und kannst somit keine Befehle nutzen."),SendClientMessage(playerid,WRONGCMD,"BENUTZE: /back");
    if(Spieler[playerid][pInPrison] == 1)return SendClientMessage(playerid,GRAU,"Du bist im Prison.");
    if(Spieler[playerid][pFriedhof] == 1)return SendClientMessage(playerid,GRAU,"Du bist Tot.");
    if(Spieler[playerid][pDeath] == 1)return SendClientMessage(playerid,GRAU,"Du bist verletzt.");
    if(Spieler[playerid][pJailed] != 0)return SendClientMessage(playerid,GRAU,"Du bist im Gefängnis.");
    if(Spieler[playerid][pTazerd] == 1)return SendClientMessage(playerid,GRAU,"Du bist K.O/getazert.");
    if(Spieler[playerid][pCuffed] == 1)return SendClientMessage(playerid,GRAU,"Du bist gefesselt.");
    new string[24],cmdtext[20];
    if(Paintball[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du bist in der Paintball Arena und kannst somit nicht Maskiert sein.");
    if(!isPlayerInFrakt(playerid,19))return SendClientMessage(playerid,GRAU,"Du bist nicht in der jeweiligen Fraktion.");
    if(Spieler[playerid][pHaveMaske] == 0)return SendClientMessage(playerid,GRAU,"Du trägst keine Maske mit dir.");
    if(Spieler[playerid][pAdminOnduty] == true)return SendClientMessage(playerid,GRAU,"Du bist im Admindienst.");
    if(sscanf(params,"s[20]",cmdtext))return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /verkleiden [Absetzen/SWAT/Undercover/Maske]");
    if(strcmp(cmdtext,"Undercover",true) == 0)
    {
    if(Spieler[playerid][pMaske] == 1)return SendClientMessage(playerid,GRAU,"Du trägst bereits eine Tarnung.");
    Spieler[playerid][pMaske] = 1;
    SetPlayerScore(playerid,random(3) + 10);
    SetPlayerSkin(playerid,Spieler[playerid][pFraktSkin]);
    format(string,sizeof(string),"%s",Spieler[playerid][pDeckname]);//Der Name undbekannt wird gesetzt, Leben & Rüstung wird eingesetzt
    SetPlayerChatBubble(playerid,string,0xFF0000FF,40.0,10000);//Das ganze steht über dem Namen
    SendClientMessage(playerid,SORBLAU,"** Du ziehst deine Tarnung auf **");
    return 1;
    }
    return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /verkleiden [Absetzen/SWAT/Undercover/Maske]");
    }



  • Du weißt Spieler[pID][pDeckname] nichts zu.
    Was genau kommt denn raus wenn du im setdeckname CMD unten den string des decknamen printest?
    Hat der Spieler bestimmte Decknamen oder freiwählbar?
    Wenn sie freiwählbar sind musst du im CMD auch


    Spieler[pID][pDeckname] = deckname;SetPlayerName(playerid, deckname);



    nutzen, dann wird es sofort INGame aktualisiert und in pDeckname gespeichert.
    ggf. falls du den Decknamen erst beim verkleiden setzen möchtest, dann das SetPlayerName dort einfügen.

    KleineHilfe 2.0

  • Hier mal die Prints:
    [20:17:54] (Setdeckname)Deckname: SadiQ | Spieler[Deckname]: N/V


    Wenn ich dann Verkleiden mache, stürzt der server ab und dann printet er den cmd verkleiden nicht



    COMMAND:verkleiden(playerid,params[])
    {
    if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du kannst keine Befehle nutzen,da du im Tutorial bist.");
    if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt!");
    if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,WRONGCMD,"Du bist im AFK-Modus und kannst somit keine Befehle nutzen."),SendClientMessage(playerid,WRONGCMD,"BENUTZE: /back");
    if(Spieler[playerid][pInPrison] == 1)return SendClientMessage(playerid,GRAU,"Du bist im Prison.");
    if(Spieler[playerid][pFriedhof] == 1)return SendClientMessage(playerid,GRAU,"Du bist Tot.");
    if(Spieler[playerid][pDeath] == 1)return SendClientMessage(playerid,GRAU,"Du bist verletzt.");
    if(Spieler[playerid][pJailed] != 0)return SendClientMessage(playerid,GRAU,"Du bist im Gefängnis.");
    if(Spieler[playerid][pTazerd] == 1)return SendClientMessage(playerid,GRAU,"Du bist K.O/getazert.");
    if(Spieler[playerid][pCuffed] == 1)return SendClientMessage(playerid,GRAU,"Du bist gefesselt.");
    new string[24],cmdtext[20],deckname[MAX_PLAYER_NAME];
    if(Paintball[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du bist in der Paintball Arena und kannst somit nicht Maskiert sein.");
    if(!isPlayerInFrakt(playerid,19))return SendClientMessage(playerid,GRAU,"Du bist nicht in der jeweiligen Fraktion.");
    if(Spieler[playerid][pHaveMaske] == 0)return SendClientMessage(playerid,GRAU,"Du trägst keine Maske mit dir.");
    if(Spieler[playerid][pAdminOnduty] == true)return SendClientMessage(playerid,GRAU,"Du bist im Admindienst.");
    if(sscanf(params,"s[20]",cmdtext))return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /verkleiden [Absetzen/SWAT/Undercover/Maske]");
    if(strcmp(cmdtext,"Undercover",true) == 0)
    {
    if(Spieler[playerid][pMaske] == 1)return SendClientMessage(playerid,GRAU,"Du trägst bereits eine Tarnung.");
    Spieler[playerid][pMaske] = 1;
    SetPlayerScore(playerid,random(3) + 10);
    SetPlayerSkin(playerid,Spieler[playerid][pFraktSkin]);
    Spieler[playerid][pDeckname] = deckname;
    SetPlayerName(playerid, deckname);
    SendClientMessage(playerid,SORBLAU,"** Du ziehst deine Tarnung auf **");
    printf("(Verkleiden)Deckname: %s | Spieler[Deckname]: %s", deckname, Spieler[playerid][pDeckname]);
    return 1;
    }
    return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /verkleiden [Absetzen/SWAT/Undercover/Maske]");
    }

  • Du weißt dem string immernoch keinen Wert zu.
    Du hast einen leeren string gespeichert, du musst es außerdem im anderen CMD speichern.
    Vermutlich crasht der Server weil du falsch returnst, wie auch immer das zu compilen war.


    TeamViewer? (-> PM)

    KleineHilfe 2.0

    Einmal editiert, zuletzt von YaBroo ()

  • @YaBroo @tayson87 dann postet doch wenigstens woran es lag und wie ihr das behoben habt damit andere mit änhlichen oder glichen problem auch was von haben.

    Ich hatte oben schon mehrfach beschrieben woran es lag und was zu machen ist,
    Der Grund warum sein Server gecrasht ist und seine 1. Funktion komplett nicht funktionierte.
    Der Fehler / Crash seiner 2. Funktion war individuell & teilweise anderweitig im Script verborgen.

    KleineHilfe 2.0