R
roblox-ts2mo ago
Pizza

Does anyone have any examples of using something like tether for charm sync

I'm just confused for the manual networking part of charm sync and my project uses tether
Solution:
I use it with serio and charm-payload-converter shared/network.ts ```ts import type { SerializeablePayload } from "@rbxts/charm-payload-converter"...
Jump to solution
2 Replies
Solution
Mirrox
Mirrox2mo ago
I use it with serio and charm-payload-converter shared/network.ts
import type { SerializeablePayload } from "@rbxts/charm-payload-converter"
import { MessageEmitter } from "@rbxts/tether"
import type { replicatedAtoms } from "./state"

export const messaging = MessageEmitter.create<MessageData>()
export const message = { sync: { dispatch: 0, start: 1 } } as const

type MessageData = {
[message.sync.dispatch]: SerializeablePayload<typeof replicatedAtoms>
[message.sync.start]: void
}
import type { SerializeablePayload } from "@rbxts/charm-payload-converter"
import { MessageEmitter } from "@rbxts/tether"
import type { replicatedAtoms } from "./state"

export const messaging = MessageEmitter.create<MessageData>()
export const message = { sync: { dispatch: 0, start: 1 } } as const

type MessageData = {
[message.sync.dispatch]: SerializeablePayload<typeof replicatedAtoms>
[message.sync.start]: void
}
shared/state.ts
import { atom } from "@rbxts/charm"
import type { String, u8 } from "@rbxts/serio"

type Data = { readonly array: String<u8>[] }
export const setPatch: Data = { array: ["string", "serio", "type", "testing"] }

export const atomState = atom<Data>()
export const replicatedAtoms = { replicatedAtom: atomState }
import { atom } from "@rbxts/charm"
import type { String, u8 } from "@rbxts/serio"

type Data = { readonly array: String<u8>[] }
export const setPatch: Data = { array: ["string", "serio", "type", "testing"] }

export const atomState = atom<Data>()
export const replicatedAtoms = { replicatedAtom: atomState }
server/sync-service.ts
import { type OnStart, Service } from "@flamework/core"
import { toSerializeablePayload } from "@rbxts/charm-payload-converter"
import CharmSync from "@rbxts/charm-sync"
import { message, messaging } from "shared/network"
import { replicatedAtoms } from "shared/state"

@Service()
export class SyncService implements OnStart {
private readonly syncer = CharmSync.server({
atoms: replicatedAtoms,
autoSerialize: false,
})

public onStart() {
this.handleSyncer()
}

private handleSyncer() {
this.syncer.connect((player, payload) => {
const serializeable = toSerializeablePayload(payload)
messaging.client.emit(player, message.sync.dispatch, serializeable)
})

messaging.server.on(message.sync.start, this.syncer.hydrate)
}
}
import { type OnStart, Service } from "@flamework/core"
import { toSerializeablePayload } from "@rbxts/charm-payload-converter"
import CharmSync from "@rbxts/charm-sync"
import { message, messaging } from "shared/network"
import { replicatedAtoms } from "shared/state"

@Service()
export class SyncService implements OnStart {
private readonly syncer = CharmSync.server({
atoms: replicatedAtoms,
autoSerialize: false,
})

public onStart() {
this.handleSyncer()
}

private handleSyncer() {
this.syncer.connect((player, payload) => {
const serializeable = toSerializeablePayload(payload)
messaging.client.emit(player, message.sync.dispatch, serializeable)
})

messaging.server.on(message.sync.start, this.syncer.hydrate)
}
}
client/sync-controller.ts
import { Controller, type OnStart } from "@flamework/core"
import { fromSerializeablePayload } from "@rbxts/charm-payload-converter"
import CharmSync from "@rbxts/charm-sync"
import { message, messaging } from "shared/network"
import { replicatedAtoms } from "shared/state"

@Controller()
export class SyncController implements OnStart {
private readonly syncer = CharmSync.client({ atoms: replicatedAtoms })

public async onStart() {
this.handleSyncer()
}

private handleSyncer() {
messaging.client.on(message.sync.dispatch, (data) => {
const hydration = fromSerializeablePayload(data)
this.syncer.sync(hydration)
})
messaging.server.emit(message.sync.start)
}
}
import { Controller, type OnStart } from "@flamework/core"
import { fromSerializeablePayload } from "@rbxts/charm-payload-converter"
import CharmSync from "@rbxts/charm-sync"
import { message, messaging } from "shared/network"
import { replicatedAtoms } from "shared/state"

@Controller()
export class SyncController implements OnStart {
private readonly syncer = CharmSync.client({ atoms: replicatedAtoms })

public async onStart() {
this.handleSyncer()
}

private handleSyncer() {
messaging.client.on(message.sync.dispatch, (data) => {
const hydration = fromSerializeablePayload(data)
this.syncer.sync(hydration)
})
messaging.server.emit(message.sync.start)
}
}
Pizza
PizzaOP2mo ago
Thanks

Did you find this page helpful?