(39dll) Mir rätselhafte Bugs und Dinge

  • GM 8

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

  • (39dll) Mir rätselhafte Bugs und Dinge

    Erstmal Hallo Community,

    Ich arbeite zurzeit an meiner Multiplayer Engine, die teilweise Probleme aufzeigt. Bei dieser .gmk handelt es sich um einen Server und Client zugleich.

    Die Engine verfolgt das Prinzip, wenn gehostet wird, erstellt sie einen Client, der dann direkt zum Server verbindet. Somit hat man die Verbindungsart, wie sie in den meisten Spielen ist(Wie auch oft in Strategiespielen).
    Die Clients senden oder empfangen nichts oder der Server sendet oder empfängt nicht.

    1. Problem der Spieler kann nie den Namen andere Clients sehen (Keine Ahnung warum?)
    2. Problem der Spieler kann nicht alle Clients sehen (Der Erste sieht nur den Zweiten usw. Manchmal sieht keiner mehr alles was nach Client ID 2 kommt)

    Hier ein Bid von dem Problem:


    Es soll gesagt sein, dass alle Objekte auf persistent sind.

    In meiner .gmk gibt es insgesamt 6 Obkete:

    Einemal:

    'obj_control_menu' <- Menu, das nur dafür sorgt ob du mit 'H' hostest oder mit 'J' joinen kann.

    Serverseitig:

    'obj_server_control' <- Startet einen Server und wartet auf Clients.
    Spoiler anzeigen
    -> Create:

    GML-Quellcode

    1. servertcp = tcplisten(76765,10,true);
    2. if(!servertcp)
    3. {
    4. show_message("Couldn't start a server");
    5. instance_destroy();
    6. exit;
    7. }
    8. else
    9. {
    10. show_message("Could start a server");
    11. for(a=1;a<256;a+=1)
    12. {
    13. clients[a] = -1;
    14. }
    15. host = instance_create(0,0,obj_client_control);
    16. }
    Alles anzeigen
    -> Step:

    GML-Quellcode

    1. stcp = tcpaccept(servertcp,true);
    2. if(stcp)
    3. {
    4. for(b=1;b<256;b+=1)
    5. {
    6. if(clients[b] == -1)
    7. {
    8. clients[b] = 1;
    9. client_id = b;
    10. break;
    11. }
    12. }
    13. client = instance_create(0,0,obj_server_client);
    14. client.x = random(room_width-32);
    15. client.y = random(room_height-32);
    16. client.tcp = stcp;
    17. client.client_id = client_id;
    18. clients[client_id] = client;
    19. setnagle(client, false);
    20. clearbuffer();
    21. writebyte(CLIENT_LOGIN);
    22. writebyte(client_id);
    23. writeshort(client.x);
    24. writeshort(client.y);
    25. with(obj_server_client)
    26. {
    27. if(id != other.id)
    28. {
    29. sendmessage(tcp);
    30. }
    31. }
    32. with(obj_server_client)
    33. {
    34. if(id != other.client)
    35. {
    36. clearbuffer();
    37. writebyte(CLIENT_LOGIN);
    38. writebyte(client_id);
    39. writeshort(x);
    40. writeshort(y);
    41. writestring(nickname, true);
    42. sendmessage(other.stcp);
    43. }
    44. }
    45. }
    Alles anzeigen
    'obj_server_client' <- versendet Daten weiter an Clients (Mögl. Problem, kann sein, dass er das nicht tut.)
    Spoiler anzeigen
    -> Step:

    GML-Quellcode

    1. while(1)
    2. {
    3. size = receivemessage(tcp);
    4. if(size<0) break;
    5. if(size==0)
    6. {
    7. instance_destroy();
    8. break;
    9. }
    10. timeout = 0;
    11. mid = readbyte();
    12. switch(mid)
    13. {
    14. case CLIENT_NICKNAME:
    15. nick = readstring();
    16. clearbuffer();
    17. writebyte(CLIENT_NICKNAME);
    18. writebyte(client_id);
    19. writestring(nick, true);
    20. with(obj_server_client)
    21. {
    22. if(id != other.id)
    23. {
    24. sendmessage(tcp);
    25. }
    26. }
    27. break;
    28. }
    29. }
    Alles anzeigen
    Clientseitig: 'obj_client_control' <- Baut Verbindung auf, versendet(Mögl. Problem, kann ebenfalls sein, dass er das nicht tut) und emfängt Daten und erstellt gebenfalls Instanzen.
    Spoiler anzeigen
    -> Create:

    GML-Quellcode

    1. nickname = get_string("Enter your name:","USER");
    2. tcp = tcpconnect("127.1.1.0",76765,1)
    3. if(!tcp)
    4. {
    5. show_message("Couldn't join a server");
    6. }
    7. else
    8. {
    9. show_message("Could join a server");
    10. setnagle(tcp,false);
    11. for(a=1;a<256;a+=1)
    12. {
    13. clients[a] = -1;
    14. }
    15. client_id = 0;
    16. clearbuffer();
    17. writebyte(CLIENT_NICKNAME);
    18. writestring(nickname);
    19. sendmessage(tcp);
    20. color = c_white;
    21. }
    Alles anzeigen

    -> Step:

    GML-Quellcode

    1. while(1)
    2. {
    3. size = receivemessage(tcp);
    4. if(size < 0) break;
    5. if(size == 0)
    6. {
    7. game_restart();
    8. break;
    9. }
    10. mid = readbyte();
    11. switch(mid)
    12. {
    13. case CLIENT_LOGIN:
    14. if(client_id == 0)
    15. {
    16. client_id = readbyte();
    17. x = readshort();
    18. y = readshort();
    19. client = instance_create(x,y,obj_client_player);
    20. client.client_id = client_id;
    21. client.nickname = nickname;
    22. }
    23. else
    24. {
    25. _client_id = readbyte();
    26. _x = readshort();
    27. _y = readshort();
    28. clients[_client_id] = instance_create(_x,_y,obj_client_other);
    29. clients[_client_id].client_id = _client_id;
    30. }
    31. break;
    32. case CLIENT_NICKNAME:
    33. player = clients[readbyte()];
    34. player.nickname = readstring();
    35. break;
    36. }
    37. }
    Alles anzeigen

    -> Draw:

    GML-Quellcode

    1. draw_set_color(c_black);
    2. draw_set_halign(fa_left);
    3. draw_text(16,16,"Client ID: "+string(client_id));

    'obj_client_player' <- Wiederspiegelt das Spielerobjekt des Clients.
    Spoiler anzeigen
    -> Draw:

    GML-Quellcode

    1. switch(client_id)
    2. {
    3. case 1: color = c_blue break;
    4. case 2: color = c_red break;
    5. case 3: color = c_green break;
    6. case 4: color = c_yellow break;
    7. case 5: color = c_orange break;
    8. case 6: color = c_purple break;
    9. case 7: color = c_aqua break;
    10. case 8: color = c_teal break;
    11. case 9: color = c_fuchsia break;
    12. case 10: color = c_lime break;
    13. }
    14. draw_set_color(color);
    15. draw_circle(x,y,16,false);
    16. draw_set_color(c_black);
    17. draw_set_halign(fa_center);
    18. draw_text(x,y-32,"["+string(client_id)+"] ["+nickname+"]");
    Alles anzeigen

    'obj_client_other' <- Wiederspiegelt die Spielerobjekte der anderen Clients.
    Spoiler anzeigen
    -> Create:

    GML-Quellcode

    1. nickname = "";
    2. color = c_white;

    -> Draw:

    GML-Quellcode

    1. switch(client_id)
    2. {
    3. case 1: color = c_blue break;
    4. case 2: color = c_red break;
    5. case 3: color = c_green break;
    6. case 4: color = c_yellow break;
    7. case 5: color = c_orange break;
    8. case 6: color = c_purple break;
    9. case 7: color = c_aqua break;
    10. case 8: color = c_teal break;
    11. case 9: color = c_fuchsia break;
    12. case 10: color = c_lime break;
    13. }
    14. draw_set_color(color);
    15. draw_circle(x,y,16,false);
    16. draw_set_color(c_black);
    17. draw_set_halign(fa_center);
    18. draw_text(x,y-32,"["+string(client_id)+"] ["+nickname+"]");
    Alles anzeigen


    Lade noch die .gmk hoch;) Hoffe jemand findet Zeit mir dabei zu helfen.
    --------------------------------------------------------------

    Edit: Oh man ist mir das peinlich. Ich hab mit "127.1.1.0" verbunden, statt mit "127.0.0.1" Problem gelöst, kann gern geschlossen werden.
    Mono C# / SFML.Net <3

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Xable ()