mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 23:44:52 +01:00
rework Stage Object IDs
This commit is contained in:
@@ -177,6 +177,7 @@ func logoutPlayer(s *Session) {
|
|||||||
delete(s.server.sessions, s.rawConn)
|
delete(s.server.sessions, s.rawConn)
|
||||||
}
|
}
|
||||||
s.rawConn.Close()
|
s.rawConn.Close()
|
||||||
|
delete(s.server.objectIDs, s)
|
||||||
s.server.Unlock()
|
s.server.Unlock()
|
||||||
|
|
||||||
for _, stage := range s.server.stages {
|
for _, stage := range s.server.stages {
|
||||||
|
|||||||
@@ -10,25 +10,9 @@ import (
|
|||||||
func handleMsgSysCreateObject(s *Session, p mhfpacket.MHFPacket) {
|
func handleMsgSysCreateObject(s *Session, p mhfpacket.MHFPacket) {
|
||||||
pkt := p.(*mhfpacket.MsgSysCreateObject)
|
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()
|
s.stage.Lock()
|
||||||
newObj := &Object{
|
newObj := &Object{
|
||||||
id: nextID,
|
id: s.NextObjectID(),
|
||||||
ownerCharID: s.charID,
|
ownerCharID: s.charID,
|
||||||
x: pkt.X,
|
x: pkt.X,
|
||||||
y: pkt.Y,
|
y: pkt.Y,
|
||||||
|
|||||||
@@ -47,6 +47,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
|
||||||
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
|
||||||
|
|
||||||
@@ -152,6 +153,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),
|
||||||
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),
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ type Session struct {
|
|||||||
clientContext *clientctx.ClientContext
|
clientContext *clientctx.ClientContext
|
||||||
lastPacket time.Time
|
lastPacket time.Time
|
||||||
|
|
||||||
|
objectIndex uint16
|
||||||
userEnteredStage bool // If the user has entered a stage before
|
userEnteredStage bool // If the user has entered a stage before
|
||||||
stageID string
|
stageID string
|
||||||
stage *Stage
|
stage *Stage
|
||||||
@@ -78,6 +79,7 @@ func NewSession(server *Server, conn net.Conn) *Session {
|
|||||||
sessionStart: TimeAdjusted().Unix(),
|
sessionStart: TimeAdjusted().Unix(),
|
||||||
stageMoveStack: stringstack.New(),
|
stageMoveStack: stringstack.New(),
|
||||||
}
|
}
|
||||||
|
s.SetObjectID()
|
||||||
return s
|
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))
|
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()
|
||||||
|
}
|
||||||
|
|||||||
@@ -95,18 +95,3 @@ func (s *Stage) isCharInQuestByID(charID uint32) bool {
|
|||||||
func (s *Stage) isQuest() bool {
|
func (s *Stage) isQuest() bool {
|
||||||
return len(s.reservedClientSlots) > 0
|
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
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user