39DLL Hilfe benötigt

  • GM 8

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

  • 39DLL Hilfe benötigt

    Einen schönen guten Tag, liebe Gm-Gemeinde!

    Ich sitze seit längerem an einem größeren Projekt und alles lief absolut prima.
    ABER seit 3 Tagen sitze ich daran, mein Projekt in eine Online-Engine einzubauen.
    Ich habe das nette MMo-Example aus dem Netz gewählt und fing an daran rumzuspielen und das System dahinter zu verstehen.
    ABER ich wollte nun die Kugel, die mein Spieler abfeuert auch beim Mitspieler anzeigen lassen. ABER die Kugeln bleiben local.
    Ich habe verschiedene Möglichkeiten versucht und sitze heute wieder 40min an dieser Sache.
    Ich steige langsam nicht mehr durch wie ich die Kugeln für ALLE erzeuge.
    Ein schooter ohne fliegender Kugeln ist nunmal kein schooter! ^^

    Das "Problem": Ich arbeite mit einem Client und einem Server. Liegt das Problem vielleicht daran?
    Ich habe hier aus dem Forum die "39DLL Simples Spiel" getestet. Den Kugelpart angewandt und erneut gescheitert.

    Hier gibt es ja unzählige Online-Experten, die das Problem bestimmt innerhalb von 1min lösen könnten, oder? ^^
    Ich jage gleich mal die Examples hoch :)

    mfg ein verzweifelter BaZZ

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

  • Damit dein Spiel Cheatsicherer ist, lasse den Server die Kugeln steuern, nie den Clients so eine Aufgabe überlassen. Du musst dem Server aber nun sagen das du deine Waffe abfeuern willst, du kannst z.B. eine Dummy-Kugel erstellen die beim Client abgefeuert wird, aber nichts tut. Der Server erstellt nun selber eine Kugel und sagt den anderen Spielern das Spieler xyz eine Kugel abgefeuert hat. Die Clients erstellen nun selbst eine Dummy-Kugel. Wird ein Spieler getroffen so wird beim Server Leben abgezogen und dem jeweiligen Client das mitgeteilt. (Wenn der Client das Leben steuert kann man relativ leicht cheaten, unendlich Leben und sowas).

    #edit:
    Da du hoffentlich das System verstanden hast, weißt du auch wie man solche Nachrichten sendet. (clearbuffer() - writebyte(PacketID) - Daten - sendmessage(socketID)...). Hier nochmal Aufbau:


    Spieler feuer Waffe -> Dummy-Kugel wird erstellt und eine Nachricht zum Server geschickt das der Spieler gerade eine Waffe abgefeuert hat

    Server -> verarbeitet die Nachricht, erstellt Kugel und sendet die Nachricht weiter an alle anderen Clients

    Clients -> verarbeitet auch die vom Server gesendetete Nachricht, erstellen Dummy-Kugel

    #edit2:

    Im Server-Client System ist der Client meist nur dazu da die Spielwelt zu zeichnen und die Eingaben vom Spieler zum Server zu senden.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Erstmal vielen Dank für deine schnelle Antwort! :thumbup:

    Ich habe es eben schnell versucht, aber wie genau fange ich an?
    Mache ich ein Dummy-Bullet Objekt imclient und ein Bullet-Objekt in der Server.gmk und schreibe in die Server scr-movement einen neuen Case rein oder soll der server nur die vom spieler erzeugte dummy-kugel ersetzen und zeichnen?

    Es herrscht gerade große Verwirrung meinerseits, sorry komme gerade von der Arbeit und jaaa... 8|
  • Also ich habe das mal so gemacht:

    Client Schussbefehl (im Step event des Players):

    Spoiler anzeigen

    GML-Quellcode

    1. if mouse_check_button_pressed(1) && ammo>0
    2. {
    3. ammo-=1
    4. with instance_create(x,y,o_bullet)
    5. {
    6. dir=point_direction(x,y,mouse_x,mouse_y)
    7. direction=dir
    8. speed=6
    9. clearbuffer()
    10. writebyte(msg_bullet)
    11. sendmessage(global.tcp)
    12. }
    13. }
    Alles anzeigen


    Client empfängt Schüsse vom anderen Clienten/Mobs:
    Spoiler anzeigen

    GML-Quellcode

    1. case msg_bullet:
    2. ID=readbyte()
    3. with instance_create(o[ID].x,o[ID].y,o_bullet_enemy)
    4. {
    5. direction=other.o[other.ID].direction
    6. speed=6
    7. ID=other.ID
    8. }
    9. break;



    Server empfängt eine Kugel und leitet die an alle anderen Clienten weiter:
    Spoiler anzeigen

    GML-Quellcode

    1. case msg_bullet:
    2. with (player)
    3. {
    4. if ID!=other.ID
    5. {
    6. clearbuffer()
    7. writebyte(msg_bullet)
    8. writebyte(other.ID)
    9. sendmessage(tcp)
    10. }
    11. }
    12. break;
    Alles anzeigen





    PS: Ich finde die Formatierung hier fürchterlich.
  • @lordvanzed, der Code sieht soweit ganz gut aus nur eben das die Bullets noch immer Client-Side sind, das ist eben nicht Cheatsicher. Übrings, du kannst auch im Server die Buffer einmal beschreiben und dann die Nachricht an alle Spieler schicken:

    GML-Quellcode

    1. clearbuffer();
    2. writebyte(msg_bullet);
    3. writebyte(other.ID);
    4. with (player)
    5. {
    6. if (ID!=other.ID)
    7. {
    8. sendmessage(tcp);
    9. }
    10. }
    Alles anzeigen
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%