You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.4 KiB
42 lines
1.4 KiB
/// udp_send_reliable(socket, ip, port, buffer, size)
|
|
// Send a UDP packet with ACK/retransmission reliability
|
|
// Use this for critical packets that must arrive (items, events, etc.)
|
|
|
|
var sock = argument0;
|
|
var ip = argument1;
|
|
var port = argument2;
|
|
var buff = argument3;
|
|
var sz = argument4;
|
|
|
|
// If oClient doesn't exist, fall back to unreliable send
|
|
if (!instance_exists(oClient)) {
|
|
return network_send_udp(sock, ip, port, buff, sz);
|
|
}
|
|
|
|
// Wrap with sequence number for ACK: [254][seq_num (u32)][original_packet]
|
|
var seq_num = oClient.next_sequence_number;
|
|
oClient.next_sequence_number = (oClient.next_sequence_number + 1) mod 4294967296;
|
|
|
|
var reliable_buffer = buffer_create(sz + 5, buffer_fixed, 1);
|
|
buffer_write(reliable_buffer, buffer_u8, 254); // Reliable packet marker
|
|
buffer_write(reliable_buffer, buffer_u32, seq_num);
|
|
buffer_copy(buff, 0, sz, reliable_buffer, 5);
|
|
|
|
var result = network_send_udp(sock, ip, port, reliable_buffer, sz + 5);
|
|
|
|
// Track for retransmission on client side
|
|
if (is_undefined(oClient.pending_acks)) {
|
|
oClient.pending_acks = ds_map_create();
|
|
}
|
|
|
|
var ack_data = ds_map_create();
|
|
ds_map_add(ack_data, "buffer", reliable_buffer);
|
|
ds_map_add(ack_data, "size", sz + 5);
|
|
ds_map_add(ack_data, "send_time", current_time);
|
|
ds_map_add(ack_data, "retransmits", 0);
|
|
ds_map_add(ack_data, "ip", ip);
|
|
ds_map_add(ack_data, "port", port);
|
|
ds_map_add(oClient.pending_acks, seq_num, ack_data);
|
|
|
|
return result;
|