Make FluidUtil sounds server-side, add simulate option for tryFill/EmptyContainerAndStow (#4623)

This commit is contained in:
mezz 2018-01-18 13:23:30 -08:00 committed by LexManos
parent 47a72f12f6
commit adbc374c11
1 changed files with 65 additions and 16 deletions

View File

@ -101,10 +101,10 @@ public class FluidUtil
IItemHandler playerInventory = player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); IItemHandler playerInventory = player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
if (playerInventory != null) if (playerInventory != null)
{ {
FluidActionResult fluidActionResult = tryFillContainerAndStow(heldItem, handler, playerInventory, Integer.MAX_VALUE, player); FluidActionResult fluidActionResult = tryFillContainerAndStow(heldItem, handler, playerInventory, Integer.MAX_VALUE, player, true);
if (!fluidActionResult.isSuccess()) if (!fluidActionResult.isSuccess())
{ {
fluidActionResult = tryEmptyContainerAndStow(heldItem, handler, playerInventory, Integer.MAX_VALUE, player); fluidActionResult = tryEmptyContainerAndStow(heldItem, handler, playerInventory, Integer.MAX_VALUE, player, true);
} }
if (fluidActionResult.isSuccess()) if (fluidActionResult.isSuccess())
@ -122,7 +122,7 @@ public class FluidUtil
* *
* @param container The container to be filled. Will not be modified. * @param container The container to be filled. Will not be modified.
* Separate handling must be done to reduce the stack size, stow containers, etc, on success. * Separate handling must be done to reduce the stack size, stow containers, etc, on success.
* See {@link #tryFillContainerAndStow(ItemStack, IFluidHandler, IItemHandler, int, EntityPlayer)}. * See {@link #tryFillContainerAndStow(ItemStack, IFluidHandler, IItemHandler, int, EntityPlayer, boolean)}.
* @param fluidSource The fluid handler to be drained. * @param fluidSource The fluid handler to be drained.
* @param maxAmount The largest amount of fluid that should be transferred. * @param maxAmount The largest amount of fluid that should be transferred.
* @param player The player to make the filling noise. Pass null for no noise. * @param player The player to make the filling noise. Pass null for no noise.
@ -145,7 +145,7 @@ public class FluidUtil
if (player != null) if (player != null)
{ {
SoundEvent soundevent = simulatedTransfer.getFluid().getFillSound(simulatedTransfer); SoundEvent soundevent = simulatedTransfer.getFluid().getFillSound(simulatedTransfer);
player.playSound(soundevent, 1f, 1f); player.world.playSound(null, player.posX, player.posY + 0.5, player.posZ, soundevent, SoundCategory.BLOCKS, 1.0F, 1.0F);
} }
} }
else else
@ -165,7 +165,7 @@ public class FluidUtil
* *
* @param container The filled container. Will not be modified. * @param container The filled container. Will not be modified.
* Separate handling must be done to reduce the stack size, stow containers, etc, on success. * Separate handling must be done to reduce the stack size, stow containers, etc, on success.
* See {@link #tryEmptyContainerAndStow(ItemStack, IFluidHandler, IItemHandler, int, EntityPlayer)}. * See {@link #tryEmptyContainerAndStow(ItemStack, IFluidHandler, IItemHandler, int, EntityPlayer, boolean)}.
* @param fluidDestination The fluid handler to be filled by the container. * @param fluidDestination The fluid handler to be filled by the container.
* @param maxAmount The largest amount of fluid that should be transferred. * @param maxAmount The largest amount of fluid that should be transferred.
* @param player Player for making the bucket drained sound. Pass null for no noise. * @param player Player for making the bucket drained sound. Pass null for no noise.
@ -188,7 +188,7 @@ public class FluidUtil
if (player != null) if (player != null)
{ {
SoundEvent soundevent = transfer.getFluid().getEmptySound(transfer); SoundEvent soundevent = transfer.getFluid().getEmptySound(transfer);
player.playSound(soundevent, 1f, 1f); player.world.playSound(null, player.posX, player.posY + 0.5, player.posZ, soundevent, SoundCategory.BLOCKS, 1.0F, 1.0F);
} }
ItemStack resultContainer = containerFluidHandler.getContainer(); ItemStack resultContainer = containerFluidHandler.getContainer();
return new FluidActionResult(resultContainer); return new FluidActionResult(resultContainer);
@ -223,9 +223,34 @@ public class FluidUtil
* @param player The player that gets the items the inventory can't take. * @param player The player that gets the items the inventory can't take.
* Can be null, only used if the inventory cannot take the filled stack. * Can be null, only used if the inventory cannot take the filled stack.
* @return a {@link FluidActionResult} holding the result and the resulting container. The resulting container is empty on failure. * @return a {@link FluidActionResult} holding the result and the resulting container. The resulting container is empty on failure.
* @deprecated use {@link #tryFillContainerAndStow(ItemStack, IFluidHandler, IItemHandler, int, EntityPlayer, boolean)}
*/ */
@Deprecated // TODO remove in 1.13
@Nonnull @Nonnull
public static FluidActionResult tryFillContainerAndStow(@Nonnull ItemStack container, IFluidHandler fluidSource, IItemHandler inventory, int maxAmount, @Nullable EntityPlayer player) public static FluidActionResult tryFillContainerAndStow(@Nonnull ItemStack container, IFluidHandler fluidSource, IItemHandler inventory, int maxAmount, @Nullable EntityPlayer player)
{
return tryFillContainerAndStow(container, fluidSource, inventory, maxAmount, player, true);
}
/**
* Takes an Fluid Container Item and tries to fill it from the given tank.
* If the player is in creative mode, the container will not be modified on success, and no additional items created.
* If the input itemstack has a stacksize > 1 it will stow the filled container in the given inventory.
* If the inventory does not accept it, it will be given to the player or dropped at the players feet.
* If player is null in this case, the action will be aborted.
*
* @param container The Fluid Container ItemStack to fill.
* Will not be modified directly, if modifications are necessary a modified copy is returned in the result.
* @param fluidSource The fluid source to fill from
* @param inventory An inventory where any additionally created item (filled container if multiple empty are present) are put
* @param maxAmount Maximum amount of fluid to take from the tank.
* @param player The player that gets the items the inventory can't take.
* Can be null, only used if the inventory cannot take the filled stack.
* @param doFill true if the container should actually be filled, false if it should be simulated.
* @return a {@link FluidActionResult} holding the result and the resulting container. The resulting container is empty on failure.
*/
@Nonnull
public static FluidActionResult tryFillContainerAndStow(@Nonnull ItemStack container, IFluidHandler fluidSource, IItemHandler inventory, int maxAmount, @Nullable EntityPlayer player, boolean doFill)
{ {
if (container.isEmpty()) if (container.isEmpty())
{ {
@ -234,7 +259,7 @@ public class FluidUtil
if (player != null && player.capabilities.isCreativeMode) if (player != null && player.capabilities.isCreativeMode)
{ {
FluidActionResult filledReal = tryFillContainer(container, fluidSource, maxAmount, player, true); FluidActionResult filledReal = tryFillContainer(container, fluidSource, maxAmount, player, doFill);
if (filledReal.isSuccess()) if (filledReal.isSuccess())
{ {
return new FluidActionResult(container); // creative mode: item does not change return new FluidActionResult(container); // creative mode: item does not change
@ -242,7 +267,7 @@ public class FluidUtil
} }
else if (container.getCount() == 1) // don't need to stow anything, just fill the container stack else if (container.getCount() == 1) // don't need to stow anything, just fill the container stack
{ {
FluidActionResult filledReal = tryFillContainer(container, fluidSource, maxAmount, player, true); FluidActionResult filledReal = tryFillContainer(container, fluidSource, maxAmount, player, doFill);
if (filledReal.isSuccess()) if (filledReal.isSuccess())
{ {
return filledReal; return filledReal;
@ -257,11 +282,11 @@ public class FluidUtil
ItemStack remainder = ItemHandlerHelper.insertItemStacked(inventory, filledSimulated.getResult(), true); ItemStack remainder = ItemHandlerHelper.insertItemStacked(inventory, filledSimulated.getResult(), true);
if (remainder.isEmpty() || player != null) if (remainder.isEmpty() || player != null)
{ {
FluidActionResult filledReal = tryFillContainer(container, fluidSource, maxAmount, player, true); FluidActionResult filledReal = tryFillContainer(container, fluidSource, maxAmount, player, doFill);
remainder = ItemHandlerHelper.insertItemStacked(inventory, filledReal.getResult(), false); remainder = ItemHandlerHelper.insertItemStacked(inventory, filledReal.getResult(), !doFill);
// give it to the player or drop it at their feet // give it to the player or drop it at their feet
if (!remainder.isEmpty() && player != null) if (!remainder.isEmpty() && player != null && doFill)
{ {
ItemHandlerHelper.giveItemToPlayer(player, remainder); ItemHandlerHelper.giveItemToPlayer(player, remainder);
} }
@ -290,9 +315,33 @@ public class FluidUtil
* @param maxAmount Maximum amount of fluid to take from the tank. * @param maxAmount Maximum amount of fluid to take from the tank.
* @param player The player that gets the items the inventory can't take. Can be null, only used if the inventory cannot take the filled stack. * @param player The player that gets the items the inventory can't take. Can be null, only used if the inventory cannot take the filled stack.
* @return a {@link FluidActionResult} holding the result and the resulting container. The resulting container is empty on failure. * @return a {@link FluidActionResult} holding the result and the resulting container. The resulting container is empty on failure.
* @deprecated use {@link #tryEmptyContainerAndStow(ItemStack, IFluidHandler, IItemHandler, int, EntityPlayer, boolean)}
*/ */
@Deprecated // TODO: remove in 1.13
@Nonnull @Nonnull
public static FluidActionResult tryEmptyContainerAndStow(@Nonnull ItemStack container, IFluidHandler fluidDestination, IItemHandler inventory, int maxAmount, @Nullable EntityPlayer player) public static FluidActionResult tryEmptyContainerAndStow(@Nonnull ItemStack container, IFluidHandler fluidDestination, IItemHandler inventory, int maxAmount, @Nullable EntityPlayer player)
{
return tryEmptyContainerAndStow(container, fluidDestination, inventory, maxAmount, player, true);
}
/**
* Takes an Fluid Container Item, tries to empty it into the fluid handler, and stows it in the given inventory.
* If the player is in creative mode, the container will not be modified on success, and no additional items created.
* If the input itemstack has a stacksize > 1 it will stow the emptied container in the given inventory.
* If the inventory does not accept the emptied container, it will be given to the player or dropped at the players feet.
* If player is null in this case, the action will be aborted.
*
* @param container The filled Fluid Container Itemstack to empty.
* Will not be modified directly, if modifications are necessary a modified copy is returned in the result.
* @param fluidDestination The fluid destination to fill from the fluid container.
* @param inventory An inventory where any additionally created item (filled container if multiple empty are present) are put
* @param maxAmount Maximum amount of fluid to take from the tank.
* @param player The player that gets the items the inventory can't take. Can be null, only used if the inventory cannot take the filled stack.
* @param doDrain true if the container should actually be drained, false if it should be simulated.
* @return a {@link FluidActionResult} holding the result and the resulting container. The resulting container is empty on failure.
*/
@Nonnull
public static FluidActionResult tryEmptyContainerAndStow(@Nonnull ItemStack container, IFluidHandler fluidDestination, IItemHandler inventory, int maxAmount, @Nullable EntityPlayer player, boolean doDrain)
{ {
if (container.isEmpty()) if (container.isEmpty())
{ {
@ -301,7 +350,7 @@ public class FluidUtil
if (player != null && player.capabilities.isCreativeMode) if (player != null && player.capabilities.isCreativeMode)
{ {
FluidActionResult emptiedReal = tryEmptyContainer(container, fluidDestination, maxAmount, player, true); FluidActionResult emptiedReal = tryEmptyContainer(container, fluidDestination, maxAmount, player, doDrain);
if (emptiedReal.isSuccess()) if (emptiedReal.isSuccess())
{ {
return new FluidActionResult(container); // creative mode: item does not change return new FluidActionResult(container); // creative mode: item does not change
@ -309,7 +358,7 @@ public class FluidUtil
} }
else if (container.getCount() == 1) // don't need to stow anything, just fill and edit the container stack else if (container.getCount() == 1) // don't need to stow anything, just fill and edit the container stack
{ {
FluidActionResult emptiedReal = tryEmptyContainer(container, fluidDestination, maxAmount, player, true); FluidActionResult emptiedReal = tryEmptyContainer(container, fluidDestination, maxAmount, player, doDrain);
if (emptiedReal.isSuccess()) if (emptiedReal.isSuccess())
{ {
return emptiedReal; return emptiedReal;
@ -324,11 +373,11 @@ public class FluidUtil
ItemStack remainder = ItemHandlerHelper.insertItemStacked(inventory, emptiedSimulated.getResult(), true); ItemStack remainder = ItemHandlerHelper.insertItemStacked(inventory, emptiedSimulated.getResult(), true);
if (remainder.isEmpty() || player != null) if (remainder.isEmpty() || player != null)
{ {
FluidActionResult emptiedReal = tryEmptyContainer(container, fluidDestination, maxAmount, player, true); FluidActionResult emptiedReal = tryEmptyContainer(container, fluidDestination, maxAmount, player, doDrain);
remainder = ItemHandlerHelper.insertItemStacked(inventory, emptiedReal.getResult(), false); remainder = ItemHandlerHelper.insertItemStacked(inventory, emptiedReal.getResult(), !doDrain);
// give it to the player or drop it at their feet // give it to the player or drop it at their feet
if (!remainder.isEmpty() && player != null) if (!remainder.isEmpty() && player != null && doDrain)
{ {
ItemHandlerHelper.giveItemToPlayer(player, remainder); ItemHandlerHelper.giveItemToPlayer(player, remainder);
} }