func (object *Object) SendSpawn(writer io.Writer) (err os.Error) { // TODO: Send non-nil ObjectData (is there any?) err = proto.WriteObjectSpawn(writer, object.EntityId, object.ObjTypeId, &object.PointObject.LastSentPosition, nil) if err != nil { return } err = proto.WriteEntityVelocity(writer, object.EntityId, &object.PointObject.LastSentVelocity) return }
func (item *Item) SendSpawn(writer io.Writer) (err os.Error) { err = proto.WriteItemSpawn( writer, item.EntityId, item.ItemTypeId, item.Slot.Count, item.Slot.Data, &item.PointObject.LastSentPosition, &item.orientation) if err != nil { return } err = proto.WriteEntityVelocity(writer, item.EntityId, &item.PointObject.LastSentVelocity) if err != nil { return } return }
func (mob *Mob) SendSpawn(writer io.Writer) (err os.Error) { err = proto.WriteEntitySpawn( writer, mob.EntityId, mob.mobType, &mob.PointObject.LastSentPosition, mob.look.ToLookBytes(), mob.FormatMetadata()) if err != nil { return } err = proto.WriteEntityVelocity( writer, mob.EntityId, &mob.PointObject.LastSentVelocity) if err != nil { return } return }
// Generates any packets needed to update clients as to the position and // velocity of the object. // It assumes that the clients have either been sent packets via this method // before, or that the previous position/velocity sent was generated from the // LastSentPosition and LastSentVelocity attributes. func (obj *PointObject) SendUpdate(writer io.Writer, entityId EntityId, look *LookBytes) (err os.Error) { curPosition := obj.position.ToAbsIntXyz() dx := curPosition.X - obj.LastSentPosition.X dy := curPosition.Y - obj.LastSentPosition.Y dz := curPosition.Z - obj.LastSentPosition.Z if dx != 0 || dy != 0 || dz != 0 { if dx >= -128 && dx <= 127 && dy >= -128 && dy <= 127 && dz >= -128 && dz <= 127 { err = proto.WriteEntityRelMove( writer, entityId, &RelMove{ RelMoveCoord(dx), RelMoveCoord(dy), RelMoveCoord(dz), }, ) } else { err = proto.WriteEntityTeleport( writer, entityId, curPosition, look) } if err != nil { return } obj.LastSentPosition = *curPosition } curVelocity := obj.velocity.ToVelocity() if curVelocity.X != obj.LastSentVelocity.X || curVelocity.Y != obj.LastSentVelocity.Y || curVelocity.Z != obj.LastSentVelocity.Z { if err = proto.WriteEntityVelocity(writer, entityId, curVelocity); err != nil { return } obj.LastSentVelocity = *curVelocity } return }