TheRudolfGaming
Member
Hello. I am currently in the foundation phase of a making a game with multiplayer functionality.
But currently I've hit a speed bump and been unable to fix it for the last 3 days.
I've made an non-dedicated multiplayer system, where one player hosts the game, and others connect. (Host will also be a client of the server, but that is yet to be implemented.)
The code was actually more or less taken from a YouTube video series by Wizirdi (Link to the actual video with multiple players:
)
The issue is that the when a client connects, it shows up on the server's side, and also to clients that have already connected. But the already connected clients don't show up for the client that has recently connected.
Now, when the recent client moves, it shows up both on the first client, and the server. But as soon as the first client moves, the recent client gets thrown an exception.
If another client connects, it again is blind, the client before it only sees it, and the first client and the server see both of them, and so on.
Code for server_packet_received (Script):
Code for client_packet_received (Script):
Code for obj_handler_server_create (Async - Networking):
If there is a need for any more code to be uploaded, or any questions to be answered, I'll try to be as swift as possible.
But currently I've hit a speed bump and been unable to fix it for the last 3 days.
I've made an non-dedicated multiplayer system, where one player hosts the game, and others connect. (Host will also be a client of the server, but that is yet to be implemented.)
The code was actually more or less taken from a YouTube video series by Wizirdi (Link to the actual video with multiple players:
The issue is that the when a client connects, it shows up on the server's side, and also to clients that have already connected. But the already connected clients don't show up for the client that has recently connected.
Now, when the recent client moves, it shows up both on the first client, and the server. But as soon as the first client moves, the recent client gets thrown an exception.
If another client connects, it again is blind, the client before it only sees it, and the first client and the server see both of them, and so on.
Code for server_packet_received (Script):
GML:
buffer = argument0;
socket = argument1;
payload_id = buffer_read(buffer,buffer_u8)
switch (payload_id) {
case network.move:
var h_speed = buffer_read(buffer,buffer_s8);
var v_speed = buffer_read(buffer,buffer_s8);
var move_speed = buffer_read(buffer,buffer_f16);
var player_id = ds_map_find_value(socket_to_instance_id,socket);
var move_dir = point_direction(0,0,h_speed,v_speed);
var move_x = lengthdir_x(move_speed,move_dir);
var move_y = lengthdir_y(move_speed,move_dir);
player_id.x += move_x;
player_id.y += move_y;
var i = 0;
repeat(ds_list_size(socket_list)) {
var _sock = ds_list_find_value(socket_list,i);
buffer_seek(server_buffer,buffer_seek_start,0);
buffer_write(server_buffer,buffer_u8,network.move);
buffer_write(server_buffer,buffer_u8,socket);
buffer_write(server_buffer,buffer_s8,h_speed);
buffer_write(server_buffer,buffer_s8,v_speed);
buffer_write(server_buffer,buffer_f16,move_speed);
network_send_packet(_sock,server_buffer,buffer_tell(server_buffer));
i++;
}
}
Code for client_packet_received (Script):
GML:
buffer = argument0;
packet_id = buffer_read(buffer,buffer_u8);
switch (packet_id) {
case network.player_connect:
var _socket = buffer_read(buffer,buffer_u8);
var _room = buffer_read(buffer,buffer_u8);
var _x = buffer_read(buffer,buffer_u16);
var _y = buffer_read(buffer,buffer_u16);
var player_id = instance_create_depth(_x,_y,depth,obj_player_test);
player_id.socket = _socket;
ds_map_add(socket_to_instance_id,_socket,player_id);
room_goto(_room);
break;
case network.player_joined:
var _sock = buffer_read(buffer,buffer_u8);
var _x = buffer_read(buffer,buffer_u16);
var _y = buffer_read(buffer,buffer_u16);
var other_id = instance_create_depth(_x,_y,depth,obj_player_test_other);
show_debug_message(string(_x)+":"+string(_y));
other_id.socket = _sock;
ds_map_add(socket_to_instance_id,_sock,other_id);
break;
case network.player_disconnected:
var _socket = buffer_read(buffer,buffer_u8);
var player_id = ds_map_find_value(socket_to_instance_id,_socket);
instance_destroy(player_id);
ds_map_delete(socket_to_instance_id,_socket);
break;
case network.move:
var _sock = buffer_read(buffer,buffer_u8);
var h_speed = buffer_read(buffer,buffer_s8);
var v_speed = buffer_read(buffer,buffer_s8);
var move_speed = buffer_read(buffer,buffer_f16);
show_debug_message(string(h_speed)+":"+string(v_speed)+":"+string(move_speed))
var player_id = ds_map_find_value(socket_to_instance_id,_sock);
var move_dir = point_direction(0,0,h_speed,v_speed);
var move_x = lengthdir_x(move_speed,move_dir);
var move_y = lengthdir_y(move_speed,move_dir);
player_id.x += move_x;
player_id.y += move_y;
break;
}
Code for obj_handler_server_create (Async - Networking):
GML:
type_event = ds_map_find_value(async_load,"type");
switch (type_event) {
case network_type_connect:
socket = ds_map_find_value(async_load,"socket");
ds_list_add(socket_list,socket);
var playerid = instance_create_depth(obj_playerSpawn.x,obj_playerSpawn.y,depth,obj_player_test_other);
ds_map_add(socket_to_instance_id,socket,playerid);
buffer_seek(server_buffer,buffer_seek_start,0);
buffer_write(server_buffer,buffer_u8,network.player_connect);
buffer_write(server_buffer,buffer_u8,socket);
buffer_write(server_buffer,buffer_u8,room);
buffer_write(server_buffer,buffer_u16,playerid.x);
buffer_write(server_buffer,buffer_u16,playerid.y);
network_send_packet(socket,server_buffer,buffer_tell(server_buffer));
var i = 0;
repeat(ds_list_size(socket_list)) {
var _sock = ds_list_find_value(socket_list,i);
show_debug_message(string(socket_list)+":"+string(i))
if (_sock != socket) {
var other_id = ds_map_find_value(socket_to_instance_id,_sock);
buffer_seek(server_buffer,buffer_seek_start,0);
buffer_write(server_buffer,buffer_u8,network.player_joined);
buffer_write(server_buffer,buffer_u8,_sock);
buffer_write(server_buffer,buffer_u16,other_id.x);
buffer_write(server_buffer,buffer_u16,other_id.y);
network_send_packet(socket,server_buffer,buffer_tell(server_buffer));
}
i++;
}
var i = 0;
repeat(ds_list_size(socket_list)) {
var _sock = ds_list_find_value(socket_list,i);
if (_sock != socket) {
buffer_seek(server_buffer,buffer_seek_start,0);
buffer_write(server_buffer,buffer_u8,network.player_joined);
buffer_write(server_buffer,buffer_u8,socket);
buffer_write(server_buffer,buffer_u16,playerid.x);
buffer_write(server_buffer,buffer_u16,playerid.y);
network_send_packet(_sock,server_buffer,buffer_tell(server_buffer));
}
i++;
}
break;
case network_type_disconnect:
socket = ds_map_find_value(async_load,"socket");
ds_list_delete(socket_list,ds_list_find_index(socket_list,socket));
var i = 0;
repeat(ds_list_size(socket_list)) {
var _sock = ds_list_find_value(socket_list,i);
buffer_seek(server_buffer,buffer_seek_start,0);
buffer_write(server_buffer,buffer_u8,network.player_disconnected);
buffer_write(server_buffer,buffer_u8,socket);
network_send_packet(_sock,server_buffer,buffer_tell(server_buffer));
i++;
}
with (ds_map_find_value(socket_to_instance_id,socket)) {
instance_destroy();
}
ds_map_delete(socket_to_instance_id,socket);
break;
case network_type_data:
buffer = ds_map_find_value(async_load,"buffer");
socket = ds_map_find_value(async_load,"id");
buffer_seek(buffer,buffer_seek_start,0);
server_received_packet(buffer,socket);
break;
}
If there is a need for any more code to be uploaded, or any questions to be answered, I'll try to be as swift as possible.