alpelo object system backport test commit

This commit is contained in:
wish
2025-10-05 16:10:47 +11:00
parent 8f3624d589
commit dd36f367a9
3 changed files with 26 additions and 31 deletions

View File

@@ -68,11 +68,11 @@ func doStageTransfer(s *Session, ackHandle uint32, stageID string) {
newNotif := byteframe.NewByteFrame() newNotif := byteframe.NewByteFrame()
// Cast existing user data to new user // Cast existing user data to new user
if !s.userEnteredStage { if !s.loaded {
s.userEnteredStage = true s.loaded = true
for _, session := range s.server.sessions { for _, session := range s.server.sessions {
if s == session { if s == session || !session.loaded {
continue continue
} }
temp = &mhfpacket.MsgSysInsertUser{CharID: session.charID} temp = &mhfpacket.MsgSysInsertUser{CharID: session.charID}

View File

@@ -49,7 +49,7 @@ type Server struct {
acceptConns chan net.Conn acceptConns chan net.Conn
deleteConns chan net.Conn deleteConns chan net.Conn
sessions map[net.Conn]*Session sessions map[net.Conn]*Session
objectIDs map[*Session]uint16 //objectIDs map[*Session]uint16
listener net.Listener // Listener that is created when Server.Start is called. listener net.Listener // Listener that is created when Server.Start is called.
isShuttingDown bool isShuttingDown bool
@@ -155,7 +155,7 @@ func NewServer(config *Config) *Server {
acceptConns: make(chan net.Conn), acceptConns: make(chan net.Conn),
deleteConns: make(chan net.Conn), deleteConns: make(chan net.Conn),
sessions: make(map[net.Conn]*Session), sessions: make(map[net.Conn]*Session),
objectIDs: make(map[*Session]uint16), //objectIDs: make(map[*Session]uint16),
stages: make(map[string]*Stage), stages: make(map[string]*Stage),
userBinaryParts: make(map[userBinaryPartID][]byte), userBinaryParts: make(map[userBinaryPartID][]byte),
semaphore: make(map[string]*Semaphore), semaphore: make(map[string]*Semaphore),
@@ -280,6 +280,20 @@ func (s *Server) manageSessions() {
} }
} }
func (s *Server) getObjectId() uint16 {
ids := make(map[uint16]struct{})
for _, sess := range s.sessions {
ids[sess.objectID] = struct{}{}
}
for i := uint16(1); i < 100; i++ {
if _, ok := ids[i]; !ok {
return i
}
}
s.logger.Warn("object ids overflowed", zap.Int("sessions", len(s.sessions)))
return 0
}
func (s *Server) invalidateSessions() { func (s *Server) invalidateSessions() {
for { for {
if s.isShuttingDown { if s.isShuttingDown {

View File

@@ -36,8 +36,10 @@ type Session struct {
clientContext *clientctx.ClientContext clientContext *clientctx.ClientContext
lastPacket time.Time lastPacket time.Time
objectID uint16
objectIndex uint16 objectIndex uint16
userEnteredStage bool // If the user has entered a stage before loaded bool
stage *Stage stage *Stage
reservationStage *Stage // Required for the stateful MsgSysUnreserveStage packet. reservationStage *Stage // Required for the stateful MsgSysUnreserveStage packet.
stagePass string // Temporary storage stagePass string // Temporary storage
@@ -83,12 +85,12 @@ func NewSession(server *Server, conn net.Conn) *Session {
sendPackets: make(chan packet, 20), sendPackets: make(chan packet, 20),
clientContext: &clientctx.ClientContext{}, // Unused clientContext: &clientctx.ClientContext{}, // Unused
lastPacket: time.Now(), lastPacket: time.Now(),
objectID: server.getObjectId(),
sessionStart: TimeAdjusted().Unix(), sessionStart: TimeAdjusted().Unix(),
stageMoveStack: stringstack.New(), stageMoveStack: stringstack.New(),
ackStart: make(map[uint32]time.Time), ackStart: make(map[uint32]time.Time),
semaphoreID: make([]uint16, 2), semaphoreID: make([]uint16, 2),
} }
s.SetObjectID()
return s return s
} }
@@ -292,30 +294,9 @@ func (s *Session) logMessage(opcode uint16, data []byte, sender string, recipien
} }
} }
func (s *Session) SetObjectID() { func (s *Session) getObjectId() uint32 {
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++ s.objectIndex++
bf.WriteUint16(s.objectIndex) return uint32(s.objectID)<<16 | uint32(s.objectIndex)
bf.Seek(0, 0)
return bf.ReadUint32()
} }
func (s *Session) GetSemaphoreID() uint32 { func (s *Session) GetSemaphoreID() uint32 {