Beiträge von Simon

    mit switch und case ganz gut zu lösen:


    Hi,


    Wenn ich Spielerbezogene Vars erstellen will kann ich das folgend machen:


    new var1[MAX_PLAYERS];
    new var2[MAX_PLAYERS];
    ...


    oder auch so:


    enum info
    {
    var1
    var2
    }
    new pvars[MAX_PLAYERS][info];


    ich persönlich finde die 2. Schreibweise übersichtlicher, und man kann schnell spielerbezogene variabeln hinzufügen,


    Nun zu meiner Frage: Gibt es eine schnelle möglichkeit Variablen mit einem standardwert zu erstellen und dabei die 2. Schreibweise zu nutzen. Bisher würde ich das so machen:


    new var[MAX_PLAYERS] = {1, ...};


    Ich habe an sowas wie


    enum info
    {
    var1 = 0,
    var2=5,
    var3[10] = {3, ..}
    }
    new pvars[MAX_PLAYERS][info];


    gedacht, aber ganz so einfach funktioniert das leider nicht.


    Um den ganzen nun einen besseren Sinn zu geben, möchte ich später auch die Variablen zurücksetzen, heißt: ihm den Anfangswert wieder zuweisen. Das ist zum Beispiel wichtig, wenn ein Spieler sich ein und ausloggt: logt ein spieler sich ein, hat die Spielerbezogene Variabel den Anfangs wert, welcher sich mit der Zeit ändern kann. Loggt dieser sich nun aus soll seine Variable sich wieder auf den Anfangswert setzen, so das der nächste Spieler mit dieser ID wieder den Startwert der variabel hat (der ist leider nicht immer 0),


    Bei einer Menge von Spielerbezogenen Variablen ist es nervig beim Ausloggen eines Spielers alle Variablen auf einen anfangswert zurückzusetzen, Ich dachte da an eine Methode, einfach alle variablen in der enum info in eine art schleife aufzurufen und ihnen einfach den Anfangs wert wiedergeben, der je nach variable auch unterschiedlich ist.



    Ich hoffe meine Fragestellung ist verständlich

    Hi, habe lange nichts mehr gemacht mit samp, habe nun mal wieder reingeschaut und habe direkt was festgestellt:


    Ich habe einige PlayerTextdraws. Meistens sind aber immer nur so 2-3 gleichzeitig zu sehen für einen Spieler.


    Beispiel: Tacho, beim Tanken, beim befüllen von etwas (Trucker) oder ähnliches werden PlayerTextdraws angezeigt.
    Ich habe eigentlich nur zwei Textdraws die sich "nicht mögen".


    Einmal das Tacho, der Grundaufbau ist nicht player bezogen und bereits erstellt und wird für die jeweiligen Spieler nur angezeigt oder versteckt.
    Die Daten wie Geschwindigkeit und co sind PlayerTextDraws, die dann erstellt werden wenn sie gebraucht werden und später wieder zerstört werden.


    Das Zweite ist ein Fortschritts-Menu, welches beim Tanken, Beladen etc angezeigt wird. Auch hier ist der Grundaufbau ein fertig erstelltes TextDraw was nur angezeigt oder versteckt wird.
    Die PlayerTextDraws enthalten dann die Daten wie zum Beispiel die Tankstelle an der man steht oder wieviel man bereits getankt hat und wie viel man bezahlen muss und so weiter.


    Die TextDraws funktionieren einzelnt sehr gut, fährt nun aber jemand Tanken und lässt den Motor an, wird das Tacho und die Tankanzeige gleichzeitig angezeigt. Die nicht Spielerbezogenen Textdraws bleiben so wie sie sein sollen, nur 2 PlayerTextDraws, jeweils eins aus jedem, spielen verückt:


    das eine PlayerTextDraw vom Tacho, welches das Fahrzeug anzeigt, verschwindet und erscheint an der Stelle vom anderen PlayerTextDraw, welches die Tankstelle anzeigen soll. Folgend blinken beide PlayerTextDraws abwechseln.
    Das selbe passiert beim aufladen der Trucker (die selben Textdraws nur mit anderen Werten). Aber es sind jedesmal genau die selben.


    Jetzt werden natürlich viele sagen das sich da die IDs überschneiden oder ähnliches aber genau das habe ich mehrmalls kontrolliert und bewusst verhindert, indem ich zum Beispiel jeder TextDraw Variabel beim zerstören den Wert Text:INVALID_TEXT_DRAW zuweise.
    Da ja jedes TextDraw eine ID hat und diese in den entsprechenden Variabeln gespeichert wird, aber beim zerstören die Variabel vermutlich ihren Wert beibehält, war dies meine erste Vermutung. Daran kann es aber nicht mehr liegen, alle Variabeln von Zerstörten oder gar nicht erst erstellten TextDraws bekommen den Wert Text:INVALID_TEXT_DRAW. Wenn ein Neuer TextDraw erstellt wird, wird ja, so nehme ich es an, wie beim erstellen von Autos o.ä. einfach die nächst freie ID genommen. Es ist demnach also ausgeschlossen das zwei Variabeln für Textdraws den selben Wert haben und sich somit überschneiden. Vermutlich, denn irgentein Grund muss es geben.



    Habe einen Ausschnitt angehängt wie die PlayerTextDraws erstelle und zerstöre. Geupdated werden die beiden betroffenen gar nicht!!!! Sie zeigen immer nur das Fahrzeugmodel und die Tankstelle/das Lager an, welches sich ja während des Vorgangs nicht verändert



    Eventuell habt ihr ja Ideen, was ich noch überprüfen kann.





    Das macht doch keinen Sinn...


    Wenn du den Beitrag vorher gelesen hättest, wüsstest du, das die Vermutung war, dass es daran liegt, dass ich die Schleifen geändert habe.


    Vorher hatte ich die schleifen wie folgt:
    for(new i = 0; i < MAX_PLAYERS; i++)


    Mit der neuen Funktion dank RC2 wollte ich das abändern, so das die Schleifen kürzer werden, hatte dabei ein kleines Problemchen und mir wurde geraten nicht die Funktionen zu nutzen, sondern es durch eigene variabeln zu regeln.


    Dies habe ich gemacht, und um zu testen ob es nun an der Änderung liegt, habe ich die Variabeln die ich nun in den Schleifen nutze einfach zu constanten gemacht mit den vorherigen Wert, und zwar dem von MAX_PLAYERS.


    Somit sind die Schleifen nun so wie vorher, ohne dass ich nun wieder jede einzelne Schleife umschreiben muss.

    Bin gerade dabei, habe die variabeln nun zu Konstanten gemacht, so wie es vorher ja durch die MAX_PLAYERS definierung war und habe den Code, der die Variabel der ID anpasst auskommentiert.


    //


    Die datei bleibt so groß, obwohl Ich das nun folgend angepasst habe:


    new const MaxPlayers = MAX_PLAYERS;
    new const MaxVehicles = MAX_VEHICLES;


    Beispiel:
    for(new i = 0; i <= MaxPlayers; i++)
    {
    if(!IsPlayerConnected(i) || !LoggedIn[i] || IsPlayerNPC(i) || i == playerid) continue;
    if(Spieler[i][Fraktion] != Frak_Hitmen) continue;
    SendClientMessage(i,0x00A5FFFF, str);
    }

    Meine amx war vorher 2.3MB groß


    Sie ist jetzt 130MB groß



    Das einzige großaritge was ich geändert habe, waren die Player und Vehicle schleifen.


    Ich habe eine variabel erstellt die die maximale ID wiedergibt für einen Spieler und ein Fahrzeug, so dass die Schleifen nicht unnötig mehr durchlaufen.

    Ich bin mir nicht ganz sicher seit wann ich diesen fehler habe, aufjedenfall habe ich ihn gerade bemerkt als ich mir nochmal was in der Log durchgelesen habe:


    [debug] Run time error 20: "Invalid index parameter (bad entry point)" (von Crashdetect Plugin ausgegeben)


    ich weiß das der Fehler gerne kommt wenn man kein
    main() { } hat. Ist jedoch vorhanden und bitte bitte gibt mir das auch nicht als Lösungsvorschlag!


    Der Fehler kommt immer wenn sich jemand mit dem Server verbindet.
    Das Ihr den Fehler nicht auf die Zeile bestimmten könnt ist mir bewusst, aber eventuell lässt sich die Quelle eingrenzen, so dass ich das nochmal kontrolieren kann.


    Hier nochmal ein Ausschnitt aus meiner log-Datei:

    Code
    ----------Loaded log file: "server_log.txt".----------SA-MP Dedicated Server----------------------v0.3.7-RC2, (C)2005-2015 SA-MP Team[20:59:11] [20:59:11] Server Plugins[20:59:11] --------------[20:59:11]  Loading plugin: crashdetect.so[20:59:11]   CrashDetect v4.13.1-lse is OK.[20:59:11]   Loaded.[20:59:11]  Loading plugin: mysql.so[20:59:11]  SA:MP MySQL Plugin v2.1.1 Loaded.[20:59:11]   Loaded.[20:59:11]  Loading plugin: streamer.so[20:59:11] *** Streamer Plugin v2.7.5.2 by Incognito loaded ***[20:59:11]   Loaded.[20:59:11]  Loading plugin: sscanf.so[20:59:11] [20:59:11]  ===============================[20:59:11]       sscanf plugin loaded.     [20:59:11]          Version:  2.8.1        [20:59:11]    (c) 2012 Alex "Y_Less" Cole  [20:59:11]  ===============================[20:59:11]   Loaded.[20:59:11]  Loading plugin: MapAndreas.so[20:59:11]   Loaded.[20:59:11]  Loaded 5 plugins.[20:59:11] [MySQL] Thread running. Threadsafe: Yes.[20:59:11] [20:59:11] Filterscripts[20:59:11] ---------------[20:59:11]   Loading filterscript 'gl_actions.amx'...[20:59:11]   Loaded 1 filterscripts.[20:59:11] [MySQL] Connected (0) to 'root'@'Localhost via UNIX socket'.[20:59:11] [MySQL] Server Version 5.5.40-0+wheezy1.[20:59:11] [MYSQL] Verbindung zur Datenbank wurde erfolgreich hergestellt![20:59:11] sscanf warning: String buffer overflow.[20:59:11] sscanf warning: String buffer overflow.[20:59:11] sscanf warning: String buffer overflow.[20:59:11] Number of vehicle models: 134[20:59:12] Incoming connection: 127.0.0.1:37120 id: 0[20:59:12] [debug] Run time error 20: "Invalid index parameter (bad entry point)"[20:59:12] [npc:join] Priester has joined the server (0:127.0.0.1)

    ne das ist doch quatsch.


    Habs schon angepasst auf meine Slotanzahl.
    Aber mal angenommen ich habe 200 Slots, es sind aber nur 50 Spieler drauf, wieso sollte er dann immer bis 200 zählen, wenn er schon bei 50 aufhören kann.
    Dann mache ich mir doch lieber einmal die Arbeit und passe das dementsprechend an.

    hey


    schreibe meins script gerade auf 0.3.7 RC2 um. War ein wenig faul und wollte es einfach lösen:


    Alte Schleifen habe ich folgendermaßen geändert:
    for(new i = 0; i < MAX_PLAYERS; i++)
    zu
    for(new i = 0; i < Players(); i++)


    und


    for(new i = 0; i < MAX_VEHICLES; i++)
    zu
    for(new i = 0; i < Vehicles(); i++)


    Dazu habe ich dann folfende stocks eingeüft:


    stock Players()
    {
    new MaxPlayers = GetPlayerPoolSize();
    return MaxPlayers;
    }


    und


    stock Vehicles()
    {
    new MaxVehicles = GetVehiclePoolSize();
    return MaxVehicles ;
    }


    funktioniert jedoch nicht, ich gehe davon aus das es daran liegt das ich ein stock innerhalb einer Schleife aufrufe und das anscheinend nicht klappt.
    Hat jemand ein Lösungsvorschlag, ohne dass ich vor jeder schleife erst new bla = GetPlayerPoolSize(); schreiben muss?

    Ja, habe auch SA:MP neu installiert, erstrecht weil ich nun ja auch 0.3.7 benutze.


    Ich glaube auch das es mehr an GTA und nicht an SA:MP liegt, da letztendlich ja die gta.exe ausgeführt wird.


    //nachtrag:


    Wenn ich nur gta starte und beende, stürzt gta nicht ab, aber mein antivir programm