public OverwatchMap(string name, FindLogic.Combo.ComboInfo info, teMapPlaceableData singleModels, teMapPlaceableData modelGroups, teMapPlaceableData placeable8, teMapPlaceableData entities, teMapPlaceableData lights) { Name = name; Info = info; SingleModels = singleModels; ModelGroups = modelGroups; Models = placeable8; Entities = entities; Lights = lights; }
public OverwatchMap( string name, FindLogic.Combo.ComboInfo info, teMapPlaceableData singleModels, teMapPlaceableData modelGroups, teMapPlaceableData models, teMapPlaceableData entities, teMapPlaceableData lights, teMapPlaceableData sounds, teMapPlaceableData effects) { Name = name; Info = info; SingleModels = singleModels ?? new teMapPlaceableData(); ModelGroups = modelGroups ?? new teMapPlaceableData(); Models = models ?? new teMapPlaceableData(); Entities = entities ?? new teMapPlaceableData(); Lights = lights ?? new teMapPlaceableData(); Sounds = sounds ?? new teMapPlaceableData(); Effects = effects ?? new teMapPlaceableData(); }
public void Parse(ICLIFlags toolFlags) { var flags = toolFlags as ExtractFlags; var testguids = flags.Positionals.Skip(3).Select(x => uint.Parse(x, System.Globalization.NumberStyles.HexNumber)); foreach (var guid in Program.TrackedFiles[0x9F]) { if (testguids.Contains(teResourceGUID.Index(guid))) { var path = Path.Combine(flags.OutputPath, "teMapPlacable", teResourceGUID.Index(guid).ToString("X")); STUMapHeader map = GetInstance <STUMapHeader>(guid); foreach (var t in Enum.GetValues(typeof(Enums.teMAP_PLACEABLE_TYPE))) { var teType = (Enums.teMAP_PLACEABLE_TYPE)t; if (teType == Enums.teMAP_PLACEABLE_TYPE.UNKNOWN) { continue; } var o = Path.Combine(path, teType.ToString()); if (teMapPlaceableData.Manager.Types.ContainsKey(teType)) { continue; } if (!Directory.Exists(o)) { Directory.CreateDirectory(o); } teMapPlaceableData placable = GetPlaceableData(map, teType); for (int i = 0; i < placable.Header.PlaceableCount; ++i) { var commonStructure = placable.CommonStructures[i]; using (var f = File.OpenWrite(Path.Combine(o, commonStructure.UUID.Value.ToString("N")))) { f.Write(((teMapPlaceableDummy)placable.Placeables[i]).Data, 0, ((teMapPlaceableDummy)placable.Placeables[i]).Data.Length); } } } } } }
public static void Save(ICLIFlags flags, STUMapHeader mapHeader, ulong key, string basePath) { string name = GetString(mapHeader.m_displayName) ?? "Title Screen"; //string name = map.m_506FA8D8; var variantName = GetString(mapHeader.m_1C706502); if (variantName != null) { name = variantName; } LoudLog($"Extracting map {name}\\{teResourceGUID.Index(key):X}"); name = GetValidFilename(name); // TODO: MAP11 HAS CHANGED // TODO: MAP10 TOO? string mapPath = Path.Combine(basePath, "Maps", name, teResourceGUID.Index(key).ToString("X")) + Path.DirectorySeparatorChar; CreateDirectoryFromFile(mapPath); FindLogic.Combo.ComboInfo info = new FindLogic.Combo.ComboInfo(); LoudLog("\tFinding"); FindLogic.Combo.Find(info, mapHeader.m_map); //for (ushort i = 0; i < 255; i++) { // using (Stream mapChunkStream = OpenFile(mapHeader.GetChunkKey((byte)i))) { // if (mapChunkStream == null) continue; // WriteFile(mapChunkStream, Path.Combine(mapPath, $"{(Enums.teMAP_PLACEABLE_TYPE)i}.0BC")); // } //} //return; teMapPlaceableData placeableModelGroups = GetPlaceableData(mapHeader, Enums.teMAP_PLACEABLE_TYPE.MODEL_GROUP); teMapPlaceableData placeableSingleModels = GetPlaceableData(mapHeader, Enums.teMAP_PLACEABLE_TYPE.SINGLE_MODEL); teMapPlaceableData placeableModel = GetPlaceableData(mapHeader, Enums.teMAP_PLACEABLE_TYPE.MODEL); teMapPlaceableData placeableLights = GetPlaceableData(mapHeader, Enums.teMAP_PLACEABLE_TYPE.LIGHT); teMapPlaceableData placeableEntities = GetPlaceableData(mapHeader, Enums.teMAP_PLACEABLE_TYPE.ENTITY); teMapPlaceableData placeableSounds = GetPlaceableData(mapHeader, Enums.teMAP_PLACEABLE_TYPE.SOUND); teMapPlaceableData placeableEffects = GetPlaceableData(mapHeader, Enums.teMAP_PLACEABLE_TYPE.EFFECT); OverwatchMap exportMap = new OverwatchMap(name, info, placeableSingleModels, placeableModelGroups, placeableModel, placeableEntities, placeableLights, placeableSounds, placeableEffects); using (Stream outputStream = File.OpenWrite(Path.Combine(mapPath, $"{name}.{exportMap.Extension}"))) { exportMap.Write(outputStream); } { FindLogic.Combo.Find(info, mapHeader.m_86C1CFAB); FindLogic.Combo.Find(info, mapHeader.m_9386E669); FindLogic.Combo.Find(info, mapHeader.m_C6599DEB); if (mapHeader.m_D608E9F3 != null) { foreach (teResourceGUID gamemodeGUID in mapHeader.m_D608E9F3) { STUGameMode gameMode = GetInstance <STUGameMode>(gamemodeGUID); if (gameMode == null) { continue; } FindLogic.Combo.Find(info, gameMode.m_6EB38130); // 004 FindLogic.Combo.Find(info, gameMode.m_CF63B633); // 01B FindLogic.Combo.Find(info, gameMode.m_7F5B54B2); // game mode voice set foreach (STUGameModeTeam team in gameMode.m_teams) { FindLogic.Combo.Find(info, team.m_bodyScript); // 01B FindLogic.Combo.Find(info, team.m_controllerScript); // 01B } } } } FindLogic.Combo.Find(info, mapHeader.m_announcerWelcome); info.SetEffectName(mapHeader.m_announcerWelcome, "AnnouncerWelcome"); FindLogic.Combo.Find(info, mapHeader.m_musicTease); info.SetEffectName(mapHeader.m_musicTease, "MusicTease"); ulong announcerVoiceSet = 0; using (Stream stream = OpenFile(mapHeader.m_map)) { if (stream != null) { using (BinaryReader reader = new BinaryReader(stream)) { teMap map = reader.Read <teMap>(); STUVoiceSetComponent voiceSetComponent = GetInstance <STUVoiceSetComponent>(map.EntityDefinition); announcerVoiceSet = voiceSetComponent?.m_voiceDefinition; FindLogic.Combo.Find(info, announcerVoiceSet); info.SetEffectVoiceSet(mapHeader.m_announcerWelcome, announcerVoiceSet); } } } LoudLog("\tSaving"); Combo.Save(flags, mapPath, info); Combo.SaveLooseTextures(flags, Path.Combine(mapPath, "Textures"), info); if (mapHeader.m_7F5B54B2 != 0) // map voice set. not announcer { FindLogic.Combo.Find(info, mapHeader.m_7F5B54B2); } if (announcerVoiceSet != 0) // whole thing in env mode, not here { info.VoiceSets.Remove(announcerVoiceSet); } Combo.SaveAllVoiceSets(flags, Path.Combine(mapPath, "VoiceSets"), info); Combo.SaveAllSoundFiles(flags, Path.Combine(mapPath, "Sound"), info); LoudLog("\tDone"); }