diff --git a/source/entity/entity.c b/source/entity/entity.c index 9211d55b..c48aeb57 100644 --- a/source/entity/entity.c +++ b/source/entity/entity.c @@ -306,7 +306,7 @@ void entities_client_tick(dict_entity_t dict) { dict_entity_it(it, dict); while(!dict_entity_end_p(it)) { - struct entity* e = &dict_entity_ref(it)->value; + struct entity* e = dict_entity_ref(it)->value; if(e->tick_client) e->tick_client(e); @@ -321,11 +321,11 @@ void entities_client_render(dict_entity_t dict, struct camera* c, dict_entity_it(it, dict); while(!dict_entity_end_p(it)) { - struct entity* e = &dict_entity_ref(it)->value; + struct entity* e = dict_entity_ref(it)->value; if(e->render && glm_vec3_distance2(e->pos, (vec3) {c->x, c->y, c->z}) < glm_pow2(32.0F)) e->render(e, c->view, tick_delta); dict_entity_next(it); } -} \ No newline at end of file +} diff --git a/source/entity/entity.h b/source/entity/entity.h index 421edd77..e36c74c5 100644 --- a/source/entity/entity.h +++ b/source/entity/entity.h @@ -66,7 +66,7 @@ struct entity { } data; }; -DICT_DEF2(dict_entity, uint32_t, M_BASIC_OPLIST, struct entity, M_POD_OPLIST) +DICT_DEF2(dict_entity, uint32_t, M_BASIC_OPLIST, struct entity*, M_POD_OPLIST) #include "../world.h" @@ -100,4 +100,4 @@ bool entity_aabb_intersection(struct entity* e, struct AABB* a); void entity_try_move(struct entity* e, vec3 pos, vec3 vel, struct AABB* bbox, size_t coord, bool* collision_xz, bool* on_ground); -#endif \ No newline at end of file +#endif diff --git a/source/network/client_interface.c b/source/network/client_interface.c index 3f7a8d6e..db80fa5e 100644 --- a/source/network/client_interface.c +++ b/source/network/client_interface.c @@ -116,6 +116,14 @@ void clin_process(struct client_rpc* call) { } } + dict_entity_it_t it; + dict_entity_it(it, gstate.entities); + + while(!dict_entity_end_p(it)) { + free(dict_entity_ref(it)->value); + dict_entity_next(it); + } + dict_entity_reset(gstate.entities); gstate.windows[WINDOWC_INVENTORY] @@ -127,8 +135,11 @@ void clin_process(struct client_rpc* call) { gstate.world_loaded = false; gstate.world.dimension = call->payload.world_reset.dimension; - gstate.local_player = dict_entity_safe_get( + struct entity** local_player_ptr = dict_entity_safe_get( gstate.entities, call->payload.world_reset.local_entity); + *local_player_ptr = malloc(sizeof(struct entity)); + assert(*local_player_ptr); + gstate.local_player = *local_player_ptr; entity_local_player(call->payload.world_reset.local_entity, gstate.local_player, &gstate.world); @@ -219,8 +230,11 @@ void clin_process(struct client_rpc* call) { break; case CRPC_SPAWN_ITEM: { - struct entity* e = dict_entity_safe_get( + struct entity** e_ptr = dict_entity_safe_get( gstate.entities, call->payload.spawn_item.entity_id); + *e_ptr = malloc(sizeof(struct entity)); + struct entity* e = *e_ptr; + assert(e); entity_item(call->payload.spawn_item.entity_id, e, false, &gstate.world, call->payload.spawn_item.item); e->teleport(e, call->payload.spawn_item.pos); @@ -229,8 +243,8 @@ void clin_process(struct client_rpc* call) { if(gstate.local_player && call->payload.pickup_item.collector_id == gstate.local_player->id) { - struct entity* e = dict_entity_get( - gstate.entities, call->payload.pickup_item.entity_id); + struct entity* e = *(dict_entity_get( + gstate.entities, call->payload.pickup_item.entity_id)); if(e) glm_vec3_copy((vec3) {gstate.camera.x, gstate.camera.y - 0.2F, @@ -239,12 +253,14 @@ void clin_process(struct client_rpc* call) { } } break; case CRPC_ENTITY_DESTROY: + free(*dict_entity_get(gstate.entities, + call->payload.entity_destroy.entity_id)); dict_entity_erase(gstate.entities, call->payload.entity_destroy.entity_id); break; case CRPC_ENTITY_MOVE: { - struct entity* e = dict_entity_get( - gstate.entities, call->payload.entity_move.entity_id); + struct entity* e = *(dict_entity_get( + gstate.entities, call->payload.entity_move.entity_id)); if(e) glm_vec3_copy(call->payload.entity_move.pos, e->network_pos); } break; diff --git a/source/network/server_local.c b/source/network/server_local.c index 97822573..a4715f17 100644 --- a/source/network/server_local.c +++ b/source/network/server_local.c @@ -36,7 +36,11 @@ struct entity* server_local_spawn_item(vec3 pos, struct item_data* it, bool throw, struct server_local* s) { uint32_t entity_id = entity_gen_id(s->entities); - struct entity* e = dict_entity_safe_get(s->entities, entity_id); + struct entity** e_ptr = dict_entity_safe_get(s->entities, entity_id); + *e_ptr = malloc(sizeof(struct entity)); + struct entity* e = *e_ptr; + assert(e); + entity_item(entity_id, e, true, &s->world, *it); e->teleport(e, pos); @@ -286,6 +290,13 @@ static void server_local_process(struct server_rpc* call, void* user) { level_archive_write_inventory(&s->level, &s->player.inventory); level_archive_write(&s->level, LEVEL_TIME, &s->world_time); + dict_entity_it_t it; + dict_entity_it(it, s->entities); + + while(!dict_entity_end_p(it)) { + free(dict_entity_ref(it)->value); + dict_entity_next(it); + } dict_entity_reset(s->entities); server_world_destroy(&s->world); level_archive_destroy(&s->level); @@ -344,7 +355,7 @@ static void server_local_update(struct server_local* s) { while(!dict_entity_end_p(it)) { uint32_t key = dict_entity_ref(it)->key; - struct entity* e = &dict_entity_ref(it)->value; + struct entity* e = dict_entity_ref(it)->value; if(e->tick_server) { bool remove = (e->delay_destroy == 0) || e->tick_server(e, s); @@ -356,6 +367,7 @@ static void server_local_update(struct server_local* s) { .payload.entity_destroy.entity_id = key, }); + free(e); dict_entity_erase(s->entities, key); } else if(e->delay_destroy < 0) { clin_rpc_send(&(struct client_rpc) {