Skip to content

Commit

Permalink
Fix slotless item handler crash when running without commoncaps
Browse files Browse the repository at this point in the history
  • Loading branch information
rubensworks committed Oct 9, 2019
1 parent 8b83a60 commit 8b530d4
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 18 deletions.
2 changes: 1 addition & 1 deletion build.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ minecraft_version=1.14.4
forge_version=28.1.1
mcp_mappings_channel=snapshot
mcp_mappings_version=20190719-1.14.3
cyclopscore_version=1.5.3-1001
cyclopscore_version=1.5.3-1002
release_type=release
fingerprint=bd0353b3e8a2810d60dd584e256e364bc3bedd44

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/cyclops/colossalchests/ColossalChests.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.cyclops.colossalchests.inventory.container.ContainerColossalChestConfig;
import org.cyclops.colossalchests.inventory.container.ContainerUncolossalChestConfig;
import org.cyclops.colossalchests.item.ItemUpgradeToolConfig;
import org.cyclops.colossalchests.modcompat.CommonCapabilitiesModCompat;
import org.cyclops.colossalchests.modcompat.IronChestModCompat;
import org.cyclops.colossalchests.proxy.ClientProxy;
import org.cyclops.colossalchests.proxy.CommonProxy;
Expand Down Expand Up @@ -47,6 +48,7 @@ public ColossalChests() {
@Override
protected void loadModCompats(ModCompatLoader modCompatLoader) {
modCompatLoader.addModCompat(new IronChestModCompat());
modCompatLoader.addModCompat(new CommonCapabilitiesModCompat());
}

@Override
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/cyclops/colossalchests/Reference.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ public class Reference {

// MOD ID's
public static final String MOD_IRONCHEST = "ironchest";
public static final String MOD_COMMONCAPABILITIES = "commoncapabilities";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.cyclops.colossalchests.modcompat;

import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import org.cyclops.colossalchests.Capabilities;
import org.cyclops.colossalchests.ColossalChests;
import org.cyclops.colossalchests.Reference;
import org.cyclops.colossalchests.tileentity.TileColossalChest;
import org.cyclops.commoncapabilities.api.capability.itemhandler.ISlotlessItemHandler;
import org.cyclops.cyclopscore.datastructure.Wrapper;
import org.cyclops.cyclopscore.inventory.IndexedSlotlessItemHandlerWrapper;
import org.cyclops.cyclopscore.modcompat.ICompatInitializer;
import org.cyclops.cyclopscore.modcompat.IModCompat;
import org.cyclops.cyclopscore.modcompat.capabilities.CapabilityConstructorRegistry;
import org.cyclops.cyclopscore.modcompat.capabilities.DefaultCapabilityProvider;
import org.cyclops.cyclopscore.modcompat.capabilities.SimpleCapabilityConstructor;

import javax.annotation.Nullable;

/**
* Mod compat for the Common Capabilities mod.
* @author rubensworks
*
*/
public class CommonCapabilitiesModCompat implements IModCompat {

@Override
public String getId() {
return Reference.MOD_COMMONCAPABILITIES;
}

@Override
public boolean isEnabledDefault() {
return true;
}

@Override
public String getComment() {
return "If slotless item handlers should be registered to colossal chests.";
}

@Override
public ICompatInitializer createInitializer() {
return () -> {
CapabilityConstructorRegistry registry = ColossalChests._instance.getCapabilityConstructorRegistry();
// Worker
registry.registerTile(TileColossalChest.class,
new SimpleCapabilityConstructor<ISlotlessItemHandler, TileColossalChest>() {
@Override
public Capability<ISlotlessItemHandler> getCapability() {
return Capabilities.SLOTLESS_ITEMHANDLER;
}

@Nullable
@Override
public ICapabilityProvider createProvider(TileColossalChest host) {
// Wrapper hack because Java otherwise complains that the optionalSlotlessItemHandler may not be initialized yet, and it won't compile.
Wrapper<LazyOptional<ISlotlessItemHandler>> optionalSlotlessItemHandler = new Wrapper<>();
optionalSlotlessItemHandler.set(LazyOptional.of(() -> {
LazyOptional<IItemHandler> optionalItemHandler = host.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
optionalItemHandler.addListener((o) -> optionalSlotlessItemHandler.get().invalidate());
return new IndexedSlotlessItemHandlerWrapper(optionalItemHandler.orElse(null),
(IndexedSlotlessItemHandlerWrapper.IInventoryIndexReference) host.getInventory());
}));
return new DefaultCapabilityProvider<>(this::getCapability, optionalSlotlessItemHandler.get());
}
});
};
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import lombok.experimental.Delegate;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.play.server.SUpdateTileEntityPacket;
Expand All @@ -31,21 +29,18 @@
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.InvWrapper;
import net.minecraftforge.registries.ForgeRegistries;
import org.cyclops.colossalchests.Capabilities;
import org.cyclops.colossalchests.GeneralConfig;
import org.cyclops.colossalchests.RegistryEntries;
import org.cyclops.colossalchests.block.ChestMaterial;
import org.cyclops.colossalchests.block.ColossalChestConfig;
import org.cyclops.colossalchests.inventory.container.ContainerColossalChest;
import org.cyclops.commoncapabilities.api.capability.itemhandler.ISlotlessItemHandler;
import org.cyclops.cyclopscore.datastructure.EnumFacingMap;
import org.cyclops.cyclopscore.helper.DirectionHelpers;
import org.cyclops.cyclopscore.helper.InventoryHelpers;
import org.cyclops.cyclopscore.helper.LocationHelpers;
import org.cyclops.cyclopscore.helper.WorldHelpers;
import org.cyclops.cyclopscore.inventory.INBTInventory;
import org.cyclops.cyclopscore.inventory.IndexedInventory;
import org.cyclops.cyclopscore.inventory.IndexedSlotlessItemHandlerWrapper;
import org.cyclops.cyclopscore.inventory.LargeInventory;
import org.cyclops.cyclopscore.inventory.SimpleInventory;
import org.cyclops.cyclopscore.persist.nbt.NBTPersist;
Expand All @@ -54,8 +49,6 @@
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.PrimitiveIterator;
import java.util.Random;

/**
Expand All @@ -73,7 +66,6 @@ public class TileColossalChest extends CyclopsTileEntity implements CyclopsTileE
private SimpleInventory lastValidInventory = null;
private SimpleInventory inventory = null;
private LazyOptional<IItemHandler> capabilityItemHandler = LazyOptional.empty();
private LazyOptional<ISlotlessItemHandler> capabilityItemHandlerSlotless = LazyOptional.empty();

@NBTPersist
private Vec3i size = LocationHelpers.copyLocation(Vec3i.NULL_VECTOR);
Expand Down Expand Up @@ -382,18 +374,12 @@ private void triggerPlayerUsageChange(int change) {

public void setInventory(SimpleInventory inventory) {
this.capabilityItemHandler.invalidate();
this.capabilityItemHandlerSlotless.invalidate();
this.inventory = inventory;
if (this.inventory.getSizeInventory() > 0) {
IItemHandler itemHandler = new InvWrapper(this.inventory);
this.capabilityItemHandler = LazyOptional.of(() -> itemHandler);
if (Capabilities.SLOTLESS_ITEMHANDLER != null) {
this.capabilityItemHandlerSlotless = LazyOptional.of(() ->
new IndexedSlotlessItemHandlerWrapper(itemHandler, (IndexedSlotlessItemHandlerWrapper.IInventoryIndexReference) this.inventory));
}
} else {
this.capabilityItemHandler = LazyOptional.empty();
this.capabilityItemHandlerSlotless = LazyOptional.empty();
}
}

Expand All @@ -420,9 +406,6 @@ public <T> LazyOptional<T> getCapability(Capability<T> capability, Direction fac
if (this.capabilityItemHandler.isPresent() && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
return this.capabilityItemHandler.cast();
}
if (this.capabilityItemHandlerSlotless.isPresent() && capability == Capabilities.SLOTLESS_ITEMHANDLER) {
return this.capabilityItemHandlerSlotless.cast();
}
return super.getCapability(capability, facing);
}

Expand Down

0 comments on commit 8b530d4

Please sign in to comment.