-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathfilters.go
97 lines (87 loc) · 2.81 KB
/
filters.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
package potoq
import (
"errors"
"github.com/Craftserve/potoq/packets"
"github.com/Craftserve/potoq/utils"
)
type PacketFilter func(handler *Handler, packet packets.Packet) error
var ErrDropPacket = errors.New("ErrDropPacket") // can be returned from PacketFilter
// first half of both arrays is CB, second SB, see RegisterPacketFilter()
var packetFilters [packets.MaxPacketID * 2][]PacketFilter
var packetsParsed = utils.NewBitarray(packets.MaxPacketID * 2)
func init() {
RegisterPacketFilter(&packets.ClientSettingsPacketSB{}, saveClientSettings)
RegisterPacketFilter(&packets.PluginMessagePacketSB{}, saveClientSettings)
RegisterPacketFilter(&packets.PlayerListItemPacketCB{}, savePlayerList)
}
func RegisterPacketFilter(packet_type packets.Packet, callback PacketFilter) {
packet_id := packet_type.PacketID()
switch packet_type.Direction() {
case packets.ServerBound:
var i = packet_id
packetFilters[i] = append(packetFilters[i], callback)
packetsParsed.Set(int(i), true)
case packets.ClientBound:
var i = packet_id + 256
packetFilters[i] = append(packetFilters[i], callback)
packetsParsed.Set(int(i), true)
default:
panic("invalid direction")
}
}
func saveClientSettings(handler *Handler, packet packets.Packet) error {
switch p := packet.(type) {
case *packets.ClientSettingsPacketSB:
handler.ClientSettings = p
case *packets.PluginMessagePacketSB:
if p.Channel == "minecraft:brand" {
handler.MCBrand = p
}
default:
panic("unexpected packet")
}
return nil
}
func updatePlayerListItem(handler *Handler, items []packets.PlayerListItem,
changeData func(savedItem, newItem *packets.PlayerListItem)) {
for _, item := range items {
savedItem, ok := handler.playerList[item.UUID]
if !ok {
continue
}
changeData(&savedItem, &item)
handler.playerList[item.UUID] = savedItem
}
}
func savePlayerList(handler *Handler, packet packets.Packet) error {
playerListPacket := packet.(*packets.PlayerListItemPacketCB)
action := playerListPacket.Action
switch action {
case packets.ADD_PLAYER:
for _, item := range playerListPacket.Items {
handler.playerList[item.UUID] = item
}
break
case packets.UPDATE_GAME_MODE:
updatePlayerListItem(handler, playerListPacket.Items, func(savedItem, newItem *packets.PlayerListItem) {
savedItem.GameMode = newItem.GameMode
})
break
case packets.UPDATE_DISPLAY_NAME:
updatePlayerListItem(handler, playerListPacket.Items, func(savedItem, newItem *packets.PlayerListItem) {
savedItem.DisplayName = newItem.DisplayName
})
break
case packets.UPDATE_LATENCY:
updatePlayerListItem(handler, playerListPacket.Items, func(savedItem, newItem *packets.PlayerListItem) {
savedItem.Ping = newItem.Ping
})
break
case packets.REMOVE_PLAYER:
for _, item := range playerListPacket.Items {
delete(handler.playerList, item.UUID)
}
break
}
return nil
}