Improve detached inventory behaviour
parent
b0b7f4d0b8
commit
6102a16b13
66
media.go
66
media.go
|
@ -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 {
|
||||
|
|
23
redirect.go
23
redirect.go
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue