From 9642787631704d9b79b1104d8183bcdf77d7fbba Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 29 Jul 2023 22:35:08 +1000 Subject: [PATCH] rework Stage Object IDs --- server/channelserver/handlers.go | 1 + server/channelserver/handlers_object.go | 18 +------------- server/channelserver/sys_channel_server.go | 2 ++ server/channelserver/sys_session.go | 28 ++++++++++++++++++++++ server/channelserver/sys_stage.go | 15 ------------ 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index 81cd1838a..c12ab4cc6 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -177,6 +177,7 @@ func logoutPlayer(s *Session) { delete(s.server.sessions, s.rawConn) } s.rawConn.Close() + delete(s.server.objectIDs, s) s.server.Unlock() for _, stage := range s.server.stages { diff --git a/server/channelserver/handlers_object.go b/server/channelserver/handlers_object.go index 520b6fef7..241505c0d 100644 --- a/server/channelserver/handlers_object.go +++ b/server/channelserver/handlers_object.go @@ -10,25 +10,9 @@ import ( func handleMsgSysCreateObject(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysCreateObject) - // Prevent reusing an object index - var nextID uint32 - for { - exists := false - nextID = s.stage.NextObjectID() - for _, object := range s.stage.objects { - if object.id == nextID { - exists = true - break - } - } - if exists == false { - break - } - } - s.stage.Lock() newObj := &Object{ - id: nextID, + id: s.NextObjectID(), ownerCharID: s.charID, x: pkt.X, y: pkt.Y, diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index b362c911e..cad64bbe4 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -47,6 +47,7 @@ type Server struct { acceptConns chan net.Conn deleteConns chan net.Conn sessions map[net.Conn]*Session + objectIDs map[*Session]uint16 listener net.Listener // Listener that is created when Server.Start is called. isShuttingDown bool @@ -152,6 +153,7 @@ func NewServer(config *Config) *Server { acceptConns: make(chan net.Conn), deleteConns: make(chan net.Conn), sessions: make(map[net.Conn]*Session), + objectIDs: make(map[*Session]uint16), stages: make(map[string]*Stage), userBinaryParts: make(map[userBinaryPartID][]byte), semaphore: make(map[string]*Semaphore), diff --git a/server/channelserver/sys_session.go b/server/channelserver/sys_session.go index 40d54fdb3..406ea4384 100644 --- a/server/channelserver/sys_session.go +++ b/server/channelserver/sys_session.go @@ -34,6 +34,7 @@ type Session struct { clientContext *clientctx.ClientContext lastPacket time.Time + objectIndex uint16 userEnteredStage bool // If the user has entered a stage before stageID string stage *Stage @@ -78,6 +79,7 @@ func NewSession(server *Server, conn net.Conn) *Session { sessionStart: TimeAdjusted().Unix(), stageMoveStack: stringstack.New(), } + s.SetObjectID() return s } @@ -268,3 +270,29 @@ func (s *Session) logMessage(opcode uint16, data []byte, sender string, recipien fmt.Printf("Data [%d bytes]:\n(Too long!)\n\n", len(data)) } } + +func (s *Session) SetObjectID() { + for i := uint16(1); i < 127; i++ { + exists := false + for _, j := range s.server.objectIDs { + if i == j { + exists = true + break + } + } + if !exists { + s.server.objectIDs[s] = i + return + } + } + s.server.objectIDs[s] = 0 +} + +func (s *Session) NextObjectID() uint32 { + bf := byteframe.NewByteFrame() + bf.WriteUint16(s.server.objectIDs[s]) + s.objectIndex++ + bf.WriteUint16(s.objectIndex) + bf.Seek(0, 0) + return bf.ReadUint32() +} diff --git a/server/channelserver/sys_stage.go b/server/channelserver/sys_stage.go index b69995724..ae8ddd149 100644 --- a/server/channelserver/sys_stage.go +++ b/server/channelserver/sys_stage.go @@ -95,18 +95,3 @@ func (s *Stage) isCharInQuestByID(charID uint32) bool { func (s *Stage) isQuest() bool { return len(s.reservedClientSlots) > 0 } - -func (s *Stage) NextObjectID() uint32 { - s.objectIndex = s.objectIndex + 1 - // Objects beyond 127 do not duplicate correctly - // Indexes 0 and 127 does not update position correctly - if s.objectIndex == 127 { - s.objectIndex = 1 - } - bf := byteframe.NewByteFrame() - bf.WriteUint8(0) - bf.WriteUint8(s.objectIndex) - bf.WriteUint16(0) - obj := uint32(bf.Data()[3]) | uint32(bf.Data()[2])<<8 | uint32(bf.Data()[1])<<16 | uint32(bf.Data()[0])<<24 - return obj -}