55 lines
1.3 KiB
Go
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)
|
|
}
|