[SAMMELTHREAD] Kleine Scripting Fragen

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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
  • Danke. Funzt wieder.

  • Code
    UPDATE `server_vehicles` SET `vehBesitzer`='Edward.Rogers', `modelid`='560', `vehPosX`='1534.898315', `vehPosY`='-1676.506225', `vehPosZ`='5.594927', `vehPosA`='0.000000',
    `vehColor1`='1', `vehColor2`='1', `vehPaintjob`='-1', `vehSpoiler`='0', `vehHood`='0',
    `vehRoof`='0', `vehSideskirt`='0', `vehLamps`='0', `vehNitro`='0', `vehExhaust`='0',
    `vehWheels`='0', `vehStereo`='0', `vehHydraulics`='0', `vehFrontBumper`='0', `vehRearBumper`='0',
    `vehVentRight`='0', `vehVentLeft`='0', `vehPreis`='0', `vehNeonID1`='0', `vehNeonID2`='0', `vehNumberPlate`='KEINE PLAKETTE', `vehFuel`='60',
    `vehKMStand`='0', `vehSpecialTuned`='0', `vehPeilsender`='0', `vehTUV`='0' WHERE `id`='0'
    OnQueryError(1064,'You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '`vehKMStand`='0', `vehSpecialTuned`='0', `vehPeilsender`='0', `vehTUV`='0' WHERE' at line 1','`vehKMStand`='0', `vehSpecialTuned`='0', `vehPeilsender`='0', `vehTUV`='0' WHERE `id`='0'')



    Hey,


    Er nimmt den rest aber scheinbar hat er ein Problem mit der letzten Zeile?
    Was soll daran falsch sein habe das von der Alten Speicherung so übernommen und hat auch Funktioniert.
    Jetzt habe ich das ganze besser gestaltet was was ist und jetzt geht das ganze aufeinmal nicht mehr.

  • Möchte alle Spieler die ein Ticket aufgemacht haben, nacheinander in den Listitems anzeigen lassen und die SpielerIDS zwischenspeichern. Sprich, Spieler X und Spieler Y haben ein Ticket offen, ich sehe das im Dialog. Spieler X hat ID 65 und Spieler Y 22, diese IDS sollen den entsprechenden Listitems zugeordnet werden können.


    Macht mein aktueller Code Sinn? War auf jeden Fall eine Idee von mir, das so zu gestalten.


    if(!strcmp(call, "sticket", true))
    {
    for(new i, count = 0;i<GetMaxPlayers();i++)
    {
    if(LoggedIn(i) == false)continue;
    if(pInfo[i][pTicketCreate] == 0)continue;
    TicketCountID[playerid][count] = i,
    count ++;
    format(string, sizeof string, "%s - Datum: %s\n", getName(i), pInfo[i][pTicketDate]);
    }
    ShowPlayerDialog(playerid, D_STICKET, DIALOG_STYLE_LIST, "Offene Tickets.", string, "Wählen", "Schließen");

  • mysql_oquery(secondQuery, THREAD_SAVEPLAYERCAR, playerid, gSQL);

    Was ist das? Lösch das, hier sendest du nämlich nur den letzten Teil des Querys und das ist natürlich kein vollständiger Query.



    strdel(mainQuery, 0, sizeof(mainQuery));
    strdel(secondQuery, 0, sizeof(secondQuery));

    Das ist übrigens nicht nötig, da du die Variablen lokal deklarierst.
    Dadurch liegen sie auf dem Stack der Funktion und dieser Stack wird automatisch am Ende der Funktion geleert :)
    Das nimmt dir Pawn also ab.



    War auf jeden Fall eine Idee von mir, das so zu gestalten.

    Keine Frage, das kann man so machen :)


    Paar Alternativen:


    ast2ufdyxkb1.png


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

  • Macht mein aktueller Code Sinn? War auf jeden Fall eine Idee von mir, das so zu gestalten.

    Du kannst es auch ganz ohne Variable machen.
    if(!strcmp(call, "sticket", true))
    {
    for(new i, j = GetMaxPlayers(); i<j; i++)
    {
    if(LoggedIn(i) == false) continue;
    if(pInfo[i][pTicketCreate] == 0) continue;
    format(string, sizeof string, "%s%s - Datum: %s\n", string, getName(i), pInfo[i][pTicketDate]); //Angepasst, in deinem Code würde es nur das letzte Ticket anzeigen
    }
    ShowPlayerDialog(playerid, D_STICKET, DIALOG_STYLE_LIST, "Offene Tickets.", string, "Wählen", "Schließen");

    Und bei OnDialogResponse:
    new count;
    for(new i, j = GetMaxPlayers(); i<j; i++)
    {
    if(LoggedIn(i) == false) continue;
    if(pInfo[i][pTicketCreate] == 0) continue;
    if(count == listitem)
    {
    //Ticket von playerid "i" wird bearbeitet.
    return 1;
    }
    count++;
    }


    Zusätzlich könntest du, so habe ich es damals auf meinem Server gemacht, über die Funktion ShowPlayerDialog (Hook oder eigene Funktion, die dann ShowPlayerDialog aufruft, ist egal), die Dialog-ID in eine Spieler-Variable speichern, und wenn dann jemand ein Ticket aufmacht, automatisch prüfen, ob ein Spieler den Ticket-Dialog offen hat, wenn ja, ihm den Dialog neu anzeigen, damit die Einträge aktualisiert werden, sobald ein neues Ticket kommt, bzw. sobald jemand anderes ein Ticket angenommen hat.

  • Du kannst es auch ganz ohne Variable machen.

    Nette Idee, aber als kurze Anmerkung sollte gesagt werden, dass diese Methode nicht mehr funktioniert, wenn jemand in der Zeit wo der Dialog offen ist disconnected oder ein Ticket schließt, was zuvor offen war.


    Ergo muss man sich sputen mit dem Auswählen :D

    ast2ufdyxkb1.png


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

  • dass diese Methode nicht mehr funktioniert, wenn jemand in der Zeit wo der Dialog offen ist disconnected oder ein Ticket schließt, was zuvor offen war.

    Ja, daher:

    so habe ich es damals auf meinem Server gemacht, über die Funktion ShowPlayerDialog (Hook oder eigene Funktion, die dann ShowPlayerDialog aufruft, ist egal), die Dialog-ID in eine Spieler-Variable speichern, und wenn dann jemand ein Ticket aufmacht, automatisch prüfen, ob ein Spieler den Ticket-Dialog offen hat, wenn ja, ihm den Dialog neu anzeigen, damit die Einträge aktualisiert werden, sobald ein neues Ticket kommt, bzw. sobald jemand anderes ein Ticket angenommen hat.

    Das kann natürlich für jeden Fall gemacht werden, ob Disconnect, Beenden des Tickets, Annahme, Eröffnung, Update, etc.


    Alternativ, ist aber nicht so schön, könnte man auch über den inputtext den Name auslesen und mit dem Name der "gefundenen" playerid "i" gegenprüfen, ob das noch passt, wenn nicht, eine Meldung ausgeben und den Dialog neu anzeigen.
    Ich würde aber die automatisch aktualisierende Methode wie beschrieben empfehlen.

  • Einfach ist immer relativ. Deine Variante ist auch eine mögliche Lösung, die durchaus vom Code her einfach gehalten ist, dafür durch das Array mehr Speicher benötigt.
    Das kannst du problemlos so umsetzen (meinen Hinweis beim format noch beachten).


    Also um deine eigentliche Frage zu beantworten: Ja, die Methode macht Sinn und kann so genutzt werden.

  • Jemand eine Idee wieso ich das Ticket nur schließen kann wenn ich schon im LiveChat bin?
    Wenn ich ein Ticket erstellt habe und es auch noch keiner angenommen hat, macht er gar nichts beim /closeticket Befehl, wenn ich im LiveChat Modus bin, schließt er es Ordnungsgemäß.


    Quellcode

    ocmd:ticket(playerid, params[])
    {
    if(pInfo[playerid][pTicketCreate] == 1 || pInfo[playerid][pTicketID] != INVALID_PLAYER_ID)return SCM(playerid, COLOR_GREY, "Du bist bereits im TicketChat oder hast eins erstellt.");
    new inhalt[220];
    if(sscanf(params, "s", inhalt))return SCM(playerid, COLOR_GREY, "Befehl: /ticket [Ticket Inhalt] MAX 200 Zeichen.");
    if(strlen(inhalt) > 200)return SCM(playerid, COLOR_GREY, "Du kannst maximal 200 Zeichen verwenden.");
    new day, month, year, hour, minute, second;
    getdate(year, month, day),
    gettime(hour, minute, second),
    pInfo[playerid][pTicketCreate] = 1,
    format(pInfo[playerid][pTicketMSG], 200, "%s", inhalt),
    format(pInfo[playerid][pTicketDate], 50, "%02d.%02d.%02d | %02d:%02d:%02d ", day, month, year, hour, minute, second),
    format(inhalt, sizeof inhalt, "%s hat ein Ticket erstellt. /sticket um alle Tickets anzuzeigen.", getName(playerid)),
    SendAdminMessage(COLOR_TICKET, inhalt),
    SCM(playerid, COLOR_TICKET, "Du hast ein Ticket erstellt. Die Teammitglieder haben eine Nachricht erhalten."),
    SCM(playerid, COLOR_TICKET, "Du kannst deine Anfage jederzeit via /closeticket zurückziehen.");
    return 1;
    }


    ocmd:closeticket(playerid)
    {
    if(pInfo[playerid][pTicketCreate] == 0 && pInfo[playerid][pTicketID] == INVALID_PLAYER_ID)return 1;
    if(pInfo[playerid][pTicketID] != INVALID_PLAYER_ID)SCM(pInfo[playerid][pTicketID], COLOR_TICKET, "Deine Ticket Verbindung wurde unterbrochen, Grund: Partner hat den Reportmodus verlassen.");
    pInfo[pInfo[playerid][pTicketID]][pTicketID] = INVALID_PLAYER_ID,
    pInfo[playerid][pTicketID] = INVALID_PLAYER_ID,
    pInfo[playerid][pTicketCreate] = 0,
    SCM(playerid, COLOR_TICKET, "Du hast das Ticket geschlossen/gelöscht.");
    return 1;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Du sprengst das Array, da [pInfo[playerid][pTicketID] INVALID_PLAYER_ID ist, wenn du noch nicht im Live-Chat bist.
    Schreibe es so:
    ocmd:closeticket(playerid)
    {
    if(pInfo[playerid][pTicketCreate] == 0 && pInfo[playerid][pTicketID] == INVALID_PLAYER_ID)return 1;
    if(pInfo[playerid][pTicketID] != INVALID_PLAYER_ID)
    {
    SCM(pInfo[playerid][pTicketID], COLOR_TICKET, "Deine Ticket Verbindung wurde unterbrochen, Grund: Partner hat den Reportmodus verlassen.");
    pInfo[pInfo[playerid][pTicketID]][pTicketID] = INVALID_PLAYER_ID;
    }
    pInfo[playerid][pTicketID] = INVALID_PLAYER_ID;
    pInfo[playerid][pTicketCreate] = 0;
    SCM(playerid, COLOR_TICKET, "Du hast das Ticket geschlossen/gelöscht.");
    return 1;
    }

  • Ah ja, danke. Ich hatte die Situation erst kürzlich mit einer anderen Variable.
    Mir ist noch was in den Sinn gekommen, eventuell könnte man ja Silent Aim aufspüren.


    Meine Idee war es mit dem Callback OnPlayerWeaponShot zu arbeiten.
    Wenn man die Position vergleichen tut, mit der Position wo der Spieler eigentlich steht, könnte man sowas doch eigentlich Detecten oder was meint ihr? Natürlich würde man die Frames und die Latenz berücksichtigen aber sobald es zu oft vorkommt, eine Warnung rausschicken.

  • Eins vorneweg, du brauchst sie in OnPlayerDisconnect nicht zurücksetzen. Das funktioniert automatisch.


    Du kannst aber via [wiki]GetPVarsUpperIndex[/wiki] + [wiki]GetPVarNameAtIndex[/wiki] dir die Namen aller PVars auslesen lassen und sie dann mit [wiki]DeletePVar[/wiki] löschen oder halt einfach SetPVar(Int/Float/String) neu setzen. Falls du den Typ der PVar brauchen solltest, dafür gibt es [wiki]GetPVarType[/wiki]

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Beitrag von Kaliber ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Ouuh GetPVarsUpperIndex kannte ich noch nicht ._. ().
  • Hallo!


    Habe aus meinem Script diese nervige Zivinote rausgenommen, bekomme jetzt aber einen haufen Errors:



    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)
    error 035: argument type mismatch (argument 1)



    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



  • Hey,


    Mein Fahrzeug spawnt immer mit 0 Liter aber in der Datenbank sind 100 Liter festgehalten?

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