Beiträge von Campbell

    Ansich gut.
    Was ist aber, wenn man einen wirklich einzigartigen Code hat, und nicht will, dass der kopiert wird?


    Um Hilfestellung zu erhalten, muss man nicht zwangsläufig einen kompletten Quellcode posten und man kann auch kleine Codeausschnitte extra für die Hilfestellung vorbereiten, um den eigenen Quellcode nicht zu zeigen. Meist bräuchte man eigentlich garkeinen Quellcode, da aber die Problemstellungen und Ansätze meist unleserlich, schlecht und kurz formuliert sind, ist der Quellcode oftmals erforderlich, sodass man das Problem überhaupt entziffern kann.

    Mir fällt es immer öfter auf. Nachdem Leute im "Coding" oder "Scripting Base" Bereich ihre Antwort gefunden haben, löschen sie kurzerhand den Startbeitrag, um den eigenen Quellcode zu entfernen oder aus weiteren individuellen Gründen. Folgen sind, dass komplette Threads für andere Nutzer unverständlich und nutzlos werden und dass solche Threads auch bzgl. der "Nutze die Suchfunktion"-Regel eher kontraproduktiv werden. Problematisch ist die ganze Situation, da man solche Threads auch nicht mehr melden kann, denn mit der Löschung des ersten Beitrags wird auch der "Melden"-Button entfernt. Daraus folgend schlage ich folgende Optionen vor:

    • Entfernen des Rechts der Löschung eigener Posts im "Coding" und "Scripting Base" Bereich.
    • Meldefunktion für gelöschte Beiträge erweitern.
    • Zumindest die Löschfunktion für den ersten Beitrag im Thread abschalten oder die Löschfunktion für den Threadersteller im eigenen Thread deaktivieren.

    Ich freue mich auf Feedback, Meinungen und weitere Optionen.

    Das macht bei SA:MP keinen Unterschied, denn Pawno kann den SA:MP Server nicht starten. Pawno gibt es ja nicht nur für SA:MP, es ist nur ein Editor für Pawn. Und normalerweise kann der Editor auch direkt die Pawn-Scripte starten, nur mit einem SA:MP Script funktioniert dies eben nicht.

    • Warum deklarierst du deinen query-String dort oben? Es kann doch sein, dass du ihn garnicht brauchst. Deklariere den String erst, wenn du ihn auch tatsächlich brauchst, sonst verschwendest du Ressourcen.
    • Die if-Abfrage kannst du vereinfachen (Siehe unten).
    • Zu deinem INSERT-Problem: Setzte GunID als PRIMARY_KEY (Wichtig!) und verwende dann INSERT IGNORE INTO.
    • Verwende nicht SpielerName(), sondern speichere den Spielernamen einmalig in eine Variable. Dann musst du den Namen nicht x-Mal getten.
    • Verwende mysql_format() und %e, wenn es schon existiert! Dein Script dort oben ist gefährdet bzgl. SQL Injections!
    • Warum eine Stringgröße von 200? Du brauchst doch nicht so viel! Verwende http://www.zeichenzähler.de/, um die Länge deiner Strings zu bestimmen. Hier: 81 (= Länge von String in mysql_format()) - 4 (%i + %e = 4 Zeichen) + 24 (= MAX_PLAYER_NAME) + 2 (weaponID ist max. 2 Zeichen lang) = 103.

    Also:



    OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
    switch(dialogid) {
    case CASE_DIALOG_BLACKLIST: {
    if(response) {
    if(isnumeric(inputtext)) {
    new weaponID = strval(inputtext);
    if(weaponID >= 1 && weaponID <= 46 && (weaponID < 19 || weaponID > 21)) {
    new query[103];
    mysql_format(MySQLconnection, query, sizeof(query), "INSERT IGNORE INTO `blacklisted_Guns` (`GunID`, `Adminname`) VALUES ('%i', '%e');", weaponID, SpielerName(playerid));
    mysql_tquery(MySQLconnection, query, "", "");
    } else {
    ShowPlayerDialog(playerid,DIALOG_GUNBLACKLIST,DIALOG_STYLE_INPUT,"Gun-Blacklist","Du hast eine ungültige Waffen-ID eingegeben.\nGib eine neue, gültige Waffen-ID ein.","Fertig","Abbrechen");
    }
    } else {
    SendClientMessage(playerid, GRAU, "* Gebe eine nummerische WaffenID ein.");
    }
    } else {
    SendClientMessage(playerid, GRAU, "* Gun-Blacklist beendet.");
    }
    }
    }
    }

    Am besten du verwendest eine userID in der Häuser-Tabelle und lädst den Usernamen per JOIN aus der Usertabelle (Thema: Normalisierung).

    Würd's da nicht auch ein '*' tun, denn man möchte ja alles Auswählen.


    Das kann man so spontan nicht sagen, ohne den Anwendungsfall jedes Felds zu kennen. Weiterhin ist die Angabe * nicht besser, da MySQL so erst selbst die Feldernamen herausfinden muss. Folglich minimal langsamer. Auch ist es besser die Felder zu nennen, vor allem in Bezug mit BlueGs Plugin, da man oftmals einfach die Reihenfolge, in welcher die Felder im Datensatz stehen, wissen muss.

    Warum dieses WHERE? Du möchtest doch alle Häuser laden und nicht nur eins oder ein paar. Mach dir doch das Leben nicht so schwer:



    loadHouses() {
    mysql_tquery(handle, "SELECT `hID`, ... FROM `haeuser`", "onSystemLoadsHouses", "");
    }

    Ich hatte schonmal das gleiche Problem, jedoch nicht in Grove Street, aber in der LSPD-Garage. Alle paar Male, wenn ich aus dem LSPD Interior kam waren die Autos in der LSPD Garage an einem Punkt "gestapelt". Als ich ein selbst gemapptes Remake des SFPD Interiors, den ich dort als LSPD Interior verwendet habe, entfernt habe, kam dieses Problem nicht mehr vor. Der genaue Grund blieb mir jedoch ein Rätsel.

    Das ist ein Button und kein Link, also verwende auch das Button-Tag! Oder verwende zumindest eine unsorted list (<ul>), um deine Navigation zu ordnen. Dann verwende entweder Buttons oder Links und mach den Rest mit CSS.

    Die "Input Line" kann man leicht verkürzen, indem man mehrzeilig schreibt (Wird hier im Forum-Highlighting jedoch falsch gehighlighted!):



    format(string, sizeof(string), "First few characters ... \
    second line ... \
    and so on ...");


    Warum verwendest du dafür mysql_format? Du formst doch garkeinen String, du kannst dir den String sparen und den Query per Hand direkt in mysql_tquery() schreiben.