Преглед изворни кода

Beacon Payment category (Close #406)

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel пре 4 година
родитељ
комит
a8c22d7f48

+ 1 - 0
RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/BuiltinPlugin.java

@@ -47,6 +47,7 @@ public interface BuiltinPlugin {
     ResourceLocation FUEL = new ResourceLocation("minecraft", "plugins/fuel");
     ResourceLocation SMITHING = new ResourceLocation("minecraft", "plugins/smithing");
     ResourceLocation BEACON = new ResourceLocation("minecraft", "plugins/beacon");
+    ResourceLocation BEACON_PAYMENT = new ResourceLocation("minecraft", "plugins/beacon_payment");
     ResourceLocation TILLING = new ResourceLocation("minecraft", "plugins/tilling");
     ResourceLocation PATHING = new ResourceLocation("minecraft", "plugins/pathing");
     ResourceLocation INFO = new ResourceLocation("roughlyenoughitems", "plugins/information");

+ 9 - 1
RoughlyEnoughItems-default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java

@@ -33,6 +33,8 @@ import me.shedaniel.rei.api.plugins.REIPluginV0;
 import me.shedaniel.rei.plugin.autocrafting.DefaultRecipeBookHandler;
 import me.shedaniel.rei.plugin.beacon.DefaultBeaconBaseCategory;
 import me.shedaniel.rei.plugin.beacon.DefaultBeaconBaseDisplay;
+import me.shedaniel.rei.plugin.beacon_payment.DefaultBeaconPaymentCategory;
+import me.shedaniel.rei.plugin.beacon_payment.DefaultBeaconPaymentDisplay;
 import me.shedaniel.rei.plugin.blasting.DefaultBlastingDisplay;
 import me.shedaniel.rei.plugin.brewing.DefaultBrewingCategory;
 import me.shedaniel.rei.plugin.brewing.DefaultBrewingDisplay;
@@ -75,6 +77,7 @@ import net.minecraft.core.Registry;
 import net.minecraft.network.chat.Component;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.tags.BlockTags;
+import net.minecraft.tags.ItemTags;
 import net.minecraft.tags.Tag;
 import net.minecraft.util.LazyLoadedValue;
 import net.minecraft.util.Mth;
@@ -113,6 +116,7 @@ public class DefaultPlugin implements REIPluginV0, BuiltinPlugin {
     public static final ResourceLocation FUEL = BuiltinPlugin.FUEL;
     public static final ResourceLocation SMITHING = BuiltinPlugin.SMITHING;
     public static final ResourceLocation BEACON = BuiltinPlugin.BEACON;
+    public static final ResourceLocation BEACON_PAYMENT = BuiltinPlugin.BEACON_PAYMENT;
     public static final ResourceLocation TILLING = BuiltinPlugin.TILLING;
     public static final ResourceLocation PATHING = BuiltinPlugin.PATHING;
     public static final ResourceLocation INFO = BuiltinPlugin.INFO;
@@ -210,6 +214,7 @@ public class DefaultPlugin implements REIPluginV0, BuiltinPlugin {
                 new DefaultStrippingCategory(),
                 new DefaultSmithingCategory(),
                 new DefaultBeaconBaseCategory(),
+                new DefaultBeaconPaymentCategory(),
                 new DefaultTillingCategory(),
                 new DefaultPathingCategory(),
                 new DefaultInformationCategory()
@@ -272,6 +277,7 @@ public class DefaultPlugin implements REIPluginV0, BuiltinPlugin {
             recipeHelper.registerDisplay(new DefaultPathingDisplay(EntryStack.create(set.getKey()), EntryStack.create(set.getValue().getBlock())));
         });
         recipeHelper.registerDisplay(new DefaultBeaconBaseDisplay(CollectionUtils.map(Lists.newArrayList(BlockTags.BEACON_BASE_BLOCKS.getValues()), ItemStack::new)));
+        recipeHelper.registerDisplay(new DefaultBeaconPaymentDisplay(CollectionUtils.map(Lists.newArrayList(ItemTags.BEACON_PAYMENT_ITEMS.getValues()), ItemStack::new)));
     }
     
     @Override
@@ -327,13 +333,14 @@ public class DefaultPlugin implements REIPluginV0, BuiltinPlugin {
         recipeHelper.registerWorkingStations(SMELTING, EntryStack.create(Items.FURNACE));
         recipeHelper.registerWorkingStations(SMOKING, EntryStack.create(Items.SMOKER));
         recipeHelper.registerWorkingStations(BLASTING, EntryStack.create(Items.BLAST_FURNACE));
-        recipeHelper.registerWorkingStations(CAMPFIRE, EntryStack.create(Items.CAMPFIRE));
+        recipeHelper.registerWorkingStations(CAMPFIRE, EntryStack.create(Items.CAMPFIRE), EntryStack.create(Items.SOUL_CAMPFIRE));
         recipeHelper.registerWorkingStations(FUEL, EntryStack.create(Items.FURNACE), EntryStack.create(Items.SMOKER), EntryStack.create(Items.BLAST_FURNACE));
         recipeHelper.registerWorkingStations(BREWING, EntryStack.create(Items.BREWING_STAND));
         recipeHelper.registerWorkingStations(STONE_CUTTING, EntryStack.create(Items.STONECUTTER));
         recipeHelper.registerWorkingStations(COMPOSTING, EntryStack.create(Items.COMPOSTER));
         recipeHelper.registerWorkingStations(SMITHING, EntryStack.create(Items.SMITHING_TABLE));
         recipeHelper.registerWorkingStations(BEACON, EntryStack.create(Items.BEACON));
+        recipeHelper.registerWorkingStations(BEACON_PAYMENT, EntryStack.create(Items.BEACON));
         Tag<Item> axes = Minecraft.getInstance().getConnection().getTags().getItems().getTag(new ResourceLocation("fabric", "axes"));
         if (axes != null) {
             for (Item item : axes.getValues()) {
@@ -355,6 +362,7 @@ public class DefaultPlugin implements REIPluginV0, BuiltinPlugin {
         recipeHelper.removeAutoCraftButton(FUEL);
         recipeHelper.removeAutoCraftButton(COMPOSTING);
         recipeHelper.removeAutoCraftButton(BEACON);
+        recipeHelper.removeAutoCraftButton(BEACON_PAYMENT);
         recipeHelper.removeAutoCraftButton(INFO);
         recipeHelper.registerScreenClickArea(new Rectangle(88, 32, 28, 23), CraftingScreen.class, CRAFTING);
         recipeHelper.registerScreenClickArea(new Rectangle(137, 29, 10, 13), InventoryScreen.class, CRAFTING);

+ 183 - 0
RoughlyEnoughItems-default-plugin/src/main/java/me/shedaniel/rei/plugin/beacon_payment/DefaultBeaconPaymentCategory.java

@@ -0,0 +1,183 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.plugin.beacon_payment;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.components.events.GuiEventListener;
+import net.minecraft.client.resources.language.I18n;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.util.Mth;
+import net.minecraft.world.level.block.Blocks;
+import com.mojang.blaze3d.vertex.PoseStack;
+
+import me.shedaniel.clothconfig2.ClothConfigInitializer;
+import me.shedaniel.clothconfig2.api.ScissorsHandler;
+import me.shedaniel.clothconfig2.api.ScrollingContainer;
+import me.shedaniel.math.Point;
+import me.shedaniel.math.Rectangle;
+import me.shedaniel.rei.api.EntryStack;
+import me.shedaniel.rei.api.REIHelper;
+import me.shedaniel.rei.api.RecipeCategory;
+import me.shedaniel.rei.api.widgets.Slot;
+import me.shedaniel.rei.api.widgets.Widgets;
+import me.shedaniel.rei.gui.entries.RecipeEntry;
+import me.shedaniel.rei.gui.widget.Widget;
+import me.shedaniel.rei.gui.widget.WidgetWithBounds;
+import me.shedaniel.rei.plugin.DefaultPlugin;
+import me.shedaniel.rei.utils.CollectionUtils;
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import java.util.Objects;
+
+public class DefaultBeaconPaymentCategory implements RecipeCategory<DefaultBeaconPaymentDisplay> {
+    @Override
+    public @NotNull ResourceLocation getIdentifier() {
+        return DefaultPlugin.BEACON_PAYMENT;
+    }
+    
+    @Override
+    public @NotNull String getCategoryName() {
+        return I18n.get("category.rei.beacon_payment");
+    }
+    
+    @Override
+    public @NotNull EntryStack getLogo() {
+        return EntryStack.create(Blocks.BEACON);
+    }
+    
+    @Override
+    public @NotNull RecipeEntry getSimpleRenderer(DefaultBeaconPaymentDisplay recipe) {
+        String name = getCategoryName();
+        return new RecipeEntry() {
+            @Override
+            public int getHeight() {
+                return 10 + Minecraft.getInstance().font.lineHeight;
+            }
+            
+            @Override
+            public void render(PoseStack matrices, Rectangle rectangle, int mouseX, int mouseY, float delta) {
+                Minecraft.getInstance().font.draw(matrices, name, rectangle.x + 5, rectangle.y + 6, -1);
+            }
+        };
+    }
+    
+    @Override
+    public @NotNull List<Widget> setupDisplay(DefaultBeaconPaymentDisplay display, Rectangle bounds) {
+        List<Widget> widgets = Lists.newArrayList();
+        widgets.add(Widgets.createSlot(new Point(bounds.getCenterX() - 8, bounds.y + 3)).entry(getLogo()));
+        Rectangle rectangle = new Rectangle(bounds.getCenterX() - (bounds.width / 2) - 1, bounds.y + 23, bounds.width + 2, bounds.height - 28);
+        widgets.add(Widgets.createSlotBase(rectangle));
+        widgets.add(new ScrollableSlotsWidget(rectangle, CollectionUtils.map(display.getEntries(), t -> Widgets.createSlot(new Point(0, 0)).disableBackground().entry(t))));
+        return widgets;
+    }
+    
+    @Override
+    public int getDisplayHeight() {
+        return 140;
+    }
+    
+    @Override
+    public int getFixedRecipesPerPage() {
+        return 1;
+    }
+    
+    private static class ScrollableSlotsWidget extends WidgetWithBounds {
+        private Rectangle bounds;
+        private List<Slot> widgets;
+        private final ScrollingContainer scrolling = new ScrollingContainer() {
+            @Override
+            public Rectangle getBounds() {
+                Rectangle bounds = ScrollableSlotsWidget.this.getBounds();
+                return new Rectangle(bounds.x + 1, bounds.y + 1, bounds.width - 2, bounds.height - 2);
+            }
+            
+            @Override
+            public int getMaxScrollHeight() {
+                return Mth.ceil(widgets.size() / 8f) * 18;
+            }
+        };
+        
+        public ScrollableSlotsWidget(Rectangle bounds, List<Slot> widgets) {
+            this.bounds = Objects.requireNonNull(bounds);
+            this.widgets = Lists.newArrayList(widgets);
+        }
+        
+        @Override
+        public boolean mouseScrolled(double double_1, double double_2, double double_3) {
+            if (containsMouse(double_1, double_2)) {
+                scrolling.offset(ClothConfigInitializer.getScrollStep() * -double_3, true);
+                return true;
+            }
+            return false;
+        }
+        
+        @NotNull
+        @Override
+        public Rectangle getBounds() {
+            return bounds;
+        }
+        
+        @Override
+        public boolean mouseClicked(double mouseX, double mouseY, int button) {
+            if (scrolling.updateDraggingState(mouseX, mouseY, button))
+                return true;
+            return super.mouseClicked(mouseX, mouseY, button);
+        }
+        
+        @Override
+        public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
+            if (scrolling.mouseDragged(mouseX, mouseY, button, deltaX, deltaY))
+                return true;
+            return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
+        }
+        
+        @Override
+        public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
+            scrolling.updatePosition(delta);
+            Rectangle innerBounds = scrolling.getScissorBounds();
+            ScissorsHandler.INSTANCE.scissor(innerBounds);
+            for (int y = 0; y < Mth.ceil(widgets.size() / 8f); y++) {
+                for (int x = 0; x < 8; x++) {
+                    int index = y * 8 + x;
+                    if (widgets.size() <= index)
+                        break;
+                    Slot widget = widgets.get(index);
+                    widget.getBounds().setLocation(bounds.x + 1 + x * 18, (int) (bounds.y + 1 + y * 18 - scrolling.scrollAmount));
+                    widget.render(matrices, mouseX, mouseY, delta);
+                }
+            }
+            ScissorsHandler.INSTANCE.removeLastScissor();
+            ScissorsHandler.INSTANCE.scissor(scrolling.getBounds());
+            scrolling.renderScrollBar(0xff000000, 1, REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f);
+            ScissorsHandler.INSTANCE.removeLastScissor();
+        }
+        
+        @Override
+        public List<? extends GuiEventListener> children() {
+            return widgets;
+        }
+    }
+}

+ 67 - 0
RoughlyEnoughItems-default-plugin/src/main/java/me/shedaniel/rei/plugin/beacon_payment/DefaultBeaconPaymentDisplay.java

@@ -0,0 +1,67 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.plugin.beacon_payment;
+
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.item.ItemStack;
+
+import me.shedaniel.rei.api.EntryStack;
+import me.shedaniel.rei.api.RecipeDisplay;
+import me.shedaniel.rei.plugin.DefaultPlugin;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+@Environment(EnvType.CLIENT)
+public class DefaultBeaconPaymentDisplay implements RecipeDisplay {
+    
+    private List<EntryStack> entries;
+    
+    public DefaultBeaconPaymentDisplay(List<ItemStack> entries) {
+        this.entries = EntryStack.ofItemStacks(entries);
+    }
+    
+    @Override
+    public @NotNull List<List<EntryStack>> getInputEntries() {
+        return Collections.singletonList(entries);
+    }
+    
+    public List<EntryStack> getEntries() {
+        return entries;
+    }
+    
+    @Override
+    public @NotNull List<List<EntryStack>> getResultingEntries() {
+        return Collections.emptyList();
+    }
+    
+    @Override
+    public @NotNull ResourceLocation getRecipeCategory() {
+        return DefaultPlugin.BEACON_PAYMENT;
+    }
+}

+ 1 - 0
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -31,6 +31,7 @@
   "category.rei.stripping": "Stripping",
   "category.rei.smithing": "Smithing",
   "category.rei.beacon_base": "Beacon Base",
+  "category.rei.beacon_payment": "Beacon Payment",
   "category.rei.tilling": "Tilling",
   "category.rei.pathing": "Pathing",
   "category.rei.information": "Information",