feat(gameplay): implement entity update packets

Add S2CEntityUpdate to sync entity positions from server to client, including update handling in the client entity manager and server-side AI updates.
This commit is contained in:
2026-07-31 17:44:33 +08:00
parent d6f304e6ca
commit 8451921161
7 changed files with 63 additions and 5 deletions

View File

@@ -36,8 +36,23 @@ void ClientEntityManager::handle_entity_create(EntityID id,
c->transform.position.value = pos;
}
void ClientEntityManager::handle_entity_update(UpdateInfo& info) {
entt::entity e;
{
cacc a;
if (m_entities.find(a, info.id)) {
e = a->second;
} else {
return;
}
}
auto creature = m_registry.try_get<BaseClientCreature>(e);
ASSERT(creature);
creature->transform.position.value = info.pos;
}
void ClientEntityManager::receive_entity_create(S2CEntityCreate& s2c) {
EntityCreateElement c;
EntityCreateElement c{};
c.id = s2c.id();
c.name = s2c.name();
c.pos = {s2c.pos().x(), s2c.pos().y(), s2c.pos().z()};
@@ -48,6 +63,13 @@ void ClientEntityManager::receive_entity_destory(EntityID id) {
m_tasks.emplace(Command::DESTORY, id);
}
void ClientEntityManager::receive_entity_update(S2CEntityUpdate& msg) {
UpdateInfo e;
e.id = msg.id();
e.pos = Tools::get_net_pos(msg.pos());
m_tasks.emplace(Command::UPDATE, std::move(e));
}
void ClientEntityManager::destory(EntityID id) {
auto client = m_world.get_client();
Arena arena;
@@ -81,6 +103,11 @@ void ClientEntityManager::handle_task() {
ASSERT(p);
handle_entity_destory(*p);
} break;
case Command::UPDATE: {
auto* p = std::get_if<UpdateInfo>(&pair.second);
ASSERT(p);
handle_entity_update(*p);
}
}
}
}

View File

@@ -156,6 +156,12 @@ asio::awaitable<void> NetworkClient::read_loop() {
m_world.entity_manager().receive_entity_destory(msg->id());
}
} break;
case std::to_underlying(PacketEnum::S2C_ENTITY_UPDATE): {
auto* msg = Arena::Create<S2CEntityUpdate>(&arena);
if (decode_packet(*msg, body_data, header)) {
m_world.entity_manager().receive_entity_update(*msg);
}
} break;
}
}
} catch (const asio::system_error& e) {

View File

@@ -22,7 +22,10 @@ void ServerEntityManager::init() {
std::move(c), PigTag{});
});
}
void ServerEntityManager::update() { handle_task(); }
void ServerEntityManager::update() {
handle_task();
update_ai();
}
void ServerEntityManager::handle_task() {
TaskPair pair;

View File

@@ -21,4 +21,9 @@ message C2SEntityCreateRequest {
string uuid = 1;
string name = 2;
Vec3 pos = 3;
}
message S2CEntityUpdate {
uint64 id = 1;
Vec3 pos = 2;
}