[39dll] Seltsames Problem beim Empfangen von Nachrichten

  • GM 7

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

  • [39dll] Seltsames Problem beim Empfangen von Nachrichten

    Also ich fang mal direkt an, da ich in letzter Zeit so viel zum Thema 39dll gefragt hab.
    Und zwar funktioniert die Übertragung komplett reibungslos, bis auf einen Punkt. Bei einer bestimmten Übertragung funktioniert es nur, wenn das Spiel vorher kurz einfriert, was bei show_message() und sleep() der Fall ist. Kann sich das irgendwer erklären?
    Denn das würde ja bedeuten dass man danach erst aus dem Buffer lesen kann. Denn die Nachricht kommt ja an nachdem er in diesen case geht.

    GML-Quellcode

    1. case CREATEFLAG:
    2. var xp,yp;
    3. sleep(200)
    4. xp=readshort();
    5. yp=readshort();
    6. message_send_all(CREATEFLAG,xp,yp)
    7. instance_create(xp,yp,obj_flag)
    8. break;

    © 2008 by Teamgrill Productions
  • message_send_all()
    macht das ganze kombiniert indem es die nachricht an alle anderen spieler sendet.
    Aber was du meinst versteh ich net. Was soll den das bringen? weiter vorher kann mans net auslesen lassen.

    © 2008 by Teamgrill Productions
  • Das wird ein bissl lang sein. Es ist nur das receivemessage() danach die abfrage nach der id und dann eben das statement mit:

    GML-Quellcode

    1. switch (mesid)
    2. {
    3. case BLA:
    4. ....
    5. break;
    6. }


    inklusive dem aufgeführten von oben. der Text bei case is mal so nebenbei erwähnt eine Konstante nicht dass da noch jemand sagt es geht deswegen nicht.

    © 2008 by Teamgrill Productions
  • gib mal den ganzen empfang und sende code inklusive dem skript message_send_all, ich sags nochmal.
    fest steht, dass es wohl kaum an einem sleep() liegen wird, deshalb muss der code woanders liegen als da, wo du vermutest.
    "das war meine letzte flamewar PM an dich ."
  • Daran liegts aber denn wenn das net drin is gehts net. man kann auch ein show_message() einbauen. Und es bringt auch nichts den anderen Teil zu zeigen weil das einfach weitere cases vom switch-statement sind. Das empfangen und senden läuft gleich wie in den ganzen Tutorials. Aber damit keiner sagt ich lasse mir nicht helfen.
    Empfang (empfängt von plid => ist die id des jeweiligen players von dem empfangen wird):
    Spoiler anzeigen

    GML-Quellcode

    1. var s,mid;
    2. if (global.master)
    3. {
    4. while (true)
    5. {
    6. clearbuffer();
    7. s=receivemessage(plid);
    8. bufferdecrypt(global.bufferpass);
    9. if (s<=0)
    10. break;
    11. mid=readbyte();
    12. switch (mid)
    13. {
    14. case POSITION:
    15. x=readshort();
    16. y=readshort();
    17. image_angle=readshort();
    18. turdir=readshort();
    19. hp=readshort();
    20. nodam=readshort();
    21. flag=readshort();
    22. weapon=readshort();
    23. team=readshort();
    24. message_send_all(POSITION,plid,x,y,image_angle,turdir,hp,nodam,flag,weapon,team)
    25. break;
    26. case SHOOT:
    27. var dif1,dif2,dif3,w;
    28. w=readshort();
    29. dif1=readshort();
    30. dif2=readshort();
    31. dif3=readshort();
    32. shoot(plid,w,dif1,dif2,dif3,team)
    33. message_send_all(SHOOT,plid,w,dif1,dif2,dif3)
    34. break;
    35. case CREATESEC:
    36. var obj,xpos,ypos,p,inst;
    37. xpos=readshort();
    38. ypos=readshort();
    39. p=readshort();
    40. obj=readshort();
    41. inst=instance_create(xpos,ypos,obj);
    42. inst.creator=p;
    43. inst.team=team;
    44. message_send_all(CREATESEC,xpos,ypos,plid,obj);
    45. break;
    46. case KILL:
    47. var who;
    48. deaths=readshort();
    49. who=readshort();
    50. message_send_all(KILL,plid,deaths,who)
    51. with (get_panzer(who))
    52. {
    53. kills+=1;
    54. money+=real(getinfo(global.infostr,0,'|'))
    55. message_send_all(VARLOCAL,plid,"kills",kills)
    56. }
    57. break;
    58. case VARLOCAL:
    59. var vari,w;
    60. vari=readstring();
    61. w=readshort();
    62. variable_local_set(vari,w)
    63. message_send_all(VARLOCAL,plid,)
    64. break;
    65. case TURHP:
    66. var xpos,ypos,h,t;
    67. xpos=readshort();
    68. ypos=readshort();
    69. h=readshort();
    70. t=get_turret(xpos,ypos);
    71. if (t!=-1)
    72. t.hp=h;
    73. message_send_all(TURHP,xpos,ypos,h)
    74. break;
    75. case TURDESTROY:
    76. var xpos,ypos;
    77. xpos=readshort();
    78. ypos=readshort();
    79. with (get_turret(xpos,ypos))
    80. {
    81. instance_destroy()
    82. repeat (random(5)+1) create_effect(x,y,spr_break,random(2),10*room_speed,0.3+random(0.4),0.3+random(0.4),random(360),1,1,c_white,random(3)+5,random(360))
    83. }
    84. message_send_all(TURDESTROY,xpos,ypos)
    85. break;
    86. case REFRESH:
    87. ds_map_replace(global.playerdata,readshort(),readstring())
    88. message_send_all(REFRESH,ds_map_write(global.playerdata))
    89. break;
    90. case PLAYERLEAVE:
    91. var text;
    92. text=string(getinfo(string(ds_map_find_value(global.playerdata,plid)),0,'|'))+' hat das Spiel verlassen.'
    93. if (flag=1&&ds_map_size(global.playerdata)>2)
    94. {
    95. message_send_all(CREATEFLAG,x,y)
    96. with (obj_flag)
    97. instance_destroy();
    98. instance_create(x,y,obj_flag)
    99. text+='#Die Flagge ist unbewacht!'
    100. }
    101. else
    102. {
    103. flag=0
    104. }
    105. gametext(text,room_speed*3);
    106. ds_map_delete(global.playerdata,plid);
    107. message_send_all(PLAYERLEAVE,plid)
    108. closesocket(plid);
    109. refresh_serverdata()
    110. instance_destroy();
    111. if (ds_map_size(global.playerdata)=1){
    112. with (obj_flag) instance_destroy()}
    113. break;
    114. case CREATEFLAG:
    115. var xp,yp;
    116. sleep(200)
    117. xp=readshort();
    118. yp=readshort();
    119. message_send_all(CREATEFLAG,xp,yp)
    120. instance_create(xp,yp,obj_flag)
    121. break;
    122. case GAMETEXT:
    123. var txt,t;
    124. txt=readstring();
    125. t=readshort();
    126. obj_hud.drawtext=txt;
    127. obj_hud.alarm[0]=t;
    128. message_send_all(GAMETEXT,txt,t)
    129. break;
    130. case CHAT:
    131. var pl,text;
    132. pl=readshort();
    133. text=readstring();
    134. addline(text,name,color_change(col2,-100));
    135. obj_chat.new=1;
    136. obj_chat.fromn=name;
    137. obj_chat.fromcol=color_change(col2,-100);
    138. message_send_all(CHAT,pl,text);
    139. break;
    140. }
    141. }
    142. }
    Alles anzeigen


    und send_message_all() (was aber eig sinnlos is weils ja am empfang liegt.):
    Spoiler anzeigen

    GML-Quellcode

    1. var i;
    2. if (global.master){
    3. for (i=0; i<ds_map_size(global.playerdata); i+=1)
    4. {
    5. pl=ds_map_find_key_pos(global.playerdata,i);
    6. if (variable_local_exists('plid'))
    7. {
    8. if (real(pl)!=real(plid))
    9. message_send(pl,argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument10,argument11,argument12,argument13,argument14)
    10. }
    11. else
    12. {
    13. if (real(pl)!=global.playerid)
    14. message_send(pl,argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument10,argument11,argument12,argument13,argument14)
    15. }
    16. }} else {
    17. message_send(global.server,argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument10,argument11,argument12,argument13,argument14)}
    Alles anzeigen


    greift auf message_send() zurück:
    Spoiler anzeigen

    GML-Quellcode

    1. var i;
    2. clearbuffer();
    3. writebyte(argument1);
    4. for (i=2; i<15; i+=1)
    5. {
    6. if (is_real(argument[i])) writeshort(argument[i]);
    7. else writestring(argument[i]);
    8. }
    9. bufferencrypt(global.bufferpass);
    10. sendmessage(argument0);

    © 2008 by Teamgrill Productions
  • hmm.. wie bist du eigentlich überhaupt darauf gekommen, dass es mit sleep funktioniert? gehts bei sleep(1) auch?
    und wenn du sleep später einsetzt was passiert dann?
    zb wenn du sleep nach dem ersten readshort einsetzt, wird dann das 2. readshort gelesen?
    was genau passiert denn, wenn das sleep draussen is, also kommt ne fehlermeldung und welche werte haben xp und yp dann?
    solche fehler liegen häufig an einer völlig anderen stelle, als man vermutet.

    übrigens.. interessanter code, wird vielleicht ein interessantes spiel :D
    "das war meine letzte flamewar PM an dich ."
  • Das seltsame ist, dass die Koordinaten immer übertragen werden nur die Instanz nicht erstellt wird. Und sleep muss dementsprechend groß sein also um die 200 oder mehr damits geht. Und das allerkomischste: Es muss einfach irgendwo in diesem case drinstehen, solange es drinsteht geht es. ?(

    © 2008 by Teamgrill Productions

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

  • mach mal bei deinem instance create show_message(string(instance_create(...))), was kommt da raus?
    und in den anderen case's geht instance_create?
    und vertausch doch mal message_send_all und instance_create
    "das war meine letzte flamewar PM an dich ."
  • Das schlimmste... Selbst die Instanzen-ID wird ausgegeben allerdings hab ich auf eine andere Methode zurückgegriffen, da show_message ja erst das Spiel einfrieren würde.

    © 2008 by Teamgrill Productions
  • und was genau stimmt dann nich?
    check mal, ob alle events(step, draw.. etc) funktionieren beim objekt, und check die position, vielleicht is da ja was schiefgegangen...
    "das war meine letzte flamewar PM an dich ."
  • Sicher, am Objekt liegt es nicht. es wird ja auch sonst normal erstellt nur nicht beim empfangen der nachricht. Ich hab ja sowohl geprüft ob es erstellt wird und wo und diese daten stimmen.

    © 2008 by Teamgrill Productions
  • Schau mal ob das noch funktioniert:

    GML-Quellcode

    1. case CREATEFLAG:
    2. var xp,yp;
    3. xp='';
    4. yp='';
    5. xp=readshort();
    6. yp=readshort();
    7. while (xp='' || yp='') sleep(1);
    8. message_send_all(CREATEFLAG,xp,yp);
    9. instance_create(xp,yp,obj_flag);
    10. break;

    Wenn das funktioniert, dann heißt es wohl dass du etwas warten musst bis die Variablen übermittelt werden können... und zu meinem vorherigem Post: stimmt schon, war eher ne dumme Idee, wollte trotzdem nur versuchen dir zu helfen ;) ...