Chat Erweitert

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Chat Erweitert

    Guten Tag.
    Ich habe ein paar Fragen bezüglich des Chat-Beispiels, das dem MP-Tutorial beigefügt ist.
    Und zwar habe ich dieses Beispiel immer weiter erweitert, bis zu einem gewissen Punkt hat auch alles funktioniert.

    Funktionierende Add-Ons:
    • /me-Funktion ("HeartAttack hat Langeweile")
    • Wichtige Nachricht (Sound wird abgespielt)
    • CLS-Funktion (Clear Screen, Bildschirmausgabe wird gelöscht)
    • Stummschalten (Für zwei Minuten können keine Nachrichten empfangen werden, wird noch optimiert)
    • Stummschalten beenden (äh, ja, äh)


    So weit hat alles funktioniert, das Programm hat alles mitgemacht. Dann wollte ich gestern folgende Features hinzufügen:
    • User finden (mithilfe der User ID)
    • MSG an User senden (wieder mithilfe der User ID)
    • (Server Only) User kicken (wieder User ID)


    Hab ich dann getestet: Kompiliert, mehrmals gestartet, erst Server, dann Client.

    Nun folgendes Problem:
    Es wird dem Server zwar angezeigt "XYZ hat den Chat betreten", aber wenn ich dann Strg drücke (wodurch der Code abgerufen wird, der anzeigt, wer on ist) sagt er mir "Es ist kein anderer User online." Auch der Client bekommt diese Meldung angezeigt.
    Schreiben funktioniert gar nicht mehr.

    Nun meine Fragen, eine davon gehört nicht zu dem Problem:

    1. Wieso funktioniert das jetzt nicht mehr?
    2. Wieso werden, wenn der Idle beendet ist, sämtliche in der Zwuschenzeit geschriebenen Nachrichten nachgesendet?
      [/list=1]

      Solltet ihr Teile des Quellcodes brauchen, kann ich sie euch gerne geben.
  • Tja, man braucht definitiv einen gewissen Teil des Quellcodes. Zum Beispiel ist eine grundlegende Frage wie der Code aussieht, der zeigen soll wer "on" ist. Und überhaupt ist ja jetzt nicht bekannt wie du die User-IDs verwaltest. Du müsstest also schon einen Großteil des Codes freigeben (welche Elemente Du freigibst musst Du schon selber wissen, ich kenne ja jetzt die Struktur deines Chatrooms nicht präzise genug).
  • Ok, fangen wir mal an:

    Im Standard-Chat wurde beim Eintreten folgender Code durchgespielt:

    GML-Quellcode

    1. {
    2. // initialize the text
    3. script_initlines();
    4. keyboard_string = '';
    5. // find out who is around
    6. n = mplay_player_find();
    7. if (n <= 1)
    8. {
    9. script_addline('Niemand anders ist in diesem Raum.',c_red);
    10. }
    11. else
    12. {
    13. str := 'Gerade Online: ';
    14. for (i=1; i<n; i+=1) str += mplay_player_name(i) + ' ';
    15. script_addline(str,c_red);
    16. }
    17. }
    Alles anzeigen

    Diesen Code hab ich auf Strg gesetzt, damit man jederzeit die User, die on sind, angezeigt bekommen kann, also selber Text im Press Key Event Strg.

    -Event im Controller:

    GML-Quellcode

    1. // Check for messages
    2. {
    3. if (mplay_message_receive(0))
    4. {
    5. if (mplay_message_id() == 1)
    6. script_addline(mplay_message_name() + ': ' + mplay_message_value(),c_yellow);
    7. if (mplay_message_id() == 3)
    8. script_addline(mplay_message_name() + ' ' + mplay_message_value(),c_white);
    9. // special messages
    10. if (mplay_message_id() == 2)
    11. {
    12. script_addline(mplay_message_value(),c_red);
    13. sound_play(alarm);
    14. }
    15. if (mplay_message_id() == 4)
    16. {
    17. script_addline(mplay_message_name() + ': ' + mplay_message_value(),c_blue);
    18. sound_play(alarm)
    19. }
    20. if (mplay_message_id() == 5)
    21. {
    22. script_addline(mplay_message_name() + ' ' + mplay_message_value(),c_red);
    23. sound_play(alarm)
    24. }
    25. if (mplay_message_id() == 6)
    26. {
    27. script_addline(mplay_message_name() + ' flüstert: ' + mplay_message_value(),c_white);
    28. sound_play(alarm)
    29. }
    30. {
    31. if (mplay_message_id() == 666)
    32. script_addline('Sie wurden soebend gekickt.',c_red);
    33. sleep(2000)
    34. mplay_session_end()
    35. }
    36. }
    37. }
    Alles anzeigen

    (Ich weiß, dass es etwas merkwürdig ausschaut, aber es hat bis zum Teil mit dem Kick einwandfrei funktioniert)

    Den Idle-Button hab ich einfach mit ner Drag&Drop-Variable gemacht.
    (if idle = 0 then execute code else einfach net)

    Um einen User anhand der ID zu finden, habe ich folgendes gemacht:
    (Basierend auf der Useranzeige)

    GML-Quellcode

    1. {
    2. var spieler;
    3. n = mplay_player_find();
    4. spieler = get_integer('Bitte geben sie eine Nummer ein:',0);
    5. str := 'Der Spieler mit der angegebenen Nummer ist ';
    6. str += mplay_player_name(spieler) + ' ';
    7. script_addline(str,c_red);
    8. }


    Eine MSG an den User sende ich so:

    GML-Quellcode

    1. {
    2. var me, spieler;
    3. spieler = get_integer('An welchen Spieler?',0);
    4. me = get_string("Ihre Nachricht:","*tuschel*");
    5. keyboard_string = me
    6. script_addline(global.myname+' flüstert: '+keyboard_string,c_white);
    7. mplay_message_send_guaranteed(spieler,6,keyboard_string);
    8. keyboard_string = '';
    9. }


    Und der Kick geht so:

    GML-Quellcode

    1. {
    2. var spieler;
    3. n = mplay_player_find();
    4. spieler = get_integer('Bitte geben sie eine Nummer ein:',0);
    5. str = 'Der Spieler mit der angegebenen Nummer wurde gekickt.';
    6. mplay_message_send_guaranteed(spieler,666,'kick');
    7. script_addline(str,c_red);
    8. }
  • Auffällig ist sofort folgendes, da es bei dir immer in Kraft tritt:

    GML-Quellcode

    1. script_addline('Niemand anders ist in diesem Raum.',c_red);


    Augenblick, erstmal ne kleine Frage: Wenn nur der Server anwesend ist, gibt mplayer_player_find() einem dann schon eine 1 heraus oder eine 0? Lass die Aufzählung aller Anwesenden User mal immer stattfinden (entferne das else), also auch wenn n nicht die Anzahl der Anwesenden korrekt wiedergibt oder auch wenn nur der Server on ist.

    Jedenfalls findet dieses event nur statt wenn 'n <= 1' ist, das bedeutet:
    a) 'n' entspricht nicht wirklich mplayer_player_find() etwa weil Du die Variable woanders noch veränderst
    b) das Problem entsteht schon früher - das bedeutet mplayer_player_find() gibt tatsächlich eine zu niedrige Zahl heraus - somit hast Du in dem Fall ein Verbindungsproblem.

    Ist eigentlich das einzige was es sein kann, denn wenn bei dir immer das oben genannte Script in Kraft tritt, dann muss das Problem auch dabei oder davor liegen.
  • Dieses Script war aber doch schon im Beispielprogramm, das zum Tutorial auf gamemaker.nl gehörte?

    /EDIT also: Wenn nur der Server da is, wird ebenfalls kein User angezeigt. Merkwürdig.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von HeartAttack ()

  • Wie gesagt, müsste ein Verbindngsfehler sein, der schon vorher in Kraft tritt ober mit der Verwaltung der Spieler zusammenhängen.

    Vor allem: In mplayer_name() scheint keine Information zu stecken, wenn beim auslesen niemand angegeben wird.

    Und noch so'n eventueller Noobhinweis: Müsste das in der For-Schleife am Anfang nicht "i<=n" heißen? So bricht er doch soweit ich weiß sofort ab.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von F4LL0UT ()

  • Ich kenn mich mit GML ehrlich gesagt überhaupt nicht aus, hab also keine Ahnung, was das bedeutet. Aber wenn ich für das i in mplay_player_name ne 0 setz, kommt mein Name.

    Ich zieh mir die EXE mal auf nen Stick und probiers an nem andern PC aus, ob es an meinem liegt.
  • Original von F4LL0UT
    Und noch so'n eventueller Noobhinweis: Müsste das in der For-Schleife am Anfang nicht "i=n" heißen? So bricht er doch soweit ich weiß sofort ab.

    Ne, bei "i=n" als 1. statement, würde die forschleife nicht ausgeführt werden, da sie nur solange ausgeführt wird wie i<n ist, siehe ausdruck...
  • Und wenn Du's auf 1 setzt? Kommt dann der Name des anderen raus?

    Und tatsächlich: Die for-schleife müsste zumindest 'i<=n' heißen. So bricht sie nämlich beim ersten ab (bei i = n wird die Schleife bereits beendet wenn Du als expression 'i<n' genommen hast, somit wird der zweite Spieler vermutlich garnichtmal ausgelesen, auch wenn er da ist).
  • @Trunx
    Sorry, Tippfehler. Hab's umeditiert bevor ich deinen Post gesehen hab'.

    Moment, wenn kein anderer User da ist, warum ist dann verwunderlich, dass er angibt, dass kein anderer User da ist??? Jedenfalls: Wenn nach genannter Änderung der For-Schleife immerhin der Host ausgespuckt wird, dann müsste im Fall, dass es einen Gast gibt auch dieser wiedergegeben werden.
  • So ist das also. Bist Du sicher, dass die vorgefertigten mplay Funktionen richtig funzen wenn die IP beider Anwendungen gleich ist? Könnte mir vorstellen, dass er das dennoch als nur einen Spieler annimmt und dir die Frage nach der Menge der Spieler dann nur einen Anwesenden ausspuckt, obwohl Du einen Client hast. Kann mich noch an das Experiment eines Kumpels erinnern, wo Client und Server (auf dem gleichen Rechner gestartet) am Ende die gleiche Spielfigur steuerten - im LAN funzte es aber einwandfrei, nämlich jeder steuerte seinen eigenen Typen. Interessante Erfahrung, die eventuell auch hier zutrifft.
  • Gelöst, sorry.
    Lag wohl an meinem Computer, dass es nicht funktioniert hat. Jetzt funkt es einwandfrei (sogar das Privatmessagesystem und das Kicken geht :D)

    Leider hab ich das .gm6-File nicht mehr, sondern nur die Exe, deshalb werden wohl keine weiteren funktionen folgen...
  • Benutzer online 1

    1 Besucher