Skip to content

Echo

Echo replicates other players’ characters as CFrame snapshots at 20 Hz (default). The server packs f32 CFrame buffers into UnreliableRemoteEvent packets; the client interpolates toward the last snapshot and skips LocalPlayer by default. Clock uses workspace:GetServerTimeNow().

Header: #include <clpp/libs/echo.clh>. Runtime: CluauppLibs.Echo.

  • Not Heartbeat spam on your own remotes. Default 20 Hz publish loop; tune with Echo.Config.
  • Buffers, not JSON character tables. WriteCFrame / ReadCFrame and packed snapshot records (UserId + 48-byte CFrame).
  • Server creates remotes; client WaitForChild. Stats() counters update live.

Echo smooths visuals; it does not replace server authority on position validation.

#include <clpp/libs/echo.clh>
void init() {
Echo.Config(EchoConfig {
.Rate = 20,
.Interpolate = 12,
.MaxDistance = 400,
});
Echo.Start();
}

On the client, read poses with Echo.Holder().Get(player) and tear down with Sweep when characters remove.

Returns: nothing (idempotent).

When: Once per place — server publishes snapshots on Heartbeat at Config.Rate; client listens and interpolates.

Echo.Start();

Returns: EchoHolder table with Get and All.

When: Read latest replicated pose per player on client or server mirror tables.

EchoEntity ent = Echo.Holder().Get(player);

Returns: EchoEntityPlayer, CFrame, Clock (or nil if unknown).

When: Drive nametags, shadows, or off-screen proxies for remote players.

EchoEntity ent = Echo.Holder().Get(player);

Returns: EchoEntity map keyed by Player (runtime table of all tracked entities).

When: Iterate everyone Echo knows about (debug HUD, batch effects).

EchoEntity all = Echo.Holder().All();

Returns: EchoEntityLib with new_(player).

When: Ensure an entity record exists before snapshots arrive.

EchoEntityLib lib = Echo.Entity();
EchoEntity e = lib.new_(player);

Returns: EchoEntity for the given player.

When: Same as ensureEntity — rarely needed if Start and snapshots already run.

EchoEntity e = Echo.Entity().new_(player);

Returns: buffer — 48 bytes, twelve f32 CFrame components.

When: Custom packing that must match Echo’s on-wire layout.

buffer buf = Echo.WriteCFrame(root.CFrame);

Returns: CFrame from a 48-byte buffer written by WriteCFrame.

When: Decode a single CFrame payload outside the snapshot packet.

CFrame cf = Echo.ReadCFrame(buf);

Returns: EchoStatsPackets, PacketsSent, PacketsReceived, BytesSent, BytesReceived, Snapshots.

When: Studio overlay or Lens window for bandwidth tuning.

EchoStats s = Echo.Stats();

Returns: EchoConfigRate, Interpolate, MaxDistance (pass a patch table to merge, then returns live config).

When: Set publish rate (Hz), client lerp stiffness, and optional cull distance (0 = no cull).

Echo.Config(EchoConfig { .Rate = 20, .Interpolate = 16 });
auto cfg = Echo.Config();

Returns: EchoRulesSkipLocal (pass patch to update).

When: Default skips local player replication; disable only if you intentionally drive LocalPlayer from Echo.

Echo.ReplicationRules(EchoRules { .SkipLocal = true });

Returns: FolderEchoRemotes under ReplicatedStorage (server creates, client waits).

When: Advanced wiring next to the snapshot remote.

Folder folder = Echo.Events();

Returns: auto — last { CFrame, Clock } per player (runtime table).

When: Debug compare raw snapshot vs interpolated root.

auto last = Echo.Snapshots();

Returns: doubleworkspace:GetServerTimeNow().

When: Align client effects to the same clock stamped on snapshot packets.

double t = Echo.ServerClock();

Returns: PlayerPlayers.LocalPlayer.

When: Client-only helpers without re-fetching the service.

Player me = Echo.Player();