Some servers list a client with an empty client_servergroups; parsing it
threw NumberFormatException and aborted iterating the whole client list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RemoteCounterFull only knew a 100-packet window. A packet that arrived more
than 100 IDs late - typically a retransmit after a loss in the large burst a
busy server sends on connect - was assumed to belong to the next generation,
as was packet ID 0 right after a wrap. The generation feeds the EAX key, so
those packets failed with "mac check in EAX failed", were never acknowledged
and stalled the command stream.
Place each ID in the generation closest to the newest packet received, and
remember the last 32768 positions for duplicate detection.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Without -voice the server omits client_input_muted/output_muted and
the hardware flags entirely, so a bare clientlist leaves callers
unable to tell "false" from "not reported" and defaults them wrong.
initserver announces the whole virtual server (its name above all), but only
the client and server ids were taken from it and the rest was dropped. The
name is not obtainable elsewhere: servergetvariables answers without it, and
notifyserveredited only fires when someone edits the server.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both were pulled in for a single call each: commons-lang for
ConstructorUtils.invokeConstructor when building a packet handler, and
dnsjava for the _ts3._udp SRV lookup. Together they added over a
megabyte to a shaded jar (and dnsjava drops jnamed/update classes into
the jar root). Plain reflection and JNDI's dns: provider cover both.
Also drop the BouncyCastleProvider registration: every digest here is
requested by a name the SUN provider already answers, so the only thing
it accomplished was keeping the whole JCE provider, the post-quantum
suite and the X.509 stack reachable for a shaded-jar tree-shaker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Change client.password to client.server_password in LocalTeamspeakClientSocket.java so that password authentication is properly passed at connection time.
- There is now more detailed output for command futures when reconnecting: "client reconnecting" instead of "client disconnected"
- The MusicPlayer example now returns exit code -1 when it is kicked/disconnected prematurely.