Skip to content

Add ClientID spoofer#8536

Open
Razzyk wants to merge 2 commits into
CCBlueX:nextgenfrom
Razzyk:codex/clientid-spoofer
Open

Add ClientID spoofer#8536
Razzyk wants to merge 2 commits into
CCBlueX:nextgenfrom
Razzyk:codex/clientid-spoofer

Conversation

@Razzyk

@Razzyk Razzyk commented Jun 22, 2026

Copy link
Copy Markdown

Summary

  • adds a ClientID spoofer toggle under the multiplayer Spoofer settings
  • registers ClientID-compatible custom payload types for mod check, mod list, pack list, and client version
  • sends configurable spoofed or installed mod/resource-pack lists on play join, matching Novinity ClientID's Fabric protocol

I have tested this, and it did bypass the checks for clientID

https://modrinth.com/plugin/client-id

and yes, this is vibe coded but it does work so

@Razzyk Razzyk changed the title [codex] Add ClientID spoofer Add ClientID spoofer Jun 22, 2026
@Razzyk Razzyk marked this pull request as ready for review June 22, 2026 10:19
@localpthebest

Copy link
Copy Markdown
Contributor

if ur server requires this borderline spyware id just recommend not playing on it.

@1zun4 1zun4 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall it looks fine to. Just has to be verified if we don't cause issues with

  1. Having Client ID mod installed (maybe rather inject it instead of making our own?)
  2. Verify if the registered channels cannot be used to detect if the mod is installed.

Comment on lines +166 to +175
private fun registerPayloadTypes() {
runCatching {
PayloadTypeRegistry.serverboundPlay().register(ClientIdModCheckPayload.ID, ClientIdModCheckPayload.CODEC)
PayloadTypeRegistry.serverboundPlay().register(ClientIdModListPayload.ID, ClientIdModListPayload.CODEC)
PayloadTypeRegistry.serverboundPlay().register(ClientIdPackListPayload.ID, ClientIdPackListPayload.CODEC)
PayloadTypeRegistry.serverboundPlay().register(ClientIdVersionPayload.ID, ClientIdVersionPayload.CODEC)
}.onFailure { error ->
logger.debug("ClientID payload types were already registered or unavailable.", error)
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this not be used to detect LiquidBounce / "Client ID" e.g. by checking if these channels are registered, or is that not possible? Needs to be checked!

Comment on lines +60 to +65
private val modListMode by enumChoice("ModList", ModListMode.SPOOFED)
private val spoofedMods by textList("SpoofedMods", defaultSpoofedMods.toMutableList())
private val resourcePackMode by enumChoice("PackList", ResourcePackMode.CURRENT)
private val spoofedPacks by textList("SpoofedPacks", mutableListOf("Default"))
private val clientIdVersion by text("Version", DEFAULT_VERSION)
private val sendPackUpdates by boolean("SendPackUpdates", true)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A bit more human-written descriptions for these options would help. For example, SendPackUpdates tells me nothing as a user.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants