diff --git a/Makefile b/Makefile index 790762c3..baa7b22d 100644 --- a/Makefile +++ b/Makefile @@ -558,8 +558,8 @@ endif CC_CHECK += -DCOOP CFLAGS += -DCOOP -# Enforce -Werror in debug mode -ifeq ($(DEBUG),1) +# Enforce -Werror in strict mode +ifeq ($(STRICT),1) CC_CHECK += -Werror -Wno-error=unused-variable -Wno-error=unused-parameter CFLAGS += -Werror -Wno-error=unused-variable -Wno-error=unused-parameter endif diff --git a/src/pc/network/network.c b/src/pc/network/network.c index fc946723..2c86e40c 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -95,7 +95,7 @@ void network_update(void) { } // execute packet - switch (p.buffer[0]) { + switch ((u8)p.buffer[0]) { case PACKET_ACK: network_receive_ack(&p); break; case PACKET_PLAYER: network_receive_player(&p); break; case PACKET_OBJECT: network_receive_object(&p); break; @@ -108,6 +108,7 @@ void network_update(void) { case PACKET_COLLECT_ITEM: network_receive_collect_item(&p); break; case PACKET_RESERVATION_REQUEST: network_receive_reservation_request(&p); break; case PACKET_RESERVATION: network_receive_reservation(&p); break; + case PACKET_CUSTOM: network_receive_custom(&p); break; default: printf("%s received unknown packet: %d\n", NETWORKTYPESTR, p.buffer[0]); } diff --git a/src/pc/network/network.h b/src/pc/network/network.h index 4b002859..66198f50 100644 --- a/src/pc/network/network.h +++ b/src/pc/network/network.h @@ -28,6 +28,7 @@ enum PacketType { PACKET_COLLECT_ITEM, PACKET_RESERVATION_REQUEST, PACKET_RESERVATION, + PACKET_CUSTOM = 255, }; struct Packet { @@ -129,4 +130,8 @@ void network_receive_reservation_request(struct Packet* p); void network_send_reservation(void); void network_receive_reservation(struct Packet* p); +u8 network_register_custom_packet(void (*send_callback)(struct Packet* p, void* params), void (*receive_callback)(struct Packet* p)); +void network_send_custom(u8 customId, bool reliable, void* params); +void network_receive_custom(struct Packet* p); + #endif diff --git a/src/pc/network/packets/packet_custom.c b/src/pc/network/packets/packet_custom.c new file mode 100644 index 00000000..702e8751 --- /dev/null +++ b/src/pc/network/packets/packet_custom.c @@ -0,0 +1,40 @@ +#include +#include "../network.h" + +#define MAX_CUSTOM_PACKETS 32 + +struct NetworkCustomPacket { + void (*send_callback)(struct Packet* p, void* params); + void (*receive_callback)(struct Packet* p); +}; + +static u8 onCustomPacketId = 0; +static struct NetworkCustomPacket customPackets[MAX_CUSTOM_PACKETS]; + +u8 network_register_custom_packet(void (*send_callback)(struct Packet* p, void* params), void (*receive_callback)(struct Packet* p)) { + assert(onCustomPacketId < MAX_CUSTOM_PACKETS); + + u8 i = onCustomPacketId; + customPackets[i].send_callback = send_callback; + customPackets[i].receive_callback = receive_callback; + + onCustomPacketId++; + return i; +} + +void network_send_custom(u8 customId, bool reliable, void* params) { + if (customPackets[customId].send_callback == NULL) { return; } + + struct Packet p; + packet_init(&p, PACKET_CUSTOM, reliable); + packet_write(&p, &customId, sizeof(u8)); + customPackets[customId].send_callback(&p, params); + network_send(&p); +} + +void network_receive_custom(struct Packet* p) { + u8 customId; + packet_read(p, &customId, sizeof(u8)); + if (customPackets[customId].receive_callback == NULL) { return; } + customPackets[customId].receive_callback(p); +}