Skip to content

Commit

Permalink
Added support for dragging items from jei
Browse files Browse the repository at this point in the history
  • Loading branch information
Edivad99 committed Mar 15, 2024
1 parent 28f5350 commit a7d355a
Show file tree
Hide file tree
Showing 9 changed files with 114 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import mods.railcraft.world.level.block.entity.detector.ItemDetectorBlockEntity;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.FastColor;
Expand Down Expand Up @@ -104,7 +105,8 @@ protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) {
var slot = this.menu.slots.get(slotNum);
int displayX = slot.x;
int displayY = slot.y;
guiGraphics.fill(displayX, displayY, displayX + 16, displayY + 16, color);
guiGraphics.fill(RenderType.guiOverlay(), displayX, displayY,
displayX + 16, displayY + 16, color);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package mods.railcraft.integrations.jei;

import java.util.ArrayList;
import java.util.List;
import mezz.jei.api.gui.handlers.IGhostIngredientHandler;
import mezz.jei.api.ingredients.ITypedIngredient;
import mods.railcraft.client.gui.screen.inventory.RailcraftMenuScreen;
import mods.railcraft.network.NetworkChannel;
import mods.railcraft.network.play.SetFilterSlotMessage;
import mods.railcraft.world.inventory.slot.RailcraftSlot;
import net.minecraft.client.renderer.Rect2i;
import net.minecraft.world.item.ItemStack;

public class GhostIngredientHandler<T extends RailcraftMenuScreen<?>>
implements IGhostIngredientHandler<T> {

@Override
public <I> List<Target<I>> getTargetsTyped(T gui, ITypedIngredient<I> ingredient,
boolean doStart) {
var targets = new ArrayList<Target<I>>();

for (var slot : gui.getMenu().slots) {
if (!slot.isActive()) {
continue;
}

var bounds = new Rect2i(gui.getGuiLeft() + slot.x, gui.getGuiTop() + slot.y, 17, 17);

if (ingredient.getIngredient() instanceof ItemStack itemStack) {
if ((slot instanceof RailcraftSlot railcraftSlot && railcraftSlot.isPhantom())) {
if (railcraftSlot.mayPlace(itemStack)) {
targets.add(new Target<>() {
@Override
public Rect2i getArea() {
return bounds;
}

@Override
public void accept(I ingredient) {
var itemStack = ((ItemStack) ingredient).copy();
NetworkChannel.GAME.sendToServer(new SetFilterSlotMessage(slot.index, itemStack));
slot.set(itemStack);
}
});
}
}
}
}
return targets;
}

@Override
public void onComplete() {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import mods.railcraft.client.gui.screen.inventory.CrusherScreen;
import mods.railcraft.client.gui.screen.inventory.ManualRollingMachineScreen;
import mods.railcraft.client.gui.screen.inventory.PoweredRollingMachineScreen;
import mods.railcraft.client.gui.screen.inventory.RailcraftMenuScreen;
import mods.railcraft.client.gui.screen.inventory.SteamOvenScreen;
import mods.railcraft.integrations.jei.category.BlastFurnaceRecipeCategory;
import mods.railcraft.integrations.jei.category.CokeOvenRecipeCategory;
Expand Down Expand Up @@ -71,6 +72,7 @@ public void registerGuiHandlers(IGuiHandlerRegistration registration) {
registration.addRecipeClickArea(CrusherScreen.class, 73, 20, 30, 38, RecipeTypes.CRUSHER);
registration.addRecipeClickArea(SteamOvenScreen.class, 65, 18, 23, 50,
mezz.jei.api.constants.RecipeTypes.SMELTING);
registration.addGhostIngredientHandler(RailcraftMenuScreen.class, new GhostIngredientHandler<>());
}

@Override
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/mods/railcraft/network/NetworkChannel.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import mods.railcraft.network.play.SetActionSignalBoxAttributesMessage;
import mods.railcraft.network.play.SetAnalogSignalControllerBoxAttributesMessage;
import mods.railcraft.network.play.SetEmbarkingTrackAttributesMessage;
import mods.railcraft.network.play.SetFilterSlotMessage;
import mods.railcraft.network.play.SetFluidManipulatorAttributesMessage;
import mods.railcraft.network.play.SetItemDetectorAttributesMessage;
import mods.railcraft.network.play.SetItemManipulatorAttributesMessage;
Expand Down Expand Up @@ -199,6 +200,13 @@ public void registerMessages(SimpleChannel simpleChannel) {
.decoder(SetRoutingDetectorAttributesMessage::decode)
.consumerMainThread(SetRoutingDetectorAttributesMessage::handle)
.add();
simpleChannel
.messageBuilder(SetFilterSlotMessage.class, 0x17,
NetworkDirection.PLAY_TO_SERVER)
.encoder(SetFilterSlotMessage::encode)
.decoder(SetFilterSlotMessage::decode)
.consumerMainThread(SetFilterSlotMessage::handle)
.add();
}
};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package mods.railcraft.network.play;

import java.util.function.Supplier;
import mods.railcraft.world.inventory.slot.RailcraftSlot;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.network.NetworkEvent;

public record SetFilterSlotMessage(int slotIndex, ItemStack stack) {

public static SetFilterSlotMessage decode(FriendlyByteBuf in) {
var slotIndex = in.readVarInt();
var stack = in.readItem();
return new SetFilterSlotMessage(slotIndex, stack);
}

public void encode(FriendlyByteBuf out) {
out.writeVarInt(this.slotIndex);
out.writeItem(this.stack);
}

public boolean handle(Supplier<NetworkEvent.Context> context) {
var player = context.get().getSender();
if (player == null) {
return false;
}
if (!this.stack.isEmpty() && this.stack.getCount() <= this.stack.getMaxStackSize()) {
var container = player.containerMenu;
if (container != null && this.slotIndex >= 0 && this.slotIndex < container.slots.size()) {
if (container.getSlot(this.slotIndex) instanceof RailcraftSlot slot && slot.isPhantom()) {
if (slot.mayPlace(this.stack)) {
slot.set(this.stack);
}
}
}
}
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,12 @@

import net.minecraft.world.Container;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;

public class BlockFilterSlot extends RailcraftSlot {
public class BlockFilterSlot extends ItemFilterSlot {

public BlockFilterSlot(Container container, int slotIndex, int posX, int posY) {
super(container, slotIndex, posX, posY);
setPhantom();
setStackLimit(1);
}

@Override
public boolean mayPlace(ItemStack stack) {
return stack.getItem() instanceof BlockItem;
super(itemStack -> itemStack.getItem() instanceof BlockItem, container, slotIndex, posX, posY);
this.setPhantom();
this.setStackLimit(1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ public FluidFilterSlot(Container container, int slotIndex, int posX, int posY) {

@Override
public boolean mayPlace(ItemStack itemstack) {
return !FluidTools.isEmptyContainer(itemstack);
return FluidTools.isFluidHandler(itemstack) && !FluidTools.isEmptyContainer(itemstack);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public ItemFilterSlot(Predicate<ItemStack> filter, Container container, int slot
int posX, int posY) {
super(container, slotIndex, posX, posY);
this.filter = filter;
setStackLimit(64);
this.setStackLimit(64);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class RailcraftSlot extends Slot {

@Nullable
protected List<Component> tooltip;
protected boolean phantom;
private boolean phantom;
protected boolean canAdjustPhantom = true;
protected boolean canShift = true;
protected int stackLimit = -1;
Expand Down

0 comments on commit a7d355a

Please sign in to comment.