Skip to content

Commit a653b71

Browse files
authored
Merge pull request minekube#884 from minekube/fix/resourcepack-response-without-queued-pack
fix(java): ignore untracked modern resource pack responses
2 parents 2230101 + 95cb756 commit a653b71

2 files changed

Lines changed: 50 additions & 10 deletions

File tree

pkg/edition/java/proxy/internal/resourcepack/handler_modern.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,18 @@ func (m *modernHandler) OnResourcePackResponse(bundle *ResponseBundle) (bool, er
149149
}
150150
}
151151

152-
e := newPlayerResourcePackStatusEvent(m.player, bundle.Status, queued.ID, *queued)
153-
event.FireParallel(m.eventMgr, e, func(e *PlayerResourcePackStatusEvent) {
154-
if e.Status() == packet.DeclinedResourcePackResponseStatus &&
155-
e.PackInfo().ShouldForce &&
156-
!e.OverwriteKick() {
157-
m.player.Disconnect(&component.Translation{
158-
Key: "multiplayer.requiredTexturePrompt.disconnect",
159-
})
160-
}
161-
})
152+
if queued != nil {
153+
e := newPlayerResourcePackStatusEvent(m.player, bundle.Status, id, *queued)
154+
event.FireParallel(m.eventMgr, e, func(e *PlayerResourcePackStatusEvent) {
155+
if e.Status() == packet.DeclinedResourcePackResponseStatus &&
156+
e.PackInfo().ShouldForce &&
157+
!e.OverwriteKick() {
158+
m.player.Disconnect(&component.Translation{
159+
Key: "multiplayer.requiredTexturePrompt.disconnect",
160+
})
161+
}
162+
})
163+
}
162164

163165
switch bundle.Status {
164166
// The player has accepted the resource pack and will proceed to download it.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package resourcepack
2+
3+
import (
4+
"testing"
5+
6+
"github.com/robinbraemer/event"
7+
"go.minekube.com/common/minecraft/component"
8+
"go.minekube.com/gate/pkg/edition/java/proto/packet"
9+
"go.minekube.com/gate/pkg/edition/java/proto/state"
10+
"go.minekube.com/gate/pkg/edition/java/proto/version"
11+
"go.minekube.com/gate/pkg/gate/proto"
12+
"go.minekube.com/gate/pkg/util/uuid"
13+
)
14+
15+
type testPlayer struct{}
16+
17+
func (testPlayer) ID() uuid.UUID { return uuid.New() }
18+
func (testPlayer) WritePacket(proto.Packet) error { return nil }
19+
func (testPlayer) BundleHandler() *BundleDelimiterHandler { return nil }
20+
func (testPlayer) State() *state.Registry { return state.Play }
21+
func (testPlayer) Protocol() proto.Protocol { return version.Minecraft_1_20_3.Protocol }
22+
func (testPlayer) BackendInFlight() proto.PacketWriter { return nil }
23+
func (testPlayer) Disconnect(component.Component) {}
24+
25+
func TestModernHandlerIgnoresUntrackedResourcePackResponse(t *testing.T) {
26+
h := newModernHandler(testPlayer{}, event.Nop)
27+
28+
handled, err := h.OnResourcePackResponse(&ResponseBundle{
29+
ID: uuid.New(),
30+
Status: packet.SuccessfulResourcePackResponseStatus,
31+
})
32+
if err != nil {
33+
t.Fatalf("OnResourcePackResponse returned error: %v", err)
34+
}
35+
if handled {
36+
t.Fatal("OnResourcePackResponse handled untracked response")
37+
}
38+
}

0 commit comments

Comments
 (0)