Beiträge von ray187

    Vll. ist es möglich über irgendwelche Workarounds oder Plugins - ich sehe jedoch nicht inwiefern das Sinn haben soll.


    Deine MySQL Tabelle bietet nicht umsonst eine Unique ID, das bisschen Performanceverbesserung playerid mit unique ID gleichzustellen wird durch die Performance Last zu dem Ziel zu kommen sowieso vernichtet. Unabhängig davon, dass es einfach keinen Sinn ergibt, denn die Unique ID kannst du als Referenz verwenden die PlayerID nicht. Sobald Du mehr als 500 gespeicherte Accounts in der Tabelle hast, wirds ein durcheinander. Verwendest Du die mysql ID als Referenz in irgendwelchen anderen Tabellen wie z.B. Besitzzugehörigkeit - viel Spass, dann hast dein System abgeschossen.

    Anstelle einen unnötigen Timer einzubauen, arbeite lieber mit GetTickCount oder einer eigenen TickCount Funktion.




    if(strcmp(cmd, "/lsair", true) == 0)
    {
    if(PlayerInfo[playerid][pMember] == 16 || PlayerInfo[playerid][pLeader] == 16)
    {
    if(GetTickCount()-GetPVarInt(playerid,"FlugWarteZeit")>1000*60*10)
    {
    SetPlayerCheckpoint(playerid, 1928.4336,-2250.5027,13.5469, 5.0);
    SendClientMessage(playerid,COLOR_RED,"Fliege zum Marker");
    LSAir[playerid] = 1;
    SetPVarInt(playerid,"FlugWarteZeit",GetTickCount());
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Du kannst nur alle 10Minuten diesen Befehl benutzen!");
    }
    }
    return 1;
    }


    new i;
    while(i<sizeof(Autos))
    {
    Autos[i][Carid] = AddStaticVehicleEx(VEHID,X,Y,Z,A,COLOR2,COLOR2,Respawn!);//Nur ein Beispiel ....
    fa++;
    }


    Hier wird dein i nicht inkrementiert und somit nur in die erste Zelle des Arrays geschrieben - dennoch stell ich mir die Frage warum Du nicht die jeweilige ID direkt für dein Autos Array verwendest - also z.B.:


    new carid = AddStatic...;
    Autos[carid][attribut]=...; // hier deine jeweiligen Attribute



    Somit hast du eine ähnliche Struktur wie bei playerinfo.


    Desweiteren würde ich "new Car = GetPlayerVehicleID(playerid);" vor die for Schleife packen damit es nur einmal ausgeführt wird.

    Schau dir doch mal für 2 Minuten in Ruhe an was dein Code macht.


    if(!IsPlayerConnected(i)) {


    schließt aus, dass der Spieler überhaupt connected ist.


    Warum


    {
    SendRconCommand("gmx");
    }



    in einem extra Block?


    Wenn Du dir mal für 2 Minuten die Mühe machst deinen Code selbst zu überprüfen würdest auch selbst auf die Lösung kommen.

    Sollte auch nicht denn SendRconCommand("gmx"); ist in deiner for Schleife.



    GetPlayerName(playerid,pname,sizeof pname);


    ... und alle anderen Funktionen über playerid in deiner for Schleife nehmen die Werte der playerid, die /gmx ausführt. Das sollte in GetPlayerName(i,pname,sizeof pname); usw. geändert werden.

    Versteh das Problem nicht, warum sollten die unterschiedlich werden? Verwende doch einfach eine gemeinsame Funktion die gleichzeitig den angezeigten Wert (PlayerMoney) und deine Variable setzt.


    Wenn du die mMn beste Variante - bei Login auslesen, bei Logout abspeichern - nicht magst, müsstest du jedes Mal auf die File zugreifen sobald sich der Wert ändert.

    Dann verbesser es doch auch in deinen ersten Post...


    Wenn Du ein gutes Plugin verwendest hast die Fkt. mysql_insert_id(connection_handle) zu Hand um auto inc ID rauszufinden.


    Ansonsten passt die Abfrage, woher hast Du die Fehlermeldung und wie sieht das komplette Query aus (müsste ja mitgeloggt werden)?

    3 Sachen (zusätzlich zu dem was die Vorredner gepostet haben).


    Warum ist die Funktion public?


    Warum werden in der Funktion zwei Variablen erstellt die absolut unnötig sind?


    Mit 99%iger Sicherheit ist das nicht die Fehlerline.

    Zum ersten Problem kann ich keine Angaben machen da Du keine Informationen die zur Hilfe benötigt werden angegeben hast.


    Zum zweiten Problem: Prüfe erst ob überhaupt etwas geschrieben wurde, also inputtext kein leerer String ist und überprüfe ebenso ob die Playerfile existiert (dini_Get überhaupt etwas zurückgibt).

    wieso sollte ich überall "new string/strink[64(oder so)];" anstatt gleich festzulegen (oben) "new strink[64];"


    Du redest von globalen Variablen. Sollte es der Fall sein dass strink eine globale Variable ist, dann aufgrund dessen dass es keinen Sinn macht diese Variable global anzulegen (Laufzeit Nachteil, Größe der AMX etc.). Hast Du sie (wie Du nun meinst) lokal in OnPlayerCommandText angelegt dann ist das schon in Ordnung. Ich persönlich mache das zwar nicht weil meine Output Strings immer untersch. Größe haben und ich nur soviele Zellen anlegen möchte wie ich auch brauche - aber das ist Geschmackssache denn daran wird die Performance im Normalfall kaum scheitern.


    Zitat

    Verwendest du strink in mehreren Befehlen? Wenn ja, würde das ganze nicht funktionieren, wenn gleichzeitig ein anderer Befehl ausgeführt wird, der Strink verwendet...


    Das stimmt nicht, dein Script führt Block für Block aus, es kann nicht passieren dass zwei Spieler gleichzeitig auf die selbe Variable zugreifen.


    OnTopic:


    Ich bin mir ziemlich sicher, dass dein Code nicht funktioniert, denn es erschließt sich mir immer noch nicht wie pplayerid belegt wird.

    zielname ist ein leerer String. Der Bezeichner für einen string ist %s, nicht %d. Dennoch ist dieser leer und beinhält nach deinem Code nicht den Namen des jew. Spielers.

    pplayerid ist bei mir eine globale variable die in jeden puplic aufgerufen werden kann :D wollte nich überall "new pplayerid;" hinschreiben...


    Und genau da liegt mein Verständnisproblem. Denn wie das funktionieren soll dass in eben dieser Variablen die ID des Players mit der kürzesten Distanz zu playerid sein soll entbart mir jeder Grundlage. Passiert das in OnPlayerCommandText bevor zu irgend einem Commandvgl. weitergegangen wird oder wie?


    Desweiteren verwirrt mich, warum nennst du einen String strink?


    Warum globale Variablen (bis auf name - die ist die einzig sinvolle gesetzte)?


    Aber das sind weitergehende Fragen die den Codestil betreffen, nicht deine ursprüngliche Frage.

    ^^ getazert.


    Mir ist nicht ganz klar woher die Person mit der kürzesten Distanz kommen soll (pplayerid?) - um jedoch zu verhindern dass es playerid selbst ist, machst eine If-Bedingung (playerid!=pplayerid).


    Dennoch erschließt sich mir nicht wie dein Code funktionieren soll - die eigene playerid sollte aber in der Funktion die den player mit der kürzesten Distanz zurückgibt (welche auch immer das sein mag) schon ausgeschlossen werden.

    Jetzt hat sich jemand vorher die Mühe gemacht jeden Fehler zu erklären. Du kannst davon ausgehen dass gleiche Fehler mit anderen Variablennamen das gleiche bedeuten - also poste doch wenn überhaupt nur Fehler die nicht bereits aufgetreten sind.


    Zu allen noch nicht genannten Fehlern würden die betroffenen Zeilen deines Scripts sehr helfen.

    Ich werde jetzt nicht anfangen Dir den Sinn von Foren und deren Benutzung zu erklären - allerdings nur damit keine Missverständnisse entstehen - ob es dir passt was ich schreibe ist mir relativ egal, du kannst dir die Mühe also auch sparen.


    Zitat

    2. Ist es übersichtlicher Funktionen zusammenzufassen und in Includes zu stecken der einzige Nachteil ist die längere dauer des compilen die dir 3 Sek deines Lebens klauen


    Ich fass mich mal etwas direkter, damit mit Dir wie gerade schon keine Missverständnisse auftreten und ich nicht gefahr laufe noch mehr darüber zu schreiben. Das ist schlichtweg so Schwachsinn und nichts als persönlicher Geschmack.

    7 ist ein Syntaxerror (vll ein ; o.ä. vergessen, Klammer nicht geschlossen etc.)


    Generell: All diese Fehler sind 1:1 übersetzbar und bedeuten genau was sie aussagen. Von daher, selbst mit Google Translate könntest hier vorankommen.

    Zitat

    Es ist einfach ein Anti-Money-Hack zu machen, aber Includes sind immer besser.


    Das würde ich so nicht stehen lassen. Code Aufteilung über mehrere Dateien hinweg ist sinnvoll - gemäß wie es in jeder Sprache gemacht wird, zu verallgemeinern und includes als "immer besser" zu titulieren ist sicherlich kein guter Ratschlag - vorallem in einem Forum in dem sich größtenteils Neulinge aufhalten, die aufgrund dieses Vorschlags auf falsche Gedanken kommen könnten.



    Speziell hierauf:


    Zitat

    Es ist einfach ein Anti-Money-Hack zu machen, aber Includes sind immer besser.


    Verallgemeinert und deswegen falsch - eine AntiMoneyHack Funktion in einem Include extern zu lagern würde ich als Geschmackssache bezeichnen - persönlich halte ich es nicht für so sinnvoll, dann wiederum, wie gesagt, hat es nicht wirklich mit "sauberem" Coding sondern den pers. Präferenzen des jew. Scripters zu tun.


    -PhoeniX- hat nur einen Ansatz gegeben und nicht getesteten, verifizierten Code - und genau diesem Ansatz würde ich an MrMonats Stelle nachgehen.