From 6fd40203d5da15344e0435ef4098bbf98b48b1a6 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 20 Apr 2022 18:49:37 +0200 Subject: [PATCH] Add shovel --- meshes/shovel.gox | Bin 0 -> 4326 bytes meshes/shovel.txt | 22 ++++++++++++++++++++++ src/client/client_entity.c | 8 ++++---- src/client/client_inventory.c | 8 ++++---- src/client/client_item.c | 20 +++++++++++++------- src/client/client_item.h | 2 +- src/client/client_node.c | 4 ++-- src/client/client_node.h | 2 +- src/client/client_terrain.c | 3 +-- src/client/debug_menu.c | 2 +- src/client/gui.c | 2 +- src/client/interact.c | 4 ++-- src/client/raycast.c | 2 +- src/client/shader.c | 16 ++++++++-------- src/client/shader.h | 2 +- src/client/terrain_gfx.c | 22 +++++++++++----------- src/dig.h | 1 + src/item.c | 33 ++++++++++++++++++++------------- src/item.h | 3 ++- src/node.c | 8 ++++---- src/node.h | 2 +- src/physics.c | 2 +- src/server/server.c | 4 ++-- src/server/server_item.c | 8 ++++++-- src/server/server_item.h | 2 +- src/server/server_player.c | 4 ++-- src/server/server_terrain.c | 2 +- src/server/terrain_gen.c | 2 +- src/server/trees.c | 2 +- src/server/trees.h | 2 +- src/terrain.c | 6 +++--- 31 files changed, 120 insertions(+), 80 deletions(-) create mode 100644 meshes/shovel.gox create mode 100644 meshes/shovel.txt diff --git a/meshes/shovel.gox b/meshes/shovel.gox new file mode 100644 index 0000000000000000000000000000000000000000..76d61558d375db302236666fbb9355fb95dfe00b GIT binary patch literal 4326 zcmds4dstJ)wx2u*AtsOrYJxn1QH07P1d0eq0)YVX5NSO{)S5ujCd#V`^?v#XU-<@yI%%0y~ zvuD<0)|%zNIf9M`00f5k(}Un11J|hdBo5pG0C_KVe`x+P#zv-vh5P-@QV)Qfuuy*z z!IS_)q`&~*aJYw%ipRlii0AcLRj==;mHHHkeRztek4@f#=VkU3ek^_c zEX=;u8M!)k>TCI3EHh?5>i+%vIzd5qXJ@CTtE&sd0M`8cOXD@9+Oub!C#R-ZQ2*rg zv@;%$hi;|!e>p!}aJ;E0HR44P&({&$Zr05_UePk~W0TXSeb(02ng7_;#JZF`jdNIQ zYrA39?gNw`@j~h_-vuSN2ANx!>0Ew2mO9*->Pyl)`~CM$5OZHyMjNX48i&+Yz;y3m zMZR`s@`C_FBu=U)P-C(AN)%C@r|I)$hI9FM&!IT#RMqgVk!-zR`>sv;dD`yI+Ko0n zX8>F}G0meCZcHWUrpOP33+gFu19-DDI{%evY6-tJQzKr+Y&O0eBVc>>K5837am#Sta-homQ`!Ppn1>a^d0t4b1$ssu9hl6}#B9;$q4p%zX5# zo0BUVHi}_8R6Wy8I7SUx76EE;v44z{8@ze=kLOT4DPFDw>NOg%0W%UUuTJaZ4T(*u zB~}P~FvY`#K35Ii0M%O#?p}KJ?8(i{lM^Yf`JWu@BU4Ff|Eng>3V`nK2aM(9N`2Vz zfk3}d-|u|*>BzfJu#;;I?26yvDmn0H&Z4XQR`S_>0MN2`yGkh+NeIBJjJT6#@{@OLx)WRFJTfd>yptr|4 z!@em`Y5rmUp0?wKl-}u@ii#h_pWz6oFxn7b3Q7@Q|){g+%895O(YY zZ)cFbEP>Yw`=zYJ)udlo{EmZmC-R7i3$04?qPvZT&|3ii5x8?Ni^>KrI^0H+j zRehXa&-AlzPk!{>j!v?LMQBPChQqT`;AnRUHtkBenPzBYa_uc#mr&tQ}B)7 zouKflEs-~S$~}$>o{#^4QHI%cHxrjEx8qYgSdf;ry5~rmptlHB^r62hK%+FL26Uwh z8wGUxlP*Jwmh4KDnbhTj$V}+E(WdL<@arJ#ERB|dG2BIiwqha+%Qna!Lbr>`%gg&6 zF*p}TpNzw$KSb5rbA$1U?MaY3qsYW_L}^u9v*bN?cA!0drh{r>eSknIw%(DJeTI0| zMm*UHP7$rDYp#k~wI_mToD|@Py>Ik?t}xA7wP7(2B`)85_=O#72( zC#^CX8|TCq%}HqmCTLY@Zs9<#K~+hik6i1c2w&KI%u_Hs_45);$N);6EP?gU!G{eD z>W!TgE-eaQaH;S#??yuGEEjsPSHsy?VEP0f=D~M4o}Z~98=^Mdn^qUFk@(9gC#$Nw z%+0+mD!(BE{|`bk`&UWw5nKJU-R8j8hQDC9n6Ni?i)R|Yy2&K)xO{kbF?i@Y|hua)RrTxy^xF^>$;R0W{Z@X&Z8-W!16*t)Ytd zQ?{0~l0~u$_uQ0M6riN3u7EYkRNS8f>C@1(;Hqkw~PKwy$``6Jk6upUlV3V4zR|c0*R#UT~sCJNqo7ZuRk)gQtmf zcaP|m3P@rRasobxXdlpjXzh7NBZ5WLOh(B(E*FUNQ5oLwNx8mkuQ==-t8O%?%u5f;P4erjq9R$f_-PyNFu8OU#%B zdSpbRu%KGx)gfC#UCaaw`xvf+K7l~ssS{nWI0?T0)~&oY65~t;zuuGDnj?Q;$N2_@ zIg?rs=xebylJiE5S9Id#)NWsfCl=?v*(k}LHBe**M=4iq<`*#TquwTl-KJQJDn6k5 z;K4ykgQbpf0koTHiL~xJ z>X%Y#mL?(MK&x-uJT&#ZDOJZao)zQe@U8N{Z-`gP09JSQCBYyTu5p4`5t8+V2ogn7i6F+o3C;#VbbL&_ z6c!g;AUIF_&x(hUSW%)NCPosCOz-Xr_A-EbY5eD(isM8w83MwEjSz}rB{G>LK90Bu z{jmx5-WL7>hThOGene8Iw^Z=i_%8*?gMUwh5Fq(5g1xN>_LeW?3KuL$7D*kP5VBZ7 zA_wk%V`uT@cMZbgpUb;3WET=4vIg>otPv%UiFW-4!6UFJqc`Gw%N|0uS0a-{#fT8j z7P;ekhlGCx58iGUna73IAr&|{A(&7iOGJ9(VaNwjO1v~t9KSg8cifOzQZ{<ebDBc&xJUdVbfu|OEV_#Xs;0q}2+type].dig_class); + && (node_def[interact_pointed.node].dig_class & item_def[stack->type].dig_class); } -ClientItemDef client_item_defs[COUNT_ITEM] = { +ClientItemDef client_item_def[COUNT_ITEM] = { // unknown { .mesh_path = RESSOURCE_PATH "meshes/unknown.txt", @@ -33,23 +33,29 @@ ClientItemDef client_item_defs[COUNT_ITEM] = { .mesh = {0}, .use = &use_dig, }, + // shovel + { + .mesh_path = RESSOURCE_PATH "meshes/shovel.txt", + .mesh = {0}, + .use = &use_dig, + }, }; void client_item_init() { for (ItemType i = 0; i < COUNT_ITEM; i++) - if (client_item_defs[i].mesh_path) - mesh_load(&client_item_defs[i].mesh, client_item_defs[i].mesh_path); + if (client_item_def[i].mesh_path) + mesh_load(&client_item_def[i].mesh, client_item_def[i].mesh_path); } void client_item_deinit() { for (ItemType i = 0; i < COUNT_ITEM; i++) - if (client_item_defs[i].mesh_path) - mesh_destroy(&client_item_defs[i].mesh); + if (client_item_def[i].mesh_path) + mesh_destroy(&client_item_def[i].mesh); } Mesh *client_item_mesh(ItemType type) { - return client_item_defs[type].mesh_path ? &client_item_defs[type].mesh : NULL; + return client_item_def[type].mesh_path ? &client_item_def[type].mesh : NULL; } diff --git a/src/client/client_item.h b/src/client/client_item.h index bffb251..cbd6334 100644 --- a/src/client/client_item.h +++ b/src/client/client_item.h @@ -12,7 +12,7 @@ typedef struct { bool (*use)(ItemStack *stack); } ClientItemDef; -extern ClientItemDef client_item_defs[]; +extern ClientItemDef client_item_def[]; void client_item_init(); void client_item_deinit(); diff --git a/src/client/client_node.c b/src/client/client_node.c index 56c646e..5285c53 100644 --- a/src/client/client_node.c +++ b/src/client/client_node.c @@ -38,7 +38,7 @@ static void render_color(NodeArgsRender *args) args->vertex.color = ((ColorData *) args->node->data)->color; } -ClientNodeDef client_node_defs[NODE_UNLOADED] = { +ClientNodeDef client_node_def[NODE_UNLOADED] = { // unknown { .tiles = TILES_SIMPLE(RESSOURCE_PATH "textures/unknown.png"), @@ -216,7 +216,7 @@ ClientNodeDef client_node_defs[NODE_UNLOADED] = { void client_node_init() { for (NodeType node = 0; node < NODE_UNLOADED; node++) { - ClientNodeDef *def = &client_node_defs[node]; + ClientNodeDef *def = &client_node_def[node]; if (def->visibility != VISIBILITY_NONE) { Texture *textures[6]; diff --git a/src/client/client_node.h b/src/client/client_node.h index 57ae625..6f23c87 100644 --- a/src/client/client_node.h +++ b/src/client/client_node.h @@ -33,7 +33,7 @@ typedef struct { char *name; } ClientNodeDef; -extern ClientNodeDef client_node_defs[]; +extern ClientNodeDef client_node_def[]; void client_node_init(); #endif // _CLIENT_NODE_H_ diff --git a/src/client/client_terrain.c b/src/client/client_terrain.c index 9a3e52f..2e33b87 100644 --- a/src/client/client_terrain.c +++ b/src/client/client_terrain.c @@ -267,9 +267,8 @@ void client_terrain_chunk_received(TerrainChunk *chunk) if (meta->state == CHUNK_RECIEVING) meta->state = CHUNK_FRESH; - pthread_mutex_unlock(&chunk->mtx); - client_terrain_meshgen_task(chunk, true); + pthread_mutex_unlock(&chunk->mtx); for (int i = 0; i < 6; i++) { TerrainChunk *neighbor = terrain_get_chunk(client_terrain, diff --git a/src/client/debug_menu.c b/src/client/debug_menu.c index e3f1a9c..ddf36c4 100644 --- a/src/client/debug_menu.c +++ b/src/client/debug_menu.c @@ -62,7 +62,7 @@ static char *get_entry_text(DebugMenuEntry entry) if (!pnt->exists) return strdup(""); - pnt_name = client_node_defs[pnt->node].name; + pnt_name = client_node_def[pnt->node].name; break; case ENTRY_FLIGHT: diff --git a/src/client/gui.c b/src/client/gui.c index 05f4fb7..fbe7b9f 100644 --- a/src/client/gui.c +++ b/src/client/gui.c @@ -88,7 +88,7 @@ static void scale_element(GUIElement *element); static int cmp_element(const GUIElement *ea, const GUIElement *eb) { - return f32_cmp(&ea->def.z_index, &eb->def.z_index); + return -f32_cmp(&ea->def.z_index, &eb->def.z_index); } static void delete_elements(Array *elements) diff --git a/src/client/interact.c b/src/client/interact.c index 9aba87b..8048080 100644 --- a/src/client/interact.c +++ b/src/client/interact.c @@ -93,7 +93,7 @@ void interact_tick() && !v3s32_equals(interact_pointed.pos, old_pointed)) { mat4x4_translate(model, interact_pointed.pos.x, interact_pointed.pos.y, interact_pointed.pos.z); - v3f32 *color = &client_node_defs[interact_pointed.node].selection_color; + v3f32 *color = &client_node_def[interact_pointed.node].selection_color; glProgramUniform3f(shader_prog, loc_color, color->x, color->y, color->z); GL_DEBUG debug_menu_changed(ENTRY_POINTED); } @@ -125,7 +125,7 @@ void interact_use(bool left) pthread_mutex_lock(&data->mtx_inv); ItemStack *stack = left ? &data->inventory.left : &data->inventory.right; - if (client_item_defs[stack->type].use && client_item_defs[stack->type].use(stack)) + if (client_item_def[stack->type].use && client_item_def[stack->type].use(stack)) dragonnet_peer_send_ToServerInteract(client, &(ToServerInteract) { .left = left, .pointed = interact_pointed.exists, diff --git a/src/client/raycast.c b/src/client/raycast.c index c1f4a93..d836bde 100644 --- a/src/client/raycast.c +++ b/src/client/raycast.c @@ -14,7 +14,7 @@ bool raycast(v3f64 pos, v3f64 dir, f64 len, v3s32 *node_pos, NodeType *node) if (*node == NODE_UNLOADED) return false; - if (client_node_defs[*node].pointable) + if (client_node_def[*node].pointable) return true; f64 vpos[3] = {pos.x, pos.y, pos.z}; diff --git a/src/client/shader.c b/src/client/shader.c index 1a54271..632106c 100644 --- a/src/client/shader.c +++ b/src/client/shader.c @@ -5,7 +5,7 @@ #include "client/gl_debug.h" #include "client/shader.h" -static GLuint compile_shader(GLenum type, const char *path, const char *name, GLuint program, const char *defs) +static GLuint compile_shader(GLenum type, const char *path, const char *name, GLuint program, const char *def) { char full_path[strlen(path) + 1 + strlen(name) + 1 + 4 + 1]; sprintf(full_path, "%s/%s.glsl", path, name); @@ -53,13 +53,13 @@ static GLuint compile_shader(GLenum type, const char *path, const char *name, GL const char *code_list[3] = { version, - defs, + def, code, }; int size_list[3] = { 18, - strlen(defs), + strlen(def), size, }; @@ -82,21 +82,21 @@ static GLuint compile_shader(GLenum type, const char *path, const char *name, GL return id; } -bool shader_program_create(const char *path, GLuint *idptr, const char *defs) +bool shader_program_create(const char *path, GLuint *idptr, const char *def) { GLuint id = glCreateProgram(); GL_DEBUG - if (!defs) - defs = ""; + if (!def) + def = ""; GLuint vert, frag; - if (!(vert = compile_shader(GL_VERTEX_SHADER, path, "vertex", id, defs))) { + if (!(vert = compile_shader(GL_VERTEX_SHADER, path, "vertex", id, def))) { glDeleteProgram(id); GL_DEBUG return false; } - if (!(frag = compile_shader(GL_FRAGMENT_SHADER, path, "fragment", id, defs))) { + if (!(frag = compile_shader(GL_FRAGMENT_SHADER, path, "fragment", id, def))) { glDeleteShader(vert); GL_DEBUG glDeleteProgram(id); GL_DEBUG return false; diff --git a/src/client/shader.h b/src/client/shader.h index b53b604..490a7fc 100644 --- a/src/client/shader.h +++ b/src/client/shader.h @@ -5,6 +5,6 @@ #include #include -bool shader_program_create(const char *path, GLuint *idptr, const char *defs); +bool shader_program_create(const char *path, GLuint *idptr, const char *def); #endif // _SHADER_H_ diff --git a/src/client/terrain_gfx.c b/src/client/terrain_gfx.c index 32380e4..0883d63 100644 --- a/src/client/terrain_gfx.c +++ b/src/client/terrain_gfx.c @@ -52,7 +52,7 @@ static ModelShader model_shader; static inline bool show_face(NodeType self, NodeType nbr) { - switch (client_node_defs[self].visibility) { + switch (client_node_def[self].visibility) { case VISIBILITY_CLIP: return true; @@ -60,7 +60,7 @@ static inline bool show_face(NodeType self, NodeType nbr) return nbr != self; case VISIBILITY_SOLID: - return nbr != NODE_UNLOADED && client_node_defs[nbr].visibility != VISIBILITY_SOLID; + return nbr != NODE_UNLOADED && client_node_def[nbr].visibility != VISIBILITY_SOLID; default: // impossible break; @@ -76,7 +76,7 @@ static inline void render_node(ChunkRenderData *data, v3s32 offset) args.node = &data->chunk->data[offset.x][offset.y][offset.z]; - ClientNodeDef *def = &client_node_defs[args.node->type]; + ClientNodeDef *def = &client_node_def[args.node->type]; if (def->visibility == VISIBILITY_NONE) return; @@ -179,6 +179,10 @@ static Model *create_chunk_model(TerrainChunk *chunk, bool animate, bool *depend CHUNK_ITERATE render_node(&data, (v3s32) {x, y, z}); + for (int i = 0; i < 6; i++) + if (data.nbrs[i]) + depends[i] = true; + if (!data.visible || (!data.batch->textures.siz && !data.batch_transparent->textures.siz)) { model_batch_free(data.batch); model_batch_free(data.batch_transparent); @@ -208,10 +212,6 @@ static Model *create_chunk_model(TerrainChunk *chunk, bool animate, bool *depend model_batch_free(data.batch_transparent); } - for (int i = 0; i < 6; i++) - if (data.nbrs[i]) - data.tried_nbrs[i] = true; - return model; } @@ -220,20 +220,20 @@ bool terrain_gfx_init() GLint texture_units; glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texture_units); GL_DEBUG - char *shader_defs; - asprintf(&shader_defs, + char *shader_def; + asprintf(&shader_def, "#define MAX_TEXTURE_UNITS %d\n" "#define VIEW_DISTANCE %lf\n", texture_units, client_config.view_distance ); - if (!shader_program_create(RESSOURCE_PATH "shaders/3d/terrain", &shader_prog, shader_defs)) { + if (!shader_program_create(RESSOURCE_PATH "shaders/3d/terrain", &shader_prog, shader_def)) { fprintf(stderr, "[error] failed to create terrain shader program\n"); return false; } - free(shader_defs); + free(shader_def); loc_VP = glGetUniformLocation(shader_prog, "VP"); GL_DEBUG diff --git a/src/dig.h b/src/dig.h index d12d63e..3885ae4 100644 --- a/src/dig.h +++ b/src/dig.h @@ -6,6 +6,7 @@ typedef enum { DIG_STONE = 0x01, DIG_WOOD = 0x02, DIG_DIRT = 0x04, + DIG_LEAVES = 0x08, } DigClass; #endif // _DIG_H_ diff --git a/src/item.c b/src/item.c index 51beaf8..b492aa9 100644 --- a/src/item.c +++ b/src/item.c @@ -7,14 +7,14 @@ void item_stack_initialize(ItemStack *stack) stack->count = 1; stack->data = NULL; - if (item_defs[stack->type].callbacks.create) - item_defs[stack->type].callbacks.create(stack); + if (item_def[stack->type].callbacks.create) + item_def[stack->type].callbacks.create(stack); } void item_stack_destroy(ItemStack *stack) { - if (item_defs[stack->type].callbacks.delete) - item_defs[stack->type].callbacks.delete(stack); + if (item_def[stack->type].callbacks.delete) + item_def[stack->type].callbacks.delete(stack); if (stack->data) { free(stack->data); @@ -28,14 +28,14 @@ void item_stack_set(ItemStack *stack, ItemType type, u32 count, Blob buffer) stack->type = type; stack->count = count; - stack->data = item_defs[stack->type].data_size > 0 ? - malloc(item_defs[stack->type].data_size) : NULL; + stack->data = item_def[stack->type].data_size > 0 ? + malloc(item_def[stack->type].data_size) : NULL; - if (item_defs[stack->type].callbacks.create) - item_defs[stack->type].callbacks.create(stack); + if (item_def[stack->type].callbacks.create) + item_def[stack->type].callbacks.create(stack); - if (item_defs[stack->type].callbacks.deserialize) - item_defs[stack->type].callbacks.deserialize(&buffer, stack->data); + if (item_def[stack->type].callbacks.deserialize) + item_def[stack->type].callbacks.deserialize(&buffer, stack->data); } void item_stack_serialize(ItemStack *stack, SerializedItemStack *serialized) @@ -44,8 +44,8 @@ void item_stack_serialize(ItemStack *stack, SerializedItemStack *serialized) serialized->count = stack->count; serialized->data = (Blob) {0, NULL}; - if (item_defs[stack->type].callbacks.serialize) - item_defs[stack->type].callbacks.serialize(&serialized->data, stack->data); + if (item_def[stack->type].callbacks.serialize) + item_def[stack->type].callbacks.serialize(&serialized->data, stack->data); } void item_stack_deserialize(ItemStack *stack, SerializedItemStack *serialized) @@ -58,7 +58,7 @@ void item_stack_deserialize(ItemStack *stack, SerializedItemStack *serialized) item_stack_set(stack, type, serialized->count, serialized->data); } -ItemDef item_defs[COUNT_ITEM] = { +ItemDef item_def[COUNT_ITEM] = { // unknown { .stackable = false, @@ -87,4 +87,11 @@ ItemDef item_defs[COUNT_ITEM] = { .dig_class = DIG_WOOD, .callbacks = {NULL}, }, + // shovel + { + .stackable = false, + .data_size = 0, + .dig_class = DIG_DIRT, + .callbacks = {NULL}, + }, }; diff --git a/src/item.h b/src/item.h index 6d5fd3c..c794006 100644 --- a/src/item.h +++ b/src/item.h @@ -11,6 +11,7 @@ typedef enum { ITEM_NONE, ITEM_PICKAXE, ITEM_AXE, + ITEM_SHOVEL, COUNT_ITEM, } ItemType; @@ -39,6 +40,6 @@ void item_stack_set(ItemStack *stack, ItemType type, u32 count, Blob buffer); void item_stack_serialize(ItemStack *stack, SerializedItemStack *serialized); void item_stack_deserialize(ItemStack *stack, SerializedItemStack *serialized); -extern ItemDef item_defs[]; +extern ItemDef item_def[]; #endif // _ITEM_H_ diff --git a/src/node.c b/src/node.c index 2786aec..54b6294 100644 --- a/src/node.c +++ b/src/node.c @@ -3,7 +3,7 @@ #include "terrain.h" #include "types.h" -NodeDef node_defs[NODE_UNLOADED] = { +NodeDef node_def[NODE_UNLOADED] = { // unknown { .solid = true, @@ -62,7 +62,7 @@ NodeDef node_defs[NODE_UNLOADED] = { { .solid = true, .data_size = sizeof(ColorData), - .dig_class = DIG_NONE, + .dig_class = DIG_LEAVES, .callbacks = { .create = NULL, .delete = NULL, @@ -86,7 +86,7 @@ NodeDef node_defs[NODE_UNLOADED] = { { .solid = true, .data_size = sizeof(ColorData), - .dig_class = DIG_NONE, + .dig_class = DIG_LEAVES, .callbacks = { .create = NULL, .delete = NULL, @@ -110,7 +110,7 @@ NodeDef node_defs[NODE_UNLOADED] = { { .solid = true, .data_size = sizeof(ColorData), - .dig_class = DIG_NONE, + .dig_class = DIG_LEAVES, .callbacks = { .create = NULL, .delete = NULL, diff --git a/src/node.h b/src/node.h index 3c622e2..cdb1a3b 100644 --- a/src/node.h +++ b/src/node.h @@ -39,6 +39,6 @@ typedef struct { } callbacks; } NodeDef; -extern NodeDef node_defs[]; +extern NodeDef node_def[]; #endif diff --git a/src/physics.c b/src/physics.c index a89e89c..4074d8b 100644 --- a/src/physics.c +++ b/src/physics.c @@ -20,7 +20,7 @@ static aabb3s32 round_box(aabb3f64 box) static bool is_solid(Terrain *terrain, s32 x, s32 y, s32 z) { NodeType node = terrain_get_node(terrain, (v3s32) {x, y, z}).type; - return node == NODE_UNLOADED || node_defs[node].solid; + return node == NODE_UNLOADED || node_def[node].solid; } bool physics_ground(Terrain *terrain, bool collide, aabb3f32 box, v3f64 *pos, v3f64 *vel) diff --git a/src/server/server.c b/src/server/server.c index 0bd1205..d856512 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -31,8 +31,8 @@ static void on_ToServerInteract(DragonnetPeer *peer, ToServerInteract *pkt) pthread_mutex_lock(&player->mtx_inv); ItemStack *stack = pkt->left ? &player->inventory.left : &player->inventory.right; - if (server_item_defs[stack->type].use) - server_item_defs[stack->type].use(player, stack, pkt->pointed, pkt->pos); + if (server_item_def[stack->type].use) + server_item_def[stack->type].use(player, stack, pkt->pointed, pkt->pos); pthread_mutex_unlock(&player->mtx_inv); } diff --git a/src/server/server_item.c b/src/server/server_item.c index 2640695..e411d7e 100644 --- a/src/server/server_item.c +++ b/src/server/server_item.c @@ -12,7 +12,7 @@ static void use_dig(__attribute__((unused)) ServerPlayer *player, ItemStack *sta if (node == NODE_UNLOADED) return; - if (!(node_defs[node].dig_class & item_defs[stack->type].dig_class)) + if (!(node_def[node].dig_class & item_def[stack->type].dig_class)) return; terrain_set_node(server_terrain, pos, @@ -20,7 +20,7 @@ static void use_dig(__attribute__((unused)) ServerPlayer *player, ItemStack *sta false, NULL); } -ServerItemDef server_item_defs[COUNT_ITEM] = { +ServerItemDef server_item_def[COUNT_ITEM] = { // unknown { .use = NULL, @@ -37,4 +37,8 @@ ServerItemDef server_item_defs[COUNT_ITEM] = { { .use = &use_dig, }, + // shovel + { + .use = &use_dig, + }, }; diff --git a/src/server/server_item.h b/src/server/server_item.h index 1c6cfef..9fe5f2d 100644 --- a/src/server/server_item.h +++ b/src/server/server_item.h @@ -10,6 +10,6 @@ typedef struct { void (*use)(ServerPlayer *player, ItemStack *stack, bool pointed, v3s32 pos); } ServerItemDef; -extern ServerItemDef server_item_defs[]; +extern ServerItemDef server_item_def[]; #endif // _SERVER_ITEM_H_ diff --git a/src/server/server_player.c b/src/server/server_player.c index c412f04..815ccc9 100644 --- a/src/server/server_player.c +++ b/src/server/server_player.c @@ -117,8 +117,8 @@ static void player_spawn(ServerPlayer *player) database_create_player(player->name, player->pos, player->rot); } - item_stack_set(&player->inventory.left, ITEM_NONE + rand() % (ITEM_AXE - ITEM_NONE + 1), 1, (Blob) {0, NULL}); - item_stack_set(&player->inventory.right, ITEM_NONE + rand() % (ITEM_AXE - ITEM_NONE + 1), 1, (Blob) {0, NULL}); + item_stack_set(&player->inventory.left, ITEM_NONE + rand() % (COUNT_ITEM - ITEM_NONE), 1, (Blob) {0, NULL}); + item_stack_set(&player->inventory.right, ITEM_NONE + rand() % (COUNT_ITEM - ITEM_NONE), 1, (Blob) {0, NULL}); // since this is recv thread, we don't need lock_peer dragonnet_peer_send_ToClientInfo(player->peer, &(ToClientInfo) { diff --git a/src/server/server_terrain.c b/src/server/server_terrain.c index 77b9475..71dce28 100644 --- a/src/server/server_terrain.c +++ b/src/server/server_terrain.c @@ -263,7 +263,7 @@ static void generate_spawn_hut() pos.y++; } - if (node_defs[node].solid) + if (node_def[node].solid) break; server_terrain_gen_node(pos, diff --git a/src/server/terrain_gen.c b/src/server/terrain_gen.c index 6d5a239..39e64b3 100644 --- a/src/server/terrain_gen.c +++ b/src/server/terrain_gen.c @@ -95,7 +95,7 @@ void terrain_gen_chunk(TerrainChunk *chunk, List *changed_chunks) node = NODE_SNOW; if (generate_args.diff == 1) for (int i = 0; i < NUM_TREES; i++) { - TreeDef *def = &tree_defs[i]; + TreeDef *def = &tree_def[i]; if (def->condition(&condition_args) && noise2d(condition_args.pos.x, condition_args.pos.z, 0, seed + def->offset) * 0.5 + 0.5 < def->probability diff --git a/src/server/trees.c b/src/server/trees.c index e013a0d..d5c04d6 100644 --- a/src/server/trees.c +++ b/src/server/trees.c @@ -201,7 +201,7 @@ static void palm_tree(v3s32 pos, List *changed_chunks) voxel_procedural_delete(proc); } -TreeDef tree_defs[NUM_TREES] = { +TreeDef tree_def[NUM_TREES] = { // oak { .spread = 64.0f, diff --git a/src/server/trees.h b/src/server/trees.h index 2eeb3f8..e4ee7ef 100644 --- a/src/server/trees.h +++ b/src/server/trees.h @@ -30,6 +30,6 @@ typedef struct { void (*generate)(v3s32 pos, List *changed_chunks); } TreeDef; -extern TreeDef tree_defs[]; +extern TreeDef tree_def[]; #endif // _TREES_H_ diff --git a/src/terrain.c b/src/terrain.c index b3b3d38..3897b44 100644 --- a/src/terrain.c +++ b/src/terrain.c @@ -166,7 +166,7 @@ Blob terrain_serialize_chunk(TerrainChunk *chunk) }, }; - NodeDef *def = &node_defs[node->type]; + NodeDef *def = &node_def[node->type]; if (def->callbacks.serialize) def->callbacks.serialize(&node_data->data, node->data); @@ -242,7 +242,7 @@ TerrainNode terrain_node_create(NodeType type, Blob buffer) if (type >= NODE_UNLOADED) type = NODE_UNKNOWN; - NodeDef *def = &node_defs[type]; + NodeDef *def = &node_def[type]; TerrainNode node; node.type = type; @@ -259,7 +259,7 @@ TerrainNode terrain_node_create(NodeType type, Blob buffer) void terrain_node_delete(TerrainNode node) { - NodeDef *def = &node_defs[node.type]; + NodeDef *def = &node_def[node.type]; if (def->callbacks.delete) def->callbacks.delete(&node); -- 2.44.0