/// <summary> /// Setup the content manager so it knows where to find various files. /// </summary> private void Init() { /** Scan system for files **/ var allFiles = new List <string>(); _ScanFiles(BasePath, allFiles); AllFiles = allFiles.ToArray(); PIFFRegistry.Init("Content/Patch/"); Archives = new Dictionary <string, FAR3Archive>(); UIGraphics.Init(); AvatarMeshes.Init(); AvatarBindings.Init(); AvatarTextures.Init(); AvatarSkeletons.Init(); AvatarAppearances.Init(); AvatarOutfits.Init(); AvatarAnimations.Init(); Audio.Init(); AvatarPurchasables.Init(); AvatarHandgroups.Init(); AvatarThumbnails.Init(); InitWorld(); }
/// <summary> /// Gets a resource. /// </summary> /// <param name="filename">The filename of the resource to get.</param> /// <returns>A GameGlobal instance containing the resource.</returns> public GameGlobal Get(string filename) { filename = filename.ToLowerInvariant(); lock (Cache) { if (Cache.ContainsKey(filename)) { return(Cache[filename]); } //if we can't load this let it throw an exception... //probably sanity check this when we add user objects. GameGlobalResource resource = null; if (TS1Provider != null) { var data = TS1Provider.GetEntry( TS1Provider.GetAllEntries().FirstOrDefault(x => x.Key.ToLowerInvariant() == (filename + ".iff").ToLowerInvariant())); if (data != null) { using (var stream = new MemoryStream(data)) { var iff = new IffFile(); iff.Read(stream); iff.InitHash(); iff.SetFilename(filename + ".iff"); resource = new GameGlobalResource(iff, null); } } } else { var iff = new IffFile(Path.Combine(ContentManager.BasePath, "objectdata/globals/" + filename + ".iff")); iff.InitHash(); OTFFile otf = null; try { var rewrite = PIFFRegistry.GetOTFRewrite(filename + ".otf"); otf = new OTFFile(rewrite ?? Path.Combine(ContentManager.BasePath, ("objectdata/globals/" + filename + ".otf"))); } catch (IOException) { //if we can't load an otf, it probably doesn't exist. } resource = new GameGlobalResource(iff, otf); } var item = new GameGlobal { Resource = resource }; Cache.Add(filename, item); return(item); } }
protected override Func <string, GameObjectResource> GenerateResource(GameObjectReference reference) { return((fname) => { /** Better set this up! **/ IffFile sprites = null, iff = null; OTFFile tuning = null; if (reference.Source == GameObjectSource.Far) { iff = this.Iffs.Get(reference.FileName + ".iff"); iff.InitHash(); iff.RuntimeInfo.Path = reference.FileName; if (WithSprites) { sprites = this.Sprites.Get(reference.FileName + ".spf"); } var rewrite = PIFFRegistry.GetOTFRewrite(reference.FileName + ".otf"); try { tuning = (rewrite != null) ? new OTFFile(rewrite) : this.TuningTables.Get(reference.FileName + ".otf"); } catch (Exception) { //if any issues occur loading an otf, just silently ignore it. } } else { iff = new IffFile(reference.FileName); iff.InitHash(); iff.RuntimeInfo.Path = reference.FileName; iff.RuntimeInfo.State = IffRuntimeState.Standalone; } if (iff.RuntimeInfo.State == IffRuntimeState.PIFFPatch) { //OBJDs may have changed due to patch. Remove all file references ResetFile(iff); } iff.RuntimeInfo.UseCase = IffUseCase.Object; if (sprites != null) { sprites.RuntimeInfo.UseCase = IffUseCase.ObjectSprites; } return new GameObjectResource(iff, sprites, tuning, reference.FileName, ContentManager); }); }
public GameObject Get(ulong id) { if (Cache.ContainsKey(id)) { return(Cache[id]); } lock (Cache) { if (!Cache.ContainsKey(id)) { GameObjectReference reference; GameObjectResource resource = null; lock (Entries) { Entries.TryGetValue(id, out reference); if (reference == null) { //Console.WriteLine("Failed to get Object ID: " + id.ToString() + " (no resource)"); return(null); } lock (ProcessedFiles) { //if a file is processed but an object in it is not in the cache, it may have changed. //check for it again! ProcessedFiles.TryGetValue(reference.FileName, out resource); } } if (resource == null) { /** Better set this up! **/ Files.Formats.IFF.IffFile sprites = null, iff = null; OTFFile tuning = null; if (reference.Source == GameObjectSource.Far) { iff = this.Iffs.Get(reference.FileName + ".iff"); iff.RuntimeInfo.Path = reference.FileName; if (WithSprites) { if (reference.EpObject) { sprites = this.Sprites.Get(reference.FileName + ".iff"); } else { sprites = this.Sprites.Get(reference.FileName + ".spf"); } } tuning = this.TuningTables.Get(reference.FileName + ".otf"); } else { iff = new Files.Formats.IFF.IffFile(reference.FileName); iff.RuntimeInfo.Path = reference.FileName; iff.RuntimeInfo.State = IffRuntimeState.Standalone; } if (iff.RuntimeInfo.State == IffRuntimeState.PIFFPatch) { //OBJDs may have changed due to patch. Remove all file references ResetFile(iff); } iff.RuntimeInfo.UseCase = IffUseCase.Object; if (sprites != null) { sprites.RuntimeInfo.UseCase = IffUseCase.ObjectSprites; } resource = new GameObjectResource(iff, sprites, tuning, reference.FileName); lock (ProcessedFiles) { ProcessedFiles.GetOrAdd(reference.FileName, resource); } var piffModified = PIFFRegistry.GetOBJDRewriteNames(); foreach (var name in piffModified) { ProcessedFiles.GetOrAdd(name, GenerateResource(new GameObjectReference(this) { FileName = name.Substring(0, name.Length - 4), Source = GameObjectSource.Far })); } } foreach (var objd in resource.MainIff.List <OBJD>()) { var item = new GameObject { GUID = objd.GUID, OBJ = objd, Resource = resource }; Cache.GetOrAdd(item.GUID, item); } //0x3BAA9787 if (!Cache.ContainsKey(id)) { // Console.WriteLine("Failed to get Object ID: " + id.ToString() + " from resource " + resource.Name); return(null); } return(Cache[id]); } return(Cache[id]); } }
/// <summary> /// Setup the content manager so it knows where to find various files. /// </summary> private void Init() { Inited = true; if (!TS1) { Audio.Init(); } /** Scan system for files **/ if (AllFiles == null) { LoadProgress = ContentLoadingProgress.ScanningFiles; var allFiles = new List <string>(); if (Target != FSOEngineMode.TS1) { _ScanFiles(BasePath, allFiles, BasePath); AllFiles = allFiles.ToArray(); } } var ts1AllFiles = new List <string>(); var oldBase = BasePath; if (TS1) { _ScanFiles(TS1BasePath, ts1AllFiles, TS1BasePath); TS1AllFiles = ts1AllFiles.ToArray(); } LoadProgress = ContentLoadingProgress.InitGlobal; TS1Global?.Init(); LoadProgress = ContentLoadingProgress.InitBCF; BCFGlobal?.Init(); if (!TS1) { PIFFRegistry.Init(Path.Combine(FSOEnvironment.ContentDir, "Patch/")); } else { PIFFRegistry.Init(Path.Combine(FSOEnvironment.ContentDir, "TS1Patch/")); } LoadProgress = ContentLoadingProgress.InitAvatars; _archives = new Dictionary <string, FAR3Archive>(); if (Target != FSOEngineMode.TS1 && Mode == ContentMode.CLIENT) { UIGraphics.Init(); } if (TS1) { ((TS1AvatarTextureProvider)AvatarTextures)?.Init(); ((TS1BMFProvider)AvatarMeshes)?.Init(); Jobs = new TS1JobProvider(TS1Global); Neighborhood = new TS1NeighborhoodProvider(this); } else { if (Mode == ContentMode.CLIENT) { AvatarHandgroups.Init(); } AvatarBindings.Init(); AvatarOutfits.Init(); AvatarPurchasables.Init(); AvatarCollections.Init(); AvatarThumbnails.Init(); ((AvatarTextureProvider)AvatarTextures)?.Init(); ((AvatarAnimationProvider)AvatarAnimations).Init(); ((AvatarSkeletonProvider)AvatarSkeletons).Init(); ((AvatarAppearanceProvider)AvatarAppearances).Init(); ((AvatarMeshProvider)AvatarMeshes)?.Init(); CityMaps.Init(); RackOutfits.Init(); Ini.Init(); } LoadProgress = ContentLoadingProgress.InitAudio; if (TS1) { Audio.Init(); } InitWorld(); }
/// <summary> /// Setup the content manager so it knows where to find various files. /// </summary> private void Init() { /** Scan system for files **/ var allFiles = new List <string>(); _ScanFiles(BasePath, allFiles); AllFiles = allFiles.ToArray(); var ts1AllFiles = new List <string>(); var oldBase = BasePath; if (TS1) { BasePath = TS1BasePath; _ScanFiles(TS1BasePath, ts1AllFiles); BasePath = oldBase; TS1AllFiles = ts1AllFiles.ToArray(); } TS1Global?.Init(); BCFGlobal?.Init(); if (!TS1) { PIFFRegistry.Init(Path.Combine(FSOEnvironment.ContentDir, "Patch/")); } Archives = new Dictionary <string, FAR3Archive>(); if (Mode == ContentMode.CLIENT) { UIGraphics.Init(); AvatarHandgroups.Init(); } AvatarBindings.Init(); AvatarOutfits.Init(); if (TS1) { ((TS1AvatarTextureProvider)AvatarTextures)?.Init(); ((TS1BMFProvider)AvatarMeshes)?.Init(); Jobs = new TS1JobProvider(TS1Global); Neighborhood = new TS1NeighborhoodProvider(this); } else { ((AvatarTextureProvider)AvatarTextures)?.Init(); ((AvatarAnimationProvider)AvatarAnimations).Init(); ((AvatarSkeletonProvider)AvatarSkeletons).Init(); ((AvatarAppearanceProvider)AvatarAppearances).Init(); ((AvatarMeshProvider)AvatarMeshes)?.Init(); } Audio.Init(); AvatarPurchasables.Init(); AvatarCollections.Init(); Ini.Init(); CityMaps.Init(); RackOutfits.Init(); DataDefinition = new TSODataDefinition(); using (var stream = File.OpenRead(GetPath("TSOData_datadefinition.dat"))) { DataDefinition.Read(stream); } AvatarThumbnails.Init(); InitWorld(); }
/// <summary> /// Initiates loading of world objects. /// </summary> public void Init(bool withSprites) { WithSprites = withSprites; Iffs = new FAR1Provider <IffFile>(ContentManager, new IffCodec(), "objectdata/objects/objiff.far"); TuningTables = new FAR1Provider <OTFFile>(ContentManager, new OTFCodec(), new Regex(".*/objotf.*\\.far")); Iffs.Init(); TuningTables.Init(); if (withSprites) { Sprites = new FAR1Provider <IffFile>(ContentManager, new IffCodec(), new Regex(".*/objspf.*\\.far")); Sprites.Init(); } /** Load packingslip **/ Entries = new Dictionary <ulong, GameObjectReference>(); Cache = new TimedReferenceCache <ulong, GameObject>(); var packingslip = new XmlDocument(); packingslip.Load(ContentManager.GetPath("packingslips/objecttable.xml")); var objectInfos = packingslip.GetElementsByTagName("I"); foreach (XmlNode objectInfo in objectInfos) { ulong FileID = Convert.ToUInt32(objectInfo.Attributes["g"].Value, 16); Entries.Add(FileID, new GameObjectReference(this) { ID = FileID, FileName = objectInfo.Attributes["n"].Value, Source = GameObjectSource.Far, Name = objectInfo.Attributes["o"].Value, Group = Convert.ToInt16(objectInfo.Attributes["m"].Value), SubIndex = Convert.ToInt16(objectInfo.Attributes["i"].Value) }); } //init local objects, piff clones //Directory.CreateDirectory(Path.Combine(FSOEnvironment.ContentDir, "Objects")); string[] paths = Directory.GetFiles(Path.Combine(FSOEnvironment.ContentDir, "Objects"), "*.iff", SearchOption.AllDirectories); for (int i = 0; i < paths.Length; i++) { string entry = paths[i]; string filename = Path.GetFileName(entry); IffFile iffFile = new IffFile(entry); var objs = iffFile.List <OBJD>(); if (objs == null) { continue; } foreach (var obj in objs) { Entries.Add(obj.GUID, new GameObjectReference(this) { ID = obj.GUID, FileName = entry, Source = GameObjectSource.Standalone, Name = obj.ChunkLabel, Group = (short)obj.MasterID, SubIndex = obj.SubIndex }); } } var piffModified = PIFFRegistry.GetOBJDRewriteNames(); foreach (var name in piffModified) { ProcessedFiles.GetOrAdd(name, GenerateResource(new GameObjectReference(this) { FileName = name.Substring(0, name.Length - 4), Source = GameObjectSource.Far })); } }