示例#1
0
        public void TestChar()
        {
            char a = 'a';
            char u = 'ⓤ';

            writer.WriteChar(a);
            writer.WriteChar(u);
            reader.Reset(writer.ToArraySegment());
            char a2 = reader.ReadChar();

            Assert.That(a2, Is.EqualTo(a));
            char u2 = reader.ReadChar();

            Assert.That(u2, Is.EqualTo(u));
        }
示例#2
0
        public void TestChar()
        {
            char a = 'a';
            char u = 'ⓤ';

            writer.WriteChar(a);
            writer.WriteChar(u);
            var  reader = new NetworkReader(writer.ToArray());
            char a2     = reader.ReadChar();

            Assert.That(a2, Is.EqualTo(a));
            char u2 = reader.ReadChar();

            Assert.That(u2, Is.EqualTo(u));
        }
    public void WriteAndReadChar(char testValue)
    {
        writer.Write(testValue);
        var reader = new NetworkReader(writer);

        Assert.AreEqual(testValue, reader.ReadChar(), "Writer and Reader have different values for 'char' type");
    }
        public void TestWritingAndReading()
        {
            // write all simple types once
            NetworkWriter writer = new NetworkWriter();

            writer.Write((char)1);
            writer.Write((byte)2);
            writer.Write((sbyte)3);
            writer.Write((bool)true);
            writer.Write((short)4);
            writer.Write((ushort)5);
            writer.Write((int)6);
            writer.Write((uint)7);
            writer.Write((long)8L);
            writer.Write((ulong)9L);
            writer.Write((float)10);
            writer.Write((double)11);
            writer.Write((decimal)12);
            writer.Write((string)null);
            writer.Write((string)"");
            writer.Write((string)"13");
            writer.Write(new byte[] { 14, 15 }, 0, 2);                 // just the byte array, no size info etc.
            writer.WriteBytesAndSize((byte[])null);                    // [SyncVar] struct values can have uninitialized byte arrays, null needs to be supported
            writer.WriteBytesAndSize(new byte[] { 17, 18 }, 0, 2);     // buffer, no-offset, count
            writer.WriteBytesAndSize(new byte[] { 19, 20, 21 }, 1, 2); // buffer, offset, count
            writer.WriteBytesAndSize(new byte[] { 22, 23 }, 0, 2);     // size, buffer

            byte[] data = writer.ToArray();


            // read them
            NetworkReader reader = new NetworkReader(writer.ToArray());

            Assert.That(reader.ReadChar(), Is.EqualTo(1));
            Assert.That(reader.ReadByte(), Is.EqualTo(2));
            Assert.That(reader.ReadSByte(), Is.EqualTo(3));
            Assert.That(reader.ReadBoolean(), Is.True);
            Assert.That(reader.ReadInt16(), Is.EqualTo(4));
            Assert.That(reader.ReadUInt16(), Is.EqualTo(5));
            Assert.That(reader.ReadInt32(), Is.EqualTo(6));
            Assert.That(reader.ReadUInt32(), Is.EqualTo(7));
            Assert.That(reader.ReadInt64(), Is.EqualTo(8));
            Assert.That(reader.ReadUInt64(), Is.EqualTo(9));
            Assert.That(reader.ReadSingle(), Is.EqualTo(10));
            Assert.That(reader.ReadDouble(), Is.EqualTo(11));
            Assert.That(reader.ReadDecimal(), Is.EqualTo(12));
            Assert.That(reader.ReadString(), Is.Null); // writing null string should write null in HLAPI Pro ("" in original HLAPI)
            Assert.That(reader.ReadString(), Is.EqualTo(""));
            Assert.That(reader.ReadString(), Is.EqualTo("13"));

            Assert.That(reader.ReadBytes(2), Is.EqualTo(new byte[] { 14, 15 }));

            Assert.That(reader.ReadBytesAndSize(), Is.Null);

            Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 17, 18 }));

            Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 20, 21 }));

            Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 22, 23 }));
        }
示例#5
0
    //reads the contents of the NetworkReader into a Chunk object and returns that.
    public static Chunk readChunk(NetworkReader reader)
    {
        int magicNum = reader.ReadInt32();

        if (magicNum != CHUNK_MAGIC_NUMBER)
        {
            Debug.LogError("INVALID CHUNK MAGIC NUMBER: " + magicNum);
            return(new Chunk(null, Vector3Int.zero));
        }
        int        chunkX = reader.ReadInt32();
        int        chunkY = reader.ReadInt32();
        int        chunkZ = reader.ReadInt32();
        Vector3Int coords = new Vector3Int(chunkX, chunkY, chunkZ);

        if (reader.ReadChar() != 'g') //saved chunk had a null block array
        {
            return(new Chunk(null, coords)
            {
                changed = false, valid = true
            });
        }
        Chunk     chunk     = new Chunk(new Block[Chunk.CHUNK_SIZE, Chunk.CHUNK_SIZE, Chunk.CHUNK_SIZE], coords);
        BlockType type      = (BlockType)reader.ReadInt32();
        int       count     = reader.ReadInt32();
        int       currCount = count;

        for (int x = 0; x < Chunk.CHUNK_SIZE; x++)
        {
            for (int y = 0; y < Chunk.CHUNK_SIZE; y++)
            {
                for (int z = 0; z < Chunk.CHUNK_SIZE; z++)
                {
                    if (currCount == 0)
                    {
                        type      = (BlockType)reader.ReadInt32();
                        count     = reader.ReadInt32();
                        currCount = count;
                    }
                    currCount--;
                    chunk.blocks[x, y, z] = new Block(type);
                }
            }
        }
        chunk.changed = false;
        chunk.valid   = true;
        return(chunk);
    }
示例#6
0
 public override void OnDeserialize(NetworkReader reader)
 {
     base.OnDeserialize(reader);
     chosenAnim = reader.ReadChar();
 }
    private static object ReadData(NetworkReader reader)
    {
        object resultObj = null;

        byte dataType = reader.ReadByte();

        if (dataType == BYTE)
        {
            resultObj = reader.ReadByte();
        }
        else if (dataType == SBYTE)
        {
            resultObj = reader.ReadSByte();
        }
        else if (dataType == CHAR)
        {
            resultObj = reader.ReadChar();
        }
        else if (dataType == BOOL)
        {
            resultObj = reader.ReadBoolean();
        }
        else if (dataType == SHORT)
        {
            resultObj = reader.ReadInt16();
        }
        else if (dataType == USHORT)
        {
            resultObj = reader.ReadUInt16();
        }
        else if (dataType == INT)
        {
            resultObj = reader.ReadInt32();
        }
        else if (dataType == UINT)
        {
            resultObj = reader.ReadPackedUInt32();
        }
        else if (dataType == LONG)
        {
            resultObj = reader.ReadInt64();
        }
        else if (dataType == ULONG)
        {
            resultObj = reader.ReadPackedUInt64();
        }
        else if (dataType == FLOAT)
        {
            resultObj = reader.ReadSingle();
        }
        else if (dataType == DOUBLE)
        {
            resultObj = reader.ReadDouble();
        }
        else if (dataType == DECIMAL)
        {
            resultObj = reader.ReadDecimal();
        }
        else if (dataType == STRING)
        {
            resultObj = reader.ReadString();
        }
        else if (dataType == VECTOR2)
        {
            resultObj = reader.ReadVector2();
        }
        else if (dataType == VECTOR3)
        {
            resultObj = reader.ReadVector3();
        }
        else if (dataType == VECTOR4)
        {
            resultObj = reader.ReadVector4();
        }
        else if (dataType == COLOR)
        {
            resultObj = reader.ReadColor();
        }
        else if (dataType == COLOR32)
        {
            resultObj = reader.ReadColor32();
        }
        else if (dataType == QUATERNION)
        {
            resultObj = reader.ReadQuaternion();
        }
        else if (dataType == TRANSFORM)
        {
            resultObj = reader.ReadTransform();
        }
        else if (dataType == RECT)
        {
            resultObj = reader.ReadRect();
        }
        else if (dataType == PLANE)
        {
            resultObj = reader.ReadPlane();
        }
        else if (dataType == GAMEOBJECT)
        {
            resultObj = reader.ReadGameObject();
        }
        else if (dataType == RAY)
        {
            resultObj = reader.ReadRay();
        }
        else if (dataType == MATRIX4X4)
        {
            resultObj = reader.ReadMatrix4x4();
        }
        else if (dataType == NETWORKHASH128)
        {
            resultObj = reader.ReadNetworkHash128();
        }
        else if (dataType == NETWORKIDENTITY)
        {
            resultObj = reader.ReadNetworkIdentity();
        }
        else if (dataType == MESSAGEBASE)
        {
            //resultObj = reader.ReadMessage<MessageBase>();
            resultObj = null;
        }
        else if (dataType == NETWORKINSTANCEID)
        {
            resultObj = reader.ReadNetworkId();
        }
        else if (dataType == NETWORKSCENEID)
        {
            resultObj = reader.ReadSceneId();
        }
        //Debug.Log(resultObj);
        return(resultObj);
    }
示例#8
0
        public void TestWritingAndReading()
        {
            writer.WriteChar((char)1);
            writer.WriteByte(2);
            writer.WriteSByte(3);
            writer.WriteBoolean(true);
            writer.WriteInt16(4);
            writer.WriteUInt16(5);
            writer.WriteInt32(6);
            writer.WriteUInt32(7U);
            writer.WriteInt64(8L);
            writer.WriteUInt64(9UL);
            writer.WriteSingle(10.0F);
            writer.WriteDouble(11.0D);
            writer.WriteDecimal(12);
            writer.WriteString(null);
            writer.WriteString("");
            writer.WriteString("13");
            // just the byte array, no size info etc.
            writer.WriteBytes(new byte[] { 14, 15 }, 0, 2);
            // [SyncVar] struct values can have uninitialized byte arrays, null needs to be supported
            writer.WriteBytesAndSize(null);

            // buffer, no-offset, count
            writer.WriteBytesAndSize(new byte[] { 17, 18 }, 0, 2);
            // buffer, offset, count
            writer.WriteBytesAndSize(new byte[] { 19, 20, 21 }, 1, 2);
            // size, buffer
            writer.WriteBytesAndSize(new byte[] { 22, 23 }, 0, 2);

            // read them
            var reader = new NetworkReader(writer.ToArray());

            Assert.That(reader.ReadChar(), Is.EqualTo(1));
            Assert.That(reader.ReadByte(), Is.EqualTo(2));
            Assert.That(reader.ReadSByte(), Is.EqualTo(3));
            Assert.That(reader.ReadBoolean(), Is.True);
            Assert.That(reader.ReadInt16(), Is.EqualTo(4));
            Assert.That(reader.ReadUInt16(), Is.EqualTo(5));
            Assert.That(reader.ReadInt32(), Is.EqualTo(6));
            Assert.That(reader.ReadUInt32(), Is.EqualTo(7));
            Assert.That(reader.ReadInt64(), Is.EqualTo(8));
            Assert.That(reader.ReadUInt64(), Is.EqualTo(9));
            Assert.That(reader.ReadSingle(), Is.EqualTo(10));
            Assert.That(reader.ReadDouble(), Is.EqualTo(11));
            Assert.That(reader.ReadDecimal(), Is.EqualTo(12));
            // writing null string should write null in Mirage ("" in original HLAPI)
            Assert.That(reader.ReadString(), Is.Null);
            Assert.That(reader.ReadString(), Is.EqualTo(""));
            Assert.That(reader.ReadString(), Is.EqualTo("13"));

            Assert.That(reader.ReadBytes(2), Is.EqualTo(new byte[] { 14, 15 }));

            Assert.That(reader.ReadBytesAndSize(), Is.Null);

            Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 17, 18 }));

            Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 20, 21 }));

            Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 22, 23 }));
        }
示例#9
0
 public override void Deserialize(NetworkReader reader, out char value)
 {
     value = reader.ReadChar();
 }
示例#10
0
        public bool Deserialize(byte[] _bytes)
        {
            using (MemoryStream ms = new MemoryStream(_bytes))
            {
                using (NetworkReader nr = new NetworkReader(ms))
                {
                    Type type = GetType();

                    FieldInfo[] allFields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

                    PropertyInfo[]          allProperties = type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                    IEnumerable <FieldInfo> fields        = allFields
                                                            .Where(o => o.GetCustomAttributes(typeof(SyncVar)).Count() > 0)
                                                            .OrderBy(o => o.Name);
                    IEnumerable <PropertyInfo> properties = allProperties
                                                            .Where(o => o.GetCustomAttributes(typeof(SyncVar)).Count() > 0)
                                                            .OrderBy(o => o.Name);

                    Type fieldType;

                    foreach (FieldInfo info in fields)
                    {
                        fieldType = info.FieldType;

                        string typeString = fieldType.Name;
                        object tmpValue   = null;

                        bool switchOnType = true;

                        if (fieldType.IsEnum)
                        {
                            tmpValue     = nr.ReadInt32();
                            switchOnType = false;
                        }
                        if (switchOnType)
                        {
                            switch (typeString)
                            {
                            case "Boolean":
                                tmpValue = nr.ReadBoolean();
                                break;

                            case "Byte":
                                tmpValue = nr.ReadByte();
                                break;

                            case "SByte":
                                tmpValue = nr.ReadSByte();
                                break;

                            case "Int16":
                                tmpValue = nr.ReadInt16();
                                break;

                            case "Int32":
                                tmpValue = nr.ReadInt32();
                                break;

                            case "Int64":
                                tmpValue = nr.ReadInt64();
                                break;

                            case "UInt16":
                                tmpValue = nr.ReadUInt16();
                                break;

                            case "UInt32":
                                tmpValue = nr.ReadUInt32();
                                break;

                            case "UInt64":
                                tmpValue = nr.ReadUInt64();
                                break;

                            case "Single":
                                tmpValue = nr.ReadSingle();
                                break;

                            case "Double":
                                tmpValue = nr.ReadDouble();
                                break;

                            case "Decimal":
                                tmpValue = nr.ReadDecimal();
                                break;

                            case "Char":
                                tmpValue = nr.ReadChar();
                                break;

                            case "String":
                                tmpValue = nr.ReadString();
                                break;

                            case "Byte[]":
                                int length = nr.ReadInt32();
                                tmpValue = nr.ReadBytes(length);
                                break;

                            case "Vector2":
                                tmpValue = nr.ReadVector2();
                                break;

                            case "Vector3":
                                tmpValue = nr.ReadVector3();
                                break;

                            case "Vector4":
                                tmpValue = nr.ReadVector4();
                                break;

                            case "GameObject":
                                tmpValue = nr.ReadGameObject();
                                break;

                            case "Transform":
                                tmpValue = nr.ReadTransform();
                                break;

                            case "Color":
                                tmpValue = nr.ReadColor();
                                break;

                            case "Color32":
                                tmpValue = nr.ReadColor32();
                                break;

                            default:
                                Debug.LogWarning("Could not serialize field! " + info.Name + "(" + info.FieldType.Name + ")", this);
                                break;
                            }
                        }
                        info.SetValue(this, tmpValue);
                        SyncVar syncVar = info.GetCustomAttribute <SyncVar>();
                        if (syncVar is object && syncVar.Hook is object)
                        {
                            SendMessage(syncVar.Hook, tmpValue, SendMessageOptions.RequireReceiver);
                        }
                    }

                    foreach (PropertyInfo info in properties)
                    {
                        fieldType = info.PropertyType;

                        string typeString = fieldType.Name;
                        object tmpValue   = null;

                        bool switchOnType = true;

                        if (fieldType.IsEnum)
                        {
                            tmpValue     = nr.ReadInt32();
                            switchOnType = false;
                        }
                        if (switchOnType)
                        {
                            switch (typeString)
                            {
                            case "Boolean":
                                tmpValue = nr.ReadBoolean();
                                break;

                            case "Byte":
                                tmpValue = nr.ReadByte();
                                break;

                            case "SByte":
                                tmpValue = nr.ReadSByte();
                                break;

                            case "Int16":
                                tmpValue = nr.ReadInt16();
                                break;

                            case "Int32":
                                tmpValue = nr.ReadInt32();
                                break;

                            case "Int64":
                                tmpValue = nr.ReadInt64();
                                break;

                            case "UInt16":
                                tmpValue = nr.ReadUInt16();
                                break;

                            case "UInt32":
                                tmpValue = nr.ReadUInt32();
                                break;

                            case "UInt64":
                                tmpValue = nr.ReadUInt64();
                                break;

                            case "Single":
                                tmpValue = nr.ReadSingle();
                                break;

                            case "Double":
                                tmpValue = nr.ReadDouble();
                                break;

                            case "Decimal":
                                tmpValue = nr.ReadDecimal();
                                break;

                            case "Char":
                                tmpValue = nr.ReadChar();
                                break;

                            case "String":
                                tmpValue = nr.ReadString();
                                break;

                            case "Byte[]":
                                int length = nr.ReadInt32();
                                tmpValue = nr.ReadBytes(length);
                                break;

                            case "Vector2":
                                tmpValue = nr.ReadVector2();
                                break;

                            case "Vector3":
                                tmpValue = nr.ReadVector3();
                                break;

                            case "Vector4":
                                tmpValue = nr.ReadVector4();
                                break;

                            case "GameObject":
                                tmpValue = nr.ReadGameObject();
                                break;

                            case "Transform":
                                tmpValue = nr.ReadTransform();
                                break;

                            case "Color":
                                tmpValue = nr.ReadColor();
                                break;

                            case "Color32":
                                tmpValue = nr.ReadColor32();
                                break;

                            default:
                                Debug.LogWarning("Could not serialize field! " + info.Name + "(" + info.PropertyType.Name + ")", this);
                                break;
                            }
                        }
                        info.SetValue(this, tmpValue);
                        SyncVar syncVar = info.GetCustomAttribute <SyncVar>();
                        if (syncVar is object && syncVar.Hook is object)
                        {
                            SendMessage(syncVar.Hook, tmpValue, SendMessageOptions.RequireReceiver);
                        }
                    }
                }

                return(true);
            }
        }
示例#11
0
        public static object ReadObject(this NetworkReader reader, Type type)
        {
            var @switch = new Dictionary <Type, Func <object> >
            {
                { typeof(Color), () => reader.ReadColor() },
                { typeof(Color32), () => reader.ReadInt32() },
                { typeof(GameObject), reader.ReadGameObject },
                { typeof(Matrix4x4), () => reader.ReadMatrix4x4() },
                { typeof(NetworkHash128), () => reader.ReadNetworkHash128() },
                { typeof(NetworkIdentity), reader.ReadNetworkIdentity },
                { typeof(NetworkInstanceId), () => reader.ReadNetworkId() },
                { typeof(NetworkSceneId), () => reader.ReadSceneId() },
                { typeof(Plane), () => reader.ReadPlane() },
                { typeof(Quaternion), () => reader.ReadQuaternion() },
                { typeof(Ray), () => reader.ReadRay() },
                { typeof(Rect), () => reader.ReadRect() },
                { typeof(Transform), reader.ReadTransform },
                { typeof(Vector2), () => reader.ReadVector2() },
                { typeof(Vector3), () => reader.ReadVector3() },
                { typeof(Vector4), () => reader.ReadVector4() },

                { typeof(bool), () => reader.ReadBoolean() },
                { typeof(byte[]), reader.ReadBytesAndSize },
                { typeof(char), () => reader.ReadChar() },
                { typeof(decimal), () => reader.ReadDecimal() },
                { typeof(double), () => reader.ReadDouble() },
                { typeof(float), () => reader.ReadSingle() },

                { typeof(sbyte), () => reader.ReadSByte() },
                { typeof(string), reader.ReadString },

                { typeof(short), () => reader.ReadInt16() },
                { typeof(int), () => reader.ReadInt32() },
                { typeof(long), () => reader.ReadInt64() },

                { typeof(ushort), () => reader.ReadUInt16() },
                { typeof(uint), () => reader.ReadUInt32() },
                { typeof(ulong), () => reader.ReadUInt64() },
            };

            if ([email protected](type))
            {
                if (typeof(MessageBase).IsAssignableFrom(type))
                {
                    MessageBase instance;
                    var         constructor = type.GetConstructor(Type.EmptyTypes);

                    if (constructor != null)
                    {
                        instance = (MessageBase)constructor.Invoke(null);
                    }
                    else
                    {
                        instance = (MessageBase)FormatterServices.GetUninitializedObject(type);
                    }

                    instance.Deserialize(reader);
                    return(instance);
                }

                throw new ArgumentException($"The type ({type}) passed to ReadObject is not a type supported by NetworkReader.", nameof(type));
            }

            return(@switch[type]());
        }