Repository navigation
Expand file tree
/
Copy pathproxy.go
More file actions
96 lines (88 loc) · 2.29 KB
/
Copy pathproxy.go
File metadata and controls
96 lines (88 loc) · 2.29 KB
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
package pernod
import (
"errors"
"log"
"github.com/Tnze/go-mc/bot"
"github.com/Tnze/go-mc/chat"
"github.com/Tnze/go-mc/data/packetid"
"github.com/Tnze/go-mc/net"
"github.com/Tnze/go-mc/net/packet"
"github.com/Tnze/go-mc/server"
"github.com/google/uuid"
)
// Proxy is an implementation of github.com/Tnze/go-mc/server.GamePlay
type Proxy struct {
PlayerList *server.PlayerList
Destination string
ModifyClientboundPacket func(p *packet.Packet) error
ModifyServerboundPacket func(p *packet.Packet) error
}
type Player struct {
conn *net.Conn
c *bot.Client
}
func (p Player) SendDisconnect(reason chat.Message) {
p.conn.WritePacket(packet.Marshal(packetid.ClientboundDisconnect, reason))
}
func (p *Proxy) AcceptPlayer(name string, id uuid.UUID, _ int32, conn *net.Conn) {
c := bot.NewClient()
c.Auth.Name = name
c.Auth.UUID = id.String()
// forward all packet from server to player
c.Events.AddGeneric(bot.PacketHandler{
Priority: 100,
F: func(pk packet.Packet) error {
if p.ModifyClientboundPacket != nil {
err := p.ModifyClientboundPacket(&pk)
if err != nil {
return err
}
}
return conn.WritePacket(pk)
},
})
if err := c.JoinServer(p.Destination); err != nil {
log.Printf("Connecting to server[%s] error: %v", p.Destination, err)
var disconnectErr *bot.DisconnectErr
if errors.As(err, &disconnectErr) {
_ = conn.WritePacket(packet.Marshal(
packetid.ClientboundDisconnect,
(*chat.Message)(disconnectErr),
))
}
return
}
defer c.Close()
player := Player{conn, c}
defer player.conn.Close()
p.PlayerList.ClientJoin(player, server.PlayerSample{
Name: c.Name,
ID: c.UUID,
})
defer p.PlayerList.ClientLeft(player)
go func() {
// forward all packet from player to server
var pk packet.Packet
var err error
for {
err = conn.ReadPacket(&pk)
if err != nil {
break
}
if p.ModifyServerboundPacket != nil {
err = p.ModifyServerboundPacket(&pk)
if err != nil {
break
}
}
err = c.Conn.WritePacket(pk)
if err != nil {
break
}
}
log.Printf("Forward packets from player[%s] to server[%s] error: %v", name, p.Destination, err)
}()
if err := c.HandleGame(); err != nil {
log.Printf("Forward packets from server[%s] to player[%s] error: %v", p.Destination, name, err)
}
}