Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
                    }
                }
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
        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));
                    }
                }
            }
        }
Esempio n. 9
0
        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);
                }
            }
        }
Esempio n. 10
0
 private void LoadItemIDFromItemList(fNbt.NbtList itemList)
 {
     LoadIDFromItemList(itemIdList, "\u0002", itemList);
 }
Esempio n. 11
0
 private void LoadBlockIDFromItemList(fNbt.NbtList itemList)
 {
     LoadIDFromItemList(blockIdList, "\u0001", itemList);
 }