コード例 #1
0
ファイル: HandleMove.cs プロジェクト: horato/IntWarsSharp
        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;
        }
コード例 #2
0
ファイル: Packet.cs プロジェクト: horato/IntWarsSharp
        //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;
            }
        }