-
Notifications
You must be signed in to change notification settings - Fork 0
/
handler_login_clientbound.go
117 lines (99 loc) · 2.78 KB
/
handler_login_clientbound.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package kite
import (
"context"
"github.com/mworzala/kite/pkg/proto"
"github.com/mworzala/kite/pkg/proto/packet"
)
type ClientboundLoginHandler2[T any] struct {
Player *Player[T]
Remote *proto.Conn
}
func NewClientboundLoginHandler2[T any](p *Player[T], remote *proto.Conn) proto.Handler {
return &ClientboundLoginHandler2[T]{p, remote}
}
func (h *ClientboundLoginHandler2[T]) HandlePacket(pp proto.Packet) (err error) {
switch pp.Id {
case packet.ServerLoginLoginSuccessID:
p := new(packet.ServerLoginSuccess)
if err = pp.Read(p); err != nil {
return err
}
return h.handleLoginSuccess(p)
default:
return proto.UnknownPacket
}
}
func (h *ClientboundLoginHandler2[T]) handleLoginSuccess(p *packet.ServerLoginSuccess) error {
err := h.Remote.SendPacket(&packet.ClientLoginAcknowledged{})
if err != nil {
return err
}
// Disconnect them from their old server
oldRemote := h.Player.Conn.GetRemote()
h.Player.Conn.SetRemote(nil)
oldRemote.SetRemote(nil)
oldRemote.Close()
doneCh := make(chan bool)
h.Player.SetState(packet.Play, &WaitForStartConfigHandler[T]{
Player: h.Player,
Remote: h.Remote,
DoneCh: doneCh,
})
if err = h.Player.SendPacket(&packet.ServerStartConfiguration{}); err != nil {
return err
}
<-doneCh
return nil
}
type WaitForStartConfigHandler2 struct {
ctx context.Context
cancel context.CancelFunc
}
func (h *WaitForStartConfigHandler2) HandlePacket(pp proto.Packet) (err error) {
switch pp.Id {
case packet.ClientPlayConfigurationAckID:
p := new(packet.ClientConfigurationAck)
if err = pp.Read(p); err != nil {
return
}
return h.handleConfigAck(p)
default:
return nil // Eat any other packet for now
}
}
func (h *WaitForStartConfigHandler2) handleConfigAck(_ *packet.ClientConfigurationAck) error {
h.cancel()
//h.Remote.SetRemote(h.Player.Conn)
//h.Player.Conn.SetRemote(h.Remote)
//
//h.Player.SetState(packet.Config, NewClientConfigHandler(h.Player))
//h.Remote.SetState(packet.Config, NewServerConfigHandler(h.Player, h.Remote))
//
//h.DoneCh <- true
return nil
}
type WaitForStartConfigHandler[T any] struct {
Player *Player[T]
Remote *proto.Conn
DoneCh chan bool
}
func (h *WaitForStartConfigHandler[T]) HandlePacket(pp proto.Packet) (err error) {
switch pp.Id {
case packet.ClientPlayConfigurationAckID:
p := new(packet.ClientConfigurationAck)
if err = pp.Read(p); err != nil {
return
}
return h.handleConfigAck(p)
default:
return nil // Eat any other packet for now
}
}
func (h *WaitForStartConfigHandler[T]) handleConfigAck(_ *packet.ClientConfigurationAck) error {
h.Remote.SetRemote(h.Player.Conn)
h.Player.Conn.SetRemote(h.Remote)
h.Player.SetState(packet.Config, NewClientConfigHandler(h.Player))
h.Remote.SetState(packet.Config, NewServerConfigHandler(h.Player))
h.DoneCh <- true
return nil
}