K
KetoGames
Guest
Hello all!
I have been working with GameMaker's networking systems, and have been running into an issue that's seemingly very hard to replicate. Basically, there are enemies that spawn around the edge of the screen. On the server side, they are created, and then replicated in the client side (where an x and y coordinate are sent). However, once in a while, there will be an enemy that will spawn on whichever screen is NOT currently being played on. I'm using TCP and hosting locally (with my internal IP address), using a resizable buffer, and working on a reliable connection. Here are some code snippets:
Server side, sending enemy data (triggered on an enemy spawn):
var xx = x;
var yy = y;
with objGov
{
buffer_seek(buff, buffer_seek_start, 0);
buffer_write(buff, buffer_u8, 4);
buffer_write(buff, buffer_u32, xx);
buffer_write(buff, buffer_u32, yy);
for (var i = 0; i < ds_list_size(socketlist); i++
{
network_send_packet(ds_list_find_value(socketlist, i), buff, buffer_tell(buff));
}
}
Client side, decoding incoming requests, triggered on a network event:
/// scrReceivePacket (buffer)
var buffer = argument[0]; // "1, x, y"
var message_id = buffer_read(buffer, buffer_u8); // "x, y"
switch(message_id)
{
case 1:
var px = buffer_read(buffer, buffer_u32);
var py = buffer_read(buffer, buffer_u32);
var mx = buffer_read(buffer, buffer_u32);
var my = buffer_read(buffer, buffer_u32);
objPlayerConnected.x = px;
objPlayerConnected.y = py;
objPlayerConnected.image_angle = point_direction(px, py, mx, my);
break;
case 2:
var ml = buffer_read(buffer, buffer_bool);
var mr = buffer_read(buffer, buffer_bool);
objPlayerConnected.mouseLeft = ml;
objPlayerConnected.mouseRight = mr;
break;
case 3:
room_goto(rmStandard);
break;
case 4:
var ex = buffer_read(buffer, buffer_u32);
var ey = buffer_read(buffer, buffer_u32);
instance_create(ex, ey, objEnemy);
break;
case 5:
var bx = buffer_read(buffer, buffer_u32);
var by = buffer_read(buffer, buffer_u32);
var bd = buffer_read(buffer, buffer_u32);
bul = instance_create(bx, by, objEnemyBullet);
with bul
{
direction = bd;
}
break;
}
The first three cases (player location, client mouse activity, and a game starting signal) are all working great.
Any help is much appreciated! If there's anything more that you need then I'd be glad to provide it. Thank you!
I have been working with GameMaker's networking systems, and have been running into an issue that's seemingly very hard to replicate. Basically, there are enemies that spawn around the edge of the screen. On the server side, they are created, and then replicated in the client side (where an x and y coordinate are sent). However, once in a while, there will be an enemy that will spawn on whichever screen is NOT currently being played on. I'm using TCP and hosting locally (with my internal IP address), using a resizable buffer, and working on a reliable connection. Here are some code snippets:
Server side, sending enemy data (triggered on an enemy spawn):
var xx = x;
var yy = y;
with objGov
{
buffer_seek(buff, buffer_seek_start, 0);
buffer_write(buff, buffer_u8, 4);
buffer_write(buff, buffer_u32, xx);
buffer_write(buff, buffer_u32, yy);
for (var i = 0; i < ds_list_size(socketlist); i++
{
network_send_packet(ds_list_find_value(socketlist, i), buff, buffer_tell(buff));
}
}
Client side, decoding incoming requests, triggered on a network event:
/// scrReceivePacket (buffer)
var buffer = argument[0]; // "1, x, y"
var message_id = buffer_read(buffer, buffer_u8); // "x, y"
switch(message_id)
{
case 1:
var px = buffer_read(buffer, buffer_u32);
var py = buffer_read(buffer, buffer_u32);
var mx = buffer_read(buffer, buffer_u32);
var my = buffer_read(buffer, buffer_u32);
objPlayerConnected.x = px;
objPlayerConnected.y = py;
objPlayerConnected.image_angle = point_direction(px, py, mx, my);
break;
case 2:
var ml = buffer_read(buffer, buffer_bool);
var mr = buffer_read(buffer, buffer_bool);
objPlayerConnected.mouseLeft = ml;
objPlayerConnected.mouseRight = mr;
break;
case 3:
room_goto(rmStandard);
break;
case 4:
var ex = buffer_read(buffer, buffer_u32);
var ey = buffer_read(buffer, buffer_u32);
instance_create(ex, ey, objEnemy);
break;
case 5:
var bx = buffer_read(buffer, buffer_u32);
var by = buffer_read(buffer, buffer_u32);
var bd = buffer_read(buffer, buffer_u32);
bul = instance_create(bx, by, objEnemyBullet);
with bul
{
direction = bd;
}
break;
}
The first three cases (player location, client mouse activity, and a game starting signal) are all working great.
Any help is much appreciated! If there's anything more that you need then I'd be glad to provide it. Thank you!