diff --git a/src/main/java/com/lothrazar/storagenetwork/StorageNetworkMod.java b/src/main/java/com/lothrazar/storagenetwork/StorageNetworkMod.java index 5b10b3f5..b2d34aff 100644 --- a/src/main/java/com/lothrazar/storagenetwork/StorageNetworkMod.java +++ b/src/main/java/com/lothrazar/storagenetwork/StorageNetworkMod.java @@ -32,50 +32,51 @@ @Mod(StorageNetworkMod.MODID) public class StorageNetworkMod { - public static final String MODID = "storagenetwork"; - public static final Logger LOGGER = LogManager.getLogger(); - public static ConfigRegistry CONFIG; + public static final String MODID = "storagenetwork"; + public static final Logger LOGGER = LogManager.getLogger(); + public static ConfigRegistry CONFIG; - public StorageNetworkMod() { - FMLJavaModLoadingContext.get().getModEventBus().addListener(StorageNetworkMod::setup); - MinecraftForge.EVENT_BUS.register(new SsnRegistry.Tiles()); - MinecraftForge.EVENT_BUS.register(new SsnEvents()); - IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); - SsnRegistry.BLOCKS.register(bus); - SsnRegistry.ITEMS.register(bus); - SsnRegistry.TILES.register(bus); - SsnRegistry.CONTAINERS.register(bus); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setupClient); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::registerMapping); - }); - } + public StorageNetworkMod() { + FMLJavaModLoadingContext.get().getModEventBus().addListener(StorageNetworkMod::setup); + MinecraftForge.EVENT_BUS.register(new SsnRegistry.Tiles()); + MinecraftForge.EVENT_BUS.register(new SsnEvents()); + IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); + SsnRegistry.BLOCKS.register(bus); + SsnRegistry.ITEMS.register(bus); + SsnRegistry.TILES.register(bus); + SsnRegistry.CONTAINERS.register(bus); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setupClient); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::registerMapping); + }); + } - private static void setup(FMLCommonSetupEvent event) { - PacketRegistry.init(); - CONFIG = new ConfigRegistry(FMLPaths.CONFIGDIR.get().resolve(MODID + ".toml")); - } + private static void setup(FMLCommonSetupEvent event) { + PacketRegistry.init(); + CONFIG = new ConfigRegistry(FMLPaths.CONFIGDIR.get().resolve(MODID + ".toml")); + } - private void setupClient(final FMLClientSetupEvent event) { - MenuScreens.register(SsnRegistry.Menus.REQUEST.get(), ScreenNetworkTable::new); - MenuScreens.register(SsnRegistry.Menus.FILTER_KABEL.get(), ScreenCableFilter::new); - MenuScreens.register(SsnRegistry.Menus.IMPORT_FILTER_KABEL.get(), ScreenCableImportFilter::new); - MenuScreens.register(SsnRegistry.Menus.EXPORT_KABEL.get(), ScreenCableExportFilter::new); - MenuScreens.register(SsnRegistry.Menus.INVENTORY_REMOTE.get(), ScreenNetworkRemote::new); - MenuScreens.register(SsnRegistry.Menus.CRAFTING_REMOTE.get(), ScreenNetworkCraftingRemote::new); - MenuScreens.register(SsnRegistry.Menus.INVENTORY.get(), ScreenNetworkInventory::new); - MenuScreens.register(SsnRegistry.Menus.COLLECTOR.get(), ScreenCollectionFilter::new); - MenuScreens.register(SsnRegistry.Menus.REQUEST_EXPANDED.get(), ScreenNetworkInventoryExpanded::new); - MenuScreens.register(SsnRegistry.Menus.EXPANDED_REMOTE.get(), ScreenNetworkExpandedRemote::new); - } + private void setupClient(final FMLClientSetupEvent event) { + MenuScreens.register(SsnRegistry.Menus.REQUEST.get(), ScreenNetworkTable::new); + MenuScreens.register(SsnRegistry.Menus.FILTER_KABEL.get(), ScreenCableFilter::new); + MenuScreens.register(SsnRegistry.Menus.IMPORT_FILTER_KABEL.get(), ScreenCableImportFilter::new); + MenuScreens.register(SsnRegistry.Menus.EXPORT_KABEL.get(), ScreenCableExportFilter::new); + MenuScreens.register(SsnRegistry.Menus.INVENTORY_REMOTE.get(), ScreenNetworkRemote::new); + MenuScreens.register(SsnRegistry.Menus.CRAFTING_REMOTE.get(), ScreenNetworkCraftingRemote::new); + MenuScreens.register(SsnRegistry.Menus.INVENTORY.get(), ScreenNetworkInventory::new); + MenuScreens.register(SsnRegistry.Menus.COLLECTOR.get(), ScreenCollectionFilter::new); + MenuScreens.register(SsnRegistry.Menus.REQUEST_EXPANDED.get(), ScreenNetworkInventoryExpanded::new); + MenuScreens.register(SsnRegistry.Menus.EXPANDED_REMOTE.get(), ScreenNetworkExpandedRemote::new); + } - private void registerMapping(final RegisterKeyMappingsEvent event) { - event.register(ClientEventRegistry.INVENTORY_KEY); - } + private void registerMapping(final RegisterKeyMappingsEvent event) { + event.register(ClientEventRegistry.INVENTORY_KEY); + event.register(ClientEventRegistry.COLLECTOR_TOGGLE_KEY); + } - public static void log(String s) { - if (CONFIG.logspam()) { - LOGGER.info(s); + public static void log(String s) { + if (CONFIG.logspam()) { + LOGGER.info(s); + } } - } } diff --git a/src/main/java/com/lothrazar/storagenetwork/item/ItemCollector.java b/src/main/java/com/lothrazar/storagenetwork/item/ItemCollector.java index d8816685..b2aa1743 100644 --- a/src/main/java/com/lothrazar/storagenetwork/item/ItemCollector.java +++ b/src/main/java/com/lothrazar/storagenetwork/item/ItemCollector.java @@ -1,6 +1,8 @@ package com.lothrazar.storagenetwork.item; import java.util.List; + +import net.minecraft.nbt.CompoundTag; import org.apache.commons.lang3.tuple.Triple; import com.lothrazar.library.item.ItemFlib; import com.lothrazar.storagenetwork.StorageNetworkMod; @@ -31,8 +33,9 @@ public class ItemCollector extends ItemFlib { public static final String NBT_BOUND = "bound"; + private static final String NBT_ENABLED = "Enabled"; - public ItemCollector(Properties properties) { + public ItemCollector(Properties properties) { super(properties.stacksTo(1)); } @@ -42,41 +45,55 @@ protected ItemStack findAmmo(Player player, Item item) { return remote.getRight(); } - // not subscribe, called from SsnEvents.java - public void onEntityItemPickupEvent(EntityItemPickupEvent event) { - if (event.getEntity() instanceof Player && - event.getItem() != null && - event.getItem().getItem().isEmpty() == false) { - ItemStack item = event.getItem().getItem(); - Player player = event.getEntity(); - Level world = player.level(); - DimPos dp = DimPos.getPosStored(this.findAmmo(player, this)); - if (dp != null && !world.isClientSide) { - ServerLevel serverTargetWorld = DimPos.stringDimensionLookup(dp.getDimension(), world.getServer()); - if (serverTargetWorld == null) { - StorageNetworkMod.LOGGER.error("Missing dimension key " + dp.getDimension()); - return; - } - BlockEntity tile = serverTargetWorld.getBlockEntity(dp.getBlockPos()); - if (tile instanceof TileMain) { - TileMain network = (TileMain) tile; - // Create a new reference to the stack, try to insert that into the - // network, then change the original stack size so the player picks up - // only what remains, if anything. - int countUnmoved = network.insertStack(item.copy(), false); - item.setCount(countUnmoved); - // We still want to play the pickup sound, even if Minecraft silently - // deletes the stack we just emptied. - if (countUnmoved == 0) { - UtilTileEntity.playSoundFromServer((ServerPlayer) player, SoundEvents.ITEM_PICKUP, 0.2F); - } + public void toggleEnabled(ItemStack stack, Player player) { + boolean enabled = stack.getOrCreateTag().getBoolean(NBT_ENABLED); + stack.getOrCreateTag().putBoolean(NBT_ENABLED, !enabled); + player.displayClientMessage( + Component.literal("Collector " + (!enabled ? "enabled" : "disabled")), + true + ); + } + + // not subscribe, called from SsnEvents.java + public void onEntityItemPickupEvent(EntityItemPickupEvent event) { + if (event.getEntity() instanceof Player && + event.getItem() != null && + !event.getItem().getItem().isEmpty()) { + Player player = event.getEntity(); + + // find the collector that the player has with them (main hand, offhand, curios...) + ItemStack collectorStack = this.findAmmo(player, this); + if (collectorStack.isEmpty()) { + return; + } + + // check if it is turned on + CompoundTag tag = collectorStack.getOrCreateTag(); + if (!tag.getBoolean("Enabled")) { + return; + } + + ItemStack item = event.getItem().getItem(); + Level world = player.level(); + DimPos dp = DimPos.getPosStored(collectorStack); + if (dp != null && !world.isClientSide) { + ServerLevel serverTargetWorld = DimPos.stringDimensionLookup(dp.getDimension(), world.getServer()); + if (serverTargetWorld == null) { + StorageNetworkMod.LOGGER.error("Missing dimension key " + dp.getDimension()); + return; + } + BlockEntity tile = serverTargetWorld.getBlockEntity(dp.getBlockPos()); + if (tile instanceof TileMain network) { + int countUnmoved = network.insertStack(item.copy(), false); + item.setCount(countUnmoved); + if (countUnmoved == 0) { + UtilTileEntity.playSoundFromServer((ServerPlayer) player, SoundEvents.ITEM_PICKUP, 0.2F); + } + } + // else { StorageNetworkMod.LOGGER.error("item.remote.notfound"); } + } } - // else { - // StorageNetworkMod.LOGGER.error("item.remote.notfound"); - // } - } } - } @Override public InteractionResult useOn(UseOnContext context) { diff --git a/src/main/java/com/lothrazar/storagenetwork/network/KeybindCollectorToggleMessage.java b/src/main/java/com/lothrazar/storagenetwork/network/KeybindCollectorToggleMessage.java new file mode 100644 index 00000000..f3a76136 --- /dev/null +++ b/src/main/java/com/lothrazar/storagenetwork/network/KeybindCollectorToggleMessage.java @@ -0,0 +1,56 @@ +package com.lothrazar.storagenetwork.network; + +import com.lothrazar.storagenetwork.item.ItemCollector; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class KeybindCollectorToggleMessage { + + public KeybindCollectorToggleMessage() { + } + + public static void handle(KeybindCollectorToggleMessage msg, Supplier ctx) { + ctx.get().enqueueWork(() -> { + ServerPlayer player = ctx.get().getSender(); + if (player != null) { + Inventory inv = player.getInventory(); + + for (ItemStack stack : inv.items) { + if (stack.getItem() instanceof ItemCollector collector) { + collector.toggleEnabled(stack, player); + return; + } + } + + for (ItemStack stack : inv.armor) { + if (stack.getItem() instanceof ItemCollector collector) { + collector.toggleEnabled(stack, player); + return; + } + } + + for (ItemStack stack : inv.offhand) { + if (stack.getItem() instanceof ItemCollector collector) { + collector.toggleEnabled(stack, player); + return; + } + } + } + }); + ctx.get().setPacketHandled(true); + } + + + public void encode(FriendlyByteBuf friendlyByteBuf) { + } + + public static KeybindCollectorToggleMessage decode(FriendlyByteBuf friendlyByteBuf) { + KeybindCollectorToggleMessage message = new KeybindCollectorToggleMessage(); + return message; + } +} \ No newline at end of file diff --git a/src/main/java/com/lothrazar/storagenetwork/registry/ClientEventRegistry.java b/src/main/java/com/lothrazar/storagenetwork/registry/ClientEventRegistry.java index d9c565a5..9fc02429 100644 --- a/src/main/java/com/lothrazar/storagenetwork/registry/ClientEventRegistry.java +++ b/src/main/java/com/lothrazar/storagenetwork/registry/ClientEventRegistry.java @@ -16,15 +16,16 @@ @Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class ClientEventRegistry { - public static final ResourceLocation SLOT = new ResourceLocation(StorageNetworkMod.MODID, "textures/gui/slot.png"); - public static final KeyMapping INVENTORY_KEY = new KeyMapping("key.storagenetwork.remote", KeyConflictContext.UNIVERSAL, InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_I, "key.categories.inventory"); + public static final ResourceLocation SLOT = new ResourceLocation(StorageNetworkMod.MODID, "textures/gui/slot.png"); + public static final KeyMapping INVENTORY_KEY = new KeyMapping("key.storagenetwork.remote", KeyConflictContext.UNIVERSAL, InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_I, "key.categories.inventory"); + public static final KeyMapping COLLECTOR_TOGGLE_KEY = new KeyMapping("key.storagenetwork.collector_toggle", KeyConflictContext.UNIVERSAL, InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_DELETE, "key.categories.inventory"); - @SubscribeEvent - public static void onRegisterRenderers(EntityRenderersEvent.RegisterRenderers event) { - event.registerBlockEntityRenderer(Tiles.KABEL.get(), CableFacadeRenderer::new); - event.registerBlockEntityRenderer(Tiles.EXPORT_KABEL.get(), CableFacadeRenderer::new); - event.registerBlockEntityRenderer(Tiles.STORAGE_KABEL.get(), CableFacadeRenderer::new); - event.registerBlockEntityRenderer(Tiles.IMPORT_FILTER_KABEL.get(), CableFacadeRenderer::new); - event.registerBlockEntityRenderer(Tiles.IMPORT_KABEL.get(), CableFacadeRenderer::new); - } + @SubscribeEvent + public static void onRegisterRenderers(EntityRenderersEvent.RegisterRenderers event) { + event.registerBlockEntityRenderer(Tiles.KABEL.get(), CableFacadeRenderer::new); + event.registerBlockEntityRenderer(Tiles.EXPORT_KABEL.get(), CableFacadeRenderer::new); + event.registerBlockEntityRenderer(Tiles.STORAGE_KABEL.get(), CableFacadeRenderer::new); + event.registerBlockEntityRenderer(Tiles.IMPORT_FILTER_KABEL.get(), CableFacadeRenderer::new); + event.registerBlockEntityRenderer(Tiles.IMPORT_KABEL.get(), CableFacadeRenderer::new); + } } diff --git a/src/main/java/com/lothrazar/storagenetwork/registry/PacketRegistry.java b/src/main/java/com/lothrazar/storagenetwork/registry/PacketRegistry.java index 5f7edcb3..d113bc44 100644 --- a/src/main/java/com/lothrazar/storagenetwork/registry/PacketRegistry.java +++ b/src/main/java/com/lothrazar/storagenetwork/registry/PacketRegistry.java @@ -1,20 +1,7 @@ package com.lothrazar.storagenetwork.registry; import com.lothrazar.storagenetwork.StorageNetworkMod; -import com.lothrazar.storagenetwork.network.CableDataMessage; -import com.lothrazar.storagenetwork.network.CableFacadeMessage; -import com.lothrazar.storagenetwork.network.CableIOMessage; -import com.lothrazar.storagenetwork.network.CableLimitMessage; -import com.lothrazar.storagenetwork.network.ClearRecipeMessage; -import com.lothrazar.storagenetwork.network.InsertMessage; -import com.lothrazar.storagenetwork.network.KeybindCurioMessage; -import com.lothrazar.storagenetwork.network.RecipeMessage; -import com.lothrazar.storagenetwork.network.RefreshFilterClientMessage; -import com.lothrazar.storagenetwork.network.RequestMessage; -import com.lothrazar.storagenetwork.network.SettingsSyncMessage; -import com.lothrazar.storagenetwork.network.SortClientMessage; -import com.lothrazar.storagenetwork.network.StackRefreshClientMessage; -import com.lothrazar.storagenetwork.network.StackResponseClientMessage; +import com.lothrazar.storagenetwork.network.*; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; @@ -47,6 +34,7 @@ public static void init() { INSTANCE.registerMessage(id++, RefreshFilterClientMessage.class, RefreshFilterClientMessage::encode, RefreshFilterClientMessage::decode, RefreshFilterClientMessage::handle); INSTANCE.registerMessage(id++, SortClientMessage.class, SortClientMessage::encode, SortClientMessage::decode, SortClientMessage::handle); INSTANCE.registerMessage(id++, KeybindCurioMessage.class, KeybindCurioMessage::encode, KeybindCurioMessage::decode, KeybindCurioMessage::handle); + INSTANCE.registerMessage(id++, KeybindCollectorToggleMessage.class, KeybindCollectorToggleMessage::encode, KeybindCollectorToggleMessage::decode, KeybindCollectorToggleMessage::handle); INSTANCE.registerMessage(id++, CableFacadeMessage.class, CableFacadeMessage::encode, CableFacadeMessage::decode, CableFacadeMessage::handle); } } diff --git a/src/main/java/com/lothrazar/storagenetwork/registry/SsnEvents.java b/src/main/java/com/lothrazar/storagenetwork/registry/SsnEvents.java index aed09bea..11b09f0d 100644 --- a/src/main/java/com/lothrazar/storagenetwork/registry/SsnEvents.java +++ b/src/main/java/com/lothrazar/storagenetwork/registry/SsnEvents.java @@ -4,6 +4,7 @@ import com.lothrazar.storagenetwork.block.cable.TileCable; import com.lothrazar.storagenetwork.item.ItemBuilder; import com.lothrazar.storagenetwork.network.CableFacadeMessage; +import com.lothrazar.storagenetwork.network.KeybindCollectorToggleMessage; import com.lothrazar.storagenetwork.network.KeybindCurioMessage; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; @@ -22,59 +23,61 @@ public class SsnEvents { - @SubscribeEvent - public void onEntityItemPickupEvent(EntityItemPickupEvent event) { - SsnRegistry.Items.COLLECTOR_REMOTE.get().onEntityItemPickupEvent(event); - } - - @SubscribeEvent - public void onHit(PlayerInteractEvent.LeftClickBlock event) { - ItemBuilder.onLeftClickBlock(event); - if (ConfigRegistry.enableFacades.get()) { - onHitFacadeHandler(event); + @SubscribeEvent + public void onEntityItemPickupEvent(EntityItemPickupEvent event) { + SsnRegistry.Items.COLLECTOR_REMOTE.get().onEntityItemPickupEvent(event); } - } - private void onHitFacadeHandler(PlayerInteractEvent.LeftClickBlock event) { - Level level = event.getLevel(); - if (!level.isClientSide) { - return; // dont save client data; server side only from here on - } - Player player = event.getEntity(); - if (!player.isCrouching()) { - return; // match with 1.12 pr, only put facades when crouching + @SubscribeEvent + public void onHit(PlayerInteractEvent.LeftClickBlock event) { + ItemBuilder.onLeftClickBlock(event); + if (ConfigRegistry.enableFacades.get()) { + onHitFacadeHandler(event); + } } - ItemStack held = player.getItemInHand(event.getHand()); - TileCable cable = TileCable.getTileCable(level, event.getPos()); - if (cable != null) { - if (held.isEmpty()) { - PacketRegistry.INSTANCE.sendToServer(new CableFacadeMessage(event.getPos(), true)); - } - else { - Block block = Block.byItem(held.getItem()); - if (block == null || block == Blocks.AIR) { - return; + + private void onHitFacadeHandler(PlayerInteractEvent.LeftClickBlock event) { + Level level = event.getLevel(); + if (!level.isClientSide) { + return; // dont save client data; server side only from here on } - if (!ConfigRegistry.isFacadeAllowed(held)) { - StorageNetworkMod.log("not allowed as a facade from config file: " + held.getItem()); - return; + Player player = event.getEntity(); + if (!player.isCrouching()) { + return; // match with 1.12 pr, only put facades when crouching + } + ItemStack held = player.getItemInHand(event.getHand()); + TileCable cable = TileCable.getTileCable(level, event.getPos()); + if (cable != null) { + if (held.isEmpty()) { + PacketRegistry.INSTANCE.sendToServer(new CableFacadeMessage(event.getPos(), true)); + } else { + Block block = Block.byItem(held.getItem()); + if (block == null || block == Blocks.AIR) { + return; + } + if (!ConfigRegistry.isFacadeAllowed(held)) { + StorageNetworkMod.log("not allowed as a facade from config file: " + held.getItem()); + return; + } + //pick the block, write to tags, and send to server + boolean pickFluids = false; + BlockHitResult bhr = (BlockHitResult) player.pick(player.getBlockReach(), 1, pickFluids); + BlockPlaceContext context = new BlockPlaceContext(player, event.getHand(), held, bhr); + BlockState facadeState = block.getStateForPlacement(context); + CompoundTag tags = (facadeState == null) ? null : NbtUtils.writeBlockState(facadeState); + PacketRegistry.INSTANCE.sendToServer(new CableFacadeMessage(event.getPos(), tags)); + } } - //pick the block, write to tags, and send to server - boolean pickFluids = false; - BlockHitResult bhr = (BlockHitResult) player.pick(player.getBlockReach(), 1, pickFluids); - BlockPlaceContext context = new BlockPlaceContext(player, event.getHand(), held, bhr); - BlockState facadeState = block.getStateForPlacement(context); - CompoundTag tags = (facadeState == null) ? null : NbtUtils.writeBlockState(facadeState); - PacketRegistry.INSTANCE.sendToServer(new CableFacadeMessage(event.getPos(), tags)); - } } - } - @SubscribeEvent - public void onKeyInput(InputEvent.Key event) { - if (ClientEventRegistry.INVENTORY_KEY.consumeClick()) { - //gogo client -> server event - PacketRegistry.INSTANCE.sendToServer(new KeybindCurioMessage()); + @SubscribeEvent + public void onKeyInput(InputEvent.Key event) { + if (ClientEventRegistry.INVENTORY_KEY.consumeClick()) { + PacketRegistry.INSTANCE.sendToServer(new KeybindCurioMessage()); + } + + if (ClientEventRegistry.COLLECTOR_TOGGLE_KEY.consumeClick()) { + PacketRegistry.INSTANCE.sendToServer(new KeybindCollectorToggleMessage()); + } } - } } diff --git a/src/main/resources/assets/storagenetwork/lang/en_us.json b/src/main/resources/assets/storagenetwork/lang/en_us.json index 6f7557a7..c46d7e0a 100644 --- a/src/main/resources/assets/storagenetwork/lang/en_us.json +++ b/src/main/resources/assets/storagenetwork/lang/en_us.json @@ -181,7 +181,7 @@ "chat.main.connectables": "Connectables: ", "key.storagenetwork.remote":"Network Remote Curio", - + "key.storagenetwork.collector_toggle": "Network Collector Toggle", "gui.storagenetwork.operate.tooltip":"If the logic check passes, the cable operates",