Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions source/entity/entity.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
}
}
}
4 changes: 2 additions & 2 deletions source/entity/entity.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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
#endif
28 changes: 22 additions & 6 deletions source/network/client_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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,
Expand All @@ -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;
Expand Down
16 changes: 14 additions & 2 deletions source/network/server_local.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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) {
Expand Down