Curio support (#3013)

* update gradle, mappings and dependencies

* fix dependencies

* add curio support for wireless items

* Update Forge

* Speed up pattern validation by using now-fixed cache (#3011)

* fix dependencies

* remove weird imports

* whoops doubled dependency

* improve code quality

* found out there is an Api method

Co-authored-by: raoulvdberge <raoulvdberge@gmail.com>
Co-authored-by: Anton Bulakh <self@necauqua.dev>
This commit is contained in:
Darkere
2021-06-18 07:41:18 +02:00
committed by GitHub
parent a943d49792
commit 038661f5ee
6 changed files with 108 additions and 17 deletions

View File

@@ -22,6 +22,9 @@ repositories {
includeGroup "curse.maven" includeGroup "curse.maven"
} }
} }
maven {
url = "https://maven.theillusivec4.top/"
}
} }
apply plugin: 'net.minecraftforge.gradle' apply plugin: 'net.minecraftforge.gradle'
@@ -118,6 +121,9 @@ dependencies {
compileOnly fg.deobf('curse.maven:crafting-tweaks-233071:3330406') compileOnly fg.deobf('curse.maven:crafting-tweaks-233071:3330406')
runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.2")
compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.2:api")
testImplementation('org.junit.jupiter:junit-jupiter-api:5.6.2') testImplementation('org.junit.jupiter:junit-jupiter-api:5.6.2')
testRuntime('org.junit.jupiter:junit-jupiter-engine:5.6.2') testRuntime('org.junit.jupiter:junit-jupiter-engine:5.6.2')
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.16.1' testCompile group: 'org.assertj', name: 'assertj-core', version: '3.16.1'

View File

@@ -4,6 +4,7 @@ import com.refinedmods.refinedstorage.apiimpl.API;
import com.refinedmods.refinedstorage.config.ClientConfig; import com.refinedmods.refinedstorage.config.ClientConfig;
import com.refinedmods.refinedstorage.config.ServerConfig; import com.refinedmods.refinedstorage.config.ServerConfig;
import com.refinedmods.refinedstorage.datageneration.DataGenerators; import com.refinedmods.refinedstorage.datageneration.DataGenerators;
import com.refinedmods.refinedstorage.integration.curios.CuriosIntegration;
import com.refinedmods.refinedstorage.item.group.MainItemGroup; import com.refinedmods.refinedstorage.item.group.MainItemGroup;
import com.refinedmods.refinedstorage.network.NetworkHandler; import com.refinedmods.refinedstorage.network.NetworkHandler;
import com.refinedmods.refinedstorage.setup.ClientSetup; import com.refinedmods.refinedstorage.setup.ClientSetup;
@@ -49,6 +50,7 @@ public final class RS {
FMLJavaModLoadingContext.get().getModEventBus().addGenericListener(IRecipeSerializer.class, commonSetup::onRegisterRecipeSerializers); FMLJavaModLoadingContext.get().getModEventBus().addGenericListener(IRecipeSerializer.class, commonSetup::onRegisterRecipeSerializers);
FMLJavaModLoadingContext.get().getModEventBus().addGenericListener(ContainerType.class, commonSetup::onRegisterContainers); FMLJavaModLoadingContext.get().getModEventBus().addGenericListener(ContainerType.class, commonSetup::onRegisterContainers);
FMLJavaModLoadingContext.get().getModEventBus().register(new DataGenerators()); FMLJavaModLoadingContext.get().getModEventBus().register(new DataGenerators());
FMLJavaModLoadingContext.get().getModEventBus().register(new CuriosIntegration());
API.deliver(); API.deliver();
} }

View File

@@ -0,0 +1,25 @@
package com.refinedmods.refinedstorage.integration.curios;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.InterModComms;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
import top.theillusivec4.curios.api.SlotTypeMessage;
import top.theillusivec4.curios.api.SlotTypePreset;
public class CuriosIntegration {
private static final String ID = "curios";
public CuriosIntegration() {
}
public static boolean isLoaded() {
return ModList.get().isLoaded(ID);
}
@SubscribeEvent
public void registerSlots(InterModEnqueueEvent event){
InterModComms.sendTo(ID, SlotTypeMessage.REGISTER_TYPE,()-> SlotTypePreset.BELT.getMessageBuilder().build());
InterModComms.sendTo(ID, SlotTypeMessage.REGISTER_TYPE,()-> SlotTypePreset.BODY.getMessageBuilder().build());
}
}

View File

@@ -4,26 +4,35 @@ import com.refinedmods.refinedstorage.apiimpl.API;
import com.refinedmods.refinedstorage.apiimpl.network.grid.factory.PortableGridGridFactory; import com.refinedmods.refinedstorage.apiimpl.network.grid.factory.PortableGridGridFactory;
import com.refinedmods.refinedstorage.item.NetworkItem; import com.refinedmods.refinedstorage.item.NetworkItem;
import com.refinedmods.refinedstorage.item.blockitem.PortableGridBlockItem; import com.refinedmods.refinedstorage.item.blockitem.PortableGridBlockItem;
import com.refinedmods.refinedstorage.util.PacketBufferUtils;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import top.theillusivec4.curios.api.CuriosApi;
import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler;
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
import java.util.Optional;
import java.util.function.Supplier; import java.util.function.Supplier;
public class OpenNetworkItemMessage { public class OpenNetworkItemMessage {
private final int slotId; private final int slotId;
private final String curioSlot;
public OpenNetworkItemMessage(int slotId) { public OpenNetworkItemMessage(int slotId, String curioSlot) {
this.slotId = slotId; this.slotId = slotId;
this.curioSlot = curioSlot;
} }
public static OpenNetworkItemMessage decode(PacketBuffer buf) { public static OpenNetworkItemMessage decode(PacketBuffer buf) {
return new OpenNetworkItemMessage(buf.readInt()); return new OpenNetworkItemMessage(buf.readInt(), PacketBufferUtils.readString(buf));
} }
public static void encode(OpenNetworkItemMessage message, PacketBuffer buf) { public static void encode(OpenNetworkItemMessage message, PacketBuffer buf) {
buf.writeInt(message.slotId); buf.writeInt(message.slotId);
buf.writeString(message.curioSlot);
} }
public static void handle(OpenNetworkItemMessage message, Supplier<NetworkEvent.Context> ctx) { public static void handle(OpenNetworkItemMessage message, Supplier<NetworkEvent.Context> ctx) {
@@ -31,7 +40,11 @@ public class OpenNetworkItemMessage {
if (player != null) { if (player != null) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
ItemStack stack = player.inventory.getStackInSlot(message.slotId); ItemStack stack = getStackFromSlot(player, message.slotId, message.curioSlot);
if (stack == null) {
return;
}
if (stack.getItem() instanceof NetworkItem) { if (stack.getItem() instanceof NetworkItem) {
((NetworkItem) stack.getItem()).applyNetwork(player.getServer(), stack, n -> n.getNetworkItemManager().open(player, stack, message.slotId), err -> player.sendMessage(err, player.getUniqueID())); ((NetworkItem) stack.getItem()).applyNetwork(player.getServer(), stack, n -> n.getNetworkItemManager().open(player, stack, message.slotId), err -> player.sendMessage(err, player.getUniqueID()));
@@ -43,4 +56,24 @@ public class OpenNetworkItemMessage {
ctx.get().setPacketHandled(true); ctx.get().setPacketHandled(true);
} }
private static ItemStack getStackFromSlot(ServerPlayerEntity player, int slotId, String curioSlot) {
if (curioSlot.isEmpty()) {
return player.inventory.getStackInSlot(slotId);
} else {
LazyOptional<ICuriosItemHandler> curiosHandler = CuriosApi.getCuriosHelper().getCuriosHandler(player);
Optional<ICurioStacksHandler> stacksHandler = curiosHandler.resolve().flatMap((handler ->
handler.getStacksHandler(curioSlot)
));
Optional<ItemStack> stack = stacksHandler.map(handler -> handler.getStacks().getStackInSlot(slotId));
if (stack.isPresent()) {
return stack.get();
}
}
return null;
}
} }

View File

@@ -3,44 +3,43 @@ package com.refinedmods.refinedstorage.screen;
import com.refinedmods.refinedstorage.RS; import com.refinedmods.refinedstorage.RS;
import com.refinedmods.refinedstorage.RSItems; import com.refinedmods.refinedstorage.RSItems;
import com.refinedmods.refinedstorage.RSKeyBindings; import com.refinedmods.refinedstorage.RSKeyBindings;
import com.refinedmods.refinedstorage.integration.curios.CuriosIntegration;
import com.refinedmods.refinedstorage.network.OpenNetworkItemMessage; import com.refinedmods.refinedstorage.network.OpenNetworkItemMessage;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.client.event.InputEvent; import net.minecraftforge.client.event.InputEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import org.apache.commons.lang3.tuple.ImmutableTriple;
import top.theillusivec4.curios.api.CuriosApi;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer;
public class KeyInputListener { public class KeyInputListener {
@SubscribeEvent @SubscribeEvent
public void onKeyInput(InputEvent.KeyInputEvent e) { public void onKeyInput(InputEvent.KeyInputEvent e) {
if (Minecraft.getInstance().player != null) { if (Minecraft.getInstance().player != null) {
PlayerInventory inv = Minecraft.getInstance().player.inventory;
if (RSKeyBindings.OPEN_WIRELESS_GRID.isKeyDown()) { if (RSKeyBindings.OPEN_WIRELESS_GRID.isKeyDown()) {
findAndOpen(inv, error -> Minecraft.getInstance().player.sendMessage(error, Util.DUMMY_UUID), RSItems.WIRELESS_GRID.get(), RSItems.CREATIVE_WIRELESS_GRID.get()); findAndOpen(RSItems.WIRELESS_GRID.get(), RSItems.CREATIVE_WIRELESS_GRID.get());
} else if (RSKeyBindings.OPEN_WIRELESS_FLUID_GRID.isKeyDown()) { } else if (RSKeyBindings.OPEN_WIRELESS_FLUID_GRID.isKeyDown()) {
findAndOpen(inv, error -> Minecraft.getInstance().player.sendMessage(error, Util.DUMMY_UUID), RSItems.WIRELESS_FLUID_GRID.get(), RSItems.CREATIVE_WIRELESS_FLUID_GRID.get()); findAndOpen(RSItems.WIRELESS_FLUID_GRID.get(), RSItems.CREATIVE_WIRELESS_FLUID_GRID.get());
} else if (RSKeyBindings.OPEN_PORTABLE_GRID.isKeyDown()) { } else if (RSKeyBindings.OPEN_PORTABLE_GRID.isKeyDown()) {
findAndOpen(inv, error -> Minecraft.getInstance().player.sendMessage(error, Util.DUMMY_UUID), RSItems.PORTABLE_GRID.get(), RSItems.CREATIVE_PORTABLE_GRID.get()); findAndOpen(RSItems.PORTABLE_GRID.get(), RSItems.CREATIVE_PORTABLE_GRID.get());
} else if (RSKeyBindings.OPEN_WIRELESS_CRAFTING_MONITOR.isKeyDown()) { } else if (RSKeyBindings.OPEN_WIRELESS_CRAFTING_MONITOR.isKeyDown()) {
findAndOpen(inv, error -> Minecraft.getInstance().player.sendMessage(error, Util.DUMMY_UUID), RSItems.WIRELESS_CRAFTING_MONITOR.get(), RSItems.CREATIVE_WIRELESS_CRAFTING_MONITOR.get()); findAndOpen(RSItems.WIRELESS_CRAFTING_MONITOR.get(), RSItems.CREATIVE_WIRELESS_CRAFTING_MONITOR.get());
} }
} }
} }
public static void findAndOpen(IInventory inv, Consumer<ITextComponent> onError, Item... items) { public void findAndOpen(Item... items) {
Set<Item> validItems = new HashSet<>(Arrays.asList(items)); Set<Item> validItems = new HashSet<>(Arrays.asList(items));
IInventory inv = Minecraft.getInstance().player.inventory;
int slotFound = -1; int slotFound = -1;
for (int i = 0; i < inv.getSizeInventory(); ++i) { for (int i = 0; i < inv.getSizeInventory(); ++i) {
@@ -48,7 +47,7 @@ public class KeyInputListener {
if (validItems.contains(slot.getItem())) { if (validItems.contains(slot.getItem())) {
if (slotFound != -1) { if (slotFound != -1) {
onError.accept(new TranslationTextComponent("misc.refinedstorage.network_item.shortcut_duplicate", new TranslationTextComponent(items[0].getTranslationKey()))); sendError(new TranslationTextComponent("misc.refinedstorage.network_item.shortcut_duplicate", new TranslationTextComponent(items[0].getTranslationKey())));
return; return;
} }
@@ -56,10 +55,25 @@ public class KeyInputListener {
} }
} }
if (CuriosIntegration.isLoaded() && slotFound == -1) {
Optional<ImmutableTriple<String, Integer, ItemStack>> curio = CuriosApi.getCuriosHelper().findEquippedCurio(stack -> validItems.contains(stack.getItem()), Minecraft.getInstance().player);
if (curio.isPresent()) {
RS.NETWORK_HANDLER.sendToServer(new OpenNetworkItemMessage(curio.get().getMiddle(), curio.get().getLeft()));
return;
}
}
if (slotFound == -1) { if (slotFound == -1) {
onError.accept(new TranslationTextComponent("misc.refinedstorage.network_item.shortcut_not_found", new TranslationTextComponent(items[0].getTranslationKey()))); sendError(new TranslationTextComponent("misc.refinedstorage.network_item.shortcut_not_found", new TranslationTextComponent(items[0].getTranslationKey())));
} else { } else {
RS.NETWORK_HANDLER.sendToServer(new OpenNetworkItemMessage(slotFound)); RS.NETWORK_HANDLER.sendToServer(new OpenNetworkItemMessage(slotFound, ""));
} }
} }
public void sendError(TranslationTextComponent error) {
Minecraft.getInstance().player.sendMessage(error, Util.DUMMY_UUID);
}
} }

View File

@@ -0,0 +1,11 @@
{
"replace": false,
"values": [
"refinedstorage:wireless_grid",
"refinedstorage:creative_wireless_grid",
"refinedstorage:wireless_fluid_grid",
"refinedstorage:creative_wireless_fluid_grid",
"refinedstorage:wireless_crafting_monitor",
"refinedstorage:creative_wireless_crafting_monitor"
]
}