diff --git a/assets/bundles/bundle-mdtx.properties b/assets/bundles/bundle-mdtx.properties index a141eb366449..68ef225a5290 100644 --- a/assets/bundles/bundle-mdtx.properties +++ b/assets/bundles/bundle-mdtx.properties @@ -103,6 +103,7 @@ settingV2.entityRender.payloadPreview.name = 载荷拾起预览 settingV2.gameUI.category = 游戏界面 settingV2.gameUI.spawnerWaveDisplay.name = 出生点波次信息显示 settingV2.gameUI.transportScan.name = 物流扫描模式 +settingV2.gameUI.mouseInfo.name = 显示鼠标坐标与距离 settingV2.gameUI.menuFloatText.name = 首页浮动标语 settingV2.gameUI.announceRtsTake.name = 当其他人分走当前控制的单位时,消息提示 settingV2.gameUI.deadOverlay.name = 死亡时(观战)仍然显示界面 [orange]可能闪退 diff --git a/assets/bundles/bundle-mdtx_en.properties b/assets/bundles/bundle-mdtx_en.properties index 3270152260fc..7b2ab2d1ba84 100644 --- a/assets/bundles/bundle-mdtx_en.properties +++ b/assets/bundles/bundle-mdtx_en.properties @@ -103,6 +103,7 @@ settingV2.entityRender.payloadPreview.name = Payload Pickup Preview settingV2.gameUI.category = Game UI settingV2.gameUI.spawnerWaveDisplay.name = Spawn Point Wave Info Display settingV2.gameUI.transportScan.name = Transport Scan Mode +settingV2.gameUI.mouseInfo.name = Display Mouse Info settingV2.gameUI.menuFloatText.name = Home Floating Text settingV2.gameUI.announceRtsTake.name = Notify When Controlled Unit Taken by Others settingV2.gameUI.deadOverlay.name = Show UI While Dead/Spectating [orange]May Crash diff --git a/patches/client/0011-HR-RenderExt.patch b/patches/client/0011-HR-RenderExt.patch index 334a324339eb..c89c5cbc6dd3 100644 --- a/patches/client/0011-HR-RenderExt.patch +++ b/patches/client/0011-HR-RenderExt.patch @@ -4,10 +4,11 @@ Date: Tue, 26 Mar 2024 19:22:00 +0800 Subject: [PATCH] HR: RenderExt --- - core/src/mindustry/core/Renderer.java | 3 ++- - core/src/mindustry/graphics/BlockRenderer.java | 3 ++- - core/src/mindustry/input/InputHandler.java | 5 +++++ - 3 files changed, 9 insertions(+), 2 deletions(-) + core/src/mindustry/core/Renderer.java | 3 ++- + core/src/mindustry/graphics/BlockRenderer.java | 3 ++- + core/src/mindustry/graphics/OverlayRenderer.java | 3 ++- + core/src/mindustry/input/InputHandler.java | 5 +++++ + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 389684d7bb658688334d062df2cd3d9d7685ecf9..f25585b53208318e2b09c227e94915bf291b941e 100644 @@ -51,6 +52,27 @@ index 71a14625763ba9069026e2f9e550eeb3e662cd15..6be6990e8bb84aeead0db7866ce58e87 Draw.reset(); Draw.z(Layer.block); +diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java +index 0795b6a38f43c33ae3fae877f1ae54dd79ea0949..9d1f4b1ebf944b4dac80b78954ff0719669fb1ed 100644 +--- a/core/src/mindustry/graphics/OverlayRenderer.java ++++ b/core/src/mindustry/graphics/OverlayRenderer.java +@@ -17,6 +17,7 @@ import mindustry.gen.*; + import mindustry.input.*; + import mindustry.world.*; + import mindustry.world.blocks.storage.CoreBlock.*; ++import mindustryX.features.*; + + import static mindustry.Vars.*; + +@@ -217,7 +218,7 @@ public class OverlayRenderer{ + Building build = world.buildWorld(vec.x, vec.y); + + if(build != null && build.team == player.team()){ +- build.drawSelect(); ++ RenderExt.onDrawSelect(build); + if(!build.enabled && build.block.drawDisabled){ + build.drawDisabled(); + } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 5bc3c64a44247b45c77020bd8ba4a2bfddbc8ea8..b4b3ce4c5e021f9100bf59400fe9ea137b2b31c7 100644 --- a/core/src/mindustry/input/InputHandler.java diff --git a/patches/client/0016-HR-RenderExt-logicDisplayNoBorder-arcDrillMode.patch b/patches/client/0016-HR-RenderExt-logicDisplayNoBorder-arcDrillMode.patch index 7b1b11b38f22..71951feed632 100644 --- a/patches/client/0016-HR-RenderExt-logicDisplayNoBorder-arcDrillMode.patch +++ b/patches/client/0016-HR-RenderExt-logicDisplayNoBorder-arcDrillMode.patch @@ -10,8 +10,8 @@ Content-Transfer-Encoding: 8bit --- core/src/mindustry/world/blocks/logic/LogicDisplay.java | 7 ++++++- - core/src/mindustry/world/blocks/production/Drill.java | 2 ++ - 2 files changed, 8 insertions(+), 1 deletion(-) + core/src/mindustry/world/blocks/production/Drill.java | 1 + + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/logic/LogicDisplay.java b/core/src/mindustry/world/blocks/logic/LogicDisplay.java index 7f42ece8bcd770e96f97b59b972bf3e5efdab6fe..d204f8e8374bc52250261f435db760d4fe30b61a 100644 @@ -46,7 +46,7 @@ index 7f42ece8bcd770e96f97b59b972bf3e5efdab6fe..d204f8e8374bc52250261f435db760d4 } }); diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java -index cc123b120a6e8f92719bded067915749afbf19d5..55c523bc651db449f51b1864aff33103d9ee0d73 100644 +index cc123b120a6e8f92719bded067915749afbf19d5..060fe7e067d6b60b59e40e9b140983010b5eaed7 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -21,6 +21,7 @@ import mindustry.world.*; @@ -57,11 +57,3 @@ index cc123b120a6e8f92719bded067915749afbf19d5..55c523bc651db449f51b1864aff33103 import static mindustry.Vars.*; -@@ -260,6 +261,7 @@ public class Drill extends Block{ - - @Override - public void drawSelect(){ -+ if(RenderExt.arcDrillMode) return; - drawItemSelection(dominantItem); - } - diff --git a/patches/client/0026-FR-RenderExt-deadOverlay.patch b/patches/client/0026-FR-RenderExt-deadOverlay.patch index f58464544a2c..caa9d106e483 100644 --- a/patches/client/0026-FR-RenderExt-deadOverlay.patch +++ b/patches/client/0026-FR-RenderExt-deadOverlay.patch @@ -10,10 +10,10 @@ Subject: [PATCH] FR(RenderExt) deadOverlay 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java -index 0795b6a38f43c33ae3fae877f1ae54dd79ea0949..2033e20b8e66a248530f64be11995341e917687e 100644 +index 9d1f4b1ebf944b4dac80b78954ff0719669fb1ed..a40c3fbea2c69e39d417e2c01b1a6ba92ebb8a8c 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java -@@ -79,7 +79,7 @@ public class OverlayRenderer{ +@@ -80,7 +80,7 @@ public class OverlayRenderer{ input.drawOtherBuildPlans(); } @@ -22,7 +22,7 @@ index 0795b6a38f43c33ae3fae877f1ae54dd79ea0949..2033e20b8e66a248530f64be11995341 if(player.isBuilder()){ input.drawBuildPlans(); -@@ -156,10 +156,10 @@ public class OverlayRenderer{ +@@ -157,10 +157,10 @@ public class OverlayRenderer{ tile.drawConfigure(); } diff --git a/patches/client/0057-FR-ARC-drawPlace-and-drawSelect.patch b/patches/client/0057-FR-ARC-drawPlace-and-drawSelect.patch index f0da834decc1..ee3f10dac80f 100644 --- a/patches/client/0057-FR-ARC-drawPlace-and-drawSelect.patch +++ b/patches/client/0057-FR-ARC-drawPlace-and-drawSelect.patch @@ -4,18 +4,18 @@ Date: Sun, 18 Feb 2024 15:57:51 +0800 Subject: [PATCH] FR: ARC drawPlace and drawSelect --- - .../world/blocks/ConstructBlock.java | 42 ++++++++++++++++++- - .../world/blocks/defense/ForceProjector.java | 2 + - .../world/blocks/defense/MendProjector.java | 5 ++- - .../blocks/defense/OverdriveProjector.java | 5 +++ - .../world/blocks/defense/turrets/Turret.java | 19 +++++++++ - .../world/blocks/production/BeamDrill.java | 12 ++---- - .../world/blocks/production/Drill.java | 23 ++++++---- + .../world/blocks/ConstructBlock.java | 7 ++++-- + .../world/blocks/defense/ForceProjector.java | 2 ++ + .../world/blocks/defense/MendProjector.java | 5 +++- + .../blocks/defense/OverdriveProjector.java | 5 ++++ + .../world/blocks/defense/turrets/Turret.java | 8 +++++++ + .../world/blocks/production/BeamDrill.java | 12 ++++------ + .../world/blocks/production/Drill.java | 23 +++++++++++++------ .../world/blocks/storage/CoreBlock.java | 1 + - 8 files changed, 91 insertions(+), 18 deletions(-) + 8 files changed, 45 insertions(+), 18 deletions(-) diff --git a/core/src/mindustry/world/blocks/ConstructBlock.java b/core/src/mindustry/world/blocks/ConstructBlock.java -index 711d6c971c9d4df19203d42449a95adf895c30bf..b93cf1e7b4309789953d91bb29e1f707d060a9d3 100644 +index 711d6c971c9d4df19203d42449a95adf895c30bf..943e8626a1fab97f5047b1dd3953c7c69a6ae57e 100644 --- a/core/src/mindustry/world/blocks/ConstructBlock.java +++ b/core/src/mindustry/world/blocks/ConstructBlock.java @@ -3,14 +3,17 @@ package mindustry.world.blocks; @@ -36,15 +36,7 @@ index 711d6c971c9d4df19203d42449a95adf895c30bf..b93cf1e7b4309789953d91bb29e1f707 import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; -@@ -23,6 +26,7 @@ import mindustry.world.*; - import mindustry.world.blocks.environment.*; - import mindustry.world.blocks.storage.CoreBlock.*; - import mindustry.world.modules.*; -+import mindustryX.features.func.*; - - import java.util.*; - -@@ -132,7 +136,7 @@ public class ConstructBlock extends Block{ +@@ -132,7 +135,7 @@ public class ConstructBlock extends Block{ static float calcPitch(boolean up){ if(Time.timeSinceMillis(lastTime) < 16 * 30){ lastTime = Time.millis(); @@ -53,48 +45,7 @@ index 711d6c971c9d4df19203d42449a95adf895c30bf..b93cf1e7b4309789953d91bb29e1f707 if(pitchSeq > 30){ pitchSeq = 0; } -@@ -179,6 +183,40 @@ public class ConstructBlock extends Block{ - private @Nullable float[] totalAccumulator; - private @Nullable int[] itemsLeft; - -+ @Override -+ public void drawSelect(){ -+ if(team.core() == null){ -+ return; -+ } -+ -+ // BlockUnit之上 -+ Draw.z(Layer.flyingUnit + 0.1f); -+ -+ float scl = block.size / 4f; -+ float buildHitSize = hitSize(); -+ -+ // 显示建造进度 -+ var pos = Tmp.v1.set(this).add(0, buildHitSize / 2f);//顶部 -+ FuncX.drawText(pos, Strings.fixed(progress * 100, 2) + "%", scl, Pal.accent, Align.bottom); -+ -+ // 显示物品需求 -+ StringBuilder requirements = new StringBuilder(); -+ for(int i = 0; i < current.requirements.length; i++){ -+ ItemStack stack = current.requirements[i]; -+ float consumeAmount = state.rules.buildCostMultiplier * stack.amount; -+ int coreAmount = team.core().items.get(stack.item); -+ -+ int investItem = (int)(progress * consumeAmount); -+ int needItem = (int)(consumeAmount) - investItem; -+ boolean hasItem = coreAmount >= needItem; -+ -+ if(i != 0) requirements.append('\n'); -+ requirements.append(stack.item.emoji()).append(hasItem ? "[#ffd37f]" : "[#e55454]").append(investItem).append("/").append(needItem).append("/").append(UI.formatAmount(coreAmount)).append("[]"); -+ } -+ pos.set(this).add(-buildHitSize / 2f, -buildHitSize / 2f);//左下角 -+ FuncX.drawText(pos, requirements.toString(), scl, Color.white, Align.topLeft); -+ } -+ - @Override - public String getDisplayName(){ - return Core.bundle.format("block.constructing", current.localizedName); -@@ -268,7 +306,7 @@ public class ConstructBlock extends Block{ +@@ -268,7 +271,7 @@ public class ConstructBlock extends Block{ Draw.rect(region, x, y, current.rotate && (noOverrides || current.regionRotated2 == i || current.regionRotated1 == i) ? rotdeg() + current.visualRotationOffset : 0); Draw.flush(); @@ -170,7 +121,7 @@ index 57d8b4ac27635c65154d9c1863001f3df84109d3..890d9444e6c670207929cd63f1b624c3 indexer.eachBlock(player.team(), x * tilesize + offset, y * tilesize + offset, range, other -> other.block.canOverdrive, other -> Drawf.selected(other, Tmp.c1.set(baseColor).a(Mathf.absin(4f, 1f)))); } diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java -index b38f7560fa04aeb0b416d285e4da43ee3c6e3250..ef1a7afdb810686fd09c98f51d54c3cbca6bb0fd 100644 +index b38f7560fa04aeb0b416d285e4da43ee3c6e3250..e34eabaf4d091179f0c873ae5b4e9784ba8fe4df 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -31,6 +31,7 @@ import mindustry.world.*; @@ -195,24 +146,6 @@ index b38f7560fa04aeb0b416d285e4da43ee3c6e3250..ef1a7afdb810686fd09c98f51d54c3cb } public static abstract class AmmoEntry{ -@@ -485,6 +493,17 @@ public class Turret extends ReloadTurret{ - if(drawMinRange){ - Drawf.dashCircle(x, y, minRange(), team.color); - } -+ -+ //ARC: show shoot target line -+ if(ArcBuilds.blockWeaponTargetLine && !targetPos.isZero() && dst(targetPos) < range * 5){ -+ Lines.stroke(1f); -+ Lines.dashLine(x, y, targetPos.x, targetPos.y, (int)(Mathf.len(targetPos.x - x, targetPos.y - y) / 8)); -+ Lines.dashCircle(targetPos.x, targetPos.y, 8); -+ Draw.reset(); -+ } -+ if(mindustryX.VarsX.arcTurretShowAmmoRange.get()){ -+ ArcBuilds.turretSelectDraw(this); -+ } - } - - @Override diff --git a/core/src/mindustry/world/blocks/production/BeamDrill.java b/core/src/mindustry/world/blocks/production/BeamDrill.java index 839b23a763a157631db88137c2fc59e54e112abd..4e5018ffc79fbdf2f7d5b4e10acfae10e258ad2c 100644 --- a/core/src/mindustry/world/blocks/production/BeamDrill.java @@ -237,7 +170,7 @@ index 839b23a763a157631db88137c2fc59e54e112abd..4e5018ffc79fbdf2f7d5b4e10acfae10 drawPlaceText(Core.bundle.get("bar.drilltierreq"), x, y, false); } diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java -index 55c523bc651db449f51b1864aff33103d9ee0d73..6c9533ad625544becf6c31c24b81fb4b9125423c 100644 +index 060fe7e067d6b60b59e40e9b140983010b5eaed7..409bf59efb6e32df64b609bfaf91ebc61ece31c6 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -147,12 +147,13 @@ public class Drill extends Block{ diff --git a/patches/client/0058-ARC-merged.patch b/patches/client/0058-ARC-merged.patch index 4bcb19d4a4aa..4029c90707a0 100644 --- a/patches/client/0058-ARC-merged.patch +++ b/patches/client/0058-ARC-merged.patch @@ -99,7 +99,7 @@ way-zer on 2024/9/8 .../mindustry/entities/comp/StatusComp.java | 3 + core/src/mindustry/game/Schematic.java | 104 +++++++++ .../src/mindustry/graphics/BlockRenderer.java | 15 +- - .../mindustry/graphics/OverlayRenderer.java | 36 +++- + .../mindustry/graphics/OverlayRenderer.java | 35 +++- core/src/mindustry/input/DesktopInput.java | 12 +- core/src/mindustry/input/InputHandler.java | 47 ++++- core/src/mindustry/input/MobileInput.java | 6 +- @@ -120,7 +120,7 @@ way-zer on 2024/9/8 .../mindustry/ui/fragments/MenuFragment.java | 24 ++- .../ui/fragments/PlacementFragment.java | 164 ++++++++++++--- .../ui/fragments/PlayerListFragment.java | 68 +++--- - 27 files changed, 917 insertions(+), 135 deletions(-) + 27 files changed, 916 insertions(+), 135 deletions(-) diff --git a/core/src/mindustry/editor/MapInfoDialog.java b/core/src/mindustry/editor/MapInfoDialog.java index 1ee294233bdeccd9b03a24f7cff65a1d19417b77..5c76cc56cbbb4ba3a6783f864036bd93cab3cc90 100644 @@ -426,18 +426,10 @@ index 4891a81b790296258ac86ff4bfeb789e6fb92a6f..ebc8bee032dab5240eb8049f8890e8b9 } } diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java -index 2033e20b8e66a248530f64be11995341e917687e..6bdcddbaa6065546a019f95dff96f1f8fa23e4cc 100644 +index a40c3fbea2c69e39d417e2c01b1a6ba92ebb8a8c..4e127fe429df9c29e15572daadedc32501bda33b 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java -@@ -17,6 +17,7 @@ import mindustry.gen.*; - import mindustry.input.*; - import mindustry.world.*; - import mindustry.world.blocks.storage.CoreBlock.*; -+import mindustryX.features.*; - - import static mindustry.Vars.*; - -@@ -188,9 +189,18 @@ public class OverlayRenderer{ +@@ -189,9 +189,18 @@ public class OverlayRenderer{ //it must be clear that there is a core here. float br = state.rules.buildRadius(core.team); if(/*core.wasVisible && */br > 0f && Core.camera.bounds(Tmp.r1).overlaps(Tmp.r2.setCentered(core.x, core.y, br * 2f))){ @@ -459,14 +451,14 @@ index 2033e20b8e66a248530f64be11995341e917687e..6bdcddbaa6065546a019f95dff96f1f8 Lines.circle(core.x, core.y, br); } }); -@@ -216,12 +226,14 @@ public class OverlayRenderer{ +@@ -217,12 +226,14 @@ public class OverlayRenderer{ Vec2 vec = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); Building build = world.buildWorld(vec.x, vec.y); - if(build != null && build.team == player.team()){ + //if(build != null && build.team == player.team()){ + if(build != null){ - build.drawSelect(); + RenderExt.onDrawSelect(build); if(!build.enabled && build.block.drawDisabled){ build.drawDisabled(); } @@ -476,7 +468,7 @@ index 2033e20b8e66a248530f64be11995341e917687e..6bdcddbaa6065546a019f95dff96f1f8 if(Core.input.keyDown(Binding.rotatePlaced) && build.block.rotate && build.block.quickRotate && build.interactable(player.team())){ control.input.drawArrow(build.block, build.tileX(), build.tileY(), build.rotation, true); Draw.color(Pal.accent, 0.3f + Mathf.absin(4f, 0.2f)); -@@ -233,12 +245,22 @@ public class OverlayRenderer{ +@@ -234,12 +245,22 @@ public class OverlayRenderer{ input.drawOverSelect(); @@ -499,7 +491,7 @@ index 2033e20b8e66a248530f64be11995341e917687e..6bdcddbaa6065546a019f95dff96f1f8 } //draw selection overlay when dropping item -@@ -267,6 +289,10 @@ public class OverlayRenderer{ +@@ -268,6 +289,10 @@ public class OverlayRenderer{ } } } diff --git a/src/mindustryX/features/NewTransferScanMode.kt b/src/mindustryX/features/NewTransferScanMode.kt index 8494d74c59fd..6603ba5af415 100644 --- a/src/mindustryX/features/NewTransferScanMode.kt +++ b/src/mindustryX/features/NewTransferScanMode.kt @@ -56,16 +56,6 @@ object NewTransferScanMode { * Main entry point - rendering function */ fun draw() { - Draw.z(Layer.overlayUI + 0.01f) - - val pos = Core.input.mouseWorld() - val text = VarsX.bundle.coordinateDistance( - (pos.x / tilesize).toInt(), - (pos.y / tilesize).toInt(), - (player.dst(pos) / tilesize).toInt() - ) - drawText(pos, text) - Draw.z(Layer.overlayUI) // 获取鼠标悬停的建筑 val build = world.tileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y)?.build ?: return diff --git a/src/mindustryX/features/RenderExt.java b/src/mindustryX/features/RenderExt.java index 27209587f48e..9d8acb16b19e 100644 --- a/src/mindustryX/features/RenderExt.java +++ b/src/mindustryX/features/RenderExt.java @@ -15,10 +15,13 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.turrets.*; import mindustry.world.blocks.defense.turrets.BaseTurret.*; +import mindustry.world.blocks.defense.turrets.Turret.*; import mindustry.world.blocks.distribution.MassDriver.*; import mindustry.world.blocks.logic.*; import mindustry.world.blocks.logic.MessageBlock.*; @@ -34,6 +37,7 @@ import static mindustry.Vars.*; import static mindustryX.features.UIExt.i; +import static mindustryX.features.func.FuncX.drawText; public class RenderExt{ public static boolean displayAllMessage; @@ -63,6 +67,7 @@ public class RenderExt{ public static final SettingsV2.CheckPref spawnerWaveDisplay = new CheckPref("gameUI.spawnerWaveDisplay", true); public static final SettingsV2.CheckPref transportScan = new CheckPref("gameUI.transportScan"); + public static final SettingsV2.CheckPref mouseInfo = new CheckPref("gameUI.mouseInfo"); public static final SettingsV2.CheckPref announceRtsTake = new CheckPref("gameUI.announceRtsTake", true); public static final SettingsV2.CheckPref deadOverlay = new CheckPref("gameUI.deadOverlay"); @@ -76,7 +81,6 @@ public class RenderExt{ public static final SettingsV2.CheckPref showOtherTeamState = new CheckPref("block.showOtherTeamState"); public static final SettingsV2.CheckPref logicDisplayNoBorder0 = new CheckPref("block.logicDisplayNoBorder"); - static{ if(headless) throw new RuntimeException("RenderExt should not access in Headless"); noBulletShow.addFallback("bulletShow", (Boolean it) -> !it); @@ -168,6 +172,7 @@ private static void draw(){ ArcRadar.draw(); if(payloadPreview.get()) PayloadDropHint.draw(player); if(transportScan.get()) NewTransferScanMode.INSTANCE.draw(); + if(mouseInfo.get()) drawMouseInfo(); } public static void onGroupDraw(Drawc t){ @@ -208,6 +213,21 @@ public static void onBlockDraw(Tile tile, Block block, @Nullable Building build) } } + public static void onDrawSelect(Building build){ + if(arcDrillMode && build instanceof DrillBuild) return; + build.drawSelect(); + + if(build instanceof TurretBuild turretBuild){ + Draw.z(Layer.turret + 0.1f); + drawTurretSelect(turretBuild); + } + if(build instanceof ConstructBuild constructBuild){ + // BlockUnit之上 + Draw.z(Layer.flyingUnit + 0.1f); + ConstructSelect.draw(constructBuild); + } + } + private static void placementEffect(float x, float y, float lifetime, float range, Color color){ placementEffect.lifetime = lifetime; placementEffect.at(x, y, range, color); @@ -311,6 +331,17 @@ private static void drawBar(Building build, Color bg, Color fg, Float ratio){ Draw.reset(); } + private static void drawMouseInfo(){ + Draw.z(Layer.overlayUI); + Vec2 pos = Core.input.mouseWorld(); + String text = VarsX.bundle.coordinateDistance( + (int)(pos.x / tilesize), + (int)(pos.y / tilesize), + (int)(player.dst(pos) / tilesize) + ); + drawText(pos, text); + } + static ObjectMap> removePool = new ObjectMap<>(); public static void onRtsRemoveUnit(Player player, Unit unit){ @@ -335,4 +366,21 @@ public static void onRtsRemoveUnit(Player player, Unit unit){ UIExt.announce(builder.toString()); }); } + + public static void drawTurretSelect(TurretBuild turretBuild){ + Vec2 targetPos = turretBuild.targetPos; + + Turret turret = (Turret)turretBuild.block; + + //ARC: show shoot target line + if(ArcBuilds.blockWeaponTargetLine && !targetPos.isZero() && turretBuild.dst(targetPos) < turret.range * 5){ + Lines.stroke(1f); + Lines.dashLine(turretBuild.x, turretBuild.y, targetPos.x, targetPos.y, (int)(turretBuild.dst(targetPos) / 8)); + Lines.dashCircle(targetPos.x, targetPos.y, 8); + Draw.reset(); + } + if(mindustryX.VarsX.arcTurretShowAmmoRange.get()){ + ArcBuilds.turretSelectDraw(turretBuild); + } + } } diff --git a/src/mindustryX/features/draw/ConstructSelect.java b/src/mindustryX/features/draw/ConstructSelect.java new file mode 100644 index 000000000000..85ad4c94307e --- /dev/null +++ b/src/mindustryX/features/draw/ConstructSelect.java @@ -0,0 +1,82 @@ +package mindustryX.features.draw; + +import arc.*; +import arc.graphics.*; +import arc.math.*; +import arc.util.*; +import mindustry.core.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.ConstructBlock.*; +import mindustryX.features.func.*; + +import static mindustry.Vars.state; + +public class ConstructSelect{ + private static final int samplePeriod = 10; + private static final Interval timer = new Interval(); + + private static final float alpha = 0.5f; + private static float smoothSpeed = 0f; + + private static float lastFrameId; + private static float lastProgress; + + public static void draw(ConstructBuild constructBuild){ + if(constructBuild.team.core() == null){ + return; + } + + float frameId = Core.graphics.getFrameId(); + if(frameId - lastFrameId > 1){ + smoothSpeed = 0f; + timer.clear(); + } + lastFrameId = frameId; + + float scl = constructBuild.block.size / 4f; + float buildHitSize = constructBuild.hitSize(); + + Block current = constructBuild.current; + float progress = constructBuild.progress; + + // 显示建造进度 + var pos = Tmp.v1.set(constructBuild).add(0, buildHitSize / 2f);//顶部 + + if(!state.isPaused()){ + float passTime = timer.getTime(0); + if(timer.get(samplePeriod)){ + float rawSpeed = (progress - lastProgress) / passTime; + smoothSpeed = Mathf.lerp(smoothSpeed, rawSpeed, alpha); + lastProgress = progress; + } + } + float speed = smoothSpeed; + + String timeStr = ""; + if(!Mathf.zero(speed)){ + float leftTicks = (speed > 0 ? 1 - progress : progress) / Math.abs(speed); + timeStr = leftTicks < 600 ? "(" + Strings.autoFixed(leftTicks / 60, 1) + "s" + ")" + : "(" + UI.formatTime(leftTicks) + ")"; + } + FuncX.drawText(pos, Strings.fixed(progress * 100, 2) + "%" + timeStr, scl, Pal.accent, Align.bottom); + + // 显示物品需求 + StringBuilder requirements = new StringBuilder(); + for(int i = 0; i < current.requirements.length; i++){ + ItemStack stack = current.requirements[i]; + float consumeAmount = state.rules.buildCostMultiplier * stack.amount; + int coreAmount = constructBuild.team.core().items.get(stack.item); + + int investItem = (int)(progress * consumeAmount); + int needItem = (int)(consumeAmount) - investItem; + boolean hasItem = coreAmount >= needItem; + + if(i != 0) requirements.append('\n'); + requirements.append(stack.item.emoji()).append(hasItem ? "[#ffd37f]" : "[#e55454]").append(investItem).append("/").append(needItem).append("/").append(UI.formatAmount(coreAmount)).append("[]"); + } + pos.set(constructBuild).add(-buildHitSize / 2f, -buildHitSize / 2f);//左下角 + FuncX.drawText(pos, requirements.toString(), scl, Color.white, Align.topLeft); + } +} \ No newline at end of file diff --git a/src/mindustryX/features/ui/NewCoreItemsDisplay.java b/src/mindustryX/features/ui/NewCoreItemsDisplay.java index b7983d317e8c..7347a008c749 100644 --- a/src/mindustryX/features/ui/NewCoreItemsDisplay.java +++ b/src/mindustryX/features/ui/NewCoreItemsDisplay.java @@ -13,6 +13,7 @@ import mindustry.core.*; import mindustry.entities.*; import mindustry.entities.units.*; +import mindustry.game.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -265,6 +266,12 @@ private void rebuildPlans(){ if(block == null || block instanceof CoreBlock) continue; + // BuilderComp#updateBuildLogic + Tile tile = plan.tile(); + if(tile == null || tile.team() == Team.derelict && tile.block() == block && tile.build != null && tile.block().allowDerelictRepair && state.rules.derelictRepair){ + continue; + } + if(plan.build() instanceof ConstructBuild build){ block = build.current; }