Skip to content

Commit

Permalink
Merge pull request #110 from Chainmail-Studios/vini2003
Browse files Browse the repository at this point in the history
Hoppers and stuff.
  • Loading branch information
vini2003 authored Jun 26, 2020
2 parents c83cb3f + b8bcd71 commit 00de2c8
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 10 deletions.
7 changes: 3 additions & 4 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public <T extends Component> Collection<T> getSidedComponents(Direction directio

@Override
public boolean hasComponent(ComponentType<?> componentType) {
return allComponents.containsKey(componentType);
return allComponents.containsKey(componentType) || componentType == AstromineComponentTypes.BLOCK_ENTITY_TRANSFER_COMPONENT;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Item> 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Inventory> 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<Inventory> 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();
}
}
}
}
}
Binary file added src/main/resources/assets/astromine/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions src/main/resources/astromine.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -31,6 +31,6 @@
"depends": {
"fabricloader": ">=0.8.7",
"fabric": ">=0.11.8",
"minecraft": "^1.16-rc.2"
"minecraft": ">=1.16.1"
}
}

0 comments on commit 00de2c8

Please sign in to comment.