From 06fda266ebe6fbb3e05c3a23f7fdc21d881fdda5 Mon Sep 17 00:00:00 2001 From: Krutoy242 Date: Tue, 2 Jan 2024 11:38:24 +0300 Subject: [PATCH] =?UTF-8?q?build:=20=F0=9F=9A=A7=20Dev=20Environment=20cha?= =?UTF-8?q?nges?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + dev/.devonly.ignore | 2 + dev/TODO.md | 63 ++---- dev/automation/Inject_JS.js | 2 +- dev/automation/bansoukou.js | 88 +++----- dev/automation/jei.js | 37 ++-- dev/automation/misc.js | 1 - ...0\237\224\265 Mods updates autocommit.ps1" | 0 dev/lib/curseforge-md-to-html.js | 10 +- dev/lib/tellme.js | 6 +- dev/lib/utils.js | 68 +++--- dev/make_pack.js | 205 +++++------------ dev/release/GitHub_release_header.md | 0 dev/tools/mct-errors-config.yml | 21 ++ dev/tools/mct-run.json | 18 -- dev/tools/reduce_mods.json | 2 + dev/tools/unresolved-errors.log | 207 ++++++++++-------- mc-tools | 2 +- package.json | 8 +- server/SERVER_GUIDE.md | 3 + server/server-setup-config.yaml | 2 +- 21 files changed, 325 insertions(+), 421 deletions(-) rename dev/automation/autocommit.ps1 => "dev/automation/\360\237\224\265 Mods updates autocommit.ps1" (100%) delete mode 100644 dev/release/GitHub_release_header.md delete mode 100644 dev/tools/mct-run.json diff --git a/.gitignore b/.gitignore index 8b12af272..8c1e63beb 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,4 @@ scripts/nc_script_addons config/serializationisbad-remotecache.json config/loliasm/methods-stable_39.csv config/probezs.cfg +config/InfinityItemEditor.cfg diff --git a/dev/.devonly.ignore b/dev/.devonly.ignore index ae143999c..e4da75739 100644 --- a/dev/.devonly.ignore +++ b/dev/.devonly.ignore @@ -49,6 +49,8 @@ mods/FantasticLib-* mods/simplelogin-* mods/zenrecipereload-* mods/ProbeZS-* +mods/Caliper-* +mods/infinityeditor-* ComplementaryUnbound_* # Mods in process of testing to add them later diff --git a/dev/TODO.md b/dev/TODO.md index 802667c4a..f01bd87af 100644 --- a/dev/TODO.md +++ b/dev/TODO.md @@ -2,46 +2,22 @@ ๐Ÿšงโœ…โŒ List of priorities: -- [ ] โœ๏ธ Burn singularity should be exponential `1.25` -- [ ] โœ๏ธ Star Of Psi should be obtainable in no-power run -- [ ] ๐Ÿ“– Explain BoP gems sources in empowered quests -- [ ] ๐Ÿ› fix Ie Bug If Removing Entities When Crash On Mount -- [ ] โœ๏ธ Remove Mysical Flesh -- [ ] ๐Ÿ› Fix AdvRock planet jump causing death https://discord.com/channels/911676461050642432/959878900278784030/1179686673525776474 -- [ ] โœ๏ธ Remove usage of different fires from Cyclic -- [ ] โœ๏ธ Remove fast processing with Crushing block since its too fast -- [ ] โœ๏ธ fix 59% on Bees Output +- [ ] ๐Ÿ› fix when unlog on entity causing it to dissapear +- [ ] ๐Ÿค– Nanomachines still lost on servers +- [ ] โœ๏ธ add 3D Prints More Usage (maybe for QMD) +- [ ] โœ๏ธ Shift+Right click clear NC Multitool info +- [ ] โœ๏ธ Buff advanced generators +- [ ] ๐Ÿ“– remove Eldritch Knowledge Rewards since newbies eat them all at once - [ ] โœ๏ธ adv Rock Crystals Beneficate In QMD -- [ ] default Nanomachines Configs -- [ ] fix Trophy Crafting Not Working -- [ ] distructive Stabilisation Ring Not Working -- [ ] induction Smelter Add Energetic Alloy Recipe -- [ ] add Drawer Key To Morphing Tool -- [ ] fix I C2 Chainsaw Cant Cut T Ctrees -- [ ] fix Filament N B T -- [ ] fix Ic2 Fertilizer Recipe -- [ ] remove Grid Hotkey -- [ ] rolling Machine Remove False Quest Description -- [ ] install Threadwatcher -- [ ] remove Enchantments From Quests Rewards -- [ ] check If Compressed Cobble In E I O Smeltery Smeltable -- [ ] sulfuric acid recipe recipe in Chemical Reactor should also accept Mek's liquid -- [ ] Disable Quark's buttons for Modular Storage -- [ ] Remove cheap fluiduct recipe -- [ ] Install https://www.curseforge.com/minecraft/mc-mods/omniwand -- [ ] Replace BetterP2P to https://www.curseforge.com/minecraft/mc-mods/enhancedp2p -- [ ] Replace Villager Market to https://www.curseforge.com/minecraft/mc-mods/villager-market-nbt-fix -- [ ] find Option That Fix E U Ring On Change Dimension -- [ ] fix Dispenser Quest Typo C -- [ ] fix Tropical Gardens Spawn In Frozen Ocean -- [ ] check Shark Bite Glitching -- [ ] add3 D Prints More Usage -- [ ] remove Melodic Alloy Reservoir From I O -- [ ] remove All Modded Books From Rewards -- [ ] Remove useless ores from T6 ore miner -- [ ] disable Bogo Shuffle -- [ ] `betteranimalsplus_goose` replace for world tick instead of entity tick -- [ ] Remove Armor Curve +- [ ] โœ๏ธ steel And Up Turbine Upgrades Not Working +- [ ] ๐Ÿ“– note That Mithminite Armor Simplify Bores +- [ ] โšก Replace `utils.rh` with subcommands to improve performance. `IItemStack.ores` is slow. +- [ ] โœ๏ธ QMDs `Sodium Chlorde` and `Sodium Nitrate` unify +- [ ] ๐ŸŒ Fix Biome Tweaker block replacementsafter AdvRock filler block change +- [ ] ๐Ÿ–ผ๏ธ Optimize Bibliocraft textures +- [ ] โœ๏ธ addVoidBeaconTab +- [ ] addSkyblockTpMechanic +- [ ] Fix Myrmexes have double JER trade tabs ```sh /bcore_ticktime @@ -95,6 +71,8 @@ minecraft:sponge Planned non-urgent changes, or just good ideas: +- [ ] ๐ŸŒŽ fix Tropical Gardens Spawn In OTG Frozen Ocean +- [ ] โœ๏ธ Star Of Psi should be obtainable in no-power run - [ ] ๐Ÿ•ธ Create issues about IC2 Reactor in compact machine and cables disconnection - [ ] ๐Ÿ› If Conarm armor have huge durability (>65,000), when it get damage over 50% its repairing to 100% and become unbreakable. On some cases it void armor from inventory instead - [ ] ๐ŸŸข Return `TwilightTweaks` when fixed https://github.com/LoliKingdom/Bansoukou/issues/5 @@ -103,12 +81,9 @@ Planned non-urgent changes, or just good ideas: - [ ] ๐Ÿ“– sort TC book By Material Power, need fix: https://github.com/Project-RT/RandomTweaker/issues/67 - [ ] โœ๏ธ Stackable Fluid Containers duped when crafting with fluid. Waiting for fix: https://github.com/CraftTweaker/CraftTweaker/issues/1692 - [ ] โœ๏ธ Apiarist Villagert should sell Combs cor Cacoa. Seems like its impossible to remove Apiarist trades with `vtt` mod -- [ ] ๐ŸŸข add `Fairy Lights` when released https://github.com/ACGaming/UniversalTweaks/pull/291 - [ ] ๐Ÿ“– Improve messages "Player Obtained [...]" with `tellraw` command. Cant untill fix `/tellraw` for Discord - [ ] โœ๏ธ `Harbinger Cube` must spawn with strong Iron/Diamond skin effects and as Blight - [ ] ๐ŸŒ fix Mercury Have Water -- [ ] ๐ŸŸข Unify QMD cobalt dust after QMD update -- [ ] ๐ŸŸข Install `Fairy Lights` when fixed: https://github.com/ACGaming/UniversalTweaks/issues/289 - [ ] โœ๏ธ Add more seeds compat for Graden Cloche https://github.com/michelegargiulo/ZenCloche/wiki - [ ] ๐Ÿ”จ fix Invincible Combo `Strength Of Will` + `Runic Shield` - [ ] โœ๏ธ Fix Health boost potion recipe (one from gold ingot) @@ -220,7 +195,7 @@ Planned non-urgent changes, or just good ideas: - [ ] โœ๏ธ Add craft mechanic - Mud Ball hit something (called "humilate") - [ ] ๐Ÿ“– Add little tiles fancy chest with lot of space - [ ] โœ๏ธ Add mobs in Mek's gear -- [ ] ๐ŸŒ AdvRock geodes should contain modded ores +- [ ] ๐ŸŒ AdvRock geodes should contain modded ores (use XML tag) - [ ] โœ๏ธ Nerf IO spike metals (carapace with `Bedrock cobblestone` + `Bedrock Ore` inside instead of pure blocks) - [ ] โœ๏ธ Remove Cyclic's machines completely because they are laggy - [ ] โœ๏ธ Add craft `Rat hole` + `Salis Mundus` -> `Something` @@ -291,6 +266,8 @@ Planned non-urgent changes, or just good ideas: ## Unable to +- โœ๏ธ fix 59% on Bees Output such as Combs. Impossible since this how Mod Tweaker adds them. Some recipes have -1% some dont. +- โŒ fix I C2 Chainsaw Cant Cut T Ctrees. Impossible to change mining level with `MaterialChanger` - โœ๏ธ Add Rubber Wood in Resin Funnel - **Resin Funnel** recipes cant be changed - ๐Ÿ”„ Blacklist Bedrock Ore for ![](https://git.io/Jz9q9 "Mining Laser") - Buff Giant Sword diff --git a/dev/automation/Inject_JS.js b/dev/automation/Inject_JS.js index a93a9f968..34ad11942 100644 --- a/dev/automation/Inject_JS.js +++ b/dev/automation/Inject_JS.js @@ -125,7 +125,7 @@ export async function init(h = defaultHelper) { glob.sync('scripts/**/*.zs').forEach((filePath) => { const zsfileContent = loadText(filePath) for (const match of zsfileContent.matchAll( - /\/\*\s*Inject_js((\(|\{)[\s\S\n\r]*?(\)|\}))\s*\*\//gm + /\/\*\s*Inject_js((\(|\{)[\s\S\n\r]*?(\)|\})\s*)\*\//gm )) { const lineNumber = zsfileContent .substring(0, match.index) diff --git a/dev/automation/bansoukou.js b/dev/automation/bansoukou.js index b95600580..1cef2ef0b 100644 --- a/dev/automation/bansoukou.js +++ b/dev/automation/bansoukou.js @@ -7,7 +7,7 @@ // @ts-check -import { spawn } from 'node:child_process' +import { execSync, spawnSync } from 'node:child_process' import { existsSync, mkdirSync, renameSync, statSync, unlinkSync } from 'node:fs' import { dirname, join, parse } from 'node:path' import process from 'node:process' @@ -17,13 +17,11 @@ import AdmZip from 'adm-zip' import fast_glob from 'fast-glob' import levenshtein from 'fast-levenshtein' import _ from 'lodash' -import replace_in_file from 'replace-in-file' import { defaultHelper, execSyncInherit, loadJson, - loadText, saveObjAsJson, saveText, } from '../lib/utils.js' @@ -35,39 +33,11 @@ function relative(relPath = './') { export async function init(h = defaultHelper) { await h.begin('Fixing Bansoukou files') renameFoldersToActualMods() - injectJsonAdvancementFixes() await showDiffs(h) return h.result('Done!') } -function injectJsonAdvancementFixes() { - const json = loadJson(relative('bansoukou.json')) - for (const [glob, data] of Object.entries(json)) { - const filePaths = fast_glob.sync(`mods/${glob}`, { dot: true }) - for (const [archievePath, advJson] of Object.entries(data)) - saveFile(/** @type {string} */ (filePaths.pop()), archievePath, advJson) - } - return Object.entries(json).length -} - -/** - * @param {string} jarPath - * @param {string} archievePath - * @param {object} advJson - */ -function saveFile(jarPath, archievePath, advJson) { - const savePath = join('bansoukou/', getJarName(jarPath), archievePath) - const oldText = loadText(savePath) - const newText = JSON.stringify(advJson, null, 2) - if (oldText.length === newText.length && oldText === newText) return - saveText(newText, savePath) -} - -function getJarName(jarPath) { - return jarPath.match(/^mods\/(.+)\.(jar|disabled)$/)[1] -} - /** * Get names of all folders inside ./bansoukou/ */ @@ -133,9 +103,10 @@ async function showDiffs(/** @type {typeof defaultHelper} */ h) { ? `mods/${folder}.disabled` : `mods/${folder}.jar` if (!existsSync(jarPath)) continue - const jarStat = getStat(jarPath) + const jarStat = statToString(statSync(jarPath)) const isJarCached = caches[jarPath] === jarStat caches[jarPath] = jarStat + const unpatchedModPath = join('~bansoukou_unpatched/', folder) /** @type {AdmZip | undefined} */ let zip @@ -146,14 +117,20 @@ async function showDiffs(/** @type {typeof defaultHelper} */ h) { cwd: `bansoukou/${folder}`, }) + // Generate Diffs changedFiles.forEach((changedFile) => { - const unpatchedModPath = join('~bansoukou_unpatched/', folder) - const unpatchedFilePath = join(unpatchedModPath, changedFile) const patchedFilePath = join('bansoukou', folder, changedFile) + const diffOut = `${join(diffStore, folder, changedFile)}.diff` + const diffExist = existsSync(diffOut) + const stat = statSync(patchedFilePath) + + // If file just supposed to be removed no diffs will be generated + if (!stat.size) return // Skip if both files unchanged - const fileStat = getStat(patchedFilePath) - if (isJarCached && caches[patchedFilePath] === fileStat) return + // Never skip if diff file not exist + const fileStat = statToString(stat) + if (diffExist && isJarCached && caches[patchedFilePath] === fileStat) return // Extract unpatched file try { @@ -164,24 +141,34 @@ async function showDiffs(/** @type {typeof defaultHelper} */ h) { return } + const unpatchedFilePath = join(unpatchedModPath, changedFile) const { oldF, newF } = decompile(unpatchedFilePath, patchedFilePath) - const diffOut = `${join(diffStore, folder, changedFile)}.diff` mkdirSync(dirname(diffOut), { recursive: true }) + const gitDiffCommand = 'git diff --no-index' + + ` "${oldF}"` + + ` "${newF}"` + // process.stdout.write(`> ${chalk.cyan(gitDiffCommand)}\n`) + + /** @type {string|undefined} */ + let diffResult try { - execSyncInherit( - 'git diff --no-index' - + ` "${oldF}"` - + ` "${newF}"` - + ` > "${diffOut}"` - ) + diffResult = execSync(gitDiffCommand).toString().trim() } catch (error) { // Diff will end with error each time + diffResult = error?.stdout.toString().trim() + } + + // Remove diff technical info + if (diffResult) { + diffResult = diffResult.replace(/^diff --git .+\nindex .+\n(--- .+\n\+\+\+ .+|Binary files .+)\n/m, '') + saveText(diffResult, diffOut) } + try { - spawn( + spawnSync( 'code --diff' + ` "${oldF}"` + ` "${newF}"` @@ -190,13 +177,6 @@ async function showDiffs(/** @type {typeof defaultHelper} */ h) { } catch (error) {} - // Remove diff technical info - replace_in_file.sync({ - files: diffOut, - from : /^diff --git .+\nindex .+\n--- .+\n\+\+\+ .+\n/m, - to : '', - }) - // Remove tempFiles if (unpatchedFilePath !== oldF) unlinkSync(oldF) if (patchedFilePath !== newF) unlinkSync(newF) @@ -241,12 +221,10 @@ function decompile(unpatchedFilePath, patchedFilePath) { } /** - * - * @param {string} filePath * @returns {string} + * @param {import("fs").Stats} stat */ -function getStat(filePath) { - const stat = statSync(filePath) +function statToString(stat) { return `${stat.mtime.toUTCString()} - ${stat.size}` } diff --git a/dev/automation/jei.js b/dev/automation/jei.js index 183fa251c..b55b11e05 100644 --- a/dev/automation/jei.js +++ b/dev/automation/jei.js @@ -9,6 +9,8 @@ // @ts-check +import process from 'node:process' + import { getPurged, getSubMetas } from '../lib/tellme.js' import { config, @@ -30,10 +32,11 @@ export async function init(h = defaultHelper) { /** @type {string[]} */ const pure = [] - /** @type {Set} */ - const removedMods = new Set() const modList = getCSV('config/tellme/mod-list-csv.csv') + const itemsCsv = getCSV('config/tellme/items-csv.csv') + const definitions = Object.fromEntries(itemsCsv.map(o => [o['Registry name'], true])) + /** @type {string[]} */ const merged = [...config(jeiConfigPath).advanced.itemBlacklist, ...purged] @@ -53,17 +56,21 @@ export async function init(h = defaultHelper) { if (next.includes(s)) return // If wildcarded - const def = s.match(/([^:]+:[^:]+)[:;].+/)?.[1] - if (def && merged.includes(def)) return - - // If mod not exist - const mod = s.split(':')[0] - if ( - !['fluid', 'gas'].includes(mod) - && !modList.some(m => m.ModID === mod) - ) { - removedMods.add(mod) - return + /** @type {string} */ + // @ts-expect-error undef + const defMetaed = s.match(/([^:]+:[^:]+)[:;].+/)?.[1] + if (defMetaed && merged.includes(defMetaed)) return + + // If definition doesnt exist + const splitted = s.split(':') + const mod = splitted[0] + const def = splitted.slice(0, 2).join(':') + if (mod !== 'fluid' && mod !== 'gas') { + // If mod not exist + if (!modList.some(m => m.ModID === mod)) return + + // Item not exist + if (!definitions[def]) return } pure.push(s) @@ -81,8 +88,8 @@ export async function init(h = defaultHelper) { await h.begin(`injected :>> ${injected[0].numMatches}`) h.result( - `Purged / Manually Blacklisted: ${purged.length} / ${ - pure.length - purged.length + `Purged / Manually Blacklisted: ${purged.size} / ${ + pure.length - purged.size }` ) } diff --git a/dev/automation/misc.js b/dev/automation/misc.js index fd3b13fde..d2aa767a4 100644 --- a/dev/automation/misc.js +++ b/dev/automation/misc.js @@ -65,7 +65,6 @@ export async function init(h = defaultHelper, options = argv) { '', '', '', - '', '', '', '', diff --git a/dev/automation/autocommit.ps1 "b/dev/automation/\360\237\224\265 Mods updates autocommit.ps1" similarity index 100% rename from dev/automation/autocommit.ps1 rename to "dev/automation/\360\237\224\265 Mods updates autocommit.ps1" diff --git a/dev/lib/curseforge-md-to-html.js b/dev/lib/curseforge-md-to-html.js index 55a5e3511..0535ea8e2 100644 --- a/dev/lib/curseforge-md-to-html.js +++ b/dev/lib/curseforge-md-to-html.js @@ -64,11 +64,11 @@ for (const o of ['d', 'h']) { // Find all elements and replace new lines with
// Curse Forge cant in newlines inside code blocks -$('code').each(function () { - const codeContent = $(this).html() - if (!codeContent) return - $(this).html(codeContent.replace(/\n/g, '
\n').replace(/ /g, 'ย ')) -}) +// $('code').each(function () { +// const codeContent = $(this).html() +// if (!codeContent) return +// $(this).html(codeContent.replace(/\n/g, '
\n').replace(/ /g, 'ย ')) +// }) // ๐‘ท๐’“๐’†๐’‡๐’Š๐’™๐’†๐’” $('body').prepend( diff --git a/dev/lib/tellme.js b/dev/lib/tellme.js index d2fc7642d..586c810a8 100644 --- a/dev/lib/tellme.js +++ b/dev/lib/tellme.js @@ -111,7 +111,7 @@ export function getSubMetas(definition) { } /** - * @typedef {Object} TMStack Tell Me Item Stack + * @typedef {object} TMStack Tell Me Item Stack * @property {string} mod 'Astral Sorcery' * @property {string} id 'minecraft:stone' * @property {number} itemId 1234 @@ -296,7 +296,7 @@ export function prefferedModSort(a, b) { } /** - * @typedef {Object} FurnaceRecipe + * @typedef {object} FurnaceRecipe * @property {string} output * @property {string} out_id * @property {string} out_meta @@ -462,7 +462,7 @@ export function getSomething(ore_base, kindKeys, blacklist = []) { } /** - * @typedef {Object} TableRecipe + * @typedef {object} TableRecipe * @property {string} shape * @property {string} name * @property {string} output diff --git a/dev/lib/utils.js b/dev/lib/utils.js index 806c20555..a993cccd2 100644 --- a/dev/lib/utils.js +++ b/dev/lib/utils.js @@ -22,7 +22,6 @@ import chalk from 'chalk' import { parse as csvParseSync } from 'csv-parse/sync' import fast_glob from 'fast-glob' import pdf from 'pdf-parse/lib/pdf-parse.js' -import replace_in_file from 'replace-in-file' function relative(relPath = './') { return fileURLToPath(new URL(relPath, import.meta.url)) @@ -117,14 +116,16 @@ export const config = createHashedFunction((filename) => { .replace(/^~.*$/gm, '') // config version .replace(/^ *(\w+|"[^"]+") *{ *$/gm, '$1:{') // class name .replace(/^ *} *$/gm, '},') // end of block + // Encapsulate values with "" .replace( /^ *\w:(?:([\w.]+)|"([^"]+)") *= *(.*)$/gm, - (match, p1, p2, p3) => { - return (isNaN(p3) && !(p3 === 'true' || p3 === 'false')) || p3 === '' - ? `"${p1 || p2}":"${p3.replace(/"/g, '\\"')}",` - : `"${p1 || p2}":${p3.replace(/"/g, '\\"')},` + (match, key1, key2, val) => { + return (isNaN(val) && !(val === 'true' || val === 'false')) || val === '' + ? `"${key1 || key2}":"${val.replace(/"/g, '\\"')}",` + : `"${key1 || key2}":${val.replace(/"/g, '\\"')},` } - ) // simple values + ) + // Replace lists .replace( /^ *\w:(?:([\w.]+)|"([^"]+)") *< *[\s\S\n\r]*?> *$/gm, (match, p1, p2) => { @@ -136,7 +137,8 @@ export const config = createHashedFunction((filename) => { '],', ].join('\n') } - ) // Replace lists + ) + .replace(/\s*\n\s*\n+/gm, '\n') // remove residue newlines after converting /** * @type {object} @@ -150,7 +152,7 @@ export const config = createHashedFunction((filename) => { console.error(error) writeFileSync( relative(`_error_${subFileName(filename)}.js`), - `return{${cfg.replace(/\n\n+/gm, '\n')}}` + `return{${cfg}}` ) } @@ -204,27 +206,39 @@ export function transpose(a) { * @param {string} text */ export function injectInFile(filename, keyStart, keyFinish, text) { - /** @type {import('replace-in-file').ReplaceResult[]} */ - let replaceResult - try { - const from = new RegExp( - `${escapeRegex(keyStart)}[\\s\\S\n\r]*?${escapeRegex(keyFinish)}`, - 'm' - ) - replaceResult = replace_in_file.sync({ - files : filename, - from, - to : keyStart + text + keyFinish, - countMatches: true, - }) - } - catch (error) { - console.error('Inject Error occurred:', error) - return [] + return Array.isArray(filename) + ? filename.map(f => injectInSingleFile(f, keyStart, keyFinish, text)) + : [injectInSingleFile(filename, keyStart, keyFinish, text)] +} + +/** + * @param {string} filename + * @param {string} keyStart + * @param {string} keyFinish + * @param {string} text + */ +function injectInSingleFile(filename, keyStart, keyFinish, text) { + const oldText = loadText(filename) + const result = { + file : filename, + hasChanged : true, + numMatches : 0, + numReplacements: 0, } + const newText = oldText.replace(new RegExp( + `${escapeRegex(keyStart)}[\\s\\S\n\r]*?${escapeRegex(keyFinish)}`, + 'm' + ), () => { + result.numMatches++ + result.numReplacements++ + return keyStart + text + keyFinish + }) + + if (!result.numMatches) throw new Error(`Cant replace in file ${filename}`) - if (!replaceResult?.[0]?.numMatches) throw new Error(`Cant replace in file ${filename}`) - return replaceResult + saveText(newText, filename) + + return result } export function write(...args) { diff --git a/dev/make_pack.js b/dev/make_pack.js index 860c21fcd..d2c218d90 100644 --- a/dev/make_pack.js +++ b/dev/make_pack.js @@ -23,7 +23,6 @@ import fs_extra from 'fs-extra' import git_describe from 'git-describe' import ignore from 'ignore' import logUpdate from 'log-update' -import numeral from 'numeral' import open from 'open' import replace_in_file from 'replace-in-file' import simpleGit from 'simple-git' @@ -35,7 +34,6 @@ import { end, execSyncInherit, loadJson, - loadText, saveObjAsJson, saveText, write, @@ -43,7 +41,7 @@ import { const { gitDescribeSync } = git_describe const { terminal: term } = terminal_kit -const { rmSync, mkdirSync, existsSync, renameSync, copySync, readFileSync, writeFileSync, lstatSync } +const { rmSync, mkdirSync, existsSync, renameSync, readFileSync, writeFileSync, lstatSync } = fs_extra const git = simpleGit() @@ -136,6 +134,8 @@ const style = { */ write(`${chalk.gray('-'.repeat(20))}\n`) + let STEP = 1 + /** * Prompt user to write something and press ENTER or ESC * @param {string} message message to show @@ -143,7 +143,8 @@ const style = { * @returns {Promise} inputted string or undefined */ async function enterString(message, options) { - term(style.trace(message.replace(/(ENTER|ESC)/g, style.info('$1')))) + const msg = `[${STEP++}] ${message}` + term(style.trace(msg.replace(/(ENTER|ESC)/g, style.info('$1')))) const result = await term.inputField({ cancelable: true, ...(options ?? {}), @@ -166,15 +167,13 @@ const style = { return true } - let STEP = 1 - if ( await pressEnterOrEsc( - `[${STEP++}] Press ENTER to perform Automation. Press ESC to skip.` + `Press ENTER to perform Automation. Press ESC to skip.` ) ) { doTask('๐Ÿช“ Doing automation ...\n\n', () => - execSyncInherit('esno mc-tools/packages/run/src/cli.ts dev/tools/mct-run.json')) + execSyncInherit('esno mc-tools/packages/run/src/cli.ts "dev:(.*)"')) } /* @@ -186,16 +185,18 @@ const style = { โ•šโ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ•โ• โ•šโ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• */ - const oldVersion = gitDescribeSync().tag + const oldVersion = gitDescribeSync().tag || undefined const inputVersion = ( - await enterString(`[${STEP++}] Enter next version and press ENTER: `, { - default: oldVersion || undefined, + await enterString(`Enter next version and press ENTER: `, { + default: oldVersion, }) )?.trim() const nextVersion = inputVersion || oldVersion || 'v???' + const zipBaseName = `E2E-Extended-${nextVersion}` + const serverSetupConfig = 'server/server-setup-config.yaml' - if (await pressEnterOrEsc(`[${STEP++}] Generate Changelog? ENTER / ESC.`)) { + if (await pressEnterOrEsc(`Generate Changelog? ENTER / ESC.`)) { const latestPath = 'CHANGELOG-latest.md' // Update version in files @@ -206,6 +207,11 @@ const style = { from : /(^ {2}"version"[\s\n]*:[\s\n]*")[^"]+("[\s\n]*,)/m, to : `$1${nextVersion}$2`, }) + replace_in_file.sync({ + files: serverSetupConfig, + from : /^( {2}modpackUrl\s*:\s*)(.+)$/m, + to : `$1https://github.com/Krutoy242/Enigmatica2Expert-Extended/releases/download/${nextVersion}/${zipBaseName}.zip`, + }) // Generate changelog execSyncInherit(`npx conventional-changelog-cli --config dev/tools/changelog/config.cjs -o ${latestPath}`) @@ -217,12 +223,12 @@ const style = { } await pressEnterOrEsc( - `[${STEP++}] Clear your working tree, rebase, and press ENTER. Press ESC to skip.`, + `Clear your working tree, rebase, and press ENTER. Press ESC to skip.`, async () => (await git.status()).isClean() ) - if (await pressEnterOrEsc(`[${STEP++}] Add tag? ENTER / ESC.`)) - execSyncInherit(`git tag -a -f -m "Next automating release" ${nextVersion}`) + if (await pressEnterOrEsc(`Add tag? ENTER / ESC.`)) + execSyncInherit(`git tag -a -f -m "Next automated release" ${nextVersion}`) /* โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— @@ -233,14 +239,14 @@ const style = { โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• */ - const zipPath_base = join(distrDir, `E2E-Extended-${nextVersion}`) + const zipPath_base = join(distrDir, zipBaseName) const zipPath_EN = `${zipPath_base}.zip` const zipPath_server = `${zipPath_base}-server.zip` const isZipsExist = !argv.dryRun && [zipPath_EN, zipPath_server].some(f => existsSync(f)) let rewriteOldZipFiles = false - if (isZipsExist && (await pressEnterOrEsc(`[${STEP++}] Rewrite old .zip files? ENTER / ESC`))) { + if (isZipsExist && (await pressEnterOrEsc(`Rewrite old .zip files? ENTER / ESC`))) { rewriteOldZipFiles = true doTask( '๐Ÿช“ Removing old zip files ... ', @@ -325,79 +331,8 @@ const style = { return zipHandler } - /******************************************************** - -โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— -โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘ -โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘ -โ–ˆโ–ˆโ•”โ•โ•โ• โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ -โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•‘ -โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•โ• - -********************************************************/ makeZips && doTask('๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ Create EN .zip ... \n', () => withZip(zipPath_EN)('.'), tmpDir) - - /******************************************************** - -โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— -โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— -โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• -โ•šโ•โ•โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•”โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— -โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ -โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ• - -********************************************************/ - - /** - * Patterns of files that should be removed from server - */ - const serveronlyIgnore = ignore().add(loadText('dev/.serveronly.ignore')) - - /** List of all server-side mod JARs, except bansoukou and devonly */ - const serverModsList = globs(['mods/*.jar', 'mods/*/*.jar']) - .filter(serveronlyIgnore.createFilter()) // Ignore clientside files - .filter(devonlyIgnore.createFilter()) // Ignore devonly files - .filter(f => !f.endsWith('-patched.jar')) // Bansoukou-patched files should be handled separately - - // List of mods, patched with Bansoukou, but without extension - // mods/betteranimalsplus-1.12.2-9.0.1 - // mods/NuclearCraft-2.18zz-1.12.2 - const unpatchedList = globs('mods/*-patched.jar').map(f => - f.replace('-patched.jar', '') - ) - - makeZips && doTask( - '๐Ÿช‘ Removing client-only files and folders ... ', - () => removeFiles(getIgnoredFiles(serveronlyIgnore)), - tmpOverrides - ) - makeZips && doTask('๐Ÿช‘ Add server root files ... ', () => { - const files = globs('*', { cwd: serverRoot }) - files.forEach(f => copySync(join(serverRoot, f), join(tmpOverrides, f))) - return `added: ${files.length}` - }) - - makeZips && doTask('๐Ÿ“ฅ Create server zip ... \n', () => { - // Add everything in overrides dir - const zip = withZip(zipPath_server) - zip('.') - - // Add mods - write('\n Add server mods\n') - process.chdir(mcClientPath) - zip(serverModsList) - - // Add Unpatched by Bansoukou mods - write('\n Add & Rename Bansoukou-unpatched mods\n') - const disabledList = unpatchedList.map(f => `${f}.disabled`) - const renameList = unpatchedList.flatMap(f => [ - `${f}.disabled`, - `${f}.jar`, - ]) - process.chdir(mcClientPath) - zip(disabledList) - zip(renameList, 'rn') - }, tmpOverrides) + makeZips && doTask('๐Ÿ“ฅ Create server zip ... \n', () => withZip(zipPath_server)('.'), serverRoot) /* โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— @@ -411,45 +346,29 @@ const style = { /** * @type {{ dir:string, label:string, config: {[key:string]:string} }[]} */ - const sftpConfigs = globs('secrets/sftp_servers/*/sftp.json').map( - (filename) => { - const dir = parse(filename).dir - return { - dir, - label : /** @type {string} */ (dir.split('/').pop()), - config: loadJson(filename), - } + const sftpConfigs = globs('secrets/sftp_servers/*/sftp.json').map((filename) => { + const dir = parse(filename).dir + return { + dir, + label : /** @type {string} */ (dir.split('/').pop()), + config: loadJson(filename), } - ) + }) // Relative to overrides const serverAllOverrides = globs('./*', { cwd: tmpOverrides }) - // Relative paths of dirs like - // - bansoukou - // - config + // Relative paths of dirs like [bansoukou, config, ...] const serverRemoveDirs = serverAllOverrides .filter(f => lstatSync(join(tmpOverrides, f)).isDirectory()) .concat('mods') - /** @type {import('boxen').Options} */ - const defBoxStyle = { - borderStyle: 'round', - borderColor: '#22577a', - width : 50, - padding : { left: 1, right: 1 }, - } - for (const conf of sftpConfigs) { logUpdate.done() - if ( - !(await pressEnterOrEsc( - `[${STEP++}] To upload SFTP ${style.string( - conf.label - )} press ENTER. Press ESC to skip.` - )) - ) + if (!(await pressEnterOrEsc( + `To upload SFTP ${style.string(conf.label)} press ENTER. Press ESC to skip.` + ))) continue const sftp = new Client() @@ -459,8 +378,11 @@ const style = { boxen( args.map((v, i) => Object.values(style)[i](String(v))).join(' '), { - ...defBoxStyle, - title: style.info(conf.label), + borderStyle: 'round', + borderColor: '#22577a', + width : 50, + padding : { left: 1, right: 1 }, + title : style.info(conf.label), } ) ) @@ -486,46 +408,19 @@ const style = { }) ) - const zipName = parse(zipPath_server).base - updateBox('Copy server pack') - const bytes = (/** @type {number} */ v) => numeral(v).format('0.0b') - let step = 0 - await sftp.fastPut(zipPath_server, zipName, { - step: (total_transferred, chunk, total) => { - if (step++ % 10 !== 0) return - updateBox( - 'Copy server pack', - bytes(total_transferred), - '/', - bytes(total) - ) - }, - }) - - await pressEnterOrEsc( - `Go to SFTP server, Unpack ${style.log( - zipName - )} and press ENTER to override` - ) + updateBox(`Copy ${serverSetupConfig}`) + await sftp.fastPut(serverSetupConfig, serverSetupConfig) updateBox('Change and copy server overrides') - const configPath = join( - conf.dir, - 'overrides/config/mc2discord.toml' - ) - - saveText( - loadText(configPath).replace( - /(start\s*=\s*")[^"]+"/, - `$1\`\`\`diff\\n+ Server Started! +\\n ${nextVersion}\\n\`\`\`"` - ), - configPath - ) + replace_in_file.sync({ + files: join(conf.dir, 'overrides/config/mc2discord.toml'), + from : /(start\s*=\s*")[^"]+"/, + to : `$1\`\`\`diff\\n+ Server Started! +\\n ${nextVersion}\\n\`\`\`"`, + }) let fileCounter = 0 sftp.on('upload', () => updateBox('Copy overrides', ++fileCounter)) - const allOverridesDir = join(conf.dir, 'overrides') - await sftp.uploadDir(allOverridesDir, './') + await sftp.uploadDir(join(conf.dir, 'overrides'), './') await sftp.end() } @@ -539,11 +434,11 @@ const style = { โ•šโ•โ• โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• */ - if (await pressEnterOrEsc(`[${STEP++}] Push tag? ENTER / ESC`)) + if (await pressEnterOrEsc(`Push tag? ENTER / ESC`)) execSyncInherit('git push --follow-tags') const inputTitle = await enterString( - `[${STEP++}] Enter release title and press ENTER. Press ESC to skip release: ` + `Enter release title and press ENTER. Press ESC to skip release: ` ) if (inputTitle !== undefined) { diff --git a/dev/release/GitHub_release_header.md b/dev/release/GitHub_release_header.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/dev/tools/mct-errors-config.yml b/dev/tools/mct-errors-config.yml index ded5b3aa2..7f404fcca 100644 --- a/dev/tools/mct-errors-config.yml +++ b/dev/tools/mct-errors-config.yml @@ -29,6 +29,10 @@ replace: - from: '@[0-9a-f]{4,8}' to: '@xxxxxxxx' + # Remove other obfuscated names + - from: \$[a-z]{3}000\$ + to: $xxx000$ + # Cut long stack traces - from: '(?(^[^\n]*$\n){5})([^\n]*\n.*)+' to: $ [...] @@ -164,6 +168,10 @@ ignore: - WARN. .justenoughdimensions.. \*{15} - 'WARN. .justenoughdimensions.. \*{5} ' + # Better Biome Blend safe warning that Optifine not installed + - WARN. .mixin.. Error loading class. net/optifine/CustomColors \(java\.lang\.ClassNotFoundException. The specified class 'net\.optifine\.CustomColors' was not found\) + - WARN. .mixin.. @Mixin target net\.optifine\.CustomColors was not found mixins\.betterbiomeblend\.json:MixinCustomColors from mod unknown-owner + # Safe WARNings, just for information - '\[LLibrary Core\]: Unable to call Core API! It has not been initialized yet!' - '\[brandonscore\]: No features were detected for mod: brandonscore.' @@ -310,6 +318,9 @@ ignore: - ERROR. .org.embeddedt.vintagefix.dynamicresources.model.DynamicBakedModelProvider.. Error occured while loading model .+ - ERROR. .VintageFix.. Suppressing further model loading errors for namespace .+ + # Hide all texture errors since they mostly have no effect on game (textures for unused items) + - ERROR. .FML.TEXTURE_ERRORS.. + # Universal Tweaks Warns: - WARN. .mixin.. Method overwrite conflict for getRenderBoundingBox in mixins.bugfixes.blocks.banner.json:UTBannerBoundingBoxMixin from mod \w+, previously written by meldexun.renderlib.mixin.MixinTileEntityBanner. Skipping method. - WARN. .probezs.. Do not know zenscript type for @@ -318,3 +329,13 @@ ignore: # ProbeZS but its only for Dev environment - probezs + + # Malek's Infinity Gauntlet make this error happens, but we dont care about this IC2 loot chest additions + - ERROR. .net.minecraft.world.storage.loot.LootTableManager.. Couldn't load loot table (ic2:chests/|endreborn:inject) + + # In E2EE i removed Lua 5.2 and 5.4 libraries from .jar + - WARN. .opencomputers.. Native library with name 'libjnlua5(2|4)-windows-x86_64.dll' not found. + - WARN. .opencomputers.. Unsupported platform, you won't be able to host games with persistent computers. + + # Hide infinity itemEditor since we dont care + - ERROR\] \[Had Enough Items\]. Creative tab crashed while getting items\. Some items from this tab will be missing from the item list\. ruukas\.infinityeditor\.tab\.InfinityTab diff --git a/dev/tools/mct-run.json b/dev/tools/mct-run.json deleted file mode 100644 index f94bf29b8..000000000 --- a/dev/tools/mct-run.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "tellme": "esno config/tellme/!rename_update.js" - ,"errors": "esno mc-tools/packages/errors/src/cli.ts --config=dev/tools/mct-errors-config.yml --output=dev/tools/unresolved-errors.log" - ,"tcon": "esno mc-tools/packages/tcon/src/cli.ts --default=dev/default_configs/tweakersconstruct.cfg --tweaks=dev/tools/tcon/tweaks --save=dev/tools/tcon/stats" - ,"ftbq_cleanup": "esno mc-tools/scripts/ftbq_cleanup.ts" - ,"benchmark": "mc-benchmark --output=dev/benchmarks/latest.md" - ,"patchouli": "esno dev/Patchouli/Patchouli.js" - ,"bansoukou": "esno dev/automation/bansoukou.js" - ,"entities": "esno dev/automation/entities.js" - ,"inject_js": "esno dev/automation/Inject_JS.js" - ,"jei": "esno dev/automation/jei.js" - ,"misc": "esno dev/automation/misc.js --keep-cache" - ,"Conflicts": "esno dev/automation/recipe_conflicts.js" - ,"tips": "esno dev/automation/tips.js" - ,"XML": "esno dev/automation/XML.js" - ,"manifest": "esno mc-tools/packages/manifest/src/cli.ts --verbose --ignore=dev/.devonly.ignore --key=secrets/~cf_api_key.txt" - ,"modlist": "esno mc-tools/packages/modlist/src/cli.ts --old=../E2E-unchanged/minecraftinstance.json --verbose --ignore=dev/.devonly.ignore --key=secrets/~cf_api_key.txt --template=dev/tools/modlist_template.md" -} \ No newline at end of file diff --git a/dev/tools/reduce_mods.json b/dev/tools/reduce_mods.json index f4249b209..1429c5828 100644 --- a/dev/tools/reduce_mods.json +++ b/dev/tools/reduce_mods.json @@ -8,6 +8,8 @@ "name": "Soft", "description": "Remove mods, that has impact on performance. Not server-safe", "list": [ + "maleksinfinitygauntlet", + "omniwand-", "justenoughdimensions-", "MiniEffects-", "SoundFilters-", diff --git a/dev/tools/unresolved-errors.log b/dev/tools/unresolved-errors.log index 113be6197..fcebbbb89 100644 --- a/dev/tools/unresolved-errors.log +++ b/dev/tools/unresolved-errors.log @@ -1,96 +1,119 @@ -[main/ERROR] [Bansoukou]: Throwing -java.io.FileNotFoundException: twilighttweaks-1.12.2-v1.0.2.jar.jar does not exist in mods folder! - at zone.rong.bansoukou.BansoukouCoreMod.getPatchFile(BansoukouCoreMod.java:198) [_bansoukou-4.3.1.jar:1] - at zone.rong.bansoukou.BansoukouCoreMod.(BansoukouCoreMod.java:61) [_bansoukou-4.3.1.jar:1] - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_352] - [...] -[main/WARN] [mixin]: Reference map 'mixins.zenrecipereloading.refmap.json' for mixins.zenrecipereloading.json could not be read. If this is a development environment you can ignore this message -[main/WARN] [mixin]: Error loading class: journeymap/client/task/multi/TaskController (java.lang.ClassNotFoundException: The specified class 'journeymap.client.task.multi.TaskController' was not found) -[main/WARN] [mixin]: @Mixin target journeymap.client.task.multi.TaskController was not found mixins.sledgehammer.journeymap.json:client.task.multi.TaskControllerMixin from mod unknown-owner -[main/WARN] [mixin]: Error loading class: journeymap/client/JourneymapClient (java.lang.ClassNotFoundException: The specified class 'journeymap.client.JourneymapClient' was not found) -[main/WARN] [mixin]: @Mixin target journeymap.client.JourneymapClient was not found mixins.sledgehammer.journeymap.json:client.JourneymapClientMixin from mod unknown-owner -[Client thread/WARN] [mixin]: @Inject(@At("INVOKE")) Shift.BY=2 on mixins.zenutils.vanilla.json:MixinForgeHooks from mod unknown-owner::handler$zzc000$passPlayer exceeds the maximum allowed value: 0. Increase the value of maxShiftBy to suppress this warning. -[Client thread/ERROR] [FML]: Unable to read a class file correctly -java.lang.IllegalArgumentException: null - at org.objectweb.asm.ClassReader.(ClassReader.java:185) ~[asm-debug-all-5.2.jar:5.2] - at org.objectweb.asm.ClassReader.(ClassReader.java:168) ~[asm-debug-all-5.2.jar:5.2] - at org.objectweb.asm.ClassReader.(ClassReader.java:439) ~[asm-debug-all-5.2.jar:5.2] - [...] -[Client thread/ERROR] [FML]: There was a problem reading the entry META-INF/versions/9/module-info.class in the jar E:\mc\packs\E2E-E\minecraft\mods\ProbeZS-1.17.8.jar - probably a corrupt zip +[main/ERROR] [Bansoukou]: Throwing +java.io.FileNotFoundException: twilighttweaks-1.12.2-v1.0.2.jar.jar does not exist in mods folder! + at zone.rong.bansoukou.BansoukouCoreMod.getPatchFile(BansoukouCoreMod.java:198) [_bansoukou-4.3.1.jar:1] + at zone.rong.bansoukou.BansoukouCoreMod.(BansoukouCoreMod.java:61) [_bansoukou-4.3.1.jar:1] + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_352] + [...] +[main/WARN] [mixin]: Error loading class: journeymap/client/task/multi/TaskController (java.lang.ClassNotFoundException: The specified class 'journeymap.client.task.multi.TaskController' was not found) +[main/WARN] [mixin]: @Mixin target journeymap.client.task.multi.TaskController was not found mixins.sledgehammer.journeymap.json:client.task.multi.TaskControllerMixin from mod unknown-owner +[main/WARN] [mixin]: Error loading class: journeymap/client/JourneymapClient (java.lang.ClassNotFoundException: The specified class 'journeymap.client.JourneymapClient' was not found) +[main/WARN] [mixin]: @Mixin target journeymap.client.JourneymapClient was not found mixins.sledgehammer.journeymap.json:client.JourneymapClientMixin from mod unknown-owner +[Client thread/WARN] [mixin]: @Inject(@At("INVOKE")) Shift.BY=2 on mixins.zenutils.vanilla.json:MixinForgeHooks from mod unknown-owner::handler$xxx000$passPlayer exceeds the maximum allowed value: 0. Increase the value of maxShiftBy to suppress this warning. +[Client thread/ERROR] [FML]: Unable to read a class file correctly +java.lang.IllegalArgumentException: null + at org.objectweb.asm.ClassReader.(ClassReader.java:185) ~[asm-debug-all-5.2.jar:5.2] + at org.objectweb.asm.ClassReader.(ClassReader.java:168) ~[asm-debug-all-5.2.jar:5.2] + at org.objectweb.asm.ClassReader.(ClassReader.java:439) ~[asm-debug-all-5.2.jar:5.2] + [...] +[Client thread/ERROR] [FML]: There was a problem reading the entry module-info.class in the jar E:\mc\packs\E2E-E\minecraft\mods\PrecisionMining-1.12.2-5.2.jar - probably a corrupt zip net.minecraftforge.fml.common.LoaderException: java.lang.IllegalArgumentException - - at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] - at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$zln000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] - [...] -[Client thread/WARN] [FML]: Zip file ProbeZS-1.17.8.jar failed to read properly, it will be ignored + + at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] + at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$xxx000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] + [...] +[Client thread/WARN] [FML]: Zip file PrecisionMining-1.12.2-5.2.jar failed to read properly, it will be ignored net.minecraftforge.fml.common.LoaderException: java.lang.IllegalArgumentException - - at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] - at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$zln000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] - [...] -[Client thread/ERROR] [FML]: Unable to read a class file correctly -java.lang.IllegalArgumentException: null - at org.objectweb.asm.ClassReader.(ClassReader.java:185) ~[asm-debug-all-5.2.jar:5.2] - at org.objectweb.asm.ClassReader.(ClassReader.java:168) ~[asm-debug-all-5.2.jar:5.2] - at org.objectweb.asm.ClassReader.(ClassReader.java:439) ~[asm-debug-all-5.2.jar:5.2] - [...] -[Client thread/ERROR] [FML]: There was a problem reading the entry META-INF/versions/9/module-info.class in the jar E:\mc\packs\E2E-E\minecraft\mods\UniversalTweaks-1.12.2-1.9.0.jar - probably a corrupt zip + + at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] + at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$xxx000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] + [...] +[Client thread/ERROR] [FML]: Unable to read a class file correctly +java.lang.IllegalArgumentException: null + at org.objectweb.asm.ClassReader.(ClassReader.java:185) ~[asm-debug-all-5.2.jar:5.2] + at org.objectweb.asm.ClassReader.(ClassReader.java:168) ~[asm-debug-all-5.2.jar:5.2] + at org.objectweb.asm.ClassReader.(ClassReader.java:439) ~[asm-debug-all-5.2.jar:5.2] + [...] +[Client thread/ERROR] [FML]: There was a problem reading the entry META-INF/versions/9/module-info.class in the jar E:\mc\packs\E2E-E\minecraft\mods\ProbeZS-1.17.8.jar - probably a corrupt zip net.minecraftforge.fml.common.LoaderException: java.lang.IllegalArgumentException - - at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] - at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$zln000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] - [...] -[Client thread/WARN] [FML]: Zip file UniversalTweaks-1.12.2-1.9.0.jar failed to read properly, it will be ignored + + at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] + at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$xxx000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] + [...] +[Client thread/WARN] [FML]: Zip file ProbeZS-1.17.8.jar failed to read properly, it will be ignored net.minecraftforge.fml.common.LoaderException: java.lang.IllegalArgumentException - - at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] - at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$zln000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] - [...] -[Client thread/WARN] [mixin]: Reference map 'mixins.zenrecipereloading.refmap.json' for mixins.zenrecipereloading.crafttweaker.json could not be read. If this is a development environment you can ignore this message -[Client thread/WARN] [mixin]: Reference map 'mixins.zenrecipereloading.refmap.json' for mixins.zenrecipereloading.jei.json could not be read. If this is a development environment you can ignore this message -[Client thread/WARN] [mixin]: Reference map 'mixins.zenrecipereloading.refmap.json' for mixins.zenrecipereloading.modtweaker.json could not be read. If this is a development environment you can ignore this message -[Client thread/WARN] [mixin]: Reference map 'mixins.zenrecipereloading.refmap.json' for mixins.zenrecipereloading.forestry.json could not be read. If this is a development environment you can ignore this message -[Client thread/WARN] [mixin]: Reference map 'mixins.zenrecipereloading.refmap.json' for mixins.zenrecipereloading.avaritia.json could not be read. If this is a development environment you can ignore this message -[Client thread/WARN] [mixin]: Reference map 'mixins.zenrecipereloading.refmap.json' for mixins.zenrecipereloading.tconstruct.json could not be read. If this is a development environment you can ignore this message -[Client thread/WARN] [mixin]: @Mixin target com.feed_the_beast.mods.ftbultimine.client.FTBUltimineClient was not found mixins.randomtweaker.mods.json:ftbultimine.MixinFTBUltimineClient from mod unknown-owner -[Client thread/WARN] [FML]: * A broken ore dictionary registration with name hammerIron has occurred. It adds an item (type: class endreborn.mod.items.ItemHammer) which is currently unknown to the game registry. This dictionary item can only support a single value when registered with ores like this, and NO I am not going to turn this spam off. Just register your ore dictionary entries after the GameRegistry. -TO USERS: YES this is a BUG in the mod End: Reborn report it to them! -[Client thread/WARN] [FML]: * A broken ore dictionary registration with name hammer has occurred. It adds an item (type: class endreborn.mod.items.ItemHammer) which is currently unknown to the game registry. This dictionary item can only support a single value when registered with ores like this, and NO I am not going to turn this spam off. Just register your ore dictionary entries after the GameRegistry. -TO USERS: YES this is a BUG in the mod End: Reborn report it to them! -[Client thread/ERROR] [Had Enough Items]: An interpreter is already registered for this item: exnihilocreatio.modules.tconstruct.tools.SledgeHammer@xxxxxxxx -java.lang.IllegalArgumentException: null - at mezz.jei.runtime.SubtypeRegistry.registerSubtypeInterpreter(SubtypeRegistry.java:46) [SubtypeRegistry.class:?] - at exnihilocreatio.compatibility.jei.CompatJEI.registerItemSubtypes(CompatJEI.java:53) [CompatJEI.class:?] - at mezz.jei.api.IModPlugin.registerSubtypes(IModPlugin.java:29) [IModPlugin.class:?] - [...] -[Client thread/ERROR] [Had Enough Items]: An interpreter is already registered for this item: exnihilocreatio.modules.tconstruct.tools.TiCrook@xxxxxxxx -java.lang.IllegalArgumentException: null - at mezz.jei.runtime.SubtypeRegistry.registerSubtypeInterpreter(SubtypeRegistry.java:46) [SubtypeRegistry.class:?] - at exnihilocreatio.compatibility.jei.CompatJEI.registerItemSubtypes(CompatJEI.java:55) [CompatJEI.class:?] - at mezz.jei.api.IModPlugin.registerSubtypes(IModPlugin.java:29) [IModPlugin.class:?] - [...] -[Client thread/ERROR] [net.minecraft.world.storage.loot.LootTableManager]: Couldn't load loot table endreborn:inject/chests/village_blacksmith from jar:file:/E:/mc/packs/E2E-E/minecraft/mods/EndReborn%20%5B0.3.9%5D-patched.jar!/assets/endreborn/loot_tables/inject/chests/village_blacksmith.json -com.google.gson.JsonSyntaxException: Expected name to be an item, was unknown string 'endreborn:tool_shovel_wolframium' - at net.minecraft.util.JsonUtils.getItem(SourceFile:124) ~[rc.class:?] - at net.minecraft.util.JsonUtils.getItem(SourceFile:135) ~[rc.class:?] - at net.minecraft.world.storage.loot.LootEntryItem.deserialize(LootEntryItem.java:83) ~[bfp.class:?] - [...] -[Client thread/WARN] [net.minecraft.world.storage.loot.LootTableManager]: Couldn't find resource table betteranimalsplus:pheasant -[Client thread/WARN] [net.minecraft.world.storage.loot.LootTableManager]: Couldn't find resource table betteranimalsplus:turkey -[Client thread/ERROR] [Had Enough Items]: Failed to register mod plugin: class com.blakebr0.mysticalagriculture.compat.jei.CompatJEI -java.lang.IllegalArgumentException: Invalid ingredient found. Parameter Name: ingredient Ingredient Info: 1xtile.air@0 minecraft:air - at mezz.jei.util.ErrorUtil.checkIsValidIngredient(ErrorUtil.java:248) ~[ErrorUtil.class:?] - at mezz.jei.startup.ModRegistry.addIngredientInfo(ModRegistry.java:260) ~[ModRegistry.class:?] - at mezz.jei.startup.ModRegistry.addIngredientInfo(ModRegistry.java:271) ~[ModRegistry.class:?] - [...] -[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for 'jeresources.plant': jeresources.entry.PlantEntry -[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for 'jeresources.villager': jeresources.entry.VillagerEntry -[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for this recipe class: com.github.alexthe666.iceandfire.recipe.DragonForgeRecipe -[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for this recipe class: com.github.alexthe666.rats.server.recipes.SharedRecipe -[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for this recipe class: com.github.alexthe666.rats.server.recipes.SharedRecipe -[Client thread/ERROR] [Chisel]: Exception getting recipe wrappers: -java.lang.NullPointerException: null - at team.chisel.common.integration.jei.ChiselRecipeRegistryPlugin.getRecipeWrappers(ChiselRecipeRegistryPlugin.java:73) ~[ChiselRecipeRegistryPlugin.class:?] - at mezz.jei.recipes.RecipeRegistryPluginSafeWrapper.lambda$getRecipeWrappers$1(RecipeRegistryPluginSafeWrapper.java:30) ~[RecipeRegistryPluginSafeWrapper.class:?] - at mezz.jei.recipes.RecipeRegistryPluginSafeWrapper.callPluginMethod(RecipeRegistryPluginSafeWrapper.java:42) [RecipeRegistryPluginSafeWrapper.class:?] - [...] + + at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] + at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$xxx000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] + [...] +[Client thread/ERROR] [FML]: Unable to read a class file correctly +java.lang.IllegalArgumentException: null + at org.objectweb.asm.ClassReader.(ClassReader.java:185) ~[asm-debug-all-5.2.jar:5.2] + at org.objectweb.asm.ClassReader.(ClassReader.java:168) ~[asm-debug-all-5.2.jar:5.2] + at org.objectweb.asm.ClassReader.(ClassReader.java:439) ~[asm-debug-all-5.2.jar:5.2] + [...] +[Client thread/ERROR] [FML]: There was a problem reading the entry META-INF/versions/9/module-info.class in the jar E:\mc\packs\E2E-E\minecraft\mods\UniversalTweaks-1.12.2-1.9.0.jar - probably a corrupt zip +net.minecraftforge.fml.common.LoaderException: java.lang.IllegalArgumentException + + at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] + at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$xxx000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] + [...] +[Client thread/WARN] [FML]: Zip file UniversalTweaks-1.12.2-1.9.0.jar failed to read properly, it will be ignored +net.minecraftforge.fml.common.LoaderException: java.lang.IllegalArgumentException + + at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:63) ~[ASMModParser.class:?] + at net.minecraftforge.fml.common.discovery.JarDiscoverer.redirect$xxx000$redirectNewASMModParser(JarDiscoverer.java:561) ~[JarDiscoverer.class:?] + [...] +[Client thread/WARN] [mixin]: @Mixin target com.feed_the_beast.mods.ftbultimine.client.FTBUltimineClient was not found mixins.randomtweaker.mods.json:ftbultimine.MixinFTBUltimineClient from mod unknown-owner +[Client thread/WARN] [net.minecraft.network.datasync.EntityDataManager]: defineId called for: class net.minecraft.entity.item.EntityMinecartFurnace from class com.lothrazar.cyclicmagic.item.minecart.EntityGoldFurnaceMinecart +[Client thread/WARN] [net.minecraft.network.datasync.EntityDataManager]: defineId called for: class net.minecraft.entity.monster.EntitySlime from class teamroots.emberroot.entity.slime.EntityRainbowSlime +[Client thread/WARN] [net.minecraft.network.datasync.EntityDataManager]: defineId called for: class malte0811.industrialwires.entities.EntityBrokenPart from class malte0811.industrialwires.IndustrialWires +[Client thread/WARN] [FML]: * Invalid registration attempt for an Ore Dictionary item with name etLaserLens has occurred. The registration has been denied to prevent crashes. The mod responsible for the registration needs to correct this. +[Client thread/WARN] [net.minecraft.world.storage.loot.LootTableManager]: Couldn't find resource table betteranimalsplus:pheasant +[Client thread/WARN] [net.minecraft.world.storage.loot.LootTableManager]: Couldn't find resource table betteranimalsplus:turkey +[Client thread/ERROR] [net.minecraft.world.storage.loot.LootTableManager]: Couldn't load loot table iceandfire:ice_dragon_female_cave from jar:file:/E:/mc/packs/E2E-E/minecraft/mods/iceandfire-1.9.1-1.12.2-patched.jar!/assets/iceandfire/loot_tables/ice_dragon_female_cave.json +com.google.gson.JsonSyntaxException: Expected name to be an item, was unknown string 'iceandfire:armor_silver_metal_chestplate' + at net.minecraft.util.JsonUtils.getItem(SourceFile:124) ~[rc.class:?] + at net.minecraft.util.JsonUtils.getItem(SourceFile:135) ~[rc.class:?] + at net.minecraft.world.storage.loot.LootEntryItem.deserialize(LootEntryItem.java:83) ~[bfp.class:?] + [...] +[Client thread/WARN] [net.minecraft.network.datasync.EntityDataManager]: defineId called for: class com.github.alexthe666.iceandfire.entity.EntityDreadThrall from class com.github.alexthe666.iceandfire.entity.EntityDreadKnight +[Client thread/WARN] [net.minecraft.world.storage.loot.functions.Smelt]: Couldn't smelt 1xitem.frog_leg@0 because there is no smelting recipe +[Client thread/WARN] [net.minecraft.network.datasync.EntityDataManager]: defineId called for: class com.github.alexthe666.rats.server.entity.EntityFeralRatlantean from class com.github.alexthe666.rats.server.entity.EntityNeoRatlantean +[Client thread/WARN] [mixin]: @Final field field_73244_f:Lit/unimi/dsi/fastutil/longs/Long2ObjectMap; in mixins.vintagefix.json:chunk_access.ChunkProviderServerMixin from mod unknown-owner should be final +[Client thread/ERROR] [Had Enough Items]: An interpreter is already registered for this item: exnihilocreatio.modules.tconstruct.tools.SledgeHammer@xxxxxxxx +java.lang.IllegalArgumentException: null + at mezz.jei.runtime.SubtypeRegistry.registerSubtypeInterpreter(SubtypeRegistry.java:46) [SubtypeRegistry.class:?] + at exnihilocreatio.compatibility.jei.CompatJEI.registerItemSubtypes(CompatJEI.java:53) [CompatJEI.class:?] + at mezz.jei.api.IModPlugin.registerSubtypes(IModPlugin.java:29) [IModPlugin.class:?] + [...] +[Client thread/ERROR] [Had Enough Items]: An interpreter is already registered for this item: exnihilocreatio.modules.tconstruct.tools.TiCrook@xxxxxxxx +java.lang.IllegalArgumentException: null + at mezz.jei.runtime.SubtypeRegistry.registerSubtypeInterpreter(SubtypeRegistry.java:46) [SubtypeRegistry.class:?] + at exnihilocreatio.compatibility.jei.CompatJEI.registerItemSubtypes(CompatJEI.java:55) [CompatJEI.class:?] + at mezz.jei.api.IModPlugin.registerSubtypes(IModPlugin.java:29) [IModPlugin.class:?] + [...] +[Client thread/ERROR] [infinityeditor]: Failed to load void for: tconstruct.broadsword.nbt +net.minecraft.util.ReportedException: Loading NBT data + at net.minecraft.nbt.NBTTagCompound.readNBT(NBTTagCompound.java:506) ~[fy.class:?] + at net.minecraft.nbt.NBTTagCompound.read(NBTTagCompound.java:58) ~[fy.class:?] + at net.minecraft.nbt.NBTTagCompound.readNBT(NBTTagCompound.java:497) ~[fy.class:?] + [...] +[Client thread/ERROR] [Had Enough Items]: Failed to register mod plugin: class com.blakebr0.mysticalagriculture.compat.jei.CompatJEI +java.lang.IllegalArgumentException: Invalid ingredient found. Parameter Name: ingredient Ingredient Info: 1xtile.air@0 minecraft:air + at mezz.jei.util.ErrorUtil.checkIsValidIngredient(ErrorUtil.java:248) ~[ErrorUtil.class:?] + at mezz.jei.startup.ModRegistry.addIngredientInfo(ModRegistry.java:260) ~[ModRegistry.class:?] + at mezz.jei.startup.ModRegistry.addIngredientInfo(ModRegistry.java:271) ~[ModRegistry.class:?] + [...] +[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for 'jeresources.plant': jeresources.entry.PlantEntry +[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for 'jeresources.villager': jeresources.entry.VillagerEntry +[Client thread/ERROR] [net.minecraft.world.storage.loot.LootTableManager]: Couldn't load loot table twilightforest:structures/graveyard/rare from jar:file:/E:/mc/packs/E2E-E/minecraft/mods/twilightforest-1.12.2-3.11.1021-universal.jar!/assets/twilightforest/loot_tables/structures/graveyard/rare.json +com.google.gson.JsonSyntaxException: Expected name to be an item, was unknown string 'twilightforest:golden_apple' + at net.minecraft.util.JsonUtils.getItem(SourceFile:124) ~[rc.class:?] + at net.minecraft.util.JsonUtils.getItem(SourceFile:135) ~[rc.class:?] + at net.minecraft.world.storage.loot.LootEntryItem.deserialize(LootEntryItem.java:83) ~[bfp.class:?] + [...] +[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for this recipe class: com.github.alexthe666.rats.server.recipes.SharedRecipe +[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for this recipe class: com.github.alexthe666.rats.server.recipes.SharedRecipe +[Client thread/ERROR] [Had Enough Items]: A Recipe Handler has already been registered for this recipe class: com.github.alexthe666.iceandfire.recipe.DragonForgeRecipe +[Client thread/WARN] [Caliper]: Unable to parse event listener: ASM: ClientProxyComponent(commonProxyComponent=org.cyclops.integrateddynamics.proxy.CommonProxy@xxxxxxxx, iconProvider=org.cyclops.cyclopscore.client.icon.IconProvider@xxxxxxxx, tileEntityRenderers={}) onTextureStitch(Lnet/minecraftforge/client/event/TextureStitchEvent$Pre;)V. +[Client thread/WARN] [LoliASM]: Clearing LoliVertexDataPool \ No newline at end of file diff --git a/mc-tools b/mc-tools index dd4161028..15951cded 160000 --- a/mc-tools +++ b/mc-tools @@ -1 +1 @@ -Subproject commit dd4161028988e6dc793ffc5d70bcb0c88bb6e9d8 +Subproject commit 15951cded2524fa76efa8fa89fc9018f043c643e diff --git a/package.json b/package.json index c64a2dc50..ef0d640bc 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "automate": "esno mc-tools/packages/run/src/cli.ts dev/tools/mct-run.json", "bansoukou-prune": "node \"dev/_other/advancement-fix.js\" -r", "build": "esno dev/make_pack.js", - "dev": "concurrently npm:dev:* --prefix-colors auto", + "dev": "concurrently --prefix-colors auto \"npm:dev:* --silent\"", "dev:bansoukou": "esno dev/automation/bansoukou.js", - "dev:benchmark": "mc-benchmark --output=dev/benchmarks/latest.md", + "dev:benchmark": "npx mc-benchmark --output=dev/benchmarks/latest.md", "dev:conflicts": "esno dev/automation/recipe_conflicts.js", "dev:entities": "esno dev/automation/entities.js", "dev:errors": "esno mc-tools/packages/errors/src/cli.ts --config=dev/tools/mct-errors-config.yml --output=dev/tools/unresolved-errors.log", @@ -61,7 +61,7 @@ "language-name-map": "^0.3.0", "lodash": "^4.17.21", "log-update": "^6.0.0", - "mc-benchmark": "^1.0.7", + "mc-benchmark": "^1.0.8", "memoizee": "^0.4.15", "minimist": "^1.2.8", "nbt-ts": "^1.3.6", @@ -72,7 +72,7 @@ "over": "^0.0.5", "parse-gitignore": "2.0.0", "pdf-parse": "^1.1.1", - "replace-in-file": "^7.0.2", + "replace-in-file": "^7.1.0", "simple-git": "^3.21.0", "snake-case": "^4.0.0", "ssh2-sftp-client": "^9.1.0", diff --git a/server/SERVER_GUIDE.md b/server/SERVER_GUIDE.md index 50cacb6f9..088db9177 100644 --- a/server/SERVER_GUIDE.md +++ b/server/SERVER_GUIDE.md @@ -12,6 +12,9 @@ 4) Launch the server with "**start-server.bat**". > On Linux, use "start-server.sh" (you cannot run the script via sh directly). +> โ„น Note: +> The `serverstarter` script fetches the modpack directly from GitHub. If this isn't possible, you can manually modify the source by changing the `modpackUrl` value in the `server-setup-config.yaml` file. + ## Hosting For hosting services with control panels like `Pterodactyl`: diff --git a/server/server-setup-config.yaml b/server/server-setup-config.yaml index f0f061d51..0050e412e 100644 --- a/server/server-setup-config.yaml +++ b/server/server-setup-config.yaml @@ -46,7 +46,7 @@ install: # Link to where the file where the modpack can be distributed # This supports loading from local files as well for most pack types if there is file://{PathToFile} in the beginning - modpackUrl: https://media.forgecdn.net/files/4911/133/E2E-Extended-v1.26.0.zip + modpackUrl: https://github.com/Krutoy242/Enigmatica2Expert-Extended/releases/download/v1.26.0/E2E-Extended-v1.26.0.zip # This is used to specify in which format the modpack is distributed, the server launcher has to handle each individually if their format differs # current supported formats: