private int GetFMLItemID(string filename, string modid, string itemname, FMLItemType itemType) { if (!File.Exists(filename)) { throw new FileNotFoundException("level.datが見つかりません。"); } if (string.Empty == modid || string.Empty == itemname) { return(-1); } string fmlKeyName = ((itemType == FMLItemType.Block) ? "\u0001" : "\u0002") + modid + ":" + itemname; fNbt.NbtFile nbt = new fNbt.NbtFile(filename); fNbt.NbtList idList = fNbt.NbtQuery.Get <fNbt.NbtList>(nbt.RootTag, "//FML/ItemData"); foreach (fNbt.NbtCompound itemData in idList) { if (itemData.Get <fNbt.NbtString>("K").Value == fmlKeyName) { return(itemData.Get <fNbt.NbtInt>("V").Value); } } return(-1); }
public void MargeNBTItemData(fNbt.NbtList itemList) { var newBlockID = GetShiftedBlockIDs(); var newItemID = GetShiftedItemIDs(); foreach (var block in newBlockID) { foreach (fNbt.NbtCompound itemData in itemList) { if (itemData.Get <fNbt.NbtString>("K").Value == ("\u0001" + block.Key)) { itemData.Get <fNbt.NbtInt>("V").Value = block.Value; break; } } } foreach (var item in newItemID) { foreach (fNbt.NbtCompound itemData in itemList) { if (itemData.Get <fNbt.NbtString>("K").Value == ("\u0002" + item.Key)) { itemData.Get <fNbt.NbtInt>("V").Value = item.Value; break; } } } }
private bool CheckModID(string filename, string modid) { if (!File.Exists(filename)) { throw new FileNotFoundException("level.datが見つかりません。"); } if (string.Empty == modid) { return(false); } fNbt.NbtFile nbt = new fNbt.NbtFile(filename); fNbt.NbtList modList = fNbt.NbtQuery.Get <fNbt.NbtList>(nbt.RootTag, "//FML/ModList"); foreach (fNbt.NbtCompound mod in modList) { if (mod.Get <fNbt.NbtString>("ModId").Value == modid) { return(true); } } return(false); }
private void FixPlayerSackData(string nbtFile, string nbtOutputFile, string nbtPath) { fNbt.NbtFile nbt = new fNbt.NbtFile(nbtFile); fNbt.NbtList playerInv = fNbt.NbtQuery.Get <fNbt.NbtList>(nbt.RootTag, nbtPath); foreach (fNbt.NbtCompound item in playerInv) { FixItemSackData(item, int.Parse(itemSackID.Text)); } nbt.SaveToFile(nbtOutputFile, fNbt.NbtCompression.GZip); }
public ModInfo(string modId, fNbt.NbtList itemList) { if (itemList.Name != "ItemData") { throw new ArgumentException("多分FMLのItemDataじゃ無いんですがコレ…"); } this.ModID = (string.IsNullOrWhiteSpace(modId))? "": modId; LoadBlockIDFromItemList(itemList); LoadItemIDFromItemList(itemList); }
private List <fNbt.NbtCompound> GetModListFromNBT(fNbt.NbtCompound rootNbt) { fNbt.NbtList nbtModList = fNbt.NbtQuery.Get <fNbt.NbtList>(levelNbt.RootTag, "//FML/ModList"); // (fNbt.NbtList)rootNbt["FML"]["ModList"]; if (null == nbtModList) { System.Diagnostics.Debug.WriteLine("Not 1.7.x level.dat"); return(null); } List <fNbt.NbtCompound> result = new List <fNbt.NbtCompound>(); foreach (fNbt.NbtCompound modInfo in nbtModList) { result.Add(modInfo); } return(result); }
/// <summary> /// ModInfoクラスの現在の内容でIDが干渉していないか確認する。 /// </summary> /// <param name="checkModInfo">確認したいModInfo</param> /// <param name="modIdList">チェックするModIDリスト</param> /// <param name="originalNBTItemDataList">level.datのItemDataリスト</param> /// <returns>true=干渉無し、false=干渉有り</returns> private bool CheckConflictID(ModInfo checkModInfo, List <string> modIdList, fNbt.NbtList originalNBTItemDataList) { // ID被りチェック try { foreach (string modid in modIdList) { if (modid == checkModInfo.ModID) { continue; } //System.Diagnostics.Debug.WriteLine("CheckConflictID: checkModInfo=" + checkModInfo.ModID + "modid=" + modid); ModInfo mi = new ModInfo(modid, originalNBTItemDataList); //System.Diagnostics.Debug.WriteLine(" " + checkModInfo.GetBlockNumberIDListString() + " // " + mi.GetBlockNumberIDListString()); //System.Diagnostics.Debug.WriteLine(" " + checkModInfo.GetItemNumberIDListString() + " // " + mi.GetItemNumberIDListString()); foreach (int id in checkModInfo.GetShiftedBlockIDs().Values) { if (mi.BlockIDs.Values.Contains(id)) { throw new ApplicationException("ID被ってるよ!"); } } foreach (int id in checkModInfo.GetShiftedBlockIDs().Values) { if (mi.ItemIDs.Values.Contains(id)) { throw new ApplicationException("ID被ってるよ!"); } } } } catch (ApplicationException) { //MessageBox.Show("移動先が別IDと被ってる為ID移動を適用できませんっ"); return(false); } return(true); }
private void chunkConvertWorker_DoWork(object sender, DoWorkEventArgs e) { // 出力先ディレクトリチェック if (Directory.Exists(outputPath.Text)) { DialogResult result = MessageBox.Show("出力先ディレクトリを上書きします。", "確認", MessageBoxButtons.OKCancel); if (result != System.Windows.Forms.DialogResult.OK) { return; } } else { Directory.CreateDirectory(outputPath.Text); } // 総チャンク数をプログレスバーの最大値にセット if (chunkConvertProgressBar.InvokeRequired) { chunkConvertProgressBar.Invoke((Action)(() => { chunkConvertProgressBar.Maximum = int.Parse(chunkCount.Text); inputPath.Enabled = false; inputRef.Enabled = false; outputPath.Enabled = false; outputRef.Enabled = false; startFix.Visible = false; chunkConvertProgressBar.Visible = true; })); } // level.datのPlayerデータを書き換え FixPlayerSackData(inputPath.Text + "\\level.dat", InputToOutputPath(inputPath.Text + "\\level.dat"), "//Data/Player/Inventory"); // Playerフォルダの個別データを書き換え Directory.CreateDirectory(outputPath.Text + "\\players"); foreach (string playerFile in Directory.GetFiles(inputPath.Text + "\\players", "*.dat")) { FixPlayerSackData(playerFile, InputToOutputPath(playerFile), "//Inventory"); } // 処理済みチャンク数 int fixChunkNum = 0; // 袋のID int itemSackId = int.Parse(itemSackID.Text); foreach (string regionDir in Directory.GetDirectories(inputPath.Text, "region")) { // 出力先regionフォルダの作成 Directory.CreateDirectory(InputToOutputPath(regionDir)); foreach (string mcaFile in Directory.GetFiles(regionDir, "*.mca")) { using (RegionFileAccess.RegionFile rf = new RegionFileAccess.RegionFile(mcaFile)) { rf.LoadFile(); for (int i = 0; i < rf.ChunkData.Count; i++) { if (null != rf.ChunkData[i]) { fNbt.NbtCompound nbtRoot = rf.ChunkData[i].GetRootNBT(); #if DEBUG using (StreamWriter sw = new StreamWriter(InputToOutputPath(mcaFile) + "_nbt_" + i + ".txt", false, Encoding.UTF8)) { sw.Write(nbtRoot.ToString()); } #endif // TileEntities差し替え fNbt.NbtList tileEntities = fNbt.NbtQuery.Get <fNbt.NbtList>(nbtRoot, "//Level/TileEntities"); foreach (fNbt.NbtCompound tileEntity in tileEntities) { fNbt.NbtList items; if (tileEntity.TryGet <fNbt.NbtList>("Items", out items)) { foreach (fNbt.NbtCompound item in items) { FixItemSackData(item, itemSackId); } } } // Entities差し替え fNbt.NbtList entities = fNbt.NbtQuery.Get <fNbt.NbtList>(nbtRoot, "//Level/Entities"); foreach (fNbt.NbtCompound entity in entities) { fNbt.NbtList items; // チェストトロッコ等のインベントリ if (entity.TryGet <fNbt.NbtList>("Items", out items)) { foreach (fNbt.NbtCompound item in items) { FixItemSackData(item, itemSackId); } } fNbt.NbtCompound tag; // ドロップアイテム if (entity.TryGet <fNbt.NbtCompound>("Item", out tag)) { FixItemSackData(tag, itemSackId); } } // チャンクデータ更新 rf.ChunkData[i].SetRootNbt(nbtRoot); chunkConvertWorker.ReportProgress(++fixChunkNum); } if (i % 16 == 0) { System.Threading.Thread.Sleep(2); } } rf.SaveFile(InputToOutputPath(mcaFile)); } } } }
private void LoadIDFromItemList(Dictionary <string, int> registList, string header, fNbt.NbtList itemList) { foreach (fNbt.NbtCompound itemData in itemList) { string key = itemData.Get <fNbt.NbtString>("K").Value; if (key.IndexOf(header) == 0 && key.Substring(1).StartsWith(this.ModID)) { registList.Add(key.Substring(1), itemData.Get <fNbt.NbtInt>("V").Value); } } }
private void LoadItemIDFromItemList(fNbt.NbtList itemList) { LoadIDFromItemList(itemIdList, "\u0002", itemList); }
private void LoadBlockIDFromItemList(fNbt.NbtList itemList) { LoadIDFromItemList(blockIdList, "\u0001", itemList); }