From 9ba671bf58d5ab20df7f66548d10ac8ec9ff667c Mon Sep 17 00:00:00 2001 From: RushieWashie <57391931+JiroCab@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:46:23 +0800 Subject: [PATCH 1/3] powered by caramel macchiato - Version check now only checks v7 updates and ignore updates for v8 (will break prev version's update check) - Fixed tracking stopping if the local player has no core - domination: added power bar, showing highest power data of a team - blockinfo: cleaned up power stats are displayed - hpbars: made diamond semi transparent - added an advance rule to allow kill switch turn the mod on if disabled - Team Filters (all) Moved `all`, `clear` & `defaults` buttons to edit to avoid miss clicks and unclickable buttons on mobile - Tracking: improved when tracking ends ie stopping when touched on mobile & mini map pan --- assets/bundles/bundle.properties | 12 +- mod.hjson | 4 +- src/casterui/CuiVars.java | 37 ++-- src/casterui/io/CuiInputs.java | 60 +++--- src/casterui/io/ui/BarHelper.java | 108 +++++++++++ src/casterui/io/ui/CuiFragment.java | 176 +++++++++++++----- src/casterui/io/ui/CuiWorldRenderer.java | 8 +- .../io/ui/dialog/CuiSettingsDialog.java | 12 +- .../io/ui/dialog/TeamBlackListerDialog.java | 46 ++--- src/casterui/util/CuiUpdateChecker.java | 15 +- 10 files changed, 341 insertions(+), 137 deletions(-) create mode 100644 src/casterui/io/ui/BarHelper.java diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 43e3703..705258e 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -27,6 +27,12 @@ setting.cui-useCycleFilter.name =Hide Cursor of ignored players setting.cui-useCycleFilter.description =Same as`Filter Teams (Cycle player)` setting.cui-cyclePlayersIgnoreNoCore.name =Cycle Players ignores players w/o cores setting.cui-cyclePlayersIgnoreNoCore.description =Useful for cases where a team losses their core +setting.cui-trackOnLostFocus.name =Track in background +setting.cui-trackOnLostFocus.description =Whether tracking continues if you click off the window +setting.cui-trackwhileChatting.name =Track while Typing +setting.cui-trackwhileChatting.description =Whether tracking continues if you're typing in a text box +setting.cui-trackwhileMap.name =Track while Map is open +setting.cui-trackwhileDialog.name =Track with any Dialog is open setting.cui-counter-category.name =Counters options setting.cui-ShowPlayerList.name =Mini Player Table @@ -76,7 +82,7 @@ setting.cui-alertStyle.description =Default: Circle setting.cui-AlertsUseBottom.name =Bottom Toasts alerts setting.cui-AlertsHideWithUi.name =Custom Toasts setting.cui-AlertsHideWithUi.description =Whether to use custom toast or built in ones \nreduces conflict with world logic toasts -setting.cui-SendChatCoreLost.name =Send a CHAT message on a Core's Death +setting.cui-SendChatCoreLost.name =Send CHAT message on a Core's Death setting.cui-ShowAlertsCircles.name =Draw a Circle on a Core's Death setting.cui-alertCircleSpeed.name =Alert Grow speed: setting.cui-alertCircleSpeed.description =Do note that this is constant and doesn't scale with map size\nWon't matter much unless Reverse Growth is enabled\nDefault: 6.0x @@ -127,6 +133,7 @@ setting.cui-blockinfoSide.name =Block Info Side: setting.cui-blockinfoSide.description =Default: Left\nApplies next map change / Ui rebuilt setting.cui-blockinfo-x.name =Block Info X Offset: setting.cui-blockinfo-y.name =Block Info Y Offset: +setting.cui-blockinfo-colour.name =Block info Team colour background setting.cui-domination-toggle.name =[accent]Show Block Counter setting.cui-domination-vertical.name =Vertical Block Counter setting.cui-domination-TeamIcons.name =Show Team Icons @@ -160,6 +167,7 @@ setting.cui-animateSettings.name =Animate settings category setting.cui-TeamItemsUpdateRate.name =Team Items Update rate setting.cui-TeamItemsUpdateRate.description =Default: Normal, \nFast to use every tick, \nNormal to update every (update speed * 2)~\nSlow to update every (update speed * 5)~ setting.cui-updateAvailable = Cui {0} is out! kindly update the mod thx +setting.cui-killswitchEnables.name =Kill switch also turns mod on setting.cui-teams-category.name =Team options setting.cui-ShowTeamItems.name =[accent]Display Team items @@ -315,4 +323,4 @@ cui-cmd-limits3 =ALL units cui-filter0 =Domination cui-filter1 =Units cui-filter2 =Core Items -cui-filter3 =Cycle players +cui-filter3 =Cycle players \ No newline at end of file diff --git a/mod.hjson b/mod.hjson index 85d2f23..ad9767a 100644 --- a/mod.hjson +++ b/mod.hjson @@ -2,8 +2,8 @@ name: "caster-ui-java" displayName: "Caster User interface" description: "Aming to make the client a bit better for casting! with ease of use, simplicity and elegance in mind \n \n Java rewrite of 'JiroCab/Caster-Ui' which was based off 'Ferlern/extended-UI' \nconflicts with 'Ferlern/extended-UI' \n\nPLEASE DON'T THIS FOR AN ADVANTAGE IN PVP THANKS" author: "RushieWashie, WMF Industries" -subtitle: "v4.9 Helping you cast games~" -version: 4.9 +subtitle: "v5.1 (v7) Helping you cast games~" +version: 5.1 minGameVersion: 140.4 hidden: true diff --git a/src/casterui/CuiVars.java b/src/casterui/CuiVars.java index 0ae4533..39a99ac 100644 --- a/src/casterui/CuiVars.java +++ b/src/casterui/CuiVars.java @@ -1,32 +1,27 @@ package casterui; -import arc.Core; -import arc.Graphics; -import arc.graphics.Pixmap; -import arc.graphics.Pixmaps; +import arc.*; +import arc.graphics.*; import arc.math.geom.*; import arc.scene.ui.layout.*; -import arc.struct.*; import arc.util.*; -import casterui.io.CuiInputs; -import casterui.io.ui.CuiFragment; -import casterui.io.ui.CuiWorldRenderer; +import casterui.io.*; +import casterui.io.ui.*; import casterui.io.ui.dialog.*; import casterui.util.*; -import mindustry.Vars; +import mindustry.*; import mindustry.game.*; -import mindustry.gen.Player; -import mindustry.gen.Unit; -import mindustry.mod.Mods; -import mindustry.ui.Fonts; -import mindustry.world.Tile; -import mindustry.world.blocks.storage.CoreBlock; +import mindustry.gen.*; +import mindustry.mod.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.storage.*; -import java.text.DecimalFormat; -import java.util.HashMap; -import java.util.Map; +import java.text.*; +import java.util.*; import static arc.Core.settings; +import static casterui.io.CuiBinding.toggle_cui_kill_switch; public class CuiVars { public static CuiWorldRenderer renderer = new CuiWorldRenderer(); @@ -46,7 +41,7 @@ public class CuiVars { public static Vec2[] savedCameras = new Vec2[11]; public static DecimalFormat decFor = new DecimalFormat("#.##"), decForMini = new DecimalFormat("#.#"); - public static boolean[] dominationSettings = new boolean[14]; + public static boolean[] dominationSettings = new boolean[15]; public static boolean showBlockInfo = false, showCountersUnits = false, showCountersPlayers = false, showCountersButton = false, countersSeparateTeams = false, countersCoreUnits = false, countersCoreFlagged = false, countersTotals = false, @@ -85,6 +80,7 @@ public static void postInt(){ public static void update(){ globalShow = !Core.settings.getBool("cui-killswitch"); + if(inputs.cuiKeyTap(toggle_cui_kill_switch) && (globalShow || settings.getBool("cui-killswitchEnables"))) settings.put("cui-killswitch", !settings.getBool("cui-killswitch")); //haha this will be one way but lulz if (!globalShow) return; inputs.update(); fragment.UpdateTables(); @@ -147,6 +143,7 @@ public static void updateSettings(boolean full){ dominationSettings[11] = settings.getBool("cui-domination-core"); dominationSettings[12] = settings.getBool("cui-domination-percent"); dominationSettings[13] = settings.getBool("cui-domination-raw"); + dominationSettings[14] = settings.getBool("cui-domination-graph"); if(!full) return; @@ -178,6 +175,4 @@ public static void updateHiddenTeams(){ } } - - } diff --git a/src/casterui/io/CuiInputs.java b/src/casterui/io/CuiInputs.java index 78e4f57..6992f72 100644 --- a/src/casterui/io/CuiInputs.java +++ b/src/casterui/io/CuiInputs.java @@ -1,24 +1,13 @@ package casterui.io; -import arc.Core; -import arc.KeyBinds; import arc.KeyBinds.*; -import arc.func.*; -import arc.input.KeyCode; +import arc.input.*; import arc.math.geom.*; -import arc.scene.*; -import arc.scene.event.*; -import arc.struct.Seq; -import arc.util.*; -import casterui.CuiVars; -import mindustry.Vars; -import mindustry.game.Teams; +import arc.struct.*; +import casterui.*; import mindustry.game.Teams.*; import mindustry.gen.*; -import mindustry.input.Binding; -import mindustry.input.DesktopInput; -import mindustry.world.Build; -import mindustry.world.blocks.storage.CoreBlock; +import mindustry.input.*; import mindustry.world.blocks.storage.CoreBlock.*; import static arc.Core.*; @@ -34,11 +23,12 @@ public class CuiInputs { public Vec2 out = new Vec2() ; public void update(){ - if (settings.getBool("cui-respectCommandMode") && control.input.commandMode) return; - if (settings.getBool("cui-respectTyping") && (ui.chatfrag.shown() || scene.getKeyboardFocus() != null) || ui.consolefrag.shown())return; + if (state.isMenu()) return; + updateTracking(); if (settings.getBool("cui-respectLockInputs") && control.input.locked())return; + if (settings.getBool("cui-respectCommandMode") && control.input.commandMode) return; if(settings.getBool("cui-respectDialog") && scene.hasDialog()) return; - if (state.isMenu()) return; + if (settings.getBool("cui-respectTyping") && (ui.chatfrag.shown() || scene.getKeyboardFocus() != null) || ui.consolefrag.shown())return; if(cuiKeyTap(toggle_cui_menu) && !settings.getBool("cui-hideWithMenus")) CuiVars.globalHidden = !CuiVars.globalHidden; else if(settings.getBool("cui-hideWithMenus")) CuiVars.globalHidden = ui.hudfrag.shown; @@ -96,16 +86,20 @@ public void update(){ if(cuiKeyTap(map_player_9) && CuiVars.mappedPlayers.get(9) != null) CuiVars.clickedPlayer = CuiVars.mappedPlayers.get(9); if (scene.hasField()) return; - tracking = false; - - float cameraFloat = 0.085F; //TODO:ALLOW THIS TO BE CHANGED - if (!settings.getBool("smoothcamera")){ cameraFloat = 1;} - if(cuiKeyTap(spectate_next_player)) cyclePlayers(true); if(cuiKeyTap(spectate_previous_player)) cyclePlayers(false); if(cuiKeyTap(spectate_next_core)) cycleCore(true); if(cuiKeyTap(spectate_previous_core)) cycleCore(false); + } + public void updateTracking(){ + if(!settings.getBool("cui-trackwhileChatting") &&((ui.chatfrag.shown() || scene.getKeyboardFocus() != null) || ui.consolefrag.shown())) return; + if(!settings.getBool("cui-trackwhileMap") && ui.minimapfrag.shown()) return; + if(!settings.getBool("cui-trackwhileDialog") && (!ui.minimapfrag.shown() && scene.hasDialog())) return; + tracking = false; + + float cameraFloat = 0.085F; //TODO:ALLOW THIS TO BE CHANGED + if (!settings.getBool("smoothcamera")){ cameraFloat = 1;} if (CuiVars.lastCoreDestroyEvent != null && cuiKeyDown(last_destroyed_core) && !tracking){ if(control.input instanceof DesktopInput input) input.panning = true; stopTracking(); @@ -148,7 +142,7 @@ public void update(){ if (CuiVars.clickedPlayer != null && CuiVars.clickedPlayer.unit() != null && state.isPlaying() && !tracking){ startTracking(); - trackingType = 4; + trackingType = 3; //workaround for when in multiplayer, sometimes respawning puts you in 0,0 during the animation before moving your unit if (CuiVars.clickedPlayer != null && (CuiVars.clickedPlayer.unit() == null || CuiVars.clickedPlayer.unit().x == 0 && CuiVars.clickedPlayer.unit().y == 0) && CuiVars.clickedPlayer.team().data().hasCore()) trackingType = 3; @@ -180,9 +174,8 @@ public void update(){ } } - - } + void handSavedCams(int num, boolean save){ if(save) CuiVars.savedCameras[num] = new Vec2(player.mouseX(), player.mouseY()); else if(CuiVars.savedCameras[num] != null && !CuiVars.savedCameras[num].isZero()) out.set(CuiVars.savedCameras[num]); @@ -191,8 +184,11 @@ void handSavedCams(int num, boolean save){ void cyclePlayers(boolean increment){ ply.clear(); + boolean core = settings.getBool("cui-cyclePlayersIgnoreNoCore.name"), nu = settings.getBool("cui-hideNoUnitPlayers"); for (Player p : Groups.player) { - if (settings.getBool("cui-hideNoUnitPlayers") && (p.unit() == null && !p.team().data().hasCore())) continue; + if(CuiVars.hiddenCycleTeam[p.team().id]) continue; + if(!core && p.team().cores().size <= 0) continue; + if (nu && (p.unit() == null && !p.team().data().hasCore())) continue; if (p != player) ply.add(p); } ply.remove(player); @@ -242,7 +238,15 @@ public void stopTracking(){ } public void startTracking(){ - if((Math.abs(input.axis(Binding.move_x)) > 0 || Math.abs(input.axis(Binding.move_y)) > 0 || input.keyTap(Binding.mouse_move) || input.keyTap(Binding.pan)) && (!scene.hasField())){ + boolean + focus = settings.getBool("cui-trackOnLostFocus") , + feild = !settings.getBool("cui-trackwhileChatting") && scene.hasField(), + mmPan = ui.minimapfrag.shown() && input.keyTap(KeyCode.mouseRight), + move = Math.abs(input.axis(Binding.move_x)) > 0 || Math.abs(input.axis(Binding.move_y)) > 0 || input.justTouched(), + cam = input.keyTap(Binding.mouse_move) || input.keyTap(Binding.pan); + ; + + if(move || cam || mmPan || feild){ stopTracking(); return; } diff --git a/src/casterui/io/ui/BarHelper.java b/src/casterui/io/ui/BarHelper.java new file mode 100644 index 0000000..2545948 --- /dev/null +++ b/src/casterui/io/ui/BarHelper.java @@ -0,0 +1,108 @@ +package casterui.io.ui; + +import arc.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.style.*; +import arc.util.pooling.*; +import mindustry.gen.*; +import mindustry.ui.*; + +public class BarHelper extends Bar{ + private static Rect scissor = new Rect(); + + private Floatp fraction; + private CharSequence name = ""; + private float value, lastValue, blink, outlineRadius; + private Color blinkColor = new Color(), outlineColor = new Color(); + + public BarHelper(String name, Color color, Floatp fraction){ + this.fraction = fraction; + this.name = Core.bundle.get(name, name); + this.blinkColor.set(color); + lastValue = value = fraction.get(); + setColor(color); + } + + public BarHelper(Prov name, Prov color, Floatp fraction){ + this.fraction = fraction; + lastValue = value = Mathf.clamp(fraction.get()); + update(() -> { + this.name = name.get(); + this.blinkColor.set(color.get()); + setColor(color.get()); + }); + } + + public BarHelper(){ + + } + + @Override + public void draw(){ + if(fraction == null) return; + + float computed = Mathf.clamp(fraction.get()); + + + if(lastValue > computed){ + blink = 1f; + lastValue = computed; + } + + if(Float.isNaN(lastValue)) lastValue = 0; + if(Float.isInfinite(lastValue)) lastValue = 1f; + if(Float.isNaN(value)) value = 0; + if(Float.isInfinite(value)) value = 1f; + if(Float.isNaN(computed)) computed = 0; + if(Float.isInfinite(computed)) computed = 1f; + + blink = Mathf.lerpDelta(blink, 0f, 0.2f); + value = Mathf.lerpDelta(value, computed, 0.15f); + + Drawable bar = Tex.bar; + + if(outlineRadius > 0){ + Draw.color(outlineColor); + bar.draw(x - outlineRadius, y - outlineRadius, width + outlineRadius*2, height + outlineRadius*2); + } + + Draw.colorl(0.1f); + Draw.alpha(parentAlpha); + bar.draw(x, y, width, height); + Draw.color(color, blinkColor, blink); + Draw.alpha(parentAlpha); + + Drawable top = Tex.barTop; + float topWidth = width * value; + + if(topWidth > Core.atlas.find("bar-top").width){ + top.draw(x, y, topWidth, height); + }else{ + if(ScissorStack.push(scissor.set(x, y, topWidth, height))){ + top.draw(x, y, Core.atlas.find("bar-top").width, height); + ScissorStack.pop(); + } + } + + Draw.color(); + + Font font = Fonts.def; + GlyphLayout lay = Pools.obtain(GlyphLayout.class, GlyphLayout::new); + lay.setText(font, name); + + float prevSX = font.getData().scaleX, prevSY = font.getData().scaleX; + font.getData().setScale(0.8f); + font.setColor(1f, 1f, 1f, 1f); + font.getCache().clear(); + + font.getCache().addText(name, x + width / 2.2f - lay.width / 2.2f, y + height / 2.2f + lay.height / 2.2f + 1); + font.getCache().draw(parentAlpha); + font.getData().setScale(prevSX, prevSY); + + Pools.free(lay); + } +} diff --git a/src/casterui/io/ui/CuiFragment.java b/src/casterui/io/ui/CuiFragment.java index 52fb6ce..d4d535b 100644 --- a/src/casterui/io/ui/CuiFragment.java +++ b/src/casterui/io/ui/CuiFragment.java @@ -1,36 +1,38 @@ package casterui.io.ui; -import arc.Core; -import arc.graphics.Color; +import arc.*; +import arc.graphics.*; import arc.graphics.g2d.*; -import arc.math.Mathf; -import arc.math.geom.Vec2; -import arc.scene.Group; -import arc.scene.style.Drawable; -import arc.scene.ui.Image; -import arc.scene.ui.Label; -import arc.scene.ui.layout.Table; -import arc.struct.Seq; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; -import casterui.CuiVars; -import casterui.io.ui.dialog.CuiSettingsDialog; -import mindustry.Vars; -import mindustry.core.UI; -import mindustry.game.Team; -import mindustry.game.Teams; +import casterui.io.ui.dialog.*; +import mindustry.*; +import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; -import mindustry.logic.LAccess; -import mindustry.type.Category; -import mindustry.type.UnitType; -import mindustry.ui.Styles; -import mindustry.world.Tile; -import mindustry.world.blocks.defense.turrets.Turret; +import mindustry.graphics.*; +import mindustry.logic.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.defense.turrets.*; +import mindustry.world.blocks.heat.HeatConductor.*; import mindustry.world.blocks.power.*; -import mindustry.world.blocks.units.UnitFactory; +import mindustry.world.blocks.units.*; +import mindustry.world.meta.*; -import java.text.DecimalFormat; +import java.text.*; import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.Map.*; +import java.util.concurrent.atomic.*; import static arc.Core.settings; import static casterui.CuiVars.*; @@ -58,7 +60,7 @@ public class CuiFragment { Seq alignSides = Seq.with(Align.bottom, Align.bottomLeft, Align.bottomRight, Align.top, Align.topLeft, Align.topRight, Align.center, Align.left, Align.right); public int[][] blockCats = new int[Team.all.length][Category.all.length + 4]; public int worldBlocks; - public String[] dominationIconList = {Iconc.host + "", Iconc.turret + "", Iconc.production + "", Iconc.distribution + "", Iconc.liquid + "", Iconc.power + "", Iconc.defense + "", Iconc.crafting + "", Iconc.units + "", Iconc.effect + "", Iconc.logic + "", Iconc.home + "",Iconc.map + "", Iconc.list + ""}; + public String[] dominationIconList = {Iconc.host + "", Iconc.turret + "", Iconc.production + "", Iconc.distribution + "", Iconc.liquid + "", Iconc.power + "", Iconc.defense + "", Iconc.crafting + "", Iconc.units + "", Iconc.effect + "", Iconc.logic + "", Iconc.home + "",Iconc.map + "", Iconc.list + "", Iconc.statusElectrified + ""}; public void BuildTables(Group parent){ @@ -153,7 +155,7 @@ public void StutteredUpdateTables() { int style = settings.getInt("cui-unitsPlayerTableStyle"), tabSize = settings.getInt("cui-unitsPlayerTableSize"); if(countersTotals){ int total = 0; - for (Map.Entry entry : teamUnits.entrySet()) total += entry.getValue(); + for (Entry entry : teamUnits.entrySet()) total += entry.getValue(); if(total > 0){ makeIcon(style, total, team, Icon.units.getRegion(), "@wavemode.counts", true); @@ -162,7 +164,7 @@ public void StutteredUpdateTables() { } } - for (Map.Entry entry : teamUnits.entrySet()) { + for (Entry entry : teamUnits.entrySet()) { Short u = entry.getKey(); Integer i = entry.getValue(); UnitType unit = Vars.content.unit(u); @@ -198,7 +200,7 @@ public void StutteredUpdateTables() { playersTable.add(new Image(playerIcon).setScaling(Scaling.bounded)).size(playerIconSize).left().with( w -> w.tapped( () -> setTrackPlayer(player))); - if (!Core.settings.getBool("cui-playerTableSummarizePlayers")) { + if (!settings.getBool("cui-playerTableSummarizePlayers")) { Label playerName = new Label(() -> player.name); playerName.tapped( () -> setTrackPlayer(player)); playersTable.add(playerName); @@ -301,8 +303,10 @@ public void UpdateTables(){ String sign = power > 0 ? "[stat]+" : "[red]"; - blockTable.label(() -> Core.bundle.get("cui-block-info.power") + ": "+ sign + decFor.format(power)).row(); - if(mouseBuilding.block instanceof Battery || mouseBuilding.block instanceof PowerNode || mouseBuilding.block instanceof BeamNode) blockTable.label(() -> "[stat]"+ Math.round(mouseBuilding.sense(LAccess.powerNetStored))+ "[white]/[accent]" + Math.round(mouseBuilding.sense(LAccess.powerNetCapacity))); + blockTable.label(() -> Iconc.power + ": "+ sign + formatAmount(power)).row(); + if(mouseBuilding.block instanceof Battery || mouseBuilding.block instanceof PowerNode || mouseBuilding.block instanceof BeamNode) { + blockTable.label(() -> "[stat]" +formatAmount(graphs.getBatteryStored(), 0) + "/" + formatAmount(graphs.getTotalBatteryCapacity(), 0)); + } } if (mouseBuilding.items != null && mouseBuilding.items.total() > 0) blockTable.add(blockItemTable).row(); if (mouseBuilding.liquids != null) blockTable.add(blockLiquidTable).row(); @@ -321,10 +325,20 @@ public void UpdateTables(){ } } if(mouseBuilding.block instanceof Turret)blockTable.label(() -> "[accent]"+ decFor.format(mouseBuilding.sense(LAccess.ammo)) + "[white]/[orange]"+ ((Turret) mouseBuilding.block).maxAmmo).row(); - if(settings.getBool("cui-ShowBlockHealth") && mouseBuilding.lastAccessed != null){ - blockTable.table(a-> a.label(() -> mouseBuilding.lastAccessed).pad(1f)); + if(mouseBuilding.getPayload() != null){ + @Nullable UnlockableContent uc = mouseBuilding.getPayload().content(); + if(uc != null){ + blockTable.table(a-> a.image(() -> uc.fullIcon).tooltip(uc.localizedName).size(iconSizes).pad(1f).row()).row(); + } + } + if(mouseBuilding instanceof HeatConductorBuild hb){ + if(hb.heat >= 1) blockTable.table(a -> a.label(() -> StatUnit.heatUnits.icon + decFor.format(hb.heat)).pad(1f)).row(); } - //TODO: heat, block constructors, Payload + + if(settings.getBool("cui-BlockInfoLastPlayer") && mouseBuilding.lastAccessed != null){ + blockTable.table(a-> a.label(() -> mouseBuilding.lastAccessed).pad(1f)).row(); + } + } } @@ -351,7 +365,7 @@ public void buildTeamItemTable() { if (settings.getBool("cui-ShowTeamItems")) { int teamItemsMax = settings.getInt("cui-TeamItemsRow"); - for (Teams.TeamData team : Vars.state.teams.active) { + for (TeamData team : Vars.state.teams.active) { if (team.core() == null) continue; if(hiddenTeamsItems[team.team.id]) continue; Table sub = colouredTable(team.team.color, team.team.color.a * (settings.getInt("cui-TeamItemsAlpha") * 0.1f)); @@ -372,7 +386,7 @@ public void buildTeamItemTable() { public void buildDominationTable(){ dominationTable.clear(); - CuiVars.updateSettings(false); // array only setting update on each rebuild + updateSettings(false); // array only setting update on each rebuild int trans = settings.getInt("cui-domination-trans"); @@ -400,6 +414,20 @@ public void buildDominationTable(){ dominationTable.add(iconTab).grow(); if(dominationVertical)dominationTable.row(); + + HashMap pgo = new HashMap<>(); + Seq pgs = Groups.powerGraph.copy(); + pgs.sort(p -> Math.round(p.graph().getPowerBalance() * 60f)).reverse(); + + + for(PowerGraphUpdaterc pg : pgs){ + if(!pgo.containsKey(pg.graph().all.peek().team.id)){ + pgo.put(pg.graph().all.peek().team.id, pg.graph()); + } + } + + pgs.sort(p -> Math.round(p.graph().getPowerBalance())); + for (int t = 0; t < (Team.all.length); t++) { if(blockCats[t][0] == 0) continue; Table tab = dominationColoured ? colouredTable(Team.get(t).color, trans * 0.1f) : new Table(); @@ -424,19 +452,36 @@ public void buildDominationTable(){ //if(!dominationSettings[i]) continue; if(!dominationVertical) tab.row(); - String cnt = blockCats[t][i] + ""; + if(i == 14){ + @Nullable PowerGraph graph = pgo.get(t); + Bar pBar; + if(graph == null) { + pBar = new BarHelper(() -> "n", () -> Pal.power, () -> 0); + }else { + int finalT = t; + pBar = new BarHelper( + () -> formatAmount(graph.getPowerBalance() * 60), + () -> new Color().set(Pal.power).lerp(Team.get(finalT).color, 0.5f), + () -> graph.getSatisfaction() + ); + }; + tab.add(pBar); + }else{ + String cnt = blockCats[t][i] + ""; + + if(i == 12){ + double per = ((double)blockCats[t][12] / worldBlocks) * 100f; + cnt = (per >= 10 ? Math.round(per) : decForMini.format(per)) + "%"; + } + Label rawTxt = new Label(cnt); + rawTxt.setAlignment(Align.center); + + if(rawTxt.getMinHeight() > size[1]) size[1] = rawTxt.getMinHeight(); + if(rawTxt.getMinWidth() > size[0]) size[0] = rawTxt.getMaxWidth(); - if(i == 12){ - double per = ((double) blockCats[t][12] /worldBlocks) * 100f; - cnt = (per >= 10 ? Math.round(per) : decForMini.format(per)) + "%"; + equlize.add(rawTxt); + tab.add(rawTxt); } - Label rawTxt = new Label(cnt); - rawTxt.setAlignment(Align.center); - - if(rawTxt.getMinHeight() > size[1]) size[1] = rawTxt.getMinHeight(); - if(rawTxt.getMinWidth() > size[0]) size[0] = rawTxt.getMaxWidth(); - equlize.add(rawTxt); - tab.add(rawTxt); } @@ -504,4 +549,41 @@ public void marginHandler(Table tab, int x, int y, boolean xPer, boolean yPer){ tab.moveBy(fx, fy); } + + public static String formatAmount(float number){ + return formatAmount(number, 1); + } + public static String formatAmount(float number, int decimals){ + //prevent things like bars displaying erroneous representations of casted infinities + if(number == Float.MAX_VALUE) return "∞"; + if(number == Float.MIN_VALUE) return "-∞"; + + float mag = Math.abs(number); + String sign = number < 0 ? "-" : ""; + if(decimals <= -1 ){ + if(mag >= 1_000_000_000){ + return sign + Math.round(mag / 1_000_000_000f) + "[gray]" + UI.billions + "[]"; + }else if(mag >= 1_000_000){ + return sign + Math.round(mag / 1_000_000f) + "[gray]" + UI.millions + "[]"; + }else if(mag >= 10_000){ + return sign + Math.round(number / 1000) + "[gray]" + UI.thousands + "[]"; + }else if(mag >= 1000){ + return sign + Math.round(mag / 1000f) + "[gray]" + UI.thousands + "[]"; + }else{ + return Math.round(number) + ""; + } + } else { + if(mag >= 1_000_000_000){ + return sign + Strings.fixed(mag / 1_000_000_000f, decimals) + "[gray]" + UI.billions + "[]"; + }else if(mag >= 1_000_000){ + return sign + Strings.fixed(mag / 1_000_000f, decimals) + "[gray]" + UI.millions + "[]"; + }else if(mag >= 10_000){ + return sign + Strings.fixed(number / 1000, decimals) + "[gray]" + UI.thousands + "[]"; + }else if(mag >= 1000){ + return sign + Strings.fixed(mag / 1000f, decimals) + "[gray]" + UI.thousands + "[]"; + }else{ + return Math.round(number) + ""; + } + } + } } diff --git a/src/casterui/io/ui/CuiWorldRenderer.java b/src/casterui/io/ui/CuiWorldRenderer.java index 1000e02..9177bb2 100644 --- a/src/casterui/io/ui/CuiWorldRenderer.java +++ b/src/casterui/io/ui/CuiWorldRenderer.java @@ -147,11 +147,11 @@ public void drawUnitBars(Unit unit, int style, float alpha, float stroke){ switch (style) { case 10 -> { //diamonds, (don't remember which mod that used to do this so ughh yes) - drawInner(Pal.darkishGray, 1f, false, x - (offset /1.5f), y - (offset /2), (width / 2f), unit.hitSize, 1); - drawInner(colour, hp ,false, x - (offset /1.5f), y - (offset /2), (width / 2f), unit.hitSize, 1); + drawInner(Pal.darkishGray, 1f, false, x - (offset /1.5f), y - (offset /2), (width / 2f), unit.hitSize, 0.7f); + drawInner(colour, hp ,false, x - (offset /1.5f), y - (offset /2), (width / 2f), unit.hitSize, 0.8f); if(shield > 0){ - drawInner(Pal.darkishGray, 1f, true, x + (offset /1.5f), y - (offset /2), (width / 2f), unit.hitSize, 1); - drawInner(colour, shield ,true, x + (offset /1.5f), y - (offset /2), (width / 2f), unit.hitSize, 1); + drawInner(Pal.darkishGray, 1f, true, x + (offset /1.5f), y - (offset /2), (width / 2f), unit.hitSize, 0.7f); + drawInner(colour, shield ,true, x + (offset /1.5f), y - (offset /2), (width / 2f), unit.hitSize, 0.8f); } } case 9 -> {//boarder - right diff --git a/src/casterui/io/ui/dialog/CuiSettingsDialog.java b/src/casterui/io/ui/dialog/CuiSettingsDialog.java index bdb8eee..e2a57be 100644 --- a/src/casterui/io/ui/dialog/CuiSettingsDialog.java +++ b/src/casterui/io/ui/dialog/CuiSettingsDialog.java @@ -2,15 +2,11 @@ import arc.*; import arc.graphics.*; -import arc.math.*; -import arc.scene.actions.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.struct.*; import arc.util.*; import casterui.*; -import casterui.util.*; -import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; @@ -86,6 +82,11 @@ public void trackingCategory(SettingsMenuDialog.SettingsTable table){ subTable.sliderPref("cui-playerIconSize", 35, 1, 100, String::valueOf); subTable.checkPref("cui-useCycleFilter", true); + subTable.pref(new CollapserSetting("cui-offset-div", 6)); + subTable.checkPref("cui-trackwhileChatting", true); + subTable.checkPref("cui-trackwhileMap", true); + subTable.checkPref("cui-trackwhileDialog", true); + subTable.pref(new CollapserSetting("cui-offset-div", 6)); subTable.pref(new CollapserSetting("cui-playerCycle-more", 11)); subTable.checkPref("cui-cyclePlayersIgnoreNoCore", true); @@ -301,6 +302,7 @@ public void advanceCategory(SettingsMenuDialog.SettingsTable table){ subTable.sliderPref("cui-unitsPlayerTableUpdateRate", 10, 1, 100, String::valueOf); subTable.sliderPref("cui-TeamItemsUpdateRate", 2, 1, 3, s -> s == 1 ? "Fast" : s == 2 ? "Normal" : "Slow"); subTable.checkPref("cui-animateSettings", true); + subTable.checkPref("cui-killswitchEnables", false); allCuiOptions.add(subTable); t.button("@cui-rebuild", Icon.export, () -> { @@ -325,6 +327,7 @@ public void dominationSubCategory(SettingsMenuDialog.SettingsTable table){ subTable.checkPref("cui-domination-raw", false); subTable.checkPref("cui-domination-core", false); subTable.checkPref("cui-domination-percent", false); + subTable.checkPref("cui-domination-graph", false); subTable.pref(new CollapserSetting("cui-offset-div", 6)); @@ -339,6 +342,7 @@ public void dominationSubCategory(SettingsMenuDialog.SettingsTable table){ subTable.checkPref("cui-domination-effect", false); subTable.checkPref("cui-domination-logic", false); + allCuiOptions.add(subTable); t.add(subTable).row(); }, CuiVars.animateCats , () ->dominactionShown[0]).growX().row(); diff --git a/src/casterui/io/ui/dialog/TeamBlackListerDialog.java b/src/casterui/io/ui/dialog/TeamBlackListerDialog.java index bf7eef4..963f335 100644 --- a/src/casterui/io/ui/dialog/TeamBlackListerDialog.java +++ b/src/casterui/io/ui/dialog/TeamBlackListerDialog.java @@ -6,26 +6,19 @@ import arc.scene.actions.*; import arc.scene.event.*; import arc.scene.ui.*; -import arc.scene.ui.Label.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.serialization.*; -import casterui.*; import mindustry.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.io.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; -import java.io.*; -import java.util.*; - import static arc.Core.bundle; import static casterui.CuiVars.*; -import static mindustry.Vars.*; +import static mindustry.Vars.ui; public class TeamBlackListerDialog extends BaseDialog{ public Cell selectedPane, unselectedPane; @@ -150,24 +143,7 @@ void rebuildOtherButtons() { Table but = new Table(), but1 = new Table(); but1.button("@back", Icon.left, this::hide).size(170f, 64f).tooltip("@cui-domination.tip"); - but1.button("@defaults", Icon.exit, () -> { - hiddenTeamList[write] = new boolean[Team.all.length]; - hiddenTeamList[write][0] = true; - setup(); - - }).size(170, 64f); - but1.button(Icon.export, this::exportOptions).size(60, 64f); - - but.button("@clear", Icon.trash, () -> { - hiddenTeamList[write] = new boolean[Team.all.length]; - setup(); - }).size(120, 64f); - - but.button("@waves.spawn.all", Icon.move, () -> { - hiddenTeamList[write] = new boolean[Team.all.length]; - for(int i = 0; i < Team.all.length; i++) hiddenTeamList[write][i] = true; - setup(); - }).size(120, 64f); + but1.button("@waves.edit", Icon.export, this::exportOptions).size(150, 64f); sortTxt = Core.bundle.get("cui-teams-sort." + sort); but.button(Core.bundle.get("cui-teams-sort.base") + sortTxt, () -> { sort++; @@ -200,6 +176,24 @@ public void exportOptions(){ dialog.hide(); }).disabled(Core.app.getClipboardText() == null || !Core.app.getClipboardText().startsWith("[")).marginLeft(12f).row(); + t.button("@clear", Icon.trash, style, () -> { + hiddenTeamList[write] = new boolean[Team.all.length]; + setup(); + dialog.hide(); + }).marginLeft(12f).row(); + + t.button("@waves.spawn.all", Icon.move, style, () -> { + hiddenTeamList[write] = new boolean[Team.all.length]; + for(int i = 0; i < Team.all.length; i++) hiddenTeamList[write][i] = true; + setup(); + dialog.hide(); + }).marginLeft(12f).row(); + t.button("@defaults", Icon.exit, style, () -> { + hiddenTeamList[write] = new boolean[Team.all.length]; + hiddenTeamList[write][0] = true; + setup(); + dialog.hide(); + }).marginLeft(12f).row(); }); dialog.show(); diff --git a/src/casterui/util/CuiUpdateChecker.java b/src/casterui/util/CuiUpdateChecker.java index 509390f..c3d0b2f 100644 --- a/src/casterui/util/CuiUpdateChecker.java +++ b/src/casterui/util/CuiUpdateChecker.java @@ -28,13 +28,22 @@ public void run(){ return; } - Jval release = releases.get(0); + String prefix = "v7-"; String modVersion = mod.meta.version; modVersion = (modVersion.contains(".") ? modVersion : modVersion + ".0"); - CuiVars.nextVersion = Strings.parseFloat(release.getString("tag_name").replace("v", "")); + + releases.retainAll(r -> r.getString("tag_name").startsWith(prefix)); + if(releases.isEmpty()){ + Log.info("Cui is up to date! ^w^ (c:" + modVersion + " r: n/a | " + prefix + ")"); + return; + } + Jval release = releases.get(0); + + String nextVersion= release.getString("tag_name").replace(prefix, ""); + CuiVars.nextVersion = Strings.parseFloat(nextVersion); if(Strings.parseFloat(modVersion) >= CuiVars.nextVersion){ - Log.info("Cui is up to date! ^w^ (c" + modVersion + " r" + Strings.parseFloat(release.getString("tag_name").replace("v", "")) + ")"); + Log.info("Cui is up to date! ^w^ (c:" + modVersion + " r:" + nextVersion+ " | " + prefix + ")"); return; } out = true; From d5369403584199b2c102a3bcc2e7720fa29f332a Mon Sep 17 00:00:00 2001 From: RushieWashie <57391931+JiroCab@users.noreply.github.com> Date: Wed, 30 Jul 2025 19:47:49 +0800 Subject: [PATCH 2/3] hotfix: input.justTouched() crashes mobile --- src/casterui/io/CuiInputs.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/casterui/io/CuiInputs.java b/src/casterui/io/CuiInputs.java index 6992f72..d1805d5 100644 --- a/src/casterui/io/CuiInputs.java +++ b/src/casterui/io/CuiInputs.java @@ -242,7 +242,8 @@ public void startTracking(){ focus = settings.getBool("cui-trackOnLostFocus") , feild = !settings.getBool("cui-trackwhileChatting") && scene.hasField(), mmPan = ui.minimapfrag.shown() && input.keyTap(KeyCode.mouseRight), - move = Math.abs(input.axis(Binding.move_x)) > 0 || Math.abs(input.axis(Binding.move_y)) > 0 || input.justTouched(), + //input.justTouched() crashes mobile! + move = Math.abs(input.axis(Binding.move_x)) > 0 || Math.abs(input.axis(Binding.move_y)) > 0, cam = input.keyTap(Binding.mouse_move) || input.keyTap(Binding.pan); ; From 453ef146c26e9944d0fd4e998ba067ecd8557966 Mon Sep 17 00:00:00 2001 From: RushieWashie <57391931+JiroCab@users.noreply.github.com> Date: Wed, 30 Jul 2025 20:04:20 +0800 Subject: [PATCH 3/3] null crash fix --- src/casterui/io/CuiInputs.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/casterui/io/CuiInputs.java b/src/casterui/io/CuiInputs.java index d1805d5..f96a578 100644 --- a/src/casterui/io/CuiInputs.java +++ b/src/casterui/io/CuiInputs.java @@ -152,6 +152,7 @@ public void updateTracking(){ if (keepMouseTracking && !settings.getBool("cui-playerHoldTrackMouse")) trackingType = 2; if (!keepMouseTracking && !settings.getBool("cui-playerHoldTrackMouse") && CuiVars.clickedPlayer.unit() != null) trackingType = 1; if (!keepMouseTracking && !settings.getBool("cui-playerHoldTrackMouse") && CuiVars.clickedPlayer.unit() == null) trackingType = 3; + if(trackingType == 3 && (CuiVars.clickedPlayer == null ||CuiVars.clickedPlayer.bestCore() == null)) trackingType = 4; /* so many if statements, enjoy >;3c */ switch (trackingType) {