protected override void Start()
        {
            base.Start();
            ParticleSystemInstance = this.Create(ParticleEffect.gameObject);

            var   particles = ParticleSystemInstance.FindComponents <ParticleSystem>();
            float duration  = 0;

            foreach (var particle in particles)
            {
                if (duration < particle.duration)
                {
                    duration = particle.duration;
                }
            }

            var sounds = ParticleSystemInstance.FindComponents <AudioSource>();

            foreach (var source in sounds)
            {
                if (duration < source.clip.length)
                {
                    duration = source.clip.length;
                }
            }

            if (DestroyAfterPlay)
            {
                Destroy(ParticleSystemInstance, duration);
                Destroy(this, duration);
            }
        }
Exemplo n.º 2
0
        public override void Load(BinaryReader reader, int size)
        {
            long start_pos = reader.BaseStream.Position;

            DataSize = size;

            Header1 = reader.ReadUInt32();

            // Some PTL files are "BinaryIntermediate" files
            if (Header1 == 0x616E6942)
            {
                ParticleInstanceCount      = 0;
                ParticleTypeCount          = 0;
                reader.BaseStream.Position = start_pos;
                Data = reader.ReadBytes(size);
                return;
            }

            //Default.rm has some pre-header data: 3x (texture ID + material ID)
            if (Header1 > 0xFF)
            {
                IsDefault            = true;
                ParticleTextureID_1  = Header1;
                ParticleMaterialID_1 = reader.ReadUInt32();
                ParticleTextureID_2  = reader.ReadUInt32();
                ParticleMaterialID_2 = reader.ReadUInt32();
                ParticleTextureID_3  = reader.ReadUInt32();
                ParticleMaterialID_3 = reader.ReadUInt32();
                Header1 = reader.ReadUInt32();
            }

            ParticleTypeCount = reader.ReadUInt32();

            ParticleTypes = new ParticleSystemDefinition[ParticleTypeCount];

            // size 0x33C (0x330 if header is 0x1c)
            if (ParticleTypeCount > 0)
            {
                for (int i = 0; i < ParticleTypeCount; i++)
                {
                    ParticleTypes[i] = new ParticleSystemDefinition();
                    string tempName = new string(reader.ReadChars(0x10));
                    ParticleTypes[i].Name = tempName.Replace('\0', ' ');
                    int bufferSize = 0x320;
                    if (Header1 == 0x1E)
                    {
                        bufferSize += 0xC;
                    }
                    ParticleTypes[i].Remain = reader.ReadBytes(bufferSize);
                }
            }

            uint InstanceCheck = reader.ReadUInt32();

            ParticleInstanceCount = InstanceCheck;
            if (!IsDefault && ParticleInstanceCount > 0 && ParticleInstanceCount < 65536)
            {
                ParticleInstances = new List <ParticleSystemInstance>();

                // size 0x44
                for (int i = 0; i < ParticleInstanceCount; i++)
                {
                    ParticleSystemInstance ParticleInstance = new ParticleSystemInstance();
                    ParticleInstance.Position = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                    ParticleInstance.Rot_X    = reader.ReadUInt16();
                    ParticleInstance.Rot_Y    = reader.ReadUInt16();
                    ParticleInstance.Rot_Z    = reader.ReadUInt16();
                    ParticleInstance.UnkZero  = reader.ReadUInt32();
                    string tempName = new string(reader.ReadChars(0x10));
                    ParticleInstance.Name      = tempName.Replace('\0', ' ');
                    ParticleInstance.UnkShorts = new ushort[12];
                    for (int a = 0; a < ParticleInstance.UnkShorts.Length; a++)
                    {
                        ParticleInstance.UnkShorts[a] = reader.ReadUInt16();
                    }
                    ParticleInstance.EndZero = reader.ReadUInt16();

                    ParticleInstances.Add(ParticleInstance);
                }
            }
            else
            {
                ParticleInstanceCount = 0;
            }

            // Default.rm has some extra data (decal stuff)
            if (IsDefault)
            {
                DecalTextureID  = InstanceCheck;
                DecalMaterialID = reader.ReadUInt32();
            }

            // todo: more data after this in default

            int RemainBytes = (int)((start_pos + size) - reader.BaseStream.Position);

            if (RemainBytes > 0)
            {
                Remain = reader.ReadBytes(RemainBytes);
            }
            else
            {
                Remain = new byte[0];
            }
        }