private List<Vector2> readWaypoints(byte[] buffer, int coordCount, Map map) { var reader = new BinaryReader(new MemoryStream(buffer)); var mapSize = map.getSize(); int vectorCount = coordCount / 2; var vMoves = new List<Vector2>(); var lastCoord = new Vector2(0.0f, 0.0f); reader.BaseStream.Position = (coordCount + 5) / 8 + coordCount % 2; for (int i = 0; i < vectorCount; i++) { if (GetBitmaskValue(buffer, 2 * i - 2)) lastCoord.X += reader.ReadByte(); else lastCoord.X = reader.ReadInt16(); if (GetBitmaskValue(buffer, 2 * i - 1)) lastCoord.Y += reader.ReadByte(); else lastCoord.Y = reader.ReadInt16(); vMoves.Add(new Vector2(2.0f * lastCoord.X + mapSize.X, 2.0f * lastCoord.Y + mapSize.Y)); } return vMoves; }
//see PKT_S2C_CharStats mask //TODO movement public MovementAns(GameObject actor, Map map) : base(PacketCmdS2C.PKT_S2C_MoveAns) { var waypoints = actor.getWaypoints(); buffer.Write((short)1); //count buffer.Write((byte)(2 * waypoints.Count)); buffer.Write((int)actor.getNetId()); int startPos = (int)buffer.BaseStream.Position; int coordCount = 2 * waypoints.Count(); var maskSize = (coordCount + 5) / 8; //mask size //buffer.reserve(pos + maskSize + coordCount * sizeof(short)); //reserve max total size for (uint i = 0; i < maskSize; i++) { buffer.Write((byte)0); } var lastCoord = new Vector2(); for (int i = 0; i < waypoints.Count; i++) { var mapSize = map.getSize(); var curVector = new Vector2((waypoints[i].X - mapSize.X) / 2, (waypoints[i].Y - mapSize.Y) / 2); var relative = new Vector2(curVector.X - lastCoord.X, curVector.Y - lastCoord.Y); var isAbsolute = new Tuple<bool, bool>( i == 0 || relative.X < sbyte.MinValue || relative.X > sbyte.MaxValue, i == 0 || relative.Y < sbyte.MinValue || relative.Y > sbyte.MaxValue); Change(SetBitmaskValue(GetBytes(), startPos, (2 * i - 2), !isAbsolute.Item1)); if (isAbsolute.Item1) buffer.Write((short)curVector.X); else buffer.Write((byte)relative.X); Change(SetBitmaskValue(GetBytes(), startPos, (2 * i - 1), !isAbsolute.Item2)); if (isAbsolute.Item2) buffer.Write((short)curVector.Y); else buffer.Write((byte)relative.Y); lastCoord = curVector; } }