From 484e2878d6208b90b91f0097dcce434f83ee6806 Mon Sep 17 00:00:00 2001 From: hkc Date: Fri, 6 Sep 2024 20:19:37 +0300 Subject: [PATCH] Moved stuff to a separate library, added bot &stuf like a viewer of a single chunk idk --- .gitignore | 2 + Makefile | 22 ++++++-- chunk420.data | Bin 0 -> 262144 bytes chunk420.data.pal | Bin 0 -> 6 bytes chunk420.png | Bin 0 -> 18592 bytes src/bot.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++ src/live-1chunk.c | 96 ++++++++++++++++++++++++++++++++++ src/live.c | 42 +++------------ src/obcb.c | 33 ++++++++++++ src/obcb.h | 12 +++++ 10 files changed, 296 insertions(+), 40 deletions(-) create mode 100644 chunk420.data create mode 100644 chunk420.data.pal create mode 100644 chunk420.png create mode 100644 src/bot.c create mode 100644 src/live-1chunk.c create mode 100644 src/obcb.c create mode 100644 src/obcb.h diff --git a/.gitignore b/.gitignore index e733775..9237432 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ obj/* obcb obcb-nbd.so live +bot +live-1chunk diff --git a/Makefile b/Makefile index 3a9e5fd..9df5c5f 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CFLAGS += LDFLAGS := -lm -OBJECTS := +OBJECTS := obj/obcb.o all: obcb obcb-nbd.so live @@ -10,17 +10,29 @@ test: obcb live-run: live ./live -live: ./src/live.c +live-1chunk-run: live-1chunk + ./live-1chunk + +bot-run: bot + ./bot + +bot: ./src/bot.c $(OBJECTS) + $(CC) $(CFLAGS) $(OBJECTS) src/bot.c $(LDFLAGS) -o bot -lmongoose -lraylib -lm + +live: ./src/live.c $(OBJECTS) $(CC) $(CFLAGS) $(OBJECTS) src/live.c $(LDFLAGS) -o live -lmongoose -lraylib -lm -obcb: lib +live-1chunk: ./src/live-1chunk.c $(OBJECTS) + $(CC) $(CFLAGS) $(OBJECTS) src/live-1chunk.c $(LDFLAGS) -o live-1chunk -lmongoose -lraylib -lm + +obcb: lib $(OBJECTS) $(CC) $(CFLAGS) $(OBJECTS) src/main.c $(LDFLAGS) -o obcb -lmongoose nbd: obcb-nbd.so nbdkit --filter=blocksize-policy -fv ./obcb-nbd.so blocksize-error-policy=error -obcb-nbd.so: src/obcb-nbd.c - $(CC) -ggdb -fPIC -shared src/obcb-nbd.c -o obcb-nbd.so -lmongoose `pkg-config nbdkit --cflags --libs` +obcb-nbd.so: src/obcb-nbd.c $(OBJECTS) + $(CC) $(CFLAGS) $(OBJECTS) -fPIC -shared src/obcb-nbd.c -o obcb-nbd.so -lmongoose `pkg-config nbdkit --cflags --libs` lib: $(OBJECTS) diff --git a/chunk420.data b/chunk420.data new file mode 100644 index 0000000000000000000000000000000000000000..1a1b51b8251579f8f8725dcef3224aeca19271cc GIT binary patch literal 262144 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 K`vTwb0{;)9-n!5L literal 0 HcmV?d00001 diff --git a/chunk420.data.pal b/chunk420.data.pal new file mode 100644 index 0000000000000000000000000000000000000000..c34a7f3634deabb08fbf54d5c57cbca1d1555451 GIT binary patch literal 6 NcmZQzVEF(4KL7>*0{#F1 literal 0 HcmV?d00001 diff --git a/chunk420.png b/chunk420.png new file mode 100644 index 0000000000000000000000000000000000000000..4e29c543c354af8efbf0a7523a37911d66750553 GIT binary patch literal 18592 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 literal 0 HcmV?d00001 diff --git a/src/bot.c b/src/bot.c new file mode 100644 index 0000000..e67446d --- /dev/null +++ b/src/bot.c @@ -0,0 +1,129 @@ +// x-run: make -C.. bot-run +#include +#include +#include +#include "obcb.h" +#include "packets.h" + +unsigned char chunk_current[OBCB_CHUNK_SIZE_BYTES], chunk_target[OBCB_CHUNK_SIZE_BYTES]; + +int dst_chunk_id = 420; + +const uint8_t shuffle[256] = { + 0, 128, 64, 192, 32, 160, 96, 224, 16, + 144, 80, 208, 48, 176, 112, 240, 8, + 136, 72, 200, 40, 168, 104, 232, 24, + 152, 88, 216, 56, 184, 120, 248, 4, + 132, 68, 196, 36, 164, 100, 228, 20, + 148, 84, 212, 52, 180, 116, 244, 12, + 140, 76, 204, 44, 172, 108, 236, 28, + 156, 92, 220, 60, 188, 124, 252, 2, + 130, 66, 194, 34, 162, 98, 226, 18, + 146, 82, 210, 50, 178, 114, 242, 10, + 138, 74, 202, 42, 170, 106, 234, 26, + 154, 90, 218, 58, 186, 122, 250, 6, + 134, 70, 198, 38, 166, 102, 230, 22, + 150, 86, 214, 54, 182, 118, 246, 14, + 142, 78, 206, 46, 174, 110, 238, 30, + 158, 94, 222, 62, 190, 126, 254, 1, + 129, 65, 193, 33, 161, 97, 225, 17, + 145, 81, 209, 49, 177, 113, 241, 9, + 137, 73, 201, 41, 169, 105, 233, 25, + 153, 89, 217, 57, 185, 121, 249, 5, + 133, 69, 197, 37, 165, 101, 229, 21, + 149, 85, 213, 53, 181, 117, 245, 13, + 141, 77, 205, 45, 173, 109, 237, 29, + 157, 93, 221, 61, 189, 125, 253, 3, + 131, 67, 195, 35, 163, 99, 227, 19, + 147, 83, 211, 51, 179, 115, 243, 11, + 139, 75, 203, 43, 171, 107, 235, 27, + 155, 91, 219, 59, 187, 123, 251, 7, + 135, 71, 199, 39, 167, 103, 231, 23, + 151, 87, 215, 55, 183, 119, 247, 15, + 143, 79, 207, 47, 175, 111, 239, 31, + 159, 95, 223, 63, 191, 127, 255 +}; + +static void obcb_mg_handler(struct mg_connection *c, int ev, void *ev_data) { + if (ev == MG_EV_OPEN) { + printf("Connected to WebSocket\n"); + } else if (ev == MG_EV_WS_OPEN) { + obcb_send_full_state_request(c, 0); + } else if (ev == MG_EV_WS_MSG) { + struct mg_ws_message *wsm = (struct mg_ws_message*)ev_data; + if (wsm->data.buf[0] == OBCB_MSG_HELLO) { + struct obcb_msg_hello hello; memcpy(&hello, &wsm->data.buf[1], sizeof(hello)); + printf("HELLO: v%d.%d. Why hello there, honey~\n", hello.version_major, hello.version_minor); + } else if (wsm->data.buf[0] == OBCB_MSG_STATS) { + struct obcb_msg_stats stats; memcpy(&stats, &wsm->data.buf[1], sizeof(stats)); + } else if (wsm->data.buf[0] == OBCB_MSG_FULL_STATE_RESPONSE) { + struct obcb_msg_full_state_response state; memcpy(&state, &wsm->data.buf[1], sizeof(state)); + if (state.chunk_index == dst_chunk_id) { + memcpy(chunk_current, state.bitmap, OBCB_CHUNK_SIZE_BYTES); + } + printf("\n"); + } else if (wsm->data.buf[0] == OBCB_MSG_PARTIAL_STATE_UPDATE) { + struct obcb_msg_partial_state_update update; memcpy(&update, &wsm->data.buf[1], sizeof(update)); + uint32_t chunk_index = update.offset / OBCB_CHUNK_SIZE_BYTES; + uint32_t byte_index = update.offset % OBCB_CHUNK_SIZE_BYTES; + if (chunk_index == dst_chunk_id) { + memcpy(&chunk_current[byte_index], update.chunk, OBCB_UPDATE_CHUNK_SIZE); + } + } else { + printf("UNHANDLED MESSAGE 0x%02x\n", wsm->data.buf[0]); + } + } +} + +int render_thread(void *_conn); + +int main(void) { + + { + static unsigned char line[512]; + FILE *fp = fopen("./chunk420.data", "rb"); + for (int y = 0; y < 512; y++) { + fread(line, 512, 1, fp); + for (int x = 0; x < 512; x++) { + chunk_target[(x + y * 512) / 8] |= line[x] << (x & 7); + } + } + fclose(fp); + } + + struct mg_mgr manager; + mg_mgr_init(&manager); + + struct mg_connection *ws = mg_ws_connect(&manager, "ws://bitmap-ws.alula.me/", obcb_mg_handler, 0, "%s", "User-Agent: maidcore/4.2.0 (kc.is.being.pet)\r\n"); + + obcb_send_full_state_request(ws, dst_chunk_id); + obcb_send_partial_subscription(ws, dst_chunk_id); + + thrd_t render_thrd; + thrd_create(&render_thrd, render_thread, ws); + + while (1) mg_mgr_poll(&manager, 1000); + mg_mgr_free(&manager); + return 0; +} + +int render_thread(void *_conn) { + struct mg_connection *ws = _conn; + + for (int i = 0; true; i = (i + 1) % (512 * 512)) { + int blk_index = i / 256; + int blk_pos = shuffle[i % 256]; + int ox = blk_pos & 15, oy = blk_pos >> 4; + int x = (blk_index & 31) + ox * 32; + int y = (blk_index >> 5) + oy * 32; + + int index = x + y * 512; + int byte = index >> 3, bit = index & 7; + int mask = 1 << bit; + + if ((chunk_current[byte] & mask) != (chunk_target[byte] & mask)) { + obcb_send_toggle_bit(ws, index + dst_chunk_id * OBCB_CHUNK_SIZE); + usleep(5000); + } + } +} diff --git a/src/live-1chunk.c b/src/live-1chunk.c new file mode 100644 index 0000000..6032283 --- /dev/null +++ b/src/live-1chunk.c @@ -0,0 +1,96 @@ +// x-run: make -C.. CFLAGS+=-ggdb live-1chunk-run +#include +#include +#include +#include +#include "obcb.h" +#include "packets.h" + +struct mg_mgr manager; +struct mg_connection *ws = NULL; + +int chunk_id = 420; +int connected_clients = 0; + +static void obcb_mg_handler(struct mg_connection *c, int ev, void *ev_data) { + if (ev == MG_EV_OPEN) { + printf("Connected to WebSocket\n"); + c->is_hexdumping = 0; + } else if (ev == MG_EV_WS_MSG) { + struct mg_ws_message *wsm = (struct mg_ws_message*)ev_data; + if (wsm->data.buf[0] == OBCB_MSG_HELLO) { + struct obcb_msg_hello hello; memcpy(&hello, &wsm->data.buf[1], sizeof(hello)); + printf("HELLO: v%d.%d. Why hello there, honey~\n", hello.version_major, hello.version_minor); + } else if (wsm->data.buf[0] == OBCB_MSG_STATS) { + struct obcb_msg_stats stats; memcpy(&stats, &wsm->data.buf[1], sizeof(stats)); + printf("STATS: %d clients connected\n", stats.current_clients); + connected_clients = stats.current_clients; + } else if (wsm->data.buf[0] == OBCB_MSG_FULL_STATE_RESPONSE) { + struct obcb_msg_full_state_response state; memcpy(&state, &wsm->data.buf[1], sizeof(state)); + if (state.chunk_index != chunk_id) return; + + unsigned char *view = c->fn_data; + printf("Got full state\n"); + for (int i = 0; i < OBCB_CHUNK_SIZE; i++) { + view[i] = state.bitmap[i >> 3] & (1 << (i & 7)) ? 0xff : 0x00; + } + } else if (wsm->data.buf[0] == OBCB_MSG_PARTIAL_STATE_UPDATE) { + struct obcb_msg_partial_state_update update; memcpy(&update, &wsm->data.buf[1], sizeof(update)); + uint32_t chunk_index = update.offset / OBCB_CHUNK_SIZE_BYTES; + uint32_t byte_offset = update.offset % OBCB_CHUNK_SIZE_BYTES; + + if (chunk_index != chunk_id) return; + + printf("Got partial update: %d %d\n", chunk_index, byte_offset); + unsigned char *view = c->fn_data; + for (int i = 0; i < OBCB_UPDATE_CHUNK_SIZE; i++) { + view[i + byte_offset * 8] = update.chunk[i >> 3] & (1 << (i & 7)) ? 0xFF : 0x00; + } + } else { + printf("UNHANDLED MESSAGE 0x%02x\n", wsm->data.buf[0]); + } + } +} + +static int mongoose_thread(void *_mgr) { + mg_mgr_init(&manager); + while (true) mg_mgr_poll(&manager, 1000); + mg_mgr_free(&manager); + printf("Manager exited\n"); + return 0; +} + +int main(void) { + InitWindow(512, 512, "obcb-1chunk"); + SetTargetFPS(60); + + thrd_t mongoose_manager_thrd; + thrd_create(&mongoose_manager_thrd, mongoose_thread, 0); + + Image img = { + .data = MemAlloc(512 * 512), + .width = 512, + .height = 512, + .mipmaps = 1, + .format = PIXELFORMAT_UNCOMPRESSED_GRAYSCALE + }; + + Texture2D tex = LoadTextureFromImage(img); + + struct mg_connection *ws = mg_ws_connect(&manager, "ws://bitmap-ws.alula.me/", obcb_mg_handler, img.data, "%s", "maidcore/4.2.0 (kc.is.being.pet)\r\n"); + if (!ws) return 1; + + obcb_send_full_state_request(ws, chunk_id); + obcb_send_partial_subscription(ws, chunk_id); + + for (int frame = 0; !WindowShouldClose(); frame++) { + if ((frame % 512) == 511) { + printf("Requesting state again\n"); + obcb_send_full_state_request(ws, chunk_id); + } + BeginDrawing(); + UpdateTexture(tex, img.data); + DrawTexture(tex, 0, 0, WHITE); + EndDrawing(); + } +} diff --git a/src/live.c b/src/live.c index 1b47b67..690af86 100644 --- a/src/live.c +++ b/src/live.c @@ -5,12 +5,10 @@ #include #include #include -#include "packets.h" +#include "obcb.h" #define WAITING_QUEUE_SIZE 32 -static void obcb_send_full_state_request(struct mg_connection *c, uint16_t index); - static uint32_t connected_clients = 0; static bool running = true; @@ -61,7 +59,7 @@ struct img_and_tex { Texture2D tex; } blocks[32 * 32], subscribed; -int subscribed_chunk_id = -1; +int subscribed_chunk_id = 420; static struct waiting_queue_elem { uint16_t index; @@ -176,14 +174,8 @@ int main(void) { thrd_create(&mongoose_manager_thrd, mongoose_thread, &manager); if (subscribed_chunk_id >= 0) { - static unsigned char packet[sizeof(struct obcb_msg_partial_state_subscription) + 1]; - packet[0] = OBCB_MSG_PARTIAL_STATE_SUBSCRIPTION; - struct obcb_msg_partial_state_subscription *msg = (struct obcb_msg_partial_state_subscription *)&packet[1]; - msg->chunk_index = subscribed_chunk_id; - + obcb_send_partial_subscription(ws, subscribed_chunk_id); memset(subscribed.img.data, 0x55, 512 * 512); - - mg_ws_send(ws, packet, sizeof(packet), WEBSOCKET_OP_BINARY); } Font font = LoadFontEx("/home/kc/.local/share/fonts/DepartureMono-Regular.otf", 14, 0, 1024); @@ -318,30 +310,18 @@ int main(void) { if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON)) { if (IsKeyDown(KEY_LEFT_SHIFT)) { - static unsigned char packet[1] = { OBCB_MSG_PARTIAL_STATE_UNSUBSCRIPTION }; - mg_ws_send(ws, packet, sizeof(packet), WEBSOCKET_OP_BINARY); + obcb_send_partial_unsubscription(ws); subscribed_chunk_id = -1; } else { - static unsigned char packet[sizeof(struct obcb_msg_partial_state_subscription) + 1]; - packet[0] = OBCB_MSG_PARTIAL_STATE_SUBSCRIPTION; - struct obcb_msg_partial_state_subscription *msg = (struct obcb_msg_partial_state_subscription *)&packet[1]; - msg->chunk_index = chunk; - subscribed_chunk_id = chunk; - memset(subscribed.img.data, 0x55, 512 * 512); - - mg_ws_send(ws, packet, sizeof(packet), WEBSOCKET_OP_BINARY); + subscribed_chunk_id = chunk; + obcb_send_partial_subscription(ws, chunk); obcb_send_full_state_request(ws, chunk); } } if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) { - static unsigned char packet[sizeof(struct obcb_msg_toggle_bit) + 1]; - packet[0] = OBCB_MSG_TOGGLE_BIT; - struct obcb_msg_toggle_bit *msg = (struct obcb_msg_toggle_bit *)&packet[1]; - msg->offset = index; - - mg_ws_send(ws, packet, sizeof(packet), WEBSOCKET_OP_BINARY); + obcb_send_toggle_bit(ws, index); } const char *cursor_str = TextFormat( @@ -380,14 +360,6 @@ int main(void) { return 0; } -static void obcb_send_full_state_request(struct mg_connection *c, uint16_t index) { - static unsigned char packet[sizeof(struct obcb_msg_full_state_request) + 1]; - struct obcb_msg_full_state_request *msg = (struct obcb_msg_full_state_request *)&packet[1]; - packet[0] = OBCB_MSG_FULL_STATE_REQUEST; - msg->chunk_index = index; - mg_ws_send(c, packet, sizeof(packet), WEBSOCKET_OP_BINARY); -} - void DrawTextShadow(Font font, const char *txt, int x, int y, int size, Color color) { Vector2 pos = { x, y }; for (int oy = -2; oy <= 2; oy++) { diff --git a/src/obcb.c b/src/obcb.c new file mode 100644 index 0000000..9fb39c9 --- /dev/null +++ b/src/obcb.c @@ -0,0 +1,33 @@ +#include "obcb.h" +#include + +void obcb_send_full_state_request(struct mg_connection *c, uint16_t index) { + static unsigned char packet[sizeof(struct obcb_msg_full_state_request) + 1]; + struct obcb_msg_full_state_request *msg = (struct obcb_msg_full_state_request *)&packet[1]; + packet[0] = OBCB_MSG_FULL_STATE_REQUEST; + msg->chunk_index = index; + mg_ws_send(c, packet, sizeof(packet), WEBSOCKET_OP_BINARY); +} + +void obcb_send_toggle_bit(struct mg_connection *c, uint32_t offset) { + static unsigned char packet[sizeof(struct obcb_msg_toggle_bit) + 1]; + packet[0] = OBCB_MSG_TOGGLE_BIT; + struct obcb_msg_toggle_bit *msg = (struct obcb_msg_toggle_bit *)&packet[1]; + msg->offset = offset; + + mg_ws_send(c, packet, sizeof(packet), WEBSOCKET_OP_BINARY); +} + +void obcb_send_partial_subscription(struct mg_connection *c, uint16_t chunk) { + static unsigned char packet[sizeof(struct obcb_msg_partial_state_subscription) + 1]; + packet[0] = OBCB_MSG_PARTIAL_STATE_SUBSCRIPTION; + struct obcb_msg_partial_state_subscription *msg = (struct obcb_msg_partial_state_subscription *)&packet[1]; + msg->chunk_index = chunk; + + mg_ws_send(c, packet, sizeof(packet), WEBSOCKET_OP_BINARY); +} + +void obcb_send_partial_unsubscription(struct mg_connection *c) { + static unsigned char packet[1] = { OBCB_MSG_PARTIAL_STATE_UNSUBSCRIPTION }; + mg_ws_send(c, packet, sizeof(packet), WEBSOCKET_OP_BINARY); +} diff --git a/src/obcb.h b/src/obcb.h new file mode 100644 index 0000000..f07b120 --- /dev/null +++ b/src/obcb.h @@ -0,0 +1,12 @@ +#ifndef _OBCB_H_ +#define _OBCB_H_ + +#include "packets.h" +#include + +void obcb_send_full_state_request(struct mg_connection *c, uint16_t index); +void obcb_send_toggle_bit(struct mg_connection *c, uint32_t offset); +void obcb_send_partial_subscription(struct mg_connection *c, uint16_t chunk); +void obcb_send_partial_unsubscription(struct mg_connection *c); + +#endif