From a4f29c749f61fadf735993c30228f3af0d31cd48 Mon Sep 17 00:00:00 2001 From: ItsKirby69 <117233443+ItsKirby69@users.noreply.github.com> Date: Thu, 23 Apr 2026 19:54:35 -0400 Subject: [PATCH] Add new Map Planet Filter option (#11968) * Filter by planet selection for maps * Use existing "" bundle --- core/assets/bundles/bundle.properties | 1 + .../mindustry/ui/dialogs/MapListDialog.java | 85 ++++++++++++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 2094e86cca..522fe6798e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -510,6 +510,7 @@ editor.filters.description = Description editor.filters.modname = Mod Name editor.filters.prioritizemod = Mod Priority editor.filters.prioritizecustom = Custom Priority +editor.filters.planetselect = Planet Selection editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop diff --git a/core/src/mindustry/ui/dialogs/MapListDialog.java b/core/src/mindustry/ui/dialogs/MapListDialog.java index 3cd420b8b4..59c63b6c88 100644 --- a/core/src/mindustry/ui/dialogs/MapListDialog.java +++ b/core/src/mindustry/ui/dialogs/MapListDialog.java @@ -2,16 +2,23 @@ package mindustry.ui.dialogs; import arc.*; import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.scene.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.scene.event.*; import arc.struct.*; import arc.util.*; +import arc.input.*; import mindustry.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.io.JsonIO; import mindustry.maps.*; +import mindustry.content.Planets; +import mindustry.type.Planet; import mindustry.ui.*; import static mindustry.Vars.*; @@ -21,6 +28,7 @@ public abstract class MapListDialog extends BaseDialog{ private String searchString; private Seq modes = new Seq<>(); + private Seq availablePlanets = new Seq<>(); private Table mapTable = new Table(); private TextField searchField; @@ -34,6 +42,7 @@ public abstract class MapListDialog extends BaseDialog{ prioritizeModded = Core.settings.getBool("editorprioritizemodded", false), prioritizeCustom = Core.settings.getBool("editorprioritizecustom", false), displayType; + private Seq planets = Core.settings.getJson("editorfilterplanets", Seq.class, String.class, Seq::new); public MapListDialog(String title, boolean displayType){ super(title); @@ -58,6 +67,9 @@ public abstract class MapListDialog extends BaseDialog{ abstract void showMap(Map map); void setup(){ + availablePlanets = content.planets().select(p -> p.accessible).map(p -> p.name); + availablePlanets.add(Planets.sun.name); + makeButtonOverlay(); buttons.clearChildren(); @@ -107,6 +119,7 @@ public abstract class MapListDialog extends BaseDialog{ int i = 0; Seq mapList = new Seq<>(); + Seq activePlanetFilters = planets.select(p -> availablePlanets.contains(p)); if(showCustom) mapList.addAll(maps.customMaps()); if(showBuiltIn) mapList.addAll(maps.defaultMaps()); @@ -133,6 +146,14 @@ public abstract class MapListDialog extends BaseDialog{ for(Gamemode mode : modes){ invalid |= !mode.valid(map); } + + Rules rules = JsonIO.read(Rules.class, map.tags.get("rules", "{}")); + + // Only filter through active planets. Preserve modded planets when the mod is disabled + if(!activePlanetFilters.isEmpty() && !activePlanetFilters.contains(rules.planet.name)){ + continue; + } + if(invalid || (searchString != null && !map.plainName().toLowerCase().contains(searchString) && (!searchAuthor || !map.plainAuthor().toLowerCase().contains(searchString)) @@ -208,8 +229,7 @@ public abstract class MapListDialog extends BaseDialog{ } } }); - }).pad(5f); - tab.add().width(60f); + }).expandX().pad(5f); // Priorities tab.table(t -> { t.add("@editor.filters.priorities").padBottom(6f).row(); @@ -234,6 +254,67 @@ public abstract class MapListDialog extends BaseDialog{ }).size(60f).checked(b-> showModded && prioritizeModded).tooltip("@editor.filters.prioritizemod").disabled(b -> !showModded); }); }).expandX().pad(5f); + // Planet selection dialog similar to the tech tree selection menu + tab.table(t -> { + t.add("").padBottom(6f).row(); + t.table(Tex.button, but -> { + ImageButton pButton = but.button(ui.getIcon("planet"), Styles.emptyTogglei, () -> { + new BaseDialog("@editor.filters.planetselect"){{ cont.pane(t -> { + t.table(Tex.button, in -> { + in.defaults().width(300f).height(60f); + + in.button("@rules.anyenv", ui.getIcon("planet"), Styles.flatTogglet, iconMed, () -> { + if(planets.contains(Planets.sun.name)){ + planets.remove(Planets.sun.name); + }else{ + planets.add(Planets.sun.name); + } + rebuildMaps(); + Core.settings.putJson("editorfilterplanets", String.class, planets); + }).marginLeft(12f).checked(planets.contains(Planets.sun.name)).row(); + + for(Planet planet : content.planets().select(p -> p.accessible)){ + // Get the planet's custom icon. Defaults to the default colored planet icon + TextureRegion foundIcon = Core.atlas.find(planet.name + "-ui", planet.name); + TextureRegionDrawable picon = Core.atlas.isFound(foundIcon) ? new TextureRegionDrawable(foundIcon) : ((TextureRegionDrawable)ui.getIcon("planet").tint(planet.iconColor)); + + in.button(planet.localizedName, picon, Styles.flatTogglet, iconMed, () -> { + if(planets.contains(planet.name)){ + planets.remove(planet.name); + }else{ + planets.add(planet.name); + } + rebuildMaps(); + Core.settings.putJson("editorfilterplanets", String.class, planets); + }).marginLeft(12f).checked(planets.contains(planet.name)).row(); + } + }); + }); + addCloseButton(); + }}.show(); + }).size(60f).tooltip("@editor.filters.planetselect").checked(b -> planets.find(p -> availablePlanets.contains(p)) != null) + .get(); + pButton.addListener(new ClickListener(KeyCode.mouseRight){ + @Override + public void clicked(InputEvent event, float x, float y) { + if(mobile) return; + planets.removeAll(p -> availablePlanets.contains(p)); + Core.settings.putJson("editorfilterplanets", String.class, planets); + rebuildMaps(); + } + }); + pButton.addListener(new ElementGestureListener(){ + @Override + public boolean longPress(Element e, float x, float y){ + if(!mobile) return false; + planets.removeAll(p -> availablePlanets.contains(p)); + Core.settings.putJson("editorfilterplanets", String.class, planets); + rebuildMaps(); + return true; + } + }); + }); + }).expandX().pad(5f); }).padBottom(10f); menu.row();