Beiträge von Chris.

    Die for-Schleife geht durch alle Spieler (MAX_PLAYER).
    Dann kommt die Abfrage IsPlayerConnected(i). Heißt dann doch, das jeder der Online ist, dann auch angezeigt wird. Meine Theorie war dabei: wenn man die Abfrage dann evtl. entfernt, könnte dann jeder, der in der Fraktion drinne ist, angezeigt werden.


    Die for-Schleife zählt von 0 bis 500 (es sei denn MAX_PLAYERS wurde erneut definiert). Grund? Es können i.d.R. 500 Spieler -online- sein. IsPlayerConnected() ist lediglich benötigt, da man hier von Index 0 bis Index 500 eines Arrays zählt und zuvor schauen muss, ob dieser Index derzeit überhaupt in Verwendung ist (d.h. SpielerID auf Server vorhanden). Hat garnichts, aber wirklich null und garnichts mit offline Spielern zu tun. Erstmals überlegen, was ein Quellcode tut, bitte.

    MySQL != C#. Für unterschiedliche Größen verwende TINYINT, SMALLINT, MEDIUMINT, INT und BIGINT.


    Manual lesen hilft auch: http://dev.mysql.com/doc/refma…eric-type-attributes.html


    Zitat

    For example, INT(4) specifies an INT with a display width of four digits. This optional display width may be used by applications to display integer values having a width less than the width specified for the column by left-padding them with spaces.


    [...]


    The display width does not constrain the range of values that can be stored in the column. Nor does it prevent values wider than the column display width from being displayed correctly. For example, a column specified as SMALLINT(3) has the usual SMALLINT range of -32768 to 32767, and values outside the range permitted by three digits are displayed in full using more than three digits. When used in conjunction with the optional (nonstandard) attribute ZEROFILL, the default padding of spaces is replaced with zeros. For example, for a column declared as INT(4) ZEROFILL, a value of 5 is retrieved as 0005.

    • Achte auf SQL Injections.
    • String Begrenzer (') sind für STRINGS, nicht Zahlen (Siehe deine %d-Specifier).
    • Weshalb return? Bringt dir das hier irgendetwas?
    • Für den Rest, schaue die die Logs an, wie bereits vor mir gesagt.


    Das ist falsch. Die Nullen werden nur angezeigt, wenn ZEROFILL aktiviert ist. Die 11 sagt lediglich aus, wie die Zahl dargestellt wird (auch "display width" genannt). Das hat NICHTS mit der Speicherung des Integers zu tun. Der maximalste und negativste Integer bleibt gleich, egal ob int(11) oder int(...).

    Mein Fazit nach Betrachtung des Quellcodes:

    • Uraltes MySQL Plugin.
    • Keine Gedanken hinsichtlich SQL Injections gemacht + Queries sind teilweise falsch geschrieben.
    • Logik des Systems nicht durchdacht.
    • Problematiken mit den IDs der Geschäfte können entstehen, sobald irgendwann ein Geschäft gelöscht wird.
    • Komplett irrelevante und uneffiziente Directives.
    • Quellcode enthält teilweise Aktionen, die nichts mit dem System zu tun haben.
    • Für den Arbeitsspeicher uneffizient geschrieben.
    • ...

    Bitte nicht als Kritik sehen, sondern es als Motivation anzunehmen, um es in den kommenden Versionen besser zu machen.

    • Ist der momentane Wert womöglich 0.0? Schließlich gibt er auch 0.00 bei printf() aus.
    • Ist es tatsächlich vom Typ Float oder vielleicht ein Integer?
    • Stimmt der Index des Arrays (Parameter: id)?
    • Lasse dir Errors und Debug-Messages des MySQL Plugins ausgeben. Gibt es hier hilfreiche Logs?
    • P.S.: SQL Injection ist möglich.
    • Warum return 1? Bringt dir das irgendetwas?

    Bei den meisten Coding Guidelines wird die Version mit Single Quotes und Punkten vorgeschrieben. Sie wird am meisten verwendet und daher halte ich es auch nur für sinnvoll, sich dieser anzuschließen. Single Quotes sind auch manchmals um einiges performanter.

    Danke.. Aber für die Tonne sind sie nicht sie funktionieren ja td.. Trotzdem danke


    Programmierer, die ihren Quellcode nicht überdenken und nur oberflächlich nachschauen, ob er funktioniert. Nicht, dass ein schlechter Quellcode womöglich irgendwann Probleme bereiten könnte. Tolle Einstellung. Wirklich weiterzuempfehlen.



    In einem normalen format() ist dies aber nicht möglich und muss zuvor behandelt werden. Das beste wären Prepared Statements, aber soweit scheint die SA:MP Community wohl noch nicht zu sein. :rolleyes:

    Mal zur grundsätzlichen Schreibweise von Queries, die hier geposteten sind alle für die Tonne:

    • String-Begrenzer (') sind für STRINGS. Nicht für Tabellennamen, Feldnamen, Zahlen, Gleitkommazahlen, ... Für STRINGS.
    • Backticks (`) verwendet man für sog. Identifier (= Feldnamen, Tabellennamen, ...), um sie als Identifier darzustellen. Verhindert Problematiken mit gleichnamigen Anweisungen im Query.

    Zur Verwendung des Plugins:

    • Warum verwendet ihr format()? Verwendet doch einfach mysql_format(), wenn es bereits gegeben ist. Damit könnt ihr auch direkt Sicherheitslücken schließen.

    Simon2202:


    • Nicht das Rad neu erfinden und einfach auf y_ini umsteigen. Besser noch: Direkt auf ein Datenbanksystem umsteigen, denn früher oder später wird man mit Filesystemen an Grenzen stoßen.
    • Bei der bekannten ProxDetector() Funktion wird viel unnötig berechnet und eine Unmenge an Variablen unnötig erstellt. Ich halte dies (eigene Kreation) für besser:



    stock Float:getDistanceBetweenCoordinates(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
    return floatsqroot(floatpower(floatabs(floatsub(x2, x1)), 2) + floatpower(floatabs(floatsub(y2, y1)), 2) + floatpower(floatabs(floatsub(z2, z1)), 2));
    }


    sendLocalMessage(msg[], Float:posX, Float:posY, Float:posZ, Float:radius, interior, vw, color) {
    new Float:X,
    Float:Y,
    Float:Z,
    Float:distance;


    if(color != 0) {
    foreach(new i : playerIterator) {
    if(GetPlayerInterior(i) == interior && GetPlayerVirtualWorld(i) == vw) {
    GetPlayerPos(i, X, Y, Z);
    distance = getDistanceBetweenCoordinates(posX, posY, posZ, X, Y, Z);
    if(distance < radius) {
    SendClientMessage(i, color, msg);
    }
    }
    }
    } else {
    new Float:radiusStep = radius / 6;
    foreach(new i : playerIterator) {
    if(GetPlayerInterior(i) == interior && GetPlayerVirtualWorld(i) == vw) {
    GetPlayerPos(i, X, Y, Z);
    distance = getDistanceBetweenCoordinates(posX, posY, posZ, X, Y, Z);
    if(distance < radiusStep) {
    SendClientMessage(i, COLOR_WHITE, msg);
    } else if(distance < radiusStep * 2) {
    SendClientMessage(i, COLOR_FADE1, msg);
    } else if(distance < radiusStep * 3) {
    SendClientMessage(i, COLOR_FADE2, msg);
    } else if(distance < radiusStep * 4) {
    SendClientMessage(i, COLOR_FADE3, msg);
    } else if(distance < radiusStep * 5) {
    SendClientMessage(i, COLOR_FADE4, msg);
    } else if(distance < radiusStep * 6) {
    SendClientMessage(i, COLOR_FADE5, msg);
    }
    }
    }
    }
    }