diff --git a/gradle.properties b/gradle.properties index 062878a2e..597694b5e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,22 +3,21 @@ org.gradle.jvmargs=-Xmx4G # Fabric minecraft_version=1.16.1 -yarn_mappings=1.16.1+build.4 +yarn_mappings=1.16.1+build.9 loader_version=0.8.8+build.202 #Fabric api -api_version=0.13.1+build.370-1.16 +api_version=0.14.0+build.371-1.16 # Mod mod_name = astromine -mod_version = 1.0.0 +mod_version = 1.0.3+fabric-1.16.1 mod_group = com.github.chainmailstudios # Dependency cardinal_components_version = 2.4.0 spinnery_version = 3.0.47+fabric-1.16.x shapes_version = 1.2.1+build.7 -arrp_version = 0.1.7 patchouli_version = 1.16-37.15-FABRIC lba_version=0.7.0 diff --git a/src/main/java/com/github/chainmailstudios/astromine/common/block/entity/base/DefaultedBlockEntity.java b/src/main/java/com/github/chainmailstudios/astromine/common/block/entity/base/DefaultedBlockEntity.java index 89f937c9d..6c2479148 100644 --- a/src/main/java/com/github/chainmailstudios/astromine/common/block/entity/base/DefaultedBlockEntity.java +++ b/src/main/java/com/github/chainmailstudios/astromine/common/block/entity/base/DefaultedBlockEntity.java @@ -82,7 +82,7 @@ public Collection getSidedComponents(Direction directio @Override public boolean hasComponent(ComponentType componentType) { - return allComponents.containsKey(componentType); + return allComponents.containsKey(componentType) || componentType == AstromineComponentTypes.BLOCK_ENTITY_TRANSFER_COMPONENT; } @Override diff --git a/src/main/java/com/github/chainmailstudios/astromine/common/block/entity/base/DefaultedItemBlockEntity.java b/src/main/java/com/github/chainmailstudios/astromine/common/block/entity/base/DefaultedItemBlockEntity.java index 029f13376..67c6123e2 100644 --- a/src/main/java/com/github/chainmailstudios/astromine/common/block/entity/base/DefaultedItemBlockEntity.java +++ b/src/main/java/com/github/chainmailstudios/astromine/common/block/entity/base/DefaultedItemBlockEntity.java @@ -3,6 +3,7 @@ import com.github.chainmailstudios.astromine.common.block.transfer.TransferType; import com.github.chainmailstudios.astromine.common.component.ComponentProvider; import com.github.chainmailstudios.astromine.common.component.inventory.SimpleItemInventoryComponent; +import com.github.chainmailstudios.astromine.common.component.inventory.compatibility.ItemInventoryFromInventoryComponent; import com.github.chainmailstudios.astromine.registry.AstromineComponentTypes; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -13,24 +14,116 @@ import net.minecraft.block.BlockState; import net.minecraft.block.FacingBlock; import net.minecraft.block.HorizontalFacingBlock; +import net.minecraft.block.InventoryProvider; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.SidedInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Pair; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.world.WorldAccess; import java.util.ArrayList; import java.util.Collection; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.IntStream; -public abstract class DefaultedItemBlockEntity extends DefaultedBlockEntity implements ComponentProvider, BlockEntityClientSerializable { +public abstract class DefaultedItemBlockEntity extends DefaultedBlockEntity implements ComponentProvider, InventoryProvider, SidedInventory, BlockEntityClientSerializable { protected final SimpleItemInventoryComponent itemComponent = new SimpleItemInventoryComponent(1); + private final ItemInventoryFromInventoryComponent inventory = () -> itemComponent; public DefaultedItemBlockEntity(BlockEntityType type) { super(type); addComponent(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT, itemComponent); } + + @Override + public int size() { + return inventory.size(); + } + + @Override + public boolean isEmpty() { + return inventory.isEmpty(); + } + + @Override + public ItemStack getStack(int slot) { + return inventory.getStack(slot); + } + + @Override + public ItemStack removeStack(int slot, int amount) { + return inventory.removeStack(slot, amount); + } + + @Override + public ItemStack removeStack(int slot) { + return inventory.removeStack(slot); + } + + @Override + public void setStack(int slot, ItemStack stack) { + inventory.setStack(slot, stack); + } + + @Override + public boolean canPlayerUse(PlayerEntity player) { + return true; + } + + @Override + public void clear() { + inventory.clear(); + } + + @Override + public int count(Item item) { + return inventory.count(item); + } + + @Override + public boolean containsAny(Set items) { + return inventory.containsAny(items); + } + + @Override + public int[] getAvailableSlots(Direction direction) { + if (transferComponent.get(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT).get(direction) != TransferType.NONE) { + return IntStream.rangeClosed(0, inventory.size() - 1).toArray(); + } else { + return new int[0]; + } + } + + @Override + public boolean canInsert(int slot, ItemStack stack, Direction direction) { + if (transferComponent.get(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT).get(direction).canInsert()) { + return getSidedComponent(direction, AstromineComponentTypes.ITEM_INVENTORY_COMPONENT).canInsert(stack, slot); + } else { + return false; + } + } + + @Override + public boolean canExtract(int slot, ItemStack stack, Direction direction) { + if (transferComponent.get(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT).get(direction).canExtract()) { + return getSidedComponent(direction, AstromineComponentTypes.ITEM_INVENTORY_COMPONENT).canExtract(stack, slot); + } else { + return false; + } + } + + @Override + public SidedInventory getInventory(BlockState state, WorldAccess world, BlockPos pos) { + return this; + } } diff --git a/src/main/java/com/github/chainmailstudios/astromine/common/block/transfer/TransferType.java b/src/main/java/com/github/chainmailstudios/astromine/common/block/transfer/TransferType.java index 6b0118a44..d0fc5c4ea 100644 --- a/src/main/java/com/github/chainmailstudios/astromine/common/block/transfer/TransferType.java +++ b/src/main/java/com/github/chainmailstudios/astromine/common/block/transfer/TransferType.java @@ -21,4 +21,12 @@ public TransferType next() { public Identifier texture() { return this == INPUT ? INPUT_TEXTURE : this == OUTPUT ? OUTPUT_TEXTURE : this == INPUT_OUTPUT ? INPUT_OUTPUT_TEXTURE : this == NONE ? NONE_TEXTURE : null; } + + public boolean canInsert() { + return this == INPUT || this == INPUT_OUTPUT; + } + + public boolean canExtract() { + return this == OUTPUT || this == INPUT_OUTPUT; + } } diff --git a/src/main/java/com/github/chainmailstudios/astromine/mixin/HopperBlockEntityMixin.java b/src/main/java/com/github/chainmailstudios/astromine/mixin/HopperBlockEntityMixin.java new file mode 100644 index 000000000..e3c00e7da --- /dev/null +++ b/src/main/java/com/github/chainmailstudios/astromine/mixin/HopperBlockEntityMixin.java @@ -0,0 +1,79 @@ +package com.github.chainmailstudios.astromine.mixin; + +import com.github.chainmailstudios.astromine.common.component.block.entity.BlockEntityTransferComponent; +import com.github.chainmailstudios.astromine.common.component.inventory.compatibility.ItemInventoryFromInventoryComponent; +import com.github.chainmailstudios.astromine.registry.AstromineComponentTypes; +import nerdhub.cardinal.components.api.component.ComponentProvider; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.Hopper; +import net.minecraft.block.entity.HopperBlockEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(HopperBlockEntity.class) +public abstract class HopperBlockEntityMixin { + @Shadow public abstract double getHopperX(); + + @Shadow public abstract double getHopperY(); + + @Shadow public abstract double getHopperZ(); + + @Inject(at = @At("HEAD"), method = "getInputInventory(Lnet/minecraft/block/entity/Hopper;)Lnet/minecraft/inventory/Inventory;", cancellable = true) + private static void astromine_onGetInputInventory(Hopper hopper, CallbackInfoReturnable callbackInformationReturnable) { + BlockPos hopperPos = new BlockPos(hopper.getHopperX(), hopper.getHopperY(), hopper.getHopperZ()); + + BlockEntity componentEntity = hopper.getWorld().getBlockEntity(hopperPos.offset(Direction.UP)); + + if (componentEntity instanceof ComponentProvider) { + ComponentProvider componentProvider = (ComponentProvider) componentEntity; + + if (componentProvider.hasComponent(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT)) { + if (componentProvider.hasComponent(AstromineComponentTypes.BLOCK_ENTITY_TRANSFER_COMPONENT)) { + BlockEntityTransferComponent transferComponent = componentProvider.getComponent(AstromineComponentTypes.BLOCK_ENTITY_TRANSFER_COMPONENT); + + if (transferComponent.get(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT).get(Direction.DOWN).canExtract()) { + callbackInformationReturnable.setReturnValue(ItemInventoryFromInventoryComponent.of(componentProvider.getComponent(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT))); + callbackInformationReturnable.cancel(); + } + } else { + callbackInformationReturnable.setReturnValue(ItemInventoryFromInventoryComponent.of(componentProvider.getComponent(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT))); + callbackInformationReturnable.cancel(); + } + } + } + } + + @Inject(at = @At("HEAD"), method = "Lnet/minecraft/block/entity/HopperBlockEntity;getOutputInventory()Lnet/minecraft/inventory/Inventory;", cancellable = true) + void astromine_onGetOutputInventory(CallbackInfoReturnable callbackInformationReturnable) { + BlockPos hopperPos = new BlockPos(getHopperX(), getHopperY(), getHopperZ()); + + BlockEntity hopperEntity = (HopperBlockEntity) (Object) this; + + BlockEntity componentEntity = hopperEntity.getWorld().getBlockEntity(hopperPos.offset(Direction.DOWN)); + + if (componentEntity instanceof ComponentProvider) { + ComponentProvider componentProvider = (ComponentProvider) componentEntity; + + if (componentProvider.hasComponent(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT)) { + if (componentProvider.hasComponent(AstromineComponentTypes.BLOCK_ENTITY_TRANSFER_COMPONENT)) { + BlockEntityTransferComponent transferComponent = componentProvider.getComponent(AstromineComponentTypes.BLOCK_ENTITY_TRANSFER_COMPONENT); + + if (transferComponent.get(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT).get(Direction.UP).canInsert()) { + callbackInformationReturnable.setReturnValue(ItemInventoryFromInventoryComponent.of(componentProvider.getComponent(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT))); + callbackInformationReturnable.cancel(); + } + } else { + callbackInformationReturnable.setReturnValue(ItemInventoryFromInventoryComponent.of(componentProvider.getComponent(AstromineComponentTypes.ITEM_INVENTORY_COMPONENT))); + callbackInformationReturnable.cancel(); + } + } + } + } +} diff --git a/src/main/resources/assets/astromine/icon.png b/src/main/resources/assets/astromine/icon.png new file mode 100644 index 000000000..39cd23eb1 Binary files /dev/null and b/src/main/resources/assets/astromine/icon.png differ diff --git a/src/main/resources/astromine.mixins.json b/src/main/resources/astromine.mixins.json index ac88cfc99..80a577fea 100644 --- a/src/main/resources/astromine.mixins.json +++ b/src/main/resources/astromine.mixins.json @@ -6,11 +6,11 @@ "mixins": [ "AbstractMinecartEntityMixin", "BrewingRecipeRegistryMixin", "BucketItemMixin", "EntityMixin", "FishingBobberEntityMixin", "FlamingAnvilCraftingMixin", "GravityEntityMixin", "HoneyBlockMixin", - "ItemEntityMixin", "LivingEntityMixin", "SlimeEntityMixin", "SquidEntityMixin", + "HopperBlockEntityMixin", "ItemEntityMixin", "LivingEntityMixin", "SlimeEntityMixin", "SquidEntityMixin", "StepAndDestroyBlockGoalMixin", "ThreadExecutorMixin" ], "client": [ - "BossBarHudMixin", "CrackParticleAccessor", "EggEntityMixin", "CurrentDownParticleMixin", "GameRendererMixin", + "BossBarHudMixin", "CrackParticleAccessor", "CurrentDownParticleMixin", "EggEntityMixin", "GameRendererMixin", "ItemRendererMixin", "MinecraftClientMixin", "SkyPropertiesMixin", "WorldRendererMixin" ], "injectors": { diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c90a7ad40..b8d0ddf49 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -3,7 +3,7 @@ "id": "astromine", "version": "${version}", "name": "Astromine", - "description": "Explore space; witness space; die in space.", + "description": "A space-themed technological modification with exploration, weapons and progression in mind.", "authors": [ "vini2003", "Draylar", @@ -31,6 +31,6 @@ "depends": { "fabricloader": ">=0.8.7", "fabric": ">=0.11.8", - "minecraft": "^1.16-rc.2" + "minecraft": ">=1.16.1" } }