48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package msg
|
|
|
|
import (
|
|
"github.com/Tnze/go-mc/chat/sign"
|
|
)
|
|
|
|
type signatureCache struct {
|
|
signatures [128]*sign.Signature
|
|
signIndexes map[sign.Signature]int
|
|
cachedBuffer []*sign.Signature
|
|
}
|
|
|
|
func newSignatureCache() signatureCache {
|
|
return signatureCache{
|
|
signIndexes: make(map[sign.Signature]int),
|
|
}
|
|
}
|
|
|
|
func (s *signatureCache) popOrInsert(self *sign.Signature, lastSeen []sign.PackedSignature) error {
|
|
var tmp *sign.Signature
|
|
s.cachedBuffer = s.cachedBuffer[:0] // clear buffer
|
|
if self != nil {
|
|
s.cachedBuffer = append(s.cachedBuffer, self)
|
|
}
|
|
for _, v := range lastSeen {
|
|
if v.Signature != nil {
|
|
s.cachedBuffer = append(s.cachedBuffer, v.Signature)
|
|
} else if v.ID >= 0 && int(v.ID) < len(s.signatures) {
|
|
s.cachedBuffer = append(s.cachedBuffer, s.signatures[v.ID])
|
|
} else {
|
|
return InvalidChatPacket
|
|
}
|
|
}
|
|
for i := 0; i < len(s.cachedBuffer) && i < len(s.signatures); i++ {
|
|
v := s.cachedBuffer[i]
|
|
if i, ok := s.signIndexes[*v]; ok {
|
|
s.signatures[i] = nil
|
|
}
|
|
tmp, s.signatures[i] = s.signatures[i], v
|
|
s.signIndexes[*v] = i
|
|
if tmp != nil {
|
|
s.cachedBuffer = append(s.cachedBuffer, tmp)
|
|
delete(s.signIndexes, *tmp)
|
|
}
|
|
}
|
|
return nil
|
|
}
|