From 5261675280107b7f4fe9e9002e477721daab7b6a Mon Sep 17 00:00:00 2001 From: Mithi83 <28407460+Mithi83@users.noreply.github.com> Date: Tue, 6 Aug 2024 00:48:55 +0200 Subject: [PATCH 01/14] Fix flickering power bar (#8114) In a scenario with wireless charging (in my case a Player Transmitter from Powah) you can run into situation where a Wireless Crafting Terminal when opened will show a flickering power bar when fully charged (and being regularly refilled wirelessly), which is somewhat noticable and distracting. This is caused by the cast from `double` to `int` in `getBarWidth` which essentially chops off any fractional part of the value, where even the tiniest amount less than fully charged will show a bar that is not entirely full. When the wireless charging is done you have full power again and the bar is full, oscillating between the two states, causing the last pixel to flicker. With this fix the threshold for the full bar shifts down to around 12.5/13 or 96.15% (rather than 13/13 or 100% as before) leading to a full power bar all the time if wireless charging keeps the Wireless Crafting Terminal topped off. On the other hand an empty bar is displayed only up until 0.5/13 or 3.85% (rather than 1/13 or 7.70% as before). The benefit of the stopped flickering makes the change worthwhile in my eyes. ![power-new](https://github.com/user-attachments/assets/033c3d91-e516-4427-a8fb-fe85c23da564) --- .../appeng/items/tools/powered/powersink/AEBasePoweredItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/appeng/items/tools/powered/powersink/AEBasePoweredItem.java b/src/main/java/appeng/items/tools/powered/powersink/AEBasePoweredItem.java index e7177d20abc..3b27b85e4c7 100644 --- a/src/main/java/appeng/items/tools/powered/powersink/AEBasePoweredItem.java +++ b/src/main/java/appeng/items/tools/powered/powersink/AEBasePoweredItem.java @@ -77,7 +77,7 @@ public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStac @Override public int getBarWidth(ItemStack stack) { double filled = getAECurrentPower(stack) / getAEMaxPower(stack); - return Mth.clamp((int) (filled * 13), 0, 13); + return Mth.clamp((int) Math.round(filled * 13), 0, 13); } @Override From a97f19288ab17fdd5297159abc563211919fc347 Mon Sep 17 00:00:00 2001 From: shartte Date: Tue, 6 Aug 2024 00:51:24 +0200 Subject: [PATCH 02/14] Use client-side registry access for rendering guidebook recipes. (#8117) --- .../compiler/tags/RecipeCompiler.java | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/main/java/appeng/client/guidebook/compiler/tags/RecipeCompiler.java b/src/main/java/appeng/client/guidebook/compiler/tags/RecipeCompiler.java index 004632b1c7d..f561913ce4a 100644 --- a/src/main/java/appeng/client/guidebook/compiler/tags/RecipeCompiler.java +++ b/src/main/java/appeng/client/guidebook/compiler/tags/RecipeCompiler.java @@ -109,6 +109,8 @@ private record RecipeTypeMapping, C extends RecipeInput>( Function, LytBlock> factory) { @Nullable LytBlock tryCreate(RecipeManager recipeManager, Item resultItem) { + var registryAccess = Platform.getClientRegistryAccess(); + // We try to find non-special recipes first then fall back to special List> fallbackCandidates = new ArrayList<>(); for (var recipe : recipeManager.byType(recipeType)) { @@ -117,24 +119,14 @@ LytBlock tryCreate(RecipeManager recipeManager, Item resultItem) { continue; } - try { - if (recipe.value().getResultItem(null).getItem() == resultItem) { - return factory.apply(recipe); - } - } catch (Exception ignored) { - // :-P - // Happens if the recipe doesn't accept a null RegistryAccess + if (recipe.value().getResultItem(registryAccess).getItem() == resultItem) { + return factory.apply(recipe); } } for (var recipe : fallbackCandidates) { - try { - if (recipe.value().getResultItem(null).getItem() == resultItem) { - return factory.apply(recipe); - } - } catch (Exception ignored) { - // :-P - // Happens if the recipe doesn't accept a null RegistryAccess + if (recipe.value().getResultItem(registryAccess).getItem() == resultItem) { + return factory.apply(recipe); } } From e48fefd6a2ccf056fe81870206538012424d2e5c Mon Sep 17 00:00:00 2001 From: shartte Date: Tue, 6 Aug 2024 01:21:37 +0200 Subject: [PATCH 03/14] Refactor "Icon" to use the new GUI sprite-sheet system and remove the states.png file. (#8086) --- gradle.properties | 2 +- .../java/appeng/client/gui/AEBaseScreen.java | 5 +- src/main/java/appeng/client/gui/Icon.java | 385 ++++++++---------- .../gui/implementations/InterfaceScreen.java | 3 +- .../PatternProviderLockReason.java | 6 +- .../gui/me/items/CraftingEncodingPanel.java | 3 +- .../gui/me/items/EncodingModePanel.java | 7 +- .../gui/me/items/ProcessingEncodingPanel.java | 3 +- .../me/items/SmithingTableEncodingPanel.java | 3 +- .../me/items/StonecuttingEncodingPanel.java | 3 +- .../client/gui/widgets/ActionButton.java | 5 +- .../appeng/client/gui/widgets/IconButton.java | 18 +- .../appeng/client/gui/widgets/InfoBar.java | 9 +- .../gui/widgets/KeyTypeSelectionButton.java | 3 +- .../client/gui/widgets/OpenGuideButton.java | 3 +- .../gui/widgets/SettingToggleButton.java | 18 +- .../appeng/client/gui/widgets/TabButton.java | 10 +- .../client/gui/widgets/ToggleButton.java | 13 +- .../client/gui/widgets/ValidationIcon.java | 3 +- .../guidebook/render/RenderContext.java | 21 +- .../modules/emi/EmiCondenserRecipe.java | 13 +- .../integration/modules/emi/SpriteWidget.java | 27 ++ .../modules/rei/CondenserCategory.java | 17 +- .../integration/modules/rei/SpriteWidget.java | 35 ++ .../menu/implementations/QuartzKnifeMenu.java | 4 +- .../java/appeng/menu/slot/AppEngSlot.java | 8 +- .../java/appeng/menu/slot/OutputSlot.java | 4 +- .../appeng/menu/slot/RestrictedInputSlot.java | 5 +- .../gui/sprites/icons/access_read.png | Bin 0 -> 207 bytes .../gui/sprites/icons/access_read_write.png | Bin 0 -> 243 bytes .../gui/sprites/icons/access_write.png | Bin 0 -> 206 bytes .../textures/gui/sprites/icons/arrow_down.png | Bin 0 -> 180 bytes .../textures/gui/sprites/icons/arrow_left.png | Bin 0 -> 162 bytes .../gui/sprites/icons/arrow_right.png | Bin 0 -> 165 bytes .../textures/gui/sprites/icons/arrow_up.png | Bin 0 -> 165 bytes .../gui/sprites/icons/auto_export_off.png | Bin 0 -> 190 bytes .../gui/sprites/icons/auto_export_on.png | Bin 0 -> 186 bytes .../ae2/textures/gui/sprites/icons/back.png | Bin 0 -> 169 bytes .../icons/background_blank_pattern.png | Bin 0 -> 270 bytes .../sprites/icons/background_chargable.png | Bin 0 -> 112 bytes .../gui/sprites/icons/background_dust.png | Bin 0 -> 112 bytes .../icons/background_encoded_pattern.png | Bin 0 -> 261 bytes .../gui/sprites/icons/background_fuel.png | Bin 0 -> 213 bytes .../gui/sprites/icons/background_ingot.png | Bin 0 -> 216 bytes .../gui/sprites/icons/background_ore.png | Bin 0 -> 112 bytes .../gui/sprites/icons/background_plate.png | Bin 0 -> 174 bytes .../icons/background_primary_output.png | Bin 0 -> 143 bytes .../sprites/icons/background_singularity.png | Bin 0 -> 206 bytes .../sprites/icons/background_spatial_cell.png | Bin 0 -> 288 bytes .../background_spatial_cell_no_shadow.png | Bin 0 -> 276 bytes .../sprites/icons/background_storage_cell.png | Bin 0 -> 289 bytes .../icons/background_storage_component.png | Bin 0 -> 303 bytes .../gui/sprites/icons/background_trash.png | Bin 0 -> 183 bytes .../gui/sprites/icons/background_upgrade.png | Bin 0 -> 184 bytes .../sprites/icons/background_view_cell.png | Bin 0 -> 288 bytes .../icons/background_wireless_booster.png | Bin 0 -> 211 bytes .../icons/background_wireless_term.png | Bin 0 -> 183 bytes .../textures/gui/sprites/icons/blacklist.png | Bin 0 -> 112 bytes .../gui/sprites/icons/blocking_mode_no.png | Bin 0 -> 186 bytes .../gui/sprites/icons/blocking_mode_yes.png | Bin 0 -> 210 bytes .../ae2/textures/gui/sprites/icons/clear.png | Bin 0 -> 230 bytes .../ae2/textures/gui/sprites/icons/cog.png | Bin 0 -> 253 bytes .../gui/sprites/icons/cog_disabled.png | Bin 0 -> 239 bytes .../icons/condenser_output_matter_ball.png | Bin 0 -> 192 bytes .../icons/condenser_output_singularity.png | Bin 0 -> 239 bytes .../sprites/icons/condenser_output_trash.png | Bin 0 -> 199 bytes .../gui/sprites/icons/copy_mode_off.png | Bin 0 -> 234 bytes .../gui/sprites/icons/copy_mode_on.png | Bin 0 -> 202 bytes .../gui/sprites/icons/craft_hammer.png | Bin 0 -> 197 bytes .../ae2/textures/gui/sprites/icons/enter.png | Bin 0 -> 145 bytes .../icons/filter_on_extract_disabled.png | Bin 0 -> 209 bytes .../icons/filter_on_extract_enabled.png | Bin 0 -> 249 bytes .../icons/fluid_substitution_disabled.png | Bin 0 -> 112 bytes .../icons/fluid_substitution_enabled.png | Bin 0 -> 112 bytes .../gui/sprites/icons/fullness_empty.png | Bin 0 -> 143 bytes .../gui/sprites/icons/fullness_full.png | Bin 0 -> 150 bytes .../gui/sprites/icons/fullness_half.png | Bin 0 -> 155 bytes .../gui/sprites/icons/fuzzy_ignore.png | Bin 0 -> 149 bytes .../gui/sprites/icons/fuzzy_percent_25.png | Bin 0 -> 186 bytes .../gui/sprites/icons/fuzzy_percent_50.png | Bin 0 -> 190 bytes .../gui/sprites/icons/fuzzy_percent_75.png | Bin 0 -> 187 bytes .../gui/sprites/icons/fuzzy_percent_99.png | Bin 0 -> 182 bytes .../ae2/textures/gui/sprites/icons/help.png | Bin 0 -> 168 bytes .../gui/sprites/icons/horizontal_tab.png | Bin 0 -> 175 bytes .../sprites/icons/horizontal_tab_focus.png | Bin 0 -> 170 bytes .../sprites/icons/horizontal_tab_selected.png | Bin 0 -> 170 bytes .../gui/sprites/icons/inscriber_buffer_1.png | Bin 0 -> 228 bytes .../gui/sprites/icons/inscriber_buffer_4.png | Bin 0 -> 263 bytes .../gui/sprites/icons/inscriber_buffer_64.png | Bin 0 -> 283 bytes .../icons/inscriber_combined_sides.png | Bin 0 -> 171 bytes .../icons/inscriber_separate_sides.png | Bin 0 -> 176 bytes .../textures/gui/sprites/icons/invalid.png | Bin 0 -> 259 bytes .../gui/sprites/icons/level_energy.png | Bin 0 -> 112 bytes .../textures/gui/sprites/icons/level_item.png | Bin 0 -> 112 bytes .../ae2/textures/gui/sprites/icons/locked.png | Bin 0 -> 164 bytes .../gui/sprites/icons/overlay_off.png | Bin 0 -> 237 bytes .../textures/gui/sprites/icons/overlay_on.png | Bin 0 -> 181 bytes .../gui/sprites/icons/pattern_access_hide.png | Bin 0 -> 303 bytes .../gui/sprites/icons/pattern_access_show.png | Bin 0 -> 290 bytes .../sprites/icons/pattern_terminal_all.png | Bin 0 -> 232 bytes .../icons/pattern_terminal_not_full.png | Bin 0 -> 194 bytes .../icons/pattern_terminal_visible.png | Bin 0 -> 201 bytes .../gui/sprites/icons/placement_block.png | Bin 0 -> 245 bytes .../gui/sprites/icons/placement_item.png | Bin 0 -> 202 bytes .../gui/sprites/icons/power_unit_ae.png | Bin 0 -> 170 bytes .../gui/sprites/icons/power_unit_eu.png | Bin 0 -> 154 bytes .../gui/sprites/icons/power_unit_j.png | Bin 0 -> 118 bytes .../gui/sprites/icons/power_unit_rf.png | Bin 0 -> 165 bytes .../gui/sprites/icons/power_unit_tr.png | Bin 0 -> 134 bytes .../gui/sprites/icons/power_unit_w.png | Bin 0 -> 126 bytes .../textures/gui/sprites/icons/priority.png | Bin 0 -> 191 bytes .../sprites/icons/redstone_above_equal.png | Bin 0 -> 179 bytes .../gui/sprites/icons/redstone_below.png | Bin 0 -> 170 bytes .../gui/sprites/icons/redstone_high.png | Bin 0 -> 157 bytes .../gui/sprites/icons/redstone_ignore.png | Bin 0 -> 182 bytes .../gui/sprites/icons/redstone_low.png | Bin 0 -> 176 bytes .../gui/sprites/icons/redstone_off.png | Bin 0 -> 132 bytes .../gui/sprites/icons/redstone_on.png | Bin 0 -> 133 bytes .../gui/sprites/icons/redstone_pulse.png | Bin 0 -> 161 bytes .../gui/sprites/icons/s_arrow_down.png | Bin 0 -> 149 bytes .../textures/gui/sprites/icons/s_arrow_up.png | Bin 0 -> 142 bytes .../textures/gui/sprites/icons/s_clear.png | Bin 0 -> 174 bytes .../textures/gui/sprites/icons/s_craft.png | Bin 0 -> 185 bytes .../textures/gui/sprites/icons/s_cycle.png | Bin 0 -> 147 bytes .../icons/s_fluid_substitution_disabled.png | Bin 0 -> 177 bytes .../icons/s_fluid_substitution_enabled.png | Bin 0 -> 170 bytes .../textures/gui/sprites/icons/s_machine.png | Bin 0 -> 193 bytes .../gui/sprites/icons/s_processor.png | Bin 0 -> 201 bytes .../textures/gui/sprites/icons/s_storage.png | Bin 0 -> 146 bytes .../sprites/icons/s_substitution_disabled.png | Bin 0 -> 160 bytes .../sprites/icons/s_substitution_enabled.png | Bin 0 -> 159 bytes .../textures/gui/sprites/icons/s_terminal.png | Bin 0 -> 163 bytes .../gui/sprites/icons/scheduling_default.png | Bin 0 -> 231 bytes .../gui/sprites/icons/scheduling_random.png | Bin 0 -> 297 bytes .../sprites/icons/scheduling_round_robin.png | Bin 0 -> 247 bytes .../gui/sprites/icons/search_auto_focus.png | Bin 0 -> 370 bytes .../icons/search_auto_focus_remember.png | Bin 0 -> 112 bytes .../gui/sprites/icons/search_default.png | Bin 0 -> 112 bytes .../textures/gui/sprites/icons/search_jei.png | Bin 0 -> 112 bytes .../sprites/icons/search_jei_auto_clear.png | Bin 0 -> 112 bytes .../textures/gui/sprites/icons/search_rei.png | Bin 0 -> 112 bytes .../sprites/icons/search_rei_auto_clear.png | Bin 0 -> 112 bytes .../gui/sprites/icons/search_remember.png | Bin 0 -> 112 bytes .../gui/sprites/icons/slot_background.png | Bin 0 -> 125 bytes .../gui/sprites/icons/sort_by_amount.png | Bin 0 -> 235 bytes .../icons/sort_by_inventory_tweaks.png | Bin 0 -> 112 bytes .../gui/sprites/icons/sort_by_mod.png | Bin 0 -> 212 bytes .../gui/sprites/icons/sort_by_name.png | Bin 0 -> 175 bytes .../icons/storage_filter_extractable_none.png | Bin 0 -> 177 bytes .../icons/storage_filter_extractable_only.png | Bin 0 -> 167 bytes .../sprites/icons/substitution_disabled.png | Bin 0 -> 112 bytes .../sprites/icons/substitution_enabled.png | Bin 0 -> 112 bytes .../sprites/icons/tab_button_background.png | Bin 0 -> 160 bytes .../tab_button_background_borderless.png | Bin 0 -> 158 bytes ...tab_button_background_borderless_focus.png | Bin 0 -> 224 bytes .../icons/tab_button_background_focus.png | Bin 0 -> 168 bytes .../gui/sprites/icons/tab_crafting.png | Bin 0 -> 301 bytes .../gui/sprites/icons/tab_processing.png | Bin 0 -> 303 bytes .../gui/sprites/icons/tab_smithing.png | Bin 0 -> 390 bytes .../gui/sprites/icons/tab_stonecutting.png | Bin 0 -> 370 bytes .../gui/sprites/icons/terminal_style_full.png | Bin 0 -> 202 bytes .../sprites/icons/terminal_style_medium.png | Bin 0 -> 158 bytes .../sprites/icons/terminal_style_small.png | Bin 0 -> 153 bytes .../gui/sprites/icons/terminal_style_tall.png | Bin 0 -> 161 bytes .../icons/toolbar_button_background.png | Bin 0 -> 157 bytes .../icons/toolbar_button_background_focus.png | Bin 0 -> 159 bytes .../icons/toolbar_button_background_hover.png | Bin 0 -> 160 bytes .../sprites/icons/transparent_facades_off.png | Bin 0 -> 169 bytes .../sprites/icons/transparent_facades_on.png | Bin 0 -> 112 bytes .../gui/sprites/icons/type_filter_all.png | Bin 0 -> 240 bytes .../gui/sprites/icons/type_filter_fluids.png | Bin 0 -> 112 bytes .../gui/sprites/icons/type_filter_items.png | Bin 0 -> 112 bytes .../textures/gui/sprites/icons/unlocked.png | Bin 0 -> 165 bytes .../ae2/textures/gui/sprites/icons/valid.png | Bin 0 -> 112 bytes .../gui/sprites/icons/view_mode_all.png | Bin 0 -> 234 bytes .../gui/sprites/icons/view_mode_crafting.png | Bin 0 -> 188 bytes .../gui/sprites/icons/view_mode_stored.png | Bin 0 -> 189 bytes .../gui/sprites/icons/white_arrow_down.png | Bin 0 -> 161 bytes .../textures/gui/sprites/icons/whitelist.png | Bin 0 -> 112 bytes .../assets/ae2/textures/guis/states.png | Bin 12581 -> 0 bytes 180 files changed, 333 insertions(+), 303 deletions(-) create mode 100644 src/main/java/appeng/integration/modules/emi/SpriteWidget.java create mode 100644 src/main/java/appeng/integration/modules/rei/SpriteWidget.java create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/access_read.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/access_read_write.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/access_write.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_down.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_left.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_right.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_up.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_off.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_on.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/back.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_blank_pattern.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_chargable.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_dust.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_encoded_pattern.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_fuel.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_ingot.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_ore.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_plate.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_primary_output.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_singularity.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_spatial_cell.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_spatial_cell_no_shadow.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_storage_cell.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_storage_component.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_trash.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_upgrade.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_view_cell.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_booster.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_term.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/blacklist.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_no.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_yes.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/clear.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/cog.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/cog_disabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_matter_ball.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_singularity.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_trash.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/copy_mode_off.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/copy_mode_on.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/craft_hammer.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/enter.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_disabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_enabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_disabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_enabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_empty.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_full.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_half.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_ignore.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_25.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_50.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_75.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_99.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/help.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_focus.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_selected.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_1.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_4.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_64.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_combined_sides.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_separate_sides.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/invalid.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/level_energy.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/level_item.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/locked.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_off.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_on.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_access_hide.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_access_show.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_all.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_not_full.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_visible.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_block.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_item.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_ae.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_eu.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_j.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_rf.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_tr.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_w.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/priority.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_above_equal.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_below.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_high.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_ignore.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_low.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_off.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_on.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_pulse.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_arrow_down.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_arrow_up.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_clear.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_craft.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_cycle.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_fluid_substitution_disabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_fluid_substitution_enabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_machine.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_processor.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_storage.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_substitution_disabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_substitution_enabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_terminal.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_default.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_random.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_round_robin.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_auto_focus.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_auto_focus_remember.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_default.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei_auto_clear.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei_auto_clear.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_remember.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/slot_background.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_amount.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_inventory_tweaks.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_mod.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_name.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_none.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_only.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/substitution_disabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/substitution_enabled.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless_focus.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_focus.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_crafting.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_processing.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_smithing.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_stonecutting.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_full.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_medium.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_small.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_tall.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background_focus.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background_hover.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_off.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_on.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_all.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_fluids.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_items.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/unlocked.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/valid.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_all.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_crafting.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_stored.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/white_arrow_down.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/whitelist.png delete mode 100644 src/main/resources/assets/ae2/textures/guis/states.png diff --git a/gradle.properties b/gradle.properties index 0f2f3c1203c..01a6a035235 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,7 +29,7 @@ emi_version=1.1.10+1.21 # please learn how to use semver... top_version_range=[1.20.0,) jade_version_range=[15.0.0,) -rei_version=16.0.729 +rei_version=16.0.744 wthit_version=12.1.2 jade_file_id=5427817 curios_version=7.1.0+1.20.4 diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index 57c263409c4..f8f8dc3a8a7 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -65,6 +65,7 @@ import appeng.client.Point; import appeng.client.gui.layout.SlotGridLayout; import appeng.client.gui.style.BackgroundGenerator; +import appeng.client.gui.style.Blitter; import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.SlotPosition; import appeng.client.gui.style.Text; @@ -518,7 +519,7 @@ private void drawOptionalSlotBackground(GuiGraphics guiGraphics, IOptionalSlot s Point pos = slot.getBackgroundPos(); - Icon.SLOT_BACKGROUND.getBlitter() + Blitter.guiSprite(Icon.SLOT_BACKGROUND) .dest(leftPos + pos.getX(), topPos + pos.getY()) .color(1, 1, 1, alpha) .blit(guiGraphics); @@ -827,7 +828,7 @@ private void renderAppEngSlot(GuiGraphics guiGraphics, AppEngSlot s) { // If the slot has a background icon, render it, but only if the slot is empty // or it requests the icon to be always drawn if ((s.renderIconWithItem() || is.isEmpty()) && s.isSlotEnabled() && s.getIcon() != null) { - s.getIcon().getBlitter() + Blitter.guiSprite(s.getIcon()) .dest(s.x, s.y) .opacity(s.getOpacityOfIcon()) .blit(guiGraphics); diff --git a/src/main/java/appeng/client/gui/Icon.java b/src/main/java/appeng/client/gui/Icon.java index 9b321463bc1..4de75b6fec7 100644 --- a/src/main/java/appeng/client/gui/Icon.java +++ b/src/main/java/appeng/client/gui/Icon.java @@ -20,225 +20,176 @@ import net.minecraft.resources.ResourceLocation; -import appeng.client.gui.style.Blitter; import appeng.core.AppEng; -/** - * Edit in {@code assets/ae2/textures/guis/states.png}. - */ -public enum Icon { - // ROW 0 - REDSTONE_LOW(0, 0), - REDSTONE_HIGH(16, 0), - REDSTONE_PULSE(32, 0), - REDSTONE_IGNORE(48, 0), - REDSTONE_OFF(64, 0), - REDSTONE_ON(80, 0), - REDSTONE_ABOVE_EQUAL(192, 0), - REDSTONE_BELOW(208, 0), - // CLEAR, STASH - CLEAR(96, 0), - ENTER(112, 0), - // ENCODE - WHITE_ARROW_DOWN(128, 0), - // LOCKED - LOCKED(144, 0), - // UNLOCKED - UNLOCKED(160, 0), - HELP(176, 0), - BACKGROUND_PRIMARY_OUTPUT(224, 0), - BACKGROUND_STORAGE_CELL(240, 0), - - // ROW 1 - VIEW_MODE_STORED(0, 16), - VIEW_MODE_ALL(32, 16), - VIEW_MODE_CRAFTING(48, 16), - BLOCKING_MODE_NO(64, 16), - BLOCKING_MODE_YES(80, 16), - BACK(96, 16), - TRANSPARENT_FACADES_OFF(96, 16), - TRANSPARENT_FACADES_ON(112, 16), - TYPE_FILTER_ITEMS(128, 16), - TYPE_FILTER_FLUIDS(144, 16), - TYPE_FILTER_ALL(160, 16), - BACKGROUND_ORE(240, 16), - - // ROW 2 - SEARCH_AUTO_FOCUS(48, 32), - SEARCH_DEFAULT(64, 32), - SEARCH_JEI(80, 32), - SEARCH_REI(96, 32), - SEARCH_AUTO_FOCUS_REMEMBER(112, 32), - SEARCH_REMEMBER(128, 32), - SEARCH_JEI_AUTO_CLEAR(144, 32), - SEARCH_REI_AUTO_CLEAR(160, 32), - BACKGROUND_PLATE(224, 32), - BACKGROUND_DUST(240, 32), - TAB_CRAFTING(0, 32), - TAB_PROCESSING(16, 32), - TAB_SMITHING(32, 32), - TAB_STONECUTTING(48, 32), - - // ROW 3 - ARROW_UP(0, 48), - ARROW_DOWN(16, 48), - ARROW_RIGHT(32, 48), - ARROW_LEFT(48, 48), - SUBSTITUTION_ENABLED(64, 48), - STORAGE_FILTER_EXTRACTABLE_ONLY(80, 48), - STORAGE_FILTER_EXTRACTABLE_NONE(96, 48), - SUBSTITUTION_DISABLED(112, 48), - FLUID_SUBSTITUTION_ENABLED(128, 48), - FLUID_SUBSTITUTION_DISABLED(144, 48), - FILTER_ON_EXTRACT_ENABLED(160, 48), - FILTER_ON_EXTRACT_DISABLED(176, 48), - BACKGROUND_INGOT(224, 48), - BACKGROUND_STORAGE_COMPONENT(240, 48), - - // ROW 4 - SORT_BY_NAME(0, 64), - SORT_BY_AMOUNT(16, 64), - // WRENCH | PARTITION STORAGE - COG(32, 64), - COG_DISABLED(48, 64), - LEVEL_ITEM(64, 64), - SORT_BY_INVENTORY_TWEAKS(80, 64), - SORT_BY_MOD(96, 64), - PRIORITY(144, 64), - BACKGROUND_VIEW_CELL(224, 64), - BACKGROUND_WIRELESS_TERM(240, 64), - - // ROW 5 - FULLNESS_EMPTY(0, 80), - FULLNESS_HALF(16, 80), - FULLNESS_FULL(32, 80), - LEVEL_ENERGY(48, 80), - PATTERN_ACCESS_SHOW(64, 80), - PATTERN_ACCESS_HIDE(80, 80), - PATTERN_TERMINAL_VISIBLE(96, 80), - PATTERN_TERMINAL_ALL(112, 80), - PATTERN_TERMINAL_NOT_FULL(128, 80), - BACKGROUND_TRASH(240, 80), - - // ROW 6 - FUZZY_PERCENT_25(0, 96), - FUZZY_PERCENT_50(16, 96), - FUZZY_PERCENT_75(32, 96), - FUZZY_PERCENT_99(48, 96), - FUZZY_IGNORE(64, 96), - INSCRIBER_SEPARATE_SIDES(80, 96), - INSCRIBER_COMBINED_SIDES(96, 96), - AUTO_EXPORT_OFF(112, 96), - AUTO_EXPORT_ON(128, 96), - INSCRIBER_BUFFER_4(144, 96), - INSCRIBER_BUFFER_64(160, 96), - INSCRIBER_BUFFER_1(176, 96), - BACKGROUND_WIRELESS_BOOSTER(240, 96), - - // ROW 7 - CONDENSER_OUTPUT_TRASH(0, 112), - CONDENSER_OUTPUT_MATTER_BALL(16, 112), - CONDENSER_OUTPUT_SINGULARITY(32, 112), - BACKGROUND_ENCODED_PATTERN(240, 112), - - // ROW 8 - INVALID(0, 128), - VALID(16, 128), - WHITELIST(32, 128), - BLACKLIST(48, 128), - HORIZONTAL_TAB(128, 128, 22, 22), - HORIZONTAL_TAB_SELECTED(128, 150, 22, 22), - HORIZONTAL_TAB_FOCUS(150, 128, 22, 22), - BACKGROUND_BLANK_PATTERN(240, 128), - TOOLBAR_BUTTON_BACKGROUND(176, 128, 18, 20), - TOOLBAR_BUTTON_BACKGROUND_FOCUS(194, 128, 18, 20), - TOOLBAR_BUTTON_BACKGROUND_HOVER(212, 128, 18, 20), - - // ROW 9 - ACCESS_WRITE(0, 144), - ACCESS_READ(16, 144), - ACCESS_READ_WRITE(32, 144), - CRAFT_HAMMER(48, 144), - BACKGROUND_CHARGABLE(240, 144), - - // ROW 10 - POWER_UNIT_AE(0, 160), - POWER_UNIT_EU(16, 160), - POWER_UNIT_J(32, 160), - POWER_UNIT_W(48, 160), - POWER_UNIT_RF(64, 160), - POWER_UNIT_TR(80, 160), - BACKGROUND_SINGULARITY(240, 160), - - // ROW 11 - COPY_MODE_ON(80, 176), - BACKGROUND_SPATIAL_CELL_NO_SHADOW(224, 176), - BACKGROUND_SPATIAL_CELL(240, 176), - - // ROW 12 - COPY_MODE_OFF(80, 192), - TAB_BUTTON_BACKGROUND_BORDERLESS(128, 192, 25, 22), - TAB_BUTTON_BACKGROUND(160, 192, 20, 20), - SLOT_BACKGROUND(192, 192, 18, 18), - BACKGROUND_FUEL(240, 192), - - // ROW 13 - TERMINAL_STYLE_SMALL(0, 208), - TERMINAL_STYLE_MEDIUM(16, 208), - TERMINAL_STYLE_TALL(32, 208), - TERMINAL_STYLE_FULL(48, 208), - BACKGROUND_UPGRADE(240, 208), - - // ROW 14 - PLACEMENT_BLOCK(0, 224), - PLACEMENT_ITEM(16, 224), - TAB_BUTTON_BACKGROUND_BORDERLESS_FOCUS(128, 224, 25, 22), - TAB_BUTTON_BACKGROUND_FOCUS(160, 224, 22, 22), - - SCHEDULING_DEFAULT(0, 240), - SCHEDULING_ROUND_ROBIN(16, 240), - SCHEDULING_RANDOM(32, 240), - OVERLAY_OFF(48, 240), - OVERLAY_ON(64, 240), - - // Small Icons - S_ARROW_UP(224, 192, 8, 8), - S_ARROW_DOWN(232, 192, 8, 8), - S_CLEAR(224, 200, 8, 8), - S_CYCLE(232, 200, 8, 8), - S_SUBSTITUTION_ENABLED(224, 208, 8, 8), - S_SUBSTITUTION_DISABLED(232, 208, 8, 8), - S_FLUID_SUBSTITUTION_ENABLED(224, 216, 8, 8), - S_FLUID_SUBSTITUTION_DISABLED(232, 216, 8, 8), - S_STORAGE(208, 224, 10, 10), - S_PROCESSOR(208, 234, 10, 10), - S_CRAFT(208, 244, 10, 10), - S_TERMINAL(192, 224, 10, 10), - S_MACHINE(192, 234, 10, 10); - - public final int x; - public final int y; - public final int width; - public final int height; - - public static final ResourceLocation TEXTURE = AppEng.makeId("textures/guis/states.png"); - public static final int TEXTURE_WIDTH = 256; - public static final int TEXTURE_HEIGHT = 256; - - Icon(int x, int y) { - this(x, y, 16, 16); - } - - Icon(int x, int y, int width, int height) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - - public Blitter getBlitter() { - return Blitter.texture(TEXTURE, TEXTURE_WIDTH, TEXTURE_HEIGHT) - .src(x, y, width, height); +public final class Icon { + private Icon() { } + public static final ResourceLocation REDSTONE_LOW = AppEng.makeId("icons/redstone_low"); + public static final ResourceLocation REDSTONE_HIGH = AppEng.makeId("icons/redstone_high"); + public static final ResourceLocation REDSTONE_PULSE = AppEng.makeId("icons/redstone_pulse"); + public static final ResourceLocation REDSTONE_IGNORE = AppEng.makeId("icons/redstone_ignore"); + public static final ResourceLocation REDSTONE_OFF = AppEng.makeId("icons/redstone_off"); + public static final ResourceLocation REDSTONE_ON = AppEng.makeId("icons/redstone_on"); + public static final ResourceLocation REDSTONE_ABOVE_EQUAL = AppEng.makeId("icons/redstone_above_equal"); + public static final ResourceLocation REDSTONE_BELOW = AppEng.makeId("icons/redstone_below"); + public static final ResourceLocation CLEAR = AppEng.makeId("icons/clear"); + public static final ResourceLocation ENTER = AppEng.makeId("icons/enter"); + public static final ResourceLocation WHITE_ARROW_DOWN = AppEng.makeId("icons/white_arrow_down"); + public static final ResourceLocation LOCKED = AppEng.makeId("icons/locked"); + public static final ResourceLocation UNLOCKED = AppEng.makeId("icons/unlocked"); + public static final ResourceLocation HELP = AppEng.makeId("icons/help"); + public static final ResourceLocation BACKGROUND_PRIMARY_OUTPUT = AppEng.makeId("icons/background_primary_output"); + public static final ResourceLocation BACKGROUND_STORAGE_CELL = AppEng.makeId("icons/background_storage_cell"); + public static final ResourceLocation VIEW_MODE_STORED = AppEng.makeId("icons/view_mode_stored"); + public static final ResourceLocation VIEW_MODE_ALL = AppEng.makeId("icons/view_mode_all"); + public static final ResourceLocation VIEW_MODE_CRAFTING = AppEng.makeId("icons/view_mode_crafting"); + public static final ResourceLocation BLOCKING_MODE_NO = AppEng.makeId("icons/blocking_mode_no"); + public static final ResourceLocation BLOCKING_MODE_YES = AppEng.makeId("icons/blocking_mode_yes"); + public static final ResourceLocation BACK = AppEng.makeId("icons/back"); + public static final ResourceLocation TRANSPARENT_FACADES_OFF = AppEng.makeId("icons/transparent_facades_off"); + public static final ResourceLocation TRANSPARENT_FACADES_ON = AppEng.makeId("icons/transparent_facades_on"); + public static final ResourceLocation TYPE_FILTER_ITEMS = AppEng.makeId("icons/type_filter_items"); + public static final ResourceLocation TYPE_FILTER_FLUIDS = AppEng.makeId("icons/type_filter_fluids"); + public static final ResourceLocation TYPE_FILTER_ALL = AppEng.makeId("icons/type_filter_all"); + public static final ResourceLocation BACKGROUND_ORE = AppEng.makeId("icons/background_ore"); + public static final ResourceLocation SEARCH_AUTO_FOCUS = AppEng.makeId("icons/search_auto_focus"); + public static final ResourceLocation SEARCH_DEFAULT = AppEng.makeId("icons/search_default"); + public static final ResourceLocation SEARCH_JEI = AppEng.makeId("icons/search_jei"); + public static final ResourceLocation SEARCH_REI = AppEng.makeId("icons/search_rei"); + public static final ResourceLocation SEARCH_AUTO_FOCUS_REMEMBER = AppEng.makeId("icons/search_auto_focus_remember"); + public static final ResourceLocation SEARCH_REMEMBER = AppEng.makeId("icons/search_remember"); + public static final ResourceLocation SEARCH_JEI_AUTO_CLEAR = AppEng.makeId("icons/search_jei_auto_clear"); + public static final ResourceLocation SEARCH_REI_AUTO_CLEAR = AppEng.makeId("icons/search_rei_auto_clear"); + public static final ResourceLocation BACKGROUND_PLATE = AppEng.makeId("icons/background_plate"); + public static final ResourceLocation BACKGROUND_DUST = AppEng.makeId("icons/background_dust"); + public static final ResourceLocation TAB_CRAFTING = AppEng.makeId("icons/tab_crafting"); + public static final ResourceLocation TAB_PROCESSING = AppEng.makeId("icons/tab_processing"); + public static final ResourceLocation TAB_SMITHING = AppEng.makeId("icons/tab_smithing"); + public static final ResourceLocation TAB_STONECUTTING = AppEng.makeId("icons/tab_stonecutting"); + public static final ResourceLocation ARROW_UP = AppEng.makeId("icons/arrow_up"); + public static final ResourceLocation ARROW_DOWN = AppEng.makeId("icons/arrow_down"); + public static final ResourceLocation ARROW_RIGHT = AppEng.makeId("icons/arrow_right"); + public static final ResourceLocation ARROW_LEFT = AppEng.makeId("icons/arrow_left"); + public static final ResourceLocation SUBSTITUTION_ENABLED = AppEng.makeId("icons/substitution_enabled"); + public static final ResourceLocation STORAGE_FILTER_EXTRACTABLE_ONLY = AppEng + .makeId("icons/storage_filter_extractable_only"); + public static final ResourceLocation STORAGE_FILTER_EXTRACTABLE_NONE = AppEng + .makeId("icons/storage_filter_extractable_none"); + public static final ResourceLocation SUBSTITUTION_DISABLED = AppEng.makeId("icons/substitution_disabled"); + public static final ResourceLocation FLUID_SUBSTITUTION_ENABLED = AppEng.makeId("icons/fluid_substitution_enabled"); + public static final ResourceLocation FLUID_SUBSTITUTION_DISABLED = AppEng + .makeId("icons/fluid_substitution_disabled"); + public static final ResourceLocation FILTER_ON_EXTRACT_ENABLED = AppEng.makeId("icons/filter_on_extract_enabled"); + public static final ResourceLocation FILTER_ON_EXTRACT_DISABLED = AppEng.makeId("icons/filter_on_extract_disabled"); + public static final ResourceLocation BACKGROUND_INGOT = AppEng.makeId("icons/background_ingot"); + public static final ResourceLocation BACKGROUND_STORAGE_COMPONENT = AppEng + .makeId("icons/background_storage_component"); + public static final ResourceLocation SORT_BY_NAME = AppEng.makeId("icons/sort_by_name"); + public static final ResourceLocation SORT_BY_AMOUNT = AppEng.makeId("icons/sort_by_amount"); + public static final ResourceLocation COG = AppEng.makeId("icons/cog"); + public static final ResourceLocation COG_DISABLED = AppEng.makeId("icons/cog_disabled"); + public static final ResourceLocation LEVEL_ITEM = AppEng.makeId("icons/level_item"); + public static final ResourceLocation SORT_BY_INVENTORY_TWEAKS = AppEng.makeId("icons/sort_by_inventory_tweaks"); + public static final ResourceLocation SORT_BY_MOD = AppEng.makeId("icons/sort_by_mod"); + public static final ResourceLocation PRIORITY = AppEng.makeId("icons/priority"); + public static final ResourceLocation BACKGROUND_VIEW_CELL = AppEng.makeId("icons/background_view_cell"); + public static final ResourceLocation BACKGROUND_WIRELESS_TERM = AppEng.makeId("icons/background_wireless_term"); + public static final ResourceLocation FULLNESS_EMPTY = AppEng.makeId("icons/fullness_empty"); + public static final ResourceLocation FULLNESS_HALF = AppEng.makeId("icons/fullness_half"); + public static final ResourceLocation FULLNESS_FULL = AppEng.makeId("icons/fullness_full"); + public static final ResourceLocation LEVEL_ENERGY = AppEng.makeId("icons/level_energy"); + public static final ResourceLocation PATTERN_ACCESS_SHOW = AppEng.makeId("icons/pattern_access_show"); + public static final ResourceLocation PATTERN_ACCESS_HIDE = AppEng.makeId("icons/pattern_access_hide"); + public static final ResourceLocation PATTERN_TERMINAL_VISIBLE = AppEng.makeId("icons/pattern_terminal_visible"); + public static final ResourceLocation PATTERN_TERMINAL_ALL = AppEng.makeId("icons/pattern_terminal_all"); + public static final ResourceLocation PATTERN_TERMINAL_NOT_FULL = AppEng.makeId("icons/pattern_terminal_not_full"); + public static final ResourceLocation BACKGROUND_TRASH = AppEng.makeId("icons/background_trash"); + public static final ResourceLocation FUZZY_PERCENT_25 = AppEng.makeId("icons/fuzzy_percent_25"); + public static final ResourceLocation FUZZY_PERCENT_50 = AppEng.makeId("icons/fuzzy_percent_50"); + public static final ResourceLocation FUZZY_PERCENT_75 = AppEng.makeId("icons/fuzzy_percent_75"); + public static final ResourceLocation FUZZY_PERCENT_99 = AppEng.makeId("icons/fuzzy_percent_99"); + public static final ResourceLocation FUZZY_IGNORE = AppEng.makeId("icons/fuzzy_ignore"); + public static final ResourceLocation INSCRIBER_SEPARATE_SIDES = AppEng.makeId("icons/inscriber_separate_sides"); + public static final ResourceLocation INSCRIBER_COMBINED_SIDES = AppEng.makeId("icons/inscriber_combined_sides"); + public static final ResourceLocation AUTO_EXPORT_OFF = AppEng.makeId("icons/auto_export_off"); + public static final ResourceLocation AUTO_EXPORT_ON = AppEng.makeId("icons/auto_export_on"); + public static final ResourceLocation INSCRIBER_BUFFER_4 = AppEng.makeId("icons/inscriber_buffer_4"); + public static final ResourceLocation INSCRIBER_BUFFER_64 = AppEng.makeId("icons/inscriber_buffer_64"); + public static final ResourceLocation INSCRIBER_BUFFER_1 = AppEng.makeId("icons/inscriber_buffer_1"); + public static final ResourceLocation BACKGROUND_WIRELESS_BOOSTER = AppEng + .makeId("icons/background_wireless_booster"); + public static final ResourceLocation CONDENSER_OUTPUT_TRASH = AppEng.makeId("icons/condenser_output_trash"); + public static final ResourceLocation CONDENSER_OUTPUT_MATTER_BALL = AppEng + .makeId("icons/condenser_output_matter_ball"); + public static final ResourceLocation CONDENSER_OUTPUT_SINGULARITY = AppEng + .makeId("icons/condenser_output_singularity"); + public static final ResourceLocation BACKGROUND_ENCODED_PATTERN = AppEng.makeId("icons/background_encoded_pattern"); + public static final ResourceLocation INVALID = AppEng.makeId("icons/invalid"); + public static final ResourceLocation VALID = AppEng.makeId("icons/valid"); + public static final ResourceLocation WHITELIST = AppEng.makeId("icons/whitelist"); + public static final ResourceLocation BLACKLIST = AppEng.makeId("icons/blacklist"); + public static final ResourceLocation HORIZONTAL_TAB = AppEng.makeId("icons/horizontal_tab"); + public static final ResourceLocation HORIZONTAL_TAB_SELECTED = AppEng.makeId("icons/horizontal_tab_selected"); + public static final ResourceLocation HORIZONTAL_TAB_FOCUS = AppEng.makeId("icons/horizontal_tab_focus"); + public static final ResourceLocation BACKGROUND_BLANK_PATTERN = AppEng.makeId("icons/background_blank_pattern"); + public static final ResourceLocation TOOLBAR_BUTTON_BACKGROUND = AppEng.makeId("icons/toolbar_button_background"); + public static final ResourceLocation TOOLBAR_BUTTON_BACKGROUND_FOCUS = AppEng + .makeId("icons/toolbar_button_background_focus"); + public static final ResourceLocation TOOLBAR_BUTTON_BACKGROUND_HOVER = AppEng + .makeId("icons/toolbar_button_background_hover"); + public static final ResourceLocation ACCESS_WRITE = AppEng.makeId("icons/access_write"); + public static final ResourceLocation ACCESS_READ = AppEng.makeId("icons/access_read"); + public static final ResourceLocation ACCESS_READ_WRITE = AppEng.makeId("icons/access_read_write"); + public static final ResourceLocation CRAFT_HAMMER = AppEng.makeId("icons/craft_hammer"); + public static final ResourceLocation BACKGROUND_CHARGABLE = AppEng.makeId("icons/background_chargable"); + public static final ResourceLocation POWER_UNIT_AE = AppEng.makeId("icons/power_unit_ae"); + public static final ResourceLocation POWER_UNIT_EU = AppEng.makeId("icons/power_unit_eu"); + public static final ResourceLocation POWER_UNIT_J = AppEng.makeId("icons/power_unit_j"); + public static final ResourceLocation POWER_UNIT_W = AppEng.makeId("icons/power_unit_w"); + public static final ResourceLocation POWER_UNIT_RF = AppEng.makeId("icons/power_unit_rf"); + public static final ResourceLocation POWER_UNIT_TR = AppEng.makeId("icons/power_unit_tr"); + public static final ResourceLocation BACKGROUND_SINGULARITY = AppEng.makeId("icons/background_singularity"); + public static final ResourceLocation COPY_MODE_ON = AppEng.makeId("icons/copy_mode_on"); + public static final ResourceLocation BACKGROUND_SPATIAL_CELL_NO_SHADOW = AppEng + .makeId("icons/background_spatial_cell_no_shadow"); + public static final ResourceLocation BACKGROUND_SPATIAL_CELL = AppEng.makeId("icons/background_spatial_cell"); + public static final ResourceLocation COPY_MODE_OFF = AppEng.makeId("icons/copy_mode_off"); + public static final ResourceLocation TAB_BUTTON_BACKGROUND_BORDERLESS = AppEng + .makeId("icons/tab_button_background_borderless"); + public static final ResourceLocation TAB_BUTTON_BACKGROUND = AppEng.makeId("icons/tab_button_background"); + public static final ResourceLocation SLOT_BACKGROUND = AppEng.makeId("icons/slot_background"); + public static final ResourceLocation BACKGROUND_FUEL = AppEng.makeId("icons/background_fuel"); + public static final ResourceLocation TERMINAL_STYLE_SMALL = AppEng.makeId("icons/terminal_style_small"); + public static final ResourceLocation TERMINAL_STYLE_MEDIUM = AppEng.makeId("icons/terminal_style_medium"); + public static final ResourceLocation TERMINAL_STYLE_TALL = AppEng.makeId("icons/terminal_style_tall"); + public static final ResourceLocation TERMINAL_STYLE_FULL = AppEng.makeId("icons/terminal_style_full"); + public static final ResourceLocation BACKGROUND_UPGRADE = AppEng.makeId("icons/background_upgrade"); + public static final ResourceLocation PLACEMENT_BLOCK = AppEng.makeId("icons/placement_block"); + public static final ResourceLocation PLACEMENT_ITEM = AppEng.makeId("icons/placement_item"); + public static final ResourceLocation TAB_BUTTON_BACKGROUND_BORDERLESS_FOCUS = AppEng + .makeId("icons/tab_button_background_borderless_focus"); + public static final ResourceLocation TAB_BUTTON_BACKGROUND_FOCUS = AppEng + .makeId("icons/tab_button_background_focus"); + public static final ResourceLocation SCHEDULING_DEFAULT = AppEng.makeId("icons/scheduling_default"); + public static final ResourceLocation SCHEDULING_ROUND_ROBIN = AppEng.makeId("icons/scheduling_round_robin"); + public static final ResourceLocation SCHEDULING_RANDOM = AppEng.makeId("icons/scheduling_random"); + public static final ResourceLocation OVERLAY_OFF = AppEng.makeId("icons/overlay_off"); + public static final ResourceLocation OVERLAY_ON = AppEng.makeId("icons/overlay_on"); + public static final ResourceLocation S_ARROW_UP = AppEng.makeId("icons/s_arrow_up"); + public static final ResourceLocation S_ARROW_DOWN = AppEng.makeId("icons/s_arrow_down"); + public static final ResourceLocation S_CLEAR = AppEng.makeId("icons/s_clear"); + public static final ResourceLocation S_CYCLE = AppEng.makeId("icons/s_cycle"); + public static final ResourceLocation S_SUBSTITUTION_ENABLED = AppEng.makeId("icons/s_substitution_enabled"); + public static final ResourceLocation S_SUBSTITUTION_DISABLED = AppEng.makeId("icons/s_substitution_disabled"); + public static final ResourceLocation S_FLUID_SUBSTITUTION_ENABLED = AppEng + .makeId("icons/s_fluid_substitution_enabled"); + public static final ResourceLocation S_FLUID_SUBSTITUTION_DISABLED = AppEng + .makeId("icons/s_fluid_substitution_disabled"); + public static final ResourceLocation S_STORAGE = AppEng.makeId("icons/s_storage"); + public static final ResourceLocation S_PROCESSOR = AppEng.makeId("icons/s_processor"); + public static final ResourceLocation S_CRAFT = AppEng.makeId("icons/s_craft"); + public static final ResourceLocation S_TERMINAL = AppEng.makeId("icons/s_terminal"); + public static final ResourceLocation S_MACHINE = AppEng.makeId("icons/s_machine"); } diff --git a/src/main/java/appeng/client/gui/implementations/InterfaceScreen.java b/src/main/java/appeng/client/gui/implementations/InterfaceScreen.java index 7997a49c6f5..a3fc35280d3 100644 --- a/src/main/java/appeng/client/gui/implementations/InterfaceScreen.java +++ b/src/main/java/appeng/client/gui/implementations/InterfaceScreen.java @@ -23,6 +23,7 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import appeng.api.config.FuzzyMode; @@ -86,7 +87,7 @@ public SetAmountButton(OnPress onPress) { } @Override - protected Icon getIcon() { + protected ResourceLocation getSprite() { return isHoveredOrFocused() ? Icon.COG : Icon.COG_DISABLED; } } diff --git a/src/main/java/appeng/client/gui/implementations/PatternProviderLockReason.java b/src/main/java/appeng/client/gui/implementations/PatternProviderLockReason.java index f042aed7398..09c6a4cbdde 100644 --- a/src/main/java/appeng/client/gui/implementations/PatternProviderLockReason.java +++ b/src/main/java/appeng/client/gui/implementations/PatternProviderLockReason.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import appeng.api.client.AEKeyRendering; @@ -16,6 +17,7 @@ import appeng.client.gui.ICompositeWidget; import appeng.client.gui.Icon; import appeng.client.gui.Tooltip; +import appeng.client.gui.style.Blitter; import appeng.core.localization.GuiText; import appeng.core.localization.InGameTooltip; @@ -58,7 +60,7 @@ public void setVisible(boolean visible) { public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mouse) { var menu = screen.getMenu(); - Icon icon; + ResourceLocation icon; Component lockStatusText; if (menu.getCraftingLockedReason() == LockCraftingMode.NONE) { icon = Icon.UNLOCKED; @@ -70,7 +72,7 @@ public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mo .setStyle(Style.EMPTY.withColor(Mth.color(193 / 255f, 66 / 255f, 75 / 255f))); } - icon.getBlitter().dest(x, y).blit(guiGraphics); + Blitter.guiSprite(icon).dest(x, y).blit(guiGraphics); guiGraphics.drawString(Minecraft.getInstance().font, lockStatusText, x + 15, y + 5, -1, false); } diff --git a/src/main/java/appeng/client/gui/me/items/CraftingEncodingPanel.java b/src/main/java/appeng/client/gui/me/items/CraftingEncodingPanel.java index 98d674e7273..524f420ec36 100644 --- a/src/main/java/appeng/client/gui/me/items/CraftingEncodingPanel.java +++ b/src/main/java/appeng/client/gui/me/items/CraftingEncodingPanel.java @@ -5,6 +5,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.Slot; import appeng.api.config.ActionItems; @@ -39,7 +40,7 @@ public CraftingEncodingPanel(PatternEncodingTermScreen screen, WidgetContaine } @Override - Icon getIcon() { + ResourceLocation getIcon() { return Icon.TAB_CRAFTING; } diff --git a/src/main/java/appeng/client/gui/me/items/EncodingModePanel.java b/src/main/java/appeng/client/gui/me/items/EncodingModePanel.java index c7610e85354..e81559ffec3 100644 --- a/src/main/java/appeng/client/gui/me/items/EncodingModePanel.java +++ b/src/main/java/appeng/client/gui/me/items/EncodingModePanel.java @@ -2,10 +2,10 @@ import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import appeng.client.Point; import appeng.client.gui.ICompositeWidget; -import appeng.client.gui.Icon; import appeng.client.gui.WidgetContainer; import appeng.menu.me.items.PatternEncodingTermMenu; @@ -23,10 +23,7 @@ public EncodingModePanel(PatternEncodingTermScreen screen, WidgetContainer wi this.widgets = widgets; } - // TODO (Rid): Replaced the ItemStack and an Icon -// abstract ItemStack getTabIconItem(); - - abstract Icon getIcon(); + abstract ResourceLocation getIcon(); abstract Component getTabTooltip(); diff --git a/src/main/java/appeng/client/gui/me/items/ProcessingEncodingPanel.java b/src/main/java/appeng/client/gui/me/items/ProcessingEncodingPanel.java index fb7b882bf7d..eae46e11585 100644 --- a/src/main/java/appeng/client/gui/me/items/ProcessingEncodingPanel.java +++ b/src/main/java/appeng/client/gui/me/items/ProcessingEncodingPanel.java @@ -3,6 +3,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import appeng.api.config.ActionItems; import appeng.client.Point; @@ -86,7 +87,7 @@ private void updateTooltipVisibility() { } @Override - Icon getIcon() { + ResourceLocation getIcon() { return Icon.TAB_PROCESSING; } diff --git a/src/main/java/appeng/client/gui/me/items/SmithingTableEncodingPanel.java b/src/main/java/appeng/client/gui/me/items/SmithingTableEncodingPanel.java index 9f129bd79e6..97bd6d4bf1e 100644 --- a/src/main/java/appeng/client/gui/me/items/SmithingTableEncodingPanel.java +++ b/src/main/java/appeng/client/gui/me/items/SmithingTableEncodingPanel.java @@ -5,6 +5,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.SimpleContainer; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -44,7 +45,7 @@ public SmithingTableEncodingPanel(PatternEncodingTermScreen screen, WidgetCon } @Override - Icon getIcon() { + ResourceLocation getIcon() { return Icon.TAB_SMITHING; } diff --git a/src/main/java/appeng/client/gui/me/items/StonecuttingEncodingPanel.java b/src/main/java/appeng/client/gui/me/items/StonecuttingEncodingPanel.java index 16aa8b05ae7..1710275bb4f 100644 --- a/src/main/java/appeng/client/gui/me/items/StonecuttingEncodingPanel.java +++ b/src/main/java/appeng/client/gui/me/items/StonecuttingEncodingPanel.java @@ -10,6 +10,7 @@ import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.core.RegistryAccess; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeHolder; @@ -159,7 +160,7 @@ public boolean onMouseWheel(Point mousePos, double delta) { } @Override - Icon getIcon() { + ResourceLocation getIcon() { return Icon.TAB_STONECUTTING; } diff --git a/src/main/java/appeng/client/gui/widgets/ActionButton.java b/src/main/java/appeng/client/gui/widgets/ActionButton.java index 29e249f04f8..c3923d6546d 100644 --- a/src/main/java/appeng/client/gui/widgets/ActionButton.java +++ b/src/main/java/appeng/client/gui/widgets/ActionButton.java @@ -24,6 +24,7 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import appeng.api.config.ActionItems; import appeng.client.gui.Icon; @@ -31,7 +32,7 @@ public class ActionButton extends IconButton { private static final Pattern PATTERN_NEW_LINE = Pattern.compile("\\n", Pattern.LITERAL); - private final Icon icon; + private final ResourceLocation icon; public ActionButton(ActionItems action, Runnable onPress) { this(action, a -> onPress.run()); @@ -105,7 +106,7 @@ public ActionButton(ActionItems action, Consumer onPress) { } @Override - protected Icon getIcon() { + protected ResourceLocation getSprite() { return icon; } diff --git a/src/main/java/appeng/client/gui/widgets/IconButton.java b/src/main/java/appeng/client/gui/widgets/IconButton.java index 6f97437ba46..57371aebd9e 100644 --- a/src/main/java/appeng/client/gui/widgets/IconButton.java +++ b/src/main/java/appeng/client/gui/widgets/IconButton.java @@ -28,6 +28,7 @@ import net.minecraft.client.renderer.Rect2i; import net.minecraft.client.sounds.SoundManager; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -62,7 +63,7 @@ public void playDownSound(SoundManager soundHandler) { public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partial) { if (this.visible) { - var icon = this.getIcon(); + var icon = this.getSprite(); var item = this.getItemOverlay(); if (this.halfSize) { @@ -74,12 +75,13 @@ public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float if (this.halfSize) { if (!disableBackground) { - Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter().dest(getX(), getY()).zOffset(10).blit(guiGraphics); + Blitter.guiSprite(Icon.TOOLBAR_BUTTON_BACKGROUND).dest(getX(), getY()).zOffset(10) + .blit(guiGraphics); } if (item != null) { guiGraphics.renderItem(new ItemStack(item), getX(), getY(), 0, 20); } else if (icon != null) { - Blitter blitter = icon.getBlitter(); + Blitter blitter = Blitter.guiSprite(icon); if (!this.active) { blitter.opacity(0.5f); } @@ -87,10 +89,10 @@ public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float } } else { if (!disableBackground) { - Icon bgIcon = isHovered() ? Icon.TOOLBAR_BUTTON_BACKGROUND_HOVER + var bgIcon = isHovered() ? Icon.TOOLBAR_BUTTON_BACKGROUND_HOVER : isFocused() ? Icon.TOOLBAR_BUTTON_BACKGROUND_FOCUS : Icon.TOOLBAR_BUTTON_BACKGROUND; - bgIcon.getBlitter() + Blitter.guiSprite(bgIcon) .dest(getX() - 1, getY() + yOffset, 18, 20) .zOffset(2) .blit(guiGraphics); @@ -98,16 +100,16 @@ public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float if (item != null) { guiGraphics.renderItem(new ItemStack(item), getX(), getY() + 1 + yOffset, 0, 3); } else if (icon != null) { - icon.getBlitter().dest(getX(), getY() + 1 + yOffset).zOffset(3).blit(guiGraphics); + Blitter.guiSprite(icon).dest(getX(), getY() + 1 + yOffset).zOffset(3).blit(guiGraphics); } } } } - protected abstract Icon getIcon(); + protected abstract ResourceLocation getSprite(); /** - * Prioritized over {@link #getIcon()} if not null. + * Prioritized over {@link #getSprite()} if not null. */ @Nullable protected Item getItemOverlay() { diff --git a/src/main/java/appeng/client/gui/widgets/InfoBar.java b/src/main/java/appeng/client/gui/widgets/InfoBar.java index 5a4adf0c3e3..1efd7d22630 100644 --- a/src/main/java/appeng/client/gui/widgets/InfoBar.java +++ b/src/main/java/appeng/client/gui/widgets/InfoBar.java @@ -6,12 +6,13 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; import appeng.api.client.AEKeyRendering; import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEKey; -import appeng.client.gui.Icon; +import appeng.client.gui.style.Blitter; public class InfoBar { private final List widgets = new ArrayList<>(); @@ -38,7 +39,7 @@ interface Widget { } // TODO (RID): Added xPos and yPos to give me better control over render, but the code below might need refactoring - void add(Icon icon, float scale, int xPos, int yPos) { + void add(ResourceLocation icon, float scale, int xPos, int yPos) { widgets.add(new IconWidget(icon, scale, xPos, yPos)); } @@ -84,7 +85,7 @@ public void render(GuiGraphics guiGraphics, int x, int y) { } } - private record IconWidget(Icon icon, float scale, int xPos, int yPos) implements Widget { + private record IconWidget(ResourceLocation icon, float scale, int xPos, int yPos) implements Widget { @Override public int getWidth() { return Math.round(16 * scale); @@ -101,7 +102,7 @@ public void render(GuiGraphics guiGraphics, int x, int y) { poseStack.pushPose(); poseStack.translate(xPos, yPos, 0); poseStack.scale(scale, scale, 1); - icon.getBlitter() + Blitter.guiSprite(icon) .dest(0, 0) .blit(guiGraphics); poseStack.popPose(); diff --git a/src/main/java/appeng/client/gui/widgets/KeyTypeSelectionButton.java b/src/main/java/appeng/client/gui/widgets/KeyTypeSelectionButton.java index b28ed0b4ff3..eb1bac019b0 100644 --- a/src/main/java/appeng/client/gui/widgets/KeyTypeSelectionButton.java +++ b/src/main/java/appeng/client/gui/widgets/KeyTypeSelectionButton.java @@ -7,6 +7,7 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import appeng.api.stacks.AEKeyType; import appeng.api.storage.ISubMenuHost; @@ -101,7 +102,7 @@ public List getTooltipMessage() { } @Override - protected Icon getIcon() { + protected ResourceLocation getSprite() { return Icon.TYPE_FILTER_ALL; } } diff --git a/src/main/java/appeng/client/gui/widgets/OpenGuideButton.java b/src/main/java/appeng/client/gui/widgets/OpenGuideButton.java index ca362ae7ee0..8b652a1df6c 100644 --- a/src/main/java/appeng/client/gui/widgets/OpenGuideButton.java +++ b/src/main/java/appeng/client/gui/widgets/OpenGuideButton.java @@ -3,6 +3,7 @@ import java.util.List; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import appeng.client.gui.Icon; import appeng.core.localization.ButtonToolTips; @@ -20,7 +21,7 @@ public List getTooltipMessage() { } @Override - protected Icon getIcon() { + protected ResourceLocation getSprite() { return Icon.HELP; } } diff --git a/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java b/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java index 776bc131ca8..d20af539b67 100644 --- a/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java +++ b/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java @@ -32,6 +32,7 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; @@ -326,7 +327,7 @@ private void triggerPress() { onPress.handle(this, backwards); } - private static > void registerApp(Icon icon, Setting setting, T val, + private static > void registerApp(ResourceLocation sprite, Setting setting, T val, ButtonToolTips title, Component... tooltipLines) { var lines = new ArrayList(); lines.add(title.text()); @@ -334,7 +335,7 @@ private static > void registerApp(Icon icon, Setting settin appearances.put( new EnumPair<>(setting, val), - new ButtonAppearance(icon, null, lines)); + new ButtonAppearance(sprite, null, lines)); } private static > void registerApp(ItemLike item, Setting setting, T val, @@ -348,9 +349,9 @@ private static > void registerApp(ItemLike item, Setting se new ButtonAppearance(null, item.asItem(), lines)); } - private static > void registerApp(Icon icon, Setting setting, T val, + private static > void registerApp(ResourceLocation sprite, Setting setting, T val, ButtonToolTips title, ButtonToolTips hint) { - registerApp(icon, setting, val, title, hint.text()); + registerApp(sprite, setting, val, title, hint.text()); } @Nullable @@ -362,10 +363,10 @@ private ButtonAppearance getApperance() { } @Override - protected Icon getIcon() { + protected ResourceLocation getSprite() { var app = getApperance(); - if (app != null && app.icon != null) { - return app.icon; + if (app != null && app.sprite() != null) { + return app.sprite(); } return Icon.TOOLBAR_BUTTON_BACKGROUND; } @@ -440,6 +441,7 @@ public boolean equals(Object obj) { } } - private record ButtonAppearance(@Nullable Icon icon, @Nullable Item item, List tooltipLines) { + private record ButtonAppearance(@Nullable ResourceLocation sprite, @Nullable Item item, + List tooltipLines) { } } diff --git a/src/main/java/appeng/client/gui/widgets/TabButton.java b/src/main/java/appeng/client/gui/widgets/TabButton.java index 1a0e22d9711..9e0a2e6c6a8 100644 --- a/src/main/java/appeng/client/gui/widgets/TabButton.java +++ b/src/main/java/appeng/client/gui/widgets/TabButton.java @@ -27,13 +27,15 @@ import net.minecraft.client.gui.components.Button.OnPress; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import appeng.client.gui.Icon; +import appeng.client.gui.style.Blitter; public class TabButton extends Button implements ITooltip { private Style style = Style.BOX; - private Icon icon = null; + private ResourceLocation icon = null; private ItemStack item; private boolean selected; @@ -46,7 +48,7 @@ public enum Style { HORIZONTAL } - public TabButton(Icon ico, Component message, OnPress onPress) { + public TabButton(ResourceLocation ico, Component message, OnPress onPress) { super(0, 0, 22, 22, message, onPress, Button.DEFAULT_NARRATION); this.icon = ico; @@ -82,7 +84,7 @@ public void renderWidget(GuiGraphics guiGraphics, int x, int y, float partial) { } }; if (!disableBackground) { - backdrop.getBlitter().dest(getX(), getY()).blit(guiGraphics); + Blitter.guiSprite(backdrop).dest(getX(), getY()).blit(guiGraphics); } var iconX = switch (this.style) { @@ -97,7 +99,7 @@ public void renderWidget(GuiGraphics guiGraphics, int x, int y, float partial) { }; if (this.icon != null) { - this.icon.getBlitter().dest(getX() + iconX, getY() + iconY - 1).blit(guiGraphics); + Blitter.guiSprite(this.icon).dest(getX() + iconX, getY() + iconY - 1).blit(guiGraphics); } if (this.item != null) { diff --git a/src/main/java/appeng/client/gui/widgets/ToggleButton.java b/src/main/java/appeng/client/gui/widgets/ToggleButton.java index db012f822cd..df4d9971e37 100644 --- a/src/main/java/appeng/client/gui/widgets/ToggleButton.java +++ b/src/main/java/appeng/client/gui/widgets/ToggleButton.java @@ -22,29 +22,28 @@ import java.util.List; import net.minecraft.network.chat.Component; - -import appeng.client.gui.Icon; +import net.minecraft.resources.ResourceLocation; public class ToggleButton extends IconButton implements ITooltip { private final Listener listener; - private final Icon iconOn; - private final Icon iconOff; + private final ResourceLocation iconOn; + private final ResourceLocation iconOff; private List tooltipOn = Collections.emptyList(); private List tooltipOff = Collections.emptyList(); private boolean state; - public ToggleButton(Icon on, Icon off, Component displayName, + public ToggleButton(ResourceLocation on, ResourceLocation off, Component displayName, Component displayHint, Listener listener) { this(on, off, listener); setTooltipOn(List.of(displayName, displayHint)); setTooltipOff(List.of(displayName, displayHint)); } - public ToggleButton(Icon on, Icon off, Listener listener) { + public ToggleButton(ResourceLocation on, ResourceLocation off, Listener listener) { super(null); this.iconOn = on; this.iconOff = off; @@ -68,7 +67,7 @@ public void setState(boolean isOn) { this.state = isOn; } - protected Icon getIcon() { + protected ResourceLocation getSprite() { return this.state ? this.iconOn : this.iconOff; } diff --git a/src/main/java/appeng/client/gui/widgets/ValidationIcon.java b/src/main/java/appeng/client/gui/widgets/ValidationIcon.java index 42bccb64936..01ea990e4d0 100644 --- a/src/main/java/appeng/client/gui/widgets/ValidationIcon.java +++ b/src/main/java/appeng/client/gui/widgets/ValidationIcon.java @@ -26,6 +26,7 @@ import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.navigation.FocusNavigationEvent; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import appeng.client.gui.Icon; @@ -62,7 +63,7 @@ public void setTooltip(List lines) { } @Override - protected Icon getIcon() { + protected ResourceLocation getSprite() { return Icon.INVALID; } diff --git a/src/main/java/appeng/client/guidebook/render/RenderContext.java b/src/main/java/appeng/client/guidebook/render/RenderContext.java index 14b5419a094..2a3ee9e5d45 100644 --- a/src/main/java/appeng/client/guidebook/render/RenderContext.java +++ b/src/main/java/appeng/client/guidebook/render/RenderContext.java @@ -23,7 +23,6 @@ import net.neoforged.neoforge.fluids.FluidStack; import appeng.api.stacks.AEFluidKey; -import appeng.client.gui.Icon; import appeng.client.gui.style.BackgroundGenerator; import appeng.client.gui.style.FluidBlitter; import appeng.client.guidebook.color.ColorValue; @@ -84,14 +83,20 @@ default void fillTexturedRect(LytRect rect, TextureAtlasSprite sprite, ColorValu sprite.getU0(), sprite.getV0(), sprite.getU1(), sprite.getV1()); } - default void drawIcon(int x, int y, Icon icon, ColorValue color) { - var u0 = icon.x / (float) Icon.TEXTURE_WIDTH; - var v0 = icon.y / (float) Icon.TEXTURE_HEIGHT; - var u1 = (icon.x + icon.width) / (float) Icon.TEXTURE_WIDTH; - var v1 = (icon.y + icon.height) / (float) Icon.TEXTURE_HEIGHT; + default void drawIcon(int x, int y, ResourceLocation guiSprite, ColorValue color) { + var sprite = Minecraft.getInstance().getGuiSprites().getSprite(guiSprite); + drawIcon(x, y, sprite, color); + } + + default void drawIcon(int x, int y, TextureAtlasSprite sprite, ColorValue color) { + var u0 = sprite.getU0(); + var v0 = sprite.getV0(); + var u1 = sprite.getU1(); + var v1 = sprite.getV1(); - var texture = Minecraft.getInstance().getTextureManager().getTexture(Icon.TEXTURE); - fillTexturedRect(new LytRect(x, y, icon.width, icon.height), texture, color, color, color, color, + var contents = sprite.contents(); + var texture = Minecraft.getInstance().getTextureManager().getTexture(sprite.atlasLocation()); + fillTexturedRect(new LytRect(x, y, contents.width(), contents.height()), texture, color, color, color, color, u0, v0, u1, v1); } diff --git a/src/main/java/appeng/integration/modules/emi/EmiCondenserRecipe.java b/src/main/java/appeng/integration/modules/emi/EmiCondenserRecipe.java index 5ac7a4ef72e..01b01bc5aaf 100644 --- a/src/main/java/appeng/integration/modules/emi/EmiCondenserRecipe.java +++ b/src/main/java/appeng/integration/modules/emi/EmiCondenserRecipe.java @@ -21,6 +21,7 @@ import appeng.api.config.CondenserOutput; import appeng.api.implementations.items.IStorageComponent; import appeng.blockentity.misc.CondenserBlockEntity; +import appeng.client.gui.Icon; import appeng.core.AppEng; import appeng.core.definitions.AEBlocks; import appeng.core.definitions.AEItems; @@ -51,17 +52,19 @@ public void addWidgets(WidgetHolder widgets) { var background = AppEng.makeId("textures/guis/condenser.png"); widgets.addTexture(background, 0, 0, 96, 48, 48, 25); - var statesLocation = AppEng.makeId("textures/guis/states.png"); - widgets.addTexture(statesLocation, 4, 28, 14, 14, 241, 81); - widgets.addTexture(statesLocation, 80, 28, 16, 16, 240, 240); + widgets.add(new SpriteWidget(Icon.BACKGROUND_TRASH, 3, 27, 16, 16)); + widgets.add(new SpriteWidget(Icon.TOOLBAR_BUTTON_BACKGROUND, 79, 28, 16, 16)); + widgets.addDrawable(79, 28, 16, 16, (draw, mouseX, mouseY, delta) -> { + draw.blitSprite(Icon.TOOLBAR_BUTTON_BACKGROUND, 0, 0, 16, 16); + }); widgets.addAnimatedTexture(background, 72, 0, 6, 18, 176, 0, 2000, false, true, false); if (type == CondenserOutput.MATTER_BALLS) { - widgets.addTexture(statesLocation, 80, 28, 14, 14, 16, 112); + widgets.add(new SpriteWidget(Icon.CONDENSER_OUTPUT_MATTER_BALL, 79, 27, 16, 16)); } else if (type == CondenserOutput.SINGULARITY) { - widgets.addTexture(statesLocation, 80, 28, 14, 14, 32, 112); + widgets.add(new SpriteWidget(Icon.CONDENSER_OUTPUT_SINGULARITY, 79, 27, 16, 16)); } widgets.addTooltipText(getTooltip(type), 80, 28, 16, 16); diff --git a/src/main/java/appeng/integration/modules/emi/SpriteWidget.java b/src/main/java/appeng/integration/modules/emi/SpriteWidget.java new file mode 100644 index 00000000000..23c9ac556da --- /dev/null +++ b/src/main/java/appeng/integration/modules/emi/SpriteWidget.java @@ -0,0 +1,27 @@ +package appeng.integration.modules.emi; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; + +import dev.emi.emi.api.widget.Bounds; +import dev.emi.emi.api.widget.Widget; + +final class SpriteWidget extends Widget { + private final ResourceLocation id; + private final Bounds bounds; + + SpriteWidget(ResourceLocation id, int x, int y, int width, int height) { + this.id = id; + this.bounds = new Bounds(x, y, width, height); + } + + @Override + public Bounds getBounds() { + return bounds; + } + + @Override + public void render(GuiGraphics draw, int mouseX, int mouseY, float delta) { + draw.blitSprite(id, bounds.x(), bounds.y(), bounds.width(), bounds.height()); + } +} diff --git a/src/main/java/appeng/integration/modules/rei/CondenserCategory.java b/src/main/java/appeng/integration/modules/rei/CondenserCategory.java index d1c53111204..c5382bc70c3 100644 --- a/src/main/java/appeng/integration/modules/rei/CondenserCategory.java +++ b/src/main/java/appeng/integration/modules/rei/CondenserCategory.java @@ -40,6 +40,7 @@ import me.shedaniel.rei.api.common.util.EntryStacks; import appeng.api.config.CondenserOutput; +import appeng.client.gui.Icon; import appeng.core.AppEng; import appeng.core.definitions.AEBlocks; @@ -76,21 +77,13 @@ public List setupDisplay(CondenserOutputDisplay recipeDisplay, Rectangle ResourceLocation location = AppEng.makeId("textures/guis/condenser.png"); widgets.add(Widgets.createTexturedWidget(location, origin.x, origin.y, 50, 25, 94, 48)); - ResourceLocation statesLocation = AppEng.makeId("textures/guis/states.png"); - widgets.add(Widgets.createTexturedWidget(statesLocation, origin.x + 2, origin.y + 28, 241, 81, 14, 14)); - widgets.add(Widgets.createTexturedWidget(statesLocation, origin.x + 78, origin.y + 28, 240, 240, 16, 16)); - - // FIXME IDrawableStatic progressDrawable = guiHelper.drawableBuilder(location, - // 178, 25, 6, 18).addPadding(0, 0, 70, 0) - // FIXME .build(); - // FIXME this.progress = guiHelper.createAnimatedDrawable(progressDrawable, 40, - // IDrawableAnimated.StartDirection.BOTTOM, - // FIXME false); + widgets.add(new SpriteWidget(Icon.BACKGROUND_TRASH, bounds.x + 3, bounds.y + 27, 16, 16)); + widgets.add(new SpriteWidget(Icon.TOOLBAR_BUTTON_BACKGROUND, bounds.x + 79, bounds.y + 28, 16, 16)); if (recipeDisplay.getType() == CondenserOutput.MATTER_BALLS) { - widgets.add(Widgets.createTexturedWidget(statesLocation, origin.x + 78, origin.y + 28, 16, 112, 14, 14)); + widgets.add(new SpriteWidget(Icon.CONDENSER_OUTPUT_MATTER_BALL, bounds.x + 79, bounds.y + 27, 16, 16)); } else if (recipeDisplay.getType() == CondenserOutput.SINGULARITY) { - widgets.add(Widgets.createTexturedWidget(statesLocation, origin.x + 78, origin.y + 28, 32, 112, 14, 14)); + widgets.add(new SpriteWidget(Icon.CONDENSER_OUTPUT_SINGULARITY, bounds.x + 79, bounds.y + 27, 16, 16)); } widgets.add(Widgets.createDrawableWidget((guiGraphics, mouseX, mouseY, delta) -> { Rectangle rect = new Rectangle(origin.x + 78, origin.y + 28, 16, 16); diff --git a/src/main/java/appeng/integration/modules/rei/SpriteWidget.java b/src/main/java/appeng/integration/modules/rei/SpriteWidget.java new file mode 100644 index 00000000000..c8c523a16a6 --- /dev/null +++ b/src/main/java/appeng/integration/modules/rei/SpriteWidget.java @@ -0,0 +1,35 @@ +package appeng.integration.modules.rei; + +import java.util.List; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.resources.ResourceLocation; + +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; + +final class SpriteWidget extends WidgetWithBounds { + private final ResourceLocation id; + private final Rectangle bounds; + + SpriteWidget(ResourceLocation id, int x, int y, int width, int height) { + this.id = id; + this.bounds = new Rectangle(x, y, width, height); + } + + @Override + public Rectangle getBounds() { + return bounds; + } + + @Override + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + guiGraphics.blitSprite(id, bounds.x, bounds.y, bounds.width, bounds.height); + } + + @Override + public List children() { + return List.of(); + } +} diff --git a/src/main/java/appeng/menu/implementations/QuartzKnifeMenu.java b/src/main/java/appeng/menu/implementations/QuartzKnifeMenu.java index 6da9b334ba1..e50f2a354fd 100644 --- a/src/main/java/appeng/menu/implementations/QuartzKnifeMenu.java +++ b/src/main/java/appeng/menu/implementations/QuartzKnifeMenu.java @@ -19,6 +19,7 @@ package appeng.menu.implementations; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -30,7 +31,6 @@ import appeng.api.ids.AEComponents; import appeng.api.implementations.menuobjects.ItemMenuHost; import appeng.api.inventories.InternalInventory; -import appeng.client.gui.Icon; import appeng.core.definitions.AEItems; import appeng.menu.AEBaseMenu; import appeng.menu.SlotSemantics; @@ -82,7 +82,7 @@ public void removed(Player player) { } private class QuartzKniveSlot extends OutputSlot { - QuartzKniveSlot(InternalInventory inv, int invSlot, Icon icon) { + QuartzKniveSlot(InternalInventory inv, int invSlot, ResourceLocation icon) { super(inv, invSlot, icon); } diff --git a/src/main/java/appeng/menu/slot/AppEngSlot.java b/src/main/java/appeng/menu/slot/AppEngSlot.java index 469ef542cf0..d3e7fb72b6b 100644 --- a/src/main/java/appeng/menu/slot/AppEngSlot.java +++ b/src/main/java/appeng/menu/slot/AppEngSlot.java @@ -24,6 +24,7 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.Container; import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Player; @@ -32,7 +33,6 @@ import appeng.api.inventories.InternalInventory; import appeng.api.stacks.GenericStack; -import appeng.client.gui.Icon; import appeng.core.AELog; import appeng.menu.AEBaseMenu; @@ -55,7 +55,7 @@ public class AppEngSlot extends Slot { * Shows an icon from the icon sprite-sheet in the background of this slot. */ @Nullable - private Icon icon; + private ResourceLocation icon; /** * Caches if the item stack currently contained in this slot is "valid" or not for UI purposes. */ @@ -235,11 +235,11 @@ public boolean renderIconWithItem() { return false; } - public Icon getIcon() { + public ResourceLocation getIcon() { return this.icon; } - public void setIcon(Icon icon) { + public void setIcon(ResourceLocation icon) { this.icon = icon; } diff --git a/src/main/java/appeng/menu/slot/OutputSlot.java b/src/main/java/appeng/menu/slot/OutputSlot.java index ea612fda8bb..90526888da4 100644 --- a/src/main/java/appeng/menu/slot/OutputSlot.java +++ b/src/main/java/appeng/menu/slot/OutputSlot.java @@ -18,14 +18,14 @@ package appeng.menu.slot; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import appeng.api.inventories.InternalInventory; -import appeng.client.gui.Icon; public class OutputSlot extends AppEngSlot { - public OutputSlot(InternalInventory inv, int invSlot, Icon icon) { + public OutputSlot(InternalInventory inv, int invSlot, ResourceLocation icon) { super(inv, invSlot); this.setIcon(icon); } diff --git a/src/main/java/appeng/menu/slot/RestrictedInputSlot.java b/src/main/java/appeng/menu/slot/RestrictedInputSlot.java index 3c3f8c690f5..646de977d4c 100644 --- a/src/main/java/appeng/menu/slot/RestrictedInputSlot.java +++ b/src/main/java/appeng/menu/slot/RestrictedInputSlot.java @@ -18,6 +18,7 @@ package appeng.menu.slot; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -245,9 +246,9 @@ public enum PlacableItemType { INSCRIBER_INPUT(Icon.BACKGROUND_INGOT), METAL_INGOTS(Icon.BACKGROUND_INGOT); - public final Icon icon; + public final ResourceLocation icon; - PlacableItemType(Icon o) { + PlacableItemType(ResourceLocation o) { this.icon = o; } } diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/access_read.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/access_read.png new file mode 100644 index 0000000000000000000000000000000000000000..907e87a4d49fb2667a6cae581ad566dc334fd40d GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>z@qLn;{G9yH`SWFXS;(B5>i z^ZNzc1#CPX&Q;!h&eD<9wrPC!~;~fIz2n)6^a}rF>c9Bu)lZb9Uvy{5^Kd%z-oAActp zR_kkIq;Ra5*dmgOCtHh$Iw6A$-U&s5-`)rY0rF z&@?sQ$S|ln2C5EAhM{e@qUum}wCz?fMyXZXUNM%labx$_sztJ9H}Y6D9xv002ovPDHLkV1i#hWDo!V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/access_write.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/access_write.png new file mode 100644 index 0000000000000000000000000000000000000000..d4675606ac78539d2bd3815a5c05137491d2b343 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn;{G9$d(K$U&sx;s2?@ z9bRk++(K-MmBn+~Uik$y+O+Nwow3mIq4X*}#_AQ5+U|J2GN_TaSC{y9ygKdKt(?{- zuERI@eU8-~*mTI?+w-)&mUH6z)wiGaGvHv=T@3aVPK2!vapHg+$px z&%0brUTJXTM&~N`tHR0Z5;AR5f}SltDbLL@RmtxEvCYP5wQzE)Dl=dG#JTuaG^D*AU2?ib#Dm+4LmR4!k zc0Al$9>XDf^@#bZ&U-G)uO(|gjY*!fGsySJ9&0OM`72d9OXp$y;DRK ehxg<4dl|UTsuhJjnXC$Q27{-opUXO@geCy_Y((+^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_left.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..1214fde3922e653901b1a205f7b0fb822c4324b7 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar*{o4?6N5HV|+N(WlX;OXk; Jvd$@?2>_WHI1T^+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_right.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..b50c1d4bbd258a3427e3eff0f6a0abf2cf6f3128 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*{o4?6NP849#rTz_`n z>m1P@29c1XS}Pht4bIguGqZcBEm2|3Yx({oT3NGV;UB@a9mCyMA~tQCEy z6@Sa)jFs{8$`1+GPMQgQ51e7uB)z%sw}#48*EHGhfj^Gyi*LGL%G&!|e$KLE2NnSB OW$<+Mb6Mw<&;$U|_B|Q^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_up.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..c344d9222ed895a05ca774a6fbbc685f94f581e6 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*{w4<6(_tRUceaC^sR zGY{F2hg>lY+6y+{KcHr(vPq!ep-^g@y}G6fEBCRMB@YhX?PW}M2r_u^&h7XM4=%Ag zcPmbmc&)67xqfi%lv6&-F5k+mkv$llz1(o(jVTZqsj>9a@3`nfxkcNG4lM!N%i!ti K=d#Wzp$PyodqOP$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_off.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1fb5b1cdf5ec0542d3b72a5dac0fb542cd807d GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*{w4?6N5au9L7Xgzt| zYaUjA2CjWwS}Pg?4bIJL^cSD-XTl_t4Uc91^}KzOV7+riut($DDNU!!J~=LzNOtBr zcB3NQ+VZ02l7w@6Jr7FWJ~`Vh(Ryb>?Db>8&)vCOMdnB*KX&C>)tYo}Z()`Q@O1TaS?83{1OPU{ODg~X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_on.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_on.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2375126b5d6e09256668ed9b64d0ae2057e46f GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*{w4?6N5HV|+uiwX hA4j+Co%FnldHx!sd7I_livS(N;OXk;vd$@?2>^bgLsb9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/back.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/back.png new file mode 100644 index 0000000000000000000000000000000000000000..77b705a8ab69789e54393f523c0040dbd0c3c576 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr*{w4?6NP8}hgwe6I0a z;EzR9k|4_gB?DvO0{^wEG@_T@3bsBh-`$booT#WY$@iFw(j@+<>|?VJ`L=dmshngL z)7UTDDX;%y Sti%Mgo59o7&t;ucLK6V7RXzX! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_blank_pattern.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_blank_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..bcca8097bfb0b04da974d25fca92115e6fb6f033 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`S3O-ELn;`T9z57N+fkt9;(2@F zhF)fkS3!=yAF0Ur#?R_Y*~@IL(6VLP&F}mE{`&j8S3knOzUH~M*!&f8eGxXBDi&1T zNGc5B-?(G@jzHU-jXT7XMv;f)jU5p=OdeX-;k2)jvJkpoTjgu?BlEMe{AcLo? KpUXO@geCwUF>tZ~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_chargable.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_chargable.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_dust.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_encoded_pattern.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_encoded_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..f31a4f059f70b737ae7f075c5e1465fd2607d03c GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`XFOdTLn;`T9(43_4is>?`1<+z z)eFkrAMxF>w(Xth3jP`aCn06a=WqW${@g7tv**Q=##f2mM|IWBL-@UQw!KmmyY8n4 zVy-*7sH)@W(#i5y4-0j>Ck5IbNwQwm9&zN6pa2bpwsOdbsQph%eTiF8inJXnhF(MvEN+-TQ%b$I+r9 xRk5qiK&ulwk8YhT4Kyle z_F=_Y?pwW{627@zT`rO{8lQb;-~Y{0Uw(f4{hS%^^Vh$bG3P{97~jV;PZU-cc7%pK z7D#97UUN*bPey6ArSXmvikoIFJ}7VD61G|DPO2&2N9pzxS#oT%+5SHeh&+2X;c~*| z2j_rlv^Pn$@0h6r)C4kQb5Te8$wucCQ|wYm#J8D>$E$p`)=uQStS3j3^ HP6?q)J@qH@O zghB?_SgVZKIW3D{dS9M+BI?6|O%f+R?fG8z_s_142{n7-BQ}0?kMs>IHmgurJ@Zh~ z^s6mLO)O4kE!$wh-MvOlr>uGRnl!HN^g~LkIlCtUC07GkHzT%e%t*fYKz`G#*odAD zC$bJbng~*rSs*SJ=^G)FY8o8zC+&l>&Zb$5H&mn*2#Bq}74e04vWv+Z`#;l!flg)c MboFyt=akR{0I<7TO#lD@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_ore.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_plate.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..1842dd2fdb1a2d67ea98d5b6f9320e1099d6adc8 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar*{E4{qdTGURc%*#DH# zfhS?-#|tJp2Td}S{EK2#xVZEL{@i<6R-YsC;%iY_hHa!^9?z+DUsdizT&xnx<8XDF z7_dYp!?sd9uSUtIMf%~fo`5AjTjtd)mfPQR~W V&yG%RF$X$;!PC{xWt~$(698P6JU9RV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_primary_output.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_primary_output.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9e32215059ab5c09a96e31a2c2f0827ee5a3a7 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VV*9IAr*{E51!_2P!Mss`1*Hr}*?zne>C~acvX^Tq{ zS3vOQj-C@q`kM+Q_m|v@Ii|BoLaEz!`p1hu52d<@HJ_g0DyEm5AyXh(t*5+6LaG}K p?O|G+pEsNa8@u>3`}B`zxdqs?pT(%X<_9{E!PC{xWt~$(698J)Pd)$u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_spatial_cell.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_spatial_cell.png new file mode 100644 index 0000000000000000000000000000000000000000..edbcaf4a261eec02045ef85c93fe2df875d2facf GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&pllnLn;`T9z5vj5-8wu@%7{P zp=u4w%tW_HPd1o!&qTIif#3>WuKtJC9P^65fBEz2An*G8_dTZ%+ot!Oe$1S{X;vbu z^6HIE+3evUrnUBotThSSe@wfYVj7mfx_eDpgk#v|=$eyRYYuRgMV{Tz1Qz+6T&T2K zGHk+C9-#U*(G=6@1PLn;`T9z2*C6DZ(v@%8a1 zfmfDo61U)Rzc_oD^2VzQ2h)ETOO%{j-+#aU-zT@P821%RvnNc+UR8`jkg{NzWbuy~*I|>gTe~DWM4fRq%W4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_storage_cell.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_storage_cell.png new file mode 100644 index 0000000000000000000000000000000000000000..cb55abff56f986b06a7e475a483d8c4d1e981946 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`FFaiwLn;`T9z2*S8z|s%@pU58 zghB?_T&;}UIW3D{`d*%RqiO;BVT1S^Kj!4Wx3B;E%zlpjzWpD)zHT`B=;X=fSBafR z!)%W{diP{eRYX#uc=szsv2b_y_~G<*!;z%ba_jmcLijh{ND}Oh$k|v?^g&VVsQxa`>R0r+NvE#lUBrUx>xQF?fTnzV&>8_Wq{9`cAzZHJ;-glWnuk-51_K3w+-R_29Y@1# zkASp1>V5UFUTiv0TQtZ$V%@hNX^H`zkhC$Be|v-s$T3Hk17%^ZE$lqH|Hz}M`x#ag VhX@$A?g54XgQu&X%Q~loCIGVeg-rke literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_trash.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_trash.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a51cfe3f581855c0a9d5b9f75bd3e16a207b02 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr*{E4<6)Xa^!Kim_LI_ zgqvgMk_>&bMAMxuA&br=CPaiqoT%P@{rBgki8k`(RxQg8cAj|DGrP#-hKpGD>`mP| zO5G=YBiZU*#KJkG%~Okl)y$9j&b%|_r0-2mU#H0zR7^O1o0-j3H_cG$R^3z(+{dPV gXUggpwS_O)lUK_;`Ni_i3Fs0APgg&ebxsLQ082GN@&Et; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_upgrade.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_upgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f7418dd79af2bac32bd956c0590478a0cb259e GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar*{E4<6)Xa^!Kim_LI_ zgqvgMk_>&bMAMxuA&aaZ9N46OcTahxO?BOzL72V zE@Htc8#&Zn#U@`+G2!%e0#b9HEb}?!m}2NE=AL)z$ub?Fn8}SDniG!-MfyxUI&tYQ8E?yQp(XnW+*hE?qmM;>X3wZBRf?|$`g zLq)i42>(^*uLT`P7gpUkx~S?#?j4{Z8@rE&>a1!%Dtz^@yO~_aQRA!5I%VDdE9BON z0fi&(tdx7FbMMHas*a=Sy7z#(I*$Ga>9Xi_{rbV@t3Y?e8!_>XK-FN|avnEEgzy7( b{bavCIpv9;=f-rPml-@={an^LB{Ts5FnNRz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_booster.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_booster.png new file mode 100644 index 0000000000000000000000000000000000000000..4cecd17116e3799e334ad8573cd3a3367a724e2d GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLn;`T9z4i-D1fKo;r&UB zBJ3PHQ!@1R9-8cI@mcgGfTMq3)Qj(TBXHXwoZ?ixrkLObx)mriIdqpRW!0B@048PAz#bK>?XYidtU$EHwEZQ22WQ% Jmvv4FO#o-WQzifa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_term.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_term.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba3fd73c6d5a7b94dde745d99b6f89a2dc865e3 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr*{E4<6(^Y{27iF@7;) zlvTq8SLg4SRIPgToF*?}5i(F@Vc-A#M@>Dq@RPq)m%4TCObP7u?Dcd~-xT307Jg^S z+zp*TF~Nzgvo{IxDRpb-dHGvBTsEgur%!4!1hxoIJgV{VfbUM{8#^>79_27kRWG?S bW%s{}kK}eZ2fjW4bP0o}tDnm{r-UW|wn;@O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/blacklist.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/blacklist.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_no.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_no.png new file mode 100644 index 0000000000000000000000000000000000000000..c51dc8e61f73025c580640af7014c1c7419668b3 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*{Q4<6)gHV|+F=jhCmmYDavvx=V`_pyp+nGxwXc;8JxV4u@fV%zG*`=;_41DP;%j1N@1}aI jv_^8SGtxe|-j?z4RKxV`p=bGlj$!b0^>bP0l+XkK>Q_UW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_yes.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_yes.png new file mode 100644 index 0000000000000000000000000000000000000000..05042600855f06fa37edd543c5dc75e7541f0370 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Ln;{09t_Mq>>%KJarf#P zePiVchNgr7iGz&=m%Ul)si%+C>*zI~K?uJE>QZYdzE)6ng)%X8N^t=JcI3|4i=;U*aXKq>~?*6g#W82$D2P77M zyzn#NIg{purnw?-@?s`fO5eXWsp-tk9a)j@j-~-|{BNeawbp&y7cQFv9m(M7>gTe~ HDWM4f`b%Bt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/clear.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..3869b8506b2e69a5d1a4b256e5cc8771e5c4d6df GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ydu{YLn;{G9$eUa*g=5xf<52; zO^2G8mN$fKxN~e}0=I#w4iYagp!ga zQ&<`m6kgs~nO1Y=vv9no>cN8z!mA|HT+ei^NSm`$VMVF*^rx(wm2Pa^=C?KP@uoc& eZdpC7uVm)d_W!uTCAJ;ta0X9TKbLh*2~7ZmnO-RX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/cog.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/cog.png new file mode 100644 index 0000000000000000000000000000000000000000..df6802ab923573c181ca598aa43d032e9f72df17 GIT binary patch literal 253 zcmV4xJ6vyG;bBk}RvO|Gy08elrEI|gDzypMu9Lx-5K^dapzrd?2*^+gVEtOUMKK?mL zAt^Y}(U269f`+7!6f}&6q~JhG$=K*oK7E{&*#f93|D57f|+|^njXAfpH~(}LsD=crDSY$ z>~Jrv+zWf&X}A}D)H)j6f?2JjxfA?W&VA(E2Y=c(ruJ2^wExxr00000NkvXXu0mjf D5Vmc3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/cog_disabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/cog_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..9691e9d054d1c67f7657243ead9bfaa1adca5fe5 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+dN$yLn;{W9yH84;=sdtVg1e- zg_Erq%k5gd=Q}L*TbSpt>Z-(ipWWQa5^Omh;-BRHS&I3J`PyhmY{=M@k#u0u$wi%v zi3b*Svj5&DWX0NCa9H(@K;DiPX}1=>ZnaqjhYQ0F-L}#F`Sow}>3wTkmOVID80J(w zXKKOX1;Tk8<~18K7A0Oh61_w5&IM(j2$PQq_rsi)KXBXeP$+LlumOj8i*(;+p;?dD mhyWG;Ic1}3>F@o>znU?IIcP>raH9#(2MnIBelF{r5}E*bSY4|C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_matter_ball.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_matter_ball.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7f9550abed70165e7d43460092eb82fce00021 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`tPu%m^(yd|#@_fv6JdE^`Wg6pm z8(W8&>7zopr0O>?qs{jB1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_trash.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_trash.png new file mode 100644 index 0000000000000000000000000000000000000000..2cff832c2d0089b6fa3d03f83dc11da96796dc6d GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr*{Q4?1!(8wxmFv|sq# zqPt0O1DD%TEeXazgL6p2zzov1pp133M5Qr>mdKI;Vst0P?9#-~a#s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/copy_mode_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/copy_mode_off.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb7b3ce3246937e21d5c8f564e26e0e057a5de1 GIT binary patch literal 234 zcmVt!SK*)1*hvgTMB|CXfNEyTtgtsR;9kYOidn(E3U^GrKsED7Vjvt*sh>jJ<+Aqyi5mPDM=b^JB-EFOCnl!iIRi#y1!+=t) wz4ANK-+^TBc|CtHPf}G6$aM*MynYYE#|}$Nj(CgbK*uq7y85}Sb4q9e02%8}od5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/craft_hammer.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/craft_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..c06349c022c90574c9d039f00a0e0f0c80fbab74 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar*{w4<6(_tRUceaJ$HZ zX*%K!J9aR=TFma^y}xlQe_xA^$DCxN!}BLUnKZ||httz9JyI-L;ll)#bOnQnNzeQy z6${T;u~ve4(j318r%9h35*#KKdm2todZv2R=lqU|Phx`3TnX#ByzSk&mD`d^diqqJ xPfA+0EvZI8!ox5)+Hl|2wY&3Qzxy+V*=K|8O~&hDJAm$D@O1TaS?83{1OUsEPOks} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/enter.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/enter.png new file mode 100644 index 0000000000000000000000000000000000000000..7f798ca485e37712b4cd50ddfe836a046fd854dc GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5uPrNAr*{o4?6O;7>GC=bU(cF z+^Pjk0S#Ow2_GbX%-%bZ&BM9h;PCSKQdt)~c)Vf)n)y0~vo2&VTF7QzbWWJP)6uv$ tD*RjRGD-jd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_disabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..4cc07ad25feb37179dc4c7e40bda73e473eb0d69 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gdx`!Ln;{G9$d(KC_tp`;(ObG z4llL@ZXq_spU-zlt-8;1Vs%8bq?E|KfU7Jyo~)dTdwKZ|TmFer+HffW4Jp-C=k z7tF%rZawo#aa)kf_cdwfUHiQ9bH_`SCP-W?jXmG7YL$?@5#vb-k7HAO4(wHse8+mS zBZXpc@%HUHx3v IIVCg!0B0Od761SM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_enabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ed32821b8493e4c239b89ea5af539d8710ed00b2 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2RvOILn;`L9yH8i3KVE~_}_M| z&Nd(Ue8q|ht(M2H6u!1>e(G=_+r#Si(NktRl~g+0%QP-Na%=6Dg&JK-mrBli?8+I!$ z+99pvr6Md4c!yW;=-rMKrgv=}kMcS+CZ1t_cWmlz!I{B|i~fWw75s|vzZ1FbH_&(k x87}j~3k7Bh-l&_pt~NgB+`d&#TDg*t(;OXk;vd$@?2>`RYWMlvU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_disabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_enabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_empty.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8739eb08b68c8bce24c52205f1ec155ad4a833 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VV*9IAr*{Q4;u0^DDpU5^uH|G ze6^8FWDbMKgEeeBp0YVvO(@y*{m1@8$L@-YXRU4RpRk1GjMPL!D|JsUA(-TyH x?BivNIy>bLdKi4tc(mn`m%*oyqIoaRGn+>8l+9qPItsLi!PC{xWt~$(69D8dHTeJl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_half.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_half.png new file mode 100644 index 0000000000000000000000000000000000000000..cf813356c71ad870b64893cd83e5087f7e298daa GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*{Q4;u0|7zj9Aynou4 zC$vdeWlrBJ2Sz3irVkBb&!jZCot^VCiiF>Ptnc(&yVX$P`J4()$F9R`9^CvsRsU$= zyy!z)&FoqfjuysyCr=PiVbSc%w3AR}(UjeM=)aAxA^$2B(Qs{`Z492SelF{r5}E+} C$1=$P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_ignore.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_ignore.png new file mode 100644 index 0000000000000000000000000000000000000000..f394f3c482cb723e1b88e7367100bfe4db94d17d GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr*{o4_XU07znstlumms z5hEMe$i%Wh;oQ8&r3-I(9!w89Wcf!!Wl|G+*4oy|h6VXCH@{CkBk^UQsNPz~O$H|= xJh6pZ$!m2OPS^c<~Z?daQfW>|HGeCP7JYD@<);T3K0RRgvF{%In literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_25.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_25.png new file mode 100644 index 0000000000000000000000000000000000000000..2bfa8b2317af4b3510cf2f2bf26d47a6362f7c43 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*{o4{qc=WFXLX@%)Lc z;S8O#5;HRLcx_xaF)*hz=^WvyXR~1PDwN=y5Ok>e&qNLt%Xp2YDq=I+BA@0-SpCX& zf4yh5%gkdIaYFoa-}6Vu`Pkgt5VTD3WTeb;;rS^{n@?#?nln=+UF~G1M^TfH^CV%9 kqI)M;(x#qR^NBgH?3~^=$4-lIpko+3UHx3vIVCg!0IGpPl>h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_50.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_50.png new file mode 100644 index 0000000000000000000000000000000000000000..767ad7b08817e7003b0ddf1047ba6418ceadc40e GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*{o4<6(^WFXP@aQmd< z@PH3*4C40u$)2HkiB)ESaEW62532*~ouZOD6uzk0@zry>$(3`SbI)htN}K4bVmVVqee#o(NpqZl l;+Yekn1F=EHlN_HX87!`_w7m%gFVne44$rjF6*2UngCX=N+|#U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_75.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_75.png new file mode 100644 index 0000000000000000000000000000000000000000..cde236fcd34a0015d90b5ed6b35e65e64e26feb9 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar*{o4{qc=WFXLX@%)Lc z;S8O#5;HRLcx_xG8W@cn#gf|WnPnIQXDCmca7ppr<9-+CNuOJTydJ3v&j?+#@BNND zR&wWddua>v95(&9@bllq)0a=o=G9JR@;uk`xFX4KSz=hE>m*^1BDG0#I#rfW}Mmv``zih32)E! z#?R{ljHN!;c$V;Pw9iR=c(QG3Pur3Qt&fWqrH0($UhTnUrNUZ1$tftnP-;?>zJ%!a fL)PzF{~basFt*UZXKYLmdKI;Vst08?)}bpQYW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..9e29e8062d9d8ddc40d2ea3bbd91c3041e9dffc7 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fWu7jMAr*{U4=&_AlpxZ2v46I? z`|MfsGd;>3!Vjn@NG#|}bXa82!YFlvp{aUa`T5A$b=%MHD(#uAJGCk0*83F&Rx+HE zem_3B|JH@i%04Zf27+pbTxM_xCn_O0lNBCXPB` QpbHp0UHx3vIVCg!0M5fc5C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..593f84a5a3cdbd2032c51983168a393f5aa056b9 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fg`O^sAr*{U4{j7}au9L7_%>=oG!PC{x JWt~$(698*rKKTFu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_selected.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..593f84a5a3cdbd2032c51983168a393f5aa056b9 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fg`O^sAr*{U4{j7}au9L7_%>=oG!PC{x JWt~$(698*rKKTFu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_1.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..88e2f9aa5425cc5e5b6e7afb0886c854ccfdb9a3 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t36#DLn;{G9$d)Fh{iz#j=XzWoa6BqtVPunX_`^2MSY`Ivd#WlAD){R!d#Fv~6lPKOP)i93 z4NzR6Ff(A`s-~s|4n~PhtGJAK?GnTSvH}daR~T{^^g9_T8aqF%vdumJJbicE`U$Uh z$^NRlpHyIT=hpAXn~pAUY^@gA++e<$;k(8vEsZmVhitnfh1lK&8YJ~`z6<=oefp@{ b!{|8qllFpgpAYZ=oz39s>gTe~DWM4fXo*q~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_4.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_4.png new file mode 100644 index 0000000000000000000000000000000000000000..bc7a661c9b54052b633c9233753739243d8f1457 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=R92;Ln;{W9yIi7b`)s1n18)) zy~w2-o?S~WzT9*8%d&gIf7m6qY?x@^pA%{N2^N z+UhKQ1>aBkcxf64NB|iQUYZv;OYZC~asrA7|6~?iD*m!V!&cDMMY6NxjFHkQeZiwT zmuI9_P3-GPnkE?dY~P>ew4FCX()3=)@U6dn_uc1nI?9VoUVl}+ZmvD6{kQtPd*7q$ zT-dy3HUZUVx=guxRabeUGKhO=ic#zH>BkRP>WI%iWm(HCJ<+rAOpK--&}R&uu6{1- HoD!MMDjk#{hz&Cyj*{eg3ZHs ztzI0CHx%C#d_UAD&~!mS>RnugVv9nE)x9eh1A1*1OJ&Mt%uo$cPUF0KBHl`BmEh)< ztRp&!(+s@VoDtG4*SC=YOV2K@Us`4r$F<+@xcAKIfnbG4(oQi4%l+V(zh;?D!0U`B zHNsabP0l+XkKea&># literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_combined_sides.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_combined_sides.png new file mode 100644 index 0000000000000000000000000000000000000000..7797e31acc6ff209df6b7479f4fc729bc2a7f32a GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar*{A4{qc=Y{27sP`z=h z*q`D8F5d^1TO`F37(z95b{R~#^Rc|Qxx-^$kD-*g73;}~bGiZ}UT5VPTN-c)PPBQk z=ZdCB-;b&qrprmRC)DcmHm=>BjMEnduqIEPd%ksI zC-cFG)aS(qmum3%@UVcySf?*4NLci+c;Qo!Xvo2crJr_Q5VAV`b=mjRGX>{!>$xuc z=y?49e_i|K>+iomFRTj|QkIEWXTJ1dkVxDm=6kFBKAVNc6#{+5;OXk;vd$@?2>{f* BX)*u+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/level_energy.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/level_energy.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/level_item.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/level_item.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/locked.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/locked.png new file mode 100644 index 0000000000000000000000000000000000000000..666bff2e5573b6e6e516573c1ded595cd938e29f GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`*`6+rAr*{o5AGIZGURc+sD1ue zRzT?vuJ8@4JDAG9aXHioNu-6Vq!jSg-@jg=sHv*T`nY9D&x<=}EepyYA8<=td$&U3 zB MPgg&ebxsLQ0KDZpZvX%Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_off.png new file mode 100644 index 0000000000000000000000000000000000000000..dacb40a007ce70599ac349c18b083aed263c86d4 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`TRdGHLn;`L9=w=ZO5;>M5L zt%6yD8?-7yckr23NLNfe$bD>e1+(H4nZLVT%^k8dmg+dXS~O)7!^(wIHf7u}No?mU zdvT8M>%P~~Ten?d2jYB&m6uluPjJX$2x6Y#@ao_yZtIc_&g|AE$?f;9+zJu~D&d`A zwbttEzU*b+V;z`QGJ3@3{9?5JlGMH|D|cmQR5Vae@cZ3qRrkN9TxFdg)o_JjiQSEo jP0spdFB01S-4UPgGEwZzn@?MS?q~3H^>bP0l+XkK4A*5> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_on.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_on.png new file mode 100644 index 0000000000000000000000000000000000000000..332430a24b03ad0e78b5a96d05381315ada6e6c4 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr*{A4<6(_tRUce(0xm~ z)E%o8O``uL|*^^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_access_hide.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_access_hide.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e12bd055944a2facd088997e3c3d851269fef4 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-#lF$Ln;{09^9CF*g%Bk!s0nm z*%ggz7INk>_f&BxM*YZ=&J9e;22rpo8oY1)BbM+6INnCL%qJIvH zOI=b}IiYRplBQ+ve>X6zn|!Y6U!wS&^Yo`4AnV4Cxb=lH$EC}xOhAH59?E*MS~K=8 zX|jLy+it*dOYCg1>^;0DM7PN&L4xcCb&CO`p#pdd--_wYI- zRXjmt}cOr_;w2kqw>Uz&M_3DKl22 oqlw6d9m5aC@m$eGWW&q)28gpfi@Ln;{G9^A;=Y#`upvHs;p zE}xW(7b_Sd8rm2$HZjOGwDH|_SyRCCAVIUW)nn?k?-hUie;hm`#QJQ^;t zR=Pc0BGt;h@ImeLX-|E(y%W8CW3uUGpJ@3MMV=LI550GM*ylY5D5KfZ=wr&o`jGwo gZWl*WuKsBGUK2;FrK=0FfKF%dboFyt=akR{0C4+XZ~y=R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_not_full.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_not_full.png new file mode 100644 index 0000000000000000000000000000000000000000..873473bc579ca4a9a1d5335be0937913aefaa8f6 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar*{o4;u0wG2n5yn7?xK zOx8w55yt=#M+TP0nKK*oZSN+8zAeeV|M;u@Lq`{t)>T~QE!`a+Vw?R;pC9xLZFSO6 zQaWp;{#{XI?c0+^&l^{9*-MMRbKddLu4TQlrWw~}KNpqmRa~w>GIF_)UexW$sppzc qttl>&cT%*;$o1#?uDBm}NWbF+(LhBvc67ctq_~KCd54~i(yjt!ovgd<)sGit`Mm4xUL|<3b#g)Q xYdeb_=3%RjiCk=L{jlg-?S_sQhn`>LFJEiH6?J>l2B6y*JYD@<);T3K0RaC?PcQ%g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_block.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_block.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8499fd83da95a9b8e3d393181e5b4f668bc5f1 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`dpunnLn;{09t_N7HWYBZ`1)$y z?3sc*4Xz0yZV3#{2{UY&f}^vRW=vhO>euArA32kPfY zG$YSgMIX`8SsQ!uk=>1~wXON==4rCu8-G7&|9zk~;o45?ot-m|_M}XlqLVgPH%Uz5 zWbHn?D>nC=DdLo9nH1Oq{YuL35{NWx} qbt#4NIbhxY7H!pz-aV=R8|&H?VO)n#|LFw!gTd3)&t;ucLK6U}UuM++ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_item.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_item.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7584d524feb0de56a47bb33673bf05f71d195b GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn;{W9(3ewF%WUR`2FOX z*Kf2}G-x@natSmvS?y-K=U~*`#^PjTeeU9EMz%H53%MJz=a$~s=DKvsh2RF`*0x&MYi9&enFu`adTudkYQcRxOJ-6eaTy^j{zOW;OXk;vd$@?2>{2D BQ&s=~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_ae.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_ae.png new file mode 100644 index 0000000000000000000000000000000000000000..53d37f1e1dd9e516e43c5d3fbdd79c96aa14c1c8 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr*{o4{qc=Y{27sQ2pRm zu|LHHT)qz&EgH=pGkFO!w;Vj=xJ#k@&qWWVq+;V^8G;)vDpEB3UB}dNcM?=b;Qm#pXh4Xj#Z}LlAyZPedZRFX Tk7D#wpydpnu6{1-oD!M1gQv8h6)qA|> xIvsg1CGfH>dyr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_j.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_j.png new file mode 100644 index 0000000000000000000000000000000000000000..53dcbbb9043fe39c8411de0255d5e4f234286a8d GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr*{o4<6)gFyLW1cvUlY z8K2aBHXmj&mrufJKjsE{>q;eR@U$+x5a6xL*Rt>^^VSN%HnHBl`gTv)W<`r+I^GqT Q3p9wq)78&qol`;+00r+N=>Px# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_rf.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_rf.png new file mode 100644 index 0000000000000000000000000000000000000000..59bf7793670da49329b3ee0b5b36ec6ca7f6e447 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*{o4<6)nRupi(xO&Gt zws_gFL{>2a(Hl2SJ~%5dPQ1C3+p^uBYj#J4#f-?#j`rS}qIO!-r8rkko@lk)>rm|j zyNGNtvvFVdQ&MBb@09;fq!2kdN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_w.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_w.png new file mode 100644 index 0000000000000000000000000000000000000000..12830046239eb2b72a5e8c598f849194a8c7f658 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr*{o4{qdbFyLW0*zY=* z)tJ5eKhrW-H?PN&?iALnT&dPND=Ub__h8$stWAO@tiFzy7X(c1wS4|SHDi~?wOv1F ZvU?cFSWjs&{|_{f!PC{xWt~$(69DN|Dn9@K literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/priority.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/priority.png new file mode 100644 index 0000000000000000000000000000000000000000..5097151cc5cb8d0b399abfde5f9d24594f52ee1e GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr*{A4<6(^Y#`urQGelQ zGmFv{64xJ|Th`diW67c@EG_&=u0Gr%(fX%=U~B8KBV|R-sgAE=u14JWzScuU+{EwA z@30*UHYHd~=BPKnP1!KlM~ge?xk4!)h}gGj?i`SaxyRhdhiA)-Iy(*}SkH8ENnBwQ kQn})zTIo5Dx$`R-HLsigzwk}o1?VCMPgg&ebxsLQ0E-eyfB*mh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_above_equal.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_above_equal.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2687a0a5695f961bc83e2b22c25fb717618aef GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar*{o4{qc=pL>@l!Pl7s#G>Jmrgmv9I$jRt5499jT2g*80|U!cFxRHyGhc;Maj#YG-gDG zef_iNo4Kiz<5lDH{QKHU6RYyBaI{J|FMqYu%R(^u#SV`Q6%!$;uOTa{{vBXc*(>ux T^KP^*&~gS(S3j3^P6%VzH=GWsaWSvha-Ye*^^s6vXUxgZA9hcE5_4_a=dEw&@F**uwDc^}JH2hP zu*Z=ble3;pYzvP4tTJK7vW1US7f%R0p^+lOm2%|9XGZo}S0vtcPxrq7w2#5l)z4*} HQ$iB}p}al| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_ignore.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_ignore.png new file mode 100644 index 0000000000000000000000000000000000000000..af1a3312ff791c2b5a9ad16d3fa7135d3027fe7b GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr*{o4{qc=WFX*h@x5^L z2JfzrHwDFaL}n^5?{K#&Ti_-l+0gY(%wU;=QLpGp)jh}WZ|~3u5e!_hEmQBdiMUlu z+bTgp*Q-Bv*w6dI(K|;x1c>kTO*dYCd#c>Rg;_h+dtSZaov~wm=c!uXH!3_rY@E$} eB`c)tAF#fPQ+sh&tJ(TSR66 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_low.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_low.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e0b31b4ea6670dada060207122f89c53cd2796 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar*{o4{qc=WFX*hv3~iL zxCYLMCM8kpJ2G;|q7`DZxTLaN4l=CF*z3R{G;xhbgp=Ok>OYDiMdyU&6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_off.png new file mode 100644 index 0000000000000000000000000000000000000000..21206ebc736a27cdb7d8eb23708daeb80b71a55f GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-kvUwAr*{o4;qR#7znr={QqsC zf>DyD+=~JM*DD+h;u;GM9C(KwWG&kRI zz`HA?qJyty=>cX_XF~rVuLBV5HA=_Rb5p-1YVChs4 g+>$V5(`QEg53jgi_$>T%6lgAkr>mdKI;Vst0Kh*ihX4Qo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_pulse.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_pulse.png new file mode 100644 index 0000000000000000000000000000000000000000..352ddb464a55bdf96d25187151d2431548c5491b GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*{o4{qdja1d#Dc)wfs z&7y#t56>1JzTs3<7SMf&LF;YwgA1`PdQZIe_20KO=9ZbZi_`lqi%?6)Ojf;TrOK{5 z7QV6wb@sRJUBV$4di>zopr03&!a4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_arrow_up.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..4903ca61e07672edeeec81bfbd67fca9b141dc3e GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqp`I>|Ar*|R2RHIIC*jY#o}0dOn($%%!z$TI*-2?HHmS9(>2!RN pWHTf3c_qi((s`l_S3Z4mmN&VBzaeN>d;rh_22WQ%mvv4FO#l+gFG&CZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_clear.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..353cb477f5f1fdf129ca2314e957f7f132edf545 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqrJgR1Ar*|Z2RHH_QQ&d7IKRU% zW=7+T1I#Xq(pk7lic|E0H@NG0T$uZAukzB@5Bm>zn|wO`;@rtgS!vm(n_0y+AF8dN zafWNr#Fr_8y*Y~}zD>zAO%5~A-ZJZE-;{OkCPurIrDnR7yC^TVZoK~DoXM`uz3+VD YpBbr^y_$8;1?T_f4HF&x>hEy=t9^A;=Y#`8f@%*y% zgR>9Y)~bDA*pj#IjMTj5NAVAwRNOZOJg{A-(z@h-Skz_S>%A+j0GfrY9HM=B8@jKNBU-aJ@4v kOn&+IMpX6VIAMOfGh8;}dcAc^fNo*%boFyt=akR{07^(lA^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_cycle.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..f735441fa33e3b0194a79c4bcf2c6feecaf389f4 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqQJyZ2Ar*|Z2RCvaP!MpqIRCJr zPKkngK|@2W+lB%!-8;&G1`6&cs@*xBpXEQCF!#B4zG$MRWnfW~mgPqwGsC!yL&vQ8 u({4eN-ilqrOBfI@Wrb&zMdOIKJH!hzTLb&Lu~r>=J;c` z7M#5G`b=TfBp3ZV{^>$T{k|NUmZV&j=s%J5wMJ8^$gDNlEeW!o*Ew3#46n6aJviac bk6#S&3x$15i(hR5x`Dyd)z4*}Q$iB}3W7zg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_fluid_substitution_enabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_fluid_substitution_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..dd763b030aa7fff1b6e0dffdab5cd0ad3efe1271 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqg`O^sAr*|Z2W|Nr3>X?N`d>cC zsN-hcdBieDcDHqdM-E?t$#*F;w(u9JIdzLf1wY0GOuKrF|D@^EpOO8nN+aJc)RQ$YtfG} T{t?AM%Naaf{an^LB{Ts5)MGv{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_machine.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..075313f97b6fb8c132b39640a036413f8e9bf65d GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4b$GfshEy<4J?PlWV#woiael@* z#R!X@Bmou&WrNL14@#Hht@KxZTm7f|?WS0h+o`)Vww*4!$ac2uO|TelkP@dY>a>LRjxPj&-! qJ$UOpxkj;x-GNFO8*3O6N9I#pUXO@geCx0W=oO) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_processor.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_processor.png new file mode 100644 index 0000000000000000000000000000000000000000..a327e9c75b4f24eb9e7ec0498dc00896ae1bd7c0 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4P4IMa45?sjJ?O}L#DIt8fN$x0 zBjYAk0T#DJ7S;_Mht9Cn^p*S#-79&=X!8X)Vv9->i<|S@(k)F)>Scuz>$c{Soa|U< zE)Pac1=ef3*rZ-sEID8w^gu!O|AfANksTBJ)PoXcoSnp!?{R$NHPZ_o$K9;VE^VCH sw{>0P*&MN1H+4)lM`omL{_vSq`<_P%x4Ygf4MS8k8hEy>29t`9?V!*?C(DtN` zJl|r2KGg`Oy v#l?rgI-Z*sJ70Pcpkp=X#fOzkc79}6*{Z5??cxmqpd}2Ru6{1-oD!M7Fi*Ar*|Z2RHIIC@?S_oPOcr ztQ!G48CB=Q|yFCmknH}oY*Rn1eG87}4KyYXWgKA_C z>V3=B^gN@ut literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_terminal.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..f47675a6fbb391980f3f8827bb61cc7c37b035a2 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4WqG29`xpAHso+* zuu0zngC-_}rqnd1Jf)ukEBDWRxbEPjnMe6oS;^f|G1+`lUGSXR7LN4bs~}OwjI_y< zZ>Dq?m@SOGUYwHFDDE4|Ua^sbee+3kr_*O1^@{sOoKgF~he6=A;!DQ=qL+ZSGI+ZB KxvXpWc?Ln;{09^9MjEqueZjX`UM)f~aVmgd_BB$kM;nb#)I8TrZbkEG{GZYh2buX!0FDyrI^ zC#No1a^c2=DR&e#Z)W(Ys7k+^J9A0OC5;{Bd3US@5AP^?A0pM-k@#+IN8%c#w!n-# zf`&cfCikvrczBtqsIn$+(rLGuyRYKNUSY$YtL&3cKmGl==AY%e@77u%Ej~SmHpxtK eI%4o|ZoHzQzbkX>USXii89ZJ6T-G@yGywpPd|clE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_random.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_random.png new file mode 100644 index 0000000000000000000000000000000000000000..21d0683804509c1d16cb13f242ad727f6af53cc2 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A3R+gLn;`r9$eUa*g=HlLZteQ zR9R!AIZQzZnT*+4cQolHtUTGiQt`|QR~8@U|4Et3YuCJ3G^g)Q^$&X$%eagWjGldS z8_ZQK%WiGs)#zK{Q6!Rko6WP&TxySl8<3N7L|8J=dXbY`PSLy%E^afHGWhrb$p)|H zu1GFR{|Y7LqInw>LB#b1N+$y+2wM8z@F?0W@DC<-J|opaNhbCzx8uYbd>I$ o`%%;LUa9)={L;H8KVIL*s90XSQ6#9VALw@mPgg&ebxsLQ03w%oU;qFB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_round_robin.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_round_robin.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbf12c07ba45340fda53eb8d457fb4152296396 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``#fD7Ln;{09z582*g?SMqWz)g zCw&A%82T10E?^OEP*r-7|8; zFCUs>DHZ%IV~)o`Kdv%v^Bi#?CrE*H=3+xziwRA+)gKdgS8R@z`EpO1otu5;V$Xx3 uniknH5!cgmZ*yzj0GgJ+=Jn)e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_auto_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_auto_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd5fe8c1cad689057f25aede807004d9f8085c7 GIT binary patch literal 370 zcmV-&0ge8NP)2QkW+8lE5`2zD7N8VrKLs33U5fkuNbFvCO*L)?;XEDRlo zFF1sS<1}a(SHzECdAtWMoW~Gs27f>P(aR5{l>z1AEJeFlKoctu92=x%E-@Tz_vsrxK=csss`}{(?b&F}5_`Z)20{8WU zs6JxO4sB+aZ8XPmFijI71VRYv7yHEZ5pi|tvAVg(?$!$0%+w&Isz=9dpe2XK>9`G| z48BtYYPA~L`_loXsz-8Y9Ia3&5HbiEbf*Xu^V5{79`(C7LI%I20L7p71>?76w<1n3 QDF6Tf07*qoM6N<$f+{GVeEIx|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_default.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_default.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei_auto_clear.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei_auto_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei_auto_clear.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei_auto_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_remember.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_remember.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/slot_background.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/slot_background.png new file mode 100644 index 0000000000000000000000000000000000000000..75cd2a71ee8c471217ba145ed3c2d39a00666aa6 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|7f%<*kP61L2OR|+fZT({$_$IA z3E4UQ)L1BQwWB>&i+TOyJ$ZIFwwFp&>V7^FE;O;jMMX)l)5Apx%KSN-Jt%-Bto_^S QTA%?8p00i_>zopr0LGLg*#H0l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_amount.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_amount.png new file mode 100644 index 0000000000000000000000000000000000000000..32d3749636f9096f1f6a3871512e22bbf230cb96 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`n><|{Ln;{09t_N6aTIX9c-wj3 z?MUqkCO5~G8mxjJM0z$GT}ZTN@;2Np;H2>U!~W2#>sFnWZWdpa^*QC7bP0l+XkKf6rZn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_inventory_tweaks.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_inventory_tweaks.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_mod.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_mod.png new file mode 100644 index 0000000000000000000000000000000000000000..02a5a1e3fc03ad483c9eb41b899768a435748b4e GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vproLLn;{G9(3$wG30SQ`26CW zvpO6+3j|qQ1y~#eX53VNFg2_?!}TSr!7QzP267%+d3Www81Sitx;)QY+qheLwz#yX z=*5$Bwp~kD>-cO-N8gg9&yN&}XD#V^;ZmX!`pksy-XG;+sr_yrADnFl%0B7`%Dn0E z%?@8{T2P+-Rx8hF`9?#&sNGp>56;~!&3>%;+PX(-#ZvQMvP<=PxYfNci3d89!PC{x JWt~$(695kDRPO)) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_name.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_name.png new file mode 100644 index 0000000000000000000000000000000000000000..3924534e8655f1799b2142b3246d835171ca731d GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr*{o4{qc=Y{27sP+e)O z*q`D8F5d@?CXHr~nY@yjTMiy_+@(Le8G*LRquNze^h(A)sj8ZCC6{lWJ&o6bGG)mC5fmkH+rt1WY!rN@jAoii_*k7-A`gvp11F1 Z+&N$MfSPU8W}pigJYD@<);T3K0RZ6WK-d5P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_none.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_none.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9e9a83aecb97860bc8f0eb1bc627f2fedc4877 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr*{o4{qdTGURc%DF4LD zROl@40fz1DOP`+*dATl`;k(E2lsJWefH_L+OWVKyP!=rse$3&VWuZdJoxLBIMZK6A zT6L%)GPO-0K-cArmaXE3_ur4S?>66OVVD>lwk=gv$!ACG`5q3&@_d}V@3$j4Gf;HelF{r5}E*+hC(I) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_only.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_only.png new file mode 100644 index 0000000000000000000000000000000000000000..8e32cad010a4c839cf8ed040ef8f1fbab955e8fc GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr*{o4?6N5HsEo%`2J+N zuu0znjwU99CIjQfoKIx|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/substitution_enabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/substitution_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7ee4149305de008932c134dbb10aeab9ea325f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;Ax~Gd{NCo5Cg9~{NB}lklJbik* zoAxe`W=H2k^IXG26eO4#rJO%}Fn`H*r?~9*$3LziChd)E!LjVzHDYwqdm*q=7%t-cj%;Q_Rg!PC{xWt~$(697C#I}HE; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless.png new file mode 100644 index 0000000000000000000000000000000000000000..38ae956946b5029da538349a9f91e8f6db4c22ac GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoR!3HEv_nU76QmLLUjv*C{Zx3$dZBP(ky>PzO zQm2&X5T8len}j4^-$Pv2#3Cfv6?RAjMcmL1`#$f&DG`$iMIt*qL+mVSa_0pE^)ZPq zocK3l!Bou^DspZ64u@ZRdn7}5mD3N#pARlbH5wk1sD96syGHoP!IA?@fEF@%y85}S Ib4q9e0M!6EnE(I) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..6fce83b473a5368ba9b936d4d3e48dad5c26726a GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoR!3HEv_nU76Qp-JE978G?-ySsNYD$o3c=-MQ zkK-Acb9GHdDp+4yQY6<$kn3;0wNq-EUZmTj*SZ(0u(erTpi(dm6W_`6L-D*@%tI` Yg4OcOpUtB)flg-dboFyt=akR{0Qu-$3;+NC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..7b887eb937c4e9415b54fe5aedc3126fa1eb51ec GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4f`JOJ0Ar*{o4{qdb3Xo{M*gv~o zCe7g{V_Jb!v`~zrwHJ3Iug4wsI7Zg3@5|-|Uzwh!y7>GTEsv%p^7Ee*?A|8Rbob9w z_0W@@27+pbTxM_xCo1{0z&Mi=!l$N)s@(nSn|DaXW7@-m_u0&{cxQ-jJ#GuMn!(f6 K&t;ucLK6T#Ryy$j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_crafting.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_crafting.png new file mode 100644 index 0000000000000000000000000000000000000000..be2c345e6aef25ee62e9436ce311510bbf64a89c GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Up!qLLn;{09yH8q4v;zU@V@ZL zH+QykZD(CO6#j!gtA<&^>!>W>6)1& z=HBRA%Re#PR*BOTB6Z~OX>sABM^eM4wC$eFTe?{tE^#e3a65B*Oy8SXjjwN;f@P9k zuUm1uQI${q%`C>P`;=b0y()Vk(r#=y=j6lbyXtG6zr9@G6)4qp$sq8I$Z4I)&zJMA mm%lHvG;!Gvb?ykgTl`NR_&qi+d}#>uKZB>MpUXO@geCw}mwn0r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_processing.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_processing.png new file mode 100644 index 0000000000000000000000000000000000000000..d1aebe5e6596ac5e1f856a70f983f187116635a8 GIT binary patch literal 303 zcmV+~0nq-5P) zRgL_?@P?{JHf`G?BCP95;=MOi3@=nQva!~Zgb*l1gmqm>y!VFehfGzYwU)MRNkRyS z2qHpZt;Jf)CXzK|-h0mHGs)$0p$H)$B7_h)olevmD);-HVHilR*DE4I*L8GVhjWfv zLuFYOisSLfu2;J#XIe4f(Lezn7wlGo#oFS1S6Sq>_UYsU!{a1}@ zB81e9@8fN=HfgO*T3+Gt0&A0&j*bnYdR!pVbnLOmW5C*^rK4kmQX$UOC>7#dji??M zh%_C0^bY7*o3uJMs8NX6ZZ{|u;#`eTD&#N-P@|A(kzWHhbbNYgI_B)`5^?eAGtSjG zS0j`Pajs_ikh9NcAc{0PHr(IcB0ip9BJS^Q5mBVkv7sn(p7;#xW*OxyBRai8$A;-c zj))?Sjt$w@FU%)A<1=t_6d;zfjB=I{onEn8Rm>;fm`}irjuFds!xNu@WwSw?90iCU z{AEVRh{dlp`wsZ$rgY79=^Db|5Vza$?)?Wg8%OoM?&x^*JYLq)u{L3~ kswj$_p2vS`ftEMz4|6$xtqIhJ{{R3007*qoM6N<$g5qnmY5)KL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_stonecutting.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_stonecutting.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd5fe8c1cad689057f25aede807004d9f8085c7 GIT binary patch literal 370 zcmV-&0ge8NP)2QkW+8lE5`2zD7N8VrKLs33U5fkuNbFvCO*L)?;XEDRlo zFF1sS<1}a(SHzECdAtWMoW~Gs27f>P(aR5{l>z1AEJeFlKoctu92=x%E-@Tz_vsrxK=csss`}{(?b&F}5_`Z)20{8WU zs6JxO4sB+aZ8XPmFijI71VRYv7yHEZ5pi|tvAVg(?$!$0%+w&Isz=9dpe2XK>9`G| z48BtYYPA~L`_loXsz-8Y9Ia3&5HbiEbf*Xu^V5{79`(C7LI%I20L7p71>?76w<1n3 QDF6Tf07*qoM6N<$f+{GVeE1xWd_o&C28-zOY6VOdm|-0^YDya zqUzG(DpQv{I&`dQNs{`?8?GgNQrv=bXP!xvF%dIr|JVu?e{|q(Z)b07$GK>i^rago ySn4!A(kzzX?&Y3&_{Rc6#g#vT9;+<+9L(RXW1cbDn13?RaSWcWelF{r5}E)fEKrO9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_medium.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..44a88ba76c02a9311e1d1362dcccb256bc722f0a GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*{Q4<6(^Y#`uzaC`T; z+YhcS)QV~3E?|B2#(aUm2S*OUq>@iO@6&x$O6xi}k`sJXzMeUCs#LbdwWUy7XG@us zw|n}doFchXYkKCiM_KnaZa#VQNsg9|$E!ap4Nk7vbDDkncd-l4?!4Ipw2;Bm)z4*} HQ$iB}lQurH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_small.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_small.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3e4859082dc3ac07afd94a5bb99c99f59d53a9 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`37#&FAr*{o4<6)fFc5G(xLxsi zZoz90(Xa%@unFhtm<10yb2y6hTOH<4R#;hh@NRFP;e;znT*kMz6%>>|o-%Vqsp+z5 z#}qyWJzCh|r2jEs?dpr3d#22saAk+4afe3D8NRTcVrM+xFFXpgi^0>?&t;ucLK6VD Cd^w~5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_tall.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_tall.png new file mode 100644 index 0000000000000000000000000000000000000000..3f317784f18b691cbb34c20ba85f195897df8aa0 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*{A4<6(^Y{27iQUBp) zu`4q34hg3;_&hkfrNLQ&J=rHyV9WcD<%g7%*yLx-G!PUMG`yp2{ru*RnKM6V8N)oeZ9? KelF{r5}E*o|2qKy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background.png new file mode 100644 index 0000000000000000000000000000000000000000..e16627e03ca3c2592a29eeb786b5b4b239e86b40 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!3HE7rssMAsT5Ba$B+ufwFeLKIyi{9UVQyj z+(AU8Dxi&Z>V|*=Z$i{d4tRtl+_Mb5&uh-+Xm(Cmbz7?H51Hpj<#U5S3#lD)nZY5P zsN~bqX&?yY2-VzLw#;RM>~mMmM4^;wuPIdwjAA@*tY3P60@}ym>FVdQ&MBb@0RMzC Aod5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..75e1db0b6f109f3ee18a06266c4b3cc4e96511d7 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!3HE7rssMAsWeX)$B+ufwFkX`Q?K~r7q?Q#JW_5Y{obAAY_ z9den$A)Kh>)6!`G;|RqRE%FN3Gf#VK)1%EkcaCvt<#J~xznsPgw35No)z4*}Q$iB} D;Uze# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_off.png new file mode 100644 index 0000000000000000000000000000000000000000..77b705a8ab69789e54393f523c0040dbd0c3c576 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr*{w4?6NP8}hgwe6I0a z;EzR9k|4_gB?DvO0{^wEG@_T@3bsBh-`$booT#WY$@iFw(j@+<>|?VJ`L=dmshngL z)7UTDDX;%y Sti%Mgo59o7&t;ucLK6V7RXzX! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_on.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_on.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_all.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_all.png new file mode 100644 index 0000000000000000000000000000000000000000..fdade31e697d17c9d6edba1982754d9ca8981f9c GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+dW+zLn;{09^B~bY$(w1@P7Z5 zX+}X(yH*F?W0-fqcFILz<~@uyjp-hq)3ubBIGmcQY0)C0a{7^C%)##;pEJoC7fTr) zJHXGxYyA1{Y3umB>DtE+Pm@SaINEmZZBgoxwsRjhq#ik<-=Sh|{9Ia?`OKM@K0HRo z%MC9Eoc$7Fy!6Z(&JveNmo-wCEuFQpl=BX2Sci%}lw%?nQE0c{ZoXf>|L?!b^Fxfc k>NN%`ophb_Ilq>{-P=KRqObK#pcfcCUHx3vIVCg!0Lds{3IG5A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_fluids.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_fluids.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_items.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_items.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/unlocked.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..285623bb8a767cab17d44993abeefc8beba71769 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*{o4<6(_WWdvQQ9tZ_ zq0ft=9cN!nNs39Tm;l(8_{O%zCPG*@JwRtW}qz?n_ OW$<+Mb6Mw<&;$VKH9UL( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/valid.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/valid.png new file mode 100644 index 0000000000000000000000000000000000000000..67a815ef8a852f807b026a48e13b96c4dd9ebe1e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_all.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_all.png new file mode 100644 index 0000000000000000000000000000000000000000..025a90d8f5eae1ac258f864085823d6efde670df GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8$DedLn;{W9^9CF*g&A|Vt-e5 z@6^7jr==Z)HS|wky?QPx8xcn{KmgVk_Klj|fDy{X}H5c`dPUpOLgqMLhN8+FE gaXIJxA-|TWm_2zG z>wlSdFO3`77nFYXzV<;zB%e{8b)pit@~Y{)eo}KIRf78zb_7&SCI$^>bP0l+XkK2G>dB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_stored.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_stored.png new file mode 100644 index 0000000000000000000000000000000000000000..1979bd57f88fd80c7f65fe596e164c556e2ee556 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr*{o4{qdbHV|OFP=Dcm zM9I3Cdkj7ggTe~DWM4f1oK7G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/white_arrow_down.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/white_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..579ffcf430fb360abc032c59d35f69c581695ea6 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*{o4{qc=WFXLX@x1%{ zjW1%B?qM`){B6KioWi#&M6&5o{DXj7FGM(ZI`27t-_%o4b4LP?5u0Rlk7H}g5{1BQ z-8mAR-_OmgRxeiG_Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/guis/states.png b/src/main/resources/assets/ae2/textures/guis/states.png deleted file mode 100644 index d29dd63c06f8f074e1c0dbe570102dd81f479bf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12581 zcmeHtcT`hL*Y_l}&|8;b zNoqkP3jY(X>aqUwHa<~uNy24`VlJS}-*QRZ_U5ne*Bqs}?oB|s*x*t=i3vGX5{CKS9$a3;vnCy5w*2V^tHABYm=RJLiI$Z1vI{`5gSIi7x8owZ~2tY$l3bdLk1JQWOlMEviLEEA@G8yMg+>i=EGW zLO!>3^f!q1ENQGxO`m5GrVGJ%-TZ!Cx6w$giTM5gYD`Ca_tXH zhgHnQqtNB73NzK)p{~QPxmtGEtch;nPhs65NwyxB6AxvD^Vin8UtSXMtfOO7`<^7E zl9ZWeA^~4;{$&`5_GSH5THo}P>a_vzkBc7hkBxEgN}i>rbuRkl^BY$c zdfqLT#-M+T_+D1WTrf02YkPPT&>AUk`6n4-Z#$%&rOOUCqC$4WR*r$NA!PaJ~cxR7OrgRYqA= zUe;7jPF3cZs=V@18R+3}@*a4iQ{ewgdUyDs)&A&oJ)#fPe&Fw-KgQH~g4Z8!f4sU9 ze-9=!`uDI<#X0`rf)DNr0sq@h28Q3(b36CQAtJdpXfdwPQLy)Z^8*@h)0MkC_sO6g%_|Ha>*{qVoo0tEfvM*bsy|4Y|@>H3ct_>YAD8(sgU>px=PKN9|Lbp3y$i{;Rk=*lOaj1gMb7SKm;V zX_`rp8zFjWD54VpG|<;MVHz+rXX93GV-^_JGk5Ul**!va@{dpJ!42Hg^b7V33A0!y z8F_N_9LACp9FI?&(mpuc+k1KM17@SX!c&a-qAQHr_dl{4Akw;Z`3zvvaONB5kHFrM zu{Y%y$-*LHC-VJPJ6@~$Kk)l#85}wn??+wk#?Qah*t7}GZ0cVwUbPWiC`18p4fj5| z;WnmBlWYONa~$=%JaMOr>AowERBHZqhO~vB6g>c^NeXf^oh2K$q2qL-F2jFo@00o2Rf>$#B=?61px&+56Q5M5bmxpr~VSE zHFv5Id?q4Aor@>C(B~>(vSyHDZ7`yUy`DdUn)60UZQS*EvX-yTB7rw4oJ6KwxIQ%^ zy&`f4(Mj&%c+fxxw&_QWu(ua{L+KDOkVWrl!;!m8uY&}k0GPa6YbuaK!F6s$RiFH< zZ=U1#RD6e)4MS!LdQx&eze*ag*k0vv(M%vTNdzfg+(+r4s0RG&215lJplG-MUrXi^MWi_MR`tILY*jXjI^>8-l* z*wD%C`?rDRjS{xLKwdLFb{_NNP1W8A@z(rt0KW#B#UAq#1D`E- z{8*7asyuMTre1>e=F7rr2~}w`Li!zx=jL|RH)M5e;VoJKkFl>3xGzE(;7g`11@!kT zOACa%8{iA;W4lJ~N~jciG;6e&03F5Zz-hHWT_n2Xz~KG>E0njPggBSTXt%1v;KNr% zNy;1;G3Kn3PRKhJo|!2f=i+!4m)5y^H3&bym%M*9dA=w;ijmpP&>qncNAZo7lF z8C%`sDqdd1bT;q8F`c4ASG0x#PJoP4PXs^$vityVSA-BKz+!W230-W`n@H>B$`th_ zn5i0LRA>dY$~aSBhbq>ZCr@jADtOZ z=0MF2F3V``&GJC0iWSr_wUBp8*X4}`D!AY$xA^3p-hQg{$yak@6|!&7R8(Nn0)WrK z96RACG!_&7O04V=m&mR6V)>29PV9Ao z^oI@|dYSA&W11VidGl~vTN{Mb zx@X-usoCcybK93M`1tL2k37y?h&9$ZxRiO!>pr>Q48n*-U-C5_?u%XXtTb_p>c*@C z05{wdax|-Gq&KT+)9#0m#^w%JWLb8TF$FE@;_aO@vO`r)-fO;Rb%m`@%z%xnh@4p&h7=# zUNaKP2@;$sAYS5J^qEbtXEr<{xzWcfg=3m5J@Gw1GjC<4A8HO6zNVda++Rx4@(FpL zq@~Vr|M?F?89_fJ(i9bC1Mkfl*{DwAu?odNk-wSFQ z*sZ;mCPGFSg%Xg4c>x^2gt4=l`oR=`Ig&(XK3}ye89nTXPKKc zq?nnZM!PB}bEfBoieh)u(nq%%-B2hZ0})e3}lXuj~-mCTzxG9U}*8M@XhQ6 zipwU8re-n{O}{3i#fCB+JpoAPCbr^we4lnBL%$VUW>5)qhswpNJj-;`A31+cIaR6$ zhz4iX2Yi32t?(qkXv$}VO2DWa+h4?R&{9u}u1yxd_Zq(%I9|il11}wp}jZW&q>D@4ybmNye{ir~r3re)>qh&L`WaD~jrR2AzCq1{fq#QRI5kE5nE$mh= z4l<#KZ)=p56dQCFalrH18}eb1%X@CTYtE0+W_huM)p zfaG;Sh!rNs13tGI9m*Yg@8YNW!gqvRo8x*>E#>>Bi^|h)782`Kr>l)-)$5b``@OV7+%T%#MpVKZO7xt$Im^Ir%Xj! zHYqiTtCMN0?f`dJ#J0)G)KogMh35kM1uvLbT8o)+XLc8p=UQj)o2fy0<4AzNKG5Gb zNy~Yf@|7;ZZ{VI0U-bja`;URWil?8@9zyn>1XQ3|C@in-+M`9FB_TrHn-E^-r6z>g z_;M<(AcO%W=qb`X;FWR>!Isz52(9U=%zQGxwu`?@zY%fcS4GT;Zb{K^qr-`Ix-QMm zcGXM9M-CIYNOFeE`!1TDJ7cE*Cq z!9tpTws^O74e4}qH8b}!`tasQJG&5cw}%G;UqV1Rw|9~%qhYgwRa1(F zTjty);th6vc5jC@)yjqHj1Dm3MQ+gVi+N0E751HnBhH>#ilScB7jaO<&^IP*nNCWqx@2WdewmuiX zpMvo&Ui>s_?4_s%-o027zv?VYE89zYeB;|bk5`rDsX;&-<;`c#d7N%=ir3Qk<9LUl zbnvVMm;05T&y+{kUgGv(6818hv6O7MT1F5ANcyZVTmw**eC7^PG>D8#JY{tf;~OBG zFZr2_ zEtJcB?j^ef!Q+e6LDbbkd6SPRq&xQT7&F$)cl#=Rdq}gNQ|Vc8B()f6e%*v40%wgF z%+0*dW7Y>KjjNZwFY=vn@42((T3Gc)+az%SU!8MVgPsSO?Gl`I--A%gF4Xv= zwE!LRWHm+TP|i!Kj%sQ#@{KTNim(6PYoc3a^I*K<5t z_h?$eIe-%Q<(&?-=L2oM!!Ci=RV8SDNqEu)`Oq*~VRIn%jEh-E<&%^LJeS?!SpY_^ z>vO)_2xWJTR%Ms?vt?Fklb7$qW|&raVOWZAM|lz zA~1W#C}7Q+-__7jW^^a9r9VSDGKNu5D-}U@p_Dp?cMsWe!?=R8jOknaZLx^&9Vz)1-#clZ+(_65_Cnx zhR{fYrt9?LhoFRn0Mph0;HR$OS2{$cBJUVd;sx_6o9xN}oAAYJ&wXULWVCbV@Z3Yq zuKI?iRV;1{9Qx*!+IC0i#jLcFz9)hjvxI7DW$xiw|3L}uJr#;|diMOmDIsh>(R%zW z1(l4*SK_GN52o*=HTxT$tT-;e=V_BEe<>59qC^c*DQ4pdZf3IxUR16#$7jl*+3O_- z4489=+FC_YBI26nl^aI1_gcvOsOIix0i!?eH<@x8ACPx@nrBs7>RmjW-}U{@IKJoZ zxa;V4x&hf#r}N>kStp*aYJN4HLyS8@o7K5b2b+Abvy%=~UaGMAxDGQ5WcW40++fsY zN&ij`v(EWahud!xn>LVgf|N}KYfJ%y6@Dl5?9bo&!H|~xum}hf)@tV-T7`~kL}Ac} z%3u2=&Pg3y8Y%n+%Z+3C)n`e{o(o)6X_v_;;l208!FTXk*9Y6fGSUd);kK?fJn{WA zjwkE*%*GAP8o~P&5INCR)Iake`f%`t^BphlNN0|6T5hX+w)GvZ-$@&eB^V_3z8U$o zx>^5oT#YesEpgxE=Fkixq%ky=Og6t+Z0H-TbVG9I$BW>GW;@wRrQW-T+zpO$eRvXF zz{&XD^5C$!o?kOjg(z#CEER&-OpprEgH;SZ9PF^IR#!vy-iom*(Ly+N&9?8PkI;oL zbO(buc5Psla$#4i`FMBQmzgg4lfOz_A8vpp4COR^+Uv8bBO0!{wj*={vR+3IdI;u0 z9~>*F=?cmG8%N~{%K%T}zk}Kz$8O8#w}BIv31$q*Xzz<#-S0LmC2Tf6=lUv9-C{(E z8YMh&30uq{${b?#AZ)r~UncBwt6L-DqyLztk=`(G*8b&aCIC3wn-2^q3$~zb(V#uH zjdJ{)8%$J{F;ab&wWh2Q+DdvmbMS!5(7IaiH{v&V*8b*KRU-SDWkE~)n%Z}ypo;ij z7(oM6@C-RcTiU^+EpP7uW+EC3uudH;AAGG_W7!5Nl^&2ie1#QYL!PFWaYaP9C&f{> z?jDpsLb((lcz$VF?9qUGL+UGL@L_T&KhcgG_L!+fseG1p=CEeosVbGzab5f$HOV5H zTnY1Ua~PmgFV}clxNNwYZ6yY#x=+IPrzlSs9+mpVA`}37R{a6kFYu8|DWdRu%%r31 z>u)2NBNiO?foTh}R8t({R}>H$yZtWa`C4&~vGwaC{09Lbw-8S{(&XrQfSDHKZS(ts zawrb@*%mGUf{n3L2iXcOaU%>hZlQ#GM8lY_SW*eJ7o{^+;5AD6K==01-D*RY@fqDH zaU>`dhEIr+#1(ki3`Y_k(%Xsv{ICdz`b#JYEs$dw6*xeDlRsX)I`ukF#^CMHejdB} z@ePAld*72*E?*IR@9UgCJ)dg=Lt~0N=5Mcj5!~pEjx>!f8(F*i#`(Q#i?B&d%tC0@ z=E2R@2ew~bYo}jjedVp&%{4R98w74nYaaV`ZfZc+=ep`>D;FRw)vOi%H26i&X!>Pztv%;yoUxjvbw-ivh>1)p)*YFT>E}^5*=C-w6mH` zWyBzU1%T}Ip4)aGRS*EHqJ!O{5GgGr-p$yio!dvH4cp(GQ1b?&HHg$G1S?PX3_DB* zg%t&0`w)DhAi`I8?1hLxN$7Q&I4XV|MTb2Q3ZIa`-o=XM!y|tJ4oEG45x0-7Br5a+ z6-(HpZ)C_iIg?H0PUy+f9BYtB7W#0hF`;O~w>ISUvMu$(9)qY5kl5xYR!&a$7`RyI zy;MLs4LcS-DQ_b=shz2Ev_H9ddZx|o*QufXw6Nzr!b-Y6Wv5|(OEVB&q3Lto5uTD_ z@nvoqome$@Rv#LNs{1S0EWX%nKTg9;I z)R1iY^jb~Tw$o1X0ZfA3nOBpW!<0xS{v0OsJUn-3p{$r%#J@17ug8q)M0x}+bE-|H zGPERn5~?!2**y%$m{Wz~XPdBi0dVM{d&g+yP|-7vES^B81qKWXgoQUhcB{8Ej}m{E zA)U>0_{|5SsNzeJYrtLz zG#_6!g0?d=>L#~J%{PmS1PZ?rq>}^z=;CPMi4I%he68Y9u&ja%-ZvV#1x(6;gvVUb z+;o+q=$Im=O=wdAB^flKH-_0HAHEE{N@0 zmJJxF(h;2)0d)j=ILNxtSxqx{W0GYftni0J=nuJq zSoyuR{;)k<*MdR~tO~vd5}yCs_GgXmTDY-&5iF8PdSSG(AJ$cO>=U1SBJr1Br%;;U zpAiv#GWM=Qq@#tr@Gpr?Jfb7=W6yC=MtLO^Xb6#FEygEf$QL8rT+NDvP;ju#Sfl~6 z!XsvzI7m|dW-EgqKffM!d-JS1(6(F&q4t3`StF3h6l`!Q!CrFh$IZaF|*V4e(gnm4*k?v~eOV&%N<6qIO6d zz)yT!QclmY*#Rx|rS1L|r$p>avq>v^Ne>V*{UZu5^Gnp#NNlivLBv;PJOPPBPlmw+ zDvx{wCWp~LB?`Rvq2qvquW&6ATnz?1{Z{<=!mMYGTW5L9|ax2v<|kfx5N1R zUDRNo06f7bHadqtn zQlxE#ChhELgO>q|XN$6?3m2 z*R?Si{VyOa{NmDU;YU(iV&};Tx?9NFK0zBw3*R!2@0+tL%+pzEqVzBXy%M#@qv-l` zEJ@5jZ%%7V0Yw5|&@AsoM;*|v?B;40JSa1(M6YHedNkmJs{m3Z9X!F&I+_ENd(9bs zgRNbM^D=ZEqu)&mK<4*|2$(Gg`K2F}8$h@MN$ z;)mRt!VAF|igSsN`{t?n@bb4ab`{^YwD?;e<&^2gFA$s3$Yc$wCM79s=WGA{-ixn3 zDPN2T<$2fsgo6p_giORKqfos(VH?PI3!_iAuV646Wr`O5w+3DLlh-Xt9Q39u+41o; zorlM-m#HU6->N}Q3VD99h)5jW+kNKk9=ha+mLImhRnHZgsn{@VWrFPzC3xA=(tBj) z&KHW;x_G_In}ix(32PbSc^J3h*xM0=We9p-XJ^kL`t|dh;MJ$AX>W2T)%k3n$Z#P= zk1odO>C^aA%Ali%r)dToKnpc6(je2YNBBD+w3&MBd}z;5PeMJArhH?|u6l#UWOu;r zg3F8PsSM;jfDeI{Xy-gG--`ry_G&DHklvbgU{F~A$6ovyqdcO69H~hZX!OYOJ@(UZ z*dyQA#*-`b$JO-4Xu6nlSD5CbP0b~=rJupj!XXPe+P0%ru`Csf?qcIr@unG5q>fL2@iF;~nOJwkNssDJ=L|DT_pSb7l$7CZ6m z=QH`pyM3;=-d&!lB0ldNI(+>IrQZD0bE$o7Kgc~nzXqfB^J~=%&qeWYkg*2_0(T}y z2*sAr5mHJz>OtT6_X8tOu9fw7O#B3EsnsBM%;A{|-V18ZG zlpa3ELVBZXJj3Uvbn5OQ28VDsxFbeeeM)FNyB((mOebl1U+(&$Zx9?~q)g0LGg0Q$ z!FJmf<^4#k;=G5pZN*IvaaItxN|&0XT;e6M>7)=TeE5oxGy>WFfvKg(57(}^7<6y$ zm&}C1fQ-YvwviJFyalQOm9g4mlarEj5*oK{X;0)%9|d)|BeSeenS%DKy%)NC+lyw3 z%xYP+s|D>D3Gj8cXIY(nAvfDYirt46U*ERtM{+!1BJl<9Bdcd(TWi;^KX`$zT6YdG8-~DD!2OR z(LC#z+`|)x&yHYPxGnM;g&e9YjTd}%$&Xs3)&|@2p2hTZcE^XrXb-9eUumB8xHlU3 zI+wxs9`{4>HpRze;><9V_J>Z_`xwk8YKlB8(eD-lNms95bK|_9J=0^qf3W?dOdNV* zy_;RGVyaBqXWY;}yOuD22R0!Ru2)u*z=7RINv(Y&x8ma!xu(caInaHWTC-@0mo8&j z)JSMT-)Wi`b%x()H{|Crdz{I>PPlj>Pq*N1u3rJUf^zzaDF$1IZd3~#b6t5`C-Qdnzy#hQA~R9bw_`WFn;bEv+Kl&GiC4+}K* zTbb0965SgM^5(7_A5XCpUrflt7_&bcD>s{HvAPuWOFrA6!wp z7%G?`HRIWdYe`l03YqI=o@RQnx4+(|Fa|4RGa`|v^~2PB-_&sXJb4+`A0)86t-Y;| i+Vr*$0DYyJJIHSl64izlrzns=KwsBLr&P=S>i+=?hv(S< From 85daf35d877588e8146158e90407331fa6d6ba29 Mon Sep 17 00:00:00 2001 From: shartte Date: Tue, 6 Aug 2024 01:29:30 +0200 Subject: [PATCH 04/14] Add a "PanelBlitter" capable of rendering non-rectangular windows dynamically. (#8118) --- .../java/appeng/client/gui/AEBaseScreen.java | 19 +- .../appeng/client/gui/assets/GuiAssets.java | 47 ++ .../client/gui/style/BackgroundGenerator.java | 91 ---- .../client/gui/widgets/PanelBlitter.java | 506 ++++++++++++++++++ .../guidebook/render/RenderContext.java | 6 +- .../ae2/textures/gui/sprites/window.png | Bin 0 -> 145 bytes .../textures/gui/sprites/window.png.mcmeta | 15 + .../ae2/textures/gui/sprites/window_inner.png | Bin 0 -> 157 bytes .../gui/sprites/window_inner.png.mcmeta | 15 + 9 files changed, 595 insertions(+), 104 deletions(-) create mode 100644 src/main/java/appeng/client/gui/assets/GuiAssets.java delete mode 100644 src/main/java/appeng/client/gui/style/BackgroundGenerator.java create mode 100644 src/main/java/appeng/client/gui/widgets/PanelBlitter.java create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/window.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/window.png.mcmeta create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/window_inner.png create mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/window_inner.png.mcmeta diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index f8f8dc3a8a7..bfac8358d96 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -64,7 +64,6 @@ import appeng.api.stacks.GenericStack; import appeng.client.Point; import appeng.client.gui.layout.SlotGridLayout; -import appeng.client.gui.style.BackgroundGenerator; import appeng.client.gui.style.Blitter; import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.SlotPosition; @@ -73,6 +72,7 @@ import appeng.client.gui.widgets.ITickingWidget; import appeng.client.gui.widgets.ITooltip; import appeng.client.gui.widgets.OpenGuideButton; +import appeng.client.gui.widgets.PanelBlitter; import appeng.client.gui.widgets.VerticalButtonBar; import appeng.client.guidebook.PageAnchor; import appeng.client.guidebook.color.SymbolicColor; @@ -653,8 +653,7 @@ && getEmptyingAction(slot, menu.getCarried()) != null) { var action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN; - var p = new InventoryActionPacket(action, slotIdx, 0); - PacketDistributor.sendToServer(p); + PacketDistributor.sendToServer(new InventoryActionPacket(action, slotIdx, 0)); return; } @@ -667,9 +666,7 @@ && getEmptyingAction(slot, menu.getCarried()) != null) { action = mouseButton == 1 ? InventoryAction.CRAFT_STACK : InventoryAction.CRAFT_ITEM; } - final InventoryActionPacket p = new InventoryActionPacket(action, slotIdx, 0); - PacketDistributor.sendToServer(p); - + PacketDistributor.sendToServer(new InventoryActionPacket(action, slotIdx, 0)); return; } @@ -782,12 +779,12 @@ public void drawBG(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX var generatedBackground = style.getGeneratedBackground(); if (generatedBackground != null) { - BackgroundGenerator.draw( + var blitter = new PanelBlitter(); + blitter.addBounds( + 0, 0, generatedBackground.getWidth(), - generatedBackground.getHeight(), - guiGraphics, - offsetX, - offsetY); + generatedBackground.getHeight()); + blitter.blit(guiGraphics, offsetX, offsetY); } var background = style.getBackground(); diff --git a/src/main/java/appeng/client/gui/assets/GuiAssets.java b/src/main/java/appeng/client/gui/assets/GuiAssets.java new file mode 100644 index 00000000000..8f770cf85fc --- /dev/null +++ b/src/main/java/appeng/client/gui/assets/GuiAssets.java @@ -0,0 +1,47 @@ +package appeng.client.gui.assets; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.metadata.gui.GuiSpriteScaling; +import net.minecraft.resources.ResourceLocation; + +/** + * Asset management + */ +public final class GuiAssets { + private GuiAssets() { + } + + public static NineSliceSprite getNineSliceSprite(ResourceLocation id) { + var guiSprites = Minecraft.getInstance().getGuiSprites(); + var sprite = guiSprites.getSprite(id); + if (!(guiSprites.getSpriteScaling(sprite) instanceof GuiSpriteScaling.NineSlice nineSlice)) { + throw new IllegalStateException("Expected sprite " + id + " to be a nine-slice sprite!"); + } + + var border = nineSlice.border(); + // Compute the delimiting U values *in the atlas* for the three slices. + var u0 = sprite.getU0(); + var u1 = sprite.getU(border.left() / (float) nineSlice.width()); + var u2 = sprite.getU(1 - border.right() / (float) nineSlice.width()); + var u3 = sprite.getU1(); + // Compute the delimiting V values *in the atlas* for the three slices. + var v0 = sprite.getV0(); + var v1 = sprite.getV(border.top() / (float) nineSlice.height()); + var v2 = sprite.getV(1 - border.bottom() / (float) nineSlice.height()); + var v3 = sprite.getV1(); + + return new NineSliceSprite( + sprite.atlasLocation(), + border, + new float[] { u0, u1, u2, u3, v0, v1, v2, v3 }); + } + + /** + * @param uv First 4 U values delimiting the horizontal slices, then 4 V values delimiting the vertical slices. + * These values refer to the atlas. + */ + public record NineSliceSprite(ResourceLocation atlasLocation, + GuiSpriteScaling.NineSlice.Border border, + float[] uv) { + } +} diff --git a/src/main/java/appeng/client/gui/style/BackgroundGenerator.java b/src/main/java/appeng/client/gui/style/BackgroundGenerator.java deleted file mode 100644 index ff2a9c1bfdc..00000000000 --- a/src/main/java/appeng/client/gui/style/BackgroundGenerator.java +++ /dev/null @@ -1,91 +0,0 @@ -package appeng.client.gui.style; - -import net.minecraft.client.gui.GuiGraphics; - -/** - * Generates a background of arbitrary size by tiling a pre-defined background. - */ -public final class BackgroundGenerator { - - private static final int BORDER = 4; - - private static final int SIZE = 256; - private static final int TILED_SIZE = SIZE - 2 * BORDER; - private static final Blitter FULL = Blitter.texture("guis/background.png", SIZE, SIZE); - - private static final Blitter TOP_LEFT = FULL.copy().src(0, 0, BORDER, BORDER); - - private static final Blitter TOP_MIDDLE = FULL.copy().src(BORDER, 0, TILED_SIZE, BORDER); - - private static final Blitter TOP_RIGHT = FULL.copy().src(SIZE - BORDER, 0, BORDER, BORDER); - - private static final Blitter LEFT = FULL.copy().src(0, BORDER, BORDER, TILED_SIZE); - - private static final Blitter MIDDLE = FULL.copy().src(BORDER, BORDER, TILED_SIZE, TILED_SIZE); - - private static final Blitter RIGHT = FULL.copy().src(SIZE - BORDER, BORDER, BORDER, TILED_SIZE); - - private static final Blitter BOTTOM_LEFT = FULL.copy().src(0, SIZE - BORDER, BORDER, BORDER); - - private static final Blitter BOTTOM_MIDDLE = FULL.copy().src(BORDER, SIZE - BORDER, TILED_SIZE, BORDER); - - private static final Blitter BOTTOM_RIGHT = FULL.copy().src(SIZE - BORDER, SIZE - BORDER, BORDER, BORDER); - - private BackgroundGenerator() { - } - - public static void draw(int width, int height, GuiGraphics guiGraphics, int x, int y) { - if (width < 2 * BORDER || height < 2 * BORDER) { - return; - } - - var right = x + width; - var bottom = y + height; - - // Corners first - TOP_LEFT.dest(x, y).blit(guiGraphics); - TOP_RIGHT.dest(right - BORDER, y).blit(guiGraphics); - BOTTOM_LEFT.dest(x, bottom - BORDER).blit(guiGraphics); - BOTTOM_RIGHT.dest(right - BORDER, bottom - BORDER).blit(guiGraphics); - - var innerWidth = width - 2 * BORDER; - var innerHeight = height - 2 * BORDER; - - // Horizontally tiled - for (var cx = 0; cx < innerWidth; cx += TILED_SIZE) { - var tileWidth = Math.min(TILED_SIZE, innerWidth - cx); - TOP_MIDDLE.copy() - .srcWidth(tileWidth) - .dest(x + BORDER + cx, y) - .blit(guiGraphics); - BOTTOM_MIDDLE.copy() - .srcWidth(tileWidth) - .dest(x + BORDER + cx, y + height - BORDER) - .blit(guiGraphics); - - // Both horziontally and vertically tiled - for (var cy = 0; cy < innerHeight; cy += TILED_SIZE) { - var tileHeight = Math.min(TILED_SIZE, innerHeight - cy); - MIDDLE.copy() - .srcWidth(tileWidth) - .srcHeight(tileHeight) - .dest(x + BORDER + cx, y + BORDER + cy) - .blit(guiGraphics); - } - } - - // Vertically tiled - for (var cy = 0; cy < innerHeight; cy += TILED_SIZE) { - var tileHeight = Math.min(TILED_SIZE, innerHeight - cy); - LEFT.copy() - .srcHeight(tileHeight) - .dest(x, y + BORDER + cy) - .blit(guiGraphics); - RIGHT.copy() - .srcHeight(tileHeight) - .dest(right - BORDER, y + BORDER + cy) - .blit(guiGraphics); - } - } - -} diff --git a/src/main/java/appeng/client/gui/widgets/PanelBlitter.java b/src/main/java/appeng/client/gui/widgets/PanelBlitter.java new file mode 100644 index 00000000000..ad0db4c49ec --- /dev/null +++ b/src/main/java/appeng/client/gui/widgets/PanelBlitter.java @@ -0,0 +1,506 @@ +package appeng.client.gui.widgets; + +import java.util.ArrayList; +import java.util.List; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexFormat; + +import org.joml.Matrix4f; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.resources.ResourceLocation; + +import appeng.client.gui.assets.GuiAssets; +import appeng.core.AppEng; + +public class PanelBlitter { + + private static final ResourceLocation WINDOW_SPRITE = AppEng.makeId("window"); + private static final ResourceLocation INNER_BORDER_SPRITE = AppEng.makeId("window_inner"); + + private final List rects = new ArrayList<>(); + + private final List processedRects = new ArrayList<>(); + + private final SpriteSlice CENTER; + private final SpriteSlice OUTER_TOP_LEFT; + private final SpriteSlice OUTER_TOP_RIGHT; + private final SpriteSlice OUTER_BOTTOM_RIGHT; + private final SpriteSlice OUTER_BOTTOM_LEFT; + private final SpriteSlice TOP_BORDER; + private final SpriteSlice RIGHT_BORDER; + private final SpriteSlice BOTTOM_BORDER; + private final SpriteSlice LEFT_BORDER; + private final SpriteSlice INNER_TOP_LEFT; + private final SpriteSlice INNER_TOP_RIGHT; + private final SpriteSlice INNER_BOTTOM_RIGHT; + private final SpriteSlice INNER_BOTTOM_LEFT; + + public PanelBlitter() { + var window = GuiAssets.getNineSliceSprite(WINDOW_SPRITE); + var inner = GuiAssets.getNineSliceSprite(INNER_BORDER_SPRITE); + + CENTER = new SpriteSlice(window, 4); + OUTER_TOP_LEFT = new SpriteSlice(window, 0); + OUTER_TOP_RIGHT = new SpriteSlice(window, 2); + OUTER_BOTTOM_RIGHT = new SpriteSlice(window, 8); + OUTER_BOTTOM_LEFT = new SpriteSlice(window, 6); + TOP_BORDER = new SpriteSlice(window, 1); + RIGHT_BORDER = new SpriteSlice(window, 5); + BOTTOM_BORDER = new SpriteSlice(window, 7); + LEFT_BORDER = new SpriteSlice(window, 3); + INNER_TOP_LEFT = new SpriteSlice(inner, 0); + INNER_TOP_RIGHT = new SpriteSlice(inner, 2); + INNER_BOTTOM_RIGHT = new SpriteSlice(inner, 8); + INNER_BOTTOM_LEFT = new SpriteSlice(inner, 6); + } + + public void addBounds(Rect2i rect) { + addBounds(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); + } + + public void addBounds(int x, int y, int width, int height) { + rects.add(new Rectangle(x, y, width, height)); + processedRects.clear(); + } + + public void blit(GuiGraphics graphics, int xOffset, int yOffset) { + blit(graphics, xOffset, yOffset, 0, 0xFFFFFFFF); + } + + public void blit(GuiGraphics graphics, int xOffset, int yOffset, int zOffset, int color) { + + // Update processed rectangles lazily + if (processedRects.size() != rects.size()) { + processedRects.clear(); + for (var rect : rects) { + processedRects.add(rect.copy()); + } + // Merge/Split Edges with other rectangles + for (var rect : processedRects) { + for (var otherRect : processedRects) { + if (rect == otherRect) { + continue; + } + + // Split/eliminate left edges that touch the other rectangle + rect.mergeEdges(otherRect, 0); + rect.mergeEdges(otherRect, 1); + rect.mergeEdges(otherRect, 2); + rect.mergeEdges(otherRect, 3); + } + } + } + + var builder = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + var matrix = graphics.pose().last().pose(); + + for (var rect : processedRects) { + var outerTop = rect.outerTop(); + var outerRight = rect.outerRight(); + var outerBottom = rect.outerBottom(); + var outerLeft = rect.outerLeft(); + var innerTop = rect.topEdges.isEmpty() ? outerTop : outerTop + TOP_BORDER.height(); + var innerRight = rect.rightEdges.isEmpty() ? outerRight : outerRight - RIGHT_BORDER.width(); + var innerBottom = rect.bottomEdges.isEmpty() ? outerBottom : outerBottom - BOTTOM_BORDER.height(); + var innerLeft = rect.leftEdges.isEmpty() ? outerLeft : outerLeft + LEFT_BORDER.width(); + + for (int side = 0; side < 4; side++) { + var edges = rect.getEdgesForSide(side); + + for (var edge : edges) { + int el, et, eb, er; + switch (side) { + case 0 -> { + el = Math.max(innerLeft, outerLeft + edge.start); + er = Math.min(innerRight, outerLeft + edge.end); + et = outerTop; + eb = innerTop; + } + case 1 -> { + el = innerRight; + er = outerRight; + et = Math.max(innerTop, outerTop + edge.start); + eb = Math.min(innerBottom, outerTop + edge.end); + } + case 2 -> { + el = Math.max(innerLeft, outerLeft + edge.start); + er = Math.min(innerRight, outerLeft + edge.end); + et = innerBottom; + eb = outerBottom; + } + case 3 -> { + el = outerLeft; + er = innerLeft; + et = Math.max(innerTop, outerTop + edge.start); + eb = Math.min(innerBottom, outerTop + edge.end); + } + default -> throw new IndexOutOfBoundsException("side"); + } + + renderEdge(matrix, builder, edge.style, side, xOffset + el, yOffset + et, xOffset + er, + yOffset + eb, zOffset, color); + } + } + + for (int i = 0; i < rect.corners.length; i++) { + var cornerStyle = rect.corners[i]; + if (cornerStyle == null) { + continue; + } + + // We must use the width/height the corner would normally be, in case it is filled in + // with an edge sprite. + var border = cornerStyle.nineSlice.border(); + var width = switch (i) { + default -> border.left(); + case 1, 2 -> border.right(); + }; + var height = switch (i) { + default -> border.top(); + case 2, 3 -> border.bottom(); + }; + + var x = switch (i) { + // Left aligned + default -> xOffset + rect.x; + // Right aligned + case 1, 2 -> xOffset + rect.outerRight() - width; + }; + var y = switch (i) { + // Top aligned + default -> yOffset + rect.y; + // Bottom aligned + case 2, 3 -> yOffset + rect.outerBottom() - height; + }; + + cornerStyle.addQuad(matrix, builder, x, y, zOffset, width, height, color); + } + + CENTER.addQuad(matrix, builder, xOffset + innerLeft, yOffset + innerTop, zOffset, + innerRight - innerLeft, innerBottom - innerTop, + color); + } + + try (var meshData = builder.build()) { + if (meshData != null) { + RenderSystem.setShaderTexture(0, CENTER.nineSlice.atlasLocation()); + RenderSystem.setShader(GameRenderer::getPositionTexColorShader); + BufferUploader.drawWithShader(meshData); + } + } + } + + /** + * Rendering an edge potentially involves rendering a start or end cap if the edge hits an adjacent rectangle. + */ + private void renderEdge(Matrix4f matrix, + VertexConsumer vertices, + EdgeStyle style, + int side, + int left, + int top, + int right, + int bottom, + int z, + int color) { + if (right <= left || bottom <= top) { + return; + } + + if (style == EdgeStyle.NORMAL) { + var edgeStyle = switch (side) { + default -> TOP_BORDER; + case 1 -> RIGHT_BORDER; + case 2 -> BOTTOM_BORDER; + case 3 -> LEFT_BORDER; + }; + edgeStyle.addQuad(matrix, vertices, left, top, z, right - left, bottom - top, color); + } else { + SpriteSlice innerStartCorner; + SpriteSlice innerEndCorner; + switch (side) { + case 0 -> { + innerStartCorner = INNER_BOTTOM_RIGHT; + innerEndCorner = INNER_BOTTOM_LEFT; + } + case 1 -> { + innerStartCorner = INNER_BOTTOM_LEFT; + innerEndCorner = INNER_TOP_LEFT; + } + case 2 -> { + innerStartCorner = INNER_TOP_RIGHT; + innerEndCorner = INNER_TOP_LEFT; + } + case 3 -> { + innerStartCorner = INNER_BOTTOM_RIGHT; + innerEndCorner = INNER_TOP_RIGHT; + } + default -> throw new IndexOutOfBoundsException("side"); + } + + if (style == EdgeStyle.INNER_FILL_NO_START) { + innerStartCorner = null; + } else if (style == EdgeStyle.INNER_FILL_NO_END) { + innerEndCorner = null; + } + + if (side == 1 || side == 3) { + // Vertical + if (innerStartCorner != null) { + innerStartCorner.addQuad(matrix, vertices, left, top, z, innerStartCorner.width(), + innerStartCorner.height(), color); + top += innerStartCorner.height(); + } + if (innerEndCorner != null) { + innerEndCorner.addQuad(matrix, vertices, left, bottom - innerEndCorner.height(), z, + innerEndCorner.width(), innerEndCorner.height(), color); + bottom -= innerEndCorner.height(); + } + } else { + // Horizontal + if (innerStartCorner != null) { + innerStartCorner.addQuad(matrix, vertices, left, top, z, innerStartCorner.width(), + innerStartCorner.height(), color); + left += innerStartCorner.width(); + } + if (innerEndCorner != null) { + innerEndCorner.addQuad(matrix, vertices, right - innerEndCorner.width(), top, z, + innerEndCorner.width(), innerEndCorner.height(), color); + right -= innerEndCorner.width(); + } + } + if (right - left > 0 && bottom - top > 0) { + CENTER.addQuad( + matrix, + vertices, + left, top, z, + right - left, bottom - top, + color); + } + } + } + + private record Edge(EdgeStyle style, int start, int end) { + public Edge(int start, int end) { + this(EdgeStyle.NORMAL, start, end); + } + } + + private final class Rectangle { + SpriteSlice[] corners = new SpriteSlice[] { + OUTER_TOP_LEFT, + OUTER_TOP_RIGHT, + OUTER_BOTTOM_RIGHT, + OUTER_BOTTOM_LEFT, + }; + private final List leftEdges = new ArrayList<>(); + private final List topEdges = new ArrayList<>(); + private final List rightEdges = new ArrayList<>(); + private final List bottomEdges = new ArrayList<>(); + int x; + int y; + int width; + int height; + + public Rectangle(int x, int y, int width, int height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + + this.leftEdges.add(new Edge(0, height)); + this.topEdges.add(new Edge(0, width)); + this.rightEdges.add(new Edge(0, height)); + this.bottomEdges.add(new Edge(0, width)); + } + + public int outerLeft() { + return x; + } + + public int outerTop() { + return y; + } + + public int outerRight() { + return x + width; + } + + public int outerBottom() { + return y + height; + } + + public List getEdgesForSide(int side) { + return switch (side) { + case 0 -> topEdges; + case 1 -> rightEdges; + case 2 -> bottomEdges; + case 3 -> leftEdges; + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + } + + public Rectangle copy() { + var result = new Rectangle( + x, y, width, height); + System.arraycopy(corners, 0, result.corners, 0, result.corners.length); + for (int i = 0; i < 4; i++) { + result.getEdgesForSide(i).clear(); + result.getEdgesForSide(i).addAll(getEdgesForSide(i)); + } + return result; + } + + public void mergeEdges(Rectangle otherRect, int side) { + var edges = getEdgesForSide(side); + + if (edges.isEmpty()) { + return; + } + // Determine if the two rects touch on the given side + var touching = switch (side) { + case 0 -> outerTop() == otherRect.outerBottom(); + case 1 -> outerRight() == otherRect.outerLeft(); + case 2 -> outerBottom() == otherRect.outerTop(); + case 3 -> outerLeft() == otherRect.outerRight(); + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + if (!touching) { + return; + } + + var ourStart = switch (side) { + case 0, 2 -> x; + case 1, 3 -> y; + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + var otherStart = switch (side) { + case 0, 2 -> otherRect.outerLeft(); + case 1, 3 -> otherRect.outerTop(); + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + var otherEnd = switch (side) { + case 0, 2 -> otherRect.outerRight(); + case 1, 3 -> otherRect.outerBottom(); + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + + var tempEdges = new ArrayList(); + for (var ourEdge : edges) { + var edgeStart = ourStart + ourEdge.start; + var edgeEnd = ourStart + ourEdge.end; + + // Determine overlap + if (edgeStart < otherEnd && edgeEnd > otherStart) { + // Add split edge for top part that starts before the other rectangle does + var overhangStart = otherStart - edgeStart; + if (overhangStart > 0) { + tempEdges.add(new Edge(edgeStart - ourStart, edgeStart - ourStart + overhangStart)); + } + // Add split edge for bottom part that starts before the other rectangle does + var overhangEnd = edgeEnd - otherEnd; + if (overhangEnd > 0) { + tempEdges.add(new Edge(edgeEnd - ourStart - overhangEnd, edgeEnd)); + } + + var startCorner = switch (side) { + case 0, 3 -> 0; + case 1 -> 1; + case 2 -> 3; + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + var endCorner = switch (side) { + case 0 -> 1; + case 1, 2 -> 2; + case 3 -> 3; + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + + // Add a fill only if the edge hasn't been entirely eliminated + if (overhangStart > 0 || overhangEnd > 0) { + var fillType = EdgeStyle.INNER_FILL; + if (overhangStart <= 0) { + fillType = EdgeStyle.INNER_FILL_NO_START; + } else if (overhangEnd <= 0) { + fillType = EdgeStyle.INNER_FILL_NO_END; + } + + tempEdges.add( + new Edge(fillType, edgeStart - ourStart + overhangStart, + edgeEnd - ourStart - overhangEnd)); + if (overhangStart <= 0) { + corners[startCorner] = switch (side) { + case 0, 2 -> LEFT_BORDER; + case 1, 3 -> TOP_BORDER; + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + } + if (overhangEnd <= 0) { + corners[endCorner] = switch (side) { + case 0, 2 -> RIGHT_BORDER; + case 1, 3 -> BOTTOM_BORDER; + default -> throw new IllegalStateException("Unexpected value: " + side); + }; + } + } else { + // If the edge has been eliminated, also eliminate the corners + corners[startCorner] = null; + corners[endCorner] = null; + } + } else { + tempEdges.add(ourEdge); + } + } + edges.clear(); + edges.addAll(tempEdges); + } + } + + private enum EdgeStyle { + NORMAL, + INNER_FILL, + INNER_FILL_NO_START, + INNER_FILL_NO_END + } + + /** + * We use a 9-slice sprite for the normal window as well as the "inner" borders used to draw corners between + * adjacent rectangles. This record represents one slice of the 9-slice sprite. The slice index is counted + * left-to-right, then top-to-bottom starting at 0. + */ + private record SpriteSlice(GuiAssets.NineSliceSprite nineSlice, int slice) { + int height() { + return slice / 3 == 2 ? nineSlice.border().bottom() : nineSlice.border().top(); + } + + int width() { + return slice % 3 == 2 ? nineSlice.border().right() : nineSlice.border().left(); + } + + public void addQuad(Matrix4f matrix, VertexConsumer vertices, float x, float y, float z, float width, + float height, int color) { + int row = slice / 3; + int col = slice % 3; + + var uv = nineSlice.uv(); + var minU = uv[col]; + var maxU = uv[col + 1]; + var minV = uv[4 + row]; + var maxV = uv[4 + row + 1]; + + vertices.addVertex(matrix, x, y, z).setUv(minU, minV).setColor(color); + vertices.addVertex(matrix, x, y + height, z).setUv(minU, maxV).setColor(color); + vertices.addVertex(matrix, x + width, y + height, z).setUv(maxU, maxV).setColor(color); + vertices.addVertex(matrix, x + width, y, z).setUv(maxU, minV).setColor(color); + } + } + +} diff --git a/src/main/java/appeng/client/guidebook/render/RenderContext.java b/src/main/java/appeng/client/guidebook/render/RenderContext.java index 2a3ee9e5d45..2e46dd35798 100644 --- a/src/main/java/appeng/client/guidebook/render/RenderContext.java +++ b/src/main/java/appeng/client/guidebook/render/RenderContext.java @@ -23,8 +23,8 @@ import net.neoforged.neoforge.fluids.FluidStack; import appeng.api.stacks.AEFluidKey; -import appeng.client.gui.style.BackgroundGenerator; import appeng.client.gui.style.FluidBlitter; +import appeng.client.gui.widgets.PanelBlitter; import appeng.client.guidebook.color.ColorValue; import appeng.client.guidebook.color.ConstantColor; import appeng.client.guidebook.color.LightDarkMode; @@ -226,7 +226,9 @@ default void renderFluid(FluidStack stack, int x, int y, int z, int width, int h void renderItem(ItemStack stack, int x, int y, int z, float width, float height); default void renderPanel(LytRect bounds) { - BackgroundGenerator.draw(bounds.width(), bounds.height(), guiGraphics(), bounds.x(), bounds.y()); + var panelBlitter = new PanelBlitter(); + panelBlitter.addBounds(0, 0, bounds.width(), bounds.height()); + panelBlitter.blit(guiGraphics(), bounds.x(), bounds.y()); } default void pushScissor(LytRect bounds) { diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/window.png b/src/main/resources/assets/ae2/textures/gui/sprites/window.png new file mode 100644 index 0000000000000000000000000000000000000000..58ae20cd668a8e26ace87845a71b3b4c8095ab33 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5M?jcysy3fAP|(@a z#W6%E$EvXK$;k-`2}&nz7fZ4AvSs)< oCrymt4St@tY~f@HPv3hClmBtaN99a93p9?w)78&qol`;+0QHJ0e*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/window.png.mcmeta b/src/main/resources/assets/ae2/textures/gui/sprites/window.png.mcmeta new file mode 100644 index 00000000000..11eac5c2f56 --- /dev/null +++ b/src/main/resources/assets/ae2/textures/gui/sprites/window.png.mcmeta @@ -0,0 +1,15 @@ +{ + "gui": { + "scaling": { + "type": "nine_slice", + "width": 16, + "height": 16, + "border": { + "left": 2, + "top": 2, + "right": 2, + "bottom": 4 + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/window_inner.png b/src/main/resources/assets/ae2/textures/gui/sprites/window_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..383b1d1211873a96a22167d3ea564c3574e0c481 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F3${@^GvDCf{DCqC$ z;uvDloBZe3&(rm6TnyaI%*= Date: Tue, 6 Aug 2024 01:31:55 +0200 Subject: [PATCH 05/14] Remove unused background.png --- .../assets/ae2/textures/guis/background.png | Bin 945 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/ae2/textures/guis/background.png diff --git a/src/main/resources/assets/ae2/textures/guis/background.png b/src/main/resources/assets/ae2/textures/guis/background.png deleted file mode 100644 index a23a9462af8ecd5bc782517bb4d8cd7e7d3b8737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%U;1OBOz`%C|gc+x5^GP!> zFeiJuIEGZrd3$}MZ&RX3+ePl5&lj{9axhCss}-nw-#KW|J58^twUBk+Bg^Hxo<`fA zyc>J&`f&!&+h@)^|C{`k@4?Bq_p z4Eqqs{eS#rMZ`|#h=kcQEBD_Gf6pNHfyv>bP0l+XkKi1yg= From adddaaa716f2989129125fcead7825789afd87ba Mon Sep 17 00:00:00 2001 From: shartte Date: Thu, 8 Aug 2024 01:06:33 +0200 Subject: [PATCH 06/14] Only save the client config when values actually changed (reducing risk of file locking issues) (#8123) --- src/main/java/appeng/core/AEConfig.java | 72 ++++++++++++++++--------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index 8ddf39dc00b..8efbca6da60 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -100,8 +100,10 @@ public boolean isSearchModNameInTooltips() { } public void setSearchModNameInTooltips(boolean enable) { - client.searchModNameInTooltips.set(enable); - client.spec.save(); + if (enable != client.searchModNameInTooltips.getAsBoolean()) { + client.searchModNameInTooltips.set(enable); + client.spec.save(); + } } public boolean isUseExternalSearch() { @@ -109,8 +111,10 @@ public boolean isUseExternalSearch() { } public void setUseExternalSearch(boolean enable) { - client.useExternalSearch.set(enable); - client.spec.save(); + if (enable != client.useExternalSearch.getAsBoolean()) { + client.useExternalSearch.set(enable); + client.spec.save(); + } } public boolean isClearExternalSearchOnOpen() { @@ -118,8 +122,10 @@ public boolean isClearExternalSearchOnOpen() { } public void setClearExternalSearchOnOpen(boolean enable) { - client.clearExternalSearchOnOpen.set(enable); - client.spec.save(); + if (enable != client.clearExternalSearchOnOpen.getAsBoolean()) { + client.clearExternalSearchOnOpen.set(enable); + client.spec.save(); + } } public boolean isRememberLastSearch() { @@ -127,8 +133,10 @@ public boolean isRememberLastSearch() { } public void setRememberLastSearch(boolean enable) { - client.rememberLastSearch.set(enable); - client.spec.save(); + if (enable != client.rememberLastSearch.getAsBoolean()) { + client.rememberLastSearch.set(enable); + client.spec.save(); + } } public boolean isAutoFocusSearch() { @@ -136,8 +144,10 @@ public boolean isAutoFocusSearch() { } public void setAutoFocusSearch(boolean enable) { - client.autoFocusSearch.set(enable); - client.spec.save(); + if (enable != client.autoFocusSearch.getAsBoolean()) { + client.autoFocusSearch.set(enable); + client.spec.save(); + } } public boolean isSyncWithExternalSearch() { @@ -145,8 +155,10 @@ public boolean isSyncWithExternalSearch() { } public void setSyncWithExternalSearch(boolean enable) { - client.syncWithExternalSearch.set(enable); - client.spec.save(); + if (enable != client.syncWithExternalSearch.getAsBoolean()) { + client.syncWithExternalSearch.set(enable); + client.spec.save(); + } } public TerminalStyle getTerminalStyle() { @@ -154,8 +166,10 @@ public TerminalStyle getTerminalStyle() { } public void setTerminalStyle(TerminalStyle setting) { - client.terminalStyle.set(setting); - client.spec.save(); + if (setting != client.terminalStyle.get()) { + client.terminalStyle.set(setting); + client.spec.save(); + } } public double getGridEnergyStoragePerNode() { @@ -263,8 +277,10 @@ public boolean isShowDebugGuiOverlays() { } public void setShowDebugGuiOverlays(boolean enable) { - client.debugGuiOverlays.set(enable); - client.spec.save(); + if (enable != client.debugGuiOverlays.getAsBoolean()) { + client.debugGuiOverlays.set(enable); + client.spec.save(); + } } public boolean isSpawnPressesInMeteoritesEnabled() { @@ -308,8 +324,10 @@ public ChannelMode getChannelMode() { } public void setChannelModel(ChannelMode mode) { - common.channels.set(mode); - client.spec.save(); + if (mode != common.channels.get()) { + common.channels.set(mode); + client.spec.save(); + } } public int getPathfindingStepsPerTick() { @@ -355,8 +373,10 @@ public boolean isPinAutoCraftedItems() { } public void setPinAutoCraftedItems(boolean enabled) { - client.pinAutoCraftedItems.set(enabled); - client.spec.save(); + if (enabled != client.pinAutoCraftedItems.getAsBoolean()) { + client.pinAutoCraftedItems.set(enabled); + client.spec.save(); + } } public boolean isNotifyForFinishedCraftingJobs() { @@ -364,8 +384,10 @@ public boolean isNotifyForFinishedCraftingJobs() { } public void setNotifyForFinishedCraftingJobs(boolean enabled) { - client.notifyForFinishedCraftingJobs.set(enabled); - client.spec.save(); + if (enabled != client.notifyForFinishedCraftingJobs.getAsBoolean()) { + client.notifyForFinishedCraftingJobs.set(enabled); + client.spec.save(); + } } public boolean isClearGridOnClose() { @@ -373,8 +395,10 @@ public boolean isClearGridOnClose() { } public void setClearGridOnClose(boolean enabled) { - client.clearGridOnClose.set(enabled); - client.spec.save(); + if (enabled != client.clearGridOnClose.getAsBoolean()) { + client.clearGridOnClose.set(enabled); + client.spec.save(); + } } public double getVibrationChamberBaseEnergyPerFuelTick() { From 8825bbfb1c4390b1a2718f47e9a42d39630c9f90 Mon Sep 17 00:00:00 2001 From: shartte Date: Fri, 9 Aug 2024 00:19:16 +0200 Subject: [PATCH 07/14] Bump to 1.21.1 (#8128) --- gradle.properties | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index 01a6a035235..dd668a49cbe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,12 +7,11 @@ java_version=21 ######################################################### # Minecraft Versions # ######################################################### -minecraft_release=1.21 -minecraft_version=1.21 -minecraft_version_range=1.21 +minecraft_version=1.21.1 +minecraft_version_range=[1.21.1] # https://projects.neoforged.net/neoforged/neoforge -neoforge_version=21.0.146 -neoforge_version_range=[21.0.143,) +neoforge_version=21.1.1 +neoforge_version_range=[21.1.1,) ######################################################### # Parchment # From aa6c9d2b6792d6a3b1050f9950ef94ff7fea7f3f Mon Sep 17 00:00:00 2001 From: shartte Date: Fri, 9 Aug 2024 02:26:55 +0200 Subject: [PATCH 08/14] Fix memory cards resetting P2P frequency on each use (#8129) --- src/main/java/appeng/parts/p2p/P2PTunnelPart.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/appeng/parts/p2p/P2PTunnelPart.java b/src/main/java/appeng/parts/p2p/P2PTunnelPart.java index 22ed53ee0b4..da9d2c84ca0 100644 --- a/src/main/java/appeng/parts/p2p/P2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/P2PTunnelPart.java @@ -19,7 +19,6 @@ package appeng.parts.p2p; import java.util.List; -import java.util.Objects; import java.util.stream.Stream; import org.jetbrains.annotations.Nullable; @@ -160,8 +159,7 @@ public boolean onUseItemOn(ItemStack heldItem, Player player, InteractionHand ha final boolean wasOutput = this.isOutput(); this.setOutput(false); - final boolean needsNewFrequency = wasOutput || this.getFrequency() == 0 - || Objects.equals(storedFrequency, newFreq); + var needsNewFrequency = wasOutput || newFreq == 0; var grid = getMainNode().getGrid(); if (grid != null) { From 53647fa1c8c04f4228ae0dd2c033bfa5600b9a96 Mon Sep 17 00:00:00 2001 From: shartte Date: Fri, 9 Aug 2024 02:31:48 +0200 Subject: [PATCH 09/14] Fixes a brief client-side desync when attuning a P2P tunnel (#8130) --- .../java/appeng/parts/p2p/P2PTunnelPart.java | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/main/java/appeng/parts/p2p/P2PTunnelPart.java b/src/main/java/appeng/parts/p2p/P2PTunnelPart.java index da9d2c84ca0..84df6c5c591 100644 --- a/src/main/java/appeng/parts/p2p/P2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/P2PTunnelPart.java @@ -146,6 +146,30 @@ public boolean useStandardMemoryCard() { @Override public boolean onUseItemOn(ItemStack heldItem, Player player, InteractionHand hand, Vec3 pos) { + // Attunement via held item replaces the tunnel part with the desired target part type + var newType = P2PTunnelAttunement.getTunnelPartByTriggerItem(heldItem); + if (!newType.isEmpty() && newType.getItem() != getPartItem() + && newType.getItem() instanceof IPartItem partItem) { + var oldOutput = isOutput(); + var myFreq = getFrequency(); + + // If we were able to replace the tunnel part, copy over frequency/output state + var tunnel = getHost().replacePart(partItem, getSide(), player, hand); + if (!isClientSide()) { + if (tunnel instanceof P2PTunnelPart newTunnel) { + newTunnel.setOutput(oldOutput); + newTunnel.onTunnelNetworkChange(); + + newTunnel.getMainNode().ifPresent(grid -> { + P2PService.get(grid).updateFreq(newTunnel, myFreq); + }); + } + } + + Platform.notifyBlocksOfNeighbors(getLevel(), getBlockEntity().getBlockPos()); + return true; + } + if (isClientSide() || hand == InteractionHand.OFF_HAND) { return false; } @@ -205,28 +229,6 @@ public boolean onUseItemOn(ItemStack heldItem, Player player, InteractionHand ha return false; } - // Attunement via held item replaces the tunnel part with the desired target part type - var newType = P2PTunnelAttunement.getTunnelPartByTriggerItem(heldItem); - if (!newType.isEmpty() && newType.getItem() != getPartItem() - && newType.getItem() instanceof IPartItem partItem) { - var oldOutput = isOutput(); - var myFreq = getFrequency(); - - // If we were able to replace the tunnel part, copy over frequency/output state - var tunnel = getHost().replacePart(partItem, getSide(), player, hand); - if (tunnel instanceof P2PTunnelPart newTunnel) { - newTunnel.setOutput(oldOutput); - newTunnel.onTunnelNetworkChange(); - - newTunnel.getMainNode().ifPresent(grid -> { - P2PService.get(grid).updateFreq(newTunnel, myFreq); - }); - } - - Platform.notifyBlocksOfNeighbors(getLevel(), getBlockEntity().getBlockPos()); - return true; - } - return false; } From feee0f2e80b2c703d3e9a7141e7c537b3610a102 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 9 Aug 2024 12:38:54 +0200 Subject: [PATCH 10/14] Revert "Remove unused background.png" This reverts commit 7418ff8d89fdf7874cd1a5827f1a53568ddac6a4. --- .../assets/ae2/textures/guis/background.png | Bin 0 -> 945 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/ae2/textures/guis/background.png diff --git a/src/main/resources/assets/ae2/textures/guis/background.png b/src/main/resources/assets/ae2/textures/guis/background.png new file mode 100644 index 0000000000000000000000000000000000000000..a23a9462af8ecd5bc782517bb4d8cd7e7d3b8737 GIT binary patch literal 945 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%U;1OBOz`%C|gc+x5^GP!> zFeiJuIEGZrd3$}MZ&RX3+ePl5&lj{9axhCss}-nw-#KW|J58^twUBk+Bg^Hxo<`fA zyc>J&`f&!&+h@)^|C{`k@4?Bq_p z4Eqqs{eS#rMZ`|#h=kcQEBD_Gf6pNHfyv>bP0l+XkKi1yg= literal 0 HcmV?d00001 From 7a9a53985aff12340c790f1d3f5d67afa64facbd Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 9 Aug 2024 12:38:55 +0200 Subject: [PATCH 11/14] Revert "Add a "PanelBlitter" capable of rendering non-rectangular windows dynamically. (#8118)" This reverts commit 85daf35d877588e8146158e90407331fa6d6ba29. --- .../java/appeng/client/gui/AEBaseScreen.java | 19 +- .../appeng/client/gui/assets/GuiAssets.java | 47 -- .../client/gui/style/BackgroundGenerator.java | 91 ++++ .../client/gui/widgets/PanelBlitter.java | 506 ------------------ .../guidebook/render/RenderContext.java | 6 +- .../ae2/textures/gui/sprites/window.png | Bin 145 -> 0 bytes .../textures/gui/sprites/window.png.mcmeta | 15 - .../ae2/textures/gui/sprites/window_inner.png | Bin 157 -> 0 bytes .../gui/sprites/window_inner.png.mcmeta | 15 - 9 files changed, 104 insertions(+), 595 deletions(-) delete mode 100644 src/main/java/appeng/client/gui/assets/GuiAssets.java create mode 100644 src/main/java/appeng/client/gui/style/BackgroundGenerator.java delete mode 100644 src/main/java/appeng/client/gui/widgets/PanelBlitter.java delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/window.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/window.png.mcmeta delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/window_inner.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/window_inner.png.mcmeta diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index bfac8358d96..f8f8dc3a8a7 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -64,6 +64,7 @@ import appeng.api.stacks.GenericStack; import appeng.client.Point; import appeng.client.gui.layout.SlotGridLayout; +import appeng.client.gui.style.BackgroundGenerator; import appeng.client.gui.style.Blitter; import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.SlotPosition; @@ -72,7 +73,6 @@ import appeng.client.gui.widgets.ITickingWidget; import appeng.client.gui.widgets.ITooltip; import appeng.client.gui.widgets.OpenGuideButton; -import appeng.client.gui.widgets.PanelBlitter; import appeng.client.gui.widgets.VerticalButtonBar; import appeng.client.guidebook.PageAnchor; import appeng.client.guidebook.color.SymbolicColor; @@ -653,7 +653,8 @@ && getEmptyingAction(slot, menu.getCarried()) != null) { var action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN; - PacketDistributor.sendToServer(new InventoryActionPacket(action, slotIdx, 0)); + var p = new InventoryActionPacket(action, slotIdx, 0); + PacketDistributor.sendToServer(p); return; } @@ -666,7 +667,9 @@ && getEmptyingAction(slot, menu.getCarried()) != null) { action = mouseButton == 1 ? InventoryAction.CRAFT_STACK : InventoryAction.CRAFT_ITEM; } - PacketDistributor.sendToServer(new InventoryActionPacket(action, slotIdx, 0)); + final InventoryActionPacket p = new InventoryActionPacket(action, slotIdx, 0); + PacketDistributor.sendToServer(p); + return; } @@ -779,12 +782,12 @@ public void drawBG(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX var generatedBackground = style.getGeneratedBackground(); if (generatedBackground != null) { - var blitter = new PanelBlitter(); - blitter.addBounds( - 0, 0, + BackgroundGenerator.draw( generatedBackground.getWidth(), - generatedBackground.getHeight()); - blitter.blit(guiGraphics, offsetX, offsetY); + generatedBackground.getHeight(), + guiGraphics, + offsetX, + offsetY); } var background = style.getBackground(); diff --git a/src/main/java/appeng/client/gui/assets/GuiAssets.java b/src/main/java/appeng/client/gui/assets/GuiAssets.java deleted file mode 100644 index 8f770cf85fc..00000000000 --- a/src/main/java/appeng/client/gui/assets/GuiAssets.java +++ /dev/null @@ -1,47 +0,0 @@ -package appeng.client.gui.assets; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.metadata.gui.GuiSpriteScaling; -import net.minecraft.resources.ResourceLocation; - -/** - * Asset management - */ -public final class GuiAssets { - private GuiAssets() { - } - - public static NineSliceSprite getNineSliceSprite(ResourceLocation id) { - var guiSprites = Minecraft.getInstance().getGuiSprites(); - var sprite = guiSprites.getSprite(id); - if (!(guiSprites.getSpriteScaling(sprite) instanceof GuiSpriteScaling.NineSlice nineSlice)) { - throw new IllegalStateException("Expected sprite " + id + " to be a nine-slice sprite!"); - } - - var border = nineSlice.border(); - // Compute the delimiting U values *in the atlas* for the three slices. - var u0 = sprite.getU0(); - var u1 = sprite.getU(border.left() / (float) nineSlice.width()); - var u2 = sprite.getU(1 - border.right() / (float) nineSlice.width()); - var u3 = sprite.getU1(); - // Compute the delimiting V values *in the atlas* for the three slices. - var v0 = sprite.getV0(); - var v1 = sprite.getV(border.top() / (float) nineSlice.height()); - var v2 = sprite.getV(1 - border.bottom() / (float) nineSlice.height()); - var v3 = sprite.getV1(); - - return new NineSliceSprite( - sprite.atlasLocation(), - border, - new float[] { u0, u1, u2, u3, v0, v1, v2, v3 }); - } - - /** - * @param uv First 4 U values delimiting the horizontal slices, then 4 V values delimiting the vertical slices. - * These values refer to the atlas. - */ - public record NineSliceSprite(ResourceLocation atlasLocation, - GuiSpriteScaling.NineSlice.Border border, - float[] uv) { - } -} diff --git a/src/main/java/appeng/client/gui/style/BackgroundGenerator.java b/src/main/java/appeng/client/gui/style/BackgroundGenerator.java new file mode 100644 index 00000000000..ff2a9c1bfdc --- /dev/null +++ b/src/main/java/appeng/client/gui/style/BackgroundGenerator.java @@ -0,0 +1,91 @@ +package appeng.client.gui.style; + +import net.minecraft.client.gui.GuiGraphics; + +/** + * Generates a background of arbitrary size by tiling a pre-defined background. + */ +public final class BackgroundGenerator { + + private static final int BORDER = 4; + + private static final int SIZE = 256; + private static final int TILED_SIZE = SIZE - 2 * BORDER; + private static final Blitter FULL = Blitter.texture("guis/background.png", SIZE, SIZE); + + private static final Blitter TOP_LEFT = FULL.copy().src(0, 0, BORDER, BORDER); + + private static final Blitter TOP_MIDDLE = FULL.copy().src(BORDER, 0, TILED_SIZE, BORDER); + + private static final Blitter TOP_RIGHT = FULL.copy().src(SIZE - BORDER, 0, BORDER, BORDER); + + private static final Blitter LEFT = FULL.copy().src(0, BORDER, BORDER, TILED_SIZE); + + private static final Blitter MIDDLE = FULL.copy().src(BORDER, BORDER, TILED_SIZE, TILED_SIZE); + + private static final Blitter RIGHT = FULL.copy().src(SIZE - BORDER, BORDER, BORDER, TILED_SIZE); + + private static final Blitter BOTTOM_LEFT = FULL.copy().src(0, SIZE - BORDER, BORDER, BORDER); + + private static final Blitter BOTTOM_MIDDLE = FULL.copy().src(BORDER, SIZE - BORDER, TILED_SIZE, BORDER); + + private static final Blitter BOTTOM_RIGHT = FULL.copy().src(SIZE - BORDER, SIZE - BORDER, BORDER, BORDER); + + private BackgroundGenerator() { + } + + public static void draw(int width, int height, GuiGraphics guiGraphics, int x, int y) { + if (width < 2 * BORDER || height < 2 * BORDER) { + return; + } + + var right = x + width; + var bottom = y + height; + + // Corners first + TOP_LEFT.dest(x, y).blit(guiGraphics); + TOP_RIGHT.dest(right - BORDER, y).blit(guiGraphics); + BOTTOM_LEFT.dest(x, bottom - BORDER).blit(guiGraphics); + BOTTOM_RIGHT.dest(right - BORDER, bottom - BORDER).blit(guiGraphics); + + var innerWidth = width - 2 * BORDER; + var innerHeight = height - 2 * BORDER; + + // Horizontally tiled + for (var cx = 0; cx < innerWidth; cx += TILED_SIZE) { + var tileWidth = Math.min(TILED_SIZE, innerWidth - cx); + TOP_MIDDLE.copy() + .srcWidth(tileWidth) + .dest(x + BORDER + cx, y) + .blit(guiGraphics); + BOTTOM_MIDDLE.copy() + .srcWidth(tileWidth) + .dest(x + BORDER + cx, y + height - BORDER) + .blit(guiGraphics); + + // Both horziontally and vertically tiled + for (var cy = 0; cy < innerHeight; cy += TILED_SIZE) { + var tileHeight = Math.min(TILED_SIZE, innerHeight - cy); + MIDDLE.copy() + .srcWidth(tileWidth) + .srcHeight(tileHeight) + .dest(x + BORDER + cx, y + BORDER + cy) + .blit(guiGraphics); + } + } + + // Vertically tiled + for (var cy = 0; cy < innerHeight; cy += TILED_SIZE) { + var tileHeight = Math.min(TILED_SIZE, innerHeight - cy); + LEFT.copy() + .srcHeight(tileHeight) + .dest(x, y + BORDER + cy) + .blit(guiGraphics); + RIGHT.copy() + .srcHeight(tileHeight) + .dest(right - BORDER, y + BORDER + cy) + .blit(guiGraphics); + } + } + +} diff --git a/src/main/java/appeng/client/gui/widgets/PanelBlitter.java b/src/main/java/appeng/client/gui/widgets/PanelBlitter.java deleted file mode 100644 index ad0db4c49ec..00000000000 --- a/src/main/java/appeng/client/gui/widgets/PanelBlitter.java +++ /dev/null @@ -1,506 +0,0 @@ -package appeng.client.gui.widgets; - -import java.util.ArrayList; -import java.util.List; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferUploader; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.blaze3d.vertex.VertexFormat; - -import org.joml.Matrix4f; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.resources.ResourceLocation; - -import appeng.client.gui.assets.GuiAssets; -import appeng.core.AppEng; - -public class PanelBlitter { - - private static final ResourceLocation WINDOW_SPRITE = AppEng.makeId("window"); - private static final ResourceLocation INNER_BORDER_SPRITE = AppEng.makeId("window_inner"); - - private final List rects = new ArrayList<>(); - - private final List processedRects = new ArrayList<>(); - - private final SpriteSlice CENTER; - private final SpriteSlice OUTER_TOP_LEFT; - private final SpriteSlice OUTER_TOP_RIGHT; - private final SpriteSlice OUTER_BOTTOM_RIGHT; - private final SpriteSlice OUTER_BOTTOM_LEFT; - private final SpriteSlice TOP_BORDER; - private final SpriteSlice RIGHT_BORDER; - private final SpriteSlice BOTTOM_BORDER; - private final SpriteSlice LEFT_BORDER; - private final SpriteSlice INNER_TOP_LEFT; - private final SpriteSlice INNER_TOP_RIGHT; - private final SpriteSlice INNER_BOTTOM_RIGHT; - private final SpriteSlice INNER_BOTTOM_LEFT; - - public PanelBlitter() { - var window = GuiAssets.getNineSliceSprite(WINDOW_SPRITE); - var inner = GuiAssets.getNineSliceSprite(INNER_BORDER_SPRITE); - - CENTER = new SpriteSlice(window, 4); - OUTER_TOP_LEFT = new SpriteSlice(window, 0); - OUTER_TOP_RIGHT = new SpriteSlice(window, 2); - OUTER_BOTTOM_RIGHT = new SpriteSlice(window, 8); - OUTER_BOTTOM_LEFT = new SpriteSlice(window, 6); - TOP_BORDER = new SpriteSlice(window, 1); - RIGHT_BORDER = new SpriteSlice(window, 5); - BOTTOM_BORDER = new SpriteSlice(window, 7); - LEFT_BORDER = new SpriteSlice(window, 3); - INNER_TOP_LEFT = new SpriteSlice(inner, 0); - INNER_TOP_RIGHT = new SpriteSlice(inner, 2); - INNER_BOTTOM_RIGHT = new SpriteSlice(inner, 8); - INNER_BOTTOM_LEFT = new SpriteSlice(inner, 6); - } - - public void addBounds(Rect2i rect) { - addBounds(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); - } - - public void addBounds(int x, int y, int width, int height) { - rects.add(new Rectangle(x, y, width, height)); - processedRects.clear(); - } - - public void blit(GuiGraphics graphics, int xOffset, int yOffset) { - blit(graphics, xOffset, yOffset, 0, 0xFFFFFFFF); - } - - public void blit(GuiGraphics graphics, int xOffset, int yOffset, int zOffset, int color) { - - // Update processed rectangles lazily - if (processedRects.size() != rects.size()) { - processedRects.clear(); - for (var rect : rects) { - processedRects.add(rect.copy()); - } - // Merge/Split Edges with other rectangles - for (var rect : processedRects) { - for (var otherRect : processedRects) { - if (rect == otherRect) { - continue; - } - - // Split/eliminate left edges that touch the other rectangle - rect.mergeEdges(otherRect, 0); - rect.mergeEdges(otherRect, 1); - rect.mergeEdges(otherRect, 2); - rect.mergeEdges(otherRect, 3); - } - } - } - - var builder = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); - var matrix = graphics.pose().last().pose(); - - for (var rect : processedRects) { - var outerTop = rect.outerTop(); - var outerRight = rect.outerRight(); - var outerBottom = rect.outerBottom(); - var outerLeft = rect.outerLeft(); - var innerTop = rect.topEdges.isEmpty() ? outerTop : outerTop + TOP_BORDER.height(); - var innerRight = rect.rightEdges.isEmpty() ? outerRight : outerRight - RIGHT_BORDER.width(); - var innerBottom = rect.bottomEdges.isEmpty() ? outerBottom : outerBottom - BOTTOM_BORDER.height(); - var innerLeft = rect.leftEdges.isEmpty() ? outerLeft : outerLeft + LEFT_BORDER.width(); - - for (int side = 0; side < 4; side++) { - var edges = rect.getEdgesForSide(side); - - for (var edge : edges) { - int el, et, eb, er; - switch (side) { - case 0 -> { - el = Math.max(innerLeft, outerLeft + edge.start); - er = Math.min(innerRight, outerLeft + edge.end); - et = outerTop; - eb = innerTop; - } - case 1 -> { - el = innerRight; - er = outerRight; - et = Math.max(innerTop, outerTop + edge.start); - eb = Math.min(innerBottom, outerTop + edge.end); - } - case 2 -> { - el = Math.max(innerLeft, outerLeft + edge.start); - er = Math.min(innerRight, outerLeft + edge.end); - et = innerBottom; - eb = outerBottom; - } - case 3 -> { - el = outerLeft; - er = innerLeft; - et = Math.max(innerTop, outerTop + edge.start); - eb = Math.min(innerBottom, outerTop + edge.end); - } - default -> throw new IndexOutOfBoundsException("side"); - } - - renderEdge(matrix, builder, edge.style, side, xOffset + el, yOffset + et, xOffset + er, - yOffset + eb, zOffset, color); - } - } - - for (int i = 0; i < rect.corners.length; i++) { - var cornerStyle = rect.corners[i]; - if (cornerStyle == null) { - continue; - } - - // We must use the width/height the corner would normally be, in case it is filled in - // with an edge sprite. - var border = cornerStyle.nineSlice.border(); - var width = switch (i) { - default -> border.left(); - case 1, 2 -> border.right(); - }; - var height = switch (i) { - default -> border.top(); - case 2, 3 -> border.bottom(); - }; - - var x = switch (i) { - // Left aligned - default -> xOffset + rect.x; - // Right aligned - case 1, 2 -> xOffset + rect.outerRight() - width; - }; - var y = switch (i) { - // Top aligned - default -> yOffset + rect.y; - // Bottom aligned - case 2, 3 -> yOffset + rect.outerBottom() - height; - }; - - cornerStyle.addQuad(matrix, builder, x, y, zOffset, width, height, color); - } - - CENTER.addQuad(matrix, builder, xOffset + innerLeft, yOffset + innerTop, zOffset, - innerRight - innerLeft, innerBottom - innerTop, - color); - } - - try (var meshData = builder.build()) { - if (meshData != null) { - RenderSystem.setShaderTexture(0, CENTER.nineSlice.atlasLocation()); - RenderSystem.setShader(GameRenderer::getPositionTexColorShader); - BufferUploader.drawWithShader(meshData); - } - } - } - - /** - * Rendering an edge potentially involves rendering a start or end cap if the edge hits an adjacent rectangle. - */ - private void renderEdge(Matrix4f matrix, - VertexConsumer vertices, - EdgeStyle style, - int side, - int left, - int top, - int right, - int bottom, - int z, - int color) { - if (right <= left || bottom <= top) { - return; - } - - if (style == EdgeStyle.NORMAL) { - var edgeStyle = switch (side) { - default -> TOP_BORDER; - case 1 -> RIGHT_BORDER; - case 2 -> BOTTOM_BORDER; - case 3 -> LEFT_BORDER; - }; - edgeStyle.addQuad(matrix, vertices, left, top, z, right - left, bottom - top, color); - } else { - SpriteSlice innerStartCorner; - SpriteSlice innerEndCorner; - switch (side) { - case 0 -> { - innerStartCorner = INNER_BOTTOM_RIGHT; - innerEndCorner = INNER_BOTTOM_LEFT; - } - case 1 -> { - innerStartCorner = INNER_BOTTOM_LEFT; - innerEndCorner = INNER_TOP_LEFT; - } - case 2 -> { - innerStartCorner = INNER_TOP_RIGHT; - innerEndCorner = INNER_TOP_LEFT; - } - case 3 -> { - innerStartCorner = INNER_BOTTOM_RIGHT; - innerEndCorner = INNER_TOP_RIGHT; - } - default -> throw new IndexOutOfBoundsException("side"); - } - - if (style == EdgeStyle.INNER_FILL_NO_START) { - innerStartCorner = null; - } else if (style == EdgeStyle.INNER_FILL_NO_END) { - innerEndCorner = null; - } - - if (side == 1 || side == 3) { - // Vertical - if (innerStartCorner != null) { - innerStartCorner.addQuad(matrix, vertices, left, top, z, innerStartCorner.width(), - innerStartCorner.height(), color); - top += innerStartCorner.height(); - } - if (innerEndCorner != null) { - innerEndCorner.addQuad(matrix, vertices, left, bottom - innerEndCorner.height(), z, - innerEndCorner.width(), innerEndCorner.height(), color); - bottom -= innerEndCorner.height(); - } - } else { - // Horizontal - if (innerStartCorner != null) { - innerStartCorner.addQuad(matrix, vertices, left, top, z, innerStartCorner.width(), - innerStartCorner.height(), color); - left += innerStartCorner.width(); - } - if (innerEndCorner != null) { - innerEndCorner.addQuad(matrix, vertices, right - innerEndCorner.width(), top, z, - innerEndCorner.width(), innerEndCorner.height(), color); - right -= innerEndCorner.width(); - } - } - if (right - left > 0 && bottom - top > 0) { - CENTER.addQuad( - matrix, - vertices, - left, top, z, - right - left, bottom - top, - color); - } - } - } - - private record Edge(EdgeStyle style, int start, int end) { - public Edge(int start, int end) { - this(EdgeStyle.NORMAL, start, end); - } - } - - private final class Rectangle { - SpriteSlice[] corners = new SpriteSlice[] { - OUTER_TOP_LEFT, - OUTER_TOP_RIGHT, - OUTER_BOTTOM_RIGHT, - OUTER_BOTTOM_LEFT, - }; - private final List leftEdges = new ArrayList<>(); - private final List topEdges = new ArrayList<>(); - private final List rightEdges = new ArrayList<>(); - private final List bottomEdges = new ArrayList<>(); - int x; - int y; - int width; - int height; - - public Rectangle(int x, int y, int width, int height) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - - this.leftEdges.add(new Edge(0, height)); - this.topEdges.add(new Edge(0, width)); - this.rightEdges.add(new Edge(0, height)); - this.bottomEdges.add(new Edge(0, width)); - } - - public int outerLeft() { - return x; - } - - public int outerTop() { - return y; - } - - public int outerRight() { - return x + width; - } - - public int outerBottom() { - return y + height; - } - - public List getEdgesForSide(int side) { - return switch (side) { - case 0 -> topEdges; - case 1 -> rightEdges; - case 2 -> bottomEdges; - case 3 -> leftEdges; - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - } - - public Rectangle copy() { - var result = new Rectangle( - x, y, width, height); - System.arraycopy(corners, 0, result.corners, 0, result.corners.length); - for (int i = 0; i < 4; i++) { - result.getEdgesForSide(i).clear(); - result.getEdgesForSide(i).addAll(getEdgesForSide(i)); - } - return result; - } - - public void mergeEdges(Rectangle otherRect, int side) { - var edges = getEdgesForSide(side); - - if (edges.isEmpty()) { - return; - } - // Determine if the two rects touch on the given side - var touching = switch (side) { - case 0 -> outerTop() == otherRect.outerBottom(); - case 1 -> outerRight() == otherRect.outerLeft(); - case 2 -> outerBottom() == otherRect.outerTop(); - case 3 -> outerLeft() == otherRect.outerRight(); - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - if (!touching) { - return; - } - - var ourStart = switch (side) { - case 0, 2 -> x; - case 1, 3 -> y; - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - var otherStart = switch (side) { - case 0, 2 -> otherRect.outerLeft(); - case 1, 3 -> otherRect.outerTop(); - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - var otherEnd = switch (side) { - case 0, 2 -> otherRect.outerRight(); - case 1, 3 -> otherRect.outerBottom(); - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - - var tempEdges = new ArrayList(); - for (var ourEdge : edges) { - var edgeStart = ourStart + ourEdge.start; - var edgeEnd = ourStart + ourEdge.end; - - // Determine overlap - if (edgeStart < otherEnd && edgeEnd > otherStart) { - // Add split edge for top part that starts before the other rectangle does - var overhangStart = otherStart - edgeStart; - if (overhangStart > 0) { - tempEdges.add(new Edge(edgeStart - ourStart, edgeStart - ourStart + overhangStart)); - } - // Add split edge for bottom part that starts before the other rectangle does - var overhangEnd = edgeEnd - otherEnd; - if (overhangEnd > 0) { - tempEdges.add(new Edge(edgeEnd - ourStart - overhangEnd, edgeEnd)); - } - - var startCorner = switch (side) { - case 0, 3 -> 0; - case 1 -> 1; - case 2 -> 3; - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - var endCorner = switch (side) { - case 0 -> 1; - case 1, 2 -> 2; - case 3 -> 3; - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - - // Add a fill only if the edge hasn't been entirely eliminated - if (overhangStart > 0 || overhangEnd > 0) { - var fillType = EdgeStyle.INNER_FILL; - if (overhangStart <= 0) { - fillType = EdgeStyle.INNER_FILL_NO_START; - } else if (overhangEnd <= 0) { - fillType = EdgeStyle.INNER_FILL_NO_END; - } - - tempEdges.add( - new Edge(fillType, edgeStart - ourStart + overhangStart, - edgeEnd - ourStart - overhangEnd)); - if (overhangStart <= 0) { - corners[startCorner] = switch (side) { - case 0, 2 -> LEFT_BORDER; - case 1, 3 -> TOP_BORDER; - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - } - if (overhangEnd <= 0) { - corners[endCorner] = switch (side) { - case 0, 2 -> RIGHT_BORDER; - case 1, 3 -> BOTTOM_BORDER; - default -> throw new IllegalStateException("Unexpected value: " + side); - }; - } - } else { - // If the edge has been eliminated, also eliminate the corners - corners[startCorner] = null; - corners[endCorner] = null; - } - } else { - tempEdges.add(ourEdge); - } - } - edges.clear(); - edges.addAll(tempEdges); - } - } - - private enum EdgeStyle { - NORMAL, - INNER_FILL, - INNER_FILL_NO_START, - INNER_FILL_NO_END - } - - /** - * We use a 9-slice sprite for the normal window as well as the "inner" borders used to draw corners between - * adjacent rectangles. This record represents one slice of the 9-slice sprite. The slice index is counted - * left-to-right, then top-to-bottom starting at 0. - */ - private record SpriteSlice(GuiAssets.NineSliceSprite nineSlice, int slice) { - int height() { - return slice / 3 == 2 ? nineSlice.border().bottom() : nineSlice.border().top(); - } - - int width() { - return slice % 3 == 2 ? nineSlice.border().right() : nineSlice.border().left(); - } - - public void addQuad(Matrix4f matrix, VertexConsumer vertices, float x, float y, float z, float width, - float height, int color) { - int row = slice / 3; - int col = slice % 3; - - var uv = nineSlice.uv(); - var minU = uv[col]; - var maxU = uv[col + 1]; - var minV = uv[4 + row]; - var maxV = uv[4 + row + 1]; - - vertices.addVertex(matrix, x, y, z).setUv(minU, minV).setColor(color); - vertices.addVertex(matrix, x, y + height, z).setUv(minU, maxV).setColor(color); - vertices.addVertex(matrix, x + width, y + height, z).setUv(maxU, maxV).setColor(color); - vertices.addVertex(matrix, x + width, y, z).setUv(maxU, minV).setColor(color); - } - } - -} diff --git a/src/main/java/appeng/client/guidebook/render/RenderContext.java b/src/main/java/appeng/client/guidebook/render/RenderContext.java index 2e46dd35798..2a3ee9e5d45 100644 --- a/src/main/java/appeng/client/guidebook/render/RenderContext.java +++ b/src/main/java/appeng/client/guidebook/render/RenderContext.java @@ -23,8 +23,8 @@ import net.neoforged.neoforge.fluids.FluidStack; import appeng.api.stacks.AEFluidKey; +import appeng.client.gui.style.BackgroundGenerator; import appeng.client.gui.style.FluidBlitter; -import appeng.client.gui.widgets.PanelBlitter; import appeng.client.guidebook.color.ColorValue; import appeng.client.guidebook.color.ConstantColor; import appeng.client.guidebook.color.LightDarkMode; @@ -226,9 +226,7 @@ default void renderFluid(FluidStack stack, int x, int y, int z, int width, int h void renderItem(ItemStack stack, int x, int y, int z, float width, float height); default void renderPanel(LytRect bounds) { - var panelBlitter = new PanelBlitter(); - panelBlitter.addBounds(0, 0, bounds.width(), bounds.height()); - panelBlitter.blit(guiGraphics(), bounds.x(), bounds.y()); + BackgroundGenerator.draw(bounds.width(), bounds.height(), guiGraphics(), bounds.x(), bounds.y()); } default void pushScissor(LytRect bounds) { diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/window.png b/src/main/resources/assets/ae2/textures/gui/sprites/window.png deleted file mode 100644 index 58ae20cd668a8e26ace87845a71b3b4c8095ab33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5M?jcysy3fAP|(@a z#W6%E$EvXK$;k-`2}&nz7fZ4AvSs)< oCrymt4St@tY~f@HPv3hClmBtaN99a93p9?w)78&qol`;+0QHJ0e*gdg diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/window.png.mcmeta b/src/main/resources/assets/ae2/textures/gui/sprites/window.png.mcmeta deleted file mode 100644 index 11eac5c2f56..00000000000 --- a/src/main/resources/assets/ae2/textures/gui/sprites/window.png.mcmeta +++ /dev/null @@ -1,15 +0,0 @@ -{ - "gui": { - "scaling": { - "type": "nine_slice", - "width": 16, - "height": 16, - "border": { - "left": 2, - "top": 2, - "right": 2, - "bottom": 4 - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/window_inner.png b/src/main/resources/assets/ae2/textures/gui/sprites/window_inner.png deleted file mode 100644 index 383b1d1211873a96a22167d3ea564c3574e0c481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F3${@^GvDCf{DCqC$ z;uvDloBZe3&(rm6TnyaI%*= Date: Fri, 9 Aug 2024 12:38:55 +0200 Subject: [PATCH 12/14] Revert "Refactor "Icon" to use the new GUI sprite-sheet system and remove the states.png file. (#8086)" This reverts commit e48fefd6a2ccf056fe81870206538012424d2e5c. --- gradle.properties | 2 +- .../java/appeng/client/gui/AEBaseScreen.java | 5 +- src/main/java/appeng/client/gui/Icon.java | 385 ++++++++++-------- .../gui/implementations/InterfaceScreen.java | 3 +- .../PatternProviderLockReason.java | 6 +- .../gui/me/items/CraftingEncodingPanel.java | 3 +- .../gui/me/items/EncodingModePanel.java | 7 +- .../gui/me/items/ProcessingEncodingPanel.java | 3 +- .../me/items/SmithingTableEncodingPanel.java | 3 +- .../me/items/StonecuttingEncodingPanel.java | 3 +- .../client/gui/widgets/ActionButton.java | 5 +- .../appeng/client/gui/widgets/IconButton.java | 18 +- .../appeng/client/gui/widgets/InfoBar.java | 9 +- .../gui/widgets/KeyTypeSelectionButton.java | 3 +- .../client/gui/widgets/OpenGuideButton.java | 3 +- .../gui/widgets/SettingToggleButton.java | 18 +- .../appeng/client/gui/widgets/TabButton.java | 10 +- .../client/gui/widgets/ToggleButton.java | 13 +- .../client/gui/widgets/ValidationIcon.java | 3 +- .../guidebook/render/RenderContext.java | 21 +- .../modules/emi/EmiCondenserRecipe.java | 13 +- .../integration/modules/emi/SpriteWidget.java | 27 -- .../modules/rei/CondenserCategory.java | 17 +- .../integration/modules/rei/SpriteWidget.java | 35 -- .../menu/implementations/QuartzKnifeMenu.java | 4 +- .../java/appeng/menu/slot/AppEngSlot.java | 8 +- .../java/appeng/menu/slot/OutputSlot.java | 4 +- .../appeng/menu/slot/RestrictedInputSlot.java | 5 +- .../gui/sprites/icons/access_read.png | Bin 207 -> 0 bytes .../gui/sprites/icons/access_read_write.png | Bin 243 -> 0 bytes .../gui/sprites/icons/access_write.png | Bin 206 -> 0 bytes .../textures/gui/sprites/icons/arrow_down.png | Bin 180 -> 0 bytes .../textures/gui/sprites/icons/arrow_left.png | Bin 162 -> 0 bytes .../gui/sprites/icons/arrow_right.png | Bin 165 -> 0 bytes .../textures/gui/sprites/icons/arrow_up.png | Bin 165 -> 0 bytes .../gui/sprites/icons/auto_export_off.png | Bin 190 -> 0 bytes .../gui/sprites/icons/auto_export_on.png | Bin 186 -> 0 bytes .../ae2/textures/gui/sprites/icons/back.png | Bin 169 -> 0 bytes .../icons/background_blank_pattern.png | Bin 270 -> 0 bytes .../sprites/icons/background_chargable.png | Bin 112 -> 0 bytes .../gui/sprites/icons/background_dust.png | Bin 112 -> 0 bytes .../icons/background_encoded_pattern.png | Bin 261 -> 0 bytes .../gui/sprites/icons/background_fuel.png | Bin 213 -> 0 bytes .../gui/sprites/icons/background_ingot.png | Bin 216 -> 0 bytes .../gui/sprites/icons/background_ore.png | Bin 112 -> 0 bytes .../gui/sprites/icons/background_plate.png | Bin 174 -> 0 bytes .../icons/background_primary_output.png | Bin 143 -> 0 bytes .../sprites/icons/background_singularity.png | Bin 206 -> 0 bytes .../sprites/icons/background_spatial_cell.png | Bin 288 -> 0 bytes .../background_spatial_cell_no_shadow.png | Bin 276 -> 0 bytes .../sprites/icons/background_storage_cell.png | Bin 289 -> 0 bytes .../icons/background_storage_component.png | Bin 303 -> 0 bytes .../gui/sprites/icons/background_trash.png | Bin 183 -> 0 bytes .../gui/sprites/icons/background_upgrade.png | Bin 184 -> 0 bytes .../sprites/icons/background_view_cell.png | Bin 288 -> 0 bytes .../icons/background_wireless_booster.png | Bin 211 -> 0 bytes .../icons/background_wireless_term.png | Bin 183 -> 0 bytes .../textures/gui/sprites/icons/blacklist.png | Bin 112 -> 0 bytes .../gui/sprites/icons/blocking_mode_no.png | Bin 186 -> 0 bytes .../gui/sprites/icons/blocking_mode_yes.png | Bin 210 -> 0 bytes .../ae2/textures/gui/sprites/icons/clear.png | Bin 230 -> 0 bytes .../ae2/textures/gui/sprites/icons/cog.png | Bin 253 -> 0 bytes .../gui/sprites/icons/cog_disabled.png | Bin 239 -> 0 bytes .../icons/condenser_output_matter_ball.png | Bin 192 -> 0 bytes .../icons/condenser_output_singularity.png | Bin 239 -> 0 bytes .../sprites/icons/condenser_output_trash.png | Bin 199 -> 0 bytes .../gui/sprites/icons/copy_mode_off.png | Bin 234 -> 0 bytes .../gui/sprites/icons/copy_mode_on.png | Bin 202 -> 0 bytes .../gui/sprites/icons/craft_hammer.png | Bin 197 -> 0 bytes .../ae2/textures/gui/sprites/icons/enter.png | Bin 145 -> 0 bytes .../icons/filter_on_extract_disabled.png | Bin 209 -> 0 bytes .../icons/filter_on_extract_enabled.png | Bin 249 -> 0 bytes .../icons/fluid_substitution_disabled.png | Bin 112 -> 0 bytes .../icons/fluid_substitution_enabled.png | Bin 112 -> 0 bytes .../gui/sprites/icons/fullness_empty.png | Bin 143 -> 0 bytes .../gui/sprites/icons/fullness_full.png | Bin 150 -> 0 bytes .../gui/sprites/icons/fullness_half.png | Bin 155 -> 0 bytes .../gui/sprites/icons/fuzzy_ignore.png | Bin 149 -> 0 bytes .../gui/sprites/icons/fuzzy_percent_25.png | Bin 186 -> 0 bytes .../gui/sprites/icons/fuzzy_percent_50.png | Bin 190 -> 0 bytes .../gui/sprites/icons/fuzzy_percent_75.png | Bin 187 -> 0 bytes .../gui/sprites/icons/fuzzy_percent_99.png | Bin 182 -> 0 bytes .../ae2/textures/gui/sprites/icons/help.png | Bin 168 -> 0 bytes .../gui/sprites/icons/horizontal_tab.png | Bin 175 -> 0 bytes .../sprites/icons/horizontal_tab_focus.png | Bin 170 -> 0 bytes .../sprites/icons/horizontal_tab_selected.png | Bin 170 -> 0 bytes .../gui/sprites/icons/inscriber_buffer_1.png | Bin 228 -> 0 bytes .../gui/sprites/icons/inscriber_buffer_4.png | Bin 263 -> 0 bytes .../gui/sprites/icons/inscriber_buffer_64.png | Bin 283 -> 0 bytes .../icons/inscriber_combined_sides.png | Bin 171 -> 0 bytes .../icons/inscriber_separate_sides.png | Bin 176 -> 0 bytes .../textures/gui/sprites/icons/invalid.png | Bin 259 -> 0 bytes .../gui/sprites/icons/level_energy.png | Bin 112 -> 0 bytes .../textures/gui/sprites/icons/level_item.png | Bin 112 -> 0 bytes .../ae2/textures/gui/sprites/icons/locked.png | Bin 164 -> 0 bytes .../gui/sprites/icons/overlay_off.png | Bin 237 -> 0 bytes .../textures/gui/sprites/icons/overlay_on.png | Bin 181 -> 0 bytes .../gui/sprites/icons/pattern_access_hide.png | Bin 303 -> 0 bytes .../gui/sprites/icons/pattern_access_show.png | Bin 290 -> 0 bytes .../sprites/icons/pattern_terminal_all.png | Bin 232 -> 0 bytes .../icons/pattern_terminal_not_full.png | Bin 194 -> 0 bytes .../icons/pattern_terminal_visible.png | Bin 201 -> 0 bytes .../gui/sprites/icons/placement_block.png | Bin 245 -> 0 bytes .../gui/sprites/icons/placement_item.png | Bin 202 -> 0 bytes .../gui/sprites/icons/power_unit_ae.png | Bin 170 -> 0 bytes .../gui/sprites/icons/power_unit_eu.png | Bin 154 -> 0 bytes .../gui/sprites/icons/power_unit_j.png | Bin 118 -> 0 bytes .../gui/sprites/icons/power_unit_rf.png | Bin 165 -> 0 bytes .../gui/sprites/icons/power_unit_tr.png | Bin 134 -> 0 bytes .../gui/sprites/icons/power_unit_w.png | Bin 126 -> 0 bytes .../textures/gui/sprites/icons/priority.png | Bin 191 -> 0 bytes .../sprites/icons/redstone_above_equal.png | Bin 179 -> 0 bytes .../gui/sprites/icons/redstone_below.png | Bin 170 -> 0 bytes .../gui/sprites/icons/redstone_high.png | Bin 157 -> 0 bytes .../gui/sprites/icons/redstone_ignore.png | Bin 182 -> 0 bytes .../gui/sprites/icons/redstone_low.png | Bin 176 -> 0 bytes .../gui/sprites/icons/redstone_off.png | Bin 132 -> 0 bytes .../gui/sprites/icons/redstone_on.png | Bin 133 -> 0 bytes .../gui/sprites/icons/redstone_pulse.png | Bin 161 -> 0 bytes .../gui/sprites/icons/s_arrow_down.png | Bin 149 -> 0 bytes .../textures/gui/sprites/icons/s_arrow_up.png | Bin 142 -> 0 bytes .../textures/gui/sprites/icons/s_clear.png | Bin 174 -> 0 bytes .../textures/gui/sprites/icons/s_craft.png | Bin 185 -> 0 bytes .../textures/gui/sprites/icons/s_cycle.png | Bin 147 -> 0 bytes .../icons/s_fluid_substitution_disabled.png | Bin 177 -> 0 bytes .../icons/s_fluid_substitution_enabled.png | Bin 170 -> 0 bytes .../textures/gui/sprites/icons/s_machine.png | Bin 193 -> 0 bytes .../gui/sprites/icons/s_processor.png | Bin 201 -> 0 bytes .../textures/gui/sprites/icons/s_storage.png | Bin 146 -> 0 bytes .../sprites/icons/s_substitution_disabled.png | Bin 160 -> 0 bytes .../sprites/icons/s_substitution_enabled.png | Bin 159 -> 0 bytes .../textures/gui/sprites/icons/s_terminal.png | Bin 163 -> 0 bytes .../gui/sprites/icons/scheduling_default.png | Bin 231 -> 0 bytes .../gui/sprites/icons/scheduling_random.png | Bin 297 -> 0 bytes .../sprites/icons/scheduling_round_robin.png | Bin 247 -> 0 bytes .../gui/sprites/icons/search_auto_focus.png | Bin 370 -> 0 bytes .../icons/search_auto_focus_remember.png | Bin 112 -> 0 bytes .../gui/sprites/icons/search_default.png | Bin 112 -> 0 bytes .../textures/gui/sprites/icons/search_jei.png | Bin 112 -> 0 bytes .../sprites/icons/search_jei_auto_clear.png | Bin 112 -> 0 bytes .../textures/gui/sprites/icons/search_rei.png | Bin 112 -> 0 bytes .../sprites/icons/search_rei_auto_clear.png | Bin 112 -> 0 bytes .../gui/sprites/icons/search_remember.png | Bin 112 -> 0 bytes .../gui/sprites/icons/slot_background.png | Bin 125 -> 0 bytes .../gui/sprites/icons/sort_by_amount.png | Bin 235 -> 0 bytes .../icons/sort_by_inventory_tweaks.png | Bin 112 -> 0 bytes .../gui/sprites/icons/sort_by_mod.png | Bin 212 -> 0 bytes .../gui/sprites/icons/sort_by_name.png | Bin 175 -> 0 bytes .../icons/storage_filter_extractable_none.png | Bin 177 -> 0 bytes .../icons/storage_filter_extractable_only.png | Bin 167 -> 0 bytes .../sprites/icons/substitution_disabled.png | Bin 112 -> 0 bytes .../sprites/icons/substitution_enabled.png | Bin 112 -> 0 bytes .../sprites/icons/tab_button_background.png | Bin 160 -> 0 bytes .../tab_button_background_borderless.png | Bin 158 -> 0 bytes ...tab_button_background_borderless_focus.png | Bin 224 -> 0 bytes .../icons/tab_button_background_focus.png | Bin 168 -> 0 bytes .../gui/sprites/icons/tab_crafting.png | Bin 301 -> 0 bytes .../gui/sprites/icons/tab_processing.png | Bin 303 -> 0 bytes .../gui/sprites/icons/tab_smithing.png | Bin 390 -> 0 bytes .../gui/sprites/icons/tab_stonecutting.png | Bin 370 -> 0 bytes .../gui/sprites/icons/terminal_style_full.png | Bin 202 -> 0 bytes .../sprites/icons/terminal_style_medium.png | Bin 158 -> 0 bytes .../sprites/icons/terminal_style_small.png | Bin 153 -> 0 bytes .../gui/sprites/icons/terminal_style_tall.png | Bin 161 -> 0 bytes .../icons/toolbar_button_background.png | Bin 157 -> 0 bytes .../icons/toolbar_button_background_focus.png | Bin 159 -> 0 bytes .../icons/toolbar_button_background_hover.png | Bin 160 -> 0 bytes .../sprites/icons/transparent_facades_off.png | Bin 169 -> 0 bytes .../sprites/icons/transparent_facades_on.png | Bin 112 -> 0 bytes .../gui/sprites/icons/type_filter_all.png | Bin 240 -> 0 bytes .../gui/sprites/icons/type_filter_fluids.png | Bin 112 -> 0 bytes .../gui/sprites/icons/type_filter_items.png | Bin 112 -> 0 bytes .../textures/gui/sprites/icons/unlocked.png | Bin 165 -> 0 bytes .../ae2/textures/gui/sprites/icons/valid.png | Bin 112 -> 0 bytes .../gui/sprites/icons/view_mode_all.png | Bin 234 -> 0 bytes .../gui/sprites/icons/view_mode_crafting.png | Bin 188 -> 0 bytes .../gui/sprites/icons/view_mode_stored.png | Bin 189 -> 0 bytes .../gui/sprites/icons/white_arrow_down.png | Bin 161 -> 0 bytes .../textures/gui/sprites/icons/whitelist.png | Bin 112 -> 0 bytes .../assets/ae2/textures/guis/states.png | Bin 0 -> 12581 bytes 180 files changed, 303 insertions(+), 333 deletions(-) delete mode 100644 src/main/java/appeng/integration/modules/emi/SpriteWidget.java delete mode 100644 src/main/java/appeng/integration/modules/rei/SpriteWidget.java delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/access_read.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/access_read_write.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/access_write.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_down.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_left.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_right.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_up.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_off.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_on.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/back.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_blank_pattern.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_chargable.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_dust.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_encoded_pattern.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_fuel.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_ingot.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_ore.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_plate.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_primary_output.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_singularity.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_spatial_cell.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_spatial_cell_no_shadow.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_storage_cell.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_storage_component.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_trash.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_upgrade.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_view_cell.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_booster.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_term.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/blacklist.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_no.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_yes.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/clear.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/cog.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/cog_disabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_matter_ball.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_singularity.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_trash.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/copy_mode_off.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/copy_mode_on.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/craft_hammer.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/enter.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_disabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_enabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_disabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_enabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_empty.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_full.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_half.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_ignore.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_25.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_50.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_75.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_99.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/help.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_focus.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_selected.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_1.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_4.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_64.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_combined_sides.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_separate_sides.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/invalid.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/level_energy.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/level_item.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/locked.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_off.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_on.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_access_hide.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_access_show.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_all.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_not_full.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_visible.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_block.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_item.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_ae.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_eu.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_j.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_rf.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_tr.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_w.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/priority.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_above_equal.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_below.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_high.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_ignore.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_low.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_off.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_on.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_pulse.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_arrow_down.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_arrow_up.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_clear.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_craft.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_cycle.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_fluid_substitution_disabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_fluid_substitution_enabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_machine.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_processor.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_storage.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_substitution_disabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_substitution_enabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/s_terminal.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_default.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_random.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_round_robin.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_auto_focus.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_auto_focus_remember.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_default.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei_auto_clear.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei_auto_clear.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/search_remember.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/slot_background.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_amount.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_inventory_tweaks.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_mod.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_name.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_none.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_only.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/substitution_disabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/substitution_enabled.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless_focus.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_focus.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_crafting.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_processing.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_smithing.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_stonecutting.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_full.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_medium.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_small.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_tall.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background_focus.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background_hover.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_off.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_on.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_all.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_fluids.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_items.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/unlocked.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/valid.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_all.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_crafting.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_stored.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/white_arrow_down.png delete mode 100644 src/main/resources/assets/ae2/textures/gui/sprites/icons/whitelist.png create mode 100644 src/main/resources/assets/ae2/textures/guis/states.png diff --git a/gradle.properties b/gradle.properties index dd668a49cbe..b89012ae610 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ emi_version=1.1.10+1.21 # please learn how to use semver... top_version_range=[1.20.0,) jade_version_range=[15.0.0,) -rei_version=16.0.744 +rei_version=16.0.729 wthit_version=12.1.2 jade_file_id=5427817 curios_version=7.1.0+1.20.4 diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index f8f8dc3a8a7..57c263409c4 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -65,7 +65,6 @@ import appeng.client.Point; import appeng.client.gui.layout.SlotGridLayout; import appeng.client.gui.style.BackgroundGenerator; -import appeng.client.gui.style.Blitter; import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.SlotPosition; import appeng.client.gui.style.Text; @@ -519,7 +518,7 @@ private void drawOptionalSlotBackground(GuiGraphics guiGraphics, IOptionalSlot s Point pos = slot.getBackgroundPos(); - Blitter.guiSprite(Icon.SLOT_BACKGROUND) + Icon.SLOT_BACKGROUND.getBlitter() .dest(leftPos + pos.getX(), topPos + pos.getY()) .color(1, 1, 1, alpha) .blit(guiGraphics); @@ -828,7 +827,7 @@ private void renderAppEngSlot(GuiGraphics guiGraphics, AppEngSlot s) { // If the slot has a background icon, render it, but only if the slot is empty // or it requests the icon to be always drawn if ((s.renderIconWithItem() || is.isEmpty()) && s.isSlotEnabled() && s.getIcon() != null) { - Blitter.guiSprite(s.getIcon()) + s.getIcon().getBlitter() .dest(s.x, s.y) .opacity(s.getOpacityOfIcon()) .blit(guiGraphics); diff --git a/src/main/java/appeng/client/gui/Icon.java b/src/main/java/appeng/client/gui/Icon.java index 4de75b6fec7..9b321463bc1 100644 --- a/src/main/java/appeng/client/gui/Icon.java +++ b/src/main/java/appeng/client/gui/Icon.java @@ -20,176 +20,225 @@ import net.minecraft.resources.ResourceLocation; +import appeng.client.gui.style.Blitter; import appeng.core.AppEng; -public final class Icon { - private Icon() { +/** + * Edit in {@code assets/ae2/textures/guis/states.png}. + */ +public enum Icon { + // ROW 0 + REDSTONE_LOW(0, 0), + REDSTONE_HIGH(16, 0), + REDSTONE_PULSE(32, 0), + REDSTONE_IGNORE(48, 0), + REDSTONE_OFF(64, 0), + REDSTONE_ON(80, 0), + REDSTONE_ABOVE_EQUAL(192, 0), + REDSTONE_BELOW(208, 0), + // CLEAR, STASH + CLEAR(96, 0), + ENTER(112, 0), + // ENCODE + WHITE_ARROW_DOWN(128, 0), + // LOCKED + LOCKED(144, 0), + // UNLOCKED + UNLOCKED(160, 0), + HELP(176, 0), + BACKGROUND_PRIMARY_OUTPUT(224, 0), + BACKGROUND_STORAGE_CELL(240, 0), + + // ROW 1 + VIEW_MODE_STORED(0, 16), + VIEW_MODE_ALL(32, 16), + VIEW_MODE_CRAFTING(48, 16), + BLOCKING_MODE_NO(64, 16), + BLOCKING_MODE_YES(80, 16), + BACK(96, 16), + TRANSPARENT_FACADES_OFF(96, 16), + TRANSPARENT_FACADES_ON(112, 16), + TYPE_FILTER_ITEMS(128, 16), + TYPE_FILTER_FLUIDS(144, 16), + TYPE_FILTER_ALL(160, 16), + BACKGROUND_ORE(240, 16), + + // ROW 2 + SEARCH_AUTO_FOCUS(48, 32), + SEARCH_DEFAULT(64, 32), + SEARCH_JEI(80, 32), + SEARCH_REI(96, 32), + SEARCH_AUTO_FOCUS_REMEMBER(112, 32), + SEARCH_REMEMBER(128, 32), + SEARCH_JEI_AUTO_CLEAR(144, 32), + SEARCH_REI_AUTO_CLEAR(160, 32), + BACKGROUND_PLATE(224, 32), + BACKGROUND_DUST(240, 32), + TAB_CRAFTING(0, 32), + TAB_PROCESSING(16, 32), + TAB_SMITHING(32, 32), + TAB_STONECUTTING(48, 32), + + // ROW 3 + ARROW_UP(0, 48), + ARROW_DOWN(16, 48), + ARROW_RIGHT(32, 48), + ARROW_LEFT(48, 48), + SUBSTITUTION_ENABLED(64, 48), + STORAGE_FILTER_EXTRACTABLE_ONLY(80, 48), + STORAGE_FILTER_EXTRACTABLE_NONE(96, 48), + SUBSTITUTION_DISABLED(112, 48), + FLUID_SUBSTITUTION_ENABLED(128, 48), + FLUID_SUBSTITUTION_DISABLED(144, 48), + FILTER_ON_EXTRACT_ENABLED(160, 48), + FILTER_ON_EXTRACT_DISABLED(176, 48), + BACKGROUND_INGOT(224, 48), + BACKGROUND_STORAGE_COMPONENT(240, 48), + + // ROW 4 + SORT_BY_NAME(0, 64), + SORT_BY_AMOUNT(16, 64), + // WRENCH | PARTITION STORAGE + COG(32, 64), + COG_DISABLED(48, 64), + LEVEL_ITEM(64, 64), + SORT_BY_INVENTORY_TWEAKS(80, 64), + SORT_BY_MOD(96, 64), + PRIORITY(144, 64), + BACKGROUND_VIEW_CELL(224, 64), + BACKGROUND_WIRELESS_TERM(240, 64), + + // ROW 5 + FULLNESS_EMPTY(0, 80), + FULLNESS_HALF(16, 80), + FULLNESS_FULL(32, 80), + LEVEL_ENERGY(48, 80), + PATTERN_ACCESS_SHOW(64, 80), + PATTERN_ACCESS_HIDE(80, 80), + PATTERN_TERMINAL_VISIBLE(96, 80), + PATTERN_TERMINAL_ALL(112, 80), + PATTERN_TERMINAL_NOT_FULL(128, 80), + BACKGROUND_TRASH(240, 80), + + // ROW 6 + FUZZY_PERCENT_25(0, 96), + FUZZY_PERCENT_50(16, 96), + FUZZY_PERCENT_75(32, 96), + FUZZY_PERCENT_99(48, 96), + FUZZY_IGNORE(64, 96), + INSCRIBER_SEPARATE_SIDES(80, 96), + INSCRIBER_COMBINED_SIDES(96, 96), + AUTO_EXPORT_OFF(112, 96), + AUTO_EXPORT_ON(128, 96), + INSCRIBER_BUFFER_4(144, 96), + INSCRIBER_BUFFER_64(160, 96), + INSCRIBER_BUFFER_1(176, 96), + BACKGROUND_WIRELESS_BOOSTER(240, 96), + + // ROW 7 + CONDENSER_OUTPUT_TRASH(0, 112), + CONDENSER_OUTPUT_MATTER_BALL(16, 112), + CONDENSER_OUTPUT_SINGULARITY(32, 112), + BACKGROUND_ENCODED_PATTERN(240, 112), + + // ROW 8 + INVALID(0, 128), + VALID(16, 128), + WHITELIST(32, 128), + BLACKLIST(48, 128), + HORIZONTAL_TAB(128, 128, 22, 22), + HORIZONTAL_TAB_SELECTED(128, 150, 22, 22), + HORIZONTAL_TAB_FOCUS(150, 128, 22, 22), + BACKGROUND_BLANK_PATTERN(240, 128), + TOOLBAR_BUTTON_BACKGROUND(176, 128, 18, 20), + TOOLBAR_BUTTON_BACKGROUND_FOCUS(194, 128, 18, 20), + TOOLBAR_BUTTON_BACKGROUND_HOVER(212, 128, 18, 20), + + // ROW 9 + ACCESS_WRITE(0, 144), + ACCESS_READ(16, 144), + ACCESS_READ_WRITE(32, 144), + CRAFT_HAMMER(48, 144), + BACKGROUND_CHARGABLE(240, 144), + + // ROW 10 + POWER_UNIT_AE(0, 160), + POWER_UNIT_EU(16, 160), + POWER_UNIT_J(32, 160), + POWER_UNIT_W(48, 160), + POWER_UNIT_RF(64, 160), + POWER_UNIT_TR(80, 160), + BACKGROUND_SINGULARITY(240, 160), + + // ROW 11 + COPY_MODE_ON(80, 176), + BACKGROUND_SPATIAL_CELL_NO_SHADOW(224, 176), + BACKGROUND_SPATIAL_CELL(240, 176), + + // ROW 12 + COPY_MODE_OFF(80, 192), + TAB_BUTTON_BACKGROUND_BORDERLESS(128, 192, 25, 22), + TAB_BUTTON_BACKGROUND(160, 192, 20, 20), + SLOT_BACKGROUND(192, 192, 18, 18), + BACKGROUND_FUEL(240, 192), + + // ROW 13 + TERMINAL_STYLE_SMALL(0, 208), + TERMINAL_STYLE_MEDIUM(16, 208), + TERMINAL_STYLE_TALL(32, 208), + TERMINAL_STYLE_FULL(48, 208), + BACKGROUND_UPGRADE(240, 208), + + // ROW 14 + PLACEMENT_BLOCK(0, 224), + PLACEMENT_ITEM(16, 224), + TAB_BUTTON_BACKGROUND_BORDERLESS_FOCUS(128, 224, 25, 22), + TAB_BUTTON_BACKGROUND_FOCUS(160, 224, 22, 22), + + SCHEDULING_DEFAULT(0, 240), + SCHEDULING_ROUND_ROBIN(16, 240), + SCHEDULING_RANDOM(32, 240), + OVERLAY_OFF(48, 240), + OVERLAY_ON(64, 240), + + // Small Icons + S_ARROW_UP(224, 192, 8, 8), + S_ARROW_DOWN(232, 192, 8, 8), + S_CLEAR(224, 200, 8, 8), + S_CYCLE(232, 200, 8, 8), + S_SUBSTITUTION_ENABLED(224, 208, 8, 8), + S_SUBSTITUTION_DISABLED(232, 208, 8, 8), + S_FLUID_SUBSTITUTION_ENABLED(224, 216, 8, 8), + S_FLUID_SUBSTITUTION_DISABLED(232, 216, 8, 8), + S_STORAGE(208, 224, 10, 10), + S_PROCESSOR(208, 234, 10, 10), + S_CRAFT(208, 244, 10, 10), + S_TERMINAL(192, 224, 10, 10), + S_MACHINE(192, 234, 10, 10); + + public final int x; + public final int y; + public final int width; + public final int height; + + public static final ResourceLocation TEXTURE = AppEng.makeId("textures/guis/states.png"); + public static final int TEXTURE_WIDTH = 256; + public static final int TEXTURE_HEIGHT = 256; + + Icon(int x, int y) { + this(x, y, 16, 16); + } + + Icon(int x, int y, int width, int height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + public Blitter getBlitter() { + return Blitter.texture(TEXTURE, TEXTURE_WIDTH, TEXTURE_HEIGHT) + .src(x, y, width, height); } - public static final ResourceLocation REDSTONE_LOW = AppEng.makeId("icons/redstone_low"); - public static final ResourceLocation REDSTONE_HIGH = AppEng.makeId("icons/redstone_high"); - public static final ResourceLocation REDSTONE_PULSE = AppEng.makeId("icons/redstone_pulse"); - public static final ResourceLocation REDSTONE_IGNORE = AppEng.makeId("icons/redstone_ignore"); - public static final ResourceLocation REDSTONE_OFF = AppEng.makeId("icons/redstone_off"); - public static final ResourceLocation REDSTONE_ON = AppEng.makeId("icons/redstone_on"); - public static final ResourceLocation REDSTONE_ABOVE_EQUAL = AppEng.makeId("icons/redstone_above_equal"); - public static final ResourceLocation REDSTONE_BELOW = AppEng.makeId("icons/redstone_below"); - public static final ResourceLocation CLEAR = AppEng.makeId("icons/clear"); - public static final ResourceLocation ENTER = AppEng.makeId("icons/enter"); - public static final ResourceLocation WHITE_ARROW_DOWN = AppEng.makeId("icons/white_arrow_down"); - public static final ResourceLocation LOCKED = AppEng.makeId("icons/locked"); - public static final ResourceLocation UNLOCKED = AppEng.makeId("icons/unlocked"); - public static final ResourceLocation HELP = AppEng.makeId("icons/help"); - public static final ResourceLocation BACKGROUND_PRIMARY_OUTPUT = AppEng.makeId("icons/background_primary_output"); - public static final ResourceLocation BACKGROUND_STORAGE_CELL = AppEng.makeId("icons/background_storage_cell"); - public static final ResourceLocation VIEW_MODE_STORED = AppEng.makeId("icons/view_mode_stored"); - public static final ResourceLocation VIEW_MODE_ALL = AppEng.makeId("icons/view_mode_all"); - public static final ResourceLocation VIEW_MODE_CRAFTING = AppEng.makeId("icons/view_mode_crafting"); - public static final ResourceLocation BLOCKING_MODE_NO = AppEng.makeId("icons/blocking_mode_no"); - public static final ResourceLocation BLOCKING_MODE_YES = AppEng.makeId("icons/blocking_mode_yes"); - public static final ResourceLocation BACK = AppEng.makeId("icons/back"); - public static final ResourceLocation TRANSPARENT_FACADES_OFF = AppEng.makeId("icons/transparent_facades_off"); - public static final ResourceLocation TRANSPARENT_FACADES_ON = AppEng.makeId("icons/transparent_facades_on"); - public static final ResourceLocation TYPE_FILTER_ITEMS = AppEng.makeId("icons/type_filter_items"); - public static final ResourceLocation TYPE_FILTER_FLUIDS = AppEng.makeId("icons/type_filter_fluids"); - public static final ResourceLocation TYPE_FILTER_ALL = AppEng.makeId("icons/type_filter_all"); - public static final ResourceLocation BACKGROUND_ORE = AppEng.makeId("icons/background_ore"); - public static final ResourceLocation SEARCH_AUTO_FOCUS = AppEng.makeId("icons/search_auto_focus"); - public static final ResourceLocation SEARCH_DEFAULT = AppEng.makeId("icons/search_default"); - public static final ResourceLocation SEARCH_JEI = AppEng.makeId("icons/search_jei"); - public static final ResourceLocation SEARCH_REI = AppEng.makeId("icons/search_rei"); - public static final ResourceLocation SEARCH_AUTO_FOCUS_REMEMBER = AppEng.makeId("icons/search_auto_focus_remember"); - public static final ResourceLocation SEARCH_REMEMBER = AppEng.makeId("icons/search_remember"); - public static final ResourceLocation SEARCH_JEI_AUTO_CLEAR = AppEng.makeId("icons/search_jei_auto_clear"); - public static final ResourceLocation SEARCH_REI_AUTO_CLEAR = AppEng.makeId("icons/search_rei_auto_clear"); - public static final ResourceLocation BACKGROUND_PLATE = AppEng.makeId("icons/background_plate"); - public static final ResourceLocation BACKGROUND_DUST = AppEng.makeId("icons/background_dust"); - public static final ResourceLocation TAB_CRAFTING = AppEng.makeId("icons/tab_crafting"); - public static final ResourceLocation TAB_PROCESSING = AppEng.makeId("icons/tab_processing"); - public static final ResourceLocation TAB_SMITHING = AppEng.makeId("icons/tab_smithing"); - public static final ResourceLocation TAB_STONECUTTING = AppEng.makeId("icons/tab_stonecutting"); - public static final ResourceLocation ARROW_UP = AppEng.makeId("icons/arrow_up"); - public static final ResourceLocation ARROW_DOWN = AppEng.makeId("icons/arrow_down"); - public static final ResourceLocation ARROW_RIGHT = AppEng.makeId("icons/arrow_right"); - public static final ResourceLocation ARROW_LEFT = AppEng.makeId("icons/arrow_left"); - public static final ResourceLocation SUBSTITUTION_ENABLED = AppEng.makeId("icons/substitution_enabled"); - public static final ResourceLocation STORAGE_FILTER_EXTRACTABLE_ONLY = AppEng - .makeId("icons/storage_filter_extractable_only"); - public static final ResourceLocation STORAGE_FILTER_EXTRACTABLE_NONE = AppEng - .makeId("icons/storage_filter_extractable_none"); - public static final ResourceLocation SUBSTITUTION_DISABLED = AppEng.makeId("icons/substitution_disabled"); - public static final ResourceLocation FLUID_SUBSTITUTION_ENABLED = AppEng.makeId("icons/fluid_substitution_enabled"); - public static final ResourceLocation FLUID_SUBSTITUTION_DISABLED = AppEng - .makeId("icons/fluid_substitution_disabled"); - public static final ResourceLocation FILTER_ON_EXTRACT_ENABLED = AppEng.makeId("icons/filter_on_extract_enabled"); - public static final ResourceLocation FILTER_ON_EXTRACT_DISABLED = AppEng.makeId("icons/filter_on_extract_disabled"); - public static final ResourceLocation BACKGROUND_INGOT = AppEng.makeId("icons/background_ingot"); - public static final ResourceLocation BACKGROUND_STORAGE_COMPONENT = AppEng - .makeId("icons/background_storage_component"); - public static final ResourceLocation SORT_BY_NAME = AppEng.makeId("icons/sort_by_name"); - public static final ResourceLocation SORT_BY_AMOUNT = AppEng.makeId("icons/sort_by_amount"); - public static final ResourceLocation COG = AppEng.makeId("icons/cog"); - public static final ResourceLocation COG_DISABLED = AppEng.makeId("icons/cog_disabled"); - public static final ResourceLocation LEVEL_ITEM = AppEng.makeId("icons/level_item"); - public static final ResourceLocation SORT_BY_INVENTORY_TWEAKS = AppEng.makeId("icons/sort_by_inventory_tweaks"); - public static final ResourceLocation SORT_BY_MOD = AppEng.makeId("icons/sort_by_mod"); - public static final ResourceLocation PRIORITY = AppEng.makeId("icons/priority"); - public static final ResourceLocation BACKGROUND_VIEW_CELL = AppEng.makeId("icons/background_view_cell"); - public static final ResourceLocation BACKGROUND_WIRELESS_TERM = AppEng.makeId("icons/background_wireless_term"); - public static final ResourceLocation FULLNESS_EMPTY = AppEng.makeId("icons/fullness_empty"); - public static final ResourceLocation FULLNESS_HALF = AppEng.makeId("icons/fullness_half"); - public static final ResourceLocation FULLNESS_FULL = AppEng.makeId("icons/fullness_full"); - public static final ResourceLocation LEVEL_ENERGY = AppEng.makeId("icons/level_energy"); - public static final ResourceLocation PATTERN_ACCESS_SHOW = AppEng.makeId("icons/pattern_access_show"); - public static final ResourceLocation PATTERN_ACCESS_HIDE = AppEng.makeId("icons/pattern_access_hide"); - public static final ResourceLocation PATTERN_TERMINAL_VISIBLE = AppEng.makeId("icons/pattern_terminal_visible"); - public static final ResourceLocation PATTERN_TERMINAL_ALL = AppEng.makeId("icons/pattern_terminal_all"); - public static final ResourceLocation PATTERN_TERMINAL_NOT_FULL = AppEng.makeId("icons/pattern_terminal_not_full"); - public static final ResourceLocation BACKGROUND_TRASH = AppEng.makeId("icons/background_trash"); - public static final ResourceLocation FUZZY_PERCENT_25 = AppEng.makeId("icons/fuzzy_percent_25"); - public static final ResourceLocation FUZZY_PERCENT_50 = AppEng.makeId("icons/fuzzy_percent_50"); - public static final ResourceLocation FUZZY_PERCENT_75 = AppEng.makeId("icons/fuzzy_percent_75"); - public static final ResourceLocation FUZZY_PERCENT_99 = AppEng.makeId("icons/fuzzy_percent_99"); - public static final ResourceLocation FUZZY_IGNORE = AppEng.makeId("icons/fuzzy_ignore"); - public static final ResourceLocation INSCRIBER_SEPARATE_SIDES = AppEng.makeId("icons/inscriber_separate_sides"); - public static final ResourceLocation INSCRIBER_COMBINED_SIDES = AppEng.makeId("icons/inscriber_combined_sides"); - public static final ResourceLocation AUTO_EXPORT_OFF = AppEng.makeId("icons/auto_export_off"); - public static final ResourceLocation AUTO_EXPORT_ON = AppEng.makeId("icons/auto_export_on"); - public static final ResourceLocation INSCRIBER_BUFFER_4 = AppEng.makeId("icons/inscriber_buffer_4"); - public static final ResourceLocation INSCRIBER_BUFFER_64 = AppEng.makeId("icons/inscriber_buffer_64"); - public static final ResourceLocation INSCRIBER_BUFFER_1 = AppEng.makeId("icons/inscriber_buffer_1"); - public static final ResourceLocation BACKGROUND_WIRELESS_BOOSTER = AppEng - .makeId("icons/background_wireless_booster"); - public static final ResourceLocation CONDENSER_OUTPUT_TRASH = AppEng.makeId("icons/condenser_output_trash"); - public static final ResourceLocation CONDENSER_OUTPUT_MATTER_BALL = AppEng - .makeId("icons/condenser_output_matter_ball"); - public static final ResourceLocation CONDENSER_OUTPUT_SINGULARITY = AppEng - .makeId("icons/condenser_output_singularity"); - public static final ResourceLocation BACKGROUND_ENCODED_PATTERN = AppEng.makeId("icons/background_encoded_pattern"); - public static final ResourceLocation INVALID = AppEng.makeId("icons/invalid"); - public static final ResourceLocation VALID = AppEng.makeId("icons/valid"); - public static final ResourceLocation WHITELIST = AppEng.makeId("icons/whitelist"); - public static final ResourceLocation BLACKLIST = AppEng.makeId("icons/blacklist"); - public static final ResourceLocation HORIZONTAL_TAB = AppEng.makeId("icons/horizontal_tab"); - public static final ResourceLocation HORIZONTAL_TAB_SELECTED = AppEng.makeId("icons/horizontal_tab_selected"); - public static final ResourceLocation HORIZONTAL_TAB_FOCUS = AppEng.makeId("icons/horizontal_tab_focus"); - public static final ResourceLocation BACKGROUND_BLANK_PATTERN = AppEng.makeId("icons/background_blank_pattern"); - public static final ResourceLocation TOOLBAR_BUTTON_BACKGROUND = AppEng.makeId("icons/toolbar_button_background"); - public static final ResourceLocation TOOLBAR_BUTTON_BACKGROUND_FOCUS = AppEng - .makeId("icons/toolbar_button_background_focus"); - public static final ResourceLocation TOOLBAR_BUTTON_BACKGROUND_HOVER = AppEng - .makeId("icons/toolbar_button_background_hover"); - public static final ResourceLocation ACCESS_WRITE = AppEng.makeId("icons/access_write"); - public static final ResourceLocation ACCESS_READ = AppEng.makeId("icons/access_read"); - public static final ResourceLocation ACCESS_READ_WRITE = AppEng.makeId("icons/access_read_write"); - public static final ResourceLocation CRAFT_HAMMER = AppEng.makeId("icons/craft_hammer"); - public static final ResourceLocation BACKGROUND_CHARGABLE = AppEng.makeId("icons/background_chargable"); - public static final ResourceLocation POWER_UNIT_AE = AppEng.makeId("icons/power_unit_ae"); - public static final ResourceLocation POWER_UNIT_EU = AppEng.makeId("icons/power_unit_eu"); - public static final ResourceLocation POWER_UNIT_J = AppEng.makeId("icons/power_unit_j"); - public static final ResourceLocation POWER_UNIT_W = AppEng.makeId("icons/power_unit_w"); - public static final ResourceLocation POWER_UNIT_RF = AppEng.makeId("icons/power_unit_rf"); - public static final ResourceLocation POWER_UNIT_TR = AppEng.makeId("icons/power_unit_tr"); - public static final ResourceLocation BACKGROUND_SINGULARITY = AppEng.makeId("icons/background_singularity"); - public static final ResourceLocation COPY_MODE_ON = AppEng.makeId("icons/copy_mode_on"); - public static final ResourceLocation BACKGROUND_SPATIAL_CELL_NO_SHADOW = AppEng - .makeId("icons/background_spatial_cell_no_shadow"); - public static final ResourceLocation BACKGROUND_SPATIAL_CELL = AppEng.makeId("icons/background_spatial_cell"); - public static final ResourceLocation COPY_MODE_OFF = AppEng.makeId("icons/copy_mode_off"); - public static final ResourceLocation TAB_BUTTON_BACKGROUND_BORDERLESS = AppEng - .makeId("icons/tab_button_background_borderless"); - public static final ResourceLocation TAB_BUTTON_BACKGROUND = AppEng.makeId("icons/tab_button_background"); - public static final ResourceLocation SLOT_BACKGROUND = AppEng.makeId("icons/slot_background"); - public static final ResourceLocation BACKGROUND_FUEL = AppEng.makeId("icons/background_fuel"); - public static final ResourceLocation TERMINAL_STYLE_SMALL = AppEng.makeId("icons/terminal_style_small"); - public static final ResourceLocation TERMINAL_STYLE_MEDIUM = AppEng.makeId("icons/terminal_style_medium"); - public static final ResourceLocation TERMINAL_STYLE_TALL = AppEng.makeId("icons/terminal_style_tall"); - public static final ResourceLocation TERMINAL_STYLE_FULL = AppEng.makeId("icons/terminal_style_full"); - public static final ResourceLocation BACKGROUND_UPGRADE = AppEng.makeId("icons/background_upgrade"); - public static final ResourceLocation PLACEMENT_BLOCK = AppEng.makeId("icons/placement_block"); - public static final ResourceLocation PLACEMENT_ITEM = AppEng.makeId("icons/placement_item"); - public static final ResourceLocation TAB_BUTTON_BACKGROUND_BORDERLESS_FOCUS = AppEng - .makeId("icons/tab_button_background_borderless_focus"); - public static final ResourceLocation TAB_BUTTON_BACKGROUND_FOCUS = AppEng - .makeId("icons/tab_button_background_focus"); - public static final ResourceLocation SCHEDULING_DEFAULT = AppEng.makeId("icons/scheduling_default"); - public static final ResourceLocation SCHEDULING_ROUND_ROBIN = AppEng.makeId("icons/scheduling_round_robin"); - public static final ResourceLocation SCHEDULING_RANDOM = AppEng.makeId("icons/scheduling_random"); - public static final ResourceLocation OVERLAY_OFF = AppEng.makeId("icons/overlay_off"); - public static final ResourceLocation OVERLAY_ON = AppEng.makeId("icons/overlay_on"); - public static final ResourceLocation S_ARROW_UP = AppEng.makeId("icons/s_arrow_up"); - public static final ResourceLocation S_ARROW_DOWN = AppEng.makeId("icons/s_arrow_down"); - public static final ResourceLocation S_CLEAR = AppEng.makeId("icons/s_clear"); - public static final ResourceLocation S_CYCLE = AppEng.makeId("icons/s_cycle"); - public static final ResourceLocation S_SUBSTITUTION_ENABLED = AppEng.makeId("icons/s_substitution_enabled"); - public static final ResourceLocation S_SUBSTITUTION_DISABLED = AppEng.makeId("icons/s_substitution_disabled"); - public static final ResourceLocation S_FLUID_SUBSTITUTION_ENABLED = AppEng - .makeId("icons/s_fluid_substitution_enabled"); - public static final ResourceLocation S_FLUID_SUBSTITUTION_DISABLED = AppEng - .makeId("icons/s_fluid_substitution_disabled"); - public static final ResourceLocation S_STORAGE = AppEng.makeId("icons/s_storage"); - public static final ResourceLocation S_PROCESSOR = AppEng.makeId("icons/s_processor"); - public static final ResourceLocation S_CRAFT = AppEng.makeId("icons/s_craft"); - public static final ResourceLocation S_TERMINAL = AppEng.makeId("icons/s_terminal"); - public static final ResourceLocation S_MACHINE = AppEng.makeId("icons/s_machine"); } diff --git a/src/main/java/appeng/client/gui/implementations/InterfaceScreen.java b/src/main/java/appeng/client/gui/implementations/InterfaceScreen.java index a3fc35280d3..7997a49c6f5 100644 --- a/src/main/java/appeng/client/gui/implementations/InterfaceScreen.java +++ b/src/main/java/appeng/client/gui/implementations/InterfaceScreen.java @@ -23,7 +23,6 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import appeng.api.config.FuzzyMode; @@ -87,7 +86,7 @@ public SetAmountButton(OnPress onPress) { } @Override - protected ResourceLocation getSprite() { + protected Icon getIcon() { return isHoveredOrFocused() ? Icon.COG : Icon.COG_DISABLED; } } diff --git a/src/main/java/appeng/client/gui/implementations/PatternProviderLockReason.java b/src/main/java/appeng/client/gui/implementations/PatternProviderLockReason.java index 09c6a4cbdde..f042aed7398 100644 --- a/src/main/java/appeng/client/gui/implementations/PatternProviderLockReason.java +++ b/src/main/java/appeng/client/gui/implementations/PatternProviderLockReason.java @@ -7,7 +7,6 @@ import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import appeng.api.client.AEKeyRendering; @@ -17,7 +16,6 @@ import appeng.client.gui.ICompositeWidget; import appeng.client.gui.Icon; import appeng.client.gui.Tooltip; -import appeng.client.gui.style.Blitter; import appeng.core.localization.GuiText; import appeng.core.localization.InGameTooltip; @@ -60,7 +58,7 @@ public void setVisible(boolean visible) { public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mouse) { var menu = screen.getMenu(); - ResourceLocation icon; + Icon icon; Component lockStatusText; if (menu.getCraftingLockedReason() == LockCraftingMode.NONE) { icon = Icon.UNLOCKED; @@ -72,7 +70,7 @@ public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mo .setStyle(Style.EMPTY.withColor(Mth.color(193 / 255f, 66 / 255f, 75 / 255f))); } - Blitter.guiSprite(icon).dest(x, y).blit(guiGraphics); + icon.getBlitter().dest(x, y).blit(guiGraphics); guiGraphics.drawString(Minecraft.getInstance().font, lockStatusText, x + 15, y + 5, -1, false); } diff --git a/src/main/java/appeng/client/gui/me/items/CraftingEncodingPanel.java b/src/main/java/appeng/client/gui/me/items/CraftingEncodingPanel.java index 524f420ec36..98d674e7273 100644 --- a/src/main/java/appeng/client/gui/me/items/CraftingEncodingPanel.java +++ b/src/main/java/appeng/client/gui/me/items/CraftingEncodingPanel.java @@ -5,7 +5,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.Slot; import appeng.api.config.ActionItems; @@ -40,7 +39,7 @@ public CraftingEncodingPanel(PatternEncodingTermScreen screen, WidgetContaine } @Override - ResourceLocation getIcon() { + Icon getIcon() { return Icon.TAB_CRAFTING; } diff --git a/src/main/java/appeng/client/gui/me/items/EncodingModePanel.java b/src/main/java/appeng/client/gui/me/items/EncodingModePanel.java index e81559ffec3..c7610e85354 100644 --- a/src/main/java/appeng/client/gui/me/items/EncodingModePanel.java +++ b/src/main/java/appeng/client/gui/me/items/EncodingModePanel.java @@ -2,10 +2,10 @@ import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import appeng.client.Point; import appeng.client.gui.ICompositeWidget; +import appeng.client.gui.Icon; import appeng.client.gui.WidgetContainer; import appeng.menu.me.items.PatternEncodingTermMenu; @@ -23,7 +23,10 @@ public EncodingModePanel(PatternEncodingTermScreen screen, WidgetContainer wi this.widgets = widgets; } - abstract ResourceLocation getIcon(); + // TODO (Rid): Replaced the ItemStack and an Icon +// abstract ItemStack getTabIconItem(); + + abstract Icon getIcon(); abstract Component getTabTooltip(); diff --git a/src/main/java/appeng/client/gui/me/items/ProcessingEncodingPanel.java b/src/main/java/appeng/client/gui/me/items/ProcessingEncodingPanel.java index eae46e11585..fb7b882bf7d 100644 --- a/src/main/java/appeng/client/gui/me/items/ProcessingEncodingPanel.java +++ b/src/main/java/appeng/client/gui/me/items/ProcessingEncodingPanel.java @@ -3,7 +3,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import appeng.api.config.ActionItems; import appeng.client.Point; @@ -87,7 +86,7 @@ private void updateTooltipVisibility() { } @Override - ResourceLocation getIcon() { + Icon getIcon() { return Icon.TAB_PROCESSING; } diff --git a/src/main/java/appeng/client/gui/me/items/SmithingTableEncodingPanel.java b/src/main/java/appeng/client/gui/me/items/SmithingTableEncodingPanel.java index 97bd6d4bf1e..9f129bd79e6 100644 --- a/src/main/java/appeng/client/gui/me/items/SmithingTableEncodingPanel.java +++ b/src/main/java/appeng/client/gui/me/items/SmithingTableEncodingPanel.java @@ -5,7 +5,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.SimpleContainer; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -45,7 +44,7 @@ public SmithingTableEncodingPanel(PatternEncodingTermScreen screen, WidgetCon } @Override - ResourceLocation getIcon() { + Icon getIcon() { return Icon.TAB_SMITHING; } diff --git a/src/main/java/appeng/client/gui/me/items/StonecuttingEncodingPanel.java b/src/main/java/appeng/client/gui/me/items/StonecuttingEncodingPanel.java index 1710275bb4f..16aa8b05ae7 100644 --- a/src/main/java/appeng/client/gui/me/items/StonecuttingEncodingPanel.java +++ b/src/main/java/appeng/client/gui/me/items/StonecuttingEncodingPanel.java @@ -10,7 +10,6 @@ import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.core.RegistryAccess; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeHolder; @@ -160,7 +159,7 @@ public boolean onMouseWheel(Point mousePos, double delta) { } @Override - ResourceLocation getIcon() { + Icon getIcon() { return Icon.TAB_STONECUTTING; } diff --git a/src/main/java/appeng/client/gui/widgets/ActionButton.java b/src/main/java/appeng/client/gui/widgets/ActionButton.java index c3923d6546d..29e249f04f8 100644 --- a/src/main/java/appeng/client/gui/widgets/ActionButton.java +++ b/src/main/java/appeng/client/gui/widgets/ActionButton.java @@ -24,7 +24,6 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import appeng.api.config.ActionItems; import appeng.client.gui.Icon; @@ -32,7 +31,7 @@ public class ActionButton extends IconButton { private static final Pattern PATTERN_NEW_LINE = Pattern.compile("\\n", Pattern.LITERAL); - private final ResourceLocation icon; + private final Icon icon; public ActionButton(ActionItems action, Runnable onPress) { this(action, a -> onPress.run()); @@ -106,7 +105,7 @@ public ActionButton(ActionItems action, Consumer onPress) { } @Override - protected ResourceLocation getSprite() { + protected Icon getIcon() { return icon; } diff --git a/src/main/java/appeng/client/gui/widgets/IconButton.java b/src/main/java/appeng/client/gui/widgets/IconButton.java index 57371aebd9e..6f97437ba46 100644 --- a/src/main/java/appeng/client/gui/widgets/IconButton.java +++ b/src/main/java/appeng/client/gui/widgets/IconButton.java @@ -28,7 +28,6 @@ import net.minecraft.client.renderer.Rect2i; import net.minecraft.client.sounds.SoundManager; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -63,7 +62,7 @@ public void playDownSound(SoundManager soundHandler) { public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partial) { if (this.visible) { - var icon = this.getSprite(); + var icon = this.getIcon(); var item = this.getItemOverlay(); if (this.halfSize) { @@ -75,13 +74,12 @@ public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float if (this.halfSize) { if (!disableBackground) { - Blitter.guiSprite(Icon.TOOLBAR_BUTTON_BACKGROUND).dest(getX(), getY()).zOffset(10) - .blit(guiGraphics); + Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter().dest(getX(), getY()).zOffset(10).blit(guiGraphics); } if (item != null) { guiGraphics.renderItem(new ItemStack(item), getX(), getY(), 0, 20); } else if (icon != null) { - Blitter blitter = Blitter.guiSprite(icon); + Blitter blitter = icon.getBlitter(); if (!this.active) { blitter.opacity(0.5f); } @@ -89,10 +87,10 @@ public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float } } else { if (!disableBackground) { - var bgIcon = isHovered() ? Icon.TOOLBAR_BUTTON_BACKGROUND_HOVER + Icon bgIcon = isHovered() ? Icon.TOOLBAR_BUTTON_BACKGROUND_HOVER : isFocused() ? Icon.TOOLBAR_BUTTON_BACKGROUND_FOCUS : Icon.TOOLBAR_BUTTON_BACKGROUND; - Blitter.guiSprite(bgIcon) + bgIcon.getBlitter() .dest(getX() - 1, getY() + yOffset, 18, 20) .zOffset(2) .blit(guiGraphics); @@ -100,16 +98,16 @@ public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float if (item != null) { guiGraphics.renderItem(new ItemStack(item), getX(), getY() + 1 + yOffset, 0, 3); } else if (icon != null) { - Blitter.guiSprite(icon).dest(getX(), getY() + 1 + yOffset).zOffset(3).blit(guiGraphics); + icon.getBlitter().dest(getX(), getY() + 1 + yOffset).zOffset(3).blit(guiGraphics); } } } } - protected abstract ResourceLocation getSprite(); + protected abstract Icon getIcon(); /** - * Prioritized over {@link #getSprite()} if not null. + * Prioritized over {@link #getIcon()} if not null. */ @Nullable protected Item getItemOverlay() { diff --git a/src/main/java/appeng/client/gui/widgets/InfoBar.java b/src/main/java/appeng/client/gui/widgets/InfoBar.java index 1efd7d22630..5a4adf0c3e3 100644 --- a/src/main/java/appeng/client/gui/widgets/InfoBar.java +++ b/src/main/java/appeng/client/gui/widgets/InfoBar.java @@ -6,13 +6,12 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; import appeng.api.client.AEKeyRendering; import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEKey; -import appeng.client.gui.style.Blitter; +import appeng.client.gui.Icon; public class InfoBar { private final List widgets = new ArrayList<>(); @@ -39,7 +38,7 @@ interface Widget { } // TODO (RID): Added xPos and yPos to give me better control over render, but the code below might need refactoring - void add(ResourceLocation icon, float scale, int xPos, int yPos) { + void add(Icon icon, float scale, int xPos, int yPos) { widgets.add(new IconWidget(icon, scale, xPos, yPos)); } @@ -85,7 +84,7 @@ public void render(GuiGraphics guiGraphics, int x, int y) { } } - private record IconWidget(ResourceLocation icon, float scale, int xPos, int yPos) implements Widget { + private record IconWidget(Icon icon, float scale, int xPos, int yPos) implements Widget { @Override public int getWidth() { return Math.round(16 * scale); @@ -102,7 +101,7 @@ public void render(GuiGraphics guiGraphics, int x, int y) { poseStack.pushPose(); poseStack.translate(xPos, yPos, 0); poseStack.scale(scale, scale, 1); - Blitter.guiSprite(icon) + icon.getBlitter() .dest(0, 0) .blit(guiGraphics); poseStack.popPose(); diff --git a/src/main/java/appeng/client/gui/widgets/KeyTypeSelectionButton.java b/src/main/java/appeng/client/gui/widgets/KeyTypeSelectionButton.java index eb1bac019b0..b28ed0b4ff3 100644 --- a/src/main/java/appeng/client/gui/widgets/KeyTypeSelectionButton.java +++ b/src/main/java/appeng/client/gui/widgets/KeyTypeSelectionButton.java @@ -7,7 +7,6 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import appeng.api.stacks.AEKeyType; import appeng.api.storage.ISubMenuHost; @@ -102,7 +101,7 @@ public List getTooltipMessage() { } @Override - protected ResourceLocation getSprite() { + protected Icon getIcon() { return Icon.TYPE_FILTER_ALL; } } diff --git a/src/main/java/appeng/client/gui/widgets/OpenGuideButton.java b/src/main/java/appeng/client/gui/widgets/OpenGuideButton.java index 8b652a1df6c..ca362ae7ee0 100644 --- a/src/main/java/appeng/client/gui/widgets/OpenGuideButton.java +++ b/src/main/java/appeng/client/gui/widgets/OpenGuideButton.java @@ -3,7 +3,6 @@ import java.util.List; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import appeng.client.gui.Icon; import appeng.core.localization.ButtonToolTips; @@ -21,7 +20,7 @@ public List getTooltipMessage() { } @Override - protected ResourceLocation getSprite() { + protected Icon getIcon() { return Icon.HELP; } } diff --git a/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java b/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java index d20af539b67..776bc131ca8 100644 --- a/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java +++ b/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java @@ -32,7 +32,6 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; @@ -327,7 +326,7 @@ private void triggerPress() { onPress.handle(this, backwards); } - private static > void registerApp(ResourceLocation sprite, Setting setting, T val, + private static > void registerApp(Icon icon, Setting setting, T val, ButtonToolTips title, Component... tooltipLines) { var lines = new ArrayList(); lines.add(title.text()); @@ -335,7 +334,7 @@ private static > void registerApp(ResourceLocation sprite, Set appearances.put( new EnumPair<>(setting, val), - new ButtonAppearance(sprite, null, lines)); + new ButtonAppearance(icon, null, lines)); } private static > void registerApp(ItemLike item, Setting setting, T val, @@ -349,9 +348,9 @@ private static > void registerApp(ItemLike item, Setting se new ButtonAppearance(null, item.asItem(), lines)); } - private static > void registerApp(ResourceLocation sprite, Setting setting, T val, + private static > void registerApp(Icon icon, Setting setting, T val, ButtonToolTips title, ButtonToolTips hint) { - registerApp(sprite, setting, val, title, hint.text()); + registerApp(icon, setting, val, title, hint.text()); } @Nullable @@ -363,10 +362,10 @@ private ButtonAppearance getApperance() { } @Override - protected ResourceLocation getSprite() { + protected Icon getIcon() { var app = getApperance(); - if (app != null && app.sprite() != null) { - return app.sprite(); + if (app != null && app.icon != null) { + return app.icon; } return Icon.TOOLBAR_BUTTON_BACKGROUND; } @@ -441,7 +440,6 @@ public boolean equals(Object obj) { } } - private record ButtonAppearance(@Nullable ResourceLocation sprite, @Nullable Item item, - List tooltipLines) { + private record ButtonAppearance(@Nullable Icon icon, @Nullable Item item, List tooltipLines) { } } diff --git a/src/main/java/appeng/client/gui/widgets/TabButton.java b/src/main/java/appeng/client/gui/widgets/TabButton.java index 9e0a2e6c6a8..1a0e22d9711 100644 --- a/src/main/java/appeng/client/gui/widgets/TabButton.java +++ b/src/main/java/appeng/client/gui/widgets/TabButton.java @@ -27,15 +27,13 @@ import net.minecraft.client.gui.components.Button.OnPress; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import appeng.client.gui.Icon; -import appeng.client.gui.style.Blitter; public class TabButton extends Button implements ITooltip { private Style style = Style.BOX; - private ResourceLocation icon = null; + private Icon icon = null; private ItemStack item; private boolean selected; @@ -48,7 +46,7 @@ public enum Style { HORIZONTAL } - public TabButton(ResourceLocation ico, Component message, OnPress onPress) { + public TabButton(Icon ico, Component message, OnPress onPress) { super(0, 0, 22, 22, message, onPress, Button.DEFAULT_NARRATION); this.icon = ico; @@ -84,7 +82,7 @@ public void renderWidget(GuiGraphics guiGraphics, int x, int y, float partial) { } }; if (!disableBackground) { - Blitter.guiSprite(backdrop).dest(getX(), getY()).blit(guiGraphics); + backdrop.getBlitter().dest(getX(), getY()).blit(guiGraphics); } var iconX = switch (this.style) { @@ -99,7 +97,7 @@ public void renderWidget(GuiGraphics guiGraphics, int x, int y, float partial) { }; if (this.icon != null) { - Blitter.guiSprite(this.icon).dest(getX() + iconX, getY() + iconY - 1).blit(guiGraphics); + this.icon.getBlitter().dest(getX() + iconX, getY() + iconY - 1).blit(guiGraphics); } if (this.item != null) { diff --git a/src/main/java/appeng/client/gui/widgets/ToggleButton.java b/src/main/java/appeng/client/gui/widgets/ToggleButton.java index df4d9971e37..db012f822cd 100644 --- a/src/main/java/appeng/client/gui/widgets/ToggleButton.java +++ b/src/main/java/appeng/client/gui/widgets/ToggleButton.java @@ -22,28 +22,29 @@ import java.util.List; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; + +import appeng.client.gui.Icon; public class ToggleButton extends IconButton implements ITooltip { private final Listener listener; - private final ResourceLocation iconOn; - private final ResourceLocation iconOff; + private final Icon iconOn; + private final Icon iconOff; private List tooltipOn = Collections.emptyList(); private List tooltipOff = Collections.emptyList(); private boolean state; - public ToggleButton(ResourceLocation on, ResourceLocation off, Component displayName, + public ToggleButton(Icon on, Icon off, Component displayName, Component displayHint, Listener listener) { this(on, off, listener); setTooltipOn(List.of(displayName, displayHint)); setTooltipOff(List.of(displayName, displayHint)); } - public ToggleButton(ResourceLocation on, ResourceLocation off, Listener listener) { + public ToggleButton(Icon on, Icon off, Listener listener) { super(null); this.iconOn = on; this.iconOff = off; @@ -67,7 +68,7 @@ public void setState(boolean isOn) { this.state = isOn; } - protected ResourceLocation getSprite() { + protected Icon getIcon() { return this.state ? this.iconOn : this.iconOff; } diff --git a/src/main/java/appeng/client/gui/widgets/ValidationIcon.java b/src/main/java/appeng/client/gui/widgets/ValidationIcon.java index 01ea990e4d0..42bccb64936 100644 --- a/src/main/java/appeng/client/gui/widgets/ValidationIcon.java +++ b/src/main/java/appeng/client/gui/widgets/ValidationIcon.java @@ -26,7 +26,6 @@ import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.navigation.FocusNavigationEvent; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import appeng.client.gui.Icon; @@ -63,7 +62,7 @@ public void setTooltip(List lines) { } @Override - protected ResourceLocation getSprite() { + protected Icon getIcon() { return Icon.INVALID; } diff --git a/src/main/java/appeng/client/guidebook/render/RenderContext.java b/src/main/java/appeng/client/guidebook/render/RenderContext.java index 2a3ee9e5d45..14b5419a094 100644 --- a/src/main/java/appeng/client/guidebook/render/RenderContext.java +++ b/src/main/java/appeng/client/guidebook/render/RenderContext.java @@ -23,6 +23,7 @@ import net.neoforged.neoforge.fluids.FluidStack; import appeng.api.stacks.AEFluidKey; +import appeng.client.gui.Icon; import appeng.client.gui.style.BackgroundGenerator; import appeng.client.gui.style.FluidBlitter; import appeng.client.guidebook.color.ColorValue; @@ -83,20 +84,14 @@ default void fillTexturedRect(LytRect rect, TextureAtlasSprite sprite, ColorValu sprite.getU0(), sprite.getV0(), sprite.getU1(), sprite.getV1()); } - default void drawIcon(int x, int y, ResourceLocation guiSprite, ColorValue color) { - var sprite = Minecraft.getInstance().getGuiSprites().getSprite(guiSprite); - drawIcon(x, y, sprite, color); - } - - default void drawIcon(int x, int y, TextureAtlasSprite sprite, ColorValue color) { - var u0 = sprite.getU0(); - var v0 = sprite.getV0(); - var u1 = sprite.getU1(); - var v1 = sprite.getV1(); + default void drawIcon(int x, int y, Icon icon, ColorValue color) { + var u0 = icon.x / (float) Icon.TEXTURE_WIDTH; + var v0 = icon.y / (float) Icon.TEXTURE_HEIGHT; + var u1 = (icon.x + icon.width) / (float) Icon.TEXTURE_WIDTH; + var v1 = (icon.y + icon.height) / (float) Icon.TEXTURE_HEIGHT; - var contents = sprite.contents(); - var texture = Minecraft.getInstance().getTextureManager().getTexture(sprite.atlasLocation()); - fillTexturedRect(new LytRect(x, y, contents.width(), contents.height()), texture, color, color, color, color, + var texture = Minecraft.getInstance().getTextureManager().getTexture(Icon.TEXTURE); + fillTexturedRect(new LytRect(x, y, icon.width, icon.height), texture, color, color, color, color, u0, v0, u1, v1); } diff --git a/src/main/java/appeng/integration/modules/emi/EmiCondenserRecipe.java b/src/main/java/appeng/integration/modules/emi/EmiCondenserRecipe.java index 01b01bc5aaf..5ac7a4ef72e 100644 --- a/src/main/java/appeng/integration/modules/emi/EmiCondenserRecipe.java +++ b/src/main/java/appeng/integration/modules/emi/EmiCondenserRecipe.java @@ -21,7 +21,6 @@ import appeng.api.config.CondenserOutput; import appeng.api.implementations.items.IStorageComponent; import appeng.blockentity.misc.CondenserBlockEntity; -import appeng.client.gui.Icon; import appeng.core.AppEng; import appeng.core.definitions.AEBlocks; import appeng.core.definitions.AEItems; @@ -52,19 +51,17 @@ public void addWidgets(WidgetHolder widgets) { var background = AppEng.makeId("textures/guis/condenser.png"); widgets.addTexture(background, 0, 0, 96, 48, 48, 25); - widgets.add(new SpriteWidget(Icon.BACKGROUND_TRASH, 3, 27, 16, 16)); - widgets.add(new SpriteWidget(Icon.TOOLBAR_BUTTON_BACKGROUND, 79, 28, 16, 16)); - widgets.addDrawable(79, 28, 16, 16, (draw, mouseX, mouseY, delta) -> { - draw.blitSprite(Icon.TOOLBAR_BUTTON_BACKGROUND, 0, 0, 16, 16); - }); + var statesLocation = AppEng.makeId("textures/guis/states.png"); + widgets.addTexture(statesLocation, 4, 28, 14, 14, 241, 81); + widgets.addTexture(statesLocation, 80, 28, 16, 16, 240, 240); widgets.addAnimatedTexture(background, 72, 0, 6, 18, 176, 0, 2000, false, true, false); if (type == CondenserOutput.MATTER_BALLS) { - widgets.add(new SpriteWidget(Icon.CONDENSER_OUTPUT_MATTER_BALL, 79, 27, 16, 16)); + widgets.addTexture(statesLocation, 80, 28, 14, 14, 16, 112); } else if (type == CondenserOutput.SINGULARITY) { - widgets.add(new SpriteWidget(Icon.CONDENSER_OUTPUT_SINGULARITY, 79, 27, 16, 16)); + widgets.addTexture(statesLocation, 80, 28, 14, 14, 32, 112); } widgets.addTooltipText(getTooltip(type), 80, 28, 16, 16); diff --git a/src/main/java/appeng/integration/modules/emi/SpriteWidget.java b/src/main/java/appeng/integration/modules/emi/SpriteWidget.java deleted file mode 100644 index 23c9ac556da..00000000000 --- a/src/main/java/appeng/integration/modules/emi/SpriteWidget.java +++ /dev/null @@ -1,27 +0,0 @@ -package appeng.integration.modules.emi; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.resources.ResourceLocation; - -import dev.emi.emi.api.widget.Bounds; -import dev.emi.emi.api.widget.Widget; - -final class SpriteWidget extends Widget { - private final ResourceLocation id; - private final Bounds bounds; - - SpriteWidget(ResourceLocation id, int x, int y, int width, int height) { - this.id = id; - this.bounds = new Bounds(x, y, width, height); - } - - @Override - public Bounds getBounds() { - return bounds; - } - - @Override - public void render(GuiGraphics draw, int mouseX, int mouseY, float delta) { - draw.blitSprite(id, bounds.x(), bounds.y(), bounds.width(), bounds.height()); - } -} diff --git a/src/main/java/appeng/integration/modules/rei/CondenserCategory.java b/src/main/java/appeng/integration/modules/rei/CondenserCategory.java index c5382bc70c3..d1c53111204 100644 --- a/src/main/java/appeng/integration/modules/rei/CondenserCategory.java +++ b/src/main/java/appeng/integration/modules/rei/CondenserCategory.java @@ -40,7 +40,6 @@ import me.shedaniel.rei.api.common.util.EntryStacks; import appeng.api.config.CondenserOutput; -import appeng.client.gui.Icon; import appeng.core.AppEng; import appeng.core.definitions.AEBlocks; @@ -77,13 +76,21 @@ public List setupDisplay(CondenserOutputDisplay recipeDisplay, Rectangle ResourceLocation location = AppEng.makeId("textures/guis/condenser.png"); widgets.add(Widgets.createTexturedWidget(location, origin.x, origin.y, 50, 25, 94, 48)); - widgets.add(new SpriteWidget(Icon.BACKGROUND_TRASH, bounds.x + 3, bounds.y + 27, 16, 16)); - widgets.add(new SpriteWidget(Icon.TOOLBAR_BUTTON_BACKGROUND, bounds.x + 79, bounds.y + 28, 16, 16)); + ResourceLocation statesLocation = AppEng.makeId("textures/guis/states.png"); + widgets.add(Widgets.createTexturedWidget(statesLocation, origin.x + 2, origin.y + 28, 241, 81, 14, 14)); + widgets.add(Widgets.createTexturedWidget(statesLocation, origin.x + 78, origin.y + 28, 240, 240, 16, 16)); + + // FIXME IDrawableStatic progressDrawable = guiHelper.drawableBuilder(location, + // 178, 25, 6, 18).addPadding(0, 0, 70, 0) + // FIXME .build(); + // FIXME this.progress = guiHelper.createAnimatedDrawable(progressDrawable, 40, + // IDrawableAnimated.StartDirection.BOTTOM, + // FIXME false); if (recipeDisplay.getType() == CondenserOutput.MATTER_BALLS) { - widgets.add(new SpriteWidget(Icon.CONDENSER_OUTPUT_MATTER_BALL, bounds.x + 79, bounds.y + 27, 16, 16)); + widgets.add(Widgets.createTexturedWidget(statesLocation, origin.x + 78, origin.y + 28, 16, 112, 14, 14)); } else if (recipeDisplay.getType() == CondenserOutput.SINGULARITY) { - widgets.add(new SpriteWidget(Icon.CONDENSER_OUTPUT_SINGULARITY, bounds.x + 79, bounds.y + 27, 16, 16)); + widgets.add(Widgets.createTexturedWidget(statesLocation, origin.x + 78, origin.y + 28, 32, 112, 14, 14)); } widgets.add(Widgets.createDrawableWidget((guiGraphics, mouseX, mouseY, delta) -> { Rectangle rect = new Rectangle(origin.x + 78, origin.y + 28, 16, 16); diff --git a/src/main/java/appeng/integration/modules/rei/SpriteWidget.java b/src/main/java/appeng/integration/modules/rei/SpriteWidget.java deleted file mode 100644 index c8c523a16a6..00000000000 --- a/src/main/java/appeng/integration/modules/rei/SpriteWidget.java +++ /dev/null @@ -1,35 +0,0 @@ -package appeng.integration.modules.rei; - -import java.util.List; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.resources.ResourceLocation; - -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; - -final class SpriteWidget extends WidgetWithBounds { - private final ResourceLocation id; - private final Rectangle bounds; - - SpriteWidget(ResourceLocation id, int x, int y, int width, int height) { - this.id = id; - this.bounds = new Rectangle(x, y, width, height); - } - - @Override - public Rectangle getBounds() { - return bounds; - } - - @Override - public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { - guiGraphics.blitSprite(id, bounds.x, bounds.y, bounds.width, bounds.height); - } - - @Override - public List children() { - return List.of(); - } -} diff --git a/src/main/java/appeng/menu/implementations/QuartzKnifeMenu.java b/src/main/java/appeng/menu/implementations/QuartzKnifeMenu.java index e50f2a354fd..6da9b334ba1 100644 --- a/src/main/java/appeng/menu/implementations/QuartzKnifeMenu.java +++ b/src/main/java/appeng/menu/implementations/QuartzKnifeMenu.java @@ -19,7 +19,6 @@ package appeng.menu.implementations; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -31,6 +30,7 @@ import appeng.api.ids.AEComponents; import appeng.api.implementations.menuobjects.ItemMenuHost; import appeng.api.inventories.InternalInventory; +import appeng.client.gui.Icon; import appeng.core.definitions.AEItems; import appeng.menu.AEBaseMenu; import appeng.menu.SlotSemantics; @@ -82,7 +82,7 @@ public void removed(Player player) { } private class QuartzKniveSlot extends OutputSlot { - QuartzKniveSlot(InternalInventory inv, int invSlot, ResourceLocation icon) { + QuartzKniveSlot(InternalInventory inv, int invSlot, Icon icon) { super(inv, invSlot, icon); } diff --git a/src/main/java/appeng/menu/slot/AppEngSlot.java b/src/main/java/appeng/menu/slot/AppEngSlot.java index d3e7fb72b6b..469ef542cf0 100644 --- a/src/main/java/appeng/menu/slot/AppEngSlot.java +++ b/src/main/java/appeng/menu/slot/AppEngSlot.java @@ -24,7 +24,6 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.Container; import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Player; @@ -33,6 +32,7 @@ import appeng.api.inventories.InternalInventory; import appeng.api.stacks.GenericStack; +import appeng.client.gui.Icon; import appeng.core.AELog; import appeng.menu.AEBaseMenu; @@ -55,7 +55,7 @@ public class AppEngSlot extends Slot { * Shows an icon from the icon sprite-sheet in the background of this slot. */ @Nullable - private ResourceLocation icon; + private Icon icon; /** * Caches if the item stack currently contained in this slot is "valid" or not for UI purposes. */ @@ -235,11 +235,11 @@ public boolean renderIconWithItem() { return false; } - public ResourceLocation getIcon() { + public Icon getIcon() { return this.icon; } - public void setIcon(ResourceLocation icon) { + public void setIcon(Icon icon) { this.icon = icon; } diff --git a/src/main/java/appeng/menu/slot/OutputSlot.java b/src/main/java/appeng/menu/slot/OutputSlot.java index 90526888da4..ea612fda8bb 100644 --- a/src/main/java/appeng/menu/slot/OutputSlot.java +++ b/src/main/java/appeng/menu/slot/OutputSlot.java @@ -18,14 +18,14 @@ package appeng.menu.slot; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import appeng.api.inventories.InternalInventory; +import appeng.client.gui.Icon; public class OutputSlot extends AppEngSlot { - public OutputSlot(InternalInventory inv, int invSlot, ResourceLocation icon) { + public OutputSlot(InternalInventory inv, int invSlot, Icon icon) { super(inv, invSlot); this.setIcon(icon); } diff --git a/src/main/java/appeng/menu/slot/RestrictedInputSlot.java b/src/main/java/appeng/menu/slot/RestrictedInputSlot.java index 646de977d4c..3c3f8c690f5 100644 --- a/src/main/java/appeng/menu/slot/RestrictedInputSlot.java +++ b/src/main/java/appeng/menu/slot/RestrictedInputSlot.java @@ -18,7 +18,6 @@ package appeng.menu.slot; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -246,9 +245,9 @@ public enum PlacableItemType { INSCRIBER_INPUT(Icon.BACKGROUND_INGOT), METAL_INGOTS(Icon.BACKGROUND_INGOT); - public final ResourceLocation icon; + public final Icon icon; - PlacableItemType(ResourceLocation o) { + PlacableItemType(Icon o) { this.icon = o; } } diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/access_read.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/access_read.png deleted file mode 100644 index 907e87a4d49fb2667a6cae581ad566dc334fd40d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>z@qLn;{G9yH`SWFXS;(B5>i z^ZNzc1#CPX&Q;!h&eD<9wrPC!~;~fIz2n)6^a}rF>c9Bu)lZb9Uvy{5^Kd%z-oAActp zR_kkIq;Ra5*dmgOCtHh$Iw6A$-U&s5-`)rY0rF z&@?sQ$S|ln2C5EAhM{e@qUum}wCz?fMyXZXUNM%labx$_sztJ9H}Y6D9xv002ovPDHLkV1i#hWDo!V diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/access_write.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/access_write.png deleted file mode 100644 index d4675606ac78539d2bd3815a5c05137491d2b343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn;{G9$d(K$U&sx;s2?@ z9bRk++(K-MmBn+~Uik$y+O+Nwow3mIq4X*}#_AQ5+U|J2GN_TaSC{y9ygKdKt(?{- zuERI@eU8-~*mTI?+w-)&mUH6z)wiGaGvHv=T@3aVPK2!vapHg+$px z&%0brUTJXTM&~N`tHR0Z5;AR5f}SltDbLL@RmtxEvCYP5wQzE)Dl=dG#JTuaG^D*AU2?ib#Dm+4LmR4!k zc0Al$9>XDf^@#bZ&U-G)uO(|gjY*!fGsySJ9&0OM`72d9OXp$y;DRK ehxg<4dl|UTsuhJjnXC$Q27{-opUXO@geCy_Y((+^ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_left.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_left.png deleted file mode 100644 index 1214fde3922e653901b1a205f7b0fb822c4324b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar*{o4?6N5HV|+N(WlX;OXk; Jvd$@?2>_WHI1T^+ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_right.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_right.png deleted file mode 100644 index b50c1d4bbd258a3427e3eff0f6a0abf2cf6f3128..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*{o4?6NP849#rTz_`n z>m1P@29c1XS}Pht4bIguGqZcBEm2|3Yx({oT3NGV;UB@a9mCyMA~tQCEy z6@Sa)jFs{8$`1+GPMQgQ51e7uB)z%sw}#48*EHGhfj^Gyi*LGL%G&!|e$KLE2NnSB OW$<+Mb6Mw<&;$U|_B|Q^ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_up.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/arrow_up.png deleted file mode 100644 index c344d9222ed895a05ca774a6fbbc685f94f581e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*{w4<6(_tRUceaC^sR zGY{F2hg>lY+6y+{KcHr(vPq!ep-^g@y}G6fEBCRMB@YhX?PW}M2r_u^&h7XM4=%Ag zcPmbmc&)67xqfi%lv6&-F5k+mkv$llz1(o(jVTZqsj>9a@3`nfxkcNG4lM!N%i!ti K=d#Wzp$PyodqOP$ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_off.png deleted file mode 100644 index 1c1fb5b1cdf5ec0542d3b72a5dac0fb542cd807d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*{w4?6N5au9L7Xgzt| zYaUjA2CjWwS}Pg?4bIJL^cSD-XTl_t4Uc91^}KzOV7+riut($DDNU!!J~=LzNOtBr zcB3NQ+VZ02l7w@6Jr7FWJ~`Vh(Ryb>?Db>8&)vCOMdnB*KX&C>)tYo}Z()`Q@O1TaS?83{1OPU{ODg~X diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_on.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/auto_export_on.png deleted file mode 100644 index 0e2375126b5d6e09256668ed9b64d0ae2057e46f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*{w4?6N5HV|+uiwX hA4j+Co%FnldHx!sd7I_livS(N;OXk;vd$@?2>^bgLsb9( diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/back.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/back.png deleted file mode 100644 index 77b705a8ab69789e54393f523c0040dbd0c3c576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr*{w4?6NP8}hgwe6I0a z;EzR9k|4_gB?DvO0{^wEG@_T@3bsBh-`$booT#WY$@iFw(j@+<>|?VJ`L=dmshngL z)7UTDDX;%y Sti%Mgo59o7&t;ucLK6V7RXzX! diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_blank_pattern.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_blank_pattern.png deleted file mode 100644 index bcca8097bfb0b04da974d25fca92115e6fb6f033..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`S3O-ELn;`T9z57N+fkt9;(2@F zhF)fkS3!=yAF0Ur#?R_Y*~@IL(6VLP&F}mE{`&j8S3knOzUH~M*!&f8eGxXBDi&1T zNGc5B-?(G@jzHU-jXT7XMv;f)jU5p=OdeX-;k2)jvJkpoTjgu?BlEMe{AcLo? KpUXO@geCwUF>tZ~ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_chargable.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_chargable.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_dust.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_dust.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_encoded_pattern.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_encoded_pattern.png deleted file mode 100644 index f31a4f059f70b737ae7f075c5e1465fd2607d03c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`XFOdTLn;`T9(43_4is>?`1<+z z)eFkrAMxF>w(Xth3jP`aCn06a=WqW${@g7tv**Q=##f2mM|IWBL-@UQw!KmmyY8n4 zVy-*7sH)@W(#i5y4-0j>Ck5IbNwQwm9&zN6pa2bpwsOdbsQph%eTiF8inJXnhF(MvEN+-TQ%b$I+r9 xRk5qiK&ulwk8YhT4Kyle z_F=_Y?pwW{627@zT`rO{8lQb;-~Y{0Uw(f4{hS%^^Vh$bG3P{97~jV;PZU-cc7%pK z7D#97UUN*bPey6ArSXmvikoIFJ}7VD61G|DPO2&2N9pzxS#oT%+5SHeh&+2X;c~*| z2j_rlv^Pn$@0h6r)C4kQb5Te8$wucCQ|wYm#J8D>$E$p`)=uQStS3j3^ HP6?q)J@qH@O zghB?_SgVZKIW3D{dS9M+BI?6|O%f+R?fG8z_s_142{n7-BQ}0?kMs>IHmgurJ@Zh~ z^s6mLO)O4kE!$wh-MvOlr>uGRnl!HN^g~LkIlCtUC07GkHzT%e%t*fYKz`G#*odAD zC$bJbng~*rSs*SJ=^G)FY8o8zC+&l>&Zb$5H&mn*2#Bq}74e04vWv+Z`#;l!flg)c MboFyt=akR{0I<7TO#lD@ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_ore.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_ore.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_plate.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_plate.png deleted file mode 100644 index 1842dd2fdb1a2d67ea98d5b6f9320e1099d6adc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar*{E4{qdTGURc%*#DH# zfhS?-#|tJp2Td}S{EK2#xVZEL{@i<6R-YsC;%iY_hHa!^9?z+DUsdizT&xnx<8XDF z7_dYp!?sd9uSUtIMf%~fo`5AjTjtd)mfPQR~W V&yG%RF$X$;!PC{xWt~$(698P6JU9RV diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_primary_output.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_primary_output.png deleted file mode 100644 index 4b9e32215059ab5c09a96e31a2c2f0827ee5a3a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VV*9IAr*{E51!_2P!Mss`1*Hr}*?zne>C~acvX^Tq{ zS3vOQj-C@q`kM+Q_m|v@Ii|BoLaEz!`p1hu52d<@HJ_g0DyEm5AyXh(t*5+6LaG}K p?O|G+pEsNa8@u>3`}B`zxdqs?pT(%X<_9{E!PC{xWt~$(698J)Pd)$u diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_spatial_cell.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_spatial_cell.png deleted file mode 100644 index edbcaf4a261eec02045ef85c93fe2df875d2facf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&pllnLn;`T9z5vj5-8wu@%7{P zp=u4w%tW_HPd1o!&qTIif#3>WuKtJC9P^65fBEz2An*G8_dTZ%+ot!Oe$1S{X;vbu z^6HIE+3evUrnUBotThSSe@wfYVj7mfx_eDpgk#v|=$eyRYYuRgMV{Tz1Qz+6T&T2K zGHk+C9-#U*(G=6@1PLn;`T9z2*C6DZ(v@%8a1 zfmfDo61U)Rzc_oD^2VzQ2h)ETOO%{j-+#aU-zT@P821%RvnNc+UR8`jkg{NzWbuy~*I|>gTe~DWM4fRq%W4 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_storage_cell.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_storage_cell.png deleted file mode 100644 index cb55abff56f986b06a7e475a483d8c4d1e981946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`FFaiwLn;`T9z2*S8z|s%@pU58 zghB?_T&;}UIW3D{`d*%RqiO;BVT1S^Kj!4Wx3B;E%zlpjzWpD)zHT`B=;X=fSBafR z!)%W{diP{eRYX#uc=szsv2b_y_~G<*!;z%ba_jmcLijh{ND}Oh$k|v?^g&VVsQxa`>R0r+NvE#lUBrUx>xQF?fTnzV&>8_Wq{9`cAzZHJ;-glWnuk-51_K3w+-R_29Y@1# zkASp1>V5UFUTiv0TQtZ$V%@hNX^H`zkhC$Be|v-s$T3Hk17%^ZE$lqH|Hz}M`x#ag VhX@$A?g54XgQu&X%Q~loCIGVeg-rke diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_trash.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_trash.png deleted file mode 100644 index e8a51cfe3f581855c0a9d5b9f75bd3e16a207b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr*{E4<6)Xa^!Kim_LI_ zgqvgMk_>&bMAMxuA&br=CPaiqoT%P@{rBgki8k`(RxQg8cAj|DGrP#-hKpGD>`mP| zO5G=YBiZU*#KJkG%~Okl)y$9j&b%|_r0-2mU#H0zR7^O1o0-j3H_cG$R^3z(+{dPV gXUggpwS_O)lUK_;`Ni_i3Fs0APgg&ebxsLQ082GN@&Et; diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_upgrade.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_upgrade.png deleted file mode 100644 index d3f7418dd79af2bac32bd956c0590478a0cb259e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar*{E4<6)Xa^!Kim_LI_ zgqvgMk_>&bMAMxuA&aaZ9N46OcTahxO?BOzL72V zE@Htc8#&Zn#U@`+G2!%e0#b9HEb}?!m}2NE=AL)z$ub?Fn8}SDniG!-MfyxUI&tYQ8E?yQp(XnW+*hE?qmM;>X3wZBRf?|$`g zLq)i42>(^*uLT`P7gpUkx~S?#?j4{Z8@rE&>a1!%Dtz^@yO~_aQRA!5I%VDdE9BON z0fi&(tdx7FbMMHas*a=Sy7z#(I*$Ga>9Xi_{rbV@t3Y?e8!_>XK-FN|avnEEgzy7( b{bavCIpv9;=f-rPml-@={an^LB{Ts5FnNRz diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_booster.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_booster.png deleted file mode 100644 index 4cecd17116e3799e334ad8573cd3a3367a724e2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLn;`T9z4i-D1fKo;r&UB zBJ3PHQ!@1R9-8cI@mcgGfTMq3)Qj(TBXHXwoZ?ixrkLObx)mriIdqpRW!0B@048PAz#bK>?XYidtU$EHwEZQ22WQ% Jmvv4FO#o-WQzifa diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_term.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/background_wireless_term.png deleted file mode 100644 index 5ba3fd73c6d5a7b94dde745d99b6f89a2dc865e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr*{E4<6(^Y{27iF@7;) zlvTq8SLg4SRIPgToF*?}5i(F@Vc-A#M@>Dq@RPq)m%4TCObP7u?Dcd~-xT307Jg^S z+zp*TF~Nzgvo{IxDRpb-dHGvBTsEgur%!4!1hxoIJgV{VfbUM{8#^>79_27kRWG?S bW%s{}kK}eZ2fjW4bP0o}tDnm{r-UW|wn;@O diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/blacklist.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/blacklist.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_no.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_no.png deleted file mode 100644 index c51dc8e61f73025c580640af7014c1c7419668b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*{Q4<6)gHV|+F=jhCmmYDavvx=V`_pyp+nGxwXc;8JxV4u@fV%zG*`=;_41DP;%j1N@1}aI jv_^8SGtxe|-j?z4RKxV`p=bGlj$!b0^>bP0l+XkK>Q_UW diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_yes.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/blocking_mode_yes.png deleted file mode 100644 index 05042600855f06fa37edd543c5dc75e7541f0370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Ln;{09t_Mq>>%KJarf#P zePiVchNgr7iGz&=m%Ul)si%+C>*zI~K?uJE>QZYdzE)6ng)%X8N^t=JcI3|4i=;U*aXKq>~?*6g#W82$D2P77M zyzn#NIg{purnw?-@?s`fO5eXWsp-tk9a)j@j-~-|{BNeawbp&y7cQFv9m(M7>gTe~ HDWM4f`b%Bt diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/clear.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/clear.png deleted file mode 100644 index 3869b8506b2e69a5d1a4b256e5cc8771e5c4d6df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ydu{YLn;{G9$eUa*g=5xf<52; zO^2G8mN$fKxN~e}0=I#w4iYagp!ga zQ&<`m6kgs~nO1Y=vv9no>cN8z!mA|HT+ei^NSm`$VMVF*^rx(wm2Pa^=C?KP@uoc& eZdpC7uVm)d_W!uTCAJ;ta0X9TKbLh*2~7ZmnO-RX diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/cog.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/cog.png deleted file mode 100644 index df6802ab923573c181ca598aa43d032e9f72df17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmV4xJ6vyG;bBk}RvO|Gy08elrEI|gDzypMu9Lx-5K^dapzrd?2*^+gVEtOUMKK?mL zAt^Y}(U269f`+7!6f}&6q~JhG$=K*oK7E{&*#f93|D57f|+|^njXAfpH~(}LsD=crDSY$ z>~Jrv+zWf&X}A}D)H)j6f?2JjxfA?W&VA(E2Y=c(ruJ2^wExxr00000NkvXXu0mjf D5Vmc3 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/cog_disabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/cog_disabled.png deleted file mode 100644 index 9691e9d054d1c67f7657243ead9bfaa1adca5fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+dN$yLn;{W9yH84;=sdtVg1e- zg_Erq%k5gd=Q}L*TbSpt>Z-(ipWWQa5^Omh;-BRHS&I3J`PyhmY{=M@k#u0u$wi%v zi3b*Svj5&DWX0NCa9H(@K;DiPX}1=>ZnaqjhYQ0F-L}#F`Sow}>3wTkmOVID80J(w zXKKOX1;Tk8<~18K7A0Oh61_w5&IM(j2$PQq_rsi)KXBXeP$+LlumOj8i*(;+p;?dD mhyWG;Ic1}3>F@o>znU?IIcP>raH9#(2MnIBelF{r5}E*bSY4|C diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_matter_ball.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_matter_ball.png deleted file mode 100644 index dc7f9550abed70165e7d43460092eb82fce00021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`tPu%m^(yd|#@_fv6JdE^`Wg6pm z8(W8&>7zopr0O>?qs{jB1 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_trash.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/condenser_output_trash.png deleted file mode 100644 index 2cff832c2d0089b6fa3d03f83dc11da96796dc6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr*{Q4?1!(8wxmFv|sq# zqPt0O1DD%TEeXazgL6p2zzov1pp133M5Qr>mdKI;Vst0P?9#-~a#s diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/copy_mode_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/copy_mode_off.png deleted file mode 100644 index fbb7b3ce3246937e21d5c8f564e26e0e057a5de1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmVt!SK*)1*hvgTMB|CXfNEyTtgtsR;9kYOidn(E3U^GrKsED7Vjvt*sh>jJ<+Aqyi5mPDM=b^JB-EFOCnl!iIRi#y1!+=t) wz4ANK-+^TBc|CtHPf}G6$aM*MynYYE#|}$Nj(CgbK*uq7y85}Sb4q9e02%8}od5s; diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/craft_hammer.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/craft_hammer.png deleted file mode 100644 index c06349c022c90574c9d039f00a0e0f0c80fbab74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar*{w4<6(_tRUceaJ$HZ zX*%K!J9aR=TFma^y}xlQe_xA^$DCxN!}BLUnKZ||httz9JyI-L;ll)#bOnQnNzeQy z6${T;u~ve4(j318r%9h35*#KKdm2todZv2R=lqU|Phx`3TnX#ByzSk&mD`d^diqqJ xPfA+0EvZI8!ox5)+Hl|2wY&3Qzxy+V*=K|8O~&hDJAm$D@O1TaS?83{1OUsEPOks} diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/enter.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/enter.png deleted file mode 100644 index 7f798ca485e37712b4cd50ddfe836a046fd854dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5uPrNAr*{o4?6O;7>GC=bU(cF z+^Pjk0S#Ow2_GbX%-%bZ&BM9h;PCSKQdt)~c)Vf)n)y0~vo2&VTF7QzbWWJP)6uv$ tD*RjRGD-jd diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_disabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_disabled.png deleted file mode 100644 index 4cc07ad25feb37179dc4c7e40bda73e473eb0d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gdx`!Ln;{G9$d(KC_tp`;(ObG z4llL@ZXq_spU-zlt-8;1Vs%8bq?E|KfU7Jyo~)dTdwKZ|TmFer+HffW4Jp-C=k z7tF%rZawo#aa)kf_cdwfUHiQ9bH_`SCP-W?jXmG7YL$?@5#vb-k7HAO4(wHse8+mS zBZXpc@%HUHx3v IIVCg!0B0Od761SM diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_enabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/filter_on_extract_enabled.png deleted file mode 100644 index ed32821b8493e4c239b89ea5af539d8710ed00b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2RvOILn;`L9yH8i3KVE~_}_M| z&Nd(Ue8q|ht(M2H6u!1>e(G=_+r#Si(NktRl~g+0%QP-Na%=6Dg&JK-mrBli?8+I!$ z+99pvr6Md4c!yW;=-rMKrgv=}kMcS+CZ1t_cWmlz!I{B|i~fWw75s|vzZ1FbH_&(k x87}j~3k7Bh-l&_pt~NgB+`d&#TDg*t(;OXk;vd$@?2>`RYWMlvU diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_disabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_disabled.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_enabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fluid_substitution_enabled.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_empty.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_empty.png deleted file mode 100644 index 1f8739eb08b68c8bce24c52205f1ec155ad4a833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VV*9IAr*{Q4;u0^DDpU5^uH|G ze6^8FWDbMKgEeeBp0YVvO(@y*{m1@8$L@-YXRU4RpRk1GjMPL!D|JsUA(-TyH x?BivNIy>bLdKi4tc(mn`m%*oyqIoaRGn+>8l+9qPItsLi!PC{xWt~$(69D8dHTeJl diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_half.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fullness_half.png deleted file mode 100644 index cf813356c71ad870b64893cd83e5087f7e298daa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*{Q4;u0|7zj9Aynou4 zC$vdeWlrBJ2Sz3irVkBb&!jZCot^VCiiF>Ptnc(&yVX$P`J4()$F9R`9^CvsRsU$= zyy!z)&FoqfjuysyCr=PiVbSc%w3AR}(UjeM=)aAxA^$2B(Qs{`Z492SelF{r5}E+} C$1=$P diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_ignore.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_ignore.png deleted file mode 100644 index f394f3c482cb723e1b88e7367100bfe4db94d17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr*{o4_XU07znstlumms z5hEMe$i%Wh;oQ8&r3-I(9!w89Wcf!!Wl|G+*4oy|h6VXCH@{CkBk^UQsNPz~O$H|= xJh6pZ$!m2OPS^c<~Z?daQfW>|HGeCP7JYD@<);T3K0RRgvF{%In diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_25.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_25.png deleted file mode 100644 index 2bfa8b2317af4b3510cf2f2bf26d47a6362f7c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*{o4{qc=WFXLX@%)Lc z;S8O#5;HRLcx_xaF)*hz=^WvyXR~1PDwN=y5Ok>e&qNLt%Xp2YDq=I+BA@0-SpCX& zf4yh5%gkdIaYFoa-}6Vu`Pkgt5VTD3WTeb;;rS^{n@?#?nln=+UF~G1M^TfH^CV%9 kqI)M;(x#qR^NBgH?3~^=$4-lIpko+3UHx3vIVCg!0IGpPl>h($ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_50.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_50.png deleted file mode 100644 index 767ad7b08817e7003b0ddf1047ba6418ceadc40e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*{o4<6(^WFXP@aQmd< z@PH3*4C40u$)2HkiB)ESaEW62532*~ouZOD6uzk0@zry>$(3`SbI)htN}K4bVmVVqee#o(NpqZl l;+Yekn1F=EHlN_HX87!`_w7m%gFVne44$rjF6*2UngCX=N+|#U diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_75.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/fuzzy_percent_75.png deleted file mode 100644 index cde236fcd34a0015d90b5ed6b35e65e64e26feb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar*{o4{qc=WFXLX@%)Lc z;S8O#5;HRLcx_xG8W@cn#gf|WnPnIQXDCmca7ppr<9-+CNuOJTydJ3v&j?+#@BNND zR&wWddua>v95(&9@bllq)0a=o=G9JR@;uk`xFX4KSz=hE>m*^1BDG0#I#rfW}Mmv``zih32)E! z#?R{ljHN!;c$V;Pw9iR=c(QG3Pur3Qt&fWqrH0($UhTnUrNUZ1$tftnP-;?>zJ%!a fL)PzF{~basFt*UZXKYLmdKI;Vst08?)}bpQYW diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab.png deleted file mode 100644 index 9e29e8062d9d8ddc40d2ea3bbd91c3041e9dffc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fWu7jMAr*{U4=&_AlpxZ2v46I? z`|MfsGd;>3!Vjn@NG#|}bXa82!YFlvp{aUa`T5A$b=%MHD(#uAJGCk0*83F&Rx+HE zem_3B|JH@i%04Zf27+pbTxM_xCn_O0lNBCXPB` QpbHp0UHx3vIVCg!0M5fc5C8xG diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_focus.png deleted file mode 100644 index 593f84a5a3cdbd2032c51983168a393f5aa056b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fg`O^sAr*{U4{j7}au9L7_%>=oG!PC{x JWt~$(698*rKKTFu diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_selected.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/horizontal_tab_selected.png deleted file mode 100644 index 593f84a5a3cdbd2032c51983168a393f5aa056b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fg`O^sAr*{U4{j7}au9L7_%>=oG!PC{x JWt~$(698*rKKTFu diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_1.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_1.png deleted file mode 100644 index 88e2f9aa5425cc5e5b6e7afb0886c854ccfdb9a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t36#DLn;{G9$d)Fh{iz#j=XzWoa6BqtVPunX_`^2MSY`Ivd#WlAD){R!d#Fv~6lPKOP)i93 z4NzR6Ff(A`s-~s|4n~PhtGJAK?GnTSvH}daR~T{^^g9_T8aqF%vdumJJbicE`U$Uh z$^NRlpHyIT=hpAXn~pAUY^@gA++e<$;k(8vEsZmVhitnfh1lK&8YJ~`z6<=oefp@{ b!{|8qllFpgpAYZ=oz39s>gTe~DWM4fXo*q~ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_4.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_buffer_4.png deleted file mode 100644 index bc7a661c9b54052b633c9233753739243d8f1457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=R92;Ln;{W9yIi7b`)s1n18)) zy~w2-o?S~WzT9*8%d&gIf7m6qY?x@^pA%{N2^N z+UhKQ1>aBkcxf64NB|iQUYZv;OYZC~asrA7|6~?iD*m!V!&cDMMY6NxjFHkQeZiwT zmuI9_P3-GPnkE?dY~P>ew4FCX()3=)@U6dn_uc1nI?9VoUVl}+ZmvD6{kQtPd*7q$ zT-dy3HUZUVx=guxRabeUGKhO=ic#zH>BkRP>WI%iWm(HCJ<+rAOpK--&}R&uu6{1- HoD!MMDjk#{hz&Cyj*{eg3ZHs ztzI0CHx%C#d_UAD&~!mS>RnugVv9nE)x9eh1A1*1OJ&Mt%uo$cPUF0KBHl`BmEh)< ztRp&!(+s@VoDtG4*SC=YOV2K@Us`4r$F<+@xcAKIfnbG4(oQi4%l+V(zh;?D!0U`B zHNsabP0l+XkKea&># diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_combined_sides.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/inscriber_combined_sides.png deleted file mode 100644 index 7797e31acc6ff209df6b7479f4fc729bc2a7f32a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar*{A4{qc=Y{27sP`z=h z*q`D8F5d^1TO`F37(z95b{R~#^Rc|Qxx-^$kD-*g73;}~bGiZ}UT5VPTN-c)PPBQk z=ZdCB-;b&qrprmRC)DcmHm=>BjMEnduqIEPd%ksI zC-cFG)aS(qmum3%@UVcySf?*4NLci+c;Qo!Xvo2crJr_Q5VAV`b=mjRGX>{!>$xuc z=y?49e_i|K>+iomFRTj|QkIEWXTJ1dkVxDm=6kFBKAVNc6#{+5;OXk;vd$@?2>{f* BX)*u+ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/level_energy.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/level_energy.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/level_item.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/level_item.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/locked.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/locked.png deleted file mode 100644 index 666bff2e5573b6e6e516573c1ded595cd938e29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`*`6+rAr*{o5AGIZGURc+sD1ue zRzT?vuJ8@4JDAG9aXHioNu-6Vq!jSg-@jg=sHv*T`nY9D&x<=}EepyYA8<=td$&U3 zB MPgg&ebxsLQ0KDZpZvX%Q diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_off.png deleted file mode 100644 index dacb40a007ce70599ac349c18b083aed263c86d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`TRdGHLn;`L9=w=ZO5;>M5L zt%6yD8?-7yckr23NLNfe$bD>e1+(H4nZLVT%^k8dmg+dXS~O)7!^(wIHf7u}No?mU zdvT8M>%P~~Ten?d2jYB&m6uluPjJX$2x6Y#@ao_yZtIc_&g|AE$?f;9+zJu~D&d`A zwbttEzU*b+V;z`QGJ3@3{9?5JlGMH|D|cmQR5Vae@cZ3qRrkN9TxFdg)o_JjiQSEo jP0spdFB01S-4UPgGEwZzn@?MS?q~3H^>bP0l+XkK4A*5> diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_on.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/overlay_on.png deleted file mode 100644 index 332430a24b03ad0e78b5a96d05381315ada6e6c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr*{A4<6(_tRUce(0xm~ z)E%o8O``uL|*^^ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_access_hide.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_access_hide.png deleted file mode 100644 index f2e12bd055944a2facd088997e3c3d851269fef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-#lF$Ln;{09^9CF*g%Bk!s0nm z*%ggz7INk>_f&BxM*YZ=&J9e;22rpo8oY1)BbM+6INnCL%qJIvH zOI=b}IiYRplBQ+ve>X6zn|!Y6U!wS&^Yo`4AnV4Cxb=lH$EC}xOhAH59?E*MS~K=8 zX|jLy+it*dOYCg1>^;0DM7PN&L4xcCb&CO`p#pdd--_wYI- zRXjmt}cOr_;w2kqw>Uz&M_3DKl22 oqlw6d9m5aC@m$eGWW&q)28gpfi@Ln;{G9^A;=Y#`upvHs;p zE}xW(7b_Sd8rm2$HZjOGwDH|_SyRCCAVIUW)nn?k?-hUie;hm`#QJQ^;t zR=Pc0BGt;h@ImeLX-|E(y%W8CW3uUGpJ@3MMV=LI550GM*ylY5D5KfZ=wr&o`jGwo gZWl*WuKsBGUK2;FrK=0FfKF%dboFyt=akR{0C4+XZ~y=R diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_not_full.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/pattern_terminal_not_full.png deleted file mode 100644 index 873473bc579ca4a9a1d5335be0937913aefaa8f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar*{o4;u0wG2n5yn7?xK zOx8w55yt=#M+TP0nKK*oZSN+8zAeeV|M;u@Lq`{t)>T~QE!`a+Vw?R;pC9xLZFSO6 zQaWp;{#{XI?c0+^&l^{9*-MMRbKddLu4TQlrWw~}KNpqmRa~w>GIF_)UexW$sppzc qttl>&cT%*;$o1#?uDBm}NWbF+(LhBvc67ctq_~KCd54~i(yjt!ovgd<)sGit`Mm4xUL|<3b#g)Q xYdeb_=3%RjiCk=L{jlg-?S_sQhn`>LFJEiH6?J>l2B6y*JYD@<);T3K0RaC?PcQ%g diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_block.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_block.png deleted file mode 100644 index ad8499fd83da95a9b8e3d393181e5b4f668bc5f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`dpunnLn;{09t_N7HWYBZ`1)$y z?3sc*4Xz0yZV3#{2{UY&f}^vRW=vhO>euArA32kPfY zG$YSgMIX`8SsQ!uk=>1~wXON==4rCu8-G7&|9zk~;o45?ot-m|_M}XlqLVgPH%Uz5 zWbHn?D>nC=DdLo9nH1Oq{YuL35{NWx} qbt#4NIbhxY7H!pz-aV=R8|&H?VO)n#|LFw!gTd3)&t;ucLK6U}UuM++ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_item.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/placement_item.png deleted file mode 100644 index 9a7584d524feb0de56a47bb33673bf05f71d195b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn;{W9(3ewF%WUR`2FOX z*Kf2}G-x@natSmvS?y-K=U~*`#^PjTeeU9EMz%H53%MJz=a$~s=DKvsh2RF`*0x&MYi9&enFu`adTudkYQcRxOJ-6eaTy^j{zOW;OXk;vd$@?2>{2D BQ&s=~ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_ae.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_ae.png deleted file mode 100644 index 53d37f1e1dd9e516e43c5d3fbdd79c96aa14c1c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr*{o4{qc=Y{27sQ2pRm zu|LHHT)qz&EgH=pGkFO!w;Vj=xJ#k@&qWWVq+;V^8G;)vDpEB3UB}dNcM?=b;Qm#pXh4Xj#Z}LlAyZPedZRFX Tk7D#wpydpnu6{1-oD!M1gQv8h6)qA|> xIvsg1CGfH>dyr diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_j.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_j.png deleted file mode 100644 index 53dcbbb9043fe39c8411de0255d5e4f234286a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr*{o4<6)gFyLW1cvUlY z8K2aBHXmj&mrufJKjsE{>q;eR@U$+x5a6xL*Rt>^^VSN%HnHBl`gTv)W<`r+I^GqT Q3p9wq)78&qol`;+00r+N=>Px# diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_rf.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_rf.png deleted file mode 100644 index 59bf7793670da49329b3ee0b5b36ec6ca7f6e447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*{o4<6)nRupi(xO&Gt zws_gFL{>2a(Hl2SJ~%5dPQ1C3+p^uBYj#J4#f-?#j`rS}qIO!-r8rkko@lk)>rm|j zyNGNtvvFVdQ&MBb@09;fq!2kdN diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_w.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/power_unit_w.png deleted file mode 100644 index 12830046239eb2b72a5e8c598f849194a8c7f658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr*{o4{qdbFyLW0*zY=* z)tJ5eKhrW-H?PN&?iALnT&dPND=Ub__h8$stWAO@tiFzy7X(c1wS4|SHDi~?wOv1F ZvU?cFSWjs&{|_{f!PC{xWt~$(69DN|Dn9@K diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/priority.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/priority.png deleted file mode 100644 index 5097151cc5cb8d0b399abfde5f9d24594f52ee1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr*{A4<6(^Y#`urQGelQ zGmFv{64xJ|Th`diW67c@EG_&=u0Gr%(fX%=U~B8KBV|R-sgAE=u14JWzScuU+{EwA z@30*UHYHd~=BPKnP1!KlM~ge?xk4!)h}gGj?i`SaxyRhdhiA)-Iy(*}SkH8ENnBwQ kQn})zTIo5Dx$`R-HLsigzwk}o1?VCMPgg&ebxsLQ0E-eyfB*mh diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_above_equal.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_above_equal.png deleted file mode 100644 index 7a2687a0a5695f961bc83e2b22c25fb717618aef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar*{o4{qc=pL>@l!Pl7s#G>Jmrgmv9I$jRt5499jT2g*80|U!cFxRHyGhc;Maj#YG-gDG zef_iNo4Kiz<5lDH{QKHU6RYyBaI{J|FMqYu%R(^u#SV`Q6%!$;uOTa{{vBXc*(>ux T^KP^*&~gS(S3j3^P6%VzH=GWsaWSvha-Ye*^^s6vXUxgZA9hcE5_4_a=dEw&@F**uwDc^}JH2hP zu*Z=ble3;pYzvP4tTJK7vW1US7f%R0p^+lOm2%|9XGZo}S0vtcPxrq7w2#5l)z4*} HQ$iB}p}al| diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_ignore.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_ignore.png deleted file mode 100644 index af1a3312ff791c2b5a9ad16d3fa7135d3027fe7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr*{o4{qc=WFX*h@x5^L z2JfzrHwDFaL}n^5?{K#&Ti_-l+0gY(%wU;=QLpGp)jh}WZ|~3u5e!_hEmQBdiMUlu z+bTgp*Q-Bv*w6dI(K|;x1c>kTO*dYCd#c>Rg;_h+dtSZaov~wm=c!uXH!3_rY@E$} eB`c)tAF#fPQ+sh&tJ(TSR66 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_low.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_low.png deleted file mode 100644 index e0e0b31b4ea6670dada060207122f89c53cd2796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar*{o4{qc=WFX*hv3~iL zxCYLMCM8kpJ2G;|q7`DZxTLaN4l=CF*z3R{G;xhbgp=Ok>OYDiMdyU&6 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_off.png deleted file mode 100644 index 21206ebc736a27cdb7d8eb23708daeb80b71a55f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-kvUwAr*{o4;qR#7znr={QqsC zf>DyD+=~JM*DD+h;u;GM9C(KwWG&kRI zz`HA?qJyty=>cX_XF~rVuLBV5HA=_Rb5p-1YVChs4 g+>$V5(`QEg53jgi_$>T%6lgAkr>mdKI;Vst0Kh*ihX4Qo diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_pulse.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/redstone_pulse.png deleted file mode 100644 index 352ddb464a55bdf96d25187151d2431548c5491b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*{o4{qdja1d#Dc)wfs z&7y#t56>1JzTs3<7SMf&LF;YwgA1`PdQZIe_20KO=9ZbZi_`lqi%?6)Ojf;TrOK{5 z7QV6wb@sRJUBV$4di>zopr03&!a4*&oF diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_arrow_up.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_arrow_up.png deleted file mode 100644 index 4903ca61e07672edeeec81bfbd67fca9b141dc3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqp`I>|Ar*|R2RHIIC*jY#o}0dOn($%%!z$TI*-2?HHmS9(>2!RN pWHTf3c_qi((s`l_S3Z4mmN&VBzaeN>d;rh_22WQ%mvv4FO#l+gFG&CZ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_clear.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_clear.png deleted file mode 100644 index 353cb477f5f1fdf129ca2314e957f7f132edf545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqrJgR1Ar*|Z2RHH_QQ&d7IKRU% zW=7+T1I#Xq(pk7lic|E0H@NG0T$uZAukzB@5Bm>zn|wO`;@rtgS!vm(n_0y+AF8dN zafWNr#Fr_8y*Y~}zD>zAO%5~A-ZJZE-;{OkCPurIrDnR7yC^TVZoK~DoXM`uz3+VD YpBbr^y_$8;1?T_f4HF&x>hEy=t9^A;=Y#`8f@%*y% zgR>9Y)~bDA*pj#IjMTj5NAVAwRNOZOJg{A-(z@h-Skz_S>%A+j0GfrY9HM=B8@jKNBU-aJ@4v kOn&+IMpX6VIAMOfGh8;}dcAc^fNo*%boFyt=akR{07^(lA^-pY diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_cycle.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_cycle.png deleted file mode 100644 index f735441fa33e3b0194a79c4bcf2c6feecaf389f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqQJyZ2Ar*|Z2RCvaP!MpqIRCJr zPKkngK|@2W+lB%!-8;&G1`6&cs@*xBpXEQCF!#B4zG$MRWnfW~mgPqwGsC!yL&vQ8 u({4eN-ilqrOBfI@Wrb&zMdOIKJH!hzTLb&Lu~r>=J;c` z7M#5G`b=TfBp3ZV{^>$T{k|NUmZV&j=s%J5wMJ8^$gDNlEeW!o*Ew3#46n6aJviac bk6#S&3x$15i(hR5x`Dyd)z4*}Q$iB}3W7zg diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_fluid_substitution_enabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_fluid_substitution_enabled.png deleted file mode 100644 index dd763b030aa7fff1b6e0dffdab5cd0ad3efe1271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqg`O^sAr*|Z2W|Nr3>X?N`d>cC zsN-hcdBieDcDHqdM-E?t$#*F;w(u9JIdzLf1wY0GOuKrF|D@^EpOO8nN+aJc)RQ$YtfG} T{t?AM%Naaf{an^LB{Ts5)MGv{ diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_machine.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_machine.png deleted file mode 100644 index 075313f97b6fb8c132b39640a036413f8e9bf65d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4b$GfshEy<4J?PlWV#woiael@* z#R!X@Bmou&WrNL14@#Hht@KxZTm7f|?WS0h+o`)Vww*4!$ac2uO|TelkP@dY>a>LRjxPj&-! qJ$UOpxkj;x-GNFO8*3O6N9I#pUXO@geCx0W=oO) diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_processor.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_processor.png deleted file mode 100644 index a327e9c75b4f24eb9e7ec0498dc00896ae1bd7c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4P4IMa45?sjJ?O}L#DIt8fN$x0 zBjYAk0T#DJ7S;_Mht9Cn^p*S#-79&=X!8X)Vv9->i<|S@(k)F)>Scuz>$c{Soa|U< zE)Pac1=ef3*rZ-sEID8w^gu!O|AfANksTBJ)PoXcoSnp!?{R$NHPZ_o$K9;VE^VCH sw{>0P*&MN1H+4)lM`omL{_vSq`<_P%x4Ygf4MS8k8hEy>29t`9?V!*?C(DtN` zJl|r2KGg`Oy v#l?rgI-Z*sJ70Pcpkp=X#fOzkc79}6*{Z5??cxmqpd}2Ru6{1-oD!M7Fi*Ar*|Z2RHIIC@?S_oPOcr ztQ!G48CB=Q|yFCmknH}oY*Rn1eG87}4KyYXWgKA_C z>V3=B^gN@ut diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_terminal.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/s_terminal.png deleted file mode 100644 index f47675a6fbb391980f3f8827bb61cc7c37b035a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4WqG29`xpAHso+* zuu0zngC-_}rqnd1Jf)ukEBDWRxbEPjnMe6oS;^f|G1+`lUGSXR7LN4bs~}OwjI_y< zZ>Dq?m@SOGUYwHFDDE4|Ua^sbee+3kr_*O1^@{sOoKgF~he6=A;!DQ=qL+ZSGI+ZB KxvXpWc?Ln;{09^9MjEqueZjX`UM)f~aVmgd_BB$kM;nb#)I8TrZbkEG{GZYh2buX!0FDyrI^ zC#No1a^c2=DR&e#Z)W(Ys7k+^J9A0OC5;{Bd3US@5AP^?A0pM-k@#+IN8%c#w!n-# zf`&cfCikvrczBtqsIn$+(rLGuyRYKNUSY$YtL&3cKmGl==AY%e@77u%Ej~SmHpxtK eI%4o|ZoHzQzbkX>USXii89ZJ6T-G@yGywpPd|clE diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_random.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_random.png deleted file mode 100644 index 21d0683804509c1d16cb13f242ad727f6af53cc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A3R+gLn;`r9$eUa*g=HlLZteQ zR9R!AIZQzZnT*+4cQolHtUTGiQt`|QR~8@U|4Et3YuCJ3G^g)Q^$&X$%eagWjGldS z8_ZQK%WiGs)#zK{Q6!Rko6WP&TxySl8<3N7L|8J=dXbY`PSLy%E^afHGWhrb$p)|H zu1GFR{|Y7LqInw>LB#b1N+$y+2wM8z@F?0W@DC<-J|opaNhbCzx8uYbd>I$ o`%%;LUa9)={L;H8KVIL*s90XSQ6#9VALw@mPgg&ebxsLQ03w%oU;qFB diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_round_robin.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/scheduling_round_robin.png deleted file mode 100644 index 7dbf12c07ba45340fda53eb8d457fb4152296396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``#fD7Ln;{09z582*g?SMqWz)g zCw&A%82T10E?^OEP*r-7|8; zFCUs>DHZ%IV~)o`Kdv%v^Bi#?CrE*H=3+xziwRA+)gKdgS8R@z`EpO1otu5;V$Xx3 uniknH5!cgmZ*yzj0GgJ+=Jn)e diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_auto_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_auto_focus.png deleted file mode 100644 index 8bd5fe8c1cad689057f25aede807004d9f8085c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmV-&0ge8NP)2QkW+8lE5`2zD7N8VrKLs33U5fkuNbFvCO*L)?;XEDRlo zFF1sS<1}a(SHzECdAtWMoW~Gs27f>P(aR5{l>z1AEJeFlKoctu92=x%E-@Tz_vsrxK=csss`}{(?b&F}5_`Z)20{8WU zs6JxO4sB+aZ8XPmFijI71VRYv7yHEZ5pi|tvAVg(?$!$0%+w&Isz=9dpe2XK>9`G| z48BtYYPA~L`_loXsz-8Y9Ia3&5HbiEbf*Xu^V5{79`(C7LI%I20L7p71>?76w<1n3 QDF6Tf07*qoM6N<$f+{GVeEIx|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_default.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_default.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei_auto_clear.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_jei_auto_clear.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei_auto_clear.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_rei_auto_clear.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_remember.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/search_remember.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/slot_background.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/slot_background.png deleted file mode 100644 index 75cd2a71ee8c471217ba145ed3c2d39a00666aa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|7f%<*kP61L2OR|+fZT({$_$IA z3E4UQ)L1BQwWB>&i+TOyJ$ZIFwwFp&>V7^FE;O;jMMX)l)5Apx%KSN-Jt%-Bto_^S QTA%?8p00i_>zopr0LGLg*#H0l diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_amount.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_amount.png deleted file mode 100644 index 32d3749636f9096f1f6a3871512e22bbf230cb96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`n><|{Ln;{09t_N6aTIX9c-wj3 z?MUqkCO5~G8mxjJM0z$GT}ZTN@;2Np;H2>U!~W2#>sFnWZWdpa^*QC7bP0l+XkKf6rZn diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_inventory_tweaks.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_inventory_tweaks.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_mod.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_mod.png deleted file mode 100644 index 02a5a1e3fc03ad483c9eb41b899768a435748b4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vproLLn;{G9(3$wG30SQ`26CW zvpO6+3j|qQ1y~#eX53VNFg2_?!}TSr!7QzP267%+d3Www81Sitx;)QY+qheLwz#yX z=*5$Bwp~kD>-cO-N8gg9&yN&}XD#V^;ZmX!`pksy-XG;+sr_yrADnFl%0B7`%Dn0E z%?@8{T2P+-Rx8hF`9?#&sNGp>56;~!&3>%;+PX(-#ZvQMvP<=PxYfNci3d89!PC{x JWt~$(695kDRPO)) diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_name.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/sort_by_name.png deleted file mode 100644 index 3924534e8655f1799b2142b3246d835171ca731d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr*{o4{qc=Y{27sP+e)O z*q`D8F5d@?CXHr~nY@yjTMiy_+@(Le8G*LRquNze^h(A)sj8ZCC6{lWJ&o6bGG)mC5fmkH+rt1WY!rN@jAoii_*k7-A`gvp11F1 Z+&N$MfSPU8W}pigJYD@<);T3K0RZ6WK-d5P diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_none.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_none.png deleted file mode 100644 index 9f9e9a83aecb97860bc8f0eb1bc627f2fedc4877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr*{o4{qdTGURc%DF4LD zROl@40fz1DOP`+*dATl`;k(E2lsJWefH_L+OWVKyP!=rse$3&VWuZdJoxLBIMZK6A zT6L%)GPO-0K-cArmaXE3_ur4S?>66OVVD>lwk=gv$!ACG`5q3&@_d}V@3$j4Gf;HelF{r5}E*+hC(I) diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_only.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/storage_filter_extractable_only.png deleted file mode 100644 index 8e32cad010a4c839cf8ed040ef8f1fbab955e8fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr*{o4?6N5HsEo%`2J+N zuu0znjwU99CIjQfoKIx|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/substitution_enabled.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/substitution_enabled.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background.png deleted file mode 100644 index 5e7ee4149305de008932c134dbb10aeab9ea325f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;Ax~Gd{NCo5Cg9~{NB}lklJbik* zoAxe`W=H2k^IXG26eO4#rJO%}Fn`H*r?~9*$3LziChd)E!LjVzHDYwqdm*q=7%t-cj%;Q_Rg!PC{xWt~$(697C#I}HE; diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless.png deleted file mode 100644 index 38ae956946b5029da538349a9f91e8f6db4c22ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoR!3HEv_nU76QmLLUjv*C{Zx3$dZBP(ky>PzO zQm2&X5T8len}j4^-$Pv2#3Cfv6?RAjMcmL1`#$f&DG`$iMIt*qL+mVSa_0pE^)ZPq zocK3l!Bou^DspZ64u@ZRdn7}5mD3N#pARlbH5wk1sD96syGHoP!IA?@fEF@%y85}S Ib4q9e0M!6EnE(I) diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_borderless_focus.png deleted file mode 100644 index 6fce83b473a5368ba9b936d4d3e48dad5c26726a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoR!3HEv_nU76Qp-JE978G?-ySsNYD$o3c=-MQ zkK-Acb9GHdDp+4yQY6<$kn3;0wNq-EUZmTj*SZ(0u(erTpi(dm6W_`6L-D*@%tI` Yg4OcOpUtB)flg-dboFyt=akR{0Qu-$3;+NC diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_button_background_focus.png deleted file mode 100644 index 7b887eb937c4e9415b54fe5aedc3126fa1eb51ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4f`JOJ0Ar*{o4{qdb3Xo{M*gv~o zCe7g{V_Jb!v`~zrwHJ3Iug4wsI7Zg3@5|-|Uzwh!y7>GTEsv%p^7Ee*?A|8Rbob9w z_0W@@27+pbTxM_xCo1{0z&Mi=!l$N)s@(nSn|DaXW7@-m_u0&{cxQ-jJ#GuMn!(f6 K&t;ucLK6T#Ryy$j diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_crafting.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_crafting.png deleted file mode 100644 index be2c345e6aef25ee62e9436ce311510bbf64a89c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Up!qLLn;{09yH8q4v;zU@V@ZL zH+QykZD(CO6#j!gtA<&^>!>W>6)1& z=HBRA%Re#PR*BOTB6Z~OX>sABM^eM4wC$eFTe?{tE^#e3a65B*Oy8SXjjwN;f@P9k zuUm1uQI${q%`C>P`;=b0y()Vk(r#=y=j6lbyXtG6zr9@G6)4qp$sq8I$Z4I)&zJMA mm%lHvG;!Gvb?ykgTl`NR_&qi+d}#>uKZB>MpUXO@geCw}mwn0r diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_processing.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_processing.png deleted file mode 100644 index d1aebe5e6596ac5e1f856a70f983f187116635a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmV+~0nq-5P) zRgL_?@P?{JHf`G?BCP95;=MOi3@=nQva!~Zgb*l1gmqm>y!VFehfGzYwU)MRNkRyS z2qHpZt;Jf)CXzK|-h0mHGs)$0p$H)$B7_h)olevmD);-HVHilR*DE4I*L8GVhjWfv zLuFYOisSLfu2;J#XIe4f(Lezn7wlGo#oFS1S6Sq>_UYsU!{a1}@ zB81e9@8fN=HfgO*T3+Gt0&A0&j*bnYdR!pVbnLOmW5C*^rK4kmQX$UOC>7#dji??M zh%_C0^bY7*o3uJMs8NX6ZZ{|u;#`eTD&#N-P@|A(kzWHhbbNYgI_B)`5^?eAGtSjG zS0j`Pajs_ikh9NcAc{0PHr(IcB0ip9BJS^Q5mBVkv7sn(p7;#xW*OxyBRai8$A;-c zj))?Sjt$w@FU%)A<1=t_6d;zfjB=I{onEn8Rm>;fm`}irjuFds!xNu@WwSw?90iCU z{AEVRh{dlp`wsZ$rgY79=^Db|5Vza$?)?Wg8%OoM?&x^*JYLq)u{L3~ kswj$_p2vS`ftEMz4|6$xtqIhJ{{R3007*qoM6N<$g5qnmY5)KL diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_stonecutting.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/tab_stonecutting.png deleted file mode 100644 index 8bd5fe8c1cad689057f25aede807004d9f8085c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmV-&0ge8NP)2QkW+8lE5`2zD7N8VrKLs33U5fkuNbFvCO*L)?;XEDRlo zFF1sS<1}a(SHzECdAtWMoW~Gs27f>P(aR5{l>z1AEJeFlKoctu92=x%E-@Tz_vsrxK=csss`}{(?b&F}5_`Z)20{8WU zs6JxO4sB+aZ8XPmFijI71VRYv7yHEZ5pi|tvAVg(?$!$0%+w&Isz=9dpe2XK>9`G| z48BtYYPA~L`_loXsz-8Y9Ia3&5HbiEbf*Xu^V5{79`(C7LI%I20L7p71>?76w<1n3 QDF6Tf07*qoM6N<$f+{GVeE1xWd_o&C28-zOY6VOdm|-0^YDya zqUzG(DpQv{I&`dQNs{`?8?GgNQrv=bXP!xvF%dIr|JVu?e{|q(Z)b07$GK>i^rago ySn4!A(kzzX?&Y3&_{Rc6#g#vT9;+<+9L(RXW1cbDn13?RaSWcWelF{r5}E)fEKrO9 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_medium.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_medium.png deleted file mode 100644 index 44a88ba76c02a9311e1d1362dcccb256bc722f0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*{Q4<6(^Y#`uzaC`T; z+YhcS)QV~3E?|B2#(aUm2S*OUq>@iO@6&x$O6xi}k`sJXzMeUCs#LbdwWUy7XG@us zw|n}doFchXYkKCiM_KnaZa#VQNsg9|$E!ap4Nk7vbDDkncd-l4?!4Ipw2;Bm)z4*} HQ$iB}lQurH diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_small.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_small.png deleted file mode 100644 index bd3e4859082dc3ac07afd94a5bb99c99f59d53a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`37#&FAr*{o4<6)fFc5G(xLxsi zZoz90(Xa%@unFhtm<10yb2y6hTOH<4R#;hh@NRFP;e;znT*kMz6%>>|o-%Vqsp+z5 z#}qyWJzCh|r2jEs?dpr3d#22saAk+4afe3D8NRTcVrM+xFFXpgi^0>?&t;ucLK6VD Cd^w~5 diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_tall.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/terminal_style_tall.png deleted file mode 100644 index 3f317784f18b691cbb34c20ba85f195897df8aa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*{A4<6(^Y{27iQUBp) zu`4q34hg3;_&hkfrNLQ&J=rHyV9WcD<%g7%*yLx-G!PUMG`yp2{ru*RnKM6V8N)oeZ9? KelF{r5}E*o|2qKy diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background.png deleted file mode 100644 index e16627e03ca3c2592a29eeb786b5b4b239e86b40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!3HE7rssMAsT5Ba$B+ufwFeLKIyi{9UVQyj z+(AU8Dxi&Z>V|*=Z$i{d4tRtl+_Mb5&uh-+Xm(Cmbz7?H51Hpj<#U5S3#lD)nZY5P zsN~bqX&?yY2-VzLw#;RM>~mMmM4^;wuPIdwjAA@*tY3P60@}ym>FVdQ&MBb@0RMzC Aod5s; diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background_focus.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/toolbar_button_background_focus.png deleted file mode 100644 index 75e1db0b6f109f3ee18a06266c4b3cc4e96511d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!3HE7rssMAsWeX)$B+ufwFkX`Q?K~r7q?Q#JW_5Y{obAAY_ z9den$A)Kh>)6!`G;|RqRE%FN3Gf#VK)1%EkcaCvt<#J~xznsPgw35No)z4*}Q$iB} D;Uze# diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_off.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_off.png deleted file mode 100644 index 77b705a8ab69789e54393f523c0040dbd0c3c576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr*{w4?6NP8}hgwe6I0a z;EzR9k|4_gB?DvO0{^wEG@_T@3bsBh-`$booT#WY$@iFw(j@+<>|?VJ`L=dmshngL z)7UTDDX;%y Sti%Mgo59o7&t;ucLK6V7RXzX! diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_on.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/transparent_facades_on.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_all.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_all.png deleted file mode 100644 index fdade31e697d17c9d6edba1982754d9ca8981f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+dW+zLn;{09^B~bY$(w1@P7Z5 zX+}X(yH*F?W0-fqcFILz<~@uyjp-hq)3ubBIGmcQY0)C0a{7^C%)##;pEJoC7fTr) zJHXGxYyA1{Y3umB>DtE+Pm@SaINEmZZBgoxwsRjhq#ik<-=Sh|{9Ia?`OKM@K0HRo z%MC9Eoc$7Fy!6Z(&JveNmo-wCEuFQpl=BX2Sci%}lw%?nQE0c{ZoXf>|L?!b^Fxfc k>NN%`ophb_Ilq>{-P=KRqObK#pcfcCUHx3vIVCg!0Lds{3IG5A diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_fluids.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_fluids.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_items.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/type_filter_items.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/unlocked.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/unlocked.png deleted file mode 100644 index 285623bb8a767cab17d44993abeefc8beba71769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*{o4<6(_WWdvQQ9tZ_ zq0ft=9cN!nNs39Tm;l(8_{O%zCPG*@JwRtW}qz?n_ OW$<+Mb6Mw<&;$VKH9UL( diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/valid.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/valid.png deleted file mode 100644 index 67a815ef8a852f807b026a48e13b96c4dd9ebe1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*{E4>Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_all.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_all.png deleted file mode 100644 index 025a90d8f5eae1ac258f864085823d6efde670df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8$DedLn;{W9^9CF*g&A|Vt-e5 z@6^7jr==Z)HS|wky?QPx8xcn{KmgVk_Klj|fDy{X}H5c`dPUpOLgqMLhN8+FE gaXIJxA-|TWm_2zG z>wlSdFO3`77nFYXzV<;zB%e{8b)pit@~Y{)eo}KIRf78zb_7&SCI$^>bP0l+XkK2G>dB diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_stored.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/view_mode_stored.png deleted file mode 100644 index 1979bd57f88fd80c7f65fe596e164c556e2ee556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr*{o4{qdbHV|OFP=Dcm zM9I3Cdkj7ggTe~DWM4f1oK7G diff --git a/src/main/resources/assets/ae2/textures/gui/sprites/icons/white_arrow_down.png b/src/main/resources/assets/ae2/textures/gui/sprites/icons/white_arrow_down.png deleted file mode 100644 index 579ffcf430fb360abc032c59d35f69c581695ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*{o4{qc=WFXLX@x1%{ zjW1%B?qM`){B6KioWi#&M6&5o{DXj7FGM(ZI`27t-_%o4b4LP?5u0Rlk7H}g5{1BQ z-8mAR-_OmgRxeiG_Ix|P+&N)q1I8d zNU+gVPG`e6>ov{>JIwOcJX9vS2zeq1lO1a3>u&qA@O4bzd=qE{gQu&X%Q~loCIIRC BA8h~t diff --git a/src/main/resources/assets/ae2/textures/guis/states.png b/src/main/resources/assets/ae2/textures/guis/states.png new file mode 100644 index 0000000000000000000000000000000000000000..d29dd63c06f8f074e1c0dbe570102dd81f479bf3 GIT binary patch literal 12581 zcmeHtcT`hL*Y_l}&|8;b zNoqkP3jY(X>aqUwHa<~uNy24`VlJS}-*QRZ_U5ne*Bqs}?oB|s*x*t=i3vGX5{CKS9$a3;vnCy5w*2V^tHABYm=RJLiI$Z1vI{`5gSIi7x8owZ~2tY$l3bdLk1JQWOlMEviLEEA@G8yMg+>i=EGW zLO!>3^f!q1ENQGxO`m5GrVGJ%-TZ!Cx6w$giTM5gYD`Ca_tXH zhgHnQqtNB73NzK)p{~QPxmtGEtch;nPhs65NwyxB6AxvD^Vin8UtSXMtfOO7`<^7E zl9ZWeA^~4;{$&`5_GSH5THo}P>a_vzkBc7hkBxEgN}i>rbuRkl^BY$c zdfqLT#-M+T_+D1WTrf02YkPPT&>AUk`6n4-Z#$%&rOOUCqC$4WR*r$NA!PaJ~cxR7OrgRYqA= zUe;7jPF3cZs=V@18R+3}@*a4iQ{ewgdUyDs)&A&oJ)#fPe&Fw-KgQH~g4Z8!f4sU9 ze-9=!`uDI<#X0`rf)DNr0sq@h28Q3(b36CQAtJdpXfdwPQLy)Z^8*@h)0MkC_sO6g%_|Ha>*{qVoo0tEfvM*bsy|4Y|@>H3ct_>YAD8(sgU>px=PKN9|Lbp3y$i{;Rk=*lOaj1gMb7SKm;V zX_`rp8zFjWD54VpG|<;MVHz+rXX93GV-^_JGk5Ul**!va@{dpJ!42Hg^b7V33A0!y z8F_N_9LACp9FI?&(mpuc+k1KM17@SX!c&a-qAQHr_dl{4Akw;Z`3zvvaONB5kHFrM zu{Y%y$-*LHC-VJPJ6@~$Kk)l#85}wn??+wk#?Qah*t7}GZ0cVwUbPWiC`18p4fj5| z;WnmBlWYONa~$=%JaMOr>AowERBHZqhO~vB6g>c^NeXf^oh2K$q2qL-F2jFo@00o2Rf>$#B=?61px&+56Q5M5bmxpr~VSE zHFv5Id?q4Aor@>C(B~>(vSyHDZ7`yUy`DdUn)60UZQS*EvX-yTB7rw4oJ6KwxIQ%^ zy&`f4(Mj&%c+fxxw&_QWu(ua{L+KDOkVWrl!;!m8uY&}k0GPa6YbuaK!F6s$RiFH< zZ=U1#RD6e)4MS!LdQx&eze*ag*k0vv(M%vTNdzfg+(+r4s0RG&215lJplG-MUrXi^MWi_MR`tILY*jXjI^>8-l* z*wD%C`?rDRjS{xLKwdLFb{_NNP1W8A@z(rt0KW#B#UAq#1D`E- z{8*7asyuMTre1>e=F7rr2~}w`Li!zx=jL|RH)M5e;VoJKkFl>3xGzE(;7g`11@!kT zOACa%8{iA;W4lJ~N~jciG;6e&03F5Zz-hHWT_n2Xz~KG>E0njPggBSTXt%1v;KNr% zNy;1;G3Kn3PRKhJo|!2f=i+!4m)5y^H3&bym%M*9dA=w;ijmpP&>qncNAZo7lF z8C%`sDqdd1bT;q8F`c4ASG0x#PJoP4PXs^$vityVSA-BKz+!W230-W`n@H>B$`th_ zn5i0LRA>dY$~aSBhbq>ZCr@jADtOZ z=0MF2F3V``&GJC0iWSr_wUBp8*X4}`D!AY$xA^3p-hQg{$yak@6|!&7R8(Nn0)WrK z96RACG!_&7O04V=m&mR6V)>29PV9Ao z^oI@|dYSA&W11VidGl~vTN{Mb zx@X-usoCcybK93M`1tL2k37y?h&9$ZxRiO!>pr>Q48n*-U-C5_?u%XXtTb_p>c*@C z05{wdax|-Gq&KT+)9#0m#^w%JWLb8TF$FE@;_aO@vO`r)-fO;Rb%m`@%z%xnh@4p&h7=# zUNaKP2@;$sAYS5J^qEbtXEr<{xzWcfg=3m5J@Gw1GjC<4A8HO6zNVda++Rx4@(FpL zq@~Vr|M?F?89_fJ(i9bC1Mkfl*{DwAu?odNk-wSFQ z*sZ;mCPGFSg%Xg4c>x^2gt4=l`oR=`Ig&(XK3}ye89nTXPKKc zq?nnZM!PB}bEfBoieh)u(nq%%-B2hZ0})e3}lXuj~-mCTzxG9U}*8M@XhQ6 zipwU8re-n{O}{3i#fCB+JpoAPCbr^we4lnBL%$VUW>5)qhswpNJj-;`A31+cIaR6$ zhz4iX2Yi32t?(qkXv$}VO2DWa+h4?R&{9u}u1yxd_Zq(%I9|il11}wp}jZW&q>D@4ybmNye{ir~r3re)>qh&L`WaD~jrR2AzCq1{fq#QRI5kE5nE$mh= z4l<#KZ)=p56dQCFalrH18}eb1%X@CTYtE0+W_huM)p zfaG;Sh!rNs13tGI9m*Yg@8YNW!gqvRo8x*>E#>>Bi^|h)782`Kr>l)-)$5b``@OV7+%T%#MpVKZO7xt$Im^Ir%Xj! zHYqiTtCMN0?f`dJ#J0)G)KogMh35kM1uvLbT8o)+XLc8p=UQj)o2fy0<4AzNKG5Gb zNy~Yf@|7;ZZ{VI0U-bja`;URWil?8@9zyn>1XQ3|C@in-+M`9FB_TrHn-E^-r6z>g z_;M<(AcO%W=qb`X;FWR>!Isz52(9U=%zQGxwu`?@zY%fcS4GT;Zb{K^qr-`Ix-QMm zcGXM9M-CIYNOFeE`!1TDJ7cE*Cq z!9tpTws^O74e4}qH8b}!`tasQJG&5cw}%G;UqV1Rw|9~%qhYgwRa1(F zTjty);th6vc5jC@)yjqHj1Dm3MQ+gVi+N0E751HnBhH>#ilScB7jaO<&^IP*nNCWqx@2WdewmuiX zpMvo&Ui>s_?4_s%-o027zv?VYE89zYeB;|bk5`rDsX;&-<;`c#d7N%=ir3Qk<9LUl zbnvVMm;05T&y+{kUgGv(6818hv6O7MT1F5ANcyZVTmw**eC7^PG>D8#JY{tf;~OBG zFZr2_ zEtJcB?j^ef!Q+e6LDbbkd6SPRq&xQT7&F$)cl#=Rdq}gNQ|Vc8B()f6e%*v40%wgF z%+0*dW7Y>KjjNZwFY=vn@42((T3Gc)+az%SU!8MVgPsSO?Gl`I--A%gF4Xv= zwE!LRWHm+TP|i!Kj%sQ#@{KTNim(6PYoc3a^I*K<5t z_h?$eIe-%Q<(&?-=L2oM!!Ci=RV8SDNqEu)`Oq*~VRIn%jEh-E<&%^LJeS?!SpY_^ z>vO)_2xWJTR%Ms?vt?Fklb7$qW|&raVOWZAM|lz zA~1W#C}7Q+-__7jW^^a9r9VSDGKNu5D-}U@p_Dp?cMsWe!?=R8jOknaZLx^&9Vz)1-#clZ+(_65_Cnx zhR{fYrt9?LhoFRn0Mph0;HR$OS2{$cBJUVd;sx_6o9xN}oAAYJ&wXULWVCbV@Z3Yq zuKI?iRV;1{9Qx*!+IC0i#jLcFz9)hjvxI7DW$xiw|3L}uJr#;|diMOmDIsh>(R%zW z1(l4*SK_GN52o*=HTxT$tT-;e=V_BEe<>59qC^c*DQ4pdZf3IxUR16#$7jl*+3O_- z4489=+FC_YBI26nl^aI1_gcvOsOIix0i!?eH<@x8ACPx@nrBs7>RmjW-}U{@IKJoZ zxa;V4x&hf#r}N>kStp*aYJN4HLyS8@o7K5b2b+Abvy%=~UaGMAxDGQ5WcW40++fsY zN&ij`v(EWahud!xn>LVgf|N}KYfJ%y6@Dl5?9bo&!H|~xum}hf)@tV-T7`~kL}Ac} z%3u2=&Pg3y8Y%n+%Z+3C)n`e{o(o)6X_v_;;l208!FTXk*9Y6fGSUd);kK?fJn{WA zjwkE*%*GAP8o~P&5INCR)Iake`f%`t^BphlNN0|6T5hX+w)GvZ-$@&eB^V_3z8U$o zx>^5oT#YesEpgxE=Fkixq%ky=Og6t+Z0H-TbVG9I$BW>GW;@wRrQW-T+zpO$eRvXF zz{&XD^5C$!o?kOjg(z#CEER&-OpprEgH;SZ9PF^IR#!vy-iom*(Ly+N&9?8PkI;oL zbO(buc5Psla$#4i`FMBQmzgg4lfOz_A8vpp4COR^+Uv8bBO0!{wj*={vR+3IdI;u0 z9~>*F=?cmG8%N~{%K%T}zk}Kz$8O8#w}BIv31$q*Xzz<#-S0LmC2Tf6=lUv9-C{(E z8YMh&30uq{${b?#AZ)r~UncBwt6L-DqyLztk=`(G*8b&aCIC3wn-2^q3$~zb(V#uH zjdJ{)8%$J{F;ab&wWh2Q+DdvmbMS!5(7IaiH{v&V*8b*KRU-SDWkE~)n%Z}ypo;ij z7(oM6@C-RcTiU^+EpP7uW+EC3uudH;AAGG_W7!5Nl^&2ie1#QYL!PFWaYaP9C&f{> z?jDpsLb((lcz$VF?9qUGL+UGL@L_T&KhcgG_L!+fseG1p=CEeosVbGzab5f$HOV5H zTnY1Ua~PmgFV}clxNNwYZ6yY#x=+IPrzlSs9+mpVA`}37R{a6kFYu8|DWdRu%%r31 z>u)2NBNiO?foTh}R8t({R}>H$yZtWa`C4&~vGwaC{09Lbw-8S{(&XrQfSDHKZS(ts zawrb@*%mGUf{n3L2iXcOaU%>hZlQ#GM8lY_SW*eJ7o{^+;5AD6K==01-D*RY@fqDH zaU>`dhEIr+#1(ki3`Y_k(%Xsv{ICdz`b#JYEs$dw6*xeDlRsX)I`ukF#^CMHejdB} z@ePAld*72*E?*IR@9UgCJ)dg=Lt~0N=5Mcj5!~pEjx>!f8(F*i#`(Q#i?B&d%tC0@ z=E2R@2ew~bYo}jjedVp&%{4R98w74nYaaV`ZfZc+=ep`>D;FRw)vOi%H26i&X!>Pztv%;yoUxjvbw-ivh>1)p)*YFT>E}^5*=C-w6mH` zWyBzU1%T}Ip4)aGRS*EHqJ!O{5GgGr-p$yio!dvH4cp(GQ1b?&HHg$G1S?PX3_DB* zg%t&0`w)DhAi`I8?1hLxN$7Q&I4XV|MTb2Q3ZIa`-o=XM!y|tJ4oEG45x0-7Br5a+ z6-(HpZ)C_iIg?H0PUy+f9BYtB7W#0hF`;O~w>ISUvMu$(9)qY5kl5xYR!&a$7`RyI zy;MLs4LcS-DQ_b=shz2Ev_H9ddZx|o*QufXw6Nzr!b-Y6Wv5|(OEVB&q3Lto5uTD_ z@nvoqome$@Rv#LNs{1S0EWX%nKTg9;I z)R1iY^jb~Tw$o1X0ZfA3nOBpW!<0xS{v0OsJUn-3p{$r%#J@17ug8q)M0x}+bE-|H zGPERn5~?!2**y%$m{Wz~XPdBi0dVM{d&g+yP|-7vES^B81qKWXgoQUhcB{8Ej}m{E zA)U>0_{|5SsNzeJYrtLz zG#_6!g0?d=>L#~J%{PmS1PZ?rq>}^z=;CPMi4I%he68Y9u&ja%-ZvV#1x(6;gvVUb z+;o+q=$Im=O=wdAB^flKH-_0HAHEE{N@0 zmJJxF(h;2)0d)j=ILNxtSxqx{W0GYftni0J=nuJq zSoyuR{;)k<*MdR~tO~vd5}yCs_GgXmTDY-&5iF8PdSSG(AJ$cO>=U1SBJr1Br%;;U zpAiv#GWM=Qq@#tr@Gpr?Jfb7=W6yC=MtLO^Xb6#FEygEf$QL8rT+NDvP;ju#Sfl~6 z!XsvzI7m|dW-EgqKffM!d-JS1(6(F&q4t3`StF3h6l`!Q!CrFh$IZaF|*V4e(gnm4*k?v~eOV&%N<6qIO6d zz)yT!QclmY*#Rx|rS1L|r$p>avq>v^Ne>V*{UZu5^Gnp#NNlivLBv;PJOPPBPlmw+ zDvx{wCWp~LB?`Rvq2qvquW&6ATnz?1{Z{<=!mMYGTW5L9|ax2v<|kfx5N1R zUDRNo06f7bHadqtn zQlxE#ChhELgO>q|XN$6?3m2 z*R?Si{VyOa{NmDU;YU(iV&};Tx?9NFK0zBw3*R!2@0+tL%+pzEqVzBXy%M#@qv-l` zEJ@5jZ%%7V0Yw5|&@AsoM;*|v?B;40JSa1(M6YHedNkmJs{m3Z9X!F&I+_ENd(9bs zgRNbM^D=ZEqu)&mK<4*|2$(Gg`K2F}8$h@MN$ z;)mRt!VAF|igSsN`{t?n@bb4ab`{^YwD?;e<&^2gFA$s3$Yc$wCM79s=WGA{-ixn3 zDPN2T<$2fsgo6p_giORKqfos(VH?PI3!_iAuV646Wr`O5w+3DLlh-Xt9Q39u+41o; zorlM-m#HU6->N}Q3VD99h)5jW+kNKk9=ha+mLImhRnHZgsn{@VWrFPzC3xA=(tBj) z&KHW;x_G_In}ix(32PbSc^J3h*xM0=We9p-XJ^kL`t|dh;MJ$AX>W2T)%k3n$Z#P= zk1odO>C^aA%Ali%r)dToKnpc6(je2YNBBD+w3&MBd}z;5PeMJArhH?|u6l#UWOu;r zg3F8PsSM;jfDeI{Xy-gG--`ry_G&DHklvbgU{F~A$6ovyqdcO69H~hZX!OYOJ@(UZ z*dyQA#*-`b$JO-4Xu6nlSD5CbP0b~=rJupj!XXPe+P0%ru`Csf?qcIr@unG5q>fL2@iF;~nOJwkNssDJ=L|DT_pSb7l$7CZ6m z=QH`pyM3;=-d&!lB0ldNI(+>IrQZD0bE$o7Kgc~nzXqfB^J~=%&qeWYkg*2_0(T}y z2*sAr5mHJz>OtT6_X8tOu9fw7O#B3EsnsBM%;A{|-V18ZG zlpa3ELVBZXJj3Uvbn5OQ28VDsxFbeeeM)FNyB((mOebl1U+(&$Zx9?~q)g0LGg0Q$ z!FJmf<^4#k;=G5pZN*IvaaItxN|&0XT;e6M>7)=TeE5oxGy>WFfvKg(57(}^7<6y$ zm&}C1fQ-YvwviJFyalQOm9g4mlarEj5*oK{X;0)%9|d)|BeSeenS%DKy%)NC+lyw3 z%xYP+s|D>D3Gj8cXIY(nAvfDYirt46U*ERtM{+!1BJl<9Bdcd(TWi;^KX`$zT6YdG8-~DD!2OR z(LC#z+`|)x&yHYPxGnM;g&e9YjTd}%$&Xs3)&|@2p2hTZcE^XrXb-9eUumB8xHlU3 zI+wxs9`{4>HpRze;><9V_J>Z_`xwk8YKlB8(eD-lNms95bK|_9J=0^qf3W?dOdNV* zy_;RGVyaBqXWY;}yOuD22R0!Ru2)u*z=7RINv(Y&x8ma!xu(caInaHWTC-@0mo8&j z)JSMT-)Wi`b%x()H{|Crdz{I>PPlj>Pq*N1u3rJUf^zzaDF$1IZd3~#b6t5`C-Qdnzy#hQA~R9bw_`WFn;bEv+Kl&GiC4+}K* zTbb0965SgM^5(7_A5XCpUrflt7_&bcD>s{HvAPuWOFrA6!wp z7%G?`HRIWdYe`l03YqI=o@RQnx4+(|Fa|4RGa`|v^~2PB-_&sXJb4+`A0)86t-Y;| i+Vr*$0DYyJJIHSl64izlrzns=KwsBLr&P=S>i+=?hv(S< literal 0 HcmV?d00001 From 1a277e6db0e11720a33298e7c6da7aa2b8db3dc9 Mon Sep 17 00:00:00 2001 From: shartte Date: Fri, 9 Aug 2024 12:49:33 +0200 Subject: [PATCH 13/14] Network Ticking Optimizations (#8131) --- .../appeng/api/networking/GridServices.java | 55 ++++++++++- .../api/networking/GridServicesInternal.java | 4 +- .../crafting/execution/CraftingCpuLogic.java | 10 ++ src/main/java/appeng/me/Grid.java | 26 +++--- .../me/helpers/GridServiceContainer.java | 13 +++ .../appeng/me/service/CraftingService.java | 91 +++++++++++++------ .../appeng/me/service/TickManagerService.java | 14 +-- .../helpers/NetworkCraftingProviders.java | 27 ++++++ .../api/networking/GridServicesTest.java | 56 +++++++++++- 9 files changed, 233 insertions(+), 63 deletions(-) create mode 100644 src/main/java/appeng/me/helpers/GridServiceContainer.java diff --git a/src/main/java/appeng/api/networking/GridServices.java b/src/main/java/appeng/api/networking/GridServices.java index 5351bd9a8f2..884313a64b0 100644 --- a/src/main/java/appeng/api/networking/GridServices.java +++ b/src/main/java/appeng/api/networking/GridServices.java @@ -27,12 +27,16 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedHashMap; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import net.minecraft.world.level.Level; + +import appeng.me.helpers.GridServiceContainer; + /** * A registry of grid services to extend grid functionality. */ @@ -92,14 +96,37 @@ private static boolean isRegistered(Class publicInterface) { *

* This is used by AE2 internally to initialize the services for a grid. */ - static Map, IGridServiceProvider> createServices(IGrid g) { - var result = new LinkedHashMap, IGridServiceProvider>(registry.size()); + static GridServiceContainer createServices(IGrid g) { + var services = new IdentityHashMap, IGridServiceProvider>(registry.size()); + var serverStartTickServices = new ArrayList(registry.size()); + var levelStartTickServices = new ArrayList(registry.size()); + var levelEndTickServices = new ArrayList(registry.size()); + var serverEndTickServices = new ArrayList(registry.size()); for (var registration : registry) { - result.put(registration.publicInterface, registration.construct(g, result)); + var service = registration.construct(g, services); + services.put(registration.publicInterface, service); + + if (registration.hasServerStartTick) { + serverStartTickServices.add(service); + } + if (registration.hasLevelStartTick) { + levelStartTickServices.add(service); + } + if (registration.hasLevelEndTick) { + levelEndTickServices.add(service); + } + if (registration.hasServerEndTick) { + serverEndTickServices.add(service); + } } - return result; + return new GridServiceContainer( + services, + serverStartTickServices.toArray(IGridServiceProvider[]::new), + levelStartTickServices.toArray(IGridServiceProvider[]::new), + levelEndTickServices.toArray(IGridServiceProvider[]::new), + serverEndTickServices.toArray(IGridServiceProvider[]::new)); } private static class GridCacheRegistration { @@ -114,6 +141,11 @@ private static class GridCacheRegistration { private final Set> dependencies; + private final boolean hasServerStartTick; + private final boolean hasLevelStartTick; + private final boolean hasLevelEndTick; + private final boolean hasServerEndTick; + @SuppressWarnings("unchecked") public GridCacheRegistration(Class implClass, Class publicInterface) { this.publicInterface = publicInterface; @@ -130,6 +162,19 @@ public GridCacheRegistration(Class implClass, Class publicInterface) { this.dependencies = Arrays.stream(this.constructorParameterTypes) .filter(t -> !t.equals(IGrid.class)) .collect(Collectors.toSet()); + + try { + this.hasServerStartTick = implClass.getMethod("onServerStartTick") + .getDeclaringClass() != IGridServiceProvider.class; + this.hasLevelStartTick = implClass.getMethod("onLevelStartTick", Level.class) + .getDeclaringClass() != IGridServiceProvider.class; + this.hasLevelEndTick = implClass.getMethod("onLevelEndTick", Level.class) + .getDeclaringClass() != IGridServiceProvider.class; + this.hasServerEndTick = implClass.getMethod("onServerEndTick") + .getDeclaringClass() != IGridServiceProvider.class; + } catch (NoSuchMethodException exception) { + throw new RuntimeException("Failed to check which methods the grid service implements", exception); + } } public IGridServiceProvider construct(IGrid g, Map, IGridServiceProvider> createdServices) { diff --git a/src/main/java/appeng/api/networking/GridServicesInternal.java b/src/main/java/appeng/api/networking/GridServicesInternal.java index 1dc48c057a0..1ec2dc67ae4 100644 --- a/src/main/java/appeng/api/networking/GridServicesInternal.java +++ b/src/main/java/appeng/api/networking/GridServicesInternal.java @@ -18,14 +18,14 @@ package appeng.api.networking; -import java.util.Map; +import appeng.me.helpers.GridServiceContainer; /** * Allows access to non-public features of {@link GridServices}. */ public class GridServicesInternal { - public static Map, IGridServiceProvider> createServices(IGrid g) { + public static GridServiceContainer createServices(IGrid g) { return GridServices.createServices(g); } diff --git a/src/main/java/appeng/crafting/execution/CraftingCpuLogic.java b/src/main/java/appeng/crafting/execution/CraftingCpuLogic.java index da0a3878c98..2c881cf1453 100644 --- a/src/main/java/appeng/crafting/execution/CraftingCpuLogic.java +++ b/src/main/java/appeng/crafting/execution/CraftingCpuLogic.java @@ -49,6 +49,7 @@ import appeng.core.network.clientbound.CraftingJobStatusPacket; import appeng.crafting.CraftingLink; import appeng.crafting.inv.ListCraftingInventory; +import appeng.hooks.ticking.TickHandler; import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.me.service.CraftingService; @@ -75,6 +76,8 @@ public class CraftingCpuLogic { */ private boolean cantStoreItems = false; + private long lastModifiedOnTick = TickHandler.instance().getCurrentTick(); + public CraftingCpuLogic(CraftingCPUCluster cluster) { this.cluster = cluster; } @@ -390,11 +393,16 @@ public void storeItems() { } private void postChange(AEKey what) { + lastModifiedOnTick = TickHandler.instance().getCurrentTick(); for (var listener : listeners) { listener.accept(what); } } + public long getLastModifiedOnTick() { + return lastModifiedOnTick; + } + public boolean hasJob() { return this.job != null; } @@ -509,6 +517,8 @@ public boolean isCantStoreItems() { } private void notifyJobOwner(ExecutingCraftingJob job, CraftingJobStatusPacket.Status status) { + this.lastModifiedOnTick = TickHandler.instance().getCurrentTick(); + var playerId = job.playerId; if (playerId == null) { return; diff --git a/src/main/java/appeng/me/Grid.java b/src/main/java/appeng/me/Grid.java index a60f4b6de8f..1522869dcb3 100644 --- a/src/main/java/appeng/me/Grid.java +++ b/src/main/java/appeng/me/Grid.java @@ -48,7 +48,6 @@ import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNodeListener; import appeng.api.networking.IGridService; -import appeng.api.networking.IGridServiceProvider; import appeng.api.networking.crafting.ICraftingService; import appeng.api.networking.energy.IEnergyService; import appeng.api.networking.events.GridEvent; @@ -58,6 +57,7 @@ import appeng.api.networking.ticking.ITickManager; import appeng.core.AELog; import appeng.hooks.ticking.TickHandler; +import appeng.me.helpers.GridServiceContainer; import appeng.me.service.P2PService; import appeng.parts.AEBasePart; import appeng.util.IDebugExportable; @@ -71,7 +71,7 @@ public class Grid implements IGrid { private static int nextSerial = 0; private final SetMultimap, IGridNode> machines = MultimapBuilder.hashKeys().hashSetValues().build(); - private final Map, IGridServiceProvider> services; + private final GridServiceContainer services; // Becomes null after the last node has left the grid. @Nullable private GridNode pivot; @@ -103,17 +103,13 @@ int getPriority() { return this.priority; } - Collection getProviders() { - return this.services.values(); - } - @Override public int size() { return this.machines.size(); } void remove(GridNode gridNode) { - for (var c : this.services.values()) { + for (var c : services.services().values()) { c.removeNode(gridNode); } @@ -137,13 +133,13 @@ void add(GridNode gridNode, @Nullable CompoundTag savedData) { // track node. this.machines.put(gridNode.getOwner().getClass(), gridNode); - for (var service : this.services.values()) { + for (var service : services.services().values()) { service.addNode(gridNode, savedData); } } void saveNodeData(GridNode gridNode, CompoundTag savedData) { - for (var service : this.services.values()) { + for (var service : services.services().values()) { service.saveNodeData(gridNode, savedData); } } @@ -151,7 +147,7 @@ void saveNodeData(GridNode gridNode, CompoundTag savedData) { @SuppressWarnings("unchecked") @Override public C getService(Class iface) { - var service = this.services.get(iface); + var service = this.services.services().get(iface); if (service == null) { throw new IllegalArgumentException("Service " + iface + " is not registered"); } @@ -224,7 +220,7 @@ public void onServerStartTick() { return; } - for (var gc : this.services.values()) { + for (var gc : this.services.serverStartTickServices()) { gc.onServerStartTick(); } } @@ -234,7 +230,7 @@ public void onLevelStartTick(Level level) { return; } - for (var gc : this.services.values()) { + for (var gc : this.services.levelStartTickServices()) { gc.onLevelStartTick(level); } } @@ -244,7 +240,7 @@ public void onLevelEndTick(Level level) { return; } - for (var gc : this.services.values()) { + for (var gc : this.services.levelEndtickServices()) { gc.onLevelEndTick(level); } } @@ -254,7 +250,7 @@ public void onServerEndTick() { return; } - for (var gc : this.services.values()) { + for (var gc : this.services.serverEndTickServices()) { gc.onServerEndTick(); } } @@ -354,7 +350,7 @@ public void export(JsonWriter jsonWriter) throws IOException { jsonWriter.name("services"); jsonWriter.beginObject(); - for (var entry : services.entrySet()) { + for (var entry : services.services().entrySet()) { jsonWriter.name(getServiceExportKey(entry.getKey())); jsonWriter.beginObject(); entry.getValue().debugDump(jsonWriter, registries); diff --git a/src/main/java/appeng/me/helpers/GridServiceContainer.java b/src/main/java/appeng/me/helpers/GridServiceContainer.java new file mode 100644 index 00000000000..7c2f17b21ff --- /dev/null +++ b/src/main/java/appeng/me/helpers/GridServiceContainer.java @@ -0,0 +1,13 @@ +package appeng.me.helpers; + +import java.util.Map; + +import appeng.api.networking.IGridServiceProvider; + +public record GridServiceContainer( + Map, IGridServiceProvider> services, + IGridServiceProvider[] serverStartTickServices, + IGridServiceProvider[] levelStartTickServices, + IGridServiceProvider[] levelEndtickServices, + IGridServiceProvider[] serverEndTickServices) { +} diff --git a/src/main/java/appeng/me/service/CraftingService.java b/src/main/java/appeng/me/service/CraftingService.java index 63ad0f4013b..24ecdd70aa5 100644 --- a/src/main/java/appeng/me/service/CraftingService.java +++ b/src/main/java/appeng/me/service/CraftingService.java @@ -71,6 +71,7 @@ import appeng.crafting.CraftingLink; import appeng.crafting.CraftingLinkNexus; import appeng.crafting.execution.CraftingSubmitResult; +import appeng.hooks.ticking.TickHandler; import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.me.helpers.InterestManager; import appeng.me.helpers.StackWatcher; @@ -123,11 +124,15 @@ public class CraftingService implements ICraftingService, IGridServiceProvider { private final IEnergyService energyGrid; private final Set currentlyCrafting = new HashSet<>(); private final Set currentlyCraftable = new HashSet<>(); + private long lastProcessedCraftingLogicChangeTick; + private long lastProcessedCraftableChangeTick; private boolean updateList = false; public CraftingService(IGrid grid, IStorageService storageGrid, IEnergyService energyGrid) { this.grid = grid; this.energyGrid = energyGrid; + this.lastProcessedCraftingLogicChangeTick = TickHandler.instance().getCurrentTick(); + this.lastProcessedCraftableChangeTick = TickHandler.instance().getCurrentTick(); storageGrid.addGlobalStorageProvider(new CraftingServiceStorage(this)); } @@ -137,44 +142,74 @@ public void onServerEndTick() { if (this.updateList) { this.updateList = false; this.updateCPUClusters(); + lastProcessedCraftingLogicChangeTick = -1; // Ensure caches below are also updated } this.craftingLinks.values().removeIf(nexus -> nexus.isDead(this.grid, this)); - var previouslyCrafting = new HashSet<>(currentlyCrafting); - var previouslyCraftable = new HashSet<>(currentlyCraftable); - this.currentlyCrafting.clear(); - this.currentlyCraftable.clear(); - - for (CraftingCPUCluster cpu : this.craftingCPUClusters) { + long latestChange = 0; + for (var cpu : this.craftingCPUClusters) { cpu.craftingLogic.tickCraftingLogic(energyGrid, this); - cpu.craftingLogic.getAllWaitingFor(this.currentlyCrafting); + latestChange = Math.max( + latestChange, + cpu.craftingLogic.getLastModifiedOnTick()); } - currentlyCraftable.addAll(getCraftables(k -> true)); - - // Notify watchers about items no longer being crafted - var changed = new HashSet(); - changed.addAll(Sets.difference(previouslyCrafting, currentlyCrafting)); - changed.addAll(Sets.difference(currentlyCrafting, previouslyCrafting)); - for (var what : changed) { - for (var watcher : interestManager.get(what)) { - watcher.getHost().onRequestChange(what); + + // There's nothing to do if we weren't crafting anything and we don't have any CPUs that could craft + if (latestChange != lastProcessedCraftingLogicChangeTick) { + lastProcessedCraftingLogicChangeTick = latestChange; + + Set previouslyCrafting = currentlyCrafting.isEmpty() ? Set.of() : new HashSet<>(currentlyCrafting); + this.currentlyCrafting.clear(); + + for (var cpu : this.craftingCPUClusters) { + cpu.craftingLogic.getAllWaitingFor(this.currentlyCrafting); } - for (var watcher : interestManager.getAllStacksWatchers()) { - watcher.getHost().onRequestChange(what); + + // Notify watchers about items no longer being crafted, but only if there can be changes and there are + // watchers + if (!interests.isEmpty() && !(previouslyCrafting.isEmpty() && currentlyCrafting.isEmpty())) { + var changed = new HashSet(); + changed.addAll(Sets.difference(previouslyCrafting, currentlyCrafting)); + changed.addAll(Sets.difference(currentlyCrafting, previouslyCrafting)); + for (var what : changed) { + for (var watcher : interestManager.get(what)) { + watcher.getHost().onRequestChange(what); + } + for (var watcher : interestManager.getAllStacksWatchers()) { + watcher.getHost().onRequestChange(what); + } + } } } - // Notify watchers about items no longer craftable - var changedCraftable = new HashSet(); - changedCraftable.addAll(Sets.difference(previouslyCraftable, currentlyCraftable)); - changedCraftable.addAll(Sets.difference(currentlyCraftable, previouslyCraftable)); - for (var what : changedCraftable) { - for (var watcher : interestManager.get(what)) { - watcher.getHost().onCraftableChange(what); - } - for (var watcher : interestManager.getAllStacksWatchers()) { - watcher.getHost().onCraftableChange(what); + // Throttle updates of craftables to once every 10 ticks + if (lastProcessedCraftableChangeTick != craftingProviders.getLastModifiedOnTick()) { + lastProcessedCraftableChangeTick = craftingProviders.getLastModifiedOnTick(); + + // If everything is empty, there's nothing to do + if (!currentlyCraftable.isEmpty() || !craftingProviders.getCraftableKeys().isEmpty() + || !craftingProviders.getEmittableKeys().isEmpty()) { + Set previouslyCraftable = currentlyCraftable.isEmpty() ? Set.of() + : new HashSet<>(currentlyCraftable); + this.currentlyCraftable.clear(); + currentlyCraftable.addAll(craftingProviders.getCraftableKeys()); + currentlyCraftable.addAll(craftingProviders.getEmittableKeys()); + + // Only perform the change tracking if there are watchers + if (!interests.isEmpty()) { + var changedCraftable = new HashSet(); + changedCraftable.addAll(Sets.difference(previouslyCraftable, currentlyCraftable)); + changedCraftable.addAll(Sets.difference(currentlyCraftable, previouslyCraftable)); + for (var what : changedCraftable) { + for (var watcher : interestManager.get(what)) { + watcher.getHost().onCraftableChange(what); + } + for (var watcher : interestManager.getAllStacksWatchers()) { + watcher.getHost().onCraftableChange(what); + } + } + } } } } diff --git a/src/main/java/appeng/me/service/TickManagerService.java b/src/main/java/appeng/me/service/TickManagerService.java index 09cf496cdf7..554b628d47e 100644 --- a/src/main/java/appeng/me/service/TickManagerService.java +++ b/src/main/java/appeng/me/service/TickManagerService.java @@ -18,7 +18,7 @@ package appeng.me.service; -import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.LongSummaryStatistics; import java.util.Map; import java.util.Objects; @@ -50,10 +50,10 @@ public class TickManagerService implements ITickManager, IGridServiceProvider { private static final int TICK_RATE_SPEED_UP_FACTOR = 2; private static final int TICK_RATE_SLOW_DOWN_FACTOR = 1; - private final Map alertable = new HashMap<>(); - private final Map sleeping = new HashMap<>(); - private final Map awake = new HashMap<>(); - private final Map> upcomingTicks = new HashMap<>(); + private final Map alertable = new IdentityHashMap<>(); + private final Map sleeping = new IdentityHashMap<>(); + private final Map awake = new IdentityHashMap<>(); + private final Map> upcomingTicks = new IdentityHashMap<>(); private PriorityQueue currentlyTickingQueue = null; @@ -70,10 +70,6 @@ public void onServerStartTick() { this.currentTick++; } - @Override - public void onLevelStartTick(Level level) { - } - @Override public void onLevelEndTick(Level level) { this.tickLevelQueue(level); diff --git a/src/main/java/appeng/me/service/helpers/NetworkCraftingProviders.java b/src/main/java/appeng/me/service/helpers/NetworkCraftingProviders.java index 0ab6b33dca3..5bfabc0697d 100644 --- a/src/main/java/appeng/me/service/helpers/NetworkCraftingProviders.java +++ b/src/main/java/appeng/me/service/helpers/NetworkCraftingProviders.java @@ -23,6 +23,7 @@ import appeng.api.stacks.AEKey; import appeng.api.stacks.KeyCounter; import appeng.api.storage.AEKeyFilter; +import appeng.hooks.ticking.TickHandler; /** * Keeps track of the crafting patterns in the network, and related information. @@ -37,6 +38,11 @@ public class NetworkCraftingProviders { private final KeyCounter craftableItemsList = new KeyCounter(); private final Map emitableItems = new HashMap<>(); + private final Set craftableKeys = Collections.unmodifiableSet(craftableItems.keySet()); + private final Set emittableKeys = Collections.unmodifiableSet(emitableItems.keySet()); + + private long lastModifiedOnTick = TickHandler.instance().getCurrentTick(); + public void addProvider(IGridNode node) { var provider = node.getService(ICraftingProvider.class); if (provider != null) { @@ -46,6 +52,7 @@ public void addProvider(IGridNode node) { var state = new ProviderState(provider); state.mount(this); craftingProviders.put(node, state); + setLastModifiedOnTick(); } } @@ -55,6 +62,7 @@ public void removeProvider(IGridNode node) { var state = craftingProviders.remove(node); if (state != null) { state.unmount(this); + setLastModifiedOnTick(); } } } @@ -78,6 +86,14 @@ public Set getCraftables(AEKeyFilter filter) { return result; } + public Set getCraftableKeys() { + return craftableKeys; + } + + public Set getEmittableKeys() { + return emittableKeys; + } + public Collection getCraftingFor(AEKey whatToCraft) { var patterns = this.craftableItems.get(whatToCraft); if (patterns != null) { @@ -208,4 +224,15 @@ private List getSortedPatterns() { private record PatternInfo(IPatternDetails pattern, ProviderState state) { } + + private void setLastModifiedOnTick() { + lastModifiedOnTick = TickHandler.instance().getCurrentTick(); + } + + /** + * @see TickHandler#getCurrentTick() + */ + public long getLastModifiedOnTick() { + return lastModifiedOnTick; + } } diff --git a/src/test/java/appeng/api/networking/GridServicesTest.java b/src/test/java/appeng/api/networking/GridServicesTest.java index 9d625a1e583..a5145b263f3 100644 --- a/src/test/java/appeng/api/networking/GridServicesTest.java +++ b/src/test/java/appeng/api/networking/GridServicesTest.java @@ -30,6 +30,8 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoSettings; +import net.minecraft.world.level.Level; + import appeng.util.BootstrapMinecraft; @MockitoSettings @@ -62,7 +64,7 @@ void restoreRegistry() throws Exception { @Test void testEmptyRegistry() { - var services = GridServices.createServices(grid); + var services = GridServices.createServices(grid).services(); assertThat(services).isEmpty(); } @@ -70,7 +72,7 @@ void testEmptyRegistry() { void testGridServiceWithDefaultConstructor() { GridServices.register(PublicInterface.class, GridService1.class); - var services = GridServices.createServices(grid); + var services = GridServices.createServices(grid).services(); assertThat(services).containsOnlyKeys(PublicInterface.class); assertThat(services.get(PublicInterface.class)).isInstanceOf(GridService1.class); } @@ -79,7 +81,7 @@ void testGridServiceWithDefaultConstructor() { void testGridServiceWithGridDependency() { GridServices.register(GridService2.class, GridService2.class); - var services = GridServices.createServices(grid); + var services = GridServices.createServices(grid).services(); assertThat(services).containsOnlyKeys(GridService2.class); var actual = (GridService2) services.get(GridService2.class); assertThat(actual.grid).isSameAs(grid); @@ -92,7 +94,7 @@ void testGridServicesWithDependencies() { GridServices.register(GridService3.class, GridService3.class); GridServices.register(GridService4.class, GridService4.class); - var services = GridServices.createServices(grid); + var services = GridServices.createServices(grid).services(); assertThat(services).containsOnlyKeys( PublicInterface.class, GridService2.class, @@ -176,4 +178,50 @@ public AmbiguousConstructorClass(GridService2 gc2) { } } + @Test + void testTickingServices() { + GridServices.register(ServerStartTickOnly.class, ServerStartTickOnly.class); + GridServices.register(LevelStartTickOnly.class, LevelStartTickOnly.class); + GridServices.register(LevelEndTickOnly.class, LevelEndTickOnly.class); + GridServices.register(ServerEndTickOnly.class, ServerEndTickOnly.class); + + var services = GridServicesInternal.createServices(grid); + var map = services.services(); + assertThat(services.serverStartTickServices()) + .containsExactly(map.get(ServerStartTickOnly.class)); + assertThat(services.levelStartTickServices()) + .containsExactly(map.get(LevelStartTickOnly.class)); + assertThat(services.levelEndtickServices()) + .containsExactly(map.get(LevelEndTickOnly.class)); + assertThat(services.serverEndTickServices()) + .containsExactly(map.get(ServerEndTickOnly.class)); + } + + public static class ServerStartTickOnly implements IGridServiceProvider { + @Override + public void onServerStartTick() { + IGridServiceProvider.super.onServerStartTick(); + } + } + + public static class LevelStartTickOnly implements IGridServiceProvider { + @Override + public void onLevelStartTick(Level level) { + IGridServiceProvider.super.onLevelStartTick(level); + } + } + + public static class LevelEndTickOnly implements IGridServiceProvider { + @Override + public void onLevelEndTick(Level level) { + IGridServiceProvider.super.onLevelEndTick(level); + } + } + + public static class ServerEndTickOnly implements IGridServiceProvider { + @Override + public void onServerEndTick() { + IGridServiceProvider.super.onServerEndTick(); + } + } } From 26bd475cdbd5cda155d6efeeec6a87b684770876 Mon Sep 17 00:00:00 2001 From: shartte Date: Sun, 11 Aug 2024 02:45:48 +0200 Subject: [PATCH 14/14] Implement support for multiple of the same ingredient in transform recipes (#8137) --- .../recipes/transform/TransformLogic.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/appeng/recipes/transform/TransformLogic.java b/src/main/java/appeng/recipes/transform/TransformLogic.java index 78a219c0463..1bbcf589062 100644 --- a/src/main/java/appeng/recipes/transform/TransformLogic.java +++ b/src/main/java/appeng/recipes/transform/TransformLogic.java @@ -23,7 +23,8 @@ import net.neoforged.neoforge.event.AddReloadListenerEvent; import net.neoforged.neoforge.event.server.ServerStartedEvent; -import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; public final class TransformLogic { public static boolean canTransformInFluid(ItemEntity entity, FluidState fluid) { @@ -55,37 +56,38 @@ public static boolean tryTransform(ItemEntity entity, Predicate missingIngredients = Lists.newArrayList(recipe.ingredients); - Set selectedEntities = new ReferenceOpenHashSet<>(missingIngredients.size()); + Reference2IntMap consumedItems = new Reference2IntOpenHashMap<>(missingIngredients.size()); if (recipe.circumstance.isExplosion()) { if (missingIngredients.stream().noneMatch(i -> i.test(entity.getItem()))) continue; } else { - if (!missingIngredients.get(0).test(entity.getItem())) + if (!missingIngredients.getFirst().test(entity.getItem())) continue; } for (var itemEntity : itemEntities) { - final ItemStack other = itemEntity.getItem(); + var other = itemEntity.getItem(); if (!other.isEmpty()) { for (var it = missingIngredients.iterator(); it.hasNext();) { Ingredient ing = it.next(); - if (ing.test(other)) { - selectedEntities.add(itemEntity); + var alreadyClaimed = consumedItems.getInt(itemEntity); + if (ing.test(other) && other.getCount() - alreadyClaimed > 0) { + consumedItems.merge(itemEntity, 1, Integer::sum); it.remove(); - break; } } } } if (missingIngredients.isEmpty()) { - var items = new ArrayList(selectedEntities.size()); - for (var e : selectedEntities) { - items.add(e.getItem().split(1)); + var items = new ArrayList(consumedItems.size()); + for (var e : consumedItems.reference2IntEntrySet()) { + var itemEntity = e.getKey(); + items.add(itemEntity.getItem().split(e.getIntValue())); - if (e.getItem().getCount() <= 0) { - e.discard(); + if (itemEntity.getItem().getCount() <= 0) { + itemEntity.discard(); } } var recipeInput = new TransformRecipeInput(items);