Optionally add a milk fluid to the vanilla bucket (#7294)

Fixes the previous broken code that was supposed to make mod registered milk returned by the vanilla bucket by allowing mods to enable a milk fluid.
This commit is contained in:
KnightMiner authored and GitHub committed 2021-01-17 16:05:24 -05:00
1 parent f173bde812
commit 19f8d2a793
13 files changed
+189 -8

No files matched your search

@@ -24,13 +24,19 @@ import net.minecraft.command.arguments.ArgumentTypes;
import net.minecraft.command.arguments.IArgumentSerializer;
import net.minecraft.entity.ai.attributes.Attribute;
import net.minecraft.entity.ai.attributes.RangedAttribute;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.Items;
import net.minecraft.util.SoundEvent;
import net.minecraft.world.storage.IServerConfiguration;
import net.minecraft.world.storage.SaveFormat;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.common.data.ForgeFluidTagsProvider;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fluids.FluidAttributes;
import net.minecraftforge.fluids.ForgeFlowingFluid;
import net.minecraftforge.fml.*;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.*;
@@ -41,6 +47,8 @@ import net.minecraftforge.fml.loading.progress.StartupMessageManager;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.server.command.EnumArgument;
import net.minecraftforge.server.command.ModIdArgument;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.versions.forge.ForgeVersion;
import net.minecraftforge.versions.mcp.MCPVersion;
@@ -98,12 +106,24 @@ public class ForgeMod implements WorldPersistenceHooks.WorldPersistenceHook
public static final RegistryObject<Attribute> REACH_DISTANCE = ATTRIBUTES.register("reach_distance", () -> new RangedAttribute("generic.reachDistance", 5.0D, 0.0D, 1024.0D).setShouldWatch(true));
private static boolean enableMilkFluid = false;
public static final RegistryObject<Fluid> MILK = RegistryObject.of(new ResourceLocation("milk"), ForgeRegistries.FLUIDS);
public static final RegistryObject<Fluid> FLOWING_MILK = RegistryObject.of(new ResourceLocation("flowing_milk"), ForgeRegistries.FLUIDS);
private static ForgeMod INSTANCE;
public static ForgeMod getInstance()
{
return INSTANCE;
}
/**
* Run this method during mod constructor to enable milk and add it to the Minecraft milk bucket
*/
public static void enableMilkFluid()
{
enableMilkFluid = true;
}
public ForgeMod()
{
LOGGER.info(FORGEMOD,"Forge mod loading, version {}, for MC {} with MCP {}", ForgeVersion.getVersion(), MCPVersion.getMCVersion(), MCPVersion.getMCPVersion());
@@ -120,6 +140,7 @@ public class ForgeMod implements WorldPersistenceHooks.WorldPersistenceHook
modEventBus.addListener(this::preInit);
modEventBus.addListener(this::gatherData);
modEventBus.addListener(this::loadComplete);
modEventBus.addGenericListener(Fluid.class, this::registerFluids);
modEventBus.register(this);
ATTRIBUTES.register(modEventBus);
MinecraftForge.EVENT_BUS.addListener(this::serverStopping);
@@ -205,9 +226,11 @@ public class ForgeMod implements WorldPersistenceHooks.WorldPersistenceHook
if (event.includeServer())
{
ForgeBlockTagsProvider blockTags = new ForgeBlockTagsProvider(gen, event.getExistingFileHelper());
ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
ForgeBlockTagsProvider blockTags = new ForgeBlockTagsProvider(gen, existingFileHelper);
gen.addProvider(blockTags);
gen.addProvider(new ForgeItemTagsProvider(gen, blockTags, event.getExistingFileHelper()));
gen.addProvider(new ForgeItemTagsProvider(gen, blockTags, existingFileHelper));
gen.addProvider(new ForgeFluidTagsProvider(gen, existingFileHelper));
gen.addProvider(new ForgeRecipeProvider(gen));
gen.addProvider(new ForgeLootTableProvider(gen));
}
@@ -232,6 +255,20 @@ public class ForgeMod implements WorldPersistenceHooks.WorldPersistenceHook
}
}
// done in an event instead of deferred to only enable if a mod requests it
public void registerFluids(RegistryEvent.Register<Fluid> event)
{
if (enableMilkFluid)
{
// set up attributes
FluidAttributes.Builder attributesBuilder = FluidAttributes.builder(new ResourceLocation("forge", "block/milk_still"), new ResourceLocation("forge", "block/milk_flowing")).density(1024).viscosity(1024);
ForgeFlowingFluid.Properties properties = new ForgeFlowingFluid.Properties(MILK, FLOWING_MILK, attributesBuilder).bucket(() -> Items.MILK_BUCKET);
// register fluids
event.getRegistry().register(new ForgeFlowingFluid.Source(properties).setRegistryName(MILK.getId()));
event.getRegistry().register(new ForgeFlowingFluid.Flowing(properties).setRegistryName(FLOWING_MILK.getId()));
}
}
@SubscribeEvent //ModBus, can't use addListener due to nested genetics.
public void registerRecipeSerialziers(RegistryEvent.Register<IRecipeSerializer<?>> event)
{
@@ -20,9 +20,11 @@
package net.minecraftforge.common;
import net.minecraft.block.Block;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.DyeColor;
import net.minecraft.item.Item;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.FluidTags;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.ResourceLocation;
import net.minecraft.tags.ITag.INamedTag;
@@ -33,6 +35,7 @@ public class Tags
{
Blocks.init();
Items.init();
Fluids.init();
}
public static class Blocks
@@ -287,6 +290,18 @@ public class Tags
}
}
public static class Fluids
{
private static void init() {}
public static final IOptionalNamedTag<Fluid> MILK = tag("milk");
private static IOptionalNamedTag<Fluid> tag(String name)
{
return FluidTags.createOptional(new ResourceLocation("forge", name));
}
}
public interface IOptionalNamedTag<T> extends INamedTag<T>
{
/**
@@ -0,0 +1,46 @@
/*
* Minecraft Forge
* Copyright (c) 2016-2020.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.common.data;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.FluidTagsProvider;
import net.minecraftforge.common.ForgeMod;
import static net.minecraftforge.common.Tags.Fluids.MILK;
public class ForgeFluidTagsProvider extends FluidTagsProvider
{
public ForgeFluidTagsProvider(DataGenerator gen, ExistingFileHelper existingFileHelper)
{
super(gen, "forge", existingFileHelper);
}
@Override
public void registerTags()
{
getOrCreateBuilder(MILK).addOptional(ForgeMod.MILK.getId()).addOptional(ForgeMod.FLOWING_MILK.getId());
}
@Override
public String getName()
{
return "Forge Fluid Tags";
}
}
@@ -643,10 +643,6 @@ public class FluidUtil
{
return new ItemStack(Items.LAVA_BUCKET);
}
else if (fluid.getRegistryName().equals(new ResourceLocation("milk")))
{
return new ItemStack(Items.MILK_BUCKET);
}
}
return fluid.getAttributes().getBucket(fluidStack);
@@ -26,6 +26,7 @@ import net.minecraft.fluid.Fluids;
import net.minecraft.item.*;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.ForgeMod;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
@@ -60,7 +61,7 @@ public class FluidBucketWrapper implements IFluidHandlerItem, ICapabilityProvide
public boolean canFillFluidType(FluidStack fluid)
{
if (fluid.getFluid() == Fluids.WATER || fluid.getFluid() == Fluids.LAVA || fluid.getFluid().getRegistryName().equals(new ResourceLocation("milk")))
if (fluid.getFluid() == Fluids.WATER || fluid.getFluid() == Fluids.LAVA)
{
return true;
}
@@ -75,6 +76,10 @@ public class FluidBucketWrapper implements IFluidHandlerItem, ICapabilityProvide
{
return new FluidStack(((BucketItem)item).getFluid(), FluidAttributes.BUCKET_VOLUME);
}
else if (item instanceof MilkBucketItem && ForgeMod.MILK.isPresent())
{
return new FluidStack(ForgeMod.MILK.get(), FluidAttributes.BUCKET_VOLUME);
}
else
{
return FluidStack.EMPTY;