[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
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
  • Also habe es jetzt so ...


    new str21[64];
    format1(str21,sizeof(str21),"Payday: %d/60",PlayerInfo[playerid][pPlayMinutes]/*ersetzten mit deiner PayDay Variable*/);
    PlayerTextDrawSetString(playerid,Copyright,str21);


    Kommen aber wieder errors damit das str21 nie benutzt wird.

  • also das hier is das was ich habe...


    Copyright = TextDrawCreate(27.000000, 424.000000, "PayDay in : %d/60");
    TextDrawAlignment(Copyright,0);
    TextDrawBackgroundColor(Copyright,0x000000FF);
    TextDrawFont(Copyright, 3);
    TextDrawLetterSize(Copyright, 0.340000, 1.600000);
    //TextDrawColor(Copyright, 0xEB0000FF);
    TextDrawSetOutline(Copyright, 1);
    TextDrawSetProportional(Copyright, 1);
    TextDrawShowForAll(Copyright);


    Und


    new string21[64];
    format1(string,sizeof(string21),"Payday: %d/60",PlayerInfo[playerid][pPlayMinutes]/*ersetzten mit deiner PayDay Variable*/);
    PlayerTextDrawSetString(playerid,Copyright,string21);

  • Habe da mal ein kleines problem mit BlueG's MySQL Plugin (R39-2)


    Die mysql_log.txt sagt mir folgendes:


    SQL
    [13:34:16] [ERROR] cache_get_row_int - invalid datatype
    [13:34:16] [WARNING] CMySQLResult::GetRowData - invalid row ('1') or field index ('2')
    [13:34:16] [ERROR] cache_get_row_int - invalid datatype
    [13:34:16] [WARNING] CMySQLResult::GetRowData - invalid row ('1') or field index ('3')
    [13:34:16] [ERROR] cache_get_row_int - invalid datatype
    [13:34:16] [WARNING] CMySQLResult::GetRowData - invalid row ('2') or field index ('2')
    [13:34:16] [ERROR] cache_get_row_int - invalid datatype
    [13:34:16] [WARNING] CMySQLResult::GetRowData - invalid row ('2') or field index ('3')
    [13:34:16] [ERROR] cache_get_row_int - invalid datatype


    Code:


    new query[256];
    format(query, sizeof(query),"SELECT * FROM s_toptimes WHERE formap = '%s' ORDER BY timestamp LIMIT 5",RACE:(Map));
    mysql_tquery(mysqlHandle, query, "OnTopTimesLoaded");


    PUBLIC: OnTopTimesLoaded() then
    new rows, fields;
    cache_get_data(rows, fields);
    if(rows) then
    new ttTime[3];
    TextDrawSetFormat(TD_ttNames[0], "1. %s", GetUsernameFromDatabase(cache_get_row_int(0,2,mysqlHandle)));
    ConvertTimestamp(cache_get_row_int(0,3,mysqlHandle),ttTime[0],ttTime[1],ttTime[2]);
    TextDrawSetFormat(TD_ttTimes[0], "%d:%02d:%03d",ttTime[0],ttTime[1],ttTime[2]);


    if(rows > 1) then
    TextDrawSetFormat(TD_ttNames[1], "2. %s", GetUsernameFromDatabase(cache_get_row_int(1,2,mysqlHandle)));
    ConvertTimestamp(cache_get_row_int(1,3,mysqlHandle),ttTime[0],ttTime[1],ttTime[2]);
    TextDrawSetFormat(TD_ttTimes[1], "%d:%02d:%03d",ttTime[0],ttTime[1],ttTime[2]);
    end
    if(rows > 2) then
    TextDrawSetFormat(TD_ttNames[2], "3. %s", GetUsernameFromDatabase(cache_get_row_int(2,2,mysqlHandle)));
    ConvertTimestamp(cache_get_row_int(2,3,mysqlHandle),ttTime[0],ttTime[1],ttTime[2]);
    TextDrawSetFormat(TD_ttTimes[2], "%d:%02d:%03d",ttTime[0],ttTime[1],ttTime[2]);
    end
    if(rows > 3) then
    TextDrawSetFormat(TD_ttNames[3], "4. %s", GetUsernameFromDatabase(cache_get_row_int(3,2)));
    ConvertTimestamp(cache_get_row_int(3,3,mysqlHandle),ttTime[0],ttTime[1],ttTime[2]);
    TextDrawSetFormat(TD_ttTimes[3], "%d:%02d:%03d",ttTime[0],ttTime[1],ttTime[2]);
    end
    if(rows > 4) then
    TextDrawSetFormat(TD_ttNames[4], "5. %s", GetUsernameFromDatabase(cache_get_row_int(4,2)));
    ConvertTimestamp(cache_get_row_int(4,3,mysqlHandle),ttTime[0],ttTime[1],ttTime[2]);
    TextDrawSetFormat(TD_ttTimes[4], "%d:%02d:%03d",ttTime[0],ttTime[1],ttTime[2]);
    end
    end
    end


    stock GetUsernameFromDatabase(userid) then
    new uName[32];
    format(uName, sizeof(uName), "Guenther");

    new query[257];
    format(query, sizeof(query),"SELECT * FROM sw_accounts WHERE userid = '%d'",userid);
    mysql_query(mysqlHandle, query, true);
    new rows,fields;
    cache_get_data(rows, fields);
    if(rows) then
    new temp[32];
    cache_get_row(0,1,temp,mysqlHandle,sizeof(temp));
    SendFormatToAll(-1, "Username: %s", temp);
    end
    return uName;
    end


    Tabellen:


    Ich sehe da keinen fehler
    Wenn mir irgentjemand sagen könnte was ich falsch gemacht habe, fände ich das echt super :thumbup:


    (Fragt nicht warum ich then und end benutze.. bin einfach nur faul)

  • Okay Funktioniert. Nur sieht das mit dem Payday jetzt so aus.




    Und zu meiner 2ten Frage.


    Ich habe nun das /ajail so eingefügt


    if(strcmp(cmd, "/ajail", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /ajail [Spieler ID / Name] [Zeit in Minuten] [Grund]");
    return 1;
    }
    new playa;
    new money, tmp2[256];
    playa = ReturnUser(tmp);
    tmp2 = strtok(cmdtext, idx);
    money = strval(tmp2);
    if(!strlen(cmdtext[strlen(tmp)+strlen(tmp2)+2]))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /ajail [Spieler ID / Name] [Zeit in Minuten] [Grund]");
    return 1;
    }
    if(playa == playerid)
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Du kannst nicht dich selber einsperren!");
    return 1;
    }
    if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playa][pAdmin])
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Du kannst keinen höherrangigen Admin einsperren!");
    return 1;
    }
    if (PlayerInfo[playerid][pAdmin] >= 1)
    {
    if(IsPlayerConnected(playa))
    {
    if(playa != INVALID_PLAYER_ID)
    {
    GetPlayerName(playa, giveplayer, sizeof(giveplayer));
    GetPlayerName(playerid, sendername, sizeof(sendername));
    format(string, sizeof(string), "* Du hast %s eingesperrt. Grund: %s", giveplayer,cmdtext[strlen(tmp)+strlen(tmp2)+2]);
    SendClientMessage(playerid, COLOR_LIGHTRED, string);
    format(string, sizeof(string), "* Du wurdest von Admin %s in das Admin-Jail gesperrt. Grund: %s", sendername,cmdtext[strlen(tmp)+strlen(tmp2)+2]);
    SendClientMessage(playa, COLOR_LIGHTRED, string);
    ResetPlayerWeapons(playa);
    WantedPoints[playa] = 0;
    PlayerInfo[playa][pJailed] = 1;
    PlayerInfo[playa][pJailTime] = money*60;
    SetPlayerInterior(playa, 3);
    SetPlayerPos(playa, 197.8290,161.8141,1003.0300);
    format(string, sizeof(string), "Du wurdest für %d Minuten eingesperrt.[Zu unrecht ? Melde dich im Teamspeak3]", money);
    SendClientMessage(playa, COLOR_LIGHTBLUE, string);
    }
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD1, " Du darfst diesen Befehl nicht benutzen!");
    }
    }
    return 1;
    }


    Nur zeigt er nicht nur den Grund an sondern alles vorher auch.


    so siehts dann aus ^^

  • cache_get_data(rows, fields);


    Schreib mal darunter:


    printf("rows: %d | fields: %d",rows,fields);


    Nur sieht das mit dem Payday jetzt so aus.


    Zeig uns mal wie du dir das anzeigen lässt :)


    Und zu dem Command...why no using sscanf?!


    if(strcmp(cmd, "/ajail", true) == 0)
    {
    if(!PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid, COLOR_GRAD1, " Du darfst diesen Befehl nicht benutzen!");
    tmp = strtok(cmdtext, idx);
    if(!tmp[0]) return SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /ajail [Spieler ID / Name] [Zeit in Minuten] [Grund]");
    new playa, money, grund[64];
    if(sscanf(tmp,"uds[64]",playa,money,grund)) return SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /ajail [Spieler ID / Name] [Zeit in Minuten] [Grund]");
    if(playa == playerid) return SendClientMessage(playerid, COLOR_GRAD1, "Du kannst nicht dich selber einsperren!");
    if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playa][pAdmin]) return SendClientMessage(playerid, COLOR_GRAD1, "Du kannst keinen höherrangigen Admin einsperren!");
    if(!IsPlayerConnected(playa)) return SendClientMessage(playerid, COLOR_GRAD1, "Ein Spieler mit dieser ID ist nicht online!");
    GetPlayerName(playa, giveplayer, sizeof(giveplayer)),GetPlayerName(playerid, sendername, sizeof(sendername));
    format(string, sizeof(string), "* Du hast %s eingesperrt. Grund: %s", giveplayer,grund);
    SendClientMessage(playerid, COLOR_LIGHTRED, string);
    format(string, sizeof(string), "* Du wurdest von Admin %s in das Admin-Jail gesperrt. Grund: %s", sendername,grund);
    SendClientMessage(playa, COLOR_LIGHTRED, string);
    ResetPlayerWeapons(playa),WantedPoints[playa] = 0;
    PlayerInfo[playa][pJailed] = 1;
    PlayerInfo[playa][pJailTime] = money*60;
    SetPlayerInterior(playa, 3);
    SetPlayerPos(playa, 197.8290,161.8141,1003.0300);
    format(string, sizeof(string), "Du wurdest für %d Minuten eingesperrt.[Zu unrecht ? Melde dich im Teamspeak3]", money);
    return SendClientMessage(playa, COLOR_LIGHTBLUE, string);
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • printf("rows: %d | fields: %d",rows,fields);



    Schreib mal darunter:


    printf("rows: %d | fields: %d",rows,fields);


    Code
    [13:57:12]   Filterscript '../scriptfiles/Maps/Detrimental Depth II/Detrimental Depth II.amx' loaded.
    [13:57:12] OnTopTimesLoaded: rows: 2 | fields: 4
    [13:57:12] GetUsernameFromDatabase: rows: 1 | fields: 5
    [13:57:12] GetUsernameFromDatabase: rows: 0 | fields: 5
  • IntelCore.I7:


    Spoiler anzeigen
    if(strcmp(cmd, "/ajail", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /ajail [Spieler ID / Name] [Zeit in Minuten] [Grund]");
    return 1;
    }
    new playa;
    new money, tmp2[256];
    playa = ReturnUser(tmp);
    tmp2 = strtok(cmdtext, idx);
    money = strval(tmp2);
    if(!strlen(cmdtext[strlen(cmd)+strlen(tmp)+strlen(tmp2)+2]))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /ajail [Spieler ID / Name] [Zeit in Minuten] [Grund]");
    return 1;
    }
    if(playa == playerid)
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Du kannst nicht dich selber einsperren!");
    return 1;
    }
    if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playa][pAdmin])
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Du kannst keinen höherrangigen Admin einsperren!");
    return 1;
    }
    if (PlayerInfo[playerid][pAdmin] >= 1)
    {
    if(IsPlayerConnected(playa))
    {
    if(playa != INVALID_PLAYER_ID)
    {
    GetPlayerName(playa, giveplayer, sizeof(giveplayer));
    GetPlayerName(playerid, sendername, sizeof(sendername));
    format(string, sizeof(string), "* Du hast %s eingesperrt. Grund: %s", giveplayer,cmdtext[strlen(cmd)+strlen(tmp)+strlen(tmp2)+2]);
    SendClientMessage(playerid, COLOR_LIGHTRED, string);
    format(string, sizeof(string), "* Du wurdest von Admin %s in das Admin-Jail gesperrt. Grund: %s", sendername,cmdtext[strlen(cmd)+strlen(tmp)+strlen(tmp2)+3]);
    SendClientMessage(playa, COLOR_LIGHTRED, string);
    ResetPlayerWeapons(playa);
    WantedPoints[playa] = 0;
    PlayerInfo[playa][pJailed] = 1;
    PlayerInfo[playa][pJailTime] = money*60;
    SetPlayerInterior(playa, 3);
    SetPlayerPos(playa, 197.8290,161.8141,1003.0300);
    format(string, sizeof(string), "Du wurdest für %d Minuten eingesperrt.[Zu unrecht ? Melde dich im Teamspeak3]", money);
    SendClientMessage(playa, COLOR_LIGHTBLUE, string);
    }
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD1, " Du darfst diesen Befehl nicht benutzen!");
    }
    }
    return 1;
    }


    Ich hatte übersehen, dass du den Befehl auch schon mit strtok splittest. So sollte es gehen.


    Zwecks des PayDays: Du musst den anzuzeigenden Text mit einem "format" formatieren.



    Ich darf nochmal daran erinnern, dass dieser Thread für kleine Scripting Fragen ist, und nicht zum debuggen von MySQL Codes oder sonstigen langen Codes. Dafür kann man einen eigenen Thread machen, das wahrt die Übersichtlichkeit des Forums und vor allem des Threads.

  • Der Ajail funktioniert nun.



    Und zu dem Payday so sieht es aus.


    Copyright = TextDrawCreate(27.000000, 424.000000, "PayDay in : %d/60");
    TextDrawAlignment(Copyright,0);
    TextDrawBackgroundColor(Copyright,0x000000FF);
    TextDrawFont(Copyright, 3);
    TextDrawLetterSize(Copyright, 0.340000, 1.600000);
    //TextDrawColor(Copyright, 0xEB0000FF);
    TextDrawSetOutline(Copyright, 1);
    TextDrawSetProportional(Copyright, 1);
    TextDrawShowForAll(Copyright);

  • Ja, wie gesagt, du musst es formatieren:
    new strx[32];
    format(strx, sizeof(strx), "PayDay in: %d/60", ZEIT_WANN_PAYDAY);
    TextDrawSetString(Copyright, strx);


    ZEIT_WANN_PAYDAY eben mit der Variable ersetzen, die du hast um runterzuzählen wann PayDay ist.
    Logischerweise musst du das auch in einen Timer packen, damit es aktualisiert wird.

  • Du musst die Textdraw-Variable "Copyright" (warum auch immer die so heißt) als Array anlegen, da ja jeder sein eigenes TextDraw hat.
    Sprich so:
    new PlayerText:Copyright[MAX_PLAYERS];


    Und alle Zugriffe auf "Copyright" zu "Copyright[playerid] ändern.


    Ansonsten passt es eigentlich, da sollten keine Fehler auftreten.

  • Also ich komme gerade nich so ganz klar :D


    Ich versuche es so zu ändern wie du sagst doch dann kommen 15 errors.


    Also was ich zurzeit habe is.




    new PlayerText:Copyright[MAX_PLAYERS];


    Das steht bei onplayercennect


    TextDrawShowForPlayer(playerid,Copyright);


    Das bei OnplayerSpawn


    TextDrawShowForPlayer(playerid,Copyright);


    Copyright = TextDrawCreate(27.000000, 424.000000, "PayDay in : %d/60");
    TextDrawAlignment(Copyright,0);
    TextDrawBackgroundColor(Copyright,0x000000FF);
    TextDrawFont(Copyright, 3);
    TextDrawLetterSize(Copyright, 0.340000, 1.600000);
    //TextDrawColor(Copyright, 0xEB0000FF);
    TextDrawSetOutline(Copyright, 1);
    TextDrawSetProportional(Copyright, 1);
    TextDrawShowForAll(Copyright);


    new string21[64];
    format(string,sizeof(string21),"Payday: %d/60",PlayerInfo[playerid][pPlayMinutes]/*ersetzten mit deiner PayDay Variable*/);
    PlayerTextDrawSetString(playerid,Copyright,string21);

  • Hallo, irgendwie geht mein Ban befehl nicht.



    Das ist der Befehl:

    Spoiler anzeigen


    if(strcmp(cmd, "/ban", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /ban [playerid] [grund]");
    return 1;
    }
    giveplayerid = ReturnUser(tmp);
    if (PlayerInfo[playerid][pAdmin] >= 1)
    {
    if(IsPlayerConnected(giveplayerid))
    {
    if(giveplayerid != INVALID_PLAYER_ID)
    {
    GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
    GetPlayerName(playerid, sendername, sizeof(sendername));
    new length = strlen(cmdtext);
    while ((idx < length) && (cmdtext[idx] <= ' '))
    {
    idx++;
    }
    new offset = idx;
    new result[64];
    while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
    {
    result[idx - offset] = cmdtext[idx];
    idx++;
    }
    result[idx - offset] = EOS;
    if(!strlen(result))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /ban [playerid] [grund]");
    return 1;
    }
    if(PlayerInfo[giveplayerid][pAdmin] > PlayerInfo[playerid][pAdmin] > PlayerInfo[playerid][pSupporter])
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Du kannst diesen Spieler nicht bannen, da er ein höheres Adminlevel hat als du!");
    return 1;
    }
    new year, month,day;
    getdate(year, month, day);
    KickTimer(giveplayerid);
    format(string, sizeof(string), "AdmCmd: %s wurde von %s gebannt, Grund: %s (%d-%d-%d)", giveplayerid, sendername, (result),month,day,year);
    BanLog(string);
    format(string, sizeof(string), "AdmCmd: %s wurde von %s gebannt, Grund: %s", giveplayerid, sendername, (result));
    SendClientMessageToAll(COLOR_LIGHTRED, string);
    format(string, sizeof(string), "AdmCmd: Du wurdest von %s gebannt, Grund: %s", sendername, (result));
    SendClientMessage(giveplayerid,COLOR_LIGHTRED, string);
    PlayerInfo[giveplayerid][pGesperrt] = 1;
    return 1;
    }
    }//not connected
    }
    else
    {
    format(string, sizeof(string), " %d ist kein aktiver Spieler.", giveplayerid);
    SendClientMessage(playerid, COLOR_GRAD1, string);
    }
    }
    return 1;
    }


    Wenn er sich einloggt soll er gekickt werden :


    Bei OnPlayerLogin:

    if(PlayerInfo[playerid][pGesperrt] == 1)
    {
    format(string2,sizeof(string2)," %s versucht mit seinem gebannten Account online zu kommen und wurde gekickt!",playername2);
    ABroadCast(COLOR_LIGHTRED,string2,1);
    SendClientMessage(playerid,COLOR_ROT," Du bist hier gebannt. Schau im Forum für mehr Informationen");
    Kick(playerid);
    return 1;
    }



    Aber ich kann mich trotzdem wieder einloggen.
    Warum das ? :/

  • IntelCore.I7:
    Du sollte alle "Copyright" mit "Copyright[playerid]" ersetzen. Alleine in dem Code den du gepostet hast sehe ich noch mindestens 10 nicht umgeänderte.


    Corvus: Wie hast du buscars und respawnL deklariert?


    Saphire:

    Ich darf nochmal daran erinnern, dass dieser Thread für kleine Scripting Fragen ist, und nicht zum debuggen von MySQL Codes oder sonstigen langen Codes. Dafür kann man einen eigenen Thread machen, das wahrt die Übersichtlichkeit des Forums und vor allem des Threads.


    Außerdem solltest du zeigen, wie du "PlayerInfo[playerid][pGesperrt]" aus der Datei/Datenbank lädst. In einem eigenen Thread bitte.


  • //ADMINNACHRICHTEN
    stock SendAdminMessage(farbe,string[])
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(sSpieler[i][Adminlevel] >= 1)
    {
    SendClientMessage(i, farbe, string);
    }
    }
    }


    Muss daran auch was geändert werden?

  • Nein, die Funktion SendAdminMessage sieht perfekt aus. Schau mal ob das so funktioniert ;)