eco2d/code/foundation/src/packets/pkt_send_keystate.c

110 lines
4.0 KiB
C
Raw Normal View History

#include "pkt/packet_utils.h"
#include "net/network.h"
2021-11-01 18:55:13 +00:00
#include "packets/pkt_send_keystate.h"
2022-09-29 14:16:06 +00:00
#include "models/components.h"
#include "systems/systems.h"
2021-11-01 18:55:13 +00:00
#include "world/world.h"
2022-09-29 14:16:06 +00:00
#include "models/entity.h"
2021-11-01 18:55:13 +00:00
2023-01-15 15:59:33 +00:00
#include "dev/debug_replay.h"
2021-11-01 18:55:13 +00:00
pkt_desc pkt_send_keystate_desc[] = {
{ PKT_REAL(pkt_send_keystate, x) },
{ PKT_REAL(pkt_send_keystate, y) },
{ PKT_REAL(pkt_send_keystate, mx) },
{ PKT_REAL(pkt_send_keystate, my) },
{ PKT_UINT(pkt_send_keystate, use) },
{ PKT_UINT(pkt_send_keystate, sprint) },
{ PKT_UINT(pkt_send_keystate, ctrl) },
2022-08-09 14:46:23 +00:00
{ PKT_UINT(pkt_send_keystate, pick) },
{ PKT_UINT(pkt_send_keystate, storage_action) },
2021-11-01 18:55:13 +00:00
{ PKT_UINT(pkt_send_keystate, selected_item) },
2022-08-09 14:46:23 +00:00
{ PKT_UINT(pkt_send_keystate, storage_selected_item) },
2021-11-01 18:55:13 +00:00
{ PKT_UINT(pkt_send_keystate, drop) },
{ PKT_UINT(pkt_send_keystate, swap) },
2022-08-09 14:46:23 +00:00
{ PKT_UINT(pkt_send_keystate, swap_storage) },
2021-11-01 18:55:13 +00:00
{ PKT_UINT(pkt_send_keystate, swap_from) },
{ PKT_UINT(pkt_send_keystate, swap_to) },
2022-10-18 17:37:56 +00:00
{ PKT_UINT(pkt_send_keystate, craft_item) },
2021-11-01 18:55:13 +00:00
{ PKT_UINT(pkt_send_keystate, placement_num) },
2022-08-11 10:41:36 +00:00
{ PKT_UINT(pkt_send_keystate, deletion_mode) },
2021-11-01 18:55:13 +00:00
{ PKT_ARRAY(pkt_send_keystate, placements) },
{ PKT_END },
};
2022-08-09 14:46:23 +00:00
pkt_desc pkt_send_blockpos_desc[] = {
{ PKT_REAL(pkt_send_blockpos, mx) },
{ PKT_REAL(pkt_send_blockpos, my) },
{ PKT_END },
};
2021-11-01 18:55:13 +00:00
size_t pkt_send_keystate_send(uint16_t view_id,
game_keystate_data *data) {
2022-07-31 09:21:27 +00:00
return pkt_world_write(MSG_ID_SEND_KEYSTATE, pkt_table_encode(pkt_send_keystate_desc, PKT_STRUCT_PTR(data)), 1, view_id, NULL, 1);
2021-11-01 18:55:13 +00:00
}
2022-08-09 14:46:23 +00:00
size_t pkt_send_blockpos_send(uint16_t view_id,
pkt_send_blockpos *data){
return pkt_world_write(MSG_ID_SEND_BLOCKPOS, pkt_table_encode(pkt_send_blockpos_desc, PKT_STRUCT_PTR(data)), 1, view_id, NULL, 1);
}
2021-11-01 18:55:13 +00:00
int32_t pkt_send_keystate_handler(pkt_header *header) {
pkt_send_keystate table;
PKT_IF(pkt_msg_decode(header, pkt_send_keystate_desc, pkt_pack_desc_args(pkt_send_keystate_desc), PKT_STRUCT_PTR(&table)));
2022-07-31 10:24:31 +00:00
ecs_entity_t e = network_server_get_entity(header->udata, header->view_id);
2021-11-01 18:55:13 +00:00
if (!world_entity_valid(e))
return 1;
2022-07-31 14:34:47 +00:00
Input *i = ecs_get_mut(world_ecs(), e, Input);
2021-11-01 18:55:13 +00:00
if (i && !i->is_blocked) {
i->x = zpl_clamp(table.x, -1.0f, 1.0f);
i->y = zpl_clamp(table.y, -1.0f, 1.0f);
i->mx = table.mx;
i->my = table.my;
2021-11-02 09:22:04 +00:00
i->use |= table.use;
2021-11-01 18:55:13 +00:00
i->sprint = table.sprint;
i->ctrl = table.ctrl;
2022-08-09 14:46:23 +00:00
i->pick |= table.pick;
i->selected_item = zpl_clamp(table.selected_item, 0, ITEMS_CONTAINER_SIZE-1);
i->storage_selected_item = zpl_clamp(table.storage_selected_item, 0, ITEMS_CONTAINER_SIZE-1);
2021-11-02 09:22:04 +00:00
i->drop |= table.drop;
i->swap |= table.swap;
2022-08-09 14:46:23 +00:00
i->swap_storage |= table.swap_storage;
i->swap_from = zpl_clamp(table.swap_from, 0, ITEMS_CONTAINER_SIZE-1);
i->swap_to = zpl_clamp(table.swap_to, 0, ITEMS_CONTAINER_SIZE-1);
2022-10-18 17:37:56 +00:00
i->craft_item = table.craft_item;
2022-08-09 14:46:23 +00:00
i->storage_action = table.storage_action;
2022-08-11 10:41:36 +00:00
i->deletion_mode = table.deletion_mode;
2021-11-02 09:22:04 +00:00
if (table.placement_num > 0) {
i->num_placements = zpl_clamp(table.placement_num, 0, BUILD_MAX_PLACEMENTS);
for (uint8_t j = 0; j < i->num_placements; j++) {
i->placements_x[j] = table.placements[j].x;
i->placements_y[j] = table.placements[j].y;
}
2021-11-01 18:55:13 +00:00
}
debug_replay_record_keystate(table);
2022-08-08 11:57:03 +00:00
entity_wake(e);
2021-11-01 18:55:13 +00:00
}
return 0;
}
2022-08-09 14:46:23 +00:00
int32_t pkt_send_blockpos_handler(pkt_header *header) {
pkt_send_blockpos table;
PKT_IF(pkt_msg_decode(header, pkt_send_blockpos_desc, pkt_pack_desc_args(pkt_send_blockpos_desc), PKT_STRUCT_PTR(&table)));
ecs_entity_t e = network_server_get_entity(header->udata, header->view_id);
if (!world_entity_valid(e))
return 1;
Input *i = ecs_get_mut(world_ecs(), e, Input);
if (i && !i->is_blocked) {
i->bx = table.mx;
i->by = table.my;
}
return 0;
}