]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/client_entity.h
05651c4daafd86a79afda8165652cffa56db6231
[dragonblocks_alpha.git] / src / client / client_entity.h
1 #ifndef _CLIENT_ENTITY_H_
2 #define _CLIENT_ENTITY_H_
3
4 #include <dragonnet/peer.h>
5 #include <dragonstd/refcount.h>
6 #include <pthread.h>
7 #include "client/model.h"
8 #include "entity.h"
9 #include "types.h"
10
11 typedef struct {
12         EntityData data;
13         struct ClientEntityType *type;
14         Refcount rc;
15
16         Model *model;
17
18         pthread_rwlock_t lock_pos_rot;
19         pthread_rwlock_t lock_box_eye;
20         pthread_rwlock_t lock_nametag;
21 } ClientEntity;
22
23 typedef struct ClientEntityType {
24         void (*add   )(ClientEntity *entity); // called when server sent addition of entity
25         void (*remove)(ClientEntity *entity); // called when server sent removal of entity
26         void (*free  )(ClientEntity *entity); // called when entity is garbage collected
27
28         void (*update_pos_rot)(ClientEntity *entity);
29         void (*update_box_eye)(ClientEntity *entity);
30         void (*update_nametag)(ClientEntity *entity);
31
32         void (*transform)(ClientEntity *entity);
33 } ClientEntityType;
34
35 void client_entity_init();
36 void client_entity_deinit();
37
38 ClientEntity *client_entity_grab(u64 id);
39 void client_entity_drop(ClientEntity *entity);
40
41 void client_entity_transform(ClientEntity *entity);
42
43 void client_entity_add(DragonnetPeer *peer, ToClientEntityAdd *pkt);
44 void client_entity_remove(DragonnetPeer *peer, ToClientEntityRemove *pkt);
45 void client_entity_update_pos_rot(DragonnetPeer *peer, ToClientEntityUpdatePosRot *pkt);
46 void client_entity_update_box_eye(DragonnetPeer *peer, ToClientEntityUpdateBoxEye *pkt);
47 void client_entity_update_nametag(DragonnetPeer *peer, ToClientEntityUpdateNametag *pkt);
48
49 extern ClientEntityType client_entity_types[];
50
51 #endif // _CLIENT_ENTITY_H_