Keystate (ENTER/F) hat keine Auswirkung mit der for-Schleife bei RangeOfPoint

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Ich habe mein dynamisches Fahrradverleihsystem soweit fertig, habe aber ein Problem, dass sich einfach beheben lässt.
    Und zwar wird der Fahrradverleih aus der Datenbank ausgelesen, erstellt und ist vollkommen sichtbar.
    Ein Harken bleibt dennoch, sobald ich auf das erstellte Icon gehe und die Taste ENTER/F Drücke erscheint einfach der Dialog nicht wie geplant.
    Die Console gibt wiederrum beide erstellten Verleihs als druchlauf an.


    Ich hoffe Ihr könnt mir helfen :/


    im nachfolgenden ist der Ausschnitt, wo ich den Verleih lade und auch erfolgreich erstellt wird


  • Das Problem bei Keystates ist, dass sich diese nicht einfach prüfen lassen, wie normale Zahlen, da diese als so genannte "Bit Mask" in PAWN landen.
    Das hat damit zu tun, das man mehrere Tasten gleichzeitig drücken kann.


    Hier findest du eigentlich eine gute Erklärung dazu wie man Keys richtig prüft. [wiki]OnPlayerKeyStateChange#How_NOT_to_check_for_a_key[/wiki][wiki]OnPlayerKeyStateChange#God_mode_while_holding_use[/wiki]

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ja warum funktioniert es dann bei den vordefinierten Koordinaten ?


    Hier erstelle im Scriptkopf die Standartgebäude:

    Code
    stock const ServerStates[MAX_SERVERSTATES][sCFG] = {
    	{ PICKUP_PFEIL,3,0,""#SERVERFARBE"Stadthalle\n{FFFFFF}Drücke ENTER/F",1480.8480,-1771.5313,18.7958,390.7539,173.8786,1008.3828,true},
    	{ PICKUP_PFEIL,0,0,""#SERVERFARBE"Citybank\n{FFFFFF}Drücke ENTER/F",1469.4771,-1011.4132,26.8438,2305.5535,-16.3067,26.7496,true}
    };


    hier habe ich sie auch bei KeyState unter der taste ENTER/F


    Hier funktioniert das ganze einwandfrei :huh:
    Also denke ich nicht das es an der Keyprüfung liegt ?(

  • Dann musst du anfangen zu debugen.


    Lass dir via printf mal die ID des Verleihs ausgeben und die Koordinaten, wenn du die Enter Taste drückst.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Code: server_log.log
    [22:49:34] Fahrradverleih 0:
    [22:49:34] 0.000000 0.000000 0.000000
    [22:49:34] Fahrradverleih 1:
    [22:49:34] 1182.340332 -1332.666992 13.583100

    Habe es mal bei dem zweiten Verleih probiert und da funktioniert ist scheinbar.
    Beim Ersten Verleih (ID 0) nicht, da ja die Coords 0 betragen, woran kann das den liegen ?


    EDIT:
    Habe mal ein 3. Verleih hinzugefügt, aber beim Start des Server, bekomme ich keinen Debug von public LoadDataInfo, das die Tabelle ausgelesen und geladen wurde. Sobald ich den 3. Eintrag lösche ist alles wieder beim alten ?(

    Einmal editiert, zuletzt von EllBundy ()

  • Ich bin der Sache nun näher auf de Grund gegangen und hab wie du gesagt hast gedebugt.
    Mir kam das seltsam vor, dass er erstellt wird, aber danach nicht exestiert. Somit habe ich die for-schleife bei LoadData unter die Lupe genommen und mit hilfe des Debugs festegestellt,
    das es beim ersten durchlauf gelesen und erstellt wird. Sobald der 2. durchlauf startet, wird der der 1. resettet.
    Ich habe mir den Code näher angeschaut und kann mir einfach nicht erklären, woran das liegen :whistling::whistling:


    Ich hoffe ihr könnt mir bei dem Problem helfen, da ich selbst schon am verzweifeln bin, aber einfach nicht aufgeben will und alles Manuell eintragen will, sowie einzeln auslesen...


    Danke im Vorraus

    hier die Ausgabe der Checks, an die server_log.log


    Code: server_log.log
    [15:54:12] [LOADDATA]Fahrradverleih 0:
    [15:54:12] 1753.994384 -1887.939941 13.557000
    [15:54:12] [LOADDATA]Fahrradverleih 1:
    [15:54:12] 1182.340332 -1332.666992 13.583100
    
    
    [15:54:12] [LOADDATA:CHECK]Fahrradverleih 0:
    [15:54:12] 0.000000 0.000000 0.000000
    [15:54:12] [LOADDATA:CHECK]Fahrradverleih 1:
    [15:54:12] 1182.340332 -1332.666992 13.583100
  • Ich hab es nun 1:1 nachgebaut bzw. deinen vorhanden Code genutzt, mehrere Datenbanken ausprobiert und kann es einfach nicht reproduzieren.


    Ich weiß nicht ob es daran liegt, das ich einen anderen Compiler benutze.
    Ich werde das mal probieren.


    // Edit: Auch nach mehrfachen versuchen (mit dem Standard Compiler) bleibt es dabei, dass ich es nicht reproduzieren kann.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

    Einmal editiert, zuletzt von Akino Kiritani ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Ich habe eben nochmal gegrübelt und dachte mir wenn der erste durchlauf durch den 2. resettet wird.
    Sollte was mit der Variable nicht stimmen wo ich die Infos abspeichere.
    Daraufhin habe ich mir die Variable näher betrachtet:
    enum FVerleihData{
    //...
    }
    new FVerleih[][FVerleihData];


    und habe einfach eine vordefinierten array eingefügt, in dem Fall die 2, da ich 2 Verleihs habe.
    Also so
    enum FVerleihData{
    //...
    }
    new FVerleih[2][FVerleihData];


    Nach dem Test in der Console und auf dem Server funktioniert nun alles.
    Dennoch bleibt die Frage wie mache ich das am besten, da ich das ja dyn. haben will.
    Das ich jederzeit InGame einen erstellen kann, damit er auch geladen wird und abgespeichert...


    Würde das so funktionieren ?
    #define MAX_FVERLEIH 10 // Beispielanzahl
    enum FVerleihData{
    //...
    }
    new FVerleih[MAX_FVERLEIH][FVerleihData];


    und bei der for-Schleife dann nur FVerleihCount nehme, da die Variable ja wiedergibt wieviele Einträge in der Datenbank sind.
    Dann muss ich zwar wenns mal über 10 gehen sollte das im Script erhöhen...

  • Daraufhin habe ich mir die Variable näher betrachtet:

    Ach herrje, daran das du evtl. eine leere Variablenngröße angegeben hast hab ich gar nicht gedacht.
    PAWN funktioniert leider so nicht. Man kann es so machen, aber dann füllt PAWN halt immer nur einen Wert.


    Das ist halt das Problem mit statischen Sprachen - sie brauchen idR eine feste Größe mit der sie arbeiten können.

    Würde das so funktionieren ?

    Ja, dass wird so funktionieren und ist auch Erstrebenswert so zu arbeiten.
    Wie gesagt, PAWN braucht feste Größen.
    Es gibt Möglichkeiten Variablengrößen richtig dynamisch zu gestalten, ist aber für einen Anfänger definitiv etwas viel.



    und bei der for-Schleife dann nur FVerleihCount nehme, da die Variable ja wiedergibt wieviele Einträge in der Datenbank sind.

    Ja und nein.
    Im Grunde eine gute Idee. Du wirst nur ein Problem bekommen, wenn du mal einen Eintrag während der Runtime löschen solltest.


    Wir nehmen mal dein Beispiel mit 2 Verleihs.
    Sofern auch 2 vorhanden sind ist alles gut.


    Nun bist du aber der Meinung - eigentlich reicht auch einer und löscht den ersten Verleih.
    Entsprechend sinkt nun auch der Wert FVerleihCount um eins, da nun ein Verleih wegfällt.


    Wir erinnern uns, dass du 2 geladen hast, und die Arraynummern 0 und 1 wurden gefüllt.
    Löscht du jetzt den ersten also 0 und versucht dann mit deinem Wert FVerleihCount zu arbeiten, wirst du feststellen. dass deine Schleife nur den ersten Array (0) versucht auszulesen.
    Dieser ist durch die Löschung nun nur leider leer und du kommst auf direktem Wege nicht mehr an den 2. Verleih.


    Entsprechend ist es sinnvoller, die Schleife so zu gestalten, dass sie theoretisch jeden Wert erreichen kann.
    Nur musst du hierbei darauf achten, einen Check zu erstellen, ob die Werte auch geladen wurden.


    Diesen Check kannst du gestallten wie du möchtest. Du kannst dir eine Variable in der Enum Struktur erstellen und es darüber machen oder du prüfst einfach ob ein Wert nicht 0 bzw. leer ist.
    Hierfür könntest du bspw. pID oder sogar einfach die IconID nehmen. Diese sollten idR nicht 0 sein, wenn Werte vorhanden sind.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski