Skip to content

Commit 9c336c2

Browse files
committed
fix: support clickable jei ingredients for generic entries in stock keeper screen
# Conflicts: # forge/build.gradle # forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/stockKeeper/StockKeeperRequestScreenMixin.java # gradle.properties
1 parent 68fed42 commit 9c336c2

File tree

5 files changed

+137
-7
lines changed

5 files changed

+137
-7
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ru.zznty.create_factory_logistics.logistics.ingredient;
2+
3+
import net.createmod.catnip.data.Pair;
4+
import net.minecraft.client.renderer.Rect2i;
5+
import ru.zznty.create_factory_abstractions.api.generic.key.GenericKey;
6+
7+
public interface ClickableIngredientProvider {
8+
Pair<GenericKey, Rect2i> getHoveredKey(int mouseX, int mouseY);
9+
}

forge/src/main/java/ru/zznty/create_factory_logistics/mixin/accessor/CategoryEntryAccessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ public interface CategoryEntryAccessor {
1111

1212
@Accessor(remap = false)
1313
void setHidden(boolean hidden);
14+
15+
@Accessor(remap = false)
16+
int getY();
1417
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package ru.zznty.create_factory_logistics.mixin.logistics.stockKeeper;
2+
3+
import com.simibubi.create.compat.jei.StockKeeperGuiContainerHandler;
4+
import com.simibubi.create.content.logistics.stockTicker.StockKeeperRequestScreen;
5+
import mezz.jei.api.ingredients.IIngredientType;
6+
import mezz.jei.api.runtime.IIngredientManager;
7+
import net.createmod.catnip.data.Pair;
8+
import net.minecraft.client.renderer.Rect2i;
9+
import org.spongepowered.asm.mixin.Final;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
15+
import ru.zznty.create_factory_abstractions.api.generic.key.GenericKey;
16+
import ru.zznty.create_factory_abstractions.api.generic.key.GenericKeyProvider;
17+
import ru.zznty.create_factory_abstractions.generic.impl.GenericContentExtender;
18+
import ru.zznty.create_factory_logistics.logistics.ingredient.ClickableIngredientProvider;
19+
20+
import java.util.Optional;
21+
22+
@Mixin(StockKeeperGuiContainerHandler.class)
23+
public class StockKeeperGuiContainerHandlerMixin {
24+
@Final
25+
@Shadow(remap = false)
26+
private IIngredientManager ingredientManager;
27+
28+
@SuppressWarnings({"unchecked", "rawtypes"})
29+
@Inject(
30+
method = "getClickableIngredientUnderMouse(Lcom/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen;DD)Ljava/util/Optional;",
31+
at = @At("HEAD"),
32+
remap = false,
33+
cancellable = true
34+
)
35+
public void getClickableIngredientUnderMouse(StockKeeperRequestScreen containerScreen,
36+
double mouseX, double mouseY,
37+
CallbackInfoReturnable cir) {
38+
if (containerScreen instanceof ClickableIngredientProvider provider) {
39+
Pair<GenericKey, Rect2i> pair = provider.getHoveredKey((int) mouseX, (int) mouseY);
40+
if (pair.getFirst() == GenericKey.EMPTY) cir.setReturnValue(Optional.empty());
41+
else {
42+
GenericKeyProvider<GenericKey> keyProvider = GenericContentExtender.registrationOf(
43+
pair.getFirst()).provider();
44+
Optional<IIngredientType<?>> ingredientTypeForUid = ingredientManager.getIngredientTypeForUid(
45+
keyProvider.ingredientTypeUid());
46+
if (ingredientTypeForUid.isEmpty()) return;
47+
cir.setReturnValue(ingredientManager.createClickableIngredient(ingredientTypeForUid.get(),
48+
keyProvider.unwrap(pair.getFirst()),
49+
pair.getSecond(), true));
50+
}
51+
}
52+
}
53+
}

forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/stockKeeper/StockKeeperRequestScreenMixin.java

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
import com.simibubi.create.content.logistics.stockTicker.*;
1010
import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen;
1111
import net.createmod.catnip.animation.LerpedFloat;
12+
import net.createmod.catnip.data.Couple;
1213
import net.createmod.catnip.data.Pair;
1314
import net.createmod.catnip.gui.element.GuiGameElement;
1415
import net.createmod.catnip.platform.services.NetworkHelper;
1516
import net.minecraft.client.gui.Font;
1617
import net.minecraft.client.gui.GuiGraphics;
1718
import net.minecraft.client.gui.components.EditBox;
19+
import net.minecraft.client.renderer.Rect2i;
1820
import net.minecraft.network.chat.Component;
1921
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
2022
import net.minecraft.world.entity.player.Inventory;
@@ -24,14 +26,12 @@
2426
import net.minecraft.world.item.TooltipFlag;
2527
import net.minecraft.world.level.Level;
2628
import net.minecraft.world.level.block.Blocks;
27-
import org.spongepowered.asm.mixin.Mixin;
28-
import org.spongepowered.asm.mixin.Overwrite;
29-
import org.spongepowered.asm.mixin.Shadow;
30-
import org.spongepowered.asm.mixin.Unique;
29+
import org.spongepowered.asm.mixin.*;
3130
import org.spongepowered.asm.mixin.injection.At;
3231
import org.spongepowered.asm.mixin.injection.Redirect;
3332
import ru.zznty.create_factory_abstractions.api.generic.crafting.OrderProvider;
3433
import ru.zznty.create_factory_abstractions.api.generic.crafting.RecipeRequestHelper;
34+
import ru.zznty.create_factory_abstractions.api.generic.key.GenericKey;
3535
import ru.zznty.create_factory_abstractions.api.generic.search.CategoriesProvider;
3636
import ru.zznty.create_factory_abstractions.api.generic.search.GenericSearch;
3737
import ru.zznty.create_factory_abstractions.api.generic.stack.GenericStack;
@@ -40,14 +40,15 @@
4040
import ru.zznty.create_factory_abstractions.generic.support.CraftableGenericStack;
4141
import ru.zznty.create_factory_abstractions.generic.support.GenericInventorySummary;
4242
import ru.zznty.create_factory_abstractions.generic.support.GenericOrder;
43+
import ru.zznty.create_factory_logistics.logistics.ingredient.ClickableIngredientProvider;
4344
import ru.zznty.create_factory_logistics.mixin.accessor.CategoryEntryAccessor;
4445
import ru.zznty.create_factory_logistics.mixin.accessor.StockTickerBlockEntityAccessor;
4546

4647
import java.util.*;
4748
import java.util.function.Function;
4849

4950
@Mixin(StockKeeperRequestScreen.class)
50-
public abstract class StockKeeperRequestScreenMixin extends AbstractSimiContainerScreen<StockKeeperRequestMenu> implements OrderProvider, CategoriesProvider {
51+
public abstract class StockKeeperRequestScreenMixin extends AbstractSimiContainerScreen<StockKeeperRequestMenu> implements OrderProvider, CategoriesProvider, ClickableIngredientProvider {
5152
public StockKeeperRequestScreenMixin(StockKeeperRequestMenu container, Inventory inv, Component title) {
5253
super(container, inv, title);
5354
}
@@ -82,12 +83,15 @@ public StockKeeperRequestScreenMixin(StockKeeperRequestMenu container, Inventory
8283
@Shadow
8384
public EditBox searchBox;
8485

86+
@Final
8587
@Shadow
86-
final int cols = 9;
88+
int cols, orderY;
8789

90+
@Final
8891
@Shadow
89-
final int rowHeight = 20;
92+
int rowHeight, colWidth;
9093

94+
@Final
9195
@Shadow
9296
private Set<Integer> hiddenCategories;
9397

@@ -114,6 +118,21 @@ public void requestSchematicList() {
114118
@Shadow
115119
public List<StockKeeperRequestScreen.CategoryEntry> categories;
116120

121+
@Final
122+
@Shadow(remap = false)
123+
Couple<Integer> noneHovered;
124+
125+
@Shadow(remap = false)
126+
int itemsX, itemsY;
127+
128+
@Shadow(remap = false)
129+
int windowWidth;
130+
131+
@Shadow(remap = false)
132+
private Couple<Integer> getHoveredSlot(int x, int y) {
133+
return noneHovered;
134+
}
135+
117136
@Redirect(
118137
method = "containerTick",
119138
at = @At(
@@ -509,4 +528,49 @@ public Set<Integer> hiddenCategories() {
509528
public List<List<BigGenericStack>> currentItemSource() {
510529
return currentItemSource;
511530
}
531+
532+
@Override
533+
public Pair<GenericKey, Rect2i> getHoveredKey(int mouseX, int mouseY) {
534+
Couple<Integer> hoveredSlot = getHoveredSlot(mouseX, mouseY);
535+
536+
if (hoveredSlot != noneHovered) {
537+
int index = hoveredSlot.getSecond();
538+
boolean recipeHovered = hoveredSlot.getFirst() == -2;
539+
boolean orderHovered = hoveredSlot.getFirst() == -1;
540+
541+
int x, y;
542+
BigGenericStack entry;
543+
if (recipeHovered) {
544+
int jeiX = getGuiLeft() + (windowWidth - colWidth * recipesToOrder.size()) / 2 + 1;
545+
int jeiY = orderY - 31;
546+
547+
x = jeiX + (index * colWidth);
548+
y = jeiY;
549+
550+
entry = recipesToOrder.get(index);
551+
} else {
552+
if (orderHovered) {
553+
x = itemsX + index * colWidth;
554+
y = orderY;
555+
556+
entry = itemsToOrder.get(index);
557+
} else {
558+
int categoryIndex = hoveredSlot.getFirst();
559+
int categoryY = categories.isEmpty() ?
560+
0 :
561+
((CategoryEntryAccessor) categories.get(categoryIndex)).getY();
562+
563+
x = itemsX + (index % cols) * colWidth;
564+
y = itemsY + categoryY + (categories.isEmpty() ? 4 : rowHeight) + (index / cols) * rowHeight;
565+
566+
entry = displayedItems.get(categoryIndex).get(index);
567+
}
568+
}
569+
570+
Rect2i bounds = new Rect2i(x, y, x + 18, y + 18);
571+
return Pair.of(entry.get().key(), bounds);
572+
}
573+
574+
return Pair.of(GenericKey.EMPTY, new Rect2i(0, 0, 0, 0));
575+
}
512576
}

forge/src/main/resources/mixins.create_factory_logistics.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"accessor.CategoryEntryAccessor",
4242
"logistics.panel.FactoryPanelScreenMixin",
4343
"logistics.redstoneRequester.RedstoneRequesterScreenMixin",
44+
"logistics.stockKeeper.StockKeeperGuiContainerHandlerMixin",
4445
"logistics.stockKeeper.StockKeeperRequestScreenMixin",
4546
"logistics.stockKeeper.StockKeeperTransferHandlerMixin",
4647
"render.ChainConveyorRendererMixin",

0 commit comments

Comments
 (0)