diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-26 16:45:01 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-26 16:45:01 +1000 |
commit | aa220e7947372fccc2657a15d550408737ad1db7 (patch) | |
tree | 676fa4add71c8f1f1691696cd63e6536adc98990 /source/game/StarNpc.cpp | |
parent | 76f78c4b20bb0b66549a552953204d52334435f2 (diff) |
client-side NPCs
Diffstat (limited to 'source/game/StarNpc.cpp')
-rw-r--r-- | source/game/StarNpc.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/source/game/StarNpc.cpp b/source/game/StarNpc.cpp index b5fb690..bd2aa55 100644 --- a/source/game/StarNpc.cpp +++ b/source/game/StarNpc.cpp @@ -46,6 +46,8 @@ Npc::Npc(NpcVariant const& npcVariant) m_questIndicatorOffset = jsonToVec2F(assets->json("/quests/quests.config:defaultIndicatorOffset")); + m_clientEntityMode = ClientEntityModeNames.getLeft(npcVariant.overrides.getString("clientEntityMode", "ClientSlaveOnly")); + m_isInteractive.set(false); m_shifting.set(false); @@ -157,6 +159,10 @@ EntityType Npc::entityType() const { return EntityType::Npc; } +ClientEntityMode Npc::clientEntityMode() const { + return m_clientEntityMode; +} + void Npc::init(World* world, EntityId entityId, EntityMode mode) { Entity::init(world, entityId, mode); m_movementController->init(world); @@ -246,6 +252,18 @@ RectF Npc::collisionArea() const { } pair<ByteArray, uint64_t> Npc::writeNetState(uint64_t fromVersion) { + // client-side npcs error nearby vanilla NPC scripts because callScriptedEntity + // for now, scrungle the collision poly to avoid their queries. hacky :( + if (auto mode = entityMode()) { + if (*mode == EntityMode::Master && connectionForEntity(entityId()) != ServerConnectionId) { + PolyF poly = m_movementController->collisionPoly(); + m_movementController->setCollisionPoly({}); + auto result = m_netGroup.writeNetState(fromVersion); + m_movementController->setCollisionPoly(poly); + return result; + } + } + return m_netGroup.writeNetState(fromVersion); } |