Skip to content

Commit d7779f6

Browse files
robinbraemergmax79
andcommitted
feat: Add EntityArgumentType for minecraft:entity commands (PR minekube#78)
- Add EntityArgumentType with SingleEntity and OnlyPlayers flags - Implement EntityArgumentPropertyCodec for proper serialization/deserialization - Update registry to use EntityArgumentType instead of simple byte codec - Add PlayerArgument constant for easy player-only entity selection - Add comprehensive documentation referencing wiki.vg/Command_Data - Add test command demonstrating EntityArgumentType usage This provides proper minecraft:entity argument type support, enabling better command argument handling and auto-completion for player/entity selection. Based on contribution by @gmax79 in PR minekube#78. Co-authored-by: gmax79 <gmax79@users.noreply.github.com>
1 parent 9e26167 commit d7779f6

4 files changed

Lines changed: 57 additions & 2 deletions

File tree

pkg/edition/java/proto/packet/brigadier/codecs.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,31 @@ var (
409409
}, nil
410410
},
411411
}
412+
413+
EntityArgumentPropertyCodec ArgumentPropertyCodec = &ArgumentPropertyCodecFuncs{
414+
EncodeFn: func(wr io.Writer, v any, protocol proto.Protocol) error {
415+
i, ok := v.(*EntityArgumentType)
416+
if !ok {
417+
return fmt.Errorf("expected *EntityArgumentType but got %T", v)
418+
}
419+
var b byte
420+
if i.SingleEntity {
421+
b = b | 0x1
422+
}
423+
if i.OnlyPlayers {
424+
b = b | 0x2
425+
}
426+
return util.WriteByte(wr, b)
427+
},
428+
DecodeFn: func(rd io.Reader, protocol proto.Protocol) (any, error) {
429+
b, err := util.ReadByte(rd)
430+
if err != nil {
431+
return nil, err
432+
}
433+
434+
return &EntityArgumentType{SingleEntity: b&0x1 != 0, OnlyPlayers: b&0x2 != 0}, nil
435+
},
436+
}
412437
)
413438

414439
const (

pkg/edition/java/proto/packet/brigadier/registry.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ func init() {
181181
register(id("brigadier:string", mapSet(Minecraft_1_19, 5)), brigodier.String, StringArgumentPropertyCodec)
182182

183183
// Minecraft argument types
184-
emptyWithCodec(id("minecraft:entity", mapSet(Minecraft_1_19, 6)), ByteArgumentPropertyCodec)
184+
register(id("minecraft:entity", mapSet(Minecraft_1_19, 6)), PlayerArgument, EntityArgumentPropertyCodec)
185185
empty(id("minecraft:game_profile", mapSet(Minecraft_1_19, 7)))
186186
empty(id("minecraft:block_pos", mapSet(Minecraft_1_19, 8)))
187187
empty(id("minecraft:column_pos", mapSet(Minecraft_1_19, 9)))

pkg/edition/java/proto/packet/brigadier/types.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import (
44
"go.minekube.com/brigodier"
55
)
66

7-
var RegistryKeyArgument brigodier.ArgumentType = &RegistryKeyArgumentType{}
7+
var (
8+
RegistryKeyArgument brigodier.ArgumentType = &RegistryKeyArgumentType{}
9+
PlayerArgument brigodier.ArgumentType = &EntityArgumentType{SingleEntity: true, OnlyPlayers: true}
10+
)
811

912
type RegistryKeyArgumentType struct {
1013
Identifier string
@@ -55,3 +58,16 @@ func (r *ResourceSelectorArgumentType) Parse(rd *brigodier.StringReader) (any, e
5558
}
5659

5760
func (r *ResourceSelectorArgumentType) String() string { return "resource_selector_argument" }
61+
62+
// EntityArgumentType represents the minecraft:entity argument type.
63+
// See https://wiki.vg/Command_Data (minecraft:entity)
64+
// It provides auto-substitution of online player names in commands.
65+
type EntityArgumentType struct {
66+
SingleEntity bool // Only select one entity
67+
OnlyPlayers bool // Only select players (not other entities)
68+
}
69+
70+
func (t *EntityArgumentType) String() string { return "entity" }
71+
func (t *EntityArgumentType) Parse(rd *brigodier.StringReader) (any, error) {
72+
return rd.ReadString()
73+
}

pkg/edition/java/proxy/builtin_commands.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@ package proxy
22

33
import (
44
"go.minekube.com/brigodier"
5+
. "go.minekube.com/common/minecraft/component"
56
"go.minekube.com/gate/pkg/command"
7+
"go.minekube.com/gate/pkg/edition/java/proto/packet/brigadier"
68
)
79

810
func (p *Proxy) registerBuiltinCommands() []string {
911
return []string{
1012
p.command.Register(newServerCmd(p)).Name(),
1113
p.command.Register(newGlistCmd(p)).Name(),
1214
p.command.Register(newSendCmd(p)).Name(),
15+
p.command.Register(newTestEntityCmd(p)).Name(),
1316
}
1417
}
1518

@@ -18,3 +21,14 @@ func hasCmdPerm(proxy *Proxy, perm string) brigodier.RequireFn {
1821
return !proxy.cfg.RequireBuiltinCommandPermissions || c.Source.HasPermission(perm)
1922
})
2023
}
24+
25+
func newTestEntityCmd(proxy *Proxy) brigodier.LiteralNodeBuilder {
26+
return brigodier.Literal("testentity").
27+
Then(brigodier.Argument("player", brigadier.PlayerArgument).
28+
Executes(command.Command(func(c *command.Context) error {
29+
playerName := c.String("player")
30+
return c.SendMessage(&Text{
31+
Content: "EntityArgumentType: You specified player '" + playerName + "' - this uses proper minecraft:entity argument type!",
32+
})
33+
})))
34+
}

0 commit comments

Comments
 (0)