From d6993f73f9ce28fc4a5f4f0332064069f293fd55 Mon Sep 17 00:00:00 2001 From: way-zer Date: Tue, 17 Sep 2024 17:34:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=A1=B9=E7=9B=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/clearOldAssets.ts | 23 + .github/workflows/build.yml | 79 +++ .github/workflows/deployment.yml | 43 -- .github/workflows/pr.yml | 32 -- .github/workflows/push.yml | 30 -- .gitignore | 5 +- assets/bundles/bundle-mdtx.properties | 462 ++++++++++++++++++ assets/icon.png | Bin 0 -> 6855 bytes assets/labels | 74 +++ assets/mod.hjson | 8 + assets/recommendMods.json | 17 + buildPlugins/build.gradle.kts | 23 + .../plugins/mindustryX/buildExt.gradle.kts | 31 ++ .../plugins/mindustryX/loaderMod.gradle.kts | 130 +++++ .../plugins/mindustryX/patchArc.gradle.kts | 99 ++++ ...001-BUILD-build.gradle.kts-and-clear.patch | 37 +- patches/client/0002-BUILD-MindustryX.patch | 86 ++++ ... => 0003-CS-MindustryX-Version-Icon.patch} | 57 ++- ...3-API-Hooks.patch => 0004-API-Hooks.patch} | 0 patches/client/0004-CS-Bundle-Extend.patch | 13 - patches/client/0019-C-StatusEffects.patch | 15 +- patches/client/0021-C-StatExt.patch | 46 +- patches/client/0024-BUILD-Kotlin-1.9.20.patch | 52 -- ...der-Mod.patch => 0024-FC-Loader-Mod.patch} | 37 +- ...er.patch => 0025-C-ReplayController.patch} | 0 patches/client/0026-BUILD-buildPlugins.patch | 393 --------------- ...-Settings.patch => 0026-UI-Settings.patch} | 48 +- patches/client/0027-BUILD-workflows.patch | 288 ----------- patches/client/0027-C-floatLabel.patch | 52 ++ ...sc-patch.patch => 0028-C-misc-patch.patch} | 0 ...toUpdate.patch => 0029-C-AutoUpdate.patch} | 0 .../client/0030-ARC-bundle-and-settings.patch | 327 ------------- ...ld.patch => 0030-C-better-chatField.patch} | 0 ...> 0031-C-fix-console-messages-order.patch} | 0 patches/client/0031-C-floatLabel.patch | 134 ----- ...C-setBars.patch => 0032-ARC-setBars.patch} | 0 .../client/{0038-FC.patch => 0033-FC.patch} | 0 ...ys.patch => 0034-API-Hooks-pollKeys.patch} | 0 ....patch => 0035-C-RenderExt-unitHide.patch} | 0 ...t-logicDisplayNoBorder-arcDrillMode.patch} | 0 patches/client/0037-BUILD-ci.patch | 66 --- ...> 0037-CS-Building.updatePowerGraph.patch} | 0 ...kerType.patch => 0038-FC-MarkerType.patch} | 0 ...-C-no-MapPreviewLoader.setupLoaders.patch} | 0 ...OSC-lambda.patch => 0040-OSC-lambda.patch} | 0 ...gUtil.patch => 0041-API-C-DebugUtil.patch} | 0 ...> 0042-C-RenderExt-blockRenderLevel.patch} | 0 ...nfo.patch => 0043-C-JoinDialog-info.patch} | 0 ...049-OC-Batch.patch => 0044-OC-Batch.patch} | 0 patches/client/{0050-C.patch => 0045-C.patch} | 0 ...patch => 0046-CS-PointDefenseWeapon.patch} | 0 ...UI-Mod-Mod.patch => 0047-UI-Mod-Mod.patch} | 56 +-- ...ch => 0048-API-LogicExt-limitUpdate.patch} | 0 ...> 0049-FC-LogicExt-terrainSchematic.patch} | 0 ...-UpdateExt-worldCreator-allUnlocked.patch} | 0 ...patch => 0051-UI-ARC-AuxiliaryTools.patch} | 0 ...057-C-Editor.patch => 0052-C-Editor.patch} | 19 +- ...nMode.patch => 0053-ARC-arcScanMode.patch} | 0 ...tBox.patch => 0054-C-noPlayerHitBox.patch} | 0 ...SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch} | 2 +- ...{0061-FC-Icon.patch => 0056-FC-Icon.patch} | 410 +--------------- ...057-OC-no-bullet-create-when-hidden.patch} | 0 ...0058-API-add-PlayerTeamChangedEvent.patch} | 0 ....patch => 0059-UI-ARC-logic-Support.patch} | 0 ...r.patch => 0060-C-Portable-Data-Dir.patch} | 0 ...orceJoin.patch => 0061-UI-forceJoin.patch} | 0 ...2-OC-Multithreading-Schematics-load.patch} | 0 .../client/0062-prepare-for-mod-browser.patch | 169 ------- ...070-OC-Fonts.patch => 0063-OC-Fonts.patch} | 0 patches/client/0063-PICK.patch | 249 ---------- ...ch => 0064-FC-RenderExt-deadOverlay.patch} | 0 ... => 0065-FC-LogicExt-invertMapClick.patch} | 0 ...OC-speedup-SchematicsDialog-showing.patch} | 0 ...atch => 0067-OC-fix-slow-of-LCanvas.patch} | 0 ... 0068-FC-FuncX-focusLogicController.patch} | 0 ...eSync.patch => 0069-FC-reliableSync.patch} | 0 ...og.patch => 0070-API-more-error-log.patch} | 0 ...ARC-merged.patch => 0071-ARC-merged.patch} | 101 +++- patches/client/0079-BUILD-BE-release.patch | 66 --- patches/client/0080-WIP.patch | 182 ------- src/mindustryX/Hooks.java | 1 + src/mindustryX/loader/DesktopImpl.java | 5 +- 82 files changed, 1264 insertions(+), 2703 deletions(-) create mode 100644 .github/actions/clearOldAssets.ts create mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/deployment.yml delete mode 100644 .github/workflows/pr.yml delete mode 100644 .github/workflows/push.yml create mode 100644 assets/bundles/bundle-mdtx.properties create mode 100644 assets/icon.png create mode 100644 assets/labels create mode 100644 assets/mod.hjson create mode 100644 assets/recommendMods.json create mode 100644 buildPlugins/build.gradle.kts create mode 100644 buildPlugins/plugins/mindustryX/buildExt.gradle.kts create mode 100644 buildPlugins/plugins/mindustryX/loaderMod.gradle.kts create mode 100644 buildPlugins/plugins/mindustryX/patchArc.gradle.kts create mode 100644 patches/client/0002-BUILD-MindustryX.patch rename patches/client/{0002-CS-Version.patch => 0003-CS-MindustryX-Version-Icon.patch} (76%) rename patches/client/{0003-API-Hooks.patch => 0004-API-Hooks.patch} (100%) delete mode 100644 patches/client/0004-CS-Bundle-Extend.patch delete mode 100644 patches/client/0024-BUILD-Kotlin-1.9.20.patch rename patches/client/{0025-FC-Loader-Mod.patch => 0024-FC-Loader-Mod.patch} (95%) rename patches/client/{0028-C-ReplayController.patch => 0025-C-ReplayController.patch} (100%) delete mode 100644 patches/client/0026-BUILD-buildPlugins.patch rename patches/client/{0029-UI-Settings.patch => 0026-UI-Settings.patch} (77%) delete mode 100644 patches/client/0027-BUILD-workflows.patch create mode 100644 patches/client/0027-C-floatLabel.patch rename patches/client/{0032-C-misc-patch.patch => 0028-C-misc-patch.patch} (100%) rename patches/client/{0033-C-AutoUpdate.patch => 0029-C-AutoUpdate.patch} (100%) delete mode 100644 patches/client/0030-ARC-bundle-and-settings.patch rename patches/client/{0034-C-better-chatField.patch => 0030-C-better-chatField.patch} (100%) rename patches/client/{0035-C-fix-console-messages-order.patch => 0031-C-fix-console-messages-order.patch} (100%) delete mode 100644 patches/client/0031-C-floatLabel.patch rename patches/client/{0036-ARC-setBars.patch => 0032-ARC-setBars.patch} (100%) rename patches/client/{0038-FC.patch => 0033-FC.patch} (100%) rename patches/client/{0039-API-Hooks-pollKeys.patch => 0034-API-Hooks-pollKeys.patch} (100%) rename patches/client/{0040-C-RenderExt-unitHide.patch => 0035-C-RenderExt-unitHide.patch} (100%) rename patches/client/{0041-C-RenderExt-logicDisplayNoBorder-arcDrillMode.patch => 0036-C-RenderExt-logicDisplayNoBorder-arcDrillMode.patch} (100%) delete mode 100644 patches/client/0037-BUILD-ci.patch rename patches/client/{0042-CS-Building.updatePowerGraph.patch => 0037-CS-Building.updatePowerGraph.patch} (100%) rename patches/client/{0043-FC-MarkerType.patch => 0038-FC-MarkerType.patch} (100%) rename patches/client/{0044-C-no-MapPreviewLoader.setupLoaders.patch => 0039-C-no-MapPreviewLoader.setupLoaders.patch} (100%) rename patches/client/{0045-OSC-lambda.patch => 0040-OSC-lambda.patch} (100%) rename patches/client/{0046-API-C-DebugUtil.patch => 0041-API-C-DebugUtil.patch} (100%) rename patches/client/{0047-C-RenderExt-blockRenderLevel.patch => 0042-C-RenderExt-blockRenderLevel.patch} (100%) rename patches/client/{0048-C-JoinDialog-info.patch => 0043-C-JoinDialog-info.patch} (100%) rename patches/client/{0049-OC-Batch.patch => 0044-OC-Batch.patch} (100%) rename patches/client/{0050-C.patch => 0045-C.patch} (100%) rename patches/client/{0051-CS-PointDefenseWeapon.patch => 0046-CS-PointDefenseWeapon.patch} (100%) rename patches/client/{0052-UI-Mod-Mod.patch => 0047-UI-Mod-Mod.patch} (86%) rename patches/client/{0053-API-LogicExt-limitUpdate.patch => 0048-API-LogicExt-limitUpdate.patch} (100%) rename patches/client/{0054-FC-LogicExt-terrainSchematic.patch => 0049-FC-LogicExt-terrainSchematic.patch} (100%) rename patches/client/{0055-API-UpdateExt-worldCreator-allUnlocked.patch => 0050-API-UpdateExt-worldCreator-allUnlocked.patch} (100%) rename patches/client/{0056-UI-ARC-AuxiliaryTools.patch => 0051-UI-ARC-AuxiliaryTools.patch} (100%) rename patches/client/{0057-C-Editor.patch => 0052-C-Editor.patch} (93%) rename patches/client/{0058-ARC-arcScanMode.patch => 0053-ARC-arcScanMode.patch} (100%) rename patches/client/{0059-C-noPlayerHitBox.patch => 0054-C-noPlayerHitBox.patch} (100%) rename patches/client/{0060-OC-SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch => 0055-OC-SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch} (90%) rename patches/client/{0061-FC-Icon.patch => 0056-FC-Icon.patch} (95%) rename patches/client/{0064-OC-no-bullet-create-when-hidden.patch => 0057-OC-no-bullet-create-when-hidden.patch} (100%) rename patches/client/{0065-API-add-PlayerTeamChangedEvent.patch => 0058-API-add-PlayerTeamChangedEvent.patch} (100%) rename patches/client/{0066-UI-ARC-logic-Support.patch => 0059-UI-ARC-logic-Support.patch} (100%) rename patches/client/{0067-C-Portable-Data-Dir.patch => 0060-C-Portable-Data-Dir.patch} (100%) rename patches/client/{0068-UI-forceJoin.patch => 0061-UI-forceJoin.patch} (100%) rename patches/client/{0069-OC-Multithreading-Schematics-load.patch => 0062-OC-Multithreading-Schematics-load.patch} (100%) delete mode 100644 patches/client/0062-prepare-for-mod-browser.patch rename patches/client/{0070-OC-Fonts.patch => 0063-OC-Fonts.patch} (100%) delete mode 100644 patches/client/0063-PICK.patch rename patches/client/{0071-FC-RenderExt-deadOverlay.patch => 0064-FC-RenderExt-deadOverlay.patch} (100%) rename patches/client/{0072-FC-LogicExt-invertMapClick.patch => 0065-FC-LogicExt-invertMapClick.patch} (100%) rename patches/client/{0073-OC-speedup-SchematicsDialog-showing.patch => 0066-OC-speedup-SchematicsDialog-showing.patch} (100%) rename patches/client/{0074-OC-fix-slow-of-LCanvas.patch => 0067-OC-fix-slow-of-LCanvas.patch} (100%) rename patches/client/{0075-FC-FuncX-focusLogicController.patch => 0068-FC-FuncX-focusLogicController.patch} (100%) rename patches/client/{0076-FC-reliableSync.patch => 0069-FC-reliableSync.patch} (100%) rename patches/client/{0077-API-more-error-log.patch => 0070-API-more-error-log.patch} (100%) rename patches/client/{0078-ARC-merged.patch => 0071-ARC-merged.patch} (98%) delete mode 100644 patches/client/0079-BUILD-BE-release.patch delete mode 100644 patches/client/0080-WIP.patch diff --git a/.github/actions/clearOldAssets.ts b/.github/actions/clearOldAssets.ts new file mode 100644 index 000000000000..224d9a7d2bfd --- /dev/null +++ b/.github/actions/clearOldAssets.ts @@ -0,0 +1,23 @@ +import * as core from "@actions/core" +import {context, getOctokit} from "@actions/github" + +const octokit = getOctokit(import.meta.env.GITHUB_TOKEN) as import("@octokit/plugin-rest-endpoint-methods/dist-types/types").Api +const selfBuild = import.meta.env.RELEASE_VERSION + +async function clearOldAssets(tag: string, keep: number = 9) { + const release = await octokit.rest.repos.getReleaseByTag({ + ...context.repo, tag + }) + const assets = release.data.assets.sort((a, b) => a.name < b.name ? 1 : -1) + if (assets.length <= keep) return + const toRemove = assets.slice(keep) + toRemove.push(...assets.filter(it => it.name.includes("server") && !it.name.includes(selfBuild))) + console.log("ToRemove", toRemove.map(it => it.name)) + await Promise.all(toRemove.map(it => + octokit.rest.repos.deleteReleaseAsset({ + ...context.repo, asset_id: it.id + }) + )) +} + +await clearOldAssets(core.getInput("release") || import.meta.env.TAG) \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000000..56884e3d9811 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,79 @@ +name: Build Artifacts + +on: + push: + branches: + - '*' + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 17 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + with: + gradle-version: 8.6 + cache-read-only: false + build-scan-publish: true + build-scan-terms-of-use-url: "https://gradle.com/help/legal-terms-of-use" + build-scan-terms-of-use-agree: "yes" + - name: Set env + run: | + echo "RELEASE_TAG=${GITHUB_REF_NAME}-build" >> $GITHUB_ENV + echo "RELEASE_TAG=${GITHUB_REF_NAME}-build" + echo "RELEASE_VERSION=$(date +'%Y.%m.%d').X${GITHUB_RUN_NUMBER}-${GITHUB_REF_NAME}" >> $GITHUB_ENV + + echo "${{ secrets.KEYSTORE_BASE64 }}" | openssl enc -d -base64 -in - -out ../bekeystore.jks + - name: Build + run: | + cd work + ../scripts/applyPatches + gradle desktop:dist server:dist -Pbuildversion=${RELEASE_VERSION} + + cd .. + mkdir artifacts + mv work/desktop/build/libs/Mindustry.jar artifacts/MindustryX-${{env.RELEASE_VERSION}}-Desktop.jar + mv work/server/build/libs/server-release.jar artifacts/server-${{env.RELEASE_VERSION}}.jar + - name: Build Android + env: + keystore_password: ${{ secrets.KEYSTORE_PASSWORD_SECRET }} + keystore_alias_password: ${{ secrets.KEYSTORE_PASSWORD_SECRET }} + keystore_alias: MindustryX + run: | + cd work + sed -i 's/tinylake.mindustryX/tinylake.mindustryX.be/g' android/build.gradle + sed -i 's/MindustryX/MindustryX BE/g' android/res/values/strings.xml + gradle android:assembleRelease -Pbuildversion=${RELEASE_VERSION} + + cd .. + mv work/android/build/outputs/apk/release/android-release.apk artifacts/MindustryX-${{env.RELEASE_VERSION}}-Android.apk +# - name: Update Tag +# uses: rickstaa/action-create-tag@v1 +# with: +# tag: ${{ env.RELEASE_TAG }} +# force_push_tag: true + - name: Release + uses: softprops/action-gh-release@v2.0.2 + with: + repository: TinyLake/MindustryX-work + token: ${{secrets.PUBLISH_TOKEN}} + tag_name: ${{ env.RELEASE_TAG }} + name: ${{ env.RELEASE_VERSION }} + target_commitish: ${{github.sha}} + files: artifacts/* + prerelease: true + - uses: oven-sh/setup-bun@v1 + - name: clearOldAssets + run: bun run .github/actions/clearOldAssets.ts + env: + GITHUB_TOKEN: ${{secrets.PUBLISH_TOKEN}} + GITHUB_REPOSITORY: TinyLake/MindustryX-work + TAG: ${{ env.RELEASE_TAG }} diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml deleted file mode 100644 index 8b74ec89f2a8..000000000000 --- a/.github/workflows/deployment.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Deployment - -on: - push: - tags: - - 'v*' - workflow_dispatch: - -permissions: {} -jobs: - deploy: - permissions: - contents: write # for release creation (svenstaro/upload-release-action) - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - - name: Set up JDK 17 - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Set env - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - name: Apply Patch - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions" - ./scripts/applyPatches.sh - - - name: Create artifacts - run: | - cd ./work - ./gradlew -Pbuildversion=${RELEASE_VERSION:1} server:dist - - name: Upload server artifacts - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: work/server/build/libs/server-release.jar - tag: ${{ github.ref }} - diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml deleted file mode 100644 index 9bcad1bb2691..000000000000 --- a/.github/workflows/pr.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Pull Request Tests - -on: [pull_request, workflow_dispatch] - -permissions: - contents: read # to fetch code (actions/checkout) - -jobs: - testPR: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - - name: Set up JDK 17 - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Apply Patch - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions" - ./scripts/applyPatches.sh - - - name: Run unit tests and build JAR - run: cd ./work && ./gradlew test server:dist - - name: Upload desktop JAR for testing - uses: actions/upload-artifact@v2 - with: - name: Server JAR (zipped) - path: work/server/build/libs/server-release.jar diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml deleted file mode 100644 index a519476a6bf1..000000000000 --- a/.github/workflows/push.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Tests - -on: [push, workflow_dispatch] - -permissions: {} -jobs: - runPush: - permissions: - contents: write # for Update bundles - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - - name: Set up JDK 17 - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Set env - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - name: Apply Patch - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions" - ./scripts/applyPatches.sh - - - name: Run unit tests - run: cd ./work && ./gradlew clean cleanTest test --stacktrace diff --git a/.gitignore b/.gitignore index d9d08b1ad3f4..e6598819c37e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ /.idea/ *.iml /work -/patches/work/ \ No newline at end of file +/patches/work/ + +.gradle/ +build/ \ No newline at end of file diff --git a/assets/bundles/bundle-mdtx.properties b/assets/bundles/bundle-mdtx.properties new file mode 100644 index 000000000000..08e9e2eef3c2 --- /dev/null +++ b/assets/bundles/bundle-mdtx.properties @@ -0,0 +1,462 @@ +#UI +mods.group.mod = 模组 +mods.group.internal = 内置模组 +mods.disabled = 禁用Mod + +mods.recommend = [accent]MdtX[]推荐辅助模组列表 +mods.recommend.lastUpdated = 推荐列表更新时间:{0} +mods.recommend.info = 经过精选的辅助模组 +mods.recommend.mod.description = 经过精选的推荐模组 +mods.recommend.mod.name = 模组:{0} +mods.recommend.mod.author = 作者: {0} +mods.recommend.mod.minGameVersion = 最低支持游戏版本:{0} +mods.recommend.mod.lastUpdated = 上次更新时间:{0} +mods.recommend.mod.stars = Github收藏数:{0} + +alphaLoading = {jump}[gray]加载中... +alphaLoadFailed = {sick}[gray]加载失败... +#end UI + +status.slow.name = 缓慢 +status.shielded.name = 保护 +status.corroded.name = 腐蚀 +status.disarmed.name = 缴械 +status.invincible.name = 无敌 +status.fast.name = 迅捷 + +#StatExt +stat.unit_range = 雷达范围 +stat.can_overdrive = 能否超速 +stat.cost = 建造时间花费 +stat.health_scaling = 建筑血量系数 +stat.hardness = 硬度 +stat.buildable = 是否用于建造 +stat.boil_point = 沸点 +stat.drag_multiplier = 移动阻力倍率 + +stat.buffer_capacity = 缓存容量 +stat.sep_output = 比例输出 +stat.regen_speed = 回复速度 +stat.regen_speed_broken = 过热时回复速度 +stat.mend = 修复量 +stat.mend_reload = 修复间隔 +stat.mend_speed = 修复速度 +stat.warmup_partial = 启动时间 +stat.warmup_time = 完全启动时间 +stat.warmup_power = 启动总耗电 + +stat.rotate_speed = 转向速度 +stat.boost_multiplier = 助推速度倍率 +stat.drown_time_multiplier = 淹没时间倍率 +stat.mine_level = 采矿等级 +stat.unit_item_capacity = 物品容量 + +stat.crush_damage = 碾压伤害(每格) +stat.estimate_dps = 预估dps +stat.ai_controller = 默认AI +stat.targets = 目标 +stat.ammo_type = 子弹类型 +stat.ammo_capacity = 子弹容量 + +#end StatExt + +# Settings +settings.category.mindustryX = [gold]MindustryX +setting.showUpdateDialog.name = 检测到新版MindustryX时提示 +setting.githubMirror.name = GitHub镜像加速(WZ镜像) [gray]优化全球服务器列表及Mod浏览器功能 +setting.replayRecord.name = 多人游戏录像 [gray]自动录制游玩过程,输出在saves文件夹 +setting.researchViewer.name = 科技树透视器 + +category.gameUI.name = 游戏界面扩展 +setting.menuFloatText.name = 首页悬浮文字 +setting.deadOverlay.name = 死亡时(观战)仍然显示界面 +setting.invertMapClick.name = 反转小地图的左右键点击 +setting.arcSpecificTable.name = 学术信息显示(左上角) [orange][重启生效] +setting.logicSupport.name = 逻辑辅助器 +setting.powerStatistic.name = 电量统计 [orange][重启生效] +setting.showQuickToolTable.name = 快捷工具(右中部) [gray]快捷设置/工具箱/建筑工具 +setting.AuxiliaryTable.name = 辅助器 [orange][重启生效] +setting.arccoreitems.name = 核心物资显示 [gray]点击电量条可快捷切换 +setting.arcCoreItemsCol.name = 核心物资显示列数 +setting.itemSelectionHeight.name = 建筑选择框(右下角)行数 +setting.itemSelectionWidth.name = 建筑选择框(右下角)列数 +setting.blockInventoryWidth.name = 建筑物品栏(分类器)每行物品数 +setting.editorBrush.name = 编辑器界面每行建筑数 +setting.minimapSize.name = 小地图大小 +setting.maxSchematicSize.name = 最大选择框(蓝图)大小 +setting.colorizedContent.name = [orange]彩[yellow]色[acid]属[cyan]性[violet]包 +setting.arcBackgroundPath.name = 首页自定义背景-路径 +setting.autoSelSchematic.name = 蓝图自动选择 [gray]打开蓝图时自动筛选 +setting.arcCommandTable.name = RTS扩展按钮 + +category.blockSettings.name = 建筑相关设置 +setting.rotateCanvas.name = 蓝图旋转时会旋转画板内容 [orange]可能导致崩溃,小心使用 +setting.staticShieldsBorder.name = 静止力墙边界 +setting.arcTurretPlaceCheck.name = [pink]炮台[white]:范围检查 +setting.arcchoiceuiIcon.name = [acid]装卸|分类[white]:显示物品图标 +setting.HiddleItemTransparency.name = [acid]带桥/交叉器内物品[white]:不透明度 +setting.overdrive_zone.name = [acid]超速范围[white]:不透明度 +setting.arcPlacementEffect.name = [pink]建筑放置特效 +setting.blockbarminhealth.name = [acid]建筑属性显示[white]:血量最低限制 +setting.blockRenderLevel.name = [cyan]建筑渲染等级 + +category.entitySettings.name = 实体相关设置 +setting.bulletShow.name = 显示子弹 +setting.showminebeam.name = 显示单位挖掘光束 +setting.noPlayerHitBox.name = 取消玩家自身的碰撞 [gray]轻微作弊 +setting.payloadpreview.name = 载荷单位拾起预览 +setting.unithitbox.name = 显示单位碰撞箱 + +category.developerMode.name = 特殊设置 +setting.renderMerge.name = 顶点合并渲染 [grey]实验性功能,可以减少Draws总数 +setting.renderSort.name = 渲染排序 [grey]多图集(Mod较多)情况下能够提升50%渲染性能,但可能造成渲染错误 +setting.limitupdate.name = 限制更新 +setting.limitdst.name = 限制更新-额外范围 +#end Settings + +# editor增强 +toolmode.square2 = 方形(直径) +toolmode.square2.description = 同2方形。但大小为直径(延续学术端功能) +#end editor增强 + +# PICK +mod.circulardependencies = [red]循环依赖 +mod.incompletedependencies = [red]缺失依赖 +mod.circulardependencies.details = 此模组与其他模组相互依赖。 +mod.incompletedependencies.details = 由于依赖项无效或缺失,此模组无法加载:{0}. +mod.requiresversion = 需要游戏版本: [red]{0} +trace.language = 语言: [accent]{0} +trace.ips = 曾用IP: +trace.names = 曾用名: +player.ban = 封禁 +player.kick = 踢出 +player.trace = 追朔 +player.admin = 切换管理员 +player.team = 改变队伍 +votekick.reason = 投票踢出理由 +votekick.reason.message = 确定投票踢出玩家"{0}[white]"?\n如果是,请输入理由: +save.nocampaign = 无法导入战役中的单个保存文件。 +command.boost = 助推 +commandmode.name = [accent]指挥模式 +commandmode.nounits = [无单位] +waves.random = 随机 +waves.search = 搜索波次... +waves.filter = 单位过滤器 +editor.savechanges = [scarlet]您有未保存的更改!\n\n[]您想要保存他们吗? +toolmode.fillerase = 擦除同类 +toolmode.fillerase.description = 擦除同种种类的方块。 +rules.hidebannedblocks = 隐藏禁用的建筑 +sector.capture = 区块[accent]{0}[white]已占领! +sector.capture.current = 区块已占领! +stat.unittype = 单位类型 + +ability.forcefield.description = 投射一个能吸收子弹的力场护盾 +ability.repairfield.description = 修复附近的单位 +ability.statusfield.description = 对附近的单位施加状态效果 +ability.unitspawn = 单位生成 +ability.unitspawn.description = 建造单位 +ability.shieldregenfield.description = 再生附近单位的护盾 +ability.movelightning.description = 移动时释放闪电 +ability.armorplate = 装甲板 +ability.armorplate.description = 在射击时减少受到的伤害 +ability.shieldarc.description = 投射一个弧形的力场护盾,能吸收子弹 +ability.suppressionfield.description = 使附近的修复建筑停止工作 +ability.energyfield = 能量场 +ability.energyfield.description = 对附近的敌人释放电击 +ability.energyfield.healdescription = 对附近的敌人释放电击,并治疗友方 +ability.regen = 再生 +ability.regen.description = 随着时间的推移恢复自己的生命值 +ability.liquidregen.description = 吸收液体以治疗自身 +ability.spawndeath = 死亡产生单位 +ability.spawndeath.description = 死亡时释放单位 +ability.liquidexplode = 死亡溢液 +ability.liquidexplode.description = 死亡时释放液体 +ability.stat.firingrate = [stat]{0}/秒[lightgray] 射速 +ability.stat.regen = [stat]{0}/秒[lightgray] 生命恢复速度 +ability.stat.shield = [stat]{0}[lightgray] 护盾 +ability.stat.repairspeed = [stat]{0}/秒[lightgray] 修复速度 +ability.stat.slurpheal = [stat]{0}[lightgray] 生命/液体单位 +ability.stat.cooldown = [stat]{0} 秒[lightgray] 冷却时间 +ability.stat.maxtargets = [stat]{0}[lightgray] 最大目标数 +ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] 同类型修复量 +ability.stat.damagereduction = [stat]{0}%[lightgray] 伤害减免 +ability.stat.minspeed = [stat]{0} 格/秒[lightgray] 最低速度 +ability.stat.duration = [stat]{0} 秒[lightgray] 持续时间 +ability.stat.buildtime = [stat]{0} 秒[lightgray] 建造时间 + +bullet.maxdamagefraction = [stat]{0}%[lightgray] 伤害上限 +bullet.suppression = [stat]{0}秒[lightgray] 修复压制 ~ [stat]{1}[lightgray] 格 +bullet.interval = [stat]{0}/秒[lightgray] 分裂子弹: +setting.distinctcontrolgroups.name = 每单位限制一个编队 +setting.drawlight.name = 绘制阴影/光照 +setting.steampublichost.name = 公共游戏可见性 +steam.friendsonly = 仅限好友 +steam.friendsonly.tooltip = 是否只有 Steam 好友才能加入您的游戏。\n取消选中此选项将使您的游戏公开 - 任何人都可以加入。 +category.command.name = 单位指挥 +keybind.command_queue.name = 单位指挥队列 +keybind.create_control_group.name = 创建操控队伍 +keybind.cancel_orders.name = 取消指令 +keybind.unit_stance_shoot.name = 单位姿态:射击 +keybind.unit_stance_hold_fire.name = 单位姿态:停火 +keybind.unit_stance_pursue_target.name = 单位姿态:追逐目标 +keybind.unit_stance_patrol.name = 单位姿态:巡逻 +keybind.unit_stance_ram.name = 单位姿态:冲锋 +keybind.unit_command_move.name = Unit Command: Move +keybind.unit_command_repair.name = Unit Command: Repair +keybind.unit_command_rebuild.name = Unit Command: Rebuild +keybind.unit_command_assist.name = Unit Command: Assist +keybind.unit_command_mine.name = Unit Command: Mine +keybind.unit_command_boost.name = Unit Command: Boost +keybind.unit_command_load_units.name = Unit Command: Load Units +keybind.unit_command_load_blocks.name = Unit Command: Load Blocks +keybind.unit_command_unload_payload.name = Unit Command: Unload Payload +keybind.unit_command_enter_payload.name = Unit Command: Enter Payload +rules.invaliddata = 无效剪贴板数据。 +rules.derelictrepair = 允许修复残骸建筑 +rules.buildai = 基础建筑者 AI +rules.buildaitier = 建筑者 AI 等级 +rules.unitcrashdamagemultiplier = 单位坠毁伤害倍率 +rules.unitpayloadsexplode = 单位携带载荷与单位一起爆炸 +rules.wavelimit = 地图在有限波次后结束 +rules.placerangecheck.info = Prevents players from placing anything near enemy buildings. When trying to place a turret, the range is increased, so the turret will not be able to reach the enemy. +rules.onlydepositcore.info = Prevents units from depositing items into any buildings except cores. +block.fabricator.name = 重构厂 +block.payload-propulsion-tower.description = 远距离载荷运送建筑。 向相连的其他载荷驱动器发射载荷。 +block.reinforced-junction.description = 两条交叉物品管道的桥梁。 + +lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" +lst.weathersense = 检查特定种类的天气当前是否启用。 +lst.weatherset = 设置当前状态为特定类型天气。 + +lst.setflag = 设置一个可以被所有处理器读取的全局标志。 +lst.getflag = 检查是否设置了全局标志。 +lst.setprop = 设置单位或建筑物的属性。 +lst.effect = 创建一个粒子效果。 +lst.sync = 在网络中同步一个变量。\n最多每秒调用10次。 +lst.makemarker = 在世界中创建一个新的逻辑标记。\n必须提供一个用于标识此标记的ID。\n目前每个世界限制最多20000个标记。 +lst.setmarker = 为标记设置属性。\n使用的ID必须与制作标记指令中的相同。 +lst.localeprint = 将地图本地化文本属性值添加到文本缓冲区中。\n要在地图编辑器中设置地图本地化包,请检查 [accent]地图信息 > 本地化包[]。\n如果客户端是移动设备,则尝试首先打印以 ".mobile" 结尾的属性。 +logic.globals = 内置变量 +lglobal.false = 0 +lglobal.true = 1 +lglobal.null = null +lglobal.@pi = 数学常数 pi (3.141...) +lglobal.@e = 数学常数 e (2.718...) +lglobal.@degToRad = 将角度制转换为弧度制 +lglobal.@radToDeg = 将弧度制转换为角度制 +lglobal.@time = 当前保存的游戏时间,以毫秒为单位 +lglobal.@tick = 当前保存的游戏时间,以tick为单位(1秒 = 60 tick) +lglobal.@second = 当前保存的游戏时间,以秒为单位 +lglobal.@minute = 当前保存的游戏时间,以分钟为单位 +lglobal.@waveNumber = 如果启用了波次,则为当前波次编号 +lglobal.@waveTime = 波次的倒计时计时器,以秒为单位 +lglobal.@mapw = 地图宽度(单位:格) +lglobal.@maph = 地图高度(单位:格) +lglobal.sectionMap = 地图 +lglobal.sectionGeneral = 通用 +lglobal.sectionNetwork = 网络/客户端 [仅限世界处理器] +lglobal.sectionProcessor = 处理器 +lglobal.sectionLookup = 查找 +lglobal.@this = 执行代码的逻辑块 +lglobal.@thisx = 执行代码的逻辑块的 X 坐标 +lglobal.@thisy = 执行代码的逻辑块的 Y 坐标 +lglobal.@links = 连接到此处理器的总块数 +lglobal.@ipt = 处理器每 tick 的执行速度(每秒 60 tick) +lglobal.@unitCount = 游戏中单位内容的类型总数;与查找指令一起使用 +lglobal.@blockCount = 游戏中块内容的类型总数;与查找指令一起使用 +lglobal.@itemCount = 游戏中物品内容的类型总数;与查找指令一起使用 +lglobal.@liquidCount = 游戏中液体内容的类型总数;与查找指令一起使用 +lglobal.@server = 如果代码正在服务器上运行或单人游戏中运行,则为真,否则为假 +lglobal.@client = 如果代码正在连接到服务器的客户端上运行,则为真 +lglobal.@clientLocale = 运行代码的客户端的区域设置。例如:en_US +lglobal.@clientUnit = 运行代码的客户端的单位 +lglobal.@clientName = 运行代码的客户端的玩家名称 +lglobal.@clientTeam = 运行代码的客户端的团队 ID +lglobal.@clientMobile = 如果运行代码的客户端在移动设备上,则为真,否则为假 +laccess.id = 单位/块/物品/液体的ID。\n这是 Lookup 的反向操作。 +lenum.anglediff = 返回两个角度之间的绝对距离(角度制)。 +lenum.autopathfind = "自动寻找最近的敌方核心或敌人生成点。\n这与波次中的敌人寻路相同。" +lenum.flushtext = 如果适用的话,将打印缓冲区的内容刷新到标记。\n如果 fetch 设置为 true,则尝试从地图本地化包或游戏的包中获取属性。 +lenum.texture = 直接来自游戏纹理图集的纹理名称(使用 kebab-case 命名风格)。\n如果 printFlush 设置为 true,则将文本缓冲区内容作为文本参数消耗。 +lenum.texturesize = 纹理的大小(格)。零值将标记宽度缩放为原始纹理的大小。 +lenum.autoscale = 是否根据玩家的缩放级别缩放标记。 +lenum.posi = 索引位置,用于线和四边形标记,索引零表示第一个位置。 +lenum.uvi = 纹理的位置范围从零到一,用于四边形标记。 +lenum.colori = 索引位置,用于线和四边形标记,索引零表示第一个颜色。 +#end PICK + +bar.reloadDetail = 装填:{0}% +bar.warmupDetail = 充能:{0}% +bar.ammoDetail = 弹药:{0}/{1} + +marker.Mark.name = 标记 +marker.Gather.name = 集合 +marker.Attack.name = 攻击 +marker.Defend.name = 防御 +marker.What.name = 问号 + +keybind.point.name = 标记 +keybind.lockonLastMark.name = 定位到上个标记点 +keybind.toggle_block_render.name = 切换建筑显示 +keybind.toggle_unit.name = 切换单位显示 + +# 学术特色翻译 +ability.energyfield.maxtargets = [lightgray]最大目标: [white]{0} +ability.energyfield.sametypehealmultiplier = [lightgray]同类回复: [white]{0}% +bar.drilltierreq = 需要{0}级的钻头(当前{1}级) +bar.heatpercent = 热量: {0} [lightgray]({1}%) +bar.powerbalance = 电力:{0}/s +block.armored-duct.name = 装甲运输管 +block.build-tower.name = 建造枢纽 +block.duct-unloader.name = 管道卸载器 +block.large-shield-projector.name = 大型护盾投影 +block.overflow-duct.name = 溢流运输管 +block.regen-projector.name = 再生投影 +block.reinforced-bridge-conduit.name = 强化液体带桥 +block.reinforced-liquid-container.name = 强化液体容器 +block.reinforced-liquid-junction.name = 强化液体交叉器 +block.reinforced-liquid-router.name = 强化液体路由器 +block.reinforced-liquid-tank.name = 强化储液罐 +block.shield-projector.name = 护盾投影 +block.underflow-duct.name = 反溢运输管 +radar.order = 排序方式:1/true 距离从小到大,其他从大到小,0/false 反之。 +rules.waitForWaveToEnd = 等待波次结束[gray]所有敌人死亡后才会开始下一波次 +schematic.edit = 编辑蓝图 +schematic.search = 搜索蓝图... +schematic.tagged = {0} 个带标签的蓝图 +setting.blockreplace.name = 允许覆盖建筑 +setting.uiscale.name = UI缩放比例 [orange][重启生效] +settings.reset = [red]全部恢复默认 +unit.disrupt.name = 瓦解 +unit.incite.name = 激发 +unit.obviate.name = 影逝 +unit.quell.name = 终结 +ability.liquidregen = 液体回血 + +# ARC增加或补充 +ability.moveeffect = 移动特效 +bar.drillcantmine = 当前钻头不能挖掘此矿物 +block.fracture.name = 破裂 +category.arcAddBlockInfo.name = 更多建筑属性 +category.arcAddTurretInfo.name = 更多炮台属性 +category.arcAddUnitInfo.name = 更多单位属性 +category.arcCAssist.name = 辅助功能 +category.arcCDisplayBlock.name = 建筑显示 +category.arcCDisplayEffect.name = 特效与效果 +category.arcCGraphicsOther.name = 其他 +category.arcCOverview.name = 全局设置 +category.arcCgameview.name = 游戏画面 +category.arcCgamewindow.name = 游戏界面 +category.arcHudToolbox.name = 主游戏界面 +category.arcMassDriverInfo.name = 质驱引导线 +category.arcPlayerEffect.name = 玩家炫酷特效 +category.arcRTSSupporter.name = RTS支持器 +category.arcRadar.name = 雷达扫描设置 [lightgray](PC按键,手机辅助器) +category.arcShareinfo.name = 多人游玩设置 +category.arcStrongCheat.name = [red]强作弊功能 +category.arcWeakCheat.name = 弱作弊功能 +category.combat = 战斗 +category.moreContent.name = 更多内容适配 +category.movement = 移动 +category.personalized.name = 自定义客户端 [需要重启] +category.support = 支援 +confirmvotekick = 确定投票踢出玩家“{0}[white]”? +content.planet.name = 星球 +content.weather.name = 天气 +keybind.arcDetail.name = 雷达扫描 +keybind.arcScanMode.name = 扫描详情 +keybind.oreAdsorption.name = 矿物自动吸附 +keybind.showRTSAi.name = 显示单位控制 +keybind.superUnitEffect.name = 显示玩家射程 +revealedblocks = [acid]显示建筑 +rules.aiCoreSpawn = [acid]核心生成AI +rules.canGameOver = [acid]能否自动结束游戏[gray](如果没有其他结束游戏的方法,不推荐开启) +rules.cheat = [acid]作弊模式 +rules.coreDestroyClear = [acid]核心被破坏清理附近建筑 +rules.disableOutsideArea = [acid]禁用场外区域 +rules.dynamicColor = 战争迷雾颜色-曾探索 +rules.hiddenBuildItems = [acid]隐藏需要所选材料建造的建筑 +rules.infiniteAmmo = [acid]单位无限子弹 +rules.logicUnitBuild = [acid]逻辑控制单位建造 +rules.showSpawns = [acid]显示刷怪点 +rules.staticColor = 战争迷雾颜色-未探索 +rules.title.arcExperimental = 隐藏设置[red](实验性功能,可能影响稳定性) +rules.unitPayloadUpdate = [acid]单位携带的方块会工作 +rules.winWave = [acid]胜利波次 [gray](到达指定波次后自动停止) +schematic.preview = 预览 +setting.ShowInfoPopup.name = [acid]服务器信息版 +setting.allUnlocked.name = [cyan]显示所有内容(含隐藏) +setting.alwaysShowPlayerUnit.name = [cyan]强制显示[white]:玩家本体及带领的单位 +setting.alwaysShowUnitRTSAi.name = [acid]单位[white]:执行的RTS命令 +setting.alwaysshowdropzone.name = [cyan]刷怪点 +setting.arcAlwaysTeamColor.name = [acid]玩家列表[white]:总是绘制队伍颜色 +setting.arcBuildInfo.name = [cyan]建造范围 +setting.arcDrillProgress.name = [acid]钻头[white]:显示挖掘进度 [gray]只推荐mod下使用 +setting.arcSelfName.name = [acid]显示自身名字 +setting.arcShareWaveInfo.name = [acid]游戏信息交流[gray](标记物品) [red]请勿刷屏 +setting.arcTurretPlacementItem.name = [pink]炮台[white]:弹药射界 +setting.arcdrillmode.name = [acid]钻头[white]:常亮矿物 +setting.arclogicbordershow.name = [acid]显示屏与画板[white]:边框 [gray]关闭后多个显示屏会更好得拼接在一起 +setting.blockBars.name = [acid]建筑属性 +setting.blockBars_mend.name = [acid]修复[white]:进度条 +setting.blockWeaponTargetLine.name = [acid]炮台[white]:瞄准线 +setting.blockWeaponTargetLineWhenIdle.name = [acid]炮台[white]:瞄准线(闲置) +setting.blockdisabled.name = [cyan]建筑禁用显示 +setting.chatValidType.name = [acid]聊天记录 +setting.displayblock.name = [cyan]工厂方块 +setting.fontSet.name = [cyan]字体设置! +setting.fontSize.name = [cyan]字体大小! +setting.forceConfigInventory.name = [acid]功能[white]:强制拿取资源 +setting.forceEnableDarkness.name = [cyan]墙体阴影显示 +setting.forceIgnoreAttack.name = [violet]战役[white]:忽视遭受攻击警告强行切换区块 +setting.hoveredTileInfo.name = [acid]显示鼠标指针地块/建筑名称 +setting.logicoverrangelink.name = [red]超级逻辑链接 [yellow][仅限单机有效] +setting.mass_driver_line.name = 显示质驱引导线 +setting.mass_driver_line_color.name = [pink]质驱引导线[white]:颜色 +setting.mass_driver_line_interval.name = [acid]质驱引导线[white]:箭头间隔 +setting.mend_zone.name = [acid]修复范围[white]:不透明度 +setting.overrideSkipWave.name = [acid]功能[white]:忽视跳波限制 +setting.playerEffectColor.name = [acid]玩家射程[white]:颜色 +setting.playerEffectCurStroke.name = [acid]玩家射程[white]:粗细 +setting.playerNeedShooting.name = [red]时间管理大师 +setting.radarMode.name = [acid]雷达模式 +setting.radarSize.name = [acid]雷达大小 +setting.rtsWoundUnit.name = [acid]单位筛选[white]:残血阈值 +setting.save_more_map.name = [acid]保存战役与编辑器地图 +setting.showFlyerSpawn.name = [cyan]空军刷怪点 +setting.showFlyerSpawnLine.name = [cyan]空军刷怪点连线 +setting.showOtherTeamResource.name = [acid]显示[white]:[red]所有队伍资源 [orange][PVP自动禁用] +setting.showOtherTeamState.name = [acid]显示[white]:[red]其他并可修改队伍状态 [orange][PVP自动禁用][yellow][修改仅限单机有效] +setting.showTurretAmmo.name = [acid]炮台[white]:子弹类型 +setting.showTurretAmmoAmount.name = [acid]炮台[white]:子弹数量 +setting.superUnitEffect.name = [pink]玩家特效射程 +setting.turretAlertRange.name = [acid]炮台[white]:警告范围 +setting.turretForceShowRange.name = [acid]炮台[white]:强制显示射程 [gray]可用于在编辑器下显示射程 +setting.turretShowRange.name = [acid]炮台[white]:射程 +setting.unitBarDrawMinHealth.name = [acid]单位属性[white]:最低血量 +setting.unitDrawMinHealth.name = [cyan]单位显示[white]:最低血量 +setting.unitHealthBar.name = [acid]单位属性 +setting.unitItemCarried.name = [acid]单位携带的物品 +setting.unitLogicMoveLine.name = [acid]控制[white]:移动路径 +setting.unitLogicTimerBars.name = [acid]控制[white]:时间条 +setting.unitTargetType.name = [pink]玩家的目标风格 +setting.unitTransparency.name = [cyan]单位[white]:不透明度 +setting.unitWeaponRange.name = [acid]单位武器射程[white]:范围警告 +setting.unitWeaponRangeAlpha.name = [acid]单位武器射程[white]:不透明度 +setting.unitWeaponTargetLine.name = [acid]单位武器目标 +setting.unitbuildplan.name = [acid]单位[white]:建造序列显示 +setting.worldCreator.name = [cyan]创世神 [gray]无视限制,可编辑地形 +settings.arc = [cyan]学术端功能 +settings.maxMsgRecorded.name = 最大聊天记录数 +shield.phaseboost = [stat]+{0}[lightgray] 格 [stat]+{1}[] 护盾容量 +shield.regenspeed = [stat]{0}[lightgray]x 回复速度 +team.neoplastic.name = 瘤 +unit.anthicus-missile.name = 天灾导弹 +unit.disrupt-missile.name = 瓦解导弹 +unit.quell-missile.name = 终结导弹 +unit.scathe-missile.name = 创伤导弹 +waves.duplicate = 复制 +waves.group = 组 +waves.group.effect = 添加状态 +waves.group.items = 添加物品 +waves.group.payloads = 添加载荷 diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..72013d3da3e0e19ca74aa874dc7dcd2fe3a97634 GIT binary patch literal 6855 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 B2qXXi literal 0 HcmV?d00001 diff --git a/assets/labels b/assets/labels new file mode 100644 index 000000000000..518bd2fd1a82 --- /dev/null +++ b/assets/labels @@ -0,0 +1,74 @@ +广告位招租 +_(:зゝ∠)_ +¯\_(ツ)_/¯ +(≧ω≦) +绝对没有bug +给个好评! +占领整个星球了吗? +如果启用像素画面,这行字会很难看清 +冲击!启动! +欢迎回来! +检测到钍反应堆过热,5,4,3,2,1... +试试在水边用抽水机 +试试用双管炮打T5 +试试往涡轮里放爆炸混合物 +这里不是minecraft +Also try minecraft! +Also try factorio! +Also try satisfactory! +Also try shapez! +Flood与Creeper World 3不得不说的故事 +一大波[][yellow]即将来袭! +[] +神圣的G键连接着我们 +A[] +router! router! router! +路由器神教 +Alt+F4\n解锁[red]隐藏功能 + []点击此处插入文字 +崩服特惠[#e4ffd6]145 +像素原神,启动! +发电的尽头是水电 +血压提升辅助器 +来点涩图秋梨哥 +熔岩领域10分钟8布8塑钢4合金 +/vote gameover +[]点击此处开启隐藏功能 +扣1送阿尔法fumo +修复器修复修复修复器的修复器 + [][yellow]它不发电 +高血压模拟器 +别杀mono,你这个怪物! +你肯定在看这行字 +原价9.99美刀 +因为这句太cool/n所以把它加上[alphachan][yellow] +一键装弹,踢出游戏 +不要乱发图片影响他人/n(来点涩图秋梨膏) +数数第几次看到这行字 +付费开源 +蓝图不规范,亲人两行泪 +废料分裂,秒杀一切 +双管加铜,力大无穷 +火焰加硫,破坏如榴 +熔岩飙车1v4深得我心\n沙荒残骸暴风雪正合我意 +经验+3(GoodGame) +与指挥中心的永别 +Latum萌萌的! +M属性大爆发,Mindustry! +赞美Lucky Clover +赞美WayZer +茉莉茉莉茉莉茉莉茉莉 +学术端要变成松鼠的形状了 +学术追源于根目录(root) +学术与原版差距200个文件与20000行代码!!! +学术工具箱与Testing Utilities不得不说的事 +学术单位工厂与Unit Factory不得不说的事 +中国电弧 +亲爱的,我把硅用完了 +lc被茉莉扑倒在床上了 +有bug??? 去反馈吧 +低血压专效药 +能用双管过裂谷吗? +他妈的没有钛啊 +一点点钛都没有啊 +看看看看看看 diff --git a/assets/mod.hjson b/assets/mod.hjson new file mode 100644 index 000000000000..e98708a37900 --- /dev/null +++ b/assets/mod.hjson @@ -0,0 +1,8 @@ +displayName: MindustryX Loader +name: MindustryX +author: WayZer +main: mindustryX.loader.Main +version: "1.0-dev" +minGameVersion: "146" +hidden: true +dependencies: [] \ No newline at end of file diff --git a/assets/recommendMods.json b/assets/recommendMods.json new file mode 100644 index 000000000000..b76b9baf8608 --- /dev/null +++ b/assets/recommendMods.json @@ -0,0 +1,17 @@ +{ + "lastUpdated": "2024/4/12 21:00", + "modRecommend": [ + { + "repo": "eb-wilson/toomanyitems", + "reason": "Too Many Items(TMI)类似Minecraft的JEL物品管理器\n提供了检索物品、单位、方块、电力、热量的用途以及获取途径" + }, + { + "repo": "mnemotechnician/new-console", + "reason": "NewConsole提供了新的控制台,方便调试者执行js代码\n1.保存js代码的执行记录\n2.读写简单js文件" + }, + { + "repo": "way-zer/contentstweaker", + "reason": "ContentsTweaker(CT)允许地图调整内容、添加UI等" + } + ] +} \ No newline at end of file diff --git a/buildPlugins/build.gradle.kts b/buildPlugins/build.gradle.kts new file mode 100644 index 000000000000..5fc57097a124 --- /dev/null +++ b/buildPlugins/build.gradle.kts @@ -0,0 +1,23 @@ +plugins{ + `kotlin-dsl-base` + `kotlin-dsl`.apply(false) +} + +repositories{ + mavenCentral() + gradlePluginPortal() + google() +} + +dependencies{ + implementation("org.javassist:javassist:3.30.2-GA") + implementation("com.android.tools.smali:smali-dexlib2:3.0.5") + implementation("de.undercouch:gradle-download-task:5.6.0") +} + +sourceSets.main{ + kotlin.srcDir("plugins") +} + +//later apply to use srcDir +apply(plugin = "org.gradle.kotlin.kotlin-dsl") \ No newline at end of file diff --git a/buildPlugins/plugins/mindustryX/buildExt.gradle.kts b/buildPlugins/plugins/mindustryX/buildExt.gradle.kts new file mode 100644 index 000000000000..9a97947f0bbb --- /dev/null +++ b/buildPlugins/plugins/mindustryX/buildExt.gradle.kts @@ -0,0 +1,31 @@ +package mindustryX + +plugins { + id("mindustryX.patchArc") + id("mindustryX.loaderMod") +} + +tasks{ + val writeMindustryX by registering { + outputs.cacheIf { true } + val outFile = rootDir.parentFile.resolve("assets/mod.hjson") + outputs.file(outFile) + val version = (project.properties["buildversion"] ?: "1.0-dev") as String + val upstreamBuild = (project.properties["upstreamBuild"] ?: "custom") as String + inputs.property("buildVersion", version) + inputs.property("upstreamBuild", upstreamBuild) + doLast { + outFile.writeText(""" + displayName: MindustryX Loader + name: MindustryX + author: WayZer + main: mindustryX.loader.Main + version: "$version" + minGameVersion: "$upstreamBuild" + hidden: true + dependencies: [] + """.trimIndent()) + } + } + processResources.configure { dependsOn(writeMindustryX) } +} \ No newline at end of file diff --git a/buildPlugins/plugins/mindustryX/loaderMod.gradle.kts b/buildPlugins/plugins/mindustryX/loaderMod.gradle.kts new file mode 100644 index 000000000000..6af03669c933 --- /dev/null +++ b/buildPlugins/plugins/mindustryX/loaderMod.gradle.kts @@ -0,0 +1,130 @@ +package mindustryX + +import com.android.tools.smali.dexlib2.DexFileFactory +import com.android.tools.smali.dexlib2.Opcodes +import com.android.tools.smali.dexlib2.rewriter.DexRewriter +import com.android.tools.smali.dexlib2.rewriter.Rewriter +import com.android.tools.smali.dexlib2.rewriter.RewriterModule +import com.android.tools.smali.dexlib2.rewriter.Rewriters +import org.gradle.api.GradleException +import org.gradle.api.tasks.bundling.Zip +import org.gradle.kotlin.dsl.getValue +import org.gradle.kotlin.dsl.provideDelegate +import org.gradle.kotlin.dsl.registering +import java.io.File +import java.util.zip.ZipEntry +import java.util.zip.ZipFile +import java.util.zip.ZipOutputStream + +plugins { + id("de.undercouch.download") +} + +tasks { + val downloadOriginJar by registering(de.undercouch.gradle.tasks.download.Download::class) { + outputs.cacheIf { true } + val upstreamBuild = project.properties["upstreamBuild"] as String? + val output = temporaryDir.resolve("v$upstreamBuild.jar") + inputs.property("upstreamBuild", upstreamBuild) + + src("https://github.com/Anuken/Mindustry/releases/download/v$upstreamBuild/Mindustry.jar") + dest(output) + overwrite(false) + } + val distTask = provider { getByPath("::desktop:dist") } + val genLoaderMod by registering { + outputs.cacheIf { true } + val androidTask = findByPath("::android:compileReleaseJavaWithJavac") + dependsOn(downloadOriginJar, distTask) + if (androidTask != null) + dependsOn(androidTask) + val outputF = layout.buildDirectory.file("libs/Mindustry.loader.jar") + inputs.files(distTask) + outputs.file(outputF) + doLast { + val input = ZipFile(distTask.get().outputs.files.singleFile) + val base = ZipFile(downloadOriginJar.get().outputFiles.single()) + val output = ZipOutputStream(outputF.get().asFile.outputStream()) + val baseMap = base.entries().asSequence().associateBy { it.name } + + for (entry in input.entries()) { + if (entry.name.startsWith("sprites") || entry.name == "version.properties") continue + val baseEntry = baseMap[entry.name] + if (baseEntry != null) { + val a = input.getInputStream(entry).use { it.readAllBytes() } + val b = base.getInputStream(baseEntry).use { it.readAllBytes() } + val ext = entry.name.substringAfterLast('.', "") + val eq = when (ext) { + "", "frag", "vert", "js", "properties" -> a.filter { it != 10.toByte() && it != 13.toByte() } == b.filter { it != 10.toByte() && it != 13.toByte() } + else -> a.contentEquals(b) + } + if (eq) continue + } + output.putNextEntry(entry) + output.write(input.getInputStream(entry).use { it.readAllBytes() }) + output.closeEntry() + } + if (androidTask != null) { + val root = androidTask.outputs.files.first() + root.resolve("mindustryX").walkTopDown().forEach { + if (it.isDirectory) return@forEach + val path = it.toRelativeString(root) + output.putNextEntry(ZipEntry(path)) + output.write(it.readBytes()) + output.closeEntry() + } + } + output.close() + } + } + + val genLoaderModDex by registering { + outputs.cacheIf { true } + dependsOn(genLoaderMod, distTask) + inputs.files(files(genLoaderMod)) + val outFile = temporaryDir.resolve("classes.dex") + outputs.file(outFile) + doLast { + val library = distTask.get().outputs.files.singleFile + val inFile = genLoaderMod.get().outputs.files.singleFile + val sdkRoot = System.getenv("ANDROID_HOME") ?: System.getenv("ANDROID_SDK_ROOT") + if (sdkRoot == null || !File(sdkRoot).exists()) throw GradleException("No valid Android SDK found. Ensure that ANDROID_HOME is set to your Android SDK directory.") + + val d8Tool = File("$sdkRoot/build-tools/").listFiles()?.sortedDescending() + ?.flatMap { dir -> (dir.listFiles().orEmpty()).filter { it.name.startsWith("d8") } }?.firstOrNull() + ?: throw GradleException("No d8 found. Ensure that you have an Android platform installed.") + val platformRoot = File("$sdkRoot/platforms/").listFiles()?.sortedDescending()?.firstOrNull { it.resolve("android.jar").exists() } + ?: throw GradleException("No android.jar found. Ensure that you have an Android platform installed.") + + exec { + commandLine("$d8Tool --lib ${platformRoot.resolve("android.jar")} --classpath $library --min-api 14 --output $temporaryDir $inFile".split(" ")) + workingDir(inFile.parentFile) + standardOutput = System.out + errorOutput = System.err + }.assertNormalExitValue() + } + + //fix ExternalSyntheticLambda + doLast { + val file = DexFileFactory.loadDexFile(outFile, Opcodes.forApi(14)) + val rewriter = DexRewriter(object : RewriterModule() { + override fun getTypeRewriter(rewriters: Rewriters): Rewriter = Rewriter { + if (it.length > 20 && it.contains("ExternalSyntheticLambda")) { + return@Rewriter it.replace("ExternalSyntheticLambda", "Lambda") + } + it + } + }) + rewriter.dexFileRewriter.rewrite(file).let { + DexFileFactory.writeDexFile(outFile.path, it) + } + } + } + + val genLoaderModAll by registering(Zip::class) { + dependsOn(genLoaderMod, genLoaderModDex) + archiveFileName.set("MindustryX.loader.dex.jar") + from(zipTree(genLoaderMod.get().outputs.files.singleFile)) + from(genLoaderModDex) + } +} \ No newline at end of file diff --git a/buildPlugins/plugins/mindustryX/patchArc.gradle.kts b/buildPlugins/plugins/mindustryX/patchArc.gradle.kts new file mode 100644 index 000000000000..4715953ea1db --- /dev/null +++ b/buildPlugins/plugins/mindustryX/patchArc.gradle.kts @@ -0,0 +1,99 @@ +package mindustryX + +import javassist.ClassPool +import javassist.CtClass +import javassist.bytecode.Bytecode +import javassist.bytecode.Descriptor +import java.util.zip.ZipFile +import java.util.zip.ZipOutputStream + +plugins { + java +} + +@CacheableTransform +abstract class PatchArc : TransformAction { + @get:InputArtifact + @get:PathSensitive(PathSensitivity.NONE) + abstract val inputArtifact: Provider + + private val genDir = File("build/gen/patchedArc") + private val transform = mapOf Unit>( + "arc.util.Http\$HttpRequest" to clz@{ + getDeclaredMethod("block").apply { + val code = Bytecode(methodInfo.constPool) + val desc = Descriptor.ofMethod(CtClass.voidType, arrayOf(this@clz)) + code.addAload(0) + code.addInvokestatic("mindustryX.Hooks", "onHttp", desc) + methodInfo.codeAttribute.iterator().insertEx(code.get()) + methodInfo.rebuildStackMapIf6(classPool, classFile) + } + } + ) + + override fun transform(outputs: TransformOutputs) { + val input = inputArtifact.get().asFile + val output = outputs.file("${input.nameWithoutExtension}.patched.jar") + doTransform(input, output) + } + + private fun doTransform(input: File, output: File) { + val pool = ClassPool() + pool.appendSystemPath() + pool.appendClassPath(input.path) + + val tmp = output.resolveSibling("tmp") + if (tmp.exists()) tmp.deleteRecursively() + tmp.mkdirs() + transform.forEach { (clz, block) -> + pool.get(clz).also(block) + .writeFile(tmp.path) + } + + val overwrite = tmp.walk().associateBy { it.toRelativeString(tmp).replace(File.separatorChar, '/') } + ZipOutputStream(output.outputStream()).use { out -> + ZipFile(input).use { zip -> + for (entry in zip.entries()) { + out.putNextEntry(entry) + (overwrite[entry.name]?.also { + println("patchArc ${entry.name}") + }?.inputStream() ?: zip.getInputStream(entry)).copyTo(out) + out.closeEntry() + } + } + } + tmp.deleteRecursively() + } +} + +val artifactType = Attribute.of("artifactType", String::class.java) +val patched = Attribute.of("patched", Boolean::class.javaObjectType) +dependencies { + attributesSchema { + attribute(patched) + } + artifactTypes.getByName("jar") { + attributes.attribute(patched, false) + } + registerTransform(PatchArc::class) { + from.attribute(artifactType, "jar").attribute(patched, false) + to.attribute(artifactType, "jar").attribute(patched, true) + } + + val api by configurations + val patchArc by configurations.creating { + attributes { + attribute(patched, true) + } + } + configurations.named("compileOnlyApi").configure { extendsFrom(patchArc) } + "runtimeOnly"(files(patchArc)) + + + val arcLib = api.dependencies.find { it.name == "arc-core" } + ?: error("Can't find arc-core") + api.dependencies.remove(arcLib) + patchArc(arcLib as ExternalModuleDependency) { + isTransitive = false + } +} \ No newline at end of file diff --git a/patches/client/0001-BUILD-build.gradle.kts-and-clear.patch b/patches/client/0001-BUILD-build.gradle.kts-and-clear.patch index a7a9f754ade8..49ffb102656f 100644 --- a/patches/client/0001-BUILD-build.gradle.kts-and-clear.patch +++ b/patches/client/0001-BUILD-build.gradle.kts-and-clear.patch @@ -7,14 +7,14 @@ clear and replce jabel(Support record) way-zer on 2024/6/9 --- .gitignore | 2 +- - android/build.gradle | 78 +++-- + android/build.gradle | 80 +++-- android/proguard-rules.pro | 4 + .../com/github/bsideup/jabel/Desugar.java | 13 + .../javax.annotation.processing.Processor | 6 + build.gradle | 241 ++------------- core/build.gradle | 2 - - core/build.gradle.kts | 64 ++++ - desktop/build.gradle | 164 +--------- + core/build.gradle.kts | 65 ++++ + desktop/build.gradle | 166 +---------- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 43462 bytes gradlew | 282 +++++++++++------- gradlew.bat | 35 ++- @@ -23,7 +23,7 @@ way-zer on 2024/6/9 settings.gradle | 10 +- tools/build.gradle | 44 ++- tools/src/mindustry/tools/Generators.java | 2 +- - 17 files changed, 382 insertions(+), 611 deletions(-) + 17 files changed, 385 insertions(+), 613 deletions(-) create mode 100644 annotations/src/main/java/com/github/bsideup/jabel/Desugar.java create mode 100644 annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor delete mode 100644 core/build.gradle @@ -50,7 +50,7 @@ index dd3f2a0f065d3f774ea84fbc932e337160e4b307..7d91d3191096c431b739d2d5ecd951a7 /core/assets/locales /core/assets/cache/ diff --git a/android/build.gradle b/android/build.gradle -index f1dc45aa74b149babea9cce2535ed7dca8d49a1f..093c328edc2719aa86bb212e1abb1f500044b08a 100644 +index f1dc45aa74b149babea9cce2535ed7dca8d49a1f..11f5fcf77dfc2e54ad1c18b183ad1957ff3dfe9a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,18 +1,19 @@ @@ -102,6 +102,15 @@ index f1dc45aa74b149babea9cce2535ed7dca8d49a1f..093c328edc2719aa86bb212e1abb1f50 buildToolsVersion = '34.0.0' compileSdk = 34 sourceSets{ +@@ -39,7 +32,7 @@ android{ + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] +- assets.srcDirs = ['assets', 'src/main/assets', '../core/assets/'] ++ assets.srcDirs = ['assets', 'src/main/assets', '../core/assets/', '../../assets/'] + jniLibs.srcDirs = ['libs'] + } + @@ -51,8 +44,6 @@ android{ } @@ -587,10 +596,10 @@ index f7f291ef1ab71577313759a7e9fdfd3c1e0833dc..00000000000000000000000000000000 \ No newline at end of file diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 -index 0000000000000000000000000000000000000000..f1a2bfd729db5c05cb4bc9b0e5af6dd003bb7d96 +index 0000000000000000000000000000000000000000..52d6972f5111e55502e3187e3c600e1843f2ec3f --- /dev/null +++ b/core/build.gradle.kts -@@ -0,0 +1,64 @@ +@@ -0,0 +1,65 @@ +import org.gradle.jvm.tasks.Jar +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + @@ -599,8 +608,8 @@ index 0000000000000000000000000000000000000000..f1a2bfd729db5c05cb4bc9b0e5af6dd0 + kotlin("jvm") +} +sourceSets.main { -+ java.setSrcDirs(listOf("src/", layout.buildDirectory.dir("/generated/sources/annotationProcessor/java/main"))) -+ kotlin.setSrcDirs(listOf("src/")) ++ java.setSrcDirs(listOf("src/", "../../src/", layout.buildDirectory.dir("/generated/sources/annotationProcessor/java/main"))) ++ kotlin.setSrcDirs(listOf("src/", "../../src/")) +} + +tasks{ @@ -648,6 +657,7 @@ index 0000000000000000000000000000000000000000..f1a2bfd729db5c05cb4bc9b0e5af6dd0 + val allAssets by registering { + dependsOn(processResources, ":tools:pack") + outputs.dir("assets") ++ outputs.dir("../../assets") + } + val assetsJar by registering(Jar::class) { + from(allAssets) { @@ -657,10 +667,10 @@ index 0000000000000000000000000000000000000000..f1a2bfd729db5c05cb4bc9b0e5af6dd0 +} \ No newline at end of file diff --git a/desktop/build.gradle b/desktop/build.gradle -index b4d9955e70e7cfbf4792d5196bbe17e06c3762bd..b63f4a3ca7964f41f02a3fa12a068f859b51f96c 100644 +index b4d9955e70e7cfbf4792d5196bbe17e06c3762bd..0b9db141c3842afa73b8b1e14f31c5d244970ddb 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle -@@ -3,12 +3,7 @@ sourceSets.main.java.srcDirs = ["src/"] +@@ -3,14 +3,9 @@ sourceSets.main.java.srcDirs = ["src/"] project.ext.mainClassName = "mindustry.desktop.DesktopLauncher" project.ext.assetsDir = new File("../core/assets") @@ -672,8 +682,11 @@ index b4d9955e70e7cfbf4792d5196bbe17e06c3762bd..b63f4a3ca7964f41f02a3fa12a068f85 -task run(dependsOn: classes, type: JavaExec){ +task run(dependsOn: [classes, ":core:allAssets"], type: JavaExec){ mainClass = project.mainClassName - classpath = sourceSets.main.runtimeClasspath +- classpath = sourceSets.main.runtimeClasspath ++ classpath = files(sourceSets.main.runtimeClasspath, tasks.getByPath(":core:allAssets")) standardInput = System.in + workingDir = project.assetsDir + ignoreExitValue = true @@ -44,7 +39,7 @@ task dist(type: Jar, dependsOn: configurations.runtimeClasspath){ from files(sourceSets.main.output.classesDirs) from files(sourceSets.main.output.resourcesDir) diff --git a/patches/client/0002-BUILD-MindustryX.patch b/patches/client/0002-BUILD-MindustryX.patch new file mode 100644 index 000000000000..f488722c5a10 --- /dev/null +++ b/patches/client/0002-BUILD-MindustryX.patch @@ -0,0 +1,86 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: way-zer +Date: Sat, 2 Mar 2024 20:04:19 +0800 +Subject: [PATCH] BUILD MindustryX +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +buildPlugins & Kotlin 1.9.20 + +patchArc改写成transform +way-zer on 2024/4/27 at 18:57 +--- + build.gradle | 11 ++--------- + core/build.gradle.kts | 1 + + gradle.properties | 2 +- + settings.gradle | 2 ++ + 4 files changed, 6 insertions(+), 10 deletions(-) + +diff --git a/build.gradle b/build.gradle +index 3ac0012a751b893f2bed04484034e4fb004cd8ac..222ce1ed9b95d82b8244aaacc08247aa39ea9e22 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -13,8 +13,8 @@ buildscript{ + } + + plugins{ +- id "org.jetbrains.kotlin.jvm" version "1.6.0" +- id "org.jetbrains.kotlin.kapt" version "1.6.0" ++ id "org.jetbrains.kotlin.jvm" version "1.9.20" ++ id "org.jetbrains.kotlin.kapt" version "1.9.20" + } + + allprojects{ +@@ -180,13 +180,6 @@ project(":core"){ + } + } + +- gradle.taskGraph.whenReady{ +- //these are completely unnecessary +- tasks.kaptGenerateStubsKotlin.onlyIf{ false } +- tasks.compileKotlin.onlyIf{ false } +- tasks.inspectClassesForKotlinIC.onlyIf{ false } +- } +- + //comp** classes are only used for code generation + jar{ + exclude("mindustry/entities/comp/**") +diff --git a/core/build.gradle.kts b/core/build.gradle.kts +index 52d6972f5111e55502e3187e3c600e1843f2ec3f..6dfb14b6bb9401ec083a0f6994ed9bab8b303c97 100644 +--- a/core/build.gradle.kts ++++ b/core/build.gradle.kts +@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { + java + kotlin("jvm") ++ id("mindustryX.buildExt") + } + sourceSets.main { + java.setSrcDirs(listOf("src/", "../../src/", layout.buildDirectory.dir("/generated/sources/annotationProcessor/java/main"))) +diff --git a/gradle.properties b/gradle.properties +index 0c6c42e01d70bb59166e3e21e91a41801e7c113f..1a4d7fb5df48ec81198c57cd5d706c4c48dbd4d7 100644 +--- a/gradle.properties ++++ b/gradle.properties +@@ -18,7 +18,7 @@ kapt.use.worker.api=true + # Compilation avoidance (see https://kotlinlang.org/docs/kapt.html#compile-avoidance-for-kapt-since-1-3-20) + kapt.include.compile.classpath=false + # I don't need to use the kotlin stdlib, so remove it to prevent extra bloat & method count issues +-kotlin.stdlib.default.dependency=false ++#kotlin.stdlib.default.dependency=false + #needed for android compilation + android.useAndroidX=true + org.gradle.caching=true +diff --git a/settings.gradle b/settings.gradle +index 304e893b1657dd6d23f87a0c6c2939ac7c1d5c84..116bd48602f25dbaa4f6438934e42698abd4a0a4 100644 +--- a/settings.gradle ++++ b/settings.gradle +@@ -9,6 +9,8 @@ if(JavaVersion.current().ordinal() < JavaVersion.VERSION_17.ordinal()){ + throw new Exception("!!! YOU MUST USE JAVA 17 OR ABOVE TO COMPILE AND RUN MINDUSTRY !!! Read the README. Your version: ${System.properties["java.version"]}") + } + ++includeBuild("../buildPlugins") ++ + include 'core', 'server', 'annotations', 'tools', 'tests' + include 'desktop', 'ios' + diff --git a/patches/client/0002-CS-Version.patch b/patches/client/0003-CS-MindustryX-Version-Icon.patch similarity index 76% rename from patches/client/0002-CS-Version.patch rename to patches/client/0003-CS-MindustryX-Version-Icon.patch index cab6265406a4..d9949ebd3f66 100644 --- a/patches/client/0002-CS-Version.patch +++ b/patches/client/0003-CS-MindustryX-Version-Icon.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: way-zer Date: Tue, 9 Apr 2024 18:21:14 +0800 -Subject: [PATCH] CS: Version +Subject: [PATCH] CS: MindustryX Version&Icon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -9,17 +9,18 @@ Content-Transfer-Encoding: 8bit 不再发送ARC标识 way-zer on 2024/9/8 --- - .gitignore | 1 + - android/build.gradle | 4 ++-- - android/res/values/strings.xml | 2 +- - build.gradle | 2 +- - core/build.gradle.kts | 2 +- - core/src/mindustry/Vars.java | 2 +- - core/src/mindustry/core/NetClient.java | 1 + - core/src/mindustry/core/Version.java | 16 +++++++++++++++- - core/src/mindustry/net/NetworkIO.java | 2 +- - gradle.properties | 2 ++ - 10 files changed, 26 insertions(+), 8 deletions(-) + .gitignore | 1 + + android/build.gradle | 4 ++-- + android/res/values/strings.xml | 2 +- + build.gradle | 2 +- + core/build.gradle.kts | 2 +- + core/src/mindustry/Vars.java | 2 +- + core/src/mindustry/core/NetClient.java | 1 + + core/src/mindustry/core/Version.java | 16 +++++++++++++++- + core/src/mindustry/net/NetworkIO.java | 2 +- + .../src/mindustry/desktop/DesktopLauncher.java | 2 +- + gradle.properties | 3 +++ + 11 files changed, 28 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 7d91d3191096c431b739d2d5ecd951a764feead3..ba271e6bd0dd06971fff6fa2314254149cc90087 100644 @@ -34,7 +35,7 @@ index 7d91d3191096c431b739d2d5ecd951a764feead3..ba271e6bd0dd06971fff6fa231425414 /out/ ios/libs/ diff --git a/android/build.gradle b/android/build.gradle -index 093c328edc2719aa86bb212e1abb1f500044b08a..fc719ba8aaa918185c1bba016ba83d7ad975e402 100644 +index 11f5fcf77dfc2e54ad1c18b183ad1957ff3dfe9a..23eb0e5b84894538ee19ee7fa437950622c56a2a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -18,7 +18,7 @@ configurations{ natives } @@ -66,7 +67,7 @@ index d42ffe6d4a318ce558f1010eae46140f88ed5c99..bf44ead5c58abfb79c500e6daae30c3e + MindustryX diff --git a/build.gradle b/build.gradle -index 3ac0012a751b893f2bed04484034e4fb004cd8ac..d64047c2ff2f1f6b4ead7354f4edee748c2347b1 100644 +index 222ce1ed9b95d82b8244aaacc08247aa39ea9e22..e13f9df614deb5d24668053bf6e6ef0a417341bc 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ allprojects{ @@ -79,10 +80,10 @@ index 3ac0012a751b893f2bed04484034e4fb004cd8ac..d64047c2ff2f1f6b4ead7354f4edee74 ext{ versionNumber = '7' diff --git a/core/build.gradle.kts b/core/build.gradle.kts -index f1a2bfd729db5c05cb4bc9b0e5af6dd003bb7d96..f5129a036a3655bd41da6e51ed657caddf29dab5 100644 +index 6dfb14b6bb9401ec083a0f6994ed9bab8b303c97..a68dd5cd58f7f012e3dd27750ae970b97c5bae6c 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts -@@ -46,7 +46,7 @@ tasks{ +@@ -47,7 +47,7 @@ tasks{ property("type", findProperty("versionType") ?: "official") property("modifier", findProperty("versionModifier") ?: "release") property("number", '7') @@ -117,7 +118,7 @@ index d0e444a4a7a9ced372a2c93102860991ac922112..0948c4a880fe17643171857951722cd7 }); } diff --git a/core/src/mindustry/core/Version.java b/core/src/mindustry/core/Version.java -index 73bbd59416cc8e1b64bcb5538fdd73886a455451..8698103654e40dd4e85451e1020563ca562ed2d2 100644 +index 73bbd59416cc8e1b64bcb5538fdd73886a455451..93da9d60feda92b04c60e649b0db0b2a6e33f3f9 100644 --- a/core/src/mindustry/core/Version.java +++ b/core/src/mindustry/core/Version.java @@ -6,6 +6,8 @@ import arc.files.*; @@ -145,7 +146,7 @@ index 73bbd59416cc8e1b64bcb5538fdd73886a455451..8698103654e40dd4e85451e1020563ca + //MDTX: mdtXBuild + if(Core.files == null) return; + try{ -+ Jval meta = Jval.read(Core.files.internal("MindustryX.hjson").readString()); ++ Jval meta = Jval.read(Core.files.internal("mod.hjson").readString()); + mdtXBuild = meta.getString("version"); + }catch(Throwable e){ + e.printStackTrace(); @@ -176,14 +177,28 @@ index 48599c6b96474117057e7ca2b87b545873a0ea31..4366eeef830845fb13132a0ae3534129 buffer.put((byte)state.rules.mode().ordinal()); buffer.putInt(netServer.admins.getPlayerLimit()); +diff --git a/desktop/src/mindustry/desktop/DesktopLauncher.java b/desktop/src/mindustry/desktop/DesktopLauncher.java +index 44f3b5b03f275b2d2151b9ef658879ddd5c06375..cc0fc736535acdcf5a786b551a7a40a4c62cf431 100644 +--- a/desktop/src/mindustry/desktop/DesktopLauncher.java ++++ b/desktop/src/mindustry/desktop/DesktopLauncher.java +@@ -62,7 +62,7 @@ public class DesktopLauncher extends ClientLauncher{ + } + } + } +- setWindowIcon(FileType.internal, "icons/icon_64.png"); ++ setWindowIcon(FileType.internal, "icon.png"); + }}); + }catch(Throwable e){ + handleCrash(e); diff --git a/gradle.properties b/gradle.properties -index 0c6c42e01d70bb59166e3e21e91a41801e7c113f..5fcc2f6a7455a09fc17437e4f73e6e6f4d818f86 100644 +index 1a4d7fb5df48ec81198c57cd5d706c4c48dbd4d7..611a7bf7dd576c14e2192a8e4192f7f59a50f981 100644 --- a/gradle.properties +++ b/gradle.properties -@@ -27,3 +27,5 @@ org.gradle.internal.http.socketTimeout=100000 +@@ -27,3 +27,6 @@ org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false archash=29c4199b83 + -+upstreamBuild=25162 ++upstreamBuild=25256 ++versionType=bleeding-edge \ No newline at end of file diff --git a/patches/client/0003-API-Hooks.patch b/patches/client/0004-API-Hooks.patch similarity index 100% rename from patches/client/0003-API-Hooks.patch rename to patches/client/0004-API-Hooks.patch diff --git a/patches/client/0004-CS-Bundle-Extend.patch b/patches/client/0004-CS-Bundle-Extend.patch deleted file mode 100644 index c12b3faf860a..000000000000 --- a/patches/client/0004-CS-Bundle-Extend.patch +++ /dev/null @@ -1,13 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Tue, 9 Apr 2024 18:21:28 +0800 -Subject: [PATCH] CS: Bundle Extend - ---- - core/assets/bundles/bundle-mdtx.properties | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) - create mode 100644 core/assets/bundles/bundle-mdtx.properties - -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -new file mode 100644 -index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/patches/client/0019-C-StatusEffects.patch b/patches/client/0019-C-StatusEffects.patch index 281ea5c963fc..192011ff2346 100644 --- a/patches/client/0019-C-StatusEffects.patch +++ b/patches/client/0019-C-StatusEffects.patch @@ -9,9 +9,8 @@ Content-Transfer-Encoding: 8bit --- .../sprites/statuses/status-invincible.png | Bin 0 -> 201 bytes - core/assets/bundles/bundle-mdtx.properties | 7 +++++++ core/src/mindustry/content/StatusEffects.java | 1 + - 3 files changed, 8 insertions(+) + 2 files changed, 1 insertion(+) create mode 100644 core/assets-raw/sprites/statuses/status-invincible.png diff --git a/core/assets-raw/sprites/statuses/status-invincible.png b/core/assets-raw/sprites/statuses/status-invincible.png @@ -28,18 +27,6 @@ BQEmVL literal 0 HcmV?d00001 -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..87ca026cadc01f80b5e927ed210bc78f7c7fc13b 100644 ---- a/core/assets/bundles/bundle-mdtx.properties -+++ b/core/assets/bundles/bundle-mdtx.properties -@@ -0,0 +1,7 @@ -+status.slow.name = 缓慢 -+status.shielded.name = 保护 -+status.corroded.name = 腐蚀 -+status.disarmed.name = 缴械 -+status.invincible.name = 无敌 -+status.fast.name = 迅捷 -+ diff --git a/core/src/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java index 1ccaabc80faeabf0acaf38ae371fcc1f98bd9750..c58b4ec28d39f53104fc4555646e4284917364cb 100644 --- a/core/src/mindustry/content/StatusEffects.java diff --git a/patches/client/0021-C-StatExt.patch b/patches/client/0021-C-StatExt.patch index 53d1be5017c0..0a81834165ae 100644 --- a/patches/client/0021-C-StatExt.patch +++ b/patches/client/0021-C-StatExt.patch @@ -9,7 +9,6 @@ Content-Transfer-Encoding: 8bit 修复一些显示错误 way-zer on 2024/5/4 at 22:17 --- - core/assets/bundles/bundle-mdtx.properties | 35 +++ core/src/mindustry/type/Item.java | 5 + core/src/mindustry/type/Liquid.java | 2 + core/src/mindustry/type/StatusEffect.java | 2 + @@ -37,51 +36,8 @@ way-zer on 2024/5/4 at 22:17 core/src/mindustry/world/meta/Stat.java | 21 +- core/src/mindustry/world/meta/StatCat.java | 5 +- core/src/mindustry/world/meta/StatValues.java | 254 ++++++++++++++---- - 28 files changed, 396 insertions(+), 89 deletions(-) + 27 files changed, 361 insertions(+), 89 deletions(-) -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -index 87ca026cadc01f80b5e927ed210bc78f7c7fc13b..0cb666446175aa5e952ceaa07669e10a3a023d10 100644 ---- a/core/assets/bundles/bundle-mdtx.properties -+++ b/core/assets/bundles/bundle-mdtx.properties -@@ -5,3 +5,38 @@ status.disarmed.name = 缴械 - status.invincible.name = 无敌 - status.fast.name = 迅捷 - -+#StatExt -+stat.unit_range = 雷达范围 -+stat.can_overdrive = 能否超速 -+stat.cost = 建造时间花费 -+stat.health_scaling = 建筑血量系数 -+stat.hardness = 硬度 -+stat.buildable = 是否用于建造 -+stat.boil_point = 沸点 -+stat.drag_multiplier = 移动阻力倍率 -+ -+stat.buffer_capacity = 缓存容量 -+stat.sep_output = 比例输出 -+stat.regen_speed = 回复速度 -+stat.regen_speed_broken = 过热时回复速度 -+stat.mend = 修复量 -+stat.mend_reload = 修复间隔 -+stat.mend_speed = 修复速度 -+stat.warmup_partial = 启动时间 -+stat.warmup_time = 完全启动时间 -+stat.warmup_power = 启动总耗电 -+ -+stat.rotate_speed = 转向速度 -+stat.boost_multiplier = 助推速度倍率 -+stat.drown_time_multiplier = 淹没时间倍率 -+stat.mine_level = 采矿等级 -+stat.unit_item_capacity = 物品容量 -+ -+stat.crush_damage = 碾压伤害(每格) -+stat.estimate_dps = 预估dps -+stat.ai_controller = 默认AI -+stat.targets = 目标 -+stat.ammo_type = 子弹类型 -+stat.ammo_capacity = 子弹容量 -+ -+#end StatExt diff --git a/core/src/mindustry/type/Item.java b/core/src/mindustry/type/Item.java index 5d81790919f016776eff80c6d241b1d034f76d11..ff81bc3b9d0a54e7aa0e8dae9e12d48612a9d2ab 100644 --- a/core/src/mindustry/type/Item.java diff --git a/patches/client/0024-BUILD-Kotlin-1.9.20.patch b/patches/client/0024-BUILD-Kotlin-1.9.20.patch deleted file mode 100644 index 7323b1cf4b9c..000000000000 --- a/patches/client/0024-BUILD-Kotlin-1.9.20.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Sat, 2 Mar 2024 20:04:19 +0800 -Subject: [PATCH] BUILD Kotlin 1.9.20 - ---- - build.gradle | 11 ++--------- - gradle.properties | 2 +- - 2 files changed, 3 insertions(+), 10 deletions(-) - -diff --git a/build.gradle b/build.gradle -index d64047c2ff2f1f6b4ead7354f4edee748c2347b1..e13f9df614deb5d24668053bf6e6ef0a417341bc 100644 ---- a/build.gradle -+++ b/build.gradle -@@ -13,8 +13,8 @@ buildscript{ - } - - plugins{ -- id "org.jetbrains.kotlin.jvm" version "1.6.0" -- id "org.jetbrains.kotlin.kapt" version "1.6.0" -+ id "org.jetbrains.kotlin.jvm" version "1.9.20" -+ id "org.jetbrains.kotlin.kapt" version "1.9.20" - } - - allprojects{ -@@ -180,13 +180,6 @@ project(":core"){ - } - } - -- gradle.taskGraph.whenReady{ -- //these are completely unnecessary -- tasks.kaptGenerateStubsKotlin.onlyIf{ false } -- tasks.compileKotlin.onlyIf{ false } -- tasks.inspectClassesForKotlinIC.onlyIf{ false } -- } -- - //comp** classes are only used for code generation - jar{ - exclude("mindustry/entities/comp/**") -diff --git a/gradle.properties b/gradle.properties -index 5fcc2f6a7455a09fc17437e4f73e6e6f4d818f86..fad521726aa1c9205be065f31e31c75e845aeadd 100644 ---- a/gradle.properties -+++ b/gradle.properties -@@ -18,7 +18,7 @@ kapt.use.worker.api=true - # Compilation avoidance (see https://kotlinlang.org/docs/kapt.html#compile-avoidance-for-kapt-since-1-3-20) - kapt.include.compile.classpath=false - # I don't need to use the kotlin stdlib, so remove it to prevent extra bloat & method count issues --kotlin.stdlib.default.dependency=false -+#kotlin.stdlib.default.dependency=false - #needed for android compilation - android.useAndroidX=true - org.gradle.caching=true diff --git a/patches/client/0025-FC-Loader-Mod.patch b/patches/client/0024-FC-Loader-Mod.patch similarity index 95% rename from patches/client/0025-FC-Loader-Mod.patch rename to patches/client/0024-FC-Loader-Mod.patch index b853fc9cc349..efbf79c3babf 100644 --- a/patches/client/0025-FC-Loader-Mod.patch +++ b/patches/client/0024-FC-Loader-Mod.patch @@ -12,18 +12,19 @@ way-zer on 2024/6/9 更好的Desktop适配 way-zer on 2024/8/3 --- - .../src/mindustryX/loader/AndroidImpl.java | 273 ++++++++++++++ + .../src/mindustryX/loader/AndroidImpl.java | 272 ++++++++++++++ + core/src/mindustry/mod/ModClassLoader.java | 7 + .../src/arc/backend/sdl/SdlApplication.java | 355 ++++++++++++++++++ - 2 files changed, 628 insertions(+) + 3 files changed, 634 insertions(+) create mode 100644 android/src/mindustryX/loader/AndroidImpl.java create mode 100644 desktop/src/arc/backend/sdl/SdlApplication.java diff --git a/android/src/mindustryX/loader/AndroidImpl.java b/android/src/mindustryX/loader/AndroidImpl.java new file mode 100644 -index 0000000000000000000000000000000000000000..b940ea6d550cc1d7e47c3c82573d8945bfc24836 +index 0000000000000000000000000000000000000000..3c52e6dad6fb333a0fb75cfa8b5399247a046cd5 --- /dev/null +++ b/android/src/mindustryX/loader/AndroidImpl.java -@@ -0,0 +1,273 @@ +@@ -0,0 +1,272 @@ +package mindustryX.loader; + +import android.app.*; @@ -115,9 +116,8 @@ index 0000000000000000000000000000000000000000..b940ea6d550cc1d7e47c3c82573d8945 + + @Override + public URL getResource(String name){ -+ if(name.equals("MindustryX.hjson")) -+ return findResource("mod.hjson"); -+ if(name.equals("mod.hjson") || name.equals("icon.png")) return null; ++ if(name.equals("version.properties")) ++ return parent.getResource(name); + //self first + URL url = findResource(name); + if(url == null) @@ -297,6 +297,29 @@ index 0000000000000000000000000000000000000000..b940ea6d550cc1d7e47c3c82573d8945 + } + } +} +diff --git a/core/src/mindustry/mod/ModClassLoader.java b/core/src/mindustry/mod/ModClassLoader.java +index d9c05036f9715933ef293511a2069d65312d01fc..8d3a22272e38698dac6d9f0c74ffd4932e3a4fc2 100644 +--- a/core/src/mindustry/mod/ModClassLoader.java ++++ b/core/src/mindustry/mod/ModClassLoader.java +@@ -1,6 +1,7 @@ + package mindustry.mod; + + import arc.struct.*; ++import java.net.*; + + public class ModClassLoader extends ClassLoader{ + private Seq children = new Seq<>(); +@@ -46,4 +47,10 @@ public class ModClassLoader extends ClassLoader{ + + throw (last == null ? new ClassNotFoundException(name) : last); + } ++ ++ @Override ++ public URL getResource(String name){ ++ if(name.equals("mod.hjson") || name.equals("icon.png")) return null; ++ return super.getResource(name); ++ } + } diff --git a/desktop/src/arc/backend/sdl/SdlApplication.java b/desktop/src/arc/backend/sdl/SdlApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..bb63fa602677dfaa7b838e43d5c7f183968fab22 diff --git a/patches/client/0028-C-ReplayController.patch b/patches/client/0025-C-ReplayController.patch similarity index 100% rename from patches/client/0028-C-ReplayController.patch rename to patches/client/0025-C-ReplayController.patch diff --git a/patches/client/0026-BUILD-buildPlugins.patch b/patches/client/0026-BUILD-buildPlugins.patch deleted file mode 100644 index 333ba95cd587..000000000000 --- a/patches/client/0026-BUILD-buildPlugins.patch +++ /dev/null @@ -1,393 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Tue, 9 Apr 2024 17:57:46 +0800 -Subject: [PATCH] BUILD buildPlugins -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -patchArc改写成transform -way-zer on 2024/4/27 at 18:57 ---- - .gitignore | 6 +- - buildPlugins/build.gradle.kts | 23 +++ - .../plugins/mindustryX/buildExt.gradle.kts | 31 ++++ - .../plugins/mindustryX/loaderMod.gradle.kts | 141 ++++++++++++++++++ - .../plugins/mindustryX/patchArc.gradle.kts | 99 ++++++++++++ - core/build.gradle.kts | 1 + - settings.gradle | 2 + - 7 files changed, 299 insertions(+), 4 deletions(-) - create mode 100644 buildPlugins/build.gradle.kts - create mode 100644 buildPlugins/plugins/mindustryX/buildExt.gradle.kts - create mode 100644 buildPlugins/plugins/mindustryX/loaderMod.gradle.kts - create mode 100644 buildPlugins/plugins/mindustryX/patchArc.gradle.kts - -diff --git a/.gitignore b/.gitignore -index ba271e6bd0dd06971fff6fa2314254149cc90087..abe35e41df5f7e47c81d3ad059c735a079170711 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -1,4 +1,6 @@ -+build/ - logs/ -+ - /fastlane/metadata/android/en-US/changelogs/ - /core/assets/mindustry-saves/ - /core/assets/mindustry-maps/ -@@ -20,10 +22,6 @@ ios/libs/ - /core/assets-raw/sprites_out/ - /annotations/build/ - /annotations/out/ --/net/build/ --/tools/build/ --/tests/build/ --/server/build/ - changelog - saves/ - /core/assets-raw/fontgen/out/ -diff --git a/buildPlugins/build.gradle.kts b/buildPlugins/build.gradle.kts -new file mode 100644 -index 0000000000000000000000000000000000000000..5fc57097a1240fc6b2912492fa4470c4ffc4ed4b ---- /dev/null -+++ b/buildPlugins/build.gradle.kts -@@ -0,0 +1,23 @@ -+plugins{ -+ `kotlin-dsl-base` -+ `kotlin-dsl`.apply(false) -+} -+ -+repositories{ -+ mavenCentral() -+ gradlePluginPortal() -+ google() -+} -+ -+dependencies{ -+ implementation("org.javassist:javassist:3.30.2-GA") -+ implementation("com.android.tools.smali:smali-dexlib2:3.0.5") -+ implementation("de.undercouch:gradle-download-task:5.6.0") -+} -+ -+sourceSets.main{ -+ kotlin.srcDir("plugins") -+} -+ -+//later apply to use srcDir -+apply(plugin = "org.gradle.kotlin.kotlin-dsl") -\ No newline at end of file -diff --git a/buildPlugins/plugins/mindustryX/buildExt.gradle.kts b/buildPlugins/plugins/mindustryX/buildExt.gradle.kts -new file mode 100644 -index 0000000000000000000000000000000000000000..f6cd338cc79a0382e8a23ca590ac034f2ebf3a09 ---- /dev/null -+++ b/buildPlugins/plugins/mindustryX/buildExt.gradle.kts -@@ -0,0 +1,31 @@ -+package mindustryX -+ -+plugins { -+ id("mindustryX.patchArc") -+ id("mindustryX.loaderMod") -+} -+ -+tasks{ -+ val writeMindustryX by registering { -+ outputs.cacheIf { true } -+ val outFile = projectDir.resolve("assets/MindustryX.hjson") -+ outputs.file(outFile) -+ val version = (project.properties["buildversion"] ?: "1.0-dev") as String -+ val upstreamBuild = (project.properties["upstreamBuild"] ?: "custom") as String -+ inputs.property("buildVersion", version) -+ inputs.property("upstreamBuild", upstreamBuild) -+ doLast { -+ outFile.writeText(""" -+ displayName: MindustryX Loader -+ name: MindustryX -+ author: WayZer -+ main: mindustryX.loader.Main -+ version: "$version" -+ minGameVersion: "$upstreamBuild" -+ hidden: true -+ dependencies: [] -+ """.trimIndent()) -+ } -+ } -+ processResources.configure { dependsOn(writeMindustryX) } -+} -\ No newline at end of file -diff --git a/buildPlugins/plugins/mindustryX/loaderMod.gradle.kts b/buildPlugins/plugins/mindustryX/loaderMod.gradle.kts -new file mode 100644 -index 0000000000000000000000000000000000000000..4921f01e9e12246f561df4c50c16911e81785a20 ---- /dev/null -+++ b/buildPlugins/plugins/mindustryX/loaderMod.gradle.kts -@@ -0,0 +1,141 @@ -+package mindustryX -+ -+import com.android.tools.smali.dexlib2.DexFileFactory -+import com.android.tools.smali.dexlib2.Opcodes -+import com.android.tools.smali.dexlib2.rewriter.DexRewriter -+import com.android.tools.smali.dexlib2.rewriter.Rewriter -+import com.android.tools.smali.dexlib2.rewriter.RewriterModule -+import com.android.tools.smali.dexlib2.rewriter.Rewriters -+import org.gradle.api.GradleException -+import org.gradle.api.tasks.bundling.Zip -+import org.gradle.kotlin.dsl.getValue -+import org.gradle.kotlin.dsl.provideDelegate -+import org.gradle.kotlin.dsl.registering -+import java.io.File -+import java.util.zip.ZipEntry -+import java.util.zip.ZipFile -+import java.util.zip.ZipOutputStream -+ -+plugins { -+ id("de.undercouch.download") -+} -+ -+tasks { -+ val downloadOriginJar by registering(de.undercouch.gradle.tasks.download.Download::class) { -+ outputs.cacheIf { true } -+ val upstreamBuild = project.properties["upstreamBuild"] as String? -+ val output = temporaryDir.resolve("v$upstreamBuild.jar") -+ inputs.property("upstreamBuild", upstreamBuild) -+ -+ src("https://github.com/Anuken/Mindustry/releases/download/v$upstreamBuild/Mindustry.jar") -+ dest(output) -+ overwrite(false) -+ } -+ val distTask = provider { getByPath("::desktop:dist") } -+ val genLoaderMod by registering { -+ outputs.cacheIf { true } -+ val androidTask = findByPath("::android:compileReleaseJavaWithJavac") -+ dependsOn(downloadOriginJar, distTask) -+ if (androidTask != null) -+ dependsOn(androidTask) -+ val outputF = layout.buildDirectory.file("libs/Mindustry.loader.jar") -+ inputs.files(distTask) -+ outputs.file(outputF) -+ doLast { -+ val input = ZipFile(distTask.get().outputs.files.singleFile) -+ val base = ZipFile(downloadOriginJar.get().outputFiles.single()) -+ val output = ZipOutputStream(outputF.get().asFile.outputStream()) -+ val baseMap = base.entries().asSequence().associateBy { it.name } -+ -+ for (entry in input.entries()) { -+ if (entry.name.startsWith("sprites") || entry.name == "version.properties") continue -+ val baseEntry = baseMap[entry.name] -+ if (baseEntry != null) { -+ val a = input.getInputStream(entry).use { it.readAllBytes() } -+ val b = base.getInputStream(baseEntry).use { it.readAllBytes() } -+ val ext = entry.name.substringAfterLast('.', "") -+ val eq = when (ext) { -+ "", "frag", "vert", "js", "properties" -> a.filter { it != 10.toByte() && it != 13.toByte() } == b.filter { it != 10.toByte() && it != 13.toByte() } -+ else -> a.contentEquals(b) -+ } -+ if (eq) continue -+ } -+ var outputEntry = entry -+ //rename to mod.hjson -+ if (entry.name == "MindustryX.hjson") { -+ outputEntry = ZipEntry("mod.hjson") -+ } -+ output.putNextEntry(outputEntry) -+ output.write(input.getInputStream(entry).use { it.readAllBytes() }) -+ output.closeEntry() -+ //copy icon -+ if(entry.name == "icons/icon_64.png"){ -+ output.putNextEntry(ZipEntry("icon.png")) -+ output.write(input.getInputStream(entry).use { it.readAllBytes() }) -+ output.closeEntry() -+ } -+ } -+ if (androidTask != null) { -+ val root = androidTask.outputs.files.first() -+ root.resolve("mindustryX").walkTopDown().forEach { -+ if (it.isDirectory) return@forEach -+ val path = it.toRelativeString(root) -+ output.putNextEntry(ZipEntry(path)) -+ output.write(it.readBytes()) -+ output.closeEntry() -+ } -+ } -+ output.close() -+ } -+ } -+ -+ val genLoaderModDex by registering { -+ outputs.cacheIf { true } -+ dependsOn(genLoaderMod, distTask) -+ inputs.files(files(genLoaderMod)) -+ val outFile = temporaryDir.resolve("classes.dex") -+ outputs.file(outFile) -+ doLast { -+ val library = distTask.get().outputs.files.singleFile -+ val inFile = genLoaderMod.get().outputs.files.singleFile -+ val sdkRoot = System.getenv("ANDROID_HOME") ?: System.getenv("ANDROID_SDK_ROOT") -+ if (sdkRoot == null || !File(sdkRoot).exists()) throw GradleException("No valid Android SDK found. Ensure that ANDROID_HOME is set to your Android SDK directory.") -+ -+ val d8Tool = File("$sdkRoot/build-tools/").listFiles()?.sortedDescending() -+ ?.flatMap { dir -> (dir.listFiles().orEmpty()).filter { it.name.startsWith("d8") } }?.firstOrNull() -+ ?: throw GradleException("No d8 found. Ensure that you have an Android platform installed.") -+ val platformRoot = File("$sdkRoot/platforms/").listFiles()?.sortedDescending()?.firstOrNull { it.resolve("android.jar").exists() } -+ ?: throw GradleException("No android.jar found. Ensure that you have an Android platform installed.") -+ -+ exec { -+ commandLine("$d8Tool --lib ${platformRoot.resolve("android.jar")} --classpath $library --min-api 14 --output $temporaryDir $inFile".split(" ")) -+ workingDir(inFile.parentFile) -+ standardOutput = System.out -+ errorOutput = System.err -+ }.assertNormalExitValue() -+ } -+ -+ //fix ExternalSyntheticLambda -+ doLast { -+ val file = DexFileFactory.loadDexFile(outFile, Opcodes.forApi(14)) -+ val rewriter = DexRewriter(object : RewriterModule() { -+ override fun getTypeRewriter(rewriters: Rewriters): Rewriter = Rewriter { -+ if (it.length > 20 && it.contains("ExternalSyntheticLambda")) { -+ return@Rewriter it.replace("ExternalSyntheticLambda", "Lambda") -+ } -+ it -+ } -+ }) -+ rewriter.dexFileRewriter.rewrite(file).let { -+ DexFileFactory.writeDexFile(outFile.path, it) -+ } -+ } -+ } -+ -+ val genLoaderModAll by registering(Zip::class) { -+ dependsOn(genLoaderMod, genLoaderModDex) -+ archiveFileName.set("MindustryX.loader.dex.jar") -+ from(zipTree(genLoaderMod.get().outputs.files.singleFile)) -+ from(genLoaderModDex) -+ } -+} -\ No newline at end of file -diff --git a/buildPlugins/plugins/mindustryX/patchArc.gradle.kts b/buildPlugins/plugins/mindustryX/patchArc.gradle.kts -new file mode 100644 -index 0000000000000000000000000000000000000000..4715953ea1db8e20fe922911ba8054b8a8231fea ---- /dev/null -+++ b/buildPlugins/plugins/mindustryX/patchArc.gradle.kts -@@ -0,0 +1,99 @@ -+package mindustryX -+ -+import javassist.ClassPool -+import javassist.CtClass -+import javassist.bytecode.Bytecode -+import javassist.bytecode.Descriptor -+import java.util.zip.ZipFile -+import java.util.zip.ZipOutputStream -+ -+plugins { -+ java -+} -+ -+@CacheableTransform -+abstract class PatchArc : TransformAction { -+ @get:InputArtifact -+ @get:PathSensitive(PathSensitivity.NONE) -+ abstract val inputArtifact: Provider -+ -+ private val genDir = File("build/gen/patchedArc") -+ private val transform = mapOf Unit>( -+ "arc.util.Http\$HttpRequest" to clz@{ -+ getDeclaredMethod("block").apply { -+ val code = Bytecode(methodInfo.constPool) -+ val desc = Descriptor.ofMethod(CtClass.voidType, arrayOf(this@clz)) -+ code.addAload(0) -+ code.addInvokestatic("mindustryX.Hooks", "onHttp", desc) -+ methodInfo.codeAttribute.iterator().insertEx(code.get()) -+ methodInfo.rebuildStackMapIf6(classPool, classFile) -+ } -+ } -+ ) -+ -+ override fun transform(outputs: TransformOutputs) { -+ val input = inputArtifact.get().asFile -+ val output = outputs.file("${input.nameWithoutExtension}.patched.jar") -+ doTransform(input, output) -+ } -+ -+ private fun doTransform(input: File, output: File) { -+ val pool = ClassPool() -+ pool.appendSystemPath() -+ pool.appendClassPath(input.path) -+ -+ val tmp = output.resolveSibling("tmp") -+ if (tmp.exists()) tmp.deleteRecursively() -+ tmp.mkdirs() -+ transform.forEach { (clz, block) -> -+ pool.get(clz).also(block) -+ .writeFile(tmp.path) -+ } -+ -+ val overwrite = tmp.walk().associateBy { it.toRelativeString(tmp).replace(File.separatorChar, '/') } -+ ZipOutputStream(output.outputStream()).use { out -> -+ ZipFile(input).use { zip -> -+ for (entry in zip.entries()) { -+ out.putNextEntry(entry) -+ (overwrite[entry.name]?.also { -+ println("patchArc ${entry.name}") -+ }?.inputStream() ?: zip.getInputStream(entry)).copyTo(out) -+ out.closeEntry() -+ } -+ } -+ } -+ tmp.deleteRecursively() -+ } -+} -+ -+val artifactType = Attribute.of("artifactType", String::class.java) -+val patched = Attribute.of("patched", Boolean::class.javaObjectType) -+dependencies { -+ attributesSchema { -+ attribute(patched) -+ } -+ artifactTypes.getByName("jar") { -+ attributes.attribute(patched, false) -+ } -+ registerTransform(PatchArc::class) { -+ from.attribute(artifactType, "jar").attribute(patched, false) -+ to.attribute(artifactType, "jar").attribute(patched, true) -+ } -+ -+ val api by configurations -+ val patchArc by configurations.creating { -+ attributes { -+ attribute(patched, true) -+ } -+ } -+ configurations.named("compileOnlyApi").configure { extendsFrom(patchArc) } -+ "runtimeOnly"(files(patchArc)) -+ -+ -+ val arcLib = api.dependencies.find { it.name == "arc-core" } -+ ?: error("Can't find arc-core") -+ api.dependencies.remove(arcLib) -+ patchArc(arcLib as ExternalModuleDependency) { -+ isTransitive = false -+ } -+} -\ No newline at end of file -diff --git a/core/build.gradle.kts b/core/build.gradle.kts -index f5129a036a3655bd41da6e51ed657caddf29dab5..aed5b90878e854f680b6baa716313de7a1788d1f 100644 ---- a/core/build.gradle.kts -+++ b/core/build.gradle.kts -@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - plugins { - java - kotlin("jvm") -+ id("mindustryX.buildExt") - } - sourceSets.main { - java.setSrcDirs(listOf("src/", layout.buildDirectory.dir("/generated/sources/annotationProcessor/java/main"))) -diff --git a/settings.gradle b/settings.gradle -index 304e893b1657dd6d23f87a0c6c2939ac7c1d5c84..171e8099060a3ffd3fc002a6e3ef029b67f858de 100644 ---- a/settings.gradle -+++ b/settings.gradle -@@ -9,6 +9,8 @@ if(JavaVersion.current().ordinal() < JavaVersion.VERSION_17.ordinal()){ - throw new Exception("!!! YOU MUST USE JAVA 17 OR ABOVE TO COMPILE AND RUN MINDUSTRY !!! Read the README. Your version: ${System.properties["java.version"]}") - } - -+includeBuild("buildPlugins") -+ - include 'core', 'server', 'annotations', 'tools', 'tests' - include 'desktop', 'ios' - diff --git a/patches/client/0029-UI-Settings.patch b/patches/client/0026-UI-Settings.patch similarity index 77% rename from patches/client/0029-UI-Settings.patch rename to patches/client/0026-UI-Settings.patch index dc907acf2aa6..7a2534f7f6cb 100644 --- a/patches/client/0029-UI-Settings.patch +++ b/patches/client/0026-UI-Settings.patch @@ -15,55 +15,9 @@ way-zer on 2024/5/3 API(Settings) toggle and cycle way-zer on 2024/7/1 --- - core/assets/bundles/bundle-mdtx.properties | 37 ++++++++ .../ui/dialogs/SettingsMenuDialog.java | 87 ++++++++++++++----- - 2 files changed, 100 insertions(+), 24 deletions(-) + 1 file changed, 63 insertions(+), 24 deletions(-) -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -index 0cb666446175aa5e952ceaa07669e10a3a023d10..623d778207282303a60e9efc99981131a99eb253 100644 ---- a/core/assets/bundles/bundle-mdtx.properties -+++ b/core/assets/bundles/bundle-mdtx.properties -@@ -40,3 +40,40 @@ stat.ammo_type = 子弹类型 - stat.ammo_capacity = 子弹容量 - - #end StatExt -+ -+# Settings -+settings.category.mindustryX = MindustryX扩展 -+setting.showUpdateDialog.name = 检测到新版MindustryX时提示 -+setting.githubMirror.name = GitHub镜像加速(WZ镜像) [gray]优化全球服务器列表及Mod浏览器功能 -+ -+category.gameSettings.name = 游戏界面或操作 -+setting.deadOverlay.name = 死亡时(观战)显示界面 -+setting.invertMapClick.name = 反转小地图的左右键点击 -+ -+category.arcReWork.name = Arc功能重置 -+setting.replayRecord.name = 多人游戏录像 [gray]自动录制游玩过程,输出在saves文件夹 -+setting.menuFloatText.name = 首页悬浮文字 -+setting.researchViewer.name = 科技树透视器 -+setting.minimapSize.name = 小地图大小 -+setting.maxSchematicSize.name = 最大蓝图大小 -+ -+category.blockSettings.name = 建筑相关设置 -+setting.staticShieldsBorder.name = 静止力墙边界 -+setting.arcTurretPlaceCheck.name = [pink]炮台[white]:范围检查 -+setting.arcchoiceuiIcon.name = [acid]装卸|分类[white]:显示物品图标 -+setting.HiddleItemTransparency.name = [acid]带桥/交叉器内物品[white]:不透明度 -+setting.overdrive_zone.name = [acid]超速范围[white]:不透明度 -+setting.arcPlacementEffect.name = [pink]建筑放置特效 -+setting.blockbarminhealth.name = [acid]建筑属性显示[white]:血量最低限制 -+setting.blockRenderLevel.name = [cyan]建筑渲染等级 -+ -+category.entitySettings.name = 实体相关设置 -+setting.bulletShow.name = 显示子弹 -+setting.showminebeam.name = 显示单位挖掘光束 -+setting.noPlayerHitBox.name = 取消玩家自身的碰撞 [gray]轻微作弊 -+setting.payloadpreview.name = 载荷单位拾起预览 -+ -+category.developerMode.name = 特殊设置 -+setting.renderMerge.name = 顶点合并渲染 [grey]实验性功能,可以减少Draws总数 -+setting.renderSort.name = 渲染排序 [grey]多图集(Mod较多)情况下能够提升50%渲染性能,但可能造成渲染错误 -+#end Settings diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 01f7c05a53a570163a1fd83dfd8783c80142ad8c..b93dced65be5c1eea38adc80f8dc2d84c2b3864d 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java diff --git a/patches/client/0027-BUILD-workflows.patch b/patches/client/0027-BUILD-workflows.patch deleted file mode 100644 index d0bcda619166..000000000000 --- a/patches/client/0027-BUILD-workflows.patch +++ /dev/null @@ -1,288 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Sun, 3 Mar 2024 16:54:20 +0800 -Subject: [PATCH] BUILD workflows -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -拆分Android编译过程 -way-zer on 2024/7/13 ---- - .github/workflows/build.yml | 61 +++++++++++++++++++++ - .github/workflows/deployment.yml | 93 -------------------------------- - .github/workflows/pr.yml | 28 ---------- - .github/workflows/push.yml | 61 --------------------- - 4 files changed, 61 insertions(+), 182 deletions(-) - create mode 100644 .github/workflows/build.yml - delete mode 100644 .github/workflows/deployment.yml - delete mode 100644 .github/workflows/pr.yml - delete mode 100644 .github/workflows/push.yml - -diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml -new file mode 100644 -index 0000000000000000000000000000000000000000..0cd3e1cb4f412b11074f75396882876af2818f59 ---- /dev/null -+++ b/.github/workflows/build.yml -@@ -0,0 +1,61 @@ -+name: Build Artifacts -+ -+on: -+ push: -+ branches: -+ - '*' -+ workflow_dispatch: -+ -+jobs: -+ deploy: -+ runs-on: ubuntu-latest -+ -+ steps: -+ - uses: actions/checkout@v2 -+ - name: Set up JDK 17 -+ uses: actions/setup-java@v4 -+ with: -+ distribution: 'temurin' -+ java-version: 17 -+ - name: Setup Gradle -+ uses: gradle/actions/setup-gradle@v3 -+ with: -+ gradle-version: 8.6 -+ cache-read-only: false -+ build-scan-publish: true -+ build-scan-terms-of-use-url: "https://gradle.com/help/legal-terms-of-use" -+ build-scan-terms-of-use-agree: "yes" -+ - name: Set env -+ run: | -+ echo "RELEASE_TAG=${GITHUB_REF_NAME}-build" >> $GITHUB_ENV -+ echo "RELEASE_TAG=${GITHUB_REF_NAME}-build" -+ echo "RELEASE_VERSION=$(date +'%Y.%m.%d').${GITHUB_RUN_NUMBER}-${GITHUB_REF_NAME}" >> $GITHUB_ENV -+ -+ echo "${{ secrets.KEYSTORE_BASE64 }}" | openssl enc -d -base64 -in - -out ../bekeystore.jks -+ - name: Build -+ run: | -+ gradle desktop:dist core:genLoaderModAll -Pbuildversion=${RELEASE_VERSION} -+ mkdir artifacts -+ mv desktop/build/libs/Mindustry.jar artifacts/MindustryX-${{env.RELEASE_VERSION}}-Desktop.jar -+ mv core/build/distributions/MindustryX.loader.dex.jar artifacts/MindustryX-${{env.RELEASE_VERSION}}.loader.dex.jar -+ - name: Build Android -+ env: -+ keystore_password: ${{ secrets.KEYSTORE_PASSWORD_SECRET }} -+ keystore_alias_password: ${{ secrets.KEYSTORE_PASSWORD_SECRET }} -+ keystore_alias: MindustryX -+ run: | -+ gradle android:assembleRelease -Pbuildversion=${RELEASE_VERSION} -+ mv android/build/outputs/apk/release/android-release.apk artifacts/MindustryX-${{env.RELEASE_VERSION}}-Android.apk -+ - name: Update Tag -+ uses: rickstaa/action-create-tag@v1 -+ with: -+ tag: ${{ env.RELEASE_TAG }} -+ force_push_tag: true -+ - name: Release -+ uses: softprops/action-gh-release@v2.0.2 -+ with: -+ tag_name: ${{ env.RELEASE_TAG }} -+ name: ${{ env.RELEASE_VERSION }} -+ target_commitish: ${{github.sha}} -+ files: artifacts/* -+ prerelease: true -diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml -deleted file mode 100644 -index 224a753d655956445b2f885b0ea7ace56de4bbd5..0000000000000000000000000000000000000000 ---- a/.github/workflows/deployment.yml -+++ /dev/null -@@ -1,93 +0,0 @@ --name: Deployment -- --on: -- push: -- tags: -- - 'v*' -- --permissions: {} --jobs: -- deploy: -- permissions: -- contents: write # for release creation (svenstaro/upload-release-action) -- -- runs-on: ubuntu-latest -- -- steps: -- - uses: actions/checkout@v2 -- - name: Set up JDK 17 -- uses: actions/setup-java@v1 -- with: -- java-version: 17 -- - name: Set env -- run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV -- - name: Add Arc release -- run: | -- git config --global user.email "actions@github.com" -- git config --global user.name "Github Actions" -- git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc -- cd ../Arc -- git tag ${RELEASE_VERSION} -- git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/Arc ${RELEASE_VERSION}; -- cd ../Mindustry -- - name: Update JITpack repo -- run: | -- cd ../ -- cp -r ./Mindustry ./MindustryJitpack -- cd MindustryJitpack -- git config --global user.name "Github Actions" -- git config --global user.email "actions@github.com" -- git clone --depth 1 https://github.com/Anuken/MindustryJitpack.git -- rm -rf .git -- cp -r ./MindustryJitpack/.git ./.git -- rm -rf MindustryJitpack -- rm -rf .github -- rm README.md -- git add . -- git commit --allow-empty -m "Updating" -- git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryJitpack -- git tag ${RELEASE_VERSION} -- git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryJitpack -- cd ../Mindustry -- - name: Create artifacts -- run: | -- ./gradlew desktop:dist server:dist core:mergedJavadoc -Pbuildversion=${RELEASE_VERSION:1} -- - name: Update docs -- run: | -- cd ../ -- git config --global user.email "cli@github.com" -- git config --global user.name "Github Actions" -- git clone --depth=1 https://github.com/MindustryGame/docs.git -- cd docs -- find . -maxdepth 1 ! -name ".git" ! -name . -exec rm -r {} \; -- cd ../ -- cp -a Mindustry/core/build/javadoc/. docs/ -- cd docs -- git add . -- git commit --allow-empty -m "Update ${RELEASE_VERSION:1}" -- git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/MindustryGame/docs -- cd ../Mindustry -- - name: Update F-Droid build string -- run: | -- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds -- cd ../MindustryBuilds -- echo "Updating version to ${RELEASE_VERSION:1}" -- BNUM=$(($GITHUB_RUN_NUMBER + 1000)) -- echo versionName=7-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${BNUM} > version_fdroid.txt -- git add . -- git commit -m "Updating to build ${RELEASE_VERSION:1}" -- git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds -- cd ../Mindustry -- - name: Upload client artifacts -- uses: svenstaro/upload-release-action@v2 -- with: -- repo_token: ${{ secrets.GITHUB_TOKEN }} -- file: desktop/build/libs/Mindustry.jar -- tag: ${{ github.ref }} -- - name: Upload server artifacts -- uses: svenstaro/upload-release-action@v2 -- with: -- repo_token: ${{ secrets.GITHUB_TOKEN }} -- file: server/build/libs/server-release.jar -- tag: ${{ github.ref }} -- -diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml -deleted file mode 100644 -index eb2dcff192d52a8515331a2f058e86c65c0ae98b..0000000000000000000000000000000000000000 ---- a/.github/workflows/pr.yml -+++ /dev/null -@@ -1,28 +0,0 @@ --name: Pull Request Tests -- --on: [pull_request, workflow_dispatch] -- --permissions: -- contents: read # to fetch code (actions/checkout) -- --jobs: -- testPR: -- runs-on: ubuntu-latest -- -- steps: -- - uses: actions/checkout@v2 -- - name: Set up JDK 17 -- uses: actions/setup-java@v1 -- with: -- java-version: 17 -- - name: Setup Gradle -- uses: gradle/gradle-build-action@v2 -- - name: Run unit tests -- run: ./gradlew tests:test --stacktrace --rerun -- - name: Run unit tests and build JAR -- run: ./gradlew desktop:dist -- - name: Upload desktop JAR for testing -- uses: actions/upload-artifact@v2 -- with: -- name: Desktop JAR (zipped) -- path: desktop/build/libs/Mindustry.jar -diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml -deleted file mode 100644 -index cd593a6dfdf55b4e70e548ab1d96f64d5354056d..0000000000000000000000000000000000000000 ---- a/.github/workflows/push.yml -+++ /dev/null -@@ -1,61 +0,0 @@ --name: Tests -- --on: [push, workflow_dispatch] -- --permissions: {} --jobs: -- runPush: -- permissions: -- contents: write # for Update bundles -- -- runs-on: ubuntu-latest -- -- steps: -- - uses: actions/checkout@v2 -- - name: Trigger BE build -- if: ${{ github.repository == 'Anuken/Mindustry' }} -- run: | -- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds -- cd ../MindustryBuilds -- BNUM=$(($GITHUB_RUN_NUMBER + 20000)) -- git tag ${BNUM} -- git config --global user.name "Github Actions" -- git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds ${BNUM} -- - name: Set up JDK 17 -- uses: actions/setup-java@v1 -- with: -- java-version: 17 -- - name: Setup Gradle -- uses: gradle/gradle-build-action@v2 -- - name: Update bundles -- if: ${{ github.repository == 'Anuken/Mindustry' }} -- run: | -- ./gradlew updateBundles -- -- if [ -n "$(git status --porcelain)" ]; then -- git config --global user.name "Github Actions" -- git config --global user.email "actions@github.com" -- git add core/assets/bundles/* -- git commit -m "Automatic bundle update" -- git push -- fi -- - name: Update JITpack repo -- if: ${{ github.repository == 'Anuken/Mindustry' }} -- run: | -- git config --global user.name "Github Actions" -- git config --global user.email "actions@github.com" -- cd ../ -- cp -r ./Mindustry ./MindustryJitpack -- cd MindustryJitpack -- git clone --depth 1 https://github.com/Anuken/MindustryJitpack.git -- rm -rf .git -- cp -r ./MindustryJitpack/.git ./.git -- rm -rf MindustryJitpack -- rm -rf .github -- rm README.md -- git add . -- git commit --allow-empty -m "Updating" -- git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryJitpack -- cd ../Mindustry -- - name: Run unit tests -- run: ./gradlew tests:test --rerun --stacktrace diff --git a/patches/client/0027-C-floatLabel.patch b/patches/client/0027-C-floatLabel.patch new file mode 100644 index 000000000000..52b1b8fbab75 --- /dev/null +++ b/patches/client/0027-C-floatLabel.patch @@ -0,0 +1,52 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: way-zer +Date: Sat, 23 Mar 2024 21:28:15 +0800 +Subject: [PATCH] =?UTF-8?q?C:=20floatLabel=20/=20=E9=A6=96=E9=A1=B5?= + =?UTF-8?q?=E6=B5=AE=E5=8A=A8=E6=A0=87=E8=AF=AD(=E9=87=8D=E7=BD=AE)?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + core/src/mindustry/ui/fragments/MenuFragment.java | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java +index 497b2077e17316a2582a5abdea274c4f773b99fd..593d8e2bfbb8c1e156b998dc44d3554317e171bf 100644 +--- a/core/src/mindustry/ui/fragments/MenuFragment.java ++++ b/core/src/mindustry/ui/fragments/MenuFragment.java +@@ -19,6 +19,7 @@ import mindustry.game.EventType.*; + import mindustry.gen.*; + import mindustry.graphics.*; + import mindustry.ui.*; ++import mindustryX.features.ui.*; + + import static mindustry.Vars.*; + import static mindustry.gen.Tex.*; +@@ -29,6 +30,8 @@ public class MenuFragment{ + private MenuRenderer renderer; + private Seq customButtons = new Seq<>(); + ++ MenuFloatLabel floatLabel; ++ + public void build(Group parent){ + renderer = new MenuRenderer(); + +@@ -37,6 +40,7 @@ public class MenuFragment{ + group.visible(() -> !ui.editor.isShown()); + parent.addChild(group); + ++ parent.addChild(floatLabel = new MenuFloatLabel()); + parent = group; + + parent.fill((x, y, w, h) -> renderer.render()); +@@ -104,6 +108,9 @@ public class MenuFragment{ + fy -= Scl.scl(macNotchHeight); + } + ++ floatLabel.setPosition(width / 2f + logow * 0.35f, fy - logoh / 2f - Scl.scl(2f) + logoh * 0.15f); ++ floatLabel.baseScale = logoh * 0.03f; ++ + Draw.color(); + Draw.rect(logo, fx, fy, logow, logoh); + diff --git a/patches/client/0032-C-misc-patch.patch b/patches/client/0028-C-misc-patch.patch similarity index 100% rename from patches/client/0032-C-misc-patch.patch rename to patches/client/0028-C-misc-patch.patch diff --git a/patches/client/0033-C-AutoUpdate.patch b/patches/client/0029-C-AutoUpdate.patch similarity index 100% rename from patches/client/0033-C-AutoUpdate.patch rename to patches/client/0029-C-AutoUpdate.patch diff --git a/patches/client/0030-ARC-bundle-and-settings.patch b/patches/client/0030-ARC-bundle-and-settings.patch deleted file mode 100644 index 5c2bc4e0742d..000000000000 --- a/patches/client/0030-ARC-bundle-and-settings.patch +++ /dev/null @@ -1,327 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Sat, 17 Feb 2024 13:56:18 +0800 -Subject: [PATCH] ARC bundle and settings -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -移除一些无效设置 -way-zer on 2024/4/20 at 21:59 ---- - core/assets/bundles/bundle-mdtx.properties | 237 ++++++++++++++++++ - .../ui/dialogs/SettingsMenuDialog.java | 28 +-- - 2 files changed, 250 insertions(+), 15 deletions(-) - -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -index 623d778207282303a60e9efc99981131a99eb253..9d9cbc07ea828ebbcc4557994b36328cf9764e45 100644 ---- a/core/assets/bundles/bundle-mdtx.properties -+++ b/core/assets/bundles/bundle-mdtx.properties -@@ -77,3 +77,240 @@ category.developerMode.name = 特殊设置 - setting.renderMerge.name = 顶点合并渲染 [grey]实验性功能,可以减少Draws总数 - setting.renderSort.name = 渲染排序 [grey]多图集(Mod较多)情况下能够提升50%渲染性能,但可能造成渲染错误 - #end Settings -+ -+bar.reloadDetail = 装填:{0}% -+bar.warmupDetail = 充能:{0}% -+bar.ammoDetail = 弹药:{0}/{1} -+ -+marker.Mark.name = 标记 -+marker.Gather.name = 集合 -+marker.Attack.name = 攻击 -+marker.Defend.name = 防御 -+marker.What.name = 问号 -+ -+keybind.point.name = 标记 -+keybind.lockonLastMark.name = 定位到上个标记点 -+keybind.toggle_block_render.name = 切换建筑显示 -+keybind.toggle_unit.name = 切换单位显示 -+ -+# 学术特色翻译 -+ability.energyfield.maxtargets = [lightgray]最大目标: [white]{0} -+ability.energyfield.sametypehealmultiplier = [lightgray]同类回复: [white]{0}% -+ability.regen = 再生 -+bar.drilltierreq = 需要{0}级的钻头(当前{1}级) -+bar.heatpercent = 热量: {0} [lightgray]({1}%) -+bar.powerbalance = 电力:{0}/s -+block.armored-duct.name = 装甲运输管 -+block.build-tower.name = 建造枢纽 -+block.duct-unloader.name = 管道卸载器 -+block.large-shield-projector.name = 大型护盾投影 -+block.overflow-duct.name = 溢流运输管 -+block.regen-projector.name = 再生投影 -+block.reinforced-bridge-conduit.name = 强化液体带桥 -+block.reinforced-liquid-container.name = 强化液体容器 -+block.reinforced-liquid-junction.name = 强化液体交叉器 -+block.reinforced-liquid-router.name = 强化液体路由器 -+block.reinforced-liquid-tank.name = 强化储液罐 -+block.shield-projector.name = 护盾投影 -+block.underflow-duct.name = 反溢运输管 -+bullet.suppression = [stat]压制场 {0}[lightgray]s[]~{1}[lightgray]格 -+command.boost = 助推 -+mod.circulardependencies = [red]循环依赖 -+mod.circulardependencies.details = 这个模组与一些前置模组彼此依赖。 -+mod.incompletedependencies = [red]不完整的依赖 -+mod.incompletedependencies.details = 这个模组因为缺少这些前置模组而无法加载: {0}. -+player.admin = 给予/收回管理员权限 -+player.ban = 封禁 -+player.kick = 踢出 -+player.team = 更改队伍 -+player.trace = 追踪 -+radar.order = 排序方式:1/true 距离从小到大,其他从大到小,0/false 反之。 -+rules.buildai = 敌方 AI 会建造建筑 -+rules.buildaitier = AI 等级 -+rules.unitcrashdamagemultiplier = 单位坠毁伤害倍率 -+rules.waitForWaveToEnd = 等待波次结束[gray]所有敌人死亡后才会开始下一波次 -+rules.wavelimit = 终结波次 -+save.nocampaign = 无法导入单独的战役存档文件。 -+schematic.edit = 编辑蓝图 -+schematic.search = 搜索蓝图... -+schematic.tagged = {0} 个带标签的蓝图 -+setting.blockreplace.name = 允许覆盖建筑 -+setting.uiscale.name = UI缩放比例 [orange][重启生效] -+settings.reset = [red]全部恢复默认 -+steam.friendsonly = 仅好友 -+steam.friendsonly.tooltip = 是否只允许你的steam好友加入游戏?\n不启用该选项将使你的游戏公开——任何人都可以加入。 -+toolmode.fillerase = 擦除方块 -+toolmode.fillerase.description = 擦除相同种类的方块。 -+trace.ips = 曾用IP: -+trace.names = 曾用名: -+unit.disrupt.name = 瓦解 -+unit.incite.name = 激发 -+unit.obviate.name = 影逝 -+unit.quell.name = 终结 -+votekick.reason = 踢人理由 -+votekick.reason.message = 确定要踢出 "{0}[white]"?\n如果是, 输入理由: -+waves.filter = 单位筛选器 -+waves.random = 随机 -+waves.search = 搜索波次... -+ -+# ARC增加或补充 -+ability.armorplate = 护甲板 -+ability.liquidexplode = 液体自爆 -+ability.liquidregen = 液体回血 -+ability.moveeffect = 移动特效 -+bar.drillcantmine = 当前钻头不能挖掘此矿物 -+block.fracture.name = 破裂 -+category.arcAddBlockInfo.name = 更多建筑属性 -+category.arcAddTurretInfo.name = 更多炮台属性 -+category.arcAddUnitInfo.name = 更多单位属性 -+category.arcCAssist.name = 辅助功能 -+category.arcCDisplayBlock.name = 建筑显示 -+category.arcCDisplayEffect.name = 特效与效果 -+category.arcCGraphicsOther.name = 其他 -+category.arcCOverview.name = 全局设置 -+category.arcCgameview.name = 游戏画面 -+category.arcCgamewindow.name = 游戏界面 -+category.arcHudToolbox.name = 主游戏界面 -+category.arcMassDriverInfo.name = 质驱引导线 -+category.arcPlayerEffect.name = 玩家炫酷特效 -+category.arcRTSSupporter.name = RTS支持器 -+category.arcRadar.name = 雷达扫描设置 [lightgray](PC按键,手机辅助器) -+category.arcShareinfo.name = 多人游玩设置 -+category.arcStrongCheat.name = [red]强作弊功能 -+category.arcWeakCheat.name = 弱作弊功能 -+category.combat = 战斗 -+category.moreContent.name = 更多内容适配 -+category.movement = 移动 -+category.personalized.name = 自定义客户端 [需要重启] -+category.support = 支援 -+confirmvotekick = 确定投票踢出玩家“{0}[white]”? -+content.planet.name = 星球 -+content.weather.name = 天气 -+keybind.arcDetail.name = 雷达扫描 -+keybind.arcScanMode.name = 扫描详情 -+keybind.oreAdsorption.name = 矿物自动吸附 -+keybind.showRTSAi.name = 显示单位控制 -+keybind.superUnitEffect.name = 显示玩家射程 -+revealedblocks = [acid]显示建筑 -+rules.aiCoreSpawn = [acid]核心生成AI -+rules.canGameOver = [acid]能否自动结束游戏[gray](如果没有其他结束游戏的方法,不推荐开启) -+rules.cheat = [acid]作弊模式 -+rules.coreDestroyClear = [acid]核心被破坏清理附近建筑 -+rules.disableOutsideArea = [acid]禁用场外区域 -+rules.dynamicColor = 战争迷雾颜色-曾探索 -+rules.hiddenBuildItems = [acid]隐藏需要所选材料建造的建筑 -+rules.infiniteAmmo = [acid]单位无限子弹 -+rules.logicUnitBuild = [acid]逻辑控制单位建造 -+rules.showSpawns = [acid]显示刷怪点 -+rules.staticColor = 战争迷雾颜色-未探索 -+rules.title.arcExperimental = 隐藏设置[red](实验性功能,可能影响稳定性) -+rules.unitPayloadUpdate = [acid]单位携带的方块会工作 -+rules.winWave = [acid]胜利波次 [gray](到达指定波次后自动停止) -+schematic.preview = 预览 -+setting.AuxiliaryTable.name = [acid]辅助器 [orange][重启生效] -+setting.ShowInfoPopup.name = [acid]服务器信息版 -+setting.allUnlocked.name = [cyan]显示所有内容(含隐藏) -+setting.alwaysShowPlayerUnit.name = [cyan]强制显示[white]:玩家本体及带领的单位 -+setting.alwaysShowUnitRTSAi.name = [acid]单位[white]:执行的RTS命令 -+setting.alwaysshowdropzone.name = [cyan]刷怪点 -+setting.arcAlwaysTeamColor.name = [acid]玩家列表[white]:总是绘制队伍颜色 -+setting.arcBackgroundPath.name = [cyan]首页背景路径 -+setting.arcBuildInfo.name = [cyan]建造范围 -+setting.arcCommandTable.name = [acid]RTS辅助器 [lightgray]替代原版 -+setting.arcCoreItemsCol.name = [acid]arc核心物资列数 -+setting.arcDisableModWarning.name = [orange]我已知晓且同意学术端的mod使用原则 -+setting.arcDrillProgress.name = [acid]钻头[white]:显示挖掘进度 [gray]只推荐mod下使用 -+setting.arcSelfName.name = [acid]显示自身名字 -+setting.arcShareWaveInfo.name = [acid]游戏信息交流[gray](标记物品) [red]请勿刷屏 -+setting.arcSpecificTable.name = [acid]学术端特制界面 [orange][重启生效] -+setting.arcTurretPlacementItem.name = [pink]炮台[white]:弹药射界 -+setting.arccoreitems.name = [acid]arc核心物资 [gray]点击电量条 -+setting.arcdrillmode.name = [acid]钻头[white]:常亮矿物 -+setting.arclogicbordershow.name = [acid]显示屏与画板[white]:边框 [gray]关闭后多个显示屏会更好得拼接在一起 -+setting.arcvol.name = [acid]音量[white]:学术音效 -+setting.autoSelSchematic.name = [cyan]蓝图自动选择器 [orange]自动筛选包含选中物品的蓝图 -+setting.blockBars.name = [acid]建筑属性 -+setting.blockBars_mend.name = [acid]修复[white]:进度条 -+setting.blockInventoryWidth.name = [cyan]建筑物品栏每行物品数 -+setting.blockWeaponTargetLine.name = [acid]炮台[white]:瞄准线 -+setting.blockWeaponTargetLineWhenIdle.name = [acid]炮台[white]:瞄准线(闲置) -+setting.blockdisabled.name = [cyan]建筑禁用显示 -+setting.chatValidType.name = [acid]聊天记录 -+setting.colorizedContent.name = [orange]彩[yellow]色[acid]属[cyan]性[violet]包 -+setting.developMode.name = [red]开发者模式 [orange]不完善|测试中的功能,普通用户请不要打开。欢迎提出修复方案 -+setting.displayblock.name = [cyan]工厂方块 -+setting.editorBrush.name = [acid]编辑器[white]:每行建筑数 -+setting.fontSet.name = [cyan]字体设置! -+setting.fontSize.name = [cyan]字体大小! -+setting.forceConfigInventory.name = [acid]功能[white]:强制拿取资源 -+setting.forceEnableDarkness.name = [cyan]墙体阴影显示 -+setting.forceIgnoreAttack.name = [violet]战役[white]:忽视遭受攻击警告强行切换区块 -+setting.hoveredTileInfo.name = [acid]显示鼠标指针地块/建筑名称 -+setting.itemSelectionHeight.name = [cyan]建筑选择框行数 -+setting.itemSelectionWidth.name = [cyan]建筑选择框列数 -+setting.limitdst.name = [cyan]视角外更新范围 -+setting.limitupdate.name = [cyan]限制更新 -+setting.logicSupport.name = [acid]逻辑辅助器 -+setting.logicoverrangelink.name = [red]超级逻辑链接 [yellow][仅限单机有效] -+setting.mass_driver_line.name = 显示质驱引导线 -+setting.mass_driver_line_color.name = [pink]质驱引导线[white]:颜色 -+setting.mass_driver_line_interval.name = [acid]质驱引导线[white]:箭头间隔 -+setting.mend_zone.name = [acid]修复范围[white]:不透明度 -+setting.oneBlockProperty.name = [acid]复制单个建筑时展示属性 [orange]无需要不建议开启,会导致属性丢失 -+setting.otherCheat.name = [red]其他作弊功能(游戏外) -+setting.overrideSkipWave.name = [acid]功能[white]:忽视跳波限制 -+setting.override_boss_shown.name = [cyan]boss血条 -+setting.overridebuild.name = [cyan]强制覆盖建筑与墙体 [yellow][仅限单机有效] -+setting.playerEffectColor.name = [acid]玩家射程[white]:颜色 -+setting.playerEffectCurStroke.name = [acid]玩家射程[white]:粗细 -+setting.playerNeedShooting.name = [red]时间管理大师 -+setting.powerStatistic.name = [acid]电量统计 [orange][重启生效] -+setting.quickHudSize.name = [acid]快捷视角 [gray]快捷切换视角,屏幕下侧 -+setting.radarMode.name = [acid]雷达模式 -+setting.radarSize.name = [acid]雷达大小 -+setting.rotateCanvas.name = 蓝图旋转时会旋转画板内容 [orange]可能导致崩溃,小心使用 -+setting.rtsWoundUnit.name = [acid]单位筛选[white]:残血阈值 -+setting.save_more_map.name = [acid]保存战役与编辑器地图 -+setting.selectTeam.name = [acid]显示[white]:[red]选择队伍框 [yellow][仅限单机有效] -+setting.showFlyerSpawn.name = [cyan]空军刷怪点 -+setting.showFlyerSpawnLine.name = [cyan]空军刷怪点连线 -+setting.showOtherTeamResource.name = [acid]显示[white]:[red]所有队伍资源 [orange][PVP自动禁用] -+setting.showOtherTeamState.name = [acid]显示[white]:[red]其他并可修改队伍状态 [orange][PVP自动禁用][yellow][修改仅限单机有效] -+setting.showQuickToolTable.name = [acid]快捷工具 [gray]快捷聊天/设置与建筑相关 -+setting.showTurretAmmo.name = [acid]炮台[white]:子弹类型 -+setting.showTurretAmmoAmount.name = [acid]炮台[white]:子弹数量 -+setting.superUnitEffect.name = [pink]玩家特效射程 -+setting.turretAlertRange.name = [acid]炮台[white]:警告范围 -+setting.turretForceShowRange.name = [acid]炮台[white]:强制显示射程 [gray]可用于在编辑器下显示射程 -+setting.turretShowRange.name = [acid]炮台[white]:射程 -+setting.unitBarDrawMinHealth.name = [acid]单位属性[white]:最低血量 -+setting.unitDrawMinHealth.name = [cyan]单位显示[white]:最低血量 -+setting.unitHealthBar.name = [acid]单位属性 -+setting.unitItemCarried.name = [acid]单位携带的物品 -+setting.unitLogicMoveLine.name = [acid]控制[white]:移动路径 -+setting.unitLogicTimerBars.name = [acid]控制[white]:时间条 -+setting.unitTargetType.name = [pink]玩家的目标风格 -+setting.unitTransparency.name = [cyan]单位[white]:不透明度 -+setting.unitWeaponRange.name = [acid]单位武器射程[white]:范围警告 -+setting.unitWeaponRangeAlpha.name = [acid]单位武器射程[white]:不透明度 -+setting.unitWeaponTargetLine.name = [acid]单位武器目标 -+setting.unitbuildplan.name = [acid]单位[white]:建造序列显示 -+setting.unithitbox.name = [acid]单位碰撞箱 -+setting.worldCreator.name = [cyan]创世神 [gray]无视限制,可编辑地形 -+settings.arc = [cyan]学术端! -+settings.cheating = [red]作弊功能 -+settings.forcehide = [orange]帧率重调装置 -+settings.maxMsgRecorded.name = 最大聊天记录数 -+settings.specmode = [acid]更多内容适配 -+shield.phaseboost = [stat]+{0}[lightgray] 格 [stat]+{1}[] 护盾容量 -+shield.regenspeed = [stat]{0}[lightgray]x 回复速度 -+team.neoplastic.name = 瘤 -+unit.anthicus-missile.name = 天灾导弹 -+unit.disrupt-missile.name = 瓦解导弹 -+unit.quell-missile.name = 终结导弹 -+unit.scathe-missile.name = 创伤导弹 -+waves.duplicate = 复制 -+waves.group = 组 -+waves.group.effect = 添加状态 -+waves.group.items = 添加物品 -+waves.group.payloads = 添加载荷 -diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java -index b93dced65be5c1eea38adc80f8dc2d84c2b3864d..b71452eca5b3527f0c2ee15edd8d6ef01ab4365d 100644 ---- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java -+++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java -@@ -303,8 +303,8 @@ public class SettingsMenuDialog extends BaseDialog{ - - game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i)); - -+ game.checkPref("autotarget", true); - if(mobile){ -- game.checkPref("autotarget", true); - if(!ios){ - game.checkPref("keyboard", false, val -> { - control.setInput(val ? new DesktopInput() : new MobileInput()); -@@ -338,11 +338,9 @@ public class SettingsMenuDialog extends BaseDialog{ - game.checkPref("hints", true); - game.checkPref("logichints", true); - -- if(!mobile){ -- game.checkPref("backgroundpause", true); -- game.checkPref("buildautopause", false); -- game.checkPref("distinctcontrolgroups", true); -- } -+ game.checkPref("backgroundpause", true); -+ game.checkPref("buildautopause", false); -+ game.checkPref("distinctcontrolgroups", true); - - game.checkPref("doubletapmine", false); - game.checkPref("commandmodehold", true); -@@ -364,9 +362,9 @@ public class SettingsMenuDialog extends BaseDialog{ - } - } - -- if(!mobile){ -- game.checkPref("console", false); -- } -+ game.checkPref("console", false); -+ -+ graphics.addCategory("arcCOverview"); - - int[] lastUiScale = {settings.getInt("uiscale", 100)}; - -@@ -445,18 +443,18 @@ public class SettingsMenuDialog extends BaseDialog{ - graphics.checkPref("destroyedblocks", true); - graphics.checkPref("blockstatus", false); - graphics.checkPref("playerchat", true); -- if(!mobile){ -- graphics.checkPref("coreitems", true); -- } -+ -+ graphics.addCategory("arcCgamewindow"); -+ graphics.checkPref("coreitems", true); - graphics.checkPref("minimap", !mobile); - graphics.checkPref("smoothcamera", true); - graphics.checkPref("position", false); -- if(!mobile){ -- graphics.checkPref("mouseposition", false); -- } -+ graphics.checkPref("mouseposition", false); - graphics.checkPref("fps", false); - graphics.checkPref("playerindicators", true); - graphics.checkPref("indicators", true); -+ -+ graphics.addCategory("arcCGraphicsOther"); - graphics.checkPref("showweather", true); - graphics.checkPref("animatedwater", true); - diff --git a/patches/client/0034-C-better-chatField.patch b/patches/client/0030-C-better-chatField.patch similarity index 100% rename from patches/client/0034-C-better-chatField.patch rename to patches/client/0030-C-better-chatField.patch diff --git a/patches/client/0035-C-fix-console-messages-order.patch b/patches/client/0031-C-fix-console-messages-order.patch similarity index 100% rename from patches/client/0035-C-fix-console-messages-order.patch rename to patches/client/0031-C-fix-console-messages-order.patch diff --git a/patches/client/0031-C-floatLabel.patch b/patches/client/0031-C-floatLabel.patch deleted file mode 100644 index 3518db8d5161..000000000000 --- a/patches/client/0031-C-floatLabel.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Sat, 23 Mar 2024 21:28:15 +0800 -Subject: [PATCH] =?UTF-8?q?C:=20floatLabel=20/=20=E9=A6=96=E9=A1=B5?= - =?UTF-8?q?=E6=B5=AE=E5=8A=A8=E6=A0=87=E8=AF=AD(=E9=87=8D=E7=BD=AE)?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - ---- - core/assets/labels | 74 +++++++++++++++++++ - .../mindustry/ui/fragments/MenuFragment.java | 7 ++ - 2 files changed, 81 insertions(+) - create mode 100644 core/assets/labels - -diff --git a/core/assets/labels b/core/assets/labels -new file mode 100644 -index 0000000000000000000000000000000000000000..518bd2fd1a82dcba920cc996f7174f0168303861 ---- /dev/null -+++ b/core/assets/labels -@@ -0,0 +1,74 @@ -+广告位招租 -+_(:зゝ∠)_ -+¯\_(ツ)_/¯ -+(≧ω≦) -+绝对没有bug -+给个好评! -+占领整个星球了吗? -+如果启用像素画面,这行字会很难看清 -+冲击!启动! -+欢迎回来! -+检测到钍反应堆过热,5,4,3,2,1... -+试试在水边用抽水机 -+试试用双管炮打T5 -+试试往涡轮里放爆炸混合物 -+这里不是minecraft -+Also try minecraft! -+Also try factorio! -+Also try satisfactory! -+Also try shapez! -+Flood与Creeper World 3不得不说的故事 -+一大波[][yellow]即将来袭! -+[] -+神圣的G键连接着我们 -+A[] -+router! router! router! -+路由器神教 -+Alt+F4\n解锁[red]隐藏功能 -+ []点击此处插入文字 -+崩服特惠[#e4ffd6]145 -+像素原神,启动! -+发电的尽头是水电 -+血压提升辅助器 -+来点涩图秋梨哥 -+熔岩领域10分钟8布8塑钢4合金 -+/vote gameover -+[]点击此处开启隐藏功能 -+扣1送阿尔法fumo -+修复器修复修复修复器的修复器 -+ [][yellow]它不发电 -+高血压模拟器 -+别杀mono,你这个怪物! -+你肯定在看这行字 -+原价9.99美刀 -+因为这句太cool/n所以把它加上[alphachan][yellow] -+一键装弹,踢出游戏 -+不要乱发图片影响他人/n(来点涩图秋梨膏) -+数数第几次看到这行字 -+付费开源 -+蓝图不规范,亲人两行泪 -+废料分裂,秒杀一切 -+双管加铜,力大无穷 -+火焰加硫,破坏如榴 -+熔岩飙车1v4深得我心\n沙荒残骸暴风雪正合我意 -+经验+3(GoodGame) -+与指挥中心的永别 -+Latum萌萌的! -+M属性大爆发,Mindustry! -+赞美Lucky Clover -+赞美WayZer -+茉莉茉莉茉莉茉莉茉莉 -+学术端要变成松鼠的形状了 -+学术追源于根目录(root) -+学术与原版差距200个文件与20000行代码!!! -+学术工具箱与Testing Utilities不得不说的事 -+学术单位工厂与Unit Factory不得不说的事 -+中国电弧 -+亲爱的,我把硅用完了 -+lc被茉莉扑倒在床上了 -+有bug??? 去反馈吧 -+低血压专效药 -+能用双管过裂谷吗? -+他妈的没有钛啊 -+一点点钛都没有啊 -+看看看看看看 -diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java -index 497b2077e17316a2582a5abdea274c4f773b99fd..593d8e2bfbb8c1e156b998dc44d3554317e171bf 100644 ---- a/core/src/mindustry/ui/fragments/MenuFragment.java -+++ b/core/src/mindustry/ui/fragments/MenuFragment.java -@@ -19,6 +19,7 @@ import mindustry.game.EventType.*; - import mindustry.gen.*; - import mindustry.graphics.*; - import mindustry.ui.*; -+import mindustryX.features.ui.*; - - import static mindustry.Vars.*; - import static mindustry.gen.Tex.*; -@@ -29,6 +30,8 @@ public class MenuFragment{ - private MenuRenderer renderer; - private Seq customButtons = new Seq<>(); - -+ MenuFloatLabel floatLabel; -+ - public void build(Group parent){ - renderer = new MenuRenderer(); - -@@ -37,6 +40,7 @@ public class MenuFragment{ - group.visible(() -> !ui.editor.isShown()); - parent.addChild(group); - -+ parent.addChild(floatLabel = new MenuFloatLabel()); - parent = group; - - parent.fill((x, y, w, h) -> renderer.render()); -@@ -104,6 +108,9 @@ public class MenuFragment{ - fy -= Scl.scl(macNotchHeight); - } - -+ floatLabel.setPosition(width / 2f + logow * 0.35f, fy - logoh / 2f - Scl.scl(2f) + logoh * 0.15f); -+ floatLabel.baseScale = logoh * 0.03f; -+ - Draw.color(); - Draw.rect(logo, fx, fy, logow, logoh); - diff --git a/patches/client/0036-ARC-setBars.patch b/patches/client/0032-ARC-setBars.patch similarity index 100% rename from patches/client/0036-ARC-setBars.patch rename to patches/client/0032-ARC-setBars.patch diff --git a/patches/client/0038-FC.patch b/patches/client/0033-FC.patch similarity index 100% rename from patches/client/0038-FC.patch rename to patches/client/0033-FC.patch diff --git a/patches/client/0039-API-Hooks-pollKeys.patch b/patches/client/0034-API-Hooks-pollKeys.patch similarity index 100% rename from patches/client/0039-API-Hooks-pollKeys.patch rename to patches/client/0034-API-Hooks-pollKeys.patch diff --git a/patches/client/0040-C-RenderExt-unitHide.patch b/patches/client/0035-C-RenderExt-unitHide.patch similarity index 100% rename from patches/client/0040-C-RenderExt-unitHide.patch rename to patches/client/0035-C-RenderExt-unitHide.patch diff --git a/patches/client/0041-C-RenderExt-logicDisplayNoBorder-arcDrillMode.patch b/patches/client/0036-C-RenderExt-logicDisplayNoBorder-arcDrillMode.patch similarity index 100% rename from patches/client/0041-C-RenderExt-logicDisplayNoBorder-arcDrillMode.patch rename to patches/client/0036-C-RenderExt-logicDisplayNoBorder-arcDrillMode.patch diff --git a/patches/client/0037-BUILD-ci.patch b/patches/client/0037-BUILD-ci.patch deleted file mode 100644 index 690e4a3a6bcd..000000000000 --- a/patches/client/0037-BUILD-ci.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Wed, 10 Apr 2024 13:46:16 +0800 -Subject: [PATCH] BUILD ci - ---- - .github/actions/.gitignore | 2 ++ - .github/actions/clearOldAssets.ts | 23 +++++++++++++++++++++++ - .github/workflows/build.yml | 6 ++++++ - 3 files changed, 31 insertions(+) - create mode 100644 .github/actions/.gitignore - create mode 100644 .github/actions/clearOldAssets.ts - -diff --git a/.github/actions/.gitignore b/.github/actions/.gitignore -new file mode 100644 -index 0000000000000000000000000000000000000000..eba3e54426a2115c8ddba3b231c1ae3f05bcbbf6 ---- /dev/null -+++ b/.github/actions/.gitignore -@@ -0,0 +1,2 @@ -+/* -+!/*.ts -\ No newline at end of file -diff --git a/.github/actions/clearOldAssets.ts b/.github/actions/clearOldAssets.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..224d9a7d2bfd5e4fb17f9d5325b4e9f31cc21efa ---- /dev/null -+++ b/.github/actions/clearOldAssets.ts -@@ -0,0 +1,23 @@ -+import * as core from "@actions/core" -+import {context, getOctokit} from "@actions/github" -+ -+const octokit = getOctokit(import.meta.env.GITHUB_TOKEN) as import("@octokit/plugin-rest-endpoint-methods/dist-types/types").Api -+const selfBuild = import.meta.env.RELEASE_VERSION -+ -+async function clearOldAssets(tag: string, keep: number = 9) { -+ const release = await octokit.rest.repos.getReleaseByTag({ -+ ...context.repo, tag -+ }) -+ const assets = release.data.assets.sort((a, b) => a.name < b.name ? 1 : -1) -+ if (assets.length <= keep) return -+ const toRemove = assets.slice(keep) -+ toRemove.push(...assets.filter(it => it.name.includes("server") && !it.name.includes(selfBuild))) -+ console.log("ToRemove", toRemove.map(it => it.name)) -+ await Promise.all(toRemove.map(it => -+ octokit.rest.repos.deleteReleaseAsset({ -+ ...context.repo, asset_id: it.id -+ }) -+ )) -+} -+ -+await clearOldAssets(core.getInput("release") || import.meta.env.TAG) -\ No newline at end of file -diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml -index 0cd3e1cb4f412b11074f75396882876af2818f59..797925569a7a81a34dff17296884a7088e05d5f1 100644 ---- a/.github/workflows/build.yml -+++ b/.github/workflows/build.yml -@@ -59,3 +59,9 @@ jobs: - target_commitish: ${{github.sha}} - files: artifacts/* - prerelease: true -+ - uses: oven-sh/setup-bun@v1 -+ - name: clearOldAssets -+ run: bun run .github/actions/clearOldAssets.ts -+ env: -+ GITHUB_TOKEN: ${{github.token}} -+ TAG: ${{ env.RELEASE_TAG }} diff --git a/patches/client/0042-CS-Building.updatePowerGraph.patch b/patches/client/0037-CS-Building.updatePowerGraph.patch similarity index 100% rename from patches/client/0042-CS-Building.updatePowerGraph.patch rename to patches/client/0037-CS-Building.updatePowerGraph.patch diff --git a/patches/client/0043-FC-MarkerType.patch b/patches/client/0038-FC-MarkerType.patch similarity index 100% rename from patches/client/0043-FC-MarkerType.patch rename to patches/client/0038-FC-MarkerType.patch diff --git a/patches/client/0044-C-no-MapPreviewLoader.setupLoaders.patch b/patches/client/0039-C-no-MapPreviewLoader.setupLoaders.patch similarity index 100% rename from patches/client/0044-C-no-MapPreviewLoader.setupLoaders.patch rename to patches/client/0039-C-no-MapPreviewLoader.setupLoaders.patch diff --git a/patches/client/0045-OSC-lambda.patch b/patches/client/0040-OSC-lambda.patch similarity index 100% rename from patches/client/0045-OSC-lambda.patch rename to patches/client/0040-OSC-lambda.patch diff --git a/patches/client/0046-API-C-DebugUtil.patch b/patches/client/0041-API-C-DebugUtil.patch similarity index 100% rename from patches/client/0046-API-C-DebugUtil.patch rename to patches/client/0041-API-C-DebugUtil.patch diff --git a/patches/client/0047-C-RenderExt-blockRenderLevel.patch b/patches/client/0042-C-RenderExt-blockRenderLevel.patch similarity index 100% rename from patches/client/0047-C-RenderExt-blockRenderLevel.patch rename to patches/client/0042-C-RenderExt-blockRenderLevel.patch diff --git a/patches/client/0048-C-JoinDialog-info.patch b/patches/client/0043-C-JoinDialog-info.patch similarity index 100% rename from patches/client/0048-C-JoinDialog-info.patch rename to patches/client/0043-C-JoinDialog-info.patch diff --git a/patches/client/0049-OC-Batch.patch b/patches/client/0044-OC-Batch.patch similarity index 100% rename from patches/client/0049-OC-Batch.patch rename to patches/client/0044-OC-Batch.patch diff --git a/patches/client/0050-C.patch b/patches/client/0045-C.patch similarity index 100% rename from patches/client/0050-C.patch rename to patches/client/0045-C.patch diff --git a/patches/client/0051-CS-PointDefenseWeapon.patch b/patches/client/0046-CS-PointDefenseWeapon.patch similarity index 100% rename from patches/client/0051-CS-PointDefenseWeapon.patch rename to patches/client/0046-CS-PointDefenseWeapon.patch diff --git a/patches/client/0052-UI-Mod-Mod.patch b/patches/client/0047-UI-Mod-Mod.patch similarity index 86% rename from patches/client/0052-UI-Mod-Mod.patch rename to patches/client/0047-UI-Mod-Mod.patch index 7738532c4c41..af37e4a3b382 100644 --- a/patches/client/0052-UI-Mod-Mod.patch +++ b/patches/client/0047-UI-Mod-Mod.patch @@ -8,63 +8,9 @@ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- - core/assets/bundles/bundle-mdtx.properties | 19 ++ - core/assets/recommendMods.json | 17 ++ core/src/mindustry/ui/dialogs/ModsDialog.java | 264 +++++++++++------- - 3 files changed, 197 insertions(+), 103 deletions(-) - create mode 100644 core/assets/recommendMods.json + 1 file changed, 161 insertions(+), 103 deletions(-) -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -index 9d9cbc07ea828ebbcc4557994b36328cf9764e45..d4b9a4bbc5a9c0c5c298a1744a3c99a6385224a7 100644 ---- a/core/assets/bundles/bundle-mdtx.properties -+++ b/core/assets/bundles/bundle-mdtx.properties -@@ -1,3 +1,22 @@ -+#UI -+mods.group.mod = 模组 -+mods.group.internal = 内置模组 -+mods.disabled = 禁用Mod -+ -+mods.recommend = [accent]MdtX[]推荐辅助模组列表 -+mods.recommend.lastUpdated = 推荐列表更新时间:{0} -+mods.recommend.info = 经过精选的辅助模组 -+mods.recommend.mod.description = 经过精选的推荐模组 -+mods.recommend.mod.name = 模组:{0} -+mods.recommend.mod.author = 作者: {0} -+mods.recommend.mod.minGameVersion = 最低支持游戏版本:{0} -+mods.recommend.mod.lastUpdated = 上次更新时间:{0} -+mods.recommend.mod.stars = Github收藏数:{0} -+ -+alphaLoading = {jump}[gray]加载中... -+alphaLoadFailed = {sick}[gray]加载失败... -+#end UI -+ - status.slow.name = 缓慢 - status.shielded.name = 保护 - status.corroded.name = 腐蚀 -diff --git a/core/assets/recommendMods.json b/core/assets/recommendMods.json -new file mode 100644 -index 0000000000000000000000000000000000000000..b76b9baf860869ae75a8f3387e9827a55defab90 ---- /dev/null -+++ b/core/assets/recommendMods.json -@@ -0,0 +1,17 @@ -+{ -+ "lastUpdated": "2024/4/12 21:00", -+ "modRecommend": [ -+ { -+ "repo": "eb-wilson/toomanyitems", -+ "reason": "Too Many Items(TMI)类似Minecraft的JEL物品管理器\n提供了检索物品、单位、方块、电力、热量的用途以及获取途径" -+ }, -+ { -+ "repo": "mnemotechnician/new-console", -+ "reason": "NewConsole提供了新的控制台,方便调试者执行js代码\n1.保存js代码的执行记录\n2.读写简单js文件" -+ }, -+ { -+ "repo": "way-zer/contentstweaker", -+ "reason": "ContentsTweaker(CT)允许地图调整内容、添加UI等" -+ } -+ ] -+} -\ No newline at end of file diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index cfc64166ab474960ad13e1784605e9078c33d16e..5a4e034deba4bb29890ffd5edcd1ecdbd685e519 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java diff --git a/patches/client/0053-API-LogicExt-limitUpdate.patch b/patches/client/0048-API-LogicExt-limitUpdate.patch similarity index 100% rename from patches/client/0053-API-LogicExt-limitUpdate.patch rename to patches/client/0048-API-LogicExt-limitUpdate.patch diff --git a/patches/client/0054-FC-LogicExt-terrainSchematic.patch b/patches/client/0049-FC-LogicExt-terrainSchematic.patch similarity index 100% rename from patches/client/0054-FC-LogicExt-terrainSchematic.patch rename to patches/client/0049-FC-LogicExt-terrainSchematic.patch diff --git a/patches/client/0055-API-UpdateExt-worldCreator-allUnlocked.patch b/patches/client/0050-API-UpdateExt-worldCreator-allUnlocked.patch similarity index 100% rename from patches/client/0055-API-UpdateExt-worldCreator-allUnlocked.patch rename to patches/client/0050-API-UpdateExt-worldCreator-allUnlocked.patch diff --git a/patches/client/0056-UI-ARC-AuxiliaryTools.patch b/patches/client/0051-UI-ARC-AuxiliaryTools.patch similarity index 100% rename from patches/client/0056-UI-ARC-AuxiliaryTools.patch rename to patches/client/0051-UI-ARC-AuxiliaryTools.patch diff --git a/patches/client/0057-C-Editor.patch b/patches/client/0052-C-Editor.patch similarity index 93% rename from patches/client/0057-C-Editor.patch rename to patches/client/0052-C-Editor.patch index 86f439861efa..f80cda804115 100644 --- a/patches/client/0057-C-Editor.patch +++ b/patches/client/0052-C-Editor.patch @@ -8,31 +8,14 @@ Content-Transfer-Encoding: 8bit 从ARC分离,WZ重制 --- - core/assets/bundles/bundle-mdtx.properties | 5 +++ core/src/mindustry/editor/EditorTool.java | 5 ++- core/src/mindustry/editor/MapEditor.java | 9 ++++-- .../src/mindustry/editor/MapEditorDialog.java | 26 +++++++++++---- .../src/mindustry/editor/MapResizeDialog.java | 4 +-- core/src/mindustry/editor/MapView.java | 32 +++++++++++++++---- core/src/mindustry/ui/GridImage.java | 5 +-- - 7 files changed, 64 insertions(+), 22 deletions(-) + 6 files changed, 59 insertions(+), 22 deletions(-) -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -index d4b9a4bbc5a9c0c5c298a1744a3c99a6385224a7..6c1d71ab711e58f215195712bfb36eeccc2b50b8 100644 ---- a/core/assets/bundles/bundle-mdtx.properties -+++ b/core/assets/bundles/bundle-mdtx.properties -@@ -97,6 +97,11 @@ setting.renderMerge.name = 顶点合并渲染 [grey]实验性功能,可以减 - setting.renderSort.name = 渲染排序 [grey]多图集(Mod较多)情况下能够提升50%渲染性能,但可能造成渲染错误 - #end Settings - -+# editor增强 -+toolmode.square2 = 方形(直径) -+toolmode.square2.description = 同2方形。但大小为直径(延续学术端功能) -+#end editor增强 -+ - bar.reloadDetail = 装填:{0}% - bar.warmupDetail = 充能:{0}% - bar.ammoDetail = 弹药:{0}/{1} diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index 50c7a2aca929b532c1762a399ebc68f779ef0670..cc25012e08ceb60057fb8fedaec5fa50d53999bf 100644 --- a/core/src/mindustry/editor/EditorTool.java diff --git a/patches/client/0058-ARC-arcScanMode.patch b/patches/client/0053-ARC-arcScanMode.patch similarity index 100% rename from patches/client/0058-ARC-arcScanMode.patch rename to patches/client/0053-ARC-arcScanMode.patch diff --git a/patches/client/0059-C-noPlayerHitBox.patch b/patches/client/0054-C-noPlayerHitBox.patch similarity index 100% rename from patches/client/0059-C-noPlayerHitBox.patch rename to patches/client/0054-C-noPlayerHitBox.patch diff --git a/patches/client/0060-OC-SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch b/patches/client/0055-OC-SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch similarity index 90% rename from patches/client/0060-OC-SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch rename to patches/client/0055-OC-SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch index 74af9da7b326..980ee33f1b72 100644 --- a/patches/client/0060-OC-SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch +++ b/patches/client/0055-OC-SDL_SetHint-SDL_WINDOWS_DPI_SCALING.patch @@ -8,7 +8,7 @@ Subject: [PATCH] OC: SDL_SetHint SDL_WINDOWS_DPI_SCALING 1 file changed, 1 insertion(+) diff --git a/desktop/src/mindustry/desktop/DesktopLauncher.java b/desktop/src/mindustry/desktop/DesktopLauncher.java -index 44f3b5b03f275b2d2151b9ef658879ddd5c06375..2d97d23f669f911849874b03e693edac3e85b0c0 100644 +index cc0fc736535acdcf5a786b551a7a40a4c62cf431..a09150e573d939ee1420bf34acb23098cf4db56e 100644 --- a/desktop/src/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/mindustry/desktop/DesktopLauncher.java @@ -70,6 +70,7 @@ public class DesktopLauncher extends ClientLauncher{ diff --git a/patches/client/0061-FC-Icon.patch b/patches/client/0056-FC-Icon.patch similarity index 95% rename from patches/client/0061-FC-Icon.patch rename to patches/client/0056-FC-Icon.patch index 5690b0c348ce..c310f9297e78 100644 --- a/patches/client/0061-FC-Icon.patch +++ b/patches/client/0056-FC-Icon.patch @@ -30,8 +30,7 @@ Subject: [PATCH] FC: Icon .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 24655 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 31169 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 29691 -> 0 bytes - core/assets/icons/icon_64.png | Bin 13869 -> 6855 bytes - 27 files changed, 1 insertion(+), 12 deletions(-) + 26 files changed, 1 insertion(+), 12 deletions(-) create mode 100644 android/res/drawable/ic_launcher.png delete mode 100644 android/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 android/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -7852,410 +7851,3 @@ z9||)8hmqsLn37`duy%;PtI~kF9_bs;g($|xE{g7)yURXOC9IhNW0&T6$-VC}!`OGT z$J_5ppi;=x&G*M9Oi8;v?^f)Fc8dEZRI-koYmuGpAaJh^)<*?FP{}jsBPXRSSu1WF G`hNh2VNFs1 -diff --git a/core/assets/icons/icon_64.png b/core/assets/icons/icon_64.png -index a67eae01f345742387c21ea251774ccfc7b504b6..72013d3da3e0e19ca74aa874dc7dcd2fe3a97634 100644 -GIT binary patch -literal 6855 -zcmV;&8aU;NP)5Ppldtw{`_|J>|MA4zZi{p0{#o-G#y!%Pzrvjl^KL9) -z%h{7F>U^yblb^3-q>4U!Jw6==P4oU9UU)Y;xH#Vz?U|mVUp~07(E8LTKd5@p+2V^| -z{JQVv@^Z*9d#8Z>)425s92p!w90TZ!i}d6fjWAxs?8@ER~lF -z56n6M=ou~rPk6FVc1Rs6}FFUzVRM_H_|xHavag@Z{A*A -zz4%=aLC;Lj2JNnM>c-NwFR%fKkOC3>xCSCUX}3G#U_c`7LpOfE4+J2RJw*s|Ka;4* -zOt>OWw=ZpsW$2nXXipBgMDXyGa5P|l0)Ks+Pey?)@Qf2xV|&ktILCIJzSuZ=y{^nf -zN|FmYQmDoTV`z{<5C9YGb{!=Ne!m}c^-CaNV%~}%?3au^t6{l<246 -zdD^x+XF&uu@Pi1V>walATT(7p#Ijn72&7&-9uYHuH3*_`a_p?rs!OfW5*zam1^f~+ -zePV+^9+5l|9U#Stj3GI=zvJW~-*vzUNO7yaT`81(Qg3KVIwZs+Q`wa9M0>iAB(-Ijm=>1s#T^DVi!T9q2O -z-?1@%6B34Hz&Un6fIjpD=WhlAlFga^e -z&`5zw0`#Tcf{uVLqN1cyOeSMet655yHJg+KQBoTW2Ka&k4-@qVwPgUDqxNioFUvroMdik!gAALvyM#w+r_djF303Rpnp)Yguk=y0*aMCq(X>?#q>Y5KGA0 -zO)w;A?{1*mnt+_-!F5X_gn<10vn>f}O@;h5AfJhu@<$&#DEA+Zj}EP_Avp5w7uV$Z -zS4v8HxpV_i+Yr|M$xKTEK>kN> -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 -B2qXXi - -literal 13869 -zcmV+|Hqyz7P) -zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3;uk{zqErT;UE8bZ*+aA?hH1~vTp7DTp^p4q#0 -zrE`=!cgBtY+%G45e*F4Cem`LQ&-YCp?|sU9Bl~&d^T+GSdOhDkzBlsjzHi^} -zO?^Mm(zofn|GV+t_PzPJt^_uu;G -z`kBwA`^y4;zWTL(&&SC8*K*t&eM~F;TBrAY8-Km;KOf_MjL5prC%f+>>dDUM`=4*? -zxA!c2uRFUI$fFw4JE@PUoL5}fSx$dGmiU|bKk_=Czm>n`Y0n^Plc{#|biS$9vEthX -zJ8iSuuJd)+!4QL6F7ws7;rw~8`0T11Cn!OG?RMD^pGkC_A4Jacw)-55Ju65Dfw}BS|5q}GD})#l^;SrsW}=TF -z#+YJ`CDz!IPa(yWQcl9DmVFL6=9F_Tx#m`U2_=?PK(kUytFC%rESj2XuBF!68V_xu -zaj(YpjW@dMzK0%r>baL*dmE(B2qTU(@+hN@Hr@0S2rx6vJj<-JExSmi6;@nn&17P&v;_Lr#5cHq{Z0I3RDQxMWqeq69hbES!w{-dwvKmFieZq%n;x%j)fWA)j*Dp{J-jCGtRX6StD)l(V^ocD6c@6;GA -zBj^2^Z1-tRF7GB}zjNo=!}GLwZn2|Sguv*IYcTn0>-J^2TI007m6gfaF!y937W`1N -zsdjnYzSlFcCMe}uzKXb_{pU||w<%TXqHIT26a)ACb0l@!JW@ZY1Xu0F=*g+BYsk4i -zSr3pewUmQt-gD2&rgR;Sr))=W#iDatdkPJ;hCY6?yTY5gWN -zJx~aCwa{x+#ACJ5b>^IHC)X7pXDeZjyVi2@s8Ejfq*=>1+~F3j(p^*f8AI}Udy=$K -zfhD?v{2JX(!;M=eH@s51lhSAC{|dMNXCfGaH>P7{IyA777drjxV(dWSU<2z0W_L^IX1}@T1wdWPY|7)4 -znJVfd4nzP1o=L?>RPu#<%V_*;&1Y-u^jaOJ3vvZNX09X6of`}eiiJ(S5ruI>N)=_I -z9(^Y_bEFVLlh8=XEO42%a2oY!)ElCV1%-3eVwT_G!~bmr3M)RPEq>U)fspw3_S@xlM0)w6j&B} -z&x~Y1>DZMLbM@8~imQ$IXvRDN&>;h6889GDj{M@^p~`MkQ=jArsajh(MBs;Kl~9Y# -z_|ghdJ`kbmf`JfhzvE0=-bk~oNl6w=) -ztB?gjRHJJ8K}vE#0%}>1tY9>ZYH*hOEDw-Vslx{rr%I4vfpDU)Mq>~g#d#S}NR=Z5z;>>@mx;S{S&Si6tT4nzY%5Y -z7!K4BNeO3;n8F|z<6_|rXuS>r;S2ry^T%Ti$SFS8B<5Mxba~j`w8K2I!f{hv+>Ot) -zVMsKGfACla98g=&S_Kh*mfx~4I0mZ!eJ0b>df! -zBK%n~Bc1sQyP)6Z4vYZVBnGL^+JpV9-#&{|J3dOQr)l$eumC6%AY!Bz-#*S41e^fz -zNv5At^jG6=LA+9*e8SO?c|40x4(vA5g61Ofhf}Ut5Alh -z)C3$JK$FyXSiY0)>mfzQ$in`4g%1Twic01=Lz;eGo6of{%IDQmLL@y*07AHQs)Z$c -z&I`C{0!}B{hmp^iivgfp(P`lM)zPRnOvk_&cj$0Q@rk8EJ{i?m_Eqagy;$%lTk%hW -z7Qh&uwQGu+*(YS-aElfmX -z;4@;n?wtG>r0@MvBNR0HFP%t0<#>}#f+LG@9`nS{PALKbS8Z2E1F4J)81_^FOadMC -zb%S{Y-!cSdqY7z=r -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 -z_2+Z${F7}n0su5MNA`Z}S)Z7v&lJkq -zzSIQQDZg>f1jc^MdbbjuNqY+KuTNB0K7XI0hx3aeI(}u6ECEAgrMFrZz_E5L#D8i8 -zd3&2S;`=dC=)07DJ04BH7r`fyunfXzlj2mQ&H$(+Cz90apgNJg2dvb$*OW8F%f0n0 -zMDlR5aKR@*omU>!sUdl6vtRBu#7UI=jU$}p&N>_P<6Y^$w-LjF>NgM8?fFe*En0^R -z*en54*eW>&zbJqV6YHH3H;UhPqeBfSQ3|M>O-d58#hd?mT5JvKA59p) -zbMAAV!o%y`VbYV#oqhgx6SaKy2|qE>krNBXW}V`X(d#r|8!&M2*PDcRM`-%DAqFjz -zy{FmZce>mZ&(hh!Gyi;!RG&Q*Fd3@q*iREn%~&SNoO}F9#!+o-ZEfy(f1Aa*`wJnh -zBNVl~@6F9U`+4t=nko@1i)=rl3XvbX1*&bv((!<%F65nz9x|;Se&cL@JfDL99@3u? -zjo`SH*6QIwi@PYD3LfU7Lty4C{8xbQY4B=K+T34g5J8@2{0M{pTr+K(L}&aQEO957 -zhr;boqJ(v%&4~gr@VT5LVqd}jGuGz&Q`8cAqJDE_RQ<+6lZE%;`vdCt2k3Y3^h%1z -ze5DyiCjW@>o2V*fwH#DNgO7&yqhFuI%{gq=3Hh%oivL{l>@i4n2iU_N3HO$^`Is>k -zW<90EkH%2TT2BmT@5%doLwvfqKSy~_I!@{(R4Zy)#{mKU$jtAc_n&?>|DE4nd#HYJ#QcBh`k!jzFLqY|00D(* -zLqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq7>3`rN{duFSVY7jNOiIxD&nYBC_;r$E41oh -za_Jv5X-HCB90k{cgFlN^2N!2u9b5%L@CU@j)k)DsO8hPT{x)g6H_UhmY@fah~N}_vh$U@+Jd(0`V-< -z4U2e#czV;)IqwrkSxHie&xywjx*+i**JYRAI2RrE^USD`NzW5UiG^YZ%N@*0hDtm| -z98*+{^8Hzt70z3n)k=-E?#W*m&TA{nT&FdJBo?s*5dvh?P(}q7;*5p0lat9cA(j`N3qyQ~{p#Z#}(KqFQzFVMY&Fx$39H$RJ -zhI*B{0S*p<(IRE9d%Qc;*|&ddTK)S0K?8D=mxgv-00006VoOIv00000008+zyMF)x -z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;|L58G&?Y*j#dBw77|HBK~#9!?V4GT -zT-SNuf9IUL^g0`61w>*82oM5D%AzdFB1PLu>L6FFzCkgGCe)hcRA6|A!aV|8G0{{Xe{@&YnGMhOs=d2E6v#Ykc#Y-{g(gf2^CnuhJezl(k2+ -zQaW29BYyx=Nzo|g>}?LX_cni!?K`!e1pIvUQ!IBY0L+)ycz*07N`CyH?Hqhu(x*!47^9hU$Y57sGp@wPPxD6P;qYU&9-FeeaY -zPzVZ*C{Ve8vOgnmdJ6teGl_ov>8Wb+xi9>RdyqLiPy^1MJ!_n;5=@3~052et4&Dfb -zK9*-uYdht*sWO2)-PUtRoFki7rSTqxY7C#L_{g2 -zJQNy~UR&$xIF7aN`&yLJPDDEqEr=FDCsCxE_wMWE^^y*W^;od3twUQUT12!%2G`j9 -zbi=2U!CI8lH#_6{LTg_4)_XcAgjyS;QQ5Nuw9;Awy4zjXNs{Ow2s8?fQd&f;Qfj_j -zD*gAb{POQEo5FwKr$7CJ5xm}30etRr|5g3dfBrl2Uw-sIjt7-WC?ZZNNaBR|-d?13 -zw+_Jc+#XJxehT0B5OFx?P(XX7NfO6^;ukA(q}H;x*vfZB7|_VD{>d<9xWU>x8xy?U -znnNoAV%jTB_RP=V0If5eQ7_{CcP?@N-UQl$myFdET -zpQv+Li{}@y&f#o!rfG^_Ea05O+7xF~ -z&aKRFt5YViDT%ejX-bmX2cB`7tx0UktxlP9D>FEoX7_RqzgQqm)4}tsb6h;XNTc4s -z7>(x}R_YDjdwVg5DIf}$*l-xzjvC;3*;g*Lx^GWwYh7x0>v+CFoY4PQU#`<>uTm@( -zan9nL!}AScxyV|poe?1L)A}5rowUpqSII25uMKKIq@WN45bkY^@r&jhfl6~5S5zj( -z@q9y?rf97ZF>G|!s4v&?{2YeM*4FOUSzGH;Dwhz1)HywjZASrYRZkIyNG}8KoC6V@ -zIIOj#X^ORWAOyb;WStARw0eGRuXPNtBC7a(W+| -zn#3;zBuRqS8m$e+NcK!|h;xWiXsy9*dM6P<>zzZGhYKKQW)VlZTw;1|4=eSROc;_0 -zVRFv|K_MVb6RfqFs-_m}9Lm!K#gMgj2c;C%Jri8DQzRlxQp;>_NB|CKGRu-WOi+#J -zth5jjD&tj@r-`Eoqcz$y7?bf%PzadZGr?+e6|Hr~LrO6{w}*1MgcCvJV+ug}F^mYJ -z;KZkobMgElwR`uG9Q=_Jhp}mzX+W+8*5=w^9m*Jr)iNlBbB;Lfab4}D!X%y=^+>50 -z)+mv<4G;*bWpIKrhPc;58;vmr<2;;kIM2fq;mC=@TwAl -zd^`;pisGCTJm2HfpLv?q)ebhbgoS`KO-Yi3G)+m9gfvY^(_9m*L%Ec4<0I7iTAyL* -z%pYUJ7?k!#R6v}d>G6eqJ|_RVYc&^YJ$g>%0`Ty>6wmYVa&VsKapKHzqF#*g3}a(e -zv^F>=+vBgt(g0_3JI{rXyShT5fVCO$Buz=_WC(SZ7D1^1 -z3X&utiX&_sGaom01m8D-?na8ySvIHDAb%%IEZvTzEdrAzkCzTl@sk@(q9{V^%sZrU -zLcHF?_kFa}U=t4Y-eJaXacc*`dOJNW6~#iK#i=pN&+F4TCpc?quQV}%$@1|yW}$bV -za2N1>0P7n`23{-rL7EdX_6F20ep>|Qsy@GVbc#2ZR!QQ7G)}OwB@6~zZ=0wEcY(?YSq>9Lq|_b0J7OLW#-UA#iT!rDCwHbU6FYNm~%+lvtdPw5da -zkV?kvNoonr?%~N~$>a0;$M}oO4J1kk!w_pdJeP8MtjE{>^d8eIh&gBju -zwJ=v`ak9EhY+WAlWdVTbvrZ3*snNOIUHp?(d3Hieo1a -zGdVRuFN#^;i0Sqcx>0`i64rYWQQ~N=taA1J>yIV`GSewmOCXL@V|SSeTUeL5!G6Vx -z#}hzzGZ~W2oIsqATA1=zIX2b;rLn2qHP+NxbK>+-re-EF#_+Gc`c)i`*x9^BkP_RJ -zIB}eL@-Uv!tkj!azIZkF3_EFokXj2$b8M`|l)swoypzp$hoO9+ySo5>$hSt)U~yTP -z>heOUwNRBhv*{Anrn`Vw9C_*>W0T{9^z_)l1N`>OFVkJ$U_FXi+t{ENMV#4xh`I5} -ztOB7F&6PISFMojDNeBWiO_)uWs7f81Memtg&EGwH?kKh$NwAPNEn?9lQI$ealh8U -zImeL`hcL!$$FCr;YZPq*CqbUCWWWcCnR~NgY>&hNi>-Oq(;%}m>8n&${k76hmePmr -z{NdvV8P9iqmydt881}xZmQ&m8A!pgMgAW -zi&2El%Jk4XZ`gp#?b*jC!8^S&?YM**(E^6@Y#vBdN-2(?I?A5escqk{wmQ6j;R;ET -zZoX))roQj-)TfU!_5dN=zt`Z(;V46wm-zg)c8n8sK4`<-n~MaKAbl^-{Yy%$Ec2P7eaHT&DF*2-a&GHaziTbkVl2} -zZ~^QsbQufQ2RPJ_dwfu#VUz8rMqeISZ8TXte|cv@>nCHL;l!z9RLa4K8&gWLa=*!? -z_pS~~@FS)$UpzlkZ7cGrNQ$iC0~I#W*`;a6Yz2DAGQ -zZWF@&T7&DCZ{VDxr;2pdWZpbcL+?3cTH1|Z+fe{tf&{3ck6@ZWb9XH -zjpg8nV(Y^69CN?&kI-RZ`-}Jm_CEJ(6sP8f1SEvz3NQceH<;Of2(cCsVQ%jXhmRk? -z7=zXZv5u?lF&aq)Pi1 -zk^NamI1j>lYh6Hdadn7w|U8h{3)ggYDKEUqqK^4^=#n(EXf<*_QB=Wi=}BSP)1zoc{X>MoC#Ts?QMC9K}L -z!SXwAz_2&S{l4${l*g)6rzW%3nbsJkSX^D;&c--Kx$W=xNG1T>S5L51I1Sp%i;tS> -zRYadZx{MokLK5@c@I~~Hn#~6=N -zr9^ddJZqjR1={0-!fERI$<1*7aZKQrK8f~@QYbhk=cj4c8a!k} -zS+r~g -zz{bg-EdHT)oVsp3PG@K@04r*iY2~3*LJ)*ZEzFWcF;UdR^9-Kv;io=f5VB@1x5cqH -zUELC*W}09MB}#Mq9$5%VDc0(Ds9k((+cnk+Z(h64Qah&F2k(1$o+r`ar_F_vW9` -z`S9wl=Fs2y_D9#bd+zmZ;1%$bYju`d5v4+bAPn(?0N)St#;K1sdJqR_tx0GuHDTA4xxgQ6P7wvlr|Ux#-&t4L$OrG_cQYKe2>5nh@*sd -zvyC5Qte=JGij{hU_3j4cN@-W(^>ze5Xg&9{!ff`}X+e__jpzILK{mo_bT&hn^j2|E -zN?6Ed2BXyRRQVp`UWAikMw|~IBc(MHszp&C$X7J5<_YoPgk4F1QFJS`Apwt$$D4>Di=W3HrE_1MN~>1E_UYej7BSsO)NnW -z^4nUz>6WkBJF -z0ndK+8P?X;5GNGNg{&fL-OzlFV`6%WrnN|#@YK{j77FVmE*LZ{HcQv?0F%o}D<7db -zR9dH4XmY7Dhw^+Trl&B*8~AyxHGbgp%=4$&==QRS(n@8J#R8HfNz!h%um7`u{7>}v -zzV|)1>$LdmufNVe_{u*tfBfD5*!%oTFaAckQdv-t=A9u4d{6wq%R5~n3IrvBC{YSA -z#)$TPIUal{Pn1_hYb{>?G+K-?;u|fVF(aq%Y4JQGfzjd{BY|hc7%h`wBIN*y#t%xN -z7>Y4kl+vP&60MYE4I(9B=u6=HB7!K5XsxU<#=H69(&E4WcmMXgpMT+n-VcBHL-&w@ -z*zL!2&plT?ckbNL@BYbu{=wY*{4wA6eDcw=Y$sjb9C3rbpNN1+K@2|CbK& -zjF(RBnOd*aYR!p>iL}*f@wgf=SQCb!S1cBdb8g4=0Wq4LyFWdOJ0wGj0vo%u=rl3G -vZZiq8v9V#JC`xx9mi^@T -Date: Sun, 9 Jun 2024 22:29:31 +0800 -Subject: [PATCH] prepare for mod-browser - ---- - icon.png | Bin 0 -> 6855 bytes - mod.hjson | 8 ++++++++ - 2 files changed, 8 insertions(+) - create mode 100644 icon.png - create mode 100644 mod.hjson - -diff --git a/icon.png b/icon.png -new file mode 100644 -index 0000000000000000000000000000000000000000..72013d3da3e0e19ca74aa874dc7dcd2fe3a97634 -GIT binary patch -literal 6855 -zcmV;&8aU;NP)5Ppldtw{`_|J>|MA4zZi{p0{#o-G#y!%Pzrvjl^KL9) -z%h{7F>U^yblb^3-q>4U!Jw6==P4oU9UU)Y;xH#Vz?U|mVUp~07(E8LTKd5@p+2V^| -z{JQVv@^Z*9d#8Z>)425s92p!w90TZ!i}d6fjWAxs?8@ER~lF -z56n6M=ou~rPk6FVc1Rs6}FFUzVRM_H_|xHavag@Z{A*A -zz4%=aLC;Lj2JNnM>c-NwFR%fKkOC3>xCSCUX}3G#U_c`7LpOfE4+J2RJw*s|Ka;4* -zOt>OWw=ZpsW$2nXXipBgMDXyGa5P|l0)Ks+Pey?)@Qf2xV|&ktILCIJzSuZ=y{^nf -zN|FmYQmDoTV`z{<5C9YGb{!=Ne!m}c^-CaNV%~}%?3au^t6{l<246 -zdD^x+XF&uu@Pi1V>walATT(7p#Ijn72&7&-9uYHuH3*_`a_p?rs!OfW5*zam1^f~+ -zePV+^9+5l|9U#Stj3GI=zvJW~-*vzUNO7yaT`81(Qg3KVIwZs+Q`wa9M0>iAB(-Ijm=>1s#T^DVi!T9q2O -z-?1@%6B34Hz&Un6fIjpD=WhlAlFga^e -z&`5zw0`#Tcf{uVLqN1cyOeSMet655yHJg+KQBoTW2Ka&k4-@qVwPgUDqxNioFUvroMdik!gAALvyM#w+r_djF303Rpnp)Yguk=y0*aMCq(X>?#q>Y5KGA0 -zO)w;A?{1*mnt+_-!F5X_gn<10vn>f}O@;h5AfJhu@<$&#DEA+Zj}EP_Avp5w7uV$Z -zS4v8HxpV_i+Yr|M$xKTEK>kN> -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 -B2qXXi - -literal 0 -HcmV?d00001 - -diff --git a/mod.hjson b/mod.hjson -new file mode 100644 -index 0000000000000000000000000000000000000000..e98708a379007d11d7b50378a222c0303297e984 ---- /dev/null -+++ b/mod.hjson -@@ -0,0 +1,8 @@ -+displayName: MindustryX Loader -+name: MindustryX -+author: WayZer -+main: mindustryX.loader.Main -+version: "1.0-dev" -+minGameVersion: "146" -+hidden: true -+dependencies: [] -\ No newline at end of file diff --git a/patches/client/0070-OC-Fonts.patch b/patches/client/0063-OC-Fonts.patch similarity index 100% rename from patches/client/0070-OC-Fonts.patch rename to patches/client/0063-OC-Fonts.patch diff --git a/patches/client/0063-PICK.patch b/patches/client/0063-PICK.patch deleted file mode 100644 index 1a77a9ffc543..000000000000 --- a/patches/client/0063-PICK.patch +++ /dev/null @@ -1,249 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Tue, 4 Jun 2024 22:21:14 +0800 -Subject: [PATCH] =?UTF-8?q?PICK:=20=E7=BF=BB=E8=AF=91=E6=9B=B4=E6=96=B0?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - ---- - core/assets/bundles/bundle-mdtx.properties | 198 +++++++++++++++++---- - 1 file changed, 167 insertions(+), 31 deletions(-) - -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -index 6c1d71ab711e58f215195712bfb36eeccc2b50b8..935b1f1cbeeff82fe9d1a6f4f8ee18a9e39e0a39 100644 ---- a/core/assets/bundles/bundle-mdtx.properties -+++ b/core/assets/bundles/bundle-mdtx.properties -@@ -102,6 +102,172 @@ toolmode.square2 = 方形(直径) - toolmode.square2.description = 同2方形。但大小为直径(延续学术端功能) - #end editor增强 - -+# PICK -+mod.circulardependencies = [red]循环依赖 -+mod.incompletedependencies = [red]缺失依赖 -+mod.circulardependencies.details = 此模组与其他模组相互依赖。 -+mod.incompletedependencies.details = 由于依赖项无效或缺失,此模组无法加载:{0}. -+mod.requiresversion = 需要游戏版本: [red]{0} -+trace.language = 语言: [accent]{0} -+trace.ips = 曾用IP: -+trace.names = 曾用名: -+player.ban = 封禁 -+player.kick = 踢出 -+player.trace = 追朔 -+player.admin = 切换管理员 -+player.team = 改变队伍 -+votekick.reason = 投票踢出理由 -+votekick.reason.message = 确定投票踢出玩家"{0}[white]"?\n如果是,请输入理由: -+save.nocampaign = 无法导入战役中的单个保存文件。 -+command.boost = 助推 -+commandmode.name = [accent]指挥模式 -+commandmode.nounits = [无单位] -+waves.random = 随机 -+waves.search = 搜索波次... -+waves.filter = 单位过滤器 -+editor.savechanges = [scarlet]您有未保存的更改!\n\n[]您想要保存他们吗? -+toolmode.fillerase = 擦除同类 -+toolmode.fillerase.description = 擦除同种种类的方块。 -+rules.hidebannedblocks = 隐藏禁用的建筑 -+sector.capture = 区块[accent]{0}[white]已占领! -+sector.capture.current = 区块已占领! -+stat.unittype = 单位类型 -+ -+ability.forcefield.description = 投射一个能吸收子弹的力场护盾 -+ability.repairfield.description = 修复附近的单位 -+ability.statusfield.description = 对附近的单位施加状态效果 -+ability.unitspawn = 单位生成 -+ability.unitspawn.description = 建造单位 -+ability.shieldregenfield.description = 再生附近单位的护盾 -+ability.movelightning.description = 移动时释放闪电 -+ability.armorplate = 装甲板 -+ability.armorplate.description = 在射击时减少受到的伤害 -+ability.shieldarc.description = 投射一个弧形的力场护盾,能吸收子弹 -+ability.suppressionfield.description = 使附近的修复建筑停止工作 -+ability.energyfield = 能量场 -+ability.energyfield.description = 对附近的敌人释放电击 -+ability.energyfield.healdescription = 对附近的敌人释放电击,并治疗友方 -+ability.regen = 再生 -+ability.regen.description = 随着时间的推移恢复自己的生命值 -+ability.liquidregen.description = 吸收液体以治疗自身 -+ability.spawndeath = 死亡产生单位 -+ability.spawndeath.description = 死亡时释放单位 -+ability.liquidexplode = 死亡溢液 -+ability.liquidexplode.description = 死亡时释放液体 -+ability.stat.firingrate = [stat]{0}/秒[lightgray] 射速 -+ability.stat.regen = [stat]{0}/秒[lightgray] 生命恢复速度 -+ability.stat.shield = [stat]{0}[lightgray] 护盾 -+ability.stat.repairspeed = [stat]{0}/秒[lightgray] 修复速度 -+ability.stat.slurpheal = [stat]{0}[lightgray] 生命/液体单位 -+ability.stat.cooldown = [stat]{0} 秒[lightgray] 冷却时间 -+ability.stat.maxtargets = [stat]{0}[lightgray] 最大目标数 -+ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] 同类型修复量 -+ability.stat.damagereduction = [stat]{0}%[lightgray] 伤害减免 -+ability.stat.minspeed = [stat]{0} 格/秒[lightgray] 最低速度 -+ability.stat.duration = [stat]{0} 秒[lightgray] 持续时间 -+ability.stat.buildtime = [stat]{0} 秒[lightgray] 建造时间 -+ -+bullet.maxdamagefraction = [stat]{0}%[lightgray] 伤害上限 -+bullet.suppression = [stat]{0}秒[lightgray] 修复压制 ~ [stat]{1}[lightgray] 格 -+bullet.interval = [stat]{0}/秒[lightgray] 分裂子弹: -+setting.distinctcontrolgroups.name = 每单位限制一个编队 -+setting.drawlight.name = 绘制阴影/光照 -+setting.steampublichost.name = 公共游戏可见性 -+steam.friendsonly = 仅限好友 -+steam.friendsonly.tooltip = 是否只有 Steam 好友才能加入您的游戏。\n取消选中此选项将使您的游戏公开 - 任何人都可以加入。 -+category.command.name = 单位指挥 -+keybind.command_queue.name = 单位指挥队列 -+keybind.create_control_group.name = 创建操控队伍 -+keybind.cancel_orders.name = 取消指令 -+keybind.unit_stance_shoot.name = 单位姿态:射击 -+keybind.unit_stance_hold_fire.name = 单位姿态:停火 -+keybind.unit_stance_pursue_target.name = 单位姿态:追逐目标 -+keybind.unit_stance_patrol.name = 单位姿态:巡逻 -+keybind.unit_stance_ram.name = 单位姿态:冲锋 -+keybind.unit_command_move.name = Unit Command: Move -+keybind.unit_command_repair.name = Unit Command: Repair -+keybind.unit_command_rebuild.name = Unit Command: Rebuild -+keybind.unit_command_assist.name = Unit Command: Assist -+keybind.unit_command_mine.name = Unit Command: Mine -+keybind.unit_command_boost.name = Unit Command: Boost -+keybind.unit_command_load_units.name = Unit Command: Load Units -+keybind.unit_command_load_blocks.name = Unit Command: Load Blocks -+keybind.unit_command_unload_payload.name = Unit Command: Unload Payload -+keybind.unit_command_enter_payload.name = Unit Command: Enter Payload -+rules.invaliddata = 无效剪贴板数据。 -+rules.derelictrepair = 允许修复残骸建筑 -+rules.buildai = 基础建筑者 AI -+rules.buildaitier = 建筑者 AI 等级 -+rules.unitcrashdamagemultiplier = 单位坠毁伤害倍率 -+rules.unitpayloadsexplode = 单位携带载荷与单位一起爆炸 -+rules.wavelimit = 地图在有限波次后结束 -+rules.placerangecheck.info = Prevents players from placing anything near enemy buildings. When trying to place a turret, the range is increased, so the turret will not be able to reach the enemy. -+rules.onlydepositcore.info = Prevents units from depositing items into any buildings except cores. -+block.fabricator.name = 重构厂 -+block.payload-propulsion-tower.description = 远距离载荷运送建筑。 向相连的其他载荷驱动器发射载荷。 -+block.reinforced-junction.description = 两条交叉物品管道的桥梁。 -+ -+lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" -+lst.weathersense = 检查特定种类的天气当前是否启用。 -+lst.weatherset = 设置当前状态为特定类型天气。 -+ -+lst.setflag = 设置一个可以被所有处理器读取的全局标志。 -+lst.getflag = 检查是否设置了全局标志。 -+lst.setprop = 设置单位或建筑物的属性。 -+lst.effect = 创建一个粒子效果。 -+lst.sync = 在网络中同步一个变量。\n最多每秒调用10次。 -+lst.makemarker = 在世界中创建一个新的逻辑标记。\n必须提供一个用于标识此标记的ID。\n目前每个世界限制最多20000个标记。 -+lst.setmarker = 为标记设置属性。\n使用的ID必须与制作标记指令中的相同。 -+lst.localeprint = 将地图本地化文本属性值添加到文本缓冲区中。\n要在地图编辑器中设置地图本地化包,请检查 [accent]地图信息 > 本地化包[]。\n如果客户端是移动设备,则尝试首先打印以 ".mobile" 结尾的属性。 -+logic.globals = 内置变量 -+lglobal.false = 0 -+lglobal.true = 1 -+lglobal.null = null -+lglobal.@pi = 数学常数 pi (3.141...) -+lglobal.@e = 数学常数 e (2.718...) -+lglobal.@degToRad = 将角度制转换为弧度制 -+lglobal.@radToDeg = 将弧度制转换为角度制 -+lglobal.@time = 当前保存的游戏时间,以毫秒为单位 -+lglobal.@tick = 当前保存的游戏时间,以tick为单位(1秒 = 60 tick) -+lglobal.@second = 当前保存的游戏时间,以秒为单位 -+lglobal.@minute = 当前保存的游戏时间,以分钟为单位 -+lglobal.@waveNumber = 如果启用了波次,则为当前波次编号 -+lglobal.@waveTime = 波次的倒计时计时器,以秒为单位 -+lglobal.@mapw = 地图宽度(单位:格) -+lglobal.@maph = 地图高度(单位:格) -+lglobal.sectionMap = 地图 -+lglobal.sectionGeneral = 通用 -+lglobal.sectionNetwork = 网络/客户端 [仅限世界处理器] -+lglobal.sectionProcessor = 处理器 -+lglobal.sectionLookup = 查找 -+lglobal.@this = 执行代码的逻辑块 -+lglobal.@thisx = 执行代码的逻辑块的 X 坐标 -+lglobal.@thisy = 执行代码的逻辑块的 Y 坐标 -+lglobal.@links = 连接到此处理器的总块数 -+lglobal.@ipt = 处理器每 tick 的执行速度(每秒 60 tick) -+lglobal.@unitCount = 游戏中单位内容的类型总数;与查找指令一起使用 -+lglobal.@blockCount = 游戏中块内容的类型总数;与查找指令一起使用 -+lglobal.@itemCount = 游戏中物品内容的类型总数;与查找指令一起使用 -+lglobal.@liquidCount = 游戏中液体内容的类型总数;与查找指令一起使用 -+lglobal.@server = 如果代码正在服务器上运行或单人游戏中运行,则为真,否则为假 -+lglobal.@client = 如果代码正在连接到服务器的客户端上运行,则为真 -+lglobal.@clientLocale = 运行代码的客户端的区域设置。例如:en_US -+lglobal.@clientUnit = 运行代码的客户端的单位 -+lglobal.@clientName = 运行代码的客户端的玩家名称 -+lglobal.@clientTeam = 运行代码的客户端的团队 ID -+lglobal.@clientMobile = 如果运行代码的客户端在移动设备上,则为真,否则为假 -+laccess.id = 单位/块/物品/液体的ID。\n这是 Lookup 的反向操作。 -+lenum.anglediff = 返回两个角度之间的绝对距离(角度制)。 -+lenum.autopathfind = "自动寻找最近的敌方核心或敌人生成点。\n这与波次中的敌人寻路相同。" -+lenum.flushtext = 如果适用的话,将打印缓冲区的内容刷新到标记。\n如果 fetch 设置为 true,则尝试从地图本地化包或游戏的包中获取属性。 -+lenum.texture = 直接来自游戏纹理图集的纹理名称(使用 kebab-case 命名风格)。\n如果 printFlush 设置为 true,则将文本缓冲区内容作为文本参数消耗。 -+lenum.texturesize = 纹理的大小(格)。零值将标记宽度缩放为原始纹理的大小。 -+lenum.autoscale = 是否根据玩家的缩放级别缩放标记。 -+lenum.posi = 索引位置,用于线和四边形标记,索引零表示第一个位置。 -+lenum.uvi = 纹理的位置范围从零到一,用于四边形标记。 -+lenum.colori = 索引位置,用于线和四边形标记,索引零表示第一个颜色。 -+#end PICK -+ - bar.reloadDetail = 装填:{0}% - bar.warmupDetail = 充能:{0}% - bar.ammoDetail = 弹药:{0}/{1} -@@ -120,7 +286,6 @@ keybind.toggle_unit.name = 切换单位显示 - # 学术特色翻译 - ability.energyfield.maxtargets = [lightgray]最大目标: [white]{0} - ability.energyfield.sametypehealmultiplier = [lightgray]同类回复: [white]{0}% --ability.regen = 再生 - bar.drilltierreq = 需要{0}级的钻头(当前{1}级) - bar.heatpercent = 热量: {0} [lightgray]({1}%) - bar.powerbalance = 电力:{0}/s -@@ -137,50 +302,21 @@ block.reinforced-liquid-router.name = 强化液体路由器 - block.reinforced-liquid-tank.name = 强化储液罐 - block.shield-projector.name = 护盾投影 - block.underflow-duct.name = 反溢运输管 --bullet.suppression = [stat]压制场 {0}[lightgray]s[]~{1}[lightgray]格 --command.boost = 助推 --mod.circulardependencies = [red]循环依赖 --mod.circulardependencies.details = 这个模组与一些前置模组彼此依赖。 --mod.incompletedependencies = [red]不完整的依赖 --mod.incompletedependencies.details = 这个模组因为缺少这些前置模组而无法加载: {0}. --player.admin = 给予/收回管理员权限 --player.ban = 封禁 --player.kick = 踢出 --player.team = 更改队伍 --player.trace = 追踪 - radar.order = 排序方式:1/true 距离从小到大,其他从大到小,0/false 反之。 --rules.buildai = 敌方 AI 会建造建筑 --rules.buildaitier = AI 等级 --rules.unitcrashdamagemultiplier = 单位坠毁伤害倍率 - rules.waitForWaveToEnd = 等待波次结束[gray]所有敌人死亡后才会开始下一波次 --rules.wavelimit = 终结波次 --save.nocampaign = 无法导入单独的战役存档文件。 - schematic.edit = 编辑蓝图 - schematic.search = 搜索蓝图... - schematic.tagged = {0} 个带标签的蓝图 - setting.blockreplace.name = 允许覆盖建筑 - setting.uiscale.name = UI缩放比例 [orange][重启生效] - settings.reset = [red]全部恢复默认 --steam.friendsonly = 仅好友 --steam.friendsonly.tooltip = 是否只允许你的steam好友加入游戏?\n不启用该选项将使你的游戏公开——任何人都可以加入。 --toolmode.fillerase = 擦除方块 --toolmode.fillerase.description = 擦除相同种类的方块。 --trace.ips = 曾用IP: --trace.names = 曾用名: - unit.disrupt.name = 瓦解 - unit.incite.name = 激发 - unit.obviate.name = 影逝 - unit.quell.name = 终结 --votekick.reason = 踢人理由 --votekick.reason.message = 确定要踢出 "{0}[white]"?\n如果是, 输入理由: --waves.filter = 单位筛选器 --waves.random = 随机 --waves.search = 搜索波次... -+ability.liquidregen = 液体回血 - - # ARC增加或补充 --ability.armorplate = 护甲板 --ability.liquidexplode = 液体自爆 --ability.liquidregen = 液体回血 - ability.moveeffect = 移动特效 - bar.drillcantmine = 当前钻头不能挖掘此矿物 - block.fracture.name = 破裂 diff --git a/patches/client/0071-FC-RenderExt-deadOverlay.patch b/patches/client/0064-FC-RenderExt-deadOverlay.patch similarity index 100% rename from patches/client/0071-FC-RenderExt-deadOverlay.patch rename to patches/client/0064-FC-RenderExt-deadOverlay.patch diff --git a/patches/client/0072-FC-LogicExt-invertMapClick.patch b/patches/client/0065-FC-LogicExt-invertMapClick.patch similarity index 100% rename from patches/client/0072-FC-LogicExt-invertMapClick.patch rename to patches/client/0065-FC-LogicExt-invertMapClick.patch diff --git a/patches/client/0073-OC-speedup-SchematicsDialog-showing.patch b/patches/client/0066-OC-speedup-SchematicsDialog-showing.patch similarity index 100% rename from patches/client/0073-OC-speedup-SchematicsDialog-showing.patch rename to patches/client/0066-OC-speedup-SchematicsDialog-showing.patch diff --git a/patches/client/0074-OC-fix-slow-of-LCanvas.patch b/patches/client/0067-OC-fix-slow-of-LCanvas.patch similarity index 100% rename from patches/client/0074-OC-fix-slow-of-LCanvas.patch rename to patches/client/0067-OC-fix-slow-of-LCanvas.patch diff --git a/patches/client/0075-FC-FuncX-focusLogicController.patch b/patches/client/0068-FC-FuncX-focusLogicController.patch similarity index 100% rename from patches/client/0075-FC-FuncX-focusLogicController.patch rename to patches/client/0068-FC-FuncX-focusLogicController.patch diff --git a/patches/client/0076-FC-reliableSync.patch b/patches/client/0069-FC-reliableSync.patch similarity index 100% rename from patches/client/0076-FC-reliableSync.patch rename to patches/client/0069-FC-reliableSync.patch diff --git a/patches/client/0077-API-more-error-log.patch b/patches/client/0070-API-more-error-log.patch similarity index 100% rename from patches/client/0077-API-more-error-log.patch rename to patches/client/0070-API-more-error-log.patch diff --git a/patches/client/0078-ARC-merged.patch b/patches/client/0071-ARC-merged.patch similarity index 98% rename from patches/client/0078-ARC-merged.patch rename to patches/client/0071-ARC-merged.patch index 01c84449f824..8deab9505da1 100644 --- a/patches/client/0078-ARC-merged.patch +++ b/patches/client/0071-ARC-merged.patch @@ -115,13 +115,14 @@ way-zer on 2024/9/8 core/src/mindustry/ui/Fonts.java | 2 +- .../ui/dialogs/ContentInfoDialog.java | 27 +- .../ui/dialogs/CustomRulesDialog.java | 118 +++++- - .../mindustry/ui/dialogs/DatabaseDialog.java | 5 +- + .../mindustry/ui/dialogs/DatabaseDialog.java | 3 +- .../mindustry/ui/dialogs/PausedDialog.java | 12 +- .../mindustry/ui/dialogs/PlanetDialog.java | 70 +++- .../ui/dialogs/SchematicsDialog.java | 361 +++++++++++++++++- + .../ui/dialogs/SettingsMenuDialog.java | 28 +- .../mindustry/ui/fragments/ChatFragment.java | 25 +- .../ui/fragments/ConsoleFragment.java | 3 + - .../mindustry/ui/fragments/HudFragment.java | 229 ++++++++++- + .../mindustry/ui/fragments/HudFragment.java | 227 ++++++++++- .../mindustry/ui/fragments/MenuFragment.java | 59 ++- .../ui/fragments/PlacementFragment.java | 166 ++++++-- .../ui/fragments/PlayerListFragment.java | 93 +++-- @@ -135,7 +136,7 @@ way-zer on 2024/9/8 .../world/blocks/production/Drill.java | 23 +- .../blocks/production/GenericCrafter.java | 29 ++ .../world/blocks/storage/CoreBlock.java | 9 + - 42 files changed, 2072 insertions(+), 228 deletions(-) + 43 files changed, 2082 insertions(+), 242 deletions(-) diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 7f944a3eb06180f9e2b760bbd5aa41709ddf6611..4972f424edd41b8a29d926a09bc55987066d33aa 100644 @@ -2300,28 +2301,18 @@ index 247625c2486445bf2c9c57e9710e3d7bdf65b594..a4e5ab1c90870e2f926822385c472595 current.row(); } diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java -index efc8530fbdb5837cb14d4a0e80de8e8ffbdac588..07567778b10e34f9f3a4b6705444746118bc437c 100644 +index efc8530fbdb5837cb14d4a0e80de8e8ffbdac588..0e6ba1ca32309930953884a6c7b69770bb88e725 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java -@@ -20,8 +20,8 @@ import mindustry.ui.*; +@@ -20,7 +20,6 @@ import mindustry.ui.*; import mindustry.world.*; import mindustryX.features.*; -import static arc.Core.*; import static mindustry.Vars.*; -+import static mindustryX.features.ArcOld.colorizeContent; public class DatabaseDialog extends BaseDialog{ - private TextField search; -@@ -58,6 +58,7 @@ public class DatabaseDialog extends BaseDialog{ - }).fillX().padBottom(4).row(); - - cont.pane(all).scrollX(false); -+ colorizeContent(); - } - - void checkTabList(){ -@@ -150,7 +151,7 @@ public class DatabaseDialog extends BaseDialog{ +@@ -150,7 +149,7 @@ public class DatabaseDialog extends BaseDialog{ ui.content.show(unlock); } }); @@ -3018,6 +3009,73 @@ index 5095be6c1d92f1049829b96a34efabb9854f0e55..a2b042e22e9e31d0882ffb4949393d38 show(); } } +diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +index b93dced65be5c1eea38adc80f8dc2d84c2b3864d..b71452eca5b3527f0c2ee15edd8d6ef01ab4365d 100644 +--- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java ++++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +@@ -303,8 +303,8 @@ public class SettingsMenuDialog extends BaseDialog{ + + game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i)); + ++ game.checkPref("autotarget", true); + if(mobile){ +- game.checkPref("autotarget", true); + if(!ios){ + game.checkPref("keyboard", false, val -> { + control.setInput(val ? new DesktopInput() : new MobileInput()); +@@ -338,11 +338,9 @@ public class SettingsMenuDialog extends BaseDialog{ + game.checkPref("hints", true); + game.checkPref("logichints", true); + +- if(!mobile){ +- game.checkPref("backgroundpause", true); +- game.checkPref("buildautopause", false); +- game.checkPref("distinctcontrolgroups", true); +- } ++ game.checkPref("backgroundpause", true); ++ game.checkPref("buildautopause", false); ++ game.checkPref("distinctcontrolgroups", true); + + game.checkPref("doubletapmine", false); + game.checkPref("commandmodehold", true); +@@ -364,9 +362,9 @@ public class SettingsMenuDialog extends BaseDialog{ + } + } + +- if(!mobile){ +- game.checkPref("console", false); +- } ++ game.checkPref("console", false); ++ ++ graphics.addCategory("arcCOverview"); + + int[] lastUiScale = {settings.getInt("uiscale", 100)}; + +@@ -445,18 +443,18 @@ public class SettingsMenuDialog extends BaseDialog{ + graphics.checkPref("destroyedblocks", true); + graphics.checkPref("blockstatus", false); + graphics.checkPref("playerchat", true); +- if(!mobile){ +- graphics.checkPref("coreitems", true); +- } ++ ++ graphics.addCategory("arcCgamewindow"); ++ graphics.checkPref("coreitems", true); + graphics.checkPref("minimap", !mobile); + graphics.checkPref("smoothcamera", true); + graphics.checkPref("position", false); +- if(!mobile){ +- graphics.checkPref("mouseposition", false); +- } ++ graphics.checkPref("mouseposition", false); + graphics.checkPref("fps", false); + graphics.checkPref("playerindicators", true); + graphics.checkPref("indicators", true); ++ ++ graphics.addCategory("arcCGraphicsOther"); + graphics.checkPref("showweather", true); + graphics.checkPref("animatedwater", true); + diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index 89b9a23ce2bb850df5c7ae99a5f964753a807662..03bbbbfca69229893fc097479f4078843ea0c56d 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java @@ -3100,7 +3158,7 @@ index e74e6a12e3da57eb58598eb4e679a7990c109def..013255ce5aa828d538814fa25dc64c6a //special case for 'clear' command if(message.equals("clear")){ diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java -index 6a9359568e73967b34be82618ec7a95583e5cf6e..729c0540440f9e5f632a5173b90740eb6163ae85 100644 +index 6a9359568e73967b34be82618ec7a95583e5cf6e..f6439cf1961be9380ff63fd2db8417759a209a5b 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -14,6 +14,7 @@ import arc.scene.ui.ImageButton.*; @@ -3250,15 +3308,6 @@ index 6a9359568e73967b34be82618ec7a95583e5cf6e..729c0540440f9e5f632a5173b90740eb if(android){ info.label(() -> memnative.get((int)(Core.app.getJavaHeap() / 1024 / 1024), (int)(Core.app.getNativeHeap() / 1024 / 1024))).left().style(Styles.outlineLabel).name("memory2"); -@@ -377,7 +410,7 @@ public class HudFragment{ - } - return max == 0f ? 0f : val / max; - }).blink(Color.white).outline(new Color(0, 0, 0, 0.6f), 7f)).grow()) -- .fillX().width(320f).height(60f).name("boss").visible(() -> state.rules.waves && state.boss() != null && !(mobile && Core.graphics.isPortrait())).padTop(7).row(); -+ .fillX().width(320f).height(60f).name("boss").visible(() -> Core.settings.getBool("override_boss_shown") && state.rules.waves && state.boss() != null && !(mobile && Core.graphics.isPortrait())).padTop(7).row(); - - t.table(Styles.black3, p -> p.margin(4).label(() -> hudText).style(Styles.outlineLabel)).touchable(Touchable.disabled).with(p -> p.visible(() -> { - p.color.a = Mathf.lerpDelta(p.color.a, Mathf.num(showHudText), 0.2f); @@ -908,6 +941,142 @@ public class HudFragment{ return table; } diff --git a/patches/client/0079-BUILD-BE-release.patch b/patches/client/0079-BUILD-BE-release.patch deleted file mode 100644 index 02722fd622d7..000000000000 --- a/patches/client/0079-BUILD-BE-release.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Wed, 3 Jul 2024 00:16:15 +0800 -Subject: [PATCH] BUILD BE release - ---- - .github/workflows/build.yml | 6 ++++-- - .github/workflows/gradle-wrapper-validation.yml | 10 ---------- - gradle.properties | 3 ++- - 3 files changed, 6 insertions(+), 13 deletions(-) - delete mode 100644 .github/workflows/gradle-wrapper-validation.yml - -diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml -index 797925569a7a81a34dff17296884a7088e05d5f1..04d360717113342650e43a37cc3b541376a1d3d6 100644 ---- a/.github/workflows/build.yml -+++ b/.github/workflows/build.yml -@@ -34,16 +34,18 @@ jobs: - echo "${{ secrets.KEYSTORE_BASE64 }}" | openssl enc -d -base64 -in - -out ../bekeystore.jks - - name: Build - run: | -- gradle desktop:dist core:genLoaderModAll -Pbuildversion=${RELEASE_VERSION} -+ gradle desktop:dist server:dist -Pbuildversion=${RELEASE_VERSION} - mkdir artifacts - mv desktop/build/libs/Mindustry.jar artifacts/MindustryX-${{env.RELEASE_VERSION}}-Desktop.jar -- mv core/build/distributions/MindustryX.loader.dex.jar artifacts/MindustryX-${{env.RELEASE_VERSION}}.loader.dex.jar -+ mv server/build/libs/server-release.jar artifacts/server-${{env.RELEASE_VERSION}}.jar - - name: Build Android - env: - keystore_password: ${{ secrets.KEYSTORE_PASSWORD_SECRET }} - keystore_alias_password: ${{ secrets.KEYSTORE_PASSWORD_SECRET }} - keystore_alias: MindustryX - run: | -+ sed -i 's/tinylake.mindustryX/tinylake.mindustryX.be/g' android/build.gradle -+ sed -i 's/MindustryX/MindustryX BE/g' android/res/values/strings.xml - gradle android:assembleRelease -Pbuildversion=${RELEASE_VERSION} - mv android/build/outputs/apk/release/android-release.apk artifacts/MindustryX-${{env.RELEASE_VERSION}}-Android.apk - - name: Update Tag -diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml -deleted file mode 100644 -index 95cce8bab650b7357a7b675ea34c04601a1ec66a..0000000000000000000000000000000000000000 ---- a/.github/workflows/gradle-wrapper-validation.yml -+++ /dev/null -@@ -1,10 +0,0 @@ --name: "Validate Gradle Wrapper" --on: [push, pull_request] -- --jobs: -- validation: -- name: "Validation" -- runs-on: ubuntu-latest -- steps: -- - uses: actions/checkout@v4 -- - uses: gradle/wrapper-validation-action@v2 -diff --git a/gradle.properties b/gradle.properties -index fad521726aa1c9205be065f31e31c75e845aeadd..611a7bf7dd576c14e2192a8e4192f7f59a50f981 100644 ---- a/gradle.properties -+++ b/gradle.properties -@@ -28,4 +28,5 @@ org.gradle.internal.http.connectionTimeout=100000 - android.enableR8.fullMode=false - archash=29c4199b83 - --upstreamBuild=25162 -\ No newline at end of file -+upstreamBuild=25256 -+versionType=bleeding-edge -\ No newline at end of file diff --git a/patches/client/0080-WIP.patch b/patches/client/0080-WIP.patch deleted file mode 100644 index e0cfada8500f..000000000000 --- a/patches/client/0080-WIP.patch +++ /dev/null @@ -1,182 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: way-zer -Date: Tue, 27 Aug 2024 17:34:34 +0800 -Subject: [PATCH] =?UTF-8?q?WIP=20=E6=95=B4=E7=90=86=E8=AE=BE=E7=BD=AE?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - ---- - core/assets/bundles/bundle-mdtx.properties | 68 ++++++++----------- - .../mindustry/ui/fragments/HudFragment.java | 2 +- - 2 files changed, 28 insertions(+), 42 deletions(-) - -diff --git a/core/assets/bundles/bundle-mdtx.properties b/core/assets/bundles/bundle-mdtx.properties -index 935b1f1cbeeff82fe9d1a6f4f8ee18a9e39e0a39..08e9e2eef3c2062010849d39659988b4fd05d260 100644 ---- a/core/assets/bundles/bundle-mdtx.properties -+++ b/core/assets/bundles/bundle-mdtx.properties -@@ -61,22 +61,36 @@ stat.ammo_capacity = 子弹容量 - #end StatExt - - # Settings --settings.category.mindustryX = MindustryX扩展 -+settings.category.mindustryX = [gold]MindustryX - setting.showUpdateDialog.name = 检测到新版MindustryX时提示 - setting.githubMirror.name = GitHub镜像加速(WZ镜像) [gray]优化全球服务器列表及Mod浏览器功能 -- --category.gameSettings.name = 游戏界面或操作 --setting.deadOverlay.name = 死亡时(观战)显示界面 --setting.invertMapClick.name = 反转小地图的左右键点击 -- --category.arcReWork.name = Arc功能重置 - setting.replayRecord.name = 多人游戏录像 [gray]自动录制游玩过程,输出在saves文件夹 --setting.menuFloatText.name = 首页悬浮文字 - setting.researchViewer.name = 科技树透视器 -+ -+category.gameUI.name = 游戏界面扩展 -+setting.menuFloatText.name = 首页悬浮文字 -+setting.deadOverlay.name = 死亡时(观战)仍然显示界面 -+setting.invertMapClick.name = 反转小地图的左右键点击 -+setting.arcSpecificTable.name = 学术信息显示(左上角) [orange][重启生效] -+setting.logicSupport.name = 逻辑辅助器 -+setting.powerStatistic.name = 电量统计 [orange][重启生效] -+setting.showQuickToolTable.name = 快捷工具(右中部) [gray]快捷设置/工具箱/建筑工具 -+setting.AuxiliaryTable.name = 辅助器 [orange][重启生效] -+setting.arccoreitems.name = 核心物资显示 [gray]点击电量条可快捷切换 -+setting.arcCoreItemsCol.name = 核心物资显示列数 -+setting.itemSelectionHeight.name = 建筑选择框(右下角)行数 -+setting.itemSelectionWidth.name = 建筑选择框(右下角)列数 -+setting.blockInventoryWidth.name = 建筑物品栏(分类器)每行物品数 -+setting.editorBrush.name = 编辑器界面每行建筑数 - setting.minimapSize.name = 小地图大小 --setting.maxSchematicSize.name = 最大蓝图大小 -+setting.maxSchematicSize.name = 最大选择框(蓝图)大小 -+setting.colorizedContent.name = [orange]彩[yellow]色[acid]属[cyan]性[violet]包 -+setting.arcBackgroundPath.name = 首页自定义背景-路径 -+setting.autoSelSchematic.name = 蓝图自动选择 [gray]打开蓝图时自动筛选 -+setting.arcCommandTable.name = RTS扩展按钮 - - category.blockSettings.name = 建筑相关设置 -+setting.rotateCanvas.name = 蓝图旋转时会旋转画板内容 [orange]可能导致崩溃,小心使用 - setting.staticShieldsBorder.name = 静止力墙边界 - setting.arcTurretPlaceCheck.name = [pink]炮台[white]:范围检查 - setting.arcchoiceuiIcon.name = [acid]装卸|分类[white]:显示物品图标 -@@ -91,10 +105,13 @@ setting.bulletShow.name = 显示子弹 - setting.showminebeam.name = 显示单位挖掘光束 - setting.noPlayerHitBox.name = 取消玩家自身的碰撞 [gray]轻微作弊 - setting.payloadpreview.name = 载荷单位拾起预览 -+setting.unithitbox.name = 显示单位碰撞箱 - - category.developerMode.name = 特殊设置 - setting.renderMerge.name = 顶点合并渲染 [grey]实验性功能,可以减少Draws总数 - setting.renderSort.name = 渲染排序 [grey]多图集(Mod较多)情况下能够提升50%渲染性能,但可能造成渲染错误 -+setting.limitupdate.name = 限制更新 -+setting.limitdst.name = 限制更新-额外范围 - #end Settings - - # editor增强 -@@ -367,76 +384,49 @@ rules.title.arcExperimental = 隐藏设置[red](实验性功能,可能影响 - rules.unitPayloadUpdate = [acid]单位携带的方块会工作 - rules.winWave = [acid]胜利波次 [gray](到达指定波次后自动停止) - schematic.preview = 预览 --setting.AuxiliaryTable.name = [acid]辅助器 [orange][重启生效] - setting.ShowInfoPopup.name = [acid]服务器信息版 - setting.allUnlocked.name = [cyan]显示所有内容(含隐藏) - setting.alwaysShowPlayerUnit.name = [cyan]强制显示[white]:玩家本体及带领的单位 - setting.alwaysShowUnitRTSAi.name = [acid]单位[white]:执行的RTS命令 - setting.alwaysshowdropzone.name = [cyan]刷怪点 - setting.arcAlwaysTeamColor.name = [acid]玩家列表[white]:总是绘制队伍颜色 --setting.arcBackgroundPath.name = [cyan]首页背景路径 - setting.arcBuildInfo.name = [cyan]建造范围 --setting.arcCommandTable.name = [acid]RTS辅助器 [lightgray]替代原版 --setting.arcCoreItemsCol.name = [acid]arc核心物资列数 --setting.arcDisableModWarning.name = [orange]我已知晓且同意学术端的mod使用原则 - setting.arcDrillProgress.name = [acid]钻头[white]:显示挖掘进度 [gray]只推荐mod下使用 - setting.arcSelfName.name = [acid]显示自身名字 - setting.arcShareWaveInfo.name = [acid]游戏信息交流[gray](标记物品) [red]请勿刷屏 --setting.arcSpecificTable.name = [acid]学术端特制界面 [orange][重启生效] - setting.arcTurretPlacementItem.name = [pink]炮台[white]:弹药射界 --setting.arccoreitems.name = [acid]arc核心物资 [gray]点击电量条 - setting.arcdrillmode.name = [acid]钻头[white]:常亮矿物 - setting.arclogicbordershow.name = [acid]显示屏与画板[white]:边框 [gray]关闭后多个显示屏会更好得拼接在一起 --setting.arcvol.name = [acid]音量[white]:学术音效 --setting.autoSelSchematic.name = [cyan]蓝图自动选择器 [orange]自动筛选包含选中物品的蓝图 - setting.blockBars.name = [acid]建筑属性 - setting.blockBars_mend.name = [acid]修复[white]:进度条 --setting.blockInventoryWidth.name = [cyan]建筑物品栏每行物品数 - setting.blockWeaponTargetLine.name = [acid]炮台[white]:瞄准线 - setting.blockWeaponTargetLineWhenIdle.name = [acid]炮台[white]:瞄准线(闲置) - setting.blockdisabled.name = [cyan]建筑禁用显示 - setting.chatValidType.name = [acid]聊天记录 --setting.colorizedContent.name = [orange]彩[yellow]色[acid]属[cyan]性[violet]包 --setting.developMode.name = [red]开发者模式 [orange]不完善|测试中的功能,普通用户请不要打开。欢迎提出修复方案 - setting.displayblock.name = [cyan]工厂方块 --setting.editorBrush.name = [acid]编辑器[white]:每行建筑数 - setting.fontSet.name = [cyan]字体设置! - setting.fontSize.name = [cyan]字体大小! - setting.forceConfigInventory.name = [acid]功能[white]:强制拿取资源 - setting.forceEnableDarkness.name = [cyan]墙体阴影显示 - setting.forceIgnoreAttack.name = [violet]战役[white]:忽视遭受攻击警告强行切换区块 - setting.hoveredTileInfo.name = [acid]显示鼠标指针地块/建筑名称 --setting.itemSelectionHeight.name = [cyan]建筑选择框行数 --setting.itemSelectionWidth.name = [cyan]建筑选择框列数 --setting.limitdst.name = [cyan]视角外更新范围 --setting.limitupdate.name = [cyan]限制更新 --setting.logicSupport.name = [acid]逻辑辅助器 - setting.logicoverrangelink.name = [red]超级逻辑链接 [yellow][仅限单机有效] - setting.mass_driver_line.name = 显示质驱引导线 - setting.mass_driver_line_color.name = [pink]质驱引导线[white]:颜色 - setting.mass_driver_line_interval.name = [acid]质驱引导线[white]:箭头间隔 - setting.mend_zone.name = [acid]修复范围[white]:不透明度 --setting.oneBlockProperty.name = [acid]复制单个建筑时展示属性 [orange]无需要不建议开启,会导致属性丢失 --setting.otherCheat.name = [red]其他作弊功能(游戏外) - setting.overrideSkipWave.name = [acid]功能[white]:忽视跳波限制 --setting.override_boss_shown.name = [cyan]boss血条 --setting.overridebuild.name = [cyan]强制覆盖建筑与墙体 [yellow][仅限单机有效] - setting.playerEffectColor.name = [acid]玩家射程[white]:颜色 - setting.playerEffectCurStroke.name = [acid]玩家射程[white]:粗细 - setting.playerNeedShooting.name = [red]时间管理大师 --setting.powerStatistic.name = [acid]电量统计 [orange][重启生效] --setting.quickHudSize.name = [acid]快捷视角 [gray]快捷切换视角,屏幕下侧 - setting.radarMode.name = [acid]雷达模式 - setting.radarSize.name = [acid]雷达大小 --setting.rotateCanvas.name = 蓝图旋转时会旋转画板内容 [orange]可能导致崩溃,小心使用 - setting.rtsWoundUnit.name = [acid]单位筛选[white]:残血阈值 - setting.save_more_map.name = [acid]保存战役与编辑器地图 --setting.selectTeam.name = [acid]显示[white]:[red]选择队伍框 [yellow][仅限单机有效] - setting.showFlyerSpawn.name = [cyan]空军刷怪点 - setting.showFlyerSpawnLine.name = [cyan]空军刷怪点连线 - setting.showOtherTeamResource.name = [acid]显示[white]:[red]所有队伍资源 [orange][PVP自动禁用] - setting.showOtherTeamState.name = [acid]显示[white]:[red]其他并可修改队伍状态 [orange][PVP自动禁用][yellow][修改仅限单机有效] --setting.showQuickToolTable.name = [acid]快捷工具 [gray]快捷聊天/设置与建筑相关 - setting.showTurretAmmo.name = [acid]炮台[white]:子弹类型 - setting.showTurretAmmoAmount.name = [acid]炮台[white]:子弹数量 - setting.superUnitEffect.name = [pink]玩家特效射程 -@@ -455,13 +445,9 @@ setting.unitWeaponRange.name = [acid]单位武器射程[white]:范围警告 - setting.unitWeaponRangeAlpha.name = [acid]单位武器射程[white]:不透明度 - setting.unitWeaponTargetLine.name = [acid]单位武器目标 - setting.unitbuildplan.name = [acid]单位[white]:建造序列显示 --setting.unithitbox.name = [acid]单位碰撞箱 - setting.worldCreator.name = [cyan]创世神 [gray]无视限制,可编辑地形 --settings.arc = [cyan]学术端! --settings.cheating = [red]作弊功能 --settings.forcehide = [orange]帧率重调装置 -+settings.arc = [cyan]学术端功能 - settings.maxMsgRecorded.name = 最大聊天记录数 --settings.specmode = [acid]更多内容适配 - shield.phaseboost = [stat]+{0}[lightgray] 格 [stat]+{1}[] 护盾容量 - shield.regenspeed = [stat]{0}[lightgray]x 回复速度 - team.neoplastic.name = 瘤 -diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java -index 729c0540440f9e5f632a5173b90740eb6163ae85..f6439cf1961be9380ff63fd2db8417759a209a5b 100644 ---- a/core/src/mindustry/ui/fragments/HudFragment.java -+++ b/core/src/mindustry/ui/fragments/HudFragment.java -@@ -410,7 +410,7 @@ public class HudFragment{ - } - return max == 0f ? 0f : val / max; - }).blink(Color.white).outline(new Color(0, 0, 0, 0.6f), 7f)).grow()) -- .fillX().width(320f).height(60f).name("boss").visible(() -> Core.settings.getBool("override_boss_shown") && state.rules.waves && state.boss() != null && !(mobile && Core.graphics.isPortrait())).padTop(7).row(); -+ .fillX().width(320f).height(60f).name("boss").visible(() -> state.rules.waves && state.boss() != null && !(mobile && Core.graphics.isPortrait())).padTop(7).row(); - - t.table(Styles.black3, p -> p.margin(4).label(() -> hudText).style(Styles.outlineLabel)).touchable(Touchable.disabled).with(p -> p.visible(() -> { - p.color.a = Mathf.lerpDelta(p.color.a, Mathf.num(showHudText), 0.2f); diff --git a/src/mindustryX/Hooks.java b/src/mindustryX/Hooks.java index 25c6b92e86ad..b0ba4fcc13ea 100644 --- a/src/mindustryX/Hooks.java +++ b/src/mindustryX/Hooks.java @@ -35,6 +35,7 @@ public void init(){ TimeControl.init(); UIExt.init(); ReplayController.init(); + ArcOld.colorizeContent(); } } diff --git a/src/mindustryX/loader/DesktopImpl.java b/src/mindustryX/loader/DesktopImpl.java index 436debef1409..0b334e339e8c 100644 --- a/src/mindustryX/loader/DesktopImpl.java +++ b/src/mindustryX/loader/DesktopImpl.java @@ -108,9 +108,8 @@ private Boolean overwrite(String name){ @Override public URL getResource(String name){ - if(name.equals("MindustryX.hjson")) - return findResource("mod.hjson"); - if(name.equals("mod.hjson") || name.equals("icon.png")) return null; + if(name.equals("version.properties")) + return parent.getResource(name); //self first URL url = findResource(name); if(url == null)