Vengo de nuevo con otro problema.
Para que entiendan el código de antemano, lo que hace es que cuando el servidor valida una conexión, le pasa 1 dato al cliente. que es el lugar libre, en otras palabras sería como el numero de jugador.
Ahora cuando nuestro cliente se desconecta vuelve a pasar ese numero de jugador al servidor, para que este (el servidor) coloque dicho lugar en estado vacío.
Mi problema es que dicho espacio nunca se limpia y no sé donde está el problema, lo revisé y lo testee bastante rato ya, por eso acudo a ustedes :'(
-El objeto "boton_iniciaServer" es el que acepta las conexiones.
-Para cada conexión de un cliente creo una instancia de Receptor Cliente para que pueda este manejar los datos de cada cliente real
Mis codigos:
boton_iniciaServer, (evento step) aqui es donde se reciben las conexiones y se pasa los datos
[gml]
if (partida_creada)
{
var conexion_entrante ,espacio_libre;
conexion_entrante = tcpaccept(sock_coord, 1); //se escuchan las conexiones entrantes
if (cont >= global.tam) // si el tamaño es mayorIgual al maximo de jugadores permitidos
{
scr_desconectarCliente("No queda espacio en la sala.",conexion_entrante);
exit;
}
if (conexion_entrante >= 0) //si hay una conexion entrante
{
espacio_libre = scr_obtieneEspacioLibre(); // obtenemos un lugar
if (espacio_libre != -1) // si hay lugar
{
cont += 1;
inst = instance_create(0,0,representante_cliente);//Este objeto representara a un cliente conectado
//Esto quiere decir que cada inst, sabra su numero de jugador y de que socket vienen
inst.numero_jugador = espacio_libre;
inst.socket_cliente = conexion_entrante;
list_jugadores[espacio_libre] = inst;//en el espacio obtenido asignamos la instancia
clearbuffer();
writebyte(const_conexionRealizada);
writebyte(espacio_libre);
sendmessage(conexion_entrante);
exit;
}
}
}
[/gml]
Receptor de cliente, en el server (evento step);
[gml]
while(1)
{
msg = receivemessage(socket_cliente);
if (msg < 0) break;
if (msg == 0)
{
instance_destroy();
break;
}
byte = readbyte();
switch(byte)
{
case const_desconectar: // un cliente se sale de la partida, esto es una constante que equivale a 1
pos = readbyte(); // leemos el numero de jugador que nos pasa el Cliente real cuando cierra su ventana
boton_iniciaServer.list_jugadores[pos] = 0; //ponemos en disponible el lugar
boton_iniciaServer.cont -= 1; //descontamos un jugador
instance_destroy();
break;
}
}
[/gml]
Cliente real, (evento step)
[gml]
while(1)
{
msg = receivemessage(global.sock_servidor);
if (msg < 0) break;
if (msg == 0)
{
show_message("Desconexion repentina");
instance_destroy();
game_end();
break;
}
byte = readbyte();
switch(byte)
{
case const_desconectar:
mensaje = readstring();
show_message("Causa de la desconexion:#-" + string(mensaje));
game_end();
break;
case const_conexionRealizada: // esto es una constante que equivale a 2
numero_jugador = readbyte(); //obtenemos el numero de jugador que nos pasa el Server al conectarnos
nick = get_string("Escribe un nombre para tu jugador", "jugador_"+string(irandom(60)));
break;
}
}
[/gml]
Cliente real, (evento Game end)
[gml]
clearbuffer();
writebyte(const_desconectar); // esto es una constante que equivale a 1
writebyte(numero_jugador); //enviamos nuestro numero de jugador
sendmessage(global.sock_servidor); // al servidor
[/gml]
EDIT: Quiero decir que ya lo solucioné, de la siguiente forma:
[gml]
while(1)
{
msg = receivemessage(socket_cliente);
if (msg < 0) break;
if (msg == 0)
{
// SOLUCION ///////////////////////////
pos = readbyte(); // leemos el numero de jugador que nos pasa el Cliente real cuando cierra su ventana
boton_iniciaServer.list_jugadores[pos] = 0; //ponemos en disponible el lugar
boton_iniciaServer.cont -= 1; //descontamos un jugador
instance_destroy();
break;
}
byte = readbyte();
switch(byte)
{
case const_desconectar: // un cliente se sale de la partida, esto es una constante que equivale a 1
pos = readbyte(); // leemos el numero de jugador que nos pasa el Cliente real cuando cierra su ventana
boton_iniciaServer.list_jugadores[pos] = 0; //ponemos en disponible el lugar
boton_iniciaServer.cont -= 1; //descontamos un jugador
instance_destroy();
break;
}
}
[/gml]