Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Fluid capability (master branch) #2942

Merged
merged 38 commits into from Jun 4, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
c0df93c
Add new IFluidHandler for capabilities.
rwtema Feb 11, 2016
9c8551c
Made FluidTank implement IFluidHandler. Also added a few helper metho…
rwtema Feb 11, 2016
be9d088
Add CompatibilityFluidHandler. FluidTank is the example implementation.
rwtema Feb 11, 2016
2dd49df
Fix long-standing typo. :)
rwtema Feb 11, 2016
036a67f
Deprecate old versions.
rwtema Feb 11, 2016
f7cf7e6
Add example implementation TileEntity. (see, not that complicated)
rwtema Feb 11, 2016
7ffc4f1
Added FluidTankItemStack. An IFluidHandler for directly manipulating …
rwtema Feb 11, 2016
3a2653a
Add 'template' classes for very common use cases of IFluidHandler.
rwtema Feb 11, 2016
5da8630
Merge remote-tracking branch 'origin/1.9.4' into HEAD
mezz May 27, 2016
30ed419
Update mcp mappings
mezz May 27, 2016
1aadce0
Fix up Fluid Capabilities
mezz May 28, 2016
43bde49
Add Nullable annotation for capabilities' facing
mezz May 28, 2016
9403b55
Fix buckets turn all fluids to water/lava when Forge Bucket is disabled
mezz May 28, 2016
fb0a9a6
Fix some comments in FluidUtil
mezz May 28, 2016
5de1897
Fix logical errors in FluidHandlerConcatenate
mezz May 28, 2016
6f4d338
Add wrapping capabilities for deprecated fluid implementations
mezz May 28, 2016
80248d1
Revert "Update mcp mappings"
mezz May 28, 2016
90b79d8
Revert "Add Nullable annotation for capabilities' facing"
mezz May 28, 2016
47add09
Revert "Fix buckets turn all fluids to water/lava when Forge Bucket i…
mezz May 28, 2016
913378a
Fix containers unable to pick up flowing fluid source blocks
mezz May 29, 2016
2dc9ba3
Fix FluidTankInfo for liquid block IFluidHandler wrappers
mezz May 29, 2016
210ed7d
Improve implementation and documentation of FluidTank canDrain/canFill
mezz May 29, 2016
eb9b362
Fix creative mode liquid placing and removing
mezz May 29, 2016
b0cc966
Fix handling of fluid containers with a no empty container (consumed)
mezz May 29, 2016
6951649
Clean up docs
mezz May 29, 2016
004a18d
Change name of canDrain/canFill to canDrainFluidType/canFillFluidType
mezz May 29, 2016
50ad1f3
Move constants out from FluidContainerRegistry and deprecate
mezz May 30, 2016
70d917a
Move Forge internals away from using FluidContainerRegistry
mezz May 30, 2016
04dee51
Add bucket capability wrapper
mezz May 30, 2016
d085660
Add better default ItemFluidContainer implementation
mezz May 30, 2016
28deab1
Move fluid constants to better location
mezz May 30, 2016
3b351fb
Make FluidUtil.tryPlaceFluid take a fluidStack for future compatibility
mezz May 30, 2016
c7824ba
Minor cleanup, make FluidUtil easier to use
mezz May 31, 2016
f980267
Add IFluidTankProperties
mezz May 31, 2016
32005ec
Split TankInteractionType into booleans canFill() and canDrain()
mezz May 31, 2016
a358c1a
Merge remote-tracking branch 'origin/master' into fluid-capability
mezz Jun 4, 2016
b6f065b
Convert indents to spaces
mezz Jun 4, 2016
70c8ff9
Fix TileFluidHandler.getCapability to check for its own before super
mezz Jun 4, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 10 additions & 0 deletions patches/minecraft/net/minecraft/item/ItemBucket.java.patch
Expand Up @@ -9,3 +9,13 @@

if (raytraceresult == null)
{
@@ -175,4 +177,9 @@
}
}
}
+
+ @Override
+ public net.minecraftforge.common.capabilities.ICapabilityProvider initCapabilities(ItemStack stack, net.minecraft.nbt.NBTTagCompound nbt) {
+ return new net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper(stack);
+ }
}
10 changes: 10 additions & 0 deletions patches/minecraft/net/minecraft/item/ItemBucketMilk.java.patch
Expand Up @@ -9,3 +9,13 @@
}

if (p_77654_3_ instanceof EntityPlayer)
@@ -55,4 +55,9 @@
p_77659_3_.func_184598_c(p_77659_4_);
return new ActionResult(EnumActionResult.SUCCESS, p_77659_1_);
}
+
+ @Override
+ public net.minecraftforge.common.capabilities.ICapabilityProvider initCapabilities(ItemStack stack, net.minecraft.nbt.NBTTagCompound nbt) {
+ return new net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper(stack);
+ }
}
Expand Up @@ -31,8 +31,10 @@
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.IFluidContainerItem;

import net.minecraftforge.fluids.capability.IFluidHandler;
import org.apache.commons.lang3.tuple.Pair;

import com.google.common.base.Function;
Expand Down Expand Up @@ -237,14 +239,7 @@ private BakedDynBucketOverrideHandler()
@Override
public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity)
{
FluidStack fluidStack = FluidContainerRegistry.getFluidForFilledItem(stack);
if (fluidStack == null)
{
if (stack.getItem() instanceof IFluidContainerItem)
{
fluidStack = ((IFluidContainerItem) stack.getItem()).getFluid(stack);
}
}
FluidStack fluidStack = FluidUtil.getFluidContained(stack);

// not a fluid item apparently
if (fluidStack == null)
Expand Down
Expand Up @@ -69,9 +69,10 @@
import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.Properties;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fml.common.ProgressManager;
import net.minecraftforge.fml.common.ProgressManager.ProgressBar;
Expand Down Expand Up @@ -355,8 +356,9 @@ public int compare(Item i1, Item i2)
{
// can the milk be put into a bucket?
Fluid milk = FluidRegistry.getFluid("milk");
FluidStack milkStack = new FluidStack(milk, FluidContainerRegistry.BUCKET_VOLUME);
if(FluidContainerRegistry.getContainerCapacity(milkStack, new ItemStack(Items.BUCKET)) == FluidContainerRegistry.BUCKET_VOLUME)
FluidStack milkStack = new FluidStack(milk, Fluid.BUCKET_VOLUME);
IFluidHandler bucketHandler = FluidUtil.getFluidHandler(new ItemStack(Items.BUCKET));
if (bucketHandler != null && bucketHandler.fill(milkStack, false) == Fluid.BUCKET_VOLUME)
{
setBucketModel(Items.MILK_BUCKET);
}
Expand Down
Expand Up @@ -36,6 +36,7 @@
import net.minecraftforge.common.model.animation.CapabilityAnimation;
import net.minecraftforge.common.network.ForgeNetworkHandler;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.fluids.UniversalBucket;
import net.minecraftforge.fml.common.registry.GameRegistry;
Expand Down Expand Up @@ -372,6 +373,7 @@ public void modConstruction(FMLConstructionEvent evt)
public void preInit(FMLPreInitializationEvent evt)
{
CapabilityItemHandler.register();
CapabilityFluidHandler.register();
CapabilityAnimation.register();
MinecraftForge.EVENT_BUS.register(MinecraftForge.INTERNAL_HANDLER);
ForgeChunkManager.captureConfig(evt.getModConfigurationDirectory());
Expand Down
@@ -1,5 +1,6 @@
package net.minecraftforge.common.capabilities;

import javax.annotation.Nullable;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -66,7 +67,7 @@ public CapabilityDispatcher(Map<ResourceLocation, ICapabilityProvider> list, ICa
}

@Override
public boolean hasCapability(Capability<?> capability, EnumFacing facing)
public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing)
{
for (ICapabilityProvider cap : caps)
{
Expand All @@ -79,7 +80,7 @@ public boolean hasCapability(Capability<?> capability, EnumFacing facing)
}

@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing)
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing)
{
for (ICapabilityProvider cap : caps)
{
Expand Down
@@ -1,5 +1,7 @@
package net.minecraftforge.common.capabilities;

import javax.annotation.Nullable;

import net.minecraft.util.EnumFacing;

public interface ICapabilityProvider
Expand All @@ -19,7 +21,7 @@ public interface ICapabilityProvider
* CAN BE NULL. Null is defined to represent 'internal' or 'self'
* @return True if this object supports the capability.
*/
boolean hasCapability(Capability<?> capability, EnumFacing facing);
boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing);

/**
* Retrieves the handler for the capability requested on the specific side.
Expand All @@ -31,5 +33,5 @@ public interface ICapabilityProvider
* CAN BE NULL. Null is defined to represent 'internal' or 'self'
* @return True if this object supports the capability.
*/
<T> T getCapability(Capability<T> capability, EnumFacing facing);
<T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing);
}
Expand Up @@ -24,7 +24,7 @@ public class BlockFluidClassic extends BlockFluidBase
public BlockFluidClassic(Fluid fluid, Material material)
{
super(fluid, material);
stack = new FluidStack(fluid, FluidContainerRegistry.BUCKET_VOLUME);
stack = new FluidStack(fluid, Fluid.BUCKET_VOLUME);
}

public BlockFluidClassic setFluidStack(FluidStack stack)
Expand Down
Expand Up @@ -226,7 +226,7 @@ else if (amt > 0)
@Override
public FluidStack drain(World world, BlockPos pos, boolean doDrain)
{
final FluidStack fluidStack = new FluidStack(getFluid(), MathHelper.floor_float(getQuantaPercentage(world, pos) * FluidContainerRegistry.BUCKET_VOLUME));
final FluidStack fluidStack = new FluidStack(getFluid(), MathHelper.floor_float(getQuantaPercentage(world, pos) * Fluid.BUCKET_VOLUME));

if (doDrain)
{
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/net/minecraftforge/fluids/Fluid.java
Expand Up @@ -30,6 +30,8 @@
*/
public class Fluid
{
public static final int BUCKET_VOLUME = 1000;

/** The unique identification name for this fluid. */
protected final String fluidName;

Expand Down
Expand Up @@ -17,10 +17,7 @@
* Register simple items that contain fluids here. Useful for buckets, bottles, and things that have
* ID/metadata mappings.
*
* For more complex items, use {@link IFluidContainerItem} instead.
*
* Deprecated: We will eventually be moving this ALL away from a registry and instead EVERYTHING will use IFluidContainerItem.
* We need to decide a way of swapping Items/Stacks.
* @deprecated This will be removed soon. Create an item like {@link net.minecraftforge.fluids.capability.ItemFluidContainer}
*/
@Deprecated
public abstract class FluidContainerRegistry
Expand Down Expand Up @@ -70,8 +67,11 @@ public boolean equals(Object o)
private static Map<ContainerKey, FluidContainerData> filledContainerMap = Maps.newHashMap();
private static Set<ContainerKey> emptyContainers = Sets.newHashSet();

public static final int BUCKET_VOLUME = 1000;
@Deprecated
public static final int BUCKET_VOLUME = Fluid.BUCKET_VOLUME;
@Deprecated
public static final ItemStack EMPTY_BUCKET = new ItemStack(Items.BUCKET);
@Deprecated
public static final ItemStack EMPTY_BOTTLE = new ItemStack(Items.GLASS_BOTTLE);
private static final ItemStack NULL_EMPTYCONTAINER = new ItemStack(Items.BUCKET);

Expand Down Expand Up @@ -348,6 +348,21 @@ public static boolean isFilledContainer(ItemStack container)
return container != null && getFluidForFilledItem(container) != null;
}

public static boolean hasNullEmptyContainer(ItemStack container)
{
if (container == null)
{
return false;
}

FluidContainerData data = containerFluidMap.get(new ContainerKey(container));
if (data != null)
{
return data.emptyContainer == NULL_EMPTYCONTAINER;
}
return false;
}

public static FluidContainerData[] getRegisteredFluidContainerData()
{
return containerFluidMap.values().toArray(new FluidContainerData[containerFluidMap.size()]);
Expand Down
7 changes: 1 addition & 6 deletions src/main/java/net/minecraftforge/fluids/FluidStack.java
Expand Up @@ -174,12 +174,7 @@ public boolean isFluidEqual(ItemStack other)
return false;
}

if (other.getItem() instanceof IFluidContainerItem)
{
return isFluidEqual(((IFluidContainerItem) other.getItem()).getFluid(other));
}

return isFluidEqual(FluidContainerRegistry.getFluidForFilledItem(other));
return isFluidEqual(FluidUtil.getFluidContained(other));
}

@Override
Expand Down