Пример #1
0
                    public override void ContinueParse(int npos, Oni.BinaryReader rawReader)
                    {
                        m_pClass = rawReader.ReadString(64).Replace("\0", "");
                        rawReader.Skip(48);
                        rawReader.Skip(2);
                        float l_sX = rawReader.ReadSingle();
                        float l_sY = rawReader.ReadSingle();

                        if (m_particleClasses.ContainsKey(m_pClass))
                        {
                            m_class = m_particleClasses[m_pClass];
                            m_go    = GameObject.CreatePrimitive(PrimitiveType.Plane);
                            GameObject.Destroy(m_go.collider);
                            m_go.name = m_pClass;

                            if (BinaryDatReader.m_textures.ContainsKey(m_particleClasses[m_pClass].m_header.m_textureName))
                            {
                                m_go.renderer.material.mainTexture = BinaryDatReader.m_textures[m_particleClasses[m_pClass].m_header.m_textureName].Surface_0;
                                m_go.renderer.material.shader      = Shader.Find("Particles/Additive");
                            }
                        }
                        else
                        {
                            Debug.LogError("NO KEY FOR " + m_pClass);
                        }
                        //Debug.Log(rawReader.ReadString(48));//particle name
                        //throw new System.NotImplementedException();
                    }
Пример #2
0
                    public override void ContinueParse(int npos, Oni.BinaryReader rawReader)
                    {
                        if (!m_lockFlag)
                        {
                            m_doorType = rawReader.ReadString(63);
                            m_doorID   = (short)BinaryDatReader.l_int16(rawReader.ReadBytes(2), 2);
                            m_keyID    = (short)BinaryDatReader.l_int16(rawReader.ReadBytes(2), 2);
                            //Debug.Log(m_doorID + "|" + m_keyID);
                            rawReader.Skip(2);
                            m_pos.x            = (float)BinaryDatReader.l_float(rawReader.ReadBytes(4).ReverseBytes(), 4);
                            m_pos.y            = (float)BinaryDatReader.l_float(rawReader.ReadBytes(4).ReverseBytes(), 4);
                            m_pos.z            = (float)BinaryDatReader.l_float(rawReader.ReadBytes(4).ReverseBytes(), 4);
                            m_activationRadius = rawReader.ReadSingle();
                            m_doortex          = rawReader.ReadString(63);
                            Binary.DOOR l_doorClass = null;

                            if ((l_doorClass = Round2.Generated.Binary.DOOR.PendDoorClass(m_doorType)) != null)
                            {
                                Door l_d = new GameObject().AddComponent <Door>();
                                l_d.m_proto = this;
                            }
                        }
                        else
                        {
                            Debug.LogError("Attempt to reinitialize already locked object. Skipped.");
                        }

                        m_lockFlag = true;
                    }
Пример #3
0
    static System.Func <Round2.BinaryInitializable> InitializeLoader(int id, Oni.InstanceDescriptor ides, string resultTypeName)
    {
        try
        {
            if (ides.IsPlaceholder)
            {
                return(null);
            }

            Oni.BinaryReader reader = ides.OpenRead();
            Oni.InstanceFile l_file = ides.File;
            //using ()
            {
                List <byte> l_bytes = new List <byte>(System.BitConverter.GetBytes(ides.Index));
                l_bytes.AddRange(System.BitConverter.GetBytes(-1));//re-define for current level usage
                //Oni.BinaryReader l_reader = null;
                l_bytes.AddRange(reader.ReadBytes(ides.DataSize));
                System.Type l_t   = typeof(Round2.BinaryInitializable).Assembly.GetType(resultTypeName);//add Round2.Generated.Binary. before typename!
                object      l_res = System.Activator.CreateInstance(l_t);
                m_bytesUsed += l_bytes.Count;
                (l_res as Round2.BinaryInitializable).m_sourceFile = l_file;

                System.Func <Round2.BinaryInitializable> l_resultingLoader = () =>
                {
                    try
                    {
                        (l_res as Round2.BinaryInitializable).Convert(l_bytes.ToArray());
                        m_descriptors.Remove(ides);
                        m_descriptors.Add(ides, () => l_res as Round2.BinaryInitializable);
                        return(l_res as Round2.BinaryInitializable);
                    }
                    catch (System.Exception ee)
                    {
                        if (ee is System.IndexOutOfRangeException)
                        {
                            Debug.LogError("! bytes[" + l_bytes.Count + "]");
                        }

                        throw;
                    }
                };

                m_descriptors.Add(ides, l_resultingLoader);
                return(l_resultingLoader);
            }
            reader.Dispose();
        }
        catch (System.Exception ee)
        {
            Debug.Log("Exception at id : " + id + "\n" + ee.ToString() + "\n" + ee.InnerException);
        }

        return(null);
    }
Пример #4
0
 public abstract void ContinueParse(int npos, Oni.BinaryReader rawReader);
Пример #5
0
    private static Round2.Generated.Binary.Namespaces.BINA.OBJC.OBJCM ParseOBJCMember(string objType, int npos, Oni.BinaryReader rawReader, int objID)
    {
        Round2.Generated.Binary.Namespaces.BINA.OBJC.Header l_objh = new Round2.Generated.Binary.Namespaces.BINA.OBJC.Header();

        switch (objType)
        {
        case "DOOR":
        {
            Round2.Generated.Binary.Namespaces.BINA.OBJC.OBJCM l_res = new Round2.Generated.Binary.Namespaces.BINA.OBJC.DOOR()
            {
                m_header = l_objh
            };
            l_res.ContinueParse(npos, rawReader);
            return(l_res);
        }
        break;

        case "PART":
        {
            Round2.Generated.Binary.Namespaces.BINA.OBJC.OBJCM l_res = new Round2.Generated.Binary.Namespaces.BINA.OBJC.PART()
            {
                m_header = l_objh
            };
            l_res.ContinueParse(npos, rawReader);
            //Debug.Log(l_res.m_header.m_pos.x);

            return(l_res);
        }
        break;

        case "FURN":
        {
            //Debug.DrawLine(Vector3.up * 10, new Vector3(-l_objh.m_pos.x, l_objh.m_pos.y, l_objh.m_pos.z), Color.green, 15f);
        }
        break;

        default:
            Debug.LogWarning("[UNSUPPORTED TAG : " + objType + "]");
            break;
        }

        return(null);
    }
Пример #6
0
    static void ParseBINA(Round2.BinaryInitializable obj, Oni.InstanceDescriptor ides)
    {
        Round2.Generated.Binary.BINA l_bina = (Round2.Generated.Binary.BINA)obj;

        using (Oni.BinaryReader l_rawReader = ides.GetRawReader(l_bina.m_Offset_C))
        {
            int l_tag = l_rawReader.ReadInt32();

            switch ((Oni.Metadata.BinaryTag)l_tag)
            {
            case Oni.Metadata.BinaryTag.OBJC:
            {
                int l_size    = l_rawReader.ReadInt32();
                int l_version = l_rawReader.ReadInt32();

                for (int l_nextSize = l_rawReader.ReadInt32(); l_nextSize != 0; l_nextSize = l_rawReader.ReadInt32())
                {
                    int    l_npos    = l_rawReader.Position + l_nextSize;  //calculate next position
                    string l_objType = (string)l_str(l_rawReader.ReadBytes(4).ReverseBytes(), 4);
                    int    l_objID   = l_rawReader.ReadInt32();
                    int    l_flags   = l_rawReader.ReadInt32();
                    float  l_xPos    = l_rawReader.ReadSingle();
                    float  l_yPos    = l_rawReader.ReadSingle();
                    float  l_zPos    = l_rawReader.ReadSingle();
                    float  l_xRot    = l_rawReader.ReadSingle();
                    float  l_yRot    = l_rawReader.ReadSingle();
                    float  l_zRot    = l_rawReader.ReadSingle();
                    Round2.Generated.Binary.Namespaces.BINA.OBJC.OBJCM l_obj = ParseOBJCMember(l_objType, l_npos, l_rawReader, l_objID);

                    if (l_obj != null)
                    {
                        l_obj.m_header.m_type  = l_objType;
                        l_obj.m_header.m_id    = l_objID;
                        l_obj.m_header.m_flags = l_flags;
                        l_obj.m_header.m_pos   = new Vector3(l_xPos, l_yPos, l_zPos);
                        l_obj.m_header.m_rot   = new Vector3(l_xRot, l_yRot, l_zRot);

                        //TODO : casually refactor
                        //TODO : replace plane with quad. Fix scale after
                        if (l_obj is Round2.Generated.Binary.Namespaces.BINA.OBJC.PART)
                        {
                            (l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_go.transform.position    = new UnityEngine.Vector3(-l_obj.m_header.m_pos.x, l_obj.m_header.m_pos.y, l_obj.m_header.m_pos.z);
                            (l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_go.transform.eulerAngles = l_obj.m_header.m_rot;
                            (l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_go.transform.localScale  = new UnityEngine.Vector3((l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_class.m_header.m_xScale / 5f, 1, (l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_class.m_header.m_yScale / 5f);
                            Debug.DrawLine(Vector3.up * 10, new Vector3(-l_obj.m_header.m_pos.x, l_obj.m_header.m_pos.y, l_obj.m_header.m_pos.z), Color.green, 15f);
                        }

                        //Debug.LogWarning(l_nextSize + ":" + l_objType + ":" + ides.GetHashCode() + "{" + l_obj.m_header.m_pos + "}" + "[" + l_obj.m_header.m_rot + "]");
                    }

                    l_rawReader.Position = l_npos;
                }
            }
            break;

            case Oni.Metadata.BinaryTag.PAR3:
            {
                int l_initPos = l_rawReader.Position;
                Round2.Generated.Binary.Namespaces.BINA.OBJC.PAR3.Header l_header = new Round2.Generated.Binary.Namespaces.BINA.OBJC.PAR3.Header();
                int l_completeParticleLength = l_rawReader.ReadInt32();
                l_rawReader.Skip(2);                                //skip length duplicate
                int l_version = l_rawReader.ReadInt16();
                l_rawReader.ReadInt32();                            //flags
                l_rawReader.ReadInt32();                            //flags2
                l_rawReader.ReadInt32();                            //unused
                l_header.m_variableCount = l_rawReader.ReadInt16(); //amout of variables
                l_header.m_eventsCount   = l_rawReader.ReadInt16(); //amount of events
                l_header.m_emittersCount = l_rawReader.ReadInt16(); //amount of emitters
                l_rawReader.ReadInt16();                            //unknown
                //Debug.Log(l_header.m_eventsCount.ToString("X") + " : PAR3 : " + ides.Name);
                l_rawReader.Skip(16 * 4);                           //skip slots. currently, they aren't used
                l_rawReader.Position   = l_initPos + 0x120 - 4;
                l_header.m_textureName = l_rawReader.ReadString(64);
                l_rawReader.Position   = l_initPos + 0xB4 - 4;
                l_header.m_xScale      = l_rawReader.ReadSingle();
                l_rawReader.Position   = l_initPos + 0xD0 - 4;
                l_header.m_yScale      = l_rawReader.ReadSingle();
                Round2.Generated.Binary.Namespaces.BINA.OBJC.PART.RegisterParticleClass(new Round2.Generated.Binary.Namespaces.BINA.OBJC.PAR3()
                    {
                        m_header = l_header
                    }, ides.Name);
                //Debug.LogError(">>>" + l_header.m_textureName);//texture name here
            }
            break;

            default:
                Debug.LogWarning("Cannot handle this tag yet");
                break;
            }
        }
    }