From 50b21094f26a03fa6d6ad899a8439b15b28b2a1e Mon Sep 17 00:00:00 2001 From: Andrew Gutekanst Date: Wed, 5 Feb 2020 13:15:26 -0500 Subject: [PATCH] Implement user binary parts propagation --- server/channelserver/channel_server.go | 24 ++++++++++---- server/channelserver/handlers.go | 44 +++++++++++++++++--------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/server/channelserver/channel_server.go b/server/channelserver/channel_server.go index b2c2d9fdd..ed2db6d6a 100644 --- a/server/channelserver/channel_server.go +++ b/server/channelserver/channel_server.go @@ -19,6 +19,12 @@ type Config struct { ErupeConfig *config.Config } +// Map key type for a user binary part. +type userBinaryPartID struct { + charID uint32 + index uint8 +} + // Server is a MHF channel server. type Server struct { sync.Mutex @@ -34,18 +40,22 @@ type Server struct { stagesLock sync.RWMutex stages map[string]*Stage + + userBinaryPartsLock sync.RWMutex + userBinaryParts map[userBinaryPartID][]byte } // NewServer creates a new Server type. func NewServer(config *Config) *Server { s := &Server{ - logger: config.Logger, - db: config.DB, - erupeConfig: config.ErupeConfig, - acceptConns: make(chan net.Conn), - deleteConns: make(chan net.Conn), - sessions: make(map[net.Conn]*Session), - stages: make(map[string]*Stage), + logger: config.Logger, + db: config.DB, + erupeConfig: config.ErupeConfig, + acceptConns: make(chan net.Conn), + deleteConns: make(chan net.Conn), + sessions: make(map[net.Conn]*Session), + stages: make(map[string]*Stage), + userBinaryParts: make(map[userBinaryPartID][]byte), } // Default town stage that clients try to enter without creating. diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index d2329b3a4..46216297f 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -714,28 +714,42 @@ func handleMsgSysInsertUser(s *Session, p mhfpacket.MHFPacket) {} func handleMsgSysDeleteUser(s *Session, p mhfpacket.MHFPacket) {} func handleMsgSysSetUserBinary(s *Session, p mhfpacket.MHFPacket) { - //pkt := p.(*mhfpacket.MsgSysSetUserBinary) + pkt := p.(*mhfpacket.MsgSysSetUserBinary) + s.server.userBinaryPartsLock.Lock() + s.server.userBinaryParts[userBinaryPartID{charID: s.charID, index: pkt.BinaryType}] = pkt.RawDataPayload + s.server.userBinaryPartsLock.Unlock() } func handleMsgSysGetUserBinary(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysGetUserBinary) + // Try to get the data. + s.server.userBinaryPartsLock.RLock() + defer s.server.userBinaryPartsLock.RUnlock() + data, ok := s.server.userBinaryParts[userBinaryPartID{charID: pkt.CharID, index: pkt.BinaryType}] + resp := byteframe.NewByteFrame() - if pkt.BinaryType == 1 { - // Stub name response with character ID - resp.WriteBytes([]byte(fmt.Sprintf("CID%d", s.charID))) - resp.WriteUint8(0) // NULL terminator. - } else if pkt.BinaryType == 2 { - data, err := base64.StdEncoding.DecodeString("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAAAAAAAABAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==") - if err != nil { - panic(err) - } - resp.WriteBytes(data) - } else if pkt.BinaryType == 3 { - data, err := base64.StdEncoding.DecodeString("AQAAA2ea5P8ATgEA/wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBn8AAAAAAAAAAAABAKAMAAAAAAAAAAAAACgAAAAAAAAAAAABAsQOAAAAAAAAAAABA6UMAAAAAAAAAAABBKAMAAAAAAAAAAABBToNAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") - if err != nil { - panic(err) + + // If we can't get the real data, use a placeholder. + if !ok { + if pkt.BinaryType == 1 { + // Stub name response with character ID + resp.WriteBytes([]byte(fmt.Sprintf("CID%d", s.charID))) + resp.WriteUint8(0) // NULL terminator. + } else if pkt.BinaryType == 2 { + data, err := base64.StdEncoding.DecodeString("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAAAAAAAABAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==") + if err != nil { + panic(err) + } + resp.WriteBytes(data) + } else if pkt.BinaryType == 3 { + data, err := base64.StdEncoding.DecodeString("AQAAA2ea5P8ATgEA/wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBn8AAAAAAAAAAAABAKAMAAAAAAAAAAAAACgAAAAAAAAAAAABAsQOAAAAAAAAAAABA6UMAAAAAAAAAAABBKAMAAAAAAAAAAABBToNAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") + if err != nil { + panic(err) + } + resp.WriteBytes(data) } + } else { resp.WriteBytes(data) }