Added the ability to open the crafting table on a stick with a hotkey if the item is present in inventory, or in a curios slot. Closes #1417

This commit is contained in:
Flanks255 2024-10-19 11:33:14 -05:00
parent 276c2dbd95
commit b5cb343492
17 changed files with 178 additions and 19 deletions

View file

@ -80,6 +80,7 @@ repositories {
includeGroup "curse.maven"
}
}
maven { url = 'https://maven.octo-studios.com/releases' }
}
dependencies {
@ -97,6 +98,8 @@ dependencies {
localRuntime "curse.maven:jade-324717:5803666"
localRuntime "curse.maven:mekanism-268560:5680395"
implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}"
}
jar {

View file

@ -18,3 +18,4 @@ jei_minecraft=1.21.1
jei_version=19.21.0.246
patchouli_version=1.21-87-NEOFORGE
patchouli_provider_version=1.21.1-1.0.11-Snapshot.3
curios_version=9.+

View file

@ -1,9 +1,10 @@
// 1.21.1 2024-10-19T16:16:57.3701064 Tags for minecraft:item mod id actuallyadditions
// 1.21.1 2024-10-19T11:22:45.676221 Tags for minecraft:item mod id actuallyadditions
87327118c2f16da245b76de4fdcaab149456d9b8 data/actuallyadditions/tags/item/coffee_beans.json
f3ee78cd8c9563bd1828de2b4b336735f289f9f2 data/actuallyadditions/tags/item/crystals.json
441008b49b4bab00125100fc969cb6582eff7271 data/actuallyadditions/tags/item/crystal_blocks.json
7e6e49c3eb5302af147a2d6ba439e83bd4831cbc data/actuallyadditions/tags/item/drills.json
ae55da193b94fd6375c05d5aa46cafdda9d335cd data/actuallyadditions/tags/item/tiny_coals.json
d0115caba2ef0aae6d1c07068d2b30819dfad612 data/curios/tags/item/charm.json
dc377437805c7c5696b88c17454da7b856b9055e data/c/tags/item/buckets.json
ea53bfe045e7e533a13fa2fa8793cd7741e92902 data/c/tags/item/bucket/canola_oil.json
fb46ac4e564c749fcaa5ba1393ab33fcd91817f5 data/c/tags/item/bucket/crystallized_oil.json

View file

@ -0,0 +1,2 @@
// 1.21.1 2024-10-19T11:22:45.6782191 Curios for actuallyadditions
42b9baaa8afba52b9f39f6830fc7620e3eb75c70 data/actuallyadditions/curios/entities/player.json

View file

@ -0,0 +1,8 @@
{
"entities": [
"minecraft:player"
],
"slots": [
"charm"
]
}

View file

@ -0,0 +1,5 @@
{
"values": [
"actuallyadditions:crafter_on_a_stick"
]
}

View file

@ -55,6 +55,9 @@ public final class ActuallyTags {
public static final TagKey<Item> BUCKET_CRYSTALLIZED_OIL = ItemTags.create(ResourceLocation.fromNamespaceAndPath("c", "bucket/crystallized_oil"));
public static final TagKey<Item> BUCKET_EMPOWERED_OIL = ItemTags.create(ResourceLocation.fromNamespaceAndPath("c", "bucket/empowered_oil"));
//curios:bracelet
public static final TagKey<Item> CURIOS_CHARM = TagKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath("curios", "charm"));
private static TagKey<Item> tag(String name) {
return TagKey.create(Registries.ITEM, ActuallyAdditions.modLoc(name));

View file

@ -72,6 +72,8 @@ public class ActuallyAdditionsData {
generator.addProvider(event.includeServer(), new DatapackBuiltinEntriesProvider(
packOutput, patchedProvider, Set.of(ActuallyAdditions.MODID)));
generator.addProvider(true, new Curios(packOutput, helper, lookupProvider));
}
private static RegistrySetBuilder.PatchedRegistries getProvider() {

View file

@ -0,0 +1,21 @@
package de.ellpeck.actuallyadditions.data;
import de.ellpeck.actuallyadditions.mod.ActuallyAdditions;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.world.entity.EntityType;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import top.theillusivec4.curios.api.CuriosDataProvider;
import java.util.concurrent.CompletableFuture;
public class Curios extends CuriosDataProvider {
public Curios(PackOutput output, ExistingFileHelper fileHelper, CompletableFuture<HolderLookup.Provider> registries) {
super(ActuallyAdditions.MODID, output, fileHelper, registries);
}
@Override
public void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {
createEntities("player").addEntities(EntityType.PLAYER).addSlots("charm");
}
}

View file

@ -88,5 +88,6 @@ public class ItemTagsGenerator extends ItemTagsProvider {
ActuallyTags.Items.BUCKET_CRYSTALLIZED_OIL, ActuallyTags.Items.BUCKET_EMPOWERED_OIL
);
tag(ActuallyTags.Items.CURIOS_CHARM).add(ActuallyItems.CRAFTER_ON_A_STICK.get());
}
}

View file

@ -36,6 +36,7 @@ import de.ellpeck.actuallyadditions.mod.misc.apiimpl.MethodHandler;
import de.ellpeck.actuallyadditions.mod.network.PacketHandler;
import de.ellpeck.actuallyadditions.mod.particle.ActuallyParticles;
import de.ellpeck.actuallyadditions.mod.util.ResourceReloader;
import de.ellpeck.actuallyadditions.mod.util.Util;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
@ -43,6 +44,7 @@ import net.minecraft.world.item.Items;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.ModList;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.config.ModConfig;
import net.neoforged.fml.event.config.ModConfigEvent;
@ -92,6 +94,7 @@ public class ActuallyAdditions {
ActuallyBiomeModifiers.init(eventBus);
ActuallyParticles.init(eventBus);
ActuallyTags.init();
ActuallyAdditionsClient.init(eventBus);
eventBus.addListener(this::onConfigReload);
NeoForge.EVENT_BUS.addListener(this::serverStarted);
@ -114,6 +117,8 @@ public class ActuallyAdditions {
eventBus.addListener(ActuallyAdditionsClient::registerParticleFactories);
}
IFarmerBehavior.initBehaviors();
Util.curiosLoaded = ModList.get().isLoaded("curios");
}
private static void reloadEvent(AddReloadListenerEvent event) {

View file

@ -10,6 +10,7 @@
package de.ellpeck.actuallyadditions.mod;
import com.mojang.blaze3d.platform.InputConstants;
import de.ellpeck.actuallyadditions.mod.blocks.ActuallyBlocks;
import de.ellpeck.actuallyadditions.mod.blocks.render.ReconstructorRenderer;
import de.ellpeck.actuallyadditions.mod.blocks.render.RenderBatteryBox;
@ -50,10 +51,12 @@ import de.ellpeck.actuallyadditions.mod.inventory.gui.SackGui;
import de.ellpeck.actuallyadditions.mod.inventory.gui.VoidSackGui;
import de.ellpeck.actuallyadditions.mod.items.ActuallyItems;
import de.ellpeck.actuallyadditions.mod.misc.special.SpecialRenderInit;
import de.ellpeck.actuallyadditions.mod.network.packet.HotkeyPacket;
import de.ellpeck.actuallyadditions.mod.particle.ActuallyParticles;
import de.ellpeck.actuallyadditions.mod.particle.ParticleBeam;
import de.ellpeck.actuallyadditions.mod.particle.ParticleLaserItem;
import de.ellpeck.actuallyadditions.mod.patchouli.PatchouliPages;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
@ -62,14 +65,24 @@ import net.minecraft.client.renderer.item.ItemProperties;
import net.minecraft.core.BlockPos;
import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket;
import net.minecraft.world.phys.BlockHitResult;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModList;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.neoforge.client.event.EntityRenderersEvent;
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent;
import net.neoforged.neoforge.client.event.*;
import net.neoforged.neoforge.client.settings.KeyConflictContext;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.network.PacketDistributor;
import java.util.Optional;
public class ActuallyAdditionsClient {
private static final KeyMapping OPEN_CRAFTING_KEY = new KeyMapping("key.actualladditions.crafting_stick_open.desc", KeyConflictContext.IN_GAME, InputConstants.Type.KEYSYM, -1, "key.actuallyadditions.category");
public static void init(IEventBus modBus) {
NeoForge.EVENT_BUS.addListener(ActuallyAdditionsClient::onClientTick);
modBus.addListener(ActuallyAdditionsClient::registerKeyBinding);
}
public static void setupMenus(RegisterMenuScreensEvent evt) {
evt.register(ActuallyContainers.SACK_CONTAINER.get(), SackGui::new);
evt.register(ActuallyContainers.VOID_SACK_CONTAINER.get(), VoidSackGui::new);
@ -158,4 +171,14 @@ public class ActuallyAdditionsClient {
assert Minecraft.getInstance().hitResult != null;
connection.send(new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.STOP_DESTROY_BLOCK, pos, ((BlockHitResult) Minecraft.getInstance().hitResult).getDirection()));
}
private static void onClientTick(ClientTickEvent.Post event) {
if (OPEN_CRAFTING_KEY.consumeClick()) {
PacketDistributor.sendToServer(new HotkeyPacket(HotkeyPacket.HotKey.OPEN_CRAFTING_STICK));
}
}
private static void registerKeyBinding(final RegisterKeyMappingsEvent event) {
event.register(OPEN_CRAFTING_KEY);
}
}

View file

@ -11,16 +11,21 @@
package de.ellpeck.actuallyadditions.mod.items;
import de.ellpeck.actuallyadditions.mod.items.base.ItemBase;
import de.ellpeck.actuallyadditions.mod.util.Util;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.SimpleMenuProvider;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.CraftingMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import top.theillusivec4.curios.api.CuriosApi;
import javax.annotation.Nonnull;
@ -35,13 +40,46 @@ public class ItemCrafterOnAStick extends ItemBase {
@Override
public InteractionResultHolder<ItemStack> use(Level world, @Nonnull Player player, @Nonnull InteractionHand hand) {
if (!world.isClientSide) {
player.openMenu(new SimpleMenuProvider((windowId, playerInventory, playerEntity) -> new CraftingMenu(windowId, playerInventory, ContainerLevelAccess.create(world, player.blockPosition())){
@Override
public boolean stillValid(Player playerIn) {
return true;
}
}, CONTAINER_TITLE));
openCraftingMenu(player);
}
return new InteractionResultHolder<>(InteractionResult.SUCCESS, player.getItemInHand(hand));
}
public static void openCraftingMenu(Player player) {
if (!(player instanceof ServerPlayer))
return;
player.openMenu(new SimpleMenuProvider((windowId, playerInventory, playerEntity) -> new CraftingMenu(windowId, playerInventory, ContainerLevelAccess.create(player.level(), player.blockPosition())){
@Override
public boolean stillValid(@NotNull Player playerIn) {
return true;
}
}, CONTAINER_TITLE));
}
public static boolean hasCrafterOnAStick(@Nonnull Player player) {
if (player.getMainHandItem().getItem() instanceof ItemCrafterOnAStick || player.getOffhandItem().getItem() instanceof ItemCrafterOnAStick) {
return true;
}
if (Util.curiosLoaded) {
var curiosInv = CuriosApi.getCuriosInventory(player);
if (curiosInv.isPresent()) {
if(curiosInv.get().findFirstCurio(ItemCrafterOnAStick::isCrafterOnAStick).isPresent())
return true;
}
}
Inventory inventory = player.getInventory();
for (int i = 0; i <= 35; i++) {
ItemStack stack = inventory.getItem(i);
if (stack.getItem() instanceof ItemCrafterOnAStick)
return true;
}
return false;
}
public static boolean isCrafterOnAStick(@Nonnull ItemStack stack) {
return stack.getItem() instanceof ItemCrafterOnAStick;
}
}

View file

@ -13,14 +13,7 @@ package de.ellpeck.actuallyadditions.mod.network;
import de.ellpeck.actuallyadditions.mod.ActuallyAdditions;
import de.ellpeck.actuallyadditions.mod.network.handler.ClientPayloadHandler;
import de.ellpeck.actuallyadditions.mod.network.handler.ServerPayloadHandler;
import de.ellpeck.actuallyadditions.mod.network.packet.ButtonToContainerPacket;
import de.ellpeck.actuallyadditions.mod.network.packet.ButtonToTilePacket;
import de.ellpeck.actuallyadditions.mod.network.packet.NumberToTilePacket;
import de.ellpeck.actuallyadditions.mod.network.packet.SpawnLaserPacket;
import de.ellpeck.actuallyadditions.mod.network.packet.SpawnLaserParticlePacket;
import de.ellpeck.actuallyadditions.mod.network.packet.StringToTilePacket;
import de.ellpeck.actuallyadditions.mod.network.packet.SyncPlayerPacket;
import de.ellpeck.actuallyadditions.mod.network.packet.TileUpdatePacket;
import de.ellpeck.actuallyadditions.mod.network.packet.*;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.neoforged.neoforge.network.handling.DirectionalPayloadHandler;
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
@ -39,6 +32,7 @@ public final class PacketHandler {
registrar.playToServer(StringToTilePacket.ID, StringToTilePacket.CODEC, ServerPayloadHandler.getInstance()::handleStringToTile);
registrar.playToServer(NumberToTilePacket.ID, NumberToTilePacket.CODEC, ServerPayloadHandler.getInstance()::handleNumberToTile);
registrar.playToServer(ButtonToContainerPacket.ID, ButtonToContainerPacket.CODEC, ServerPayloadHandler.getInstance()::handleButtonToContainer);
registrar.playToServer(HotkeyPacket.TYPE, HotkeyPacket.CODEC, HotkeyPacket::handle);
registrar.playBidirectional(SyncPlayerPacket.ID, SyncPlayerPacket.CODEC,
new DirectionalPayloadHandler<>(ClientPayloadHandler.getInstance()::handleSyncPlayer, ServerPayloadHandler.getInstance()::handleSyncPlayer));

View file

@ -0,0 +1,47 @@
package de.ellpeck.actuallyadditions.mod.network.packet;
import de.ellpeck.actuallyadditions.mod.ActuallyAdditions;
import de.ellpeck.actuallyadditions.mod.items.ItemCrafterOnAStick;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.neoforged.neoforge.network.handling.IPayloadContext;
public record HotkeyPacket(HotKey hotKey) implements CustomPacketPayload {
public static final Type<HotkeyPacket> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(ActuallyAdditions.MODID, "hotkey"));
public HotkeyPacket(byte type) {
this(HotKey.values()[type]);
}
@Override
public Type<? extends CustomPacketPayload> type() {
return TYPE;
}
public enum HotKey {
OPEN_CRAFTING_STICK
}
public static final StreamCodec<FriendlyByteBuf, HotkeyPacket> CODEC = StreamCodec.composite(
ByteBufCodecs.BYTE, packet -> ((byte) packet.hotKey.ordinal()),
HotkeyPacket::new
);
public static void handle(final HotkeyPacket packet, IPayloadContext ctx) {
switch (packet.hotKey) {
case OPEN_CRAFTING_STICK -> ctx.enqueueWork(() -> open(ctx));
}
}
private static void open(IPayloadContext ctx) {
Player player = ctx.player();
if (ItemCrafterOnAStick.hasCrafterOnAStick(player)) {
ItemCrafterOnAStick.openCraftingMenu(player);
}
}
}

View file

@ -48,4 +48,6 @@ public final class Util {
AttributeInstance attribute = player.getAttribute(Attributes.BLOCK_INTERACTION_RANGE);
return attribute == null ? 4.5d : attribute.getValue();
}
public static boolean curiosLoaded = false;
}

View file

@ -992,5 +992,8 @@
"jei.actuallyadditions.coffee.extra.milk": "+01:00, -1 Level",
"jei.actuallyadditions.mining_lens": "Lens of the Miner",
"jei.actuallyadditions.mining_lens.weight": "Weight:",
"container.actuallyadditions.item_tag": "Item Tag"
"container.actuallyadditions.item_tag": "Item Tag",
"key.actualladditions.crafting_stick_open.desc": "Open the Crafting Stick",
"key.actuallyadditions.category": "Actually Additions"
}