[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
  • Hallo, habe eine kleine Funktion erstellt womit ein Report zu den Admins gesendet wird, nur scheint sie leider nicht zu funktionieren.
    Jemand ne Idee woran es liegt?



    if(SobeitReports == true)
    {
    SobeitAutoBan = false;
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    new string[144];
    format(string, sizeof(string), "{FF0000}Report: {FFFFFF}%s {FF0000}(Sobeit)",name);
    SendSobeitReportToAdmins(-1, string);
    return 1;
    }



    SendSobeitReportToAdmins(color, message[])
    {
    LOOP_PLAYERS(i)
    {
    if(IsPlayerAdmin(i) || CheckAdminName(i))
    {
    SendClientMessage(i, color, message);
    }
    }
    return 1;
    }


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Hai,
    also mein Stock wird ausgeführt und auch in der Tabelle eingetragen, aber ich erhalter komischerweiße immer diesen "Fehler" in der mysql_log,


    Die Log:



    [03:50:23] [WARNING] cache_get_row_count - no active cache
    [03:50:23] [WARNING] cache_get_query_exec_time - no active cache
    [03:50:23] [WARNING] cache_get_row_count - no active cache
    [03:50:23] [WARNING] cache_get_row_count - no active cache
    [03:50:23] [WARNING] cache_get_query_exec_time - no active cache
    [03:50:23] [WARNING] cache_get_row_count - no active cache


    Der Stock der ausgeführt wird:



    stock CreateATM(playerid, name[])
    {
    new query[512];
    for(new i; i < MAX_ATMS; i++)
    {
    if(ATMInfo[i][set] == false)
    {
    GetPlayerPos(playerid, ATMInfo[i][aX], ATMInfo[i][aY], ATMInfo[i][aZ]);
    GetPlayerFacingAngle(playerid, ATMInfo[i][aA]);
    format(ATMInfo[i][aName], 40, "%s", name);
    TeleInfo[i][set] = true;
    format(query, 512, "INSERT INTO `atms` (`aX`, `aY`, `aZ`, `aA`, `aName`) VALUES ('%f', '%f', '%f', '%f', '%s')", ATMInfo[i][aX], ATMInfo[i][aY], ATMInfo[i][aZ], ATMInfo[i][aA], name);
    mysql_tquery(Handle, query);
    SendClientMessage(playerid, FARBE_WEISS, "[{00FF00}INFO{FFFFFF}]: Du hast ein ATM erstellt.");
    CreateObject(19324, ATMInfo[i][aX], ATMInfo[i][aY], ATMInfo[i][aZ] - 0.5, 0, 0, ATMInfo[i][aA]);
    break;
    }
    }
    return 1;
    }

    Mit freundlichen Grüßen, BlvckAir :thumbup:

  • Im Zusammenhang mit dem was du an Code gepostet hast werden die Funktion dort nicht aufgerufen. Dort scheint der Fehler also nicht zu liegen.


    Grundsätzlich kommt der Fehler auf, da du versuchst einen Cache auszulesen, wo es keinen gibt. An welcher Stelle das ist, ist aus dem Log nicht erkennbar.

  • Wie sieht denn dein LOOP_PLAYERS aus?


    Und, bist du auch sicher admin? :D


    und wird das auch aufgerufen? :P


    So sieht LOOP_PLAYERS aus



    #define LOOP_PLAYERS(%0) \
    for(new %0 = 0, _%0 = GetPlayerPoolSize(); %0 <= _%0, IsPlayerConnected(%0); %0++)


    Ja, bin Admin :)


    Habe eben einige Prints eingesetzt und gemerkt das nur dieser Block nicht aufgerufen wird. Ich schaue mal weiter und versuche den Fehler zu finden.


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Deine Schleife ist falsch :D


    Sobald ein Spieler nicht connected ist, bricht die ab...


    Entwender du nutzt einfach foreach oder du machst es so:


    #define LOOP_PLAYERS(%0) for(new %0=GetPlayerPoolSize(); %0!=-1; %0--) if(IsPlayerConnected(%0))

    ast2ufdyxkb1.png


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

  • @Jeffry Ich habe schon einmal herraus gefunden, das es an dem Public hier liegen muss,
    sobald ich den Sever Starte, kommt die Meldung wie oben Geschrieben,
    und es wird nur dieser Public ausgeführt.



    public LoadATMs()
    {
    for(new i = 0; i < cache_num_rows(); i++)
    {
    ATMInfo[i][dbid] = cache_get_field_content_int(i, "ID");
    ATMInfo[i][aX] = cache_get_field_content_float(i, "aX");
    ATMInfo[i][aY] = cache_get_field_content_float(i, "aY");
    ATMInfo[i][aZ] = cache_get_field_content_float(i, "aZ");
    ATMInfo[i][aA] = cache_get_field_content_float(i, "aA");
    ATMInfo[i][set] = true;
    cache_get_field_content(i, "aName", ATMInfo[i][aName], 1, 40);
    CreateObject(19324, ATMInfo[i][aX], ATMInfo[i][aY], ATMInfo[i][aZ] - 0.5, 0, 0, ATMInfo[i][aA]);
    }
    printf("Aktuelle Bankautomaten: %i/%i in %dms geladen.", cache_num_rows(), MAX_ATMS, cache_get_query_exec_time());
    return 1;
    }

    Mit freundlichen Grüßen, BlvckAir :thumbup:

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen

  • public LoadATMs()
    {
    for(new i = 0; i < cache_num_rows(); i++)
    {
    ATMInfo[i][dbid] = cache_get_field_content_int(i, "ID");
    ATMInfo[i][aX] = cache_get_field_content_float(i, "aX");
    ATMInfo[i][aY] = cache_get_field_content_float(i, "aY");
    ATMInfo[i][aZ] = cache_get_field_content_float(i, "aZ");
    ATMInfo[i][aA] = cache_get_field_content_float(i, "aA");
    ATMInfo[i][set] = true;
    cache_get_field_content(i, "aName", ATMInfo[i][aName], 1, 40);
    CreateObject(19324, ATMInfo[i][aX], ATMInfo[i][aY], ATMInfo[i][aZ] - 0.5, 0, 0, ATMInfo[i][aA]);
    }
    printf("Aktuelle Bankautomaten: %i/%i in %dms geladen.", cache_num_rows(), MAX_ATMS, cache_get_query_exec_time());
    return 1;
    }


    enum ATMEnum
    {
    dbid,
    Float:aX,
    Float:aY,
    Float:aZ,
    Float:aA,
    bool:set,
    aName[40]
    };
    new ATMInfo[MAX_ATMS][ATMEnum];


    LoadATMs(); //<- So stehts bei OnGameModeInit


    query? Wie meinst? :D

    Mit freundlichen Grüßen, BlvckAir :thumbup:

  • Perfekt! Ich danke dir. :)
    Habe es nun Umgeschrieben und es klappt Problemlos.


    Kannst du mir zeigen wie es eine Funktion schreibe, womit ich meine ATM's aufrufen kann? Sprich,
    ob Spieler X in der Nähe vom Bankautomaten Y ist?

    Mit freundlichen Grüßen, BlvckAir :thumbup:

  • Dazu kannst du folgende Funktion nutzen:
    stock GetClosestATM(playerid, Float:dist = 10000.0)
    {
    new Float:tmp, Float:x, Float:y, Float:z, id = -1;
    for(new i = 0; i < sizeof(ATMInfo); i++)
    {
    if(ATMInfo[i][set])
    {
    tmp = GetPlayerDistanceFromPoint(playerid, ATMInfo[i][aX], ATMInfo[i][aY], ATMInfo[i][aZ]);
    if(tmp <= dist)
    {
    dist = tmp;
    id = i;
    }
    }
    }
    return id;
    }

  • Mein Problem besteht darin, dass mein Arrest-timer immer nur von 60 auf 59 runterzählt und dann "aufhört".



    mfg :thumbup:

    Meine Frage scheint wohl untergegangen zu sein, deswegen frage ich einfach nochmal. :)




    public CheckEntlassung()
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(pInfo[i][pJail]!=0)
    {
    pInfo[i][pJail]--;
    printf("Noch %i Sekunden.",pInfo[i][pJail]/1000);
    if(pInfo[i][pJail]==0)
    {
    pInfo[i][pJail]=0;
    SendClientMessage(i,CLR_RED,"Du hast deine Strafe abgesessen, hoffentlich hast du dazu gelernt!");
    SetPlayerArmour(i,0);
    ResetPlayerWeapons(i);
    SetPlayerPos(i,1555.0754,-1675.6427,16.1953);
    SetPlayerFacingAngle(i,90.0);
    SetPlayerInterior(i,0);
    SetPlayerVirtualWorld(i,0);
    SetPlayerHealth(i,100);
    GameTextForPlayer(i,"~p~Unjailed",10000,6);
    }
    }
    }
    return 1;
    }


    pInfo[pID][pJail]=jminuten*1000*60;


    SetTimer("CheckEntlassung",1000,true);

    RTL - Das N steht für Niveau!
    MfG,
    StreetS


    Jegliche Freundesanfragen, die für mich keinen Sinn ergeben, werden professionell Ignoriert. (Gleiche mit Skype!)
    Wer es nicht kapiert wird in Breadfish & Skype blockiert.


    - Stolzer PAWN Scripter der Klasse Beherrscht

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen