Improve detached inventory behaviour

master
HimbeerserverDE 2021-01-16 19:31:07 +01:00
parent b0b7f4d0b8
commit 6102a16b13
2 changed files with 60 additions and 29 deletions

View File

@ -2,6 +2,7 @@ package multiserver
import (
"encoding/binary"
"fmt"
"log"
"net"
"os"
@ -12,7 +13,7 @@ var tooldefs [][]byte
var nodedefs [][]byte
var craftitemdefs [][]byte
var itemdefs [][]byte
var detachedinvs [][]byte
var detachedinvs map[string][][]byte
var movement []byte
var timeofday []byte
@ -49,7 +50,14 @@ func (p *Peer) fetchMedia() {
case ToClientMovement:
movement = pkt.Data[2:]
case ToClientDetachedInventory:
detachedinvs = append(detachedinvs, pkt.Data[2:])
servers := GetConfKey("servers").(map[interface{}]interface{})
var srvname string
for server := range servers {
if GetConfKey("servers:"+server.(string)+":address") == p.Addr().String() {
srvname = server.(string)
}
}
detachedinvs[srvname] = append(detachedinvs[srvname], pkt.Data[2:])
case ToClientTimeOfDay:
timeofday = pkt.Data[2:]
case ToClientAnnounceMedia:
@ -57,23 +65,23 @@ func (p *Peer) fetchMedia() {
count := binary.BigEndian.Uint16(pkt.Data[2:4])
si := uint16(4)
for i := uint16(0); i < count; i++ {
namelen := binary.BigEndian.Uint16(pkt.Data[si:2+si])
name := pkt.Data[2+si:2+si+namelen]
diglen := binary.BigEndian.Uint16(pkt.Data[2+si+namelen:4+si+namelen])
digest := pkt.Data[4+si+namelen:4+si+namelen+diglen]
namelen := binary.BigEndian.Uint16(pkt.Data[si : 2+si])
name := pkt.Data[2+si : 2+si+namelen]
diglen := binary.BigEndian.Uint16(pkt.Data[2+si+namelen : 4+si+namelen])
digest := pkt.Data[4+si+namelen : 4+si+namelen+diglen]
if media[string(name)] == nil {
rq = append(rq, string(name))
media[string(name)] = &mediaFile{digest: digest}
}
si += 4+namelen+diglen
si += 4 + namelen + diglen
}
// Request the media
pktlen := 0
for f := range rq {
pktlen += 2+len(rq[f])
pktlen += 2 + len(rq[f])
}
data := make([]byte, 4+pktlen)
@ -84,7 +92,7 @@ func (p *Peer) fetchMedia() {
for f := range rq {
binary.BigEndian.PutUint16(data[sj:2+sj], uint16(len(rq[f])))
copy(data[2+sj:2+sj+len(rq[f])], []byte(rq[f]))
sj += 2+len(rq[f])
sj += 2 + len(rq[f])
}
_, err := p.Send(Pkt{Data: data, ChNo: 1})
@ -98,16 +106,16 @@ func (p *Peer) fetchMedia() {
filecount := binary.BigEndian.Uint32(pkt.Data[6:10])
si := uint32(10)
for i := uint32(0); i < filecount; i++ {
namelen := binary.BigEndian.Uint16(pkt.Data[si:2+si])
name := pkt.Data[2+si:2+si+uint32(namelen)]
datalen := binary.BigEndian.Uint32(pkt.Data[2+si+uint32(namelen):6+si+uint32(namelen)])
data := pkt.Data[6+si+uint32(namelen):6+uint32(si)+uint32(namelen)+datalen]
namelen := binary.BigEndian.Uint16(pkt.Data[si : 2+si])
name := pkt.Data[2+si : 2+si+uint32(namelen)]
datalen := binary.BigEndian.Uint32(pkt.Data[2+si+uint32(namelen) : 6+si+uint32(namelen)])
data := pkt.Data[6+si+uint32(namelen) : 6+uint32(si)+uint32(namelen)+datalen]
if media[string(name)] != nil && len(media[string(name)].data) == 0 {
media[string(name)].data = data
}
si += 6+uint32(namelen)+datalen
si += 6 + uint32(namelen) + datalen
}
if bunch >= bunchcount-1 {
@ -120,6 +128,13 @@ func (p *Peer) fetchMedia() {
}
func (p *Peer) announceMedia() {
srvnamekey := GetConfKey("default_server")
if srvnamekey == nil || fmt.Sprintf("%T", srvnamekey) != "string" {
log.Print("Default server name not set or not a string")
return
}
srvname := srvnamekey.(string)
for _, def := range tooldefs {
data := make([]byte, 2+len(def))
data[0] = uint8(0x00)
@ -176,11 +191,11 @@ func (p *Peer) announceMedia() {
<-ack
}
for i := range detachedinvs {
data := make([]byte, 2+len(detachedinvs[i]))
for i := range detachedinvs[srvname] {
data := make([]byte, 2+len(detachedinvs[srvname][i]))
data[0] = uint8(0x00)
data[1] = uint8(ToClientDetachedInventory)
copy(data[2:], detachedinvs[i])
copy(data[2:], detachedinvs[srvname][i])
ack, err := p.Send(Pkt{Data: data})
if err != nil {
@ -214,7 +229,7 @@ func (p *Peer) announceMedia() {
pktlen := 0
for f := range media {
pktlen += 4+len(f)+len(media[f].digest)
pktlen += 4 + len(f) + len(media[f].digest)
}
data = make([]byte, 6+pktlen)
@ -227,7 +242,7 @@ func (p *Peer) announceMedia() {
copy(data[2+si:2+si+len(f)], []byte(f))
binary.BigEndian.PutUint16(data[2+si+len(f):4+si+len(f)], uint16(len(media[f].digest)))
copy(data[4+si+len(f):4+si+len(f)+len(media[f].digest)], media[f].digest)
si += 4+len(f)+len(media[f].digest)
si += 4 + len(f) + len(media[f].digest)
}
data[si] = uint8(0x00)
data[1+si] = uint8(0x00)
@ -245,15 +260,15 @@ func (p *Peer) sendMedia(rqdata []byte) {
count := binary.BigEndian.Uint16(rqdata[0:2])
si := uint16(2)
for i := uint16(0); i < count; i++ {
namelen := binary.BigEndian.Uint16(rqdata[si:2+si])
name := rqdata[2+si:2+si+namelen]
namelen := binary.BigEndian.Uint16(rqdata[si : 2+si])
name := rqdata[2+si : 2+si+namelen]
rq = append(rq, string(name))
si += 2+namelen
si += 2 + namelen
}
pktlen := 0
for f := range rq {
pktlen += 6+len(rq[f])+len(media[rq[f]].data)
pktlen += 6 + len(rq[f]) + len(media[rq[f]].data)
}
data := make([]byte, 12+pktlen)
@ -270,7 +285,7 @@ func (p *Peer) sendMedia(rqdata []byte) {
copy(data[2+sj:2+sj+len(rq[f])], rq[f])
binary.BigEndian.PutUint32(data[2+sj+len(rq[f]):6+sj+len(rq[f])], uint32(len(media[rq[f]].data)))
copy(data[6+sj+len(rq[f]):6+sj+len(rq[f])+len(media[rq[f]].data)], media[rq[f]].data)
sj += 6+len(rq[f])+len(media[rq[f]].data)
sj += 6 + len(rq[f]) + len(media[rq[f]].data)
}
data[sj] = uint8(0x00)
data[1+sj] = uint8(0x00)
@ -287,12 +302,13 @@ func init() {
log.Print("Fetching media")
media = make(map[string]*mediaFile)
detachedinvs = make(map[string][][]byte)
clt := &Peer{username: []byte("HimbeerserverDE")}
servers := GetConfKey("servers").(map[interface{}]interface{})
for server := range servers {
straddr := GetConfKey("servers:"+server.(string)+":address")
straddr := GetConfKey("servers:" + server.(string) + ":address")
srvaddr, err := net.ResolveUDPAddr("udp", straddr.(string))
if err != nil {

View File

@ -68,15 +68,15 @@ func (p *Peer) Redirect(newsrv string) error {
}
// Remove active objects
len := 0
aolen := 0
for range aoIDs[p.ID()] {
len++
aolen++
}
data := make([]byte, 6+len*2)
data := make([]byte, 6+aolen*2)
data[0] = uint8(0x00)
data[1] = uint8(ToClientActiveObjectRemoveAdd)
binary.BigEndian.PutUint16(data[2:4], uint16(len))
binary.BigEndian.PutUint16(data[2:4], uint16(aolen))
i := 4
for ao := range aoIDs[p.ID()] {
binary.BigEndian.PutUint16(data[i:2+i], ao)
@ -85,6 +85,21 @@ func (p *Peer) Redirect(newsrv string) error {
}
binary.BigEndian.PutUint16(data[i:2+i], uint16(0))
if len(detachedinvs[newsrv]) > 0 {
for i := range detachedinvs[newsrv] {
data := make([]byte, 2+len(detachedinvs[newsrv][i]))
data[0] = uint8(0x00)
data[1] = uint8(ToClientDetachedInventory)
copy(data[2:], detachedinvs[newsrv][i])
ack, err := p.Send(Pkt{Data: data})
if err != nil {
return err
}
<-ack
}
}
ack, err := p.Send(Pkt{Data: data})
if err != nil {
return err