From f2d9546494585c0c9452e555cb829662653a5014 Mon Sep 17 00:00:00 2001 From: cong <49234756+Cong0707@users.noreply.github.com> Date: Sat, 1 Nov 2025 19:08:39 +0800 Subject: [PATCH 1/5] let contentsTweaker.kts support ContentPatcher --- scripts/coreMindustry/contentsTweaker.kts | 90 +++++++++-------------- 1 file changed, 34 insertions(+), 56 deletions(-) diff --git a/scripts/coreMindustry/contentsTweaker.kts b/scripts/coreMindustry/contentsTweaker.kts index ff8a4e7..f16d120 100644 --- a/scripts/coreMindustry/contentsTweaker.kts +++ b/scripts/coreMindustry/contentsTweaker.kts @@ -3,8 +3,11 @@ package coreMindustry -import cf.wayzer.contentsTweaker.ContentsTweaker -import mindustry.gen.Iconc +import arc.Events +import arc.struct.Seq +import arc.util.serialization.Jval +import mindustry.game.EventType.ContentPatchLoadEvent + var patches: String? get() = state.map.tags.get("ContentsPatch") @@ -19,40 +22,35 @@ var patchList: List patches = v.joinToString(";") } -val ctPlayers = mutableMapOf() - -class CTHello(val player: Player, val version: String) : Event { - companion object : Event.Handler() -} - -registerVar("scoreboard.ext.contents-0-Version", "ContentsTweaker状态显示", DynamicVar { - if (patches == null) return@DynamicVar null - "{cK}CT修改已加载: {cV}{count} 修改".with("count" to patchList.size) -}) -registerVar("scoreboard.ext.contents-1-Advice", "ContentsTweaker未安装警告", DynamicVar { - if (patches == null) return@DynamicVar null - val player = VarToken("receiver").get() as? Player - if (player == null || player.uuid() !in ctPlayers) null - else "{cA}(使用ContentsTweakerMOD获得最佳体验)".with() -}) -registerVarForType().apply { - registerChild("suffix.s3-CT", "CT mod 后缀", { p -> Iconc.wrench.takeIf { p.uuid() in ctPlayers } }) -} - -fun sendPatch(name: String, patch: String) { - Call.clientPacketReliable("ContentsLoader|newPatch", "$name\n$patch") -} +val contentPatches = Seq() //cp in maps may not load here @JvmName("addPatchV3") fun addPatch(name: String, patch: String) { + //logger.info("Adding patch $name") if (!name.startsWith("$")) { state.map.tags.put("CT@$name", patch) patchList = patchList.toMutableList().apply { remove(name); add(name)//put last } } - ContentsTweaker.loadPatch(name, patch) - sendPatch(name, patch) + + val raw = patch + .replace("+=", "+") + .replace("#", "arg") + .replace(Regex("""(:)([\u4e00-\u9fa5][^,\}\]]*)""")) { m -> + val sep = m.groupValues[1] + val text = m.groupValues[2].trim() + "$sep\"$text\"" + } + .replace(Regex("(?<=\\{|,|\\s)([a-zA-Z0-9_-]+):"), "\"$1\":") + .replace(Regex(":\\s*([a-zA-Z_-]+)(?=\\s*[},])")) { m -> + ":\"${m.groupValues[1]}\"" + } + + val readPatch = Jval.read(raw).toString(Jval.Jformat.plain) + contentPatches.add(readPatch) + Events.fire(ContentPatchLoadEvent(contentPatches)) + state.patcher.apply(contentPatches) } @JvmName("addPatch") fun addPatchOld(name: String, patch: String): String { @@ -61,43 +59,23 @@ fun addPatchOld(name: String, patch: String): String { } export(::addPatch) listen { - ContentsTweaker.recoverAll() - ctPlayers.clear() -} - -listen { - ctPlayers.remove(it.player.uuid()) + //logger.info("reset") + contentPatches.clear() + Events.fire(ContentPatchLoadEvent(contentPatches))//actually empty + state.patcher.apply(contentPatches)//actually empty } listen { - if (ContentsTweaker.worldInReset) return@listen - var needAfterHandle = false state.map.tags.get("ContentsPatch")?.split(";")?.forEach { name -> if (name.isBlank()) return@forEach val patch = state.map.tags.get("CT@$name") ?: return@forEach - ContentsTweaker.loadPatch(name, patch, doAfter = false) - needAfterHandle = true + addPatch(name, patch) } - if (needAfterHandle) ContentsTweaker.afterHandle() } -//处理客户端请求 -onEnable { - netServer.addPacketHandler("ContentsLoader|version") { p, msg -> - logger.info("${p.name} $msg") - if (msg.contains("2.")) - Call.sendMessage(p.con, "你当前安装的CT版本过老,请更新到3.0.1", null, null) - ctPlayers[p.uuid()] = msg - launch(Dispatchers.game) { - CTHello(p, msg).emitAsync() - } - } - netServer.addPacketHandler("ContentsLoader|requestPatch") { p, msg -> - state.map.tags["CT@$msg"]?.let { sendPatch(msg, it) } +listen { + //logger.info("loading patch") + for (patch in contentPatches) { + it.patches.addUnique(patch) } } - -onDisable { - netServer.getPacketHandlers("ContentsLoader|version").clear() - netServer.getPacketHandlers("ContentsLoader|requestPatch").clear() -} \ No newline at end of file From f4f347c0c191633bf8203d4749f24bc89afe4ff6 Mon Sep 17 00:00:00 2001 From: cong <49234756+Cong0707@users.noreply.github.com> Date: Sat, 1 Nov 2025 19:47:39 +0800 Subject: [PATCH 2/5] Update contentsTweaker.kts --- scripts/coreMindustry/contentsTweaker.kts | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/scripts/coreMindustry/contentsTweaker.kts b/scripts/coreMindustry/contentsTweaker.kts index f16d120..988f2b7 100644 --- a/scripts/coreMindustry/contentsTweaker.kts +++ b/scripts/coreMindustry/contentsTweaker.kts @@ -3,10 +3,8 @@ package coreMindustry -import arc.Events import arc.struct.Seq import arc.util.serialization.Jval -import mindustry.game.EventType.ContentPatchLoadEvent var patches: String? @@ -22,8 +20,6 @@ var patchList: List patches = v.joinToString(";") } -val contentPatches = Seq() //cp in maps may not load here - @JvmName("addPatchV3") fun addPatch(name: String, patch: String) { //logger.info("Adding patch $name") @@ -48,9 +44,7 @@ fun addPatch(name: String, patch: String) { } val readPatch = Jval.read(raw).toString(Jval.Jformat.plain) - contentPatches.add(readPatch) - Events.fire(ContentPatchLoadEvent(contentPatches)) - state.patcher.apply(contentPatches) + state.patcher.apply(state.patcher.patches.map { it.patch }.add(readPatch)) } @JvmName("addPatch") fun addPatchOld(name: String, patch: String): String { @@ -59,10 +53,7 @@ fun addPatchOld(name: String, patch: String): String { } export(::addPatch) listen { - //logger.info("reset") - contentPatches.clear() - Events.fire(ContentPatchLoadEvent(contentPatches))//actually empty - state.patcher.apply(contentPatches)//actually empty + state.patcher.apply(Seq())//may load server global patches } listen { @@ -72,10 +63,3 @@ listen { addPatch(name, patch) } } - -listen { - //logger.info("loading patch") - for (patch in contentPatches) { - it.patches.addUnique(patch) - } -} From 0033b66985ec0d50cae3a7f77443fc12350647a7 Mon Sep 17 00:00:00 2001 From: cong <49234756+Cong0707@users.noreply.github.com> Date: Sat, 1 Nov 2025 19:48:48 +0800 Subject: [PATCH 3/5] Update contentsTweaker.kts --- scripts/coreMindustry/contentsTweaker.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/coreMindustry/contentsTweaker.kts b/scripts/coreMindustry/contentsTweaker.kts index 988f2b7..6b5ffb7 100644 --- a/scripts/coreMindustry/contentsTweaker.kts +++ b/scripts/coreMindustry/contentsTweaker.kts @@ -6,6 +6,10 @@ package coreMindustry import arc.struct.Seq import arc.util.serialization.Jval +registerVar("scoreboard.ext.contents-0-Version", "ContentPatcher状态显示", DynamicVar { + if (patches == null) return@DynamicVar null + "{cK}CP修改已加载: {cV}{count} 修改".with("count" to state.patcher.patches.size) +}) var patches: String? get() = state.map.tags.get("ContentsPatch") From 3549eaa7d6940bbb13d882ceef4918889d2a5eb8 Mon Sep 17 00:00:00 2001 From: cong <49234756+Cong0707@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:11:15 +0800 Subject: [PATCH 4/5] Update contentsTweaker.kts --- scripts/coreMindustry/contentsTweaker.kts | 63 +++++++++++++++++++++-- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/scripts/coreMindustry/contentsTweaker.kts b/scripts/coreMindustry/contentsTweaker.kts index 6b5ffb7..bbad497 100644 --- a/scripts/coreMindustry/contentsTweaker.kts +++ b/scripts/coreMindustry/contentsTweaker.kts @@ -1,15 +1,12 @@ @file:Import("https://www.jitpack.io/", mavenRepository = true) @file:Import("com.github.way-zer:ContentsTweaker:v3.1.2", mavenDependsSingle = true) +@file:Depends("coreMindustry/menu", "调用菜单") package coreMindustry import arc.struct.Seq import arc.util.serialization.Jval - -registerVar("scoreboard.ext.contents-0-Version", "ContentPatcher状态显示", DynamicVar { - if (patches == null) return@DynamicVar null - "{cK}CP修改已加载: {cV}{count} 修改".with("count" to state.patcher.patches.size) -}) +import mindustry.mod.ContentPatcher.PatchSet var patches: String? get() = state.map.tags.get("ContentsPatch") @@ -67,3 +64,59 @@ listen { addPatch(name, patch) } } + +command("cp", "查看cp修改") { + type = CommandType.Client + body { + menu(player!!) + } +} + +suspend fun menu(player: Player, select: Int = 1) { + object : PagedMenuBuilder(state.patcher.patches.toList(), selectedPage = select, 6) { + override suspend fun renderItem(item: PatchSet) { + option(if (item.name.isEmpty()) "" else item.name) { + moreMenu(player, selectedPage, item) + } + } + + override suspend fun build() { + title = "[yellow]ContentPatcher" + msg = """ + [sky]查询服务器patch列表 + """.trimIndent() + super.build() + } + }.sendTo(player, 20_000) +} + +suspend fun moreMenu(player: Player, select: Int, item: PatchSet) { + MenuBuilder(true){ + title = "[yellow]Patch详情" + val jsonFlat = try { + val jval = Jval.read(item.patch) + flater(jval) + } catch (e: Exception) { + "[red]解析失败" + } + msg = """ + [white]${jsonFlat} + """.trimIndent() + option ("[red]返回"){ + menu(player, select) + } + }.sendTo(player, 20_000) +} + +fun flater(jval: Jval, prefix: String = ""): String = buildString { + when { + jval.isObject -> jval.asObject().forEach { + val fullKey = if (prefix.isEmpty()) it.key else "$prefix.${it.key}" + append(flater(it.value, fullKey)) + } + jval.isArray -> jval.asArray().forEachIndexed { index, value -> + append(flater(value, "$prefix[$index]")) + } + else -> append("$prefix = $jval\n") + } +} From 020cb4ecb231edf4cd62f177db09c3f544a01d56 Mon Sep 17 00:00:00 2001 From: cong <49234756+Cong0707@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:26:18 +0800 Subject: [PATCH 5/5] Update contentsTweaker.kts --- scripts/coreMindustry/contentsTweaker.kts | 27 +++-------------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/scripts/coreMindustry/contentsTweaker.kts b/scripts/coreMindustry/contentsTweaker.kts index bbad497..dd67fef 100644 --- a/scripts/coreMindustry/contentsTweaker.kts +++ b/scripts/coreMindustry/contentsTweaker.kts @@ -1,5 +1,4 @@ @file:Import("https://www.jitpack.io/", mavenRepository = true) -@file:Import("com.github.way-zer:ContentsTweaker:v3.1.2", mavenDependsSingle = true) @file:Depends("coreMindustry/menu", "调用菜单") package coreMindustry @@ -8,29 +7,8 @@ import arc.struct.Seq import arc.util.serialization.Jval import mindustry.mod.ContentPatcher.PatchSet -var patches: String? - get() = state.map.tags.get("ContentsPatch") - set(v) { - state.map.tags.put("ContentsPatch", v) - //back compatibility - state.rules.tags.put("ContentsPatch", v!!) - } -var patchList: List - get() = patches?.split(";").orEmpty() - set(v) { - patches = v.joinToString(";") - } - @JvmName("addPatchV3") -fun addPatch(name: String, patch: String) { - //logger.info("Adding patch $name") - if (!name.startsWith("$")) { - state.map.tags.put("CT@$name", patch) - patchList = patchList.toMutableList().apply { - remove(name); add(name)//put last - } - } - +fun addPatch(name: String, patch: String = "PatchFromContentsTweaker") { val raw = patch .replace("+=", "+") .replace("#", "arg") @@ -44,7 +22,8 @@ fun addPatch(name: String, patch: String) { ":\"${m.groupValues[1]}\"" } - val readPatch = Jval.read(raw).toString(Jval.Jformat.plain) + val readPatch = Jval.read(raw).apply { asObject(); put("name", Jval.valueOf(name)) }.toString(Jval.Jformat.plain) + logger.info(readPatch) state.patcher.apply(state.patcher.patches.map { it.patch }.add(readPatch)) } @JvmName("addPatch")