/// <summary> /// Saves the currently selected instance in the Area viewer to a /// user-labeled file. /// @note Check that instance is valid before call. /// </summary> /// <param name="iinstance"></param> /// <param name="repo"></param> internal static void SaveInstanceToFile(INWN2Instance iinstance, DirectoryResourceRepository repo = null) { INWN2Blueprint iblueprint = CreateBlueprint(iinstance, repo); if (iblueprint != null) { SaveBlueprintToFile(iblueprint, repo); } }
// NWN2Toolset.NWN2.Views.NWN2BlueprintView.ᐌ(object P_0, EventArgs P_1) // yeah whatever. Those idiots were too clever for anybody's good. /// <summary> /// Saves a specified blueprint to a user-labeled file. /// IMPORTANT: Allow only creature-blueprints to be saved! /// - NWN2ObjectType.Creature /// - resourcetype #2027 /// @note Check that blueprint is valid before call. /// </summary> /// <param name="iblueprint">ElectronPanel_.Blueprint or .Instance /// converted to a blueprint</param> /// <param name="repo">null if Override</param> internal static void SaveBlueprintToFile(INWN2Blueprint iblueprint, DirectoryResourceRepository repo = null) { string fil = iblueprint.Resource.ResRef.Value; string ext = BWResourceTypes.GetFileExtension(iblueprint.Resource.ResourceType); var sfd = new SaveFileDialog(); sfd.Title = "Save blueprint as ..."; sfd.FileName = fil + "." + ext; // iblueprint.Resource.FullName sfd.Filter = "blueprints (*." + ext + ")|*." + ext + "|all files (*.*)|*.*"; // sfd.DefaultExt = ext; string dir; if (repo != null) { dir = repo.DirectoryName; } else { dir = String.Empty; } if (!String.IsNullOrEmpty(dir)) { if (Directory.Exists(dir)) { sfd.InitialDirectory = dir; sfd.RestoreDirectory = true; } } else if (!String.IsNullOrEmpty(CreatureVisualizerPreferences.that.LastSaveDirectory) && Directory.Exists(CreatureVisualizerPreferences.that.LastSaveDirectory)) { sfd.InitialDirectory = CreatureVisualizerPreferences.that.LastSaveDirectory; } // else TODO: use NWN2ResourceManager.Instance.UserOverrideDirectory // else TODO: get BlueprintLocation dir if exists if (sfd.ShowDialog() == DialogResult.OK) { if (String.IsNullOrEmpty(dir)) { CreatureVisualizerPreferences.that.LastSaveDirectory = Path.GetDirectoryName(sfd.FileName); } // NOTE: Add 'AppearanceSEF' back in from the original blueprint // since it was removed when the original was duplicated by // ElectronPanel_.DuplicateBlueprint(). (iblueprint as NWN2CreatureTemplate).AppearanceSEF = AppearanceSEF; IOEISerializable iserializable = iblueprint; if (iserializable != null) { iserializable.OEISerialize(sfd.FileName); if (File.Exists(sfd.FileName)) // test that file exists before proceeding { INWN2BlueprintSet blueprintset; dir = Path.GetDirectoryName(sfd.FileName).ToLower(); if (dir == NWN2ToolsetMainForm.App.Module.Repository.DirectoryName.ToLower()) { repo = NWN2ToolsetMainForm.App.Module.Repository; blueprintset = NWN2ToolsetMainForm.App.Module as INWN2BlueprintSet; iblueprint.BlueprintLocation = NWN2BlueprintLocationType.Module; } else if (NWN2CampaignManager.Instance.ActiveCampaign != null && dir == NWN2CampaignManager.Instance.ActiveCampaign.Repository.DirectoryName.ToLower()) { repo = NWN2CampaignManager.Instance.ActiveCampaign.Repository; blueprintset = NWN2CampaignManager.Instance.ActiveCampaign as INWN2BlueprintSet; iblueprint.BlueprintLocation = NWN2BlueprintLocationType.Campaign; } else if (IsOverride(dir)) { repo = NWN2ResourceManager.Instance.UserOverrideDirectory; blueprintset = NWN2GlobalBlueprintManager.Instance as INWN2BlueprintSet; iblueprint.BlueprintLocation = NWN2BlueprintLocationType.Global; } else { return; } // so, which should be tested for first: resource or blueprint? // and is there even any point in having one w/out the other? string filelabel = Path.GetFileNameWithoutExtension(sfd.FileName); NWN2BlueprintCollection collection = blueprintset.GetBlueprintCollectionForType(NWN2ObjectType.Creature); INWN2Blueprint extantblueprint = NWN2GlobalBlueprintManager.FindBlueprint(NWN2ObjectType.Creature, new OEIResRef(filelabel), iblueprint.BlueprintLocation == NWN2BlueprintLocationType.Global, iblueprint.BlueprintLocation == NWN2BlueprintLocationType.Module, iblueprint.BlueprintLocation == NWN2BlueprintLocationType.Campaign); if (extantblueprint != null && extantblueprint.Resource.Repository is DirectoryResourceRepository) // ie. exclude Data\Templates*.zip { collection.Remove(extantblueprint); // so, does removing a blueprint also remove its resource? no. } IResourceEntry extantresource = repo.FindResource(new OEIResRef(filelabel), 2027); // it's maaaaaagick if (extantresource != null) { repo.Resources.Remove(extantresource); // so, does removing a resource also remove its blueprint? no. } iblueprint.Resource = repo.CreateResource(iblueprint.Resource.ResRef, iblueprint.Resource.ResourceType); collection.Add(iblueprint); var viewer = NWN2ToolsetMainForm.App.BlueprintView; var list = viewer.GetFocusedList(); list.Resort(); var objects = new object[1] { iblueprint as INWN2Object }; viewer.Selection = objects; } } } }
public void Deploy() { Console.WriteLine(""); Console.WriteLine("Deploying JSON"); Console.WriteLine("Loading Module directory " + sModulePath + "..."); DirectoryResourceRepository directoryResourceRepository = new DirectoryResourceRepository(sModulePath); ContentManager contentManager = new ContentManager(sClientPath, sServerPath); NWN2ResourceManager manager = new NWN2ResourceManager(); contentManager.ServerContentItemScanning += (name, status, bBegin) => { if (!bBegin) Console.Write(" -> Staging (" + status.ToString() + ")"); else Console.Write("\nScanning: " + name); }; contentManager.InitializeModule(directoryResourceRepository); contentManager.ResetAllResourcesToDefaultServer(); contentManager.ResetScanResults(); checked { manager.AddRepository(directoryResourceRepository); string sModuleName = Path.GetFileNameWithoutExtension(sModulePath); string sTlkPath = ""; foreach (DownloadableResource d in contentManager.GetDownloadableResources()) { switch (d.Type) { case DownloadableResource.FileType.Hak: string hakPath = sHomePath + "\\hak\\" + d.Name; Console.WriteLine("Adding Hak: " + d.Name); if (File.Exists(hakPath)) manager.AddRepository(new ERFResourceRepository(hakPath)); else Console.WriteLine("ERROR - Hak file not found in " + hakPath); break; case DownloadableResource.FileType.Tlk: sTlkPath = sHomePath + "\\tlk\\" + d.Name; if (File.Exists(sTlkPath)) Console.WriteLine("Found TLK: " + d.Name); else Console.WriteLine("ERROR - Tlk not found in " + sTlkPath); break; } } KeyValuePair<String, ushort>[] resourceTypes = { new KeyValuePair<String, ushort>("creature", ResUTC), new KeyValuePair<String, ushort>("door", ResUTD), new KeyValuePair<String, ushort>("encounter", ResUTE), new KeyValuePair<String, ushort>("item", ResUTI), new KeyValuePair<String, ushort>("store", ResUTM), new KeyValuePair<String, ushort>("placeable", ResUTP), new KeyValuePair<String, ushort>("tree", ResUTR), new KeyValuePair<String, ushort>("sound", ResUTS), new KeyValuePair<String, ushort>("trigger", ResUTT), new KeyValuePair<String, ushort>("waypoint", ResUTW), new KeyValuePair<String, ushort>("light", ResULT), new KeyValuePair<String, ushort>("prefab", ResPFB) }; //ushort[] resourceTypes = { ResUTC, ResUTD, ResUTE, ResUTI, ResUTM, ResUTP, ResUTR, ResUTS, ResUTT, ResUTW, ResULT, ResPFB }; var json = new Newtonsoft.Json.Linq.JObject(); foreach (KeyValuePair<String, ushort> rType in resourceTypes) { var jsonArray = new Newtonsoft.Json.Linq.JArray(); foreach (IResourceEntry resource in manager.FindEntriesByType(rType.Value)) { Console.WriteLine(rType.Key + ": " + resource.FullName); var gff = new OEIShared.IO.GFF.GFFFile(resource.GetStream(false)); if (gff != null) { Newtonsoft.Json.Linq.JObject jsonData = null; jsonData = new Newtonsoft.Json.Linq.JObject(parseGFF(gff)); //Console.WriteLine(jsonData); /* switch (rType.Value) { case ResUTC: var creature = new NWN2Toolset.NWN2.Data.Blueprints.NWN2CreatureBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(creature); break; case ResUTD: var door = new NWN2Toolset.NWN2.Data.Blueprints.NWN2DoorBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(door); break; case ResUTE: var encounter = new NWN2Toolset.NWN2.Data.Blueprints.NWN2EncounterBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(encounter); break; case ResUTI: var item = new NWN2Toolset.NWN2.Data.Blueprints.NWN2ItemBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(item); break; case ResUTM: var store = new NWN2Toolset.NWN2.Data.Blueprints.NWN2StoreBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(store); break; case ResUTP: var placeable = new NWN2Toolset.NWN2.Data.Blueprints.NWN2PlaceableBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(placeable); break; case ResUTR: var tree = new NWN2Toolset.NWN2.Data.Blueprints.NWN2TreeBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(tree); break; case ResUTS: var sound = new NWN2Toolset.NWN2.Data.Blueprints.NWN2SoundBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(sound); break; case ResUTT: var trigger = new NWN2Toolset.NWN2.Data.Blueprints.NWN2TriggerBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(trigger); break; case ResUTW: var waypoint = new NWN2Toolset.NWN2.Data.Blueprints.NWN2WaypointBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(waypoint); break; case ResULT: var light = new NWN2Toolset.NWN2.Data.Blueprints.NWN2LightBlueprint(gff.TopLevelStruct); jsonData = new Newtonsoft.Json.Linq.JObject(light); break; case ResPFB: //blueprint = new NWN2Toolset.NWN2.Data.Blueprints.NWN2BlueprintSet(gff.TopLevelStruct); break; default: break; } */ if (jsonData != null) jsonArray.Add(jsonData); } } if (jsonArray.Count > 0) json.Add(rType.Key,jsonArray); } Console.WriteLine(""); Console.WriteLine("Staging JSON Complete."); Console.WriteLine(""); Console.WriteLine(json); System.IO.File.WriteAllText(@".\nwn2.json", json.ToString()); } }
/// <summary> /// This routine scans module.ifo for a campaign GUID. If found, a /// campaign.cam file with the same GUID is searched for and its /// containing directory is added to the directory resource list. /// </summary> /// <param name="ModuleIfo">Supplies the module.ifo GFF reader.</param> /// <param name="HomeDirectory">Supplies the NWN2 home directory.</param> /// <param name="InstallDirectory">Supplies the NWN2 install directory.</param> private void AddModuleCampaign(GFFFile ModuleIfo, string HomeDirectory, string InstallDirectory) { byte[] GUIDData = ModuleIfo.TopLevelStruct.GetVoidDataSafe("Campaign_ID", null); if (GUIDData == null || GUIDData.Length != 16) return; Guid CampaignGUID = new Guid(GUIDData); string[] SearchDirs = new string[] { HomeDirectory, InstallDirectory }; // // Attempt to locate a campaign.cam file with the same GUID as the // module. // foreach (string PathName in SearchDirs) { string CampaignFolder = String.Format("{0}\\Campaigns", PathName); if (!Directory.Exists(CampaignFolder)) continue; foreach (string CampaignDir in Directory.EnumerateDirectories(CampaignFolder)) { using (DirectoryResourceRepository Repository = new DirectoryResourceRepository(CampaignDir)) { Repository.PopulateRepository(); IResourceEntry ResEntry = Repository.FindResource(new OEIResRef("campaign"), ResCAM); if (ResEntry == null) continue; GFFFile CampaignCAM = new GFFFile(ResEntry.GetStream(false)); GUIDData = CampaignCAM.TopLevelStruct.GetVoidDataSafe("GUID", null); if (GUIDData == null || GUIDData.Length != 16) continue; Guid ID = new Guid(GUIDData); if (!CampaignGUID.Equals(ID)) continue; Repositories.Add(new DirectoryResourceRepository(CampaignDir)); return; } } } }
/// <summary> /// This routine scans module.ifo for a campaign GUID. If found, a /// campaign.cam file with the same GUID is searched for and its /// containing directory is added to the directory resource list. /// </summary> /// <param name="ModuleIfo">Supplies the module.ifo GFF reader.</param> /// <param name="HomeDirectory">Supplies the NWN2 home directory.</param> /// <param name="InstallDirectory">Supplies the NWN2 install directory.</param> private void AddModuleCampaign(GFFFile ModuleIfo, string HomeDirectory, string InstallDirectory) { byte[] GUIDData = ModuleIfo.TopLevelStruct.GetVoidDataSafe("Campaign_ID", null); if (GUIDData == null || GUIDData.Length != 16) { return; } Guid CampaignGUID = new Guid(GUIDData); string[] SearchDirs = new string[] { HomeDirectory, InstallDirectory }; // // Attempt to locate a campaign.cam file with the same GUID as the // module. // foreach (string PathName in SearchDirs) { string CampaignFolder = String.Format("{0}\\Campaigns", PathName); if (!Directory.Exists(CampaignFolder)) { continue; } foreach (string CampaignDir in Directory.EnumerateDirectories(CampaignFolder)) { using (DirectoryResourceRepository Repository = new DirectoryResourceRepository(CampaignDir)) { Repository.PopulateRepository(); IResourceEntry ResEntry = Repository.FindResource(new OEIResRef("campaign"), ResCAM); if (ResEntry == null) { continue; } GFFFile CampaignCAM = new GFFFile(ResEntry.GetStream(false)); GUIDData = CampaignCAM.TopLevelStruct.GetVoidDataSafe("GUID", null); if (GUIDData == null || GUIDData.Length != 16) { continue; } Guid ID = new Guid(GUIDData); if (!CampaignGUID.Equals(ID)) { continue; } Repositories.Add(new DirectoryResourceRepository(CampaignDir)); return; } } } }
private List<DownloadableResource> GetDownloadableResources(DirectoryResourceRepository repo) { var list = new List<DownloadableResource>(); foreach(IResourceEntry r in repo.Resources) { switch(r.ResourceType) { case ResTRx: case ResTRX: case ResGFF: case ResBBX: case ResPFX: case ResSEF: case ResUSC: case ResUEN: var d = new DownloadableResource(sModulePath + "\\" + r.FullName, DownloadableResource.FileType.DirectoryEntry, "0"); list.Add(d); break; default: break; } } return list; }
private bool DeployServer(bool bSkipHaks) { Console.WriteLine(""); Console.WriteLine("Deploying Server"); Console.WriteLine("Loading Module directory " + sModulePath + "..."); DirectoryResourceRepository directoryResourceRepository = new DirectoryResourceRepository(sModulePath); ContentManager contentManager = new ContentManager(sClientPath, sServerPath); NWN2ResourceManager manager = new NWN2ResourceManager(); contentManager.ServerContentItemScanning += (name, status, bBegin) => { if (!bBegin) Console.Write(" -> Staging (" + status.ToString() + ")"); else Console.Write("\nScanning: " + name); }; contentManager.InitializeModule(directoryResourceRepository); contentManager.ResetAllResourcesToDefaultServer(); contentManager.ResetScanResults(); checked { manager.AddRepository(directoryResourceRepository); string sModuleName = Path.GetFileNameWithoutExtension(sModulePath); string sCampaignName = ""; string sTlkPath = ""; foreach (DownloadableResource d in contentManager.GetDownloadableResources()) { switch (d.Type) { case DownloadableResource.FileType.Hak: if (!bSkipHaks) { string hakPath = sHomePath + "\\hak\\" + d.Name; Console.WriteLine("Adding Hak: " + d.Name); if (File.Exists(hakPath)) manager.AddRepository(new ERFResourceRepository(hakPath)); else Console.WriteLine("ERROR - Hak file not found in " + hakPath); } break; case DownloadableResource.FileType.Tlk: sTlkPath = sHomePath + "\\tlk\\" + d.Name; if (File.Exists(sTlkPath)) Console.WriteLine("Found TLK: " + d.Name); else Console.WriteLine("ERROR - Tlk not found in " + sTlkPath); break; } } Console.WriteLine(""); Console.WriteLine("Module Name -> " + sModuleName + "\nModule Path -> " + sModulePath + "\nTlk Path -> " + sTlkPath + "\nSkip Haks -> " + bSkipHaks.ToString()); Console.WriteLine(""); Console.WriteLine("Staging Server Content..."); contentManager.StageServerRequiredResources(manager, sCampaignName, sModuleName, sModulePath, sTlkPath, bSkipHaks); contentManager.SaveModuleList(directoryResourceRepository, true); Console.WriteLine(""); Console.WriteLine("Staging Server Complete."); } return true; }
private bool DeployClient(bool bSkipHaks, bool bSkipMusic) { Console.WriteLine(""); Console.WriteLine("\nDeploying Client"); Console.WriteLine("Loading Module directory " + sModulePath + "..."); DirectoryResourceRepository directoryResourceRepository = new DirectoryResourceRepository(sModulePath); directoryResourceRepository.PopulateRepository(); Console.WriteLine("Initializing Content Manager..."); ContentManager contentManager = new ContentManager(sClientPath, sServerPath); contentManager.ContentItemScanning += (name, status, bBegin) => { if (!bBegin) Console.Write(" -> Staging (" + status.ToString() + ")"); else Console.Write("\nScanning: " + name); }; contentManager.ContentItemCompresssing += (name, nType, progress, size) => { switch(nType) { case ContentManager.NotificationType.BeginCompress: Console.WriteLine("Compressing: " + name); break; case ContentManager.NotificationType.ProgressCompress: break; case ContentManager.NotificationType.EndCompress: break; } }; contentManager.ErrorOccurred += (activity, sResourceName, sErrorMessage) => { Console.WriteLine("ERROR OCCURRED: " + sResourceName + ", e => " + sErrorMessage); }; contentManager.InitializeModule(directoryResourceRepository); contentManager.ResetAllResourcesToDefaultServer(); contentManager.ResetScanResults(); Console.WriteLine("Loading Downloadable Resources..."); contentManager.AddDirectoryRepositoryContents(true, directoryResourceRepository, DownloadableResource.FileType.DirectoryEntry); var moduleDownloadResources = contentManager.GetDownloadableResources(); var downloadableResources = GetDownloadableResources(directoryResourceRepository); foreach (DownloadableResource r in downloadableResources) { if (!moduleDownloadResources.Any(cd => cd.Name.ToLower() == r.Name.ToLower())) contentManager.AddFile(true, r.FullName, r.Type); } foreach (DownloadableResource d in contentManager.GetDownloadableResources()) { switch(d.Type) { case DownloadableResource.FileType.DirectoryEntry: string resPath = sModulePath + "\\" + d.Name; if (File.Exists(resPath)) contentManager.AddFile(true, resPath, d.Type); else d.ResourceStatus = DownloadableResource.Status.Deleted; break; case DownloadableResource.FileType.Hak: //if(!bSkipHaks) //{ string hakPath = sHomePath + "\\hak\\" + d.Name; if (File.Exists(hakPath)) contentManager.AddFile(true, hakPath, d.Type); else d.ResourceStatus = DownloadableResource.Status.Deleted; //} break; case DownloadableResource.FileType.Music: //if(!bSkipMusic) //{ string musicPath = sHomePath + "\\Music\\" + d.Name; if (File.Exists(musicPath)) contentManager.AddFile(true, musicPath, d.Type); else d.ResourceStatus = DownloadableResource.Status.Deleted; //} break; case DownloadableResource.FileType.Tlk: string tlkPath = sHomePath + "\\tlk\\" + d.Name; if (File.Exists(tlkPath)) contentManager.AddFile(true, tlkPath, d.Type); else d.ResourceStatus = DownloadableResource.Status.Deleted; break; default: Console.WriteLine("ERROR - Unsupported file type: " + d.Type.ToString()); break; } } Console.WriteLine("\n"); Console.WriteLine("Staging Client Content..."); contentManager.StageClientRequiredResources(); contentManager.ClearDeletedContent(); contentManager.SaveModuleList(directoryResourceRepository, false); Console.WriteLine(""); Console.WriteLine("Staging Client Complete."); return true; }