Beiträge von Simon

    Was mich daran interessiert sind nicht nur die neuen Möglichkeiten, sondern auch sowas wie Multithreading.


    Ist damit Multithreading, wie man es aus Java kennt, möglich?


    Ich frage es deswegen, weil es bereits ein Multithreading plugin für pawn gibt, welches jedoch nicht einfach so ohne risiken benutzt werden kann, da pawn nur für singlethread designed ist.


    Ist es also nun wirklich möglich? Kann ich also ganz normal alles was in Java möglich ist auch wirklich so nutzen?

    Es kommt halt auch darauf an, an welcher Stelle Textdraws erstellt werden, an welcher stelle sie gezeigt werden und an welcher stelle sie zerstört werden.


    Ich würde es folgendermaßen machen:


    Wenn der Spieler sich einloggt, erstellst du die benötigten PlayerTextDraws.
    An geeignetet Stelle zeigst du dem Spieler das TextDraw mit PlayerTextDrawShow
    Wenn der Spieler sich ausloggt, dann zerstörst du das TextDraw und setzt den Wert der Variablen zurück.


    Beispiel:




    Es kann sein das paar Parameter falsch sind oder die Funktionen etwas anders geschrieben werden, aber grundsätzlich sollte das verständlich sein.
    Damit ist sichergestellt, das das Textdraw erst beim Connecten erstellt wird. Dann wann es ihm angezeigt oder nicht angezeigt werden soll, wird das getan.
    Beim Ausloggen wird das TextDraw dann zerstört und die Variable zurück gesetzt.


    Loggt der Spieler sich nun wieder ein (oder ein anderer) werden die TextDraws wieder neu erstellt.


    Nach diesem Prinzip alle TextDraws machen.


    Bei allgemeinen übrigens auch: beim GameModeInit erstellen, an geeigneter Stelle anzeigen oder verstecken. Und beim GameModeExit zerstören.
    Wenn du zwischendurch ohne relog Textdraws erstellst und zerstörtst, darauf achten, das beim zerstören immer die Variablen zurückgesetzt werden.

    Die Schleife ist nur eine Abkürzung. Du hast das einmal richtig gemacht und beim 2. mal aufeinmal falsch.


    wenn du hast: SpecText[MAX_PLAYERS][4];



    aber auf SpecText[4][playerid] zugreifst. Dann könnte sogar dein Script abschmieren (wenn deine playerid höher als 3 ist.


    Denn du greifst auf den Text von playerid 4 zu und davon das Element an stelle von playerid (es gibt aber nur 4 (0-3).


    Du musst also alle 4 Spec-Texte für den jeweiligen Spieler zurücksetzen.
    Der richtige Zugriff wäre also:


    SpecText[playerid][0]
    SpecText[playerid][1]
    SpecText[playerid][2]
    SpecText[playerid][3]


    Oder wie in meinem vorherigen Post einfach eine kleine Schleife machen. Ist am Ende genau das selbe.

    Ich habe eine andere Idee.


    Undzwar kann ich vorab schon alle Datensätze löschen, die da nicht reingehören.


    Das Problem ist:


    Ich habe 2 Tabellen. Wenn der Wert eines Feldes aus der 1. Tabelle = 'x' ist, soll der Datensatz mit der ID (primary Key) aus Tabelle 1 in Tabelle 2 gelöscht werden (da ist die ID aus Tabelle 1 als Fremdschlüssen hinterlegt).


    Lösungsansatz: Subquery:


    DELETE FROM Table2 WHERE Column IN (SELECT Column FROM Table1) = 'x' AND table2.Fremdschlüssel = table1.Primärschlüssel;


    Nur leider funktioniert diese Query nicht so ganz :/

    Hallo,


    Vorab: Ich nutze StrickenKid.


    Ich habe eine ganz normale Query: Etwas wird aus der Datenbank gelesen.
    In Einer While-Schleife geht er alle Reihen durch und schreibt mithilfe von sscanf (plugin) die Werte aus den Feldern in die entsprechenden Variablen.


    Alles wunderbar.


    Nun möchte ich aber unter umständen (je nach dem wie die Werte in einer Spalte sind, entsprechend Datensätze löschen.
    Also sende ich eine DELETE-query. Im ersten Durchlauf wird der entsprechende Datensatz gelöscht, danach kommt die Error-Meldung
    "Error (0): Function: mysql_store_result called when no result stored."


    Folgendermaßen ist es aufgebaut:

    Hier ist es nochmal zu sehen: Erst wird eine normale Query an die Datenbank gesendet, das Ergebnis wird gepseichert, ist in einem bestimmten Feld pro Reihe ein bestimmter Wert soll ein bestimmter Datensatz gelöscht werden, ansonsten wird mit den Daten gearbeitet.
    Am Ende wird das Ergebnis freigegeben.


    Sollte die Frage kommen, wieso ich einen bestimmten Datensatz löschen möchte: Die SELECT Abfrage erstreckt sich über 2 Tabellen. für ein bestimmtes Fahrzeug soll aus 2 Tabellen bestimmte Werte gelesen werden. ist in der einen Tabelle ein bestimmter Wert nicht so wie er sein sollte, wird der Datensatz aus der anderen Tabelle gelöscht, da dann irgentetwas nicht stimmt (Datensätze wurden manuell und falsch in die Datenbank eingefügt).


    Ich denke das Problem liegt dabei, das ich keine query ausführen kann, während ich mit dem Ergebnis einer anderen query noch arbeite. Da dies mit den Ergebnissen nicht hinhaut. Bin mir da aber nicht sicher, weshalb ich hier nachfrage,
    Ich hatte bereits die Überlegung, alle Datensetze die gelöscht werden sollen zwischen zu speichern und erst nach dem freigeben des Ergebnis die Datensätze zu löschen.
    Das Problem hierbei: Es ist immer ungewiss ob überhaupt Datensätze gelöscht werden sollen und wenn ja ist nicht klar, wieviele gelöscht werden müssen. Ich kann jedoch kein Array mit einer dynamischen Größe erstellen.


    Eventuell liegt das Problem jedoch auch woanders.

    Wenn ich das nun richtig sehe ist die Variable folgender maßen:


    SpecText[MAX_PLAYERS][4];


    wenn du nun den Wert zurücksetzen willst:


    for(new p = 0; p < 4; p++) SpecText[playerid][p] = PlayerText:INVALID_TEXT_DRAW;

    Was mir ins Auge springt ist folgende Zeile:


    SpecText[4][playerid] = PlayerText:INVALID_TEXT_DRAW;


    Ich habe auch immer wieder Probleme mit den TextDraws. Ich habe einfach eine eigene Funktion geschrieben: _TextDrawDestroy(...) wo ich dann die jeweilige id auf INVALID setze.
    Probier aber erstmal die oben aufgeführte Zeile zu korrigieren

    Hallo,


    hab da ein kleines Problem:


    Ich möchte unter anderem für ein Anti-Waffen-Cheat die Waffen in einer Variablen Speichern. Derzeit tuhe ich das bereits, um die Waffen beim Ausloggen zu speichern und beim Einloggen wieder zu geben.
    Dieser Vorgang klappt auch ganz gut, ich frage einfach mit GetPlayerWeaponData jeden Slot ab und speicher die Waffe mit entsprechender Ammo einfach in entsprechenden Variablen.


    Nun möchte ich ein Anti-Waffen-Cheat implementieren. Ich mache nichts anderes: Wenn jemand eine Waffe vom Script bekommt (oder Waffen weggenommen werden) wird die Variable auf den entsprechenden Wert angepasst.
    In bestimmten Abständen schaue ich dann, ob das, was er an Waffen hat, mit dem, was in den Variablen steht und so weiter..


    folgendes habe ich also gemacht:


    Ich gebe Testweise einmal das Ergebnis der neuen Waffe mit der Munition aus. Und nun wird ein Schuh draus: Er gibt mir immer das aus, was zuvor drinne war. Nochmal deutlich:


    Zu begin habe ich keinerlei Waffen. Ich gebe dem Spieler nun eine Deagle mit 50 Schuss (Waffenid: 24 | Slot: 2)
    Als Testergebniss bekomme ich Waffe 0 | Ammo 0 zurück. (Hm???)


    Gebe ich nun aber eine weitere Deagle mit 10 Schuss, kriege ich folgendes Ergebnis:
    "Waffe 24 | Ammo 50" -> Das ist das Ergebnis, was ich zuvor erwartet hatte.


    Man kann es fast raten, gebe ich nun nochmal eine Deagle mit 20 Schuss, würde "Waffe 24 | Ammo 60 " raus kommen, danach "Waffe 24 | Ammo 80"


    Gebe ich nun eine Siltent Pistol (Auch Slot 2) bekomme ich auch das Ergebnis vom letzen mal.



    Es ist also immer um 1 verschoben. An den Variablen die ich benutze liegt es nicht, habe sie schon ersetzt, um dies auszuschließen.


    Kleiner Hinweis: Ich nutze derzeit noch JunkBuster, jedoch ist "Weaponhack" deaktiviert.


    Wie bereits erwähnt, nutze ich GetPlayerWeaponData ebenso wenn jemand sich ausloggt und speichere das Ergebnis in einer Datenbank. Diese Ergebnisse sind jedoch richtig. Auch in der Überprüfung, wo ich nochmal die aktuellen Waffen abfrage, stimmt das Ergebnis.
    Nur innerhalb dieser Funktion ist es versetzt.

    Wie genau wird das denn nun angewendet, wenn ich ein Json-Objekt decode und als Array benutzen möchte?


    Also beispiel ich habe:


    {"id":5,"Name":"Hans","Wohnort":"Los Santos"}


    Und nun möchte ich das nutzen in Pawn.

    Ja, mitlerweile bin ich auch dahinter gekommen.


    Diese Texttur die auf dem Schild ist, ist kein Objekt, zumindest kein Standard Objekt.
    Das ist von Samp aus nachträglich eingefügt worden als Fix.


    Man kann es also nicht einfach löschen

    Hallo,



    bin auf der suche nach eine außergewöhnlichen Object-ID.



    Es handelt sich um eine Anzeigetafel über der Straße, wo die Orte ausgeschildert sind.
    Auf diesem Schild steht leider gar nichts drauf.
    Entferne ich nun das Schild mit dem SA:MP Map Editor, ist das Schild weg und auch im Test ist nichts mehr zu sehen.



    Füge ich das nun im Script ein und gehe an die Stelle, so ist zwar das Schild weg, jedoch ist aufeinmal die Beschriftung des Schildes (was zuvor nicht sichtbar war) da.



    Ich vermute, dass die Beschriftung im Schild drinne ist.



    Nun suche ich die ID der Beschriftung des Schildes, um diese nochmal extra zu löschen.



    Bilder:



    Ich bedanke mich schonmal für die Mühe


    //Edit: Bilder sind nun zu sehen

    Sowas liegt doch eher an die Verbindung vom Spieler oder vom Server.


    Wenn eure Internetverbindung schlecht ist, auch nur wenn es mal für einen moment ist, kommt es durchaus mal vor, das einiges nicht mehr so funktioniert.


    Ich habe zumindest derartige Erfahrungen gemacht.
    Oftmals funktioniert die Syncro dann nicht mehr. man kann zwar noch im chat schreiben, aber wird beispielweise nicht mehr auf eine andere Position gesetzt.

    Vielleicht hilfreich zukünftig: Die meldung "Array index out of Bounds" bedeutet, dass der Wert eines Indexes eines Arrays ungültig ist.


    Wenn du also einen Array hast:


    Krankenhausdistance[10];


    Dann sind 0-9 gültig.
    Alles unter 0 ist grunsätzlich ungültig. Alles ab der größe des Arrays (10 in diesem Fall) ist ebenso ungültig.


    Oftmals ist eine bestimmte variable nicht vergeben (INVALID), wie es zumbeispiel bei der killerid der Fall ist wenn man stirbt. Nicht immer muss man gekillt werden, man kann auch einfach von einer explosion oder durch fallen sterben. in solchen Fällen gibt es keine killerid und der Wert von killerid ist = INVALID_PLAYER_ID.
    Wenn du nun trotzdem killerid in einem Array benutzt, ist der Index ungültig.


    Also als Tipp: Achte immer darauf, wann welche Variablen welchen Wert annehmen können, und wie du sie dann entsprechend verwendest. Wie bereits erwähnt kann man vorher abfragen ob es einen Killer gibt, bevor dann weiters passieren soll.

    Läuft der Streamer ansonsten?


    Wenn ja, wird es wohl an der Map liegen, die du eingebunden hast.


    Ein Streamer bedeutet einfach nur, dass Objekte nur dann erstellt werden, wenn sie benötigt werden und anschließend wieder zerstört werden.
    Das bedeutet, dass es auch limits für einen Streamer gibt. Hast du also zuviele Objekte auf einer Stelle, so wird auch so das Limit erreicht.


    Was du dagegen tun kannst:
    Entweder verkleinerst du die Map oder du passt die streamdistance an. Das bedeutet, das Objekte ab einer bestimmten entfernung zu einem Spieler erstellt werden. Ist diese zu groß, werden unnötige Objekte in der Nähe bereits erstellt, die aber gar nicht notwendig sind.