Files
Ananta-ps/internal/gameserver/movement.go
T

55 lines
1.3 KiB
Go

package gameserver
import (
"fmt"
"math"
"ananta-ps/pkg/protocol"
)
// Both movement RPCs carry a List7Bit of inline structs. LogicAgentSyncData
// has no MoveId; SimpleMoveActionData adds one byte after the two vectors.
func (s *Server) handleMovementReport(sess *Session, pkt *protocol.RpcPacket, simple bool) error {
r := protocol.NewUxReader(pkt.Body)
mark, err := r.U8()
if err != nil {
return err
}
if mark == 0 && r.Remaining() == 0 {
return sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID)
}
if mark != 0xff {
return fmt.Errorf("invalid movement list marker")
}
count, err := r.Int7()
if err != nil {
return err
}
size := 32
if simple {
size++
}
if count > r.Remaining()/size || count*size != r.Remaining() {
return fmt.Errorf("invalid movement sample count")
}
x, y, z, yaw := sess.posX, sess.posY, sess.posZ, sess.facing
for i := 0; i < count; i++ {
id, _ := r.U64()
var v [6]float32
for j := range v {
v[j], err = r.F32()
if err != nil || math.IsNaN(float64(v[j])) || math.IsInf(float64(v[j]), 0) {
return fmt.Errorf("invalid movement coordinate")
}
}
if simple {
_, _ = r.U8()
}
if id == sess.unitId {
x, y, z, yaw = v[0], v[1], v[2], v[4]
}
}
sess.posX, sess.posY, sess.posZ, sess.facing = x, y, z, yaw
return sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID)
}