public static void SaveEntity(ICLIFlags flags, string path, SaveContext context, ulong entityGuid) { FindLogic.Combo.EntityAsset entityInfo = context.m_info.m_entities[entityGuid]; Entity.OverwatchEntity entity = new Entity.OverwatchEntity(entityInfo, context.m_info); string entityDir = Path.Combine(path, "Entities", entityInfo.GetName()); string outputFile = Path.Combine(entityDir, entityInfo.GetName() + $".{entity.Extension}"); CreateDirectoryFromFile(outputFile); using (Stream entityOutputStream = File.OpenWrite(outputFile)) { entityOutputStream.SetLength(0); entity.Write(entityOutputStream); } if (!context.m_saveAnimationEffects) { return; } if (entityInfo.m_modelGUID == 0) { return; } foreach (ulong effect in entityInfo.m_effects) { SaveEffect(flags, entityDir, context, effect); } foreach (ulong animation in entityInfo.m_animations) { SaveAnimationEffectReference(entityDir, context.m_info, animation, entityInfo.m_modelGUID); } }
public void Write(Stream stream) { using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write(Extension); // type identifier writer.Write(VersionMajor); writer.Write(VersionMinor); writer.Write(Entity.GetNameIndex()); if (Entity.m_modelGUID != 0) { FindLogic.Combo.ModelAsset modelInfo = Info.m_models[Entity.m_modelGUID]; writer.Write(modelInfo.GetName()); } else { writer.Write("null"); } if (Entity.m_effectGUID != 0) { FindLogic.Combo.EffectInfoCombo effectInfo = Info.m_effects[Entity.m_effectGUID]; writer.Write(effectInfo.GetName()); } else { writer.Write("null"); } writer.Write(teResourceGUID.Index(Entity.m_GUID)); writer.Write(teResourceGUID.Index(Entity.m_modelGUID)); writer.Write(teResourceGUID.Index(Entity.m_effectGUID)); if (Entity.Children == null) { writer.Write(0); return; } writer.Write(Entity.Children.Count(x => x.m_defGUID != 0)); foreach (FindLogic.Combo.ChildEntityReference childEntityReference in Entity.Children.Where(x => x.m_defGUID != 0)) { FindLogic.Combo.EntityAsset childEntityInfo = Info.m_entities[childEntityReference.m_defGUID]; writer.Write(childEntityInfo.GetName()); writer.Write(childEntityReference.m_hardpointGUID); writer.Write(childEntityReference.m_identifier); writer.Write(teResourceGUID.Index(childEntityReference.m_hardpointGUID)); writer.Write(teResourceGUID.Index(childEntityReference.m_identifier)); if (childEntityReference.m_hardpointGUID != 0) { writer.Write(OverwatchModel.IdToString("hardpoint", teResourceGUID.Index(childEntityReference.m_hardpointGUID))); } else { writer.Write("null"); // erm, k } } } }
protected void WriteEffect(BinaryWriter writer) { writer.Write("oweffect"); writer.Write(EffectVersionMajor); writer.Write(EffectVersionMinor); EffectParser.EffectInfo effect = EffectInfo.Effect; writer.Write(teResourceGUID.Index(effect.GUID)); writer.Write(effect.EffectLength); writer.Write(effect.DMCEs.Count); writer.Write(effect.CECEs.Count); writer.Write(effect.NECEs.Count); writer.Write(effect.RPCEs.Count); writer.Write(effect.FECEs.Count); writer.Write(effect.OSCEs.Count); writer.Write(effect.SVCEs.Count); foreach (EffectParser.DMCEInfo dmceInfo in effect.DMCEs) { WriteTime(writer, dmceInfo.PlaybackInfo); writer.Write(dmceInfo.Animation); writer.Write(dmceInfo.Material); writer.Write(dmceInfo.Model); FindLogic.Combo.ModelAsset modelInfo = Info.m_models[dmceInfo.Model]; writer.Write($"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl"); if (dmceInfo.Animation == 0) { writer.Write("null"); } else { FindLogic.Combo.AnimationAsset animationInfo = Info.m_animations[dmceInfo.Animation]; writer.Write($"Models\\{modelInfo.GetName()}\\{OverwatchAnimationEffect.AnimationEffectDir}\\{animationInfo.GetNameIndex()}\\{animationInfo.GetNameIndex()}.owanim"); } } foreach (EffectParser.CECEInfo ceceInfo in effect.CECEs) { WriteTime(writer, ceceInfo.PlaybackInfo); writer.Write((byte)ceceInfo.Action); writer.Write(ceceInfo.Animation); writer.Write(ceceInfo.Identifier); writer.Write(teResourceGUID.Index(ceceInfo.Identifier)); if (ceceInfo.Animation != 0) { FindLogic.Combo.AnimationAsset animationInfo = Info.m_animations[ceceInfo.Animation]; writer.Write($"{OverwatchAnimationEffect.AnimationEffectDir}\\{animationInfo.GetNameIndex()}\\{animationInfo.GetNameIndex()}.owanim"); } else { writer.Write("null"); } } foreach (EffectParser.NECEInfo neceInfo in effect.NECEs) { WriteTime(writer, neceInfo.PlaybackInfo); writer.Write(neceInfo.GUID); writer.Write(teResourceGUID.Index(neceInfo.Identifier)); FindLogic.Combo.EntityAsset entityInfo = Info.m_entities[neceInfo.GUID]; writer.Write($"Entities\\{entityInfo.GetName()}\\{entityInfo.GetName()}.owentity"); } foreach (EffectParser.RPCEInfo rpceInfo in effect.RPCEs) { WriteTime(writer, rpceInfo.PlaybackInfo); writer.Write(rpceInfo.Model); // todo: make the materials work writer.Write(rpceInfo.Material); FindLogic.Combo.ModelAsset modelInfo = Info.m_models[rpceInfo.Model]; //writer.Write(rpceInfo.TextureDefiniton); writer.Write($"Models\\{modelInfo.GetName()}\\{modelInfo.GetName()}.owmdl"); } foreach (EffectParser.SVCEInfo svceInfo in effect.SVCEs) { WriteTime(writer, svceInfo.PlaybackInfo); writer.Write(teResourceGUID.Index(svceInfo.VoiceStimulus)); if (VoiceStimuli.ContainsKey(svceInfo.VoiceStimulus)) { HashSet <FindLogic.Combo.VoiceLineInstanceInfo> lines = VoiceStimuli[svceInfo.VoiceStimulus]; writer.Write(lines.Count); foreach (FindLogic.Combo.VoiceLineInstanceInfo voiceLineInstance in lines) { writer.Write(voiceLineInstance.SoundFiles.Count); foreach (ulong soundFile in voiceLineInstance.SoundFiles) { FindLogic.Combo.SoundFileAsset soundFileInfo = Info.m_voiceSoundFiles[soundFile]; writer.Write($"Sounds\\{soundFileInfo.GetNameIndex()}.ogg"); } } } else { writer.Write(0); } } }
public OverwatchEntity(FindLogic.Combo.EntityAsset entity, FindLogic.Combo.ComboInfo info) { Info = info; Entity = entity; }