From 27dad0051f00995aa3c399f068314fabd62981df Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Sat, 13 May 2023 13:29:25 +0800 Subject: [PATCH 01/25] Fix Packer searching logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原有的逻辑是先检索语言,再跳过font//textures;由于将检索目标改为了 “仅检索中文文本”,路径中缺失语言部分的字体文件被丢弃了。 这里修复了该问题 --- src/Packer/Extensions/DirectoryExtension.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Packer/Extensions/DirectoryExtension.cs b/src/Packer/Extensions/DirectoryExtension.cs index 007069dea181..0e33fbb39ccf 100644 --- a/src/Packer/Extensions/DirectoryExtension.cs +++ b/src/Packer/Extensions/DirectoryExtension.cs @@ -142,6 +142,12 @@ static IEnumerable FromImmediateDirectory(DirectoryInfo assetDir return null; } + // 跳过非中文文件 + if (!relativePath.IsTargetLang(config)) + { + return null; + } + // 处理正常的语言文件 // TODO:Json5支持 var parsingCategory = file.Extension switch From f02abfc44b1c8ba3ed6c8e83bf6aaedf19dff9a3 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Thu, 22 Jun 2023 22:51:15 +0800 Subject: [PATCH 02/25] Font Update - Phase 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更改版本:1.16-1.19 更改内容: - 将所有附加更改用独立的bitmap加载器和独立的文件挂载 - 将元素符号替换改到了原生拓展平面支持上 - 将省略号移动到U+22ef位点上,用32x字体近似渲染 测试环境:1.18.2 forge w/ mods: - pneumaticcraft-repressurized - compressed-creativity - create - flywheel - jade - patchouli - i18nupdatemod 出于历史性考虑,暂时保留了旧文件。如有需要,可以后续删除。 --- .../minecraft/minecraft/font/default.json | 215 ++++++++++++++++++ .../textures/font/cjk_punctuations.png | Bin 0 -> 3064 bytes .../textures/font/element_ideographs.png | Bin 0 -> 3739 bytes .../minecraft/textures/font/ellipsis.png | Bin 0 -> 2843 bytes .../minecraft/minecraft/font/default.json | 215 ++++++++++++++++++ .../textures/font/cjk_punctuations.png | Bin 0 -> 3064 bytes .../textures/font/element_ideographs.png | Bin 0 -> 3739 bytes .../minecraft/textures/font/ellipsis.png | Bin 0 -> 2843 bytes .../minecraft/minecraft/font/default.json | 215 ++++++++++++++++++ .../textures/font/cjk_punctuations.png | Bin 0 -> 3064 bytes .../textures/font/element_ideographs.png | Bin 0 -> 3739 bytes .../minecraft/textures/font/ellipsis.png | Bin 0 -> 2843 bytes .../minecraft/minecraft/font/default.json | 215 ++++++++++++++++++ .../textures/font/cjk_punctuations.png | Bin 0 -> 3064 bytes .../textures/font/element_ideographs.png | Bin 0 -> 3739 bytes .../minecraft/textures/font/ellipsis.png | Bin 0 -> 2843 bytes .../minecraft/minecraft/font/default.json | 215 ++++++++++++++++++ .../textures/font/cjk_punctuations.png | Bin 0 -> 3064 bytes .../textures/font/element_ideographs.png | Bin 0 -> 3739 bytes .../minecraft/textures/font/ellipsis.png | Bin 0 -> 2843 bytes 20 files changed, 1075 insertions(+) create mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/font/default.json create mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png create mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/element_ideographs.png create mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/ellipsis.png create mode 100644 projects/1.16/assets/minecraft/minecraft/font/default.json create mode 100644 projects/1.16/assets/minecraft/minecraft/textures/font/cjk_punctuations.png create mode 100644 projects/1.16/assets/minecraft/minecraft/textures/font/element_ideographs.png create mode 100644 projects/1.16/assets/minecraft/minecraft/textures/font/ellipsis.png create mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/font/default.json create mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png create mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/element_ideographs.png create mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/ellipsis.png create mode 100644 projects/1.18/assets/minecraft/minecraft/font/default.json create mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/cjk_punctuations.png create mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/element_ideographs.png create mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/ellipsis.png create mode 100644 projects/1.19/assets/minecraft/minecraft/font/default.json create mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/cjk_punctuations.png create mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/element_ideographs.png create mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/ellipsis.png diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json b/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json new file mode 100644 index 000000000000..1d14010120ed --- /dev/null +++ b/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json @@ -0,0 +1,215 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", + "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", + "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a GIT binary patch literal 3064 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 literal 0 HcmV?d00001 diff --git a/projects/1.16/assets/minecraft/minecraft/font/default.json b/projects/1.16/assets/minecraft/minecraft/font/default.json new file mode 100644 index 000000000000..1d14010120ed --- /dev/null +++ b/projects/1.16/assets/minecraft/minecraft/font/default.json @@ -0,0 +1,215 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", + "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", + "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.16/assets/minecraft/minecraft/textures/font/cjk_punctuations.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a GIT binary patch literal 3064 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 literal 0 HcmV?d00001 diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/font/default.json b/projects/1.18-fabric/assets/minecraft/minecraft/font/default.json new file mode 100644 index 000000000000..1d14010120ed --- /dev/null +++ b/projects/1.18-fabric/assets/minecraft/minecraft/font/default.json @@ -0,0 +1,215 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", + "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", + "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a GIT binary patch literal 3064 zcmVKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z0VPR9K~#9!?Ap-^!!QVi;k-cK|8dXm2c^_#wE7PMy9i4fKBCSpNf(1*9qR*|)XjJ6 zytixre>~;_Xec1>`A^Sb-LJ>G>Hz313U5Rf3_F12d}g6|00f}cfUFoi5$!g1}00030{{sNep~22}_VYXd0000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1IS54K~#9!%v#%SBQXfYkza@Z|4#e?>`PN+T>}SWch^!?B@+hB<#4f^s?x_&B4V+D>Viq%Tf}9o6Pc`qfiY8;>7+|2IgcHtqJ)< zm~T2Yf`JlNJ&8DU-v3OQE)GfvK&J}`^yHuSQF)#%(k%Tyt6HLiOcYddwMg-d8%0p2 z-+VSBZ0EUWEKbnN%3*o|CMDSt+^j$?*+y~VBA^k_7HI_VN}$7i%ilN0W>k2V?F(g- zzW~ah!u~Vzub_|<{LSCLE(k9NjYrdDr2$13l2bUzUz|!hqUS|nljU!s*=yJGm%R3b z^RQ8-KR{G_xpbyw2V(h<^MvyD!|<2w0}0HPy2<}BJf8zaSDeYK7Z{jIu@S|~YP+fG zb1|Au=91kago6_P)`@~7jJmyM16I%bZW!y-^Xj{QW2GIf|AIg_+Js$r&-Q8mi|mxi zf!(*xZ7EklMX%^H17UHDb87f-13_fdIr)7W z@ix+`=^e&6N)|@ejZI_*2T@CrZ7){eS8m0va-apF$a!QqptsHghr#&sGgEvQB@1Dv zhXQ^_ALG-C+KeOlCm8&}( ze}SRjiqLVYK^{f=jIvs=2l)lVZAT#DeVT|^O&ZjzzK|%)&J@{*ruk}M#9I$I?rOhg z^!E#JIn%d8kTHrAp{%#Ba(Bd=4@76`^rZvka!Y#EZXadk6r?bTa#Hr{pm&KEK>$uv zp{V@J{Wkwr;gywX_R(QNWt8T%K2b}B^p~xu12+o)3;+Z0!s1!!?Fs+@002ovPDHLk FV1h1#CARKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z07ywhK~#9!?AEaj03ZkeL9loKJzW4B2Qaa~;y$6HxKNQ*HKVZ+%>e)a0001d30P-t tdfsinKzc|3000000J;Gi009600{|g53;#YOj(z|D002ovPDHLkV1g8uUnc+n literal 0 HcmV?d00001 diff --git a/projects/1.18/assets/minecraft/minecraft/font/default.json b/projects/1.18/assets/minecraft/minecraft/font/default.json new file mode 100644 index 000000000000..1d14010120ed --- /dev/null +++ b/projects/1.18/assets/minecraft/minecraft/font/default.json @@ -0,0 +1,215 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", + "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", + "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} diff --git a/projects/1.18/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.18/assets/minecraft/minecraft/textures/font/cjk_punctuations.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a GIT binary patch literal 3064 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 literal 0 HcmV?d00001 diff --git a/projects/1.19/assets/minecraft/minecraft/font/default.json b/projects/1.19/assets/minecraft/minecraft/font/default.json new file mode 100644 index 000000000000..1d14010120ed --- /dev/null +++ b/projects/1.19/assets/minecraft/minecraft/font/default.json @@ -0,0 +1,215 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", + "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", + "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} diff --git a/projects/1.19/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.19/assets/minecraft/minecraft/textures/font/cjk_punctuations.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a GIT binary patch literal 3064 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 literal 0 HcmV?d00001 From 1f9283244d76a053cdb01bda9ac79402bac4fc3b Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:16:56 +0800 Subject: [PATCH 03/25] Font Update - Phase 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Packer的字体部分全面更新,以及杂项更新 - 将字符替换表更改为版本独立 - 同时将配置文件也改为了版本独立,否则太大了 - 修改了时间戳的加法:现在不会干掉原文件了 - 杂项更新,如日志格式 --- .gitignore | 9 +- config/packer.json | 120 ---------------------- config/packer/1.12.2.json | 38 +++++++ config/packer/1.16-fabric.json | 36 +++++++ config/packer/1.16.json | 36 +++++++ config/packer/1.18-fabric.json | 36 +++++++ config/packer/1.18.json | 36 +++++++ config/packer/1.19.json | 42 ++++++++ src/Packer/Extensions/ArchiveExtension.cs | 12 +++ src/Packer/Extensions/ContentExtension.cs | 9 +- src/Packer/Models/Config.cs | 6 +- src/Packer/Program.cs | 9 +- src/Packer/Utils.cs | 37 +++---- 13 files changed, 266 insertions(+), 160 deletions(-) delete mode 100644 config/packer.json create mode 100644 config/packer/1.12.2.json create mode 100644 config/packer/1.16-fabric.json create mode 100644 config/packer/1.16.json create mode 100644 config/packer/1.18-fabric.json create mode 100644 config/packer/1.18.json create mode 100644 config/packer/1.19.json diff --git a/.gitignore b/.gitignore index bc114d1993e9..93c64e02fb82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +# CFPA-specifics +Minecraft-Mod-Language-Package-*.zip +*.md5 +Packer.exe +Packer.xml + + ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## @@ -370,4 +377,4 @@ clrcompression.dll clrjit.dll coreclr.dll mscordaccore.dll -/src/Packer/Properties/launchSettings.json +/src/Packer/Properties/launchSettings.json diff --git a/config/packer.json b/config/packer.json deleted file mode 100644 index 1095f4ecbb2e..000000000000 --- a/config/packer.json +++ /dev/null @@ -1,120 +0,0 @@ -[ - { - "targetVersion": "1.12.2", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.md" - ], - "modNameBlackList": [ - "gregtechce" - ], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ] - }, - { - "targetVersion": "1.16", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.md" - ], - "modNameBlackList": [], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ] - }, - { - "targetVersion": "1.16-fabric", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.md" - ], - "modNameBlackList": [], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ] - }, - { - "targetVersion": "1.18", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.md" - ], - "modNameBlackList": [ - "create" - ], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ] - }, - { - "targetVersion": "1.18-fabric", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.md" - ], - "modNameBlackList": [], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ] - }, - { - "targetVersion": "1.19", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.md" - ], - "modNameBlackList": [ - "0-example-nop", - "0-example-patch", - "0-example-simple-clone", - "0-example-mixed-clone", - "0-example-port" - ], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ] - } -] diff --git a/config/packer/1.12.2.json b/config/packer/1.12.2.json new file mode 100644 index 000000000000..60139af2adca --- /dev/null +++ b/config/packer/1.12.2.json @@ -0,0 +1,38 @@ +{ + "targetVersion": "1.12.2", + "targetLanguage": [ + "zh_cn" + ], + "additionalContent": [ + "LICENSE", + "pack.mcmeta", + "pack.png", + "README.md" + ], + "modNameBlackList": [ + "gregtechce" + ], + "domainBlackList": [], + "noProcessNamespace": [ + "font", + "textures" + ], + "replacementMap": { + "[[钅卢]]": "\ue900", + "[[钅杜]]": "\ue901", + "[[钅喜]]": "\ue902", + "[[钅波]]": "\ue903", + "[[钅黑]]": "\ue904", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ue906", + "[[钅仑]]": "\ue907", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ue90a", + "[[钅立]]": "\ue90c", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef" + } +} \ No newline at end of file diff --git a/config/packer/1.16-fabric.json b/config/packer/1.16-fabric.json new file mode 100644 index 000000000000..2acb8279fa15 --- /dev/null +++ b/config/packer/1.16-fabric.json @@ -0,0 +1,36 @@ +{ + "targetVersion": "1.16-fabric", + "targetLanguage": [ + "zh_cn" + ], + "additionalContent": [ + "LICENSE", + "pack.mcmeta", + "pack.png", + "README.md" + ], + "modNameBlackList": [], + "domainBlackList": [], + "noProcessNamespace": [ + "font", + "textures" + ], + "replacementMap": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef" + } +} \ No newline at end of file diff --git a/config/packer/1.16.json b/config/packer/1.16.json new file mode 100644 index 000000000000..312810789f3c --- /dev/null +++ b/config/packer/1.16.json @@ -0,0 +1,36 @@ +{ + "targetVersion": "1.16", + "targetLanguage": [ + "zh_cn" + ], + "additionalContent": [ + "LICENSE", + "pack.mcmeta", + "pack.png", + "README.md" + ], + "modNameBlackList": [], + "domainBlackList": [], + "noProcessNamespace": [ + "font", + "textures" + ], + "replacementMap": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef" + } +} \ No newline at end of file diff --git a/config/packer/1.18-fabric.json b/config/packer/1.18-fabric.json new file mode 100644 index 000000000000..92e6ab278b42 --- /dev/null +++ b/config/packer/1.18-fabric.json @@ -0,0 +1,36 @@ +{ + "targetVersion": "1.18-fabric", + "targetLanguage": [ + "zh_cn" + ], + "additionalContent": [ + "LICENSE", + "pack.mcmeta", + "pack.png", + "README.md" + ], + "modNameBlackList": [], + "domainBlackList": [], + "noProcessNamespace": [ + "font", + "textures" + ], + "replacementMap": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef" + } +} \ No newline at end of file diff --git a/config/packer/1.18.json b/config/packer/1.18.json new file mode 100644 index 000000000000..c5223a6461f2 --- /dev/null +++ b/config/packer/1.18.json @@ -0,0 +1,36 @@ +{ + "targetVersion": "1.18", + "targetLanguage": [ + "zh_cn" + ], + "additionalContent": [ + "LICENSE", + "pack.mcmeta", + "pack.png", + "README.md" + ], + "modNameBlackList": [], + "domainBlackList": [], + "noProcessNamespace": [ + "font", + "textures" + ], + "replacementMap": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef" + } +} \ No newline at end of file diff --git a/config/packer/1.19.json b/config/packer/1.19.json new file mode 100644 index 000000000000..3de694b6474c --- /dev/null +++ b/config/packer/1.19.json @@ -0,0 +1,42 @@ +{ + "targetVersion": "1.19", + "targetLanguage": [ + "zh_cn" + ], + "additionalContent": [ + "LICENSE", + "pack.mcmeta", + "pack.png", + "README.md" + ], + "modNameBlackList": [ + "0-example-nop", + "0-example-patch", + "0-example-simple-clone", + "0-example-mixed-clone", + "0-example-port" + ], + "domainBlackList": [], + "noProcessNamespace": [ + "font", + "textures" + ], + "replacementMap": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef" + } +} \ No newline at end of file diff --git a/src/Packer/Extensions/ArchiveExtension.cs b/src/Packer/Extensions/ArchiveExtension.cs index ead7c752da90..a8f373f02bcb 100644 --- a/src/Packer/Extensions/ArchiveExtension.cs +++ b/src/Packer/Extensions/ArchiveExtension.cs @@ -46,6 +46,18 @@ public static void Initialize(this ZipArchive archive, Config config) var destination = path.StripModName() // 除掉一层文件夹(在 assets/ 里的各种 fix) .NormalizePath(); Log.Information("初始化压缩包:添加 {0}", destination); + + // pack.mcmeta 特殊处理:添加时间戳 + if(destination == "pack.mcmeta") + { + using var writer = new StreamWriter( + archive.CreateEntry(destination) + .Open()); + + writer.Write(Utils.AppendTimestamp($"{commonPrefix}/{path}")); + return; + } + archive.CreateEntryFromFile($"{commonPrefix}/{path}", destination); }); diff --git a/src/Packer/Extensions/ContentExtension.cs b/src/Packer/Extensions/ContentExtension.cs index 7273453dacd0..97b53a91ff79 100644 --- a/src/Packer/Extensions/ContentExtension.cs +++ b/src/Packer/Extensions/ContentExtension.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Security.Cryptography; using System.Text.RegularExpressions; +using System.Text.Encodings.Web; namespace Packer.Extensions { @@ -49,17 +50,19 @@ public static string Preprocess(this string content, FileCategory category, Conf // 特殊符号替换 foreach (var mapping in config.CharatcerReplacement) { + var escaped = JavaScriptEncoder.Default.Encode(mapping.Value); if (content.Contains(mapping.Key)) { - Log.Information("正在进行特殊符号替换:{0} -> {1}", mapping.Key, mapping.Value); + Log.Information("正在进行特殊符号替换:{0} -> {1}", mapping.Key, escaped); } + if ((category & FileCategory.JsonAlike) == FileCategory.JsonAlike) { // 替换为 unicode 转义码 - content = content.Replace(mapping.Key, mapping.Value); + content = content.Replace(mapping.Key, escaped); } else { // 替换为 unicode 字符 - content = content.Replace(mapping.Key, Regex.Unescape(mapping.Value)); + content = content.Replace(mapping.Key, mapping.Value); } } diff --git a/src/Packer/Models/Config.cs b/src/Packer/Models/Config.cs index 1b1de808ca98..2b5fc311abf9 100644 --- a/src/Packer/Models/Config.cs +++ b/src/Packer/Models/Config.cs @@ -17,7 +17,6 @@ public class Config /// /// 打包的目标语言

- /// 为1.20准备,因为据说语言文件名要改 ///
[JsonPropertyName("targetLanguage")] public string[] TargetLanguages { get; set; } @@ -52,8 +51,9 @@ public class Config public List BypassedNamespace { get; set; } /// - /// 字符替换表,从外源加载 + /// 字符替换表,版本限定 /// - public Dictionary CharatcerReplacement { get; set; } // 该项似乎无法通过 json 初始化 + [JsonPropertyName("replacementMap")] + public Dictionary CharatcerReplacement { get; set; } } } diff --git a/src/Packer/Program.cs b/src/Packer/Program.cs index e6b53d3e90ac..0b598b35ea89 100644 --- a/src/Packer/Program.cs +++ b/src/Packer/Program.cs @@ -23,21 +23,14 @@ public static async Task Main(string version = null) throw new ArgumentNullException(nameof(version)); } - var config = await Utils.RetrieveConfig(configPath: "./config/packer.json", - mappingPath: "./config/fontmap.txt", + var config = await Utils.RetrieveConfig(configTemplate: "./config/packer/{0}.json", version: version); - if (config is null) - { - throw new ArgumentException("无效的版本参数", nameof(version)); - } - // Packer输出的文件名,可以随时更改 string packName = $"./Minecraft-Mod-Language-Package-{config.Version}.zip"; Log.Information("开始对版本 {0} 的打包", config.Version); - Utils.CreateTimeStamp(config.Version); await using var stream = File.Create(packName); var archive = new ZipArchive(stream, ZipArchiveMode.Update, leaveOpen: true); archive.Initialize(config); diff --git a/src/Packer/Utils.cs b/src/Packer/Utils.cs index dd928d9f4d00..34c3b732b4e4 100644 --- a/src/Packer/Utils.cs +++ b/src/Packer/Utils.cs @@ -14,14 +14,16 @@ namespace Packer { static class Utils { - public static async Task RetrieveConfig(string configPath, string mappingPath, string version) + public static async Task RetrieveConfig(string configTemplate, string version) { - Log.Information("正在获取配置"); + Log.Information("正在获取配置。目标版本:{0}", version); + + var configPath = string.Format(configTemplate, version); + + Log.Information("配置位置:{0}", configPath); + var reader = await File.ReadAllBytesAsync(configPath); - var configs = JsonSerializer.Deserialize>(reader); - var replacement = await ReadReplaceFontMap(mappingPath); - configs.ForEach(_ => _.CharatcerReplacement = replacement); - return configs.Where(_ => _.Version == version).FirstOrDefault(); // 仅选取指定版本,忽略重复 + return JsonSerializer.Deserialize(reader); } public static PackerStrategy RetrieveStrategy(FileInfo file) @@ -83,34 +85,19 @@ public static IEnumerable PortFiles(IEnumerable return mapping.Values; } - public static async Task> ReadReplaceFontMap(string path) // 从隔壁弄过来改了一下,就放这里了 - { - var mapping = new Dictionary(); - foreach (string str in await File.ReadAllLinesAsync(path)) - { - var kv = str.Split('>', StringSplitOptions.TrimEntries); - var key = kv[0]; - var value = kv[1]; - Log.Verbose("添加了映射:{0} -> {1}", key, value); - mapping.Add(key, value); - } - return mapping; - } - // 下面的这些...其实都不是我写的... - public static void CreateTimeStamp(string version) + public static string AppendTimestamp(string path) { - var mcmeta = $"./projects/{version}/pack.mcmeta"; + var mcmeta = path; var meta = JsonSerializer.Deserialize(File.ReadAllText(mcmeta)); - var time = DateTime.UtcNow.AddHours(8); + var time = DateTime.UtcNow.AddHours(8); // UTC+8:00 meta.Pack.Description += $"\n打包时间:{time:yyyy-MM-ddTHH:mm:ssZ}"; - var result = JsonSerializer.Serialize(meta, new JsonSerializerOptions() + return JsonSerializer.Serialize(meta, new JsonSerializerOptions() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, WriteIndented = true }); - File.WriteAllText(mcmeta, result); } } } From 1fd01ab0f05be3df145f9fbf96e8c82e8d85122a Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:30:05 +0800 Subject: [PATCH 04/25] Font Update - Phase 3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更改版本:1.12 使用16x的unifont加载器加载省略号。显示效果大致可以。 测试版本: 1.12.2 forge w/ mods: - pneumaticcraft-repressurized - patchouli - opencomputers - jei etc. --- CONTRIBUTING.md | 13 +++++++++---- config/fontmap.txt | 15 --------------- .../1UNKNOWN/minecraft/font/glyph_sizes.bin | Bin 65536 -> 65536 bytes .../textures/font/unicode_page_22.png | Bin 0 -> 5915 bytes 4 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 config/fontmap.txt create mode 100644 projects/1.12.2/assets/1UNKNOWN/minecraft/textures/font/unicode_page_22.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d76ea8587ef0..5f896d546325 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,7 +46,7 @@ - 如果上传的文件中包含_**非文本文件**_(如`.ttf`等字体文件,`.jpg`等图片),**有可能需要修改[Packer配置](./CONTRIBUTING.md#configpackerjson)**。 - 如果这些文件放置在`font`/`textures`中,一般不用修改配置;默认已经对这两处进行了特殊处理。 - 当然,如果实在弄不清楚怎么改,也可以让我们代劳。 -- 如果涉及到Packer的文件检索模式,请参照[这里](./Packer-Index-Doc.md) +- 如果涉及到多版本翻译,可以考虑使用**Packer的非标准文件检索模式**。请参照[这里](./Packer-Index-Doc.md)。 有关**审查**(Review)的说明: @@ -122,9 +122,9 @@ - 请不要在**未经同意**的情况下修改默认爬取数量。 -### config/packer.json +### config/packer/[version].json -该文件内放置了**所有**正在维护的版本的打包配置。 +该文件夹内放置了**所有**正在维护的版本的打包配置。 最好不要随意*删去*内容,除非你知道它曾经是干什么的,现在为什么不需要了。 *加入*内容相对而言宽松一些,但最好还是说明理由。 @@ -132,7 +132,12 @@ 主要的更改场景: - 增加新翻译版本 - - 需要将所有项填写一遍,同时需要更新`.github/workflows/packer.yml`、`.github/workflows/pr-packer.yml`、`.github\boring-cyborg.yml`,以及CFPABot等相关服务。没有规划最好不要乱动。 + - 需要在新文件`.json`将所有项填写一遍,同时需要创建正确的文件结构、基础文件,更新`.github/workflows/packer.yml`、`.github/workflows/pr-packer.yml`、`.github\boring-cyborg.yml`,以及CFPABot等相关服务。没有规划最好不要乱动。 +- 从资源包中移除某模组,但保留原文件 + - 将此模组的`curseforge项目名`加入`modNameBlackList`。 +- 更改字符替换表 + - 对`replacementMap`进行修改,格式与已有文本一致。Unicode BMP以外的字符使用UTF-16代理对输入,否则可能无法识别。 + - 同时可能需要修改字体文件。 - 处理非文本文件 1. 如果该文件所在的`namespace`(`asset-domain`下方的一级)对**任何模组都**不会有文本文件(如font\),将该`namespace`加入对应版本的`noProcessNamespace`中 2. 否则,将该模组的`curseforge项目名`或`asset-domain`中的一个(具体选哪一个看具体情况)加入`modNameBlackList`或`domainBlackList`(对应), diff --git a/config/fontmap.txt b/config/fontmap.txt deleted file mode 100644 index a761b5bc471a..000000000000 --- a/config/fontmap.txt +++ /dev/null @@ -1,15 +0,0 @@ -[[钅卢]]>\ue900 -[[钅杜]]>\ue901 -[[钅喜]]>\ue902 -[[钅波]]>\ue903 -[[钅黑]]>\ue904 -[[钅麦]]>\u9fcf -[[钅达]]>\ue906 -[[钅仑]]>\ue907 -[[钅哥]]>\u9fd4 -[[钅尔]]>\u9fed -[[钅夫]]>\ue90a -[[钅立]]>\ue90c -[[石田]]>\u9fec -[[奥气]]>\u9feb -[[气奥]]>\u9feb diff --git a/projects/1.12.2/assets/1UNKNOWN/minecraft/font/glyph_sizes.bin b/projects/1.12.2/assets/1UNKNOWN/minecraft/font/glyph_sizes.bin index 0503133d08effbe3da2c993864b97aad1fb1207d..2e1e01a11de79cf0ac0b0eb1a7d919e72223eb2c 100644 GIT binary patch delta 16 XcmZo@U}|CC4svDHO>Z% delta 16 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 xc|T_du+JSg4> Date: Fri, 23 Jun 2023 13:46:27 +0800 Subject: [PATCH 05/25] Post-Job Cleanup --- .../minecraft/textures/font/unicode_page_20.png | Bin 2207 -> 0 bytes .../minecraft/textures/font/unicode_page_9f.png | Bin 4971 -> 0 bytes .../minecraft/textures/font/unicode_page_e9.png | Bin 2847 -> 0 bytes .../minecraft/textures/font/unicode_page_20.png | Bin 2207 -> 0 bytes .../minecraft/textures/font/unicode_page_9f.png | Bin 4971 -> 0 bytes .../minecraft/textures/font/unicode_page_e9.png | Bin 2847 -> 0 bytes .../minecraft/textures/font/unicode_page_20.png | Bin 2207 -> 0 bytes .../minecraft/textures/font/unicode_page_9f.png | Bin 4971 -> 0 bytes .../minecraft/textures/font/unicode_page_e9.png | Bin 2847 -> 0 bytes .../minecraft/textures/font/unicode_page_20.png | Bin 2207 -> 0 bytes .../minecraft/textures/font/unicode_page_9f.png | Bin 4971 -> 0 bytes .../minecraft/textures/font/unicode_page_e9.png | Bin 2847 -> 0 bytes .../minecraft/textures/font/unicode_page_20.png | Bin 2207 -> 0 bytes .../minecraft/textures/font/unicode_page_9f.png | Bin 4971 -> 0 bytes .../minecraft/textures/font/unicode_page_e9.png | Bin 2847 -> 0 bytes 15 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_20.png delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_9f.png delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_e9.png delete mode 100644 projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_20.png delete mode 100644 projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_9f.png delete mode 100644 projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_e9.png delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_20.png delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_9f.png delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_e9.png delete mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_20.png delete mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_9f.png delete mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_e9.png delete mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_20.png delete mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_9f.png delete mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_e9.png diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_20.png b/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_20.png deleted file mode 100644 index 8fc8524241c70058fc73952919cd21e6080156c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2207 zcmV;Q2w?Y#P)z_pt`e$LyS#yU~bM@TL_)ejcbKa$rN{$r{Yfov}pJ&JNV@JobW0NpxXxgMP zsZoC18nHw*SIt!>DiaO-m=mNRAJ`d}6O_xpT>XbQax8N!dn~Kv@rsOw3P1`c$0$Eu z9jOXy)|&NgaB_{D<2jz}*l^{OrBC|y;zyYS8Brfi&em5@;9g|4Sl+@Vk63K+~pn zP`!-bRszt^$a@1!Fku?=6tdq@6G=c*eb4s-{;5>wRvZXYAHYAg)mb@7p?7}h2&xpH zA0#xo>U(0c5mRuzb|Jj}%4euh?E>VFr$;M^RxaqR@mVww~Auy^z(on}H1n6^uatDurPfWQU?EWknnuon8E7YO{I6i&yQu;W1N za=6uXruPEnt}~OS!Tt#cYXC5yJ__7{*YNl%Tu267cCm>=M2!wZ9bQZVbOoG;Yf6a$ za*4x$0bAVB0BHI^gCQUIGrZXWWB^EPTe6WgY+xBnF0c)2p$#TpO$s&xGYkQbk|6VF zPL2YO0vbNx!0&)20NI(NWk-Q+kgQ-R1zvB2h_97oMn(!lm(hz<$&9BabuY@+xsZ{qH6l*(Ma$VYr$kRNKQ%IWa~J})S4-br;7J})S4;y~aBypal>u}Hqli_jU( zGL3RCy~;uK^hJ)NR0N1s`q?b+Mi3OnQNLi-VKoc125a8lE1 z-3kTVWfY6~+F|XmMhdta0MCmkc;3!9phoq9YEES22`7(h@Ir#Z5$%X3tgp8B@aisw zopI;g_9O16Rt{}=S}DBnlayXu&z;$e+fbja&%XcQ`wyD4=B&uPcEX`vL~Y0xv&Dn* zpv)9AIGWz}p1s}dQfSOI=FU8P=HZSXvQq0($jiJu=pFPjG9yu;lr#2ZmnY3pbM(rW zSH7fgwZAx-J{I9hAq2kV{Y7x&IZ(m)rcbcGbU1iLuvBjG&aoSdQstCB!&I=#MM6tU>(+Z zak8EUl!3CIx?mFy1DgqJ2L+h8S}9{x&7?PBFp%2BifSSixWT>9(|eIp{@nv^2+)qA zfxFE+_*}H$EUt_#23lzN6rKqKW7@*Nw;6a7E;CT!ZG^-#1XhtH;3a%~oP)n3@LN=< zVI>3Saam{J=`{QeB`@Iaa|$oH#yf;N1S}(P5hZN|s_=Vw8IP~y;;jZHbRGj|v1L+N z<7*f3_&PQ^gDccK@HX}0EHC$Im-;XKEWvdKXalg0s<>l)6@LyR@CE~G9e|8v-~w7- zLo5D>_7h;C$~&r?*hC$#Z6NR$2HwVO@g9jBCDG&oW8tI$<{)6;Xm$ZJk;Q%@p!WwF z$e0-RX3Dx4=SdwMv&qL4KrrB@1GG022rMT9w>dOuhn@noFrF@A_02S(iojAog%1^A zq#5}UH=(C@^HT(_VRfpb=q9uIr=1KqgMh@+`@nqw{5L5*Kv1~CQ(5%c*Dg*Cc_4zq zC7eX3`Q;&{Dl9;&WVmio1cfEojVKUsvuU`FA^f%hUW9tghMF{7SyOp?w=3ix9w=VZ6G;s>|S5igSa1BQge;l)}^1tB&_$U9Gw93|`)uV8fb3`F- zLz8nK8~lbMy$Jl!o4Wjvlp>x?POZ|^kX!5nw2Sl_LC_}7?^QA;+C{SY>ah1Don9S^ z2bpMf35L6T*R7=hZ(tA+;MjHq2>%lj zD-L>HUs~N=zJdEwSEo_fHEwjqM*PP06{HLmWK`kT7On)X#cJ!;68r%ii-zhy!xua8 zAqsh4q1j4NDF4E@VXORc#D-g;4aT2*1>2F4UidE*={69xbpp=qtGT@Z-AL$38i~?w z9GF%a#{yt#=;|;H6GYZ%4sU538qMzET~y!x`%biB6Z$9790W`c0tPA!v|&K~x1sRO hU(0`U8@>m?e*u@9Wts}wKOg`A002ovPDHLkV1k2(8BzcM diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_9f.png b/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_9f.png deleted file mode 100644 index cee8a138a6d5a2b488697e0c48cfd5dbd88a0ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4971 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 diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_e9.png b/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/unicode_page_e9.png deleted file mode 100644 index e0762efe5e75aa57aedb2e33b9c8237f5196a36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2847 zcmeHJdrTBZ99~pRMHCz36U6Om+FHAJyL<1A2U-pa))ZhsHNIl{SJO={J2U(J z9^dcx&CGq4l=$wbkjWtkf{aRtH!MJqAUF&{UKt8s8G9C+;A?o&JX5UK|9p_&l?hjd zNDC4ddXd&6#9TNV;fPNW5oF|8-!BN+x@{t~DdtU!rNzd1G%MI-3@4a@%w=;xG=j{E zb~zX}14yVDSb4i1Yp<-vP@dCc$tojZbi{ykK0eP07Um_I*t`r@$6?V?=qwiv9oT@x zpe|dcU8G%l%bFsf zAa!y=D<>5=LDGbpR%y_I2ZPa^oP}Osh#QCnXL>AMk{q;Lo|BU!%TdS#r&UhsbkGMS zrzjjEa52{|F)rLLP8;-K03z$;9TG3tQJ+V~EM!S~3})I-!R83KwTlB~f(4Vi7>Asc z5k5+OAjbx9jx1-UKRCzAK_;*PyCgy^8NfQy1xXOog{QaoM zQHsrmGzJRtM6_tibpZJSAPQMd7Q|-5G^hF4IOrHBU?jn55`@gbMkNiVj8c#Z`erh3 z=Y$+_#zO|cz(_!kQ3OTe1ZVEh?2t$>JoZQR1XhX~7weVsXaI0wvHeYL!_zXm1eMEMI2_?Kx<#wGe8J zPQ&30t5V=BrQ~oO1t33`GHW=UR;9FP2JPoNdAPHf%$N4#+iyNe(DA$oo0U7TBNl?? z1EWkH^{aqpSf9G}80%{*;IM&Z{s|R$F$Vo^bJ78H`iyq>!$iR%hNV{x@wslm;F;BeBc<4B5AGeBn0g3Jv~L)= z8{i~xy8t_^lM~(@bo=yi2r?`(!7#_<+IFYp`;wj7F*UpM?s==1tU$s;wWEIj;#}lc zF*nZrfDX&9U01$t_03Y-0fjp{yrbZOoB6qOv**Z0O-E05qx-cCk0NVVEBkuqk9S|~ zX^SXbedl;%1HCk^cV*?@wVm9!O`G1oNJW%?k{ZjMFSxq3xayEMywp>l^45}uqBV!k zlzf?%;Jwt^H8t%1pKB>Y-`upio20_O|1v4hyU8q9>rgN zZNiP;t~>DJTNyPKE34{K>MmH{tFSM1?`>P!wDbHvPvWYU`#pWh`Nz7J9WmCgDbL<@ zZc*`x^X}BF)P|yEVRJ_})itiSUOCprdDnstG2*BFh5A3TJ3M_|jmg*SLzeC+^z>bw zRNpnCx2neN5ms9IZk^_n4?jq?+&sJw#MzsUhSsiA-xhBk*y)X))_rv2Tu!W< zQhD*0zI<_F+VCBhqFl>eHD6E3?}>>1baPnm#ya=<=C;lYGfMS)k2D8I-V;@Q2e&52 zaoxfD8|pkErUT8Z)KRiUdwN!!;PYFL_7-~ULZWZi?hm{1&HTe;<)novDPvE1a+*Ky zJK9^Fxa!1x&x)GtmbQb{)phmb%Wbo(3kvo|1z-Gjw3lygpXqMxY?!co%eK9>TZE3@ zTH3K9FCKjmSs#=hG+l?vvAfe^C=+6Ak;``RL<+0EG$tK>z>% diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_20.png b/projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_20.png deleted file mode 100644 index 8fc8524241c70058fc73952919cd21e6080156c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2207 zcmV;Q2w?Y#P)z_pt`e$LyS#yU~bM@TL_)ejcbKa$rN{$r{Yfov}pJ&JNV@JobW0NpxXxgMP zsZoC18nHw*SIt!>DiaO-m=mNRAJ`d}6O_xpT>XbQax8N!dn~Kv@rsOw3P1`c$0$Eu z9jOXy)|&NgaB_{D<2jz}*l^{OrBC|y;zyYS8Brfi&em5@;9g|4Sl+@Vk63K+~pn zP`!-bRszt^$a@1!Fku?=6tdq@6G=c*eb4s-{;5>wRvZXYAHYAg)mb@7p?7}h2&xpH zA0#xo>U(0c5mRuzb|Jj}%4euh?E>VFr$;M^RxaqR@mVww~Auy^z(on}H1n6^uatDurPfWQU?EWknnuon8E7YO{I6i&yQu;W1N za=6uXruPEnt}~OS!Tt#cYXC5yJ__7{*YNl%Tu267cCm>=M2!wZ9bQZVbOoG;Yf6a$ za*4x$0bAVB0BHI^gCQUIGrZXWWB^EPTe6WgY+xBnF0c)2p$#TpO$s&xGYkQbk|6VF zPL2YO0vbNx!0&)20NI(NWk-Q+kgQ-R1zvB2h_97oMn(!lm(hz<$&9BabuY@+xsZ{qH6l*(Ma$VYr$kRNKQ%IWa~J})S4-br;7J})S4;y~aBypal>u}Hqli_jU( zGL3RCy~;uK^hJ)NR0N1s`q?b+Mi3OnQNLi-VKoc125a8lE1 z-3kTVWfY6~+F|XmMhdta0MCmkc;3!9phoq9YEES22`7(h@Ir#Z5$%X3tgp8B@aisw zopI;g_9O16Rt{}=S}DBnlayXu&z;$e+fbja&%XcQ`wyD4=B&uPcEX`vL~Y0xv&Dn* zpv)9AIGWz}p1s}dQfSOI=FU8P=HZSXvQq0($jiJu=pFPjG9yu;lr#2ZmnY3pbM(rW zSH7fgwZAx-J{I9hAq2kV{Y7x&IZ(m)rcbcGbU1iLuvBjG&aoSdQstCB!&I=#MM6tU>(+Z zak8EUl!3CIx?mFy1DgqJ2L+h8S}9{x&7?PBFp%2BifSSixWT>9(|eIp{@nv^2+)qA zfxFE+_*}H$EUt_#23lzN6rKqKW7@*Nw;6a7E;CT!ZG^-#1XhtH;3a%~oP)n3@LN=< zVI>3Saam{J=`{QeB`@Iaa|$oH#yf;N1S}(P5hZN|s_=Vw8IP~y;;jZHbRGj|v1L+N z<7*f3_&PQ^gDccK@HX}0EHC$Im-;XKEWvdKXalg0s<>l)6@LyR@CE~G9e|8v-~w7- zLo5D>_7h;C$~&r?*hC$#Z6NR$2HwVO@g9jBCDG&oW8tI$<{)6;Xm$ZJk;Q%@p!WwF z$e0-RX3Dx4=SdwMv&qL4KrrB@1GG022rMT9w>dOuhn@noFrF@A_02S(iojAog%1^A zq#5}UH=(C@^HT(_VRfpb=q9uIr=1KqgMh@+`@nqw{5L5*Kv1~CQ(5%c*Dg*Cc_4zq zC7eX3`Q;&{Dl9;&WVmio1cfEojVKUsvuU`FA^f%hUW9tghMF{7SyOp?w=3ix9w=VZ6G;s>|S5igSa1BQge;l)}^1tB&_$U9Gw93|`)uV8fb3`F- zLz8nK8~lbMy$Jl!o4Wjvlp>x?POZ|^kX!5nw2Sl_LC_}7?^QA;+C{SY>ah1Don9S^ z2bpMf35L6T*R7=hZ(tA+;MjHq2>%lj zD-L>HUs~N=zJdEwSEo_fHEwjqM*PP06{HLmWK`kT7On)X#cJ!;68r%ii-zhy!xua8 zAqsh4q1j4NDF4E@VXORc#D-g;4aT2*1>2F4UidE*={69xbpp=qtGT@Z-AL$38i~?w z9GF%a#{yt#=;|;H6GYZ%4sU538qMzET~y!x`%biB6Z$9790W`c0tPA!v|&K~x1sRO hU(0`U8@>m?e*u@9Wts}wKOg`A002ovPDHLkV1k2(8BzcM diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_9f.png b/projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_9f.png deleted file mode 100644 index cee8a138a6d5a2b488697e0c48cfd5dbd88a0ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4971 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 diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_e9.png b/projects/1.16/assets/minecraft/minecraft/textures/font/unicode_page_e9.png deleted file mode 100644 index e0762efe5e75aa57aedb2e33b9c8237f5196a36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2847 zcmeHJdrTBZ99~pRMHCz36U6Om+FHAJyL<1A2U-pa))ZhsHNIl{SJO={J2U(J z9^dcx&CGq4l=$wbkjWtkf{aRtH!MJqAUF&{UKt8s8G9C+;A?o&JX5UK|9p_&l?hjd zNDC4ddXd&6#9TNV;fPNW5oF|8-!BN+x@{t~DdtU!rNzd1G%MI-3@4a@%w=;xG=j{E zb~zX}14yVDSb4i1Yp<-vP@dCc$tojZbi{ykK0eP07Um_I*t`r@$6?V?=qwiv9oT@x zpe|dcU8G%l%bFsf zAa!y=D<>5=LDGbpR%y_I2ZPa^oP}Osh#QCnXL>AMk{q;Lo|BU!%TdS#r&UhsbkGMS zrzjjEa52{|F)rLLP8;-K03z$;9TG3tQJ+V~EM!S~3})I-!R83KwTlB~f(4Vi7>Asc z5k5+OAjbx9jx1-UKRCzAK_;*PyCgy^8NfQy1xXOog{QaoM zQHsrmGzJRtM6_tibpZJSAPQMd7Q|-5G^hF4IOrHBU?jn55`@gbMkNiVj8c#Z`erh3 z=Y$+_#zO|cz(_!kQ3OTe1ZVEh?2t$>JoZQR1XhX~7weVsXaI0wvHeYL!_zXm1eMEMI2_?Kx<#wGe8J zPQ&30t5V=BrQ~oO1t33`GHW=UR;9FP2JPoNdAPHf%$N4#+iyNe(DA$oo0U7TBNl?? z1EWkH^{aqpSf9G}80%{*;IM&Z{s|R$F$Vo^bJ78H`iyq>!$iR%hNV{x@wslm;F;BeBc<4B5AGeBn0g3Jv~L)= z8{i~xy8t_^lM~(@bo=yi2r?`(!7#_<+IFYp`;wj7F*UpM?s==1tU$s;wWEIj;#}lc zF*nZrfDX&9U01$t_03Y-0fjp{yrbZOoB6qOv**Z0O-E05qx-cCk0NVVEBkuqk9S|~ zX^SXbedl;%1HCk^cV*?@wVm9!O`G1oNJW%?k{ZjMFSxq3xayEMywp>l^45}uqBV!k zlzf?%;Jwt^H8t%1pKB>Y-`upio20_O|1v4hyU8q9>rgN zZNiP;t~>DJTNyPKE34{K>MmH{tFSM1?`>P!wDbHvPvWYU`#pWh`Nz7J9WmCgDbL<@ zZc*`x^X}BF)P|yEVRJ_})itiSUOCprdDnstG2*BFh5A3TJ3M_|jmg*SLzeC+^z>bw zRNpnCx2neN5ms9IZk^_n4?jq?+&sJw#MzsUhSsiA-xhBk*y)X))_rv2Tu!W< zQhD*0zI<_F+VCBhqFl>eHD6E3?}>>1baPnm#ya=<=C;lYGfMS)k2D8I-V;@Q2e&52 zaoxfD8|pkErUT8Z)KRiUdwN!!;PYFL_7-~ULZWZi?hm{1&HTe;<)novDPvE1a+*Ky zJK9^Fxa!1x&x)GtmbQb{)phmb%Wbo(3kvo|1z-Gjw3lygpXqMxY?!co%eK9>TZE3@ zTH3K9FCKjmSs#=hG+l?vvAfe^C=+6Ak;``RL<+0EG$tK>z>% diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_20.png b/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_20.png deleted file mode 100644 index 8fc8524241c70058fc73952919cd21e6080156c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2207 zcmV;Q2w?Y#P)z_pt`e$LyS#yU~bM@TL_)ejcbKa$rN{$r{Yfov}pJ&JNV@JobW0NpxXxgMP zsZoC18nHw*SIt!>DiaO-m=mNRAJ`d}6O_xpT>XbQax8N!dn~Kv@rsOw3P1`c$0$Eu z9jOXy)|&NgaB_{D<2jz}*l^{OrBC|y;zyYS8Brfi&em5@;9g|4Sl+@Vk63K+~pn zP`!-bRszt^$a@1!Fku?=6tdq@6G=c*eb4s-{;5>wRvZXYAHYAg)mb@7p?7}h2&xpH zA0#xo>U(0c5mRuzb|Jj}%4euh?E>VFr$;M^RxaqR@mVww~Auy^z(on}H1n6^uatDurPfWQU?EWknnuon8E7YO{I6i&yQu;W1N za=6uXruPEnt}~OS!Tt#cYXC5yJ__7{*YNl%Tu267cCm>=M2!wZ9bQZVbOoG;Yf6a$ za*4x$0bAVB0BHI^gCQUIGrZXWWB^EPTe6WgY+xBnF0c)2p$#TpO$s&xGYkQbk|6VF zPL2YO0vbNx!0&)20NI(NWk-Q+kgQ-R1zvB2h_97oMn(!lm(hz<$&9BabuY@+xsZ{qH6l*(Ma$VYr$kRNKQ%IWa~J})S4-br;7J})S4;y~aBypal>u}Hqli_jU( zGL3RCy~;uK^hJ)NR0N1s`q?b+Mi3OnQNLi-VKoc125a8lE1 z-3kTVWfY6~+F|XmMhdta0MCmkc;3!9phoq9YEES22`7(h@Ir#Z5$%X3tgp8B@aisw zopI;g_9O16Rt{}=S}DBnlayXu&z;$e+fbja&%XcQ`wyD4=B&uPcEX`vL~Y0xv&Dn* zpv)9AIGWz}p1s}dQfSOI=FU8P=HZSXvQq0($jiJu=pFPjG9yu;lr#2ZmnY3pbM(rW zSH7fgwZAx-J{I9hAq2kV{Y7x&IZ(m)rcbcGbU1iLuvBjG&aoSdQstCB!&I=#MM6tU>(+Z zak8EUl!3CIx?mFy1DgqJ2L+h8S}9{x&7?PBFp%2BifSSixWT>9(|eIp{@nv^2+)qA zfxFE+_*}H$EUt_#23lzN6rKqKW7@*Nw;6a7E;CT!ZG^-#1XhtH;3a%~oP)n3@LN=< zVI>3Saam{J=`{QeB`@Iaa|$oH#yf;N1S}(P5hZN|s_=Vw8IP~y;;jZHbRGj|v1L+N z<7*f3_&PQ^gDccK@HX}0EHC$Im-;XKEWvdKXalg0s<>l)6@LyR@CE~G9e|8v-~w7- zLo5D>_7h;C$~&r?*hC$#Z6NR$2HwVO@g9jBCDG&oW8tI$<{)6;Xm$ZJk;Q%@p!WwF z$e0-RX3Dx4=SdwMv&qL4KrrB@1GG022rMT9w>dOuhn@noFrF@A_02S(iojAog%1^A zq#5}UH=(C@^HT(_VRfpb=q9uIr=1KqgMh@+`@nqw{5L5*Kv1~CQ(5%c*Dg*Cc_4zq zC7eX3`Q;&{Dl9;&WVmio1cfEojVKUsvuU`FA^f%hUW9tghMF{7SyOp?w=3ix9w=VZ6G;s>|S5igSa1BQge;l)}^1tB&_$U9Gw93|`)uV8fb3`F- zLz8nK8~lbMy$Jl!o4Wjvlp>x?POZ|^kX!5nw2Sl_LC_}7?^QA;+C{SY>ah1Don9S^ z2bpMf35L6T*R7=hZ(tA+;MjHq2>%lj zD-L>HUs~N=zJdEwSEo_fHEwjqM*PP06{HLmWK`kT7On)X#cJ!;68r%ii-zhy!xua8 zAqsh4q1j4NDF4E@VXORc#D-g;4aT2*1>2F4UidE*={69xbpp=qtGT@Z-AL$38i~?w z9GF%a#{yt#=;|;H6GYZ%4sU538qMzET~y!x`%biB6Z$9790W`c0tPA!v|&K~x1sRO hU(0`U8@>m?e*u@9Wts}wKOg`A002ovPDHLkV1k2(8BzcM diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_9f.png b/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_9f.png deleted file mode 100644 index cee8a138a6d5a2b488697e0c48cfd5dbd88a0ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4971 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 diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_e9.png b/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/unicode_page_e9.png deleted file mode 100644 index e0762efe5e75aa57aedb2e33b9c8237f5196a36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2847 zcmeHJdrTBZ99~pRMHCz36U6Om+FHAJyL<1A2U-pa))ZhsHNIl{SJO={J2U(J z9^dcx&CGq4l=$wbkjWtkf{aRtH!MJqAUF&{UKt8s8G9C+;A?o&JX5UK|9p_&l?hjd zNDC4ddXd&6#9TNV;fPNW5oF|8-!BN+x@{t~DdtU!rNzd1G%MI-3@4a@%w=;xG=j{E zb~zX}14yVDSb4i1Yp<-vP@dCc$tojZbi{ykK0eP07Um_I*t`r@$6?V?=qwiv9oT@x zpe|dcU8G%l%bFsf zAa!y=D<>5=LDGbpR%y_I2ZPa^oP}Osh#QCnXL>AMk{q;Lo|BU!%TdS#r&UhsbkGMS zrzjjEa52{|F)rLLP8;-K03z$;9TG3tQJ+V~EM!S~3})I-!R83KwTlB~f(4Vi7>Asc z5k5+OAjbx9jx1-UKRCzAK_;*PyCgy^8NfQy1xXOog{QaoM zQHsrmGzJRtM6_tibpZJSAPQMd7Q|-5G^hF4IOrHBU?jn55`@gbMkNiVj8c#Z`erh3 z=Y$+_#zO|cz(_!kQ3OTe1ZVEh?2t$>JoZQR1XhX~7weVsXaI0wvHeYL!_zXm1eMEMI2_?Kx<#wGe8J zPQ&30t5V=BrQ~oO1t33`GHW=UR;9FP2JPoNdAPHf%$N4#+iyNe(DA$oo0U7TBNl?? z1EWkH^{aqpSf9G}80%{*;IM&Z{s|R$F$Vo^bJ78H`iyq>!$iR%hNV{x@wslm;F;BeBc<4B5AGeBn0g3Jv~L)= z8{i~xy8t_^lM~(@bo=yi2r?`(!7#_<+IFYp`;wj7F*UpM?s==1tU$s;wWEIj;#}lc zF*nZrfDX&9U01$t_03Y-0fjp{yrbZOoB6qOv**Z0O-E05qx-cCk0NVVEBkuqk9S|~ zX^SXbedl;%1HCk^cV*?@wVm9!O`G1oNJW%?k{ZjMFSxq3xayEMywp>l^45}uqBV!k zlzf?%;Jwt^H8t%1pKB>Y-`upio20_O|1v4hyU8q9>rgN zZNiP;t~>DJTNyPKE34{K>MmH{tFSM1?`>P!wDbHvPvWYU`#pWh`Nz7J9WmCgDbL<@ zZc*`x^X}BF)P|yEVRJ_})itiSUOCprdDnstG2*BFh5A3TJ3M_|jmg*SLzeC+^z>bw zRNpnCx2neN5ms9IZk^_n4?jq?+&sJw#MzsUhSsiA-xhBk*y)X))_rv2Tu!W< zQhD*0zI<_F+VCBhqFl>eHD6E3?}>>1baPnm#ya=<=C;lYGfMS)k2D8I-V;@Q2e&52 zaoxfD8|pkErUT8Z)KRiUdwN!!;PYFL_7-~ULZWZi?hm{1&HTe;<)novDPvE1a+*Ky zJK9^Fxa!1x&x)GtmbQb{)phmb%Wbo(3kvo|1z-Gjw3lygpXqMxY?!co%eK9>TZE3@ zTH3K9FCKjmSs#=hG+l?vvAfe^C=+6Ak;``RL<+0EG$tK>z>% diff --git a/projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_20.png b/projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_20.png deleted file mode 100644 index 8fc8524241c70058fc73952919cd21e6080156c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2207 zcmV;Q2w?Y#P)z_pt`e$LyS#yU~bM@TL_)ejcbKa$rN{$r{Yfov}pJ&JNV@JobW0NpxXxgMP zsZoC18nHw*SIt!>DiaO-m=mNRAJ`d}6O_xpT>XbQax8N!dn~Kv@rsOw3P1`c$0$Eu z9jOXy)|&NgaB_{D<2jz}*l^{OrBC|y;zyYS8Brfi&em5@;9g|4Sl+@Vk63K+~pn zP`!-bRszt^$a@1!Fku?=6tdq@6G=c*eb4s-{;5>wRvZXYAHYAg)mb@7p?7}h2&xpH zA0#xo>U(0c5mRuzb|Jj}%4euh?E>VFr$;M^RxaqR@mVww~Auy^z(on}H1n6^uatDurPfWQU?EWknnuon8E7YO{I6i&yQu;W1N za=6uXruPEnt}~OS!Tt#cYXC5yJ__7{*YNl%Tu267cCm>=M2!wZ9bQZVbOoG;Yf6a$ za*4x$0bAVB0BHI^gCQUIGrZXWWB^EPTe6WgY+xBnF0c)2p$#TpO$s&xGYkQbk|6VF zPL2YO0vbNx!0&)20NI(NWk-Q+kgQ-R1zvB2h_97oMn(!lm(hz<$&9BabuY@+xsZ{qH6l*(Ma$VYr$kRNKQ%IWa~J})S4-br;7J})S4;y~aBypal>u}Hqli_jU( zGL3RCy~;uK^hJ)NR0N1s`q?b+Mi3OnQNLi-VKoc125a8lE1 z-3kTVWfY6~+F|XmMhdta0MCmkc;3!9phoq9YEES22`7(h@Ir#Z5$%X3tgp8B@aisw zopI;g_9O16Rt{}=S}DBnlayXu&z;$e+fbja&%XcQ`wyD4=B&uPcEX`vL~Y0xv&Dn* zpv)9AIGWz}p1s}dQfSOI=FU8P=HZSXvQq0($jiJu=pFPjG9yu;lr#2ZmnY3pbM(rW zSH7fgwZAx-J{I9hAq2kV{Y7x&IZ(m)rcbcGbU1iLuvBjG&aoSdQstCB!&I=#MM6tU>(+Z zak8EUl!3CIx?mFy1DgqJ2L+h8S}9{x&7?PBFp%2BifSSixWT>9(|eIp{@nv^2+)qA zfxFE+_*}H$EUt_#23lzN6rKqKW7@*Nw;6a7E;CT!ZG^-#1XhtH;3a%~oP)n3@LN=< zVI>3Saam{J=`{QeB`@Iaa|$oH#yf;N1S}(P5hZN|s_=Vw8IP~y;;jZHbRGj|v1L+N z<7*f3_&PQ^gDccK@HX}0EHC$Im-;XKEWvdKXalg0s<>l)6@LyR@CE~G9e|8v-~w7- zLo5D>_7h;C$~&r?*hC$#Z6NR$2HwVO@g9jBCDG&oW8tI$<{)6;Xm$ZJk;Q%@p!WwF z$e0-RX3Dx4=SdwMv&qL4KrrB@1GG022rMT9w>dOuhn@noFrF@A_02S(iojAog%1^A zq#5}UH=(C@^HT(_VRfpb=q9uIr=1KqgMh@+`@nqw{5L5*Kv1~CQ(5%c*Dg*Cc_4zq zC7eX3`Q;&{Dl9;&WVmio1cfEojVKUsvuU`FA^f%hUW9tghMF{7SyOp?w=3ix9w=VZ6G;s>|S5igSa1BQge;l)}^1tB&_$U9Gw93|`)uV8fb3`F- zLz8nK8~lbMy$Jl!o4Wjvlp>x?POZ|^kX!5nw2Sl_LC_}7?^QA;+C{SY>ah1Don9S^ z2bpMf35L6T*R7=hZ(tA+;MjHq2>%lj zD-L>HUs~N=zJdEwSEo_fHEwjqM*PP06{HLmWK`kT7On)X#cJ!;68r%ii-zhy!xua8 zAqsh4q1j4NDF4E@VXORc#D-g;4aT2*1>2F4UidE*={69xbpp=qtGT@Z-AL$38i~?w z9GF%a#{yt#=;|;H6GYZ%4sU538qMzET~y!x`%biB6Z$9790W`c0tPA!v|&K~x1sRO hU(0`U8@>m?e*u@9Wts}wKOg`A002ovPDHLkV1k2(8BzcM diff --git a/projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_9f.png b/projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_9f.png deleted file mode 100644 index cee8a138a6d5a2b488697e0c48cfd5dbd88a0ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4971 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 diff --git a/projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_e9.png b/projects/1.18/assets/minecraft/minecraft/textures/font/unicode_page_e9.png deleted file mode 100644 index e0762efe5e75aa57aedb2e33b9c8237f5196a36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2847 zcmeHJdrTBZ99~pRMHCz36U6Om+FHAJyL<1A2U-pa))ZhsHNIl{SJO={J2U(J z9^dcx&CGq4l=$wbkjWtkf{aRtH!MJqAUF&{UKt8s8G9C+;A?o&JX5UK|9p_&l?hjd zNDC4ddXd&6#9TNV;fPNW5oF|8-!BN+x@{t~DdtU!rNzd1G%MI-3@4a@%w=;xG=j{E zb~zX}14yVDSb4i1Yp<-vP@dCc$tojZbi{ykK0eP07Um_I*t`r@$6?V?=qwiv9oT@x zpe|dcU8G%l%bFsf zAa!y=D<>5=LDGbpR%y_I2ZPa^oP}Osh#QCnXL>AMk{q;Lo|BU!%TdS#r&UhsbkGMS zrzjjEa52{|F)rLLP8;-K03z$;9TG3tQJ+V~EM!S~3})I-!R83KwTlB~f(4Vi7>Asc z5k5+OAjbx9jx1-UKRCzAK_;*PyCgy^8NfQy1xXOog{QaoM zQHsrmGzJRtM6_tibpZJSAPQMd7Q|-5G^hF4IOrHBU?jn55`@gbMkNiVj8c#Z`erh3 z=Y$+_#zO|cz(_!kQ3OTe1ZVEh?2t$>JoZQR1XhX~7weVsXaI0wvHeYL!_zXm1eMEMI2_?Kx<#wGe8J zPQ&30t5V=BrQ~oO1t33`GHW=UR;9FP2JPoNdAPHf%$N4#+iyNe(DA$oo0U7TBNl?? z1EWkH^{aqpSf9G}80%{*;IM&Z{s|R$F$Vo^bJ78H`iyq>!$iR%hNV{x@wslm;F;BeBc<4B5AGeBn0g3Jv~L)= z8{i~xy8t_^lM~(@bo=yi2r?`(!7#_<+IFYp`;wj7F*UpM?s==1tU$s;wWEIj;#}lc zF*nZrfDX&9U01$t_03Y-0fjp{yrbZOoB6qOv**Z0O-E05qx-cCk0NVVEBkuqk9S|~ zX^SXbedl;%1HCk^cV*?@wVm9!O`G1oNJW%?k{ZjMFSxq3xayEMywp>l^45}uqBV!k zlzf?%;Jwt^H8t%1pKB>Y-`upio20_O|1v4hyU8q9>rgN zZNiP;t~>DJTNyPKE34{K>MmH{tFSM1?`>P!wDbHvPvWYU`#pWh`Nz7J9WmCgDbL<@ zZc*`x^X}BF)P|yEVRJ_})itiSUOCprdDnstG2*BFh5A3TJ3M_|jmg*SLzeC+^z>bw zRNpnCx2neN5ms9IZk^_n4?jq?+&sJw#MzsUhSsiA-xhBk*y)X))_rv2Tu!W< zQhD*0zI<_F+VCBhqFl>eHD6E3?}>>1baPnm#ya=<=C;lYGfMS)k2D8I-V;@Q2e&52 zaoxfD8|pkErUT8Z)KRiUdwN!!;PYFL_7-~ULZWZi?hm{1&HTe;<)novDPvE1a+*Ky zJK9^Fxa!1x&x)GtmbQb{)phmb%Wbo(3kvo|1z-Gjw3lygpXqMxY?!co%eK9>TZE3@ zTH3K9FCKjmSs#=hG+l?vvAfe^C=+6Ak;``RL<+0EG$tK>z>% diff --git a/projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_20.png b/projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_20.png deleted file mode 100644 index 8fc8524241c70058fc73952919cd21e6080156c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2207 zcmV;Q2w?Y#P)z_pt`e$LyS#yU~bM@TL_)ejcbKa$rN{$r{Yfov}pJ&JNV@JobW0NpxXxgMP zsZoC18nHw*SIt!>DiaO-m=mNRAJ`d}6O_xpT>XbQax8N!dn~Kv@rsOw3P1`c$0$Eu z9jOXy)|&NgaB_{D<2jz}*l^{OrBC|y;zyYS8Brfi&em5@;9g|4Sl+@Vk63K+~pn zP`!-bRszt^$a@1!Fku?=6tdq@6G=c*eb4s-{;5>wRvZXYAHYAg)mb@7p?7}h2&xpH zA0#xo>U(0c5mRuzb|Jj}%4euh?E>VFr$;M^RxaqR@mVww~Auy^z(on}H1n6^uatDurPfWQU?EWknnuon8E7YO{I6i&yQu;W1N za=6uXruPEnt}~OS!Tt#cYXC5yJ__7{*YNl%Tu267cCm>=M2!wZ9bQZVbOoG;Yf6a$ za*4x$0bAVB0BHI^gCQUIGrZXWWB^EPTe6WgY+xBnF0c)2p$#TpO$s&xGYkQbk|6VF zPL2YO0vbNx!0&)20NI(NWk-Q+kgQ-R1zvB2h_97oMn(!lm(hz<$&9BabuY@+xsZ{qH6l*(Ma$VYr$kRNKQ%IWa~J})S4-br;7J})S4;y~aBypal>u}Hqli_jU( zGL3RCy~;uK^hJ)NR0N1s`q?b+Mi3OnQNLi-VKoc125a8lE1 z-3kTVWfY6~+F|XmMhdta0MCmkc;3!9phoq9YEES22`7(h@Ir#Z5$%X3tgp8B@aisw zopI;g_9O16Rt{}=S}DBnlayXu&z;$e+fbja&%XcQ`wyD4=B&uPcEX`vL~Y0xv&Dn* zpv)9AIGWz}p1s}dQfSOI=FU8P=HZSXvQq0($jiJu=pFPjG9yu;lr#2ZmnY3pbM(rW zSH7fgwZAx-J{I9hAq2kV{Y7x&IZ(m)rcbcGbU1iLuvBjG&aoSdQstCB!&I=#MM6tU>(+Z zak8EUl!3CIx?mFy1DgqJ2L+h8S}9{x&7?PBFp%2BifSSixWT>9(|eIp{@nv^2+)qA zfxFE+_*}H$EUt_#23lzN6rKqKW7@*Nw;6a7E;CT!ZG^-#1XhtH;3a%~oP)n3@LN=< zVI>3Saam{J=`{QeB`@Iaa|$oH#yf;N1S}(P5hZN|s_=Vw8IP~y;;jZHbRGj|v1L+N z<7*f3_&PQ^gDccK@HX}0EHC$Im-;XKEWvdKXalg0s<>l)6@LyR@CE~G9e|8v-~w7- zLo5D>_7h;C$~&r?*hC$#Z6NR$2HwVO@g9jBCDG&oW8tI$<{)6;Xm$ZJk;Q%@p!WwF z$e0-RX3Dx4=SdwMv&qL4KrrB@1GG022rMT9w>dOuhn@noFrF@A_02S(iojAog%1^A zq#5}UH=(C@^HT(_VRfpb=q9uIr=1KqgMh@+`@nqw{5L5*Kv1~CQ(5%c*Dg*Cc_4zq zC7eX3`Q;&{Dl9;&WVmio1cfEojVKUsvuU`FA^f%hUW9tghMF{7SyOp?w=3ix9w=VZ6G;s>|S5igSa1BQge;l)}^1tB&_$U9Gw93|`)uV8fb3`F- zLz8nK8~lbMy$Jl!o4Wjvlp>x?POZ|^kX!5nw2Sl_LC_}7?^QA;+C{SY>ah1Don9S^ z2bpMf35L6T*R7=hZ(tA+;MjHq2>%lj zD-L>HUs~N=zJdEwSEo_fHEwjqM*PP06{HLmWK`kT7On)X#cJ!;68r%ii-zhy!xua8 zAqsh4q1j4NDF4E@VXORc#D-g;4aT2*1>2F4UidE*={69xbpp=qtGT@Z-AL$38i~?w z9GF%a#{yt#=;|;H6GYZ%4sU538qMzET~y!x`%biB6Z$9790W`c0tPA!v|&K~x1sRO hU(0`U8@>m?e*u@9Wts}wKOg`A002ovPDHLkV1k2(8BzcM diff --git a/projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_9f.png b/projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_9f.png deleted file mode 100644 index cee8a138a6d5a2b488697e0c48cfd5dbd88a0ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4971 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 diff --git a/projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_e9.png b/projects/1.19/assets/minecraft/minecraft/textures/font/unicode_page_e9.png deleted file mode 100644 index e0762efe5e75aa57aedb2e33b9c8237f5196a36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2847 zcmeHJdrTBZ99~pRMHCz36U6Om+FHAJyL<1A2U-pa))ZhsHNIl{SJO={J2U(J z9^dcx&CGq4l=$wbkjWtkf{aRtH!MJqAUF&{UKt8s8G9C+;A?o&JX5UK|9p_&l?hjd zNDC4ddXd&6#9TNV;fPNW5oF|8-!BN+x@{t~DdtU!rNzd1G%MI-3@4a@%w=;xG=j{E zb~zX}14yVDSb4i1Yp<-vP@dCc$tojZbi{ykK0eP07Um_I*t`r@$6?V?=qwiv9oT@x zpe|dcU8G%l%bFsf zAa!y=D<>5=LDGbpR%y_I2ZPa^oP}Osh#QCnXL>AMk{q;Lo|BU!%TdS#r&UhsbkGMS zrzjjEa52{|F)rLLP8;-K03z$;9TG3tQJ+V~EM!S~3})I-!R83KwTlB~f(4Vi7>Asc z5k5+OAjbx9jx1-UKRCzAK_;*PyCgy^8NfQy1xXOog{QaoM zQHsrmGzJRtM6_tibpZJSAPQMd7Q|-5G^hF4IOrHBU?jn55`@gbMkNiVj8c#Z`erh3 z=Y$+_#zO|cz(_!kQ3OTe1ZVEh?2t$>JoZQR1XhX~7weVsXaI0wvHeYL!_zXm1eMEMI2_?Kx<#wGe8J zPQ&30t5V=BrQ~oO1t33`GHW=UR;9FP2JPoNdAPHf%$N4#+iyNe(DA$oo0U7TBNl?? z1EWkH^{aqpSf9G}80%{*;IM&Z{s|R$F$Vo^bJ78H`iyq>!$iR%hNV{x@wslm;F;BeBc<4B5AGeBn0g3Jv~L)= z8{i~xy8t_^lM~(@bo=yi2r?`(!7#_<+IFYp`;wj7F*UpM?s==1tU$s;wWEIj;#}lc zF*nZrfDX&9U01$t_03Y-0fjp{yrbZOoB6qOv**Z0O-E05qx-cCk0NVVEBkuqk9S|~ zX^SXbedl;%1HCk^cV*?@wVm9!O`G1oNJW%?k{ZjMFSxq3xayEMywp>l^45}uqBV!k zlzf?%;Jwt^H8t%1pKB>Y-`upio20_O|1v4hyU8q9>rgN zZNiP;t~>DJTNyPKE34{K>MmH{tFSM1?`>P!wDbHvPvWYU`#pWh`Nz7J9WmCgDbL<@ zZc*`x^X}BF)P|yEVRJ_})itiSUOCprdDnstG2*BFh5A3TJ3M_|jmg*SLzeC+^z>bw zRNpnCx2neN5ms9IZk^_n4?jq?+&sJw#MzsUhSsiA-xhBk*y)X))_rv2Tu!W< zQhD*0zI<_F+VCBhqFl>eHD6E3?}>>1baPnm#ya=<=C;lYGfMS)k2D8I-V;@Q2e&52 zaoxfD8|pkErUT8Z)KRiUdwN!!;PYFL_7-~ULZWZi?hm{1&HTe;<)novDPvE1a+*Ky zJK9^Fxa!1x&x)GtmbQb{)phmb%Wbo(3kvo|1z-Gjw3lygpXqMxY?!co%eK9>TZE3@ zTH3K9FCKjmSs#=hG+l?vvAfe^C=+6Ak;``RL<+0EG$tK>z>% From 58f675ba97fef928f566d1ca67883e29fac1b154 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Fri, 23 Jun 2023 14:05:37 +0800 Subject: [PATCH 06/25] hotfix1 --- .../minecraft/lang/en_us.lang | 147 ------------------ .../minecraft/lang/zh_cn.lang | 1 - 2 files changed, 148 deletions(-) delete mode 100644 projects/1.12.2/assets/conquest-reforged/minecraft/lang/en_us.lang delete mode 100644 projects/1.12.2/assets/conquest-reforged/minecraft/lang/zh_cn.lang diff --git a/projects/1.12.2/assets/conquest-reforged/minecraft/lang/en_us.lang b/projects/1.12.2/assets/conquest-reforged/minecraft/lang/en_us.lang deleted file mode 100644 index af931de77e91..000000000000 --- a/projects/1.12.2/assets/conquest-reforged/minecraft/lang/en_us.lang +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/1.12.2/assets/conquest-reforged/minecraft/lang/zh_cn.lang b/projects/1.12.2/assets/conquest-reforged/minecraft/lang/zh_cn.lang deleted file mode 100644 index 8b137891791f..000000000000 --- a/projects/1.12.2/assets/conquest-reforged/minecraft/lang/zh_cn.lang +++ /dev/null @@ -1 +0,0 @@ - From 1e815bf378f4907d8b229d272fbb7fc2ea3ace72 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Thu, 29 Jun 2023 23:33:07 +0800 Subject: [PATCH 07/25] hotfix3 --- config/packer/1.16-fabric.json | 3 ++- config/packer/1.16.json | 3 ++- config/packer/1.18-fabric.json | 3 ++- config/packer/1.18.json | 3 ++- config/packer/1.19.json | 3 ++- .../minecraft/minecraft/font/default.json | 10 +++++++++- .../minecraft/textures/font/2em-dash.png | Bin 0 -> 2829 bytes .../textures/font/cjk_punctuations.png | Bin 3064 -> 3071 bytes .../minecraft/minecraft/font/default.json | 10 +++++++++- .../minecraft/textures/font/2em-dash.png | Bin 0 -> 2829 bytes .../textures/font/cjk_punctuations.png | Bin 3064 -> 3071 bytes .../minecraft/minecraft/font/default.json | 10 +++++++++- .../minecraft/textures/font/2em-dash.png | Bin 0 -> 2829 bytes .../textures/font/cjk_punctuations.png | Bin 3064 -> 3071 bytes .../minecraft/minecraft/font/default.json | 10 +++++++++- .../minecraft/textures/font/2em-dash.png | Bin 0 -> 2829 bytes .../textures/font/cjk_punctuations.png | Bin 3064 -> 3071 bytes .../minecraft/minecraft/font/default.json | 10 +++++++++- .../minecraft/textures/font/2em-dash.png | Bin 0 -> 2829 bytes .../textures/font/cjk_punctuations.png | Bin 3064 -> 3071 bytes 20 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png create mode 100644 projects/1.16/assets/minecraft/minecraft/textures/font/2em-dash.png create mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png create mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/2em-dash.png create mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/2em-dash.png diff --git a/config/packer/1.16-fabric.json b/config/packer/1.16-fabric.json index 2acb8279fa15..926061b589b0 100644 --- a/config/packer/1.16-fabric.json +++ b/config/packer/1.16-fabric.json @@ -31,6 +31,7 @@ "[[石田]]": "\u9fec", "[[奥气]]": "\u9feb", "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef" + "……": "\u22ef\u22ef", + "——": "\u2e3a" } } \ No newline at end of file diff --git a/config/packer/1.16.json b/config/packer/1.16.json index 312810789f3c..fa13ececf927 100644 --- a/config/packer/1.16.json +++ b/config/packer/1.16.json @@ -31,6 +31,7 @@ "[[石田]]": "\u9fec", "[[奥气]]": "\u9feb", "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef" + "……": "\u22ef\u22ef", + "——": "\u2e3a" } } \ No newline at end of file diff --git a/config/packer/1.18-fabric.json b/config/packer/1.18-fabric.json index 92e6ab278b42..a957eecbd452 100644 --- a/config/packer/1.18-fabric.json +++ b/config/packer/1.18-fabric.json @@ -31,6 +31,7 @@ "[[石田]]": "\u9fec", "[[奥气]]": "\u9feb", "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef" + "……": "\u22ef\u22ef", + "——": "\u2e3a" } } \ No newline at end of file diff --git a/config/packer/1.18.json b/config/packer/1.18.json index c5223a6461f2..672042851b19 100644 --- a/config/packer/1.18.json +++ b/config/packer/1.18.json @@ -31,6 +31,7 @@ "[[石田]]": "\u9fec", "[[奥气]]": "\u9feb", "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef" + "……": "\u22ef\u22ef", + "——": "\u2e3a" } } \ No newline at end of file diff --git a/config/packer/1.19.json b/config/packer/1.19.json index 3de694b6474c..4e255da59b23 100644 --- a/config/packer/1.19.json +++ b/config/packer/1.19.json @@ -37,6 +37,7 @@ "[[石田]]": "\u9fec", "[[奥气]]": "\u9feb", "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef" + "……": "\u22ef\u22ef", + "——": "\u2e3a" } } \ No newline at end of file diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json b/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json index 1d14010120ed..d9baed727183 100644 --- a/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json +++ b/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json @@ -15,7 +15,7 @@ "ascent": 7, "chars": [ "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", - "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u0000" + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014" ] }, { @@ -26,6 +26,14 @@ "\u22ef" ] }, + { + "type": "bitmap", + "file": "minecraft:font/2em-dash.png", + "ascent": 7, + "chars": [ + "\u2e3a" + ] + }, { "type": "bitmap", "file": "minecraft:font/nonlatin_european.png", diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png b/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png new file mode 100644 index 0000000000000000000000000000000000000000..b683b4dd420e946726d3e92b40b28fe0129dd391 GIT binary patch literal 2829 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 literal 0 HcmV?d00001 diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png index 8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a..35d947f198184d507e5690f93c2a0eeee1772a40 100644 GIT binary patch delta 331 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 literal 0 HcmV?d00001 diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.16/assets/minecraft/minecraft/textures/font/cjk_punctuations.png index 8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a..35d947f198184d507e5690f93c2a0eeee1772a40 100644 GIT binary patch delta 331 zcmV-R0kr=37ylQqz6yUVNkl%26SIQm(-0Ye7{H|E5W zqAW=lgRwi-0e@0Azjx<7UHkj8m^a(u1*MH03wMF$778MKmY>J)H0qB1|WX`O#-BVDuFV-`3dyq z#=YJI1L&|2rsTwxRz`yyNJT;z%~X683}+oH50ExA2j!Hy8boG0;?AQ z`Rd<^pIaAn*B4&tcuK$GYkO=q(CwL>3G?faH8;p?ClU zpw@t_7(5Z}K+xe3bZv$&S@r>-nh;2$lkj*W0uX=zG_{N;gaLmDK$8G@mc5kmLvJ9j ze=-H2xgku+iR<)MMvELsMM4g1}00030{{sNe Wp~22}_VYXd0000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z06IxTK~#9!?9o9D03Zy-&_99+@b9xY;JO`J1utm?GG6B1DMz f^Z)<=|NjF3Hx>s?j!7la00000NkvXXu0mjfIH+DI literal 0 HcmV?d00001 diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png index 8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a..35d947f198184d507e5690f93c2a0eeee1772a40 100644 GIT binary patch delta 331 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 literal 0 HcmV?d00001 diff --git a/projects/1.18/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.18/assets/minecraft/minecraft/textures/font/cjk_punctuations.png index 8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a..35d947f198184d507e5690f93c2a0eeee1772a40 100644 GIT binary patch delta 331 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 literal 0 HcmV?d00001 diff --git a/projects/1.19/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.19/assets/minecraft/minecraft/textures/font/cjk_punctuations.png index 8b1d2c0c871c5ec6b6ef24435d2bc618faca0a4a..35d947f198184d507e5690f93c2a0eeee1772a40 100644 GIT binary patch delta 331 zcmV-R0kr=37ylQqz6yUVNkl%26SIQm(-0Ye7{H|E5W zqAW=lgRwi-0e@0Azjx<7UHkj8m^a(u1*MH03wMF$778MKmY>J)H0qB1|WX`O#-BVDuFV-`3dyq z#=YJI1L&|2rsTwxRz`yyNJT;z%~X683}+oH50ExA2j!Hy8boG0;?AQ z`Rd<^pIaAn*B4&tcuK$GYkO=q(CwL>3G?faH8;p?ClU zpw@t_7(5Z}K+xe3bZv$&S@r>-nh;2$lkj*W0uX=zG_{N;gaLmDK$8G@mc5kmLvJ9j ze=-H2xgku+iR<)MMvELsMM4g1}00030{{sNe Wp~22}_VYXd0000 Date: Sat, 8 Jul 2023 20:35:23 +0800 Subject: [PATCH 08/25] hotfix4 --- .../1UNKNOWN/minecraft/font/glyph_sizes.bin | Bin 65536 -> 65536 bytes .../textures/font/unicode_page_00.png | Bin 0 -> 6591 bytes .../textures/font/unicode_page_30.png | Bin 0 -> 7924 bytes .../textures/font/unicode_page_ff.png | Bin 0 -> 6832 bytes .../minecraft/minecraft/font/default.json | 223 ------------------ .../minecraft/minecraft/font/glyph_sizes.bin | Bin 65536 -> 0 bytes .../minecraft/minecraft/packer-policy.json | 4 + .../assets/minecraft/minecraft/readme.md | 24 -- .../textures/font/cjk_punctuations.png | Bin 3071 -> 0 bytes .../textures/font/element_ideographs.png | Bin 3739 -> 0 bytes .../minecraft/textures/font/ellipsis.png | Bin 2843 -> 0 bytes .../minecraft/minecraft/font/default.json | 6 +- .../minecraft/minecraft/font/glyph_sizes.bin | Bin 65536 -> 0 bytes .../minecraft/textures/font/2em-dash.png | Bin 2829 -> 0 bytes .../minecraft/textures/font/2em_dash.png} | Bin .../textures/font/cjk_punctuations.png | Bin 3071 -> 3275 bytes .../minecraft/minecraft/font/default.json | 223 ------------------ .../minecraft/minecraft/font/glyph_sizes.bin | Bin 65536 -> 0 bytes .../minecraft/minecraft/packer-policy.json | 4 + .../assets/minecraft/minecraft/readme.md | 24 -- .../minecraft/textures/font/2em-dash.png | Bin 2829 -> 0 bytes .../textures/font/cjk_punctuations.png | Bin 3071 -> 0 bytes .../textures/font/element_ideographs.png | Bin 3739 -> 0 bytes .../minecraft/textures/font/ellipsis.png | Bin 2843 -> 0 bytes .../minecraft/minecraft/font/default.json | 223 ------------------ .../minecraft/minecraft/font/glyph_sizes.bin | Bin 65536 -> 0 bytes .../minecraft/minecraft/packer-policy.json | 4 + .../1.18/assets/minecraft/minecraft/readme.md | 24 -- .../minecraft/textures/font/2em-dash.png | Bin 2829 -> 0 bytes .../textures/font/cjk_punctuations.png | Bin 3071 -> 0 bytes .../textures/font/element_ideographs.png | Bin 3739 -> 0 bytes .../minecraft/textures/font/ellipsis.png | Bin 2843 -> 0 bytes .../minecraft/minecraft/font/default.json | 223 ------------------ .../minecraft/minecraft/font/glyph_sizes.bin | Bin 65536 -> 0 bytes .../minecraft/minecraft/packer-policy.json | 4 + .../1.19/assets/minecraft/minecraft/readme.md | 24 -- .../minecraft/textures/font/2em-dash.png | Bin 2829 -> 0 bytes .../textures/font/cjk_punctuations.png | Bin 3071 -> 0 bytes .../textures/font/element_ideographs.png | Bin 3739 -> 0 bytes .../minecraft/textures/font/ellipsis.png | Bin 2843 -> 0 bytes 40 files changed, 19 insertions(+), 991 deletions(-) create mode 100644 projects/1.12.2/assets/1UNKNOWN/minecraft/textures/font/unicode_page_00.png create mode 100644 projects/1.12.2/assets/1UNKNOWN/minecraft/textures/font/unicode_page_30.png create mode 100644 projects/1.12.2/assets/1UNKNOWN/minecraft/textures/font/unicode_page_ff.png delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/font/default.json delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/font/glyph_sizes.bin create mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/readme.md delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/element_ideographs.png delete mode 100644 projects/1.16-fabric/assets/minecraft/minecraft/textures/font/ellipsis.png delete mode 100644 projects/1.16/assets/minecraft/minecraft/font/glyph_sizes.bin delete mode 100644 projects/1.16/assets/minecraft/minecraft/textures/font/2em-dash.png rename projects/{1.16-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png => 1.16/assets/minecraft/minecraft/textures/font/2em_dash.png} (100%) delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/font/default.json delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/font/glyph_sizes.bin create mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/readme.md delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/element_ideographs.png delete mode 100644 projects/1.18-fabric/assets/minecraft/minecraft/textures/font/ellipsis.png delete mode 100644 projects/1.18/assets/minecraft/minecraft/font/default.json delete mode 100644 projects/1.18/assets/minecraft/minecraft/font/glyph_sizes.bin create mode 100644 projects/1.18/assets/minecraft/minecraft/packer-policy.json delete mode 100644 projects/1.18/assets/minecraft/minecraft/readme.md delete mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/2em-dash.png delete mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/cjk_punctuations.png delete mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/element_ideographs.png delete mode 100644 projects/1.18/assets/minecraft/minecraft/textures/font/ellipsis.png delete mode 100644 projects/1.19/assets/minecraft/minecraft/font/default.json delete mode 100644 projects/1.19/assets/minecraft/minecraft/font/glyph_sizes.bin create mode 100644 projects/1.19/assets/minecraft/minecraft/packer-policy.json delete mode 100644 projects/1.19/assets/minecraft/minecraft/readme.md delete mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/2em-dash.png delete mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/cjk_punctuations.png delete mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/element_ideographs.png delete mode 100644 projects/1.19/assets/minecraft/minecraft/textures/font/ellipsis.png diff --git a/projects/1.12.2/assets/1UNKNOWN/minecraft/font/glyph_sizes.bin b/projects/1.12.2/assets/1UNKNOWN/minecraft/font/glyph_sizes.bin index 2e1e01a11de79cf0ac0b0eb1a7d919e72223eb2c..a78037b8f4ac8f7df49d8dddd0ccd3c98d99bf8b 100644 GIT binary patch delta 14 VcmZo@U}NWz;)-CNX7Ff>zR*YRyE0gLFdF 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 literal 0 HcmV?d00001 diff --git a/projects/1.12.2/assets/1UNKNOWN/minecraft/textures/font/unicode_page_30.png b/projects/1.12.2/assets/1UNKNOWN/minecraft/textures/font/unicode_page_30.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd2cfe18b7ea10350c87a35a9ce01b39785536a GIT binary patch literal 7924 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 literal 0 HcmV?d00001 diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json b/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json deleted file mode 100644 index d9baed727183..000000000000 --- a/projects/1.16-fabric/assets/minecraft/minecraft/font/default.json +++ /dev/null @@ -1,223 +0,0 @@ -{ - "providers": [ - { - "type":"bitmap", - "file": "minecraft:font/element_ideographs.png", - "ascent": 7, - "chars": [ - "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", - "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" - ] - }, - { - "type":"bitmap", - "file": "minecraft:font/cjk_punctuations.png", - "ascent": 7, - "chars": [ - "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", - "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014" - ] - }, - { - "type":"bitmap", - "file": "minecraft:font/ellipsis.png", - "ascent": 7, - "chars": [ - "\u22ef" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/2em-dash.png", - "ascent": 7, - "chars": [ - "\u2e3a" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/nonlatin_european.png", - "ascent": 7, - "chars": [ - "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", - "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", - "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", - "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", - "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", - "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", - "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", - "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", - "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", - "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", - "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", - "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", - "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", - "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", - "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", - "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", - "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", - "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", - "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", - "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", - "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", - "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", - "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", - "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", - "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", - "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", - "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", - "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", - "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", - "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", - "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", - "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", - "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", - "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", - "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", - "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", - "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", - "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", - "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", - "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", - "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", - "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", - "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", - "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", - "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", - "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", - "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", - "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", - "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", - "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", - "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", - "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", - "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", - "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", - "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", - "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", - "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", - "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", - "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", - "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", - "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", - "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", - "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", - "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", - "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", - "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/accented.png", - "height": 12, - "ascent": 10, - "chars": [ - "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", - "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", - "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", - "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", - "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", - "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", - "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", - "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", - "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", - "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", - "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", - "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", - "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", - "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", - "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", - "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", - "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", - "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", - "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", - "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", - "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", - "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", - "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", - "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", - "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", - "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", - "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", - "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", - "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", - "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", - "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", - "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", - "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", - "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", - "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", - "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", - "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", - "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", - "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", - "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", - "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", - "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", - "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", - "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", - "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", - "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", - "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", - "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", - "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", - "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", - "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", - "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", - "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", - "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", - "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", - "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", - "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", - "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", - "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", - "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", - "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", - "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", - "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", - "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", - "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", - "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", - "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", - "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", - "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", - "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", - "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", - "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", - "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", - "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/ascii.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", - "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", - "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", - "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", - "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" - ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] -} diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/font/glyph_sizes.bin b/projects/1.16-fabric/assets/minecraft/minecraft/font/glyph_sizes.bin deleted file mode 100644 index 0503133d08effbe3da2c993864b97aad1fb1207d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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

XIxdan5o#(3We0I zo{ed{XgizfEK!NVp@bW%%6w9s*GXEY^Fp27ET80Anw1|fA8|H!Ij@q%ry$iK!sf(f z&RtHDILgzo)^beB@{e2;s|JthmJyG3z>*hVmoE0t$4;`pfjRz9rRC5{(Z8%N(E&G%n9b) z3r#pKWPF0IuY>vZ?rySi3ie8b)0|7KN_j)$@s0gcwz8U3)k?zE)x9t8i5e5j!)@bU z8xI@XI{ebwhBgvh=X1mFkIMSAJ*70t5oZPG`O~E6 zcDvPaUX4bhPT}WFNs4qf;e_Mj^7{Jv>Y6NGUTb~nV7_Fop1g9KYAV&zJdT zNNhgJ8Qt>YBc#puM-QXe)yF>1T1BBxlNusIZ{S2dzMkpCPCs%Y{rJvjPqGGH6mR_- zZ{jX5*Smemf6MFd_l-%DX_|tEQ6F$ZI^qn2)Uu_QdYUGe#T*AIej;0Ik}!@&B~ z51!%+&sR^M?sU7Yr#r1ypqP%+@_l@E0>X$1HG+&qYITFwP7v$_Fg=wgH+(BSaQz^q z`6xL~1F{};N5s0z{Hy=*FTeWL|M`ca_*Em3Qs=t)9PfvZAOG`z5^|gLkN=dWqcjM( z-@g6ey#4U@{3D-)2tV20=LqMh6L> zO|B+<47w_VATK6CG13RpXQN_zHsRyY#o1`0PgwIsx)7Z1`Ps_Ix zz8YIE7UP*dO<({0#}|Bn`@!@6?t!YCs2}zDB(Ud2=AsT$?>+DN(nEH_sl8D&@b;;f zy5QV6E2??)yK)mc@_=0 MHu^agd=v!#4;48@C;$Ke diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/2em-dash.png b/projects/1.16/assets/minecraft/minecraft/textures/font/2em-dash.png deleted file mode 100644 index b683b4dd420e946726d3e92b40b28fe0129dd391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2829 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 diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png b/projects/1.16/assets/minecraft/minecraft/textures/font/2em_dash.png similarity index 100% rename from projects/1.16-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png rename to projects/1.16/assets/minecraft/minecraft/textures/font/2em_dash.png diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.16/assets/minecraft/minecraft/textures/font/cjk_punctuations.png index 35d947f198184d507e5690f93c2a0eeee1772a40..7ad25d1665c0b495cb66debcce5793e9f135cae7 100644 GIT binary patch delta 572 zcmV-C0>l0P7t0wTiBL{Q4GJ0x0000DNk~Le000310000W2nGNE0R5?^03V--X zL_t(|+U%TBuEHP?Mb-HGX8-G)4fOpsL@Nx;Fwk=n6QflOFqeC=?ejQ}zXt%^lGkFt zR~w&?Y`1(^jsgF<02>QH7Nqhu?}`6Sgd*D2$;B^4-y;H>3&45MuO@)^WDw(f9uq&R z{jyzs#0g$)A0Pra0Jwqe|0RHkz<-7UaJBkJx&Rq;jAsOppmsG`@go8T-gLq8dk+!f zBbDu_({E`NHklk#Z~(!p|BSr=_&iQ>>U%Y~m{G2V@y7u`0=J?;(Fitm04=L}i(7!0 zcv3n7tDX0b4LAUR2?F7f=_!7L0~nE)yiP=^aRCvlzYaPE{4zboZxjIOEPr4v>>fb0 z2vGc;djOJn6}xf)k=b93?}4ufQ2YY~peL)H9mMVfp%i~A5uo^uJh>bg00*%8>dPt& zkU#)5p!m5M@6jaO)q|F6imPYd@OWXWP;-YuKR|+WMR8K000;) z0GaOi0susSt}Hvt`u1+VS${t-gZd3_#>k6-xCz6WqNxMM{nvLhCvG4B&_B^7xcDhf z1OOndAVSa{K=uJ|&GbYOfC&Py`hU*5oI!{9LAU_uCL%CXKsbdLmK6X=5(9ed|1K*h zA_80O0Ynx~@4f3JLH`i}V2S`lWLtGE;FSdkpoxC~009600|2_Yoe@|0Z)8pY0000< KMNUMnLSTYQYVr91 delta 366 zcmV-!0g?X88UGg{iBL{Q4GJ0x0000DNk~Le0001x0000W2nGNE0R4>d&9Nb!3V$p~ zL_t(|+U(j(3d1lAMNw}c`(N(syfl*`0Z7TGA0Zw< z0P+lBmJ0!B;0ffFz-1-mDwN1pXbrjNK$WX70QrB2zjXmyZ`_I M07*qoM6N<$f@6i5cK`qY diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/font/default.json b/projects/1.18-fabric/assets/minecraft/minecraft/font/default.json deleted file mode 100644 index d9baed727183..000000000000 --- a/projects/1.18-fabric/assets/minecraft/minecraft/font/default.json +++ /dev/null @@ -1,223 +0,0 @@ -{ - "providers": [ - { - "type":"bitmap", - "file": "minecraft:font/element_ideographs.png", - "ascent": 7, - "chars": [ - "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", - "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" - ] - }, - { - "type":"bitmap", - "file": "minecraft:font/cjk_punctuations.png", - "ascent": 7, - "chars": [ - "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", - "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014" - ] - }, - { - "type":"bitmap", - "file": "minecraft:font/ellipsis.png", - "ascent": 7, - "chars": [ - "\u22ef" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/2em-dash.png", - "ascent": 7, - "chars": [ - "\u2e3a" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/nonlatin_european.png", - "ascent": 7, - "chars": [ - "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", - "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", - "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", - "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", - "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", - "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", - "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", - "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", - "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", - "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", - "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", - "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", - "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", - "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", - "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", - "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", - "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", - "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", - "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", - "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", - "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", - "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", - "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", - "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", - "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", - "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", - "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", - "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", - "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", - "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", - "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", - "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", - "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", - "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", - "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", - "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", - "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", - "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", - "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", - "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", - "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", - "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", - "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", - "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", - "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", - "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", - "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", - "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", - "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", - "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", - "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", - "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", - "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", - "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", - "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", - "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", - "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", - "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", - "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", - "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", - "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", - "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", - "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", - "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", - "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", - "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/accented.png", - "height": 12, - "ascent": 10, - "chars": [ - "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", - "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", - "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", - "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", - "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", - "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", - "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", - "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", - "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", - "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", - "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", - "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", - "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", - "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", - "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", - "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", - "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", - "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", - "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", - "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", - "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", - "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", - "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", - "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", - "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", - "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", - "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", - "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", - "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", - "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", - "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", - "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", - "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", - "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", - "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", - "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", - "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", - "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", - "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", - "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", - "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", - "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", - "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", - "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", - "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", - "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", - "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", - "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", - "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", - "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", - "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", - "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", - "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", - "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", - "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", - "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", - "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", - "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", - "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", - "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", - "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", - "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", - "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", - "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", - "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", - "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", - "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", - "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", - "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", - "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", - "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", - "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", - "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", - "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/ascii.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", - "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", - "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", - "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", - "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" - ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] -} diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/font/glyph_sizes.bin b/projects/1.18-fabric/assets/minecraft/minecraft/font/glyph_sizes.bin deleted file mode 100644 index 0503133d08effbe3da2c993864b97aad1fb1207d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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

XIxdan5o#(3We0I zo{ed{XgizfEK!NVp@bW%%6w9s*GXEY^Fp27ET80Anw1|fA8|H!Ij@q%ry$iK!sf(f z&RtHDILgzo)^beB@{e2;s|JthmJyG3z>*hVmoE0t$4;`pfjRz9rRC5{(Z8%N(E&G%n9b) z3r#pKWPF0IuY>vZ?rySi3ie8b)0|7KN_j)$@s0gcwz8U3)k?zE)x9t8i5e5j!)@bU z8xI@XI{ebwhBgvh=X1mFkIMSAJ*70t5oZPG`O~E6 zcDvPaUX4bhPT}WFNs4qf;e_Mj^7{Jv>Y6NGUTb~nV7_Fop1g9KYAV&zJdT zNNhgJ8Qt>YBc#puM-QXe)yF>1T1BBxlNusIZ{S2dzMkpCPCs%Y{rJvjPqGGH6mR_- zZ{jX5*Smemf6MFd_l-%DX_|tEQ6F$ZI^qn2)Uu_QdYUGe#T*AIej;0Ik}!@&B~ z51!%+&sR^M?sU7Yr#r1ypqP%+@_l@E0>X$1HG+&qYITFwP7v$_Fg=wgH+(BSaQz^q z`6xL~1F{};N5s0z{Hy=*FTeWL|M`ca_*Em3Qs=t)9PfvZAOG`z5^|gLkN=dWqcjM( z-@g6ey#4U@{3D-)2tV20=LqMh6L> zO|B+<47w_VATK6CG13RpXQN_zHsRyY#o1`0PgwIsx)7Z1`Ps_Ix zz8YIE7UP*dO<({0#}|Bn`@!@6?t!YCs2}zDB(Ud2=AsT$?>+DN(nEH_sl8D&@b;;f zy5QV6E2??)yK)mc@_=0 MHu^agd=v!#4;48@C;$Ke diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json new file mode 100644 index 000000000000..5916ee4f8473 --- /dev/null +++ b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json @@ -0,0 +1,4 @@ +{ + "type": "plainclone", + "source": "./projects/1.16/minecraft/minecraft" +} \ No newline at end of file diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/readme.md b/projects/1.18-fabric/assets/minecraft/minecraft/readme.md deleted file mode 100644 index 1efc216f6cdc..000000000000 --- a/projects/1.18-fabric/assets/minecraft/minecraft/readme.md +++ /dev/null @@ -1,24 +0,0 @@ -# 全角字符修正与特殊字符补充 -- 本包添加了几个特殊字符字体,用于补充部分新确定的元素名称 -- 本包修正了中文全角字符的宽度和位置问题。 - -## 本包建议翻译文本采用左侧书写,在打包阶段使用脚本转换成右侧字符 - -| 翻译文本 | 转换字符 | 备注 | -| :------: | :------------: | :----------------------------------: | -| [[钅卢]] | `\ue900` | | -| [[钅杜]] | `\ue901` | | -| [[钅喜]] | `\ue902` | | -| [[钅波]] | `\ue903` | | -| [[钅黑]] | `\ue904` | | -| [[钅麦]] | `\u9fcf` | | -| [[钅达]] | `\ue906` | | -| [[钅仑]] | `\ue907` | | -| [[钅哥]] | `\u9fd4` | | -| [[钅尔]] | `\u9fed` | | -| [[钅夫]] | `\ue90a` | | -| 镆 | `\u9546` | 此元素名已存在对应字符,无需修改替换 | -| [[钅立]] | `\ue90c` | | -| [[石田]] | `\u9fec` | | -| [[奥气]] | `\u9feb` | | -| …… | `\ue908\ue909` | 全角省略号的修改 | \ No newline at end of file diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png b/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/2em-dash.png deleted file mode 100644 index b683b4dd420e946726d3e92b40b28fe0129dd391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2829 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 diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.18-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png deleted file mode 100644 index 35d947f198184d507e5690f93c2a0eeee1772a40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 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 diff --git a/projects/1.18/assets/minecraft/minecraft/font/default.json b/projects/1.18/assets/minecraft/minecraft/font/default.json deleted file mode 100644 index d9baed727183..000000000000 --- a/projects/1.18/assets/minecraft/minecraft/font/default.json +++ /dev/null @@ -1,223 +0,0 @@ -{ - "providers": [ - { - "type":"bitmap", - "file": "minecraft:font/element_ideographs.png", - "ascent": 7, - "chars": [ - "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", - "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" - ] - }, - { - "type":"bitmap", - "file": "minecraft:font/cjk_punctuations.png", - "ascent": 7, - "chars": [ - "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", - "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014" - ] - }, - { - "type":"bitmap", - "file": "minecraft:font/ellipsis.png", - "ascent": 7, - "chars": [ - "\u22ef" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/2em-dash.png", - "ascent": 7, - "chars": [ - "\u2e3a" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/nonlatin_european.png", - "ascent": 7, - "chars": [ - "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", - "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", - "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", - "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", - "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", - "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", - "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", - "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", - "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", - "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", - "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", - "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", - "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", - "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", - "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", - "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", - "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", - "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", - "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", - "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", - "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", - "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", - "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", - "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", - "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", - "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", - "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", - "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", - "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", - "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", - "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", - "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", - "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", - "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", - "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", - "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", - "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", - "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", - "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", - "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", - "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", - "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", - "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", - "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", - "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", - "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", - "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", - "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", - "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", - "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", - "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", - "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", - "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", - "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", - "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", - "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", - "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", - "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", - "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", - "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", - "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", - "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", - "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", - "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", - "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", - "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/accented.png", - "height": 12, - "ascent": 10, - "chars": [ - "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", - "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", - "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", - "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", - "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", - "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", - "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", - "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", - "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", - "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", - "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", - "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", - "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", - "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", - "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", - "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", - "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", - "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", - "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", - "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", - "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", - "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", - "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", - "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", - "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", - "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", - "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", - "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", - "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", - "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", - "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", - "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", - "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", - "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", - "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", - "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", - "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", - "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", - "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", - "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", - "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", - "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", - "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", - "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", - "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", - "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", - "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", - "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", - "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", - "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", - "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", - "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", - "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", - "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", - "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", - "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", - "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", - "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", - "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", - "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", - "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", - "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", - "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", - "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", - "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", - "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", - "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", - "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", - "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", - "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", - "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", - "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", - "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", - "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/ascii.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", - "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", - "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", - "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", - "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" - ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] -} diff --git a/projects/1.18/assets/minecraft/minecraft/font/glyph_sizes.bin b/projects/1.18/assets/minecraft/minecraft/font/glyph_sizes.bin deleted file mode 100644 index 0503133d08effbe3da2c993864b97aad1fb1207d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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

XIxdan5o#(3We0I zo{ed{XgizfEK!NVp@bW%%6w9s*GXEY^Fp27ET80Anw1|fA8|H!Ij@q%ry$iK!sf(f z&RtHDILgzo)^beB@{e2;s|JthmJyG3z>*hVmoE0t$4;`pfjRz9rRC5{(Z8%N(E&G%n9b) z3r#pKWPF0IuY>vZ?rySi3ie8b)0|7KN_j)$@s0gcwz8U3)k?zE)x9t8i5e5j!)@bU z8xI@XI{ebwhBgvh=X1mFkIMSAJ*70t5oZPG`O~E6 zcDvPaUX4bhPT}WFNs4qf;e_Mj^7{Jv>Y6NGUTb~nV7_Fop1g9KYAV&zJdT zNNhgJ8Qt>YBc#puM-QXe)yF>1T1BBxlNusIZ{S2dzMkpCPCs%Y{rJvjPqGGH6mR_- zZ{jX5*Smemf6MFd_l-%DX_|tEQ6F$ZI^qn2)Uu_QdYUGe#T*AIej;0Ik}!@&B~ z51!%+&sR^M?sU7Yr#r1ypqP%+@_l@E0>X$1HG+&qYITFwP7v$_Fg=wgH+(BSaQz^q z`6xL~1F{};N5s0z{Hy=*FTeWL|M`ca_*Em3Qs=t)9PfvZAOG`z5^|gLkN=dWqcjM( z-@g6ey#4U@{3D-)2tV20=LqMh6L> zO|B+<47w_VATK6CG13RpXQN_zHsRyY#o1`0PgwIsx)7Z1`Ps_Ix zz8YIE7UP*dO<({0#}|Bn`@!@6?t!YCs2}zDB(Ud2=AsT$?>+DN(nEH_sl8D&@b;;f zy5QV6E2??)yK)mc@_=0 MHu^agd=v!#4;48@C;$Ke diff --git a/projects/1.18/assets/minecraft/minecraft/packer-policy.json b/projects/1.18/assets/minecraft/minecraft/packer-policy.json new file mode 100644 index 000000000000..5916ee4f8473 --- /dev/null +++ b/projects/1.18/assets/minecraft/minecraft/packer-policy.json @@ -0,0 +1,4 @@ +{ + "type": "plainclone", + "source": "./projects/1.16/minecraft/minecraft" +} \ No newline at end of file diff --git a/projects/1.18/assets/minecraft/minecraft/readme.md b/projects/1.18/assets/minecraft/minecraft/readme.md deleted file mode 100644 index 1efc216f6cdc..000000000000 --- a/projects/1.18/assets/minecraft/minecraft/readme.md +++ /dev/null @@ -1,24 +0,0 @@ -# 全角字符修正与特殊字符补充 -- 本包添加了几个特殊字符字体,用于补充部分新确定的元素名称 -- 本包修正了中文全角字符的宽度和位置问题。 - -## 本包建议翻译文本采用左侧书写,在打包阶段使用脚本转换成右侧字符 - -| 翻译文本 | 转换字符 | 备注 | -| :------: | :------------: | :----------------------------------: | -| [[钅卢]] | `\ue900` | | -| [[钅杜]] | `\ue901` | | -| [[钅喜]] | `\ue902` | | -| [[钅波]] | `\ue903` | | -| [[钅黑]] | `\ue904` | | -| [[钅麦]] | `\u9fcf` | | -| [[钅达]] | `\ue906` | | -| [[钅仑]] | `\ue907` | | -| [[钅哥]] | `\u9fd4` | | -| [[钅尔]] | `\u9fed` | | -| [[钅夫]] | `\ue90a` | | -| 镆 | `\u9546` | 此元素名已存在对应字符,无需修改替换 | -| [[钅立]] | `\ue90c` | | -| [[石田]] | `\u9fec` | | -| [[奥气]] | `\u9feb` | | -| …… | `\ue908\ue909` | 全角省略号的修改 | \ No newline at end of file diff --git a/projects/1.18/assets/minecraft/minecraft/textures/font/2em-dash.png b/projects/1.18/assets/minecraft/minecraft/textures/font/2em-dash.png deleted file mode 100644 index b683b4dd420e946726d3e92b40b28fe0129dd391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2829 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 diff --git a/projects/1.18/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.18/assets/minecraft/minecraft/textures/font/cjk_punctuations.png deleted file mode 100644 index 35d947f198184d507e5690f93c2a0eeee1772a40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 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 diff --git a/projects/1.19/assets/minecraft/minecraft/font/default.json b/projects/1.19/assets/minecraft/minecraft/font/default.json deleted file mode 100644 index d9baed727183..000000000000 --- a/projects/1.19/assets/minecraft/minecraft/font/default.json +++ /dev/null @@ -1,223 +0,0 @@ -{ - "providers": [ - { - "type":"bitmap", - "file": "minecraft:font/element_ideographs.png", - "ascent": 7, - "chars": [ - "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", - "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" - ] - }, - { - "type":"bitmap", - "file": "minecraft:font/cjk_punctuations.png", - "ascent": 7, - "chars": [ - "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", - "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014" - ] - }, - { - "type":"bitmap", - "file": "minecraft:font/ellipsis.png", - "ascent": 7, - "chars": [ - "\u22ef" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/2em-dash.png", - "ascent": 7, - "chars": [ - "\u2e3a" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/nonlatin_european.png", - "ascent": 7, - "chars": [ - "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", - "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", - "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", - "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", - "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", - "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", - "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", - "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", - "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", - "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", - "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", - "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", - "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", - "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", - "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", - "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", - "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", - "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", - "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", - "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", - "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", - "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", - "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", - "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", - "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", - "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", - "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", - "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", - "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", - "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", - "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", - "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", - "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", - "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", - "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", - "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", - "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", - "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", - "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", - "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", - "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", - "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", - "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", - "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", - "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", - "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", - "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", - "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", - "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", - "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", - "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", - "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", - "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", - "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", - "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", - "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", - "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", - "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", - "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", - "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", - "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", - "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", - "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", - "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", - "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", - "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/accented.png", - "height": 12, - "ascent": 10, - "chars": [ - "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", - "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", - "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", - "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", - "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", - "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", - "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", - "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", - "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", - "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", - "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", - "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", - "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", - "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", - "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", - "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", - "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", - "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", - "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", - "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", - "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", - "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", - "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", - "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", - "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", - "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", - "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", - "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", - "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", - "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", - "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", - "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", - "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", - "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", - "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", - "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", - "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", - "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", - "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", - "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", - "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", - "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", - "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", - "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", - "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", - "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", - "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", - "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", - "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", - "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", - "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", - "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", - "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", - "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", - "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", - "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", - "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", - "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", - "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", - "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", - "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", - "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", - "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", - "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", - "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", - "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", - "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", - "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", - "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", - "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", - "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", - "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", - "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", - "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/ascii.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", - "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", - "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", - "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", - "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" - ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] -} diff --git a/projects/1.19/assets/minecraft/minecraft/font/glyph_sizes.bin b/projects/1.19/assets/minecraft/minecraft/font/glyph_sizes.bin deleted file mode 100644 index 0503133d08effbe3da2c993864b97aad1fb1207d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 zcmeI5-ICi#cIV-pE0V|^=!?U)A`d;9|HC)kL6gNc2DeTIF7{rwXpi&Z1F$1@Y2nROlziTpTu^5j3i z6AWY!{3~=ah~hXtIqb#pL39vBgJ?+y2ZJbFIq;7gJCB%)->c|B6!(lTe1mY!f=kSY zC%yPzNu1!57;z_2-y`9`i+b^3a5#t#dcCzGh-%UvKyIT&V>aHm!Z(9gnIVNWxf}Mi zXXGJvK!Qp^*>L4HSLos`=aRq*2^$_!9O}9WM_Fa5@#rr(<9HPX<|qo4RunJA8j(>b zITF61ZWul5g&+iZCQM4+Aq8%DZMfvGWIuJ2Orvv*BDW}x`f(JxqNOSl(WJ6UNl)`z zc|wCc#geYlW5;4{pyyA>X%S#!=A7 zXuQ3KR$^gCfyfQf+I1Y-Qgq;mo`umN4kvPA1G-6w;un96w?K(w)4;@sKgbBrhHxt! zC=|3r%LJ)`hTgISrISGyUsJS3zKNr{P5oJhlc{Bp5n@u0s9(k`+>L5IR9M7t}nvUlXmGk@9>C=TDMkhu_lcWHX&GcBNrVpaMCdilsD!L)3 z*H^t&lFa)*Om;T)1deB=QG9!p~EjOi!WGX6tb>iOlnIu7ZUze9kr7WE!o6Ao6*+o^?(`mcBlfE-Aoa}zK*WMwZDB8$xwXwGM zoVIgc+<|c>-(nq?b=6LW?VV1?$LU;O&97DF+uOd%hxC_-oAMV&L-Tf0(2W)CbeJdY zQBb#n&eJA{YU||rqjsmYlQ~sYp>;Oh`?gbdI%S@kT>8n=P?I?+ z3Y4y^l>~y~pWyQtQ3_si##jubEB7a#;#Ps>iJ#}b@6(Wz=sa1E0(bKIDd*0UC#}a% zc7|U*>fCc5?(J-EKR$Z&dJ#}#8;cX;$- z|MdL)+oSW7esuAAho*Y8|Ae7%vACpbWN5s)x|%OAL`l+KFkp?xfFkHDbhVeprAQ zJJorxFGIxoda%!vXpdL);?ax8PjEbZT&!s#TdH}VEVE)_C>=G=Nku<6oJ@`<$BFTI zQ4Di24zq%e!srwP{|oxXFMsjN(P)(EC*yzSxQyF8M@93%d@7raUn;`i{armO=^~-U z>`cGKtSqatsuqi?%-=6&i$%SlU#C|g-EL6?1ywhYYlO$7i;yYyMK#GMPJ^E@f) z1X_;MPYMR5GEb*@KF!C)Yo@SOQdLh2KP^(KQ7dWJD3}=)MdG9r4Cj0?9nPQR z!-~0YwkM_dO{c>$Ny>!u;5$y>Yx{n?+i5f21!1NY2hCTg? zX13TE8y&IgsmkfJaEfWgh*jrRjk`4I=H)T-qcmux z$Vc0}p73N)81uaE-LK&;vn+o?=2z5IfV%o`ROOfFAL??(q=Le$YdAE4DQl8p)S&Ga zLo#1wle{Vp`s`|SA{G*+*v;af`b$S)Iym(_vaej~l(Ea(^cPF3dJAK1yk(ciDpn)9 zF-?e(Xqe?&3so#)shpoqIneCvQIr5#5rL)PgLHZVhwwfA`M#)$U?iGh;_Ul%z#<3|MMX0kP z1C1E9_<-WB5?sf;u{4R9Ox$8<*f&jvmt{qfuZB$1lTxaXOm}HATq>mTQlN1gwd$Jg zgU&$dRh5{;>AJI0yCRwc?TlPk6<)r2nrKU7mAMVSxR*B>?5=AdbCl1~Q|8o;>uzy< z@x>Re`-S^_mvrdvMR>S9ci=wjEgid|tY2(}p@Q6AvsbX=?#T6wXuSurty69+v}iiI zG%Zus{Z2X?jV>?N(|A~tWT95e{Ow86sWN)U%ZualrcaiHJg>{eB+W0>ZO{|u)63N? z)FhCmy*x=-1Y#7+)j2^`Cs)B%9Tcf{Uca8bt~18Shc7#M z{`fJBk6->(byjt%>fytx(>beOK79E2<>TYmkCXi2=y5%H`7oUvSJm0OwSC)>x3LceG8-pel^-D^L3_;7#t z@X@1(FSqYukB=VT+Z#N2L|XMleRci%&3Jfy#X3^6_4y@}?91y5E&CitJiCvkb*WKm zT#jifnx(i=-__-XZuDQZgJX!wM^lfM&?~xAkIQ*kj>q%*@^m^J&KYv1RaLU~JSsEH z^0b_umKul*JLyA|Ifk)bpO4SQv|94iv-$hFoHL+{pGk{CPtRx5bIoKJ2NCw|^mN9; z#<=5Z;8kv%(Z^8ANt%R7^0OqlLi{!}=uK4{1^z!X%PCXZ!p{RXXZ%qxX4OO^P1@A^ zAZWKcS&(LG*tySQE%U3OozdFHZ1>b}I^DhPZZQ7pIt|jQ%FNRHU3awoZ9Qft5(MuS z^Wyw}pP!%qbX@oRL)t6TVdli)?$*}s?(Wu)!E#<-jZYVoi=%OoTr4K}<#Cn0FV4`TZ0`c~n=$&&Jgm3-ob0V`^DanQP{Ya~wykgzq-#s+A!E58gfkIz&VW$gz^nN?;W%_qoNLnLo5Ww3!@8SwcB5a`-q zAgbPk=%LGCwhR`Z*|l!c#+OC3V5Pjc*1l_LW?8p($s)8Gy6rLvk|-5%Ek<>-p+mD9b1BkbBe~#brnro$lW=wjQ)$ku4>KU`*Z`^m~-MDYZH#-K}5P>N1 zgTv<41#am>y`*+DyC8!B+Dp+TQR_U)ns+)#>msQ>)! zuMY-;-paxA>jP9K4;!@=!KTd^qMY?KNhpLCB zrv}ch;N+g>U$;G&N79Vru0b2GyITvQ#5OMorTX6K4D`wU5m+yor9Md*b!){pPT_xk~ ze)A1`GOGM$9FUdzg8}KOsMKer!T&$#(;Eqcm}M80kR;>2*H=xXQ;EHN;>D^RhD@Jk zHdK*HpQ)&(k3p>LH>PSov3E(qgi$FQ!m?v3JcSN5a`}^2nv`tjkt`e9PQpuYHp_gs z#cT9@l041X4sa7P!FB|dOskkxUHh$`yj}4f6heyM?f4y^beZh)^nEt}jH+lV7Ez;p z-%`|i{r8!yrW>6-GNsR=;e0@q249*``^7~ zJ7~nK1|`Y_22zR|Aj;gBB|G|1QkagLUGA>WW)J~=n(;WWvrU6I8fhj4+b7Qb%+T{)ondlS5 zgkRE##qD|eTPALn+VX7%DxNqPVdMorOC4SVYaGMvdRu)~B#J+)HPlfTH6NymOCF}@ z(W>uEflvbd`Fk8GWl=>D@A1|LwkH~ z)x+M8p1IG|62b$i3rsA@dTax(Ys0VYcle{^%k3|De>TbPQ3nhDcaXH&H$z&UBzdw| z=${#EuXor%Hl%f%#v=K%>0CK%73=5R_x=0+{rk?a-G0<&2eWA&cg&_J$Y zgYV{#{GSA7crE;`RR8^`lEVMl99>8XD!DcIwkQjKlxtp+ws;|Mi?Af8cMEGelJ zsW_NOFk+iAn~1o%D<0@BPc~XnP#ndmGWi)LO*|@uVNe_seS~EhZ7C3MG9@Hq@o1X)yU_0};M0l!?uva{?yvb8oYe62mzr_Xnw}@g(atnW@=6m@ z79?2m+W!5cZr#hIr&YOD5ISCT6?sVQ>I3M3Xd6EsEh=#*q{)B;wkzJZ-l}6P} zk{A2T^^M*bPkvJR{H-oa^C!joG&@Vbo1dOn$t0VrYMJKYBo|f))XbfJML}U=gqgSOhEr76FTZMZh9p z5wHkY1S|p;0gHe|z#?D~un1TLECRm`0yl5mew)}fjzz#CU=gqgSOhEr76FTZMZh9p z5wHkY1S|p;0gHe|z#?D~un1TLECLn*i-1MIB481)2v`Ix0u}*_fJML}U=gqgSOhEr z76FTZMZh9p5wHkY1S|p;0gHe|z#?D~un1TLECLn*i-1MIB481)2v`Ix0u}*_fJML} zU=gqgSOhEr76FTZMZh9p5wHkY1S|p;0gJ%D4S}1lK{|msgKfiO!-~)i*V4+_u{npm z)|`jRd8u{DIdmM`x+qIdk1c1$uhwa>1nM!zR@WJaQjT?OtjL@Ii-h@D=f86LYi7Lj zvctivoXD!U+!?2^W>saPO^L(FdQ%s!$OS)6#xsv59b#6bS>QPyb3&}_l2ho=*MxL9 z2#^$NOwvZ%EK{E9q^=Xf5UpgTfiXGyuUM%^Tm|tnVvv^;(=aFw@`y$Tl_4Y*#dKPv zd4ree+A8hK!0gyYQf8nuA`^t7Cwo=!=vs1XgqkYaI+p&*#g5w2Le z0XI=VsZ(#|&ht5Fky|BQRSo6_=CV9eIpa_2xsV_ZhqH4Gq9SroFj?VHTruO*SSYT% zgo(mH)%jf7kPebl?mXvkWkeDMsbtGQp~#>>A)7OVYbA+%G9xNaPm3u^quZ3&9DjIv zs-mXSq>F_Vk<}CzAj4SK)A?LFDQi58tQv1Q(1`FO9c(Q35~&jJQs)HE-(v_DB`EiN zN(hy-EXQ?*hoNe*Fq)B7F)26lU+SQz!B%cEMRw4J+^AgeD}0Jg>|~eRU;-nRPe68> zlEW$}ma1bRd|DL5;(*5)Q7GAlvk;I-6*rj}3pA23#f#R{tPouEBvSr4Ss4f5QoKrdEJpy>{WHj*|fA34$>T}o2c

XIxdan5o#(3We0I zo{ed{XgizfEK!NVp@bW%%6w9s*GXEY^Fp27ET80Anw1|fA8|H!Ij@q%ry$iK!sf(f z&RtHDILgzo)^beB@{e2;s|JthmJyG3z>*hVmoE0t$4;`pfjRz9rRC5{(Z8%N(E&G%n9b) z3r#pKWPF0IuY>vZ?rySi3ie8b)0|7KN_j)$@s0gcwz8U3)k?zE)x9t8i5e5j!)@bU z8xI@XI{ebwhBgvh=X1mFkIMSAJ*70t5oZPG`O~E6 zcDvPaUX4bhPT}WFNs4qf;e_Mj^7{Jv>Y6NGUTb~nV7_Fop1g9KYAV&zJdT zNNhgJ8Qt>YBc#puM-QXe)yF>1T1BBxlNusIZ{S2dzMkpCPCs%Y{rJvjPqGGH6mR_- zZ{jX5*Smemf6MFd_l-%DX_|tEQ6F$ZI^qn2)Uu_QdYUGe#T*AIej;0Ik}!@&B~ z51!%+&sR^M?sU7Yr#r1ypqP%+@_l@E0>X$1HG+&qYITFwP7v$_Fg=wgH+(BSaQz^q z`6xL~1F{};N5s0z{Hy=*FTeWL|M`ca_*Em3Qs=t)9PfvZAOG`z5^|gLkN=dWqcjM( z-@g6ey#4U@{3D-)2tV20=LqMh6L> zO|B+<47w_VATK6CG13RpXQN_zHsRyY#o1`0PgwIsx)7Z1`Ps_Ix zz8YIE7UP*dO<({0#}|Bn`@!@6?t!YCs2}zDB(Ud2=AsT$?>+DN(nEH_sl8D&@b;;f zy5QV6E2??)yK)mc@_=0 MHu^agd=v!#4;48@C;$Ke diff --git a/projects/1.19/assets/minecraft/minecraft/packer-policy.json b/projects/1.19/assets/minecraft/minecraft/packer-policy.json new file mode 100644 index 000000000000..5916ee4f8473 --- /dev/null +++ b/projects/1.19/assets/minecraft/minecraft/packer-policy.json @@ -0,0 +1,4 @@ +{ + "type": "plainclone", + "source": "./projects/1.16/minecraft/minecraft" +} \ No newline at end of file diff --git a/projects/1.19/assets/minecraft/minecraft/readme.md b/projects/1.19/assets/minecraft/minecraft/readme.md deleted file mode 100644 index 019ec9e42ef4..000000000000 --- a/projects/1.19/assets/minecraft/minecraft/readme.md +++ /dev/null @@ -1,24 +0,0 @@ -# 全角字符修正与特殊字符补充 -- 本包添加了几个特殊字符字体,用于补充部分新确定的元素名称 -- 本包修正了中文全角字符的宽度和位置问题。 - -## 本包建议翻译文本采用左侧书写,在打包阶段使用脚本转换成右侧字符 - -| 翻译文本 | 转换字符 | 备注 | -| :------: | :------------: | :----------------------------------: | -| [[钅卢]] | `\ue900` | | -| [[钅杜]] | `\ue901` | | -| [[钅喜]] | `\ue902` | | -| [[钅波]] | `\ue903` | | -| [[钅黑]] | `\ue904` | | -| [[钅麦]] | `\u9fcf` | | -| [[钅达]] | `\ue906` | | -| [[钅仑]] | `\ue907` | | -| [[钅哥]] | `\u9fd4` | | -| [[钅尔]] | `\u9fed` | | -| [[钅夫]] | `\ue90a` | | -| 镆 | `\u9546` | 此元素名已存在对应字符,无需修改替换 | -| [[钅立]] | `\ue90c` | | -| [[石田]] | `\u9fec` | | -| [[奥气]] | `\u9feb` | | -| …… | `\ue908\ue909` | 全角省略号的修改 | \ No newline at end of file diff --git a/projects/1.19/assets/minecraft/minecraft/textures/font/2em-dash.png b/projects/1.19/assets/minecraft/minecraft/textures/font/2em-dash.png deleted file mode 100644 index b683b4dd420e946726d3e92b40b28fe0129dd391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2829 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 diff --git a/projects/1.19/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.19/assets/minecraft/minecraft/textures/font/cjk_punctuations.png deleted file mode 100644 index 35d947f198184d507e5690f93c2a0eeee1772a40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 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 From c84b01f041a514bca60b6b30a4d5faeb200b4966 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Sat, 15 Jul 2023 16:14:34 +0800 Subject: [PATCH 09/25] hotfix6 --- .../1.16-fabric/assets/minecraft/minecraft/packer-policy.json | 2 +- .../1.18-fabric/assets/minecraft/minecraft/packer-policy.json | 2 +- projects/1.18/assets/minecraft/minecraft/packer-policy.json | 2 +- projects/1.19/assets/minecraft/minecraft/packer-policy.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json index 5916ee4f8473..75b22dfd6411 100644 --- a/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,4 @@ { "type": "plainclone", - "source": "./projects/1.16/minecraft/minecraft" + "source": "./projects/1.16/assets/minecraft/minecraft" } \ No newline at end of file diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json index 5916ee4f8473..75b22dfd6411 100644 --- a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,4 @@ { "type": "plainclone", - "source": "./projects/1.16/minecraft/minecraft" + "source": "./projects/1.16/assets/minecraft/minecraft" } \ No newline at end of file diff --git a/projects/1.18/assets/minecraft/minecraft/packer-policy.json b/projects/1.18/assets/minecraft/minecraft/packer-policy.json index 5916ee4f8473..75b22dfd6411 100644 --- a/projects/1.18/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.18/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,4 @@ { "type": "plainclone", - "source": "./projects/1.16/minecraft/minecraft" + "source": "./projects/1.16/assets/minecraft/minecraft" } \ No newline at end of file diff --git a/projects/1.19/assets/minecraft/minecraft/packer-policy.json b/projects/1.19/assets/minecraft/minecraft/packer-policy.json index 5916ee4f8473..75b22dfd6411 100644 --- a/projects/1.19/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.19/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,4 @@ { "type": "plainclone", - "source": "./projects/1.16/minecraft/minecraft" + "source": "./projects/1.16/assets/minecraft/minecraft" } \ No newline at end of file From 02828c22dd5bba2f1852819394c404e03c41023d Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Thu, 3 Aug 2023 10:40:26 +0800 Subject: [PATCH 10/25] hotfix7 --- .../minecraft/minecraft/font/default.json | 8 ++-- .../minecraft/minecraft/font/uniform.json | 43 ++++++++++++++++++ .../minecraft/textures/font/2em_dash.png | Bin 2829 -> 2829 bytes .../minecraft/minecraft/packer-policy.json | 7 ++- .../minecraft/font/defalut.json.patch | 14 ++++++ .../minecraft/minecraft/packer-policy.json | 7 ++- .../minecraft/font/default.json.patch | 22 +++++++++ .../minecraft/font/uniform.json.patch | 7 +++ .../minecraft/minecraft/packer-policy.json | 8 +++- 9 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 projects/1.16/assets/minecraft/minecraft/font/uniform.json create mode 100644 projects/1.18/assets/minecraft/minecraft/font/defalut.json.patch create mode 100644 projects/1.19/assets/minecraft/minecraft/font/default.json.patch create mode 100644 projects/1.19/assets/minecraft/minecraft/font/uniform.json.patch diff --git a/projects/1.16/assets/minecraft/minecraft/font/default.json b/projects/1.16/assets/minecraft/minecraft/font/default.json index 7a2c19d0aece..afdb490092cd 100644 --- a/projects/1.16/assets/minecraft/minecraft/font/default.json +++ b/projects/1.16/assets/minecraft/minecraft/font/default.json @@ -103,9 +103,7 @@ "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", - "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", - "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" ] }, { @@ -188,7 +186,7 @@ "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" ] }, { @@ -211,7 +209,7 @@ "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" ] }, { diff --git a/projects/1.16/assets/minecraft/minecraft/font/uniform.json b/projects/1.16/assets/minecraft/minecraft/font/uniform.json new file mode 100644 index 000000000000..6ec90af4a0fa --- /dev/null +++ b/projects/1.16/assets/minecraft/minecraft/font/uniform.json @@ -0,0 +1,43 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c\uff5e\u3008\u3009\u0000\u0000\u0000\u0000", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014\u00b7\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/2em_dash.png", + "ascent": 7, + "chars": [ + "\u2e3a" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} \ No newline at end of file diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/2em_dash.png b/projects/1.16/assets/minecraft/minecraft/textures/font/2em_dash.png index b683b4dd420e946726d3e92b40b28fe0129dd391..e8291ce5ab02b1c27575af310e60ba5fce84d609 100644 GIT binary patch delta 78 zcmeAb>lNE@oXc$^FM|TlkpujTTK{f0mA;_XYJ1RA@4=FtQyDu2421$2?sm+5vdg)J iLvX$v0|UeV|I7>vkF%Q==2zGPxeT7JelF{r5}E+Qd>sz} delta 78 zcmeAb>lNE@oXgFTmqCH&=mq;G&JXW5TRhk$8^x-h$*6vIEssY_$HWe%7jAD Date: Thu, 3 Aug 2023 15:18:47 +0800 Subject: [PATCH 11/25] hotfix8 --- .../minecraft/font/{defalut.json.patch => default.json.patch} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename projects/1.18/assets/minecraft/minecraft/font/{defalut.json.patch => default.json.patch} (100%) diff --git a/projects/1.18/assets/minecraft/minecraft/font/defalut.json.patch b/projects/1.18/assets/minecraft/minecraft/font/default.json.patch similarity index 100% rename from projects/1.18/assets/minecraft/minecraft/font/defalut.json.patch rename to projects/1.18/assets/minecraft/minecraft/font/default.json.patch From b80e95e58fd1ab85b175d90745b485be5a748c90 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Thu, 3 Aug 2023 16:20:04 +0800 Subject: [PATCH 12/25] hotfix9 --- .../1.18-fabric/assets/minecraft/minecraft/packer-policy.json | 2 +- projects/1.18/assets/minecraft/minecraft/packer-policy.json | 2 +- projects/1.19/assets/minecraft/minecraft/packer-policy.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json index f2efa12fca80..b6e662e582bd 100644 --- a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json @@ -2,6 +2,6 @@ "type": "patch", "source": "./projects/1.16/assets/minecraft/minecraft", "patches": { - "font/default.json": "./projects/1.18/minecraft/minecraft/font/default.json.patch" + "font/default.json": "./projects/1.18/assets/minecraft/minecraft/font/default.json.patch" } } \ No newline at end of file diff --git a/projects/1.18/assets/minecraft/minecraft/packer-policy.json b/projects/1.18/assets/minecraft/minecraft/packer-policy.json index f2efa12fca80..b6e662e582bd 100644 --- a/projects/1.18/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.18/assets/minecraft/minecraft/packer-policy.json @@ -2,6 +2,6 @@ "type": "patch", "source": "./projects/1.16/assets/minecraft/minecraft", "patches": { - "font/default.json": "./projects/1.18/minecraft/minecraft/font/default.json.patch" + "font/default.json": "./projects/1.18/assets/minecraft/minecraft/font/default.json.patch" } } \ No newline at end of file diff --git a/projects/1.19/assets/minecraft/minecraft/packer-policy.json b/projects/1.19/assets/minecraft/minecraft/packer-policy.json index d000f009375e..41f96a6ed37d 100644 --- a/projects/1.19/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.19/assets/minecraft/minecraft/packer-policy.json @@ -2,7 +2,7 @@ "type": "patch", "source": "./projects/1.16/assets/minecraft/minecraft", "patches": { - "font/default.json": "./projects/1.19/minecraft/minecraft/font/default.json.patch", - "font/uniform.json": "./projects/1.19/minecraft/minecraft/font/uniform.json.patch" + "font/default.json": "./projects/1.19/assets/minecraft/minecraft/font/default.json.patch", + "font/uniform.json": "./projects/1.19/assets/minecraft/minecraft/font/uniform.json.patch" } } \ No newline at end of file From 4639f45c2b07e9449b87b98141a48f5870115400 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Thu, 3 Aug 2023 16:32:09 +0800 Subject: [PATCH 13/25] hotfix10 --- Packer-Index-Doc.md | 7 +- .../minecraft/minecraft/packer-policy.json | 7 +- .../minecraft/minecraft/font/default.json | 223 +++++++++++++++++ .../minecraft/font/default.json.patch | 14 -- .../minecraft/minecraft/packer-policy.json | 7 +- .../minecraft/minecraft/font/default.json | 230 ++++++++++++++++++ .../minecraft/font/default.json.patch | 22 -- .../minecraft/minecraft/font/uniform.json | 50 ++++ .../minecraft/font/uniform.json.patch | 7 - .../minecraft/minecraft/packer-policy.json | 8 +- src/Packer/Extensions/DirectoryExtension.cs | 9 +- 11 files changed, 521 insertions(+), 63 deletions(-) create mode 100644 projects/1.18/assets/minecraft/minecraft/font/default.json delete mode 100644 projects/1.18/assets/minecraft/minecraft/font/default.json.patch create mode 100644 projects/1.19/assets/minecraft/minecraft/font/default.json delete mode 100644 projects/1.19/assets/minecraft/minecraft/font/default.json.patch create mode 100644 projects/1.19/assets/minecraft/minecraft/font/uniform.json delete mode 100644 projects/1.19/assets/minecraft/minecraft/font/uniform.json.patch diff --git a/Packer-Index-Doc.md b/Packer-Index-Doc.md index eb26db82fb8b..c7c4753bc9bc 100644 --- a/Packer-Index-Doc.md +++ b/Packer-Index-Doc.md @@ -2,8 +2,11 @@ 本仓库的打包器支持对不同模组使用不同的**检索策略**。 ## 注意事项 -- 检索策略仅对**文本文件**有效;**非文本文件**无法通过默认的检索途径,需要在`config/packer.json`中设置绕过检索。详见[此处](./CONTRIBUTING.md#configpackerjson)。 -- 检索策略目前不支持递归调用;所有对于其余位置的引用都不会读取引用位置的`packer-policy.json`。 +- 检索策略仅对**未配置为跳过处理**的文件有正常行为。在`clonemissing`和`backport`下,目前而言,**跳过处理的文件**均优先取**既有文件**;在`patch`下,目前**并不**支持对**跳过处理的文件**添加修改包。 + - 既有的全局配置中,在`font/`和`textures/`下的文件全部**跳过处理**,即便是文本文件。 + - 关于全局配置中的跳过选项,详见[此处](./CONTRIBUTING.md#configpackerjson)。 +- 目前而言,`patch`策略还不支持递归调用。`noaction`显然没有递归之忧。对于其他选项,打包器支持**递归调用**:对其他目录的引用可以包含其中的`packer-policy.json`;打包器可以在该目录建立新的**自定义检索策略**。 + - 如果遇到**循环引用**,打包器可能不会自动中止,而是持续运行,直到*栈溢出*;应当尽量避免这一情况的发生。 ## 策略配置 diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json index b6e662e582bd..85deacc1c0bc 100644 --- a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json @@ -1,7 +1,4 @@ { - "type": "patch", - "source": "./projects/1.16/assets/minecraft/minecraft", - "patches": { - "font/default.json": "./projects/1.18/assets/minecraft/minecraft/font/default.json.patch" - } + "type": "plainclone", + "source": "./projects/1.18/assets/minecraft/minecraft" } \ No newline at end of file diff --git a/projects/1.18/assets/minecraft/minecraft/font/default.json b/projects/1.18/assets/minecraft/minecraft/font/default.json new file mode 100644 index 000000000000..7a2c19d0aece --- /dev/null +++ b/projects/1.18/assets/minecraft/minecraft/font/default.json @@ -0,0 +1,223 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c\uff5e\u3008\u3009\u0000\u0000\u0000\u0000", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014\u00b7\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/2em_dash.png", + "ascent": 7, + "chars": [ + "\u2e3a" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", + "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", + "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} diff --git a/projects/1.18/assets/minecraft/minecraft/font/default.json.patch b/projects/1.18/assets/minecraft/minecraft/font/default.json.patch deleted file mode 100644 index 1c5b9329f43e..000000000000 --- a/projects/1.18/assets/minecraft/minecraft/font/default.json.patch +++ /dev/null @@ -1,14 +0,0 @@ -@@ -8979,16 +8979,266 @@ - d%5Cudee1%5C -+u2702%5Cud83c%5Cudf56%5Cud83e%5Cudea3%5Cud83d%5Cudd14%5Cu23f3%5Cu2691%5Cu20a0%5Cu20a1%5Cu20a2%5Cu20a3%5Cu20a4%5Cu20a5%22,%0A %22%5Cu20a6%5Cu20a9%5Cu20ab%5Cu20ad%5Cu20ae%5Cu20b0%5Cu20b1%5Cu20b2%5Cu20b3%5Cu20b5%5Cu20b6%5Cu20b7%5Cu20b8%5Cu20b9%5Cu20ba%5Cu20bb%22,%0A %22%5Cu20bc%5Cu20bf%5Cu0000%5Cu0000%5C - u0000%5Cu0 -@@ -18114,26 +18114,26 @@ - %5Cu2158%5Cu --0000%5Cu0000 -+20a8%5Cu20af - %5Cu0000%5Cu -@@ -20174,18 +20174,18 @@ - 2219%5Cu00 --b7 -+00 - %5Cu221a%5Cu \ No newline at end of file diff --git a/projects/1.18/assets/minecraft/minecraft/packer-policy.json b/projects/1.18/assets/minecraft/minecraft/packer-policy.json index b6e662e582bd..88d41319434e 100644 --- a/projects/1.18/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.18/assets/minecraft/minecraft/packer-policy.json @@ -1,7 +1,4 @@ { - "type": "patch", - "source": "./projects/1.16/assets/minecraft/minecraft", - "patches": { - "font/default.json": "./projects/1.18/assets/minecraft/minecraft/font/default.json.patch" - } + "type": "clonemissing", + "source": "./projects/1.16/assets/minecraft/minecraft" } \ No newline at end of file diff --git a/projects/1.19/assets/minecraft/minecraft/font/default.json b/projects/1.19/assets/minecraft/minecraft/font/default.json new file mode 100644 index 000000000000..fad7c5d36609 --- /dev/null +++ b/projects/1.19/assets/minecraft/minecraft/font/default.json @@ -0,0 +1,230 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c\uff5e\u3008\u3009\u0000\u0000\u0000\u0000", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014\u00b7\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/2em_dash.png", + "ascent": 7, + "chars": [ + "\u2e3a" + ] + }, + { + "type": "space", + "advances": { + " ": 4, + "\u200c": 0 + } + }, + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5", + "\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb", + "\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u20a8\u20af\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} diff --git a/projects/1.19/assets/minecraft/minecraft/font/default.json.patch b/projects/1.19/assets/minecraft/minecraft/font/default.json.patch deleted file mode 100644 index 0d40322f4a87..000000000000 --- a/projects/1.19/assets/minecraft/minecraft/font/default.json.patch +++ /dev/null @@ -1,22 +0,0 @@ -@@ -1145,32 +1145,174 @@ - %7D,%0A %7B%0A -+ %22type%22: %22space%22,%0A %22advances%22: %7B%0A %22 %22: 4,%0A %22%5Cu200c%22: 0%0A %7D%0A %7D,%0A %7B%0A - %22typ -@@ -1317,32 +1317,32 @@ - ype%22: %22bitmap%22,%0A -- - %22fil -@@ -9121,16 +9121,266 @@ - d%5Cudee1%5C -+u2702%5Cud83c%5Cudf56%5Cud83e%5Cudea3%5Cud83d%5Cudd14%5Cu23f3%5Cu2691%5Cu20a0%5Cu20a1%5Cu20a2%5Cu20a3%5Cu20a4%5Cu20a5%22,%0A %22%5Cu20a6%5Cu20a9%5Cu20ab%5Cu20ad%5Cu20ae%5Cu20b0%5Cu20b1%5Cu20b2%5Cu20b3%5Cu20b5%5Cu20b6%5Cu20b7%5Cu20b8%5Cu20b9%5Cu20ba%5Cu20bb%22,%0A %22%5Cu20bc%5Cu20bf%5Cu0000%5Cu0000%5C - u0000%5Cu0 -@@ -18256,26 +18256,26 @@ - %5Cu2158%5Cu --0000%5Cu0000 -+20a8%5Cu20af - %5Cu0000%5Cu -@@ -20316,18 +20316,18 @@ - 2219%5Cu00 --b7 -+00 - %5Cu221a%5Cu \ No newline at end of file diff --git a/projects/1.19/assets/minecraft/minecraft/font/uniform.json b/projects/1.19/assets/minecraft/minecraft/font/uniform.json new file mode 100644 index 000000000000..ace87244aefc --- /dev/null +++ b/projects/1.19/assets/minecraft/minecraft/font/uniform.json @@ -0,0 +1,50 @@ +{ + "providers": [ + { + "type":"bitmap", + "file": "minecraft:font/element_ideographs.png", + "ascent": 7, + "chars": [ + "\ud872\udf3b\ud872\udf4a\ud872\udf73\ud872\udf5b\ud872\udf76\u9fcf\ud86d\udffc", + "\ud872\udf2d\u9fd4\ud86d\udce7\ud86d\udff7\u9feb\u9fec\u9fed" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c\uff5e\u3008\u3009\u0000\u0000\u0000\u0000", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014\u00b7\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/2em_dash.png", + "ascent": 7, + "chars": [ + "\u2e3a" + ] + }, + { + "type": "space", + "advances": { + " ": 4, + "\u200c": 0 + } + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} diff --git a/projects/1.19/assets/minecraft/minecraft/font/uniform.json.patch b/projects/1.19/assets/minecraft/minecraft/font/uniform.json.patch deleted file mode 100644 index fcf0bffc2105..000000000000 --- a/projects/1.19/assets/minecraft/minecraft/font/uniform.json.patch +++ /dev/null @@ -1,7 +0,0 @@ -@@ -1145,32 +1145,174 @@ - %7D,%0A %7B%0A -+ %22type%22: %22space%22,%0A %22advances%22: %7B%0A %22 %22: 4,%0A %22%5Cu200c%22: 0%0A %7D%0A %7D,%0A %7B%0A - %22typ -@@ -1466,8 +1466,9 @@ - %0A %5D%0A%7D -+%0A \ No newline at end of file diff --git a/projects/1.19/assets/minecraft/minecraft/packer-policy.json b/projects/1.19/assets/minecraft/minecraft/packer-policy.json index 41f96a6ed37d..88d41319434e 100644 --- a/projects/1.19/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.19/assets/minecraft/minecraft/packer-policy.json @@ -1,8 +1,4 @@ { - "type": "patch", - "source": "./projects/1.16/assets/minecraft/minecraft", - "patches": { - "font/default.json": "./projects/1.19/assets/minecraft/minecraft/font/default.json.patch", - "font/uniform.json": "./projects/1.19/assets/minecraft/minecraft/font/uniform.json.patch" - } + "type": "clonemissing", + "source": "./projects/1.16/assets/minecraft/minecraft" } \ No newline at end of file diff --git a/src/Packer/Extensions/DirectoryExtension.cs b/src/Packer/Extensions/DirectoryExtension.cs index 0e33fbb39ccf..ac5a3e3e63ad 100644 --- a/src/Packer/Extensions/DirectoryExtension.cs +++ b/src/Packer/Extensions/DirectoryExtension.cs @@ -1,5 +1,6 @@ using Packer.Models; using Serilog; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -79,7 +80,7 @@ static IEnumerable FromIndirectDirectory(DirectoryInfo assetDire Config config, ref Dictionary unprocessed, Dictionary parameters) - => FromImmediateDirectory(new DirectoryInfo(parameters["source"].GetString()), config, ref unprocessed, parameters); + => AggregateAssetFiles(new DirectoryInfo(parameters["source"].GetString()), config, ref unprocessed); static IEnumerable FromPatches(DirectoryInfo assetDirectory, Config config, @@ -91,7 +92,6 @@ static IEnumerable FromPatches(DirectoryInfo assetDirectory, var patchList = JsonSerializer.Deserialize>(parameters["patches"]); foreach (var patch in patchList) { - //Log.Information("{0}", reference.Keys); Log.Information("对文件 {0} 应用 {1} 处的 patch。", patch.Key, patch.Value); reference.Remove(patch.Key, out var target); var patchText = string.Join('\n', File.ReadAllLines(patch.Value)); // 不要问我为什么D-M-P默认换行是LF @@ -132,6 +132,11 @@ static IEnumerable FromImmediateDirectory(DirectoryInfo assetDir Log.Information("跳过了标记为直接加入的命名空间:{0} -> {1}", relativePath.Split('/')[0], target); + + if (bypassed.ContainsValue(target)){ + Log.Warning("在未处理文件中检测到重复项。丢弃将要加入的新项"); + return null; + } bypassed.Add(file.FullName, target); return null; } From c96cb7559cf684bba8f62088f07c9aba69924131 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Fri, 8 Sep 2023 14:46:14 +0800 Subject: [PATCH 14/25] hotfix10 --- .../minecraft/textures/font/2em_dash.png | Bin 2829 -> 2825 bytes .../textures/font/cjk_punctuations.png | Bin 3275 -> 3317 bytes .../textures/font/element_ideographs.png | Bin 3739 -> 3612 bytes .../minecraft/textures/font/ellipsis.png | Bin 2843 -> 2844 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/2em_dash.png b/projects/1.16/assets/minecraft/minecraft/textures/font/2em_dash.png index e8291ce5ab02b1c27575af310e60ba5fce84d609..edd2703063f0864729a15bc1af337f19e17d865a 100644 GIT binary patch delta 83 zcmeAb>lE9tkIUQ4)5S5Q;#Sh1|Nrd|J20!YIWoA(8ougqe90lk#@6<~`JiCW;)_6m jK=&RiCVmDW`2U}oLCTj!F-PHbCW!Cp>gTe~DWM4fR9YS5 delta 87 zcmV-d0I2_o7L69Lz6wt|NklqJ{mpH5vzm tF%nS#-H4s!xky$XKfR2Dqr)S_;(@{(XUQUeksNt5!hS+ z&Ov{g0N#^9I^Xk{_)-0r{pu%9@M^~Z5x@b!3vB-{0Yn5g6o7xH)j!e&h|w{gC4dC= ztI3id5$NE{5G=p<5FtKN*^fGXmsVku$z=)-Ab9nku@?Z>agx*6Yln-may7&s2LK7& ziUyTNu&D!RS=C$I0>qRjr6cII^WJ3x4gg?+KzP*jB!7nku&9^3PDH730THXe8XW_E zH9g7SDF8BLUJ%DHtAo&OP03`7$_T&O0Yk%#04}3*{;HBaz%}xaq67ed1qC3} z9bW)|5@4v7on?JTH{W{O^REbWVR>YF|L45R8FYvrgbRRfA_6l7gj0B7SpkqFWx$C2-(}@QL}05u zfXKudy>~pFBp5$R00`1@x6>zobr{We4^49qala}pDy zRSYnfd$H~FIF7#u0Nj$-V!u}#pO0*}d{~YF|G5Ag3qTg6@-^>?|4oD<+SSR$FGb%Y z0-FoKdC;#WfcIn&<9i+xKdSw*U46s}UTq&B0yqG;f$je#fQWyf) z0YCz`qCwFJHgy0kt9pxDfS7nvIs&Vm_l^xX0DuVs;gRVneuD!Tk(azqM5%EB5v#ur zItKhQJ;iSn0O@}$U@hz(K(q)@{GEFMl6V!nasiRqUybj9uLw~50|cNatDPOh?gOC| ze<~56_>DZd92fuxu=?uDDh!Z705qWZxftZSf4Cn3RP!zhx999FC67%nerXg;zyW+L zbXjDA;{vYxhQDNCyFCB^7%Tvp?)U-#M1Za=JIng^ZoYq6KQDv&4Q|HBi-EWa!lec0dLLpL=k`q0iXTkQcv7EbTI>m)({5dmO|07PV4buQqQ1qh&te*gdg c|NjF3y15daSNU&bP5=M^07*qoM6N<$f>f*PlmGw# diff --git a/projects/1.16/assets/minecraft/minecraft/textures/font/element_ideographs.png b/projects/1.16/assets/minecraft/minecraft/textures/font/element_ideographs.png index 2f4dbbfd995c190b65ceffe8421f4c91b14d7473..387588f10c50f6256edf18a8041bd4a5623713f6 100644 GIT binary patch delta 876 zcmV-y1C#ul9h@Anz6yUyNklvwr3 z3WouKpE?mf+t4JqttblnVkScJOOS`YlR~$wokW z!R$n`Fy;%Tu>5_Z6cvJ29tl!*6X;DiNKia=G{i2Dp0(N}5-`N@$3`LdWQX0KFFZ4w zMMv_7Fh3eFI`V%kC*fzsKk`y1V=V~SRI^B!7Gg5{-zGaF$s~fJtOqm3S$R;l-c&p+ z^F8uDHB0qO7OEOmg_`a{*@^F2==Ow+9>j4~C;$F$6gG(iiVshmz~7trcgW8sYjSe* zIv~6^8t)D@Fuo*V5*wxc7iFU>dL(okC3@Hyu#y%((a?X+Kox`{d=*RYv`BPhvYzKk zC#GTmwGK2gR(cbE5XwaHFzw_A(UrnR-jCnDio#!l;W2rBgqmmup%>XX@y&N557P`1 ze**paq^I#DK+)9;1^?Ayj(8gMsi zQ5w^h^ag(~Dk(#MBI}NlrI!7VMhIcMIN!R?z_g}3;dyMQCgPJqhaoB^JLN_KqE><{ zCzOG36g~c1ana1oqj{hkHy4ZMSxzdtd!AOgdy|2_Dh#WK6T5k!8#k(nXp~y3bDoyz zbX1d^YW$5F@*f?ZAr_Q&t81zohMk>9D&-H8lth2@X!K~t2J$>`c5*W@Y8TMeTU}jQ zEIZb!#BgT1!N`wy2(8|lis+SYN5{M^irMPzGuFdh@S@87q5szFfjX%RD%IOym11An z^S3Vd!p!`20E#+b=Uenl1G!7S7WpglKy@VJg;S>}HYzuEVF1B<#;D!%&~1`49_Wam z2{L3((sx~*K!bNiGtICQ!;D?BF(K3LVw(wU-N|O4(O_2jKLr-0VepIGC>GC^P}I91 zSHgHZMPdPIeoIdNKG)>k9WHlsyDOvsSj@1i+k=jI{+0000e@2oT zkwu0BX%Jx<-ankLPcOAR6M<0gdj<`T@V5**LvK`2$byHL9y~Y`$2dp?s+D>Viq%Tf}9o6Pc` zqfiY8;>7+|2IgcHtqJ)(uk=yMJS) z9j*U@KsVZiU3ky-Y5$Atl*xhKQA=hpO`FjmMJ4Uf->AAXQ<`o0Gv|S$5dKs&>M0{c z@FW|N7Zp9|Vel3@^rT{VQ_;~WcE-aq9*RIX7bAcEU*$z2BI!<}%8L=uAb%ijDOW*7 zujn%aVR4LeYWQ#iL1fc8`F$GkHqxr;9mY6H7Dm>MO=JcKQA?3+FIL}IZpE!~par4G zd1N@Cx6T8H!T9qtQ+yXC3t^{+2buOKLW>5_@1zQ3rfeFrQ|`{jr!n6~jxG$1z>}jK zCrN*&*sWsOi9{_pmQ^_ALG-C+KeOlCm8&}(e}SRjiqLVYK^{f=jIvs=2l)lVZAT#DeVT|^O&Zjz zzK|%)&J@{*ruk}M#9I$I?rOhg^!E#JIn!jfLy$3w6QQiPuX1<9n-4^1>hz@p<#J1U z)oveUi*>Y#Ut7eN3{RH3N+%l$V0R^gSEY4*`!LS>ZZwLVcxh4h!Lr~@|& a{|o>F@WSF*>Fo*t0000*Db_*Bp2$&dZx_G1D zSw;pBsNsxA&#StZyWgS811!L>i&2_^;s1YT21PUO|8^>Ubs%9+S3j3^P6 Date: Fri, 8 Sep 2023 16:03:11 +0800 Subject: [PATCH 15/25] Initialize 1.20 --- .github/workflows/packer.yml | 256 ++++++------------ .github/workflows/pr-packer.yml | 184 ++++--------- config/packer/1.20-fabric.json | 37 +++ config/packer/1.20.json | 37 +++ projects/1.20-fabric/README.md | 59 ++++ .../minecraft/minecraft/packer-policy.json | 4 + projects/1.20/README.md | 59 ++++ .../minecraft/minecraft/font/default.json | 20 ++ .../font/include/cjk-punctuations.json | 29 ++ .../minecraft/minecraft/font/uniform.json | 16 ++ .../1.20/assets/minecraft/minecraft/readme.md | 24 ++ .../minecraft/textures/font/2em-dash.png | Bin 0 -> 2829 bytes .../textures/font/cjk_punctuations.png | Bin 0 -> 3275 bytes .../minecraft/textures/font/ellipsis.png | Bin 0 -> 2843 bytes src/Uploader/Program.cs | 10 +- 15 files changed, 434 insertions(+), 301 deletions(-) create mode 100644 config/packer/1.20-fabric.json create mode 100644 config/packer/1.20.json create mode 100644 projects/1.20-fabric/README.md create mode 100644 projects/1.20-fabric/assets/minecraft/minecraft/packer-policy.json create mode 100644 projects/1.20/README.md create mode 100644 projects/1.20/assets/minecraft/minecraft/font/default.json create mode 100644 projects/1.20/assets/minecraft/minecraft/font/include/cjk-punctuations.json create mode 100644 projects/1.20/assets/minecraft/minecraft/font/uniform.json create mode 100644 projects/1.20/assets/minecraft/minecraft/readme.md create mode 100644 projects/1.20/assets/minecraft/minecraft/textures/font/2em-dash.png create mode 100644 projects/1.20/assets/minecraft/minecraft/textures/font/cjk_punctuations.png create mode 100644 projects/1.20/assets/minecraft/minecraft/textures/font/ellipsis.png diff --git a/.github/workflows/packer.yml b/.github/workflows/packer.yml index 870327a997ce..0856534b1e2a 100644 --- a/.github/workflows/packer.yml +++ b/.github/workflows/packer.yml @@ -5,197 +5,119 @@ on: push: branches: [main] paths: - - 'config/packer.json' - - 'config/fontmap.txt' + - 'src/**' + - 'config/packer/**' - 'projects/**' + + jobs: build: + if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' + name: Build / Cache Packer and Uploader runs-on: windows-latest steps: - uses: actions/checkout@v2 with: - fetch-depth: 20 ref: main - - name: Check changed path on 1.12 - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-1122 - with: - paths: projects/1.12.2 - - - name: Check changed path on 1.16 - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-116 - with: - paths: projects/1.16 - - - name: Check changed path on 1.16 fabric - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-116-fabric - with: - paths: projects/1.16-fabric - - - name: Check changed path on 1.18 - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-118 - with: - paths: projects/1.18 - - - name: Check changed path on 1.18 fabric - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-118-fabric + # 缓存程序。一方面,在不同job之间需要这么做;另一方面,大约可以改善运行时间? + # actions/cache的逻辑会在job末尾缓存打包程序;如果不命中,就自行构造程序。 + - name: Cache Packer + id: cache-packer + uses: actions/cache@v3 with: - paths: projects/1.18-fabric + key: ${{ runner.os }}-${{ hashFiles('source/Pakcer/**') }} + path: Packer.exe - - name: Check changed path on 1.19 - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-119 + - name: Cache Uploader + id: cache-uploader + uses: actions/cache@v3 with: - paths: projects/1.19 - - # - name: Check changed path on 1.19 fabric - # uses: MarceloPrado/has-changed-path@v1.0 - # id: changed-119-fabric - # with: - # paths: projects/1.19-fabric - - - name: Build Packer + key: ${{ runner.os }}-${{ hashFiles('source/Uploader/**') }} + path: Uploader.exe + + # 构造程序 + - name: Build Packer if not cached + if: steps.cache-packer.outputs.cache_hit != 'true' run: dotnet publish .\src\Packer\Packer.csproj -o ./ -r win-x64 -p:PublishSingleFile=true - - name: Run Packer for 1.12.2 - run: ./Packer --version="1.12.2" - if: steps.changed-1122.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.16 - run: ./Packer --version="1.16" - if: steps.changed-116.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.16-fabric - run: ./Packer --version="1.16-fabric" - if: steps.changed-116-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.18 - run: ./Packer --version="1.18" - if: steps.changed-118.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.18-fabric - run: ./Packer --version="1.18-fabric" - if: steps.changed-118-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.19 - run: ./Packer --version="1.19" - if: steps.changed-119.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - # - name: Run Packer for 1.19-fabric - # run: ./Packer --version="1.19-fabric" - # if: steps.changed-119-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Create timestamp - id: create_timestamp - run: echo "::set-output name=timestamp::$(date '+%Y%m%d%H%M%s')" - shell: bash + - name: Build Uploader if not cached + if: steps.cache-uploader.outputs.cache_hit != 'true' + run: dotnet publish .\src\Uploader\Uploader.csproj -o ./ -r win-x64 -p:PublishSingeFile=true - # Create the release: https://github.com/actions/create-release - - name: Create release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: Snapshot-${{ steps.create_timestamp.outputs.timestamp }} - release_name: 汉化资源包-Snapshot-${{ steps.create_timestamp.outputs.timestamp }} - draft: false - prerelease: false - # Upload release asset: https://github.com/actions/upload-release-asset - - name: Update release asset for 1.12 - id: upload-release-asset1 - if: steps.changed-1122.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + pack: + if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' + name: Pack Resources and Upload Artifacts + needs: build # 显然,需要存在缓存/已经构造,才能打包。 + strategy: + matrix: + # 支持版本列表。将对这里的每个版本判断,按需打包。 + # 如需添加新版本,在这里添加即可。 + version: ["1.12.2", "1.16", "1.16-fabric", "1.18", "1.18-fabric", "1.19", "1.20", "1.20-fabric"] + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: Minecraft-Mod-Language-Package-1.12.2.zip - asset_name: Minecraft-Mod-Language-Package-1.12.2.zip - asset_content_type: application/zip - - - name: Update release asset for 1.16 - id: upload-release-asset2 - if: steps.changed-116.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 20 + ref: main + + # 由于Github的限制,这里需要重新拉取打包程序。 + - name: Restore Packer + id: cache-restore + uses: actions/cache/restore@v3 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: Minecraft-Mod-Language-Package-1.16.zip - asset_name: Minecraft-Mod-Language-Package-1.16.zip - asset_content_type: application/zip + key: ${{ runner.os }}-${{ hashFiles('source/Pakcer/**') }} + path: Packer.exe + fail-on-cache-miss: true # 前一步理应构造过的。如果不命中,肯定有问题,不如直接挂掉。 - - - name: Update release asset for 1.16-fabric - id: upload-release-asset3 - if: steps.changed-116-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Check changed path on ${{ matrix.version }} + uses: MarceloPrado/has-changed-path@v1.0 + id: check-changes with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: Minecraft-Mod-Language-Package-1.16-fabric.zip - asset_name: Minecraft-Mod-Language-Package-1.16-fabric.zip - asset_content_type: application/zip - - - name: Update release asset for 1.18 - id: upload-release-asset4 - if: steps.changed-118.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # 判断位置:该版本文件、该版本配置、代码 + paths: | + projects/${{ matrix.version }} + config/packer/${{ matrix.version }}.json + src/** + + - name: Run Packer for ${{ matrix.version }} + run: ./Packer --version="${{ matrix.version }}" + # 运行逻辑:内容有更改 或 手动运行 + if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' + + # 上传内容:每个版本一个压缩包,包含了资源包和md5校验文件 + - name: Upload Artifact for ${{ matrix.version }} + uses: actions/upload-artifact@v3.0.0 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: Minecraft-Mod-Language-Package-1.18.zip - asset_name: Minecraft-Mod-Language-Package-1.18.zip - asset_content_type: application/zip - - - name: Update release asset for 1.18-fabric - id: upload-release-asset5 - if: steps.changed-118-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + name: Minecraft-Mod-Language-Package-${{ matrix.version }} + path: | + Minecraft-Mod-Language-Package-${{ matrix.version }}.zip + ${{matrix.version}}.md5 + if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' + + + upload: + if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' + name: Upload Resource Packs to Remote Server + needs: pack # 显然,需要打包完成后才可以上传给分发服务器 + runs-on: windows-latest + steps: + # 由于Github的限制,这里需要重新拉取打包程序。 + - name: Restore Packer + id: cache-restore + uses: actions/cache/restore@v3 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: Minecraft-Mod-Language-Package-1.18-fabric.zip - asset_name: Minecraft-Mod-Language-Package-1.18-fabric.zip - asset_content_type: application/zip - - - name: Update release asset for 1.19 - id: upload-release-asset6 - if: steps.changed-119.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + key: ${{ runner.os }}-${{ hashFiles('source/Uploader/**') }} + path: Uploader.exe + fail-on-cache-miss: true # 前一步理应构造过的。如果不命中,肯定有问题,不如直接挂掉。 + + # 还原artifact(资源包) + - name: Restore Artifacts + uses: actions/download-artifact@v3 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: Minecraft-Mod-Language-Package-1.19.zip - asset_name: Minecraft-Mod-Language-Package-1.19.zip - asset_content_type: application/zip - - # - name: Update release asset for 1.18-fabric - # id: upload-release-asset7 - # if: steps.changed-119-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_release.outputs.upload_url }} - # asset_path: Minecraft-Mod-Language-Package-1.19-fabric.zip - # asset_name: Minecraft-Mod-Language-Package-1.19-fabric.zip - # asset_content_type: application/zip - - - name: Build Uploader - run: dotnet publish .\src\Uploader\Uploader.csproj -o ./ -r win-x64 -p:PublishSingeFile=true + path: artifacts/ - name: Run Uploader run: .\Uploader --host="${{ secrets.SSH_IP }}" --name="${{ secrets.SSH_USER }}" --password="${{ secrets.SSH_PWD }}" \ No newline at end of file diff --git a/.github/workflows/pr-packer.yml b/.github/workflows/pr-packer.yml index d9b39803ca3f..0eb035bba69e 100644 --- a/.github/workflows/pr-packer.yml +++ b/.github/workflows/pr-packer.yml @@ -1,163 +1,89 @@ -# This is a basic workflow to help you get started with Actions - name: PR Packer -# Controls when the workflow will run on: workflow_dispatch: pull_request: branches: [ main ] paths: - - 'config/packer.json' - - 'config/fontmap.txt' + - 'src/**' + - 'config/packer/**' - 'projects/**' jobs: build: + if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' + name: Build / Cache Packer runs-on: windows-latest steps: - uses: actions/checkout@v2 with: - fetch-depth: 20 + ref: main - - name: Check changed path on 1.12 - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-1122 + # 缓存程序。一方面,在不同job之间需要这么做;另一方面,大约可以改善运行时间? + # actions/cache的逻辑会在job末尾缓存打包程序;如果不命中,就自行构造程序。 + - name: Cache Packer + id: cache-packer + uses: actions/cache@v3 with: - paths: projects/1.12.2 + key: ${{ runner.os }}-${{ hashFiles('source/Pakcer/**') }} + path: Packer.exe - - name: Check changed path on 1.16 - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-116 - with: - paths: projects/1.16 + # 构造程序 + - name: Build Packer if not cached + if: steps.cache-packer.outputs.cache_hit != 'true' + run: dotnet publish .\src\Packer\Packer.csproj -o ./ -r win-x64 -p:PublishSingleFile=true - - name: Check changed path on 1.16 fabric - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-116-fabric - with: - paths: projects/1.16-fabric - - - name: Check changed path on 1.18 - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-118 - with: - paths: projects/1.18 - - name: Check changed path on 1.18 fabric - uses: MarceloPrado/has-changed-path@v1.0 - id: changed-118-fabric + pack: + if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' + name: Pack Resources and Upload Artifacts + needs: build # 显然,需要存在缓存/已经构造,才能打包。 + strategy: + matrix: + # 支持版本列表。将对这里的每个版本判断,按需打包。 + # 如需添加新版本,在这里添加即可。 + version: ["1.12.2", "1.16", "1.16-fabric", "1.18", "1.18-fabric", "1.19", "1.20", "1.20-fabric"] + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 20 + ref: main + + # 由于Github的限制,这里需要重新拉取打包程序。 + - name: Restore Packer + id: cache-restore + uses: actions/cache/restore@v3 with: - paths: projects/1.18-fabric + key: ${{ runner.os }}-${{ hashFiles('source/Pakcer/**') }} + path: Packer.exe + fail-on-cache-miss: true # 前一步理应构造过的。如果不命中,肯定有问题,不如直接挂掉。 - - name: Check changed path on 1.19 + - name: Check changed path on ${{ matrix.version }} uses: MarceloPrado/has-changed-path@v1.0 - id: changed-119 + id: check-changes with: - paths: projects/1.19 - - # - name: Check changed path on 1.19 fabric - # uses: MarceloPrado/has-changed-path@v1.0 - # id: changed-119-fabric - # with: - # paths: projects/1.19-fabric - - - name: Build Packer - run: dotnet publish .\src\Packer\Packer.csproj -o ./ -r win-x64 -p:PublishSingleFile=true - - - name: Run Packer for 1.12.2 - run: ./Packer --version="1.12.2" - if: steps.changed-1122.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' + # 判断位置:该版本文件、该版本配置、代码 + paths: | + projects/${{ matrix.version }} + config/packer/${{ matrix.version }}.json + src/** - - name: Run Packer for 1.16 - run: ./Packer --version="1.16" - if: steps.changed-116.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.16-fabric - run: ./Packer --version="1.16-fabric" - if: steps.changed-116-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.18 - run: ./Packer --version="1.18" - if: steps.changed-118.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.18-fabric - run: ./Packer --version="1.18-fabric" - if: steps.changed-118-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Run Packer for 1.19 - run: ./Packer --version="1.19" - if: steps.changed-119.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - # - name: Run Packer for 1.19-fabric - # run: ./Packer --version="1.19-fabric" - # if: steps.changed-119-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Create timestamp - id: create_timestamp - run: echo "::set-output name=timestamp::$(date '+%Y%m%d%H%M%s')" - shell: bash + - name: Run Packer for ${{ matrix.version }} + run: ./Packer --version="${{ matrix.version }}" + # 运行逻辑:内容有更改 或 手动运行 + if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' # 额 要两分半才能传完 然而 GitHub actions 直接传的话 会压成 zip 内套 zip 就这样了吧 --cy - name: Unzip Files - run: | - unzip -q Minecraft-Mod-Language-Package-1.19.zip -d Minecraft-Mod-Language-Package-1.19 || echo 0 - unzip -q Minecraft-Mod-Language-Package-1.16.zip -d Minecraft-Mod-Language-Package-1.16 || echo 0 - unzip -q Minecraft-Mod-Language-Package-1.18.zip -d Minecraft-Mod-Language-Package-1.18 || echo 0 - unzip -q Minecraft-Mod-Language-Package-1.16-fabric.zip -d Minecraft-Mod-Language-Package-1.16-fabric || echo 0 - unzip -q Minecraft-Mod-Language-Package-1.18-fabric.zip -d Minecraft-Mod-Language-Package-1.18-fabric || echo 0 - unzip -q Minecraft-Mod-Language-Package-1.12.2.zip -d Minecraft-Mod-Language-Package-1.12.2 || echo 0 - # unzip -q Minecraft-Mod-Language-Package-1.19-fabric.zip -d Minecraft-Mod-Language-Package-1.19-fabric || echo 0 + run: unzip -q Minecraft-Mod-Language-Package-${{ matrix.version }}.zip -d Minecraft-Mod-Language-Package-${{ matrix.version }} || echo 0 shell: bash - - name: Upload Artifact 1.12.2 - uses: actions/upload-artifact@v3.0.0 - with: - name: Minecraft-Mod-Language-Package-1.12.2 - path: Minecraft-Mod-Language-Package-1.12.2/* - if: steps.changed-1122.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Upload Artifact 1.16 - uses: actions/upload-artifact@v3.0.0 - with: - name: Minecraft-Mod-Language-Package-1.16 - path: Minecraft-Mod-Language-Package-1.16/* - if: steps.changed-116.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Upload Artifact 1.16 fabric - uses: actions/upload-artifact@v3.0.0 - with: - name: Minecraft-Mod-Language-Package-1.16-fabric - path: Minecraft-Mod-Language-Package-1.16-fabric/* - if: steps.changed-116-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Upload Artifact 1.18 - uses: actions/upload-artifact@v3.0.0 - with: - name: Minecraft-Mod-Language-Package-1.18 - path: Minecraft-Mod-Language-Package-1.18/* - if: steps.changed-118.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Upload Artifact 1.18 fabric - uses: actions/upload-artifact@v3.0.0 - with: - name: Minecraft-Mod-Language-Package-1.18-fabric - path: Minecraft-Mod-Language-Package-1.18-fabric/* - if: steps.changed-118-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - - name: Upload Artifact 1.19 + - name: Upload Artifact for ${{ matrix.version }} uses: actions/upload-artifact@v3.0.0 with: - name: Minecraft-Mod-Language-Package-1.19 - path: Minecraft-Mod-Language-Package-1.19/* - if: steps.changed-119.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - - # - name: Upload Artifact 1.19 fabric - # uses: actions/upload-artifact@v3.0.0 - # with: - # name: Minecraft-Mod-Language-Package-1.19-fabric - # path: Minecraft-Mod-Language-Package-1.19-fabric/* - # if: steps.changed-119-fabric.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - + name: Minecraft-Mod-Language-Package-${{ matrix.version }} + path: Minecraft-Mod-Language-Package-${{ matrix.version }}/* + if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' \ No newline at end of file diff --git a/config/packer/1.20-fabric.json b/config/packer/1.20-fabric.json new file mode 100644 index 000000000000..a9b6e91752cb --- /dev/null +++ b/config/packer/1.20-fabric.json @@ -0,0 +1,37 @@ +{ + "targetVersion": "1.20-fabric", + "targetLanguage": [ + "zh_cn" + ], + "additionalContent": [ + "LICENSE", + "pack.mcmeta", + "pack.png", + "README.md" + ], + "modNameBlackList": [], + "domainBlackList": [], + "noProcessNamespace": [ + "font", + "textures" + ], + "replacementMap": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + } +} \ No newline at end of file diff --git a/config/packer/1.20.json b/config/packer/1.20.json new file mode 100644 index 000000000000..a889b47239d2 --- /dev/null +++ b/config/packer/1.20.json @@ -0,0 +1,37 @@ +{ + "targetVersion": "1.20", + "targetLanguage": [ + "zh_cn" + ], + "additionalContent": [ + "LICENSE", + "pack.mcmeta", + "pack.png", + "README.md" + ], + "modNameBlackList": [], + "domainBlackList": [], + "noProcessNamespace": [ + "font", + "textures" + ], + "replacementMap": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + } +} \ No newline at end of file diff --git a/projects/1.20-fabric/README.md b/projects/1.20-fabric/README.md new file mode 100644 index 000000000000..c91f0d7d0662 --- /dev/null +++ b/projects/1.20-fabric/README.md @@ -0,0 +1,59 @@ +![pack.png](https://i.loli.net/2018/02/18/5a8974407b453.png) +--- + +| CurseForge 下载量 | 支持版本 | 翻译进度 | Github Actions | 最新快照版本 | +| :--: | :--: | :--: | :--: | :--: | +| [![CurseForge](http://cf.way2muchnoise.eu/full_simplified-chinese-localization-resource-package_downloads.svg)](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) | [![CurseForge](http://cf.way2muchnoise.eu/versions/simplified-chinese-localization-resource-package.svg)](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) | ![weblate](https://weblate-t.exz.me/widgets/langpack/-/svg-badge.svg) | ![Packer](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/workflows/Packer/badge.svg?branch=1.12.2) | [![GitHub release](https://img.shields.io/github/release/CFPAOrg/Minecraft-Mod-Language-Package.svg)](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/releases/latest) | + +## 仓库说明 + +这是 Minecraft 模组汉化项目的仓库,本项目目前采用 Weblate 平台进行模组项目翻译;
+用以解决模组作者不接收汉化、汉化提交更新速度慢等诸多问题;
+想要参与翻译?请访问我们的官方网站,并仔细阅读相关事宜以加入我们:
+### + +直接向本仓库提交 PR 亦可; + +你在翻译时, 应先了解需注意的有关事项,具体参见:[《Minecraft Mod简体中文翻译规范与指南》](https://github.com/Meow-J/Mod-Translation-Styleguide/blob/master/README.md)。 + +## 授权 + +本作品采用 [知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/)([简体中文](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh))进行许可,协议全文可 [在此](./LICENSE) 找到。
+ +## 使用方式 + +点击 [此处](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) 可打开 CurseForge 页面下载 release 版本资源包。
+点击 [此处](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/releases/latest) 可以下载快照版本资源包。
+只需要像**普通材质包**一样,在游戏中加载上该资源包,即可拥有汉化。建议装上该资源包后重启游戏,以避免出现其他问题。 + +## 相关信息 + +**目前的翻译计划是什么样的呢?我可以递交想翻译的列表么?**
+目前已根据在 CurseForge 网站上的受欢迎程度,选取了 1.16.5 版本下载了 1000 多个模组。如果你有什么想要额外添加翻译的模组,可以通过我们的 [问题追踪器](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/issues) 递交意见,或者直接通过邮箱递交意见或建议。
+其他版本目前还暂时没有涉足计划(不过 1.7.10 应该是不会做了)。 + +关于具体的宣传,可以参见 [MCBBS 推广宣传帖](http://www.mcbbs.net/thread-774087-1-1.html); + +关于整个事情的经过,可以查看酒石酸菌的 [博客帖子](https://baka943.coding.me/2018/01/03/2018-01-03-AnIntroForWeblate/); + +**你们是怎么做到流水线式的翻译的?**
+emmmm,原理其实很简单。
+ +- 通过爬虫爬取 CurseForge 的热门模组; +- 脚本推送回 GitHub 仓库; +- Weblate 检测到仓库变动,自动抓取 GitHub 变动; +- 翻译人员在 Weblate 上翻译,Weblate 自动推回到 GitHub; +- Github Actions 检测到仓库变动,自动构建并打包; +- Github Actions 自动发布到 GitHub 的 release 上,以供下载; + +## 鸣谢 + +感谢 `phi` 搭建出了 Weblate 服务器,还实现了机翻功能;
+感谢 `Summpot`,`Nullpinter` 制作了新版本的 C# 爬虫;
+感谢 `PeakXing` 制作的 logo;
+感谢 `雪尼`、`FledgeXu`、`asdflj` 等在内的诸多人的意见和建议;
+感谢本项目的最初贡献者 `Aemande123`,`DYColdWind`,`Snownee`,`yuanjie000`,`forestbat`,`3TUSK`,`SihenZhang`,`MoXiaoFreak`,`gloomy_banana`,`yuanjie000`,`exia00125`,`luckyu19` 提供的汉化。(排名不分先后)
+感谢玩家 `R_liu` 提供的拔刀剑本地化;
+资源包中镶嵌了 `3TUSK` 提供的 [全角标点修复文件](./project/assets/minecraft/readme.md);
+最后感谢那些参与翻译,并致力于本地化推广的各位玩家,你们辛苦了。
+在本仓库的 [Contributors](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/graphs/contributors) 页面可以查看所有翻译贡献者。 diff --git a/projects/1.20-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.20-fabric/assets/minecraft/minecraft/packer-policy.json new file mode 100644 index 000000000000..75b22dfd6411 --- /dev/null +++ b/projects/1.20-fabric/assets/minecraft/minecraft/packer-policy.json @@ -0,0 +1,4 @@ +{ + "type": "plainclone", + "source": "./projects/1.16/assets/minecraft/minecraft" +} \ No newline at end of file diff --git a/projects/1.20/README.md b/projects/1.20/README.md new file mode 100644 index 000000000000..c91f0d7d0662 --- /dev/null +++ b/projects/1.20/README.md @@ -0,0 +1,59 @@ +![pack.png](https://i.loli.net/2018/02/18/5a8974407b453.png) +--- + +| CurseForge 下载量 | 支持版本 | 翻译进度 | Github Actions | 最新快照版本 | +| :--: | :--: | :--: | :--: | :--: | +| [![CurseForge](http://cf.way2muchnoise.eu/full_simplified-chinese-localization-resource-package_downloads.svg)](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) | [![CurseForge](http://cf.way2muchnoise.eu/versions/simplified-chinese-localization-resource-package.svg)](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) | ![weblate](https://weblate-t.exz.me/widgets/langpack/-/svg-badge.svg) | ![Packer](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/workflows/Packer/badge.svg?branch=1.12.2) | [![GitHub release](https://img.shields.io/github/release/CFPAOrg/Minecraft-Mod-Language-Package.svg)](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/releases/latest) | + +## 仓库说明 + +这是 Minecraft 模组汉化项目的仓库,本项目目前采用 Weblate 平台进行模组项目翻译;
+用以解决模组作者不接收汉化、汉化提交更新速度慢等诸多问题;
+想要参与翻译?请访问我们的官方网站,并仔细阅读相关事宜以加入我们:
+### + +直接向本仓库提交 PR 亦可; + +你在翻译时, 应先了解需注意的有关事项,具体参见:[《Minecraft Mod简体中文翻译规范与指南》](https://github.com/Meow-J/Mod-Translation-Styleguide/blob/master/README.md)。 + +## 授权 + +本作品采用 [知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/)([简体中文](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh))进行许可,协议全文可 [在此](./LICENSE) 找到。
+ +## 使用方式 + +点击 [此处](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) 可打开 CurseForge 页面下载 release 版本资源包。
+点击 [此处](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/releases/latest) 可以下载快照版本资源包。
+只需要像**普通材质包**一样,在游戏中加载上该资源包,即可拥有汉化。建议装上该资源包后重启游戏,以避免出现其他问题。 + +## 相关信息 + +**目前的翻译计划是什么样的呢?我可以递交想翻译的列表么?**
+目前已根据在 CurseForge 网站上的受欢迎程度,选取了 1.16.5 版本下载了 1000 多个模组。如果你有什么想要额外添加翻译的模组,可以通过我们的 [问题追踪器](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/issues) 递交意见,或者直接通过邮箱递交意见或建议。
+其他版本目前还暂时没有涉足计划(不过 1.7.10 应该是不会做了)。 + +关于具体的宣传,可以参见 [MCBBS 推广宣传帖](http://www.mcbbs.net/thread-774087-1-1.html); + +关于整个事情的经过,可以查看酒石酸菌的 [博客帖子](https://baka943.coding.me/2018/01/03/2018-01-03-AnIntroForWeblate/); + +**你们是怎么做到流水线式的翻译的?**
+emmmm,原理其实很简单。
+ +- 通过爬虫爬取 CurseForge 的热门模组; +- 脚本推送回 GitHub 仓库; +- Weblate 检测到仓库变动,自动抓取 GitHub 变动; +- 翻译人员在 Weblate 上翻译,Weblate 自动推回到 GitHub; +- Github Actions 检测到仓库变动,自动构建并打包; +- Github Actions 自动发布到 GitHub 的 release 上,以供下载; + +## 鸣谢 + +感谢 `phi` 搭建出了 Weblate 服务器,还实现了机翻功能;
+感谢 `Summpot`,`Nullpinter` 制作了新版本的 C# 爬虫;
+感谢 `PeakXing` 制作的 logo;
+感谢 `雪尼`、`FledgeXu`、`asdflj` 等在内的诸多人的意见和建议;
+感谢本项目的最初贡献者 `Aemande123`,`DYColdWind`,`Snownee`,`yuanjie000`,`forestbat`,`3TUSK`,`SihenZhang`,`MoXiaoFreak`,`gloomy_banana`,`yuanjie000`,`exia00125`,`luckyu19` 提供的汉化。(排名不分先后)
+感谢玩家 `R_liu` 提供的拔刀剑本地化;
+资源包中镶嵌了 `3TUSK` 提供的 [全角标点修复文件](./project/assets/minecraft/readme.md);
+最后感谢那些参与翻译,并致力于本地化推广的各位玩家,你们辛苦了。
+在本仓库的 [Contributors](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/graphs/contributors) 页面可以查看所有翻译贡献者。 diff --git a/projects/1.20/assets/minecraft/minecraft/font/default.json b/projects/1.20/assets/minecraft/minecraft/font/default.json new file mode 100644 index 000000000000..475571c9e600 --- /dev/null +++ b/projects/1.20/assets/minecraft/minecraft/font/default.json @@ -0,0 +1,20 @@ +{ + "providers": [ + { + "type": "reference", + "id": "minecraft:include/cjk-punctuations" + }, + { + "type": "reference", + "id": "minecraft:include/space" + }, + { + "type": "reference", + "id": "minecraft:include/default" + }, + { + "type": "reference", + "id": "minecraft:include/unifont" + } + ] +} diff --git a/projects/1.20/assets/minecraft/minecraft/font/include/cjk-punctuations.json b/projects/1.20/assets/minecraft/minecraft/font/include/cjk-punctuations.json new file mode 100644 index 000000000000..82fc2914d039 --- /dev/null +++ b/projects/1.20/assets/minecraft/minecraft/font/include/cjk-punctuations.json @@ -0,0 +1,29 @@ +{ + "providers":[ + { + "type":"bitmap", + "file": "minecraft:font/cjk_punctuations.png", + "ascent": 7, + "chars": [ + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c\u0000\u3008\u3009\u0000\u0000\u0000\u0000", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014\u00b7\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type":"bitmap", + "file": "minecraft:font/ellipsis.png", + "ascent": 7, + "chars": [ + "\u22ef" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/2em-dash.png", + "ascent": 7, + "chars": [ + "\u2e3a" + ] + } + ] +} \ No newline at end of file diff --git a/projects/1.20/assets/minecraft/minecraft/font/uniform.json b/projects/1.20/assets/minecraft/minecraft/font/uniform.json new file mode 100644 index 000000000000..32d3ee8fdb14 --- /dev/null +++ b/projects/1.20/assets/minecraft/minecraft/font/uniform.json @@ -0,0 +1,16 @@ +{ + "providers": [ + { + "type": "reference", + "id": "minecraft:include/cjk-punctuations" + }, + { + "type": "reference", + "id": "minecraft:include/space" + }, + { + "type": "reference", + "id": "minecraft:include/unifont" + } + ] +} diff --git a/projects/1.20/assets/minecraft/minecraft/readme.md b/projects/1.20/assets/minecraft/minecraft/readme.md new file mode 100644 index 000000000000..019ec9e42ef4 --- /dev/null +++ b/projects/1.20/assets/minecraft/minecraft/readme.md @@ -0,0 +1,24 @@ +# 全角字符修正与特殊字符补充 +- 本包添加了几个特殊字符字体,用于补充部分新确定的元素名称 +- 本包修正了中文全角字符的宽度和位置问题。 + +## 本包建议翻译文本采用左侧书写,在打包阶段使用脚本转换成右侧字符 + +| 翻译文本 | 转换字符 | 备注 | +| :------: | :------------: | :----------------------------------: | +| [[钅卢]] | `\ue900` | | +| [[钅杜]] | `\ue901` | | +| [[钅喜]] | `\ue902` | | +| [[钅波]] | `\ue903` | | +| [[钅黑]] | `\ue904` | | +| [[钅麦]] | `\u9fcf` | | +| [[钅达]] | `\ue906` | | +| [[钅仑]] | `\ue907` | | +| [[钅哥]] | `\u9fd4` | | +| [[钅尔]] | `\u9fed` | | +| [[钅夫]] | `\ue90a` | | +| 镆 | `\u9546` | 此元素名已存在对应字符,无需修改替换 | +| [[钅立]] | `\ue90c` | | +| [[石田]] | `\u9fec` | | +| [[奥气]] | `\u9feb` | | +| …… | `\ue908\ue909` | 全角省略号的修改 | \ No newline at end of file diff --git a/projects/1.20/assets/minecraft/minecraft/textures/font/2em-dash.png b/projects/1.20/assets/minecraft/minecraft/textures/font/2em-dash.png new file mode 100644 index 0000000000000000000000000000000000000000..b683b4dd420e946726d3e92b40b28fe0129dd391 GIT binary patch literal 2829 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 literal 0 HcmV?d00001 diff --git a/projects/1.20/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.20/assets/minecraft/minecraft/textures/font/cjk_punctuations.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad25d1665c0b495cb66debcce5793e9f135cae7 GIT binary patch literal 3275 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 JPDHLkV1gIaCsqIe literal 0 HcmV?d00001 diff --git a/projects/1.20/assets/minecraft/minecraft/textures/font/ellipsis.png b/projects/1.20/assets/minecraft/minecraft/textures/font/ellipsis.png new file mode 100644 index 0000000000000000000000000000000000000000..70a21a0b5e077b47e5379817048b33ade3d7c8ea GIT binary patch literal 2843 zcmV+$3*_{PP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z07ywhK~#9!?AEaj03ZkeL9loKJzW4B2Qaa~;y$6HxKNQ*HKVZ+%>e)a0001d30P-t tdfsinKzc|3000000J;Gi009600{|g53;#YOj(z|D002ovPDHLkV1g8uUnc+n literal 0 HcmV?d00001 diff --git a/src/Uploader/Program.cs b/src/Uploader/Program.cs index 8a03ccbea28f..745b0c7f8914 100644 --- a/src/Uploader/Program.cs +++ b/src/Uploader/Program.cs @@ -33,9 +33,9 @@ static int Main(string host, string name, string password) // 获取可用的资源包,准备上传 - var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); - var packList = currentDirectory - .EnumerateFiles("Minecraft-Mod-Language-Package-*.zip"); + var artifactDirectory = new DirectoryInfo(Path.Join(Directory.GetCurrentDirectory(), "artifacts")); + var packList = artifactDirectory + .EnumerateFiles("Minecraft-Mod-Language-Package-*.zip", SearchOption.AllDirectories); Log.Information("检测到的资源包数目:{0}", packList.Count()); @@ -70,8 +70,8 @@ static int Main(string host, string name, string password) }); // 临时操作 在使用旧md5校验的程序弃用以后需要删除 - var md5List = currentDirectory - .EnumerateFiles("*.md5"); + var md5List = artifactDirectory + .EnumerateFiles("*.md5", SearchOption.AllDirectories); md5List.ToList() .ForEach(_ => { From b6a590b8cb0322545320eddb074e384cdbbef926 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Sun, 16 Jul 2023 18:11:46 +0800 Subject: [PATCH 16/25] Fix paths --- .../entangled/entangled/lang/en_us.json | 46 +++++------ .../entangled/entangled/lang/zh_cn.json | 46 +++++------ .../morecrossbows/lang/zh_cn.json | 78 +++++++++---------- 3 files changed, 85 insertions(+), 85 deletions(-) diff --git a/projects/1.20/assets/entangled/entangled/lang/en_us.json b/projects/1.20/assets/entangled/entangled/lang/en_us.json index edcfb8aa7e37..f654fbd87da4 100644 --- a/projects/1.20/assets/entangled/entangled/lang/en_us.json +++ b/projects/1.20/assets/entangled/entangled/lang/en_us.json @@ -1,24 +1,24 @@ -{ - "entangled.block.block": "Entangled Block", - "entangled.item.item": "Entangled Binder", - "entangled.entangled_block.info.ranged_same_dimension": "Can be bound to blocks in the same dimension up to %d blocks away", - "entangled.entangled_block.info.infinite_same_dimension": "Can be bound to blocks in the same dimension", - "entangled.entangled_block.info.ranged_other_dimension": "Can be bound to blocks up to %d blocks away or to blocks in other dimensions", - "entangled.entangled_block.info.infinite_other_dimension": "Can be bound to other blocks", - "entangled.entangled_block.info.bound": "Bound to %1$s in the %5$s at (%2$d, %3$d, %4$d)", - "entangled.entangled_block.unbind": "Block unbound!", - "entangled.entangled_block.no_selection": "No block selected!", - "entangled.entangled_block.self": "Can't bind a block to itself!", - "entangled.entangled_block.bind": "Block bound!", - "entangled.entangled_block.wrong_dimension": "The targeted block must be in the same dimension!", - "entangled.entangled_block.too_far": "The targeted block is too far away!", - "entangled.entangled_binder.info": "Can bind entangled blocks to other blocks", - "entangled.entangled_binder.info.target.unknown": "Linked to a block in the %4$s at (%1$d, %2$d, %3$d)", - "entangled.entangled_binder.info.target.known": "Linked to %1$s in the %5$s at (%2$d, %3$d, %4$d)", - "entangled.entangled_binder.select": "Block selected!", - "entangled.entangled_binder.clear": "Connection cleared!", - "entangled.waila.bound_same_dimension": "Bound to %1$s at (%2$d, %3$d, %4$d)", - "entangled.waila.bound_other_dimension": "Bound to %1$s in the %5$s at (%2$d, %3$d, %4$d)", - "entangled.waila.unbound": "Unbound", - "config.jade.plugin_entangled.entangled_block_component": "Entangled Block" +{ + "entangled.block.block": "Entangled Block", + "entangled.item.item": "Entangled Binder", + "entangled.entangled_block.info.ranged_same_dimension": "Can be bound to blocks in the same dimension up to %d blocks away", + "entangled.entangled_block.info.infinite_same_dimension": "Can be bound to blocks in the same dimension", + "entangled.entangled_block.info.ranged_other_dimension": "Can be bound to blocks up to %d blocks away or to blocks in other dimensions", + "entangled.entangled_block.info.infinite_other_dimension": "Can be bound to other blocks", + "entangled.entangled_block.info.bound": "Bound to %1$s in the %5$s at (%2$d, %3$d, %4$d)", + "entangled.entangled_block.unbind": "Block unbound!", + "entangled.entangled_block.no_selection": "No block selected!", + "entangled.entangled_block.self": "Can't bind a block to itself!", + "entangled.entangled_block.bind": "Block bound!", + "entangled.entangled_block.wrong_dimension": "The targeted block must be in the same dimension!", + "entangled.entangled_block.too_far": "The targeted block is too far away!", + "entangled.entangled_binder.info": "Can bind entangled blocks to other blocks", + "entangled.entangled_binder.info.target.unknown": "Linked to a block in the %4$s at (%1$d, %2$d, %3$d)", + "entangled.entangled_binder.info.target.known": "Linked to %1$s in the %5$s at (%2$d, %3$d, %4$d)", + "entangled.entangled_binder.select": "Block selected!", + "entangled.entangled_binder.clear": "Connection cleared!", + "entangled.waila.bound_same_dimension": "Bound to %1$s at (%2$d, %3$d, %4$d)", + "entangled.waila.bound_other_dimension": "Bound to %1$s in the %5$s at (%2$d, %3$d, %4$d)", + "entangled.waila.unbound": "Unbound", + "config.jade.plugin_entangled.entangled_block_component": "Entangled Block" } \ No newline at end of file diff --git a/projects/1.20/assets/entangled/entangled/lang/zh_cn.json b/projects/1.20/assets/entangled/entangled/lang/zh_cn.json index 6baf30baf905..823de88a6f78 100644 --- a/projects/1.20/assets/entangled/entangled/lang/zh_cn.json +++ b/projects/1.20/assets/entangled/entangled/lang/zh_cn.json @@ -1,24 +1,24 @@ -{ - "entangled.block.block": "纠缠方块", - "entangled.item.item": "纠缠绑定器", - "entangled.entangled_block.info.ranged_same_dimension": "可以绑定到同一维度内最远%d格的方块", - "entangled.entangled_block.info.infinite_same_dimension": "可以绑定到同一维度内的方块", - "entangled.entangled_block.info.ranged_other_dimension": "可以绑定到同一维度内最远%d格的方块或其他维度的方块", - "entangled.entangled_block.info.infinite_other_dimension": "可以绑定到其他方块", - "entangled.entangled_block.info.bound": "已绑定至位于%5$s维度(%2$d,%3$d,%4$d)的%1$s", - "entangled.entangled_block.unbind": "方块已解绑!", - "entangled.entangled_block.no_selection": "未选择方块!", - "entangled.entangled_block.self": "不能绑定方块本身!", - "entangled.entangled_block.bind": "方块已绑定!", - "entangled.entangled_block.wrong_dimension": "目标方块必须在同一维度!", - "entangled.entangled_block.too_far": "目标方块距离过远!", - "entangled.entangled_binder.info": "可以将纠缠方块与其他方块绑定", - "entangled.entangled_binder.info.target.unknown": "连接到位于%4$s维度(%1$d,%2$d,%3$d)的方块", - "entangled.entangled_binder.info.target.known": "已连接到位于%5$s维度(%2$d,%3$d,%4$d)的%1$s", - "entangled.entangled_binder.select": "方块已选择!", - "entangled.entangled_binder.clear": "连接已清除!", - "entangled.waila.bound_same_dimension": "已绑定至(%2$d,%3$d,%4$d)的%1$s", - "entangled.waila.bound_other_dimension": "已绑定至位于%5$s维度(%2$d,%3$d,%4$d)的%1$s", - "entangled.waila.unbound": "未绑定", - "config.jade.plugin_entangled.entangled_block_component": "纠缠方块" +{ + "entangled.block.block": "纠缠方块", + "entangled.item.item": "纠缠绑定器", + "entangled.entangled_block.info.ranged_same_dimension": "可以绑定到同一维度内最远%d格的方块", + "entangled.entangled_block.info.infinite_same_dimension": "可以绑定到同一维度内的方块", + "entangled.entangled_block.info.ranged_other_dimension": "可以绑定到同一维度内最远%d格的方块或其他维度的方块", + "entangled.entangled_block.info.infinite_other_dimension": "可以绑定到其他方块", + "entangled.entangled_block.info.bound": "已绑定至位于%5$s维度(%2$d,%3$d,%4$d)的%1$s", + "entangled.entangled_block.unbind": "方块已解绑!", + "entangled.entangled_block.no_selection": "未选择方块!", + "entangled.entangled_block.self": "不能绑定方块本身!", + "entangled.entangled_block.bind": "方块已绑定!", + "entangled.entangled_block.wrong_dimension": "目标方块必须在同一维度!", + "entangled.entangled_block.too_far": "目标方块距离过远!", + "entangled.entangled_binder.info": "可以将纠缠方块与其他方块绑定", + "entangled.entangled_binder.info.target.unknown": "连接到位于%4$s维度(%1$d,%2$d,%3$d)的方块", + "entangled.entangled_binder.info.target.known": "已连接到位于%5$s维度(%2$d,%3$d,%4$d)的%1$s", + "entangled.entangled_binder.select": "方块已选择!", + "entangled.entangled_binder.clear": "连接已清除!", + "entangled.waila.bound_same_dimension": "已绑定至(%2$d,%3$d,%4$d)的%1$s", + "entangled.waila.bound_other_dimension": "已绑定至位于%5$s维度(%2$d,%3$d,%4$d)的%1$s", + "entangled.waila.unbound": "未绑定", + "config.jade.plugin_entangled.entangled_block_component": "纠缠方块" } \ No newline at end of file diff --git a/projects/1.20/assets/more-crossbows-cj/morecrossbows/lang/zh_cn.json b/projects/1.20/assets/more-crossbows-cj/morecrossbows/lang/zh_cn.json index 93ba3bcdc0c2..6496e10d5ff2 100644 --- a/projects/1.20/assets/more-crossbows-cj/morecrossbows/lang/zh_cn.json +++ b/projects/1.20/assets/more-crossbows-cj/morecrossbows/lang/zh_cn.json @@ -1,40 +1,40 @@ -{ - "item。morecrossbows.copper_crossbow": "铜弩", - "item。morecrossbows.iron_crossbow": "铁弩", - "item.morecrossbows.golden_crossbow": "金弩", - "item.morecrossbows.emerald_crossbow": "绿宝石弩", - "item.morecrossbows.diamond_crossbow": "钻石弩", - "item.morecrossbows。netherite_crossbow": "下界合金弩", - "item.morecrossbows.gilded_netherite_crossbow": "镀金下界合金弩", - "item.morecrossbows.enderite_crossbow": "末影合金弩", - "item.morecrossbows.gilded_enderite_crossbow": "镀金末影合金弩", - - "upgrade.morecrossbows.crossbow_upgrade": "弩升级", - "item.morecrossbows.smithing_template.crossbow_upgrade.additions_slot_description": "把下一级材料的块放在这里。", - "item.morecrossbows.smithing_template.crossbow_upgrade.applies_to": "弩", - "item.morecrossbows.smithing_template.crossbow_upgrade.base_slot_description": "在这里放一把弩。", - "item.morecrossbows.smithing_template.crossbow_upgrade.ingredients": "铜、铁、金、绿宝石、钻石块", - - "tooltip.morecrossbows.damage_tooltip": "弹射物伤害", - "tooltip.morecrossbows.speed_multiplier": "速度倍率", - "tooltip.morecrossbows.charge_time": "蓄力时间", - - "advancements.adventure.morecrossbows.obtain_copper_crossbow.title": "铜弩", - "advancements.adventure.morecrossbows.obtain_copper_crossbow.description": "铜做的弩!", - "advancements.adventure.morecrossbows.obtain_iron_crossbow.title": "铁弩", - "advancements.adventure.morecrossbows.obtain_iron_crossbow.description": "铁做的弩!", - "advancements.adventure.morecrossbows.obtain_golden_crossbow.title": "金弩", - "advancements.adventure.morecrossbows.obtain_golden_crossbow.description": "金做的弩!", - "advancements.adventure.morecrossbows.obtain_emerald_crossbow.title": "绿宝石弩", - "advancements.adventure.morecrossbows.obtain_emerald_crossbow.description": "绿宝石做的弩!", - "advancements.adventure.morecrossbows.obtain_diamond_crossbow.title": "钻石弩", - "advancements.adventure.morecrossbows.obtain_diamond_crossbow.description": "钻石做的弩!", - "advancements.adventure.morecrossbows.obtain_netherite_crossbow.title": "下界合金弩", - "advancements.adventure.morecrossbows.obtain_netherite_crossbow.description": "下界合金做的弩!", - "advancements.adventure.morecrossbows.obtain_gilded_netherite_crossbow.title": "镀金下界合金做的弩", - "advancements.adventure.morecrossbows.obtain_gilded_netherite_crossbow.description": "镀金下界合金做的弩!", - "advancements.adventure.morecrossbows.obtain_enderite_crossbow.title": "末影合金弩", - "advancements.adventure.morecrossbows.obtain_enderite_crossbow.description": "末影合金做的弩!", - "advancements.adventure.morecrossbows.obtain_gilded_enderite_crossbow.title": "镀金末影合金做的弩", - "advancements.adventure.morecrossbows.obtain_gilded_enderite_crossbow.description": "镀金末影合金做的弩!" +{ + "item。morecrossbows.copper_crossbow": "铜弩", + "item。morecrossbows.iron_crossbow": "铁弩", + "item.morecrossbows.golden_crossbow": "金弩", + "item.morecrossbows.emerald_crossbow": "绿宝石弩", + "item.morecrossbows.diamond_crossbow": "钻石弩", + "item.morecrossbows。netherite_crossbow": "下界合金弩", + "item.morecrossbows.gilded_netherite_crossbow": "镀金下界合金弩", + "item.morecrossbows.enderite_crossbow": "末影合金弩", + "item.morecrossbows.gilded_enderite_crossbow": "镀金末影合金弩", + + "upgrade.morecrossbows.crossbow_upgrade": "弩升级", + "item.morecrossbows.smithing_template.crossbow_upgrade.additions_slot_description": "把下一级材料的块放在这里。", + "item.morecrossbows.smithing_template.crossbow_upgrade.applies_to": "弩", + "item.morecrossbows.smithing_template.crossbow_upgrade.base_slot_description": "在这里放一把弩。", + "item.morecrossbows.smithing_template.crossbow_upgrade.ingredients": "铜、铁、金、绿宝石、钻石块", + + "tooltip.morecrossbows.damage_tooltip": "弹射物伤害", + "tooltip.morecrossbows.speed_multiplier": "速度倍率", + "tooltip.morecrossbows.charge_time": "蓄力时间", + + "advancements.adventure.morecrossbows.obtain_copper_crossbow.title": "铜弩", + "advancements.adventure.morecrossbows.obtain_copper_crossbow.description": "铜做的弩!", + "advancements.adventure.morecrossbows.obtain_iron_crossbow.title": "铁弩", + "advancements.adventure.morecrossbows.obtain_iron_crossbow.description": "铁做的弩!", + "advancements.adventure.morecrossbows.obtain_golden_crossbow.title": "金弩", + "advancements.adventure.morecrossbows.obtain_golden_crossbow.description": "金做的弩!", + "advancements.adventure.morecrossbows.obtain_emerald_crossbow.title": "绿宝石弩", + "advancements.adventure.morecrossbows.obtain_emerald_crossbow.description": "绿宝石做的弩!", + "advancements.adventure.morecrossbows.obtain_diamond_crossbow.title": "钻石弩", + "advancements.adventure.morecrossbows.obtain_diamond_crossbow.description": "钻石做的弩!", + "advancements.adventure.morecrossbows.obtain_netherite_crossbow.title": "下界合金弩", + "advancements.adventure.morecrossbows.obtain_netherite_crossbow.description": "下界合金做的弩!", + "advancements.adventure.morecrossbows.obtain_gilded_netherite_crossbow.title": "镀金下界合金做的弩", + "advancements.adventure.morecrossbows.obtain_gilded_netherite_crossbow.description": "镀金下界合金做的弩!", + "advancements.adventure.morecrossbows.obtain_enderite_crossbow.title": "末影合金弩", + "advancements.adventure.morecrossbows.obtain_enderite_crossbow.description": "末影合金做的弩!", + "advancements.adventure.morecrossbows.obtain_gilded_enderite_crossbow.title": "镀金末影合金做的弩", + "advancements.adventure.morecrossbows.obtain_gilded_enderite_crossbow.description": "镀金末影合金做的弩!" } \ No newline at end of file From 7f7273855ab0a20f375d29c9a8e12adf61cd6ec8 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Thu, 3 Aug 2023 16:16:22 +0800 Subject: [PATCH 17/25] Miscellaneous Updates --- .github/workflows/packer.yml | 98 +++++++++++++----- .github/workflows/pr-packer.yml | 13 ++- .gitignore | 21 ++-- .../font/include/cjk-punctuations.json | 2 +- .../font/{2em-dash.png => 2em_dash.png} | Bin 2829 -> 2829 bytes 5 files changed, 93 insertions(+), 41 deletions(-) rename projects/1.20/assets/minecraft/minecraft/textures/font/{2em-dash.png => 2em_dash.png} (96%) diff --git a/.github/workflows/packer.yml b/.github/workflows/packer.yml index 0856534b1e2a..3befb16abed5 100644 --- a/.github/workflows/packer.yml +++ b/.github/workflows/packer.yml @@ -3,7 +3,7 @@ name: Packer on: workflow_dispatch: push: - branches: [main] + branches: [ main ] paths: - 'src/**' - 'config/packer/**' @@ -12,14 +12,12 @@ on: jobs: - build: + build-packer: if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' - name: Build / Cache Packer and Uploader + name: Build / Cache Packer runs-on: windows-latest steps: - uses: actions/checkout@v2 - with: - ref: main # 缓存程序。一方面,在不同job之间需要这么做;另一方面,大约可以改善运行时间? # actions/cache的逻辑会在job末尾缓存打包程序;如果不命中,就自行构造程序。 @@ -27,41 +25,77 @@ jobs: id: cache-packer uses: actions/cache@v3 with: - key: ${{ runner.os }}-${{ hashFiles('source/Pakcer/**') }} + key: ${{ runner.os }}-${{ hashFiles('src/Pakcer/**') }} path: Packer.exe + lookup-only: true + # 构造程序 + - name: Build Packer if not cached + if: steps.cache-packer.outputs.cache_hit != 'true' + run: dotnet publish .\src\Packer\Packer.csproj -o ./ -r win-x64 -p:PublishSingleFile=true + + build-uploader: + if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' + name: Build / Cache Uploader + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + + # 缓存程序。一方面,在不同job之间需要这么做;另一方面,大约可以改善运行时间? + # actions/cache的逻辑会在job末尾缓存打包程序;如果不命中,就自行构造程序。 - name: Cache Uploader id: cache-uploader uses: actions/cache@v3 with: - key: ${{ runner.os }}-${{ hashFiles('source/Uploader/**') }} + key: ${{ runner.os }}-${{ hashFiles('src/Uploader/**') }} path: Uploader.exe - - # 构造程序 - - name: Build Packer if not cached - if: steps.cache-packer.outputs.cache_hit != 'true' - run: dotnet publish .\src\Packer\Packer.csproj -o ./ -r win-x64 -p:PublishSingleFile=true + lookup-only: true + # 构造程序 - name: Build Uploader if not cached if: steps.cache-uploader.outputs.cache_hit != 'true' run: dotnet publish .\src\Uploader\Uploader.csproj -o ./ -r win-x64 -p:PublishSingeFile=true + initialize-release: + if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' + name: Initialize Release + runs-on: windows-latest + steps: + + - name: Create timestamp + id: create_timestamp + run: echo "::set-output name=timestamp::$(date '+%Y%m%d%H%M%s')" + shell: bash + + # Create the release: https://github.com/actions/create-release + - name: Create release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: Snapshot-${{ steps.create_timestamp.outputs.timestamp }} + release_name: 汉化资源包-Snapshot-${{ steps.create_timestamp.outputs.timestamp }} + draft: false + prerelease: false + outputs: + upload-url: ${{ steps.create_release.outputs.upload_url }} + pack: if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' - name: Pack Resources and Upload Artifacts - needs: build # 显然,需要存在缓存/已经构造,才能打包。 + name: Pack Resources and Upload Artifacts/Releases + needs: [ build-packer, initialize-release ] # 显然,需要存在打包程序,才能打包。 strategy: matrix: - # 支持版本列表。将对这里的每个版本判断,按需打包。 + # 版本列表。将对这里的每个版本判断,按需打包。 # 如需添加新版本,在这里添加即可。 - version: ["1.12.2", "1.16", "1.16-fabric", "1.18", "1.18-fabric", "1.19", "1.20", "1.20-fabric"] + version: [ "1.12.2", "1.16", "1.16-fabric", "1.18", "1.18-fabric", "1.19", "1.20", "1.20-fabric" ] runs-on: windows-latest steps: - uses: actions/checkout@v2 with: - fetch-depth: 20 - ref: main + fetch-depth: 20 # 显然,需要有提交历史才能比较提交。20这个数是任意的。 # 由于Github的限制,这里需要重新拉取打包程序。 - name: Restore Packer @@ -77,7 +111,7 @@ jobs: id: check-changes with: # 判断位置:该版本文件、该版本配置、代码 - paths: | + paths: > projects/${{ matrix.version }} config/packer/${{ matrix.version }}.json src/** @@ -85,27 +119,41 @@ jobs: - name: Run Packer for ${{ matrix.version }} run: ./Packer --version="${{ matrix.version }}" # 运行逻辑:内容有更改 或 手动运行 - if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' + if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - # 上传内容:每个版本一个压缩包,包含了资源包和md5校验文件 + # Artifact 上传内容:每个版本一个压缩包,包含了资源包和md5校验文件 - name: Upload Artifact for ${{ matrix.version }} uses: actions/upload-artifact@v3.0.0 with: name: Minecraft-Mod-Language-Package-${{ matrix.version }} path: | Minecraft-Mod-Language-Package-${{ matrix.version }}.zip - ${{matrix.version}}.md5 + ${{ matrix.version }}.md5 + if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' + + # Upload release asset: https://github.com/actions/upload-release-asset + - name: Update release asset for ${{ matrix.version }} + id: upload-release-asset if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.initialize-release.outputs.upload-url }} + asset_path: Minecraft-Mod-Language-Package-${{ matrix.version }}.zip + asset_name: Minecraft-Mod-Language-Package-${{ matrix.version }}.zip + asset_content_type: application/zip upload: if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' name: Upload Resource Packs to Remote Server - needs: pack # 显然,需要打包完成后才可以上传给分发服务器 + needs: [ pack, build-uploader ] # 显然,需要打包完成,并且存在上传程序,才可以上传给分发服务器 runs-on: windows-latest steps: - # 由于Github的限制,这里需要重新拉取打包程序。 - - name: Restore Packer + + # 由于Github的限制,这里需要重新拉取上传程序。 + - name: Restore Uploader id: cache-restore uses: actions/cache/restore@v3 with: diff --git a/.github/workflows/pr-packer.yml b/.github/workflows/pr-packer.yml index 0eb035bba69e..ae2dbde072d6 100644 --- a/.github/workflows/pr-packer.yml +++ b/.github/workflows/pr-packer.yml @@ -18,8 +18,6 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v2 - with: - ref: main # 缓存程序。一方面,在不同job之间需要这么做;另一方面,大约可以改善运行时间? # actions/cache的逻辑会在job末尾缓存打包程序;如果不命中,就自行构造程序。 @@ -27,8 +25,9 @@ jobs: id: cache-packer uses: actions/cache@v3 with: - key: ${{ runner.os }}-${{ hashFiles('source/Pakcer/**') }} + key: ${{ runner.os }}-${{ hashFiles('src/Pakcer/**') }} path: Packer.exe + lookup-only: true # 构造程序 - name: Build Packer if not cached @@ -49,15 +48,14 @@ jobs: steps: - uses: actions/checkout@v2 with: - fetch-depth: 20 - ref: main + fetch-depth: 20 # 显然,需要有提交历史才能比较提交。20这个数是任意的。 # 由于Github的限制,这里需要重新拉取打包程序。 - name: Restore Packer id: cache-restore uses: actions/cache/restore@v3 with: - key: ${{ runner.os }}-${{ hashFiles('source/Pakcer/**') }} + key: ${{ runner.os }}-${{ hashFiles('src/Pakcer/**') }} path: Packer.exe fail-on-cache-miss: true # 前一步理应构造过的。如果不命中,肯定有问题,不如直接挂掉。 @@ -66,7 +64,7 @@ jobs: id: check-changes with: # 判断位置:该版本文件、该版本配置、代码 - paths: | + paths: > projects/${{ matrix.version }} config/packer/${{ matrix.version }}.json src/** @@ -80,6 +78,7 @@ jobs: - name: Unzip Files run: unzip -q Minecraft-Mod-Language-Package-${{ matrix.version }}.zip -d Minecraft-Mod-Language-Package-${{ matrix.version }} || echo 0 shell: bash + if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - name: Upload Artifact for ${{ matrix.version }} uses: actions/upload-artifact@v3.0.0 diff --git a/.gitignore b/.gitignore index 93c64e02fb82..3d152dd748ea 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,19 @@ Minecraft-Mod-Language-Package-*.zip Packer.exe Packer.xml +# CFPA-backlogs + +cfr.jar +Formatter.exe +Spider.exe +clrcompression.dll +clrjit.dll +coreclr.dll +mscordaccore.dll +/src/Packer/Properties/launchSettings.json + +# artifact temporary files +artifacts/ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. @@ -370,11 +383,3 @@ MigrationBackup/ # Fody - auto-generated XML schema FodyWeavers.xsd -cfr.jar -Formatter.exe -Spider.exe -clrcompression.dll -clrjit.dll -coreclr.dll -mscordaccore.dll -/src/Packer/Properties/launchSettings.json diff --git a/projects/1.20/assets/minecraft/minecraft/font/include/cjk-punctuations.json b/projects/1.20/assets/minecraft/minecraft/font/include/cjk-punctuations.json index 82fc2914d039..8a18537c968a 100644 --- a/projects/1.20/assets/minecraft/minecraft/font/include/cjk-punctuations.json +++ b/projects/1.20/assets/minecraft/minecraft/font/include/cjk-punctuations.json @@ -19,7 +19,7 @@ }, { "type": "bitmap", - "file": "minecraft:font/2em-dash.png", + "file": "minecraft:font/2em_dash.png", "ascent": 7, "chars": [ "\u2e3a" diff --git a/projects/1.20/assets/minecraft/minecraft/textures/font/2em-dash.png b/projects/1.20/assets/minecraft/minecraft/textures/font/2em_dash.png similarity index 96% rename from projects/1.20/assets/minecraft/minecraft/textures/font/2em-dash.png rename to projects/1.20/assets/minecraft/minecraft/textures/font/2em_dash.png index b683b4dd420e946726d3e92b40b28fe0129dd391..e8291ce5ab02b1c27575af310e60ba5fce84d609 100644 GIT binary patch delta 78 zcmeAb>lNE@oXc$^FM|TlkpujTTK{f0mA;_XYJ1RA@4=FtQyDu2421$2?sm+5vdg)J iLvX$v0|UeV|I7>vkF%Q==2zGPxeT7JelF{r5}E+Qd>sz} delta 78 zcmeAb>lNE@oXgFTmqCH&=mq;G&JXW5TRhk$8^x-h$*6vIEssY_$HWe%7jAD Date: Fri, 8 Sep 2023 16:05:07 +0800 Subject: [PATCH 18/25] Synchronize README format --- projects/1.20-fabric/README.md | 59 ---------------------------------- projects/1.20/README.md | 59 ---------------------------------- 2 files changed, 118 deletions(-) delete mode 100644 projects/1.20-fabric/README.md delete mode 100644 projects/1.20/README.md diff --git a/projects/1.20-fabric/README.md b/projects/1.20-fabric/README.md deleted file mode 100644 index c91f0d7d0662..000000000000 --- a/projects/1.20-fabric/README.md +++ /dev/null @@ -1,59 +0,0 @@ -![pack.png](https://i.loli.net/2018/02/18/5a8974407b453.png) ---- - -| CurseForge 下载量 | 支持版本 | 翻译进度 | Github Actions | 最新快照版本 | -| :--: | :--: | :--: | :--: | :--: | -| [![CurseForge](http://cf.way2muchnoise.eu/full_simplified-chinese-localization-resource-package_downloads.svg)](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) | [![CurseForge](http://cf.way2muchnoise.eu/versions/simplified-chinese-localization-resource-package.svg)](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) | ![weblate](https://weblate-t.exz.me/widgets/langpack/-/svg-badge.svg) | ![Packer](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/workflows/Packer/badge.svg?branch=1.12.2) | [![GitHub release](https://img.shields.io/github/release/CFPAOrg/Minecraft-Mod-Language-Package.svg)](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/releases/latest) | - -## 仓库说明 - -这是 Minecraft 模组汉化项目的仓库,本项目目前采用 Weblate 平台进行模组项目翻译;
-用以解决模组作者不接收汉化、汉化提交更新速度慢等诸多问题;
-想要参与翻译?请访问我们的官方网站,并仔细阅读相关事宜以加入我们:
-### - -直接向本仓库提交 PR 亦可; - -你在翻译时, 应先了解需注意的有关事项,具体参见:[《Minecraft Mod简体中文翻译规范与指南》](https://github.com/Meow-J/Mod-Translation-Styleguide/blob/master/README.md)。 - -## 授权 - -本作品采用 [知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/)([简体中文](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh))进行许可,协议全文可 [在此](./LICENSE) 找到。
- -## 使用方式 - -点击 [此处](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) 可打开 CurseForge 页面下载 release 版本资源包。
-点击 [此处](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/releases/latest) 可以下载快照版本资源包。
-只需要像**普通材质包**一样,在游戏中加载上该资源包,即可拥有汉化。建议装上该资源包后重启游戏,以避免出现其他问题。 - -## 相关信息 - -**目前的翻译计划是什么样的呢?我可以递交想翻译的列表么?**
-目前已根据在 CurseForge 网站上的受欢迎程度,选取了 1.16.5 版本下载了 1000 多个模组。如果你有什么想要额外添加翻译的模组,可以通过我们的 [问题追踪器](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/issues) 递交意见,或者直接通过邮箱递交意见或建议。
-其他版本目前还暂时没有涉足计划(不过 1.7.10 应该是不会做了)。 - -关于具体的宣传,可以参见 [MCBBS 推广宣传帖](http://www.mcbbs.net/thread-774087-1-1.html); - -关于整个事情的经过,可以查看酒石酸菌的 [博客帖子](https://baka943.coding.me/2018/01/03/2018-01-03-AnIntroForWeblate/); - -**你们是怎么做到流水线式的翻译的?**
-emmmm,原理其实很简单。
- -- 通过爬虫爬取 CurseForge 的热门模组; -- 脚本推送回 GitHub 仓库; -- Weblate 检测到仓库变动,自动抓取 GitHub 变动; -- 翻译人员在 Weblate 上翻译,Weblate 自动推回到 GitHub; -- Github Actions 检测到仓库变动,自动构建并打包; -- Github Actions 自动发布到 GitHub 的 release 上,以供下载; - -## 鸣谢 - -感谢 `phi` 搭建出了 Weblate 服务器,还实现了机翻功能;
-感谢 `Summpot`,`Nullpinter` 制作了新版本的 C# 爬虫;
-感谢 `PeakXing` 制作的 logo;
-感谢 `雪尼`、`FledgeXu`、`asdflj` 等在内的诸多人的意见和建议;
-感谢本项目的最初贡献者 `Aemande123`,`DYColdWind`,`Snownee`,`yuanjie000`,`forestbat`,`3TUSK`,`SihenZhang`,`MoXiaoFreak`,`gloomy_banana`,`yuanjie000`,`exia00125`,`luckyu19` 提供的汉化。(排名不分先后)
-感谢玩家 `R_liu` 提供的拔刀剑本地化;
-资源包中镶嵌了 `3TUSK` 提供的 [全角标点修复文件](./project/assets/minecraft/readme.md);
-最后感谢那些参与翻译,并致力于本地化推广的各位玩家,你们辛苦了。
-在本仓库的 [Contributors](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/graphs/contributors) 页面可以查看所有翻译贡献者。 diff --git a/projects/1.20/README.md b/projects/1.20/README.md deleted file mode 100644 index c91f0d7d0662..000000000000 --- a/projects/1.20/README.md +++ /dev/null @@ -1,59 +0,0 @@ -![pack.png](https://i.loli.net/2018/02/18/5a8974407b453.png) ---- - -| CurseForge 下载量 | 支持版本 | 翻译进度 | Github Actions | 最新快照版本 | -| :--: | :--: | :--: | :--: | :--: | -| [![CurseForge](http://cf.way2muchnoise.eu/full_simplified-chinese-localization-resource-package_downloads.svg)](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) | [![CurseForge](http://cf.way2muchnoise.eu/versions/simplified-chinese-localization-resource-package.svg)](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) | ![weblate](https://weblate-t.exz.me/widgets/langpack/-/svg-badge.svg) | ![Packer](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/workflows/Packer/badge.svg?branch=1.12.2) | [![GitHub release](https://img.shields.io/github/release/CFPAOrg/Minecraft-Mod-Language-Package.svg)](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/releases/latest) | - -## 仓库说明 - -这是 Minecraft 模组汉化项目的仓库,本项目目前采用 Weblate 平台进行模组项目翻译;
-用以解决模组作者不接收汉化、汉化提交更新速度慢等诸多问题;
-想要参与翻译?请访问我们的官方网站,并仔细阅读相关事宜以加入我们:
-### - -直接向本仓库提交 PR 亦可; - -你在翻译时, 应先了解需注意的有关事项,具体参见:[《Minecraft Mod简体中文翻译规范与指南》](https://github.com/Meow-J/Mod-Translation-Styleguide/blob/master/README.md)。 - -## 授权 - -本作品采用 [知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/)([简体中文](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh))进行许可,协议全文可 [在此](./LICENSE) 找到。
- -## 使用方式 - -点击 [此处](https://minecraft.curseforge.com/projects/simplified-chinese-localization-resource-package) 可打开 CurseForge 页面下载 release 版本资源包。
-点击 [此处](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/releases/latest) 可以下载快照版本资源包。
-只需要像**普通材质包**一样,在游戏中加载上该资源包,即可拥有汉化。建议装上该资源包后重启游戏,以避免出现其他问题。 - -## 相关信息 - -**目前的翻译计划是什么样的呢?我可以递交想翻译的列表么?**
-目前已根据在 CurseForge 网站上的受欢迎程度,选取了 1.16.5 版本下载了 1000 多个模组。如果你有什么想要额外添加翻译的模组,可以通过我们的 [问题追踪器](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/issues) 递交意见,或者直接通过邮箱递交意见或建议。
-其他版本目前还暂时没有涉足计划(不过 1.7.10 应该是不会做了)。 - -关于具体的宣传,可以参见 [MCBBS 推广宣传帖](http://www.mcbbs.net/thread-774087-1-1.html); - -关于整个事情的经过,可以查看酒石酸菌的 [博客帖子](https://baka943.coding.me/2018/01/03/2018-01-03-AnIntroForWeblate/); - -**你们是怎么做到流水线式的翻译的?**
-emmmm,原理其实很简单。
- -- 通过爬虫爬取 CurseForge 的热门模组; -- 脚本推送回 GitHub 仓库; -- Weblate 检测到仓库变动,自动抓取 GitHub 变动; -- 翻译人员在 Weblate 上翻译,Weblate 自动推回到 GitHub; -- Github Actions 检测到仓库变动,自动构建并打包; -- Github Actions 自动发布到 GitHub 的 release 上,以供下载; - -## 鸣谢 - -感谢 `phi` 搭建出了 Weblate 服务器,还实现了机翻功能;
-感谢 `Summpot`,`Nullpinter` 制作了新版本的 C# 爬虫;
-感谢 `PeakXing` 制作的 logo;
-感谢 `雪尼`、`FledgeXu`、`asdflj` 等在内的诸多人的意见和建议;
-感谢本项目的最初贡献者 `Aemande123`,`DYColdWind`,`Snownee`,`yuanjie000`,`forestbat`,`3TUSK`,`SihenZhang`,`MoXiaoFreak`,`gloomy_banana`,`yuanjie000`,`exia00125`,`luckyu19` 提供的汉化。(排名不分先后)
-感谢玩家 `R_liu` 提供的拔刀剑本地化;
-资源包中镶嵌了 `3TUSK` 提供的 [全角标点修复文件](./project/assets/minecraft/readme.md);
-最后感谢那些参与翻译,并致力于本地化推广的各位玩家,你们辛苦了。
-在本仓库的 [Contributors](https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/graphs/contributors) 页面可以查看所有翻译贡献者。 From eba9b01ce4929c8325e910be532ed943baa0b34c Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Fri, 8 Sep 2023 23:58:36 +0800 Subject: [PATCH 19/25] Initial commit --- src/Packer/Extensions/ArchiveExtension.cs | 63 ++--------- src/Packer/Extensions/DirectoryExtension.cs | 10 ++ src/Packer/Lib.cs | 109 ++++++-------------- src/Packer/Models/Config.cs | 4 +- src/Packer/Models/IResourceFileProvider.cs | 59 +++++++++++ src/Packer/Models/Providers/LanguageFile.cs | 66 ++++++++++++ src/Packer/Models/Providers/RawFile.cs | 64 ++++++++++++ src/Packer/Models/Providers/TextFile.cs | 78 ++++++++++++++ src/Packer/Packer.csproj | 2 + src/Packer/Program.cs | 73 ++++++++++--- src/Packer/Utils.cs | 23 +++-- 11 files changed, 392 insertions(+), 159 deletions(-) create mode 100644 src/Packer/Models/IResourceFileProvider.cs create mode 100644 src/Packer/Models/Providers/LanguageFile.cs create mode 100644 src/Packer/Models/Providers/RawFile.cs create mode 100644 src/Packer/Models/Providers/TextFile.cs diff --git a/src/Packer/Extensions/ArchiveExtension.cs b/src/Packer/Extensions/ArchiveExtension.cs index a8f373f02bcb..706904210584 100644 --- a/src/Packer/Extensions/ArchiveExtension.cs +++ b/src/Packer/Extensions/ArchiveExtension.cs @@ -1,5 +1,6 @@ using Packer.Models; using Serilog; +using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; @@ -13,24 +14,6 @@ namespace Packer.Extensions /// static public class ArchiveExtension { - ///

- /// 按要求写入语言文件,并加Log - /// - /// 压缩文件 - /// 目标路径 - /// 写入内容 - /// - public static async Task CreateLangFile(this ZipArchive archive, string destination, string content) - { - destination = destination.NormalizePath(); - Log.Information("正在添加 {0}", destination); - using var writer = new StreamWriter( - archive.CreateEntry(destination) - .Open()); - await writer.WriteAsync(content); - writer.Flush(); // 确保一下 - } - /// /// 初始化压缩包

/// 包括压缩包的基础文件 @@ -63,48 +46,18 @@ public static void Initialize(this ZipArchive archive, Config config) Log.Information("初始化完成"); } - /// - /// 写入选出的Asset们 + /// 校验将要传入压缩包的的文件是否存在重名
///
- /// 压缩文件 - /// 选出的内容 - /// - public static async Task WriteContent(this ZipArchive archive, IEnumerable content) - { - Log.Information("添加处理后的文件"); - - - var tasks = content.SelectMany(asset => asset.contents.Select(file => archive.CreateLangFile(Path.Combine("assets", - asset.domainName, - file.RelativePath), - file.StringifiedContent))); - - await Task.WhenAll(content.SelectMany( - asset => asset.contents.Select( - file => archive.CreateLangFile(destination: Path.Combine("assets", - asset.domainName, - file.RelativePath), - content: file.StringifiedContent)))); - Log.Information("添加完毕"); - } - - /// - /// 写入非文本处理的文件 - /// - /// 压缩文件 - /// 非文本处理的文件 - public static void WriteBypassed(this ZipArchive archive, Dictionary bypassed) + /// 所查询的压缩包 + /// 所查询的路径 + /// 传入文件存在重名。 + public static void ValidateEntryDistinctness(this ZipArchive archive, string entryName) { - Log.Information("添加未经处理的文件"); - foreach (var pair in bypassed) + if (archive.GetEntry(entryName) != null) { - var normalizedEntryName = pair.Value.NormalizePath(); - Log.Information("正在添加 {0}", normalizedEntryName); - archive.CreateEntryFromFile(sourceFileName: pair.Key, - entryName: normalizedEntryName); + throw new InvalidOperationException($"An entry named {entryName} already exists."); } - Log.Information("添加完毕"); } } } diff --git a/src/Packer/Extensions/DirectoryExtension.cs b/src/Packer/Extensions/DirectoryExtension.cs index ac5a3e3e63ad..130854064443 100644 --- a/src/Packer/Extensions/DirectoryExtension.cs +++ b/src/Packer/Extensions/DirectoryExtension.cs @@ -13,7 +13,17 @@ namespace Packer.Extensions ///
public static class DirectoryExtension { + public static IEnumerable EnumerateProviders + (this DirectoryInfo namespaceDirectory, + Config config) + // 其实这个我还没想好要不要叫Enumerate,毕竟可能不一定能做成Linq的样子 + { + var policyFile = namespaceDirectory.GetFiles("packer-policy.json").FirstOrDefault(); + + var policy = Utils.RetrieveStrategy(policyFile); + throw null; + } /// /// 从[namespace]生成所需的Asset对象,采用本目录下放置的配置文件 diff --git a/src/Packer/Lib.cs b/src/Packer/Lib.cs index 1513f6be9bd7..d4e8c61b587a 100644 --- a/src/Packer/Lib.cs +++ b/src/Packer/Lib.cs @@ -12,89 +12,38 @@ namespace Packer static class Lib { /// - /// 从主库中选出所需文本。 + /// 从主库中选出所需文本 /// /// 所使用的配置 - /// 传出非文本处理的文件 + /// + /// 需要包含的模组列表,按模组唯一标识符
+ /// 若为,表示包含所有模组 + /// /// - public static IEnumerable RetrieveContent(Config config, out Dictionary unprocessed) - { - // 警告:下面的代码中,有部分变量的名称并不规范!远期可能会调整这一部分。 + public static IEnumerable RetrieveContent( + Config config, + IEnumerable? targetModIdentifiers) - // 注:仓库的文件结构如下:(仅考虑主要翻译文件) - // projects//assets////path/to/the/file - // 其中, 与 config.Version 一致 - // 是唯一的,但 都不是唯一的 - // 目标文件层级: - // assets///path/to/the/file - // - // 在目标层级以外的文件不支持处理,需要作为基础文件加入 - - // 预备工作 - Log.Information("开始生成待打包的文件"); - var bypassed = new Dictionary(); // 文件完整路径 -> 压缩包中的完整路径 - var result = new Dictionary(); // domain -> 该domain对应的Asset对象 - var existingDomains = new Dictionary(); // domain -> 模组名 - - // 下面开始检索模组 - // 以后可能会用更好看的linq语法写,但是现在就这样了 - var mods = new DirectoryInfo($"./projects/{config.Version}/assets") - .EnumerateDirectories() // assets/ 的下级文件夹 - .Select(modDirectory => new Mod() - { - modName = modDirectory.Name, - assets = modDirectory - .EnumerateDirectories() // / 的下级文件夹 - .Select(assetDirectory => new Asset() - { - domainName = assetDirectory.Name, - contents = assetDirectory.AggregateAssetFiles(config, ref bypassed) - }) - }); - foreach (var mod in mods) - { - var name = mod.modName; - if (!mod.assets.Any()) continue; // 没有 asset 的情况 - - foreach (var asset in mod.assets) - { - var domain = asset.domainName; - if (config.ModBlackList.Contains(name)) - { - Log.Information("跳过了黑名单中的 mod:{0}(asset-domain:{1})", name, domain); - continue; - } - if (config.DomainBlackList.Contains(domain)) - { - Log.Information("跳过了黑名单中的 asset-domain:{0}(对应 mod:{1})", domain, name); - continue; - } - Log.Information("正在处理 {0}(asset-domain:{1})", name, domain); - - // 强制中止打包,防止异常文件流出 - if(!Regex.IsMatch(domain, @"^[a-z0-9_\-.]+$", RegexOptions.Singleline)) - throw new ArgumentOutOfRangeException(paramName: nameof(domain), - actualValue: domain, - message: "非法的命名空间名称。强制中止"); - - if (!existingDomains.ContainsKey(domain)) - { - Log.Information("未检测到重合。直接加入"); - result.Add(domain, asset); - Log.Information("向 asset-domain 映射表中加入:{0} -> {1}", domain, name); - existingDomains.Add(domain, name); - } - else - { - Log.Warning("检测到 asset-domain 与 {0} 重合", existingDomains[domain]); - result.Remove(domain, out var existing); - result.Add(domain, existing.Combine(asset)); - } - } - } - Log.Information("文件列表生成完毕"); - unprocessed = bypassed; // 正式传出非文本文件 - return result.Select(_ => _.Value); - } + // 成功实现了没分号的C#语句...这就是查询表达式吗( + => from modDirectory in new DirectoryInfo($"./projects/{config.Version}/assets") + .EnumerateDirectories() + let modIdentifier = modDirectory.Name + // 模组筛选,按模组标识符 + where targetModIdentifiers is null // 未提供列表,全部打包 + || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 + from namespaceDirectory in modDirectory.EnumerateDirectories() + let namespaceName = namespaceDirectory.Name + // 检查命名空间格式,拒绝错误格式 + // 但是写成表达式以后,没法现场丢异常了... + where !Regex.IsMatch(namespaceName, + @"^[a-z0-9_\-.]+$", + RegexOptions.Singleline) + from provider in namespaceDirectory.EnumerateProviders(config) + // 合并文件;我猜没写错 + group provider by namespaceName into namespaceGroup + select namespaceGroup + .Aggregate(seed: null as IResourceFileProvider, // 好家伙 类型推断系统推断不出TAggregate + (accumlate, next) // 为什么这个参数叫func不叫accumlator或者aggregator... + => next.Append(accumlate, overrideExisting: false)); } } diff --git a/src/Packer/Models/Config.cs b/src/Packer/Models/Config.cs index 2b5fc311abf9..ddbd298ab526 100644 --- a/src/Packer/Models/Config.cs +++ b/src/Packer/Models/Config.cs @@ -7,7 +7,7 @@ namespace Packer /// 配置文件 /// 主要config/packer.json加载 ///
- public class Config + public struct Config { /// /// 打包的目标版本 @@ -55,5 +55,7 @@ public class Config /// [JsonPropertyName("replacementMap")] public Dictionary CharatcerReplacement { get; set; } + + public Dictionary DestinationReplacement { get; set; } } } diff --git a/src/Packer/Models/IResourceFileProvider.cs b/src/Packer/Models/IResourceFileProvider.cs new file mode 100644 index 000000000000..3b5987ff8f7a --- /dev/null +++ b/src/Packer/Models/IResourceFileProvider.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Packer.Models +{ + /// + /// 表示可以被添加到资源包中的内容
+ /// 可以有很多实现:文本文件、非文本文件、组合表...... + ///
+ /// + /// 这是IMMUTABLE! + /// + public interface IResourceFileProvider + { + /// + /// 在本提供器的基础上,尝试添加新提供器中的内容 + /// + /// 需要添加的新 + /// 冲突解决方案。若为,保留本文件的内容;否则,保留新文件的内容 + /// 合并得到的新 + public IResourceFileProvider Append(IResourceFileProvider? incoming, bool overrideExisting = false) + // 默认实现 + => overrideExisting + ? (incoming ?? this) // 如果来源是null,无论冲突配置如何,都不应返回null + : this; + + /// + /// 在该提供器的内容中执行替换 + /// + /// 替换的匹配模式,使用 + /// 替换文本 + /// 替换得到的新 + public IResourceFileProvider ReplaceContent(string searchPattern, string replacement) + // 默认实现 + => this; + + /// + /// 在该提供器的目标地址中执行替换 + /// + /// 替换的匹配模式,使用 + /// 替换文本 + /// 替换得到的新 + public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) + // 默认实现 + => this; + + /// + /// 将该提供器的内容写入到资源包的正确位置 + /// + /// + /// + /// 资源包中已有同名文件 + public Task WriteToArchive(ZipArchive archive); + } +} diff --git a/src/Packer/Models/Providers/LanguageFile.cs b/src/Packer/Models/Providers/LanguageFile.cs new file mode 100644 index 000000000000..5ca5916797d0 --- /dev/null +++ b/src/Packer/Models/Providers/LanguageFile.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Packer.Models.Providers +{ + + + + public enum LanguageFileFormat + { + Lang = 0, + Json = 1 + } + + + internal class TermMappingProvider : IResourceFileProvider + { + public Dictionary Map { get; } + + public TermMappingProvider(Dictionary map) + { + Map = map; + } + + public IResourceFileProvider Append(IResourceFileProvider? incoming, bool overrideExisting = false) + { + if (incoming is not TermMappingProvider) + throw new ArgumentException($"Argument not an instance of {typeof(TermMappingProvider)}.", + nameof(incoming)); + var inProvider = incoming as TermMappingProvider; + + if (inProvider is null) throw new ArgumentNullException(nameof(incoming)); + + var (baseMap, inMap) = overrideExisting + ? (Map, inProvider.Map) + : (inProvider.Map, Map); // 交换顺序 + + foreach (var pair in inMap) + { + baseMap.TryAdd(pair.Key, pair.Value); + } + + return new TermMappingProvider(baseMap); + } + + public IResourceFileProvider ReplaceContent(string searchPattern, string replacement) + { + throw new NotImplementedException(); + } + + public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) + { + throw new NotImplementedException(); + } + + public Task WriteToArchive(ZipArchive archive) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Packer/Models/Providers/RawFile.cs b/src/Packer/Models/Providers/RawFile.cs new file mode 100644 index 000000000000..94efbeb03e41 --- /dev/null +++ b/src/Packer/Models/Providers/RawFile.cs @@ -0,0 +1,64 @@ +using Packer.Extensions; +using Serilog; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Packer.Models.Providers +{ + /// + /// 一般文件的提供器。不提供合并、替换支持 + /// + /// + /// 对于非文本文件,使用该类 + /// + public class RawFile : IResourceFileProvider + { + /// + /// 文件的源地址 + /// + public FileInfo SourceFile { get; } + + /// + /// 目标地址 + /// + public string Destination { get; } + + /// + /// 从给定的文件引用构造提供器 + /// + /// 源文件的引用 + /// 目标地址 + public RawFile(FileInfo sourceFile, string destination) + { + SourceFile = sourceFile; + Destination = destination; + } + + + /// + public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) + => new RawFile(SourceFile, + Regex.Replace(Destination, searchPattern, replacement)); + + /// + public async Task WriteToArchive(ZipArchive archive) + { + var destination = Destination.NormalizePath(); + Log.Information("正在添加 {0}", destination); + + archive.ValidateEntryDistinctness(destination); + + // 为什么这ZipArchive.CreateEntryFromFile没有Async变种...只有手动实现了 + using var source = SourceFile.OpenRead(); + using var entry = archive.CreateEntry(destination) + .Open(); + await source.CopyToAsync(entry); + } + } +} diff --git a/src/Packer/Models/Providers/TextFile.cs b/src/Packer/Models/Providers/TextFile.cs new file mode 100644 index 000000000000..18072b4c9670 --- /dev/null +++ b/src/Packer/Models/Providers/TextFile.cs @@ -0,0 +1,78 @@ +using Packer.Extensions; +using Serilog; +using System.IO; +using System.IO.Compression; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Packer.Models.Providers +{ + /// + /// 文本文件的提供器,支持内容替换,但不支持文件合并 + /// + /// + /// 对于普通的文本文件,使用该类 + /// + public class TextFile : IResourceFileProvider + { + /// + /// 提供器所携带的文本内容 + /// + public string Content { get; } + /// + /// 目标地址 + /// + public string Destination { get; } + + /// + /// 从给定的构造提供器。 + /// + /// 读取源 + /// 目标地址 + public TextFile(Stream stream, string destination) + { + Destination = destination; + using var reader = new StreamReader(stream, Encoding.UTF8); + Content = reader.ReadToEnd(); + } + + /// + /// 从给定的文本内容构造提供器。 + /// + /// 来源文本 + /// 目标地址 + public TextFile(string content, string destination) + { + Content = content; + Destination = destination; + } + + + public IResourceFileProvider ReplaceContent(string searchPattern, string replacement) + => new TextFile(Regex.Replace(Content, + searchPattern, + replacement), + Content); + /// + public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) + => new TextFile(Content, + Regex.Replace(Destination, + searchPattern, + replacement)); + /// + public async Task WriteToArchive(ZipArchive archive) + { + var destination = Destination.NormalizePath(); + Log.Information("正在添加 {0}", destination); + + archive.ValidateEntryDistinctness(destination); + + using var writer = new StreamWriter( + archive.CreateEntry(destination) + .Open(), + Encoding.UTF8); + await writer.WriteAsync(Content); + } + } +} diff --git a/src/Packer/Packer.csproj b/src/Packer/Packer.csproj index db77fb7f587b..3e7ae5065b02 100644 --- a/src/Packer/Packer.csproj +++ b/src/Packer/Packer.csproj @@ -3,6 +3,8 @@ Exe net7.0 + enable + none diff --git a/src/Packer/Program.cs b/src/Packer/Program.cs index 0b598b35ea89..aa1b8ebf718d 100644 --- a/src/Packer/Program.cs +++ b/src/Packer/Program.cs @@ -1,8 +1,11 @@ using Packer.Extensions; +using Packer.Models; using Serilog; using System; using System.IO; using System.IO.Compression; +using System.Linq; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Packer @@ -10,7 +13,7 @@ namespace Packer class Program { // 由于某些魔法,这里可以直接加参数 - public static async Task Main(string version = null) + public static async Task Main(string version, string[]? targets) { Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() @@ -19,31 +22,69 @@ public static async Task Main(string version = null) .CreateLogger(); if (version is null) - { throw new ArgumentNullException(nameof(version)); - } + var targetModIdentifiers = targets?.ToList(); var config = await Utils.RetrieveConfig(configTemplate: "./config/packer/{0}.json", version: version); - // Packer输出的文件名,可以随时更改 - string packName = $"./Minecraft-Mod-Language-Package-{config.Version}.zip"; - Log.Information("开始对版本 {0} 的打包", config.Version); - await using var stream = File.Create(packName); - var archive = new ZipArchive(stream, ZipArchiveMode.Update, leaveOpen: true); - archive.Initialize(config); + var rawQuery = Lib.RetrieveContent(config, targetModIdentifiers); + var query = // 这就是查询表达式吗( + from modDirectory in new DirectoryInfo($"./projects/{config.Version}/assets") + .EnumerateDirectories() + let modIdentifier = modDirectory.Name + // 模组筛选,按模组标识符 + where targetModIdentifiers is null // 未提供列表,全部打包 + || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 + where !config.ModBlackList.Contains(modIdentifier) // 没有被明确排除 + from namespaceDirectory in modDirectory.EnumerateDirectories() + let namespaceName = namespaceDirectory.Name + where !config.DomainBlackList.Contains(modIdentifier) // 没有被明确排除 + // 检查命名空间格式,拒绝错误格式 + // 但是写成表达式以后,没法现场丢异常了... + where !Regex.IsMatch(namespaceName, + @"^[a-z0-9_\-.]+$", + RegexOptions.Singleline) + from provider in namespaceDirectory.EnumerateProviders(config) + group provider by namespaceName into namespaceGroup// 合并文件;我猜没写错 + select namespaceGroup + .Aggregate(seed: null as IResourceFileProvider, // 好家伙 类型推断系统推断不出TAggregate + (accumlate, next) // 为什么这个参数叫func不叫accumlator或者aggregator... + => next.Append(accumlate, overrideExisting: false)) into provider + // 替换内容中的特殊字符 + select config.CharatcerReplacement + .Aggregate(seed: provider, + (accumlate, replacement) + => accumlate.ReplaceContent( + replacement.Key, + replacement.Value)) into provider + // 替换目标路径中的对象 + select config.DestinationReplacement + .Aggregate(seed: provider, + (accumlate, replacement) + => accumlate.ReplaceContent( + replacement.Key, + replacement.Value)); - await archive.WriteContent(Lib.RetrieveContent(config, out var bypassed)); - archive.WriteBypassed(bypassed); // 将跳过的文件一并加入 + // TODO 把初始化内容也做成IEnumerable,尤其是pack.mcmeta + // var initializers = from fileName in config.FilesToInitialize select new ... - Log.Information("对版本 {0} 的打包结束", config.Version); - archive.Dispose(); // 关闭压缩文档,不关闭流 + string packName = $"./Minecraft-Mod-Language-Package-{config.Version}.zip"; + await using var stream = File.Create(packName); + using (var archive = new ZipArchive(stream, ZipArchiveMode.Update, leaveOpen: true)) + { + archive.Initialize(config); + await Task.WhenAll(from provider in query select provider.WriteToArchive(archive)); + } - // 临时操作 - File.WriteAllText($"./{config.Version}.md5", stream.ComputeMD5()); - stream.Dispose(); + Log.Information("对版本 {0} 的打包结束。共包含了 {1} 个文件", + config.Version, + query.Count()); + var md5 = stream.ComputeMD5(); + Log.Information("打包文件的 MD5 值:{0}", md5); + File.WriteAllText($"./{config.Version}.md5", md5); } } } diff --git a/src/Packer/Utils.cs b/src/Packer/Utils.cs index 34c3b732b4e4..0fb99b660bc0 100644 --- a/src/Packer/Utils.cs +++ b/src/Packer/Utils.cs @@ -26,13 +26,22 @@ public static async Task RetrieveConfig(string configTemplate, string ve return JsonSerializer.Deserialize(reader); } - public static PackerStrategy RetrieveStrategy(FileInfo file) - => file is null - ? new PackerStrategy { Type = PackerStrategyType.NoAction } // 默认类型 - : JsonSerializer.Deserialize(file.OpenText().ReadToEnd(), new JsonSerializerOptions - { - Converters = { new JsonStringEnumConverter() } - }); + public static PackerStrategy RetrieveStrategy(FileInfo? file) + { + if (file is null) + { + return new PackerStrategy { Type = PackerStrategyType.NoAction }; + } + else + { + var result = JsonSerializer.Deserialize( + file.OpenText().ReadToEnd(), + new JsonSerializerOptions + { + Converters = { new JsonStringEnumConverter() } + }); + } + } /// /// 将两个带有TranslatedFile的列表合并,对冲突项按照target优先进行合并。 From 92098161697fb3efad821236799ee2dc0b037c22 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Sun, 17 Sep 2023 11:41:00 +0800 Subject: [PATCH 20/25] 2 --- src/Packer/Extensions/ContentExtension.cs | 94 ++-- src/Packer/Extensions/DirectoryExtension.cs | 422 +++++++++------- src/Packer/Extensions/SerializingExtension.cs | 199 ++++---- src/Packer/Lib.cs | 94 ++-- src/Packer/Models/Config.cs | 4 +- src/Packer/Models/IResourceFileProvider.cs | 15 +- src/Packer/Models/Mod.cs | 90 ++-- .../Models/Providers/CompositionProvider.cs | 34 ++ src/Packer/Models/Providers/LanguageFile.cs | 116 +++-- src/Packer/Models/Providers/McMetaProvider.cs | 22 + src/Packer/Models/Providers/RawFile.cs | 9 +- .../Models/Providers/TermMappingProvider.cs | 167 +++++++ src/Packer/Models/Providers/TextFile.cs | 15 +- src/Packer/Models/TranslatedFile.cs | 458 +++++++++--------- src/Packer/Program.cs | 36 +- src/Packer/Utils.cs | 117 ++--- 16 files changed, 1126 insertions(+), 766 deletions(-) create mode 100644 src/Packer/Models/Providers/CompositionProvider.cs create mode 100644 src/Packer/Models/Providers/McMetaProvider.cs create mode 100644 src/Packer/Models/Providers/TermMappingProvider.cs diff --git a/src/Packer/Extensions/ContentExtension.cs b/src/Packer/Extensions/ContentExtension.cs index 97b53a91ff79..fa41c4d34dce 100644 --- a/src/Packer/Extensions/ContentExtension.cs +++ b/src/Packer/Extensions/ContentExtension.cs @@ -12,8 +12,21 @@ namespace Packer.Extensions /// /// 对字符串的一些拓展方法 /// - public static class ContentExtension + public static partial class ContentExtension { + [GeneratedRegex(@"^[a-z0-9_.-]+$", RegexOptions.Singleline)] + private static partial Regex ValidNamespaceRegex(); + + public static bool ValidateNamespace(this string namespaceName) + { + // 强行丢异常...行吧 + if (!ValidNamespaceRegex().IsMatch(namespaceName)) + throw new ArgumentOutOfRangeException(nameof(namespaceName), namespaceName, "Invalid namespace name."); + return true; + } + + + /// /// 将文件的目标路径正规化,以免各种加载出错 /// @@ -21,7 +34,6 @@ public static class ContentExtension /// public static string NormalizePath(this string path) => path.Replace('\\', '/') // 修正正反斜杠导致的压缩文件读取问题 - //.ToLower() // 确保大小写 * 由于语言类型需要大小写而禁用该条 ; /// @@ -37,37 +49,37 @@ public static string StripModName(this string path) return Path.Join(_.ToArray()); } - /// - /// 文本预处理

- /// 目前仅有特殊符号更换,但还是预留了空间 - ///
- /// 待处理的文本 - /// 文本种类,用于判断是否转义 - /// 所使用的配置 - /// - public static string Preprocess(this string content, FileCategory category, Config config) - { - // 特殊符号替换 - foreach (var mapping in config.CharatcerReplacement) - { - var escaped = JavaScriptEncoder.Default.Encode(mapping.Value); - if (content.Contains(mapping.Key)) - { - Log.Information("正在进行特殊符号替换:{0} -> {1}", mapping.Key, escaped); - } + ///// + ///// 文本预处理

+ ///// 目前仅有特殊符号更换,但还是预留了空间 + /////
+ ///// 待处理的文本 + ///// 文本种类,用于判断是否转义 + ///// 所使用的配置 + ///// + //public static string Preprocess(this string content, FileCategory category, Config config) + //{ + // // 特殊符号替换 + // foreach (var mapping in config.CharatcerReplacement) + // { + // var escaped = JavaScriptEncoder.Default.Encode(mapping.Value); + // if (content.Contains(mapping.Key)) + // { + // Log.Information("正在进行特殊符号替换:{0} -> {1}", mapping.Key, escaped); + // } - if ((category & FileCategory.JsonAlike) == FileCategory.JsonAlike) - { // 替换为 unicode 转义码 - content = content.Replace(mapping.Key, escaped); - } - else - { // 替换为 unicode 字符 - content = content.Replace(mapping.Key, mapping.Value); - } + // if ((category & FileCategory.JsonAlike) == FileCategory.JsonAlike) + // { // 替换为 unicode 转义码 + // content = content.Replace(mapping.Key, escaped); + // } + // else + // { // 替换为 unicode 字符 + // content = content.Replace(mapping.Key, mapping.Value); + // } - } - return content; - } + // } + // return content; + //} /// /// 判断文件是否需要跳过预处理

@@ -76,14 +88,8 @@ public static string Preprocess(this string content, FileCategory category, Conf /// 文件所在的位置 /// 所使用的配置 /// - public static bool NeedBypass(this string location, Config config) - { - foreach (var @namespace in config.BypassedNamespace) - { - if (location.StartsWith(@namespace + "/")) return true; - } - return false; - } + public static bool IsForceIncluded(this string location, Config config) + => config.ForceInclusionDomain.Any(_ => location.StartsWith(_ + '/')); /// /// 判断文件是否属于应跳过的语言 @@ -91,14 +97,8 @@ public static bool NeedBypass(this string location, Config config) /// 文件所在的位置 /// 所使用的配置 /// - public static bool IsTargetLang(this string location, Config config) - { - foreach (var lang in config.TargetLanguages) - { - if (location.Contains(lang, StringComparison.OrdinalIgnoreCase)) return true; - } - return false; - } + public static bool IsInTargetLanguage(this string location, Config config) + => config.TargetLanguages.Any(_ => location.Contains(_, StringComparison.OrdinalIgnoreCase)); // 临时方法 /// diff --git a/src/Packer/Extensions/DirectoryExtension.cs b/src/Packer/Extensions/DirectoryExtension.cs index 130854064443..b506663c0dc5 100644 --- a/src/Packer/Extensions/DirectoryExtension.cs +++ b/src/Packer/Extensions/DirectoryExtension.cs @@ -1,195 +1,293 @@ using Packer.Models; +using Packer.Models.Providers; using Serilog; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; +using System.Text.RegularExpressions; namespace Packer.Extensions { + using EvaluatorReturnType = IEnumerable<(IResourceFileProvider provider, bool overrides)>; + using ParameterType = Dictionary; + + /// /// 用于处理\[namespace]层级的不同加载策略的拓展方法,以及一些辅助方法 /// - public static class DirectoryExtension + public static partial class DirectoryExtension { + [GeneratedRegex(@"^assets/[a-z0-9_.-]+/lang/[a-zA-Z0-9_-]+\.(?:json|lang)$", RegexOptions.Singleline)] + private static partial Regex LanguageFileRegex(); + + + /// + /// 加载策略所使用的标准方法代理 + /// + /// 加载的基准位置 + /// 采用的全局配置 + /// 局部打包配置的附加参数 + /// 一个,第一参数为提供器的目标 + public delegate EvaluatorReturnType + ProviderEvaluator(DirectoryInfo namespaceDirectory, + Config config, + Dictionary parameters); + + public static Dictionary functionTable = new() + { + { PackerStrategyType.NoAction, FromCurrentDirectory }, + { PackerStrategyType.CloneMissing, FromSpecifiedDirectory } // , + // ... + }; + public static IEnumerable EnumerateProviders - (this DirectoryInfo namespaceDirectory, - Config config) - // 其实这个我还没想好要不要叫Enumerate,毕竟可能不一定能做成Linq的样子 + (this DirectoryInfo namespaceDirectory, Config config) + => from enumeratedPair in namespaceDirectory.EnumerateRawProviders(config) + group enumeratedPair by enumeratedPair.provider.Destination into providerGroup + select providerGroup.Aggregate( + seed: null as IResourceFileProvider, + (accumlate, next) + => next.provider.ApplyTo(accumlate, next.overrides)) /* into provider + select provider.ReplaceDestination(@"(?<=^assets/)[^/]*(?=/)", + namespaceDirectory.Name) */ ;// WARNING:路径替换要做到具体方法里面! + + static EvaluatorReturnType EnumerateRawProviders(this DirectoryInfo namespaceDirectory, Config config) { var policyFile = namespaceDirectory.GetFiles("packer-policy.json").FirstOrDefault(); + var policyList = Utils.RetrieveStrategy(policyFile); - var policy = Utils.RetrieveStrategy(policyFile); - - throw null; + return from policy in policyList + from enumeratedPair in functionTable[policy.Type](namespaceDirectory, config, policy.Parameters) + select enumeratedPair; } - /// - /// 从[namespace]生成所需的Asset对象,采用本目录下放置的配置文件 - /// - /// 目标路径 - /// 采用的配置 - /// 未经处理的文件 - /// - public static IEnumerable AggregateAssetFiles(this DirectoryInfo assetPath, - Config config, - ref Dictionary bypassed) + ///// + ///// 从[namespace]生成所需的Asset对象,采用本目录下放置的配置文件 + ///// + ///// 目标路径 + ///// 采用的配置 + ///// 未经处理的文件 + ///// + //public static IEnumerable AggregateAssetFiles(this DirectoryInfo assetPath, + // Config config, + // ref Dictionary bypassed) + //{ + // // 读取局域配置文件;若为空,配置为“无操作”(直接处理文件) + // var policy = Utils.RetrieveStrategy(assetPath.GetFiles("packer-policy.json").FirstOrDefault()); + + // if (policy.Type != PackerStrategyType.NoAction) + // Log.Information("对asset-domain {2} 采用非标准检索策略:{0} w/ {1}", + // policy.Type, + // policy.Parameters, + // assetPath.Name); + + // // Delegate是个好东西 要不然这参数不知道要多长 + // // 不过,什么时候能支持集合字面量......这样子就甚至不用写类型了 + // // 目前支持的打包策略 + // Dictionary functionTable = new() + // { + // { PackerStrategyType.NoAction, FromImmediateDirectory }, + // { PackerStrategyType.PlainClone, FromIndirectDirectory }, + // { PackerStrategyType.CloneMissing, FromMixedDirectory }, + // { PackerStrategyType.BackPort, FromBackPort }, + // { PackerStrategyType.Patch, FromPatches } + // }; + // return functionTable[policy.Type](assetPath, config, ref bypassed, policy.Parameters); + //} + + + + static IResourceFileProvider CreateProviderFromFile(FileInfo file, string destination, Config config) { - // 读取局域配置文件;若为空,配置为“无操作”(直接处理文件) - var policy = Utils.RetrieveStrategy(assetPath.GetFiles("packer-policy.json").FirstOrDefault()); - - if (policy.Type != PackerStrategyType.NoAction) - Log.Information("对asset-domain {2} 采用非标准检索策略:{0} w/ {1}", - policy.Type, - policy.Parameters, - assetPath.Name); - - // Delegate是个好东西 要不然这参数不知道要多长 - // 不过,什么时候能支持集合字面量......这样子就甚至不用写类型了 - // 目前支持的打包策略 - Dictionary functionTable = new() + var extension = file.Extension; + if (file.Directory!.Name == "lang") { - { PackerStrategyType.NoAction, FromImmediateDirectory }, - { PackerStrategyType.PlainClone, FromIndirectDirectory }, - { PackerStrategyType.CloneMissing, FromMixedDirectory }, - { PackerStrategyType.BackPort, FromBackPort }, - { PackerStrategyType.Patch, FromPatches } + switch (extension) + { + case ".json": return JsonLanguageFile.Create(file, destination); + case ".lang": return LangLanguageFile.Create(file, destination); + }; + } + return extension switch + { + // 已知的文本文件类型 + ".txt" or ".json" or ".md" => TextFile.Create(file, destination), + _ => new RawFile(file, destination) }; - return functionTable[policy.Type](assetPath, config, ref bypassed, policy.Parameters); } - /// - /// 加载策略所使用的标准方法代理 - /// - /// 目标路径 - /// 采用的全局配置 - /// 不经处理的文件 - /// 局部打包配置的附加参数 - /// - public delegate IEnumerable Del(DirectoryInfo assetDirectory, + + + + + + static EvaluatorReturnType FromCurrentDirectory(DirectoryInfo namespaceDirectory, Config config, - ref Dictionary unprocessed, - Dictionary parameters); - - static IEnumerable FromMixedDirectory(DirectoryInfo assetDirectory, - Config config, - ref Dictionary unprocessed, - Dictionary parameters) - => Utils.MergeFiles(FromImmediateDirectory(assetDirectory, config, ref unprocessed, parameters), - FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters)); - - static IEnumerable FromBackPort(DirectoryInfo assetDirectory, - Config config, - ref Dictionary unprocessed, - Dictionary parameters) - => Utils.PortFiles(FromImmediateDirectory(assetDirectory, config, ref unprocessed, parameters), - FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters)); - - static IEnumerable FromIndirectDirectory(DirectoryInfo assetDirectory, - Config config, - ref Dictionary unprocessed, - Dictionary parameters) - => AggregateAssetFiles(new DirectoryInfo(parameters["source"].GetString()), config, ref unprocessed); - - static IEnumerable FromPatches(DirectoryInfo assetDirectory, - Config config, - ref Dictionary unprocessed, - Dictionary parameters) + ParameterType parameters) + => from candidate in namespaceDirectory.EnumerateFiles("*", SearchOption.AllDirectories) + let relativePath = Path.GetRelativePath(namespaceDirectory.FullName, + candidate.FullName) + .NormalizePath() + let destination = Path.Combine(namespaceDirectory.Name, + relativePath) + .NormalizePath() + let domain = relativePath.Split('/')[0] + where relativePath != "packer-policy.json" // TODO:其他文件 // 策略文件本身不包含 + where destination.IsInTargetLanguage(config) // 含有正确的语言标记 + || relativePath.IsForceIncluded(config) // 强制包含 + let provider = CreateProviderFromFile(candidate, destination, config) + select (provider, DoesOverride(parameters)); + + static EvaluatorReturnType FromSpecifiedDirectory(DirectoryInfo namespaceDirectory, + Config config, + ParameterType parameters) { - var reference = FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters) - .ToDictionary(_ => _.RelativePath); - var patchList = JsonSerializer.Deserialize>(parameters["patches"]); - foreach (var patch in patchList) - { - Log.Information("对文件 {0} 应用 {1} 处的 patch。", patch.Key, patch.Value); - reference.Remove(patch.Key, out var target); - var patchText = string.Join('\n', File.ReadAllLines(patch.Value)); // 不要问我为什么D-M-P默认换行是LF - reference.Add(patch.Key, target.ApplyPatch(patchText)); - } - return reference.Values; + var redirect = parameters["source"].GetString(); + var namespaceName = namespaceDirectory.Name; + namespaceName.ValidateNamespace(); + var redirectDirectory = new DirectoryInfo(redirect!); + return from candidate in redirectDirectory.EnumerateRawProviders(config) + let provider = candidate.provider + .ReplaceDestination(@"^(?<=^assets/)[^/]*(?=/)", + namespaceName) + select (provider, DoesOverride(parameters)); } - // 目前所有策略的终点方法 - static IEnumerable FromImmediateDirectory(DirectoryInfo assetDirectory, - Config config, - ref Dictionary unprocessed, - Dictionary parameters) + + + + static bool DoesOverride(ParameterType parameters) { - var bypassed = unprocessed; - var result = assetDirectory.EnumerateFiles("*", SearchOption.AllDirectories) // / 的下级文件 - .Select(file => - { // 这里开始真正的检索。被跳过的文本用 null 代替 - var prefixLength = assetDirectory.FullName.Length; - var relativePath = file.FullName[(prefixLength + 1)..] - .Replace('\\', '/'); // 在asset-domain下的位置,规范为用正斜杠分割 - - // 处理被跳过的文本。处理顺序:policy -> [bypass](font, textures) -> !zh_cn - // 顺序乱了会导致字体文件被丢弃,因为没有带zh_cn - - // 跳过检索策略文件 - if (relativePath == "packer-policy.json") - { - return null; - } - - // 选出不经过处理路径的文件 - if (relativePath.NeedBypass(config)) - { - var target = Path.Combine("assets", - assetDirectory.Name, - relativePath); - Log.Information("跳过了标记为直接加入的命名空间:{0} -> {1}", - relativePath.Split('/')[0], - target); - - if (bypassed.ContainsValue(target)){ - Log.Warning("在未处理文件中检测到重复项。丢弃将要加入的新项"); - return null; - } - bypassed.Add(file.FullName, target); - return null; - } - - // 跳过非中文文件 - if (!relativePath.IsTargetLang(config)) - { - return null; - } - - // 跳过非中文文件 - if (!relativePath.IsTargetLang(config)) - { - return null; - } - - // 处理正常的语言文件 - // TODO:Json5支持 - var parsingCategory = file.Extension switch - { - ".json" => FileCategory.JsonAlike, - _ => FileCategory.LangAlike - }; - if (relativePath.StartsWith("lang/")) - { - return new LangFile(file.OpenRead(), - parsingCategory | FileCategory.LanguageFile, - config) - { - RelativePath = relativePath - }; - } - else - { - return new TranslatedFile(file.OpenRead(), - parsingCategory | FileCategory.OtherFiles, - config) - { - RelativePath = relativePath - }; - } - }).Where(_ => _ is not null); // 排除掉跳过的文件 - return result; + var hasKey = parameters.TryGetValue("overrides", out var element); + return hasKey ? element.GetBoolean() : false; } + + + + + + + //static IEnumerable FromMixedDirectory(DirectoryInfo assetDirectory, + // Config config, + // ref Dictionary unprocessed, + // Dictionary parameters) + // => Utils.MergeFiles(FromImmediateDirectory(assetDirectory, config, ref unprocessed, parameters), + // FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters)); + + //static IEnumerable FromBackPort(DirectoryInfo assetDirectory, + // Config config, + // ref Dictionary unprocessed, + // Dictionary parameters) + // => Utils.PortFiles(FromImmediateDirectory(assetDirectory, config, ref unprocessed, parameters), + // FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters)); + + //static IEnumerable FromIndirectDirectory(DirectoryInfo assetDirectory, + // Config config, + // ref Dictionary unprocessed, + // Dictionary parameters) + // => AggregateAssetFiles(new DirectoryInfo(parameters["source"].GetString()), config, ref unprocessed); + + //static IEnumerable FromPatches(DirectoryInfo assetDirectory, + // Config config, + // ref Dictionary unprocessed, + // Dictionary parameters) + //{ + // var reference = FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters) + // .ToDictionary(_ => _.RelativePath); + // var patchList = JsonSerializer.Deserialize>(parameters["patches"]); + // foreach (var patch in patchList) + // { + // Log.Information("对文件 {0} 应用 {1} 处的 patch。", patch.Key, patch.Value); + // reference.Remove(patch.Key, out var target); + // var patchText = string.Join('\n', File.ReadAllLines(patch.Value)); // 不要问我为什么D-M-P默认换行是LF + // reference.Add(patch.Key, target.ApplyPatch(patchText)); + // } + // return reference.Values; + //} + + //// 目前所有策略的终点方法 + //static IEnumerable FromImmediateDirectory(DirectoryInfo assetDirectory, + // Config config, + // ref Dictionary unprocessed, + // Dictionary parameters) + //{ + // var bypassed = unprocessed; + // var result = assetDirectory.EnumerateFiles("*", SearchOption.AllDirectories) // / 的下级文件 + // .Select(file => + // { // 这里开始真正的检索。被跳过的文本用 null 代替 + // var prefixLength = assetDirectory.FullName.Length; + // var relativePath = file.FullName[(prefixLength + 1)..] + // .Replace('\\', '/'); // 在asset-domain下的位置,规范为用正斜杠分割 + + // // 处理被跳过的文本。处理顺序:policy -> [bypass](font, textures) -> !zh_cn + // // 顺序乱了会导致字体文件被丢弃,因为没有带zh_cn + + // // 跳过检索策略文件 + // if (relativePath == "packer-policy.json") + // { + // return null; + // } + + // // 选出不经过处理路径的文件 + // if (relativePath.IsForceIncluded(config)) + // { + // var target = Path.Combine("assets", + // assetDirectory.Name, + // relativePath); + // Log.Information("跳过了标记为直接加入的命名空间:{0} -> {1}", + // relativePath.Split('/')[0], + // target); + + // if (bypassed.ContainsValue(target)) + // { + // Log.Warning("在未处理文件中检测到重复项。丢弃将要加入的新项"); + // return null; + // } + // bypassed.Add(file.FullName, target); + // return null; + // } + + // // 跳过非中文文件 + // if (!relativePath.IsInTargetLanguage(config)) + // { + // return null; + // } + + // // 跳过非中文文件 + // if (!relativePath.IsInTargetLanguage(config)) + // { + // return null; + // } + + // // 处理正常的语言文件 + // // TODO:Json5支持 + // var parsingCategory = file.Extension switch + // { + // ".json" => FileCategory.JsonAlike, + // _ => FileCategory.LangAlike + // }; + // if (relativePath.StartsWith("lang/")) + // { + // return new LangFile(file.OpenRead(), + // parsingCategory | FileCategory.LanguageFile, + // config) + // { + // RelativePath = relativePath + // }; + // } + // else + // { + // return new TranslatedFile(file.OpenRead(), + // parsingCategory | FileCategory.OtherFiles, + // config) + // { + // RelativePath = relativePath + // }; + // } + // }).Where(_ => _ is not null); // 排除掉跳过的文件 + // return result; + //} } } diff --git a/src/Packer/Extensions/SerializingExtension.cs b/src/Packer/Extensions/SerializingExtension.cs index 812d675c5a61..520cb9905de5 100644 --- a/src/Packer/Extensions/SerializingExtension.cs +++ b/src/Packer/Extensions/SerializingExtension.cs @@ -1,104 +1,105 @@ -using Packer.Models; -using Serilog; -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.Json; +//using Packer.Models; +//using Packer.Models.Providers; +//using Serilog; +//using System; +//using System.Collections.Generic; +//using System.Text; +//using System.Text.Json; -namespace Packer.Extensions -{ - static class SerializingExtension - { - public static string SerializeAsset(this Dictionary assetMap, FileCategory category) - => category switch - { - // Json 文件,直接写出 - FileCategory.JsonTranslationFormat => JsonSerializer.Serialize(assetMap, - new JsonSerializerOptions - { - WriteIndented = true - }), - // Lang文件 - FileCategory.LangTranslationFormat => SerializeFromLang(assetMap), - _ => null // 其实不应该执行到这个地方 - }; +//namespace Packer.Extensions +//{ +// static class SerializingExtension +// { +// public static string SerializeAsset(this Dictionary assetMap, FileCategory category) +// => category switch +// { +// // Json 文件,直接写出 +// FileCategory.JsonTranslationFormat => JsonSerializer.Serialize(assetMap, +// new JsonSerializerOptions +// { +// WriteIndented = true +// }), +// // Lang文件 +// FileCategory.LangTranslationFormat => SerializeFromLang(assetMap), +// _ => null // 其实不应该执行到这个地方 +// }; - static string SerializeFromLang(Dictionary assetMap) - { - // lang格式化还好说 - var sb = new StringBuilder(); - foreach (var pair in assetMap) - { - sb.AppendJoin('=', pair.Key, pair.Value); - sb.Append(Environment.NewLine); - } - return sb.ToString(); - } +// static string SerializeFromLang(Dictionary assetMap) +// { +// // lang格式化还好说 +// var sb = new StringBuilder(); +// foreach (var pair in assetMap) +// { +// sb.AppendJoin('=', pair.Key, pair.Value); +// sb.Append(Environment.NewLine); +// } +// return sb.ToString(); +// } - public static Dictionary DeserializeAsset(this string content, FileCategory category) - => category switch - { - FileCategory.JsonTranslationFormat - => JsonSerializer.Deserialize>(content, - new JsonSerializerOptions - { - ReadCommentHandling = JsonCommentHandling.Skip // 打包过程应当兼容注释,但不需要写入注释 - }), // 直接有的算法 - FileCategory.LangTranslationFormat => DeserializeFromLang(content), - _ => null // 其实不应该执行到这个地方 - }; +// public static Dictionary DeserializeAsset(this string content, FileCategory category) +// => category switch +// { +// FileCategory.JsonTranslationFormat +// => JsonSerializer.Deserialize>(content, +// new JsonSerializerOptions +// { +// ReadCommentHandling = JsonCommentHandling.Skip // 打包过程应当兼容注释,但不需要写入注释 +// }), // 直接有的算法 +// FileCategory.LangTranslationFormat => DeserializeFromLang(content), +// _ => null // 其实不应该执行到这个地方 +// }; - static Dictionary DeserializeFromLang(string content) - { - // 甚至不是自动机...所以不敢多用,否则会炸 +// static Dictionary DeserializeFromLang(string content) +// { +// // 甚至不是自动机...所以不敢多用,否则会炸 - // 下面的 Verbose 仅供调试,不会在 log 里出现 - // .lang的格式真的乱... - Log.Verbose("开始反序列化 .lang 文件"); - // #PARSE_ESCAPE就算了吧 - var result = new Dictionary(); - var isInComment = false; // 处理多行注释 - new List(content.Split(Environment.NewLine, - StringSplitOptions.RemoveEmptyEntries)) - .ForEach(line => - { - var isSingleLineComment = false; - new List { "//", "#" } - .ForEach(_ => { isSingleLineComment |= line.StartsWith(_); }); - if (isSingleLineComment) - { - Log.Verbose("跳过了单行注释:{0}", line); - } - else if (isInComment) // 多行注释内 - { - Log.Verbose("{0}", line); - if (line.Trim() - .EndsWith("*/")) - { - isInComment = false; // 跳出注释 - } - } - else if (line.StartsWith("/*")) // 开始多行注释 - { - Log.Verbose("跳过了多行注释:{0}", line); - } - else // 真正的条目 - { - Log.Verbose("添加对应映射:{0}", line); - var spiltPosition = line.IndexOf('='); - try - { - result.Add(line[..spiltPosition], line[(spiltPosition + 1)..]); - } - catch (Exception e) - { - Log.Warning(e.ToString()); - } - } - } - ); - Log.Verbose("反序列化完成"); - return result; - } - } -} +// // 下面的 Verbose 仅供调试,不会在 log 里出现 +// // .lang的格式真的乱... +// Log.Verbose("开始反序列化 .lang 文件"); +// // #PARSE_ESCAPE就算了吧 +// var result = new Dictionary(); +// var isInComment = false; // 处理多行注释 +// new List(content.Split(Environment.NewLine, +// StringSplitOptions.RemoveEmptyEntries)) +// .ForEach(line => +// { +// var isSingleLineComment = false; +// new List { "//", "#" } +// .ForEach(_ => { isSingleLineComment |= line.StartsWith(_); }); +// if (isSingleLineComment) +// { +// Log.Verbose("跳过了单行注释:{0}", line); +// } +// else if (isInComment) // 多行注释内 +// { +// Log.Verbose("{0}", line); +// if (line.Trim() +// .EndsWith("*/")) +// { +// isInComment = false; // 跳出注释 +// } +// } +// else if (line.StartsWith("/*")) // 开始多行注释 +// { +// Log.Verbose("跳过了多行注释:{0}", line); +// } +// else // 真正的条目 +// { +// Log.Verbose("添加对应映射:{0}", line); +// var spiltPosition = line.IndexOf('='); +// try +// { +// result.Add(line[..spiltPosition], line[(spiltPosition + 1)..]); +// } +// catch (Exception e) +// { +// Log.Warning(e.ToString()); +// } +// } +// } +// ); +// Log.Verbose("反序列化完成"); +// return result; +// } +// } +//} diff --git a/src/Packer/Lib.cs b/src/Packer/Lib.cs index d4e8c61b587a..dae6789d8ffd 100644 --- a/src/Packer/Lib.cs +++ b/src/Packer/Lib.cs @@ -1,49 +1,49 @@ -using Packer.Extensions; -using Packer.Models; -using Serilog; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; +//using Packer.Extensions; +//using Packer.Models; +//using Serilog; +//using System; +//using System.Collections.Generic; +//using System.IO; +//using System.Linq; +//using System.Text.RegularExpressions; -namespace Packer -{ - static class Lib - { - /// - /// 从主库中选出所需文本 - /// - /// 所使用的配置 - /// - /// 需要包含的模组列表,按模组唯一标识符
- /// 若为,表示包含所有模组 - /// - /// - public static IEnumerable RetrieveContent( - Config config, - IEnumerable? targetModIdentifiers) +//namespace Packer +//{ +// static class Lib +// { +// /// +// /// 从主库中选出所需文本 +// /// +// /// 所使用的配置 +// /// +// /// 需要包含的模组列表,按模组唯一标识符
+// /// 若为,表示包含所有模组 +// /// +// /// +// public static IEnumerable RetrieveContent( +// Config config, +// IEnumerable? targetModIdentifiers) - // 成功实现了没分号的C#语句...这就是查询表达式吗( - => from modDirectory in new DirectoryInfo($"./projects/{config.Version}/assets") - .EnumerateDirectories() - let modIdentifier = modDirectory.Name - // 模组筛选,按模组标识符 - where targetModIdentifiers is null // 未提供列表,全部打包 - || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 - from namespaceDirectory in modDirectory.EnumerateDirectories() - let namespaceName = namespaceDirectory.Name - // 检查命名空间格式,拒绝错误格式 - // 但是写成表达式以后,没法现场丢异常了... - where !Regex.IsMatch(namespaceName, - @"^[a-z0-9_\-.]+$", - RegexOptions.Singleline) - from provider in namespaceDirectory.EnumerateProviders(config) - // 合并文件;我猜没写错 - group provider by namespaceName into namespaceGroup - select namespaceGroup - .Aggregate(seed: null as IResourceFileProvider, // 好家伙 类型推断系统推断不出TAggregate - (accumlate, next) // 为什么这个参数叫func不叫accumlator或者aggregator... - => next.Append(accumlate, overrideExisting: false)); - } -} +// // 成功实现了没分号的C#语句...这就是查询表达式吗( +// => from modDirectory in new DirectoryInfo($"./projects/{config.Version}/assets") +// .EnumerateDirectories() +// let modIdentifier = modDirectory.Name +// // 模组筛选,按模组标识符 +// where targetModIdentifiers is null // 未提供列表,全部打包 +// || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 +// from namespaceDirectory in modDirectory.EnumerateDirectories() +// let namespaceName = namespaceDirectory.Name +// // 检查命名空间格式,拒绝错误格式 +// // 但是写成表达式以后,没法现场丢异常了... +// where !Regex.IsMatch(namespaceName, +// @"^[a-z0-9_\-.]+$", +// RegexOptions.Singleline) +// from provider in namespaceDirectory.EnumerateProviders(config) +// // 合并文件;我猜没写错 +// group provider by namespaceName into namespaceGroup +// select namespaceGroup +// .Aggregate(seed: null as IResourceFileProvider, // 好家伙 类型推断系统推断不出TAggregate +// (accumlate, next) // 为什么这个参数叫func不叫accumlator或者aggregator... +// => next.ApplyTo(accumlate, overrideExisting: false)); +// } +//} diff --git a/src/Packer/Models/Config.cs b/src/Packer/Models/Config.cs index ddbd298ab526..f6d73453db8a 100644 --- a/src/Packer/Models/Config.cs +++ b/src/Packer/Models/Config.cs @@ -48,7 +48,7 @@ public struct Config /// 按照namespace识别 ///
[JsonPropertyName("noProcessNamespace")] - public List BypassedNamespace { get; set; } + public List ForceInclusionDomain { get; set; } /// /// 字符替换表,版本限定 @@ -56,6 +56,8 @@ public struct Config [JsonPropertyName("replacementMap")] public Dictionary CharatcerReplacement { get; set; } + + [JsonPropertyName("destinitionReplacement")] public Dictionary DestinationReplacement { get; set; } } } diff --git a/src/Packer/Models/IResourceFileProvider.cs b/src/Packer/Models/IResourceFileProvider.cs index 3b5987ff8f7a..d46025bf05e9 100644 --- a/src/Packer/Models/IResourceFileProvider.cs +++ b/src/Packer/Models/IResourceFileProvider.cs @@ -22,9 +22,9 @@ public interface IResourceFileProvider /// 需要添加的新 /// 冲突解决方案。若为,保留本文件的内容;否则,保留新文件的内容 /// 合并得到的新 - public IResourceFileProvider Append(IResourceFileProvider? incoming, bool overrideExisting = false) + public IResourceFileProvider ApplyTo(IResourceFileProvider? incoming, bool overrideExisting = false) // 默认实现 - => overrideExisting + => !overrideExisting ? (incoming ?? this) // 如果来源是null,无论冲突配置如何,都不应返回null : this; @@ -44,16 +44,19 @@ public IResourceFileProvider ReplaceContent(string searchPattern, string replace /// 替换的匹配模式,使用 /// 替换文本 /// 替换得到的新 - public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) - // 默认实现 - => this; + public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement); /// /// 将该提供器的内容写入到资源包的正确位置 /// /// - /// /// 资源包中已有同名文件 public Task WriteToArchive(ZipArchive archive); + + /// + /// 获取该提供器的目标位置 + /// + /// 目标在资源包中的相对位置,从根目录算起 + public string Destination { get; } } } diff --git a/src/Packer/Models/Mod.cs b/src/Packer/Models/Mod.cs index 78f618397855..8f2876da621a 100644 --- a/src/Packer/Models/Mod.cs +++ b/src/Packer/Models/Mod.cs @@ -1,48 +1,48 @@ -using System.Collections.Generic; +//using System.Collections.Generic; -namespace Packer.Models -{ - /// - /// 模组译文的抽象表示 - /// - public class Mod - { - /// - /// 模组名 - /// - public string modName; - /// - /// 采用的asset,按asset-domain分 - /// - public IEnumerable assets; - } +//namespace Packer.Models +//{ +// /// +// /// 模组译文的抽象表示 +// /// +// public class Mod +// { +// /// +// /// 模组名 +// /// +// public string modName; +// /// +// /// 采用的asset,按asset-domain分 +// /// +// public IEnumerable assets; +// } - /// - /// asset的抽象表示 - /// - public class Asset - { - /// - /// asset-domain名 - /// - public string domainName; - /// - /// 该asset-domain下的文件 - /// - public IEnumerable contents; - /// - /// domain合并,并解决重复文件问题 - /// - /// 要合并的对象 - /// - public Asset Combine(Asset other) - { +// /// +// /// asset的抽象表示 +// /// +// public class Asset +// { +// /// +// /// asset-domain名 +// /// +// public string domainName; +// /// +// /// 该asset-domain下的文件 +// /// +// public IEnumerable contents; +// /// +// /// domain合并,并解决重复文件问题 +// /// +// /// 要合并的对象 +// /// +// public Asset Combine(Asset other) +// { - return new Asset() - { - domainName = this.domainName, - contents = Utils.MergeFiles(this.contents, other.contents) - }; - } - } -} +// return new Asset() +// { +// domainName = this.domainName, +// contents = Utils.MergeFiles(this.contents, other.contents) +// }; +// } +// } +//} diff --git a/src/Packer/Models/Providers/CompositionProvider.cs b/src/Packer/Models/Providers/CompositionProvider.cs new file mode 100644 index 000000000000..bea32ad5ae87 --- /dev/null +++ b/src/Packer/Models/Providers/CompositionProvider.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.IO; +using System.Text.Json.Nodes; + +namespace Packer.Models.Providers +{ + using LangMappingProvider = TermMappingProvider; + using JsonMappingProvider = TermMappingProvider; + + + // 考量:Helper? + public class CompositionProvider : TermMappingProvider + { + public CompositionProvider(ITermDictionary map, string destination) : base(map, destination) { } + + public CompositionProvider Create(FileInfo file) + { + + } + } + + + internal struct CompositonData + { + public string Target { get; set; } + public List Entries { get; set; } + } + + internal struct CompositionEntry + { + public Dictionary Templates { get; set; } + public Dictionary Parameters { get; set; } + } +} diff --git a/src/Packer/Models/Providers/LanguageFile.cs b/src/Packer/Models/Providers/LanguageFile.cs index 5ca5916797d0..3c236d655f67 100644 --- a/src/Packer/Models/Providers/LanguageFile.cs +++ b/src/Packer/Models/Providers/LanguageFile.cs @@ -1,66 +1,92 @@ -using System; +using Serilog; +using System; using System.Collections.Generic; -using System.IO.Compression; +using System.IO; using System.Linq; using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; +using System.Text.Json.Nodes; namespace Packer.Models.Providers { + using LangMappingProvider = TermMappingProvider; + using JsonMappingProvider = TermMappingProvider; - - public enum LanguageFileFormat - { - Lang = 0, - Json = 1 - } - - - internal class TermMappingProvider : IResourceFileProvider + public class LangLanguageFile : LangMappingProvider { - public Dictionary Map { get; } - - public TermMappingProvider(Dictionary map) + public LangLanguageFile(ITermDictionary map, string destination) : base(map, destination) { } + public static LangLanguageFile Create(FileInfo file, string destination) { - Map = map; + using var stream = file.OpenRead(); + using var reader = new StreamReader(stream, Encoding.UTF8); + var content = reader.ReadToEnd(); + return new(new LangDictionaryWrapper(DeserializeFromLang(content)), destination); } - public IResourceFileProvider Append(IResourceFileProvider? incoming, bool overrideExisting = false) + // RAW CONTENT + static Dictionary DeserializeFromLang(string content) { - if (incoming is not TermMappingProvider) - throw new ArgumentException($"Argument not an instance of {typeof(TermMappingProvider)}.", - nameof(incoming)); - var inProvider = incoming as TermMappingProvider; - - if (inProvider is null) throw new ArgumentNullException(nameof(incoming)); - - var (baseMap, inMap) = overrideExisting - ? (Map, inProvider.Map) - : (inProvider.Map, Map); // 交换顺序 - - foreach (var pair in inMap) - { - baseMap.TryAdd(pair.Key, pair.Value); - } + // 甚至不是自动机...所以不敢多用,否则会炸 - return new TermMappingProvider(baseMap); - } - - public IResourceFileProvider ReplaceContent(string searchPattern, string replacement) - { - throw new NotImplementedException(); + // 下面的 Verbose 仅供调试,不会在 log 里出现 + // .lang的格式真的乱... + Log.Verbose("开始反序列化 .lang 文件"); + // #PARSE_ESCAPE就算了吧 + var result = new Dictionary(); + var isInComment = false; // 处理多行注释 + new List(content.Split(Environment.NewLine, + StringSplitOptions.RemoveEmptyEntries)) + .ForEach(line => + { + var isSingleLineComment = false; + new List { "//", "#" } + .ForEach(_ => { isSingleLineComment |= line.StartsWith(_); }); + if (isSingleLineComment) + { + Log.Verbose("跳过了单行注释:{0}", line); + } + else if (isInComment) // 多行注释内 + { + Log.Verbose("{0}", line); + if (line.Trim() + .EndsWith("*/")) + { + isInComment = false; // 跳出注释 + } + } + else if (line.StartsWith("/*")) // 开始多行注释 + { + Log.Verbose("跳过了多行注释:{0}", line); + } + else // 真正的条目 + { + Log.Verbose("添加对应映射:{0}", line); + var spiltPosition = line.IndexOf('='); + try + { + result.Add(line[..spiltPosition], line[(spiltPosition + 1)..]); + } + catch (Exception e) + { + Log.Warning(e.ToString()); + } + } + } + ); + Log.Verbose("反序列化完成"); + return result; } + } - public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) - { - throw new NotImplementedException(); - } - public Task WriteToArchive(ZipArchive archive) + public class JsonLanguageFile : JsonMappingProvider + { + public JsonLanguageFile(ITermDictionary map, string destination) : base(map, destination) { } + public static JsonLanguageFile Create(FileInfo file, string destination) { - throw new NotImplementedException(); + using var stream = file.OpenRead(); + return new(new JsonDictionaryWrapper(JsonNode.Parse(stream).AsObject()), destination); } } + } diff --git a/src/Packer/Models/Providers/McMetaProvider.cs b/src/Packer/Models/Providers/McMetaProvider.cs new file mode 100644 index 000000000000..2a7776921e18 --- /dev/null +++ b/src/Packer/Models/Providers/McMetaProvider.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Packer.Models.Providers +{ + internal class McMetaProvider : IResourceFileProvider + { + public string Destination => "pack.mcmeta"; + + public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) + => this; + + public Task WriteToArchive(ZipArchive archive) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Packer/Models/Providers/RawFile.cs b/src/Packer/Models/Providers/RawFile.cs index 94efbeb03e41..e43c155e4ce0 100644 --- a/src/Packer/Models/Providers/RawFile.cs +++ b/src/Packer/Models/Providers/RawFile.cs @@ -1,11 +1,7 @@ using Packer.Extensions; using Serilog; -using System; -using System.Collections.Generic; using System.IO; using System.IO.Compression; -using System.Linq; -using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -44,7 +40,10 @@ public RawFile(FileInfo sourceFile, string destination) /// public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) => new RawFile(SourceFile, - Regex.Replace(Destination, searchPattern, replacement)); + Regex.Replace(Destination, + searchPattern, + replacement, + RegexOptions.Singleline)); /// public async Task WriteToArchive(ZipArchive archive) diff --git a/src/Packer/Models/Providers/TermMappingProvider.cs b/src/Packer/Models/Providers/TermMappingProvider.cs new file mode 100644 index 000000000000..52c05a2aff72 --- /dev/null +++ b/src/Packer/Models/Providers/TermMappingProvider.cs @@ -0,0 +1,167 @@ +using Packer.Extensions; +using Serilog; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Text.Encodings.Web; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Text.Json.Nodes; +using System.Linq; + +namespace Packer.Models.Providers +{ + + + + public interface ITermDictionary : IDictionary + { + // TODO:Parse + public string ProvideStringContent(); + public ITermDictionary ReplaceContent(string searchPattern, string replacement); + public static ITermDictionary Create(IDictionary nominalMapping) + => throw new NotImplementedException(); + } + + + public class TermMappingProvider : IResourceFileProvider + { + public ITermDictionary Map { get; } + public string Destination { get; } + + public TermMappingProvider(ITermDictionary map, string destination) + { + Map = map; + Destination = destination; + } + + public IResourceFileProvider ApplyTo(IResourceFileProvider? incoming, bool overrideExisting = false) + { + if (incoming is not TermMappingProvider) + throw new ArgumentException($"Argument not an instance of {typeof(TermMappingProvider)}.", + nameof(incoming)); + var inProvider = incoming as TermMappingProvider; + + if (inProvider is null) throw new ArgumentNullException(nameof(incoming)); + + var (baseMap, inMap) = !overrideExisting + ? (Map, inProvider.Map) + : (inProvider.Map, Map); // 交换顺序 + + foreach (var pair in inMap) + { + baseMap.TryAdd(pair.Key, pair.Value); + } + + return new TermMappingProvider(baseMap, Destination); + } + + public IResourceFileProvider ReplaceContent(string searchPattern, string replacement) + => new TermMappingProvider( + Map.ReplaceContent(searchPattern, replacement), + Destination); + + public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) + => new TermMappingProvider( + Map, + Regex.Replace(Destination, + searchPattern, + replacement, + RegexOptions.Singleline)); + + public async Task WriteToArchive(ZipArchive archive) + { + var destination = Destination.NormalizePath(); + Log.Information("正在添加 {0}", destination); + + archive.ValidateEntryDistinctness(destination); + + using var writer = new StreamWriter( + archive.CreateEntry(destination) + .Open(), + Encoding.UTF8); + await writer.WriteAsync(Map.ProvideStringContent()); + } + } + + + + + internal class LangDictionaryWrapper : Dictionary, ITermDictionary + { + public LangDictionaryWrapper(IDictionary dictionary) : base(dictionary) { } + + public string ProvideStringContent() + { + var builder = new StringBuilder(); + foreach (var (key, value) in this) + { + builder.AppendJoin('=', key, value); + builder.Append(Environment.NewLine); + } + return builder.ToString(); + } + + public ITermDictionary ReplaceContent(string searchPattern, string replacement) + { + var result = new Dictionary(); + foreach (var (key, value) in this) + { + var replaced = Regex.Replace(value, + searchPattern, + replacement, + RegexOptions.Singleline); + result.Add(key, replaced); + } + return new LangDictionaryWrapper(result); + } + + public static ITermDictionary Create(IDictionary nominalMapping) + => new LangDictionaryWrapper(nominalMapping); + } + + internal class JsonDictionaryWrapper : Dictionary, ITermDictionary + { + public JsonDictionaryWrapper(IDictionary dictionary) : base(dictionary) { } + + public string ProvideStringContent() + => JsonSerializer.Serialize(this, new JsonSerializerOptions() + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }); + + public ITermDictionary ReplaceContent(string searchPattern, string replacement) + { + var result = new Dictionary(); + foreach(var (key, value) in this) + { + if (value.GetType() == typeof(JsonValue) + && value.AsValue().TryGetValue(out var stringValue)) + { + var replaced = Regex.Replace(stringValue, + searchPattern, + replacement, + RegexOptions.Singleline); + result.Add(key, JsonValue.Create(replaced)!); // 我猜不会null罢 + continue; + } + result.Add(key, value); + } + return new JsonDictionaryWrapper(result); + } + + public static ITermDictionary Create(IDictionary nominalMapping) + { + var query = from pair in nominalMapping + let key = pair.Key + let value = pair.Value + let node = JsonValue.Create(value)! + select (key, node); + var transformed = query.ToDictionary(_ => _.key, _ => _.node as JsonNode); + return new JsonDictionaryWrapper(transformed); + } + } +} diff --git a/src/Packer/Models/Providers/TextFile.cs b/src/Packer/Models/Providers/TextFile.cs index 18072b4c9670..2e9d1420a0b9 100644 --- a/src/Packer/Models/Providers/TextFile.cs +++ b/src/Packer/Models/Providers/TextFile.cs @@ -28,13 +28,14 @@ public class TextFile : IResourceFileProvider /// /// 从给定的构造提供器。 /// - /// 读取源 + /// 读取源 /// 目标地址 - public TextFile(Stream stream, string destination) + public static TextFile Create(FileInfo file, string destination) { - Destination = destination; + using var stream = file.OpenRead(); using var reader = new StreamReader(stream, Encoding.UTF8); - Content = reader.ReadToEnd(); + var content = reader.ReadToEnd(); + return new TextFile(content, destination); } /// @@ -52,14 +53,16 @@ public TextFile(string content, string destination) public IResourceFileProvider ReplaceContent(string searchPattern, string replacement) => new TextFile(Regex.Replace(Content, searchPattern, - replacement), + replacement, + RegexOptions.Singleline), Content); /// public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) => new TextFile(Content, Regex.Replace(Destination, searchPattern, - replacement)); + replacement, + RegexOptions.Singleline)); /// public async Task WriteToArchive(ZipArchive archive) { diff --git a/src/Packer/Models/TranslatedFile.cs b/src/Packer/Models/TranslatedFile.cs index 2c3afc390a33..39cbbb7d7b4b 100644 --- a/src/Packer/Models/TranslatedFile.cs +++ b/src/Packer/Models/TranslatedFile.cs @@ -1,229 +1,229 @@ -using DiffMatchPatch; -using Packer.Extensions; -using Serilog; -using System; -using System.Collections.Generic; -using System.IO; - -namespace Packer.Models -{ - /// - /// 标志文件类型的枚举。目前而言有[是否按.json]和[是否按\lang\]两类 - /// - [Flags] - public enum FileCategory - { - /// - /// 仅用于初始化为默认态 - /// - None = 0, - /// - /// 类 .json,标识需要转义与 json 式序列化 - /// - JsonAlike = 1, - /// - /// 类 .lang,标识无需转义与 lang 式序列化 - /// - LangAlike = 2, - /// - /// 位于 /lang/ 中的文件,进行合并等 - /// - LanguageFile = 4, - /// - /// 位于其余位置的文件,不进行合并 - /// - OtherFiles = 8, - /// - /// */lang/*.json - /// - JsonTranslationFormat = JsonAlike | LanguageFile, - /// - /// */lang/*.lang - /// - LangTranslationFormat = LangAlike | LanguageFile, - /// - /// */[not-lang]/*.json - /// - JsonOthers = JsonAlike | OtherFiles, - /// - /// */[not-lang]/*.lang - /// - LangOthers = LangAlike | OtherFiles - } - - /// - /// 语言文本的抽象。这是基本类
- /// 基本上是immutable的 - ///
- public class TranslatedFile - { - /// - /// asset-domain下的位置 - /// - public string RelativePath { get; init; } - - /// - /// 该文件的文本,用字符串表示

- /// 因此,不能存储非文本文件! - ///
- public string StringifiedContent { get; } - - /// - /// 文件类型 - /// - public FileCategory Category { get; } - - /// - /// 从文件流构造内容 - /// - public TranslatedFile(Stream stream, FileCategory category, Config config) - { // 注:文件流在此处被关闭 - using var reader = new StreamReader(stream); - StringifiedContent = reader.ReadToEnd().Preprocess(category, config); - this.Category = category; - } - - /// - /// 从文本构造内容 - /// - public TranslatedFile(FileCategory category, string content) - { - this.Category = category; - StringifiedContent = content; - } - - /// - /// 伪合并文件 - /// - virtual public TranslatedFile Combine(TranslatedFile file) - { - Log.Information("文件不支持合并。取消合并"); - return this; - } - - /// - /// 伪适配文件 - /// - virtual public TranslatedFile Port(TranslatedFile file) - { - Log.Information("文件不支持适配。直接覆盖"); - return file; - } - - /// - /// 对该文件的内容进行Google Diff-Match-Patch算法 - /// - public TranslatedFile ApplyPatch(string patch) - { - // 对应的Patch可以自行生成,或者也可以做一个小工具,虽然不在这里 - // 应用Patch时,需要先根据Patch文本生成Patch列表,再应用Patch - // - // patch_apply 返回object[] [0]=string [1]=bool[] - var dmp = new diff_match_patch(); - var patchList = dmp.patch_fromText(patch); - return new TranslatedFile(Category, - (string)dmp.patch_apply(patchList, StringifiedContent)[0]); - } - } - - /// - /// 可以按照/lang/文件夹下解析的文件。这是衍生类
- /// 基本上是immutable的 - ///
- public class LangFile : TranslatedFile - { - private bool deserialized = false; // 非必要不解析,免得残废的lang解析炸掉 - private Dictionary _deserializedContent; - - /// - /// 按照基础语言文件的格式解析而成的词条列表。
- /// 在访问时才会解析。 - ///
- public Dictionary DeserializedContent - { - get - { - if (!deserialized) - { - deserialized = true; - _deserializedContent = StringifiedContent.DeserializeAsset(Category); - } - return _deserializedContent; - } - } - - /// - /// 从文件流构造内容 - /// - public LangFile(Stream stream, FileCategory category, Config config) - : base(stream, category, config) - { - _deserializedContent = null; - } - /// - /// 从映射表构造内容 - /// - public LangFile(FileCategory category, Dictionary content) - : base(category, content.SerializeAsset(category)) - { - _deserializedContent = content; - deserialized = true; - } - /// - /// 真合并文件 - /// - public override LangFile Combine(TranslatedFile file) - { - Log.Information("合并文件:{0}", this.RelativePath); - - var castedFile = (LangFile)file; - if (castedFile is null) - { - Log.Information("检测到不支持合并的文件。取消合并"); - return this; - } - - var resultMap = new Dictionary(DeserializedContent); - foreach (var pair in castedFile.DeserializedContent) - { - if (!resultMap.TryAdd(pair.Key, pair.Value)) - { - Log.Warning("检测到相同 key 的条目:{0} -> {1} | {2},选取 {1}", - pair.Key, resultMap[pair.Key], pair.Value); - } - } - - return new LangFile(this.Category, resultMap) - { - RelativePath = this.RelativePath - }; - } - - /// - /// 真适配文件 - /// - public override TranslatedFile Port(TranslatedFile file) - { - var castedFile = (LangFile)file; - if (castedFile is null) - { - Log.Information("检测到不支持合并的文件。取消合并"); - return file; - } - - var resultMap = DeserializedContent; - foreach(var key in resultMap.Keys) - { - if(castedFile.DeserializedContent.TryGetValue(key, out var value)) - { - Log.Information("正在替换适配项:<{0}> {1} => {2}", key, resultMap[key], value); - resultMap[key] = value; - } - } - return new LangFile(this.Category, resultMap) - { - RelativePath = this.RelativePath - }; - } - } -} +//using DiffMatchPatch; +//using Packer.Extensions; +//using Serilog; +//using System; +//using System.Collections.Generic; +//using System.IO; + +//namespace Packer.Models +//{ +// /// +// /// 标志文件类型的枚举。目前而言有[是否按.json]和[是否按\lang\]两类 +// /// +// [Flags] +// public enum FileCategory +// { +// /// +// /// 仅用于初始化为默认态 +// /// +// None = 0, +// /// +// /// 类 .json,标识需要转义与 json 式序列化 +// /// +// JsonAlike = 1, +// /// +// /// 类 .lang,标识无需转义与 lang 式序列化 +// /// +// LangAlike = 2, +// /// +// /// 位于 /lang/ 中的文件,进行合并等 +// /// +// LanguageFile = 4, +// /// +// /// 位于其余位置的文件,不进行合并 +// /// +// OtherFiles = 8, +// /// +// /// */lang/*.json +// /// +// JsonTranslationFormat = JsonAlike | LanguageFile, +// /// +// /// */lang/*.lang +// /// +// LangTranslationFormat = LangAlike | LanguageFile, +// /// +// /// */[not-lang]/*.json +// /// +// JsonOthers = JsonAlike | OtherFiles, +// /// +// /// */[not-lang]/*.lang +// /// +// LangOthers = LangAlike | OtherFiles +// } + +// /// +// /// 语言文本的抽象。这是基本类
+// /// 基本上是immutable的 +// ///
+// public class TranslatedFile +// { +// /// +// /// asset-domain下的位置 +// /// +// public string RelativePath { get; init; } + +// /// +// /// 该文件的文本,用字符串表示

+// /// 因此,不能存储非文本文件! +// ///
+// public string StringifiedContent { get; } + +// /// +// /// 文件类型 +// /// +// public FileCategory Category { get; } + +// /// +// /// 从文件流构造内容 +// /// +// public TranslatedFile(Stream stream, FileCategory category, Config config) +// { // 注:文件流在此处被关闭 +// using var reader = new StreamReader(stream); +// StringifiedContent = reader.ReadToEnd().Preprocess(category, config); +// this.Category = category; +// } + +// /// +// /// 从文本构造内容 +// /// +// public TranslatedFile(FileCategory category, string content) +// { +// this.Category = category; +// StringifiedContent = content; +// } + +// /// +// /// 伪合并文件 +// /// +// virtual public TranslatedFile Combine(TranslatedFile file) +// { +// Log.Information("文件不支持合并。取消合并"); +// return this; +// } + +// /// +// /// 伪适配文件 +// /// +// virtual public TranslatedFile Port(TranslatedFile file) +// { +// Log.Information("文件不支持适配。直接覆盖"); +// return file; +// } + +// /// +// /// 对该文件的内容进行Google Diff-Match-Patch算法 +// /// +// public TranslatedFile ApplyPatch(string patch) +// { +// // 对应的Patch可以自行生成,或者也可以做一个小工具,虽然不在这里 +// // 应用Patch时,需要先根据Patch文本生成Patch列表,再应用Patch +// // +// // patch_apply 返回object[] [0]=string [1]=bool[] +// var dmp = new diff_match_patch(); +// var patchList = dmp.patch_fromText(patch); +// return new TranslatedFile(Category, +// (string)dmp.patch_apply(patchList, StringifiedContent)[0]); +// } +// } + +// /// +// /// 可以按照/lang/文件夹下解析的文件。这是衍生类
+// /// 基本上是immutable的 +// ///
+// public class LangFile : TranslatedFile +// { +// private bool deserialized = false; // 非必要不解析,免得残废的lang解析炸掉 +// private Dictionary _deserializedContent; + +// /// +// /// 按照基础语言文件的格式解析而成的词条列表。
+// /// 在访问时才会解析。 +// ///
+// public Dictionary DeserializedContent +// { +// get +// { +// if (!deserialized) +// { +// deserialized = true; +// _deserializedContent = StringifiedContent.DeserializeAsset(Category); +// } +// return _deserializedContent; +// } +// } + +// /// +// /// 从文件流构造内容 +// /// +// public LangFile(Stream stream, FileCategory category, Config config) +// : base(stream, category, config) +// { +// _deserializedContent = null; +// } +// /// +// /// 从映射表构造内容 +// /// +// public LangFile(FileCategory category, Dictionary content) +// : base(category, content.SerializeAsset(category)) +// { +// _deserializedContent = content; +// deserialized = true; +// } +// /// +// /// 真合并文件 +// /// +// public override LangFile Combine(TranslatedFile file) +// { +// Log.Information("合并文件:{0}", this.RelativePath); + +// var castedFile = (LangFile)file; +// if (castedFile is null) +// { +// Log.Information("检测到不支持合并的文件。取消合并"); +// return this; +// } + +// var resultMap = new Dictionary(DeserializedContent); +// foreach (var pair in castedFile.DeserializedContent) +// { +// if (!resultMap.TryAdd(pair.Key, pair.Value)) +// { +// Log.Warning("检测到相同 key 的条目:{0} -> {1} | {2},选取 {1}", +// pair.Key, resultMap[pair.Key], pair.Value); +// } +// } + +// return new LangFile(this.Category, resultMap) +// { +// RelativePath = this.RelativePath +// }; +// } + +// /// +// /// 真适配文件 +// /// +// public override TranslatedFile Port(TranslatedFile file) +// { +// var castedFile = (LangFile)file; +// if (castedFile is null) +// { +// Log.Information("检测到不支持合并的文件。取消合并"); +// return file; +// } + +// var resultMap = DeserializedContent; +// foreach(var key in resultMap.Keys) +// { +// if(castedFile.DeserializedContent.TryGetValue(key, out var value)) +// { +// Log.Information("正在替换适配项:<{0}> {1} => {2}", key, resultMap[key], value); +// resultMap[key] = value; +// } +// } +// return new LangFile(this.Category, resultMap) +// { +// RelativePath = this.RelativePath +// }; +// } +// } +//} diff --git a/src/Packer/Program.cs b/src/Packer/Program.cs index aa1b8ebf718d..1714ed7b0ec6 100644 --- a/src/Packer/Program.cs +++ b/src/Packer/Program.cs @@ -30,38 +30,32 @@ public static async Task Main(string version, string[]? targets) Log.Information("开始对版本 {0} 的打包", config.Version); - var rawQuery = Lib.RetrieveContent(config, targetModIdentifiers); var query = // 这就是查询表达式吗( from modDirectory in new DirectoryInfo($"./projects/{config.Version}/assets") .EnumerateDirectories() let modIdentifier = modDirectory.Name - // 模组筛选,按模组标识符 - where targetModIdentifiers is null // 未提供列表,全部打包 - || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 - where !config.ModBlackList.Contains(modIdentifier) // 没有被明确排除 + where targetModIdentifiers is null // 未提供列表,全部打包 + || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 + where !config.ModBlackList.Contains(modIdentifier) // 没有被明确排除 from namespaceDirectory in modDirectory.EnumerateDirectories() let namespaceName = namespaceDirectory.Name - where !config.DomainBlackList.Contains(modIdentifier) // 没有被明确排除 - // 检查命名空间格式,拒绝错误格式 - // 但是写成表达式以后,没法现场丢异常了... - where !Regex.IsMatch(namespaceName, - @"^[a-z0-9_\-.]+$", - RegexOptions.Singleline) + where !config.DomainBlackList.Contains(namespaceName) // 没有被明确排除 + where namespaceName.ValidateNamespace() // 不是非法名称 from provider in namespaceDirectory.EnumerateProviders(config) - group provider by namespaceName into namespaceGroup// 合并文件;我猜没写错 - select namespaceGroup - .Aggregate(seed: null as IResourceFileProvider, // 好家伙 类型推断系统推断不出TAggregate - (accumlate, next) // 为什么这个参数叫func不叫accumlator或者aggregator... - => next.Append(accumlate, overrideExisting: false)) into provider - // 替换内容中的特殊字符 - select config.CharatcerReplacement + group provider by provider.Destination into destinationGroup + select destinationGroup + .Aggregate(seed: null as IResourceFileProvider, // 合并文件 + (accumlate, next) + => next.ApplyTo( + accumlate, + overrideExisting: false)) into provider + select config.CharatcerReplacement // 内容的字符替换 .Aggregate(seed: provider, (accumlate, replacement) => accumlate.ReplaceContent( replacement.Key, replacement.Value)) into provider - // 替换目标路径中的对象 - select config.DestinationReplacement + select config.DestinationReplacement // 全局路径替换:预留 .Aggregate(seed: provider, (accumlate, replacement) => accumlate.ReplaceContent( @@ -73,6 +67,7 @@ select config.DestinationReplacement string packName = $"./Minecraft-Mod-Language-Package-{config.Version}.zip"; await using var stream = File.Create(packName); + using (var archive = new ZipArchive(stream, ZipArchiveMode.Update, leaveOpen: true)) { archive.Initialize(config); @@ -83,6 +78,7 @@ select config.DestinationReplacement config.Version, query.Count()); var md5 = stream.ComputeMD5(); + Log.Information("打包文件的 MD5 值:{0}", md5); File.WriteAllText($"./{config.Version}.md5", md5); } diff --git a/src/Packer/Utils.cs b/src/Packer/Utils.cs index 0fb99b660bc0..d084c37b630e 100644 --- a/src/Packer/Utils.cs +++ b/src/Packer/Utils.cs @@ -14,6 +14,10 @@ namespace Packer { static class Utils { + + + + public static async Task RetrieveConfig(string configTemplate, string version) { Log.Information("正在获取配置。目标版本:{0}", version); @@ -26,75 +30,80 @@ public static async Task RetrieveConfig(string configTemplate, string ve return JsonSerializer.Deserialize(reader); } - public static PackerStrategy RetrieveStrategy(FileInfo? file) + public static List RetrieveStrategy(FileInfo? file) { if (file is null) { - return new PackerStrategy { Type = PackerStrategyType.NoAction }; + return new List + { + new PackerStrategy { Type = PackerStrategyType.NoAction } + }; } else { - var result = JsonSerializer.Deserialize( + var result = JsonSerializer.Deserialize>( file.OpenText().ReadToEnd(), new JsonSerializerOptions { - Converters = { new JsonStringEnumConverter() } + Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } }); + if (result is null) + throw new InvalidDataException($"The policy file {file.FullName} cannot have null values."); + return result; } } - /// - /// 将两个带有TranslatedFile的列表合并,对冲突项按照target优先进行合并。 - /// - /// 合并对象,优先选择 - /// 合并对象,非优先 - /// - public static IEnumerable MergeFiles(IEnumerable baseFile, IEnumerable incoming) - { - var mapping = new Dictionary(); // asset-domain下的目标位置 -> 文件 - if (!baseFile.Any()) return incoming; - if (!incoming.Any()) return baseFile; - foreach (var file in baseFile) - { - mapping.Add(file.RelativePath, file); - } - foreach (var file in incoming) - { - if (!mapping.TryAdd(file.RelativePath, file)) - { - mapping.Remove(file.RelativePath, out var existing); - mapping.Add(existing.RelativePath, existing.Combine(file)); - } - } - return mapping.Values; - } + ///// + ///// 将两个带有TranslatedFile的列表合并,对冲突项按照target优先进行合并。 + ///// + ///// 合并对象,优先选择 + ///// 合并对象,非优先 + ///// + //public static IEnumerable MergeFiles(IEnumerable baseFile, IEnumerable incoming) + //{ + // var mapping = new Dictionary(); // asset-domain下的目标位置 -> 文件 + // if (!baseFile.Any()) return incoming; + // if (!incoming.Any()) return baseFile; + // foreach (var file in baseFile) + // { + // mapping.Add(file.RelativePath, file); + // } + // foreach (var file in incoming) + // { + // if (!mapping.TryAdd(file.RelativePath, file)) + // { + // mapping.Remove(file.RelativePath, out var existing); + // mapping.Add(existing.RelativePath, existing.Combine(file)); + // } + // } + // return mapping.Values; + //} - /// - /// 基于原位置的文件key,用incoming的词条进行替换。未被替换的保持原文。 - /// - /// 原位置的基准文件 - /// 更新文件 - /// - public static IEnumerable PortFiles(IEnumerable baseFile, IEnumerable incoming) - { - var mapping = new Dictionary(); // asset-domain下的目标位置 -> 文件 - if (!incoming.Any()) return baseFile; - foreach (var file in baseFile) - { - mapping.Add(file.RelativePath, file); - } - foreach (var file in incoming) - { - if (!mapping.TryAdd(file.RelativePath, file)) - { - mapping.Remove(file.RelativePath, out var existing); - mapping.Add(existing.RelativePath, existing.Port(file)); - } - } - return mapping.Values; - } + ///// + ///// 基于原位置的文件key,用incoming的词条进行替换。未被替换的保持原文。 + ///// + ///// 原位置的基准文件 + ///// 更新文件 + ///// + //public static IEnumerable PortFiles(IEnumerable baseFile, IEnumerable incoming) + //{ + // var mapping = new Dictionary(); // asset-domain下的目标位置 -> 文件 + // if (!incoming.Any()) return baseFile; + // foreach (var file in baseFile) + // { + // mapping.Add(file.RelativePath, file); + // } + // foreach (var file in incoming) + // { + // if (!mapping.TryAdd(file.RelativePath, file)) + // { + // mapping.Remove(file.RelativePath, out var existing); + // mapping.Add(existing.RelativePath, existing.Port(file)); + // } + // } + // return mapping.Values; + //} - // 下面的这些...其实都不是我写的... public static string AppendTimestamp(string path) { From 15baeaead53478c523e5896f5cac8c0f605ca2d5 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Sat, 30 Sep 2023 18:47:05 +0800 Subject: [PATCH 21/25] Finalize Packer code (ish) --- src/Packer/Extensions/ArchiveExtension.cs | 42 +-- src/Packer/Extensions/ContentExtension.cs | 108 +++--- src/Packer/Extensions/DirectoryExtension.cs | 322 +++++------------- src/Packer/Extensions/SerializingExtension.cs | 105 ------ src/Packer/Lib.cs | 49 --- src/Packer/Models/Config.cs | 101 ++++-- src/Packer/Models/IResourceFileProvider.cs | 5 +- src/Packer/Models/McMeta.cs | 28 -- src/Packer/Models/Mod.cs | 48 --- src/Packer/Models/PackerPolicy.cs | 43 +++ src/Packer/Models/PackerStrategy.cs | 63 ---- .../Models/Providers/CompositionHelper.cs | 98 ++++++ .../Models/Providers/CompositionProvider.cs | 34 -- src/Packer/Models/Providers/LanguageFile.cs | 92 ----- src/Packer/Models/Providers/McMetaProvider.cs | 52 ++- src/Packer/Models/Providers/RawFile.cs | 6 +- .../Models/Providers/TermMappingProvider.cs | 262 ++++++++++---- src/Packer/Models/Providers/TextFile.cs | 21 +- src/Packer/Models/TranslatedFile.cs | 229 ------------- src/Packer/Program.cs | 60 ++-- src/Packer/Utils.cs | 135 +++----- 21 files changed, 680 insertions(+), 1223 deletions(-) delete mode 100644 src/Packer/Extensions/SerializingExtension.cs delete mode 100644 src/Packer/Lib.cs delete mode 100644 src/Packer/Models/McMeta.cs delete mode 100644 src/Packer/Models/Mod.cs create mode 100644 src/Packer/Models/PackerPolicy.cs delete mode 100644 src/Packer/Models/PackerStrategy.cs create mode 100644 src/Packer/Models/Providers/CompositionHelper.cs delete mode 100644 src/Packer/Models/Providers/CompositionProvider.cs delete mode 100644 src/Packer/Models/Providers/LanguageFile.cs delete mode 100644 src/Packer/Models/TranslatedFile.cs diff --git a/src/Packer/Extensions/ArchiveExtension.cs b/src/Packer/Extensions/ArchiveExtension.cs index 706904210584..62121c98727b 100644 --- a/src/Packer/Extensions/ArchiveExtension.cs +++ b/src/Packer/Extensions/ArchiveExtension.cs @@ -1,51 +1,13 @@ -using Packer.Models; -using Serilog; -using System; -using System.Collections.Generic; -using System.IO; +using System; using System.IO.Compression; -using System.Linq; -using System.Threading.Tasks; namespace Packer.Extensions { /// - /// 用于创建压缩包的各种拓展方法 + /// 用于压缩包的拓展方法 /// static public class ArchiveExtension { - /// - /// 初始化压缩包

- /// 包括压缩包的基础文件 - ///
- /// 压缩文件 - /// 所使用的配置 - public static void Initialize(this ZipArchive archive, Config config) - { - Log.Information("开始初始化压缩包"); - string commonPrefix = $"./projects/{config.Version}"; - config.FilesToInitialize.ForEach(path => - { - var destination = path.StripModName() // 除掉一层文件夹(在 assets/ 里的各种 fix) - .NormalizePath(); - Log.Information("初始化压缩包:添加 {0}", destination); - - // pack.mcmeta 特殊处理:添加时间戳 - if(destination == "pack.mcmeta") - { - using var writer = new StreamWriter( - archive.CreateEntry(destination) - .Open()); - - writer.Write(Utils.AppendTimestamp($"{commonPrefix}/{path}")); - return; - } - - archive.CreateEntryFromFile($"{commonPrefix}/{path}", destination); - }); - - Log.Information("初始化完成"); - } /// /// 校验将要传入压缩包的的文件是否存在重名
///
diff --git a/src/Packer/Extensions/ContentExtension.cs b/src/Packer/Extensions/ContentExtension.cs index fa41c4d34dce..bac9be751178 100644 --- a/src/Packer/Extensions/ContentExtension.cs +++ b/src/Packer/Extensions/ContentExtension.cs @@ -1,11 +1,8 @@ -using Packer.Models; -using Serilog; -using System; +using System; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text.RegularExpressions; -using System.Text.Encodings.Web; namespace Packer.Extensions { @@ -14,9 +11,27 @@ namespace Packer.Extensions ///
public static partial class ContentExtension { + /// + /// 将文件的目标路径正规化,以免各种加载出错 + /// + /// 目标路径 + /// 正规化后的文件路径 + public static string NormalizePath(this string path) + => path.Replace('\\', '/'); // 修正正反斜杠导致的压缩文件读取问题 + + [GeneratedRegex(@"^[a-z0-9_.-]+$", RegexOptions.Singleline)] - private static partial Regex ValidNamespaceRegex(); + internal static partial Regex ValidNamespaceRegex(); + /// + /// 检查命名空间名称是否合法 + /// + /// + /// 合法的命名空间名称只包括小写字母、数字、_、.、- + /// + /// 待校验的命名空间名称 + /// 若合法,返回 + /// 校验的命名空间不合法 public static bool ValidateNamespace(this string namespaceName) { // 强行丢异常...行吧 @@ -26,83 +41,50 @@ public static bool ValidateNamespace(this string namespaceName) } - /// - /// 将文件的目标路径正规化,以免各种加载出错 + /// 判断domain是否强制包含 /// - /// 目标路径 - /// - public static string NormalizePath(this string path) - => path.Replace('\\', '/') // 修正正反斜杠导致的压缩文件读取问题 - ; + /// 文件所在的位置 + /// 所使用的配置 + public static bool IsDomainForceIncluded(this string location, Config config) + => config.Floating.InclusionDomains.Any(_ => location.StartsWith(_ + '/')); /// - /// 移除模组名一级,在基础文件处理处用到 + /// 判断domain是否强制排除 /// - /// 目标文件在库中assets\1\2\...>式位置 - /// - public static string StripModName(this string path) - { - var _ = path.Split('/').ToList(); - - if (_.Count >= 2) _.RemoveAt(1); // 认为模组名在第一处 / 的后面 - return Path.Join(_.ToArray()); - } - - ///// - ///// 文本预处理

- ///// 目前仅有特殊符号更换,但还是预留了空间 - /////
- ///// 待处理的文本 - ///// 文本种类,用于判断是否转义 - ///// 所使用的配置 - ///// - //public static string Preprocess(this string content, FileCategory category, Config config) - //{ - // // 特殊符号替换 - // foreach (var mapping in config.CharatcerReplacement) - // { - // var escaped = JavaScriptEncoder.Default.Encode(mapping.Value); - // if (content.Contains(mapping.Key)) - // { - // Log.Information("正在进行特殊符号替换:{0} -> {1}", mapping.Key, escaped); - // } - - // if ((category & FileCategory.JsonAlike) == FileCategory.JsonAlike) - // { // 替换为 unicode 转义码 - // content = content.Replace(mapping.Key, escaped); - // } - // else - // { // 替换为 unicode 字符 - // content = content.Replace(mapping.Key, mapping.Value); - // } + /// 文件所在的位置 + /// 所使用的配置 + public static bool IsDomainForceExcluded(this string location, Config config) + => config.Floating.ExclusionDomains.Any(_ => location.StartsWith(_ + '/')); - // } - // return content; - //} + /// + /// 判断文件是否属于目标语言 + /// + /// 文件所在的位置 + /// 所使用的配置 + public static bool IsInTargetLanguage(this string location, Config config) + => config.Base.TargetLanguages.Any(_ => location.Contains(_, StringComparison.OrdinalIgnoreCase)); /// - /// 判断文件是否需要跳过预处理

- /// 一般而言,图片类文件需要跳过;这一点可以在config\packer.json里控制 + /// 判断文件路径是否强制排除 ///
/// 文件所在的位置 /// 所使用的配置 - /// - public static bool IsForceIncluded(this string location, Config config) - => config.ForceInclusionDomain.Any(_ => location.StartsWith(_ + '/')); + public static bool IsPathForceExcluded(this string location, Config config) + => config.Floating.ExclusionPaths.Contains(location); /// - /// 判断文件是否属于应跳过的语言 + /// 判断文件路径是否强制包含 /// /// 文件所在的位置 /// 所使用的配置 - /// - public static bool IsInTargetLanguage(this string location, Config config) - => config.TargetLanguages.Any(_ => location.Contains(_, StringComparison.OrdinalIgnoreCase)); + public static bool IsPathForceIncluded(this string location, Config config) + => config.Floating.InclusionPaths.Contains(location); + // 临时方法 /// - /// 计算给定流中全体内容的MD5值。 + /// 计算给定流中全体内容的MD5值 /// /// 被计算的流 /// diff --git a/src/Packer/Extensions/DirectoryExtension.cs b/src/Packer/Extensions/DirectoryExtension.cs index b506663c0dc5..0eb484ba9ff0 100644 --- a/src/Packer/Extensions/DirectoryExtension.cs +++ b/src/Packer/Extensions/DirectoryExtension.cs @@ -1,12 +1,10 @@ using Packer.Models; using Packer.Models.Providers; -using Serilog; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; -using System.Text.RegularExpressions; namespace Packer.Extensions { @@ -19,10 +17,6 @@ namespace Packer.Extensions ///
public static partial class DirectoryExtension { - [GeneratedRegex(@"^assets/[a-z0-9_.-]+/lang/[a-zA-Z0-9_-]+\.(?:json|lang)$", RegexOptions.Singleline)] - private static partial Regex LanguageFileRegex(); - - /// /// 加载策略所使用的标准方法代理 /// @@ -33,121 +27,76 @@ public static partial class DirectoryExtension public delegate EvaluatorReturnType ProviderEvaluator(DirectoryInfo namespaceDirectory, Config config, - Dictionary parameters); + ParameterType? parameters); - public static Dictionary functionTable = new() + /// + /// 从到加载方法的查询表 + /// + internal static Dictionary functionTable = new() { - { PackerStrategyType.NoAction, FromCurrentDirectory }, - { PackerStrategyType.CloneMissing, FromSpecifiedDirectory } // , - // ... + { PackerPolicyType.Direct, FromCurrentDirectory }, // 现场生成 + { PackerPolicyType.Indirect, FromSpecifiedDirectory }, // 给定目录 + { PackerPolicyType.Composition, FromComposition } // 组合生成 }; + /// + /// 从给定的命名空间,基于当地的packer-policy.json + /// 与packer-config-fixup.json,遍历 + /// + /// 命名空间所在目录 + /// 所使用的全局配置 + /// public static IEnumerable EnumerateProviders (this DirectoryInfo namespaceDirectory, Config config) => from enumeratedPair in namespaceDirectory.EnumerateRawProviders(config) - group enumeratedPair by enumeratedPair.provider.Destination into providerGroup - select providerGroup.Aggregate( - seed: null as IResourceFileProvider, - (accumlate, next) - => next.provider.ApplyTo(accumlate, next.overrides)) /* into provider - select provider.ReplaceDestination(@"(?<=^assets/)[^/]*(?=/)", - namespaceDirectory.Name) */ ;// WARNING:路径替换要做到具体方法里面! - - static EvaluatorReturnType EnumerateRawProviders(this DirectoryInfo namespaceDirectory, Config config) - { - var policyFile = namespaceDirectory.GetFiles("packer-policy.json").FirstOrDefault(); - var policyList = Utils.RetrieveStrategy(policyFile); - - return from policy in policyList - from enumeratedPair in functionTable[policy.Type](namespaceDirectory, config, policy.Parameters) - select enumeratedPair; - } - - ///// - ///// 从[namespace]生成所需的Asset对象,采用本目录下放置的配置文件 - ///// - ///// 目标路径 - ///// 采用的配置 - ///// 未经处理的文件 - ///// - //public static IEnumerable AggregateAssetFiles(this DirectoryInfo assetPath, - // Config config, - // ref Dictionary bypassed) - //{ - // // 读取局域配置文件;若为空,配置为“无操作”(直接处理文件) - // var policy = Utils.RetrieveStrategy(assetPath.GetFiles("packer-policy.json").FirstOrDefault()); - - // if (policy.Type != PackerStrategyType.NoAction) - // Log.Information("对asset-domain {2} 采用非标准检索策略:{0} w/ {1}", - // policy.Type, - // policy.Parameters, - // assetPath.Name); - - // // Delegate是个好东西 要不然这参数不知道要多长 - // // 不过,什么时候能支持集合字面量......这样子就甚至不用写类型了 - // // 目前支持的打包策略 - // Dictionary functionTable = new() - // { - // { PackerStrategyType.NoAction, FromImmediateDirectory }, - // { PackerStrategyType.PlainClone, FromIndirectDirectory }, - // { PackerStrategyType.CloneMissing, FromMixedDirectory }, - // { PackerStrategyType.BackPort, FromBackPort }, - // { PackerStrategyType.Patch, FromPatches } - // }; - // return functionTable[policy.Type](assetPath, config, ref bypassed, policy.Parameters); - //} + group enumeratedPair by enumeratedPair.provider.Destination into providerGroup + select providerGroup.Aggregate( + seed: null as IResourceFileProvider, + (accumulate, next) + => next.provider.ApplyTo(accumulate, next.overrides)); + /// + /// 遍历未经合并的文件,用于递归调用 + /// + internal static EvaluatorReturnType EnumerateRawProviders(this DirectoryInfo namespaceDirectory, Config config) + => from policy in Utils.RetrieveStrategy(namespaceDirectory) + from enumeratedPair in functionTable[policy.Type].Invoke( + namespaceDirectory, config, policy.Parameters) + select enumeratedPair; - static IResourceFileProvider CreateProviderFromFile(FileInfo file, string destination, Config config) + internal static EvaluatorReturnType FromCurrentDirectory(DirectoryInfo namespaceDirectory, + Config config, + ParameterType? parameters) { - var extension = file.Extension; - if (file.Directory!.Name == "lang") - { - switch (extension) - { - case ".json": return JsonLanguageFile.Create(file, destination); - case ".lang": return LangLanguageFile.Create(file, destination); - }; - } - return extension switch - { - // 已知的文本文件类型 - ".txt" or ".json" or ".md" => TextFile.Create(file, destination), - _ => new RawFile(file, destination) - }; + var floatingConfig = Utils.RetrieveLocalConfig(namespaceDirectory); + var localConfig = config.Modify(floatingConfig); + + return from candidate in namespaceDirectory.EnumerateFiles("*", SearchOption.AllDirectories) + let relativePath = Path.GetRelativePath(namespaceDirectory.FullName, + candidate.FullName) + .NormalizePath() + let destination = Path.Combine(namespaceDirectory.Name, + relativePath) + .NormalizePath() + let domain = relativePath.Split('/')[0] + where !relativePath.IsPathForceExcluded(localConfig) // [1] 排除路径 -- packer-policy等 + where (relativePath.IsPathForceIncluded(localConfig) // [2] 包含路径 [单列] + || relativePath.IsDomainForceIncluded(localConfig) // [3] 包含domain -- font/ textures/ + || (destination.IsInTargetLanguage(localConfig) // [4] 语言标记 -- 含zh_cn的 + && relativePath.IsDomainForceExcluded(localConfig))) // [5] 排除domain [暂无] + let provider = CreateProviderFromFile(candidate, destination, localConfig) + select (provider, DoesOverride(parameters)); } - - - - - - static EvaluatorReturnType FromCurrentDirectory(DirectoryInfo namespaceDirectory, - Config config, - ParameterType parameters) - => from candidate in namespaceDirectory.EnumerateFiles("*", SearchOption.AllDirectories) - let relativePath = Path.GetRelativePath(namespaceDirectory.FullName, - candidate.FullName) - .NormalizePath() - let destination = Path.Combine(namespaceDirectory.Name, - relativePath) - .NormalizePath() - let domain = relativePath.Split('/')[0] - where relativePath != "packer-policy.json" // TODO:其他文件 // 策略文件本身不包含 - where destination.IsInTargetLanguage(config) // 含有正确的语言标记 - || relativePath.IsForceIncluded(config) // 强制包含 - let provider = CreateProviderFromFile(candidate, destination, config) - select (provider, DoesOverride(parameters)); - - static EvaluatorReturnType FromSpecifiedDirectory(DirectoryInfo namespaceDirectory, - Config config, - ParameterType parameters) + internal static EvaluatorReturnType FromSpecifiedDirectory(DirectoryInfo namespaceDirectory, + Config config, + ParameterType? parameters) { - var redirect = parameters["source"].GetString(); + var redirect = parameters!["source"].GetString(); var namespaceName = namespaceDirectory.Name; - namespaceName.ValidateNamespace(); var redirectDirectory = new DirectoryInfo(redirect!); + return from candidate in redirectDirectory.EnumerateRawProviders(config) let provider = candidate.provider .ReplaceDestination(@"^(?<=^assets/)[^/]*(?=/)", @@ -155,139 +104,46 @@ static EvaluatorReturnType FromSpecifiedDirectory(DirectoryInfo namespaceDirecto select (provider, DoesOverride(parameters)); } + internal static EvaluatorReturnType FromComposition(DirectoryInfo namespaceDirectory, + Config config, + ParameterType? parameters) + { + var compositionPath = parameters!["source"].GetString(); + var type = parameters["type"].GetString(); + var compositionFile = new FileInfo(compositionPath!); + IResourceFileProvider provider = type switch // 类型推断不出要用接口 + { + "lang" => LangMappingHelper.CreateFromComposition(compositionFile), + "json" => JsonMappingHelper.CreateFromComposition(compositionFile), + _ => throw new InvalidOperationException($"Unexpected Type parameter at {namespaceDirectory.FullName}.") + }; + yield return (provider, DoesOverride(parameters)); + } + internal static IResourceFileProvider CreateProviderFromFile(FileInfo file, string destination, Config config) + { + var extension = file.Extension; + return file.Directory!.Name == "lang" + ? extension switch + { + ".json" => JsonMappingHelper.CreateFromFile(file, destination), + ".lang" => JsonMappingHelper.CreateFromFile(file, destination), + _ => throw new InvalidOperationException($"Invalid Type of Language File at {file.FullName}.") + } + : extension switch + { + // 已知的文本文件类型 + ".txt" or ".json" or ".md" => TextFile.Create(file, destination), + _ => new RawFile(file, destination) + }; + } - static bool DoesOverride(ParameterType parameters) + internal static bool DoesOverride(ParameterType? parameters) { + if (parameters is null) return false; var hasKey = parameters.TryGetValue("overrides", out var element); return hasKey ? element.GetBoolean() : false; } - - - - - - - //static IEnumerable FromMixedDirectory(DirectoryInfo assetDirectory, - // Config config, - // ref Dictionary unprocessed, - // Dictionary parameters) - // => Utils.MergeFiles(FromImmediateDirectory(assetDirectory, config, ref unprocessed, parameters), - // FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters)); - - //static IEnumerable FromBackPort(DirectoryInfo assetDirectory, - // Config config, - // ref Dictionary unprocessed, - // Dictionary parameters) - // => Utils.PortFiles(FromImmediateDirectory(assetDirectory, config, ref unprocessed, parameters), - // FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters)); - - //static IEnumerable FromIndirectDirectory(DirectoryInfo assetDirectory, - // Config config, - // ref Dictionary unprocessed, - // Dictionary parameters) - // => AggregateAssetFiles(new DirectoryInfo(parameters["source"].GetString()), config, ref unprocessed); - - //static IEnumerable FromPatches(DirectoryInfo assetDirectory, - // Config config, - // ref Dictionary unprocessed, - // Dictionary parameters) - //{ - // var reference = FromIndirectDirectory(assetDirectory, config, ref unprocessed, parameters) - // .ToDictionary(_ => _.RelativePath); - // var patchList = JsonSerializer.Deserialize>(parameters["patches"]); - // foreach (var patch in patchList) - // { - // Log.Information("对文件 {0} 应用 {1} 处的 patch。", patch.Key, patch.Value); - // reference.Remove(patch.Key, out var target); - // var patchText = string.Join('\n', File.ReadAllLines(patch.Value)); // 不要问我为什么D-M-P默认换行是LF - // reference.Add(patch.Key, target.ApplyPatch(patchText)); - // } - // return reference.Values; - //} - - //// 目前所有策略的终点方法 - //static IEnumerable FromImmediateDirectory(DirectoryInfo assetDirectory, - // Config config, - // ref Dictionary unprocessed, - // Dictionary parameters) - //{ - // var bypassed = unprocessed; - // var result = assetDirectory.EnumerateFiles("*", SearchOption.AllDirectories) // / 的下级文件 - // .Select(file => - // { // 这里开始真正的检索。被跳过的文本用 null 代替 - // var prefixLength = assetDirectory.FullName.Length; - // var relativePath = file.FullName[(prefixLength + 1)..] - // .Replace('\\', '/'); // 在asset-domain下的位置,规范为用正斜杠分割 - - // // 处理被跳过的文本。处理顺序:policy -> [bypass](font, textures) -> !zh_cn - // // 顺序乱了会导致字体文件被丢弃,因为没有带zh_cn - - // // 跳过检索策略文件 - // if (relativePath == "packer-policy.json") - // { - // return null; - // } - - // // 选出不经过处理路径的文件 - // if (relativePath.IsForceIncluded(config)) - // { - // var target = Path.Combine("assets", - // assetDirectory.Name, - // relativePath); - // Log.Information("跳过了标记为直接加入的命名空间:{0} -> {1}", - // relativePath.Split('/')[0], - // target); - - // if (bypassed.ContainsValue(target)) - // { - // Log.Warning("在未处理文件中检测到重复项。丢弃将要加入的新项"); - // return null; - // } - // bypassed.Add(file.FullName, target); - // return null; - // } - - // // 跳过非中文文件 - // if (!relativePath.IsInTargetLanguage(config)) - // { - // return null; - // } - - // // 跳过非中文文件 - // if (!relativePath.IsInTargetLanguage(config)) - // { - // return null; - // } - - // // 处理正常的语言文件 - // // TODO:Json5支持 - // var parsingCategory = file.Extension switch - // { - // ".json" => FileCategory.JsonAlike, - // _ => FileCategory.LangAlike - // }; - // if (relativePath.StartsWith("lang/")) - // { - // return new LangFile(file.OpenRead(), - // parsingCategory | FileCategory.LanguageFile, - // config) - // { - // RelativePath = relativePath - // }; - // } - // else - // { - // return new TranslatedFile(file.OpenRead(), - // parsingCategory | FileCategory.OtherFiles, - // config) - // { - // RelativePath = relativePath - // }; - // } - // }).Where(_ => _ is not null); // 排除掉跳过的文件 - // return result; - //} } -} +} \ No newline at end of file diff --git a/src/Packer/Extensions/SerializingExtension.cs b/src/Packer/Extensions/SerializingExtension.cs deleted file mode 100644 index 520cb9905de5..000000000000 --- a/src/Packer/Extensions/SerializingExtension.cs +++ /dev/null @@ -1,105 +0,0 @@ -//using Packer.Models; -//using Packer.Models.Providers; -//using Serilog; -//using System; -//using System.Collections.Generic; -//using System.Text; -//using System.Text.Json; - -//namespace Packer.Extensions -//{ -// static class SerializingExtension -// { -// public static string SerializeAsset(this Dictionary assetMap, FileCategory category) -// => category switch -// { -// // Json 文件,直接写出 -// FileCategory.JsonTranslationFormat => JsonSerializer.Serialize(assetMap, -// new JsonSerializerOptions -// { -// WriteIndented = true -// }), -// // Lang文件 -// FileCategory.LangTranslationFormat => SerializeFromLang(assetMap), -// _ => null // 其实不应该执行到这个地方 -// }; - -// static string SerializeFromLang(Dictionary assetMap) -// { -// // lang格式化还好说 -// var sb = new StringBuilder(); -// foreach (var pair in assetMap) -// { -// sb.AppendJoin('=', pair.Key, pair.Value); -// sb.Append(Environment.NewLine); -// } -// return sb.ToString(); -// } - -// public static Dictionary DeserializeAsset(this string content, FileCategory category) -// => category switch -// { -// FileCategory.JsonTranslationFormat -// => JsonSerializer.Deserialize>(content, -// new JsonSerializerOptions -// { -// ReadCommentHandling = JsonCommentHandling.Skip // 打包过程应当兼容注释,但不需要写入注释 -// }), // 直接有的算法 -// FileCategory.LangTranslationFormat => DeserializeFromLang(content), -// _ => null // 其实不应该执行到这个地方 -// }; - -// static Dictionary DeserializeFromLang(string content) -// { -// // 甚至不是自动机...所以不敢多用,否则会炸 - -// // 下面的 Verbose 仅供调试,不会在 log 里出现 -// // .lang的格式真的乱... -// Log.Verbose("开始反序列化 .lang 文件"); -// // #PARSE_ESCAPE就算了吧 -// var result = new Dictionary(); -// var isInComment = false; // 处理多行注释 -// new List(content.Split(Environment.NewLine, -// StringSplitOptions.RemoveEmptyEntries)) -// .ForEach(line => -// { -// var isSingleLineComment = false; -// new List { "//", "#" } -// .ForEach(_ => { isSingleLineComment |= line.StartsWith(_); }); -// if (isSingleLineComment) -// { -// Log.Verbose("跳过了单行注释:{0}", line); -// } -// else if (isInComment) // 多行注释内 -// { -// Log.Verbose("{0}", line); -// if (line.Trim() -// .EndsWith("*/")) -// { -// isInComment = false; // 跳出注释 -// } -// } -// else if (line.StartsWith("/*")) // 开始多行注释 -// { -// Log.Verbose("跳过了多行注释:{0}", line); -// } -// else // 真正的条目 -// { -// Log.Verbose("添加对应映射:{0}", line); -// var spiltPosition = line.IndexOf('='); -// try -// { -// result.Add(line[..spiltPosition], line[(spiltPosition + 1)..]); -// } -// catch (Exception e) -// { -// Log.Warning(e.ToString()); -// } -// } -// } -// ); -// Log.Verbose("反序列化完成"); -// return result; -// } -// } -//} diff --git a/src/Packer/Lib.cs b/src/Packer/Lib.cs deleted file mode 100644 index dae6789d8ffd..000000000000 --- a/src/Packer/Lib.cs +++ /dev/null @@ -1,49 +0,0 @@ -//using Packer.Extensions; -//using Packer.Models; -//using Serilog; -//using System; -//using System.Collections.Generic; -//using System.IO; -//using System.Linq; -//using System.Text.RegularExpressions; - -//namespace Packer -//{ -// static class Lib -// { -// /// -// /// 从主库中选出所需文本 -// /// -// /// 所使用的配置 -// /// -// /// 需要包含的模组列表,按模组唯一标识符
-// /// 若为,表示包含所有模组 -// /// -// /// -// public static IEnumerable RetrieveContent( -// Config config, -// IEnumerable? targetModIdentifiers) - -// // 成功实现了没分号的C#语句...这就是查询表达式吗( -// => from modDirectory in new DirectoryInfo($"./projects/{config.Version}/assets") -// .EnumerateDirectories() -// let modIdentifier = modDirectory.Name -// // 模组筛选,按模组标识符 -// where targetModIdentifiers is null // 未提供列表,全部打包 -// || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 -// from namespaceDirectory in modDirectory.EnumerateDirectories() -// let namespaceName = namespaceDirectory.Name -// // 检查命名空间格式,拒绝错误格式 -// // 但是写成表达式以后,没法现场丢异常了... -// where !Regex.IsMatch(namespaceName, -// @"^[a-z0-9_\-.]+$", -// RegexOptions.Singleline) -// from provider in namespaceDirectory.EnumerateProviders(config) -// // 合并文件;我猜没写错 -// group provider by namespaceName into namespaceGroup -// select namespaceGroup -// .Aggregate(seed: null as IResourceFileProvider, // 好家伙 类型推断系统推断不出TAggregate -// (accumlate, next) // 为什么这个参数叫func不叫accumlator或者aggregator... -// => next.ApplyTo(accumlate, overrideExisting: false)); -// } -//} diff --git a/src/Packer/Models/Config.cs b/src/Packer/Models/Config.cs index f6d73453db8a..c19c488b175f 100644 --- a/src/Packer/Models/Config.cs +++ b/src/Packer/Models/Config.cs @@ -1,63 +1,110 @@ using System.Collections.Generic; +using System.Linq; using System.Text.Json.Serialization; namespace Packer { /// - /// 配置文件 - /// 主要config/packer.json加载 + /// 配置项 /// public struct Config + { + /// + /// 基础配置,版本唯一 + /// + public BaseConfig Base { get; set; } + /// + /// 浮动配置,可与命名空间下的文件合并 + /// + public FloatingConfig Floating { get; set; } + + /// + /// 从命名空间下的局域配置加载内容。 + /// + public Config Modify(FloatingConfig? floatingConfig) + { + // 好家伙 这玩意还是个Nullable + if (!floatingConfig.HasValue) return this; + return new() + { + Base = Base, + Floating = Floating.Merge(floatingConfig.Value) + }; + } + } + + /// + /// 基础配置,版本唯一 + /// + public struct BaseConfig { /// /// 打包的目标版本 /// - [JsonPropertyName("targetVersion")] public string Version { get; set; } /// - /// 打包的目标语言

+ /// 打包的目标语言 ///
- [JsonPropertyName("targetLanguage")] public string[] TargetLanguages { get; set; } /// - /// 打包过程的基础文件(如在assets/以外的文件,或不宜通过打包流程的) + /// 不进行打包的mod(按[curseforge-]name) /// - [JsonPropertyName("additionalContent")] - public List FilesToInitialize { get; set; } + public IEnumerable ExclusionMods { get; set; } /// - /// 不进行打包的mod(按[curseforge-]name处理)

- /// 有可能作为基础文件 + /// 不进行打包的namespace ///
- [JsonPropertyName("modNameBlackList")] - public List ModBlackList { get; set; } + public IEnumerable ExclusionNamespaces { get; set; } + } + /// + /// 浮动配置,可与命名空间下的文件合并 + /// + public struct FloatingConfig + { /// - /// 不进行打包的asset-domain

- /// 有可能作为基础文件 + /// 强制包含的domain ///
- [JsonPropertyName("domainBlackList")] - public List DomainBlackList { get; set; } - + public IEnumerable InclusionDomains { get; set; } + /// + /// 强制排除的domain + /// + public IEnumerable ExclusionDomains { get; set; } + /// + /// 强制包含的路径 + /// + public IEnumerable ExclusionPaths { get; set; } /// - /// (这不是基础文件!)

- /// 进入打包流程,但不按照语言文件格式化(也就不回避重复文件)

- /// 图片文件必须经过此流程!

- /// 按照namespace识别 + /// 强制排除的路径 ///
- [JsonPropertyName("noProcessNamespace")] - public List ForceInclusionDomain { get; set; } + public IEnumerable InclusionPaths { get; set; } /// - /// 字符替换表,版本限定 + /// 文本字符替换表 /// - [JsonPropertyName("replacementMap")] public Dictionary CharatcerReplacement { get; set; } + /// + /// 内容替换表 + /// + public Dictionary DestinationReplacement { get; set; } + + /// + /// 从另一对象合并配置 + /// + public FloatingConfig Merge(FloatingConfig other) => new() + { + ExclusionPaths = ExclusionPaths.Concat(other.ExclusionPaths).Distinct(), + ExclusionDomains = ExclusionDomains.Concat(other.ExclusionDomains).Distinct(), + InclusionDomains = InclusionDomains.Concat(other.InclusionDomains).Distinct(), + InclusionPaths = InclusionPaths.Concat(other.InclusionPaths).Distinct(), + CharatcerReplacement = CharatcerReplacement.Concat(other.CharatcerReplacement).DistinctBy(_ => _.Key) + .ToDictionary(_ => _.Key, _ => _.Value), + DestinationReplacement = DestinationReplacement.Concat(other.DestinationReplacement).DistinctBy(_ => _.Key) + .ToDictionary(_ => _.Key, _ => _.Value) + }; - [JsonPropertyName("destinitionReplacement")] - public Dictionary DestinationReplacement { get; set; } } } diff --git a/src/Packer/Models/IResourceFileProvider.cs b/src/Packer/Models/IResourceFileProvider.cs index d46025bf05e9..76255e044182 100644 --- a/src/Packer/Models/IResourceFileProvider.cs +++ b/src/Packer/Models/IResourceFileProvider.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.IO.Compression; -using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -54,9 +52,8 @@ public IResourceFileProvider ReplaceContent(string searchPattern, string replace public Task WriteToArchive(ZipArchive archive); /// - /// 获取该提供器的目标位置 + /// 目标在资源包中的相对位置,从根目录算起 /// - /// 目标在资源包中的相对位置,从根目录算起 public string Destination { get; } } } diff --git a/src/Packer/Models/McMeta.cs b/src/Packer/Models/McMeta.cs deleted file mode 100644 index 28f69882df73..000000000000 --- a/src/Packer/Models/McMeta.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Text.Json.Serialization; - -namespace Packer.Models -{ - /// - /// MCMETA格式

- /// 唯一用处是写修改日期 - ///
- public class McMeta - { - /// - /// - /// - [JsonPropertyName("pack")] public McMetaPack Pack { get; set; } - } - - /// - /// - public class McMetaPack - { - /// - /// - [JsonPropertyName("pack_format")] public int Format { get; set; } - /// - /// - [JsonPropertyName("description")] public string Description { get; set; } - } -} \ No newline at end of file diff --git a/src/Packer/Models/Mod.cs b/src/Packer/Models/Mod.cs deleted file mode 100644 index 8f2876da621a..000000000000 --- a/src/Packer/Models/Mod.cs +++ /dev/null @@ -1,48 +0,0 @@ -//using System.Collections.Generic; - -//namespace Packer.Models -//{ -// /// -// /// 模组译文的抽象表示 -// /// -// public class Mod -// { -// /// -// /// 模组名 -// /// -// public string modName; -// /// -// /// 采用的asset,按asset-domain分 -// /// -// public IEnumerable assets; -// } - -// /// -// /// asset的抽象表示 -// /// -// public class Asset -// { -// /// -// /// asset-domain名 -// /// -// public string domainName; -// /// -// /// 该asset-domain下的文件 -// /// -// public IEnumerable contents; -// /// -// /// domain合并,并解决重复文件问题 -// /// -// /// 要合并的对象 -// /// -// public Asset Combine(Asset other) -// { - -// return new Asset() -// { -// domainName = this.domainName, -// contents = Utils.MergeFiles(this.contents, other.contents) -// }; -// } -// } -//} diff --git a/src/Packer/Models/PackerPolicy.cs b/src/Packer/Models/PackerPolicy.cs new file mode 100644 index 000000000000..fb86d121b3ef --- /dev/null +++ b/src/Packer/Models/PackerPolicy.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Packer.Models +{ + /// + /// Packer 的局域打包策略类型 + /// + public enum PackerPolicyType + { + /// + /// 从当前位置加载文件。 + /// + Direct, + /// + /// 从指定位置加载文件。 + /// + Indirect, + /// + /// 从组合文件创建指定语言文件。 + /// + Composition + } + + /// + /// Packer的局域打包策略。包含策略类型,以及不同策略使用的额外参数 + /// + public class PackerPolicy + { + /// + /// 打包策略的类型参数 + /// + public PackerPolicyType Type { get; set; } + + /// + /// 打包策略的额外参数 + /// + [JsonExtensionData] + public Dictionary? Parameters { get; set; } + // JsonExtensionData要求以此种格式传入 + } +} diff --git a/src/Packer/Models/PackerStrategy.cs b/src/Packer/Models/PackerStrategy.cs deleted file mode 100644 index 835f51ddb073..000000000000 --- a/src/Packer/Models/PackerStrategy.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Packer.Models -{ - /// - /// Packer 的局域打包策略类型 - /// - public enum PackerStrategyType - { - /// - /// 不进行额外操作,直接按照本处的文件结构打包

- /// 附加参数:无 - ///
- NoAction, - /// - /// 仅从某处复制文件,忽略当前目录的内容

- /// 附加参数:

- /// "source": string 复制源地址 - ///
- PlainClone, - /// - /// 使用本处的文件结构,随后从源地址补充文件

- /// 全体文件以本处优先

- /// 附加参数:

- /// "source": string 复制源地址 - ///
- CloneMissing, - /// - /// 使用此处的文件结构,仅对此处存在的条目从源地址更新

- /// 附加参数:

- /// "source": string 复制源地址 - ///
- BackPort, - /// - /// 从某处复制文件,然后应用由Google Diff-Match-Patch算法生成的修改项

- /// 附加参数:

- /// "source": string 复制源地址

- /// "patches": Dictionary<string, string> patch列表: patch目标 -> patch文本 - ///
- Patch - } - - /// - /// Packer的局域打包策略。包含策略类型,以及不同策略使用的额外参数 - /// - public class PackerStrategy - { - /// - /// 打包策略的类型参数 - /// - [JsonPropertyName("type")] - public PackerStrategyType Type { get; set; } - - /// - /// 打包策略的额外参数 - /// - [JsonExtensionData] - public Dictionary Parameters { get; set; } - // JsonExtensionData要求以此种格式传入 - } -} diff --git a/src/Packer/Models/Providers/CompositionHelper.cs b/src/Packer/Models/Providers/CompositionHelper.cs new file mode 100644 index 000000000000..5fed86a38e78 --- /dev/null +++ b/src/Packer/Models/Providers/CompositionHelper.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Nodes; + +namespace Packer.Models.Providers +{ + using LangMappingProvider = TermMappingProvider; + using JsonMappingProvider = TermMappingProvider; + + public static partial class LangMappingHelper + { + /// + /// 从组合文件创建 + /// + /// 组合文件 + public static LangMappingProvider CreateFromComposition(FileInfo file) + { + using var reader = file.OpenText(); + var data = JsonSerializer.Deserialize( + reader.ReadToEnd(), + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); + return new LangMappingProvider( + new LangDictionaryWrapper(CompositionHelper.CreateRawDictionary(data)), + data.Target); + } + } + + public static partial class JsonMappingHelper + { + /// + /// 从组合文件创建 + /// + /// 组合文件 + public static JsonMappingProvider CreateFromComposition(FileInfo file) + { + using var reader = file.OpenText(); + var data = JsonSerializer.Deserialize( + reader.ReadToEnd(), + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); + return new JsonMappingProvider( + JsonDictionaryWrapper.Create(CompositionHelper.CreateRawDictionary(data)), + data.Target); + } + } + + internal static class CompositionHelper + { + internal static Dictionary CreateRawDictionary(CompositionData data) + { + var query = from entry in data.Entries + let templates = entry.Templates + let parameters = entry.Parameters.CrossMap() + from parameter in parameters + from template in templates + let formattedKey = string.Format(template.Key, parameter.Key.ToArray()) + let formattedValue = string.Format(template.Value, parameter.Value.ToArray()) + select (formattedKey, formattedValue); + return query.ToDictionary(_ => _.formattedKey, _ => _.formattedValue); + } + + internal static IEnumerable, IEnumerable>> + CrossMap(this IEnumerable>> origin) + => origin.Aggregate( + seed: Enumerable.Empty, IEnumerable>>(), + (accumulate, next) => from incomingPair in next + join existingGroup in accumulate on true equals true + select KeyValuePair.Create( + existingGroup.Key.Append(incomingPair.Key), + existingGroup.Value.Append(incomingPair.Value))); + } + + + // composition format: + // - root + // * object + // - string target => 本文件产生组合的目标地址。 + // * list + // * object + // * object templates => 组合所用的模板。所有内容采用C#格式化模式填写。 + // - => + // * list params => 参数表。参数按照列举顺序排列。不支持嵌套,必须字面量。 + // * object + // - => + + internal struct CompositionData + { + public string Target { get; set; } + public List Entries { get; set; } + } + + internal struct CompositionEntry + { + public Dictionary Templates { get; set; } + public List> Parameters { get; set; } + } +} diff --git a/src/Packer/Models/Providers/CompositionProvider.cs b/src/Packer/Models/Providers/CompositionProvider.cs deleted file mode 100644 index bea32ad5ae87..000000000000 --- a/src/Packer/Models/Providers/CompositionProvider.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Text.Json.Nodes; - -namespace Packer.Models.Providers -{ - using LangMappingProvider = TermMappingProvider; - using JsonMappingProvider = TermMappingProvider; - - - // 考量:Helper? - public class CompositionProvider : TermMappingProvider - { - public CompositionProvider(ITermDictionary map, string destination) : base(map, destination) { } - - public CompositionProvider Create(FileInfo file) - { - - } - } - - - internal struct CompositonData - { - public string Target { get; set; } - public List Entries { get; set; } - } - - internal struct CompositionEntry - { - public Dictionary Templates { get; set; } - public Dictionary Parameters { get; set; } - } -} diff --git a/src/Packer/Models/Providers/LanguageFile.cs b/src/Packer/Models/Providers/LanguageFile.cs deleted file mode 100644 index 3c236d655f67..000000000000 --- a/src/Packer/Models/Providers/LanguageFile.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Serilog; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json.Nodes; - -namespace Packer.Models.Providers -{ - - using LangMappingProvider = TermMappingProvider; - using JsonMappingProvider = TermMappingProvider; - - public class LangLanguageFile : LangMappingProvider - { - public LangLanguageFile(ITermDictionary map, string destination) : base(map, destination) { } - public static LangLanguageFile Create(FileInfo file, string destination) - { - using var stream = file.OpenRead(); - using var reader = new StreamReader(stream, Encoding.UTF8); - var content = reader.ReadToEnd(); - return new(new LangDictionaryWrapper(DeserializeFromLang(content)), destination); - } - - // RAW CONTENT - static Dictionary DeserializeFromLang(string content) - { - // 甚至不是自动机...所以不敢多用,否则会炸 - - // 下面的 Verbose 仅供调试,不会在 log 里出现 - // .lang的格式真的乱... - Log.Verbose("开始反序列化 .lang 文件"); - // #PARSE_ESCAPE就算了吧 - var result = new Dictionary(); - var isInComment = false; // 处理多行注释 - new List(content.Split(Environment.NewLine, - StringSplitOptions.RemoveEmptyEntries)) - .ForEach(line => - { - var isSingleLineComment = false; - new List { "//", "#" } - .ForEach(_ => { isSingleLineComment |= line.StartsWith(_); }); - if (isSingleLineComment) - { - Log.Verbose("跳过了单行注释:{0}", line); - } - else if (isInComment) // 多行注释内 - { - Log.Verbose("{0}", line); - if (line.Trim() - .EndsWith("*/")) - { - isInComment = false; // 跳出注释 - } - } - else if (line.StartsWith("/*")) // 开始多行注释 - { - Log.Verbose("跳过了多行注释:{0}", line); - } - else // 真正的条目 - { - Log.Verbose("添加对应映射:{0}", line); - var spiltPosition = line.IndexOf('='); - try - { - result.Add(line[..spiltPosition], line[(spiltPosition + 1)..]); - } - catch (Exception e) - { - Log.Warning(e.ToString()); - } - } - } - ); - Log.Verbose("反序列化完成"); - return result; - } - } - - - public class JsonLanguageFile : JsonMappingProvider - { - public JsonLanguageFile(ITermDictionary map, string destination) : base(map, destination) { } - public static JsonLanguageFile Create(FileInfo file, string destination) - { - using var stream = file.OpenRead(); - return new(new JsonDictionaryWrapper(JsonNode.Parse(stream).AsObject()), destination); - } - } - -} diff --git a/src/Packer/Models/Providers/McMetaProvider.cs b/src/Packer/Models/Providers/McMetaProvider.cs index 2a7776921e18..c6dcab9b8e50 100644 --- a/src/Packer/Models/Providers/McMetaProvider.cs +++ b/src/Packer/Models/Providers/McMetaProvider.cs @@ -1,22 +1,56 @@ -using System; -using System.Collections.Generic; +using Packer.Extensions; +using Serilog; +using System; +using System.IO; using System.IO.Compression; -using System.Linq; using System.Text; using System.Threading.Tasks; namespace Packer.Models.Providers { - internal class McMetaProvider : IResourceFileProvider + /// + /// 用于表示pack.mcmeta的提供器。写入时将会附加打包时间 + /// + public class McMetaProvider : TextFile { - public string Destination => "pack.mcmeta"; + internal McMetaProvider(string content, string destination) : base(content, destination) { } - public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) - => this; + /// + /// 从给定的构造提供器。 + /// + /// 读取源 + /// 目标地址 + public static new McMetaProvider Create(FileInfo file, string destination) + { + using var stream = file.OpenRead(); + using var reader = new StreamReader(stream, Encoding.UTF8); + var content = reader.ReadToEnd(); + return new McMetaProvider(content, destination); + } - public Task WriteToArchive(ZipArchive archive) + /// + public override string Destination => "pack.mcmeta"; + /// + public override IResourceFileProvider ReplaceContent(string searchPattern, string replacement) + => this; + /// + public override IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) + => this; + /// + public override async Task WriteToArchive(ZipArchive archive) { - throw new NotImplementedException(); + var destination = Destination.NormalizePath(); + Log.Information("正在添加 {0}", destination); + + var content = string.Format(Content, DateTime.UtcNow.AddHours(8) /* UTC +8:00 */); + + archive.ValidateEntryDistinctness(destination); + + using var writer = new StreamWriter( + archive.CreateEntry(destination) + .Open(), + Encoding.UTF8); + await writer.WriteAsync(content); } } } diff --git a/src/Packer/Models/Providers/RawFile.cs b/src/Packer/Models/Providers/RawFile.cs index e43c155e4ce0..101fcf8bfac5 100644 --- a/src/Packer/Models/Providers/RawFile.cs +++ b/src/Packer/Models/Providers/RawFile.cs @@ -20,13 +20,11 @@ public class RawFile : IResourceFileProvider ///
public FileInfo SourceFile { get; } - /// - /// 目标地址 - /// + /// public string Destination { get; } /// - /// 从给定的文件引用构造提供器 + /// 从给定的构造提供器 /// /// 源文件的引用 /// 目标地址 diff --git a/src/Packer/Models/Providers/TermMappingProvider.cs b/src/Packer/Models/Providers/TermMappingProvider.cs index 52c05a2aff72..3dcac7a057ed 100644 --- a/src/Packer/Models/Providers/TermMappingProvider.cs +++ b/src/Packer/Models/Providers/TermMappingProvider.cs @@ -14,30 +14,134 @@ namespace Packer.Models.Providers { + using LangMappingProvider = TermMappingProvider; + using JsonMappingProvider = TermMappingProvider; - - + #region termDictionary + /// + /// 可以作为语言文件使用的键值对包装 + /// + /// 内部使用的值类型 public interface ITermDictionary : IDictionary { - // TODO:Parse + /// + /// 从内部的键值对表示生成正确的语言文件文本 + /// + /// 生成文本 public string ProvideStringContent(); + /// + /// 在内部键值对的值中,对于文本部分,执行给定的替换。 + /// + /// 替换的匹配模式,使用 + /// 替换文本 + /// 替换得到的新 public ITermDictionary ReplaceContent(string searchPattern, string replacement); - public static ITermDictionary Create(IDictionary nominalMapping) - => throw new NotImplementedException(); } + internal class LangDictionaryWrapper : Dictionary, ITermDictionary + { + public LangDictionaryWrapper(IDictionary dictionary) : base(dictionary) { } + + public string ProvideStringContent() + { + var builder = new StringBuilder(); + foreach (var (key, value) in this) + { + builder.AppendJoin('=', key, value); + builder.Append(Environment.NewLine); + } + return builder.ToString(); + } + + public ITermDictionary ReplaceContent(string searchPattern, string replacement) + { + var result = new Dictionary(); + foreach (var (key, value) in this) + { + var replaced = Regex.Replace(value, + searchPattern, + replacement, + RegexOptions.Singleline); + result.Add(key, replaced); + } + return new LangDictionaryWrapper(result); + } + } + + internal class JsonDictionaryWrapper : Dictionary, ITermDictionary + { + public JsonDictionaryWrapper(IDictionary dictionary) : base(dictionary) { } + + public string ProvideStringContent() + => JsonSerializer.Serialize(this, new JsonSerializerOptions() + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }); + + public ITermDictionary ReplaceContent(string searchPattern, string replacement) + { + var result = new Dictionary(); + foreach (var (key, value) in this) + { + if (value.GetType() == typeof(JsonValue) + && value.AsValue().TryGetValue(out var stringValue)) + { + var replaced = Regex.Replace(stringValue, + searchPattern, + replacement, + RegexOptions.Singleline); + result.Add(key, JsonValue.Create(replaced)!); // 我猜不会null罢 + continue; + } + result.Add(key, value); + } + return new JsonDictionaryWrapper(result); + } + + public static ITermDictionary Create(IDictionary nominalMapping) + { + var query = from pair in nominalMapping + let key = pair.Key + let value = pair.Value + let node = JsonValue.Create(value)! + select (key, node); + var transformed = query.ToDictionary(_ => _.key, _ => _.node as JsonNode); + return new JsonDictionaryWrapper(transformed); + } + } + + #endregion + #region Provider + /// + /// 语言文件的提供器。支持内容替换、文件合并 + /// + /// + /// 对于在lang/下的文件,使用该类型 + /// + /// 内部使用的值类型 public class TermMappingProvider : IResourceFileProvider { + /// + /// 语言文件所表示的映射表 + /// public ITermDictionary Map { get; } + + /// public string Destination { get; } + /// + /// 从给定的映射表构造提供器 + /// + /// 映射表 + /// 目标地址 public TermMappingProvider(ITermDictionary map, string destination) { Map = map; Destination = destination; } + /// public IResourceFileProvider ApplyTo(IResourceFileProvider? incoming, bool overrideExisting = false) { if (incoming is not TermMappingProvider) @@ -59,11 +163,13 @@ public IResourceFileProvider ApplyTo(IResourceFileProvider? incoming, bool overr return new TermMappingProvider(baseMap, Destination); } + /// public IResourceFileProvider ReplaceContent(string searchPattern, string replacement) => new TermMappingProvider( Map.ReplaceContent(searchPattern, replacement), Destination); + /// public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) => new TermMappingProvider( Map, @@ -72,6 +178,7 @@ public IResourceFileProvider ReplaceDestination(string searchPattern, string rep replacement, RegexOptions.Singleline)); + /// public async Task WriteToArchive(ZipArchive archive) { var destination = Destination.NormalizePath(); @@ -86,82 +193,99 @@ public async Task WriteToArchive(ZipArchive archive) await writer.WriteAsync(Map.ProvideStringContent()); } } + #endregion - - - - internal class LangDictionaryWrapper : Dictionary, ITermDictionary + #region Helper + /// + /// 用于生成的辅助类 + /// + public static partial class LangMappingHelper { - public LangDictionaryWrapper(IDictionary dictionary) : base(dictionary) { } - - public string ProvideStringContent() + /// + /// 从给定的语言文件创建 + /// + /// 读取源 + /// 目标地址 + public static LangMappingProvider CreateFromFile(FileInfo file, string destination) { - var builder = new StringBuilder(); - foreach (var (key, value) in this) - { - builder.AppendJoin('=', key, value); - builder.Append(Environment.NewLine); - } - return builder.ToString(); + using var stream = file.OpenRead(); + using var reader = new StreamReader(stream, Encoding.UTF8); + var content = reader.ReadToEnd(); + return new (new LangDictionaryWrapper(DeserializeFromLang(content)), destination); } - public ITermDictionary ReplaceContent(string searchPattern, string replacement) + // RAW + // TODO:仔细检查一遍 + // TODO:PARSE-ESCAPE + internal static Dictionary DeserializeFromLang(string content) { - var result = new Dictionary(); - foreach (var (key, value) in this) - { - var replaced = Regex.Replace(value, - searchPattern, - replacement, - RegexOptions.Singleline); - result.Add(key, replaced); - } - return new LangDictionaryWrapper(result); - } - - public static ITermDictionary Create(IDictionary nominalMapping) - => new LangDictionaryWrapper(nominalMapping); - } - - internal class JsonDictionaryWrapper : Dictionary, ITermDictionary - { - public JsonDictionaryWrapper(IDictionary dictionary) : base(dictionary) { } - - public string ProvideStringContent() - => JsonSerializer.Serialize(this, new JsonSerializerOptions() - { - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + // 甚至不是自动机...所以不敢多用,否则会炸 - public ITermDictionary ReplaceContent(string searchPattern, string replacement) - { - var result = new Dictionary(); - foreach(var (key, value) in this) - { - if (value.GetType() == typeof(JsonValue) - && value.AsValue().TryGetValue(out var stringValue)) + // 下面的 Verbose 仅供调试,不会在 log 里出现 + // .lang的格式真的乱... + Log.Verbose("开始反序列化 .lang 文件"); + // #PARSE_ESCAPE就算了吧 + var result = new Dictionary(); + var isInComment = false; // 处理多行注释 + new List(content.Split(Environment.NewLine, + StringSplitOptions.RemoveEmptyEntries)) + .ForEach(line => { - var replaced = Regex.Replace(stringValue, - searchPattern, - replacement, - RegexOptions.Singleline); - result.Add(key, JsonValue.Create(replaced)!); // 我猜不会null罢 - continue; + var isSingleLineComment = false; + new List { "//", "#" } + .ForEach(_ => { isSingleLineComment |= line.StartsWith(_); }); + if (isSingleLineComment) + { + Log.Verbose("跳过了单行注释:{0}", line); + } + else if (isInComment) // 多行注释内 + { + Log.Verbose("{0}", line); + if (line.Trim() + .EndsWith("*/")) + { + isInComment = false; // 跳出注释 + } + } + else if (line.StartsWith("/*")) // 开始多行注释 + { + Log.Verbose("跳过了多行注释:{0}", line); + } + else // 真正的条目 + { + Log.Verbose("添加对应映射:{0}", line); + var spiltPosition = line.IndexOf('='); + try + { + result.Add(line[..spiltPosition], line[(spiltPosition + 1)..]); + } + catch (Exception e) + { + Log.Warning(e.ToString()); + } + } } - result.Add(key, value); - } - return new JsonDictionaryWrapper(result); + ); + Log.Verbose("反序列化完成"); + return result; } + } - public static ITermDictionary Create(IDictionary nominalMapping) + /// + /// 用于生成的辅助类 + /// + public static partial class JsonMappingHelper + { + /// + /// 从给定的语言文件创建 + /// + /// 读取源 + /// 目标地址 + public static JsonMappingProvider CreateFromFile(FileInfo file, string destination) { - var query = from pair in nominalMapping - let key = pair.Key - let value = pair.Value - let node = JsonValue.Create(value)! - select (key, node); - var transformed = query.ToDictionary(_ => _.key, _ => _.node as JsonNode); - return new JsonDictionaryWrapper(transformed); + using var stream = file.OpenRead(); + return new(new JsonDictionaryWrapper(JsonNode.Parse(stream)!.AsObject()!), destination); } } + #endregion } diff --git a/src/Packer/Models/Providers/TextFile.cs b/src/Packer/Models/Providers/TextFile.cs index 2e9d1420a0b9..408e1add8c63 100644 --- a/src/Packer/Models/Providers/TextFile.cs +++ b/src/Packer/Models/Providers/TextFile.cs @@ -19,14 +19,13 @@ public class TextFile : IResourceFileProvider /// /// 提供器所携带的文本内容 /// - public string Content { get; } - /// - /// 目标地址 - /// - public string Destination { get; } + public virtual string Content { get; } + + /// + public virtual string Destination { get; } /// - /// 从给定的构造提供器。 + /// 从给定的构造提供器 /// /// 读取源 /// 目标地址 @@ -39,7 +38,7 @@ public static TextFile Create(FileInfo file, string destination) } /// - /// 从给定的文本内容构造提供器。 + /// 从给定的文本内容构造提供器 /// /// 来源文本 /// 目标地址 @@ -49,22 +48,22 @@ public TextFile(string content, string destination) Destination = destination; } - - public IResourceFileProvider ReplaceContent(string searchPattern, string replacement) + /// + public virtual IResourceFileProvider ReplaceContent(string searchPattern, string replacement) => new TextFile(Regex.Replace(Content, searchPattern, replacement, RegexOptions.Singleline), Content); /// - public IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) + public virtual IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) => new TextFile(Content, Regex.Replace(Destination, searchPattern, replacement, RegexOptions.Singleline)); /// - public async Task WriteToArchive(ZipArchive archive) + public virtual async Task WriteToArchive(ZipArchive archive) { var destination = Destination.NormalizePath(); Log.Information("正在添加 {0}", destination); diff --git a/src/Packer/Models/TranslatedFile.cs b/src/Packer/Models/TranslatedFile.cs deleted file mode 100644 index 39cbbb7d7b4b..000000000000 --- a/src/Packer/Models/TranslatedFile.cs +++ /dev/null @@ -1,229 +0,0 @@ -//using DiffMatchPatch; -//using Packer.Extensions; -//using Serilog; -//using System; -//using System.Collections.Generic; -//using System.IO; - -//namespace Packer.Models -//{ -// /// -// /// 标志文件类型的枚举。目前而言有[是否按.json]和[是否按\lang\]两类 -// /// -// [Flags] -// public enum FileCategory -// { -// /// -// /// 仅用于初始化为默认态 -// /// -// None = 0, -// /// -// /// 类 .json,标识需要转义与 json 式序列化 -// /// -// JsonAlike = 1, -// /// -// /// 类 .lang,标识无需转义与 lang 式序列化 -// /// -// LangAlike = 2, -// /// -// /// 位于 /lang/ 中的文件,进行合并等 -// /// -// LanguageFile = 4, -// /// -// /// 位于其余位置的文件,不进行合并 -// /// -// OtherFiles = 8, -// /// -// /// */lang/*.json -// /// -// JsonTranslationFormat = JsonAlike | LanguageFile, -// /// -// /// */lang/*.lang -// /// -// LangTranslationFormat = LangAlike | LanguageFile, -// /// -// /// */[not-lang]/*.json -// /// -// JsonOthers = JsonAlike | OtherFiles, -// /// -// /// */[not-lang]/*.lang -// /// -// LangOthers = LangAlike | OtherFiles -// } - -// /// -// /// 语言文本的抽象。这是基本类
-// /// 基本上是immutable的 -// ///
-// public class TranslatedFile -// { -// /// -// /// asset-domain下的位置 -// /// -// public string RelativePath { get; init; } - -// /// -// /// 该文件的文本,用字符串表示

-// /// 因此,不能存储非文本文件! -// ///
-// public string StringifiedContent { get; } - -// /// -// /// 文件类型 -// /// -// public FileCategory Category { get; } - -// /// -// /// 从文件流构造内容 -// /// -// public TranslatedFile(Stream stream, FileCategory category, Config config) -// { // 注:文件流在此处被关闭 -// using var reader = new StreamReader(stream); -// StringifiedContent = reader.ReadToEnd().Preprocess(category, config); -// this.Category = category; -// } - -// /// -// /// 从文本构造内容 -// /// -// public TranslatedFile(FileCategory category, string content) -// { -// this.Category = category; -// StringifiedContent = content; -// } - -// /// -// /// 伪合并文件 -// /// -// virtual public TranslatedFile Combine(TranslatedFile file) -// { -// Log.Information("文件不支持合并。取消合并"); -// return this; -// } - -// /// -// /// 伪适配文件 -// /// -// virtual public TranslatedFile Port(TranslatedFile file) -// { -// Log.Information("文件不支持适配。直接覆盖"); -// return file; -// } - -// /// -// /// 对该文件的内容进行Google Diff-Match-Patch算法 -// /// -// public TranslatedFile ApplyPatch(string patch) -// { -// // 对应的Patch可以自行生成,或者也可以做一个小工具,虽然不在这里 -// // 应用Patch时,需要先根据Patch文本生成Patch列表,再应用Patch -// // -// // patch_apply 返回object[] [0]=string [1]=bool[] -// var dmp = new diff_match_patch(); -// var patchList = dmp.patch_fromText(patch); -// return new TranslatedFile(Category, -// (string)dmp.patch_apply(patchList, StringifiedContent)[0]); -// } -// } - -// /// -// /// 可以按照/lang/文件夹下解析的文件。这是衍生类
-// /// 基本上是immutable的 -// ///
-// public class LangFile : TranslatedFile -// { -// private bool deserialized = false; // 非必要不解析,免得残废的lang解析炸掉 -// private Dictionary _deserializedContent; - -// /// -// /// 按照基础语言文件的格式解析而成的词条列表。
-// /// 在访问时才会解析。 -// ///
-// public Dictionary DeserializedContent -// { -// get -// { -// if (!deserialized) -// { -// deserialized = true; -// _deserializedContent = StringifiedContent.DeserializeAsset(Category); -// } -// return _deserializedContent; -// } -// } - -// /// -// /// 从文件流构造内容 -// /// -// public LangFile(Stream stream, FileCategory category, Config config) -// : base(stream, category, config) -// { -// _deserializedContent = null; -// } -// /// -// /// 从映射表构造内容 -// /// -// public LangFile(FileCategory category, Dictionary content) -// : base(category, content.SerializeAsset(category)) -// { -// _deserializedContent = content; -// deserialized = true; -// } -// /// -// /// 真合并文件 -// /// -// public override LangFile Combine(TranslatedFile file) -// { -// Log.Information("合并文件:{0}", this.RelativePath); - -// var castedFile = (LangFile)file; -// if (castedFile is null) -// { -// Log.Information("检测到不支持合并的文件。取消合并"); -// return this; -// } - -// var resultMap = new Dictionary(DeserializedContent); -// foreach (var pair in castedFile.DeserializedContent) -// { -// if (!resultMap.TryAdd(pair.Key, pair.Value)) -// { -// Log.Warning("检测到相同 key 的条目:{0} -> {1} | {2},选取 {1}", -// pair.Key, resultMap[pair.Key], pair.Value); -// } -// } - -// return new LangFile(this.Category, resultMap) -// { -// RelativePath = this.RelativePath -// }; -// } - -// /// -// /// 真适配文件 -// /// -// public override TranslatedFile Port(TranslatedFile file) -// { -// var castedFile = (LangFile)file; -// if (castedFile is null) -// { -// Log.Information("检测到不支持合并的文件。取消合并"); -// return file; -// } - -// var resultMap = DeserializedContent; -// foreach(var key in resultMap.Keys) -// { -// if(castedFile.DeserializedContent.TryGetValue(key, out var value)) -// { -// Log.Information("正在替换适配项:<{0}> {1} => {2}", key, resultMap[key], value); -// resultMap[key] = value; -// } -// } -// return new LangFile(this.Category, resultMap) -// { -// RelativePath = this.RelativePath -// }; -// } -// } -//} diff --git a/src/Packer/Program.cs b/src/Packer/Program.cs index 1714ed7b0ec6..777b8305d36f 100644 --- a/src/Packer/Program.cs +++ b/src/Packer/Program.cs @@ -1,18 +1,18 @@ using Packer.Extensions; using Packer.Models; +using Packer.Models.Providers; using Serilog; using System; using System.IO; using System.IO.Compression; using System.Linq; -using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Packer { class Program { - // 由于某些魔法,这里可以直接加参数 + // System.CommandLine.DragonFruit支持 public static async Task Main(string version, string[]? targets) { Log.Logger = new LoggerConfiguration() @@ -21,66 +21,68 @@ public static async Task Main(string version, string[]? targets) .MinimumLevel.Information() // 以便 debug 时修改这一等级 .CreateLogger(); - if (version is null) - throw new ArgumentNullException(nameof(version)); var targetModIdentifiers = targets?.ToList(); var config = await Utils.RetrieveConfig(configTemplate: "./config/packer/{0}.json", version: version); - Log.Information("开始对版本 {0} 的打包", config.Version); + Log.Information("开始对版本 {0} 的打包", config.Base.Version); var query = // 这就是查询表达式吗( - from modDirectory in new DirectoryInfo($"./projects/{config.Version}/assets") - .EnumerateDirectories() + from modDirectory in new DirectoryInfo($"./projects/{config.Base.Version}/assets") + .EnumerateDirectories() let modIdentifier = modDirectory.Name - where targetModIdentifiers is null // 未提供列表,全部打包 - || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 - where !config.ModBlackList.Contains(modIdentifier) // 没有被明确排除 + where targetModIdentifiers is null // 未提供列表,全部打包 + || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 + where !config.Base.ExclusionMods.Contains(modIdentifier) // 没有被明确排除 from namespaceDirectory in modDirectory.EnumerateDirectories() let namespaceName = namespaceDirectory.Name - where !config.DomainBlackList.Contains(namespaceName) // 没有被明确排除 - where namespaceName.ValidateNamespace() // 不是非法名称 + where !config.Base.ExclusionNamespaces.Contains(namespaceName) // 没有被明确排除 + where namespaceName.ValidateNamespace() // 不是非法名称 from provider in namespaceDirectory.EnumerateProviders(config) group provider by provider.Destination into destinationGroup select destinationGroup - .Aggregate(seed: null as IResourceFileProvider, // 合并文件 - (accumlate, next) + .Aggregate(seed: null as IResourceFileProvider, // 合并文件 + (accumulate, next) => next.ApplyTo( - accumlate, + accumulate, overrideExisting: false)) into provider - select config.CharatcerReplacement // 内容的字符替换 + select config.Floating.CharatcerReplacement // 内容的字符替换 .Aggregate(seed: provider, - (accumlate, replacement) - => accumlate.ReplaceContent( + (accumulate, replacement) + => accumulate.ReplaceContent( replacement.Key, replacement.Value)) into provider - select config.DestinationReplacement // 全局路径替换:预留 + select config.Floating.DestinationReplacement // 全局路径替换:预留 .Aggregate(seed: provider, - (accumlate, replacement) - => accumlate.ReplaceContent( + (accumulate, replacement) + => accumulate.ReplaceContent( replacement.Key, replacement.Value)); - // TODO 把初始化内容也做成IEnumerable,尤其是pack.mcmeta - // var initializers = from fileName in config.FilesToInitialize select new ... - string packName = $"./Minecraft-Mod-Language-Package-{config.Version}.zip"; + var initialsQuery = from file in new DirectoryInfo($"./projects/{config.Base.Version}") + .EnumerateFiles() + select (file.Name == "pack.mcmeta") + ? McMetaProvider.Create(file, file.Name) // 类型推断不出要用接口 + : new RawFile(file, file.Name) as IResourceFileProvider; + + string packName = $"./Minecraft-Mod-Language-Package-{config.Base.Version}.zip"; await using var stream = File.Create(packName); using (var archive = new ZipArchive(stream, ZipArchiveMode.Update, leaveOpen: true)) { - archive.Initialize(config); - await Task.WhenAll(from provider in query select provider.WriteToArchive(archive)); + await Task.WhenAll(from provider in query.Concat(initialsQuery) + select provider.WriteToArchive(archive)); } - Log.Information("对版本 {0} 的打包结束。共包含了 {1} 个文件", - config.Version, + Log.Information("对版本 {0} 的打包结束。共写入了 {1} 个文件", + config.Base.Version, query.Count()); var md5 = stream.ComputeMD5(); Log.Information("打包文件的 MD5 值:{0}", md5); - File.WriteAllText($"./{config.Version}.md5", md5); + File.WriteAllText($"./{config.Base.Version}.md5", md5); } } } diff --git a/src/Packer/Utils.cs b/src/Packer/Utils.cs index d084c37b630e..4b980619a184 100644 --- a/src/Packer/Utils.cs +++ b/src/Packer/Utils.cs @@ -12,12 +12,33 @@ namespace Packer { - static class Utils + /// + /// 杂项工具类 + /// + public static class Utils { + /// + /// 从给定的命名空间获取局域配置 + /// + /// 命名空间目录 + /// 若文件存在,返回;否则,返回 + public static FloatingConfig? RetrieveLocalConfig(DirectoryInfo directory) + { + var configFile = directory.GetFiles("local-config.json").FirstOrDefault(); + if (configFile is null) return null; + using var reader = configFile.OpenText(); + return JsonSerializer.Deserialize( + reader.ReadToEnd(), + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); + } - + /// + /// 从仓库根目录获取全局配置 + /// + /// 配置路径模板 + /// 打包版本,用于定位全局配置 public static async Task RetrieveConfig(string configTemplate, string version) { Log.Information("正在获取配置。目标版本:{0}", version); @@ -26,96 +47,38 @@ public static async Task RetrieveConfig(string configTemplate, string ve Log.Information("配置位置:{0}", configPath); - var reader = await File.ReadAllBytesAsync(configPath); - return JsonSerializer.Deserialize(reader); + var content = await File.ReadAllBytesAsync(configPath); + return JsonSerializer.Deserialize( + content, + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); } - public static List RetrieveStrategy(FileInfo? file) + /// + /// 从给定的命名空间获取策略内容 + /// + /// 命名空间目录 + /// 若文件存在,返回对应的内容;否则,返回Direct + /// 策略文件非法 + public static List RetrieveStrategy(DirectoryInfo directory) { + var file = directory.GetFiles("packer-policy.json").FirstOrDefault(); + if (file is null) - { - return new List - { - new PackerStrategy { Type = PackerStrategyType.NoAction } + return new List + { + new PackerPolicy { Type = PackerPolicyType.Direct } }; - } - else - { - var result = JsonSerializer.Deserialize>( - file.OpenText().ReadToEnd(), - new JsonSerializerOptions - { - Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } - }); - if (result is null) - throw new InvalidDataException($"The policy file {file.FullName} cannot have null values."); - return result; - } - } - ///// - ///// 将两个带有TranslatedFile的列表合并,对冲突项按照target优先进行合并。 - ///// - ///// 合并对象,优先选择 - ///// 合并对象,非优先 - ///// - //public static IEnumerable MergeFiles(IEnumerable baseFile, IEnumerable incoming) - //{ - // var mapping = new Dictionary(); // asset-domain下的目标位置 -> 文件 - // if (!baseFile.Any()) return incoming; - // if (!incoming.Any()) return baseFile; - // foreach (var file in baseFile) - // { - // mapping.Add(file.RelativePath, file); - // } - // foreach (var file in incoming) - // { - // if (!mapping.TryAdd(file.RelativePath, file)) - // { - // mapping.Remove(file.RelativePath, out var existing); - // mapping.Add(existing.RelativePath, existing.Combine(file)); - // } - // } - // return mapping.Values; - //} - - ///// - ///// 基于原位置的文件key,用incoming的词条进行替换。未被替换的保持原文。 - ///// - ///// 原位置的基准文件 - ///// 更新文件 - ///// - //public static IEnumerable PortFiles(IEnumerable baseFile, IEnumerable incoming) - //{ - // var mapping = new Dictionary(); // asset-domain下的目标位置 -> 文件 - // if (!incoming.Any()) return baseFile; - // foreach (var file in baseFile) - // { - // mapping.Add(file.RelativePath, file); - // } - // foreach (var file in incoming) - // { - // if (!mapping.TryAdd(file.RelativePath, file)) - // { - // mapping.Remove(file.RelativePath, out var existing); - // mapping.Add(existing.RelativePath, existing.Port(file)); - // } - // } - // return mapping.Values; - //} - - - public static string AppendTimestamp(string path) - { - var mcmeta = path; - var meta = JsonSerializer.Deserialize(File.ReadAllText(mcmeta)); - var time = DateTime.UtcNow.AddHours(8); // UTC+8:00 - meta.Pack.Description += $"\n打包时间:{time:yyyy-MM-ddTHH:mm:ssZ}"; - return JsonSerializer.Serialize(meta, new JsonSerializerOptions() - { - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - WriteIndented = true - }); + using var reader = file.OpenText(); + var result = JsonSerializer.Deserialize>( + reader.ReadToEnd(), + new JsonSerializerOptions + { + Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } + }); + if (result is null) + throw new InvalidDataException($"The policy file {file.FullName} cannot have null values."); + return result; } } } From 9cb995fa03532ed01069ace014b23dc6a7873b2e Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Sun, 1 Oct 2023 12:39:42 +0800 Subject: [PATCH 22/25] Migration phase I --- Packer-Doc.md | 123 ++++++++++++++++++ Packer-Index-Doc.md | 32 ----- config/packer/1.20-fabric.json | 73 ++++++----- config/packer/1.20.json | 73 ++++++----- config/packer/packer-example.json | 30 +++++ .../mixed-clone/extra/extra.txt | 1 - .../mixed-clone/lang/zh_cn.json | 4 - .../mixed-clone/packer-policy.json | 4 - .../assets/0-example-nop/nop/lang/zh_cn.json | 4 - .../0-example-nop/nop/packer-policy.json | 3 - .../patch/lang/zh_cn.json.patch | 14 -- .../0-example-patch/patch/packer-policy.json | 7 - .../0-example-port/port/lang/zh_cn.json | 4 - .../0-example-port/port/packer-policy.json | 4 - .../clone/packer-policy.json | 4 - .../minecraft/minecraft/packer-policy.json | 10 +- projects/1.20-fabric/pack.mcmeta | 10 +- projects/1.20/pack.mcmeta | 10 +- projects/packer-example/README.txt | 1 + .../composite/lang/zh_cn.json | 4 + .../example-composite/composite/other.txt | 1 + .../composite/packer-policy.json | 13 ++ .../compositions/zh_cn.json-composition.json | 37 ++++++ .../composition/local-config.json | 10 ++ .../composition/packer-policy.json | 7 + .../example-direct/direct/lang/en_us.json | 20 +++ .../example-direct/direct/lang/zh_cn.json | 20 +++ .../assets/example-direct/direct/other.txt | 1 + .../indirect/packer-policy.json | 6 + projects/packer-example/pack.mcmeta | 6 + src/Packer/Extensions/ContentExtension.cs | 3 +- src/Packer/Extensions/DirectoryExtension.cs | 38 +++--- src/Packer/Models/Config.cs | 19 +-- .../Models/Providers/CompositionHelper.cs | 3 +- src/Packer/Models/Providers/McMetaProvider.cs | 2 +- .../Models/Providers/TermMappingProvider.cs | 11 +- src/Packer/Models/Providers/TextFile.cs | 4 +- src/Packer/Program.cs | 12 +- src/Packer/Utils.cs | 3 +- 39 files changed, 424 insertions(+), 207 deletions(-) create mode 100644 Packer-Doc.md delete mode 100644 Packer-Index-Doc.md create mode 100644 config/packer/packer-example.json delete mode 100644 projects/1.19/assets/0-example-mixed-clone/mixed-clone/extra/extra.txt delete mode 100644 projects/1.19/assets/0-example-mixed-clone/mixed-clone/lang/zh_cn.json delete mode 100644 projects/1.19/assets/0-example-mixed-clone/mixed-clone/packer-policy.json delete mode 100644 projects/1.19/assets/0-example-nop/nop/lang/zh_cn.json delete mode 100644 projects/1.19/assets/0-example-nop/nop/packer-policy.json delete mode 100644 projects/1.19/assets/0-example-patch/patch/lang/zh_cn.json.patch delete mode 100644 projects/1.19/assets/0-example-patch/patch/packer-policy.json delete mode 100644 projects/1.19/assets/0-example-port/port/lang/zh_cn.json delete mode 100644 projects/1.19/assets/0-example-port/port/packer-policy.json delete mode 100644 projects/1.19/assets/0-example-simple-clone/clone/packer-policy.json create mode 100644 projects/packer-example/README.txt create mode 100644 projects/packer-example/assets/example-composite/composite/lang/zh_cn.json create mode 100644 projects/packer-example/assets/example-composite/composite/other.txt create mode 100644 projects/packer-example/assets/example-composite/composite/packer-policy.json create mode 100644 projects/packer-example/assets/example-composition/composition/compositions/zh_cn.json-composition.json create mode 100644 projects/packer-example/assets/example-composition/composition/local-config.json create mode 100644 projects/packer-example/assets/example-composition/composition/packer-policy.json create mode 100644 projects/packer-example/assets/example-direct/direct/lang/en_us.json create mode 100644 projects/packer-example/assets/example-direct/direct/lang/zh_cn.json create mode 100644 projects/packer-example/assets/example-direct/direct/other.txt create mode 100644 projects/packer-example/assets/example-indirect/indirect/packer-policy.json create mode 100644 projects/packer-example/pack.mcmeta diff --git a/Packer-Doc.md b/Packer-Doc.md new file mode 100644 index 000000000000..0f1e18b78d0e --- /dev/null +++ b/Packer-Doc.md @@ -0,0 +1,123 @@ +# 打包机制文档 + +## 注意事项 +- 文件地址中,目录分隔符**一律使用正斜杠**! +- 下述说明中,**完整地址**永远指从**仓库根目录**算起的地址,例如根目录下的`CONTRIBUTING.md`即为`CONTRIBUTING.md`,1.12版本资源包的`pack.png`即为`projects/1.12.2/pack.png`。 +- 下述说明中,**相对地址**永远指从**特定命名空间的文件夹**算起的地址,例如仓库中的`projects/1.18/assets/minecraft/minecraft/font/default.json`即为`font/default.json`。 +- 下述说明中,**目标地址**永远指分发的资源包中,该文件应当被放置的位置,例如上一条中提及的文件就是`assets/minecraft/font/default.json`。 +- 本次打包器更新以后,对于**非文本文件**无需特殊处理;打包器会将所有*未知的*拓展名按照非文本文件处理,无需特殊配置。 + - 目前而言,打包器会将`lang/`下的`.lang`和`.json`作为语言文件,其余的`.txt`, `.md`, `.json`作为普通文本文件,其余文件都作为非文本文件。
如果出现其他格式,可以后续添加——尽管这一部分没有添加显式的配置项。 + + + +## 配置文件 + +配置文件分为两类: +- 放置在`./config/packer`下的**全局**配置文件,用作整个打包流程的基础配置; +- 放置在各命名空间下的**局域**配置文件,用于对特定命名空间(以及模组)提供特殊的配置项。 + +### 文件格式 + +**全局**配置文件`./config/packer/.json`的格式如下: + +- 根标签 object + - `base` object
打包流程中的*不变配置*,不能被文件结构中的**局域配置文件**改写。包含的内容都是**不低于**命名空间层级的,因为局域配置文件就是放在命名空间一级中的。 + - `version` string
该配置文件指向的版本,以`projects/`中的文件夹名称为准。原则上*应当*与文件名中的[version]一致。 + - `targetLanguages` list
打包的目标语言,即最终在资源包中存在的语言。 + - string
目标语言,即该版本使用的语言标识符。
以在`lang`下的语言文件的文件名,以及其他文件的路径中,标明语言的部分为准。目前而言,使用的是`zh_cn`,尽管有消息称将要改用`zho_Hans-CN`。 + - `exclusionMods` list
被打包器排除的模组文件夹。
如果因为某些原因需要移除某个模组的翻译(如移交官方/其他团体等),但意图保留原有翻译,可能需要这一项。 + - string
排除的模组。 + - `exclusionNamespaces` list
被打包器排除的 **[namespace]** | **(命名空间)**。
暂时闲置,以待后续需求。 + - string
排除的命名空间。 + - `floating` object
打包流程中的*可变配置*,可能被文件结构中的**局域配置文件**改写。包含的内容都是**低于**命名空间层级的,因为局域配置文件就是放在命名空间一级中的。 + - `inclusionDomains` list
强制包含的 **[domain]**。
一般而言,用于通常不会包含**语言标识符**的`domain`。
一般而言会包含`font`与`textures`,因为这两处往往包含非文本文件(尽管也可能有文本文件),且字体修复已经需要用到这两个domain;其他内容多半会出现在*局域配置*中。 + - string
强制包含的domain名称。 + - `exclusionDomains` list
强制排除的 **[domain]**。
暂时闲置,或可用于排除一些策略相关的零散文件。 + - string
强制排除的domain名称。 + - `exclusionPaths` list
强制排除的 **[相对地址]**。 + - string
强制排除的文件的**相对地址**。
一般而言,在主配置中只会放置通用的忽略对象,例如`packer-policy.json`和`local-config.json`;其余条目最好放在*局域配置*中。 + - `inclusionPaths` list
强制包含的 **[相对地址]**。
暂时闲置,可以用于添加零散的无语言标记文件。 + - string
强制包含的文件的**相对地址**。 + - `characterReplacement` object
打包时采用的字符替换表。用于将部分字符替换至特殊位点,也可单纯用于简化输入。目前而言,包含了字体修复的有关内容。 + - `<查询语句>` string
用以替换**正则表达式**`<查询语句>`匹配对象的内容,可以是一个或多个字符,甚至可以在这里用**正则替换语句**。
主要用于*字体修复包*所需的**符号替换**,此时,查询语句通常是字面量,替换内容一般而言总是以四位*Unicode转义码*填写;对于**基础多语种平面(BMP)**以外的字符,最好用**UTF-16代理对**书写。 + - `destinationReplacement` object
打包时采用的目标地址替换。
可以用于移动文件,但暂时闲置。 + - `<查询语句>` string
用以替换**正则表达式**`<查询语句>`匹配对象的内容,可以是一个或多个字符,甚至可以在这里用**正则替换语句**。 + +**局域**配置文件`./projects//assets///local-config.json`的格式与全局配置文件中,`floating`标签下的内容(*浮动配置*)一致。 + +### 文件容斥顺序 + +介于在配置文件中出现了多种包含/排除文件的配置项,有必要说明以下这些项生效的顺序: +1. `exclusionMods`和`exclusionNamespaces`在进入命名空间前即会排除相应的文件夹——甚至不会加载其中的`local-config.json`。
当然,如果是通过*检索策略*访问的,则这一项不会生效。 +2. 在剩下的命名空间中,检索文件。下面的配置项可能会被*局域配置*修改,除了`targetLanguages`以外。 +3. 在所有检索到的文件中,排除掉`exclusionPaths`指定的文件,即便是通过*检索策略*访问的。 +4. 在剩下的文件中,直接包含`inclusionPaths`和`inclusionDomains`指定的文件。 +5. 在剩下的文件中,排除掉`exclusionDomains`指定的文件。 +6. 在剩下的文件中,仅包含由`targetLanguages`指定的,在路径中任意位置包含有*简体中文语言标记*的文件,其他文件不予保存。 + +### 局域配置文件的重写规则 + +- 如果在某个命名空间内检测到存在`local-config.json`,打包器将会在全局配置的基础上,在其*可变配置*中**添加**该文件中的内容,并用这一修改后的配置执行**该命名空间下的**检索工作。 +- 最好不要与全局配置中的内容重复。尽管理论上这样子可以运行,但是重复项保留哪一个或许不容易断定。 +- 需要注意的是,如果通过*检索策略***引用其他命名空间**,打包器**只**会加载目标命名空间的局域配置,而**不会**加载原空间的局域配置;不过,在原位进行的检索工作不受影响。 + +## 检索策略 + +对于每个**命名空间文件夹**(注意这个概念和**命名空间**有着细微差别),打包器除了可以原位检索文件以外,还可以**使用不同的检索方式**。目前,可用的检索方式有两种: +1. **引用**给定的命名空间。 +2. 从给定的**组合**文件,直接生成语言文件(或部分)。 + +计划中,将对*非语言文件的文本文件*添加一个**修改包**策略,但是这个策略暂时还没实现,部分原因是在上一版打包器中,这个策略还没被用过。 + +单独看起来,这或许没什么用(Packer的上一版中,功能还要多些);但有一点很重要: +这些加载策略(包括**原位**加载)是可以**串联**、**递归**的!于是,通过这三种策略,应该可以满足许多需求。 + +- **串联**:在一个策略文件中,可以放置**多条策略**。策略将会从前往后执行,**前者**优先——和*Minecraft资源包*顺序差不多。不过,如果有需要,在策略文件中也预留了一个字段,用来**覆盖**前序文件。 +- **递归**:如果**引用**了其他命名空间文件夹,那里的策略文件**也会生效**。这意味着可以实现*连续引用*——尽管前提是不出现**循环引用**。 + +部分案例被放在了`./projects/packer-example/`这一虚拟的“版本”下。很明显,我们**并不会**分发这一版本,但如果有条件,可以在本地构造打包器,并用这一版本做试验。 + +### 策略相关文件的格式 + +#### packer-policy.json + +对于每个**命名空间文件夹**,策略文件为`./projects//assets///packer-policy.json`。 +若找不到该策略,默认策略文件内容为`[{"type": "direct"}]`。 + +- 根标签 list
打包器需要执行的策略,**从前往后执行**。如果有冲突内容,默认以**前者**优先——当然这是可以配置的。 + - object
单项策略。部分参数可变。 + - `overrides` bool
是否可以用本步的文件覆盖前序文件。如果无此项,默认为`false`。
关于这里的“覆盖”,对于**非语言文件**(不在`lang\`下),指的是**全文**覆盖;对于**语言文件**,则是**按条目**覆盖。 + - `type` string
策略的类型。可为以下选项之一: + - `direct` 默认选项。不进行特殊处理,直接按照此处的文件结构打包。 + - `indirect` 引用给定的命名空间。对于这些文件,其*目标地址*中的*命名空间*将会自动替换为本策略所在的命名空间。 + - `source` string
引用命名空间所在文件夹的**完整地址**。 + - `composition`
从给定的*组合文件*,直接生成语言文件(或部分)。
这些组合文件可能不会被自动排除;可以考虑使用*局域配置*处理。 + - `source` string
引用组合文件的**完整位置**。 + - `destType` string
需要生成的语言文件的类型。可以为`json`或`lang`。 + +#### [组合文件].json + +- 根标签 object + - `target` string
生成的语言文件的**目标地址**。 + * `entries` list
需要生成的组合项。这些项将会分别执行组合以后,连接起来。
**如果存在键冲突,打包器会在此崩溃!**有计划在后期更改这一行为。 + * object
单项策略。 + * `templates` object
组合所用的模板。所有内容采用**C#格式化模式**填写。
粗略地说,其中的格式符有形式`{0}, {1}, {2},...`;完整的定义可见 *.net文档*。 + - `<键模板>` string
`<键模板>`对应的值模板。 + * `parameters` list
组合所用的参数表。参数按照模板中的**索引**顺序排列。不支持嵌套,必须字面量。 + * object
每个索引位置上可用的参数。 + - `<键参数>` string
`<键参数>`对应的值参数。 + +### 组合文件 + +组合文件用来生成“组合型”的**语言文件/语言文件片段**,也就是那些有大量重复文本、有明显的格式的语言文件片段。 +组合文件的工作原理如下: +1. 获取`entries`中的全部条目,每个条目代表一种组合模式。 +2. 每个条目中,由`templates`中的所有条目充当模板,`parameters`中的所有条目充当参数,生成若干组合后的条目。 + - 在`parameter`中,有时会出现多于一组参数;这种情况下,每组参数都会自由组合。 + - 同样的,`templates`也会和每一套参数自由组合。 +3. 将所有组合后的条目汇总,生成语言文件。 + - 在这一过程中,如果出现了**键冲突**,目前而言,**打包器会在此崩溃!**不过,如果后续观察表明确实存在此种需要,也会考虑修改这一行为。 + +组合文件可以和其他打包策略混合使用,以修改组合中效果不好的部分,或者添加非组合的内容。 + +组合文件理论上可以放在任何位置,使用任何名称;因此,打包器的*基础配置*没有办法排除掉这些文件。不过,为了方便,最好将其汇总在一个位置,采用明确的名称,以便在*局域配置*中排除。 \ No newline at end of file diff --git a/Packer-Index-Doc.md b/Packer-Index-Doc.md deleted file mode 100644 index a0b3fb281a60..000000000000 --- a/Packer-Index-Doc.md +++ /dev/null @@ -1,32 +0,0 @@ -# 打包机制-自定义文件检索策略 - -本仓库的打包器支持对不同模组使用不同的**检索策略**。 -## 注意事项 -- 检索策略仅对**未配置为跳过处理**的文件有正常行为。在`clonemissing`和`backport`下,目前而言,**跳过处理的文件**均优先取**既有文件**;在`patch`下,目前**并不**支持对**跳过处理的文件**添加修改包。 - - 既有的全局配置中,在`font/`和`textures/`下的文件全部**跳过处理**,即便是文本文件。 - - 关于全局配置中的跳过选项,详见[此处](./CONTRIBUTING.md#packer)。 -- 目前而言,`patch`策略还不支持递归调用。`noaction`显然没有递归之忧。对于其他选项,打包器支持**递归调用**:对其他目录的引用可以包含其中的`packer-policy.json`;打包器可以在该目录建立新的**自定义检索策略**。 - - 如果遇到**循环引用**,打包器可能不会自动中止,而是持续运行,直到*栈溢出*;应当尽量避免这一情况的发生。 - -## 策略配置 - -对于每个**asset-domain**,策略文件为`./projects//assets///packer-policy.json`。 -若找不到该策略,默认策略文件为`{"type": "noaction"}`。 - -### 策略文件的格式 - -packer-policy.json - -- 根标签 - - `type` string -> 策略的类型。可为以下选项之一: - - `noaction` 默认选项。不进行特殊处理,直接按照此处的文件结构打包。如果没有对文件同步或版本对照的特殊要求,使用该类型。如:[示例文件](./projects/1.19/assets/0-example-nop/nop/packer-policy.json) - - `plainclone` 直接引用另一位置的文件结构。如果需要文本完全同步,使用该类型。如:[示例文件](./projects/1.19/assets/0-example-simple-clone/clone/packer-policy.json) - - `source` string -> 复制的源地址。需要从本仓库的根目录开始计算,使用`./`前缀。 - - `clonemissing` 使用此处的文件结构,但在检索完文件后,根据另一位置的文件结构**补充**文本。对于出现冲突的条目,若为`lang/`下的内容,将会按照`key`合并,冲突项采用此处的文本;若为其他位置的文件,直接采用此处的文件。如:[示例文件](./projects/1.19/assets/0-example-mixed-clone/mixed-clone/packer-policy.json) - - `source` string -> 补充文件的源地址。需要从本仓库的根目录开始计算,使用`./`前缀。 - - `backport` 使用此处的文件结构,但在此基础上,从另一位置的文件结构**更新**已有的文本。对于`lang/`下的内容,仅会对已有的`key`更新内容,原本不存在的`key`不会新增;对于其他位置的文件,仅会对已有的文件进行替换,原本不存在的文件不会新增。例如,如果需要从高版本将文件同步至低版本,使用该类型。如:[示例文件](./projects/1.19/assets/0-example-port/port/packer-policy.json) - - `source` string -> 更新文件的源地址。需要从本仓库的根目录开始计算,使用`./`前缀。 - - `patch` 引用另一位置的文件结构,但在其中的部分文件上额外应用自定义的修改。修改使用[Google Diff-Match-Patch算法](https://github.com/google/diff-match-patch)生成;尽管原则上可以放在任意位置、采用任意后缀名,建议将修改文件放在被修改文件相应的位置,采用`.patch`后缀,以保持统一性。如:[示例文件](./projects/1.19/assets/0-example-patch/patch/packer-policy.json) - - `source` string -> 复制的源地址。需要从本仓库的根目录开始计算,使用`./`前缀。 - - `patches` object -> 修改文件,以及对应的修改目标。 - - `修改目标的相对路径` string -> 修改文件的源地址。需要从本仓库的根目录开始计算,使用`./`前缀;`修改目标的相对路径`需要为在复制源地址的`/`下方的相对位置,必须使用`/`作为分隔符,如`lang/zh_cn.json`。 diff --git a/config/packer/1.20-fabric.json b/config/packer/1.20-fabric.json index a9b6e91752cb..072d278bdaa2 100644 --- a/config/packer/1.20-fabric.json +++ b/config/packer/1.20-fabric.json @@ -1,37 +1,42 @@ { - "targetVersion": "1.20-fabric", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.md" - ], - "modNameBlackList": [], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ], - "replacementMap": { - "[[钅卢]]": "\ud872\udf3b", - "[[钅杜]]": "\ud872\udf4a", - "[[钅喜]]": "\ud872\udf73", - "[[钅波]]": "\ud872\udf5b", - "[[钅黑]]": "\ud872\udf76", - "[[钅麦]]": "\u9fcf", - "[[钅达]]": "\ud86d\udffc", - "[[钅仑]]": "\ud872\udf2d", - "[[钅哥]]": "\u9fd4", - "[[钅尔]]": "\u9fed", - "[[钅夫]]": "\ud86d\udce7", - "[[钅立]]": "\ud86d\udff7", - "[[石田]]": "\u9fec", - "[[奥气]]": "\u9feb", - "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef", - "——": "\u2e3f" + "base": { + "version": "1.20-fabric", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [], + "exclusionNamespaces": [] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [], + "characterReplacement": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + }, + "destinationReplacement": {} } } \ No newline at end of file diff --git a/config/packer/1.20.json b/config/packer/1.20.json index a889b47239d2..8cf5760bd3f0 100644 --- a/config/packer/1.20.json +++ b/config/packer/1.20.json @@ -1,37 +1,42 @@ { - "targetVersion": "1.20", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.md" - ], - "modNameBlackList": [], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ], - "replacementMap": { - "[[钅卢]]": "\ud872\udf3b", - "[[钅杜]]": "\ud872\udf4a", - "[[钅喜]]": "\ud872\udf73", - "[[钅波]]": "\ud872\udf5b", - "[[钅黑]]": "\ud872\udf76", - "[[钅麦]]": "\u9fcf", - "[[钅达]]": "\ud86d\udffc", - "[[钅仑]]": "\ud872\udf2d", - "[[钅哥]]": "\u9fd4", - "[[钅尔]]": "\u9fed", - "[[钅夫]]": "\ud86d\udce7", - "[[钅立]]": "\ud86d\udff7", - "[[石田]]": "\u9fec", - "[[奥气]]": "\u9feb", - "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef", - "——": "\u2e3f" + "base": { + "version": "1.20", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [], + "exclusionNamespaces": [] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [], + "characterReplacement": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + }, + "destinationReplacement": {} } } \ No newline at end of file diff --git a/config/packer/packer-example.json b/config/packer/packer-example.json new file mode 100644 index 000000000000..47b31e97788e --- /dev/null +++ b/config/packer/packer-example.json @@ -0,0 +1,30 @@ +{ + "base": { + "version": "packer-example", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [], + "exclusionNamespaces": [] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [ + "other.txt" + ], + "characterReplacement": { + "[[TEMPLATE]]": "[[REPALCEMENT]]" + }, + "destinationReplacement": { + "[[TEMPLATE]]": "[[REPALCEMENT]]" + } + } +} \ No newline at end of file diff --git a/projects/1.19/assets/0-example-mixed-clone/mixed-clone/extra/extra.txt b/projects/1.19/assets/0-example-mixed-clone/mixed-clone/extra/extra.txt deleted file mode 100644 index ce7a60f9fb91..000000000000 --- a/projects/1.19/assets/0-example-mixed-clone/mixed-clone/extra/extra.txt +++ /dev/null @@ -1 +0,0 @@ -exexe exexe \ No newline at end of file diff --git a/projects/1.19/assets/0-example-mixed-clone/mixed-clone/lang/zh_cn.json b/projects/1.19/assets/0-example-mixed-clone/mixed-clone/lang/zh_cn.json deleted file mode 100644 index e8b9d44b06fb..000000000000 --- a/projects/1.19/assets/0-example-mixed-clone/mixed-clone/lang/zh_cn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key1": "new value 1", - "key3": "new value 3" -} \ No newline at end of file diff --git a/projects/1.19/assets/0-example-mixed-clone/mixed-clone/packer-policy.json b/projects/1.19/assets/0-example-mixed-clone/mixed-clone/packer-policy.json deleted file mode 100644 index dcfd344d8dfc..000000000000 --- a/projects/1.19/assets/0-example-mixed-clone/mixed-clone/packer-policy.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "clonemissing", - "source": "./projects/1.19/assets/0-example-nop/nop" -} \ No newline at end of file diff --git a/projects/1.19/assets/0-example-nop/nop/lang/zh_cn.json b/projects/1.19/assets/0-example-nop/nop/lang/zh_cn.json deleted file mode 100644 index 9b24d09faca1..000000000000 --- a/projects/1.19/assets/0-example-nop/nop/lang/zh_cn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key1": "value1", - "key2": "value2" -} \ No newline at end of file diff --git a/projects/1.19/assets/0-example-nop/nop/packer-policy.json b/projects/1.19/assets/0-example-nop/nop/packer-policy.json deleted file mode 100644 index e6043069e4d8..000000000000 --- a/projects/1.19/assets/0-example-nop/nop/packer-policy.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "noaction" -} \ No newline at end of file diff --git a/projects/1.19/assets/0-example-patch/patch/lang/zh_cn.json.patch b/projects/1.19/assets/0-example-patch/patch/lang/zh_cn.json.patch deleted file mode 100644 index 831d1cf538b4..000000000000 --- a/projects/1.19/assets/0-example-patch/patch/lang/zh_cn.json.patch +++ /dev/null @@ -1,14 +0,0 @@ -@@ -4,24 +4,28 @@ - %22key1%22: %22 -+new - value1%22,%0A -@@ -33,18 +33,22 @@ - %22key --2 -+3 - %22: %22 -+new - value --2 -+3 - %22%0A%7D \ No newline at end of file diff --git a/projects/1.19/assets/0-example-patch/patch/packer-policy.json b/projects/1.19/assets/0-example-patch/patch/packer-policy.json deleted file mode 100644 index a75e14b615d8..000000000000 --- a/projects/1.19/assets/0-example-patch/patch/packer-policy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "source": "./projects/1.19/assets/0-example-nop/nop", - "patches": { - "lang/zh_cn.json": "./projects/1.19/assets/0-example-patch/patch/lang/zh_cn.json.patch" - } -} \ No newline at end of file diff --git a/projects/1.19/assets/0-example-port/port/lang/zh_cn.json b/projects/1.19/assets/0-example-port/port/lang/zh_cn.json deleted file mode 100644 index 245d5df201df..000000000000 --- a/projects/1.19/assets/0-example-port/port/lang/zh_cn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key1": "value1", - "key4": "value4" -} \ No newline at end of file diff --git a/projects/1.19/assets/0-example-port/port/packer-policy.json b/projects/1.19/assets/0-example-port/port/packer-policy.json deleted file mode 100644 index 422748cc0dcf..000000000000 --- a/projects/1.19/assets/0-example-port/port/packer-policy.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "backport", - "source": "./projects/1.19/assets/0-example-mixed-clone/mixed-clone" -} \ No newline at end of file diff --git a/projects/1.19/assets/0-example-simple-clone/clone/packer-policy.json b/projects/1.19/assets/0-example-simple-clone/clone/packer-policy.json deleted file mode 100644 index df2d5f484bc6..000000000000 --- a/projects/1.19/assets/0-example-simple-clone/clone/packer-policy.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "plainclone", - "source": "./projects/1.19/assets/0-example-nop/nop" -} \ No newline at end of file diff --git a/projects/1.20-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.20-fabric/assets/minecraft/minecraft/packer-policy.json index 75b22dfd6411..a0802b736d3f 100644 --- a/projects/1.20-fabric/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.20-fabric/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.16/assets/minecraft/minecraft" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.20/assets/minecraft/minecraft" + } +] \ No newline at end of file diff --git a/projects/1.20-fabric/pack.mcmeta b/projects/1.20-fabric/pack.mcmeta index e05fae8f9262..bce9c05f5259 100644 --- a/projects/1.20-fabric/pack.mcmeta +++ b/projects/1.20-fabric/pack.mcmeta @@ -1,6 +1,6 @@ -{ - "pack": { +{{ + "pack": {{ "pack_format": 15, - "description": "汉化万用包,仅供1.20.1Fabric使用" - } -} \ No newline at end of file + "description": "汉化万用包,仅供1.20.1Fabric使用/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} \ No newline at end of file diff --git a/projects/1.20/pack.mcmeta b/projects/1.20/pack.mcmeta index 1f2b80f1586a..b50bb96ae784 100644 --- a/projects/1.20/pack.mcmeta +++ b/projects/1.20/pack.mcmeta @@ -1,6 +1,6 @@ -{ - "pack": { +{{ + "pack": {{ "pack_format": 15, - "description": "汉化万用包,仅供1.20.1Forge使用" - } -} \ No newline at end of file + "description": "汉化万用包,仅供1.20.1Forge使用/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} \ No newline at end of file diff --git a/projects/packer-example/README.txt b/projects/packer-example/README.txt new file mode 100644 index 000000000000..08e00ed29169 --- /dev/null +++ b/projects/packer-example/README.txt @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/projects/packer-example/assets/example-composite/composite/lang/zh_cn.json b/projects/packer-example/assets/example-composite/composite/lang/zh_cn.json new file mode 100644 index 000000000000..1d7f3709db82 --- /dev/null +++ b/projects/packer-example/assets/example-composite/composite/lang/zh_cn.json @@ -0,0 +1,4 @@ +{ + "key3": "new value3", + "key_7_9": "new value_7_9" +} \ No newline at end of file diff --git a/projects/packer-example/assets/example-composite/composite/other.txt b/projects/packer-example/assets/example-composite/composite/other.txt new file mode 100644 index 000000000000..38f438fea794 --- /dev/null +++ b/projects/packer-example/assets/example-composite/composite/other.txt @@ -0,0 +1 @@ +////////////REPLACEMENT//////////// \ No newline at end of file diff --git a/projects/packer-example/assets/example-composite/composite/packer-policy.json b/projects/packer-example/assets/example-composite/composite/packer-policy.json new file mode 100644 index 000000000000..b6c48de2a6df --- /dev/null +++ b/projects/packer-example/assets/example-composite/composite/packer-policy.json @@ -0,0 +1,13 @@ +[ + { + "type": "direct" + }, + { + "type": "indirect", + "source": "projects/packer-example/assets/example-indirect/indirect" + }, + { + "type": "indirect", + "source": "projects/packer-example/assets/example-composition/composition" + } +] \ No newline at end of file diff --git a/projects/packer-example/assets/example-composition/composition/compositions/zh_cn.json-composition.json b/projects/packer-example/assets/example-composition/composition/compositions/zh_cn.json-composition.json new file mode 100644 index 000000000000..fea771c361ea --- /dev/null +++ b/projects/packer-example/assets/example-composition/composition/compositions/zh_cn.json-composition.json @@ -0,0 +1,37 @@ +{ + "target": "assets/composition/lang/zh_cn.json", + "entries": [ + { + "templates": { + "key_{0}_{1}": "value_{0}_{1}", + "altkey_{0}_{1}": "altvalue_{0}_{1}" + }, + "parameters": [ + { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9" + }, + { + "00": "00", + "01": "01", + "02": "02", + "03": "03", + "04": "04", + "05": "05", + "06": "06", + "07": "07", + "08": "08", + "09": "09" + } + ] + } + ] +} \ No newline at end of file diff --git a/projects/packer-example/assets/example-composition/composition/local-config.json b/projects/packer-example/assets/example-composition/composition/local-config.json new file mode 100644 index 000000000000..3670d611ac56 --- /dev/null +++ b/projects/packer-example/assets/example-composition/composition/local-config.json @@ -0,0 +1,10 @@ +{ + "inclusionDomains": [], + "exclusionDomains": [ + "compositions" + ], + "exclusionPaths": [], + "inclusionPaths": [], + "characterReplacement": {}, + "destinationReplacement": {} +} \ No newline at end of file diff --git a/projects/packer-example/assets/example-composition/composition/packer-policy.json b/projects/packer-example/assets/example-composition/composition/packer-policy.json new file mode 100644 index 000000000000..3d360165b4c2 --- /dev/null +++ b/projects/packer-example/assets/example-composition/composition/packer-policy.json @@ -0,0 +1,7 @@ +[ + { + "type": "composition", + "destType": "json", + "source": "projects/packer-example/assets/example-composition/composition/compositions/zh_cn.json-composition.json" + } +] \ No newline at end of file diff --git a/projects/packer-example/assets/example-direct/direct/lang/en_us.json b/projects/packer-example/assets/example-direct/direct/lang/en_us.json new file mode 100644 index 000000000000..6ccb0f975d80 --- /dev/null +++ b/projects/packer-example/assets/example-direct/direct/lang/en_us.json @@ -0,0 +1,20 @@ +{ + "key1": "ununvalue1", + "key2": "ununvalue2", + "key3": "ununvalue3", + "key4": "ununvalue4", + "key5": "ununvalue5", + "key6": "ununvalue6", + "key7": "ununvalue7", + "key8": "ununvalue8", + "key9": "ununvalue9", + "key10": "ununvalue10", + "key11": "ununvalue11", + "key12": "ununvalue12", + "key13": "ununvalue13", + "key14": "ununvalue14", + "key15": "ununvalue15", + "key16": "ununvalue16", + "key17": "ununvalue17", + "key18": "ununvalue18" +} \ No newline at end of file diff --git a/projects/packer-example/assets/example-direct/direct/lang/zh_cn.json b/projects/packer-example/assets/example-direct/direct/lang/zh_cn.json new file mode 100644 index 000000000000..7942577b11d5 --- /dev/null +++ b/projects/packer-example/assets/example-direct/direct/lang/zh_cn.json @@ -0,0 +1,20 @@ +{ + "key1": "value1", + "key2": "value2", + "key3": "value3", + "key4": "value4", + "key5": "value5", + "key6": "value6", + "key7": "value7", + "key8": "value8", + "key9": "value9", + "key10": "value10", + "key11": "value11", + "key12": "value12", + "key13": "value13", + "key14": "value14", + "key15": "value15", + "key16": "value16", + "key17": "value17", + "key18": "value18" +} \ No newline at end of file diff --git a/projects/packer-example/assets/example-direct/direct/other.txt b/projects/packer-example/assets/example-direct/direct/other.txt new file mode 100644 index 000000000000..08e00ed29169 --- /dev/null +++ b/projects/packer-example/assets/example-direct/direct/other.txt @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/projects/packer-example/assets/example-indirect/indirect/packer-policy.json b/projects/packer-example/assets/example-indirect/indirect/packer-policy.json new file mode 100644 index 000000000000..164b89d90ca6 --- /dev/null +++ b/projects/packer-example/assets/example-indirect/indirect/packer-policy.json @@ -0,0 +1,6 @@ +[ + { + "type": "indirect", + "source": "projects/packer-example/assets/example-direct/direct" + } +] \ No newline at end of file diff --git a/projects/packer-example/pack.mcmeta b/projects/packer-example/pack.mcmeta new file mode 100644 index 000000000000..c3b7467d5a17 --- /dev/null +++ b/projects/packer-example/pack.mcmeta @@ -0,0 +1,6 @@ +{{ + "pack": {{ + "pack_format": 2147483647, + "description": "演示用包,不用于分发/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} \ No newline at end of file diff --git a/src/Packer/Extensions/ContentExtension.cs b/src/Packer/Extensions/ContentExtension.cs index bac9be751178..811ff75f676a 100644 --- a/src/Packer/Extensions/ContentExtension.cs +++ b/src/Packer/Extensions/ContentExtension.cs @@ -1,4 +1,5 @@ -using System; +using Serilog; +using System; using System.IO; using System.Linq; using System.Security.Cryptography; diff --git a/src/Packer/Extensions/DirectoryExtension.cs b/src/Packer/Extensions/DirectoryExtension.cs index 0eb484ba9ff0..0fcabea233ce 100644 --- a/src/Packer/Extensions/DirectoryExtension.cs +++ b/src/Packer/Extensions/DirectoryExtension.cs @@ -1,5 +1,6 @@ using Packer.Models; using Packer.Models.Providers; +using Serilog; using System; using System.Collections.Generic; using System.IO; @@ -71,20 +72,20 @@ internal static EvaluatorReturnType FromCurrentDirectory(DirectoryInfo namespace { var floatingConfig = Utils.RetrieveLocalConfig(namespaceDirectory); var localConfig = config.Modify(floatingConfig); - + return from candidate in namespaceDirectory.EnumerateFiles("*", SearchOption.AllDirectories) let relativePath = Path.GetRelativePath(namespaceDirectory.FullName, candidate.FullName) .NormalizePath() - let destination = Path.Combine(namespaceDirectory.Name, - relativePath) + let fullPath = Path.GetRelativePath(".", candidate.FullName) + let destination = Path.Combine( + "assets", namespaceDirectory.Name, relativePath) .NormalizePath() - let domain = relativePath.Split('/')[0] where !relativePath.IsPathForceExcluded(localConfig) // [1] 排除路径 -- packer-policy等 where (relativePath.IsPathForceIncluded(localConfig) // [2] 包含路径 [单列] || relativePath.IsDomainForceIncluded(localConfig) // [3] 包含domain -- font/ textures/ || (destination.IsInTargetLanguage(localConfig) // [4] 语言标记 -- 含zh_cn的 - && relativePath.IsDomainForceExcluded(localConfig))) // [5] 排除domain [暂无] + && !relativePath.IsDomainForceExcluded(localConfig))) // [5] 排除domain [暂无] let provider = CreateProviderFromFile(candidate, destination, localConfig) select (provider, DoesOverride(parameters)); } @@ -99,7 +100,7 @@ internal static EvaluatorReturnType FromSpecifiedDirectory(DirectoryInfo namespa return from candidate in redirectDirectory.EnumerateRawProviders(config) let provider = candidate.provider - .ReplaceDestination(@"^(?<=^assets/)[^/]*(?=/)", + .ReplaceDestination(@"(?<=^assets/)[^/]*(?=/)", namespaceName) select (provider, DoesOverride(parameters)); } @@ -109,7 +110,7 @@ internal static EvaluatorReturnType FromComposition(DirectoryInfo namespaceDirec ParameterType? parameters) { var compositionPath = parameters!["source"].GetString(); - var type = parameters["type"].GetString(); + var type = parameters["destType"].GetString(); var compositionFile = new FileInfo(compositionPath!); IResourceFileProvider provider = type switch // 类型推断不出要用接口 { @@ -124,19 +125,20 @@ internal static EvaluatorReturnType FromComposition(DirectoryInfo namespaceDirec internal static IResourceFileProvider CreateProviderFromFile(FileInfo file, string destination, Config config) { var extension = file.Extension; - return file.Directory!.Name == "lang" - ? extension switch - { - ".json" => JsonMappingHelper.CreateFromFile(file, destination), - ".lang" => JsonMappingHelper.CreateFromFile(file, destination), - _ => throw new InvalidOperationException($"Invalid Type of Language File at {file.FullName}.") - } - : extension switch + if (file.Directory!.Name == "lang") + { + switch(extension) { - // 已知的文本文件类型 - ".txt" or ".json" or ".md" => TextFile.Create(file, destination), - _ => new RawFile(file, destination) + case ".json": return JsonMappingHelper.CreateFromFile(file, destination); + case ".lang": return LangMappingHelper.CreateFromFile(file, destination); }; + } + return extension switch + { + // 已知的文本文件类型 + ".txt" or ".json" or ".md" => TextFile.Create(file, destination), + _ => new RawFile(file, destination) + }; } internal static bool DoesOverride(ParameterType? parameters) diff --git a/src/Packer/Models/Config.cs b/src/Packer/Models/Config.cs index c19c488b175f..45aeb8bf2b31 100644 --- a/src/Packer/Models/Config.cs +++ b/src/Packer/Models/Config.cs @@ -1,13 +1,15 @@ using System.Collections.Generic; using System.Linq; -using System.Text.Json.Serialization; + +// 要null就抛异常吧(逃) +#nullable disable namespace Packer { /// /// 配置项 /// - public struct Config + public class Config { /// /// 基础配置,版本唯一 @@ -23,12 +25,11 @@ public struct Config /// public Config Modify(FloatingConfig? floatingConfig) { - // 好家伙 这玩意还是个Nullable - if (!floatingConfig.HasValue) return this; + if (floatingConfig is null) return this; return new() { Base = Base, - Floating = Floating.Merge(floatingConfig.Value) + Floating = Floating.Merge(floatingConfig) }; } } @@ -36,7 +37,7 @@ public Config Modify(FloatingConfig? floatingConfig) /// /// 基础配置,版本唯一 /// - public struct BaseConfig + public class BaseConfig { /// /// 打包的目标版本 @@ -62,7 +63,7 @@ public struct BaseConfig /// /// 浮动配置,可与命名空间下的文件合并 /// - public struct FloatingConfig + public class FloatingConfig { /// /// 强制包含的domain @@ -84,7 +85,7 @@ public struct FloatingConfig /// /// 文本字符替换表 /// - public Dictionary CharatcerReplacement { get; set; } + public Dictionary CharacterReplacement { get; set; } /// /// 内容替换表 /// @@ -99,7 +100,7 @@ public struct FloatingConfig ExclusionDomains = ExclusionDomains.Concat(other.ExclusionDomains).Distinct(), InclusionDomains = InclusionDomains.Concat(other.InclusionDomains).Distinct(), InclusionPaths = InclusionPaths.Concat(other.InclusionPaths).Distinct(), - CharatcerReplacement = CharatcerReplacement.Concat(other.CharatcerReplacement).DistinctBy(_ => _.Key) + CharacterReplacement = CharacterReplacement.Concat(other.CharacterReplacement).DistinctBy(_ => _.Key) .ToDictionary(_ => _.Key, _ => _.Value), DestinationReplacement = DestinationReplacement.Concat(other.DestinationReplacement).DistinctBy(_ => _.Key) .ToDictionary(_ => _.Key, _ => _.Value) diff --git a/src/Packer/Models/Providers/CompositionHelper.cs b/src/Packer/Models/Providers/CompositionHelper.cs index 5fed86a38e78..704bf65fd1a3 100644 --- a/src/Packer/Models/Providers/CompositionHelper.cs +++ b/src/Packer/Models/Providers/CompositionHelper.cs @@ -63,7 +63,8 @@ from template in templates internal static IEnumerable, IEnumerable>> CrossMap(this IEnumerable>> origin) => origin.Aggregate( - seed: Enumerable.Empty, IEnumerable>>(), + seed: new[] { KeyValuePair.Create(Enumerable.Empty(), Enumerable.Empty()) } + as IEnumerable, IEnumerable>>, // 这都需要手写... (accumulate, next) => from incomingPair in next join existingGroup in accumulate on true equals true select KeyValuePair.Create( diff --git a/src/Packer/Models/Providers/McMetaProvider.cs b/src/Packer/Models/Providers/McMetaProvider.cs index c6dcab9b8e50..a0616ebec22d 100644 --- a/src/Packer/Models/Providers/McMetaProvider.cs +++ b/src/Packer/Models/Providers/McMetaProvider.cs @@ -49,7 +49,7 @@ public override async Task WriteToArchive(ZipArchive archive) using var writer = new StreamWriter( archive.CreateEntry(destination) .Open(), - Encoding.UTF8); + new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); await writer.WriteAsync(content); } } diff --git a/src/Packer/Models/Providers/TermMappingProvider.cs b/src/Packer/Models/Providers/TermMappingProvider.cs index 3dcac7a057ed..13ebf32577dc 100644 --- a/src/Packer/Models/Providers/TermMappingProvider.cs +++ b/src/Packer/Models/Providers/TermMappingProvider.cs @@ -144,14 +144,15 @@ public TermMappingProvider(ITermDictionary map, string destination) /// public IResourceFileProvider ApplyTo(IResourceFileProvider? incoming, bool overrideExisting = false) { - if (incoming is not TermMappingProvider) + if (incoming is null) return this; + if (incoming is not TermMappingProvider inProvider) throw new ArgumentException($"Argument not an instance of {typeof(TermMappingProvider)}.", nameof(incoming)); - var inProvider = incoming as TermMappingProvider; + //var inProvider = incoming as TermMappingProvider; - if (inProvider is null) throw new ArgumentNullException(nameof(incoming)); + //if (inProvider is null) throw new ArgumentNullException(nameof(incoming)); - var (baseMap, inMap) = !overrideExisting + var (baseMap, inMap) = overrideExisting ? (Map, inProvider.Map) : (inProvider.Map, Map); // 交换顺序 @@ -189,7 +190,7 @@ public async Task WriteToArchive(ZipArchive archive) using var writer = new StreamWriter( archive.CreateEntry(destination) .Open(), - Encoding.UTF8); + new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); await writer.WriteAsync(Map.ProvideStringContent()); } } diff --git a/src/Packer/Models/Providers/TextFile.cs b/src/Packer/Models/Providers/TextFile.cs index 408e1add8c63..c6207b5a5323 100644 --- a/src/Packer/Models/Providers/TextFile.cs +++ b/src/Packer/Models/Providers/TextFile.cs @@ -54,7 +54,7 @@ public virtual IResourceFileProvider ReplaceContent(string searchPattern, string searchPattern, replacement, RegexOptions.Singleline), - Content); + Destination); /// public virtual IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) => new TextFile(Content, @@ -73,7 +73,7 @@ public virtual async Task WriteToArchive(ZipArchive archive) using var writer = new StreamWriter( archive.CreateEntry(destination) .Open(), - Encoding.UTF8); + new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); await writer.WriteAsync(Content); } } diff --git a/src/Packer/Program.cs b/src/Packer/Program.cs index 777b8305d36f..1f819dd467ff 100644 --- a/src/Packer/Program.cs +++ b/src/Packer/Program.cs @@ -25,14 +25,14 @@ public static async Task Main(string version, string[]? targets) var config = await Utils.RetrieveConfig(configTemplate: "./config/packer/{0}.json", version: version); - Log.Information("开始对版本 {0} 的打包", config.Base.Version); var query = // 这就是查询表达式吗( from modDirectory in new DirectoryInfo($"./projects/{config.Base.Version}/assets") .EnumerateDirectories() let modIdentifier = modDirectory.Name - where targetModIdentifiers is null // 未提供列表,全部打包 + where targetModIdentifiers is null + || targetModIdentifiers.Count() == 0 // 未提供列表,全部打包 || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 where !config.Base.ExclusionMods.Contains(modIdentifier) // 没有被明确排除 from namespaceDirectory in modDirectory.EnumerateDirectories() @@ -47,7 +47,7 @@ select destinationGroup => next.ApplyTo( accumulate, overrideExisting: false)) into provider - select config.Floating.CharatcerReplacement // 内容的字符替换 + select config.Floating.CharacterReplacement // 内容的字符替换 .Aggregate(seed: provider, (accumulate, replacement) => accumulate.ReplaceContent( @@ -56,11 +56,10 @@ select config.Floating.CharatcerReplacement // 内容的 select config.Floating.DestinationReplacement // 全局路径替换:预留 .Aggregate(seed: provider, (accumulate, replacement) - => accumulate.ReplaceContent( + => accumulate.ReplaceDestination( replacement.Key, replacement.Value)); - var initialsQuery = from file in new DirectoryInfo($"./projects/{config.Base.Version}") .EnumerateFiles() select (file.Name == "pack.mcmeta") @@ -76,8 +75,9 @@ await Task.WhenAll(from provider in query.Concat(initialsQuery) select provider.WriteToArchive(archive)); } - Log.Information("对版本 {0} 的打包结束。共写入了 {1} 个文件", + Log.Information("对版本 {0} 的打包结束。共写入了 {1} + {2} 个文件", config.Base.Version, + initialsQuery.Count(), query.Count()); var md5 = stream.ComputeMD5(); diff --git a/src/Packer/Utils.cs b/src/Packer/Utils.cs index 4b980619a184..38beb8a4cd3a 100644 --- a/src/Packer/Utils.cs +++ b/src/Packer/Utils.cs @@ -50,7 +50,7 @@ public static async Task RetrieveConfig(string configTemplate, string ve var content = await File.ReadAllBytesAsync(configPath); return JsonSerializer.Deserialize( content, - new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase })!; } /// @@ -74,6 +74,7 @@ public static List RetrieveStrategy(DirectoryInfo directory) reader.ReadToEnd(), new JsonSerializerOptions { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } }); if (result is null) From 65235f33e8dd3180b10c70a460a15394f0bd57b4 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Sun, 1 Oct 2023 23:11:35 +0800 Subject: [PATCH 23/25] Migration Phase II --- config/packer/1.12.2.json | 75 ++++++----- config/packer/1.16-fabric.json | 73 ++++++----- config/packer/1.16.json | 74 ++++++----- config/packer/1.18-fabric.json | 77 ++++++----- config/packer/1.18.json | 83 ++++++------ config/packer/1.19.json | 79 ++++++----- .../thebetweenlands/lang/zh_cn.lang | 1 - .../chinjufumod/chinjufumod/lang/zh_cn.lang | 2 - .../assets/rftools/rftools/lang/zh_cn.lang | 2 +- .../tinkerscompendium/lang/zh_cn.lang | 4 +- projects/1.12.2/pack.mcmeta | 10 +- .../cloth-config2/packer-policy.json | 7 +- .../ironfurnaces/packer-policy.json | 10 +- .../minecraft/minecraft/packer-policy.json | 8 +- projects/1.16-fabric/pack.mcmeta | 10 +- .../alexs-mobs/alexsmobs/local-config.json | 10 ++ .../corail_recycler/packer-policy.json | 7 +- .../craftingtweaks/packer-policy.json | 11 +- .../assets/laser-mod/lasermod/lang/zh_cn.json | 2 +- .../tool-kit/toolkit/packer-policy.json | 7 +- projects/1.16/pack.mcmeta | 10 +- .../cloth-config2/packer-policy.json | 7 +- .../exlinecopperequipment/packer-policy.json | 7 +- .../assets/goodall/goodall/packer-policy.json | 5 +- .../ironfurnaces/packer-policy.json | 10 +- .../assets/jei/jei/packer-policy.json | 10 +- .../minecraft/minecraft/packer-policy.json | 10 +- .../opulence/opulence/packer-policy.json | 10 +- .../rottencreatures/packer-policy.json | 6 +- projects/1.18-fabric/pack.mcmeta | 12 +- .../craftingtweaks/packer-policy.json | 11 +- .../1.18/assets/jei/jei/packer-policy.json | 10 +- .../minecraft/minecraft/packer-policy.json | 13 +- projects/1.18/pack.mcmeta | 12 +- .../armor-poser/armorposer/packer-policy.json | 10 +- .../hourglass/hourglass/packer-policy.json | 10 +- .../minecraft/minecraft/packer-policy.json | 13 +- .../shieldexp/packer-policy.json | 10 +- projects/1.19/pack.mcmeta | 10 +- .../Models/Providers/TermMappingProvider.cs | 123 +++++++++++------- 40 files changed, 495 insertions(+), 366 deletions(-) create mode 100644 projects/1.16/assets/alexs-mobs/alexsmobs/local-config.json diff --git a/config/packer/1.12.2.json b/config/packer/1.12.2.json index cf709ed373f6..66d0a541814f 100644 --- a/config/packer/1.12.2.json +++ b/config/packer/1.12.2.json @@ -1,38 +1,43 @@ { - "targetVersion": "1.12.2", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.txt" - ], - "modNameBlackList": [ - "gregtechce" - ], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ], - "replacementMap": { - "[[钅卢]]": "\ue900", - "[[钅杜]]": "\ue901", - "[[钅喜]]": "\ue902", - "[[钅波]]": "\ue903", - "[[钅黑]]": "\ue904", - "[[钅麦]]": "\u9fcf", - "[[钅达]]": "\ue906", - "[[钅仑]]": "\ue907", - "[[钅哥]]": "\u9fd4", - "[[钅尔]]": "\u9fed", - "[[钅夫]]": "\ue90a", - "[[钅立]]": "\ue90c", - "[[石田]]": "\u9fec", - "[[奥气]]": "\u9feb", - "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef" + "base": { + "version": "1.12.2", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [ + "gregtechce" + ], + "exclusionNamespaces": [] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [], + "characterReplacement": { + "[[钅卢]]": "\ue900", + "[[钅杜]]": "\ue901", + "[[钅喜]]": "\ue902", + "[[钅波]]": "\ue903", + "[[钅黑]]": "\ue904", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ue906", + "[[钅仑]]": "\ue907", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ue90a", + "[[钅立]]": "\ue90c", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef" + }, + "destinationReplacement": {} } } \ No newline at end of file diff --git a/config/packer/1.16-fabric.json b/config/packer/1.16-fabric.json index 923a5fb678ae..366a34c4e619 100644 --- a/config/packer/1.16-fabric.json +++ b/config/packer/1.16-fabric.json @@ -1,37 +1,42 @@ { - "targetVersion": "1.16-fabric", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.txt" - ], - "modNameBlackList": [], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ], - "replacementMap": { - "[[钅卢]]": "\ud872\udf3b", - "[[钅杜]]": "\ud872\udf4a", - "[[钅喜]]": "\ud872\udf73", - "[[钅波]]": "\ud872\udf5b", - "[[钅黑]]": "\ud872\udf76", - "[[钅麦]]": "\u9fcf", - "[[钅达]]": "\ud86d\udffc", - "[[钅仑]]": "\ud872\udf2d", - "[[钅哥]]": "\u9fd4", - "[[钅尔]]": "\u9fed", - "[[钅夫]]": "\ud86d\udce7", - "[[钅立]]": "\ud86d\udff7", - "[[石田]]": "\u9fec", - "[[奥气]]": "\u9feb", - "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef", - "——": "\u2e3a" + "base": { + "version": "1.16-fabric", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [], + "exclusionNamespaces": [] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [], + "characterReplacement": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + }, + "destinationReplacement": {} } } \ No newline at end of file diff --git a/config/packer/1.16.json b/config/packer/1.16.json index 968d642b296d..3d2413cc2849 100644 --- a/config/packer/1.16.json +++ b/config/packer/1.16.json @@ -1,38 +1,42 @@ { - "targetVersion": "1.16", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.txt", - "assets/alexs-mobs/alexsmobs/lang/en_us.json" - ], - "modNameBlackList": [], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ], - "replacementMap": { - "[[钅卢]]": "\ud872\udf3b", - "[[钅杜]]": "\ud872\udf4a", - "[[钅喜]]": "\ud872\udf73", - "[[钅波]]": "\ud872\udf5b", - "[[钅黑]]": "\ud872\udf76", - "[[钅麦]]": "\u9fcf", - "[[钅达]]": "\ud86d\udffc", - "[[钅仑]]": "\ud872\udf2d", - "[[钅哥]]": "\u9fd4", - "[[钅尔]]": "\u9fed", - "[[钅夫]]": "\ud86d\udce7", - "[[钅立]]": "\ud86d\udff7", - "[[石田]]": "\u9fec", - "[[奥气]]": "\u9feb", - "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef", - "——": "\u2e3a" + "base": { + "version": "1.16", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [], + "exclusionNamespaces": [] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [], + "characterReplacement": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + }, + "destinationReplacement": {} } } \ No newline at end of file diff --git a/config/packer/1.18-fabric.json b/config/packer/1.18-fabric.json index 7716ffdbb028..e8ed4e63ad12 100644 --- a/config/packer/1.18-fabric.json +++ b/config/packer/1.18-fabric.json @@ -1,39 +1,44 @@ { - "targetVersion": "1.18-fabric", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.txt" - ], - "modNameBlackList": [], - "domainBlackList": [ - "litematica" - ], - "noProcessNamespace": [ - "font", - "textures" - ], - "replacementMap": { - "[[钅卢]]": "\ud872\udf3b", - "[[钅杜]]": "\ud872\udf4a", - "[[钅喜]]": "\ud872\udf73", - "[[钅波]]": "\ud872\udf5b", - "[[钅黑]]": "\ud872\udf76", - "[[钅麦]]": "\u9fcf", - "[[钅达]]": "\ud86d\udffc", - "[[钅仑]]": "\ud872\udf2d", - "[[钅哥]]": "\u9fd4", - "[[钅尔]]": "\u9fed", - "[[钅夫]]": "\ud86d\udce7", - "[[钅立]]": "\ud86d\udff7", - "[[石田]]": "\u9fec", - "[[奥气]]": "\u9feb", - "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef", - "——": "\u2e3a" + "base": { + "version": "1.18-fabric", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [], + "exclusionNamespaces": [ + "litematica" + ] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [], + "characterReplacement": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + }, + "destinationReplacement": {} } } \ No newline at end of file diff --git a/config/packer/1.18.json b/config/packer/1.18.json index caf2693faa93..c64eb1651dd3 100644 --- a/config/packer/1.18.json +++ b/config/packer/1.18.json @@ -1,42 +1,47 @@ { - "targetVersion": "1.18", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.txt" - ], - "modNameBlackList": [ - "create" - ], - "domainBlackList": [ - "urushi", - "thermal" - ], - "noProcessNamespace": [ - "font", - "textures" - ], - "replacementMap": { - "[[钅卢]]": "\ud872\udf3b", - "[[钅杜]]": "\ud872\udf4a", - "[[钅喜]]": "\ud872\udf73", - "[[钅波]]": "\ud872\udf5b", - "[[钅黑]]": "\ud872\udf76", - "[[钅麦]]": "\u9fcf", - "[[钅达]]": "\ud86d\udffc", - "[[钅仑]]": "\ud872\udf2d", - "[[钅哥]]": "\u9fd4", - "[[钅尔]]": "\u9fed", - "[[钅夫]]": "\ud86d\udce7", - "[[钅立]]": "\ud86d\udff7", - "[[石田]]": "\u9fec", - "[[奥气]]": "\u9feb", - "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef", - "——": "\u2e3a" + "base": { + "version": "1.18", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [ + "create" + ], + "exclusionNamespaces": [ + "urushi", + "thermal" + ] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [], + "characterReplacement": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + }, + "destinationReplacement": {} } } \ No newline at end of file diff --git a/config/packer/1.19.json b/config/packer/1.19.json index cb35ec2feec1..7c7eb46ead6f 100644 --- a/config/packer/1.19.json +++ b/config/packer/1.19.json @@ -1,43 +1,42 @@ { - "targetVersion": "1.19", - "targetLanguage": [ - "zh_cn" - ], - "additionalContent": [ - "LICENSE", - "pack.mcmeta", - "pack.png", - "README.txt" - ], - "modNameBlackList": [ - "0-example-nop", - "0-example-patch", - "0-example-simple-clone", - "0-example-mixed-clone", - "0-example-port" - ], - "domainBlackList": [], - "noProcessNamespace": [ - "font", - "textures" - ], - "replacementMap": { - "[[钅卢]]": "\ud872\udf3b", - "[[钅杜]]": "\ud872\udf4a", - "[[钅喜]]": "\ud872\udf73", - "[[钅波]]": "\ud872\udf5b", - "[[钅黑]]": "\ud872\udf76", - "[[钅麦]]": "\u9fcf", - "[[钅达]]": "\ud86d\udffc", - "[[钅仑]]": "\ud872\udf2d", - "[[钅哥]]": "\u9fd4", - "[[钅尔]]": "\u9fed", - "[[钅夫]]": "\ud86d\udce7", - "[[钅立]]": "\ud86d\udff7", - "[[石田]]": "\u9fec", - "[[奥气]]": "\u9feb", - "[[气奥]]": "\u9feb", - "……": "\u22ef\u22ef", - "——": "\u2e3a" + "base": { + "version": "1.19", + "targetLanguages": [ + "zh_cn" + ], + "exclusionMods": [], + "exclusionNamespaces": [] + }, + "floating": { + "inclusionDomains": [ + "font", + "textures" + ], + "exclusionDomains": [], + "exclusionPaths": [ + "packer-policy.json", + "local-config.json" + ], + "inclusionPaths": [], + "characterReplacement": { + "[[钅卢]]": "\ud872\udf3b", + "[[钅杜]]": "\ud872\udf4a", + "[[钅喜]]": "\ud872\udf73", + "[[钅波]]": "\ud872\udf5b", + "[[钅黑]]": "\ud872\udf76", + "[[钅麦]]": "\u9fcf", + "[[钅达]]": "\ud86d\udffc", + "[[钅仑]]": "\ud872\udf2d", + "[[钅哥]]": "\u9fd4", + "[[钅尔]]": "\u9fed", + "[[钅夫]]": "\ud86d\udce7", + "[[钅立]]": "\ud86d\udff7", + "[[石田]]": "\u9fec", + "[[奥气]]": "\u9feb", + "[[气奥]]": "\u9feb", + "……": "\u22ef\u22ef", + "——": "\u2e3f" + }, + "destinationReplacement": {} } } \ No newline at end of file diff --git a/projects/1.12.2/assets/angry-pixel-the-betweenlands-mod/thebetweenlands/lang/zh_cn.lang b/projects/1.12.2/assets/angry-pixel-the-betweenlands-mod/thebetweenlands/lang/zh_cn.lang index 754a3f5d9972..a6af23a9c2af 100644 --- a/projects/1.12.2/assets/angry-pixel-the-betweenlands-mod/thebetweenlands/lang/zh_cn.lang +++ b/projects/1.12.2/assets/angry-pixel-the-betweenlands-mod/thebetweenlands/lang/zh_cn.lang @@ -2231,7 +2231,6 @@ blsubtitles.misc.gears=齿轮:旋转 blsubtitles.misc.wall_slide=墙:滑移 blsubtitles.misc.wall_slam=墙:撞击 blsubtitles.misc.poop_jet=污泥:被喷射 -blsubtitles.misc.pit_fall blsubtitles.misc.zap=电击 blsubtitles.misc.chirobarb_erupter=翼手钩发射器:发射 blsubtitles.misc.simulacrum_break=远处传来神秘的噪声 diff --git a/projects/1.12.2/assets/chinjufumod/chinjufumod/lang/zh_cn.lang b/projects/1.12.2/assets/chinjufumod/chinjufumod/lang/zh_cn.lang index 835907abf1b6..d0f2cb8cc9f3 100644 --- a/projects/1.12.2/assets/chinjufumod/chinjufumod/lang/zh_cn.lang +++ b/projects/1.12.2/assets/chinjufumod/chinjufumod/lang/zh_cn.lang @@ -1,4 +1,3 @@ -{ #簡体=Localization by Roseyasa #Tab itemGroup.tab_chinjufumod=ChinjufuMod @@ -2745,4 +2744,3 @@ item.block_food_pizza_t1.name=烤鸡肉披萨 item.item_food_pizzac.name=芝士披萨片 item.item_food_pizzas.name=鱿鱼披萨片 item.item_food_pizzat.name=鸡肉披萨片 -} diff --git a/projects/1.12.2/assets/rftools/rftools/lang/zh_cn.lang b/projects/1.12.2/assets/rftools/rftools/lang/zh_cn.lang index 62da0521f3b6..30ec563b22fc 100644 --- a/projects/1.12.2/assets/rftools/rftools/lang/zh_cn.lang +++ b/projects/1.12.2/assets/rftools/rftools/lang/zh_cn.lang @@ -260,7 +260,7 @@ message.rftools.remote_scanner=\ @f该方块可以扫描一个区域,\n\ @f并将其与塑形卡片链接。\n\ @f所链接的塑形卡片也\n\ - @f可以在构建器中使用 + @f可以在构建器中使用\ @6该版本的机器可以通过\n\ @6放置在其上方的\n\ @6已建立链接的物质传输器来扫描 diff --git a/projects/1.12.2/assets/tinkers-compendium/tinkerscompendium/lang/zh_cn.lang b/projects/1.12.2/assets/tinkers-compendium/tinkerscompendium/lang/zh_cn.lang index c5e84a0af239..86ddebea4c93 100644 --- a/projects/1.12.2/assets/tinkers-compendium/tinkerscompendium/lang/zh_cn.lang +++ b/projects/1.12.2/assets/tinkers-compendium/tinkerscompendium/lang/zh_cn.lang @@ -986,7 +986,7 @@ modifier.td_novel.desc=武器和护甲都讲述了一个故事,其中一些比 #Sponge modifier.td_soggy.name=浸水 modifier.td_soggy.desc=保留水有其好处。 -/Firewood +#Firewood modifier.td_hothead.name=急躁 modifier.td_hothead.desc=被击中让我生气! modifier.td_toasty.name=烤面包 @@ -1010,7 +1010,7 @@ modifier.td_hog.name=肥猪 modifier.td_hog.desc=我的护甲吃掉了我的作业…… modifier.td_sounder.name=肥猪 modifier.td_trotters.name=猪蹄 -/Knightslime +#Knightslime modifier.td_shifting.name=移位 modifier.td_shifting.desc=它喜欢自己行动。 modifier.td_gumshoe2.name=口香糖鞋 II diff --git a/projects/1.12.2/pack.mcmeta b/projects/1.12.2/pack.mcmeta index 311c7c618a1e..ec41c11f1d23 100644 --- a/projects/1.12.2/pack.mcmeta +++ b/projects/1.12.2/pack.mcmeta @@ -1,6 +1,6 @@ -{ - "pack": { +{{ + "pack": {{ "pack_format": 3, - "description": "汉化万用包,仅限1.12.2" - } -} + "description": "汉化万用包,仅限1.12.2/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} diff --git a/projects/1.16-fabric/assets/cloth-config/cloth-config2/packer-policy.json b/projects/1.16-fabric/assets/cloth-config/cloth-config2/packer-policy.json index 34b2ca268dbc..fea12dde5c74 100644 --- a/projects/1.16-fabric/assets/cloth-config/cloth-config2/packer-policy.json +++ b/projects/1.16-fabric/assets/cloth-config/cloth-config2/packer-policy.json @@ -1 +1,6 @@ -{"type":"plainclone","source":"./projects/1.16/assets/cloth-config/cloth-config2"} +[ + { + "type": "indirect", + "source": "./projects/1.16/assets/cloth-config/cloth-config2" + } +] \ No newline at end of file diff --git a/projects/1.16-fabric/assets/iron-furnaces/ironfurnaces/packer-policy.json b/projects/1.16-fabric/assets/iron-furnaces/ironfurnaces/packer-policy.json index 2c9196ef57d8..d81675a62bcc 100644 --- a/projects/1.16-fabric/assets/iron-furnaces/ironfurnaces/packer-policy.json +++ b/projects/1.16-fabric/assets/iron-furnaces/ironfurnaces/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.16/assets/iron-furnaces/ironfurnaces" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.16/assets/iron-furnaces/ironfurnaces" + } +] \ No newline at end of file diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json index 75b22dfd6411..ca88d9799a3c 100644 --- a/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", +[ + { + "type": "indirect", "source": "./projects/1.16/assets/minecraft/minecraft" -} \ No newline at end of file + } +] \ No newline at end of file diff --git a/projects/1.16-fabric/pack.mcmeta b/projects/1.16-fabric/pack.mcmeta index 0a695a8a1c65..81488da86f03 100644 --- a/projects/1.16-fabric/pack.mcmeta +++ b/projects/1.16-fabric/pack.mcmeta @@ -1,6 +1,6 @@ -{ - "pack": { +{{ + "pack": {{ "pack_format": 6, - "description": "汉化万用包,仅供1.16Fabric使用(目前版本1.16.5)" - } -} \ No newline at end of file + "description": "汉化万用包,仅供1.16Fabric使用(目前版本1.16.5)/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} \ No newline at end of file diff --git a/projects/1.16/assets/alexs-mobs/alexsmobs/local-config.json b/projects/1.16/assets/alexs-mobs/alexsmobs/local-config.json new file mode 100644 index 000000000000..d21a6af44a1c --- /dev/null +++ b/projects/1.16/assets/alexs-mobs/alexsmobs/local-config.json @@ -0,0 +1,10 @@ +{ + "inclusionDomains": [], + "exclusionDomains": [], + "exclusionPaths": [], + "inclusionPaths": [ + "lang/en_us.json" + ], + "characterReplacement": {}, + "destinationReplacement": {} +} \ No newline at end of file diff --git a/projects/1.16/assets/corail-recycler/corail_recycler/packer-policy.json b/projects/1.16/assets/corail-recycler/corail_recycler/packer-policy.json index 3c186f16b573..cc120ff0d580 100644 --- a/projects/1.16/assets/corail-recycler/corail_recycler/packer-policy.json +++ b/projects/1.16/assets/corail-recycler/corail_recycler/packer-policy.json @@ -1 +1,6 @@ -{"type":"plainclone","source":"./projects/1.18/assets/corail-recycler/corail_recycler"} +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/corail-recycler/corail_recycler" + } +] \ No newline at end of file diff --git a/projects/1.16/assets/crafting-tweaks/craftingtweaks/packer-policy.json b/projects/1.16/assets/crafting-tweaks/craftingtweaks/packer-policy.json index 4569f083c88f..86c8bed1dd41 100644 --- a/projects/1.16/assets/crafting-tweaks/craftingtweaks/packer-policy.json +++ b/projects/1.16/assets/crafting-tweaks/craftingtweaks/packer-policy.json @@ -1 +1,10 @@ -{"type":"backport","source":"./projects/1.19/assets/crafting-tweaks/craftingtweaks"} +[ + { + "type": "direct" + }, + { + "type": "indirect", + "source": "./projects/1.19/assets/crafting-tweaks/craftingtweaks", + "overrides": true + } +] \ No newline at end of file diff --git a/projects/1.16/assets/laser-mod/lasermod/lang/zh_cn.json b/projects/1.16/assets/laser-mod/lasermod/lang/zh_cn.json index 5fc5d317aeb6..bd89d85c75d7 100644 --- a/projects/1.16/assets/laser-mod/lasermod/lang/zh_cn.json +++ b/projects/1.16/assets/laser-mod/lasermod/lang/zh_cn.json @@ -45,7 +45,7 @@ "container.lasermod.laser.button.options": "选项", "container.lasermod.laser.red": "红(R)", "container.lasermod.laser.green": "绿(G)", - "container.lasermod.laser.blue": "蓝(B)" + "container.lasermod.laser.blue": "蓝(B)" , "death.block.laser": "%s被激光烧毁了", diff --git a/projects/1.16/assets/tool-kit/toolkit/packer-policy.json b/projects/1.16/assets/tool-kit/toolkit/packer-policy.json index 5397cfe7f514..91e6926ddcdf 100644 --- a/projects/1.16/assets/tool-kit/toolkit/packer-policy.json +++ b/projects/1.16/assets/tool-kit/toolkit/packer-policy.json @@ -1 +1,6 @@ -{"type":"plainclone","source":"./projects/1.18/assets/tool-kit/toolkit"} +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/tool-kit/toolkit" + } +] \ No newline at end of file diff --git a/projects/1.16/pack.mcmeta b/projects/1.16/pack.mcmeta index e64ec481812a..61658bebd3d2 100644 --- a/projects/1.16/pack.mcmeta +++ b/projects/1.16/pack.mcmeta @@ -1,6 +1,6 @@ -{ - "pack": { +{{ + "pack": {{ "pack_format": 6, - "description": "汉化万用包,仅供1.16Forge使用(目前版本1.16.5)" - } -} \ No newline at end of file + "description": "汉化万用包,仅供1.16Forge使用(目前版本1.16.5)/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} \ No newline at end of file diff --git a/projects/1.18-fabric/assets/cloth-config/cloth-config2/packer-policy.json b/projects/1.18-fabric/assets/cloth-config/cloth-config2/packer-policy.json index 0b78380bd704..f117285a0270 100644 --- a/projects/1.18-fabric/assets/cloth-config/cloth-config2/packer-policy.json +++ b/projects/1.18-fabric/assets/cloth-config/cloth-config2/packer-policy.json @@ -1 +1,6 @@ -{"type":"plainclone","source":"./projects/1.18/assets/cloth-config/cloth-config2"} +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/cloth-config/cloth-config2" + } +] \ No newline at end of file diff --git a/projects/1.18-fabric/assets/copper-equipment/exlinecopperequipment/packer-policy.json b/projects/1.18-fabric/assets/copper-equipment/exlinecopperequipment/packer-policy.json index 7ed58570b1b3..4394bfad29a3 100644 --- a/projects/1.18-fabric/assets/copper-equipment/exlinecopperequipment/packer-policy.json +++ b/projects/1.18-fabric/assets/copper-equipment/exlinecopperequipment/packer-policy.json @@ -1 +1,6 @@ -{"type":"plainclone","source":"./projects/1.18/assets/copper-equipment/exlinecopperequipment"} +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/copper-equipment/exlinecopperequipment" + } +] \ No newline at end of file diff --git a/projects/1.18-fabric/assets/goodall/goodall/packer-policy.json b/projects/1.18-fabric/assets/goodall/goodall/packer-policy.json index 602c22da5d7e..3a8ca12c508d 100644 --- a/projects/1.18-fabric/assets/goodall/goodall/packer-policy.json +++ b/projects/1.18-fabric/assets/goodall/goodall/packer-policy.json @@ -1 +1,4 @@ -{"type":"plainclone","source":"./projects/1.18/assets/goodall/goodall"} +[{ + "type": "indirect", + "source": "./projects/1.18/assets/goodall/goodall" +}] \ No newline at end of file diff --git a/projects/1.18-fabric/assets/iron-furnaces/ironfurnaces/packer-policy.json b/projects/1.18-fabric/assets/iron-furnaces/ironfurnaces/packer-policy.json index 29d95fbd0aae..8ee1a3a68b3a 100644 --- a/projects/1.18-fabric/assets/iron-furnaces/ironfurnaces/packer-policy.json +++ b/projects/1.18-fabric/assets/iron-furnaces/ironfurnaces/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.18/assets/iron-furnaces/ironfurnaces" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/iron-furnaces/ironfurnaces" + } +] \ No newline at end of file diff --git a/projects/1.18-fabric/assets/jei/jei/packer-policy.json b/projects/1.18-fabric/assets/jei/jei/packer-policy.json index 1e668dc475c8..1279d7723e5f 100644 --- a/projects/1.18-fabric/assets/jei/jei/packer-policy.json +++ b/projects/1.18-fabric/assets/jei/jei/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.19/assets/jei/jei" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.19/assets/jei/jei" + } +] \ No newline at end of file diff --git a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json index 85deacc1c0bc..a1ea3f19be38 100644 --- a/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.18-fabric/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.18/assets/minecraft/minecraft" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/minecraft/minecraft" + } +] \ No newline at end of file diff --git a/projects/1.18-fabric/assets/opulence/opulence/packer-policy.json b/projects/1.18-fabric/assets/opulence/opulence/packer-policy.json index f2703e04267e..92158592d167 100644 --- a/projects/1.18-fabric/assets/opulence/opulence/packer-policy.json +++ b/projects/1.18-fabric/assets/opulence/opulence/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.18/assets/opulence/opulence" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/opulence/opulence" + } +] \ No newline at end of file diff --git a/projects/1.18-fabric/assets/rotten-creatures/rottencreatures/packer-policy.json b/projects/1.18-fabric/assets/rotten-creatures/rottencreatures/packer-policy.json index 62326ec5325d..55fbf7e28f8a 100644 --- a/projects/1.18-fabric/assets/rotten-creatures/rottencreatures/packer-policy.json +++ b/projects/1.18-fabric/assets/rotten-creatures/rottencreatures/packer-policy.json @@ -1,4 +1,4 @@ -{ - "type": "plainclone", +[{ + "type": "indirect", "source": "./projects/1.18/assets/rotten-creatures/rottencreatures" -} \ No newline at end of file +}] \ No newline at end of file diff --git a/projects/1.18-fabric/pack.mcmeta b/projects/1.18-fabric/pack.mcmeta index dc999fa90fb9..758d59f822d8 100644 --- a/projects/1.18-fabric/pack.mcmeta +++ b/projects/1.18-fabric/pack.mcmeta @@ -1,6 +1,6 @@ -{ - "pack": { - "pack_format": 8, - "description": "汉化万用包,仅供1.18Fabric使用" - } -} \ No newline at end of file +{{ + "pack": {{ + "pack_format": 8, + "description": "汉化万用包,仅供1.18Fabric使用/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} \ No newline at end of file diff --git a/projects/1.18/assets/crafting-tweaks/craftingtweaks/packer-policy.json b/projects/1.18/assets/crafting-tweaks/craftingtweaks/packer-policy.json index 4569f083c88f..86c8bed1dd41 100644 --- a/projects/1.18/assets/crafting-tweaks/craftingtweaks/packer-policy.json +++ b/projects/1.18/assets/crafting-tweaks/craftingtweaks/packer-policy.json @@ -1 +1,10 @@ -{"type":"backport","source":"./projects/1.19/assets/crafting-tweaks/craftingtweaks"} +[ + { + "type": "direct" + }, + { + "type": "indirect", + "source": "./projects/1.19/assets/crafting-tweaks/craftingtweaks", + "overrides": true + } +] \ No newline at end of file diff --git a/projects/1.18/assets/jei/jei/packer-policy.json b/projects/1.18/assets/jei/jei/packer-policy.json index 1e668dc475c8..1279d7723e5f 100644 --- a/projects/1.18/assets/jei/jei/packer-policy.json +++ b/projects/1.18/assets/jei/jei/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.19/assets/jei/jei" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.19/assets/jei/jei" + } +] \ No newline at end of file diff --git a/projects/1.18/assets/minecraft/minecraft/packer-policy.json b/projects/1.18/assets/minecraft/minecraft/packer-policy.json index 88d41319434e..36653b700ae5 100644 --- a/projects/1.18/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.18/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,9 @@ -{ - "type": "clonemissing", - "source": "./projects/1.16/assets/minecraft/minecraft" -} \ No newline at end of file +[ + { + "type": "direct" + }, + { + "type": "indirect", + "source": "./projects/1.16/assets/minecraft/minecraft" + } +] \ No newline at end of file diff --git a/projects/1.18/pack.mcmeta b/projects/1.18/pack.mcmeta index 732aec859891..d59e05b3e937 100644 --- a/projects/1.18/pack.mcmeta +++ b/projects/1.18/pack.mcmeta @@ -1,6 +1,6 @@ -{ - "pack": { - "pack_format": 8, - "description": "汉化万用包,仅供1.18Forge使用" - } -} \ No newline at end of file +{{ + "pack": {{ + "pack_format": 8, + "description": "汉化万用包,仅供1.18Forge使用/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} \ No newline at end of file diff --git a/projects/1.19/assets/armor-poser/armorposer/packer-policy.json b/projects/1.19/assets/armor-poser/armorposer/packer-policy.json index 29880705a989..9bd62a8b19c5 100644 --- a/projects/1.19/assets/armor-poser/armorposer/packer-policy.json +++ b/projects/1.19/assets/armor-poser/armorposer/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.18/assets/armor-poser/armorposer" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/armor-poser/armorposer" + } +] \ No newline at end of file diff --git a/projects/1.19/assets/hourglass/hourglass/packer-policy.json b/projects/1.19/assets/hourglass/hourglass/packer-policy.json index ef13d58a6b5f..76baceff7578 100644 --- a/projects/1.19/assets/hourglass/hourglass/packer-policy.json +++ b/projects/1.19/assets/hourglass/hourglass/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.18/assets/hourglass/hourglass" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/hourglass/hourglass" + } +] \ No newline at end of file diff --git a/projects/1.19/assets/minecraft/minecraft/packer-policy.json b/projects/1.19/assets/minecraft/minecraft/packer-policy.json index 88d41319434e..36653b700ae5 100644 --- a/projects/1.19/assets/minecraft/minecraft/packer-policy.json +++ b/projects/1.19/assets/minecraft/minecraft/packer-policy.json @@ -1,4 +1,9 @@ -{ - "type": "clonemissing", - "source": "./projects/1.16/assets/minecraft/minecraft" -} \ No newline at end of file +[ + { + "type": "direct" + }, + { + "type": "indirect", + "source": "./projects/1.16/assets/minecraft/minecraft" + } +] \ No newline at end of file diff --git a/projects/1.19/assets/shield-expansion/shieldexp/packer-policy.json b/projects/1.19/assets/shield-expansion/shieldexp/packer-policy.json index 85161b17e85f..eab3d9593b71 100644 --- a/projects/1.19/assets/shield-expansion/shieldexp/packer-policy.json +++ b/projects/1.19/assets/shield-expansion/shieldexp/packer-policy.json @@ -1,4 +1,6 @@ -{ - "type": "plainclone", - "source": "./projects/1.18/assets/shield-expansion/shieldexp" -} \ No newline at end of file +[ + { + "type": "indirect", + "source": "./projects/1.18/assets/shield-expansion/shieldexp" + } +] \ No newline at end of file diff --git a/projects/1.19/pack.mcmeta b/projects/1.19/pack.mcmeta index d31a3c5da190..6694effb280d 100644 --- a/projects/1.19/pack.mcmeta +++ b/projects/1.19/pack.mcmeta @@ -1,6 +1,6 @@ -{ - "pack": { +{{ + "pack": {{ "pack_format": 13, - "description": "汉化万用包,仅供1.19.4使用" - } -} \ No newline at end of file + "description": "汉化万用包,仅供1.19.4使用/n打包时间:{0:yyyy-MM-ddTHH:mm:ssZ}" + }} +}} \ No newline at end of file diff --git a/src/Packer/Models/Providers/TermMappingProvider.cs b/src/Packer/Models/Providers/TermMappingProvider.cs index 13ebf32577dc..755d25620d52 100644 --- a/src/Packer/Models/Providers/TermMappingProvider.cs +++ b/src/Packer/Models/Providers/TermMappingProvider.cs @@ -4,18 +4,18 @@ using System.Collections.Generic; using System.IO; using System.IO.Compression; -using System.Text.Encodings.Web; +using System.Linq; using System.Text; +using System.Text.Encodings.Web; using System.Text.Json; +using System.Text.Json.Nodes; using System.Text.RegularExpressions; using System.Threading.Tasks; -using System.Text.Json.Nodes; -using System.Linq; namespace Packer.Models.Providers { - using LangMappingProvider = TermMappingProvider; using JsonMappingProvider = TermMappingProvider; + using LangMappingProvider = TermMappingProvider; #region termDictionary /// @@ -126,7 +126,7 @@ public class TermMappingProvider : IResourceFileProvider /// 语言文件所表示的映射表 /// public ITermDictionary Map { get; } - + /// public string Destination { get; } @@ -212,62 +212,80 @@ public static LangMappingProvider CreateFromFile(FileInfo file, string destinati using var stream = file.OpenRead(); using var reader = new StreamReader(stream, Encoding.UTF8); var content = reader.ReadToEnd(); - return new (new LangDictionaryWrapper(DeserializeFromLang(content)), destination); + return new(new LangDictionaryWrapper(DeserializeFromLang(content)), destination); } - // RAW - // TODO:仔细检查一遍 - // TODO:PARSE-ESCAPE internal static Dictionary DeserializeFromLang(string content) { - // 甚至不是自动机...所以不敢多用,否则会炸 - - // 下面的 Verbose 仅供调试,不会在 log 里出现 - // .lang的格式真的乱... - Log.Verbose("开始反序列化 .lang 文件"); - // #PARSE_ESCAPE就算了吧 var result = new Dictionary(); var isInComment = false; // 处理多行注释 - new List(content.Split(Environment.NewLine, - StringSplitOptions.RemoveEmptyEntries)) - .ForEach(line => + var isParseEscape = false; + var isLineContinuation = false; + var pendingKey = ""; + var pendingValue = ""; + + foreach (var line in content.AsSpan().EnumerateLines()) + { + if (isLineContinuation) // 行尾转义符,用于换行 { - var isSingleLineComment = false; - new List { "//", "#" } - .ForEach(_ => { isSingleLineComment |= line.StartsWith(_); }); - if (isSingleLineComment) + if (line.EndsWith("\\")) { - Log.Verbose("跳过了单行注释:{0}", line); + pendingValue += line[..^1].ToString(); } - else if (isInComment) // 多行注释内 + else { - Log.Verbose("{0}", line); - if (line.Trim() - .EndsWith("*/")) - { - isInComment = false; // 跳出注释 - } - } - else if (line.StartsWith("/*")) // 开始多行注释 - { - Log.Verbose("跳过了多行注释:{0}", line); - } - else // 真正的条目 - { - Log.Verbose("添加对应映射:{0}", line); - var spiltPosition = line.IndexOf('='); - try - { - result.Add(line[..spiltPosition], line[(spiltPosition + 1)..]); - } - catch (Exception e) - { - Log.Warning(e.ToString()); - } + pendingValue += ("\\n" + line.ToString()); + result.TryAdd(pendingKey, pendingValue); + isLineContinuation = false; } + continue; + } + + if (!isParseEscape && line.Equals("#PARSE_ESCAPES", StringComparison.Ordinal)) + { + isParseEscape = true; + continue; + } + + if (isInComment) + { // 多行注释内 + if (line.Trim() + .EndsWith("*/")) + isInComment = false; // 跳出注释 + continue; + } + + if (line.StartsWith("//") | line.StartsWith("#") | line.StartsWith("<")) + continue; + + if (line.StartsWith("/*")) + { // 开始多行注释 + isInComment = true; + continue; } - ); - Log.Verbose("反序列化完成"); + + if (line.IsEmpty || line.IsWhiteSpace()) // 空行需去 + continue; + + // 基础条目 + var splitPosition = line.IndexOf('='); + + var key = line[..splitPosition]; + var value = splitPosition + 1 < line.Length + ? line[(splitPosition + 1)..] + : ""; + if (isParseEscape && value.EndsWith("\\")) + { + isLineContinuation = true; + pendingKey = key.ToString(); + pendingValue = value[..^1].ToString(); + } + else + { + result.TryAdd(key.ToString(), value.ToString()); + } + } + return result; } } @@ -285,7 +303,12 @@ public static partial class JsonMappingHelper public static JsonMappingProvider CreateFromFile(FileInfo file, string destination) { using var stream = file.OpenRead(); - return new(new JsonDictionaryWrapper(JsonNode.Parse(stream)!.AsObject()!), destination); + return new( + new JsonDictionaryWrapper( + JsonSerializer.Deserialize>( + stream, + new JsonSerializerOptions { ReadCommentHandling = JsonCommentHandling.Skip })!), + destination); } } #endregion From 8b04a9b2294df7475807e43b4aa2db605e65f771 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Mon, 2 Oct 2023 11:35:50 +0800 Subject: [PATCH 24/25] partial file support --- .gitignore | 4 + src/Packer/Extensions/DirectoryExtension.cs | 7 +- .../{Utils.cs => Helpers/ConfigHelpers.cs} | 168 +++++++++--------- src/Packer/Helpers/GitHelpers.cs | 41 +++++ src/Packer/Packer.csproj | 2 +- src/Packer/Program.cs | 14 +- 6 files changed, 141 insertions(+), 95 deletions(-) rename src/Packer/{Utils.cs => Helpers/ConfigHelpers.cs} (93%) create mode 100644 src/Packer/Helpers/GitHelpers.cs diff --git a/.gitignore b/.gitignore index 3d152dd748ea..8b53ce563096 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,10 @@ coreclr.dll mscordaccore.dll /src/Packer/Properties/launchSettings.json +# libgit2sharp + +git2-*.dll + # artifact temporary files artifacts/ diff --git a/src/Packer/Extensions/DirectoryExtension.cs b/src/Packer/Extensions/DirectoryExtension.cs index 0fcabea233ce..822a7875f1df 100644 --- a/src/Packer/Extensions/DirectoryExtension.cs +++ b/src/Packer/Extensions/DirectoryExtension.cs @@ -1,4 +1,5 @@ -using Packer.Models; +using Packer.Helpers; +using Packer.Models; using Packer.Models.Providers; using Serilog; using System; @@ -60,7 +61,7 @@ select providerGroup.Aggregate( /// 遍历未经合并的文件,用于递归调用 /// internal static EvaluatorReturnType EnumerateRawProviders(this DirectoryInfo namespaceDirectory, Config config) - => from policy in Utils.RetrieveStrategy(namespaceDirectory) + => from policy in ConfigHelpers.RetrieveStrategy(namespaceDirectory) from enumeratedPair in functionTable[policy.Type].Invoke( namespaceDirectory, config, policy.Parameters) select enumeratedPair; @@ -70,7 +71,7 @@ internal static EvaluatorReturnType FromCurrentDirectory(DirectoryInfo namespace Config config, ParameterType? parameters) { - var floatingConfig = Utils.RetrieveLocalConfig(namespaceDirectory); + var floatingConfig = ConfigHelpers.RetrieveLocalConfig(namespaceDirectory); var localConfig = config.Modify(floatingConfig); return from candidate in namespaceDirectory.EnumerateFiles("*", SearchOption.AllDirectories) diff --git a/src/Packer/Utils.cs b/src/Packer/Helpers/ConfigHelpers.cs similarity index 93% rename from src/Packer/Utils.cs rename to src/Packer/Helpers/ConfigHelpers.cs index 38beb8a4cd3a..173513314bf4 100644 --- a/src/Packer/Utils.cs +++ b/src/Packer/Helpers/ConfigHelpers.cs @@ -1,85 +1,83 @@ -using Packer.Models; -using Serilog; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Encodings.Web; -using System.Text.Json; -using System.Text.Json.Serialization; -using System.Threading.Tasks; - - -namespace Packer -{ - /// - /// 杂项工具类 - /// - public static class Utils - { - /// - /// 从给定的命名空间获取局域配置 - /// - /// 命名空间目录 - /// 若文件存在,返回;否则,返回 - public static FloatingConfig? RetrieveLocalConfig(DirectoryInfo directory) - { - var configFile = directory.GetFiles("local-config.json").FirstOrDefault(); - - if (configFile is null) return null; - - using var reader = configFile.OpenText(); - return JsonSerializer.Deserialize( - reader.ReadToEnd(), - new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); - } - - /// - /// 从仓库根目录获取全局配置 - /// - /// 配置路径模板 - /// 打包版本,用于定位全局配置 - public static async Task RetrieveConfig(string configTemplate, string version) - { - Log.Information("正在获取配置。目标版本:{0}", version); - - var configPath = string.Format(configTemplate, version); - - Log.Information("配置位置:{0}", configPath); - - var content = await File.ReadAllBytesAsync(configPath); - return JsonSerializer.Deserialize( - content, - new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase })!; - } - - /// - /// 从给定的命名空间获取策略内容 - /// - /// 命名空间目录 - /// 若文件存在,返回对应的内容;否则,返回Direct - /// 策略文件非法 - public static List RetrieveStrategy(DirectoryInfo directory) - { - var file = directory.GetFiles("packer-policy.json").FirstOrDefault(); - - if (file is null) - return new List - { - new PackerPolicy { Type = PackerPolicyType.Direct } - }; - - using var reader = file.OpenText(); - var result = JsonSerializer.Deserialize>( - reader.ReadToEnd(), - new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } - }); - if (result is null) - throw new InvalidDataException($"The policy file {file.FullName} cannot have null values."); - return result; - } - } -} +using Packer.Models; +using Serilog; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + + +namespace Packer.Helpers +{ + /// + /// 配置相关的工具类 + /// + public static class ConfigHelpers + { + /// + /// 从给定的命名空间获取局域配置 + /// + /// 命名空间目录 + /// 若文件存在,返回;否则,返回 + public static FloatingConfig? RetrieveLocalConfig(DirectoryInfo directory) + { + var configFile = directory.GetFiles("local-config.json").FirstOrDefault(); + + if (configFile is null) return null; + + using var reader = configFile.OpenText(); + return JsonSerializer.Deserialize( + reader.ReadToEnd(), + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); + } + + /// + /// 从仓库根目录获取全局配置 + /// + /// 配置路径模板 + /// 打包版本,用于定位全局配置 + public static async Task RetrieveConfig(string configTemplate, string version) + { + Log.Information("正在获取配置。目标版本:{0}", version); + + var configPath = string.Format(configTemplate, version); + + Log.Information("配置位置:{0}", configPath); + + var content = await File.ReadAllBytesAsync(configPath); + return JsonSerializer.Deserialize( + content, + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase })!; + } + + /// + /// 从给定的命名空间获取策略内容 + /// + /// 命名空间目录 + /// 若文件存在,返回对应的内容;否则,返回Direct + /// 策略文件非法 + public static List RetrieveStrategy(DirectoryInfo directory) + { + var file = directory.GetFiles("packer-policy.json").FirstOrDefault(); + + if (file is null) + return new List + { + new PackerPolicy { Type = PackerPolicyType.Direct } + }; + + using var reader = file.OpenText(); + var result = JsonSerializer.Deserialize>( + reader.ReadToEnd(), + new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } + }); + if (result is null) + throw new InvalidDataException($"The policy file {file.FullName} cannot have null values."); + return result; + } + } +} diff --git a/src/Packer/Helpers/GitHelpers.cs b/src/Packer/Helpers/GitHelpers.cs new file mode 100644 index 000000000000..bc18365847f8 --- /dev/null +++ b/src/Packer/Helpers/GitHelpers.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using LibGit2Sharp; +using Serilog; + +namespace Packer.Helpers +{ + /// + /// Git操作相关的工具类 + /// + public static class GitHelpers + { + /// + /// 枚举相对与主分支main,给定版本下有更改的模组。 + /// + public static IEnumerable EnumerateChangedMods(string version) + { + Log.Information("对版本 {0} 加载更改模组", version); + using var repo = new Repository("."); + var headTree = repo.Head.Tip.Tree; + var baseTree = repo.Branches["main"].Tip.Tree; + var changedFiles = repo.Diff.Compare(baseTree, headTree); + var query = from change in changedFiles + from path in new List { change.Path, change.OldPath } + where path.IsInTargetVersion(version) + select path.ExtractModIdentifier(version); + var result = query.Distinct(); + Log.Information("更改模组列表:{0}", result); + return result; + } + + internal static bool IsInTargetVersion(this string location, string version) + => location.StartsWith($"projects/{version}/assets"); + + internal static string ExtractModIdentifier(this string location, string version) + => Path.GetRelativePath($"projects/{version}/assets", location) + .Split(Path.DirectorySeparatorChar)[0]; + + } +} diff --git a/src/Packer/Packer.csproj b/src/Packer/Packer.csproj index 3e7ae5065b02..718ec94626ad 100644 --- a/src/Packer/Packer.csproj +++ b/src/Packer/Packer.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Packer/Program.cs b/src/Packer/Program.cs index 1f819dd467ff..e135e8646f5e 100644 --- a/src/Packer/Program.cs +++ b/src/Packer/Program.cs @@ -1,8 +1,10 @@ using Packer.Extensions; +using Packer.Helpers; using Packer.Models; using Packer.Models.Providers; using Serilog; using System; +using System.Collections; using System.IO; using System.IO.Compression; using System.Linq; @@ -13,7 +15,7 @@ namespace Packer class Program { // System.CommandLine.DragonFruit支持 - public static async Task Main(string version, string[]? targets) + public static async Task Main(string version, bool increment = false) { Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() @@ -21,18 +23,18 @@ public static async Task Main(string version, string[]? targets) .MinimumLevel.Information() // 以便 debug 时修改这一等级 .CreateLogger(); - var targetModIdentifiers = targets?.ToList(); - - var config = await Utils.RetrieveConfig(configTemplate: "./config/packer/{0}.json", + var config = await ConfigHelpers.RetrieveConfig(configTemplate: "./config/packer/{0}.json", version: version); Log.Information("开始对版本 {0} 的打包", config.Base.Version); + var targetModIdentifiers = increment ? GitHelpers.EnumerateChangedMods(config.Base.Version) + : Enumerable.Empty(); + var query = // 这就是查询表达式吗( from modDirectory in new DirectoryInfo($"./projects/{config.Base.Version}/assets") .EnumerateDirectories() let modIdentifier = modDirectory.Name - where targetModIdentifiers is null - || targetModIdentifiers.Count() == 0 // 未提供列表,全部打包 + where targetModIdentifiers.Count() == 0 // 未提供列表,全部打包 || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 where !config.Base.ExclusionMods.Contains(modIdentifier) // 没有被明确排除 from namespaceDirectory in modDirectory.EnumerateDirectories() From a21028b47416108cf3109bf1b13e332128a2bca0 Mon Sep 17 00:00:00 2001 From: dovisutu <40313014+dovisutu@users.noreply.github.com> Date: Mon, 2 Oct 2023 11:54:03 +0800 Subject: [PATCH 25/25] action partial file --- .github/workflows/packer.yml | 1 + .github/workflows/pr-packer.yml | 18 ++++++++++++++---- src/Packer/Helpers/GitHelpers.cs | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/packer.yml b/.github/workflows/packer.yml index 3befb16abed5..77bfe7be8dd1 100644 --- a/.github/workflows/packer.yml +++ b/.github/workflows/packer.yml @@ -117,6 +117,7 @@ jobs: src/** - name: Run Packer for ${{ matrix.version }} + # 分发包中应当包含全部内容 run: ./Packer --version="${{ matrix.version }}" # 运行逻辑:内容有更改 或 手动运行 if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' diff --git a/.github/workflows/pr-packer.yml b/.github/workflows/pr-packer.yml index ae2dbde072d6..1980258285ff 100644 --- a/.github/workflows/pr-packer.yml +++ b/.github/workflows/pr-packer.yml @@ -48,7 +48,7 @@ jobs: steps: - uses: actions/checkout@v2 with: - fetch-depth: 20 # 显然,需要有提交历史才能比较提交。20这个数是任意的。 + fetch-depth: 0 # 问题在于下文需要与main比较,就只有全部拉过来了 # 由于Github的限制,这里需要重新拉取打包程序。 - name: Restore Packer @@ -65,16 +65,26 @@ jobs: with: # 判断位置:该版本文件、该版本配置、代码 paths: > - projects/${{ matrix.version }} + projects/${{ matrix.version }}/** + config/packer/${{ matrix.version }}.json + src/** + + - name: Check critical path on ${{ matrix.version }} + uses: MarceloPrado/has-changed-path@v1.0 + id: check-critical-changes + with: + # 判断位置:该版本配置、代码 + paths: > config/packer/${{ matrix.version }}.json src/** - name: Run Packer for ${{ matrix.version }} - run: ./Packer --version="${{ matrix.version }}" + # 部分包原则:Packer和配置均没有改动 + run: ./Packer --version="${{ matrix.version }} --increment=${{ !steps.check-critical-changes.outputs.changed }}" # 运行逻辑:内容有更改 或 手动运行 if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - # 额 要两分半才能传完 然而 GitHub actions 直接传的话 会压成 zip 内套 zip 就这样了吧 --cy + # 额 要两分半才能传完 然而 GitHub actions 直接传的话 会压成 zip 内套 zip 就这样了吧 --cy - name: Unzip Files run: unzip -q Minecraft-Mod-Language-Package-${{ matrix.version }}.zip -d Minecraft-Mod-Language-Package-${{ matrix.version }} || echo 0 shell: bash diff --git a/src/Packer/Helpers/GitHelpers.cs b/src/Packer/Helpers/GitHelpers.cs index bc18365847f8..d6d2cba9f8c2 100644 --- a/src/Packer/Helpers/GitHelpers.cs +++ b/src/Packer/Helpers/GitHelpers.cs @@ -19,7 +19,7 @@ public static IEnumerable EnumerateChangedMods(string version) Log.Information("对版本 {0} 加载更改模组", version); using var repo = new Repository("."); var headTree = repo.Head.Tip.Tree; - var baseTree = repo.Branches["main"].Tip.Tree; + var baseTree = repo.Branches["refs/remotes/origin/master"].Tip.Tree; var changedFiles = repo.Diff.Compare(baseTree, headTree); var query = from change in changedFiles from path in new List { change.Path, change.OldPath }

XIxdan5o#(3We0I zo{ed{XgizfEK!NVp@bW%%6w9s*GXEY^Fp27ET80Anw1|fA8|H!Ij@q%ry$iK!sf(f z&RtHDILgzo)^beB@{e2;s|JthmJyG3z>*hVmoE0t$4;`pfjRz9rRC5{(Z8%N(E&G%n9b) z3r#pKWPF0IuY>vZ?rySi3ie8b)0|7KN_j)$@s0gcwz8U3)k?zE)x9t8i5e5j!)@bU z8xI@XI{ebwhBgvh=X1mFkIMSAJ*70t5oZPG`O~E6 zcDvPaUX4bhPT}WFNs4qf;e_Mj^7{Jv>Y6NGUTb~nV7_Fop1g9KYAV&zJdT zNNhgJ8Qt>YBc#puM-QXe)yF>1T1BBxlNusIZ{S2dzMkpCPCs%Y{rJvjPqGGH6mR_- zZ{jX5*Smemf6MFd_l-%DX_|tEQ6F$ZI^qn2)Uu_QdYUGe#T*AIej;0Ik}!@&B~ z51!%+&sR^M?sU7Yr#r1ypqP%+@_l@E0>X$1HG+&qYITFwP7v$_Fg=wgH+(BSaQz^q z`6xL~1F{};N5s0z{Hy=*FTeWL|M`ca_*Em3Qs=t)9PfvZAOG`z5^|gLkN=dWqcjM( z-@g6ey#4U@{3D-)2tV20=LqMh6L> zO|B+<47w_VATK6CG13RpXQN_zHsRyY#o1`0PgwIsx)7Z1`Ps_Ix zz8YIE7UP*dO<({0#}|Bn`@!@6?t!YCs2}zDB(Ud2=AsT$?>+DN(nEH_sl8D&@b;;f zy5QV6E2??)yK)mc@_=0 MHu^agd=v!#4;48@C;$Ke diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json b/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json new file mode 100644 index 000000000000..5916ee4f8473 --- /dev/null +++ b/projects/1.16-fabric/assets/minecraft/minecraft/packer-policy.json @@ -0,0 +1,4 @@ +{ + "type": "plainclone", + "source": "./projects/1.16/minecraft/minecraft" +} \ No newline at end of file diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/readme.md b/projects/1.16-fabric/assets/minecraft/minecraft/readme.md deleted file mode 100644 index 1efc216f6cdc..000000000000 --- a/projects/1.16-fabric/assets/minecraft/minecraft/readme.md +++ /dev/null @@ -1,24 +0,0 @@ -# 全角字符修正与特殊字符补充 -- 本包添加了几个特殊字符字体,用于补充部分新确定的元素名称 -- 本包修正了中文全角字符的宽度和位置问题。 - -## 本包建议翻译文本采用左侧书写,在打包阶段使用脚本转换成右侧字符 - -| 翻译文本 | 转换字符 | 备注 | -| :------: | :------------: | :----------------------------------: | -| [[钅卢]] | `\ue900` | | -| [[钅杜]] | `\ue901` | | -| [[钅喜]] | `\ue902` | | -| [[钅波]] | `\ue903` | | -| [[钅黑]] | `\ue904` | | -| [[钅麦]] | `\u9fcf` | | -| [[钅达]] | `\ue906` | | -| [[钅仑]] | `\ue907` | | -| [[钅哥]] | `\u9fd4` | | -| [[钅尔]] | `\u9fed` | | -| [[钅夫]] | `\ue90a` | | -| 镆 | `\u9546` | 此元素名已存在对应字符,无需修改替换 | -| [[钅立]] | `\ue90c` | | -| [[石田]] | `\u9fec` | | -| [[奥气]] | `\u9feb` | | -| …… | `\ue908\ue909` | 全角省略号的修改 | \ No newline at end of file diff --git a/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png b/projects/1.16-fabric/assets/minecraft/minecraft/textures/font/cjk_punctuations.png deleted file mode 100644 index 35d947f198184d507e5690f93c2a0eeee1772a40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 zcmVKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z0W3*GK~#9!?Al8T!!Qg*QEwpoU+(L?G?X~{S-Js32L?Ch#FC;cNf(2$JJtbzQa8VM z=RIBf`?8n|prL@Q=fB;LyY(a1)d_%}qOeA^gTWJ!jOLi&0T6&%1KP!4iD(ysCm;pm z`L(W22w?ysi4MnOjR-&h0?^blo)88g08Ij5T@kBl~zWB z97sh%7|m3YXa<1lR%cPK@)-$$IyDooLmxEvaJv3A%L1zx0Qv5dyiXt*F6aSB$)_J7 z9zX!{3}KcF0chX}CFClU$W~|#x#vKYt1tlhe~7KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1IS54K~#9!%v#%SBQXfYkza@Z|4#e?>`PN+T>}SWch^!?B@+hB<#4f^s?x_&B4V+D>Viq%Tf}9o6Pc`qfiY8;>7+|2IgcHtqJ)< zm~T2Yf`JlNJ&8DU-v3OQE)GfvK&J}`^yHuSQF)#%(k%Tyt6HLiOcYddwMg-d8%0p2 z-+VSBZ0EUWEKbnN%3*o|CMDSt+^j$?*+y~VBA^k_7HI_VN}$7i%ilN0W>k2V?F(g- zzW~ah!u~Vzub_|<{LSCLE(k9NjYrdDr2$13l2bUzUz|!hqUS|nljU!s*=yJGm%R3b z^RQ8-KR{G_xpbyw2V(h<^MvyD!|<2w0}0HPy2<}BJf8zaSDeYK7Z{jIu@S|~YP+fG zb1|Au=91kago6_P)`@~7jJmyM16I%bZW!y-^Xj{QW2GIf|AIg_+Js$r&-Q8mi|mxi zf!(*xZ7EklMX%^H17UHDb87f-13_fdIr)7W z@ix+`=^e&6N)|@ejZI_*2T@CrZ7){eS8m0va-apF$a!QqptsHghr#&sGgEvQB@1Dv zhXQ^_ALG-C+KeOlCm8&}( ze}SRjiqLVYK^{f=jIvs=2l)lVZAT#DeVT|^O&ZjzzK|%)&J@{*ruk}M#9I$I?rOhg z^!E#JIn%d8kTHrAp{%#Ba(Bd=4@76`^rZvka!Y#EZXadk6r?bTa#Hr{pm&KEK>$uv zp{V@J{Wkwr;gywX_R(QNWt8T%K2b}B^p~xu12+o)3;+Z0!s1!!?Fs+@002ovPDHLk FV1h1#CARKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z07ywhK~#9!?AEaj03ZkeL9loKJzW4B2Qaa~;y$6HxKNQ*HKVZ+%>e)a0001d30P-t tdfsinKzc|3000000J;Gi009600{|g53;#YOj(z|D002ovPDHLkV1g8uUnc+n diff --git a/projects/1.16/assets/minecraft/minecraft/font/default.json b/projects/1.16/assets/minecraft/minecraft/font/default.json index d9baed727183..7a2c19d0aece 100644 --- a/projects/1.16/assets/minecraft/minecraft/font/default.json +++ b/projects/1.16/assets/minecraft/minecraft/font/default.json @@ -14,8 +14,8 @@ "file": "minecraft:font/cjk_punctuations.png", "ascent": 7, "chars": [ - "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c", - "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014" + "\u3001\u3002\u300a\u300b\u3010\u3011\u2018\u2019\u201c\uff5e\u3008\u3009\u0000\u0000\u0000\u0000", + "\u201d\uff01\uff08\uff09\uff0c\uff1a\uff1b\uff1f\u2014\u00b7\u0000\u0000\u0000\u0000\u0000\u0000" ] }, { @@ -28,7 +28,7 @@ }, { "type": "bitmap", - "file": "minecraft:font/2em-dash.png", + "file": "minecraft:font/2em_dash.png", "ascent": 7, "chars": [ "\u2e3a" diff --git a/projects/1.16/assets/minecraft/minecraft/font/glyph_sizes.bin b/projects/1.16/assets/minecraft/minecraft/font/glyph_sizes.bin deleted file mode 100644 index 0503133d08effbe3da2c993864b97aad1fb1207d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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