Gamesalive
Member
Hello! So after all these years I'm finally learning how to use multiplayer and buffers in GameMaker!
I have followed the tutorials by GameMakerStation on YouTube however his tutorials don't really cover what to do when a player leaves the server. I have tried to use what I've learned from the connection code. My method is when the host receives the disconnect event it will get the socket of that player and send it to everyone else to delete that players object from their room. But for some reason that doesn't work with more than 2 players. Also I get and error when a player tried to reconnect (which I think might be related somehow?) Anyone with more knowledge on networking able to help me out?
Thanks!
I have followed the tutorials by GameMakerStation on YouTube however his tutorials don't really cover what to do when a player leaves the server. I have tried to use what I've learned from the connection code. My method is when the host receives the disconnect event it will get the socket of that player and send it to everyone else to delete that players object from their room. But for some reason that doesn't work with more than 2 players. Also I get and error when a player tried to reconnect (which I think might be related somehow?) Anyone with more knowledge on networking able to help me out?
Thanks!
GML:
var _type = async_load[? "type"];
if (_type = network_type_connect)
{
var _socket = async_load[? "socket"];
//send player info
var _buffer = buffer_create(3,buffer_fixed,1);
buffer_write(_buffer,buffer_u8,DATA.INIT_DATA);
buffer_write(_buffer,buffer_u8,ds_list_size(clients));
network_send_packet(_socket,_buffer,buffer_get_size(_buffer));
buffer_delete(_buffer);
//create player instance
var _player = instance_create_layer(obj_start.x,obj_start.y,"Instances",obj_player);
_player.player_id = ds_list_size(clients);
_player.is_local = false;
//let other clients know
var _buffer = buffer_create(2,buffer_fixed,1);
buffer_write(_buffer,buffer_u8,DATA.PLAYER_JOINED);
buffer_write(_buffer,buffer_u8,_player.player_id);
for (var i=0;i<ds_list_size(clients);i++)
{
var soc = clients[| i];
if (soc < 0) continue;
network_send_packet(soc, _buffer, buffer_get_size(_buffer));
}
buffer_delete(_buffer);
//add to list
ds_list_add(clients,_socket);
}
//Data
else if (_type == network_type_data)
{
var _buffer = async_load[? "buffer"];
buffer_seek(_buffer, buffer_seek_start,0);
var _data = buffer_read(_buffer,buffer_u8);
//init Data
if (_data == DATA.INIT_DATA)
{
var _count = buffer_read(_buffer,buffer_u8);
//set players id
obj_player.player_id = _count;
//create other players
for (var i=0;i<_count;i++)
{
var _player = instance_create_layer(obj_start.x,obj_start.y,"Instances",obj_player);
_player.player_id = i;
_player.is_local = false;
}
}
//player update
else if (_data == DATA.PLAYER_UPDATE)
{
var pID = buffer_read(_buffer,buffer_u8);
with (obj_player)
{
if (pID = player_id)
{
x = buffer_read(_buffer,buffer_s16);
y = buffer_read(_buffer,buffer_s16);
image_index = buffer_read(_buffer,buffer_u8);
}
}
//server forwards player positions
if (is_server)
{
for (var i=0; i<ds_list_size(clients);i++)
{
var soc = clients[| i];
//make sure socket is not the one that sent the data
if (soc < 0 || soc == async_load[? "id"]) continue;
network_send_packet(soc,_buffer,buffer_get_size(_buffer));
}
}
}
//player joined
else if (_data == DATA.PLAYER_JOINED)
{
var inst = instance_create_layer(0,0,"Instances",obj_player);
inst.player_id = buffer_read(_buffer,buffer_u8);
inst.is_local = false;
}
//player left game
else if (_data == DATA.PLAYER_DISCONNECTED)
{
var _leavingPlayer = buffer_read(_buffer,buffer_u8);
with (obj_player)
{
if (player_id == _leavingPlayer)
{
instance_destroy();
exit;
}
}
}
}
//disconnect
else if (_type = network_type_disconnect)
{
var _socket = async_load[? "socket"];
//var _clientList = clients;
var _leavingPlayerID = ds_list_find_index(clients,_socket);
with (obj_player)
{
if (player_id == _leavingPlayerID)
{
instance_destroy();
exit;
}
}
//let other clients know
var _buffer = buffer_create(2,buffer_fixed,1);
buffer_write(_buffer,buffer_u8,DATA.PLAYER_DISCONNECTED);
buffer_write(_buffer,buffer_u8,_leavingPlayerID);
for (var i=0;i<ds_list_size(clients);i++)
{
var soc = clients[| i];
if (soc < 0) continue;
network_send_packet(soc, _buffer, buffer_get_size(_buffer));
}
buffer_delete(_buffer);
//remove from client list
ds_list_delete(clients,_leavingPlayer);
}