diff --git a/legacyver/legacypacket/command_request.go b/legacyver/legacypacket/command_request.go index 44b7a23..e00bb50 100644 --- a/legacyver/legacypacket/command_request.go +++ b/legacyver/legacypacket/command_request.go @@ -31,7 +31,7 @@ func (*CommandRequest) ID() uint32 { func (pk *CommandRequest) Marshal(io protocol.IO) { io.String(&pk.CommandLine) - protocol.CommandOriginData(io, &pk.CommandOrigin) + proto.CommandOriginData(io, &pk.CommandOrigin) io.Bool(&pk.Internal) if proto.IsProtoGTE(io, proto.ID898) { io.String(&pk.Version) diff --git a/legacyver/proto/command.go b/legacyver/proto/command.go index 7deb22b..b730e05 100644 --- a/legacyver/proto/command.go +++ b/legacyver/proto/command.go @@ -211,3 +211,52 @@ func (x *ChainedSubcommandValue) FromLatest(latest protocol.ChainedSubcommandVal x.Value = latest.Value return *x } + +var commandOrigins = []string{ + protocol.CommandOriginPlayer, + protocol.CommandOriginBlock, + protocol.CommandOriginMinecartBlock, + protocol.CommandOriginDevConsole, + protocol.CommandOriginTest, + protocol.CommandOriginAutomationPlayer, + protocol.CommandOriginClientAutomation, + protocol.CommandOriginDedicatedServer, + protocol.CommandOriginEntity, + protocol.CommandOriginVirtual, + protocol.CommandOriginGameArgument, + protocol.CommandOriginEntityServer, + protocol.CommandOriginPrecompiled, + protocol.CommandOriginGameDirectorEntityServer, + protocol.CommandOriginScript, + protocol.CommandOriginExecutor, +} + +func commandOriginFromLegacy(legacy uint32) string { + if int(legacy) < len(commandOrigins) { + return commandOrigins[legacy] + } + return protocol.CommandOriginPlayer +} + +func commandOriginToLegacy(origin string) uint32 { + for k, v := range commandOrigins { + if v == origin { + return uint32(k) + } + } + return 0 // Default to player. +} + +// CommandOriginData reads/writes a CommandOrigin x using IO r. +func CommandOriginData(r protocol.IO, x *protocol.CommandOrigin) { + if IsProtoGTE(r, ID898) { + r.String(&x.Origin) + } else { + v := commandOriginToLegacy(x.Origin) + r.Varuint32(&v) + x.Origin = commandOriginFromLegacy(v) + } + r.UUID(&x.UUID) + r.String(&x.RequestID) + r.Int64(&x.PlayerUniqueID) +}