public static void WriteFloatProperty(this EndianWriter stream, IMEPackage pcc, NameReference propName, float value, int staticArrayIndex) { //Debug.WriteLine("Writing float property " + propName + ", value: " + value + " at 0x" + stream.Position.ToString("X6")); stream.WritePropHeader(pcc, propName, PropertyType.FloatProperty, 4, staticArrayIndex); stream.WriteFloat(value); }
private void WriteChunks(SerializingContainer2 sc) { EndianWriter writer = sc.ms.Writer; if (EmbeddedFiles.Count > 0) { writer.WriteUInt32(didx); writer.WriteInt32(EmbeddedFiles.Count * 12); var dataChunk = new MemoryStream(); foreach ((uint id, byte[] bytes) in EmbeddedFiles) { dataChunk.WriteZeros((int)(dataChunk.Position.Align(16) - dataChunk.Position)); //files must be 16-byte aligned in the data chunk writer.WriteUInt32(id); //writing to DIDX writer.WriteInt32((int)dataChunk.Position); //Writing to DIDX writer.WriteInt32(bytes.Length); //Writing to DIDX dataChunk.WriteFromBuffer(bytes); //Writing to DATA } writer.WriteUInt32(data); writer.WriteInt32((int)dataChunk.Length); writer.WriteFromBuffer(dataChunk.ToArray()); } if (sc.Game == MEGame.ME2 && ME2STMGFallback != null) { writer.WriteUInt32(stmg); writer.WriteInt32(ME2STMGFallback.Length); writer.WriteFromBuffer(ME2STMGFallback); } if (sc.Game == MEGame.ME3 && InitStateManagement != null) { writer.WriteUInt32(stmg); var lenPos = sc.ms.Position; writer.WriteUInt32(0); writer.WriteFloat(InitStateManagement.VolumeThreshold); writer.WriteUInt16(InitStateManagement.MaxVoiceInstances); writer.WriteInt32(InitStateManagement.StateGroups.Count); foreach ((uint _, WwiseStateManagement.StateGroup stateGroup) in InitStateManagement.StateGroups) { writer.WriteUInt32(stateGroup.ID); writer.WriteUInt32(stateGroup.DefaultTransitionTime); writer.WriteInt32(stateGroup.CustomTransitionTimes.Count); foreach (var transTime in stateGroup.CustomTransitionTimes) { writer.WriteUInt32(transTime.FromStateID); writer.WriteUInt32(transTime.ToStateID); writer.WriteUInt32(transTime.TransitionTime); } } writer.WriteInt32(InitStateManagement.SwitchGroups.Count); foreach ((uint _, WwiseStateManagement.SwitchGroup switchGroup) in InitStateManagement.SwitchGroups) { writer.WriteUInt32(switchGroup.ID); writer.WriteUInt32(switchGroup.GameParamID); writer.WriteInt32(switchGroup.Points.Count); foreach (var point in switchGroup.Points) { writer.WriteFloat(point.GameParamValue); writer.WriteUInt32(point.SwitchID); writer.WriteUInt32(point.CurveShape); } } writer.WriteInt32(InitStateManagement.GameParameterDefaultValues.Count); foreach ((uint id, float defaultValue) in InitStateManagement.GameParameterDefaultValues) { writer.WriteUInt32(id); writer.WriteFloat(defaultValue); } var endPos = sc.ms.Position; sc.ms.JumpTo(lenPos); writer.WriteInt32((int)(endPos - lenPos - 4)); sc.ms.JumpTo(endPos); } if (HIRCObjects.Count > 0) { writer.WriteUInt32(hirc); var lengthPos = sc.ms.Position; writer.WriteUInt32(0); writer.WriteInt32(HIRCObjects.Count); foreach ((uint _, HIRCObject h) in HIRCObjects) { writer.WriteFromBuffer(h.ToBytes(sc.Game)); } var endPos = sc.ms.Position; sc.ms.JumpTo(lengthPos); writer.WriteInt32((int)(endPos - lengthPos - 4)); sc.ms.JumpTo(endPos); } if (ReferencedBanks.Count > 0) { writer.WriteUInt32(stid); var lengthPos = sc.ms.Position; writer.WriteUInt32(0); writer.WriteUInt32(1); writer.WriteInt32(ReferencedBanks.Count); foreach ((uint id, string name) in ReferencedBanks) { writer.WriteUInt32(id); writer.WriteByte((byte)name.Length); writer.WriteStringASCII(name); } var endPos = sc.ms.Position; sc.ms.JumpTo(lengthPos); writer.WriteInt32((int)(endPos - lengthPos - 4)); sc.ms.JumpTo(endPos); } if (FXPR_Chunk != null) { writer.WriteUInt32(fxpr); writer.WriteInt32(FXPR_Chunk.Length); writer.WriteFromBuffer(FXPR_Chunk); } if (ENVS_Chunk != null) { writer.WriteUInt32(envs); writer.WriteInt32(ENVS_Chunk.Length); writer.WriteFromBuffer(ENVS_Chunk); } }
/// <summary> /// Updates any changes made to the object data. /// </summary> /// <param name="reader"> /// The EndianWriter to write to. /// It should point to the same stream that was used to load the object data, as seeking will be done automatically. /// </param> public virtual void Update(EndianWriter writer) { // Strength info long chunkStartOffset = _entry.ObjectAddress + (long)TableOffset.ObjectPool; writer.SeekTo(chunkStartOffset + StrengthInfoOffset); _healthInfo.WriteTo(writer); // BSP Zone writer.SeekTo(chunkStartOffset + 0x18); writer.WriteUInt16(_zone); // Position1 writer.SeekTo(chunkStartOffset + PositionOffset1); writer.WriteFloat(_positionMain.X); writer.WriteFloat(_positionMain.Y); writer.WriteFloat(_positionMain.Z); // Calculate extra position vectors Vector3 position2 = Vector3.Add(_position2Delta, _positionMain); Vector3 position3 = Vector3.Add(_position3Delta, _positionMain); Vector3 position4 = Vector3.Add(_position4Delta, _positionMain); // Position2 writer.SeekTo(chunkStartOffset + PositionOffset2); writer.WriteFloat(position2.X); writer.WriteFloat(position2.Y); writer.WriteFloat(position2.Z); // Position3 writer.SeekTo(chunkStartOffset + PositionOffset3); writer.WriteFloat(position3.X); writer.WriteFloat(position3.Y); writer.WriteFloat(position3.Z); // Position4 writer.SeekTo(chunkStartOffset + PositionOffset4); writer.WriteFloat(position4.X); writer.WriteFloat(position4.Y); writer.WriteFloat(position4.Z); }
/// <summary> /// Writes updated strength information back to a EndianWriter. /// </summary> /// <param name="writer">The EndianWriter to write to.</param> public void WriteTo(EndianWriter writer) { writer.WriteFloat(_healthModifier); writer.WriteFloat(_shieldModifier); }